summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--CONTRIBUTING.md3
-rw-r--r--NEWS687
-rw-r--r--README.md9
-rw-r--r--UPGRADING1263
-rw-r--r--UPGRADING.INTERNALS508
-rw-r--r--Zend/Makefile.frag5
-rw-r--r--Zend/Optimizer/block_pass.c (renamed from ext/opcache/Optimizer/block_pass.c)2
-rw-r--r--Zend/Optimizer/compact_literals.c (renamed from ext/opcache/Optimizer/compact_literals.c)4
-rw-r--r--Zend/Optimizer/compact_vars.c (renamed from ext/opcache/Optimizer/compact_vars.c)1
-rw-r--r--Zend/Optimizer/dce.c (renamed from ext/opcache/Optimizer/dce.c)44
-rw-r--r--Zend/Optimizer/dfa_pass.c (renamed from ext/opcache/Optimizer/dfa_pass.c)21
-rw-r--r--Zend/Optimizer/escape_analysis.c (renamed from ext/opcache/Optimizer/escape_analysis.c)4
-rw-r--r--Zend/Optimizer/nop_removal.c (renamed from ext/opcache/Optimizer/nop_removal.c)0
-rw-r--r--Zend/Optimizer/optimize_func_calls.c (renamed from ext/opcache/Optimizer/optimize_func_calls.c)4
-rw-r--r--Zend/Optimizer/optimize_temp_vars_5.c (renamed from ext/opcache/Optimizer/optimize_temp_vars_5.c)0
-rw-r--r--Zend/Optimizer/pass1.c (renamed from ext/opcache/Optimizer/pass1.c)2
-rw-r--r--Zend/Optimizer/pass3.c (renamed from ext/opcache/Optimizer/pass3.c)0
-rw-r--r--Zend/Optimizer/sccp.c (renamed from ext/opcache/Optimizer/sccp.c)103
-rw-r--r--Zend/Optimizer/scdf.c (renamed from ext/opcache/Optimizer/scdf.c)3
-rw-r--r--Zend/Optimizer/scdf.h (renamed from ext/opcache/Optimizer/scdf.h)2
-rw-r--r--Zend/Optimizer/ssa_integrity.c (renamed from ext/opcache/Optimizer/ssa_integrity.c)17
-rw-r--r--Zend/Optimizer/zend_call_graph.c (renamed from ext/opcache/Optimizer/zend_call_graph.c)21
-rw-r--r--Zend/Optimizer/zend_call_graph.h (renamed from ext/opcache/Optimizer/zend_call_graph.h)15
-rw-r--r--Zend/Optimizer/zend_cfg.c (renamed from ext/opcache/Optimizer/zend_cfg.c)10
-rw-r--r--Zend/Optimizer/zend_cfg.h (renamed from ext/opcache/Optimizer/zend_cfg.h)8
-rw-r--r--Zend/Optimizer/zend_dfg.c (renamed from ext/opcache/Optimizer/zend_dfg.c)2
-rw-r--r--Zend/Optimizer/zend_dfg.h (renamed from ext/opcache/Optimizer/zend_dfg.h)2
-rw-r--r--Zend/Optimizer/zend_dump.c (renamed from ext/opcache/Optimizer/zend_dump.c)10
-rw-r--r--Zend/Optimizer/zend_dump.h (renamed from ext/opcache/Optimizer/zend_dump.h)8
-rw-r--r--Zend/Optimizer/zend_func_info.c (renamed from ext/opcache/Optimizer/zend_func_info.c)47
-rw-r--r--Zend/Optimizer/zend_func_info.h (renamed from ext/opcache/Optimizer/zend_func_info.h)6
-rw-r--r--Zend/Optimizer/zend_inference.c (renamed from ext/opcache/Optimizer/zend_inference.c)109
-rw-r--r--Zend/Optimizer/zend_inference.h (renamed from ext/opcache/Optimizer/zend_inference.h)43
-rw-r--r--Zend/Optimizer/zend_optimizer.c (renamed from ext/opcache/Optimizer/zend_optimizer.c)31
-rw-r--r--Zend/Optimizer/zend_optimizer.h (renamed from ext/opcache/Optimizer/zend_optimizer.h)4
-rw-r--r--Zend/Optimizer/zend_optimizer_internal.h (renamed from ext/opcache/Optimizer/zend_optimizer_internal.h)6
-rw-r--r--Zend/Optimizer/zend_ssa.c (renamed from ext/opcache/Optimizer/zend_ssa.c)18
-rw-r--r--Zend/Optimizer/zend_ssa.h (renamed from ext/opcache/Optimizer/zend_ssa.h)14
-rw-r--r--Zend/Optimizer/zend_worklist.h (renamed from ext/opcache/Optimizer/zend_worklist.h)0
-rw-r--r--Zend/Zend.m44
-rw-r--r--Zend/tests/anon/015.phpt30
-rw-r--r--Zend/tests/anon/016.phpt31
-rw-r--r--Zend/tests/array_self_add_globals.phpt1
-rw-r--r--Zend/tests/array_unpack/non_integer_keys.phpt4
-rw-r--r--Zend/tests/array_unpack/string_keys.phpt64
-rw-r--r--Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt19
-rw-r--r--Zend/tests/attributes/016_custom_attribute_validation.phpt4
-rw-r--r--Zend/tests/bug27798.phpt4
-rw-r--r--Zend/tests/bug43201.phpt12
-rw-r--r--Zend/tests/bug53826.phpt33
-rw-r--r--Zend/tests/bug60536_003.phpt8
-rw-r--r--Zend/tests/bug64677.phpt2
-rw-r--r--Zend/tests/bug70895.phpt6
-rw-r--r--Zend/tests/bug70898.phpt2
-rw-r--r--Zend/tests/bug71539_6.phpt15
-rw-r--r--Zend/tests/bug71695.phpt17
-rw-r--r--Zend/tests/bug75474.phpt75
-rw-r--r--Zend/tests/bug78239.phpt2
-rw-r--r--Zend/tests/bug78335_2.phpt2
-rw-r--r--Zend/tests/bug79862.phpt8
-rw-r--r--Zend/tests/call_to_deprecated_function_args.phpt2
-rw-r--r--Zend/tests/class_exists_002.phpt2
-rw-r--r--Zend/tests/closure_bindTo_preserves_used_variables.phpt17
-rw-r--r--Zend/tests/closures/closure_from_callable_gc.phpt27
-rw-r--r--Zend/tests/const_deprecation.phpt2
-rw-r--r--Zend/tests/enum/__call.phpt29
-rw-r--r--Zend/tests/enum/__callStatic.phpt27
-rw-r--r--Zend/tests/enum/__class__.phpt19
-rw-r--r--Zend/tests/enum/__function__.phpt19
-rw-r--r--Zend/tests/enum/__get.phpt17
-rw-r--r--Zend/tests/enum/__invoke.phpt24
-rw-r--r--Zend/tests/enum/__isset.phpt16
-rw-r--r--Zend/tests/enum/__method__.phpt19
-rw-r--r--Zend/tests/enum/ast-dumper.phpt48
-rw-r--r--Zend/tests/enum/backed-cases-int.phpt26
-rw-r--r--Zend/tests/enum/backed-cases-string.phpt26
-rw-r--r--Zend/tests/enum/backed-duplicate-int.phpt13
-rw-r--r--Zend/tests/enum/backed-duplicate-string.phpt15
-rw-r--r--Zend/tests/enum/backed-from-invalid-int.phpt19
-rw-r--r--Zend/tests/enum/backed-from-invalid-string.phpt21
-rw-r--r--Zend/tests/enum/backed-from-invalid-type.phpt34
-rw-r--r--Zend/tests/enum/backed-from-unknown-hash.phpt17
-rw-r--r--Zend/tests/enum/backed-from.phpt36
-rw-r--r--Zend/tests/enum/backed-int-case-without-value.phpt14
-rw-r--r--Zend/tests/enum/backed-int-const-expr.phpt20
-rw-r--r--Zend/tests/enum/backed-int-const-invalid-expr.phpt14
-rw-r--r--Zend/tests/enum/backed-int.phpt17
-rw-r--r--Zend/tests/enum/backed-invalid.phpt10
-rw-r--r--Zend/tests/enum/backed-mismatch.phpt12
-rw-r--r--Zend/tests/enum/backed-negative-int.phpt21
-rw-r--r--Zend/tests/enum/backed-string-heredoc.phpt30
-rw-r--r--Zend/tests/enum/backed-string.phpt17
-rw-r--r--Zend/tests/enum/backed-tryFrom-casing.phpt15
-rw-r--r--Zend/tests/enum/backed-tryFrom-unknown-hash.phpt17
-rw-r--r--Zend/tests/enum/backed-tryFrom.phpt40
-rw-r--r--Zend/tests/enum/backed-type-no-union.phpt10
-rw-r--r--Zend/tests/enum/basic-methods.phpt21
-rw-r--r--Zend/tests/enum/case-attributes.phpt25
-rw-r--r--Zend/tests/enum/case-in-class.phpt12
-rw-r--r--Zend/tests/enum/cases-refcount.phpt22
-rw-r--r--Zend/tests/enum/comparison.phpt57
-rw-r--r--Zend/tests/enum/constant-aliases.phpt21
-rw-r--r--Zend/tests/enum/constants.phpt14
-rw-r--r--Zend/tests/enum/default-parameter.phpt18
-rw-r--r--Zend/tests/enum/enum-as-constant.phpt22
-rw-r--r--Zend/tests/enum/enum-as-params.phpt35
-rw-r--r--Zend/tests/enum/enum-attributes.phpt23
-rw-r--r--Zend/tests/enum/enum-in-constant.phpt22
-rw-r--r--Zend/tests/enum/enum-in-static-var.phpt21
-rw-r--r--Zend/tests/enum/enum-reserved-non-modifiers.phpt32
-rw-r--r--Zend/tests/enum/enum_exists.phpt41
-rw-r--r--Zend/tests/enum/final.phpt12
-rw-r--r--Zend/tests/enum/implements.phpt34
-rw-r--r--Zend/tests/enum/instanceof-backed-enum.phpt20
-rw-r--r--Zend/tests/enum/instanceof-unitenum.phpt18
-rw-r--r--Zend/tests/enum/instanceof.phpt25
-rw-r--r--Zend/tests/enum/json_encode.phpt59
-rw-r--r--Zend/tests/enum/keyword-no-bc-break.phpt42
-rw-r--r--Zend/tests/enum/keyword-whitespace.phpt16
-rw-r--r--Zend/tests/enum/name-property.phpt50
-rw-r--r--Zend/tests/enum/namespaces.phpt32
-rw-r--r--Zend/tests/enum/no-cases.phpt16
-rw-r--r--Zend/tests/enum/no-class-implements-backed-enum.phpt10
-rw-r--r--Zend/tests/enum/no-class-implements-unit-enum.phpt10
-rw-r--r--Zend/tests/enum/no-clone.phpt18
-rw-r--r--Zend/tests/enum/no-constructors.phpt12
-rw-r--r--Zend/tests/enum/no-destruct.phpt12
-rw-r--r--Zend/tests/enum/no-dynamic-properties.phpt20
-rw-r--r--Zend/tests/enum/no-enum-implements-backed-enum.phpt10
-rw-r--r--Zend/tests/enum/no-enum-implements-unit-enum.phpt10
-rw-r--r--Zend/tests/enum/no-from.phpt16
-rw-r--r--Zend/tests/enum/no-implement-serializable-indirect.phpt24
-rw-r--r--Zend/tests/enum/no-implement-serializable.phpt22
-rw-r--r--Zend/tests/enum/no-name-property.phpt12
-rw-r--r--Zend/tests/enum/no-new-through-reflection.phpt16
-rw-r--r--Zend/tests/enum/no-new.phpt16
-rw-r--r--Zend/tests/enum/no-non-backed-enum-implements-backed-enum.phpt10
-rw-r--r--Zend/tests/enum/no-pass-properties-by-ref.phpt26
-rw-r--r--Zend/tests/enum/no-properties.phpt12
-rw-r--r--Zend/tests/enum/no-return-properties-by-ref.phpt27
-rw-r--r--Zend/tests/enum/no-static-properties.phpt12
-rw-r--r--Zend/tests/enum/no-unsed-value.phpt14
-rw-r--r--Zend/tests/enum/no-unset-propertes.phpt37
-rw-r--r--Zend/tests/enum/no-value-property.phpt12
-rw-r--r--Zend/tests/enum/no-write-properties-through-foreach-reference.phpt22
-rw-r--r--Zend/tests/enum/no-write-properties-through-references.phpt23
-rw-r--r--Zend/tests/enum/no-write-properties.phpt37
-rw-r--r--Zend/tests/enum/non-backed-enum-with-expr-value.phpt12
-rw-r--r--Zend/tests/enum/non-backed-enum-with-int-value.phpt12
-rw-r--r--Zend/tests/enum/non-backed-enum-with-invalid-value.phpt12
-rw-r--r--Zend/tests/enum/non-backed-enum-with-string-value.phpt12
-rw-r--r--Zend/tests/enum/offsetGet-in-const-expr.phpt29
-rw-r--r--Zend/tests/enum/print_r.phpt37
-rw-r--r--Zend/tests/enum/reflectionclass.phpt20
-rw-r--r--Zend/tests/enum/serialization-round-trip.phpt14
-rw-r--r--Zend/tests/enum/serialize.phpt14
-rw-r--r--Zend/tests/enum/spl-object-storage.phpt37
-rw-r--r--Zend/tests/enum/static-methods.phpt28
-rw-r--r--Zend/tests/enum/traits-no-__construct.phpt21
-rw-r--r--Zend/tests/enum/traits-no-cases-method.phpt34
-rw-r--r--Zend/tests/enum/traits-no-forbidden-methods.phpt21
-rw-r--r--Zend/tests/enum/traits-no-properties.phpt25
-rw-r--r--Zend/tests/enum/traits.phpt31
-rw-r--r--Zend/tests/enum/unit-cases.phpt28
-rw-r--r--Zend/tests/enum/unserialize-const.phpt18
-rw-r--r--Zend/tests/enum/unserialize-missing-colon.phpt17
-rw-r--r--Zend/tests/enum/unserialize-non-enum.phpt15
-rw-r--r--Zend/tests/enum/unserialize-non-existent-case.phpt17
-rw-r--r--Zend/tests/enum/unserialize-refcount.phpt45
-rw-r--r--Zend/tests/enum/unserialize.phpt24
-rw-r--r--Zend/tests/enum/value-property-type.phpt20
-rw-r--r--Zend/tests/enum/var_dump-nested.phpt20
-rw-r--r--Zend/tests/enum/var_dump-reference.phpt22
-rw-r--r--Zend/tests/enum/var_export.phpt14
-rw-r--r--Zend/tests/exception_001.phpt2
-rw-r--r--Zend/tests/gc_010.phpt21
-rw-r--r--Zend/tests/get_mangled_object_vars.phpt2
-rw-r--r--Zend/tests/globals_001.phpt2
-rw-r--r--Zend/tests/globals_002.phpt2
-rw-r--r--Zend/tests/globals_003.phpt2
-rw-r--r--Zend/tests/globals_004.phpt2
-rw-r--r--Zend/tests/inherit_internal_static.phpt2
-rw-r--r--Zend/tests/interface_exists_001.phpt2
-rw-r--r--Zend/tests/invalid_const_class_name.phpt8
-rw-r--r--Zend/tests/iterable_or_null.phpt2
-rw-r--r--Zend/tests/list_keyed_leading_comma.phpt10
-rw-r--r--Zend/tests/lsb_023.phpt26
-rw-r--r--Zend/tests/lsb_024.phpt25
-rw-r--r--Zend/tests/method_static_var.phpt4
-rw-r--r--Zend/tests/multibyte/multibyte_encoding_001.phpt2
-rw-r--r--Zend/tests/multibyte/multibyte_encoding_003.phptbin328 -> 329 bytes
-rw-r--r--Zend/tests/named_params/undef_var.phpt2
-rw-r--r--Zend/tests/null_to_non_nullable_special_func.phpt12
-rw-r--r--Zend/tests/nullsafe_operator/013.phpt9
-rw-r--r--Zend/tests/objects_033.phpt4
-rw-r--r--Zend/tests/oct_whitespace.phpt8
-rw-r--r--Zend/tests/overloaded_func_001.phpt2
-rw-r--r--Zend/tests/overloaded_func_002.phpt2
-rw-r--r--Zend/tests/resource_key.phpt36
-rw-r--r--Zend/tests/restrict_globals/globals_in_globals.phpt11
-rw-r--r--Zend/tests/restrict_globals/invalid_append.phpt10
-rw-r--r--Zend/tests/restrict_globals/invalid_append_isset.phpt8
-rw-r--r--Zend/tests/restrict_globals/invalid_append_unset.phpt8
-rw-r--r--Zend/tests/restrict_globals/invalid_assign.phpt10
-rw-r--r--Zend/tests/restrict_globals/invalid_assign_list.phpt10
-rw-r--r--Zend/tests/restrict_globals/invalid_assign_list_ref.phpt10
-rw-r--r--Zend/tests/restrict_globals/invalid_assign_op.phpt10
-rw-r--r--Zend/tests/restrict_globals/invalid_assign_ref_lhs.phpt11
-rw-r--r--Zend/tests/restrict_globals/invalid_assign_ref_rhs.phpt11
-rw-r--r--Zend/tests/restrict_globals/invalid_foreach.phpt10
-rw-r--r--Zend/tests/restrict_globals/invalid_foreach_ref.phpt10
-rw-r--r--Zend/tests/restrict_globals/invalid_pass_by_ref.phpt23
-rw-r--r--Zend/tests/restrict_globals/invalid_unset.phpt10
-rw-r--r--Zend/tests/restrict_globals/key_canonicalization.phpt11
-rw-r--r--Zend/tests/restrict_globals/valid.phpt52
-rw-r--r--Zend/tests/return_types/internal_functions001.phpt2
-rw-r--r--Zend/tests/return_types/internal_functions002.phpt2
-rw-r--r--Zend/tests/return_types/internal_functions003.phpt2
-rw-r--r--Zend/tests/static_variable_in_dynamic_function.phpt21
-rw-r--r--Zend/tests/static_variable_in_dynamic_function_2.phpt21
-rw-r--r--Zend/tests/str_or_obj_of_class_zpp.phpt6
-rw-r--r--Zend/tests/str_or_obj_zpp.phpt6
-rw-r--r--Zend/tests/trait_exists_001.phpt2
-rw-r--r--Zend/tests/traits/bug69579.phpt2
-rw-r--r--Zend/tests/traits/get_declared_traits_004.phpt16
-rw-r--r--Zend/tests/traits/precedence_unknown_class.phpt15
-rw-r--r--Zend/tests/traits/property008.phpt12
-rw-r--r--Zend/tests/type_declarations/internal_function_strict_mode.phpt2
-rw-r--r--Zend/tests/type_declarations/typed_properties_095.phpt2
-rw-r--r--Zend/tests/type_declarations/union_types/inheritance_internal.phpt2
-rw-r--r--Zend/tests/undef_index_to_exception.phpt2
-rw-r--r--Zend/tests/unset_cv09.phpt14
-rw-r--r--Zend/tests/unset_cv10.phpt4
-rw-r--r--Zend/zend.c73
-rw-r--r--Zend/zend.h48
-rw-r--r--Zend/zend_API.c444
-rw-r--r--Zend/zend_API.h296
-rw-r--r--Zend/zend_alloc.c7
-rw-r--r--Zend/zend_arena.h4
-rw-r--r--Zend/zend_ast.c76
-rw-r--r--Zend/zend_ast.h8
-rw-r--r--Zend/zend_attributes.c19
-rw-r--r--Zend/zend_attributes.h2
-rw-r--r--Zend/zend_attributes.stub.php4
-rw-r--r--Zend/zend_attributes_arginfo.h19
-rw-r--r--Zend/zend_bitset.h6
-rw-r--r--Zend/zend_builtin_functions.c137
-rw-r--r--Zend/zend_builtin_functions.stub.php8
-rw-r--r--Zend/zend_builtin_functions_arginfo.h24
-rw-r--r--Zend/zend_closures.c62
-rw-r--r--Zend/zend_closures.stub.php2
-rw-r--r--Zend/zend_closures_arginfo.h13
-rw-r--r--Zend/zend_compile.c792
-rw-r--r--Zend/zend_compile.h72
-rw-r--r--Zend/zend_constants.c8
-rw-r--r--Zend/zend_constants.h2
-rw-r--r--Zend/zend_cpuinfo.c4
-rw-r--r--Zend/zend_default_classes.c2
-rw-r--r--Zend/zend_dtrace.c4
-rw-r--r--Zend/zend_enum.c373
-rw-r--r--Zend/zend_enum.h52
-rw-r--r--Zend/zend_enum.stub.php15
-rw-r--r--Zend/zend_enum_arginfo.h49
-rw-r--r--Zend/zend_exceptions.c96
-rw-r--r--Zend/zend_exceptions.h2
-rw-r--r--Zend/zend_exceptions.stub.php40
-rw-r--r--Zend/zend_exceptions_arginfo.h211
-rw-r--r--Zend/zend_execute.c297
-rw-r--r--Zend/zend_execute.h24
-rw-r--r--Zend/zend_execute_API.c101
-rw-r--r--Zend/zend_extensions.h14
-rw-r--r--Zend/zend_gc.c43
-rw-r--r--Zend/zend_gc.h8
-rw-r--r--Zend/zend_generators.c26
-rw-r--r--Zend/zend_generators.h7
-rw-r--r--Zend/zend_generators.stub.php3
-rw-r--r--Zend/zend_generators_arginfo.h24
-rw-r--r--Zend/zend_globals.h44
-rw-r--r--Zend/zend_hash.c92
-rw-r--r--Zend/zend_hash.h72
-rw-r--r--Zend/zend_highlight.h2
-rw-r--r--Zend/zend_inheritance.c627
-rw-r--r--Zend/zend_inheritance.h9
-rw-r--r--Zend/zend_ini.c10
-rw-r--r--Zend/zend_ini.h12
-rw-r--r--Zend/zend_ini_parser.y5
-rw-r--r--Zend/zend_ini_scanner.l7
-rw-r--r--Zend/zend_interfaces.c32
-rw-r--r--Zend/zend_interfaces.h11
-rw-r--r--Zend/zend_interfaces.stub.php2
-rw-r--r--Zend/zend_interfaces_arginfo.h86
-rw-r--r--Zend/zend_language_parser.y27
-rw-r--r--Zend/zend_language_scanner.h6
-rw-r--r--Zend/zend_language_scanner.l171
-rw-r--r--Zend/zend_llist.c2
-rw-r--r--Zend/zend_map_ptr.h12
-rw-r--r--Zend/zend_modules.h2
-rw-r--r--Zend/zend_object_handlers.c137
-rw-r--r--Zend/zend_object_handlers.h44
-rw-r--r--Zend/zend_objects_API.c2
-rw-r--r--Zend/zend_objects_API.h2
-rw-r--r--Zend/zend_opcode.c165
-rw-r--r--Zend/zend_operators.c151
-rw-r--r--Zend/zend_operators.h98
-rw-r--r--Zend/zend_portability.h2
-rw-r--r--Zend/zend_ptr_stack.c4
-rw-r--r--Zend/zend_ptr_stack.h6
-rw-r--r--Zend/zend_signal.h4
-rw-r--r--Zend/zend_smart_str.h18
-rw-r--r--Zend/zend_smart_string.h12
-rw-r--r--Zend/zend_stack.c2
-rw-r--r--Zend/zend_stack.h2
-rw-r--r--Zend/zend_stream.c59
-rw-r--r--Zend/zend_stream.h18
-rw-r--r--Zend/zend_string.c10
-rw-r--r--Zend/zend_string.h16
-rw-r--r--Zend/zend_strtod.c3
-rw-r--r--Zend/zend_ts_hash.c4
-rw-r--r--Zend/zend_ts_hash.h4
-rw-r--r--Zend/zend_types.h74
-rw-r--r--Zend/zend_vm_def.h508
-rw-r--r--Zend/zend_vm_execute.h1220
-rwxr-xr-xZend/zend_vm_gen.php193
-rw-r--r--Zend/zend_vm_handlers.h919
-rw-r--r--Zend/zend_vm_opcodes.c10
-rw-r--r--Zend/zend_vm_opcodes.h3
-rw-r--r--Zend/zend_weakrefs.c30
-rw-r--r--Zend/zend_weakrefs.stub.php4
-rw-r--r--Zend/zend_weakrefs_arginfo.h25
-rw-r--r--appveyor/build.bat2
-rw-r--r--azure-pipelines.yml11
-rw-r--r--azure/apt.yml19
-rw-r--r--azure/configure.yml5
-rw-r--r--azure/coverage_job.yml1
-rw-r--r--azure/file_cache_job.yml1
-rw-r--r--azure/job.yml1
-rw-r--r--azure/libmysqlclient_job.yml37
-rw-r--r--azure/libmysqlclient_test.yml53
-rw-r--r--azure/macos/job.yml3
-rw-r--r--azure/mssql.yml5
-rw-r--r--azure/setup.yml4
-rw-r--r--azure/test.yml3
-rw-r--r--build/Makefile.global16
-rwxr-xr-xbuild/gen_stub.php723
-rw-r--r--build/php.m430
-rw-r--r--configure.ac48
-rw-r--r--docs/parameter-parsing-api.md2
-rw-r--r--docs/release-process.md27
-rw-r--r--ext/bcmath/bcmath.c20
-rw-r--r--ext/bcmath/bcmath.stub.php2
-rw-r--r--ext/bcmath/bcmath_arginfo.h2
-rw-r--r--ext/bcmath/tests/bcadd.phpt4
-rw-r--r--ext/bcmath/tests/bcadd_error.phpt23
-rw-r--r--ext/bcmath/tests/bcadd_variation001.phpt4
-rw-r--r--ext/bcmath/tests/bccomp.phpt4
-rw-r--r--ext/bcmath/tests/bccomp_error.phpt23
-rw-r--r--ext/bcmath/tests/bccomp_variation001.phpt4
-rw-r--r--ext/bcmath/tests/bccomp_variation002.phpt4
-rw-r--r--ext/bcmath/tests/bcdiv.phpt4
-rw-r--r--ext/bcmath/tests/bcdiv_error1.phpt4
-rw-r--r--ext/bcmath/tests/bcdiv_error2.phpt23
-rw-r--r--ext/bcmath/tests/bcmod.phpt4
-rw-r--r--ext/bcmath/tests/bcmod_error2.phpt4
-rw-r--r--ext/bcmath/tests/bcmod_error3.phpt23
-rw-r--r--ext/bcmath/tests/bcmul.phpt4
-rw-r--r--ext/bcmath/tests/bcmul_error.phpt23
-rw-r--r--ext/bcmath/tests/bcpow.phpt4
-rw-r--r--ext/bcmath/tests/bcpow_error1.phpt6
-rw-r--r--ext/bcmath/tests/bcpow_error2.phpt6
-rw-r--r--ext/bcmath/tests/bcpow_error3.phpt23
-rw-r--r--ext/bcmath/tests/bcpow_variation001.phpt4
-rw-r--r--ext/bcmath/tests/bcpowmod.phpt4
-rw-r--r--ext/bcmath/tests/bcpowmod_error.phpt30
-rw-r--r--ext/bcmath/tests/bcpowmod_negative_exponent.phpt4
-rw-r--r--ext/bcmath/tests/bcpowmod_zero_modulus.phpt4
-rw-r--r--ext/bcmath/tests/bcscale.phpt4
-rw-r--r--ext/bcmath/tests/bcscale_variation001.phpt4
-rw-r--r--ext/bcmath/tests/bcscale_variation002.phpt4
-rw-r--r--ext/bcmath/tests/bcscale_variation003.phpt4
-rw-r--r--ext/bcmath/tests/bcsqrt.phpt4
-rw-r--r--ext/bcmath/tests/bcsqrt_error1.phpt4
-rw-r--r--ext/bcmath/tests/bcsqrt_error2.phpt16
-rw-r--r--ext/bcmath/tests/bcsqrt_variation001.phpt4
-rw-r--r--ext/bcmath/tests/bcsub.phpt4
-rw-r--r--ext/bcmath/tests/bcsub_error.phpt23
-rw-r--r--ext/bcmath/tests/bug.66364.phpt6
-rw-r--r--ext/bcmath/tests/bug44995.phpt6
-rw-r--r--ext/bcmath/tests/bug46781.phpt6
-rw-r--r--ext/bcmath/tests/bug54598.phpt6
-rw-r--r--ext/bcmath/tests/bug60377.phpt4
-rw-r--r--ext/bcmath/tests/bug72093.phpt6
-rw-r--r--ext/bcmath/tests/bug75178.phpt6
-rw-r--r--ext/bcmath/tests/bug78878.phpt6
-rw-r--r--ext/bcmath/tests/bug80545.phpt6
-rw-r--r--ext/bcmath/tests/negative_scale.phpt4
-rw-r--r--ext/bcmath/tests/scale.phpt6
-rw-r--r--ext/bcmath/tests/scale_ini.phpt6
-rw-r--r--ext/bcmath/tests/str2num_formatting.phpt11
-rw-r--r--ext/bz2/bz2.c2
-rw-r--r--ext/bz2/bz2.stub.php5
-rw-r--r--ext/bz2/bz2_arginfo.h2
-rw-r--r--ext/bz2/tests/001.phpt4
-rw-r--r--ext/bz2/tests/002.phpt4
-rw-r--r--ext/bz2/tests/003-mb.phpt4
-rw-r--r--ext/bz2/tests/003.phpt4
-rw-r--r--ext/bz2/tests/004.phpt4
-rw-r--r--ext/bz2/tests/005.phpt4
-rw-r--r--ext/bz2/tests/bug51997.phpt4
-rw-r--r--ext/bz2/tests/bug71263.phpt4
-rw-r--r--ext/bz2/tests/bug72447.phpt4
-rw-r--r--ext/bz2/tests/bug72613.phpt4
-rw-r--r--ext/bz2/tests/bug75776.phpt6
-rw-r--r--ext/bz2/tests/bz2_filter_compress.phpt4
-rw-r--r--ext/bz2/tests/bz2_filter_decompress.phpt4
-rw-r--r--ext/bz2/tests/bzopen_string_filename_with_null_bytes.phpt4
-rw-r--r--ext/bz2/tests/with_files.phpt4
-rw-r--r--ext/bz2/tests/with_strings.phpt13
-rw-r--r--ext/calendar/cal_unix.c2
-rw-r--r--ext/calendar/calendar.c2
-rw-r--r--ext/calendar/calendar.stub.php2
-rw-r--r--ext/calendar/calendar_arginfo.h2
-rw-r--r--ext/calendar/easter.c2
-rw-r--r--ext/calendar/tests/bug52744.phpt4
-rw-r--r--ext/calendar/tests/bug53574_1.phpt3
-rw-r--r--ext/calendar/tests/bug53574_2.phpt3
-rw-r--r--ext/calendar/tests/bug54254.phpt4
-rw-r--r--ext/calendar/tests/bug55797_1.phpt3
-rw-r--r--ext/calendar/tests/bug55797_2.phpt3
-rw-r--r--ext/calendar/tests/bug67976.phpt6
-rw-r--r--ext/calendar/tests/bug71894.phpt6
-rw-r--r--ext/calendar/tests/bug80185.phpt3
-rw-r--r--ext/calendar/tests/bug80185_32bit.phpt3
-rw-r--r--ext/calendar/tests/cal_days_in_month.phpt4
-rw-r--r--ext/calendar/tests/cal_days_in_month_error1.phpt4
-rw-r--r--ext/calendar/tests/cal_from_jd.phpt4
-rw-r--r--ext/calendar/tests/cal_from_jd_error1.phpt4
-rw-r--r--ext/calendar/tests/cal_info.phpt4
-rw-r--r--ext/calendar/tests/cal_to_jd.phpt4
-rw-r--r--ext/calendar/tests/cal_to_jd_error1.phpt4
-rw-r--r--ext/calendar/tests/easter_date.phpt4
-rw-r--r--ext/calendar/tests/easter_days.phpt4
-rw-r--r--ext/calendar/tests/frenchtojd.phpt4
-rw-r--r--ext/calendar/tests/gregoriantojd.phpt4
-rw-r--r--ext/calendar/tests/gregoriantojd_overflow.phpt3
-rw-r--r--ext/calendar/tests/jddayofweek.phpt4
-rw-r--r--ext/calendar/tests/jdmonthname.phpt4
-rw-r--r--ext/calendar/tests/jdtofrench.phpt4
-rw-r--r--ext/calendar/tests/jdtogregorian.phpt4
-rw-r--r--ext/calendar/tests/jdtogregorian_overflow.phpt3
-rw-r--r--ext/calendar/tests/jdtojewish.phpt4
-rw-r--r--ext/calendar/tests/jdtojewish64.phpt3
-rw-r--r--ext/calendar/tests/jdtojewish_hebrew.phpt6
-rw-r--r--ext/calendar/tests/jdtojewish_overflow.phpt6
-rw-r--r--ext/calendar/tests/jdtojulian.phpt4
-rw-r--r--ext/calendar/tests/jdtomonthname.phpt4
-rw-r--r--ext/calendar/tests/jdtounix.phpt4
-rw-r--r--ext/calendar/tests/jdtounix_error1.phpt4
-rw-r--r--ext/calendar/tests/jewishtojd.phpt4
-rw-r--r--ext/calendar/tests/juliantojd.phpt4
-rw-r--r--ext/calendar/tests/juliantojd_overflow.phpt3
-rw-r--r--ext/calendar/tests/skipif.inc4
-rw-r--r--ext/calendar/tests/unixtojd.phpt4
-rw-r--r--ext/calendar/tests/unixtojd_error1.phpt4
-rw-r--r--ext/com_dotnet/com_com.c6
-rw-r--r--ext/com_dotnet/com_extension.c25
-rw-r--r--ext/com_dotnet/com_extension.stub.php12
-rw-r--r--ext/com_dotnet/com_extension_arginfo.h59
-rw-r--r--ext/com_dotnet/com_handlers.c2
-rw-r--r--ext/com_dotnet/com_persist.c10
-rw-r--r--ext/com_dotnet/com_persist.stub.php2
-rw-r--r--ext/com_dotnet/com_persist_arginfo.h13
-rw-r--r--ext/com_dotnet/php_com_dotnet.h10
-rw-r--r--ext/com_dotnet/php_com_dotnet_internal.h6
-rw-r--r--ext/com_dotnet/tests/27974.phpt5
-rw-r--r--ext/com_dotnet/tests/bug33386.phpt3
-rw-r--r--ext/com_dotnet/tests/bug34272.phpt5
-rw-r--r--ext/com_dotnet/tests/bug39596.phpt5
-rw-r--r--ext/com_dotnet/tests/bug39606.phpt5
-rw-r--r--ext/com_dotnet/tests/bug45280.phpt6
-rw-r--r--ext/com_dotnet/tests/bug49192.phpt5
-rw-r--r--ext/com_dotnet/tests/bug62474.phpt6
-rw-r--r--ext/com_dotnet/tests/bug63208.phpt6
-rw-r--r--ext/com_dotnet/tests/bug64130.phpt3
-rw-r--r--ext/com_dotnet/tests/bug66322.phpt3
-rw-r--r--ext/com_dotnet/tests/bug66431_0.phpt6
-rw-r--r--ext/com_dotnet/tests/bug66431_1.phpt4
-rw-r--r--ext/com_dotnet/tests/bug69939.phpt5
-rw-r--r--ext/com_dotnet/tests/bug72498.phpt6
-rw-r--r--ext/com_dotnet/tests/bug73679.phpt3
-rw-r--r--ext/com_dotnet/tests/bug77177.phpt6
-rw-r--r--ext/com_dotnet/tests/bug77578.phpt6
-rw-r--r--ext/com_dotnet/tests/bug77621.phpt6
-rw-r--r--ext/com_dotnet/tests/bug78650.phpt6
-rw-r--r--ext/com_dotnet/tests/bug78694.phpt6
-rw-r--r--ext/com_dotnet/tests/bug79242.phpt3
-rw-r--r--ext/com_dotnet/tests/bug79247.phpt6
-rw-r--r--ext/com_dotnet/tests/bug79248.phpt6
-rw-r--r--ext/com_dotnet/tests/bug79299.phpt6
-rw-r--r--ext/com_dotnet/tests/bug79332.phpt6
-rw-r--r--ext/com_dotnet/tests/variants.phpt3
-rw-r--r--ext/com_dotnet/tests/variants_x64.phpt3
-rw-r--r--ext/ctype/ctype.stub.php2
-rw-r--r--ext/ctype/ctype_arginfo.h2
-rw-r--r--ext/ctype/tests/001.phpt4
-rw-r--r--ext/ctype/tests/002.phpt4
-rw-r--r--ext/ctype/tests/bug25745.phpt4
-rw-r--r--ext/ctype/tests/bug34645.phpt4
-rw-r--r--ext/ctype/tests/ctype_alnum_basic.phpt4
-rw-r--r--ext/ctype/tests/ctype_alnum_variation1.phpt4
-rw-r--r--ext/ctype/tests/ctype_alnum_variation2.phpt4
-rw-r--r--ext/ctype/tests/ctype_alnum_variation3.phpt4
-rw-r--r--ext/ctype/tests/ctype_alnum_variation4.phpt4
-rw-r--r--ext/ctype/tests/ctype_alpha_basic.phpt4
-rw-r--r--ext/ctype/tests/ctype_alpha_variation1.phpt4
-rw-r--r--ext/ctype/tests/ctype_alpha_variation2.phpt4
-rw-r--r--ext/ctype/tests/ctype_alpha_variation3.phpt4
-rw-r--r--ext/ctype/tests/ctype_alpha_variation4.phpt4
-rw-r--r--ext/ctype/tests/ctype_cntrl_basic.phpt4
-rw-r--r--ext/ctype/tests/ctype_cntrl_variation1.phpt4
-rw-r--r--ext/ctype/tests/ctype_cntrl_variation2.phpt4
-rw-r--r--ext/ctype/tests/ctype_cntrl_variation3.phpt4
-rw-r--r--ext/ctype/tests/ctype_cntrl_variation4.phpt4
-rw-r--r--ext/ctype/tests/ctype_digit_basic.phpt4
-rw-r--r--ext/ctype/tests/ctype_digit_variation1.phpt4
-rw-r--r--ext/ctype/tests/ctype_digit_variation2.phpt4
-rw-r--r--ext/ctype/tests/ctype_digit_variation3.phpt4
-rw-r--r--ext/ctype/tests/ctype_digit_variation4.phpt4
-rw-r--r--ext/ctype/tests/ctype_graph_basic.phpt4
-rw-r--r--ext/ctype/tests/ctype_graph_variation1.phpt4
-rw-r--r--ext/ctype/tests/ctype_graph_variation2.phpt4
-rw-r--r--ext/ctype/tests/ctype_graph_variation3.phpt4
-rw-r--r--ext/ctype/tests/ctype_graph_variation4.phpt4
-rw-r--r--ext/ctype/tests/ctype_lower_basic.phpt4
-rw-r--r--ext/ctype/tests/ctype_lower_variation1.phpt4
-rw-r--r--ext/ctype/tests/ctype_lower_variation2.phpt4
-rw-r--r--ext/ctype/tests/ctype_lower_variation3.phpt4
-rw-r--r--ext/ctype/tests/ctype_lower_variation4.phpt4
-rw-r--r--ext/ctype/tests/ctype_print_basic.phpt4
-rw-r--r--ext/ctype/tests/ctype_print_variation1.phpt4
-rw-r--r--ext/ctype/tests/ctype_print_variation2.phpt4
-rw-r--r--ext/ctype/tests/ctype_print_variation3.phpt4
-rw-r--r--ext/ctype/tests/ctype_print_variation4.phpt4
-rw-r--r--ext/ctype/tests/ctype_punct_basic.phpt4
-rw-r--r--ext/ctype/tests/ctype_punct_variation1.phpt4
-rw-r--r--ext/ctype/tests/ctype_punct_variation2.phpt4
-rw-r--r--ext/ctype/tests/ctype_punct_variation3.phpt4
-rw-r--r--ext/ctype/tests/ctype_punct_variation4.phpt4
-rw-r--r--ext/ctype/tests/ctype_space_basic.phpt4
-rw-r--r--ext/ctype/tests/ctype_space_variation1.phpt4
-rw-r--r--ext/ctype/tests/ctype_space_variation2.phpt4
-rw-r--r--ext/ctype/tests/ctype_space_variation3.phpt4
-rw-r--r--ext/ctype/tests/ctype_space_variation4.phpt4
-rw-r--r--ext/ctype/tests/ctype_upper_basic.phpt4
-rw-r--r--ext/ctype/tests/ctype_upper_variation1.phpt4
-rw-r--r--ext/ctype/tests/ctype_upper_variation2.phpt4
-rw-r--r--ext/ctype/tests/ctype_upper_variation3.phpt4
-rw-r--r--ext/ctype/tests/ctype_upper_variation4.phpt4
-rw-r--r--ext/ctype/tests/ctype_xdigit_basic.phpt4
-rw-r--r--ext/ctype/tests/ctype_xdigit_variation1.phpt4
-rw-r--r--ext/ctype/tests/ctype_xdigit_variation2.phpt4
-rw-r--r--ext/ctype/tests/ctype_xdigit_variation3.phpt4
-rw-r--r--ext/ctype/tests/ctype_xdigit_variation4.phpt4
-rw-r--r--ext/ctype/tests/skipif.inc1
-rw-r--r--ext/curl/curl.stub.php5
-rw-r--r--ext/curl/curl_arginfo.h35
-rw-r--r--ext/curl/curl_file.c33
-rw-r--r--ext/curl/curl_file.stub.php18
-rw-r--r--ext/curl/curl_file_arginfo.h71
-rw-r--r--ext/curl/curl_private.h26
-rw-r--r--ext/curl/interface.c721
-rw-r--r--ext/curl/multi.c45
-rw-r--r--ext/curl/php_curl.h1
-rw-r--r--ext/curl/share.c6
-rw-r--r--ext/curl/tests/curl_string_file_upload.phpt86
-rw-r--r--ext/curl/tests/curlopt_private.phpt25
-rw-r--r--ext/curl/tests/responder/get.inc9
-rw-r--r--ext/date/lib/parse_date.c61
-rw-r--r--ext/date/lib/parse_iso_intervals.c2
-rw-r--r--ext/date/php_date.c93
-rw-r--r--ext/date/php_date.stub.php2
-rw-r--r--ext/date/php_date_arginfo.h65
-rw-r--r--ext/date/tests/DateTimeZone_clone_basic2.phpt16
-rw-r--r--ext/date/tests/DateTime_clone_basic2.phpt16
-rw-r--r--ext/date/tests/bug54283.phpt3
-rw-r--r--ext/date/tests/bug73837.phpt3
-rw-r--r--ext/date/tests/bug73858.phpt10
-rw-r--r--ext/date/tests/date_interval_create_from_date_string_nullparam.phpt2
-rw-r--r--ext/date/tests/date_timestamp_set_nullparam2.phpt3
-rw-r--r--ext/date/tests/microtime_error.phpt56
-rw-r--r--ext/dba/dba.c12
-rw-r--r--ext/dba/dba.stub.php2
-rw-r--r--ext/dba/dba_arginfo.h2
-rw-r--r--ext/dba/dba_inifile.c2
-rw-r--r--ext/dba/libinifile/inifile.c10
-rw-r--r--ext/dba/libinifile/inifile.h4
-rw-r--r--ext/dba/tests/dba_handlers.phpt2
-rw-r--r--ext/dom/attr.c8
-rw-r--r--ext/dom/characterdata.c6
-rw-r--r--ext/dom/document.c22
-rw-r--r--ext/dom/documenttype.c12
-rw-r--r--ext/dom/dom_iterators.c2
-rw-r--r--ext/dom/element.c10
-rw-r--r--ext/dom/entity.c6
-rw-r--r--ext/dom/node.c46
-rw-r--r--ext/dom/notation.c4
-rw-r--r--ext/dom/parentnode.c6
-rw-r--r--ext/dom/php_dom.c126
-rw-r--r--ext/dom/php_dom.h5
-rw-r--r--ext/dom/php_dom.stub.php4
-rw-r--r--ext/dom/php_dom_arginfo.h235
-rw-r--r--ext/dom/processinginstruction.c6
-rw-r--r--ext/dom/tests/DOMCharacterData_data_error_002.phpt10
-rw-r--r--ext/dom/tests/DOMCharacterData_length_error_001.phpt10
-rw-r--r--ext/dom/tests/DOMDocumentType_entities_error_001.phpt10
-rw-r--r--ext/dom/tests/DOMDocumentType_internalSubset_error_001.phpt10
-rw-r--r--ext/dom/tests/DOMDocumentType_name_error_001.phpt10
-rw-r--r--ext/dom/tests/DOMDocumentType_notations_error_001.phpt10
-rw-r--r--ext/dom/tests/DOMDocumentType_publicId_error_001.phpt10
-rw-r--r--ext/dom/tests/DOMDocumentType_systemId_error_001.phpt10
-rw-r--r--ext/dom/tests/DOMDocument_saveHTMLFile_invalid_filename.phpt2
-rw-r--r--ext/dom/tests/dom003.phpt4
-rw-r--r--ext/dom/tests/dom_set_attr_node.phpt4
-rw-r--r--ext/dom/text.c2
-rw-r--r--ext/dom/xml_common.h2
-rw-r--r--ext/dom/xpath.c4
-rw-r--r--ext/enchant/enchant.c10
-rw-r--r--ext/enchant/enchant.stub.php4
-rw-r--r--ext/enchant/enchant_arginfo.h24
-rw-r--r--ext/exif/exif.c8
-rw-r--r--ext/exif/exif.stub.php2
-rw-r--r--ext/exif/exif_arginfo.h2
-rw-r--r--ext/ffi/ffi.c85
-rw-r--r--ext/ffi/ffi.g10
-rw-r--r--ext/ffi/ffi.stub.php2
-rw-r--r--ext/ffi/ffi_arginfo.h56
-rw-r--r--ext/ffi/ffi_parser.c10
-rw-r--r--ext/ffi/php_ffi.h10
-rw-r--r--ext/ffi/tests/bug79096.phpt2
-rw-r--r--ext/ffi/tests/bug79177.phpt2
-rw-r--r--ext/ffi/tests/bug79532.phpt2
-rw-r--r--ext/ffi/tests/bug80847.phpt3
-rw-r--r--ext/fileinfo/fileinfo.c91
-rw-r--r--ext/fileinfo/fileinfo.stub.php21
-rw-r--r--ext/fileinfo/fileinfo_arginfo.h27
-rw-r--r--ext/fileinfo/tests/bug61964-mb.phpt6
-rw-r--r--ext/fileinfo/tests/bug61964.phpt6
-rw-r--r--ext/fileinfo/tests/finfo_close_basic.phpt3
-rw-r--r--ext/fileinfo/tests/finfo_close_error.phpt2
-rw-r--r--ext/fileinfo/tests/finfo_file_001.phpt6
-rw-r--r--ext/fileinfo/tests/finfo_open_001.phpt6
-rw-r--r--ext/fileinfo/tests/finfo_open_basic.phpt27
-rw-r--r--ext/fileinfo/tests/finfo_open_error.phpt5
-rw-r--r--ext/fileinfo/tests/finfo_open_variation1.phpt6
-rw-r--r--ext/filter/filter.c10
-rw-r--r--ext/filter/filter.stub.php2
-rw-r--r--ext/filter/filter_arginfo.h2
-rw-r--r--ext/filter/logical_filters.c13
-rw-r--r--ext/filter/tests/013.phpt8
-rw-r--r--ext/filter/tests/055.phpt18
-rw-r--r--ext/filter/tests/057.phpt4
-rw-r--r--ext/filter/tests/bug77423.phpt2
-rw-r--r--ext/filter/tests/surprising_integer_literals.phpt36
-rw-r--r--ext/ftp/ftp.c8
-rw-r--r--ext/ftp/ftp.stub.php183
-rw-r--r--ext/ftp/ftp_arginfo.h76
-rw-r--r--ext/ftp/php_ftp.c310
-rw-r--r--ext/ftp/tests/007.phpt66
-rw-r--r--ext/ftp/tests/CONFLICTS1
-rw-r--r--ext/ftp/tests/dead-resource.phpt24
-rw-r--r--ext/ftp/tests/ftp_constructor.phpt15
-rw-r--r--ext/ftp/tests/ftp_set_option_errors.phpt50
-rw-r--r--ext/ftp/tests/server.inc78
-rw-r--r--ext/gd/gd.c214
-rw-r--r--ext/gd/gd.stub.php23
-rw-r--r--ext/gd/gd_arginfo.h37
-rw-r--r--ext/gd/tests/imagetruecolortopalette_error3.phpt2
-rw-r--r--ext/gettext/gettext.stub.php2
-rw-r--r--ext/gettext/gettext_arginfo.h2
-rw-r--r--ext/gettext/tests/bug53251.phpt1
-rw-r--r--ext/gettext/tests/gettext_bindtextdomain-cwd.phpt4
-rw-r--r--ext/gmp/gmp.c19
-rw-r--r--ext/gmp/gmp.stub.php2
-rw-r--r--ext/gmp/gmp_arginfo.h12
-rw-r--r--ext/gmp/php_gmp.h2
-rw-r--r--ext/gmp/tests/gmp_init_integer_notations.phpt50
-rw-r--r--ext/gmp/tests/surprising_integer_literals.phpt33
-rwxr-xr-xext/hash/bench.php82
-rw-r--r--ext/hash/config.m49
-rw-r--r--ext/hash/config.w3216
-rw-r--r--ext/hash/hash.c84
-rw-r--r--ext/hash/hash.stub.php9
-rw-r--r--ext/hash/hash_adler32.c2
-rw-r--r--ext/hash/hash_arginfo.h16
-rw-r--r--ext/hash/hash_crc32.c2
-rw-r--r--ext/hash/hash_fnv.c4
-rw-r--r--ext/hash/hash_gost.c6
-rw-r--r--ext/hash/hash_haval.c2
-rw-r--r--ext/hash/hash_joaat.c2
-rw-r--r--ext/hash/hash_md.c12
-rw-r--r--ext/hash/hash_murmur.c225
-rw-r--r--ext/hash/hash_ripemd.c8
-rw-r--r--ext/hash/hash_sha.c38
-rw-r--r--ext/hash/hash_sha3.c4
-rw-r--r--ext/hash/hash_snefru.c2
-rw-r--r--ext/hash/hash_tiger.c4
-rw-r--r--ext/hash/hash_whirlpool.c2
-rw-r--r--ext/hash/hash_xxhash.c266
-rw-r--r--ext/hash/murmur/PMurHash.c226
-rw-r--r--ext/hash/murmur/PMurHash.h31
-rw-r--r--ext/hash/murmur/PMurHash128.c640
-rw-r--r--ext/hash/murmur/PMurHash128.h39
-rw-r--r--ext/hash/murmur/endianness.h84
-rw-r--r--ext/hash/php_hash.h9
-rw-r--r--ext/hash/php_hash_adler32.h2
-rw-r--r--ext/hash/php_hash_crc32.h2
-rw-r--r--ext/hash/php_hash_fnv.h4
-rw-r--r--ext/hash/php_hash_gost.h2
-rw-r--r--ext/hash/php_hash_haval.h2
-rw-r--r--ext/hash/php_hash_joaat.h2
-rw-r--r--ext/hash/php_hash_md.h6
-rw-r--r--ext/hash/php_hash_murmur.h57
-rw-r--r--ext/hash/php_hash_ripemd.h8
-rw-r--r--ext/hash/php_hash_sha.h18
-rw-r--r--ext/hash/php_hash_sha3.h8
-rw-r--r--ext/hash/php_hash_snefru.h2
-rw-r--r--ext/hash/php_hash_tiger.h4
-rw-r--r--ext/hash/php_hash_whirlpool.h2
-rw-r--r--ext/hash/php_hash_xxhash.h73
-rw-r--r--ext/hash/tests/hash-clone.phpt42
-rw-r--r--ext/hash/tests/hash_algos.phpt16
-rw-r--r--ext/hash/tests/hash_copy_001.phpt42
-rw-r--r--ext/hash/tests/hash_init_error.phpt4
-rw-r--r--ext/hash/tests/hash_serialize_001.phpt37
-rw-r--r--ext/hash/tests/hash_serialize_002.phpt2
-rw-r--r--ext/hash/tests/murmurhash3.phpt49
-rw-r--r--ext/hash/tests/murmurhash3_seed.phpt52
-rw-r--r--ext/hash/tests/xxhash_secret.phpt42
-rw-r--r--ext/hash/tests/xxhash_seed.phpt29
-rw-r--r--ext/hash/tests/xxhash_unserialize_memsize.phpt27
-rw-r--r--ext/hash/xxhash/xxhash.h4766
-rw-r--r--ext/iconv/iconv.c2
-rw-r--r--ext/iconv/iconv.stub.php2
-rw-r--r--ext/iconv/iconv_arginfo.h2
-rw-r--r--ext/iconv/tests/iconv_mime_decode-charset-length-cve-2007-4840.phpt2
-rw-r--r--ext/iconv/tests/iconv_mime_decode_headers-charset-length-cve-2007-4840.phpt2
-rw-r--r--ext/imap/php_imap.c901
-rw-r--r--ext/imap/php_imap.h7
-rw-r--r--ext/imap/php_imap.stub.php183
-rw-r--r--ext/imap/php_imap_arginfo.h92
-rw-r--r--ext/imap/tests/bug45705_1.phpt2
-rw-r--r--ext/imap/tests/bug75774.phpt5
-rw-r--r--ext/imap/tests/imap_constructor.phpt15
-rw-r--r--ext/imap/tests/imap_errors_basic.phpt17
-rw-r--r--ext/imap/tests/imap_final.phpt11
-rw-r--r--ext/imap/tests/setup/dovecot.conf24
-rw-r--r--ext/intl/breakiterator/breakiterator.stub.php8
-rw-r--r--ext/intl/breakiterator/breakiterator_arginfo.h42
-rw-r--r--ext/intl/breakiterator/breakiterator_class.cpp22
-rw-r--r--ext/intl/breakiterator/breakiterator_iterators.cpp8
-rw-r--r--ext/intl/breakiterator/breakiterator_iterators.stub.php9
-rw-r--r--ext/intl/breakiterator/breakiterator_iterators_arginfo.h24
-rw-r--r--ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp2
-rw-r--r--ext/intl/calendar/calendar.stub.php2
-rw-r--r--ext/intl/calendar/calendar_arginfo.h22
-rw-r--r--ext/intl/calendar/calendar_class.cpp11
-rw-r--r--ext/intl/calendar/calendar_methods.cpp8
-rw-r--r--ext/intl/calendar/gregoriancalendar_methods.cpp2
-rw-r--r--ext/intl/collator/collator.stub.php2
-rw-r--r--ext/intl/collator/collator_arginfo.h12
-rw-r--r--ext/intl/collator/collator_class.c7
-rw-r--r--ext/intl/common/common.stub.php2
-rw-r--r--ext/intl/common/common_arginfo.h13
-rw-r--r--ext/intl/common/common_enum.cpp9
-rw-r--r--ext/intl/converter/converter.c15
-rw-r--r--ext/intl/converter/converter.stub.php2
-rw-r--r--ext/intl/converter/converter_arginfo.h12
-rw-r--r--ext/intl/dateformat/dateformat.stub.php2
-rw-r--r--ext/intl/dateformat/dateformat_arginfo.h12
-rw-r--r--ext/intl/dateformat/dateformat_attr.c6
-rw-r--r--ext/intl/dateformat/dateformat_attrcpp.cpp2
-rw-r--r--ext/intl/dateformat/dateformat_class.c7
-rw-r--r--ext/intl/dateformat/dateformat_create.cpp2
-rw-r--r--ext/intl/dateformat/dateformat_helpers.cpp2
-rw-r--r--ext/intl/dateformat/dateformat_helpers.h2
-rw-r--r--ext/intl/formatter/formatter.stub.php2
-rw-r--r--ext/intl/formatter/formatter_arginfo.h12
-rw-r--r--ext/intl/formatter/formatter_class.c7
-rw-r--r--ext/intl/formatter/formatter_format.c4
-rw-r--r--ext/intl/grapheme/grapheme_string.c4
-rw-r--r--ext/intl/intl_error.c11
-rw-r--r--ext/intl/intl_error.h3
-rw-r--r--ext/intl/locale/locale.stub.php2
-rw-r--r--ext/intl/locale/locale_arginfo.h12
-rw-r--r--ext/intl/locale/locale_class.c15
-rw-r--r--ext/intl/locale/locale_methods.c4
-rw-r--r--ext/intl/msgformat/msgformat.stub.php2
-rw-r--r--ext/intl/msgformat/msgformat_arginfo.h12
-rw-r--r--ext/intl/msgformat/msgformat_class.c7
-rw-r--r--ext/intl/normalizer/normalizer.stub.php2
-rw-r--r--ext/intl/normalizer/normalizer_arginfo.h12
-rw-r--r--ext/intl/normalizer/normalizer_class.c16
-rw-r--r--ext/intl/php_intl.c5
-rw-r--r--ext/intl/php_intl.h2
-rw-r--r--ext/intl/php_intl.stub.php2
-rw-r--r--ext/intl/php_intl_arginfo.h12
-rw-r--r--ext/intl/resourcebundle/resourcebundle.stub.php2
-rw-r--r--ext/intl/resourcebundle/resourcebundle_arginfo.h13
-rw-r--r--ext/intl/resourcebundle/resourcebundle_class.c19
-rw-r--r--ext/intl/resourcebundle/resourcebundle_iterator.h2
-rw-r--r--ext/intl/spoofchecker/spoofchecker.stub.php2
-rw-r--r--ext/intl/spoofchecker/spoofchecker_arginfo.h12
-rw-r--r--ext/intl/spoofchecker/spoofchecker_class.c7
-rw-r--r--ext/intl/tests/bug48227.phpt4
-rw-r--r--ext/intl/tests/bug72241.phpt5
-rw-r--r--ext/intl/tests/collator_compare_variant2.phpt10
-rw-r--r--ext/intl/tests/collator_get_sort_key_variant7.phpt4
-rw-r--r--ext/intl/tests/formatter_fail.phpt12
-rw-r--r--ext/intl/tests/gregoriancalendar___construct_error.phpt2
-rw-r--r--ext/intl/tests/gregoriancalendar___construct_variant1.phpt2
-rw-r--r--ext/intl/tests/msgfmt_fail2.phpt12
-rw-r--r--ext/intl/tests/ut_common.inc2
-rw-r--r--ext/intl/timezone/timezone.stub.php2
-rw-r--r--ext/intl/timezone/timezone_arginfo.h12
-rw-r--r--ext/intl/timezone/timezone_class.cpp13
-rw-r--r--ext/intl/timezone/timezone_class.h2
-rw-r--r--ext/intl/timezone/timezone_methods.cpp8
-rw-r--r--ext/intl/transliterator/transliterator.stub.php4
-rw-r--r--ext/intl/transliterator/transliterator_arginfo.h18
-rw-r--r--ext/intl/transliterator/transliterator_class.c54
-rw-r--r--ext/intl/uchar/uchar.c5
-rw-r--r--ext/intl/uchar/uchar.stub.php2
-rw-r--r--ext/intl/uchar/uchar_arginfo.h12
-rw-r--r--ext/json/json.c16
-rw-r--r--ext/json/json.stub.php2
-rw-r--r--ext/json/json_arginfo.h22
-rw-r--r--ext/json/json_encoder.c103
-rw-r--r--ext/json/json_scanner.re2
-rw-r--r--ext/json/php_json.h5
-rw-r--r--ext/json/tests/001.phpt2
-rw-r--r--ext/json/tests/bug69187.phpt4
-rw-r--r--ext/json/tests/bug72069.phpt4
-rw-r--r--ext/ldap/ldap.c680
-rw-r--r--ext/ldap/ldap.stub.php273
-rw-r--r--ext/ldap/ldap_arginfo.h174
-rw-r--r--ext/ldap/tests/bug48441.phpt9
-rw-r--r--ext/ldap/tests/bug72021.phpt2
-rw-r--r--ext/ldap/tests/bug73933.phpt5
-rw-r--r--ext/ldap/tests/bug77958.phpt3
-rw-r--r--ext/ldap/tests/ldap_add_ext.phpt3
-rw-r--r--ext/ldap/tests/ldap_bind_ext.phpt12
-rw-r--r--ext/ldap/tests/ldap_connect_basic.phpt3
-rw-r--r--ext/ldap/tests/ldap_connect_variation.phpt15
-rw-r--r--ext/ldap/tests/ldap_controls.phpt15
-rw-r--r--ext/ldap/tests/ldap_delete_ext.phpt3
-rw-r--r--ext/ldap/tests/ldap_escape_both.phpt2
-rw-r--r--ext/ldap/tests/ldap_escape_dn.phpt2
-rw-r--r--ext/ldap/tests/ldap_escape_filter.phpt2
-rw-r--r--ext/ldap/tests/ldap_exop.phpt8
-rw-r--r--ext/ldap/tests/ldap_exop_passwd.phpt1
-rw-r--r--ext/ldap/tests/ldap_exop_whoami.phpt1
-rw-r--r--ext/ldap/tests/ldap_first_attribute_error.phpt2
-rw-r--r--ext/ldap/tests/ldap_first_entry_basic.phpt3
-rw-r--r--ext/ldap/tests/ldap_first_reference_basic.phpt3
-rw-r--r--ext/ldap/tests/ldap_get_option_controls.phpt3
-rw-r--r--ext/ldap/tests/ldap_list_basic.phpt3
-rw-r--r--ext/ldap/tests/ldap_mod_ext.phpt6
-rw-r--r--ext/ldap/tests/ldap_next_entry_basic.phpt3
-rw-r--r--ext/ldap/tests/ldap_next_reference_basic.phpt3
-rw-r--r--ext/ldap/tests/ldap_parse_result_controls.phpt3
-rw-r--r--ext/ldap/tests/ldap_read_basic.phpt3
-rw-r--r--ext/ldap/tests/ldap_read_variation1.phpt2
-rw-r--r--ext/ldap/tests/ldap_rename_ext.phpt3
-rw-r--r--ext/ldap/tests/ldap_search_basic.phpt3
-rw-r--r--ext/ldap/tests/ldap_search_error.phpt4
-rw-r--r--ext/ldap/tests/ldap_search_overrides.phpt5
-rw-r--r--ext/ldap/tests/ldap_search_paged_result_controls.phpt6
-rw-r--r--ext/ldap/tests/ldap_search_sort_controls.phpt6
-rw-r--r--ext/ldap/tests/ldap_search_variation1.phpt3
-rw-r--r--ext/ldap/tests/ldap_search_variation2.phpt3
-rw-r--r--ext/ldap/tests/ldap_search_variation3.phpt6
-rw-r--r--ext/ldap/tests/ldap_search_variation4.phpt3
-rw-r--r--ext/ldap/tests/ldap_search_variation5.phpt9
-rw-r--r--ext/ldap/tests/ldap_search_variation6.phpt18
-rw-r--r--ext/libxml/libxml.c40
-rw-r--r--ext/libxml/libxml.stub.php8
-rw-r--r--ext/libxml/libxml_arginfo.h48
-rw-r--r--ext/libxml/php_libxml.h4
-rw-r--r--ext/mbstring/config.m429
-rw-r--r--ext/mbstring/config.w3229
-rw-r--r--ext/mbstring/libmbfl/filters/emoji2uni.h6
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_7bit.c2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_armscii8.c146
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_armscii8.h38
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_ascii.c111
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_ascii.h44
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_big5.c45
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_big5.h2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_byte2.c142
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_byte2.h48
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_byte4.c162
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_byte4.h46
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1251.c147
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1251.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1252.c142
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1252.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1254.c152
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1254.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c749
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h16
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp51932.c121
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp51932.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp850.c142
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp850.h37
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp866.c146
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp866.h41
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp932.c74
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp932.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp936.c30
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp936.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c40
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_cn.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c151
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c13
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c90
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c40
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_kr.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c64
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_tw.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_gb18030.c115
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_gb18030.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_htmlent.c2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_hz.c56
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_hz.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c117
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c80
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c103
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c29
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c95
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.h26
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.h26
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.h23
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c134
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c134
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.h41
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c134
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c134
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c134
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_jis.c237
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_jis.h2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_koi8r.c146
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_koi8r.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_koi8u.c143
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_koi8u.h40
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_qprint.c5
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c581
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h44
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis.c164
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c76
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.h4
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c59
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.h2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c1034
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.h4
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_open.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_ucs2.c125
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_ucs4.c18
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_uhc.c52
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_uhc.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf16.c230
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf16.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf32.c175
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf32.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf7.c61
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf7.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c86
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf8.c85
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf8.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.h5
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_prop.h272
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_armscii8.h54
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_cp1251.h51
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_cp1252.h8
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_cp1254.h51
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_cp850.h52
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_cp866.h51
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_10.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_13.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_14.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_15.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_16.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_2.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_3.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_4.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_5.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_6.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_7.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_8.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_9.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_jis.h6
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_jis2004.h4
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_koi8r.h53
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_koi8u.h165
-rw-r--r--ext/mbstring/libmbfl/mbfl/eaw_table.h110
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter.c279
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter.h3
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c2
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter_pass.c2
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c2
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_consts.h31
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_convert.c50
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_encoding.c132
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_encoding.h20
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_ident.c268
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_ident.h70
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c142
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h2
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_string.c25
-rw-r--r--ext/mbstring/mbstring.c133
-rw-r--r--ext/mbstring/mbstring.h10
-rw-r--r--ext/mbstring/mbstring.stub.php2
-rw-r--r--ext/mbstring/mbstring_arginfo.h2
-rw-r--r--ext/mbstring/php_mbregex.c2
-rw-r--r--ext/mbstring/tests/armscii8_encoding.phpt32
-rw-r--r--ext/mbstring/tests/bug26639.phpt82
-rw-r--r--ext/mbstring/tests/bug28220.phpt25
-rw-r--r--ext/mbstring/tests/bug43994.phpt33
-rw-r--r--ext/mbstring/tests/bug45722.phpt2
-rw-r--r--ext/mbstring/tests/bug47399.phpt525
-rw-r--r--ext/mbstring/tests/bug62545.phpt16
-rw-r--r--ext/mbstring/tests/bug72164.phpt2
-rw-r--r--ext/mbstring/tests/bug73646.phpt3
-rw-r--r--ext/mbstring/tests/cp1251_encoding.phpt15
-rw-r--r--ext/mbstring/tests/cp1252_encoding.phpt15
-rw-r--r--ext/mbstring/tests/cp1254_encoding.phpt15
-rw-r--r--ext/mbstring/tests/cp5022x_encoding.phpt293
-rw-r--r--ext/mbstring/tests/cp51932_encoding.phpt111
-rw-r--r--ext/mbstring/tests/cp850_encoding.phpt14
-rw-r--r--ext/mbstring/tests/cp866_encoding.phpt15
-rw-r--r--ext/mbstring/tests/cp932_encoding.phpt108
-rw-r--r--ext/mbstring/tests/data/8859-1.txt292
-rw-r--r--ext/mbstring/tests/data/8859-10.txt292
-rw-r--r--ext/mbstring/tests/data/8859-11.txt286
-rw-r--r--ext/mbstring/tests/data/8859-13.txt291
-rw-r--r--ext/mbstring/tests/data/8859-14.txt292
-rw-r--r--ext/mbstring/tests/data/8859-15.txt294
-rw-r--r--ext/mbstring/tests/data/8859-16.txt293
-rw-r--r--ext/mbstring/tests/data/8859-2.txt292
-rw-r--r--ext/mbstring/tests/data/8859-3.txt285
-rw-r--r--ext/mbstring/tests/data/8859-4.txt292
-rw-r--r--ext/mbstring/tests/data/8859-5.txt292
-rw-r--r--ext/mbstring/tests/data/8859-6.txt249
-rw-r--r--ext/mbstring/tests/data/8859-7.txt299
-rw-r--r--ext/mbstring/tests/data/8859-8.txt258
-rw-r--r--ext/mbstring/tests/data/8859-9.txt294
-rw-r--r--ext/mbstring/tests/data/ARMSCII-8.txt255
-rw-r--r--ext/mbstring/tests/data/CP1251.txt274
-rw-r--r--ext/mbstring/tests/data/CP1252.txt274
-rw-r--r--ext/mbstring/tests/data/CP1254.txt274
-rw-r--r--ext/mbstring/tests/data/CP51932.txt7613
-rw-r--r--ext/mbstring/tests/data/CP850.txt273
-rw-r--r--ext/mbstring/tests/data/CP866.txt273
-rw-r--r--ext/mbstring/tests/data/CP932.txt7998
-rw-r--r--ext/mbstring/tests/data/EUC-JP.txt13137
-rw-r--r--ext/mbstring/tests/data/EmojiSources.txt763
-rw-r--r--ext/mbstring/tests/data/ISO-2022-JP-2004-JISX0213.txt11391
-rw-r--r--ext/mbstring/tests/data/JISX0201.txt202
-rw-r--r--ext/mbstring/tests/data/JISX0208.txt6942
-rw-r--r--ext/mbstring/tests/data/JISX0212.txt6141
-rw-r--r--ext/mbstring/tests/data/KOI8-R.txt294
-rw-r--r--ext/mbstring/tests/data/KOI8-U.txt301
-rw-r--r--ext/mbstring/tests/data/MacJapanese-SJIS.txt7728
-rw-r--r--ext/mbstring/tests/data/SHIFTJIS.txt7097
-rw-r--r--ext/mbstring/tests/data/SJIS-2004.txt11549
-rw-r--r--ext/mbstring/tests/encoding_tests.inc225
-rw-r--r--ext/mbstring/tests/eucjp_encoding.phpt84
-rw-r--r--ext/mbstring/tests/illformed_utf_sequences.phpt21
-rw-r--r--ext/mbstring/tests/ini_mbstring_invalid.phpt1
-rw-r--r--ext/mbstring/tests/iso2022jp_2004_encoding.phpt329
-rw-r--r--ext/mbstring/tests/iso2022jp_encoding.phpt195
-rw-r--r--ext/mbstring/tests/iso8859_encodings.phpt46
-rw-r--r--ext/mbstring/tests/koi8r_encoding.phpt15
-rw-r--r--ext/mbstring/tests/koi8u_encoding.phpt15
-rw-r--r--ext/mbstring/tests/mb_convert_encoding.phpt26
-rw-r--r--ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt2
-rw-r--r--ext/mbstring/tests/mb_detect_encoding.phpt3
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_variation1.phpt34
-rw-r--r--ext/mbstring/tests/mb_internal_encoding_variation2.phpt56
-rw-r--r--ext/mbstring/tests/mb_str_functions_opt-parameter.phpt21
-rw-r--r--ext/mbstring/tests/mb_str_split_jp.phpt1
-rw-r--r--ext/mbstring/tests/mb_str_split_ru.phpt1
-rw-r--r--ext/mbstring/tests/mb_str_split_utf8_utf16.phpt1
-rw-r--r--ext/mbstring/tests/pictogram1.phpt1
-rw-r--r--ext/mbstring/tests/sjis2004_encoding.phpt67
-rw-r--r--ext/mbstring/tests/sjis_encoding.phpt66
-rw-r--r--ext/mbstring/tests/sjis_mobile_encodings.phpt295
-rw-r--r--ext/mbstring/tests/sjismac_encoding.phpt93
-rwxr-xr-xext/mbstring/ucgendat/ucgendat.php98
-rw-r--r--ext/mbstring/unicode_data.h10
-rw-r--r--ext/mysqli/mysqli.c112
-rw-r--r--ext/mysqli/mysqli.stub.php96
-rw-r--r--ext/mysqli/mysqli_api.c37
-rw-r--r--ext/mysqli/mysqli_arginfo.h345
-rw-r--r--ext/mysqli/mysqli_driver.c87
-rw-r--r--ext/mysqli/mysqli_nonapi.c48
-rw-r--r--ext/mysqli/mysqli_priv.h4
-rw-r--r--ext/mysqli/mysqli_prop.c171
-rw-r--r--ext/mysqli/mysqli_warning.c10
-rw-r--r--ext/mysqli/php_mysqli_structs.h31
-rw-r--r--ext/mysqli/tests/003.phpt2
-rw-r--r--ext/mysqli/tests/020.phpt2
-rw-r--r--ext/mysqli/tests/073.phpt22
-rw-r--r--ext/mysqli/tests/bug34810.phpt5
-rw-r--r--ext/mysqli/tests/bug36802.phpt4
-rw-r--r--ext/mysqli/tests/bug62885.phpt4
-rw-r--r--ext/mysqli/tests/bug66124.phpt14
-rw-r--r--ext/mysqli/tests/bug75018.phpt6
-rw-r--r--ext/mysqli/tests/bug75434.phpt1
-rw-r--r--ext/mysqli/tests/bug77597.phpt12
-rw-r--r--ext/mysqli/tests/bug77935.phpt7
-rw-r--r--ext/mysqli/tests/bug77956.phpt5
-rw-r--r--ext/mysqli/tests/connect.inc5
-rw-r--r--ext/mysqli/tests/foo/bar/bar.data3
-rw-r--r--ext/mysqli/tests/foo/foo.data3
-rw-r--r--ext/mysqli/tests/local_infile_tools.inc12
-rw-r--r--ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt75
-rw-r--r--ext/mysqli/tests/mysqli_class_mysqli_driver_interface.phpt138
-rw-r--r--ext/mysqli/tests/mysqli_class_mysqli_interface.phpt8
-rw-r--r--ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt50
-rw-r--r--ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt8
-rw-r--r--ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt10
-rw-r--r--ext/mysqli/tests/mysqli_constants.phpt5
-rw-r--r--ext/mysqli/tests/mysqli_driver.phpt180
-rw-r--r--ext/mysqli/tests/mysqli_fetch_all.phpt2
-rw-r--r--ext/mysqli/tests/mysqli_fetch_all_oo.phpt3
-rw-r--r--ext/mysqli/tests/mysqli_fetch_field.phpt8
-rw-r--r--ext/mysqli/tests/mysqli_fetch_field_oo.phpt6
-rw-r--r--ext/mysqli/tests/mysqli_fetch_fields.phpt9
-rw-r--r--ext/mysqli/tests/mysqli_get_info_deprecations.phpt31
-rw-r--r--ext/mysqli/tests/mysqli_incomplete_initialization.phpt1
-rw-r--r--ext/mysqli/tests/mysqli_insert_packet_overflow.phpt7
-rw-r--r--ext/mysqli/tests/mysqli_kill.phpt3
-rw-r--r--ext/mysqli/tests/mysqli_local_infile_default_off.phpt4
-rw-r--r--ext/mysqli/tests/mysqli_local_infile_directory_access_allowed.phpt80
-rw-r--r--ext/mysqli/tests/mysqli_local_infile_directory_access_denied.phpt65
-rw-r--r--ext/mysqli/tests/mysqli_local_infile_directory_vs_open_basedir.phpt65
-rw-r--r--ext/mysqli/tests/mysqli_pam_sha256.phpt10
-rw-r--r--ext/mysqli/tests/mysqli_pam_sha256_public_key_ini.phpt11
-rw-r--r--ext/mysqli/tests/mysqli_pam_sha256_public_key_option.phpt11
-rw-r--r--ext/mysqli/tests/mysqli_pam_sha256_public_key_option_invalid.phpt11
-rw-r--r--ext/mysqli/tests/mysqli_phpinfo.phpt2
-rw-r--r--ext/mysqli/tests/mysqli_query_unicode.phpt8
-rw-r--r--ext/mysqli/tests/mysqli_real_connect.phpt2
-rw-r--r--ext/mysqli/tests/mysqli_result_references.phpt42
-rw-r--r--ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt52
-rw-r--r--ext/mysqli/tests/mysqli_stmt_attr_set.phpt6
-rw-r--r--ext/mysqli/tests/mysqli_stmt_bind_result_references.phpt12
-rw-r--r--ext/mysqli/tests/mysqli_stmt_get_result_non_select.phpt12
-rw-r--r--ext/mysqli/tests/mysqli_stmt_multires.phpt8
-rw-r--r--ext/mysqli/tests/ps_cursor_multiple_result_sets.phpt7
-rw-r--r--ext/mysqlnd/mysqlnd.h25
-rw-r--r--ext/mysqlnd/mysqlnd_alloc.c355
-rw-r--r--ext/mysqlnd/mysqlnd_alloc.h24
-rw-r--r--ext/mysqlnd/mysqlnd_auth.c30
-rw-r--r--ext/mysqlnd/mysqlnd_auth.h10
-rw-r--r--ext/mysqlnd/mysqlnd_block_alloc.c59
-rw-r--r--ext/mysqlnd/mysqlnd_charset.c4
-rw-r--r--ext/mysqlnd/mysqlnd_commands.c29
-rw-r--r--ext/mysqlnd/mysqlnd_connection.c136
-rw-r--r--ext/mysqlnd/mysqlnd_connection.h2
-rw-r--r--ext/mysqlnd/mysqlnd_debug.c6
-rw-r--r--ext/mysqlnd/mysqlnd_debug.h6
-rw-r--r--ext/mysqlnd/mysqlnd_driver.c72
-rw-r--r--ext/mysqlnd/mysqlnd_enum_n_def.h25
-rw-r--r--ext/mysqlnd/mysqlnd_ext_plugin.c21
-rw-r--r--ext/mysqlnd/mysqlnd_ext_plugin.h6
-rw-r--r--ext/mysqlnd/mysqlnd_libmysql_compat.h3
-rw-r--r--ext/mysqlnd/mysqlnd_loaddata.c48
-rw-r--r--ext/mysqlnd/mysqlnd_priv.h2
-rw-r--r--ext/mysqlnd/mysqlnd_protocol_frame_codec.c8
-rw-r--r--ext/mysqlnd/mysqlnd_protocol_frame_codec.h2
-rw-r--r--ext/mysqlnd/mysqlnd_ps.c366
-rw-r--r--ext/mysqlnd/mysqlnd_ps.h8
-rw-r--r--ext/mysqlnd/mysqlnd_ps_codec.c82
-rw-r--r--ext/mysqlnd/mysqlnd_read_buffer.c2
-rw-r--r--ext/mysqlnd/mysqlnd_result.c1230
-rw-r--r--ext/mysqlnd/mysqlnd_result.h5
-rw-r--r--ext/mysqlnd/mysqlnd_result_meta.c35
-rw-r--r--ext/mysqlnd/mysqlnd_statistics.c4
-rw-r--r--ext/mysqlnd/mysqlnd_statistics.h4
-rw-r--r--ext/mysqlnd/mysqlnd_structs.h196
-rw-r--r--ext/mysqlnd/mysqlnd_vio.c30
-rw-r--r--ext/mysqlnd/mysqlnd_vio.h2
-rw-r--r--ext/mysqlnd/mysqlnd_wireprotocol.c206
-rw-r--r--ext/mysqlnd/mysqlnd_wireprotocol.h30
-rw-r--r--ext/mysqlnd/php_mysqlnd.c17
-rw-r--r--ext/oci8/oci8.c26
-rw-r--r--ext/oci8/oci8.stub.php2
-rw-r--r--ext/oci8/oci8_arginfo.h22
-rw-r--r--ext/oci8/oci8_interface.c10
-rw-r--r--ext/oci8/oci8_statement.c6
-rw-r--r--ext/oci8/php_oci8_int.h8
-rw-r--r--ext/oci8/tests/bind_char_1.phpt12
-rw-r--r--ext/oci8/tests/coll_010.phpt6
-rw-r--r--ext/oci8/tests/coll_010_func.phpt6
-rw-r--r--ext/oci8/tests/coll_017.phpt6
-rw-r--r--ext/oci8/tests/coll_017_func.phpt6
-rw-r--r--ext/oci8/tests/coll_019.phpt2
-rw-r--r--ext/oci8/tests/conn_attr_4.phpt2
-rw-r--r--ext/oci8/tests/edition_2.phpt2
-rw-r--r--ext/oci8/tests/extauth_01.phpt2
-rw-r--r--ext/oci8/tests/extauth_02.phpt2
-rw-r--r--ext/oci8/tests/extauth_03.phpt2
-rw-r--r--ext/oci8/tests/lob_null.phpt2
-rw-r--r--ext/odbc/odbc.stub.php2
-rw-r--r--ext/odbc/odbc_arginfo.h2
-rw-r--r--ext/odbc/php_odbc.c4
-rw-r--r--ext/odbc/tests/odbc_columnprivileges_001.phpt6
-rw-r--r--ext/opcache/ZendAccelerator.c741
-rw-r--r--ext/opcache/ZendAccelerator.h75
-rw-r--r--ext/opcache/config.m422
-rw-r--r--ext/opcache/config.w322
-rw-r--r--ext/opcache/jit/zend_jit.c39
-rw-r--r--ext/opcache/jit/zend_jit.h8
-rw-r--r--ext/opcache/jit/zend_jit_disasm_x86.c2
-rw-r--r--ext/opcache/jit/zend_jit_helpers.c174
-rw-r--r--ext/opcache/jit/zend_jit_internal.h6
-rw-r--r--ext/opcache/jit/zend_jit_trace.c78
-rw-r--r--ext/opcache/jit/zend_jit_vm_helpers.c2
-rw-r--r--ext/opcache/jit/zend_jit_x86.dasc349
-rw-r--r--ext/opcache/jit/zend_jit_x86.h2
-rw-r--r--ext/opcache/opcache.stub.php2
-rw-r--r--ext/opcache/opcache_arginfo.h2
-rw-r--r--ext/opcache/shared_alloc_mmap.c22
-rw-r--r--ext/opcache/shared_alloc_win32.c10
-rw-r--r--ext/opcache/tests/bug65915.phpt6
-rw-r--r--ext/opcache/tests/bug76337.phpt2
-rw-r--r--ext/opcache/tests/bug78014.phpt14
-rw-r--r--ext/opcache/tests/bug78961.phpt17
-rw-r--r--ext/opcache/tests/internal_func_info_static_method.phpt2
-rw-r--r--ext/opcache/tests/jit/bug80426.phpt2
-rw-r--r--ext/opcache/tests/jit/count_001.phpt68
-rw-r--r--ext/opcache/tests/opt/dce_009.phpt71
-rw-r--r--ext/opcache/tests/opt/sccp_024.phpt2
-rw-r--r--ext/opcache/tests/opt/sccp_033.phpt27
-rw-r--r--ext/opcache/tests/opt/verify_return_type.phpt116
-rw-r--r--ext/opcache/tests/preload_004.phpt11
-rw-r--r--ext/opcache/tests/preload_009.phpt12
-rw-r--r--ext/opcache/tests/preload_012.phpt15
-rw-r--r--ext/opcache/tests/preload_ind.phpt3
-rw-r--r--ext/opcache/tests/preload_loadable_classes_2.phpt16
-rw-r--r--ext/opcache/tests/preload_loadable_classes_3.phpt12
-rw-r--r--ext/opcache/tests/preload_method_static_vars.phpt2
-rw-r--r--ext/opcache/tests/preload_unresolved_prop_type.phpt9
-rw-r--r--ext/opcache/tests/zzz_basic_logging.phpt6
-rw-r--r--ext/opcache/zend_accelerator_blacklist.c12
-rw-r--r--ext/opcache/zend_accelerator_blacklist.h2
-rw-r--r--ext/opcache/zend_accelerator_debug.c24
-rw-r--r--ext/opcache/zend_accelerator_debug.h1
-rw-r--r--ext/opcache/zend_accelerator_hash.c66
-rw-r--r--ext/opcache/zend_accelerator_hash.h25
-rw-r--r--ext/opcache/zend_accelerator_module.c59
-rw-r--r--ext/opcache/zend_accelerator_util_funcs.c605
-rw-r--r--ext/opcache/zend_file_cache.c191
-rw-r--r--ext/opcache/zend_persist.c393
-rw-r--r--ext/opcache/zend_persist.h8
-rw-r--r--ext/opcache/zend_persist_calc.c201
-rw-r--r--ext/opcache/zend_shared_alloc.c53
-rw-r--r--ext/opcache/zend_shared_alloc.h4
-rw-r--r--ext/openssl/config0.m42
-rw-r--r--ext/openssl/openssl.c102
-rw-r--r--ext/openssl/openssl.stub.php5
-rw-r--r--ext/openssl/openssl_arginfo.h35
-rw-r--r--ext/openssl/php_openssl.h4
-rw-r--r--ext/openssl/tests/openssl_decrypt_ccm.phpt2
-rw-r--r--ext/openssl/tests/openssl_decrypt_gcm.phpt2
-rw-r--r--ext/openssl/tests/openssl_decrypt_ocb.phpt2
-rw-r--r--ext/openssl/tests/openssl_encrypt_ccm.phpt2
-rw-r--r--ext/openssl/tests/openssl_encrypt_gcm.phpt2
-rw-r--r--ext/openssl/tests/openssl_encrypt_ocb.phpt2
-rw-r--r--ext/openssl/tests/openssl_x509_export_basic.phpt10
-rw-r--r--ext/openssl/xp_ssl.c28
-rw-r--r--ext/pcntl/pcntl.c10
-rw-r--r--ext/pcntl/pcntl.stub.php2
-rw-r--r--ext/pcntl/pcntl_arginfo.h2
-rw-r--r--ext/pcntl/php_pcntl.h2
-rw-r--r--ext/pcntl/tests/002.phpt1
-rw-r--r--ext/pcntl/tests/pcntl_unshare_01.phpt1
-rw-r--r--ext/pcntl/tests/pcntl_unshare_02.phpt1
-rw-r--r--ext/pcntl/tests/pcntl_unshare_03.phpt1
-rw-r--r--ext/pcre/php_pcre.c18
-rw-r--r--ext/pcre/php_pcre.h4
-rw-r--r--ext/pcre/php_pcre.stub.php2
-rw-r--r--ext/pcre/php_pcre_arginfo.h2
-rw-r--r--ext/pdo/pdo.c51
-rw-r--r--ext/pdo/pdo.stub.php4
-rw-r--r--ext/pdo/pdo_arginfo.h18
-rw-r--r--ext/pdo/pdo_dbh.c289
-rw-r--r--ext/pdo/pdo_dbh.stub.php2
-rw-r--r--ext/pdo/pdo_dbh_arginfo.h12
-rw-r--r--ext/pdo/pdo_sql_parser.re130
-rw-r--r--ext/pdo/pdo_sqlstate.c4
-rw-r--r--ext/pdo/pdo_stmt.c391
-rw-r--r--ext/pdo/pdo_stmt.stub.php5
-rw-r--r--ext/pdo/pdo_stmt_arginfo.h36
-rw-r--r--ext/pdo/php_pdo_driver.h127
-rw-r--r--ext/pdo/php_pdo_int.h6
-rw-r--r--ext/pdo/tests/bug_44159.phpt4
-rw-r--r--ext/pdo/tests/bug_69356.phpt45
-rw-r--r--ext/pdo/tests/bug_73234.phpt11
-rw-r--r--ext/pdo/tests/debug_emulated_prepares.phpt6
-rw-r--r--ext/pdo/tests/pdo_005.phpt12
-rw-r--r--ext/pdo/tests/pdo_018.phpt24
-rw-r--r--ext/pdo/tests/pdo_023.phpt4
-rw-r--r--ext/pdo/tests/pdo_036.phpt4
-rw-r--r--ext/pdo_dblib/config.m442
-rw-r--r--ext/pdo_dblib/dblib_driver.c121
-rw-r--r--ext/pdo_dblib/dblib_stmt.c71
-rw-r--r--ext/pdo_dblib/pdo_dblib.c2
-rw-r--r--ext/pdo_dblib/php_pdo_dblib_int.h2
-rw-r--r--ext/pdo_dblib/tests/README.md11
-rw-r--r--ext/pdo_dblib/tests/bug_45876.phpt2
-rw-r--r--ext/pdo_dblib/tests/pdo_dblib_param_str_natl.phpt2
-rw-r--r--ext/pdo_dblib/tests/pdo_dblib_quote.phpt4
-rw-r--r--ext/pdo_dblib/tests/timeout.phpt7
-rw-r--r--ext/pdo_dblib/tests/types.phpt3
-rw-r--r--ext/pdo_firebird/firebird_driver.c141
-rw-r--r--ext/pdo_firebird/firebird_statement.c169
-rw-r--r--ext/pdo_firebird/pdo_firebird.c9
-rw-r--r--ext/pdo_firebird/php_pdo_firebird_int.h6
-rw-r--r--ext/pdo_firebird/tests/CONFLICTS1
-rw-r--r--ext/pdo_firebird/tests/bug_72583.phpt3
-rw-r--r--ext/pdo_firebird/tests/bug_72931.phpt3
-rw-r--r--ext/pdo_firebird/tests/bug_73087.phpt3
-rw-r--r--ext/pdo_firebird/tests/bug_74462.phpt3
-rw-r--r--ext/pdo_mysql/config.w325
-rw-r--r--ext/pdo_mysql/mysql_driver.c189
-rw-r--r--ext/pdo_mysql/mysql_statement.c101
-rw-r--r--ext/pdo_mysql/pdo_mysql.c3
-rw-r--r--ext/pdo_mysql/php_pdo_mysql_int.h17
-rw-r--r--ext/pdo_mysql/tests/bug44327.phpt3
-rw-r--r--ext/pdo_mysql/tests/bug63185.phpt6
-rw-r--r--ext/pdo_mysql/tests/bug70389.phpt4
-rw-r--r--ext/pdo_mysql/tests/bug71145.phpt1
-rw-r--r--ext/pdo_mysql/tests/bug75177.phpt23
-rw-r--r--ext/pdo_mysql/tests/bug76815.phpt7
-rw-r--r--ext/pdo_mysql/tests/bug80458.phpt13
-rw-r--r--ext/pdo_mysql/tests/bug80808.phpt27
-rw-r--r--ext/pdo_mysql/tests/bug_33689.phpt5
-rw-r--r--ext/pdo_mysql/tests/bug_41125.phpt1
-rw-r--r--ext/pdo_mysql/tests/bug_41997.phpt7
-rw-r--r--ext/pdo_mysql/tests/bug_61411.phpt5
-rw-r--r--ext/pdo_mysql/tests/change_column_count.phpt3
-rw-r--r--ext/pdo_mysql/tests/foo/bar/bar.data3
-rw-r--r--ext/pdo_mysql/tests/foo/foo.data3
-rw-r--r--ext/pdo_mysql/tests/native_types.phpt50
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt5
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt15
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_attr_case.phpt1
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_attr_errmode.phpt2
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt1
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_attr_max_buffer_size.phpt8
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_attr_multi_statements.phpt2
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt10
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt1
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_begintransaction.phpt2
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_class_constants.phpt25
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_closecursor_error.phpt1
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_local_infile_default_off.phpt5
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_local_infile_directory_allowed.phpt85
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_local_infile_directory_denied.phpt76
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_local_infile_overrides_local_infile_directory.phpt85
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt2
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt1
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt1
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_prepare_native_dup_named_placeholder.phpt1
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_prepare_native_placeholder_everywhere.phpt15
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_stmt_blobs.phpt10
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt1
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_stmt_getcolumnmeta.phpt27
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt6
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_subclass.phpt1
-rw-r--r--ext/pdo_mysql/tests/skipifinfilenotallowed.inc6
-rw-r--r--ext/pdo_oci/oci_driver.c158
-rw-r--r--ext/pdo_oci/oci_statement.c45
-rw-r--r--ext/pdo_oci/pdo_oci.c4
-rw-r--r--ext/pdo_odbc/odbc_driver.c78
-rw-r--r--ext/pdo_odbc/odbc_stmt.c103
-rw-r--r--ext/pdo_pgsql/pdo_pgsql.c3
-rw-r--r--ext/pdo_pgsql/pgsql_driver.c105
-rw-r--r--ext/pdo_pgsql/pgsql_statement.c180
-rw-r--r--ext/pdo_pgsql/php_pdo_pgsql_int.h13
-rw-r--r--ext/pdo_pgsql/tests/bug62498.phpt36
-rw-r--r--ext/pdo_pgsql/tests/bug62593.phpt1
-rw-r--r--ext/pdo_pgsql/tests/bug71885.phpt4
-rw-r--r--ext/pdo_pgsql/tests/bug71885_2.phpt8
-rw-r--r--ext/pdo_pgsql/tests/bug75402.phpt2
-rw-r--r--ext/pdo_pgsql/tests/debug_emulated_prepares.phpt6
-rw-r--r--ext/pdo_sqlite/sqlite_driver.c110
-rw-r--r--ext/pdo_sqlite/sqlite_statement.c47
-rw-r--r--ext/pdo_sqlite/tests/bug38334.phpt46
-rw-r--r--ext/pdo_sqlite/tests/bug44327_2.phpt8
-rw-r--r--ext/pdo_sqlite/tests/bug44327_3.phpt4
-rw-r--r--ext/pdo_sqlite/tests/bug78192.phpt4
-rw-r--r--ext/pdo_sqlite/tests/bug79664.phpt4
-rw-r--r--ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt16
-rw-r--r--ext/pdo_sqlite/tests/bug_63916-2.phpt2
-rw-r--r--ext/pdo_sqlite/tests/bug_63916.phpt2
-rw-r--r--ext/pdo_sqlite/tests/debugdumpparams_001.phpt6
-rw-r--r--ext/pdo_sqlite/tests/gc.phpt24
-rw-r--r--ext/pdo_sqlite/tests/open_basedir.phpt31
-rw-r--r--ext/pdo_sqlite/tests/pdo_sqlite_filename_uri.phpt37
-rw-r--r--ext/pgsql/pgsql.c122
-rw-r--r--ext/pgsql/pgsql.stub.php2
-rw-r--r--ext/pgsql/pgsql_arginfo.h2
-rw-r--r--ext/pgsql/php_pgsql.h2
-rw-r--r--ext/pgsql/tests/skipif.inc5
-rw-r--r--ext/phar/dirstream.c2
-rw-r--r--ext/phar/func_interceptors.c8
-rw-r--r--ext/phar/phar.c65
-rw-r--r--ext/phar/phar/pharcommand.inc2
-rw-r--r--ext/phar/phar_internal.h18
-rw-r--r--ext/phar/phar_object.c56
-rw-r--r--ext/phar/phar_object.stub.php7
-rw-r--r--ext/phar/phar_object_arginfo.h44
-rw-r--r--ext/phar/stream.c2
-rw-r--r--ext/phar/tar.c6
-rw-r--r--ext/phar/tests/bug60164.phpt2
-rw-r--r--ext/phar/tests/bug77022.phpt6
-rw-r--r--ext/phar/tests/bug79082.phpt8
-rw-r--r--ext/phar/tests/files/phar_test.inc2
-rw-r--r--ext/phar/util.c6
-rw-r--r--ext/phar/zip.c6
-rw-r--r--ext/posix/posix.c14
-rw-r--r--ext/posix/posix.stub.php2
-rw-r--r--ext/posix/posix_arginfo.h2
-rw-r--r--ext/posix/tests/posix_getgrgid_error.phpt3
-rw-r--r--ext/posix/tests/posix_getpwuid_error.phpt3
-rw-r--r--ext/posix/tests/posix_getrlimit_basic.phpt20
-rw-r--r--ext/posix/tests/posix_initgroups.phpt2
-rw-r--r--ext/posix/tests/posix_mknod.phpt2
-rw-r--r--ext/posix/tests/posix_mknod_basic.phpt18
-rw-r--r--ext/pspell/pspell.c304
-rw-r--r--ext/pspell/pspell.stub.php65
-rw-r--r--ext/pspell/pspell_arginfo.h64
-rw-r--r--ext/pspell/tests/003.phpt2
-rw-r--r--ext/pspell/tests/004.phpt3
-rw-r--r--ext/readline/readline.c2
-rw-r--r--ext/readline/readline.stub.php2
-rw-r--r--ext/readline/readline_arginfo.h2
-rw-r--r--ext/readline/readline_cli.c2
-rw-r--r--ext/readline/tests/libedit_info_001.phpt1
-rw-r--r--ext/readline/tests/libedit_write_history_001-win32.phpt1
-rw-r--r--ext/readline/tests/libedit_write_history_001.phpt5
-rw-r--r--ext/readline/tests/readline_add_history_001.phpt2
-rw-r--r--ext/readline/tests/readline_info_001.phpt1
-rw-r--r--ext/readline/tests/readline_read_history_001.phpt5
-rw-r--r--ext/readline/tests/readline_write_history_001.phpt5
-rw-r--r--ext/reflection/php_reflection.c485
-rw-r--r--ext/reflection/php_reflection.h3
-rw-r--r--ext/reflection/php_reflection.stub.php57
-rw-r--r--ext/reflection/php_reflection_arginfo.h382
-rw-r--r--ext/reflection/tests/ReflectionClassConstant_isEnumCase.phpt23
-rw-r--r--ext/reflection/tests/ReflectionClass_constructor_002.phpt4
-rw-r--r--ext/reflection/tests/ReflectionClass_getConstant_error.phpt2
-rw-r--r--ext/reflection/tests/ReflectionClass_getMethod_002.phpt4
-rw-r--r--ext/reflection/tests/ReflectionClass_getProperty_002.phpt4
-rw-r--r--ext/reflection/tests/ReflectionClass_getStaticPropertyValue_002.phpt4
-rw-r--r--ext/reflection/tests/ReflectionClass_hasConstant_002.phpt2
-rw-r--r--ext/reflection/tests/ReflectionClass_hasMethod_002.phpt2
-rw-r--r--ext/reflection/tests/ReflectionClass_hasProperty_002.phpt2
-rw-r--r--ext/reflection/tests/ReflectionClass_implementsInterface_001.phpt4
-rw-r--r--ext/reflection/tests/ReflectionClass_isEnum.phpt20
-rw-r--r--ext/reflection/tests/ReflectionClass_isSubclassOf_002.phpt4
-rw-r--r--ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt4
-rw-r--r--ext/reflection/tests/ReflectionClass_toString_001.phpt11
-rw-r--r--ext/reflection/tests/ReflectionEnumBackedCase_getBackingValue.phpt38
-rw-r--r--ext/reflection/tests/ReflectionEnumUnitCase_construct.phpt36
-rw-r--r--ext/reflection/tests/ReflectionEnumUnitCase_getEnum.phpt39
-rw-r--r--ext/reflection/tests/ReflectionEnumUnitCase_getValue.phpt30
-rw-r--r--ext/reflection/tests/ReflectionEnum_construct.phpt34
-rw-r--r--ext/reflection/tests/ReflectionEnum_getBackingType.phpt20
-rw-r--r--ext/reflection/tests/ReflectionEnum_getCase.phpt50
-rw-r--r--ext/reflection/tests/ReflectionEnum_getCases.phpt54
-rw-r--r--ext/reflection/tests/ReflectionEnum_hasCase.phpt20
-rw-r--r--ext/reflection/tests/ReflectionEnum_isBacked.phpt20
-rw-r--r--ext/reflection/tests/ReflectionEnum_toString.phpt39
-rw-r--r--ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt10
-rw-r--r--ext/reflection/tests/ReflectionExtension_getClasses_basic.phpt17
-rw-r--r--ext/reflection/tests/ReflectionObject_isSubclassOf.002.phpt4
-rw-r--r--ext/reflection/tests/ReflectionProperty_setValue_readonly.phpt23
-rw-r--r--ext/reflection/tests/bug36337.phpt4
-rw-r--r--ext/session/mod_user.c2
-rw-r--r--ext/session/php_session.h32
-rw-r--r--ext/session/session.c43
-rw-r--r--ext/session/session.stub.php2
-rw-r--r--ext/session/session_arginfo.h43
-rw-r--r--ext/session/tests/003.phpt2
-rw-r--r--ext/session/tests/004.phpt10
-rw-r--r--ext/session/tests/005.phpt14
-rw-r--r--ext/session/tests/006.phpt2
-rw-r--r--ext/session/tests/009.phpt4
-rw-r--r--ext/session/tests/012.phpt2
-rw-r--r--ext/session/tests/013.phpt4
-rw-r--r--ext/session/tests/014.phpt2
-rw-r--r--ext/session/tests/015.phpt4
-rw-r--r--ext/session/tests/018.phpt4
-rw-r--r--ext/session/tests/019.phpt2
-rw-r--r--ext/session/tests/020.phpt4
-rw-r--r--ext/session/tests/021.phpt10
-rw-r--r--ext/session/tests/023.phpt2
-rw-r--r--ext/session/tests/024.phpt10
-rw-r--r--ext/session/tests/025.phpt14
-rw-r--r--ext/session/tests/026.phpt2
-rw-r--r--ext/session/tests/027.phpt4
-rw-r--r--ext/session/tests/CONFLICTS1
-rw-r--r--ext/session/tests/bug41600.phpt4
-rw-r--r--ext/session/tests/bug42596.phpt2
-rw-r--r--ext/session/tests/bug69111.phpt2
-rw-r--r--ext/session/tests/rfc1867.phpt8
-rw-r--r--ext/session/tests/rfc1867_cleanup.phpt8
-rw-r--r--ext/session/tests/rfc1867_disabled.phpt8
-rw-r--r--ext/session/tests/rfc1867_disabled_2.phpt8
-rw-r--r--ext/session/tests/rfc1867_inter.phpt8
-rw-r--r--ext/session/tests/rfc1867_no_name.phpt8
-rw-r--r--ext/session/tests/rfc1867_sid_cookie.phpt8
-rw-r--r--ext/session/tests/rfc1867_sid_get.phpt6
-rw-r--r--ext/session/tests/rfc1867_sid_get_2.phpt8
-rw-r--r--ext/session/tests/rfc1867_sid_only_cookie.phpt8
-rw-r--r--ext/session/tests/rfc1867_sid_only_cookie_2.phpt4
-rw-r--r--ext/session/tests/rfc1867_sid_post.phpt4
-rw-r--r--ext/session/tests/session_basic1.phpt12
-rw-r--r--ext/session/tests/session_basic2.phpt4
-rw-r--r--ext/session/tests/session_basic3.phpt72
-rw-r--r--ext/session/tests/session_basic5.phpt188
-rw-r--r--ext/session/tests/session_commit_variation4.phpt14
-rw-r--r--ext/session/tests/session_decode_variation3.phpt2
-rw-r--r--ext/session/tests/session_module_name_variation4.phpt3
-rw-r--r--ext/session/tests/session_save_path_variation4.phpt4
-rw-r--r--ext/session/tests/session_save_path_variation5.phpt4
-rw-r--r--ext/session/tests/session_set_save_handler_basic.phpt4
-rw-r--r--ext/session/tests/session_set_save_handler_class_012.phpt2
-rw-r--r--ext/session/tests/session_set_save_handler_variation2.phpt4
-rw-r--r--ext/session/tests/session_set_save_handler_variation3.phpt6
-rw-r--r--ext/session/tests/session_set_save_handler_variation4.phpt6
-rw-r--r--ext/session/tests/session_set_save_handler_variation5.phpt4
-rw-r--r--ext/session/tests/session_set_save_handler_variation6.phpt4
-rw-r--r--ext/shmop/shmop.c5
-rw-r--r--ext/shmop/shmop.stub.php3
-rw-r--r--ext/shmop/shmop_arginfo.h13
-rw-r--r--ext/shmop/tests/002.phpt4
-rw-r--r--ext/simplexml/simplexml.c38
-rw-r--r--ext/simplexml/simplexml.stub.php2
-rw-r--r--ext/simplexml/simplexml_arginfo.h23
-rw-r--r--ext/skeleton/skeleton.stub.php2
-rw-r--r--ext/skeleton/skeleton_arginfo.h2
-rw-r--r--ext/snmp/snmp.c21
-rw-r--r--ext/snmp/snmp.stub.php2
-rw-r--r--ext/snmp/snmp_arginfo.h22
-rw-r--r--ext/soap/php_encoding.c4
-rw-r--r--ext/soap/php_http.c16
-rw-r--r--ext/soap/php_http.h6
-rw-r--r--ext/soap/php_sdl.c9
-rw-r--r--ext/soap/php_sdl.h2
-rw-r--r--ext/soap/php_soap.h2
-rw-r--r--ext/soap/php_xml.c6
-rw-r--r--ext/soap/soap.c65
-rw-r--r--ext/soap/soap.stub.php2
-rw-r--r--ext/soap/soap_arginfo.h62
-rw-r--r--ext/soap/tests/bug73037.phpt2
-rw-r--r--ext/soap/tests/classmap003.phpt2
-rw-r--r--ext/soap/tests/custom_content_type.phpt2
-rw-r--r--ext/sockets/multicast.c12
-rw-r--r--ext/sockets/sockets.c38
-rw-r--r--ext/sockets/sockets.stub.php4
-rw-r--r--ext/sockets/sockets_arginfo.h24
-rw-r--r--ext/sockets/tests/socket_create_pair-wrongparams-win32.phpt4
-rw-r--r--ext/sockets/tests/socket_create_pair-wrongparams.phpt4
-rw-r--r--ext/sodium/config.m43
-rw-r--r--ext/sodium/libsodium.c5
-rw-r--r--ext/sodium/libsodium.stub.php2
-rw-r--r--ext/sodium/libsodium_arginfo.h12
-rw-r--r--ext/sodium/sodium_pwhash.c4
-rw-r--r--ext/sodium/tests/bug78114.phpt6
-rw-r--r--ext/sodium/tests/bug78516.phpt3
-rw-r--r--ext/sodium/tests/crypto_aead.phpt3
-rw-r--r--ext/sodium/tests/crypto_auth.phpt4
-rw-r--r--ext/sodium/tests/crypto_box.phpt4
-rw-r--r--ext/sodium/tests/crypto_generichash.phpt4
-rw-r--r--ext/sodium/tests/crypto_hex.phpt4
-rw-r--r--ext/sodium/tests/crypto_kdf.phpt4
-rw-r--r--ext/sodium/tests/crypto_kx.phpt4
-rw-r--r--ext/sodium/tests/crypto_scalarmult.phpt4
-rw-r--r--ext/sodium/tests/crypto_secretbox.phpt4
-rw-r--r--ext/sodium/tests/crypto_secretstream.phpt3
-rw-r--r--ext/sodium/tests/crypto_shorthash.phpt4
-rw-r--r--ext/sodium/tests/crypto_sign.phpt4
-rw-r--r--ext/sodium/tests/crypto_stream.phpt4
-rw-r--r--ext/sodium/tests/exception_trace_without_args.phpt4
-rw-r--r--ext/sodium/tests/inc_add.phpt4
-rw-r--r--ext/sodium/tests/installed.phpt4
-rw-r--r--ext/sodium/tests/pwhash_argon2i.phpt4
-rw-r--r--ext/sodium/tests/pwhash_scrypt.phpt4
-rw-r--r--ext/sodium/tests/sodium_error_001.phpt4
-rw-r--r--ext/sodium/tests/utils.phpt9
-rw-r--r--ext/sodium/tests/version.phpt4
-rw-r--r--ext/spl/php_spl.c70
-rw-r--r--ext/spl/php_spl.h2
-rw-r--r--ext/spl/php_spl.stub.php2
-rw-r--r--ext/spl/php_spl_arginfo.h2
-rw-r--r--ext/spl/spl_array.c370
-rw-r--r--ext/spl/spl_array.stub.php2
-rw-r--r--ext/spl/spl_array_arginfo.h35
-rw-r--r--ext/spl/spl_directory.c449
-rw-r--r--ext/spl/spl_directory.h15
-rw-r--r--ext/spl/spl_directory.stub.php4
-rw-r--r--ext/spl/spl_directory_arginfo.h77
-rw-r--r--ext/spl/spl_dllist.c28
-rw-r--r--ext/spl/spl_dllist.stub.php2
-rw-r--r--ext/spl/spl_dllist_arginfo.h33
-rw-r--r--ext/spl/spl_exceptions.c27
-rw-r--r--ext/spl/spl_exceptions.stub.php55
-rw-r--r--ext/spl/spl_exceptions_arginfo.h199
-rw-r--r--ext/spl/spl_fixedarray.c103
-rw-r--r--ext/spl/spl_fixedarray.stub.php2
-rw-r--r--ext/spl/spl_fixedarray_arginfo.h13
-rw-r--r--ext/spl/spl_functions.c49
-rw-r--r--ext/spl/spl_functions.h27
-rw-r--r--ext/spl/spl_heap.c28
-rw-r--r--ext/spl/spl_heap.stub.php2
-rw-r--r--ext/spl/spl_heap_arginfo.h45
-rw-r--r--ext/spl/spl_iterators.c123
-rw-r--r--ext/spl/spl_iterators.h44
-rw-r--r--ext/spl/spl_iterators.stub.php7
-rw-r--r--ext/spl/spl_iterators_arginfo.h221
-rw-r--r--ext/spl/spl_observer.c190
-rw-r--r--ext/spl/spl_observer.stub.php5
-rw-r--r--ext/spl/spl_observer_arginfo.h44
-rw-r--r--ext/spl/tests/ArrayObject_proptable_canonicalization.phpt33
-rw-r--r--ext/spl/tests/RecursiveDirectoryIterator_hasChildren.phpt35
-rw-r--r--ext/spl/tests/SplFixedArray__construct_param_null.phpt3
-rw-r--r--ext/spl/tests/SplFixedArray_setSize_param_null.phpt3
-rw-r--r--ext/spl/tests/SplObjectStorage_unserialize_invalid_parameter3.phpt4
-rw-r--r--ext/spl/tests/bug46051.phpt2
-rw-r--r--ext/spl/tests/bug61527.phpt4
-rw-r--r--ext/spl/tests/bug65387.phpt4
-rw-r--r--ext/spl/tests/bug75717.phpt2
-rw-r--r--ext/spl/tests/bug80724.phpt46
-rw-r--r--ext/spl/tests/filesystemiterator_flags.phpt4
-rw-r--r--ext/spl/tests/fixedarray_011.phpt14
-rw-r--r--ext/spl/tests/fixedarray_014.phpt2
-rw-r--r--ext/spl/tests/iterator_044.phpt8
-rw-r--r--ext/spl/tests/regexIterator_flags_basic.phpt2
-rw-r--r--ext/spl/tests/serialize_property_tables.phptbin0 -> 1021 bytes
-rw-r--r--ext/spl/tests/spl_autoload_001.phpt2
-rw-r--r--ext/spl/tests/spl_autoload_005.phpt2
-rw-r--r--ext/spl/tests/spl_autoload_007.phpt16
-rw-r--r--ext/spl/tests/spl_autoload_008.phpt4
-rw-r--r--ext/sqlite3/php_sqlite3_structs.h2
-rw-r--r--ext/sqlite3/sqlite3.c25
-rw-r--r--ext/sqlite3/sqlite3.stub.php7
-rw-r--r--ext/sqlite3/sqlite3_arginfo.h32
-rw-r--r--ext/sqlite3/tests/sqlite3_busyTimeout.phpt2
-rw-r--r--ext/standard/array.c321
-rw-r--r--ext/standard/assert.c19
-rw-r--r--ext/standard/base64.c30
-rw-r--r--ext/standard/base64.h2
-rwxr-xr-xext/standard/basic_functions.c211
-rw-r--r--ext/standard/basic_functions.h18
-rwxr-xr-xext/standard/basic_functions.stub.php24
-rw-r--r--ext/standard/basic_functions_arginfo.h54
-rw-r--r--ext/standard/browscap.c19
-rw-r--r--ext/standard/config.m431
-rw-r--r--ext/standard/crypt.c2
-rw-r--r--ext/standard/crypt_sha256.c2
-rw-r--r--ext/standard/crypt_sha512.c2
-rw-r--r--ext/standard/dir.c14
-rwxr-xr-xext/standard/dir.stub.php2
-rw-r--r--ext/standard/dir_arginfo.h12
-rw-r--r--ext/standard/dns.c2
-rw-r--r--ext/standard/dns_win32.c2
-rw-r--r--ext/standard/file.c32
-rw-r--r--ext/standard/file.h2
-rw-r--r--ext/standard/filestat.c108
-rw-r--r--ext/standard/fsock.c2
-rw-r--r--ext/standard/ftp_fopen_wrapper.c2
-rw-r--r--ext/standard/head.c6
-rw-r--r--ext/standard/hrtime.c15
-rw-r--r--ext/standard/html.c16
-rw-r--r--ext/standard/html.h2
-rw-r--r--ext/standard/http.c2
-rw-r--r--ext/standard/http_fopen_wrapper.c8
-rw-r--r--ext/standard/image.c15
-rw-r--r--ext/standard/incomplete_class.c11
-rw-r--r--ext/standard/info.c8
-rw-r--r--ext/standard/iptc.c2
-rw-r--r--ext/standard/mail.c6
-rw-r--r--ext/standard/md5.c6
-rw-r--r--ext/standard/md5.h3
-rw-r--r--ext/standard/microtime.c2
-rw-r--r--ext/standard/mt_rand.c14
-rw-r--r--ext/standard/pack.c2
-rw-r--r--ext/standard/password.c18
-rw-r--r--ext/standard/php_array.h2
-rw-r--r--ext/standard/php_assert.h2
-rw-r--r--ext/standard/php_crypt.h2
-rw-r--r--ext/standard/php_filestat.h4
-rw-r--r--ext/standard/php_http.h1
-rw-r--r--ext/standard/php_incomplete_class.h4
-rw-r--r--ext/standard/php_password.h6
-rw-r--r--ext/standard/php_random.h4
-rw-r--r--ext/standard/php_string.h4
-rw-r--r--ext/standard/proc_open.c2
-rw-r--r--ext/standard/random.c4
-rw-r--r--ext/standard/sha1.c6
-rw-r--r--ext/standard/sha1.h3
-rw-r--r--ext/standard/streamsfuncs.c25
-rw-r--r--ext/standard/string.c242
-rw-r--r--ext/standard/strnatcmp.c23
-rw-r--r--ext/standard/tests/array/005.phpt342
-rw-r--r--ext/standard/tests/array/006.phpt2
-rw-r--r--ext/standard/tests/array/009.phpt2
-rw-r--r--ext/standard/tests/array/array_change_key_case_variation3.phpt48
-rw-r--r--ext/standard/tests/array/array_chunk_variation5.phpt4
-rw-r--r--ext/standard/tests/array/array_combine_variation4.phpt30
-rw-r--r--ext/standard/tests/array/array_combine_variation5.phpt4
-rw-r--r--ext/standard/tests/array/array_diff_assoc_variation4.phpt29
-rw-r--r--ext/standard/tests/array/array_diff_assoc_variation5.phpt2
-rw-r--r--ext/standard/tests/array/array_diff_key_variation5.phpt27
-rw-r--r--ext/standard/tests/array/array_diff_uassoc_variation10.phpt39
-rw-r--r--ext/standard/tests/array/array_diff_uassoc_variation5.phpt2
-rw-r--r--ext/standard/tests/array/array_diff_uassoc_variation6.phpt2
-rw-r--r--ext/standard/tests/array/array_diff_ukey_variation7.phpt35
-rw-r--r--ext/standard/tests/array/array_diff_variation8.phpt4
-rw-r--r--ext/standard/tests/array/array_fill.phpt218
-rw-r--r--ext/standard/tests/array/array_fill_object.phpt32
-rw-r--r--ext/standard/tests/array/array_filter_object.phpt8
-rw-r--r--ext/standard/tests/array/array_filter_variation3.phpt2
-rw-r--r--ext/standard/tests/array/array_filter_variation9.phpt10
-rw-r--r--ext/standard/tests/array/array_flip_variation5.phpt2
-rw-r--r--ext/standard/tests/array/array_intersect_assoc_variation5.phpt36
-rw-r--r--ext/standard/tests/array/array_intersect_assoc_variation6.phpt36
-rw-r--r--ext/standard/tests/array/array_intersect_assoc_variation7.phpt6
-rw-r--r--ext/standard/tests/array/array_intersect_assoc_variation8.phpt6
-rw-r--r--ext/standard/tests/array/array_intersect_key_variation5.phpt34
-rw-r--r--ext/standard/tests/array/array_intersect_uassoc_variation5.phpt2
-rw-r--r--ext/standard/tests/array/array_intersect_uassoc_variation6.phpt2
-rw-r--r--ext/standard/tests/array/array_intersect_ukey_variation5.phpt2
-rw-r--r--ext/standard/tests/array/array_intersect_ukey_variation6.phpt2
-rw-r--r--ext/standard/tests/array/array_intersect_variation5.phpt32
-rw-r--r--ext/standard/tests/array/array_intersect_variation6.phpt32
-rw-r--r--ext/standard/tests/array/array_intersect_variation7.phpt4
-rw-r--r--ext/standard/tests/array/array_intersect_variation8.phpt4
-rw-r--r--ext/standard/tests/array/array_key_exists.phpt11
-rw-r--r--ext/standard/tests/array/array_key_exists_variation1.phpt40
-rw-r--r--ext/standard/tests/array/array_key_exists_variation8.phpt172
-rw-r--r--ext/standard/tests/array/array_key_first.phpt313
-rw-r--r--ext/standard/tests/array/array_key_last.phpt313
-rw-r--r--ext/standard/tests/array/array_keys_basic.phpt2
-rw-r--r--ext/standard/tests/array/array_keys_variation_001.phpt2
-rw-r--r--ext/standard/tests/array/array_map_object1.phpt10
-rw-r--r--ext/standard/tests/array/array_map_object2.phpt4
-rw-r--r--ext/standard/tests/array/array_map_object3.phpt4
-rw-r--r--ext/standard/tests/array/array_map_variation12.phpt2
-rw-r--r--ext/standard/tests/array/array_map_variation14.phpt4
-rw-r--r--ext/standard/tests/array/array_map_variation15.phpt2
-rw-r--r--ext/standard/tests/array/array_map_variation16.phpt16
-rw-r--r--ext/standard/tests/array/array_map_variation17.phpt40
-rw-r--r--ext/standard/tests/array/array_map_variation4.phpt28
-rw-r--r--ext/standard/tests/array/array_map_variation5.phpt4
-rw-r--r--ext/standard/tests/array/array_merge.phpt1049
-rw-r--r--ext/standard/tests/array/array_merge_recursive_variation4.phpt90
-rw-r--r--ext/standard/tests/array/array_merge_recursive_variation5.phpt4
-rw-r--r--ext/standard/tests/array/array_merge_variation4.phpt78
-rw-r--r--ext/standard/tests/array/array_merge_variation7.phpt2
-rw-r--r--ext/standard/tests/array/array_pop.phpt299
-rw-r--r--ext/standard/tests/array/array_pop_variation.phpt6
-rw-r--r--ext/standard/tests/array/array_push.phpt303
-rw-r--r--ext/standard/tests/array/array_push_variation6.phpt38
-rw-r--r--ext/standard/tests/array/array_rand_variation4.phpt3
-rw-r--r--ext/standard/tests/array/array_rand_variation5.phpt3
-rw-r--r--ext/standard/tests/array/array_reverse_variation4.phpt62
-rw-r--r--ext/standard/tests/array/array_reverse_variation5.phpt4
-rw-r--r--ext/standard/tests/array/array_search_variation1.phpt2
-rw-r--r--ext/standard/tests/array/array_search_variation2.phpt2
-rw-r--r--ext/standard/tests/array/array_shift_variation3.phpt46
-rw-r--r--ext/standard/tests/array/array_slice.phpt4
-rw-r--r--ext/standard/tests/array/array_slice_variation7.phpt66
-rw-r--r--ext/standard/tests/array/array_udiff_assoc_variation.phpt2
-rw-r--r--ext/standard/tests/array/array_uintersect_assoc_basic2.phpt2
-rw-r--r--ext/standard/tests/array/array_unique_variation3.phpt24
-rw-r--r--ext/standard/tests/array/array_unique_variation4.phpt28
-rw-r--r--ext/standard/tests/array/array_unshift_object.phpt8
-rw-r--r--ext/standard/tests/array/array_unshift_variation4.phpt64
-rw-r--r--ext/standard/tests/array/array_unshift_variation5.phpt4
-rw-r--r--ext/standard/tests/array/array_values_variation3.phpt48
-rw-r--r--ext/standard/tests/array/arsort_variation11.phptbin3111 -> 3092 bytes
-rw-r--r--ext/standard/tests/array/asort_variation11.phptbin3101 -> 3082 bytes
-rw-r--r--ext/standard/tests/array/bug24766.phpt14
-rw-r--r--ext/standard/tests/array/bug25708.phpt40
-rw-r--r--ext/standard/tests/array/bug26458.phptbin409 -> 389 bytes
-rw-r--r--ext/standard/tests/array/bug29253.phpt8
-rw-r--r--ext/standard/tests/array/bug31158.phpt9
-rw-r--r--ext/standard/tests/array/bug65251.phpt4
-rw-r--r--ext/standard/tests/array/bug72369.phpt2
-rw-r--r--ext/standard/tests/array/count_invalid_mode.phpt4
-rw-r--r--ext/standard/tests/array/count_recursive.phpt6
-rw-r--r--ext/standard/tests/array/end_64bit.phpt2
-rw-r--r--ext/standard/tests/array/extract_safety.phpt12
-rw-r--r--ext/standard/tests/array/extract_variation1.phpt12
-rw-r--r--ext/standard/tests/array/extract_variation4.phpt4
-rw-r--r--ext/standard/tests/array/extract_variation5.phpt2
-rw-r--r--ext/standard/tests/array/extract_variation7.phpt4
-rw-r--r--ext/standard/tests/array/in_array_variation1.phpt2
-rw-r--r--ext/standard/tests/array/in_array_variation2.phpt2
-rw-r--r--ext/standard/tests/array/key_variation2.phpt39
-rw-r--r--ext/standard/tests/array/krsort_variation3.phpt55
-rw-r--r--ext/standard/tests/array/krsort_variation8.phptbin3121 -> 3102 bytes
-rw-r--r--ext/standard/tests/array/ksort_variation3.phpt53
-rw-r--r--ext/standard/tests/array/ksort_variation8.phptbin3107 -> 3088 bytes
-rw-r--r--ext/standard/tests/array/natcasesort_variation11.phpt50
-rw-r--r--ext/standard/tests/array/range_errors.phpt4
-rw-r--r--ext/standard/tests/array/shuffle_variation4.phpt2
-rw-r--r--ext/standard/tests/array/uasort_object2.phpt16
-rw-r--r--ext/standard/tests/array/usort_object2.phpt16
-rw-r--r--ext/standard/tests/class_object/get_object_vars_basic_001.phpt4
-rw-r--r--ext/standard/tests/class_object/get_object_vars_basic_002.phpt4
-rw-r--r--ext/standard/tests/file/005_variation2-win32.phpt11
-rw-r--r--ext/standard/tests/file/005_variation2.phpt11
-rw-r--r--ext/standard/tests/file/basename-win32.phpt42
-rw-r--r--ext/standard/tests/file/basename.phptbin6786 -> 6453 bytes
-rw-r--r--ext/standard/tests/file/basename_basic-win32.phpt2
-rw-r--r--ext/standard/tests/file/basename_basic.phpt2
-rw-r--r--ext/standard/tests/file/bug51094.phpt10
-rw-r--r--ext/standard/tests/file/bug61961.phpt2
-rw-r--r--ext/standard/tests/file/chgrp.phpt2
-rw-r--r--ext/standard/tests/file/chown.phpt2
-rw-r--r--ext/standard/tests/file/fgetcsv_error_conditions.phpt18
-rw-r--r--ext/standard/tests/file/file_exists_variation1.phpt2
-rw-r--r--ext/standard/tests/file/file_get_contents_error_folder-win.phpt12
-rw-r--r--ext/standard/tests/file/file_get_contents_error_folder.phpt12
-rw-r--r--ext/standard/tests/file/file_get_contents_variation8-win32.phpt4
-rw-r--r--ext/standard/tests/file/file_get_contents_variation8.phpt11
-rw-r--r--ext/standard/tests/file/file_put_contents_variation5.phpt2
-rw-r--r--ext/standard/tests/file/file_put_contents_variation8-win32.phpt4
-rw-r--r--ext/standard/tests/file/file_put_contents_variation8.phpt11
-rw-r--r--ext/standard/tests/file/filegroup_variation2.phpt2
-rw-r--r--ext/standard/tests/file/fileinode_variation2.phpt2
-rw-r--r--ext/standard/tests/file/fileowner_variation2.phpt2
-rw-r--r--ext/standard/tests/file/fileperms_variation2.phpt2
-rw-r--r--ext/standard/tests/file/filesize_variation5.phpt2
-rw-r--r--ext/standard/tests/file/flock_basic.phpt4
-rw-r--r--ext/standard/tests/file/flock_error.phpt7
-rw-r--r--ext/standard/tests/file/flock_variation.phpt2
-rw-r--r--ext/standard/tests/file/fnmatch_basic.phpt2
-rw-r--r--ext/standard/tests/file/fnmatch_variation.phpt28
-rw-r--r--ext/standard/tests/file/fputcsv_variation2.phpt724
-rw-r--r--ext/standard/tests/file/fputcsv_variation3.phpt724
-rw-r--r--ext/standard/tests/file/fputcsv_variation4.phpt724
-rw-r--r--ext/standard/tests/file/fscanf_error.phpt8
-rw-r--r--ext/standard/tests/file/glob_variation3.phpt2
-rw-r--r--ext/standard/tests/file/is_dir_variation3.phpt2
-rw-r--r--ext/standard/tests/file/is_executable_variation3.phpt4
-rw-r--r--ext/standard/tests/file/is_readable_variation3.phpt7
-rw-r--r--ext/standard/tests/file/is_writable_variation3.phpt6
-rw-r--r--ext/standard/tests/file/lstat_stat_variation22.phpt4
-rw-r--r--ext/standard/tests/file/pathinfo_variaton.phpt65
-rw-r--r--ext/standard/tests/file/php_fd_wrapper_04.phpt5
-rw-r--r--ext/standard/tests/file/readfile_error.phpt6
-rw-r--r--ext/standard/tests/file/readfile_variation10-win32.phpt4
-rw-r--r--ext/standard/tests/file/readfile_variation10.phptbin1509 -> 1451 bytes
-rw-r--r--ext/standard/tests/file/readlink_realpath_variation3.phpt12
-rw-r--r--ext/standard/tests/file/readlink_variation1.phpt4
-rw-r--r--ext/standard/tests/file/realpath_bug77484.phpt4
-rw-r--r--ext/standard/tests/file/realpath_variation-win32-mb.phpt6
-rw-r--r--ext/standard/tests/file/realpath_variation-win32.phpt6
-rw-r--r--ext/standard/tests/file/rename_variation13-win32.phpt16
-rw-r--r--ext/standard/tests/file/rename_variation13.phpt8
-rw-r--r--ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt12
-rw-r--r--ext/standard/tests/file/symlink_link_linkinfo_is_link_error2.phpt10
-rw-r--r--ext/standard/tests/file/tempnam_variation3-win32.phpt12
-rw-r--r--ext/standard/tests/file/tempnam_variation3.phpt11
-rw-r--r--ext/standard/tests/file/tempnam_variation7-win32.phpt13
-rw-r--r--ext/standard/tests/file/tempnam_variation7.phpt13
-rw-r--r--ext/standard/tests/file/unlink_error-win32-mb.phpt7
-rw-r--r--ext/standard/tests/file/unlink_error-win32.phpt7
-rw-r--r--ext/standard/tests/file/unlink_error.phpt7
-rw-r--r--ext/standard/tests/file/windows_mb_path/test_long_path_bug71103.phpt2
-rw-r--r--ext/standard/tests/general_functions/array_is_list.phpt98
-rw-r--r--ext/standard/tests/general_functions/call_user_func_return.phpt14
-rw-r--r--ext/standard/tests/general_functions/debug_zval_dump_b.phptbin4300 -> 4250 bytes
-rw-r--r--ext/standard/tests/general_functions/debug_zval_dump_b_64bit.phptbin4393 -> 4343 bytes
-rw-r--r--ext/standard/tests/general_functions/debug_zval_dump_o.phpt44
-rw-r--r--ext/standard/tests/general_functions/debug_zval_dump_refs.phpt46
-rw-r--r--ext/standard/tests/general_functions/debug_zval_dump_v.phpt8
-rw-r--r--ext/standard/tests/general_functions/escapeshellarg_variation1-win32.phpt30
-rw-r--r--ext/standard/tests/general_functions/escapeshellarg_variation1.phpt31
-rw-r--r--ext/standard/tests/general_functions/get_cfg_var_variation3.phpt42
-rw-r--r--ext/standard/tests/general_functions/getservbyname_variation10.phpt36
-rw-r--r--ext/standard/tests/general_functions/getservbyname_variation3.phpt36
-rw-r--r--ext/standard/tests/general_functions/getservbyport_variation1.phpt11
-rw-r--r--ext/standard/tests/general_functions/http_response_code.phpt9
-rw-r--r--ext/standard/tests/general_functions/ini_set_types.phpt34
-rw-r--r--ext/standard/tests/general_functions/proc_nice_basic.phpt2
-rw-r--r--ext/standard/tests/general_functions/uniqid_basic.phpt10
-rw-r--r--ext/standard/tests/image/image_type_to_extension.phpt2
-rw-r--r--ext/standard/tests/math/abs.phpt25
-rw-r--r--ext/standard/tests/math/abs_basic.phpt4
-rw-r--r--ext/standard/tests/math/abs_variation.phpt10
-rw-r--r--ext/standard/tests/math/acos_variation.phpt2
-rw-r--r--ext/standard/tests/math/acosh_variation.phpt2
-rw-r--r--ext/standard/tests/math/asin_variation.phpt2
-rw-r--r--ext/standard/tests/math/asinh_variation.phpt2
-rw-r--r--ext/standard/tests/math/atan2_basic.phpt25
-rw-r--r--ext/standard/tests/math/atan_variation.phpt2
-rw-r--r--ext/standard/tests/math/atanh_variation.phpt2
-rw-r--r--ext/standard/tests/math/base_convert_variation1.phpt38
-rw-r--r--ext/standard/tests/math/base_convert_variation2.phpt32
-rw-r--r--ext/standard/tests/math/base_convert_variation3.phpt18
-rw-r--r--ext/standard/tests/math/bindec_basic.phpt3
-rw-r--r--ext/standard/tests/math/bindec_basic_64bit.phpt3
-rw-r--r--ext/standard/tests/math/bindec_variation1.phpt37
-rw-r--r--ext/standard/tests/math/bindec_variation1_64bit.phpt37
-rw-r--r--ext/standard/tests/math/bindec_variation2.phpt14
-rw-r--r--ext/standard/tests/math/ceil_basic.phpt4
-rw-r--r--ext/standard/tests/math/ceil_variation1.phpt10
-rw-r--r--ext/standard/tests/math/cos_variation.phpt2
-rw-r--r--ext/standard/tests/math/cosh_variation.phpt2
-rw-r--r--ext/standard/tests/math/decbin_basic.phpt2
-rw-r--r--ext/standard/tests/math/decbin_variation1.phpt37
-rw-r--r--ext/standard/tests/math/decbin_variation1_64bit.phpt37
-rw-r--r--ext/standard/tests/math/dechex_basic.phpt2
-rw-r--r--ext/standard/tests/math/dechex_variation1.phpt37
-rw-r--r--ext/standard/tests/math/dechex_variation1_64bit.phpt37
-rw-r--r--ext/standard/tests/math/decoct_basic.phpt2
-rw-r--r--ext/standard/tests/math/decoct_variation1.phpt38
-rw-r--r--ext/standard/tests/math/decoct_variation1_64bit.phpt38
-rw-r--r--ext/standard/tests/math/deg2rad_variation.phpt2
-rw-r--r--ext/standard/tests/math/exp_basic.phpt4
-rw-r--r--ext/standard/tests/math/expm1_basic.phpt4
-rw-r--r--ext/standard/tests/math/floor_basic.phpt4
-rw-r--r--ext/standard/tests/math/floor_variation1.phpt10
-rw-r--r--ext/standard/tests/math/fmod_basic.phpt29
-rw-r--r--ext/standard/tests/math/hexdec_basic.phpt3
-rw-r--r--ext/standard/tests/math/hexdec_basic_64bit.phpt5
-rw-r--r--ext/standard/tests/math/hexdec_variation1.phpt37
-rw-r--r--ext/standard/tests/math/hexdec_variation1_64bit.phpt37
-rw-r--r--ext/standard/tests/math/hexdec_variation2.phpt14
-rw-r--r--ext/standard/tests/math/hypot_basic.phpt48
-rw-r--r--ext/standard/tests/math/is_finite_basic.phpt2
-rw-r--r--ext/standard/tests/math/is_infinite_basic.phpt2
-rw-r--r--ext/standard/tests/math/is_nan_basic.phpt2
-rw-r--r--ext/standard/tests/math/log10_variation.phpt2
-rw-r--r--ext/standard/tests/math/log1p_basic.phpt4
-rw-r--r--ext/standard/tests/math/log_basic.phpt3
-rw-r--r--ext/standard/tests/math/mt_rand_basic.phpt2
-rw-r--r--ext/standard/tests/math/mt_srand_basic.phpt2
-rw-r--r--ext/standard/tests/math/number_format_basic.phpt7
-rw-r--r--ext/standard/tests/math/number_format_multichar.phpt6
-rw-r--r--ext/standard/tests/math/octdec_basic.phpt3
-rw-r--r--ext/standard/tests/math/octdec_basic_64bit.phpt3
-rw-r--r--ext/standard/tests/math/octdec_variation1.phpt37
-rw-r--r--ext/standard/tests/math/octdec_variation2.phpt16
-rw-r--r--ext/standard/tests/math/pow-operator.phpt21
-rw-r--r--ext/standard/tests/math/pow.phpt397
-rw-r--r--ext/standard/tests/math/rad2deg_variation.phpt2
-rw-r--r--ext/standard/tests/math/rand_basic.phpt2
-rw-r--r--ext/standard/tests/math/round.phpt68
-rw-r--r--ext/standard/tests/math/round_basic.phpt10
-rw-r--r--ext/standard/tests/math/round_variation1.phpt10
-rw-r--r--ext/standard/tests/math/sin_variation.phpt2
-rw-r--r--ext/standard/tests/math/sinh_variation.phpt2
-rw-r--r--ext/standard/tests/math/sqrt_variation.phpt2
-rw-r--r--ext/standard/tests/math/srand_basic.phpt2
-rw-r--r--ext/standard/tests/math/tan_variation.phpt2
-rw-r--r--ext/standard/tests/math/tanh_variation.phpt2
-rw-r--r--ext/standard/tests/password/password_verify.phpt4
-rw-r--r--ext/standard/tests/serialize/SplObjectStorage_object_reference.phpt33
-rw-r--r--ext/standard/tests/serialize/__serialize_005.phpt4
-rw-r--r--ext/standard/tests/serialize/bug76300.phpt2
-rw-r--r--ext/standard/tests/serialize/incomplete_class_magic.phpt32
-rw-r--r--ext/standard/tests/serialize/serialization_objects_002.phptbin7153 -> 7073 bytes
-rw-r--r--ext/standard/tests/serialize/serialization_objects_011.phpt64
-rw-r--r--ext/standard/tests/serialize/unserialize_overwrite_undeclared_protected.phpt21
-rw-r--r--ext/standard/tests/serialize/unserialize_ref_to_overwritten_declared_prop.phpt12
-rw-r--r--ext/standard/tests/streams/bug64433.phpt2
-rw-r--r--ext/standard/tests/strings/addcslashes_001.phptbin1643 -> 1566 bytes
-rw-r--r--ext/standard/tests/strings/addcslashes_003.phptbin1312 -> 1158 bytes
-rw-r--r--ext/standard/tests/strings/basename_variation.phpt70
-rw-r--r--ext/standard/tests/strings/bug21338.phpt4
-rw-r--r--ext/standard/tests/strings/bug51899.phpt3
-rw-r--r--ext/standard/tests/strings/bug53021.phpt2
-rw-r--r--ext/standard/tests/strings/bug61116.phpt4
-rw-r--r--ext/standard/tests/strings/chop_variation5.phpt2
-rw-r--r--ext/standard/tests/strings/chr_variation1.phpt22
-rw-r--r--ext/standard/tests/strings/dirname_variation.phpt8
-rw-r--r--ext/standard/tests/strings/html_entity_decode3.phpt2
-rw-r--r--ext/standard/tests/strings/htmlentities24.phpt6
-rw-r--r--ext/standard/tests/strings/htmlspecialchars.phpt6
-rw-r--r--ext/standard/tests/strings/htmlspecialchars_basic.phpt2
-rw-r--r--ext/standard/tests/strings/htmlspecialchars_decode_basic.phpt4
-rw-r--r--ext/standard/tests/strings/htmlspecialchars_decode_variation3.phpt8
-rw-r--r--ext/standard/tests/strings/htmlspecialchars_decode_variation4.phpt8
-rw-r--r--ext/standard/tests/strings/htmlspecialchars_decode_variation5.phpt10
-rw-r--r--ext/standard/tests/strings/implode1.phptbin6048 -> 6067 bytes
-rw-r--r--ext/standard/tests/strings/join_basic.phpt4
-rw-r--r--ext/standard/tests/strings/join_variation1.phpt22
-rw-r--r--ext/standard/tests/strings/join_variation4.phptbin2107 -> 1981 bytes
-rw-r--r--ext/standard/tests/strings/lcfirst.phptbin5452 -> 5411 bytes
-rw-r--r--ext/standard/tests/strings/ltrim.phpt12
-rw-r--r--ext/standard/tests/strings/md5_file.phptbin2468 -> 2318 bytes
-rw-r--r--ext/standard/tests/strings/nl2br.phpt2
-rw-r--r--ext/standard/tests/strings/number_format_basic.phpt5
-rw-r--r--ext/standard/tests/strings/printf.phpt7
-rw-r--r--ext/standard/tests/strings/printf_64bit.phpt7
-rw-r--r--ext/standard/tests/strings/printf_variation1.phpt311
-rw-r--r--ext/standard/tests/strings/quoted_printable_encode_001.phpt2
-rw-r--r--ext/standard/tests/strings/rtrim.phptbin2106 -> 1974 bytes
-rw-r--r--ext/standard/tests/strings/sha1_file.phpt2
-rw-r--r--ext/standard/tests/strings/sprintf_variation1.phpt46
-rw-r--r--ext/standard/tests/strings/str_getcsv_001.phpt7
-rw-r--r--ext/standard/tests/strings/str_pad.phpt42
-rw-r--r--ext/standard/tests/strings/str_repeat.phptbin2810 -> 2638 bytes
-rw-r--r--ext/standard/tests/strings/str_replace_variation1.phpt2
-rw-r--r--ext/standard/tests/strings/str_replace_variation2.phptbin12707 -> 12378 bytes
-rw-r--r--ext/standard/tests/strings/str_word_count.phpt8
-rw-r--r--ext/standard/tests/strings/strcasecmp.phptbin20649 -> 18630 bytes
-rw-r--r--ext/standard/tests/strings/strcmp.phptbin18464 -> 17602 bytes
-rw-r--r--ext/standard/tests/strings/stripos_variation1.phpt82
-rw-r--r--ext/standard/tests/strings/stripos_variation10.phpt173
-rw-r--r--ext/standard/tests/strings/stripos_variation11.phpt174
-rw-r--r--ext/standard/tests/strings/stripos_variation2.phpt76
-rw-r--r--ext/standard/tests/strings/stripos_variation7.phpt32
-rw-r--r--ext/standard/tests/strings/stristr_variation2.phpt24
-rw-r--r--ext/standard/tests/strings/strlen.phptbin6102 -> 6053 bytes
-rw-r--r--ext/standard/tests/strings/strpos.phptbin7629 -> 7799 bytes
-rw-r--r--ext/standard/tests/strings/strrchr_variation1.phptbin4193 -> 4019 bytes
-rw-r--r--ext/standard/tests/strings/strrchr_variation10.phpt185
-rw-r--r--ext/standard/tests/strings/strrchr_variation11.phpt144
-rw-r--r--ext/standard/tests/strings/strrchr_variation12.phptbin949 -> 955 bytes
-rw-r--r--ext/standard/tests/strings/strrchr_variation2.phpt60
-rw-r--r--ext/standard/tests/strings/strrchr_variation8.phpt36
-rw-r--r--ext/standard/tests/strings/strrev.phpt16
-rw-r--r--ext/standard/tests/strings/strripos_variation1.phpt48
-rw-r--r--ext/standard/tests/strings/strripos_variation2.phpt50
-rw-r--r--ext/standard/tests/strings/strrpos_variation1.phpt177
-rw-r--r--ext/standard/tests/strings/strrpos_variation10.phpt147
-rw-r--r--ext/standard/tests/strings/strrpos_variation11.phpt175
-rw-r--r--ext/standard/tests/strings/strrpos_variation2.phpt52
-rw-r--r--ext/standard/tests/strings/strrpos_variation7.phpt2
-rw-r--r--ext/standard/tests/strings/strstr.phptbin9344 -> 9563 bytes
-rw-r--r--ext/standard/tests/strings/strtolower-win32.phptbin4305 -> 4265 bytes
-rw-r--r--ext/standard/tests/strings/strtolower.phptbin3268 -> 3228 bytes
-rw-r--r--ext/standard/tests/strings/strtoupper1-win32.phptbin4313 -> 4273 bytes
-rw-r--r--ext/standard/tests/strings/strtoupper1.phptbin3275 -> 3235 bytes
-rw-r--r--ext/standard/tests/strings/strtr_variation4.phpt8
-rw-r--r--ext/standard/tests/strings/strtr_variation6.phpt20
-rw-r--r--ext/standard/tests/strings/strtr_variation8.phpt22
-rw-r--r--ext/standard/tests/strings/substr.phptbin4071 -> 3814 bytes
-rw-r--r--ext/standard/tests/strings/substr_count_variation_001.phpt8
-rw-r--r--ext/standard/tests/strings/trim.phpt49
-rw-r--r--ext/standard/tests/strings/trim1.phptbin1390 -> 1254 bytes
-rw-r--r--ext/standard/tests/strings/ucfirst.phptbin4690 -> 4651 bytes
-rw-r--r--ext/standard/tests/strings/vprintf_variation1.phpt200
-rw-r--r--ext/standard/tests/strings/wordwrap.phpt70
-rw-r--r--ext/standard/tests/url/get_headers_error_003.phpt2
-rw-r--r--ext/standard/tests/versioning/version_compare_op_abbrev.phpt21
-rw-r--r--ext/standard/type.c17
-rw-r--r--ext/standard/uniqid.c12
-rw-r--r--ext/standard/url.c10
-rw-r--r--ext/standard/url.h2
-rw-r--r--ext/standard/url_scanner_ex.re6
-rw-r--r--ext/standard/user_filters.c12
-rwxr-xr-xext/standard/user_filters.stub.php7
-rw-r--r--ext/standard/user_filters_arginfo.h24
-rw-r--r--ext/standard/var.c361
-rw-r--r--ext/standard/var_unserializer.re458
-rw-r--r--ext/standard/versioning.c19
-rw-r--r--ext/sysvmsg/sysvmsg.c9
-rw-r--r--ext/sysvmsg/sysvmsg.stub.php3
-rw-r--r--ext/sysvmsg/sysvmsg_arginfo.h13
-rw-r--r--ext/sysvsem/sysvsem.c9
-rw-r--r--ext/sysvsem/sysvsem.stub.php3
-rw-r--r--ext/sysvsem/sysvsem_arginfo.h13
-rw-r--r--ext/sysvshm/sysvshm.c7
-rw-r--r--ext/sysvshm/sysvshm.stub.php3
-rw-r--r--ext/sysvshm/sysvshm_arginfo.h13
-rw-r--r--ext/tidy/php_tidy.h2
-rw-r--r--ext/tidy/tidy.c62
-rw-r--r--ext/tidy/tidy.stub.php2
-rw-r--r--ext/tidy/tidy_arginfo.h23
-rw-r--r--ext/tokenizer/Makefile.frag5
-rw-r--r--ext/tokenizer/tokenizer.c46
-rw-r--r--ext/tokenizer/tokenizer.stub.php7
-rw-r--r--ext/tokenizer/tokenizer_arginfo.h37
-rw-r--r--ext/tokenizer/tokenizer_data.c4
-rw-r--r--ext/tokenizer/tokenizer_data_gen.php93
-rwxr-xr-xext/tokenizer/tokenizer_data_gen.sh78
-rw-r--r--ext/xml/xml.c11
-rw-r--r--ext/xml/xml.stub.php3
-rw-r--r--ext/xml/xml_arginfo.h13
-rw-r--r--ext/xmlreader/php_xmlreader.c25
-rw-r--r--ext/xmlreader/php_xmlreader.stub.php30
-rw-r--r--ext/xmlreader/php_xmlreader_arginfo.h96
-rw-r--r--ext/xmlreader/tests/015-get-errors.phpt3
-rw-r--r--ext/xmlreader/tests/015-move-errors.phpt3
-rw-r--r--ext/xmlwriter/php_xmlwriter.c15
-rw-r--r--ext/xmlwriter/php_xmlwriter.stub.php2
-rw-r--r--ext/xmlwriter/php_xmlwriter_arginfo.h12
-rw-r--r--ext/xmlwriter/tests/bug39504.phpt2
-rw-r--r--ext/xsl/php_xsl.c7
-rw-r--r--ext/xsl/php_xsl.stub.php2
-rw-r--r--ext/xsl/php_xsl_arginfo.h12
-rw-r--r--ext/xsl/xsltprocessor.c2
-rw-r--r--ext/zend_test/config.m42
-rw-r--r--ext/zend_test/config.w322
-rw-r--r--ext/zend_test/test.c92
-rw-r--r--ext/zend_test/test.stub.php19
-rw-r--r--ext/zend_test/test_arginfo.h139
-rw-r--r--ext/zend_test/tests/observer_backtrace_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_basic_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_basic_02.phpt2
-rw-r--r--ext/zend_test/tests/observer_basic_03.phpt2
-rw-r--r--ext/zend_test/tests/observer_basic_04.phpt2
-rw-r--r--ext/zend_test/tests/observer_basic_05.phpt2
-rw-r--r--ext/zend_test/tests/observer_call_user_func_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_call_user_func_02.phpt2
-rw-r--r--ext/zend_test/tests/observer_call_user_func_03.phpt2
-rw-r--r--ext/zend_test/tests/observer_call_user_func_04.phpt2
-rw-r--r--ext/zend_test/tests/observer_closure_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_closure_02.phpt2
-rw-r--r--ext/zend_test/tests/observer_error_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_error_02.phpt2
-rw-r--r--ext/zend_test/tests/observer_error_03.phpt2
-rw-r--r--ext/zend_test/tests/observer_error_04.phpt2
-rw-r--r--ext/zend_test/tests/observer_error_05.phpt2
-rw-r--r--ext/zend_test/tests/observer_eval_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_exception_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_generator_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_generator_02.phpt2
-rw-r--r--ext/zend_test/tests/observer_generator_03.phpt2
-rw-r--r--ext/zend_test/tests/observer_generator_04.phpt2
-rw-r--r--ext/zend_test/tests/observer_generator_05.phpt2
-rw-r--r--ext/zend_test/tests/observer_magic_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_opline_01.phpt3
-rw-r--r--ext/zend_test/tests/observer_retval_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_retval_02.phpt2
-rw-r--r--ext/zend_test/tests/observer_retval_03.phpt2
-rw-r--r--ext/zend_test/tests/observer_retval_04.phpt2
-rw-r--r--ext/zend_test/tests/observer_retval_05.phpt2
-rw-r--r--ext/zend_test/tests/observer_retval_06.phpt2
-rw-r--r--ext/zend_test/tests/observer_retval_07.phpt2
-rw-r--r--ext/zend_test/tests/observer_retval_by_ref_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_retval_by_ref_02.phpt2
-rw-r--r--ext/zend_test/tests/observer_retval_by_ref_03.phpt2
-rw-r--r--ext/zend_test/tests/observer_shutdown_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_shutdown_02.phpt2
-rw-r--r--ext/zend_test/tests/observer_types_01.phpt2
-rw-r--r--ext/zend_test/tests/observer_zend_call_function_01.phpt2
-rw-r--r--ext/zip/php_zip.c23
-rw-r--r--ext/zip/php_zip.stub.php22
-rw-r--r--ext/zip/php_zip_arginfo.h49
-rw-r--r--ext/zip/tests/bug38943.phpt18
-rw-r--r--ext/zip/tests/bug38943_2.phpt18
-rw-r--r--ext/zlib/php_zlib.h2
-rw-r--r--ext/zlib/tests/gzfile_variation3.phpt41
-rw-r--r--ext/zlib/tests/readgzfile_variation3.phpt41
-rw-r--r--ext/zlib/zlib.c12
-rw-r--r--ext/zlib/zlib.stub.php4
-rw-r--r--ext/zlib/zlib_arginfo.h24
-rw-r--r--ext/zlib/zlib_filter.c2
-rw-r--r--main/SAPI.c2
-rw-r--r--main/SAPI.h10
-rw-r--r--main/fopen_wrappers.c52
-rw-r--r--main/main.c171
-rw-r--r--main/output.c26
-rw-r--r--main/php.h2
-rw-r--r--main/php_globals.h54
-rw-r--r--main/php_ini.c17
-rw-r--r--main/php_main.h2
-rw-r--r--main/php_memory_streams.h8
-rw-r--r--main/php_network.h7
-rw-r--r--main/php_output.h3
-rw-r--r--main/php_streams.h6
-rw-r--r--main/php_variables.c22
-rw-r--r--main/php_version.h8
-rw-r--r--main/reentrancy.c1
-rw-r--r--main/rfc1867.c12
-rw-r--r--main/spprintf.c2
-rw-r--r--main/streams/memory.c109
-rw-r--r--main/streams/plain_wrapper.c16
-rw-r--r--main/streams/streams.c47
-rw-r--r--main/streams/userspace.c2
-rw-r--r--main/streams/xp_socket.c7
-rw-r--r--php.ini-development382
-rw-r--r--php.ini-production382
-rwxr-xr-xrun-tests.php1438
-rw-r--r--sapi/apache2handler/apache_config.c2
-rw-r--r--sapi/apache2handler/php_apache.h6
-rw-r--r--sapi/apache2handler/php_functions.c4
-rw-r--r--sapi/apache2handler/php_functions.stub.php2
-rw-r--r--sapi/apache2handler/php_functions_arginfo.h2
-rw-r--r--sapi/apache2handler/sapi_apache2.c2
-rw-r--r--sapi/cgi/cgi_main.c65
-rw-r--r--sapi/cgi/cgi_main.stub.php2
-rw-r--r--sapi/cgi/cgi_main_arginfo.h2
-rw-r--r--sapi/cli/php_cli.c78
-rw-r--r--sapi/cli/php_cli_server.c15
-rw-r--r--sapi/cli/tests/CONFLICTS1
-rw-r--r--sapi/cli/tests/bug61977.phpt31
-rw-r--r--sapi/cli/tests/bug67429_1.phpt2
-rw-r--r--sapi/cli/tests/bug67429_2.phpt2
-rw-r--r--sapi/cli/tests/bug68291.phpt9
-rw-r--r--sapi/cli/tests/bug69655.phpt6
-rw-r--r--sapi/cli/tests/php_cli_server.inc110
-rw-r--r--sapi/cli/tests/php_cli_server_002.phpt4
-rw-r--r--sapi/cli/tests/php_cli_server_012.phpt4
-rw-r--r--sapi/cli/tests/php_cli_server_015.phpt7
-rw-r--r--sapi/fpm/fpm/fpm_env.c13
-rw-r--r--sapi/fpm/fpm/fpm_main.c18
-rw-r--r--sapi/fpm/fpm/fpm_main.stub.php2
-rw-r--r--sapi/fpm/fpm/fpm_main_arginfo.h2
-rw-r--r--sapi/fpm/fpm/fpm_status.c109
-rw-r--r--sapi/fpm/fpm/fpm_stdio.c3
-rw-r--r--sapi/fpm/tests/status.inc66
-rw-r--r--sapi/fpm/tests/tester.inc2
-rw-r--r--sapi/fuzzer/fuzzer-sapi.c4
-rw-r--r--sapi/fuzzer/fuzzer-sapi.h2
-rw-r--r--sapi/fuzzer/generate_unserializehash_corpus.php8
-rw-r--r--sapi/litespeed/lsapi_main.c26
-rw-r--r--sapi/litespeed/lsapi_main.stub.php2
-rw-r--r--sapi/litespeed/lsapi_main_arginfo.h2
-rw-r--r--sapi/phpdbg/phpdbg.c36
-rw-r--r--sapi/phpdbg/phpdbg.h10
-rw-r--r--sapi/phpdbg/phpdbg.stub.php2
-rw-r--r--sapi/phpdbg/phpdbg_arginfo.h2
-rw-r--r--sapi/phpdbg/phpdbg_bp.c6
-rw-r--r--sapi/phpdbg/phpdbg_bp.h6
-rw-r--r--sapi/phpdbg/phpdbg_btree.c4
-rw-r--r--sapi/phpdbg/phpdbg_btree.h2
-rw-r--r--sapi/phpdbg/phpdbg_cmd.c8
-rw-r--r--sapi/phpdbg/phpdbg_cmd.h6
-rw-r--r--sapi/phpdbg/phpdbg_frame.c2
-rw-r--r--sapi/phpdbg/phpdbg_help.c2
-rw-r--r--sapi/phpdbg/phpdbg_info.c6
-rw-r--r--sapi/phpdbg/phpdbg_list.c17
-rw-r--r--sapi/phpdbg/phpdbg_list.h3
-rw-r--r--sapi/phpdbg/phpdbg_opcode.c4
-rw-r--r--sapi/phpdbg/phpdbg_opcode.h4
-rw-r--r--sapi/phpdbg/phpdbg_out.c12
-rw-r--r--sapi/phpdbg/phpdbg_out.h2
-rw-r--r--sapi/phpdbg/phpdbg_parser.y1
-rw-r--r--sapi/phpdbg/phpdbg_print.c9
-rw-r--r--sapi/phpdbg/phpdbg_prompt.c30
-rw-r--r--sapi/phpdbg/phpdbg_prompt.h6
-rw-r--r--sapi/phpdbg/phpdbg_sigsafe.c2
-rw-r--r--sapi/phpdbg/phpdbg_sigsafe.h4
-rw-r--r--sapi/phpdbg/phpdbg_utils.c10
-rw-r--r--sapi/phpdbg/phpdbg_utils.h6
-rw-r--r--sapi/phpdbg/phpdbg_wait.c8
-rw-r--r--sapi/phpdbg/phpdbg_watch.c8
-rw-r--r--sapi/phpdbg/tests/info_001.phpt3
-rw-r--r--tests/basic/bug67198.phpt2
-rw-r--r--tests/classes/clone_003.phpt4
-rw-r--r--tests/classes/clone_004.phpt24
-rw-r--r--tests/classes/constants_basic_004.phpt6
-rw-r--r--tests/classes/ctor_dtor_inheritance.phpt10
-rw-r--r--tests/classes/inheritance_006.phpt4
-rw-r--r--tests/classes/interface_member.phpt2
-rw-r--r--tests/classes/private_members.phpt14
-rw-r--r--tests/lang/bug24054.phpt14
-rw-r--r--tests/lang/foreachLoopObjects.002.phpt118
-rw-r--r--tests/lang/integer_literals/binary_32bit.phpt82
-rw-r--r--tests/lang/integer_literals/binary_64bit.phpt82
-rw-r--r--tests/lang/integer_literals/hexadecimal_32bit.phpt82
-rw-r--r--tests/lang/integer_literals/hexadecimal_64bit.phpt83
-rw-r--r--tests/lang/integer_literals/octal_32bit.phpt118
-rw-r--r--tests/lang/integer_literals/octal_64bit.phpt133
-rw-r--r--tests/quicktester.inc74
-rw-r--r--tests/run-test/bug75042-2.phpt10
-rw-r--r--tests/run-test/bug75042-3.phpt13
-rw-r--r--tests/run-test/extensions-shared.phpt (renamed from tests/run-test/bug75042.phpt)7
-rw-r--r--tests/run-test/extensions-static.phpt9
-rw-r--r--win32/build/config.w325
-rw-r--r--win32/build/confutils.js35
-rw-r--r--win32/readdir.c4
-rw-r--r--win32/signal.c6
2315 files changed, 132063 insertions, 40285 deletions
diff --git a/.gitignore b/.gitignore
index 1eab1d32ac..78dcc1f7ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,6 +41,9 @@
# Standard object files generated during build process
*.o
+# Dependency files generated during build process
+*.dep
+
# Cache directories created by Autoconf tools
autom4te.cache/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index df94bd50e5..2d7fbac84c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -327,7 +327,8 @@ Currently we have the following branches in use:
| Branch | |
| --------- | --------- |
-| master | Active development branch for PHP 8.0, which is open for backwards incompatible changes and major internal API changes. |
+| master | Active development branch for PHP 8.1, which is open for backwards incompatible changes and major internal API changes. |
+| PHP-8.0 | Is used to release the PHP 8.0.x series. This is a current stable version and is open for bugfixes only. |
| PHP-7.4 | Is used to release the PHP 7.4.x series. This is a current stable version and is open for bugfixes only. |
| PHP-7.3 | Is used to release the PHP 7.3.x series. This is a current stable version and is open for bugfixes only. |
| PHP-7.2 | Is used to release the PHP 7.2.x series. This is an old stable version and is open for security fixes only. |
diff --git a/NEWS b/NEWS
index 5fda640c33..173a00daea 100644
--- a/NEWS
+++ b/NEWS
@@ -1,676 +1,63 @@
PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-?? ??? 2021, PHP 8.0.5
-
-- DOM:
- . Fixed bug #66783 (UAF when appending DOMDocument to element). (cmb)
-
-- FFI:
- . Fixed bug #80847 (CData structs with fields of type struct can't be passed
- as C function argument). (Nickolas Daniel da Silva, Dmitry)
-
-- FPM:
- . Fixed bug #80024 (Duplication of info about inherited socket after pool
- removing). (Jakub Zelenka)
-
-- Opcache:
- . Fixed bug #80839 (PHP problem with JIT). (Dmitry)
- . Fixed bug #80861 (erronous array key overflow in 2D array with JIT).
- (Dmitry)
-
-- PDO_ODBC:
- . Fixed bug #80783 (PDO ODBC truncates BLOB records at every 256th byte).
- (cmb)
-
-- Session:
- . Fixed bug #80889 (Cannot set save handler when save_handler is invalid).
- (cmb)
-
-01 Apr 2021, PHP 8.0.4
-
-- Core:
- . Fixed bug #75776 (Flushing streams with compression filter is broken). (cmb)
- . Fixed bug #80811 (Function exec without $output but with $restult_code
- parameter crashes). (Nikita)
- . Fixed bug #80814 (threaded mod_php won't load on FreeBSD: No space
- available for static Thread Local Storage). (Dmitry)
-
-- Dba:
- . Fixed bug #80817 (dba_popen() may cause segfault during RSHUTDOWN). (cmb)
-
-- IMAP:
- . Fixed bug #80800 (imap_open() fails when the flags parameter includes
- CL_EXPUNGE). (girgias)
-
-- Intl:
- . Fixed bug #80763 (msgfmt_format() does not accept DateTime references).
- (cmb)
-
-- Libxml:
- . Fixed bug #51903 (simplexml_load_file() doesn't use HTTP headers). (cmb)
-
-- MySQLnd:
- . Fixed bug #80837 (Calling stmt_store_result after fetch doesn't throw an
- error). (Kamil Tekiela)
-
-- Opcache:
- . Fixed bug #80786 (PHP crash using JIT). (Nikita)
- . Fixed bug #80782 (DASM_S_RANGE_VREG on PHP_INT_MIN-1). (Dmitry)
-
-- PCRE:
- . Fixed bug #80866 (preg_split ignores limit flag when pattern with \K has
- 0-width fullstring match). (Kamil Tekiela)
-
-- Session:
- . Fixed bug #80774 (session_name() problem with backslash). (cmb)
-
-- Standard:
- . Fixed bug #80771 (phpinfo(INFO_CREDITS) displays nothing in CLI). (cmb)
- . Fixed bug #78719 (http wrapper silently ignores long Location headers).
- (cmb)
- . Fixed bug #80838 (HTTP wrapper waits for HTTP 1 response after HTTP 101).
- (manuelm)
-
-- Zip:
- . Fixed bug #80825 (ZipArchive::isCompressionMethodSupported does not exist).
- (cmb)
-
-18 Feb 2021, PHP 8.0.3
-
-- Core:
- . Fixed #80706 (mail(): Headers after Bcc headers may be ignored). (cmb)
-
-- DOM:
- . Fixed bug #80600 (DOMChildNode::remove() doesn't work on CharacterData
- nodes). (beberlei)
-
-- Gettext:
- . Fixed bug #53251 (bindtextdomain with null dir doesn't return old value).
- (cmb)
-
-- MySQLnd:
- . Fixed bug #78680 (mysqlnd's mysql_clear_password does not transmit
- null-terminated password). (Daniel Black)
- . Fixed bug #80713 (SegFault when disabling ATTR_EMULATE_PREPARES and
- MySQL 8.0). (Nikita)
-
-- MySQLi:
- . Fixed bug #74779 (x() and y() truncating floats to integers). (cmb)
-
-- Opcache:
- . Fixed bug #80634 (write_property handler of internal classes is skipped on
- preloaded JITted code). (Dmitry)
- . Fixed bug #80682 (opcache doesn't honour pcre.jit option). (Remi)
- . Fixed bug #80742 (Opcache JIT makes some boolean logic unexpectedly be
- true). (Dmitry)
- . Fixed bug #80745 (JIT produces Assert failure and UNKNOWN:0 var_dumps in
- code involving bitshifts). (Dmitry)
-
-- OpenSSL:
- . Fixed bug #80747 (Providing RSA key size < 512 generates key that crash
- PHP). (Nikita)
-
-- Phar:
- . Fixed bug #75850 (Unclear error message wrt. __halt_compiler() w/o
- semicolon) (cmb)
- . Fixed bug #70091 (Phar does not mark UTF-8 filenames in ZIP archives). (cmb)
- . Fixed bug #53467 (Phar cannot compress large archives). (cmb, lserni)
-
-- Socket:
- . Fixed bug #80723 (Different sockets compare as equal (regression in 8.0)).
- (Nikita)
-
-- SPL:
- . Fixed bug#80719 (Iterating after failed ArrayObject::setIteratorClass()
- causes Segmentation fault). (Nikita)
-
-- Standard:
- . Fixed bug #80654 (file_get_contents() maxlen fails above (2**31)-1 bytes).
- (cmb)
- . Fixed bug #80718 (ext/standard/dl.c fallback code path with syntax error).
- (Nikita)
-
-21 Jan 2021, PHP 8.0.2
-
-- Core:
- . Fixed bug #80523 (bogus parse error on >4GB source code). (Nikita)
- . Fixed bug #80384 (filter buffers entire read until file closed). (Adam
- Seitz, cmb)
- . Fixed bug #80596 (Invalid union type TypeError in anonymous classes).
- (Daniil Gentili)
- . Fixed bug #80617 (GCC throws warning about type narrowing in
- ZEND_TYPE_INIT_CODE). (Nikita)
-
-- BCMath:
- . Fixed bug #80545 (bcadd('a', 'a') doesn't throw an exception).
- (Jens de Nies)
-
-- Curl:
- . Fixed bug #80595 (Resetting POSTFIELDS to empty array breaks request). (cmb)
-
-- Date:
- . Fixed bug #80376 (last day of the month causes runway cpu usage). (Derick)
-
-- DOM:
- . Fixed bug #80537 (Wrong parameter type in DOMElement::removeAttributeNode
- stub). (Nikita)
-
-- Filter:
- . Fixed bug #80584 (0x and 0X are considered valid hex numbers by
- filter_var()). (girgias)
-
-- GMP:
- . Fixed bug #80560 (Strings containing only a base prefix return 0 object).
- (girgias)
-
-- Intl:
- . Fixed bug #80644 (Missing resource causes subsequent get() calls to fail).
- (Nikita)
-
-- MySQLi:
- . Fixed bug #67983 (mysqlnd with MYSQLI_OPT_INT_AND_FLOAT_NATIVE fails to
- interpret bit columns). (Nikita)
- . Fixed bug #64638 (Fetching resultsets from stored procedure with cursor
- fails). (Nikita)
- . Fixed bug #72862 (segfault using prepared statements on stored procedures
- that use a cursor). (Nikita)
- . Fixed bug #77935 (Crash in mysqlnd_fetch_stmt_row_cursor when calling an SP
- with a cursor). (Nikita)
-
-- ODBC:
- . Fixed bug #80592 (all floats are the same in ODBC parameters). (cmb)
-
-- Opcache:
- . Fixed bug #80422 (php_opcache.dll crashes when using Apache 2.4 with JIT).
- (Dmitry)
-
-- PDO_Firebird:
- . Fixed bug #80521 (Parameters with underscores no longer recognized). (cmb,
- Simonov Denis)
-
-- Phar:
- . Fixed bug #76929 (zip-based phar does not respect phar.require_hash).
- (david at bamsoftware, cmb)
- . Fixed bug #77565 (Incorrect locator detection in ZIP-based phars). (cmb)
- . Fixed bug #69279 (Compressed ZIP Phar extractTo() creates garbage files).
- (cmb)
-
-- Phpdbg:
- . Reverted fix for bug #76813 (Access violation near NULL on source operand).
- (cmb)
-
-07 Jan 2021, PHP 8.0.1
+?? ??? ????, PHP 8.1.0alpha1
- Core:
- . Fixed bug #80345 (PHPIZE configuration has outdated PHP_RELEASE_VERSION).
- (cmb)
- . Fixed bug #72964 (White space not unfolded for CC/Bcc headers). (cmb)
- . Fixed bug #80391 (Iterable not covariant to mixed). (Nikita)
- . Fixed bug #80393 (Build of PHP extension fails due to configuration gap
- with libtool). (kir dot morozov at gmail dot com)
- . Fixed bug #77069 (stream filter loses final block of data). (cmb)
-
-- Fileinfo:
- . Fixed bug #77961 (finfo_open crafted magic parsing SIGABRT). (cmb)
+ . Fixed inclusion order for phpize builds on Windows. (cmb)
+ . Added missing hashtable insertion APIs for arr/obj/ref. (Sara)
+ . Fixed bug #75474 (function scope static variables are not bound to a unique
+ function). (Nikita)
+ . Fixed bug #53826 (__callStatic fired in base class through a parent call if
+ the method is private). (Nikita)
- FPM:
- . Fixed bug #69625 (FPM returns 200 status on request without
- SCRIPT_FILENAME env). (Jakub Zelenka)
-
-- IMAP
- . Fixed bug #80438 (imap_msgno() incorrectly warns and return false on valid UIDs in PHP 8.0.0). (girgias)
- . Fix a regression with valid UIDs in imap_savebody() (girgias)
- . Make warnings for invalid message numbers/UIDs between functions consistent (girgias)
-
-- Intl:
- . Fixed bug #80425 (MessageFormatAdapter::getArgTypeList redefined). (Nikita)
-
-- OCI8
- . Create Windows DLLs for Oracle Client 19c. (cmb)
-
-- Opcache:
- . Fixed bug #80404 (Incorrect range inference result when division results
- in float). (Nikita)
- . Fixed bug #80377 (Opcache misses executor_globals). (Nikita)
- . Fixed bug #80433 (Unable to disable the use of the AVX command when using
- JIT). (Nikita)
- . Fixed bug #80447 (Strange out of memory error when running with JIT).
- (Dmitry)
- . Fixed bug #80480 (Segmentation fault with JIT enabled). (Dmitry)
- . Fixed bug #80506 (Immediate SIGSEGV upon ini_set("opcache.jit_debug", 1)).
- (Dmitry)
-
-- OpenSSL:
- . Fixed bug #80368 (OpenSSL extension fails to build against LibreSSL due to
- lack of OCB support). (Nikita)
-
-- PDO MySQL:
- . Fixed bug #80458 (PDOStatement::fetchAll() throws for upsert queries).
- (Kamil Tekiela)
- . Fixed bug #63185 (nextRowset() ignores MySQL errors with native prepared
- statements). (Nikita)
- . Fixed bug #78152 (PDO::exec() - Bad error handling with multiple commands).
- (Nikita)
- . Fixed bug #66878 (Multiple rowsets not returned unless PDO statement object
- is unset()). (Nikita)
- . Fixed bug #70066 (Unexpected "Cannot execute queries while other unbuffered
- queries"). (Nikita)
- . Fixed bug #71145 (Multiple statements in init command triggers unbuffered
- query error). (Nikita)
- . Fixed bug #76815 (PDOStatement cannot be GCed/closeCursor-ed when a
- PROCEDURE resultset SIGNAL). (Nikita)
- . Fixed bug #79872 (Can't execute query with pending result sets). (Nikita)
- . Fixed bug #79131 (PDO does not throw an exception when parameter values are
- missing). (Nikita)
- . Fixed bug #72368 (PdoStatement->execute() fails but does not throw an
- exception). (Nikita)
- . Fixed bug #62889 (LOAD DATA INFILE broken). (Nikita)
- . Fixed bug #67004 (Executing PDOStatement::fetch() more than once prevents
- releasing resultset). (Nikita)
- . Fixed bug #79132 (PDO re-uses parameter values from earlier calls to
- execute()). (Nikita)
-
-- Phar:
- . Fixed bug #73809 (Phar Zip parse crash - mmap fail). (cmb)
- . Fixed bug #75102 (`PharData` says invalid checksum for valid tar). (cmb)
- . Fixed bug #77322 (PharData::addEmptyDir('/') Possible integer overflow).
- (cmb)
-
-- Phpdbg:
- . Fixed bug #76813 (Access violation near NULL on source operand). (cmb)
-
-- SPL:
- . Fixed #62004 (SplFileObject: fgets after seek returns wrong line). (cmb)
-
-- Standard:
- . Fixed bug #77423 (FILTER_VALIDATE_URL accepts URLs with invalid userinfo).
- (CVE-2020-7071) (cmb)
- . Fixed bug #80366 (Return Value of zend_fstat() not Checked). (sagpant, cmb)
-
-- Tidy:
- . Fixed bug #77594 (ob_tidyhandler is never reset). (cmb)
-
-- Tokenizer:
- . Fixed bug #80462 (Nullsafe operator tokenize with TOKEN_PARSE flag fails).
- (Nikita)
-
-- XML:
- . XmlParser opaque object renamed to XMLParser for consistency with other XML objects. (girgias)
-
-- Zlib:
- . Fixed #48725 (Support for flushing in zlib stream). (cmb)
-
-26 Nov 2020, PHP 8.0.0
-
-- BZ2:
- . Fixed bug #71263 (fread() does not report bzip2.decompress errors). (cmb)
-
-- CLI:
- . Allow debug server binding to an ephemeral port via `-S localhost:0`. (Sara)
-
-- COM:
- . Fixed bug #55847 (DOTNET .NET 4.0 GAC new location). (cmb)
- . Fixed bug #62474 (com_event_sink crashes on certain arguments). (cmb)
-
-- Calendar:
- . Fixed bug #80007 (Potential type confusion in unixtojd() parameter parsing).
- (Andy Postnikov)
-
-- Core:
- . Fixed bug #36365 (scandir duplicates file name at every 65535th file).
- (cmb)
- . Fixed bug #49555 (Fatal error "Function must be a string" message should be
- renamed). (Nikita)
- . Fixed bug #62294 (register_shutdown_function() does not correctly handle
- exit code). (Nikita)
- . Fixed bug #62609 (Allow implementing Traversable on abstract classes).
- (Nikita)
- . Fixed bug #65274 (Enhance undefined class constant error with class name).
- (Nikita)
- . Fixed bug #65275 (Calling exit() in a shutdown function does not change the
- exit value in CLI). (Nikita)
- . Fixed bug #69084 (Unclear error message when not implementing a renamed
- abstract trait function). (Nikita)
- . Fixed bug #70839 (Converting optional argument to variadic forbidden by LSP
- checks). (Nikita)
- . Fixed bug #74558 (Can't rebind closure returned by Closure::fromCallable()).
- (cmb)
- . Fixed bug #77561 (Shebang line not stripped for non-primary script).
- (Nikita)
- . Fixed bug #77619 (Wrong reflection on MultipleIterator::__construct).
- (Fabien Villepinte)
- . Fixed bug #77966 (Cannot alias a method named "namespace"). (Nikita)
- . Fixed bug #78236 (convert error on receiving variables when duplicate [).
- (cmb)
- . Fixed bug #78770 (Incorrect callability check inside internal methods).
- (Nikita)
- . Fixed bug #79108 (Referencing argument in a function makes it a reference
- in the stack trace). (Nikita)
- . Fixed bug #79368 ("Unexpected end of file" is not an acceptable error
- message). (Alex Dowad)
- . Fixed bug #79462 (method_exists and property_exists incoherent behavior).
- (cmb)
- . Fixed bug #79467 (data:// wrappers are writable). (cmb)
- . Fixed bug #79521 (Check __set_state structure). (carusogabriel)
- . Fixed bug #79790 ("Illegal offset type" exception during AST evaluation
- not handled properly). (Nikita)
- . Fixed bug #79791 (Assertion failure when unsetting variable during binary
- op). (Nikita)
- . Fixed bug #79828 (Segfault when trying to access non-existing variable).
- (Nikita)
- . Fixed bug #79841 (Syntax error in configure / unescaped "[]" in php.m4).
- (Nikita)
- . Fixed bug #79852 (count(DOMNodeList) doesn't match
- count(IteratorIterator(DOMNodeList))). (Nikita)
- . Fixed bug #79867 (Promoted untyped properties should get null default
- value). (Nikita)
- . Fixed bug #79897 (Promoted constructor params with attribs cause crash).
- (Deus Kane)
- . Fixed bug #79927 (Generator doesn't throw exception after multiple yield
- from iterable). (Nikita)
- . Fixed bug #79946 (Build fails due to undeclared UINT32_C). (Nikita)
- . Fixed bug #79948 (Exit in auto-prepended file does not abort PHP execution).
- (Nikita)
- . Fixed bug #80045 (memleak after two set_exception_handler calls with
- __call). (Nikita)
- . Fixed bug #80096 (Segmentation fault with named arguments in nested call).
- (Nikita)
- . Fixed bug #80109 (Cannot skip arguments when extended debug is enabled).
- (Nikita)
- . Fixed bug #80225 (broken namespace usage in eval code). (Nikita)
- . Fixed bug #80258 (Windows Deduplication Enabled, randon permission errors).
- (cmb)
- . Fixed bug #80280 (ADD_EXTENSION_DEP() fails for ext/standard and ext/date).
- (cmb)
- . Fixed bug #80334 (assert() vs named parameters - confusing error). (Nikita)
- . Fixed bug #80055 (Abstract trait methods returning "self" cannot be
- fulfilled by traits). (Nikita)
- . Fixed faulty generator cleanup with yield from. (Bob)
- . Implement #[Attr] Attribute syntax as per final vote in RFC
- https://wiki.php.net/rfc/shorter_attribute_syntax_change
- . Implemented FR #47074 (phpinfo() reports "On" as 1 for the some
- extensions). (cmb)
- . Implemented FR #72089 (require() throws fatal error instead of exception).
- (Nikita)
- . Removed the pdo_odbc.db2_instance_name php.ini directive. (Kalle)
- . Use SSE2 instructions do locale independent strtolower. (Laruence)
-
-- Curl:
- . Bumped required libcurl version to 7.29.0. (cmb)
- . Fixed bug #80121 (Null pointer deref if CurlHandle directly instantiated).
- (Nikita)
-
-- DOM:
- . Add property DOMXPath::$registerNodeNamespaces and constructor argument
- that allow global flag to configure query() or evaluate() calls.
- . Fixed bug #79968 (DOMChildNode API crash on unattached nodes). (Benjamin)
- . Fixed bug #80268 (loadHTML() truncates at NUL bytes). (cmb)
-
-- Date:
- . Fixed bug #60302 (DateTime::createFromFormat should new static(), not new
- self()). (Derick)
- . Fixed bug #65547 (Default value for sunrise/sunset zenith still wrong).
- (cmb)
- . Fixed bug #69044 (discrepancy between time and microtime). (krakjoe)
- . Fixed bug #80057 (DateTimeImmutable::createFromFormat() does not populate
- time). (Derick)
- . Implemented FR #79903 (datetime: new format "p", same as "P" but returning
- "Z" for UTC). (gharlan)
-
-- Enchant:
- . Add LIBENCHANT_VERSION macro.
- . Add enchant_dict_add and enchant_dict_is_added functions.
- . Deprecate enchant_broker_set_dict_path, enchant_broker_get_dict_path,
- enchant_dict_add_to_personal and enchant_dict_is_in_session.
- . Use libenchant-2 when available.
+ . Added openmetrics status format. (Cees-Jan Kiewiet)
+ . Enable process renaming on macOS. (devnexen)
-- FFI:
- . Added FFI\CType::getName() method. (chopins)
- . Fixed bug #79177 (FFI doesn't handle well PHP exceptions within callback).
- (cmb, Dmitry, Nikita)
- . Fixed bug #79749 (Converting FFI instances to bool fails). (cmb)
-
-- FPM:
- . Add pm.status_listen option. (Jakub Zelenka)
-
-- Fileinfo:
- . Upgrade to libmagic 5.39. (Anatol)
+- FTP:
+ . Convert resource<ftp> to object \FTPConnection. (Sara)
- GD:
- . Added imagegetinterpolation(). (cmb)
- . Fixed bug #55005 (imagepolygon num_points requirement). (cmb)
- . Made the $num_points parameter of php_imagepolygon optional. (cmb)
- . Removed deprecated image2wbmp(). (cmb)
- . Removed deprecated png2wbmp() and jpeg2wbmp(). (cmb)
- . Replaced gd resources with objects. (Mark Randall)
-
-- IMAP:
- . Fixed bug #64076 (imap_sort() does not return FALSE on failure). (cmb)
- . Fixed bug #76618 (segfault on imap_reopen). (girgias)
- . Fixed bug #80213 (imap_mail_compose() segfaults on certain $bodies). (cmb)
- . Fixed bug #80215 (imap_mail_compose() may modify by-val parameters). (cmb)
- . Fixed bug #80216 (imap_mail_compose() does not validate types/encodings).
- (cmb)
- . Fixed bug #80220 (imap_mail_compose() may leak memory). (cmb)
- . Fixed bug #80223 (imap_mail_compose() leaks envelope on malformed bodies).
- (cmb)
- . Fixed bug #80226 (imap_sort() leaks sortpgm memory). (cmb)
- . Fixed bug #80239 (imap_rfc822_write_address() leaks memory). (cmb)
- . Fixed bug #80242 (imap_mail_compose() segfaults for multipart with rfc822).
- (cmb)
- . Fixed minor regression caused by fixing bug #80220. (cmb)
+ . Convert resource<gd font> to object \GdFont. (Sara)
-- Iconv:
- . Dropped support for iconv without proper errno setting. (cmb)
-
-- Intl:
- . Removed deprecated INTL_IDNA_VARIANT_2003. (cmb)
-
-- JIT:
- . Fixed bug #77857 (Wrong result if executed with JIT). (Laruence)
- . Fixed bug #79255 (PHP cannot be compiled with enable JIT).
- (Laruence, Dmitry)
- . Fixed bug #79582 (Crash seen when opcache.jit=1235 and
- opcache.jit_debug=2). (Laruence)
- . Fixed bug #79743 (Fatal error when assigning to array property
- with JIT enabled). (Laruence)
- . Fixed bug #79864 (JIT segfault in Symfony OptionsResolver). (Dmitry)
- . Fixed bug #79888 (Incorrect execution with JIT enabled). (Dmitry)
-
-- JSON:
- . The JSON extension is now an integral part of PHP and cannot be disabled
- as per RFC: https://wiki.php.net/rfc/always_enable_json (tandre)
+- hash:
+ . Implemented FR #68109 (Add MurmurHash V3). (Anatol, Michael)
+ . Implemented FR #73385 (Add xxHash support). (Anatol)
- LDAP:
- . Fixed memory leaks. (ptomulik)
- . Removed deprecated ldap_sort. (mcmic)
-
-- MBString:
- . Fixed bug #76999 (mb_regex_set_options() return current options). (cmb)
- . Removed the unused $is_hex parameter from mb_decode_numericentity(). (cmb)
+ . Convert resource<ldap link> to object \LDAP. (Máté)
+ . Convert resource<ldap result> to object \LDAPResult. (Máté)
+ . Convert resource<ldap result entry> to object \LDAPResultEntry. (Máté)
- MySQLi:
- . Fixed bug #76809 (SSL settings aren't respected when persistent connections
- are used). (fabiomsouto)
+ . Fixed bug #70372 (Emulate mysqli_fetch_all() for libmysqlclient). (Nikita)
+ . Fixed bug #80330 (Replace language in APIs and source code/docs).
+ (Darek Åšlusarczyk)
+ . Fixed bug #80329 (Add option to specify LOAD DATA LOCAL white list folder
+ (including libmysql)). (Darek Åšlusarczyk)
-- Mysqlnd:
- . Fixed #60594 (mysqlnd exposes 160 lines of stats in phpinfo). (PeeHaa)
-
-- OCI8:
- . Deprecated old OCI8 function aliases. (Jens de Nies)
- . Modernized oci_register_taf_callback() callable argument parsing
- implementation. (girgias)
- . Removed obsolete no-op function oci_internal_debug(). (Jens de Nies)
-
-- ODBC:
- . Fixed bug #22986 (odbc_connect() may reuse persistent connection). (cmb)
- . Fixed bug #44618 (Fetching may rely on uninitialized data). (cmb)
+- MySQLnd:
+ . Fixed bug #80761 (PDO uses too much memory). (Nikita)
- Opcache:
- . Fixed bug #76535 (Opcache does not replay compile-time warnings). (Nikita)
- . Fixed bug #78654 (Incorrectly computed opcache checksum on files with
- non-ascii characters). (mhagstrand)
- . Fixed bug #79665 (ini_get() and opcache_get_configuration() inconsistency).
- (cmb)
- . Fixed bug #80030 (Optimizer segfault with isset on static property with
- undef dynamic class name). (Nikita)
- . Fixed bug #80175 (PHP8 RC1 - JIT Buffer not working). (cmb)
- . Fixed bug #80184 (Complex expression in while / if statements resolves to
- false incorrectly). (Nikita)
- . Fixed bug #80255 (Opcache bug (bad condition result) in 8.0.0rc1). (Nikita)
- . Fixed run-time binding of preloaded dynamically declared function. (Dmitry)
+ . Added inheritance cache. (Dmitry)
- OpenSSL:
- . Added Cryptographic Message Syntax (CMS) support. (Eliot Lear)
-
-- PCRE:
- . Don't ignore invalid escape sequences. (sjon)
- . Updated to PCRE2 10.35. (cmb)
+ . Bump minimal OpenSSL version to 1.0.2. (Jakub Zelenka)
- PDO:
- . Changed default PDO error mode to exceptions. (AllenJB)
- . Fixed bug #77849 (Disable cloning of PDO handle/connection objects).
- (camporter)
-
-- PDO_Firebird:
- . Fixed bug #64937 (Firebird PDO preprocessing sql). (Simonov Denis)
-
-- PDO_OCI:
- . Added support for setting and getting the oracle OCI 18c call timeout.
- (camporter)
-
-- PDO_PGSQL:
- . Bumped required libpq version to 9.1. (cmb)
+ . Fixed bug #40913 (PDO_MYSQL: PDO::PARAM_LOB does not bind to a stream for
+ fetching a BLOB). (Nikita)
-- PGSQL:
- . Bumped required libpq version to 9.1. (cmb)
+. PDO SQLite:
+ . Fixed bug #38334 (Proper data-type support for PDO_SQLITE). (Nikita)
-- Phpdbg:
- . Fixed bug #76596 (phpdbg support for display_errors=stderr). (kabel)
- . Fixed bug #76801 (too many open files). (alekitto)
- . Fixed bug #77800 (phpdbg segfaults on listing some conditional breakpoints).
- (krakjoe)
- . Fixed bug #77805 (phpdbg build fails when readline is shared). (krakjoe)
-
-- Reflection:
- . Fixed bug #64592 (ReflectionClass::getMethods() returns methods out of
- scope). (Nikita)
- . Fixed bug #69180 (Reflection does not honor trait conflict resolution /
- method aliasing). (Nikita)
- . Fixed bug #74939 (Nested traits' aliased methods are lowercased). (Nikita)
- . Fixed bug #77325 (ReflectionClassConstant::$class returns wrong class when
- extending). (Nikita)
- . Fixed bug #78697 (ReflectionClass::implementsInterface - inaccurate error
- message with traits). (villfa)
- . Fixed bug #80190 (ReflectionMethod::getReturnType() does not handle static
- as part of union type). (Nikita)
- . Fixed bug #80299 (ReflectionFunction->invokeArgs confused in arguments).
- (Nikita)
- . Fixed bug #80370 (getAttributes segfault on dynamic properties). (Benjamin
- Eberlei)
- . Implement #79628 (Add $filter parameter for ReflectionClass::getConstants
- and ReflectionClass::getReflectionConstants) (carusogabriel)
- . Implement ReflectionProperty::hasDefaultValue and
- Reflection::getDefaultValue (beberlei)
-
-- SNMP:
- . Fixed bug #70461 (disable md5 code when it is not supported in net-snmp).
- (Alexander Bergmann, cmb)
+- PSpell:
+ . Convert resource<pspell> to object \PSpell. (Sara)
+ . Convert resource<pspell config> to object \PSpellConfig. (Sara)
- SPL:
- . Fixed bug #65006 (spl_autoload_register fails with multiple callables using
- self, same method). (Nikita)
- . Fixed bug #65387 (Circular references in SPL iterators are not garbage
- collected). (Nikita)
- . Fixed bug #71236 (Second call of spl_autoload_register() does nothing if it
- has no arguments). (Nikita)
- . Fixed bug #79987 (Memory leak in SplFileInfo because of missing
- zend_restore_error_handling()). (Dmitry)
- . SplFixedArray is now IteratorAggregate rather than Iterator. (alexdowad)
-
-- SQLite3:
- . Added SQLite3::setAuthorizer() and respective class constants. (bohwaz)
-
-- Session:
- . Fixed bug #73529 (session_decode() silently fails on wrong input). (cmb)
- . Fixed bug #78624 (session_gc return value for user defined session
- handlers). (bshaffer)
-
-- Shmop:
- . Converted shmop resources to objects. (cmb)
-
-- SimpleXML:
- . Fixed bug #63575 (Root elements are not properly cloned). (cmb)
- . Fixed bug #75245 (Don't set content of elements with only whitespaces).
- (eriklundin)
-
-- Sodium:
- . Fixed bug #77646 (sign_detached() strings not terminated). (Frank)
-
-- Standard:
- . Don't force rebuild of symbol table, when populating $http_response_header
- variable by the HTTP stream wrapper. (Dmitry)
- . Fixed bug #47983 (mixed LF and CRLF line endings in mail()). (cmb)
- . Fixed bug #64060 (lstat_stat_variation7.phpt fails on certain file systems).
- (M. Voelker, cmb)
- . Fixed bug #75902 (str_replace should warn when misused with nested arrays).
- (Nikita)
- . Fixed bug #76859 (stream_get_line skips data if used with data-generating
- filter). (kkopachev)
- . Fixed bug #77204 (getimagesize(): Read error! should mention file path).
- (peter279k)
- . Fixed bug #78385 (parse_url() does not include 'query' when question mark
- is the last char). (Islam Israfilov)
- . Fixed bug #79868 (Sorting with array_unique gives unwanted result). (Nikita)
- . Fixed bug #80256 (file_get_contents strip first line with chunked encoding
- redirect). (Nikita)
- . Fixed bug #80266 (parse_url silently drops port number 0). (cmb, Nikita)
- . Fixed bug #80290 (Double free when ASSERT_CALLBACK is used with a dynamic
- message). (Nikita)
- . Implemented FR #78638 (__PHP_Incomplete_Class should be final). (Laruence)
- . Made quoting of cmd execution functions consistent. (cmb)
-
-- Tidy:
- . Removed the unused $use_include_path parameter from tidy_repair_string().
- (cmb)
-
-- Tokenizer:
- . Fixed bug #80328 (PhpToken::getAll() confusing name). (Nikita)
-
-- XML:
- . Fixed bug #76874 (xml_parser_free() should never leak memory). (Nikita)
-
-- XMLWriter:
- . Changed functions to accept/return XMLWriter objects instead of resources.
- (cmb)
- . Implemented FR #79344 (xmlwriter_write_attribute_ns: $prefix should be
- nullable). (cmb)
- . Removed return types from XMLWriter stubs. (cmb)
-
-- Zip:
- . Add "flags" options to ZipArchive::addGlob and addPattern methods
- keeping previous behavior having FL_OVERWRITE by default. (Remi)
- . Add ZipArchive::EM_UNKNOWN and ZipArchive::EM_TRAD_PKWARE constants. (Remi)
- . Add ZipArchive::isCompressionMethodSupported() and
- ZipArchive::isEncryptionMethodSupported() method (libzip 1.7.0). (Remi)
- . Add ZipArchive::replaceFile() method. (Remi)
- . Add ZipArchive::setCancelCallback method (since libzip 1.6.0). (Remi)
- . Add ZipArchive::setMtimeName and ZipArchive::setMtimeIndex methods. (Remi)
- . Add ZipArchive::setProgressCallback method (since libzip 1.3.0). (Remi)
- . Add lastId property to ZipArchive. (Remi)
- . Add optional "flags" parameter to ZipArchive::addEmptyDir, addFile and
- addFromString methods. (Remi)
- . Fixed bug #50678 (files extracted by ZipArchive class lost their
- original modified time). (Remi)
- . Fixed bug #72374 (remove_path strips first char of filename). (tyage, Remi)
- . Implemented FR #77960 (add compression / encryption options for
- ZipArchive::addGlob and ZipArchive::addPattern). (Remi)
- . ZipArchive::status and ZipArchive::statusSys properties and
- ZipArchive::getStatusString() method stay valid after the archive
- is closed. (Remi)
-
-- Zlib:
- . Fixed bug #71417 (fread() does not report zlib.inflate errors). (cmb)
- . Fixed bug #78792 (zlib.output_compression disabled by Content-Type: image/).
- (cmb)
+ . Fixed bug #80724 (FilesystemIterator::FOLLOW_SYMLINKS remove KEY_AS_FILE
+ from bitmask). (Cameron Porter)
+<<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
diff --git a/README.md b/README.md
index 18ee18a918..fda7f82d4e 100644
--- a/README.md
+++ b/README.md
@@ -40,12 +40,17 @@ For other systems, see the [installation chapter](https://php.net/install).
*For Windows, see [Build your own PHP on Windows](https://wiki.php.net/internals/windows/stepbystepbuild_sdk_2).*
For a minimal PHP build from Git, you will need autoconf, bison, and re2c. For
-a default build, you will additionally need libxml2 and libsqlite3. On Ubuntu,
-you can install these using:
+a default build, you will additionally need libxml2 and libsqlite3.
+
+On Ubuntu, you can install these using:
sudo apt install -y pkg-config build-essential autoconf bison re2c \
libxml2-dev libsqlite3-dev
+On Fedora, you can install these using:
+
+ sudo dnf install re2c bison autoconf make libtool ccache libxml2-devel sqlite-devel
+
Generate configure:
./buildconf
diff --git a/UPGRADING b/UPGRADING
index 1fbe212dc8..ceda239b76 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -1,4 +1,4 @@
-PHP 8.0 UPGRADE NOTES
+PHP 8.1 UPGRADE NOTES
1. Backward Incompatible Changes
2. New Features
@@ -15,1145 +15,312 @@ PHP 8.0 UPGRADE NOTES
13. Other Changes
14. Performance Improvements
-
========================================
1. Backward Incompatible Changes
========================================
- Core:
- . `match` is now a reserved keyword.
- . Assertion failures now throw by default. If the old behavior is desired,
- then set `assert.exception=0` in INI settings.
- . Methods with the same name as the class are no longer interpreted as
- constructors. The __construct() method should be used instead.
- . Removed ability to call non-static methods statically.
- Thus `is_callable` will fail when checking for a non-static method with a
- classname (must check with an object instance).
- . Removed (real) cast.
- . Removed (unset) cast.
- . Removed track_errors ini directive. This means that $php_errormsg is no
- longer available. The error_get_last() function may be used instead.
- . Removed the ability to define case-insensitive constants. The third
- argument to define() may no longer be true.
- . Access to undefined constants now always results in an Error exception.
- Previously, unqualified constant accesses resulted in a warning and were
- interpreted as strings.
- . Removed ability to specify an autoloader using an __autoload() function.
- spl_autoload_register() should be used instead.
- . Removed the $errcontext argument for custom error handlers.
- . Removed create_function(). Anonymous functions may be used instead.
- . Removed each(). foreach or ArrayIterator should be used instead.
- . Removed ability to unbind $this from closures that were created from a
- method, using Closure::fromCallable() or ReflectionMethod::getClosure().
- . Also removed ability to unbind $this from proper closures that contain uses
- of $this.
- . Removed ability to use array_key_exists() with objects. Use one of isset()
- or property_exists() instead.
- . Made the behavior of array_key_exists() regarding the type of the key
- parameter consistent with isset() and normal array access. All key types now
- use the usual coercions and array/object keys throw a TypeError.
- . Any array that has a number n as its first numeric key will use n+1 for
- its next implicit key, even if n is negative.
- RFC: https://wiki.php.net/rfc/negative_array_index
- . The default error_reporting level is now E_ALL. Previously it excluded
- E_NOTICE and E_DEPRECATED.
- . display_startup_errors is now enabled by default.
- . Using "parent" inside a class that has no parent will now result in a
- fatal compile-time error.
- . The @ operator will no longer silence fatal errors (E_ERROR, E_CORE_ERROR,
- E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR, E_PARSE). Error handlers
- that expect error_reporting to be 0 when @ is used, should be adjusted to
- use a mask check instead:
-
- // Replace
- function my_error_handler($err_no, $err_msg, $filename, $linenum) {
- if (error_reporting() == 0) {
- return; // Silenced
- }
- // ...
- }
-
- // With
- function my_error_handler($err_no, $err_msg, $filename, $linenum) {
- if (!(error_reporting() & $err_no)) {
- return; // Silenced
- }
- // ...
- }
+ . Access to the $GLOBALS array is now subject to a number of restrictions.
+ Read and write access to individual array elements like $GLOBALS['var']
+ continues to work as-is. Read-only access to the entire $GLOBALS array also
+ continues to be supported. However, write access to the entire $GLOBALS
+ array is no longer supported. For example, array_pop($GLOBALS) will result
+ in an error.
+ RFC: https://wiki.php.net/rfc/restrict_globals_usage
+ . Passing null to a non-nullable argument of a built-in function is
+ deprecated. This matches the behavior of user-defined functions, where null
+ is never accepted by non-nullable arguments.
+ user-defined functions.
+
+ var_dump(str_contains("foobar", null));
+ // Deprecated: Passing null to parameter #2 ($needle) of type string
+ // is deprecated
+
+ RFC: https://wiki.php.net/rfc/deprecate_null_to_scalar_internal_arg
+ . When a method using static variables is inherited, the inherited method
+ will now initialize the static variables to their original values, rather
+ than the values at the time of inheritance:
- Additionally, care should be taken that error messages are not displayed in
- production environments, which can result in information leaks. Please
- ensure that display_errors=Off is used in conjunction with error logging.
- . Following the hash comment operator # immediately with an opening bracket
- is not supported as a comment anymore since this syntax is now used for
- attributes.
- RFC: https://wiki.php.net/rfc/shorter_attribute_syntax_change
- . Inheritance errors due to incompatible method signatures (LSP violations)
- will now always generate a fatal error. Previously a warning was generated
- in some cases.
- RFC: https://wiki.php.net/rfc/lsp_errors
- . The precedence of the concatenation operator has changed relative to
- bitshifts and addition as well as subtraction.
- RFC: https://wiki.php.net/rfc/concatenation_precedence
- . Arguments with a default value that resolves to null at runtime will no
- longer implicitly mark the argument type as nullable. Either use an explicit
- nullable type, or an explicit null default value instead.
-
- // Replace
- function test(int $arg = CONST_RESOLVING_TO_NULL) {}
- // With
- function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
- // Or
- function test(int $arg = null) {}
- . A number of warnings have been converted into Error exceptions:
-
- * Attempting to write to a property of a non-object. Previously this
- implicitly created an stdClass object for null, false and empty strings.
- * Attempting to append an element to an array for which the PHP_INT_MAX key
- is already used.
- * Attempting to use an invalid type (array or object) as an array key or
- string offset.
- * Attempting to write to an array index of a scalar value.
- * Attempting to unpack a non-array/Traversable.
-
- A number of notices have been converted into warnings:
-
- * Attempting to read an undefined variable.
- * Attempting to read an undefined property.
- * Attempting to read an undefined array key.
- * Attempting to read a property of a non-object.
- * Attempting to access an array index of a non-array.
- * Attempting to convert an array to string.
- * Attempting to use a resource as an array key.
- * Attempting to use null, a boolean, or a float as a string offset.
- * Attempting to read an out-of-bounds string offset.
- * Attempting to assign an empty string to a string offset.
-
- RFC: https://wiki.php.net/rfc/engine_warnings
- . Attempting to assign multiple bytes to a string offset will now emit a
- warning.
- . Unexpected characters in source files (such as null bytes outside of
- strings) will now result in a ParseError exception instead of a compile
- warning.
- . Uncaught exceptions now go through "clean shutdown", which means that
- destructors will be called after an uncaught exception.
- . Compile time fatal error "Only variables can be passed by reference" has
- been delayed until runtime and converted to "Argument cannot be passed by
- reference" exception.
- . Some "Only variables should be passed by reference" notices have been
- converted to "Argument cannot be passed by reference" exception.
- . The generated name for anonymous classes has changed. It will now include
- the name of the first parent or interface:
-
- new class extends ParentClass {};
- // -> ParentClass@anonymous
- new class implements FirstInterface, SecondInterface {};
- // -> FirstInterface@anonymous
- new class {};
- // -> class@anonymous
-
- The name shown above is still followed by a null byte and a unique
- suffix.
- . Non-absolute trait method references in trait alias adaptations are now
- required to be unambiguous:
-
- class X {
- use T1, T2 {
- func as otherFunc;
+ class A {
+ public function counter() {
+ static $counter = 0;
+ $counter++;
+ return $counter;
}
- function func() {}
}
- If both T1::func() and T2::func() exist, this code was previously silently
- accepted, and func was assumed to refer to T1::func. Now it will generate a
- fatal error instead, and either T1::func or T2::func needs to be written
- explicitly.
- . The signature of abstract methods defined in traits is now checked against
- the implementing class method:
+ var_dump((new A)->counter()); // int(1)
- trait MyTrait {
- abstract private function neededByTrait(): string;
- }
+ eval('class B extends A {}'); // eval() to prevent early binding.
- class MyClass {
- use MyTrait;
+ var_dump((new B)->counter()); // int(1), previously int(2)
+ var_dump((new A)->counter()); // int(2)
+ var_dump((new B)->counter()); // int(2), previously int(3)
- // Error, because of return type mismatch.
- private function neededByTrait(): int { return 42; }
- }
+ Previously the behavior would be different depending on whether A::counter()
+ was called before class B was declared, or after it was declared.
- RFC: https://wiki.php.net/rfc/abstract_trait_method_validation
- . Disabled functions are now treated exactly like non-existent functions.
- Calling a disabled function will report it as unknown, and redefining a
- disabled function is now possible.
- . data: stream wrappers are no longer writable, which matches the documented
- behavior.
- . The arithmetic and bitwise operators
- +, -, *, /, **, %, <<, >>, &, |, ^, ~, ++, --
- will now consistently throw a TypeError when one of the operands is an
- array, resource or non-overloaded object. The only exception to this is the
- array + array merge operation, which remains supported.
- RFC: https://wiki.php.net/rfc/arithmetic_operator_type_checks
- . Float to string casting will now always behave locale-independently.
- RFC: https://wiki.php.net/rfc/locale_independent_float_to_string
- . Removed support for deprecated curly braces for offset access
- RFC: https://wiki.php.net/rfc/deprecate_curly_braces_array_access
- . Applying the final modifier on a private method will now produce a warning
- unless that method is the constructor.
- RFC: https://wiki.php.net/rfc/inheritance_private_methods
- . If an object constructor exit()s, the object destructor will no longer be
- called. This matches the behavior when the constructor throws.
- . Non-strict comparisons between numbers and non-numeric strings now work by
- casting the number to string and comparing the strings. Comparisons between
- numbers and numeric strings continue to work as before. Notably, this means
- that `0 == "not-a-number"` is considered false now.
- RFC: https://wiki.php.net/rfc/string_to_number_comparison
- . Namespaced names can no longer contain whitespace: While `Foo\Bar` will be
- recognized as a namespaced name, `Foo \ Bar` will not. Conversely, reserved
- keywords are now permitted as namespace segments, which may also change the
- interpretation of code: `new\x` is now the same as `constant('new\x')`, not
- `new \x()`.
- RFC: https://wiki.php.net/rfc/namespaced_names_as_token
- . Nested ternaries now require explicit parentheses.
- RFC: https://wiki.php.net/rfc/ternary_associativity
- . debug_backtrace() and Exception::getTrace() will no longer provide
- references to arguments. It will not be possible to change function
- arguments through the backtrace.
- . Numeric string handling has been altered to be more intuitive and less
- error-prone. Trailing whitespace is now allowed in numeric strings for
- consistency with how leading whitespace is treated. This mostly affects:
- - The is_numeric() function
- - String-to-string comparisons
- - Type declarations
- - Increment and decrement operations
- The concept of a "leading-numeric string" has been mostly dropped; the
- cases where this remains exist in order to ease migration. Strings which
- emitted an E_NOTICE "A non well-formed numeric value encountered" will now
- emit an E_WARNING "A non-numeric value encountered" and all strings which
- emitted an E_WARNING "A non-numeric value encountered" will now throw a
- TypeError. This mostly affects:
- - Arithmetic operations
- - Bitwise operations
- This E_WARNING to TypeError change also affects the E_WARNING
- "Illegal string offset 'string'" for illegal string offsets. The behavior
- of explicit casts to int/float from strings has not been changed.
- RFC: https://wiki.php.net/rfc/saner-numeric-strings
- . Magic Methods will now have their arguments and return types checked if
- they have them declared. The signatures should match the following list:
-
- __call(string $name, array $arguments): mixed
- __callStatic(string $name, array $arguments): mixed
- __clone(): void
- __debugInfo(): ?array
- __get(string $name): mixed
- __invoke(mixed $arguments): mixed
- __isset(string $name): bool
- __serialize(): array
- __set(string $name, mixed $value): void
- __set_state(array $properties): object
- __sleep(): array
- __unserialize(array $data): void
- __unset(string $name): void
- __wakeup(): void
-
- RFC: https://wiki.php.net/rfc/magic-methods-signature
- . call_user_func_array() array keys will now be interpreted as parameter names,
- instead of being silently ignored.
-
-- COM:
- . Removed the ability to import case-insensitive constants from type
- libraries. The second argument to com_load_typelib() may no longer be false;
- com.autoregister_casesensitive may no longer be disabled; case-insensitive
- markers in com.typelib_file are ignored.
-
-- Curl:
- . CURLOPT_POSTFIELDS no longer accepts objects as arrays. To interpret an
- object as an array, perform an explicit (array) cast. The same applies to
- other options accepting arrays as well.
-
-- Date:
- . mktime() and gmmktime() now require at least one argument. time() can be
- used to get the current timestamp.
-
-- dom:
- . Remove unimplemented classes from ext/dom that had no behavior and contained
- test data. These classes have also been removed in the latest version of DOM
- standard:
-
- * DOMNameList
- * DomImplementationList
- * DOMConfiguration
- * DomError
- * DomErrorHandler
- * DOMImplementationSource
- * DOMLocator
- * DOMUserDataHandler
- * DOMTypeInfo
-
-- Enchant:
- . enchant_broker_list_dicts(), enchant_broker_describe() and
- enchant_dict_suggest() will now return an empty array instead of null.
- . enchant_broker_init() will now return an EnchantBroker object rather than
- a resource. Return value checks using is_resource() should be replaced with
- checks for `false`.
- . enchant_broker_request_dict() and enchant_broker_request_pwl_dict() will now
- return an EnchantDictionary object rather than a resource. Return value
- checks using is_resource() should be replaced with checks for `false`.
-
-- Exif:
- . Removed read_exif_data(). exif_read_data() should be used instead.
-
-- Filter:
- . The FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED flags for the
- FILTER_VALIDATE_URL filter have been removed. The scheme and host are (and
- have been) always required.
- . The INPUT_REQUEST and INPUT_SESSION source for filter_input() etc have been
- removed. These were never implemented and their use always generated a
- warning.
-
-- GD:
- . The GD extension now uses a GdImage objects as the underlying data structure
- for images, rather than resources. These objects are completely opaque, i.e.
- they don't have any methods. Return value checks using is_resource() should
- be replaced with checks for `false`. The imagedestroy() function no longer
- has an effect, instead the GdImage instance is automatically destroyed if
- it is no longer referenced.
- . The deprecated function image2wbmp() has been removed.
- RFC: https://wiki.php.net/rfc/image2wbmp
- . The deprecated functions png2wbmp() and jpeg2wbmp() have been removed.
- RFC: https://wiki.php.net/rfc/deprecate-png-jpeg-2wbmp
- . The default $mode parameter of imagecropauto() no longer accepts -1.
- IMG_CROP_DEFAULT should be used instead.
-
-- GMP:
- . gmp_random() has been removed. One of gmp_random_range() or
- gmp_random_bits() should be used instead.
-
-- Iconv:
- . iconv() implementations which do not properly set errno in case of errors
- are no longer supported.
+- Fileinfo:
+ . The fileinfo functions now accept and return, respectively, finfo objects
+ instead of resources.
- IMAP:
- . The unused default_host argument of imap_headerinfo() has been removed.
- . The imap_header() function which is an alias of imap_headerinfo() has been removed.
-
-- Intl:
- . The deprecated constant INTL_IDNA_VARIANT_2003 has been removed.
- RFC: https://wiki.php.net/rfc/deprecate-and-remove-intl_idna_variant_2003
- . The deprecated Normalizer::NONE constant has been removed.
- . The IntlDateFormatter::RELATIVE_FULL, IntlDateFormatter::RELATIVE_LONG,
- IntlDateFormatter::RELATIVE_MEDIUM, and IntlDateFormatter::RELATIVE_SHORT
- constants have been added.
+ . The IMAP functions now accept and return, respectively, IMAPConnection objects
+ instead of resources.
- LDAP:
- . The deprecated function ldap_sort has been removed.
- . The deprecated function ldap_control_paged_result has been removed.
- . The deprecated function ldap_control_paged_result_response has been removed.
- . The interface of ldap_set_rebind_proc has changed; the $callback parameter
- does not accept empty string anymore; null value shall be used instead.
-
-- Mbstring:
- . The mbstring.func_overload directive has been removed. The related
- MB_OVERLOAD_MAIL, MB_OVERLOAD_STRING, and MB_OVERLOAD_REGEX constants have
- also been removed. Finally, the "func_overload" and "func_overload_list"
- entries in mb_get_info() have been removed.
- . mb_parse_str() can no longer be used without specifying a result array.
- . A number of deprecated mbregex aliases have been removed. See the following
- list for which functions should be used instead:
-
- * mbregex_encoding() -> mb_regex_encoding()
- * mbereg() -> mb_ereg()
- * mberegi() -> mb_eregi()
- * mbereg_replace() -> mb_ereg_replace()
- * mberegi_replace() -> mb_eregi_replace()
- * mbsplit() -> mb_split()
- * mbereg_match() -> mb_ereg_match()
- * mbereg_search() -> mb_ereg_search()
- * mbereg_search_pos() -> mb_ereg_search_pos()
- * mbereg_search_regs() -> mb_ereg_search_regs()
- * mbereg_search_init() -> mb_ereg_search_init()
- * mbereg_search_getregs() -> mb_ereg_search_getregs()
- * mbereg_search_getpos() -> mb_ereg_search_getpos()
- * mbereg_search_setpos() -> mb_ereg_search_setpos()
-
- . The 'e' modifier for mb_ereg_replace() has been removed.
- mb_ereg_replace_callback() should be used instead.
- . A non-string pattern argument to mb_ereg_replace() will now be interpreted
- as a string instead of an ASCII codepoint. The previous behavior may be
- restored with an explicit call to chr().
- . The needle argument for mb_strpos(), mb_strrpos(), mb_stripos(),
- mb_strripos(), mb_strstr(), mb_stristr(), mb_strrchr() and mb_strrichr() can
- now be empty.
- . The $is_hex parameter, which was not used internally, has been removed from
- mb_decode_numericentity().
- . The legacy behavior of passing the encoding as the third argument instead
- of an offset for the mb_strrpos() function has been removed; provide an
- explicit 0 offset with the encoding as the fourth argument instead.
- . The ISO_8859-* character encoding aliases have been replaced by ISO8859-*
- aliases for better interoperability with the iconv extension. The mbregex
- ISO 8859 aliases with underscores (ISO_8859_* and ISO8859_*) have also been
- removed.
- . mb_ereg() and mb_eregi() will now return boolean true on a successful
- match. Previously they returned integer 1 if $matches was not passed, or
- max(1, strlen($reg[0])) is $matches was passed.
-
-- OCI8:
- . The OCI-Lob class is now called OCILob, and the OCI-Collection class is now
- called OCICollection for name compliance enforced by PHP 8 arginfo
- type annotation tooling.
- . Several alias functions have been marked as deprecated.
- . oci_internal_debug() and its alias ociinternaldebug() have been removed.
-
-- ODBC:
- . odbc_connect() no longer reuses persistent connections.
- . The unused flags parameter of odbc_exec() has been removed.
-
-- OpenSSL:
- . openssl_x509_read() and openssl_csr_sign() will now return an
- OpenSSLCertificate object rather than a resource. Return value checks using
+ . The LDAP functions now accept and return, respectively, LDAP objects
+ instead of "ldap link" resources. Return value checks using is_resource()
+ should be replaced with checks for `false`.
+ . The LDAP functions now accept and return, respectively, LDAPResult objects
+ instead of "ldap result" resources. Return value checks using is_resource()
+ should be replaced with checks for `false`.
+ . The LDAP functions now accept and return, respectively, LDAPResultEntry
+ objects instead of "ldap result entry" resources. Return value checks using
is_resource() should be replaced with checks for `false`.
- . The openssl_x509_free() function is deprecated and no longer has an effect,
- instead the OpenSSLCertificate instance is automatically destroyed if it is no
- longer referenced.
- . openssl_csr_new() will now return an OpenSSLCertificateSigningRequest object
- rather than a resource. Return value checks using is_resource() should be
- replaced with checks for `false`.
- . openssl_pkey_new() will now return an OpenSSLAsymmetricKey object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`.
- . The openssl_pkey_free() function is deprecated and no longer has an effect,
- instead the OpenSSLAsymmetricKey instance is automatically destroyed if it is no
- longer referenced.
- . openssl_seal() and openssl_open() now require $method to be passed, as the
- previous default of "RC4" is considered insecure.
-
-- PCRE:
- . When passing invalid escape sequences they are no longer interpreted as
- literals. This behavior previously required the X modifier - which is
- now ignored.
-- PDO:
+- MySQLi:
+ . mysqli_fetch_fields() and mysqli_fetch_field_direct() will now always return
+ zero for max_length. You can compute this information by iterating over the
+ result set and taking the maximum length. This is what PHP was doing
+ internally previously.
+ . The MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH option no longer has an effect.
+ . The MYSQLI_STORE_RESULT_COPY_DATA option no longer has an effect.
. The default error handling mode has been changed from "silent" to
- "exceptions". See https://www.php.net/manual/en/pdo.error-handling.php
- for details of behavior changes and how to explicitly set this attribute.
- RFC: https://wiki.php.net/rfc/pdo_default_errmode
- . The signatures of some PDO methods have changed:
+ "exceptions". See https://www.php.net/manual/en/mysqli-driver.report-mode.php
+ for details of behavior changes and how to explicitly set this attribute. To
+ keep the old behavior, use mysqli_report(MYSQLI_REPORT_OFF);
+ RFC: https://wiki.php.net/rfc/mysqli_default_errmode
+
+- MySQLnd:
+ . The mysqlnd.fetch_copy_data ini setting has been removed. However, this
+ should not result in user-visible behavior changes.
- PDO::query(
- string $statement, ?int $fetch_mode = null, ...$fetch_mode_args)
- PDOStatement::setFetchMode(int $mode, ...$params)
+- PDO:
+ . PDO::ATTR_STRINGIFY_FETCHES now also stringifies values of type bool to
+ "0" or "1". Previously booleans were not stringified.
+ . Calling bindColumn() with PDO::PARAM_LOB (and assuming stringification is
+ not enabled) will now consistently bind a stream result, as documented.
+ Previously the result would be either a stream or a string depending on the
+ used database driver and the time the binding is performed.
- PDO MySQL:
- . PDO::inTransaction() now reports the actual transaction state of the
- connection, rather than an approximation maintained by PDO. If a query that
- is subject to "implicit commit" is executed, PDO::inTransaction() will
- subsequently return false, as a transaction is no longer active.
-
-- PDO_ODBC:
- . The php.ini directive pdo_odbc.db2_instance_name has been removed
-
-- pgsql:
- . The deprecated pg_connect() syntax using multiple parameters instead of a
- connection string is no longer supported.
- . The deprecated pg_lo_import() and pg_lo_export() signature that passes the
- connection as the last argument is no longer supported. The connection
- should be passed as first argument instead.
- . pg_fetch_all() will now return an empty array instead of false for result
- sets with zero rows.
-
-- Phar:
- . Metadata associated with a phar will no longer be automatically unserialized,
- to fix potential security vulnerabilities due to object instantiation, autoloading, etc.
- RFC: https://wiki.php.net/rfc/phar_stop_autoloading_metadata
-
-- Reflection:
- . The method signatures
-
- ReflectionClass::newInstance($args)
- ReflectionFunction::invoke($args)
- ReflectionMethod::invoke($object, $args)
-
- have been changed to:
-
- ReflectionClass::newInstance(...$args)
- ReflectionFunction::invoke(...$args)
- ReflectionMethod::invoke($object, ...$args)
-
- Code that must be compatible with both PHP 7 and PHP 8 can use the following
- signatures to be compatible with both versions:
-
- ReflectionClass::newInstance($arg = null, ...$args)
- ReflectionFunction::invoke($arg = null, ...$args)
- ReflectionMethod::invoke($object, $arg = null, ...$args)
-
- . The ReflectionType::__toString() method will now return a complete debug
- representation of the type, and is no longer deprecated. In particular the
- result will include a nullability indicator for nullable types. The format
- of the return value is not stable and may change between PHP versions.
- . Reflection export() methods have been removed.
- . The following methods can now return information about default values of
- parameters of internal functions:
- ReflectionParameter::isDefaultValueAvailable()
- ReflectionParameter::getDefaultValue()
- ReflectionParameter::isDefaultValueConstant()
- ReflectionParameter::getDefaultValueConstantName()
- . ReflectionMethod::isConstructor() and ReflectionMethod::isDestructor() now
- also return true for `__construct` and `__destruct` methods of interfaces.
- Previously, this would only be true for methods of classes and traits.
- . ReflectionType::isBuiltin() method has been moved to ReflectionNamedType.
- ReflectionUnionType does not have it.
-
-- Sockets:
- . The deprecated AI_IDN_ALLOW_UNASSIGNED and AI_IDN_USE_STD3_ASCII_RULES
- flags for socket_addrinfo_lookup() have been removed.
- . socket_create(), socket_create_listen(), socket_accept(),
- socket_import_stream(), socket_addrinfo_connect(), socket_addrinfo_bind(),
- and socket_wsaprotocol_info_import() will now return a Socket object rather
- than a resource. Return value checks using is_resource() should be replaced
- with checks for `false`.
- . socket_addrinfo_lookup() will now return an array of AddressInfo objects
- rather than resources.
-
-- SPL:
- . SplFileObject::fgetss() has been removed.
- . SplFileObject::seek() now always seeks to the beginning of the line.
- Previously, positions >=1 sought to the beginning of the next line.
- . SplHeap::compare($a, $b) now specifies a method signature. Inheriting
- classes implementing this method will now have to use a compatible
- method signature.
- . SplDoublyLinkedList::push() now returns void instead of true
- . SplDoublyLinkedList::unshift() now returns void instead of true
- . SplQueue::enqueue() now returns void instead of true
- . spl_autoload_register() will now always throw a TypeError on invalid
- arguments, therefore the second argument $do_throw is ignored and a
- notice will be emitted if it is set to false.
- . SplFixedArray is now an IteratorAggregate and not an Iterator.
- SplFixedArray::rewind(), ::current(), ::key(), ::next(), and ::valid()
- have been removed. In their place, SplFixedArray::getIterator() has been
- added. Any code which uses explicit iteration over SplFixedArray must now
- obtain an Iterator through SplFixedArray::getIterator(). This means that
- SplFixedArray is now safe to use in nested loops.
+ . Integers and floats in result sets will now be returned using native PHP
+ types instead of strings when using emulated prepared statements. This
+ matches the behavior of native prepared statements. You can restore the
+ previous behavior by enabling the PDO::ATTR_STRINGIFY_FETCHES option.
+
+- PDO SQLite:
+ . Integers and floats in results sets will now be returned using native PHP
+ types. You can restore the previous behavior by enabling the
+ PDO::ATTR_STRINGFIY_FETCHES option.
- Standard:
- . assert() will no longer evaluate string arguments, instead they will be
- treated like any other argument. assert($a == $b) should be used instead of
- assert('$a == $b'). The assert.quiet_eval ini directive and
- ASSERT_QUIET_EVAL constants have also been removed, as they would no longer
- have any effect.
- . parse_str() can no longer be used without specifying a result array.
- . fgetss() has been removed.
- . The string.strip_tags filter has been removed.
- . The needle argument of strpos(), strrpos(), stripos(), strripos(), strstr(),
- strchr(), strrchr(), and stristr() will now always be interpreted as a
- string. Previously non-string needles were interpreted as an ASCII code
- point. An explicit call to chr() can be used to restore the previous
- behavior.
- . The needle argument for strpos(), strrpos(), stripos(), strripos(),
- strstr(), stristr() and strrchr() can now be empty.
- . The length argument for substr(), substr_count(), substr_compare(), and
- iconv_substr() can now be null. Null values will behave as if no length
- argument was provided and will therefore return the remainder of the string
- instead of an empty string.
- . The length argument for array_splice() can now be null. Null values will
- behave identically to omitting the argument, thus removing everything from
- the 'offset' to the end of the array.
- . The args argument of vsprintf(), vfprintf(), and vprintf() must now be an
- array. Previously any type was accepted.
- . The 'salt' option of password_hash() is no longer supported. If the 'salt'
- option is used a warning is generated, the provided salt is ignored, and a
- generated salt is used instead.
- . The quotemeta() function will now return an empty string if an empty string
- was passed. Previously false was returned.
- . hebrevc() has been removed.
- . convert_cyr_string() has been removed.
- . money_format() has been removed.
- . ezmlm_hash() has been removed.
- . restore_include_path() has been removed.
- . get_magic_quotes_gpc() and get_magic_quotes_runtime() has been removed.
- . FILTER_SANITIZE_MAGIC_QUOTES has been removed.
- . Calling implode() with parameters in a reverse order ($pieces, $glue) is no
- longer supported.
- . parse_url() will now distinguish absent and empty queries and fragments:
-
- http://example.com/foo => query = null, fragment = null
- http://example.com/foo? => query = "", fragment = null
- http://example.com/foo# => query = null, fragment = ""
- http://example.com/foo?# => query = "", fragment = ""
-
- Previously all cases resulted in query and fragment being null.
- . var_dump() and debug_zval_dump() will now print floating-point numbers
- using serialize_precision rather than precision. In a default configuration,
- this means that floating-point numbers are now printed with full accuracy
- by these debugging functions.
- . If the array returned by __sleep() contains non-existing properties, these
- are now silently ignored. Previously, such properties would have been
- serialized as if they had the value NULL.
- . The default locale on startup is now always "C". No locales are inherited
- from the environment by default. Previously, LC_ALL was set to "C", while
- LC_CTYPE was inherited from the environment. However, some functions did not
- respect the inherited locale without an explicit setlocale() call. An
- explicit setlocale() call is now always required if you wish to change any
- locale component from the default.
- . Removed deprecated DES fallback in crypt(). If an unknown salt format is
- passed to crypt(), the function will fail with *0 instead of falling back
- to a weak DES hash now.
- . Specifying out of range rounds for sha256/sha512 crypt() will now fail with
- *0 instead of clamping to the closest limit. This matches glibc behavior.
- . The result of sorting functions may have changed, if the array contains
- elements that compare as equal.
- . Sort comparison functions that return true or false will now throw a
- deprecation warning, and should be replaced with an implementation
- that returns an integer less than, equal to, or greater than zero.
-
- // Replace
- usort($array, fn($a, $b) => $a > $b);
- // With
- usort($array, fn($a, $b) => $a <=> $b);
-
- . Any functions accepting callbacks that are not explicitly specified to
- accept parameters by reference will now warn if a callback with reference
- parameters is used. Examples include array_filter() and array_reduce().
- This was already the case for most, but not all, functions previously.
- . The HTTP stream wrapper as used by functions like file_get_contents()
- now advertises HTTP/1.1 rather than HTTP/1.0 by default. This does not
- change the behavior of the client, but may cause servers to respond
- differently. To retain the old behavior, set the 'protocol_version'
- stream context option, e.g.
-
- $ctx = stream_context_create(['http' => ['protocol_version' => '1.0']]);
- echo file_get_contents('http://example.org', false, $ctx);
- . Calling crypt() without an explicit salt is no longer supported. If you
- would like to produce a strong hash with an auto-generated salt, use
- password_hash() instead.
- . substr(), mb_substr(), iconv_substr() and grapheme_substr() now consistently
- clamp out-of-bounds offsets to the string boundary. Previously, false was
- returned instead of the empty string in some cases.
- . Populating $http_response_header variable by the HTTP stream wrapper
- doesn't force rebuilding of symbol table anymore.
-
-- Sysvmsg:
- . msg_get_queue() will now return an SysvMessageQueue object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`.
-
-- Sysvsem:
- . sem_get() will now return an SysvSemaphore object rather than a resource.
- Return value checks using is_resource() should be replaced with checks
- for `false`.
- . The $auto_release parameter of sem_get() was changed to accept bool values
- rather than int.
-
-- Sysvshm:
- . shm_attach() will now return an SysvSharedMemory object rather than a resource.
- Return value checks using is_resource() should be replaced with checks
- for `false`.
-
-- tidy:
- . The $use_include_path parameter, which was not used internally, has been
- removed from tidy_repair_string().
- . tidy::repairString() and tidy::repairFile() became static methods
-
-- Tokenizer:
- . T_COMMENT tokens will no longer include a trailing newline. The newline will
- instead be part of a following T_WHITESPACE token. It should be noted that
- T_COMMENT is not always followed by whitespace, it may also be followed by
- T_CLOSE_TAG or end-of-file.
- . Namespaced names are now represented using the T_NAME_QUALIFIED (Foo\Bar),
- T_NAME_FULLY_QUALIFIED (\Foo\Bar) and T_NAME_RELATIVE (namespace\Foo\Bar)
- tokens. T_NS_SEPARATOR is only used for standalone namespace separators,
- and only syntactially valid in conjunction with group use declarations.
- RFC: https://wiki.php.net/rfc/namespaced_names_as_token
-
-- XML:
- . xml_parser_create(_ns) will now return an XMLParser object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`. The xml_parser_free() function no longer has an effect,
- instead the XMLParser instance is automatically destroyed if it is no longer
- referenced.
-
-- XMLReader:
- . XMLReader::open() and XMLReader::xml() are now static methods. They still
- can be called dynamically, though, but inheriting classes need to declare
- them as static if they override these methods.
-
-- XMLWriter:
- . The XMLWriter functions now accept and return, respectively, XMLWriter
- objects instead of resources.
-
-- Zip:
- . ZipArchive::OPSYS_Z_CPM has been removed (this name was a typo). Use
- ZipArchive::OPSYS_CPM instead.
-
-- Zlib:
- . gzgetss() has been removed.
- . inflate_init() will now return an InflateContext object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`.
- . deflate_init() will now return a DeflateContext object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`.
- . zlib.output_compression is no longer automatically disabled for
- Content-Type: image/*.
+ . version_compare() no longer accepts undocumented operator abbreviations.
+ . htmlspecialchars(), htmlentities(), htmlspecialchars_decode(),
+ html_entitity_decode() and get_html_translation_table() now use
+ ENT_QUOTES | ENT_SUBSTITUTE rather than ENT_COMPAT by default. This means
+ that ' is escaped to &#039; while previously it was left alone.
+ Additionally, malformed UTF-8 will be replaced by a Unicode substitution
+ character, instead of resulting in an empty string.
+ . debug_zval_dump() will now print reference wrappers with their refcount,
+ instead of only prepending a "&" to the value. This more accurately models
+ reference representation since PHP 7.0.
+ . debug_zval_dump() will not print "interned" instead of a dummy refcount of
+ one for interned strings and immutable arrays.
========================================
2. New Features
========================================
- Core:
- . Added support for union types.
- RFC: https://wiki.php.net/rfc/union_types_v2
- . Added WeakMap.
- RFC: https://wiki.php.net/rfc/weak_maps
- . Added ValueError class.
- . Any number of function parameters may now be replaced by a variadic
- argument, as long as the types are compatible. For example, the following
- code is now allowed:
-
- class A {
- public function method(int $many, string $parameters, $here) {}
- }
- class B extends A {
- public function method(...$everything) {}
- }
- . "static" (as in "late static binding") can now be used as a return type:
+ . It is now possible to specify octal integer by using the explicit "0o"/"0O"
+ prefix similar to hexadecimal ("0x"/"0X) and binary ("0b"/"0B") integer
+ literals.
+ RFC: https://wiki.php.net/rfc/explicit_octal_notation
+ . Added support for array unpacking with strings keys.
+ RFC: https://wiki.php.net/rfc/array_unpacking_string_keys
+ . Added support for enumerations.
+ RFC: https://wiki.php.net/rfc/enumerations
- class Test {
- public function create(): static {
- return new static();
- }
- }
+- Curl:
+ . Added CURLOPT_DOH_URL option.
+ . Added CURLStringFile, which can be used to post a file from a string rather
+ than a file:
- RFC: https://wiki.php.net/rfc/static_return_type
- . It is now possible to fetch the class name of an object using
- `$object::class`. The result is the same as `get_class($object)`.
- RFC: https://wiki.php.net/rfc/class_name_literal_on_object
- . New and instanceof can now be used with arbitrary expressions, using
- `new (expression)(...$args)` and `$obj instanceof (expression)`.
- RFC: https://wiki.php.net/rfc/variable_syntax_tweaks
- . Some consistency fixes to variable syntax have been applied, for example
- writing `Foo::BAR::$baz` is now allowed.
- RFC: https://wiki.php.net/rfc/variable_syntax_tweaks
- . Added Stringable interface, which is automatically implemented if a class
- defines a __toString() method.
- RFC: https://wiki.php.net/rfc/stringable
- . Traits can now define abstract private methods.
- RFC: https://wiki.php.net/rfc/abstract_trait_method_validation
- . `throw` can now be used as an expression.
- RFC: https://wiki.php.net/rfc/throw_expression
- . An optional trailing comma is now allowed in parameter lists.
- RFC: https://wiki.php.net/rfc/trailing_comma_in_parameter_list
- . It is now possible to write `catch (Exception)` to catch an exception
- without storing it in a variable.
- RFC: https://wiki.php.net/rfc/non-capturing_catches
- . Added support for mixed type
- RFC: https://wiki.php.net/rfc/mixed_type_v2
- . Added support for Attributes
- RFC: https://wiki.php.net/rfc/attributes_v2
- RFC: https://wiki.php.net/rfc/attribute_amendments
- RFC: https://wiki.php.net/rfc/shorter_attribute_syntax
- RFC: https://wiki.php.net/rfc/shorter_attribute_syntax_change
- . Added support for constructor property promotion (declaring properties in
- the constructor signature).
- RFC: https://wiki.php.net/rfc/constructor_promotion
- . Added support for `match` expression.
- RFC: https://wiki.php.net/rfc/match_expression_v2
- . Private methods declared on a parent class no longer enforce any
- inheritance rules on the methods of a child class. (with the exception of
- final private constructors)
- RFC: https://wiki.php.net/rfc/inheritance_private_methods
- . Added support for nullsafe operator (`?->`).
- RFC: https://wiki.php.net/rfc/nullsafe_operator
- . Added support for named arguments.
- RFC: https://wiki.php.net/rfc/named_params
-
-- Date:
- . Added DateTime::createFromInterface() and
- DateTimeImmutable::createFromInterface().
- . Added the DateTime format specifier "p" which is the same as "P" but
- returning "Z" for UTC.
-
-- Dom:
- . Introduce DOMParentNode and DOMChildNode with new traversal and
- manipulation APIs.
- RFC: https://wiki.php.net/rfc/dom_living_standard_api
-
-- Enchant:
- . enchant_dict_add()
- . enchant_dict_is_added()
- . LIBENCHANT_VERSION macro
+ $file = new CURLStringFile($data, 'filename.txt', 'text/plain');
+ curl_setopt($curl, CURLOPT_POSTFIELDS, ['file' => $file]);
- FPM:
- . Added a new option pm.status_listen that allows getting status from
- different endpoint (e.g. port or UDS file) which is useful for getting
- status when all children are busy with serving long running requests.
+ . Added openmetrics status format. It can be used by Prometheus to fetch FPM
+ metrics.
-- Hash:
- . HashContext objects can now be serialized.
+- hash:
+ . The following functions have changed signatures:
-- Opcache:
- . If the opcache.record_warnings ini setting is enabled, opcache will record
- compile-time warnings and replay them on the next include, even if it is
- served from cache.
+ - function hash(string $algo, string $data, bool $binary = false, array $options = []): string|false {}
+ - function hash_file(string $algo, string $filename, bool $binary = false, array $options = []): string|false {}
+ - function hash_init(string $algo, int $flags = 0, string $key = "", array $options = []): HashContext {}
-- OpenSSL:
- . Added Cryptographic Message Syntax (CMS) (RFC 5652) support composed of
- functions for encryption, decryption, signing, verifying and reading. The
- API is similar to the API for PKCS #7 functions with an addition of new
- encoding constants: OPENSSL_ENCODING_DER, OPENSSL_ENCODING_SMIME and
- OPENSSL_ENCODING_PEM.
+ The additional `$options` argument can be used to pass algorithm specific data.
-- Standard:
- . printf() and friends now support the %h and %H format specifiers. These
- are the same as %g and %G, but always use "." as the decimal separator,
- rather than determining it through the LC_NUMERIC locale.
- . printf() and friends now support using "*" as width or precision, in which
- case the width/precision is passed as an argument to printf. This also
- allows using precision -1 with %g, %G, %h and %H. For example, the following
- code can be used to reproduce PHP's default floating point formatting:
-
- printf("%.*H", (int) ini_get("precision"), $float);
- printf("%.*H", (int) ini_get("serialize_precision"), $float);
-
- . proc_open() now supports pseudo-terminal (PTY) descriptors. The following
- attaches stdin, stdout and stderr to the same PTY:
-
- $proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
-
- . proc_open() now supports socket pair descriptors. The following attaches
- a distinct socket pair to stdin, stdout and stderr:
-
- $proc = proc_open(
- $command, [['socket'], ['socket'], ['socket']], $pipes);
-
- Unlike pipes, sockets do not suffer from blocking I/O issues on Windows.
- However, not all programs may work correctly with stdio sockets.
- . Sorting functions are now stable, which means that equal-comparing elements
- will retain their original order.
- RFC: https://wiki.php.net/rfc/stable_sorting
- . array_diff(), array_intersect() and their variations can now be used with
- a single array as argument. This means that usages like the following are
- now possible:
-
- // OK even if $excludes is empty.
- array_diff($array, ...$excludes);
- // OK even if $arrays only contains a single array.
- array_intersect(...$arrays);
- . The $flag parameter of ob_implicit_flush() was changed to accept bool
- values rather than int.
-
-- Zip:
- . Extension updated to version 1.19.1
- . New ZipArchive::lastId property to get index value of last added entry.
- . Error can be checked after an archive is closed using ZipArchive::status,
- ZipArchive::statusSys properties or ZipArchive::getStatusString() method.
- . The remove_path option of ZipArchive::addGlob() and ::addPattern() is now
- treated as arbitrary string prefix (for consistency with the add_path
- option), whereas formerly it was treated as directory name.
- . Optional compression / encryption features are listed in phpinfo.
+ . Added MurmurHash3 with streaming support. The following variants are implemented:
+
+ - murmur3a, 32-bit hash
+ - murmur3c, 128-bit hash for x86
+ - murmur3f, 128-bit hash for x64
+
+ The initial hash state can be passed through the `seed` key in the `$options` array, for example:
+
+ ```php
+ $h = hash("murmur3f", $data, options: ["seed" => 42]);
+ echo $h, "\n";
+ ```
+
+ A valid seed value is within the range from 0 to the plaform defined UINT_MAX, usually 4294967295.
+
+ . Added xxHash. The implementation brings in the following arguments
+
+ - xxh32, 32-bit hash
+ - xxh64, 64-bit hash
+ - xxh3, 64-bit hash
+ - xxh128, 128-bit hash
+
+ The initial hash state can be passed through the `seed` key in the `$options` array, for example:
+
+ ```php
+ $h = hash("xxh3", $data, options: ["seed" => 42]);
+ echo $h, "\n";
+ ```
+
+ Secret usage is supported through passing the `secret` key in the `$options` array, too:
+
+ ```php
+ $h = hash("xxh3", $data, options: ["secret" => "at least 136 bytes long secret here"]);
+ echo $h, "\n";
+ ```
+
+ Note, that the quality of the custom secret is crucial for the quality of the resulting hash. It is
+ highly recommended for the secret to use the best possible entropy.
+
+- MySQLi:
+ . The mysqli.local_infile_directory ini setting has been added, which can be
+ used to specify a directory from which files are allowed to be loaded. It
+ is only meaningful if mysqli.allow_local_infile is not enabled, as all
+ directories are allowed in that case.
+
+- PDO MySQL:
+ . The PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY attribute has been added, which
+ can be used to specify a directory from which files are allowed to be
+ loaded. It is only meaningful if PDO::MYSQL_ATTR_LOCAL_INFILE is not
+ enabled, as all directories are allowed in that case.
+
+- PDO SQLite:
+ . SQLite's "file:" DSN syntax is now supported, which allows specifying
+ additional flags. This feature is not available if open_basedir is set.
+ Example:
+
+ new PDO('sqlite:file:path/to/sqlite.db?mode=ro')
+
+- Posix:
+ . Added POSIX_RLIMIT_KQUEUES and POSIX_RLIMIT_NPTS. These rlimits are only
+ available on FreeBSD.
========================================
3. Changes in SAPI modules
========================================
-- Apache:
- . The PHP module has been renamed from php7_module to php_module.
-
========================================
4. Deprecated Functionality
========================================
-- Core:
- . Declaring a required parameter after an optional one is deprecated. As an
- exception, declaring a parameter of the form "Type $param = null" before
- a required one continues to be allowed, because this pattern was sometimes
- used to achieve nullable types in older PHP versions.
-
- function test($a = [], $b) {} // Deprecated
- function test(Foo $a = null, $b) {} // Allowed
- . Calling get_defined_functions() with $exclude_disabled explicitly set to
- false is deprecated. get_defined_functions() will never include disabled
- functions.
-
-- Enchant:
- . enchant_broker_set_dict_path and enchant_broker_get_dict_path
- not available in libenchant < 1.5 nor in libenchant-2
- . enchant_dict_add_to_personal, use enchant_dict_add instead
- . enchant_dict_is_in_session, use enchant_dict_is_added instead
- . enchant_broker_free and enchant_broker_free_dict, unset the object instead
- . ENCHANT_MYSPELL and ENCHANT_ISPELL constants
-
-- LibXML:
- . libxml_disable_entity_loader() has been deprecated. As libxml 2.9.0 is now
- required, external entity loading is guaranteed to be disabled by default,
- and this function is no longer needed to protect against XXE attacks.
-
-- PGSQL / PDO PGSQL:
- . The constant PGSQL_LIBPQ_VERSION_STR has now the same value as
- PGSQL_LIBPQ_VERSION, and thus is deprecated.
- . Function aliases in the pgsql extension have been deprecated.
-
-- Zip:
- . Using empty file as ZipArchive is deprecated. Libzip 1.6.0
- do not accept empty files as valid zip archives any longer.
- Existing workaround will be removed in next version.
- . The procedural API of Zip is deprecated. Use ZipArchive instead.
-
-- Reflection:
- . ReflectionFunction::isDisabled() is deprecated, as it is no longer possible
- to create a ReflectionFunction for a disabled function. This method now
- always returns false.
- . ReflectionParameter::getClass(), ReflectionParameter::isArray(), and
- ReflectionParameter::isCallable() are deprecated.
- ReflectionParameter::getType() and the ReflectionType APIs should be used
- instead.
+- MySQLi:
+ . The mysqli_driver::$driver_version property has been deprecated. The driver
+ version is meaningless as it hasn't been updated in more than a decade. Use
+ PHP_VERSION_ID instead.
+ . Calling mysqli::get_client_info in OO style or passing $mysqli argument to
+ mysqli_get_client_info() function has been deprecated. Use
+ mysqli_get_client_info() without any arguments to obtain the client
+ library version information.
========================================
5. Changed Functions
========================================
-- Reflection:
- . ReflectionClass::getConstants and ReflectionClass::getReflectionConstants results
- can be now filtered via a new parameter `$filter`. 3 new constants were added to
- be used with it:
-
- ReflectionClassConstant::IS_PUBLIC
- ReflectionClassConstant::IS_PROTECTED
- ReflectionClassConstant::IS_PRIVATE
-
-- Zip
- . ZipArchive::addGlob and ZipArchive::addPattern methods accept more
- values in the "options" array argument:
- . flags
- . comp_method
- . comp_flags
- . env_method
- . enc_password
- . ZipArchive::addEmptyDir, ZipArchive::addFile and aZipArchive::addFromString
- methods have a new "flags" argument. This allows managing name encoding
- (ZipArchive::FL_ENC_*) and entry replacement (ZipArchive::FL_OVERWRITE)
- . ZipArchive::extractTo now restore file modification time.
+- Core:
+ . Properties order used in foreach, var_dump(), serialize(), object comparison
+ etc. was changed. Now properties are naturally ordered according to their
+ declaration and inheritance. Properties declared in a base class are going
+ to be before the child properties. This order is consistent with internal
+ layout of properies in zend_objct structure and repeats the order in
+ default_properties_table[] and properties_info_table[]. The old order was
+ not documented and was caused by class inheritance implementation details.
+
+- Filter:
+ . The FILTER_FLAG_ALLOW_OCTAL flag of the FILTER_VALIDATE_INT filter now accept
+ octal string with the leading octal prefix ("0o"/"0O")
+ RFC: https://wiki.php.net/rfc/explicit_octal_notation
+
+- GMP:
+ . All GMP function now accept octal string with the leading octal prefix ("0o"/"0O")
+ RFC: https://wiki.php.net/rfc/explicit_octal_notation
========================================
6. New Functions
========================================
- Core:
- . Added get_resource_id($resource) function, which returns the same value as
- (int) $resource. It provides the same functionality under a clearer API.
-
-- LDAP:
- . Added ldap_count_references(), which returns the number of reference
- messages in a search result.
-
-- OpenSSL:
- . Added openssl_cms_encrypt() encrypts the message in the file with the
- certificates and outputs the result to the supplied file.
- . Added openssl_cms_decrypt() that decrypts the S/MIME message in the file
- and outputs the results to the supplied file.
- . Added openssl_cms_read() that exports the CMS file to an array of PEM
- certificates.
- . Added openssl_cms_sign() that signs the MIME message in the file with
- a cert and key and output the result to the supplied file.
- . Added openssl_cms_verify() that verifies that the data block is intact,
- the signer is who they say they are, and returns the certs of the signers.
-
-- PCRE:
- . Added preg_last_error_msg(), which returns a human-readable message for
- the last PCRE error. It complements preg_last_error(), which returns an
- integer enum instead.
-
-- SQLite3:
- . Add SQLite3::setAuthorizer() and respective class constants to set a
- userland callback that will be used to authorize or not an action on the
- database.
- PR: https://github.com/php/php-src/pull/4797
-
-- Standard:
- . Added
-
- str_contains(string $haystack, string $needle): bool
- str_starts_with(string $haystack, string $needle): bool
- str_ends_with(string $haystack, string $needle): bool
-
- functions, which check whether $haystack contains, starts with or ends with
- $needle.
- RFC: https://wiki.php.net/rfc/str_contains
- RFC: https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions
- . Added fdiv() function, which performs a floating-point division under
- IEEE 754 semantics. Division by zero is considered well-defined and
- will return one of Inf, -Inf or NaN.
- . Added get_debug_type() function, which returns a type useful for error
- messages. Unlike gettype(), it uses canonical type names, returns class
- names for objects, and indicates the resource type for resources.
- RFC: https://wiki.php.net/rfc/get_debug_type
-
-- Zip:
- . ZipArchive::setMtimeName and ZipArchive::setMtimeIndex to set the
- modification time of an entry.
- . ZipArchive::registerProgressCallback to provide updates during archive close.
- . ZipArchive::registerCancelCallback to allow cancellation during archive close.
- . ZipArchive::replaceFile to replace an entry content.
- . ZipArchive::isCompressionMethodSupported to check optional compression
- features.
- . ZipArchive::isEncryptionMethodSupported to check optional encryption
- features.
+ . Added array_is_list(array $array), which will return true if the array keys are 0 .. count($array)-1 in that order.
+ RFC: https://wiki.php.net/rfc/is_list
========================================
7. New Classes and Interfaces
========================================
-- Tokenizer:
- . The new PhpToken class adds an object-based interface to the tokenizer.
- It provides a more uniform and ergonomic representation, while being more
- memory efficient and faster.
- RFC: https://wiki.php.net/rfc/token_as_object
-
========================================
8. Removed Extensions and SAPIs
========================================
-- XML-RPC:
- . The xmlrpc extension has been unbundled and moved to PECL.
- RFC: https://wiki.php.net/rfc/unbundle_xmlprc
-
========================================
9. Other Changes to Extensions
========================================
-- CURL:
- . The CURL extension now requires at least libcurl 7.29.0.
- . curl_init() will now return a CurlHandle object rather than a resource.
- Return value checks using is_resource() should be replaced with
- checks for `false`. The curl_close() function no longer has an effect,
- instead the CurlHandle instance is automatically destroyed if it is no
- longer referenced.
- . curl_multi_init() will now return a CurlMultiHandle object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`. The curl_multi_close() function no longer has an effect,
- instead the CurlMultiHandle instance is automatically destroyed if it is no
- longer referenced.
- . curl_share_init() will now return a CurlShareHandle object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`. The curl_share_close() function no longer has an effect,
- instead the CurlShareHandle instance is automatically destroyed if it is no
- longer referenced.
- . The deprecated parameter `$version` of curl_version() has been removed.
-
-- Date:
- . DatePeriod now implements IteratorAggregate (instead of Traversable).
-
-- DOM:
- . DOMNamedNodeMap now implements IteratorAggregate (instead of Traversable).
- . DOMNodeList now implements IteratorAggregate (instead of Traversable).
-
-- Intl:
- . IntlBreakIterator now implements IteratorAggregate (instead of Traversable).
- . ResourceBundle now implements IteratorAggregate (instead of Traversable).
-
-- Enchant:
- . The enchant extension now uses libenchant-2 by default when available.
- libenchant version 1 is still supported but is deprecated and could
- be removed in the future.
-
-- GD:
- . The $num_points parameter of imagepolygon(), imageopenpolygon() and
- imagefilledpolygon() is now optional, i.e. these functions may be called
- with either 3 or 4 arguments. If the arguments is omitted, it is calculated
- as count($points)/2.
- . The function imagegetinterpolation() to get the current interpolation method
- has been added.
-
-- JSON:
- . The JSON extension cannot be disabled anymore and is always an integral part
- of any PHP build, similar to the date extension.
-
-- MBString:
- . The Unicode data tables have been updated to version 13.0.0.
+- MySQLi:
+ . The mysqli_stmt::next_result() and mysqli::fetch_all() methods are now
+ available when linking against libmysqlclient.
-- PDO:
- . PDOStatement now implements IteratorAggregate (instead of Traversable).
-
-- LibXML:
- . The minimum required libxml version is now 2.9.0. This means that external
- entity loading is now guaranteed to be disabled by default, and no extra
- steps need to be taken to protect against XXE attacks.
-
-- MySQLi / PDO MySQL:
- . When mysqlnd is not used (which is the default and recommended option),
- the minimum supported libmysqlclient version is now 5.5.
- . mysqli_result now implements IteratorAggregate (instead of Traversable).
-
-- PGSQL / PDO PGSQL:
- . The PGSQL and PDO PGSQL extensions now require at least libpq 9.1.
-
-- Readline:
- . Calling readline_completion_function() before the interactive prompt starts
- (e.g. in auto_prepend_file) will now override the default interactive prompt
- completion function. Previously, readline_completion_function() only worked
- when called after starting the interactive prompt.
-
-- SimpleXML:
- . SimpleXMLElement now implements RecursiveIterator and absorbed the
- functionality of SimpleXMLIterator. SimpleXMLIterator is an empty extension
- of SimpleXMLElement.
-
-- Shmop:
- . shmop_open() will now return a Shmop object rather than a resource. Return
- value checks using is_resource() should be replaced with checks for `false`.
- The shmop_close() function no longer has an effect, and is deprecated;
- instead the Shmop instance is automatically destroyed if it is no longer
- referenced.
+- OpenSSL:
+ . The OpenSSL extension now requires at least OpenSSL version 1.0.2.
+
+- Standard:
+ . --with-password-argon2 now uses pkg-config to detect libargon2. As such,
+ an alternative libargon2 location should now be specified using
+ PKG_CONFIG_PATH.
========================================
10. New Global Constants
========================================
-- Filter:
- . FILTER_VALIDATE_BOOL has been added as an alias for FILTER_VALIDATE_BOOLEAN.
- The new name is preferred, as it uses the canonical type name.
+- MySQLi:
+ . MYSQLI_REFRESH_REPLICA has been added as a replacement for
+ MYSQLI_REFRESH_SLAVE, in line with an upstream change in MySQL. The old
+ constant is still available for backwards-compatibility reasons, but may
+ be deprecated/removed in the future.
========================================
11. Changes to INI File Handling
========================================
-- zend.exception_string_param_max_len
- . New INI directive to set the maximum string length in an argument of a
- stringified stack strace.
-
-- com.dotnet_version
- . New INI directive to choose the version of the .NET framework to use for
- dotnet objects.
-
========================================
12. Windows Support
========================================
-- Standard:
- . Program execution functions (proc_open(), exec(), popen() etc.) using the
- shell now consistently execute `%comspec% /s /c "$commandline"`, which has
- the same effect as executing `$commandline` (without additional quotes).
-
-- GD:
- . php_gd2.dll has been renamed to php_gd.dll.
-
-- php-test-pack:
- . The test runner has been renamed from run-test.php to run-tests.php, to
- match its name in php-src.
+. The macro IGNORE_URL_WIN has been removed; it had no effect as of PHP 5.0.0.
========================================
13. Other Changes
========================================
-- EBCDIC targets are no longer supported, though it's unlikely that they were
- still working in the first place.
-
========================================
14. Performance Improvements
========================================
-
-- A Just-In-Time (JIT) compiler has been added to the opcache extension.
-- array_slice() on an array without gaps will no longer scan the whole array to
- find the start offset. This may significantly reduce the runtime of the
- function with large offsets and small lengths.
-- strtolower() now uses a SIMD implementation when using the "C" LC_CTYPE
- locale (which is the default).
diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS
index c15cbef3b1..d22c88fcf3 100644
--- a/UPGRADING.INTERNALS
+++ b/UPGRADING.INTERNALS
@@ -1,461 +1,85 @@
-PHP 8.0 INTERNALS UPGRADE NOTES
+PHP 8.1 INTERNALS UPGRADE NOTES
1. Internal API changes
- a. Object Handlers API
- b. ZEND_OVERLOADED_FUNCTION and corresponding call_method() object handler
- c. TSRM changes
- d. get() and set() object handlers
- e. zend_parse_parameters 'L' specifier
- f. Arginfo argument types
- g. zend_free_op type and should_free argument of zend_get_zval_ptr()
- h. zend_value_error()
- i. get_closure() object handler
- j. compare_objects() and compare() object handlers
- k. The 'I' length modifier
- l. Some VM instructions switched to IS_TMP_VAR result instead of IS_VAR
- m. All internal functions must have arginfo
- n. zend_hash_sort compare function and zend_hash_sort signature change
- o. cast_object() object handler is now required
- p. ARG_COUNT() macro removed
- q. GC_COLLECTABLE flag
- r. Cannot implement Traversable only
- s. zend_fcall_info no_separation flag removed
- t. Signature changes
- u. Error Notification callbacks to replace zend_error_cb overwrite use-cases
- v. Removed Zend APIs
- w. Renamed Zend APIs
- x. ZEND_EXT_NOP no longer emitted
+ a. Removed Zend APIs
+ b. Zend Stream API
2. Build system changes
- a. Abstract
- b. Unix build system changes
- c. Windows build system changes
3. Module changes
+ a. ext/hash
========================
1. Internal API changes
========================
-
- a. The Object Handlers API was changed to receive zend_object* instead of
- zval* and zend_string* instead of zval* for property names. See also
- section t for other similar changes.
-
- b. ZEND_OVERLOADED_FUNCTION and corresponding call_method() object handler
- were removed. ZEND_INTERNAL_FUNCTION with ZEND_ACC_CALL_VIA_HANDLER and
- defined "handler" callback should be used instead. This "handler" callback
- should also take care about function cleanup. See ext/zend_test/test.c
- for example.
-
- c. The following things have been removed from TSRM:
- - TSRMLS_DC
- - TSRMLS_D
- - TSRMLS_CC
- - TSRMLS_C
- - TSRMLS_FETCH
- - TSRMLS_FETCH_FROM_CTX
- - TSRMLS_SET_CTX
- - tsrm_new_interpreter_context
- - tsrm_set_interpreter_context
- - tsrm_free_interpreter_context
- - support for GNUPTH, SGI ST, and BETHREADS
-
- d. The get() and set() object handlers have been removed. The get() handler
- can generally be replaced with cast_object(). Some uses of set() may be
- replaced by do_operation(). If set() was used to overload direct
- assignments using "=", then this is no longer supported and the
- functionality should be provided in some other way (for example, as
- modification of an object property).
-
- e. The zend_parse_parameters 'L' specifier and the Z_PARAM_STRICT_LONG()
- family of macros have been removed. Use 'l' and Z_PARAM_LONG() instead,
- which, despite the confusing name, actually have stricter input validation.
-
- f. Arginfo argument types for internal functions are no longer checked.
- Instead type checks should be performed using the zend_parse_parameters()
- or ZEND_PARSE_PARAMETERS_*() APIs.
-
- g. The zend_free_op type and the "should_free" and "type" arguments of
- zend_get_zval_ptr() were removed. It's possible to get the old
- "should_free" value using the following code:
-
- zval *ret = zend_get_zval_ptr(
- opline, opline->op1_type, &opline->op1, execute_data);
- zval *should_free = (op_type & (IS_TMP_VAR|IS_VAR)) ? ret : NULL;
-
- h. Added the zend_value_error() function, which is intended to be used
- to raise ValueError when inappropriate argument values are passed
- to functions.
-
- i. get_closure() object handlers now accept an additional zend_bool parameter
- `check_only`. If it is true, the handler is called to check whether the
- object is callable; in this case the handler should not throw an exception.
-
- j. compare_objects() handler was removed. Extensions should use compare() object
- handler instead and check if both arguments are objects and have the same
- compare handler, using ZEND_COMPARE_OBJECTS_FALLBACK() macro.
-
- k. The 'I' length modifier, used to denote 32 and 64bit integer from the custom
- snprintf and spprintf implementations has been removed.
- Use the ZEND_LONG_FMT, ZEND_ULONG_FMT and ZEND_XLONG_FMT macros defined in
- php-src/Zend/zend_long.h
-
- The 'v' format from the custom snprintf and spprintf implementations has
- been removed. Use the standard 's' format instead.
-
- l. Some VM instructions switched to IS_TMP_VAR result instead of IS_VAR.
- Actually, all assignments (ZEND_ASSIGN, ZEND_ASSIGN_DIM, ZEND_ASSIGN_OBJ,
- ZEND_ASSIGN_STATIC_PROP), all compound assignments (ZEND_ASSIGN_OP,
- ZEND_ASSIGN_DIM_OP, ZEND_ASSIGN_OBJ_OP, ZEND_ASSIGN_STATIC_PROP_OP) and all
- pre increments/decrements (ZEND_PRE_INC, ZEND_PRE_DEC, ZEND_PRE_INC_OBJ
- ZEND_PRE_DEC_OBJ, ZEND_PRE_INC_STATIC_PROP ZEND_PRE_DEC_STATIC_PROP).
-
- m. All internal functions and methods are now required to specify arginfo
- information, otherwise warnings will be thrown on startup.
-
- n. The zend_hash_sort and zend_hash_minmax APIs now accept a comparison
- function with the following signature:
-
- typedef int (*bucket_compare_func_t)(Bucket *a, Bucket *b);
-
- Previously compare_func_t was used, which accepted void pointers.
- Furthermore, the return type of zend_hash_sort and zend_ts_hash_sort has
- been changed from int to void; these functions always succeed.
-
- o. The cast_object() handler is now required, i.e. must be non-null. You can
- indicate that casting is not supported by always returning FAILURE.
-
- p. The ARG_COUNT() macro has been removed use ZEND_NUM_ARGS() instead.
-
- q. GC_COLLECTABLE flag was inverted into GC_NOT_COLLECTABLE.
- Assignments to GC_TYPE_INFO() might need to be changed to properly
- set the value of the GC_NOT_COLLECTABLE flag.
-
- r. Just for for userland classes, it is no longer allowed to implement only
- the Traversable interface. Instead, it is necessary to implement either
- Iterator or IteratorAggregate. You can do the latter by implementing
- zend_ce_aggregate and providing the following method implementation:
-
- ZEND_METHOD(MyClass, getIterator) {
- ZEND_PARSE_PARAMETERS_NONE();
- zend_create_internal_iterator_zval(return_value, ZEND_THIS);
- }
-
- s. The zend_fcall_info no_separation flag has been removed, and separation is
- never allowed. If you wish to pass (or allow passing) arguments by
- reference, explicitly create those arguments as references using
- ZEND_MAKE_REF. This removal also affects call_user_function_ex(), which
- should be replaced by call_user_function().
-
- t. The following ZEND_API function have changed signature:
- 1. Void in Zend Engine 4.0:
- - add_assoc_*()
- - add_index_*()
- - add_property_*()
- - object_init()
- - zend_declare_class_constant*()
- - zend_declare_property*()
- - zend_startup_modules()
- - zend_wrong_parameters_none_error()
- - zend_fcall_info_argp()
- - zend_fcall_info_argv()
- - zend_fcall_info_argn()
- - zend_startup()
- - zend_set_memory_limit()
- - pass_two()
- - zend_startup_constants()
- - zend_shutdown_constants()
- - zend_startup_extensions_mechanism()
- - zend_startup_extensions()
- - zend_register_extension()
- - highlight_string()
- - zend_ini_startup()
- - zend_ini_shutdown()
- - zend_ini_global_shutdown()
- - zend_ini_deactivate()
- - zend_copy_ini_directives()
- - zend_prepare_string_for_scanning()
- - zend_init_rsrc_list()
- - zend_list_close()
- - zend_signal()
- - zend_sigaction()
- - zend_stack_init()
- - zend_stack_del_top()
- - zend_stack_destroy()
- 2. Argument int to uint32_t in Zend Engine 4.0:
- - _zend_get_parameters_array_ex()
- - zend_copy_parameters_array()
- - zend_fcall_info_args_save()
- - zend_fcall_info_args_restore()
- - zend_fcall_info_argp()
- - zend_fcall_info_argv()
- - zend_fcall_info_argn()
- - zend_wrong_parameter*()
- - zend_wrong_callback_error()
- - zend_parse_arg_class()
- 3. Argument int to bool in Zend Engine 4.0:
- - add_next_index_bool()
- - zend_register_class_alias_ex()
- - add_assoc_bool_ex()
- - add_index_bool()
- - zend_fcall_info_args_clear()
- - zend_set_local_var()
- - zend_set_local_var_str()
- - zend_parse_arg_*()
- - shutdown_memory_manager()
- - zend_memory_usage()
- - zend_memory_peak_usage()
- - zend_mm_shutdown()
- - zend_eval_string*()
- - zend_set_timeout()
- - _zend_hash_append_ex()
- - _zend_hash_append_ptr_ex()
- - zend_alter_ini_entry_ex()
- - (*zend_encoding_list_parser) typedef
- - zend_multibyte_parse_encoding_list()
- - zend_safe_address()
- - zend_string_tolower_ex()
- - zend_string_alloc()
- - zend_string_safe_alloc()
- - zend_string_init()
- - zend_string_dup()
- - zend_string_realloc()
- - zend_string_extend()
- - zend_string_truncate()
- - zend_string_safe_realloc()
- - zend_string_release_ex()
- - zend_ts_hash_merge()
- - zend_ts_hash_sort()
- 4. Argument int to size_t in Zend Engine 4.0:
- - zend_set_hash_symbol()
- 5. Argument zval* to zend_object* in Zend Engine 4.0:
- - zend_read_property()
- - zend_update_property()
- - zend_unset_property()
- - zend_call_method()
- - zend_objects_clone_obj()
- - zend_get_closure_method_def()
- - zend_throw_exception_hook()
- - zend_throw_exception_internal()
- - zend_get_exception_base()
- 6. Argument zval* to zend_long in Zend Engine 4.0:
- - _php_math_longtobase()
- 7. Return type from int to zend_result in Zend Engine 4.0:
- - (*stream_open_function) in _zend_utility_functions
- - (*zend_post_startup_cb)
- - (*zend_preload_autoload)
- - zend_execute_scripts()
- - zend_post_startup()
- - _zend_get_parameters_array_ex()
- - zend_copy_parameters_array()
- - zend_parse_parameters()
- - zend_parse_parameters_ex()
- - zend_parse_method_parameters()
- - zend_parse_method_parameters_ex()
- - zend_parse_method_parameters()
- - zend_register_functions()
- - zend_startup_module()
- - zend_startup_module_ex()
- - zend_register_class_alias_ex()
- - zend_disable_function()
- - zend_disable_class()
- - zend_update_class_constants()
- - zend_update_static_property*()
- - object_init_ex()
- - object_and_properties_init()
- - add_index_zval()
- - add_next_index_long_*()
- - array_set_zval_key()
- - _call_user_function_impl()
- - zend_fcall_info_*()
- - zend_call_function()
- - zend_set_hash_symbol()
- - zend_delete_global_variable()
- - zend_set_local_var()
- - zend_set_local_var_str()
- - zend_forbid_dynamic_call()
- - zend_get_default_from_internal_arg_info()
- - zend_try_assign_typed_ref*()
- - zend_ast_evaluate()
- - zend_startup_builtin_functions()
- - do_bind_function()
- - do_bind_class()
- - zend_unmangle_property_name_ex()
- - zend_register_auto_global()
- - zend_register_constant()
- - zend_exception_error()
- - zend_eval_string*()
- - zend_undefined_offset_write()
- - zend_undefined_index_write()
- - zval_update_constant(_ex)()
- - zend_load_extension()
- - zend_load_extension_handle()
- - zend_hash_del(_ind)()
- - zend_hash_str_del(_ind)()
- - zend_hash_index_del()
- - zend_hash_move_forward_ex()
- - zend_hash_move_backward_ex()
- - zend_hash_get_current_key_ex()
- - zend_hash_get_current_key_type_ex()
- - zend_symtable_del(_ind)()
- - zend_symtable_str_del(_ind)()
- - highlight_file()
- - zend_do_link_class()
- - zend_alter_ini_entry*()
- - zend_restore_ini_entry()
- - zend_ini_register_displayer()
- - zend_ini_open_file_for_scanning()
- - zend_ini_prepare_string_for_scanning()
- - zend_user_it_valid()
- - zend_create_internal_iterator_zval()
- - zend_multibyte_set_filter()
- - zend_lex_tstring()
- - _zend_module_entry module_startup_func, module_shutdown_func,
- request_startup_func, request_shutdown_func, and post_deactivate_func function pointers
- - (*zend_encoding_list_parser) typedef
- - (*zend_encoding_internal_encoding_setter) typedef
- - zend_multibyte_set_functions()
- - zend_multibyte_set_script_encoding_by_string()
- - add_function()
- - sub_function()
- - mul_function()
- - pow_function()
- - div_function()
- - mod_function()
- - boolean_xor_function()
- - boolean_not_function()
- - bitwise_not_function()
- - bitwise_or_function()
- - bitwise_and_function()
- - bitwise_xor_function()
- - shift_left_function()
- - shift_right_function()
- - concat_function()
- - is_equal_function(
- - is_identical_function()
- - is_not_identical_function()
- - is_not_equal_function()
- - is_smaller_function()
- - is_smaller_or_equal_function(zv
- - increment_function()
- - decrement_function()
- - zend_stream_open()
- - zend_stream_fixup()
- - zend_ts_hash_del()
- - zend_ts_hash_index_del()
- 8. Return type from int to bool in Zend Engine 4.0:
- - zend_make_printable_zval()
- - zend_parse_arg_*()
- - is_zend_mm()
- - is_zend_ptr()
- - zend_mm_is_custom_heap()
- - (*zend_mm_chunk_truncate_t)
- - (*zend_mm_chunk_extend_t)
- - zend_bitset_empty()
- - zend_is_smart_branch()
- - zend_check_arg_send_type()
- - zend_verify_const_access()
- - zend_gdb_register_code()
- - zend_gdb_present()
- - _zend_handle_numeric_str(_ex)()
- - zend_hash_exists_ind()
- - zend_hash_str_exists_ind()
- - zend_symtable_exists(_ind)()
- - zend_symtable_str_exists()
- - (*zend_encoding_lexer_compatibility_checker)
- - zend_object_is_true()
- - i_zend_is_true()
- - zendi_smart_streq()
- - zend_stack_is_empty()
- - zend_ts_hash_exists()
- - zend_ts_hash_index_exists()
- 9. Argument void to const char* in Zend Engine 4.0:
- - zend_get_op_array_extension_handle()
- 10. Argument zend_extension to const char* in Zend Engine 4.0:
- - zend_get_resource_handle()
- 11. Argument const char * to HMODULE in Zend Engine 4.0:
- - php_win32_image_compatible()
- 12. const char * argument dropped in Zend Engine 4.0:
- - php_win32_crt_compatible()
-
- u. Instead of overwriting zend_error_cb extensions with debugging, monitoring
- use-cases catching Errors/Exceptions are strongly encouraged to use
- the new error observer API instead.
-
- Error observering callbacks are guaranteed to be called regardless of
- the users error_reporting setting or userland error handler return values.
-
- Register observer callbacks during MINIT of an extension:
-
- void my_error_observer_cb(int type,
- const char *error_filename,
- uint32_t error_lineno,
- zend_string *message) {
- }
- zend_observer_error_register(my_error_observer_cb);
-
- v. The following APIs have been removed from the Zend Engine:
- - zend_ts_hash_init_ex(), drop the last argument and use zend_ts_hash_init() instead
- - zend_hash_init_ex(), drop the last argument and use zend_hash_init() instead
- - zval_internal_dtor(), use zval_internal_ptr_dtor() instead
- - zval_dtor_func(), use rc_dtor_func() instead
- - zval_ptr_dtor_wrapper(), use zval_ptr_dtor() instead
- - zval_internal_ptr_dtor_wrapper(), use zval_internal_ptr_dtor() instead
-
- w. The following APIs have been renamed:
- - _zend_ts_hash_init() to zend_ts_hash_init()
-
- x. In COMPILE_EXTENDED_STMT mode, a ZEND_EXT_NOP opcode will no longer be
- generated at the start of a function. Use the new observer APIs or hook
- into zend_execute_ex instead.
+ a. The following APIs have been removed from the Zend Engine:
+ - The spl_ce_Aggregate, spl_ce_ArrayAccess, spl_ce_Countable, spl_ce_Iterator, spl_ce_Serializable,
+ spl_ce_Stringable, spl_ce_Traversable alias class entries have been removed in favor of zend_ce_aggregate,
+ zend_ce_arrayaccess, zend_ce_countable, zend_ce_iterator, zend_ce_serializable, zend_ce_stringable,
+ zend_ce_traversable.
+ b. Zend Stream API has been changed to use "zend_string*" instead of "char*"
+ - zend_file_handle.filename now is zend_string*
+ - zend_file_handle.free_filename is removed. Now zend_file_handle.filename is always released.
+ - added zend_file_handle.primary_script flag. SAPIs should set it for main executed script.
+ - added zend_file_handle.in_list flag, which is set when a file_handle is added into CG(open_files)
+ - added zend_stream_init_filename_ex() function, that takes filename as zend_string*
+ - the "filename" parameter of functons zend_stream_open(), php_stream_open_for_zend_ex() and
+ callback zend_stream_open_function() has been removed (it's now passed as a "filename" field of the
+ file_handle parameter)
+ - in zend_fopen() and zend_resolve_path() callbacks filename now passed as zend_string*
+ - file_handles should be destroyed by zend_destroy_file_handle() function (usually in the same function
+ the same function where they were created by zend_stream_init_*()). Previously there were two different
+ destructors zend_destroy_file_handle() and zend_file_handle_dtor().
+ - zend_ini_scanner_globals.filename now is zend_string*
========================
2. Build system changes
========================
- a. Abstract
- 1. Symbol HAVE_HASH_EXT is removed and is no longer defined. It should be
- considered to have hash extension always available since PHP 7.4.
-
- 2. Symbol HAVE_PCRE is removed and is no longer defined. It should be
- considered to have pcre extension always available since PHP 7.4.
-
- 3. Symbol HAVE_LOCALE_H has been removed and is no longer defined.
-
- 4. --disable-inline-optimization (which actually disabled all compiler
- optimizations) has been removed. If you wish to build PHP on a host
- with extremely constrained memory, and compilation fails with an "out
- of memory" message, add "-O0" to CFLAGS.
-
- 5. build system and provider are displayed in phpinfo from environment:
- - PHP_BUILD_SYSTEM (default is same as PHP_UNAME)
- - PHP_BUILD_PROVIDER (no default)
-
- b. Unix build system changes
-
- 1. --enable-maintainer-zts is renamed --enable-zts for parity with Windows
- and as recognition that ZTS is not a "maintainer" or experimental
- feature.
-
- 2. The PHP_CHECK_GCC_ARG() m4 macro has been removed in favor of
- AX_CHECK_COMPILE_FLAG().
-
- 3. The 6th argument of PHP_ADD_SOURCES_X has been removed.
-
- 4. The 'special-flags' (3rd) argument of PHP_ADD_SOURCES_X are
- now appended instead of prepended to previous compiler flags.
- This means compiler flags passed to PHP_NEW_EXTENSION and PHP_ADD_SOURCES
- are now appended, this allows to disable compiler flags set by Zend/Zend.m4
- (e.g. disable certain compiler flags enabled by -Wextra)
-
- c. Windows build system changes
-
- - The configuration option --enable-crt-debug has been removed. The VC
- debug heap can now be enabled for debug builds by setting the environment
- variable PHP_WIN32_DEBUG_HEAP to a non-negative number before PHP process
- startup.
-
========================
3. Module changes
========================
+ a. ext/hash
+ - The init signatures are extended with an additional `HashTable*`
+ argument. The passed HT is to contain the algorithm specific
+ configuration. If an algorithm doesn't make use of any additional
+ configuration, the argument is to be marked with ZEND_ATTRIBUTE_UNUSED.
+
+ b. ext/pdo
+ - The "preparer" callback now accepts a zend_string* instead of
+ char* + size_t pair the query string. Similarly, the query_string and
+ active_query_string members of pdo_stmt_t are now zend_string*.
+ - The way in which drivers provide results has changed: Previously,
+ the "describer" callback populated the "pdo_type" member in the
+ pdo_column_data structure, and the "get_col" callback then had to return
+ pointers to data of appropriate type.
+
+ In PHP 8.1, the "describer" callback no longer determines the pdo_type
+ (and this member has been removed from pdo_column_data). Instead, the
+ "get_col" callback accepts a zval pointer that may be populated with a
+ value of arbitrary type. This gives drivers more flexibility in
+ determining result types (e.g. based on whether a specific integer fits
+ the PHP integer type) and avoid awkward juggling of temporary buffers.
+
+ As the "describer" no longer determines pdo_type, the "get_column_meta"
+ function is now responsible for providing this information for use by
+ getColumnMeta(). The type provided here does not need to match the type
+ returned by get_col (in fact no corresponding type might exist, e.g. for
+ floats). It should be the closest logical equivalent for the column type.
+ - The transaction, set_attribute, and preparer handler's return type
+ has been formalized to bool instead of int.
+ - The check_liveness handler's return type has been formalized to zend_return
+ instead of int.
+ - The closer, and fetch_error handlers have been voidified.
+ - The quoter handler now returns the quoted string as zend_string* instead
+ of returning a boolean, and the quoted string as a pair of out params.
+ Similarly the unquoted string is now a zend_string* instead of a pair of
+ char* and size_t length.
+ - The doer handler now accepts a zend_string* instead of char* + size_t
+ pair for the SQL statement.
+ - The last_id handler now returns a zend_string* instead of returning a
+ char* and the length as an out param, and accepts a zend_string* instead
+ of char* for the optional sequence/table name.
+ - The php_pdo_str_tolower_dup() PDO_API has been removed use zend_str_tolower_dup()
+ or zend_string_tolower_ex().
diff --git a/Zend/Makefile.frag b/Zend/Makefile.frag
index 4160fe2b5e..e53d3fd209 100644
--- a/Zend/Makefile.frag
+++ b/Zend/Makefile.frag
@@ -32,6 +32,11 @@ $(srcdir)/zend_ini_parser.c: $(srcdir)/zend_ini_parser.y
$(srcdir)/zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l
@(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt Zend/zend_ini_scanner_defs.h -oZend/zend_ini_scanner.c Zend/zend_ini_scanner.l)
+$(srcdir)/zend_vm_execute.h $(srcdir)/zend_vm_opcodes.c: $(srcdir)/zend_vm_def.h $(srcdir)/zend_vm_execute.skl $(srcdir)/zend_vm_gen.php
+ @if test ! -z "$(PHP)"; then \
+ $(PHP) $(srcdir)/zend_vm_gen.php; \
+ fi;
+
$(builddir)/zend_highlight.lo $(builddir)/zend_compile.lo: $(srcdir)/zend_language_parser.h
Zend/zend_execute.lo: $(srcdir)/zend_vm_execute.h $(srcdir)/zend_vm_opcodes.h
diff --git a/ext/opcache/Optimizer/block_pass.c b/Zend/Optimizer/block_pass.c
index bad814ed6e..e833ff3dbf 100644
--- a/ext/opcache/Optimizer/block_pass.c
+++ b/Zend/Optimizer/block_pass.c
@@ -893,7 +893,7 @@ optimize_const_unary_op:
src = VAR_SOURCE(opline->op1);
if (src && src->opcode == ZEND_QM_ASSIGN) {
zend_op *op = src + 1;
- zend_bool optimize = 1;
+ bool optimize = 1;
while (op < opline) {
if ((op->op1_type == opline->op1_type
diff --git a/ext/opcache/Optimizer/compact_literals.c b/Zend/Optimizer/compact_literals.c
index 0e1529d2bd..55cc40afb9 100644
--- a/ext/opcache/Optimizer/compact_literals.c
+++ b/Zend/Optimizer/compact_literals.c
@@ -241,9 +241,6 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
case ZEND_RECV_INIT:
LITERAL_INFO(opline->op2.constant, LITERAL_VALUE, 1);
break;
- case ZEND_DECLARE_FUNCTION:
- LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 2);
- break;
case ZEND_DECLARE_CLASS:
case ZEND_DECLARE_CLASS_DELAYED:
LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 2);
@@ -776,7 +773,6 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
bind_var_slot[opline->op2.constant] = opline->extended_value;
}
break;
- case ZEND_DECLARE_LAMBDA_FUNCTION:
case ZEND_DECLARE_ANON_CLASS:
case ZEND_DECLARE_CLASS_DELAYED:
opline->extended_value = cache_size;
diff --git a/ext/opcache/Optimizer/compact_vars.c b/Zend/Optimizer/compact_vars.c
index bf7a005787..e70e189827 100644
--- a/ext/opcache/Optimizer/compact_vars.c
+++ b/Zend/Optimizer/compact_vars.c
@@ -16,7 +16,6 @@
+----------------------------------------------------------------------+
*/
-#include "ZendAccelerator.h"
#include "Optimizer/zend_optimizer_internal.h"
#include "zend_bitset.h"
diff --git a/ext/opcache/Optimizer/dce.c b/Zend/Optimizer/dce.c
index 91c9665d1d..940f1b6ee2 100644
--- a/ext/opcache/Optimizer/dce.c
+++ b/Zend/Optimizer/dce.c
@@ -17,7 +17,6 @@
+----------------------------------------------------------------------+
*/
-#include "ZendAccelerator.h"
#include "Optimizer/zend_optimizer_internal.h"
#include "Optimizer/zend_inference.h"
#include "Optimizer/zend_ssa.h"
@@ -60,7 +59,7 @@ typedef struct {
unsigned reorder_dtor_effects : 1;
} context;
-static inline zend_bool is_bad_mod(const zend_ssa *ssa, int use, int def) {
+static inline bool is_bad_mod(const zend_ssa *ssa, int use, int def) {
if (def < 0) {
/* This modification is not tracked by SSA, assume the worst */
return 1;
@@ -72,16 +71,17 @@ static inline zend_bool is_bad_mod(const zend_ssa *ssa, int use, int def) {
return 0;
}
-static inline zend_bool may_have_side_effects(
+static inline bool may_have_side_effects(
zend_op_array *op_array, zend_ssa *ssa,
const zend_op *opline, const zend_ssa_op *ssa_op,
- zend_bool reorder_dtor_effects) {
+ bool reorder_dtor_effects) {
switch (opline->opcode) {
case ZEND_NOP:
case ZEND_IS_IDENTICAL:
case ZEND_IS_NOT_IDENTICAL:
case ZEND_QM_ASSIGN:
case ZEND_FREE:
+ case ZEND_FE_FREE:
case ZEND_TYPE_CHECK:
case ZEND_DEFINED:
case ZEND_ADD:
@@ -246,6 +246,11 @@ static inline zend_bool may_have_side_effects(
return 0;
case ZEND_CHECK_VAR:
return (OP1_INFO() & MAY_BE_UNDEF) != 0;
+ case ZEND_FE_RESET_R:
+ case ZEND_FE_RESET_RW:
+ /* Model as not having side-effects -- let the side-effect be introduced by
+ * FE_FETCH if the array is not known to be non-empty. */
+ return (OP1_INFO() & MAY_BE_ANY) != MAY_BE_ARRAY;
default:
/* For everything we didn't handle, assume a side-effect */
return 1;
@@ -304,7 +309,7 @@ static zend_always_inline void add_phi_sources_to_worklists(context *ctx, zend_s
} FOREACH_PHI_SOURCE_END();
}
-static inline zend_bool is_var_dead(context *ctx, int var_num) {
+static inline bool is_var_dead(context *ctx, int var_num) {
zend_ssa_var *var = &ctx->ssa->vars[var_num];
if (var->definition_phi) {
return zend_bitset_in(ctx->phi_dead, var_num);
@@ -319,7 +324,7 @@ static inline zend_bool is_var_dead(context *ctx, int var_num) {
}
// Sometimes we can mark the var as EXT_UNUSED
-static zend_bool try_remove_var_def(context *ctx, int free_var, int use_chain, zend_op *opline) {
+static bool try_remove_var_def(context *ctx, int free_var, int use_chain, zend_op *opline) {
if (use_chain >= 0) {
return 0;
}
@@ -373,8 +378,23 @@ static zend_bool try_remove_var_def(context *ctx, int free_var, int use_chain, z
return 0;
}
+static inline bool is_free_of_live_var(context *ctx, zend_op *opline, zend_ssa_op *ssa_op) {
+ switch (opline->opcode) {
+ case ZEND_FREE:
+ /* It is always safe to remove FREEs of non-refcounted values, even if they are live. */
+ if (!(ctx->ssa->var_info[ssa_op->op1_use].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
+ return 0;
+ }
+ /* break missing intentionally */
+ case ZEND_FE_FREE:
+ return !is_var_dead(ctx, ssa_op->op1_use);
+ default:
+ return 0;
+ }
+}
+
/* Returns whether the instruction has been DCEd */
-static zend_bool dce_instr(context *ctx, zend_op *opline, zend_ssa_op *ssa_op) {
+static bool dce_instr(context *ctx, zend_op *opline, zend_ssa_op *ssa_op) {
zend_ssa *ssa = ctx->ssa;
int free_var = -1;
zend_uchar free_var_type;
@@ -384,9 +404,7 @@ static zend_bool dce_instr(context *ctx, zend_op *opline, zend_ssa_op *ssa_op) {
}
/* We mark FREEs as dead, but they're only really dead if the destroyed var is dead */
- if (opline->opcode == ZEND_FREE
- && (ssa->var_info[ssa_op->op1_use].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))
- && !is_var_dead(ctx, ssa_op->op1_use)) {
+ if (is_free_of_live_var(ctx, opline, ssa_op)) {
return 0;
}
@@ -464,7 +482,7 @@ static void try_remove_trivial_phi(context *ctx, zend_ssa_phi *phi) {
}
}
-static inline zend_bool may_break_varargs(const zend_op_array *op_array, const zend_ssa *ssa, const zend_ssa_op *ssa_op) {
+static inline bool may_break_varargs(const zend_op_array *op_array, const zend_ssa *ssa, const zend_ssa_op *ssa_op) {
if (ssa_op->op1_def >= 0
&& ssa->vars[ssa_op->op1_def].var < op_array->num_args) {
return 1;
@@ -480,13 +498,13 @@ static inline zend_bool may_break_varargs(const zend_op_array *op_array, const z
return 0;
}
-int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reorder_dtor_effects) {
+int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, bool reorder_dtor_effects) {
int i;
zend_ssa_phi *phi;
int removed_ops = 0;
/* DCE of CV operations that changes arguments may affect vararg functions. */
- zend_bool has_varargs = (ssa->cfg.flags & ZEND_FUNC_VARARG) != 0;
+ bool has_varargs = (ssa->cfg.flags & ZEND_FUNC_VARARG) != 0;
context ctx;
ctx.ssa = ssa;
diff --git a/ext/opcache/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c
index 0ac6c563d0..90410e5972 100644
--- a/ext/opcache/Optimizer/dfa_pass.c
+++ b/Zend/Optimizer/dfa_pass.c
@@ -280,7 +280,7 @@ static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa, zend_op
free_alloca(shiftlist, use_heap);
}
-static zend_bool safe_instanceof(zend_class_entry *ce1, zend_class_entry *ce2) {
+static bool safe_instanceof(zend_class_entry *ce1, zend_class_entry *ce2) {
if (ce1 == ce2) {
return 1;
}
@@ -291,7 +291,7 @@ static zend_bool safe_instanceof(zend_class_entry *ce1, zend_class_entry *ce2) {
return instanceof_function(ce1, ce2);
}
-static inline zend_bool can_elide_return_type_check(
+static inline bool can_elide_return_type_check(
zend_op_array *op_array, zend_ssa *ssa, zend_ssa_op *ssa_op) {
zend_arg_info *info = &op_array->arg_info[-1];
zend_ssa_var_info *use_info = &ssa->var_info[ssa_op->op1_use];
@@ -322,7 +322,7 @@ static inline zend_bool can_elide_return_type_check(
return 1;
}
-static zend_bool opline_supports_assign_contraction(
+static bool opline_supports_assign_contraction(
zend_ssa *ssa, zend_op *opline, int src_var, uint32_t cv_var) {
if (opline->opcode == ZEND_NEW) {
/* see Zend/tests/generators/aborted_yield_during_new.phpt */
@@ -380,7 +380,8 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa)
zend_op *send_array;
zend_op *send_needly;
- zend_bool strict = 0;
+ bool strict = 0;
+ ZEND_ASSERT(!call_info->is_prototype);
if (call_info->caller_init_opline->extended_value == 2) {
send_array = call_info->caller_call_opline - 1;
@@ -924,7 +925,7 @@ optimize_jmpnz:
if (opline->op1_type == IS_CONST) {
zval *zv = CT_CONSTANT_EX(op_array, opline->op1.constant);
zend_uchar type = Z_TYPE_P(zv);
- zend_bool correct_type =
+ bool correct_type =
(opline->opcode == ZEND_SWITCH_LONG && type == IS_LONG)
|| (opline->opcode == ZEND_SWITCH_STRING && type == IS_STRING)
|| (opline->opcode == ZEND_MATCH && (type == IS_LONG || type == IS_STRING));
@@ -1235,7 +1236,6 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
&& ssa->ops[op_1].op1_def == v
&& ssa->ops[op_1].op1_use >= 0
&& ssa->ops[op_1].op1_use_chain == -1
- && ssa->vars[v].use_chain >= 0
&& can_elide_return_type_check(op_array, ssa, &ssa->ops[op_1])) {
// op_1: VERIFY_RETURN_TYPE #orig_var.? [T] -> #v.? [T] => NOP
@@ -1244,10 +1244,11 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) {
int ret = ssa->vars[v].use_chain;
-
- ssa->ops[ret].op1_use = orig_var;
- ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain;
- ssa->vars[orig_var].use_chain = ret;
+ if (ret >= 0) {
+ ssa->ops[ret].op1_use = orig_var;
+ ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain;
+ ssa->vars[orig_var].use_chain = ret;
+ }
ssa->vars[v].definition = -1;
ssa->vars[v].use_chain = -1;
diff --git a/ext/opcache/Optimizer/escape_analysis.c b/Zend/Optimizer/escape_analysis.c
index a5577d5995..c0d5081c1f 100644
--- a/ext/opcache/Optimizer/escape_analysis.c
+++ b/Zend/Optimizer/escape_analysis.c
@@ -388,7 +388,7 @@ int zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array,
int ssa_vars_count = ssa->vars_count;
int i, root, use;
int *ees;
- zend_bool has_allocations;
+ bool has_allocations;
int num_non_escaped;
ALLOCA_FLAG(use_heap)
@@ -469,7 +469,7 @@ int zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array,
/* 4. Process referential dependencies */
if (num_non_escaped) {
- zend_bool changed;
+ bool changed;
do {
changed = 0;
diff --git a/ext/opcache/Optimizer/nop_removal.c b/Zend/Optimizer/nop_removal.c
index 32d2f10bf4..32d2f10bf4 100644
--- a/ext/opcache/Optimizer/nop_removal.c
+++ b/Zend/Optimizer/nop_removal.c
diff --git a/ext/opcache/Optimizer/optimize_func_calls.c b/Zend/Optimizer/optimize_func_calls.c
index b1d8f6b929..319b17438d 100644
--- a/ext/opcache/Optimizer/optimize_func_calls.c
+++ b/Zend/Optimizer/optimize_func_calls.c
@@ -39,8 +39,8 @@
typedef struct _optimizer_call_info {
zend_function *func;
zend_op *opline;
- zend_bool is_prototype;
- zend_bool try_inline;
+ bool is_prototype;
+ bool try_inline;
uint32_t func_arg_num;
} optimizer_call_info;
diff --git a/ext/opcache/Optimizer/optimize_temp_vars_5.c b/Zend/Optimizer/optimize_temp_vars_5.c
index 6f7400159d..6f7400159d 100644
--- a/ext/opcache/Optimizer/optimize_temp_vars_5.c
+++ b/Zend/Optimizer/optimize_temp_vars_5.c
diff --git a/ext/opcache/Optimizer/pass1.c b/Zend/Optimizer/pass1.c
index 74f6153670..86774afef4 100644
--- a/ext/opcache/Optimizer/pass1.c
+++ b/Zend/Optimizer/pass1.c
@@ -40,7 +40,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
{
zend_op *opline = op_array->opcodes;
zend_op *end = opline + op_array->last;
- zend_bool collect_constants = (ZEND_OPTIMIZER_PASS_15 & ctx->optimization_level)?
+ bool collect_constants = (ZEND_OPTIMIZER_PASS_15 & ctx->optimization_level)?
(op_array == &ctx->script->main_op_array) : 0;
while (opline < end) {
diff --git a/ext/opcache/Optimizer/pass3.c b/Zend/Optimizer/pass3.c
index f98c41848c..f98c41848c 100644
--- a/ext/opcache/Optimizer/pass3.c
+++ b/Zend/Optimizer/pass3.c
diff --git a/ext/opcache/Optimizer/sccp.c b/Zend/Optimizer/sccp.c
index b1979b68a8..5bcf94d144 100644
--- a/ext/opcache/Optimizer/sccp.c
+++ b/Zend/Optimizer/sccp.c
@@ -19,7 +19,6 @@
#include "php.h"
#include "zend_type_info.h"
-#include "ZendAccelerator.h"
#include "Optimizer/zend_optimizer_internal.h"
#include "Optimizer/zend_call_graph.h"
#include "Optimizer/zend_inference.h"
@@ -142,7 +141,7 @@ static void dup_partial_object(zval *dst, zval *src)
Z_ARR_P(dst) = zend_array_dup(Z_ARR_P(src));
}
-static inline zend_bool value_known(zval *zv) {
+static inline bool value_known(zval *zv) {
return !IS_TOP(zv) && !IS_BOT(zv);
}
@@ -207,7 +206,7 @@ static zval *get_op2_value(sccp_ctx *ctx, zend_op *opline, zend_ssa_op *ssa_op)
}
}
-static zend_bool can_replace_op1(
+static bool can_replace_op1(
const zend_op_array *op_array, zend_op *opline, zend_ssa_op *ssa_op) {
switch (opline->opcode) {
case ZEND_PRE_INC:
@@ -276,7 +275,7 @@ static zend_bool can_replace_op1(
return 1;
}
-static zend_bool can_replace_op2(
+static bool can_replace_op2(
const zend_op_array *op_array, zend_op *opline, zend_ssa_op *ssa_op) {
switch (opline->opcode) {
/* Do not accept CONST */
@@ -289,7 +288,7 @@ static zend_bool can_replace_op2(
return 1;
}
-static zend_bool try_replace_op1(
+static bool try_replace_op1(
sccp_ctx *ctx, zend_op *opline, zend_ssa_op *ssa_op, int var, zval *value) {
if (ssa_op->op1_use == var && can_replace_op1(ctx->scdf.op_array, opline, ssa_op)) {
zval zv;
@@ -339,7 +338,7 @@ replace_op1_simple:
return 0;
}
-static zend_bool try_replace_op2(
+static bool try_replace_op2(
sccp_ctx *ctx, zend_op *opline, zend_ssa_op *ssa_op, int var, zval *value) {
if (ssa_op->op2_use == var && can_replace_op2(ctx->scdf.op_array, opline, ssa_op)) {
zval zv;
@@ -576,9 +575,10 @@ static inline int ct_eval_add_array_unpack(zval *result, zval *array) {
SEPARATE_ARRAY(result);
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(array), key, value) {
if (key) {
- return FAILURE;
+ value = zend_hash_update(Z_ARR_P(result), key, value);
+ } else {
+ value = zend_hash_next_index_insert(Z_ARR_P(result), value);
}
- value = zend_hash_next_index_insert(Z_ARR_P(result), value);
if (!value) {
return FAILURE;
}
@@ -728,7 +728,7 @@ static inline void ct_eval_type_check(zval *result, uint32_t type_mask, zval *op
static inline int ct_eval_in_array(zval *result, uint32_t extended_value, zval *op1, zval *op2) {
HashTable *ht;
- zend_bool res;
+ bool res;
if (Z_TYPE_P(op2) != IS_ARRAY) {
return FAILURE;
@@ -781,13 +781,15 @@ static inline int ct_eval_array_key_exists(zval *result, zval *op1, zval *op2) {
return SUCCESS;
}
-static zend_bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zval **args) {
+static bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zval **args) {
/* Functions that can be evaluated independently of what the arguments are.
* It's okay if these functions throw on invalid arguments, but they should not warn. */
if (false
|| zend_string_equals_literal(name, "array_diff")
|| zend_string_equals_literal(name, "array_diff_assoc")
|| zend_string_equals_literal(name, "array_diff_key")
+ || zend_string_equals_literal(name, "array_flip")
+ || zend_string_equals_literal(name, "array_is_list")
|| zend_string_equals_literal(name, "array_key_exists")
|| zend_string_equals_literal(name, "array_keys")
|| zend_string_equals_literal(name, "array_merge")
@@ -797,8 +799,13 @@ static zend_bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zva
|| zend_string_equals_literal(name, "array_values")
|| zend_string_equals_literal(name, "base64_decode")
|| zend_string_equals_literal(name, "base64_encode")
+#ifndef ZEND_WIN32
+ /* On Windows this function may be code page dependent. */
+ || zend_string_equals_literal(name, "dirname")
+#endif
|| zend_string_equals_literal(name, "imagetypes")
|| zend_string_equals_literal(name, "in_array")
+ || zend_string_equals_literal(name, "implode")
|| zend_string_equals_literal(name, "ltrim")
|| zend_string_equals_literal(name, "php_sapi_name")
|| zend_string_equals_literal(name, "php_uname")
@@ -823,41 +830,6 @@ static zend_bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zva
return true;
}
- /* For the following functions we need to check arguments to prevent warnings during
- * evaluation. */
- if (num_args == 1) {
- if (zend_string_equals_literal(name, "array_flip")) {
- zval *entry;
-
- if (Z_TYPE_P(args[0]) != IS_ARRAY) {
- return false;
- }
- ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[0]), entry) {
- /* Throws warning for non int/string values. */
- if (Z_TYPE_P(entry) != IS_LONG && Z_TYPE_P(entry) != IS_STRING) {
- return false;
- }
- } ZEND_HASH_FOREACH_END();
- return true;
- }
- if (zend_string_equals_literal(name, "implode")) {
- zval *entry;
-
- if (Z_TYPE_P(args[0]) != IS_ARRAY) {
- return false;
- }
-
- ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[0]), entry) {
- /* May throw warning during conversion to string. */
- if (Z_TYPE_P(entry) > IS_STRING) {
- return false;
- }
- } ZEND_HASH_FOREACH_END();
- return true;
- }
- return false;
- }
-
if (num_args == 2) {
if (zend_string_equals_literal(name, "str_repeat")) {
/* Avoid creating overly large strings at compile-time. */
@@ -866,29 +838,6 @@ static zend_bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zva
&& Z_TYPE_P(args[1]) == IS_LONG
&& zend_safe_address(Z_STRLEN_P(args[0]), Z_LVAL_P(args[1]), 0, &overflow) < 64 * 1024
&& !overflow;
- } else if (zend_string_equals_literal(name, "implode")) {
- zval *entry;
-
- if ((Z_TYPE_P(args[0]) != IS_STRING || Z_TYPE_P(args[1]) != IS_ARRAY)
- && (Z_TYPE_P(args[0]) != IS_ARRAY || Z_TYPE_P(args[1]) != IS_STRING)) {
- return false;
- }
-
- /* May throw warning during conversion to string. */
- if (Z_TYPE_P(args[0]) == IS_ARRAY) {
- ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[0]), entry) {
- if (Z_TYPE_P(entry) > IS_STRING) {
- return false;
- }
- } ZEND_HASH_FOREACH_END();
- } else {
- ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[1]), entry) {
- if (Z_TYPE_P(entry) > IS_STRING) {
- return false;
- }
- } ZEND_HASH_FOREACH_END();
- }
- return true;
}
return false;
}
@@ -966,6 +915,10 @@ static inline int ct_eval_func_call(
execute_data->prev_execute_data = &dummy_frame;
EG(current_execute_data) = execute_data;
+ /* Enable suppression and counting of warnings. */
+ ZEND_ASSERT(EG(capture_warnings_during_sccp) == 0);
+ EG(capture_warnings_during_sccp) = 1;
+
EX(func) = func;
EX_NUM_ARGS() = num_args;
for (i = 0; i < num_args; i++) {
@@ -984,6 +937,12 @@ static inline int ct_eval_func_call(
retval = FAILURE;
}
+ if (EG(capture_warnings_during_sccp) > 1) {
+ zval_ptr_dtor(result);
+ retval = FAILURE;
+ }
+ EG(capture_warnings_during_sccp) = 0;
+
efree(execute_data);
EG(current_execute_data) = prev_execute_data;
return retval;
@@ -1812,7 +1771,7 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
}
/* We're only interested in functions with up to three arguments right now */
- if (call->num_args > 3 || call->send_unpack) {
+ if (call->num_args > 3 || call->send_unpack || call->is_prototype) {
SET_RESULT_BOT(result);
break;
}
@@ -1953,9 +1912,9 @@ static void sccp_mark_feasible_successors(
case ZEND_SWITCH_STRING:
case ZEND_MATCH:
{
- zend_bool strict_comparison = opline->opcode == ZEND_MATCH;
+ bool strict_comparison = opline->opcode == ZEND_MATCH;
zend_uchar type = Z_TYPE_P(op1);
- zend_bool correct_type =
+ bool correct_type =
(opline->opcode == ZEND_SWITCH_LONG && type == IS_LONG)
|| (opline->opcode == ZEND_SWITCH_STRING && type == IS_STRING)
|| (opline->opcode == ZEND_MATCH && (type == IS_LONG || type == IS_STRING));
@@ -2051,7 +2010,7 @@ static int join_partial_objects(zval *a, zval *b)
return SUCCESS;
}
-static void join_phi_values(zval *a, zval *b, zend_bool escape) {
+static void join_phi_values(zval *a, zval *b, bool escape) {
if (IS_BOT(a) || IS_TOP(b)) {
return;
}
diff --git a/ext/opcache/Optimizer/scdf.c b/Zend/Optimizer/scdf.c
index aa7ea3a1a2..e414081987 100644
--- a/ext/opcache/Optimizer/scdf.c
+++ b/Zend/Optimizer/scdf.c
@@ -16,7 +16,6 @@
+----------------------------------------------------------------------+
*/
-#include "ZendAccelerator.h"
#include "Optimizer/zend_optimizer_internal.h"
#include "Optimizer/scdf.h"
@@ -185,7 +184,7 @@ void scdf_solve(scdf_ctx *scdf, const char *name) {
/* If a live range starts in a reachable block and ends in an unreachable block, we should
* not eliminate the latter. While it cannot be reached, the FREE opcode of the loop var
* is necessary for the correctness of temporary compaction. */
-static zend_bool kept_alive_by_loop_var_free(scdf_ctx *scdf, uint32_t block_idx) {
+static bool kept_alive_by_loop_var_free(scdf_ctx *scdf, uint32_t block_idx) {
uint32_t i;
const zend_op_array *op_array = scdf->op_array;
const zend_cfg *cfg = &scdf->ssa->cfg;
diff --git a/ext/opcache/Optimizer/scdf.h b/Zend/Optimizer/scdf.h
index 64b4b61340..1ab1cec3bd 100644
--- a/ext/opcache/Optimizer/scdf.h
+++ b/Zend/Optimizer/scdf.h
@@ -89,7 +89,7 @@ static inline uint32_t scdf_edge(zend_cfg *cfg, int from, int to) {
ZEND_UNREACHABLE();
}
-static inline zend_bool scdf_is_edge_feasible(scdf_ctx *scdf, int from, int to) {
+static inline bool scdf_is_edge_feasible(scdf_ctx *scdf, int from, int to) {
uint32_t edge = scdf_edge(&scdf->ssa->cfg, from, to);
return zend_bitset_in(scdf->feasible_edges, edge);
}
diff --git a/ext/opcache/Optimizer/ssa_integrity.c b/Zend/Optimizer/ssa_integrity.c
index 5cb383c77a..4bd7705816 100644
--- a/ext/opcache/Optimizer/ssa_integrity.c
+++ b/Zend/Optimizer/ssa_integrity.c
@@ -16,13 +16,12 @@
+----------------------------------------------------------------------+
*/
-#include "ZendAccelerator.h"
#include "Optimizer/zend_optimizer_internal.h"
/* The ssa_verify_integrity() function ensures that that certain invariants of the SSA form and
* CFG are upheld and prints messages to stderr if this is not the case. */
-static inline zend_bool is_in_use_chain(zend_ssa *ssa, int var, int check) {
+static inline bool is_in_use_chain(zend_ssa *ssa, int var, int check) {
int use;
FOREACH_USE(&ssa->vars[var], use) {
if (use == check) {
@@ -32,7 +31,7 @@ static inline zend_bool is_in_use_chain(zend_ssa *ssa, int var, int check) {
return 0;
}
-static inline zend_bool is_in_phi_use_chain(zend_ssa *ssa, int var, zend_ssa_phi *check) {
+static inline bool is_in_phi_use_chain(zend_ssa *ssa, int var, zend_ssa_phi *check) {
zend_ssa_phi *phi;
FOREACH_PHI_USE(&ssa->vars[var], phi) {
if (phi == check) {
@@ -42,21 +41,21 @@ static inline zend_bool is_in_phi_use_chain(zend_ssa *ssa, int var, zend_ssa_phi
return 0;
}
-static inline zend_bool is_used_by_op(zend_ssa *ssa, int op, int check) {
+static inline bool is_used_by_op(zend_ssa *ssa, int op, int check) {
zend_ssa_op *ssa_op = &ssa->ops[op];
return (ssa_op->op1_use == check)
|| (ssa_op->op2_use == check)
|| (ssa_op->result_use == check);
}
-static inline zend_bool is_defined_by_op(zend_ssa *ssa, int op, int check) {
+static inline bool is_defined_by_op(zend_ssa *ssa, int op, int check) {
zend_ssa_op *ssa_op = &ssa->ops[op];
return (ssa_op->op1_def == check)
|| (ssa_op->op2_def == check)
|| (ssa_op->result_def == check);
}
-static inline zend_bool is_in_phi_sources(zend_ssa *ssa, zend_ssa_phi *phi, int check) {
+static inline bool is_in_phi_sources(zend_ssa *ssa, zend_ssa_phi *phi, int check) {
int source;
FOREACH_PHI_SOURCE(phi, source) {
if (source == check) {
@@ -66,7 +65,7 @@ static inline zend_bool is_in_phi_sources(zend_ssa *ssa, zend_ssa_phi *phi, int
return 0;
}
-static inline zend_bool is_in_predecessors(zend_cfg *cfg, zend_basic_block *block, int check) {
+static inline bool is_in_predecessors(zend_cfg *cfg, zend_basic_block *block, int check) {
int i, *predecessors = &cfg->predecessors[block->predecessor_offset];
for (i = 0; i < block->predecessors_count; i++) {
if (predecessors[i] == check) {
@@ -76,7 +75,7 @@ static inline zend_bool is_in_predecessors(zend_cfg *cfg, zend_basic_block *bloc
return 0;
}
-static inline zend_bool is_in_successors(zend_basic_block *block, int check) {
+static inline bool is_in_successors(zend_basic_block *block, int check) {
int s;
for (s = 0; s < block->successors_count; s++) {
if (block->successors[s] == check) {
@@ -86,7 +85,7 @@ static inline zend_bool is_in_successors(zend_basic_block *block, int check) {
return 0;
}
-static inline zend_bool is_var_type(zend_uchar type) {
+static inline bool is_var_type(zend_uchar type) {
return (type & (IS_CV|IS_VAR|IS_TMP_VAR)) != 0;
}
diff --git a/ext/opcache/Optimizer/zend_call_graph.c b/Zend/Optimizer/zend_call_graph.c
index 0fa8945f09..fb24a8d40f 100644
--- a/ext/opcache/Optimizer/zend_call_graph.c
+++ b/Zend/Optimizer/zend_call_graph.c
@@ -44,7 +44,7 @@ static void zend_op_array_collect(zend_op_array *op_array, void *context)
call_graph->op_arrays_count++;
}
-int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info)
+ZEND_API int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info)
{
zend_op *opline = op_array->opcodes;
zend_op *end = opline + op_array->last;
@@ -53,7 +53,7 @@ int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_f
int call = 0;
zend_call_info **call_stack;
ALLOCA_FLAG(use_heap);
- zend_bool is_prototype;
+ bool is_prototype;
call_stack = do_alloca((op_array->last / 2) * sizeof(zend_call_info*), use_heap);
call_info = NULL;
@@ -65,8 +65,7 @@ int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_f
call_stack[call] = call_info;
func = zend_optimizer_get_called_func(
script, op_array, opline, &is_prototype);
- /* TODO: Support prototypes? */
- if (func && !is_prototype) {
+ if (func) {
call_info = zend_arena_calloc(arena, 1, sizeof(zend_call_info) + (sizeof(zend_send_arg_info) * ((int)opline->extended_value - 1)));
call_info->caller_op_array = op_array;
call_info->caller_init_opline = opline;
@@ -74,6 +73,7 @@ int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_f
call_info->callee_func = func;
call_info->num_args = opline->extended_value;
call_info->next_callee = func_info->callee_info;
+ call_info->is_prototype = is_prototype;
func_info->callee_info = call_info;
if (build_flags & ZEND_CALL_TREE) {
@@ -194,7 +194,11 @@ static void zend_analyze_recursion(zend_call_graph *call_graph)
op_array = call_graph->op_arrays[i];
func_info = call_graph->func_infos + i;
call_info = func_info->caller_info;
- while (call_info) {
+ for (; call_info; call_info = call_info->next_caller) {
+ if (call_info->is_prototype) {
+ /* Might be calling an overridden child method and not actually recursive. */
+ continue;
+ }
if (call_info->caller_op_array == op_array) {
call_info->recursive = 1;
func_info->flags |= ZEND_FUNC_RECURSIVE | ZEND_FUNC_RECURSIVE_DIRECTLY;
@@ -205,7 +209,6 @@ static void zend_analyze_recursion(zend_call_graph *call_graph)
func_info->flags |= ZEND_FUNC_RECURSIVE | ZEND_FUNC_RECURSIVE_INDIRECTLY;
}
}
- call_info = call_info->next_caller;
}
}
@@ -219,7 +222,7 @@ static void zend_sort_op_arrays(zend_call_graph *call_graph)
// TODO: perform topological sort of cyclic call graph
}
-int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph) /* {{{ */
+ZEND_API int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph) /* {{{ */
{
call_graph->op_arrays_count = 0;
zend_foreach_op_array(script, zend_op_array_calc, call_graph);
@@ -233,7 +236,7 @@ int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_gra
}
/* }}} */
-void zend_analyze_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph) /* {{{ */
+ZEND_API void zend_analyze_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph) /* {{{ */
{
int i;
@@ -245,7 +248,7 @@ void zend_analyze_call_graph(zend_arena **arena, zend_script *script, zend_call_
}
/* }}} */
-zend_call_info **zend_build_call_map(zend_arena **arena, zend_func_info *info, const zend_op_array *op_array) /* {{{ */
+ZEND_API zend_call_info **zend_build_call_map(zend_arena **arena, zend_func_info *info, const zend_op_array *op_array) /* {{{ */
{
zend_call_info **map, *call;
if (!info->callee_info) {
diff --git a/ext/opcache/Optimizer/zend_call_graph.h b/Zend/Optimizer/zend_call_graph.h
index 28522a1277..c0699dc031 100644
--- a/ext/opcache/Optimizer/zend_call_graph.h
+++ b/Zend/Optimizer/zend_call_graph.h
@@ -34,9 +34,10 @@ struct _zend_call_info {
zend_function *callee_func;
zend_call_info *next_caller;
zend_call_info *next_callee;
- zend_bool recursive;
- zend_bool send_unpack; /* Parameters passed by SEND_UNPACK or SEND_ARRAY */
- zend_bool named_args; /* Function has named arguments */
+ bool recursive;
+ bool send_unpack; /* Parameters passed by SEND_UNPACK or SEND_ARRAY */
+ bool named_args; /* Function has named arguments */
+ bool is_prototype; /* An overridden child method may be called */
int num_args;
zend_send_arg_info arg_info[1];
};
@@ -59,10 +60,10 @@ typedef struct _zend_call_graph {
BEGIN_EXTERN_C()
-int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph);
-void zend_analyze_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph);
-zend_call_info **zend_build_call_map(zend_arena **arena, zend_func_info *info, const zend_op_array *op_array);
-int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info);
+ZEND_API int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph);
+ZEND_API void zend_analyze_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph);
+ZEND_API zend_call_info **zend_build_call_map(zend_arena **arena, zend_func_info *info, const zend_op_array *op_array);
+ZEND_API int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info);
END_EXTERN_C()
diff --git a/ext/opcache/Optimizer/zend_cfg.c b/Zend/Optimizer/zend_cfg.c
index 0560bcf2d5..973a93ef6c 100644
--- a/ext/opcache/Optimizer/zend_cfg.c
+++ b/Zend/Optimizer/zend_cfg.c
@@ -269,7 +269,7 @@ static void initialize_block(zend_basic_block *block) {
block_map[i]++; \
} while (0)
-int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg) /* {{{ */
+ZEND_API int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg) /* {{{ */
{
uint32_t flags = 0;
uint32_t i;
@@ -279,7 +279,7 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
int blocks_count = 0;
zend_basic_block *blocks;
zval *zv;
- zend_bool extra_entry_block = 0;
+ bool extra_entry_block = 0;
cfg->flags = build_flags & (ZEND_CFG_STACKLESS|ZEND_CFG_RECV_ENTRY);
@@ -599,7 +599,7 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
}
/* }}} */
-int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* {{{ */
+ZEND_API int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* {{{ */
{
int j, s, edges;
zend_basic_block *b;
@@ -682,7 +682,7 @@ static void compute_postnum_recursive(
/* Computes dominator tree using algorithm from "A Simple, Fast Dominance Algorithm" by
* Cooper, Harvey and Kennedy. */
-int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */
+ZEND_API int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */
{
zend_basic_block *blocks = cfg->blocks;
int blocks_count = cfg->blocks_count;
@@ -795,7 +795,7 @@ static void swap_blocks(block_info *a, block_info *b) {
*b = tmp;
}
-int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */
+ZEND_API int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */
{
int i, j, k, n;
int time;
diff --git a/ext/opcache/Optimizer/zend_cfg.h b/Zend/Optimizer/zend_cfg.h
index eb607c83c2..6fff720ed3 100644
--- a/ext/opcache/Optimizer/zend_cfg.h
+++ b/Zend/Optimizer/zend_cfg.h
@@ -116,11 +116,11 @@ typedef struct _zend_cfg {
BEGIN_EXTERN_C()
-int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg);
+ZEND_API int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg);
void zend_cfg_remark_reachable_blocks(const zend_op_array *op_array, zend_cfg *cfg);
-int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg);
-int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg);
-int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg);
+ZEND_API int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg);
+ZEND_API int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg);
+ZEND_API int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg);
END_EXTERN_C()
diff --git a/ext/opcache/Optimizer/zend_dfg.c b/Zend/Optimizer/zend_dfg.c
index 25a910ef71..b059f1f0ea 100644
--- a/ext/opcache/Optimizer/zend_dfg.c
+++ b/Zend/Optimizer/zend_dfg.c
@@ -242,7 +242,7 @@ add_op1_def:
}
/* }}} */
-void zend_dfg_add_use_def_op(const zend_op_array *op_array, const zend_op *opline, uint32_t build_flags, zend_bitset use, zend_bitset def) /* {{{ */
+ZEND_API void zend_dfg_add_use_def_op(const zend_op_array *op_array, const zend_op *opline, uint32_t build_flags, zend_bitset use, zend_bitset def) /* {{{ */
{
_zend_dfg_add_use_def_op(op_array, opline, build_flags, use, def);
}
diff --git a/ext/opcache/Optimizer/zend_dfg.h b/Zend/Optimizer/zend_dfg.h
index a675187794..6ec92be307 100644
--- a/ext/opcache/Optimizer/zend_dfg.h
+++ b/Zend/Optimizer/zend_dfg.h
@@ -44,7 +44,7 @@ typedef struct _zend_dfg {
BEGIN_EXTERN_C()
int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg *dfg, uint32_t build_flags);
-void zend_dfg_add_use_def_op(const zend_op_array *op_array, const zend_op *opline, uint32_t build_flags, zend_bitset use, zend_bitset def);
+ZEND_API void zend_dfg_add_use_def_op(const zend_op_array *op_array, const zend_op *opline, uint32_t build_flags, zend_bitset use, zend_bitset def);
END_EXTERN_C()
diff --git a/ext/opcache/Optimizer/zend_dump.c b/Zend/Optimizer/zend_dump.c
index cb835574d8..e75d059dab 100644
--- a/ext/opcache/Optimizer/zend_dump.c
+++ b/Zend/Optimizer/zend_dump.c
@@ -101,7 +101,7 @@ static void zend_dump_class_fetch_type(uint32_t fetch_type)
break;
}
if (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) {
- fprintf(stderr, " (no-autolod)");
+ fprintf(stderr, " (no-autoload)");
}
if (fetch_type & ZEND_FETCH_CLASS_SILENT) {
fprintf(stderr, " (silent)");
@@ -133,7 +133,7 @@ static void zend_dump_unused_op(const zend_op *opline, znode_op op, uint32_t fla
}
}
-void zend_dump_var(const zend_op_array *op_array, zend_uchar var_type, int var_num)
+ZEND_API void zend_dump_var(const zend_op_array *op_array, zend_uchar var_type, int var_num)
{
if (var_type == IS_CV && var_num < op_array->last_var) {
fprintf(stderr, "CV%d($%s)", var_num, op_array->vars[var_num]->val);
@@ -332,7 +332,7 @@ static void zend_dump_ssa_var_info(const zend_ssa *ssa, int ssa_var_num, uint32_
dump_flags);
}
-void zend_dump_ssa_var(const zend_op_array *op_array, const zend_ssa *ssa, int ssa_var_num, zend_uchar var_type, int var_num, uint32_t dump_flags)
+ZEND_API void zend_dump_ssa_var(const zend_op_array *op_array, const zend_ssa *ssa, int ssa_var_num, zend_uchar var_type, int var_num, uint32_t dump_flags)
{
if (ssa_var_num >= 0) {
fprintf(stderr, "#%d.", ssa_var_num);
@@ -405,7 +405,7 @@ static void zend_dump_range_constraint(const zend_op_array *op_array, const zend
}
}
-void zend_dump_op(const zend_op_array *op_array, const zend_basic_block *b, const zend_op *opline, uint32_t dump_flags, const zend_ssa *ssa, const zend_ssa_op *ssa_op)
+ZEND_API void zend_dump_op(const zend_op_array *op_array, const zend_basic_block *b, const zend_op *opline, uint32_t dump_flags, const zend_ssa *ssa, const zend_ssa_op *ssa_op)
{
const char *name = zend_get_opcode_name(opline->opcode);
uint32_t flags = zend_get_opcode_flags(opline->opcode);
@@ -881,7 +881,7 @@ void zend_dump_op_array_name(const zend_op_array *op_array)
}
}
-void zend_dump_op_array(const zend_op_array *op_array, uint32_t dump_flags, const char *msg, const void *data)
+ZEND_API void zend_dump_op_array(const zend_op_array *op_array, uint32_t dump_flags, const char *msg, const void *data)
{
int i;
const zend_cfg *cfg = NULL;
diff --git a/ext/opcache/Optimizer/zend_dump.h b/Zend/Optimizer/zend_dump.h
index 3d8ff7ad7a..b0e0d7966b 100644
--- a/ext/opcache/Optimizer/zend_dump.h
+++ b/Zend/Optimizer/zend_dump.h
@@ -30,15 +30,15 @@
BEGIN_EXTERN_C()
-void zend_dump_op_array(const zend_op_array *op_array, uint32_t dump_flags, const char *msg, const void *data);
-void zend_dump_op(const zend_op_array *op_array, const zend_basic_block *b, const zend_op *opline, uint32_t dump_flags, const zend_ssa *ssa, const zend_ssa_op *ssa_op);
+ZEND_API void zend_dump_op_array(const zend_op_array *op_array, uint32_t dump_flags, const char *msg, const void *data);
+ZEND_API void zend_dump_op(const zend_op_array *op_array, const zend_basic_block *b, const zend_op *opline, uint32_t dump_flags, const zend_ssa *ssa, const zend_ssa_op *ssa_op);
void zend_dump_dominators(const zend_op_array *op_array, const zend_cfg *cfg);
void zend_dump_dfg(const zend_op_array *op_array, const zend_cfg *cfg, const zend_dfg *dfg);
void zend_dump_phi_placement(const zend_op_array *op_array, const zend_ssa *ssa);
void zend_dump_variables(const zend_op_array *op_array);
void zend_dump_ssa_variables(const zend_op_array *op_array, const zend_ssa *ssa, uint32_t dump_flags);
-void zend_dump_ssa_var(const zend_op_array *op_array, const zend_ssa *ssa, int ssa_var_num, zend_uchar var_type, int var_num, uint32_t dump_flags);
-void zend_dump_var(const zend_op_array *op_array, zend_uchar var_type, int var_num);
+ZEND_API void zend_dump_ssa_var(const zend_op_array *op_array, const zend_ssa *ssa, int ssa_var_num, zend_uchar var_type, int var_num, uint32_t dump_flags);
+ZEND_API void zend_dump_var(const zend_op_array *op_array, zend_uchar var_type, int var_num);
void zend_dump_op_array_name(const zend_op_array *op_array);
void zend_dump_const(const zval *zv);
void zend_dump_ht(HashTable *ht);
diff --git a/ext/opcache/Optimizer/zend_func_info.c b/Zend/Optimizer/zend_func_info.c
index bfbc78fdb2..22f22f77a7 100644
--- a/ext/opcache/Optimizer/zend_func_info.c
+++ b/Zend/Optimizer/zend_func_info.c
@@ -504,7 +504,6 @@ static const func_info_t func_infos[] = {
F1("curl_init", MAY_BE_FALSE | MAY_BE_OBJECT),
F1("curl_copy_handle", MAY_BE_FALSE | MAY_BE_OBJECT),
F1("curl_version", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY),
- F1("curl_getinfo", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING | MAY_BE_LONG | MAY_BE_DOUBLE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY),
F1("curl_error", MAY_BE_STRING),
F1("curl_strerror", MAY_BE_NULL | MAY_BE_STRING),
F1("curl_multi_strerror", MAY_BE_NULL | MAY_BE_STRING),
@@ -776,7 +775,7 @@ static const func_info_t func_infos[] = {
#endif
/* ext/fileinfo */
- F1("finfo_open", MAY_BE_FALSE | MAY_BE_RESOURCE),
+ F1("finfo_open", MAY_BE_FALSE | MAY_BE_OBJECT),
F1("finfo_file", MAY_BE_FALSE | MAY_BE_STRING),
F1("finfo_buffer", MAY_BE_FALSE | MAY_BE_STRING),
F1("mime_content_type", MAY_BE_FALSE | MAY_BE_STRING),
@@ -838,7 +837,7 @@ static const func_info_t func_infos[] = {
};
static HashTable func_info;
-int zend_func_info_rid = -1;
+ZEND_API int zend_func_info_rid = -1;
static uint32_t get_internal_func_info(
const zend_call_info *call_info, const zend_ssa *ssa, zend_string *lcname) {
@@ -860,9 +859,9 @@ static uint32_t get_internal_func_info(
}
}
-uint32_t zend_get_func_info(
+ZEND_API uint32_t zend_get_func_info(
const zend_call_info *call_info, const zend_ssa *ssa,
- zend_class_entry **ce, zend_bool *ce_is_instanceof)
+ zend_class_entry **ce, bool *ce_is_instanceof)
{
uint32_t ret = 0;
const zend_function *callee_func = call_info->callee_func;
@@ -879,19 +878,8 @@ uint32_t zend_get_func_info(
}
#endif
- if (callee_func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
- ret = zend_fetch_arg_info_type(NULL, callee_func->common.arg_info - 1, ce);
- *ce_is_instanceof = 1;
- } else {
-#if 0
- fprintf(stderr, "Unknown internal function '%s'\n", func->common.function_name);
-#endif
- ret = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF
- | MAY_BE_RC1 | MAY_BE_RCN;
- }
- if (callee_func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
- ret |= MAY_BE_REF;
- }
+ ret = zend_get_return_info_from_signature_only(
+ callee_func, /* script */ NULL, ce, ce_is_instanceof);
#if ZEND_DEBUG
if (internal_ret) {
@@ -920,21 +908,18 @@ uint32_t zend_get_func_info(
}
#endif
} else {
- // FIXME: the order of functions matters!!!
- zend_func_info *info = ZEND_FUNC_INFO((zend_op_array*)callee_func);
- if (info) {
- ret = info->return_info.type;
- *ce = info->return_info.ce;
- *ce_is_instanceof = info->return_info.is_instanceof;
+ if (!call_info->is_prototype) {
+ // FIXME: the order of functions matters!!!
+ zend_func_info *info = ZEND_FUNC_INFO((zend_op_array*)callee_func);
+ if (info) {
+ ret = info->return_info.type;
+ *ce = info->return_info.ce;
+ *ce_is_instanceof = info->return_info.is_instanceof;
+ }
}
if (!ret) {
- ret = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF
- | MAY_BE_RC1 | MAY_BE_RCN;
- /* For generators RETURN_REFERENCE refers to the yielded values. */
- if ((callee_func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
- && !(callee_func->common.fn_flags & ZEND_ACC_GENERATOR)) {
- ret |= MAY_BE_REF;
- }
+ ret = zend_get_return_info_from_signature_only(
+ callee_func, /* TODO: script */ NULL, ce, ce_is_instanceof);
}
}
return ret;
diff --git a/ext/opcache/Optimizer/zend_func_info.h b/Zend/Optimizer/zend_func_info.h
index 13dd2e3127..53ad99c22e 100644
--- a/ext/opcache/Optimizer/zend_func_info.h
+++ b/Zend/Optimizer/zend_func_info.h
@@ -54,11 +54,11 @@ typedef struct _zend_call_info zend_call_info;
BEGIN_EXTERN_C()
-extern int zend_func_info_rid;
+extern ZEND_API int zend_func_info_rid;
-uint32_t zend_get_func_info(
+ZEND_API uint32_t zend_get_func_info(
const zend_call_info *call_info, const zend_ssa *ssa,
- zend_class_entry **ce, zend_bool *ce_is_instanceof);
+ zend_class_entry **ce, bool *ce_is_instanceof);
int zend_func_info_startup(void);
int zend_func_info_shutdown(void);
diff --git a/ext/opcache/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c
index 9907920008..8ba67a4dab 100644
--- a/ext/opcache/Optimizer/zend_inference.c
+++ b/Zend/Optimizer/zend_inference.c
@@ -61,7 +61,7 @@
/* Pop elements in unspecified order from worklist until it is empty */
#define WHILE_WORKLIST(worklist, len, i) do { \
- zend_bool _done = 0; \
+ bool _done = 0; \
while (!_done) { \
_done = 1; \
ZEND_BITSET_FOREACH(worklist, len, i) { \
@@ -158,12 +158,12 @@
} \
} while (0)
-static inline zend_bool add_will_overflow(zend_long a, zend_long b) {
+static inline bool add_will_overflow(zend_long a, zend_long b) {
return (b > 0 && a > ZEND_LONG_MAX - b)
|| (b < 0 && a < ZEND_LONG_MIN - b);
}
#if 0
-static inline zend_bool sub_will_overflow(zend_long a, zend_long b) {
+static inline bool sub_will_overflow(zend_long a, zend_long b) {
return (b > 0 && a < ZEND_LONG_MIN + b)
|| (b < 0 && a > ZEND_LONG_MAX + b);
}
@@ -207,7 +207,7 @@ static void zend_ssa_check_scc_var(const zend_op_array *op_array, zend_ssa *ssa,
}
/* }}} */
-int zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
+ZEND_API int zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
{
int index = 0, *dfs, *root;
zend_worklist_stack stack;
@@ -253,7 +253,7 @@ int zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
}
/* }}} */
-int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
+ZEND_API int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
{
zend_ssa_var *ssa_vars = ssa->vars;
zend_ssa_op *ssa_ops = ssa->ops;
@@ -513,7 +513,7 @@ static void zend_ssa_range_and(zend_long a, zend_long b, zend_long c, zend_long
}
}
-static inline zend_bool zend_abs_range(
+static inline bool zend_abs_range(
zend_long min, zend_long max, zend_long *abs_min, zend_long *abs_max) {
if (min == ZEND_LONG_MIN) {
/* Cannot take absolute value of LONG_MIN */
@@ -539,7 +539,7 @@ static inline zend_long safe_shift_left(zend_long n, zend_long s) {
return (zend_long) ((zend_ulong) n << (zend_ulong) s);
}
-static inline zend_bool shift_left_overflows(zend_long n, zend_long s) {
+static inline bool shift_left_overflows(zend_long n, zend_long s) {
/* This considers shifts that shift in the sign bit to be overflowing as well */
if (n >= 0) {
return s >= SIZEOF_ZEND_LONG * 8 - 1 || safe_shift_left(n, s) < n;
@@ -1003,7 +1003,7 @@ int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int
return zend_inference_propagate_range(op_array, ssa, opline, ssa_op, var, tmp);
}
-int zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp)
+ZEND_API int zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp)
{
zend_long op1_min, op2_min, op1_max, op2_max;
@@ -1504,7 +1504,7 @@ int zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa,
return 0;
}
-void zend_inference_init_range(const zend_op_array *op_array, zend_ssa *ssa, int var, zend_bool underflow, zend_long min, zend_long max, zend_bool overflow)
+void zend_inference_init_range(const zend_op_array *op_array, zend_ssa *ssa, int var, bool underflow, zend_long min, zend_long max, bool overflow)
{
if (underflow) {
min = ZEND_LONG_MIN;
@@ -1955,7 +1955,7 @@ static void emit_type_narrowing_warning(const zend_op_array *op_array, zend_ssa
zend_error(E_WARNING, "Narrowing occurred during type inference of %s. Please file a bug report on bugs.php.net", def_op_name);
}
-uint32_t zend_array_element_type(uint32_t t1, zend_uchar op_type, int write, int insert)
+ZEND_API uint32_t zend_array_element_type(uint32_t t1, zend_uchar op_type, int write, int insert)
{
uint32_t tmp = 0;
@@ -2198,7 +2198,7 @@ static uint32_t zend_convert_type_declaration_mask(uint32_t type_mask) {
return result_mask;
}
-uint32_t zend_fetch_arg_info_type(const zend_script *script, zend_arg_info *arg_info, zend_class_entry **pce)
+ZEND_API uint32_t zend_fetch_arg_info_type(const zend_script *script, zend_arg_info *arg_info, zend_class_entry **pce)
{
uint32_t tmp;
@@ -2345,7 +2345,7 @@ static zend_always_inline int _zend_update_type_info(
zend_ssa_op *ssa_op,
const zend_op **ssa_opcodes,
zend_long optimization_level,
- zend_bool update_worklist)
+ bool update_worklist)
{
uint32_t t1, t2;
uint32_t tmp, orig;
@@ -3162,12 +3162,9 @@ static zend_always_inline int _zend_update_type_info(
case ZEND_ADD_ARRAY_UNPACK:
tmp = ssa_var_info[ssa_op->result_use].type;
ZEND_ASSERT(tmp & MAY_BE_ARRAY);
- /* Ignore string keys as they will throw. */
- if (t1 & MAY_BE_ARRAY_KEY_LONG) {
- tmp |= MAY_BE_ARRAY_KEY_LONG | (t1 & (MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF));
- }
+ tmp |= t1 & (MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF);
if (t1 & MAY_BE_OBJECT) {
- tmp |= MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_ANY;
+ tmp |= MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY;
}
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
break;
@@ -3478,7 +3475,7 @@ static zend_always_inline int _zend_update_type_info(
}
zend_class_entry *ce;
- zend_bool ce_is_instanceof;
+ bool ce_is_instanceof;
tmp = zend_get_func_info(call_info, ssa, &ce, &ce_is_instanceof);
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
if (ce) {
@@ -3488,7 +3485,7 @@ static zend_always_inline int _zend_update_type_info(
break;
case ZEND_FETCH_CONSTANT:
case ZEND_FETCH_CLASS_CONSTANT:
- UPDATE_SSA_TYPE(MAY_BE_RC1|MAY_BE_RCN|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_STRING|MAY_BE_RESOURCE|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY, ssa_op->result_def);
+ UPDATE_SSA_TYPE(MAY_BE_RC1|MAY_BE_RCN|MAY_BE_ANY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY, ssa_op->result_def);
break;
case ZEND_STRLEN:
tmp = MAY_BE_LONG;
@@ -3522,6 +3519,12 @@ static zend_always_inline int _zend_update_type_info(
} else {
zend_arg_info *ret_info = op_array->arg_info - 1;
tmp = zend_fetch_arg_info_type(script, ret_info, &ce);
+
+ // TODO: We could model more precisely how illegal types are converted.
+ uint32_t extra_types = t1 & ~tmp;
+ if (!extra_types) {
+ tmp &= t1;
+ }
}
if (opline->op1_type & (IS_TMP_VAR|IS_VAR|IS_CV)) {
UPDATE_SSA_TYPE(tmp, ssa_op->op1_def);
@@ -3595,7 +3598,7 @@ unknown_opcode:
return SUCCESS;
}
-int zend_update_type_info(
+ZEND_API int zend_update_type_info(
const zend_op_array *op_array,
zend_ssa *ssa,
const zend_script *script,
@@ -3661,7 +3664,7 @@ int zend_infer_types_ex(const zend_op_array *op_array, const zend_script *script
int ssa_vars_count = ssa->vars_count;
int i, j;
uint32_t tmp, worklist_len = zend_bitset_len(ssa_vars_count);
- zend_bool update_worklist = 1;
+ bool update_worklist = 1;
while (!zend_bitset_empty(worklist, worklist_len)) {
j = zend_bitset_first(worklist, worklist_len);
@@ -3732,18 +3735,18 @@ int zend_infer_types_ex(const zend_op_array *op_array, const zend_script *script
return SUCCESS;
}
-static zend_bool is_narrowable_instr(zend_op *opline) {
+static bool is_narrowable_instr(zend_op *opline) {
return opline->opcode == ZEND_ADD || opline->opcode == ZEND_SUB
|| opline->opcode == ZEND_MUL || opline->opcode == ZEND_DIV;
}
-static zend_bool is_effective_op1_double_cast(zend_op *opline, zval *op2) {
+static bool is_effective_op1_double_cast(zend_op *opline, zval *op2) {
return (opline->opcode == ZEND_ADD && Z_LVAL_P(op2) == 0)
|| (opline->opcode == ZEND_SUB && Z_LVAL_P(op2) == 0)
|| (opline->opcode == ZEND_MUL && Z_LVAL_P(op2) == 1)
|| (opline->opcode == ZEND_DIV && Z_LVAL_P(op2) == 1);
}
-static zend_bool is_effective_op2_double_cast(zend_op *opline, zval *op1) {
+static bool is_effective_op2_double_cast(zend_op *opline, zval *op1) {
/* In PHP it holds that (double)(0-$int) is bitwise identical to 0.0-(double)$int,
* so allowing SUB here is fine. */
return (opline->opcode == ZEND_ADD && Z_LVAL_P(op1) == 0)
@@ -3770,7 +3773,7 @@ static zend_bool is_effective_op2_double_cast(zend_op *opline, zval *op1) {
* avoid infinite loops. An iterative, worklist driven approach would be possible, but the state
* management more cumbersome to implement, so we don't bother for now.
*/
-static zend_bool can_convert_to_double(
+static bool can_convert_to_double(
const zend_op_array *op_array, zend_ssa *ssa, int var_num,
zval *value, zend_bitset visited) {
zend_ssa_var *var = &ssa->vars[var_num];
@@ -3908,7 +3911,7 @@ static int zend_type_narrowing(const zend_op_array *op_array, const zend_script
zend_bitset visited, worklist;
int i, v;
zend_op *opline;
- zend_bool narrowed = 0;
+ bool narrowed = 0;
ALLOCA_FLAG(use_heap)
visited = ZEND_BITSET_ALLOCA(2 * bitset_len, use_heap);
@@ -3976,19 +3979,38 @@ static int is_recursive_tail_call(const zend_op_array *op_array,
return 0;
}
-void zend_init_func_return_info(const zend_op_array *op_array,
- const zend_script *script,
- zend_ssa_var_info *ret)
+uint32_t zend_get_return_info_from_signature_only(
+ const zend_function *func, const zend_script *script,
+ zend_class_entry **ce, bool *ce_is_instanceof) {
+ uint32_t type;
+ if (func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+ zend_arg_info *ret_info = func->common.arg_info - 1;
+ type = zend_fetch_arg_info_type(script, ret_info, ce);
+ *ce_is_instanceof = ce != NULL;
+ } else {
+ type = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF
+ | MAY_BE_RC1 | MAY_BE_RCN;
+ *ce = NULL;
+ *ce_is_instanceof = false;
+ }
+
+ /* For generators RETURN_REFERENCE refers to the yielded values. */
+ if ((func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+ && !(func->common.fn_flags & ZEND_ACC_GENERATOR)) {
+ type |= MAY_BE_REF;
+ }
+ return type;
+}
+
+ZEND_API void zend_init_func_return_info(
+ const zend_op_array *op_array, const zend_script *script, zend_ssa_var_info *ret)
{
if (op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
- zend_arg_info *ret_info = op_array->arg_info - 1;
zend_ssa_range tmp_range = {0, 0, 0, 0};
-
- ret->type = zend_fetch_arg_info_type(script, ret_info, &ret->ce);
- if (op_array->fn_flags & ZEND_ACC_RETURN_REFERENCE) {
- ret->type |= MAY_BE_REF;
- }
- ret->is_instanceof = (ret->ce) ? 1 : 0;
+ bool is_instanceof = false;
+ ret->type = zend_get_return_info_from_signature_only(
+ (zend_function *) op_array, script, &ret->ce, &is_instanceof);
+ ret->is_instanceof = is_instanceof;
ret->range = tmp_range;
ret->has_range = 0;
}
@@ -4023,6 +4045,12 @@ void zend_func_return_info(const zend_op_array *op_array,
return;
}
+ if (!ret->type) {
+ /* We will intersect the type later. */
+ ret->type = MAY_BE_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_KEY_ANY
+ | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF;
+ }
+
for (j = 0; j < blocks_count; j++) {
if ((blocks[j].flags & ZEND_BB_REACHABLE) && blocks[j].len != 0) {
zend_op *opline = op_array->opcodes + blocks[j].start + blocks[j].len - 1;
@@ -4182,10 +4210,10 @@ void zend_func_return_info(const zend_op_array *op_array,
if (tmp_has_range < 0) {
tmp_has_range = 0;
}
- ret->type = tmp;
ret->ce = tmp_ce;
ret->is_instanceof = tmp_is_instanceof;
}
+ ret->type &= tmp;
ret->range = tmp_range;
ret->has_range = tmp_has_range;
}
@@ -4223,7 +4251,7 @@ static int zend_infer_types(const zend_op_array *op_array, const zend_script *sc
return SUCCESS;
}
-int zend_ssa_inference(zend_arena **arena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level) /* {{{ */
+ZEND_API int zend_ssa_inference(zend_arena **arena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level) /* {{{ */
{
zend_ssa_var_info *ssa_var_info;
int i;
@@ -4295,7 +4323,7 @@ void zend_inference_check_recursive_dependencies(zend_op_array *op_array)
free_alloca(worklist, use_heap);
}
-int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, uint32_t t1, uint32_t t2)
+ZEND_API int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, uint32_t t1, uint32_t t2)
{
if (opline->op1_type == IS_CV) {
if (t1 & MAY_BE_UNDEF) {
@@ -4390,6 +4418,7 @@ int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const ze
case ZEND_BEGIN_SILENCE:
case ZEND_END_SILENCE:
case ZEND_FREE:
+ case ZEND_FE_FREE:
case ZEND_SEPARATE:
case ZEND_TYPE_CHECK:
case ZEND_DEFINED:
@@ -4673,7 +4702,7 @@ int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const ze
}
}
-int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa)
+ZEND_API int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa)
{
return zend_may_throw_ex(opline, ssa_op, op_array, ssa, OP1_INFO(), OP2_INFO());
}
diff --git a/ext/opcache/Optimizer/zend_inference.h b/Zend/Optimizer/zend_inference.h
index 212679df5e..35af4d8823 100644
--- a/ext/opcache/Optimizer/zend_inference.h
+++ b/Zend/Optimizer/zend_inference.h
@@ -40,7 +40,7 @@
|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE)
#define DEFINE_SSA_OP_HAS_RANGE(opN) \
- static zend_always_inline zend_bool _ssa_##opN##_has_range(const zend_op_array *op_array, const zend_ssa *ssa, const zend_op *opline, const zend_ssa_op *ssa_op) \
+ static zend_always_inline bool _ssa_##opN##_has_range(const zend_op_array *op_array, const zend_ssa *ssa, const zend_op *opline, const zend_ssa_op *ssa_op) \
{ \
if (opline->opN##_type == IS_CONST) { \
zval *zv = CRT_CONSTANT(opline->opN); \
@@ -239,53 +239,52 @@ DEFINE_SSA_OP_DEF_INFO(result)
#define OP2_DATA_DEF_INFO() (_ssa_op2_def_info(op_array, ssa, (opline+1), (ssa_op+1)))
#define RES_INFO() (_ssa_result_def_info(op_array, ssa, opline, ssa_op))
-static zend_always_inline zend_bool zend_add_will_overflow(zend_long a, zend_long b) {
+static zend_always_inline bool zend_add_will_overflow(zend_long a, zend_long b) {
return (b > 0 && a > ZEND_LONG_MAX - b)
|| (b < 0 && a < ZEND_LONG_MIN - b);
}
-static zend_always_inline zend_bool zend_sub_will_overflow(zend_long a, zend_long b) {
+static zend_always_inline bool zend_sub_will_overflow(zend_long a, zend_long b) {
return (b > 0 && a < ZEND_LONG_MIN + b)
|| (b < 0 && a > ZEND_LONG_MAX + b);
}
BEGIN_EXTERN_C()
-int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa);
-int zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa);
-int zend_ssa_inference(zend_arena **raena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level);
+ZEND_API int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa);
+ZEND_API int zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa);
+ZEND_API int zend_ssa_inference(zend_arena **raena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level);
-uint32_t zend_array_element_type(uint32_t t1, zend_uchar op_type, int write, int insert);
+ZEND_API uint32_t zend_array_element_type(uint32_t t1, zend_uchar op_type, int write, int insert);
int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int var, int widening, int narrowing, zend_ssa_range *tmp);
-int zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp);
-void zend_inference_init_range(const zend_op_array *op_array, zend_ssa *ssa, int var, zend_bool underflow, zend_long min, zend_long max, zend_bool overflow);
+ZEND_API int zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp);
+void zend_inference_init_range(const zend_op_array *op_array, zend_ssa *ssa, int var, bool underflow, zend_long min, zend_long max, bool overflow);
int zend_inference_narrowing_meet(zend_ssa_var_info *var_info, zend_ssa_range *r);
int zend_inference_widening_meet(zend_ssa_var_info *var_info, zend_ssa_range *r);
void zend_inference_check_recursive_dependencies(zend_op_array *op_array);
int zend_infer_types_ex(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_bitset worklist, zend_long optimization_level);
-uint32_t zend_fetch_arg_info_type(
+ZEND_API uint32_t zend_fetch_arg_info_type(
const zend_script *script, zend_arg_info *arg_info, zend_class_entry **pce);
-void zend_init_func_return_info(const zend_op_array *op_array,
- const zend_script *script,
- zend_ssa_var_info *ret);
+ZEND_API void zend_init_func_return_info(
+ const zend_op_array *op_array, const zend_script *script, zend_ssa_var_info *ret);
+uint32_t zend_get_return_info_from_signature_only(
+ const zend_function *func, const zend_script *script,
+ zend_class_entry **ce, bool *ce_is_instanceof);
void zend_func_return_info(const zend_op_array *op_array,
const zend_script *script,
int recursive,
int widening,
zend_ssa_var_info *ret);
-int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, uint32_t t1, uint32_t t2);
-int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa);
+ZEND_API int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, uint32_t t1, uint32_t t2);
+ZEND_API int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa);
-int zend_update_type_info(const zend_op_array *op_array,
- zend_ssa *ssa,
- const zend_script *script,
- zend_op *opline,
- zend_ssa_op *ssa_op,
- const zend_op **ssa_opcodes,
- zend_long optimization_level);
+ZEND_API int zend_update_type_info(
+ const zend_op_array *op_array, zend_ssa *ssa, const zend_script *script,
+ zend_op *opline, zend_ssa_op *ssa_op, const zend_op **ssa_opcodes,
+ zend_long optimization_level);
END_EXTERN_C()
diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c
index c80992ed8d..d6f27b19e6 100644
--- a/ext/opcache/Optimizer/zend_optimizer.c
+++ b/Zend/Optimizer/zend_optimizer.c
@@ -785,7 +785,7 @@ static zend_class_entry *get_class_entry_from_op1(
}
zend_function *zend_optimizer_get_called_func(
- zend_script *script, zend_op_array *op_array, zend_op *opline, zend_bool *is_prototype)
+ zend_script *script, zend_op_array *op_array, zend_op *opline, bool *is_prototype)
{
*is_prototype = 0;
switch (opline->opcode) {
@@ -832,8 +832,8 @@ zend_function *zend_optimizer_get_called_func(
zend_string *func_name = Z_STR_P(CRT_CONSTANT(opline->op2) + 1);
zend_function *fbc = zend_hash_find_ptr(&ce->function_table, func_name);
if (fbc) {
- zend_bool is_public = (fbc->common.fn_flags & ZEND_ACC_PUBLIC) != 0;
- zend_bool same_scope = fbc->common.scope == op_array->scope;
+ bool is_public = (fbc->common.fn_flags & ZEND_ACC_PUBLIC) != 0;
+ bool same_scope = fbc->common.scope == op_array->scope;
if (is_public || same_scope) {
return fbc;
}
@@ -851,9 +851,9 @@ zend_function *zend_optimizer_get_called_func(
zend_function *fbc = zend_hash_find_ptr(
&op_array->scope->function_table, method_name);
if (fbc) {
- zend_bool is_private = (fbc->common.fn_flags & ZEND_ACC_PRIVATE) != 0;
- zend_bool is_final = (fbc->common.fn_flags & ZEND_ACC_FINAL) != 0;
- zend_bool same_scope = fbc->common.scope == op_array->scope;
+ bool is_private = (fbc->common.fn_flags & ZEND_ACC_PRIVATE) != 0;
+ bool is_final = (fbc->common.fn_flags & ZEND_ACC_FINAL) != 0;
+ bool same_scope = fbc->common.scope == op_array->scope;
if (is_private) {
/* Only use private method if in the same scope. We can't even use it
* as a prototype, as it may be overridden with changed signature. */
@@ -1340,6 +1340,7 @@ static void zend_adjust_fcall_stack_size_graph(zend_op_array *op_array)
zend_op *opline = call_info->caller_init_opline;
if (opline && call_info->callee_func && opline->opcode == ZEND_INIT_FCALL) {
+ ZEND_ASSERT(!call_info->is_prototype);
opline->op1.num = zend_vm_calc_used_stack(opline->extended_value, call_info->callee_func);
}
call_info = call_info->next_callee;
@@ -1347,7 +1348,7 @@ static void zend_adjust_fcall_stack_size_graph(zend_op_array *op_array)
}
}
-static zend_bool needs_live_range(zend_op_array *op_array, zend_op *def_opline) {
+static bool needs_live_range(zend_op_array *op_array, zend_op *def_opline) {
zend_func_info *func_info = ZEND_FUNC_INFO(op_array);
zend_ssa_op *ssa_op = &func_info->ssa.ops[def_opline - op_array->opcodes];
int ssa_var = ssa_op->result_def;
@@ -1367,16 +1368,24 @@ static zend_bool needs_live_range(zend_op_array *op_array, zend_op *def_opline)
return (type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) != 0;
}
+static void zend_foreach_op_array_helper(
+ zend_op_array *op_array, zend_op_array_func_t func, void *context) {
+ func(op_array, context);
+ for (uint32_t i = 0; i < op_array->num_dynamic_func_defs; i++) {
+ func(op_array->dynamic_func_defs[i], context);
+ }
+}
+
void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context)
{
zend_class_entry *ce;
zend_string *key;
zend_op_array *op_array;
- func(&script->main_op_array, context);
+ zend_foreach_op_array_helper(&script->main_op_array, func, context);
ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
- func(op_array, context);
+ zend_foreach_op_array_helper(op_array, func, context);
} ZEND_HASH_FOREACH_END();
ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
@@ -1387,7 +1396,7 @@ void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void
if (op_array->scope == ce
&& op_array->type == ZEND_USER_FUNCTION
&& !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
- func(op_array, context);
+ zend_foreach_op_array_helper(op_array, func, context);
}
} ZEND_HASH_FOREACH_END();
} ZEND_HASH_FOREACH_END();
@@ -1405,7 +1414,7 @@ static void step_dump_after_optimizer(zend_op_array *op_array, void *context) {
zend_dump_op_array(op_array, ZEND_DUMP_LIVE_RANGES, "after optimizer", NULL);
}
-int zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level)
+ZEND_API int zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level)
{
zend_class_entry *ce;
zend_string *key;
diff --git a/ext/opcache/Optimizer/zend_optimizer.h b/Zend/Optimizer/zend_optimizer.h
index 04528d33e2..4b43255437 100644
--- a/ext/opcache/Optimizer/zend_optimizer.h
+++ b/Zend/Optimizer/zend_optimizer.h
@@ -89,8 +89,10 @@ typedef struct _zend_script {
uint32_t first_early_binding_opline; /* the linked list of delayed declarations */
} zend_script;
-int zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level);
+BEGIN_EXTERN_C()
+ZEND_API int zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level);
int zend_optimizer_startup(void);
int zend_optimizer_shutdown(void);
+END_EXTERN_C()
#endif
diff --git a/ext/opcache/Optimizer/zend_optimizer_internal.h b/Zend/Optimizer/zend_optimizer_internal.h
index 0c8c2fe4c7..911eb79e64 100644
--- a/ext/opcache/Optimizer/zend_optimizer_internal.h
+++ b/Zend/Optimizer/zend_optimizer_internal.h
@@ -71,7 +71,7 @@ typedef struct _zend_optimizer_ctx {
target = src; \
} while (0)
-static inline zend_bool zend_optimizer_is_loop_var_free(const zend_op *opline) {
+static inline bool zend_optimizer_is_loop_var_free(const zend_op *opline) {
return (opline->opcode == ZEND_FE_FREE && opline->extended_value != ZEND_FREE_ON_RETURN)
|| (opline->opcode == ZEND_FREE && opline->extended_value == ZEND_FREE_SWITCH);
}
@@ -109,12 +109,12 @@ void zend_optimizer_nop_removal(zend_op_array *op_array, zend_optimizer_ctx *ctx
void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx *ctx);
void zend_optimizer_compact_vars(zend_op_array *op_array);
zend_function *zend_optimizer_get_called_func(
- zend_script *script, zend_op_array *op_array, zend_op *opline, zend_bool *is_prototype);
+ zend_script *script, zend_op_array *op_array, zend_op *opline, bool *is_prototype);
uint32_t zend_optimizer_classify_function(zend_string *name, uint32_t num_args);
void zend_optimizer_migrate_jump(zend_op_array *op_array, zend_op *new_opline, zend_op *opline);
void zend_optimizer_shift_jump(zend_op_array *op_array, zend_op *opline, uint32_t *shiftlist);
int sccp_optimize_op_array(zend_optimizer_ctx *ctx, zend_op_array *op_arrya, zend_ssa *ssa, zend_call_info **call_map);
-int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reorder_dtor_effects);
+int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, bool reorder_dtor_effects);
int zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa);
typedef void (*zend_op_array_func_t)(zend_op_array *, void *context);
diff --git a/ext/opcache/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c
index 3a6a098196..6fe97cbc1e 100644
--- a/ext/opcache/Optimizer/zend_ssa.c
+++ b/Zend/Optimizer/zend_ssa.c
@@ -25,14 +25,14 @@
#include "zend_inference.h"
#include "Optimizer/zend_optimizer_internal.h"
-static zend_bool dominates(const zend_basic_block *blocks, int a, int b) {
+static bool dominates(const zend_basic_block *blocks, int a, int b) {
while (blocks[b].level > blocks[a].level) {
b = blocks[b].idom;
}
return a == b;
}
-static zend_bool will_rejoin(
+static bool will_rejoin(
const zend_cfg *cfg, const zend_dfg *dfg, const zend_basic_block *block,
int other_successor, int exclude, int var) {
int i;
@@ -58,7 +58,7 @@ static zend_bool will_rejoin(
return 0;
}
-static zend_bool needs_pi(const zend_op_array *op_array, zend_dfg *dfg, zend_ssa *ssa, int from, int to, int var) /* {{{ */
+static bool needs_pi(const zend_op_array *op_array, zend_dfg *dfg, zend_ssa *ssa, int from, int to, int var) /* {{{ */
{
zend_basic_block *from_block, *to_block;
int other_successor;
@@ -768,7 +768,7 @@ add_op1_def:
}
/* }}} */
-int zend_ssa_rename_op(const zend_op_array *op_array, const zend_op *opline, uint32_t k, uint32_t build_flags, int ssa_vars_count, zend_ssa_op *ssa_ops, int *var) /* {{{ */
+ZEND_API int zend_ssa_rename_op(const zend_op_array *op_array, const zend_op *opline, uint32_t k, uint32_t build_flags, int ssa_vars_count, zend_ssa_op *ssa_ops, int *var) /* {{{ */
{
return _zend_ssa_rename_op(op_array, opline, k, build_flags, ssa_vars_count, ssa_ops, var);
}
@@ -891,7 +891,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags,
}
/* }}} */
-int zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa) /* {{{ */
+ZEND_API int zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa) /* {{{ */
{
zend_basic_block *blocks = ssa->cfg.blocks;
zend_ssa_block *ssa_blocks;
@@ -1042,7 +1042,7 @@ int zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_
}
/* }}} */
-int zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
+ZEND_API int zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
{
zend_ssa_var *ssa_vars;
int i;
@@ -1508,7 +1508,7 @@ static void propagate_phi_type_widening(zend_ssa *ssa, int var) /* {{{ */
}
/* }}} */
-void zend_ssa_rename_var_uses(zend_ssa *ssa, int old, int new, zend_bool update_types) /* {{{ */
+void zend_ssa_rename_var_uses(zend_ssa *ssa, int old, int new, bool update_types) /* {{{ */
{
zend_ssa_var *old_var = &ssa->vars[old];
zend_ssa_var *new_var = &ssa->vars[new];
@@ -1527,7 +1527,7 @@ void zend_ssa_rename_var_uses(zend_ssa *ssa, int old, int new, zend_bool update_
/* If the op already uses the new var, don't add the op to the use
* list again. Instead move the use_chain to the correct operand. */
- zend_bool add_to_use_chain = 1;
+ bool add_to_use_chain = 1;
if (ssa_op->result_use == new) {
add_to_use_chain = 0;
} else if (ssa_op->op1_use == new) {
@@ -1579,7 +1579,7 @@ void zend_ssa_rename_var_uses(zend_ssa *ssa, int old, int new, zend_bool update_
/* Update phi use chains */
FOREACH_PHI_USE(old_var, phi) {
int j;
- zend_bool after_first_new_source = 0;
+ bool after_first_new_source = 0;
/* If the phi already uses the new var, find its use chain, as we may
* need to move it to a different source operand. */
diff --git a/ext/opcache/Optimizer/zend_ssa.h b/Zend/Optimizer/zend_ssa.h
index a5d6362f47..ddc9f95f43 100644
--- a/ext/opcache/Optimizer/zend_ssa.h
+++ b/Zend/Optimizer/zend_ssa.h
@@ -25,8 +25,8 @@
typedef struct _zend_ssa_range {
zend_long min;
zend_long max;
- zend_bool underflow;
- zend_bool overflow;
+ bool underflow;
+ bool overflow;
} zend_ssa_range;
typedef enum _zend_ssa_negative_lat {
@@ -145,9 +145,9 @@ typedef struct _zend_ssa {
BEGIN_EXTERN_C()
-int zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa);
-int zend_ssa_rename_op(const zend_op_array *op_array, const zend_op *opline, uint32_t k, uint32_t build_flags, int ssa_vars_count, zend_ssa_op *ssa_ops, int *var);
-int zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa);
+ZEND_API int zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa);
+ZEND_API int zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa);
+ZEND_API int zend_ssa_rename_op(const zend_op_array *op_array, const zend_op *opline, uint32_t k, uint32_t build_flags, int ssa_vars_count, zend_ssa_op *ssa_ops, int *var);
int zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var);
void zend_ssa_remove_predecessor(zend_ssa *ssa, int from, int to);
@@ -155,7 +155,7 @@ void zend_ssa_remove_instr(zend_ssa *ssa, zend_op *opline, zend_ssa_op *ssa_op);
void zend_ssa_remove_phi(zend_ssa *ssa, zend_ssa_phi *phi);
void zend_ssa_remove_uses_of_var(zend_ssa *ssa, int var_num);
void zend_ssa_remove_block(zend_op_array *op_array, zend_ssa *ssa, int b);
-void zend_ssa_rename_var_uses(zend_ssa *ssa, int old_var, int new_var, zend_bool update_types);
+void zend_ssa_rename_var_uses(zend_ssa *ssa, int old_var, int new_var, bool update_types);
static zend_always_inline void _zend_ssa_remove_def(zend_ssa_var *var)
{
@@ -215,7 +215,7 @@ static zend_always_inline zend_ssa_phi* zend_ssa_next_use_phi(const zend_ssa *ss
return NULL;
}
-static zend_always_inline zend_bool zend_ssa_is_no_val_use(const zend_op *opline, const zend_ssa_op *ssa_op, int var)
+static zend_always_inline bool zend_ssa_is_no_val_use(const zend_op *opline, const zend_ssa_op *ssa_op, int var)
{
if (opline->opcode == ZEND_ASSIGN
|| opline->opcode == ZEND_UNSET_CV
diff --git a/ext/opcache/Optimizer/zend_worklist.h b/Zend/Optimizer/zend_worklist.h
index 2f3e3dd979..2f3e3dd979 100644
--- a/ext/opcache/Optimizer/zend_worklist.h
+++ b/Zend/Optimizer/zend_worklist.h
diff --git a/Zend/Zend.m4 b/Zend/Zend.m4
index 781e51d3e4..081a237012 100644
--- a/Zend/Zend.m4
+++ b/Zend/Zend.m4
@@ -209,6 +209,10 @@ fi
test -n "$GCC" && CFLAGS="-Wall -Wextra -Wno-strict-aliasing -Wno-implicit-fallthrough -Wno-unused-parameter -Wno-sign-compare $CFLAGS"
dnl Check if compiler supports -Wno-clobbered (only GCC)
AX_CHECK_COMPILE_FLAG([-Wno-clobbered], CFLAGS="-Wno-clobbered $CFLAGS", , [-Werror])
+AX_CHECK_COMPILE_FLAG([-Wduplicated-cond], CFLAGS="-Wduplicated-cond $CFLAGS", , [-Werror])
+AX_CHECK_COMPILE_FLAG([-Wlogical-op], CFLAGS="-Wlogical-op $CFLAGS", , [-Werror])
+AX_CHECK_COMPILE_FLAG([-Wformat-truncation], CFLAGS="-Wformat-truncation $CFLAGS", , [-Werror])
+AX_CHECK_COMPILE_FLAG([-fno-common], CFLAGS="-fno-common $CFLAGS", , [-Werror])
test -n "$DEBUG_CFLAGS" && CFLAGS="$CFLAGS $DEBUG_CFLAGS"
diff --git a/Zend/tests/anon/015.phpt b/Zend/tests/anon/015.phpt
new file mode 100644
index 0000000000..f55c4b2605
--- /dev/null
+++ b/Zend/tests/anon/015.phpt
@@ -0,0 +1,30 @@
+--TEST--
+static variables in methods inherited from parent class
+--FILE--
+<?php
+class C {
+ function foo ($y = null) {
+ static $x = null;
+ if (!is_null($y)) {
+ $x = [$y];
+ }
+ return $x;
+ }
+}
+$c = new C();
+$c->foo(42);
+$d = new class extends C {};
+var_dump($d->foo());
+var_dump($d->foo(24));
+var_dump($c->foo());
+?>
+--EXPECT--
+NULL
+array(1) {
+ [0]=>
+ int(24)
+}
+array(1) {
+ [0]=>
+ int(42)
+}
diff --git a/Zend/tests/anon/016.phpt b/Zend/tests/anon/016.phpt
new file mode 100644
index 0000000000..a5607cda74
--- /dev/null
+++ b/Zend/tests/anon/016.phpt
@@ -0,0 +1,31 @@
+--TEST--
+static variables in methods inherited from parent class (can't cache objects)
+--FILE--
+<?php
+class C {
+ function foo ($y = null) {
+ static $x = null;
+ if (!is_null($y)) {
+ $x = [$y];
+ }
+ return $x;
+ }
+}
+$c = new C();
+$c->foo(new stdClass);
+$d = new class extends C {};
+var_dump($d->foo());
+var_dump($d->foo(24));
+var_dump($c->foo());
+?>
+--EXPECT--
+NULL
+array(1) {
+ [0]=>
+ int(24)
+}
+array(1) {
+ [0]=>
+ object(stdClass)#2 (0) {
+ }
+}
diff --git a/Zend/tests/array_self_add_globals.phpt b/Zend/tests/array_self_add_globals.phpt
index ebad7c3fdf..78dd3bf9a3 100644
--- a/Zend/tests/array_self_add_globals.phpt
+++ b/Zend/tests/array_self_add_globals.phpt
@@ -2,7 +2,6 @@
Add $GLOBALS to itself
--FILE--
<?php
-$GLOBALS += $GLOBALS;
$x = $GLOBALS + $GLOBALS;
?>
===DONE===
diff --git a/Zend/tests/array_unpack/non_integer_keys.phpt b/Zend/tests/array_unpack/non_integer_keys.phpt
index a5e407743c..ab7a20ac86 100644
--- a/Zend/tests/array_unpack/non_integer_keys.phpt
+++ b/Zend/tests/array_unpack/non_integer_keys.phpt
@@ -1,5 +1,5 @@
--TEST--
-Array unpacking does not work with non-integer keys
+Array unpacking does not work with non-integer/string keys
--FILE--
<?php
function gen() {
@@ -15,4 +15,4 @@ try {
?>
--EXPECT--
-Exception: Cannot unpack Traversable with non-integer keys
+Exception: Keys must be of type int|string during array unpacking
diff --git a/Zend/tests/array_unpack/string_keys.phpt b/Zend/tests/array_unpack/string_keys.phpt
index e4cfd77f58..d446e69cab 100644
--- a/Zend/tests/array_unpack/string_keys.phpt
+++ b/Zend/tests/array_unpack/string_keys.phpt
@@ -1,22 +1,58 @@
--TEST--
-array unpacking with string keys (not supported)
+Array unpacking with string keys
--FILE--
<?php
-try {
- $array = [1, 2, "foo" => 3, 4];
- var_dump([...$array]);
-} catch (Error $ex) {
- var_dump($ex->getMessage());
-}
-try {
- $iterator = new ArrayIterator([1, 2, "foo" => 3, 4]);
- var_dump([...$iterator]);
-} catch (Error $ex) {
- var_dump($ex->getMessage());
+// Works with both arrays and Traversables.
+$array = [1, 2, "foo" => 3, 4];
+var_dump([...$array]);
+
+$iterator = new ArrayIterator([1, 2, "foo" => 3, 4]);
+var_dump([...$iterator]);
+
+// Test overwriting behavior.
+$array1 = ["foo" => 1];
+$array2 = ["foo" => 2];
+var_dump(["foo" => 0, ...$array1, ...$array2]);
+var_dump(["foo" => 0, ...$array1, ...$array2, "foo" => 3]);
+
+// Test numeric string key from iterator.
+function gen() {
+ yield "42" => 42;
}
+var_dump([...gen()]);
?>
--EXPECT--
-string(36) "Cannot unpack array with string keys"
-string(42) "Cannot unpack Traversable with string keys"
+array(4) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ ["foo"]=>
+ int(3)
+ [2]=>
+ int(4)
+}
+array(4) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ ["foo"]=>
+ int(3)
+ [2]=>
+ int(4)
+}
+array(1) {
+ ["foo"]=>
+ int(2)
+}
+array(1) {
+ ["foo"]=>
+ int(3)
+}
+array(1) {
+ [0]=>
+ int(42)
+}
diff --git a/Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt b/Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt
index 1401fb9bd5..df58d78a6a 100644
--- a/Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt
+++ b/Zend/tests/array_unpack/unpack_string_keys_compile_time.phpt
@@ -1,10 +1,23 @@
--TEST--
-Unpacking of string keys detected at compile-time
+Unpacking of string keys is supported at compile-time
--FILE--
<?php
var_dump([...['a' => 'b']]);
+var_dump(['a' => 'X', ...['a' => 'b']]);
+var_dump([...['a' => 'b'], 'a' => 'X']);
?>
---EXPECTF--
-Fatal error: Cannot unpack array with string keys in %s on line %d
+--EXPECT--
+array(1) {
+ ["a"]=>
+ string(1) "b"
+}
+array(1) {
+ ["a"]=>
+ string(1) "b"
+}
+array(1) {
+ ["a"]=>
+ string(1) "X"
+}
diff --git a/Zend/tests/attributes/016_custom_attribute_validation.phpt b/Zend/tests/attributes/016_custom_attribute_validation.phpt
index 0f3167f986..11ffeaa774 100644
--- a/Zend/tests/attributes/016_custom_attribute_validation.phpt
+++ b/Zend/tests/attributes/016_custom_attribute_validation.phpt
@@ -2,8 +2,8 @@
Attribute validation callback of internal attributes.
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) {
- echo "skip requires zend-test extension\n";
+if (!extension_loaded('zend_test')) {
+ echo "skip requires zend_test extension\n";
}
--FILE--
<?php
diff --git a/Zend/tests/bug27798.phpt b/Zend/tests/bug27798.phpt
index 310fd97991..c16c5c825d 100644
--- a/Zend/tests/bug27798.phpt
+++ b/Zend/tests/bug27798.phpt
@@ -57,12 +57,12 @@ array(3) {
}
Child::__construct
array(3) {
- ["Baz"]=>
- int(4)
["Foo"]=>
int(1)
["Bar"]=>
int(2)
+ ["Baz"]=>
+ int(4)
}
array(1) {
["Foo"]=>
diff --git a/Zend/tests/bug43201.phpt b/Zend/tests/bug43201.phpt
index 49816ea1c1..c93b118e16 100644
--- a/Zend/tests/bug43201.phpt
+++ b/Zend/tests/bug43201.phpt
@@ -30,25 +30,37 @@ Warning: Undefined variable $ref in %s on line %d
Warning: Undefined variable $undef in %s on line %d
+Deprecated: chop(): Passing null to parameter #1 ($string) of type string is deprecated in %s on line %d
+
Notice: Indirect modification of overloaded property Foo::$arr has no effect in %sbug43201.php on line 17
Warning: Undefined variable $undef in %s on line %d
+Deprecated: chop(): Passing null to parameter #1 ($string) of type string is deprecated in %s on line %d
+
Notice: Indirect modification of overloaded property Foo::$arr has no effect in %sbug43201.php on line 17
Warning: Undefined variable $undef in %s on line %d
+Deprecated: chop(): Passing null to parameter #1 ($string) of type string is deprecated in %s on line %d
+
Notice: Indirect modification of overloaded property Foo::$arr has no effect in %sbug43201.php on line 17
Warning: Undefined variable $undef in %s on line %d
+Deprecated: chop(): Passing null to parameter #1 ($string) of type string is deprecated in %s on line %d
+
Notice: Indirect modification of overloaded property Foo::$arr has no effect in %sbug43201.php on line 17
Warning: Undefined variable $undef in %s on line %d
+Deprecated: chop(): Passing null to parameter #1 ($string) of type string is deprecated in %s on line %d
+
Notice: Indirect modification of overloaded property Foo::$arr has no effect in %sbug43201.php on line 17
Warning: Undefined variable $undef in %s on line %d
+Deprecated: chop(): Passing null to parameter #1 ($string) of type string is deprecated in %s on line %d
+
Notice: Indirect modification of overloaded property Foo::$arr has no effect in %sbug43201.php on line 17
ok
diff --git a/Zend/tests/bug53826.phpt b/Zend/tests/bug53826.phpt
new file mode 100644
index 0000000000..3f0a069536
--- /dev/null
+++ b/Zend/tests/bug53826.phpt
@@ -0,0 +1,33 @@
+--TEST--
+Bug #53826: __callStatic fired in base class through a parent call if the method is private
+--FILE--
+<?php
+
+class A1 {
+ public function __call($method, $args) { echo "__call\n"; }
+ public static function __callStatic($method, $args) { echo "__callStatic\n"; }
+}
+
+class A2 { // A1 with private function test
+ public function __call($method, $args) { echo "__call\n"; }
+ public static function __callStatic($method, $args) { echo "__callStatic\n"; }
+ private function test() {}
+}
+
+class B1 extends A1 {
+ public function test(){ parent::test(); }
+}
+
+class B2 extends A2 {
+ public function test(){ parent::test(); }
+}
+
+$test1 = new B1;
+$test2 = new B2;
+$test1->test();
+$test2->test();
+
+?>
+--EXPECT--
+__call
+__call
diff --git a/Zend/tests/bug60536_003.phpt b/Zend/tests/bug60536_003.phpt
index 3ba23b9288..8696591bb2 100644
--- a/Zend/tests/bug60536_003.phpt
+++ b/Zend/tests/bug60536_003.phpt
@@ -32,14 +32,14 @@ var_dump($b);
?>
--EXPECTF--
object(SubclassA)#%d (2) {
- ["hello":"SubclassA":private]=>
- int(0)
["hello":"BaseWithPropA":private]=>
int(0)
+ ["hello":"SubclassA":private]=>
+ int(0)
}
object(SubclassB)#%d (2) {
- ["hello":"SubclassB":private]=>
- int(0)
["hello":"BaseWithTPropB":private]=>
int(0)
+ ["hello":"SubclassB":private]=>
+ int(0)
}
diff --git a/Zend/tests/bug64677.phpt b/Zend/tests/bug64677.phpt
index 2dcd00ce0a..c3b168bd83 100644
--- a/Zend/tests/bug64677.phpt
+++ b/Zend/tests/bug64677.phpt
@@ -7,7 +7,7 @@ class cat {
}
}
$cat = new cat();
-$cat->show_output('Files: ', trim(`cd .`)); // this gives invalid args to shell_exec
+$cat->show_output('Files: ', trim((string) `cd .`)); // this gives invalid args to shell_exec
$cat->show_output('Files: ', `cd .`); // this causes a segmentation fault
$cat->show_output(`cd .`); // this causes a segmentation fault
diff --git a/Zend/tests/bug70895.phpt b/Zend/tests/bug70895.phpt
index 1a28d9ef5c..afbea1c91d 100644
--- a/Zend/tests/bug70895.phpt
+++ b/Zend/tests/bug70895.phpt
@@ -20,6 +20,6 @@ try {
}
?>
--EXPECT--
-array_map(): Argument #1 ($callback) must be a valid callback, function "%n" not found or invalid function name
-array_map(): Argument #1 ($callback) must be a valid callback, function "%n %i" not found or invalid function name
-array_map(): Argument #1 ($callback) must be a valid callback, function "%n %i aoeu %f aoeu %p" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "%n" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "%n %i" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "%n %i aoeu %f aoeu %p" not found or invalid function name
diff --git a/Zend/tests/bug70898.phpt b/Zend/tests/bug70898.phpt
index 2aff5109d8..d3d2cf79a9 100644
--- a/Zend/tests/bug70898.phpt
+++ b/Zend/tests/bug70898.phpt
@@ -13,4 +13,4 @@ try {
}
?>
--EXPECT--
-array_map(): Argument #1 ($callback) must be a valid callback, function "0000000000000000000000000000000000" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "0000000000000000000000000000000000" not found or invalid function name
diff --git a/Zend/tests/bug71539_6.phpt b/Zend/tests/bug71539_6.phpt
deleted file mode 100644
index d690538595..0000000000
--- a/Zend/tests/bug71539_6.phpt
+++ /dev/null
@@ -1,15 +0,0 @@
---TEST--
-Bug #71539.5 (Memory error on $arr[$a] =& $arr[$b] if RHS rehashes)
---FILE--
-<?php
-$name = 'a';
-for ($i = 0; $i < 100000; $i++) {
- if ($name != 'i') {
- $$name =& $GLOBALS;
- }
- $name++;
-}
-?>
-OK
---EXPECT--
-OK
diff --git a/Zend/tests/bug71695.phpt b/Zend/tests/bug71695.phpt
deleted file mode 100644
index 31ae73a99d..0000000000
--- a/Zend/tests/bug71695.phpt
+++ /dev/null
@@ -1,17 +0,0 @@
---TEST--
-Bug #71695 (Global variables are reserved before execution)
---FILE--
-<?php
-function provideGlobals() {
- var_dump(array_key_exists("foo", $GLOBALS));
- var_dump(isset($GLOBALS["foo"]));
- $GLOBALS += array("foo" => "foo");
-}
-
-provideGlobals();
-echo $foo;
-?>
---EXPECT--
-bool(false)
-bool(false)
-foo
diff --git a/Zend/tests/bug75474.phpt b/Zend/tests/bug75474.phpt
new file mode 100644
index 0000000000..f71e3c6b2e
--- /dev/null
+++ b/Zend/tests/bug75474.phpt
@@ -0,0 +1,75 @@
+--TEST--
+Bug #75474: function scope static variables are not bound to a unique function
+--FILE--
+<?php
+
+function bar($k, $v) {
+ static $foo = [];
+ $foo[$k] = $v;
+ return $foo;
+}
+
+var_dump(bar(0, 0));
+var_dump(Closure::fromCallable("bar")(1, 1));
+var_dump(bar(2, 2));
+var_dump(Closure::fromCallable("bar")(3, 3));
+$RF = new ReflectionFunction("bar");
+var_dump($RF->getClosure()(4, 4));
+var_dump(bar(5, 5));
+
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ int(0)
+}
+array(2) {
+ [0]=>
+ int(0)
+ [1]=>
+ int(1)
+}
+array(3) {
+ [0]=>
+ int(0)
+ [1]=>
+ int(1)
+ [2]=>
+ int(2)
+}
+array(4) {
+ [0]=>
+ int(0)
+ [1]=>
+ int(1)
+ [2]=>
+ int(2)
+ [3]=>
+ int(3)
+}
+array(5) {
+ [0]=>
+ int(0)
+ [1]=>
+ int(1)
+ [2]=>
+ int(2)
+ [3]=>
+ int(3)
+ [4]=>
+ int(4)
+}
+array(6) {
+ [0]=>
+ int(0)
+ [1]=>
+ int(1)
+ [2]=>
+ int(2)
+ [3]=>
+ int(3)
+ [4]=>
+ int(4)
+ [5]=>
+ int(5)
+}
diff --git a/Zend/tests/bug78239.phpt b/Zend/tests/bug78239.phpt
index 1ecad67460..50dd46c971 100644
--- a/Zend/tests/bug78239.phpt
+++ b/Zend/tests/bug78239.phpt
@@ -1,7 +1,7 @@
--TEST--
Bug #78239: Deprecation notice during string conversion converted to exception hangs
--SKIPIF--
-<?php if (!extension_loaded("zend-test")) die("skip requires zend-test extension"); ?>
+<?php if (!extension_loaded("zend_test")) die("skip requires zend_test extension"); ?>
--FILE--
<?php
function handleError($level, $message, $file = '', $line = 0, $context = [])
diff --git a/Zend/tests/bug78335_2.phpt b/Zend/tests/bug78335_2.phpt
index 5fb5fcb788..5f2c9ed9df 100644
--- a/Zend/tests/bug78335_2.phpt
+++ b/Zend/tests/bug78335_2.phpt
@@ -1,7 +1,7 @@
--TEST--
Bug #78335: Static properties containing cycles report as leak (internal class variant)
--SKIPIF--
-<?php if (!extension_loaded("zend-test")) die("skip requires zend-test"); ?>
+<?php if (!extension_loaded("zend_test")) die("skip requires zend_test"); ?>
--FILE--
<?php
diff --git a/Zend/tests/bug79862.phpt b/Zend/tests/bug79862.phpt
index b923da78b4..a04dc5c9ac 100644
--- a/Zend/tests/bug79862.phpt
+++ b/Zend/tests/bug79862.phpt
@@ -45,14 +45,14 @@ NULL
NULL
NULL
object(c)#1 (6) {
- ["prop1"]=>
- int(1)
- ["prop2":protected]=>
- int(2)
["prop3":"a":private]=>
int(3)
["prop4":"a":private]=>
int(4)
+ ["prop1"]=>
+ int(1)
+ ["prop2":protected]=>
+ int(2)
["prop5"]=>
int(5)
["prop6"]=>
diff --git a/Zend/tests/call_to_deprecated_function_args.phpt b/Zend/tests/call_to_deprecated_function_args.phpt
index c7781e30e0..7bb9039b46 100644
--- a/Zend/tests/call_to_deprecated_function_args.phpt
+++ b/Zend/tests/call_to_deprecated_function_args.phpt
@@ -2,7 +2,7 @@
Check that arguments are freed when calling a deprecated function
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not loaded');
--FILE--
<?php
diff --git a/Zend/tests/class_exists_002.phpt b/Zend/tests/class_exists_002.phpt
index 5e5df1d371..e020c1d623 100644
--- a/Zend/tests/class_exists_002.phpt
+++ b/Zend/tests/class_exists_002.phpt
@@ -8,7 +8,6 @@ class foo {
}
var_dump(class_exists(''));
-var_dump(class_exists(NULL));
var_dump(class_exists('FOO'));
var_dump(class_exists('bar'));
var_dump(class_exists(1));
@@ -16,7 +15,6 @@ var_dump(class_exists(1));
?>
--EXPECT--
bool(false)
-bool(false)
bool(true)
bool(false)
bool(false)
diff --git a/Zend/tests/closure_bindTo_preserves_used_variables.phpt b/Zend/tests/closure_bindTo_preserves_used_variables.phpt
new file mode 100644
index 0000000000..cec68ea70a
--- /dev/null
+++ b/Zend/tests/closure_bindTo_preserves_used_variables.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Closure::bindTo() should preserve used variables
+--FILE--
+<?php
+
+$var = 0;
+$fn = function() use($var) {
+ var_dump($var);
+};
+$fn();
+$fn = $fn->bindTo(null, null);
+$fn();
+
+?>
+--EXPECT--
+int(0)
+int(0)
diff --git a/Zend/tests/closures/closure_from_callable_gc.phpt b/Zend/tests/closures/closure_from_callable_gc.phpt
new file mode 100644
index 0000000000..e326fc3b09
--- /dev/null
+++ b/Zend/tests/closures/closure_from_callable_gc.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Closure::fromCallable() and GC
+--FILE--
+<?php
+
+class Test {
+ public function method() {}
+
+ public function method2($y) {
+ static $x;
+ $x = $y;
+ }
+}
+
+$fn = Closure::fromCallable([new Test, 'method2']);
+$fn($fn);
+unset($fn); // Still referenced from static var.
+gc_collect_cycles();
+
+$fn = Closure::fromCallable([new Test, 'method']);
+$fn2 = $fn; unset($fn2); // Add to root buffer.
+gc_collect_cycles();
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/tests/const_deprecation.phpt b/Zend/tests/const_deprecation.phpt
index b7cf99d52e..08de4229b9 100644
--- a/Zend/tests/const_deprecation.phpt
+++ b/Zend/tests/const_deprecation.phpt
@@ -2,7 +2,7 @@
Internal constant deprecation
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip requires zend-test');
+if (!extension_loaded('zend_test')) die('skip requires zend_test');
?>
--FILE--
<?php
diff --git a/Zend/tests/enum/__call.phpt b/Zend/tests/enum/__call.phpt
new file mode 100644
index 0000000000..b2be5eb040
--- /dev/null
+++ b/Zend/tests/enum/__call.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Enum __call
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+
+ public function __call(string $name, array $args)
+ {
+ return [$name, $args];
+ }
+}
+
+var_dump(Foo::Bar->baz('qux', 'quux'));
+
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ string(3) "baz"
+ [1]=>
+ array(2) {
+ [0]=>
+ string(3) "qux"
+ [1]=>
+ string(4) "quux"
+ }
+}
diff --git a/Zend/tests/enum/__callStatic.phpt b/Zend/tests/enum/__callStatic.phpt
new file mode 100644
index 0000000000..d3acd38239
--- /dev/null
+++ b/Zend/tests/enum/__callStatic.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Enum __callStatic
+--FILE--
+<?php
+
+enum Foo {
+ public static function __callStatic(string $name, array $args)
+ {
+ return [$name, $args];
+ }
+}
+
+var_dump(Foo::bar('baz', 'qux'));
+
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ string(3) "bar"
+ [1]=>
+ array(2) {
+ [0]=>
+ string(3) "baz"
+ [1]=>
+ string(3) "qux"
+ }
+}
diff --git a/Zend/tests/enum/__class__.phpt b/Zend/tests/enum/__class__.phpt
new file mode 100644
index 0000000000..0b9a5834e4
--- /dev/null
+++ b/Zend/tests/enum/__class__.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Enum __CLASS__
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+
+ public function printClass()
+ {
+ echo __CLASS__ . "\n";
+ }
+}
+
+Foo::Bar->printClass();
+
+?>
+--EXPECT--
+Foo
diff --git a/Zend/tests/enum/__function__.phpt b/Zend/tests/enum/__function__.phpt
new file mode 100644
index 0000000000..d460593873
--- /dev/null
+++ b/Zend/tests/enum/__function__.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Enum __FUNCTION__
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+
+ public function printFunction()
+ {
+ echo __FUNCTION__ . "\n";
+ }
+}
+
+Foo::Bar->printFunction();
+
+?>
+--EXPECT--
+printFunction
diff --git a/Zend/tests/enum/__get.phpt b/Zend/tests/enum/__get.phpt
new file mode 100644
index 0000000000..885cc2f2c8
--- /dev/null
+++ b/Zend/tests/enum/__get.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Enum __get
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+
+ public function __get(string $name)
+ {
+ return '__get';
+ }
+}
+
+?>
+--EXPECTF--
+Fatal error: Enum may not include __get in %s on line %d
diff --git a/Zend/tests/enum/__invoke.phpt b/Zend/tests/enum/__invoke.phpt
new file mode 100644
index 0000000000..63a35b56fd
--- /dev/null
+++ b/Zend/tests/enum/__invoke.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Enum __invoke
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+
+ public function __invoke(...$args)
+ {
+ return $args;
+ }
+}
+
+var_dump((Foo::Bar)('baz', 'qux'));
+
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ string(3) "baz"
+ [1]=>
+ string(3) "qux"
+}
diff --git a/Zend/tests/enum/__isset.phpt b/Zend/tests/enum/__isset.phpt
new file mode 100644
index 0000000000..76409f075b
--- /dev/null
+++ b/Zend/tests/enum/__isset.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Enum __isset
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+
+ public function __isset($property) {
+ return true;
+ }
+}
+
+?>
+--EXPECTF--
+Fatal error: Enum may not include __isset in %s on line %d
diff --git a/Zend/tests/enum/__method__.phpt b/Zend/tests/enum/__method__.phpt
new file mode 100644
index 0000000000..5d4195566e
--- /dev/null
+++ b/Zend/tests/enum/__method__.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Enum __METHOD__
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+
+ public function printMethod()
+ {
+ echo __METHOD__ . "\n";
+ }
+}
+
+Foo::Bar->printMethod();
+
+?>
+--EXPECT--
+Foo::printMethod
diff --git a/Zend/tests/enum/ast-dumper.phpt b/Zend/tests/enum/ast-dumper.phpt
new file mode 100644
index 0000000000..ed38e44e7c
--- /dev/null
+++ b/Zend/tests/enum/ast-dumper.phpt
@@ -0,0 +1,48 @@
+--TEST--
+Enum AST dumper
+--FILE--
+<?php
+
+try {
+ assert((function () {
+ enum Foo {
+ case Bar;
+ }
+
+ #[EnumAttr]
+ enum IntFoo: int {
+ #[CaseAttr]
+ case Bar = 1 << 0;
+ case Baz = 1 << 1;
+
+ public function self() {
+ return $this;
+ }
+ }
+
+ return false;
+ })());
+} catch (Error $e) {
+ echo $e->getMessage();
+}
+
+?>
+--EXPECT--
+assert(function () {
+ enum Foo {
+ case Bar;
+ }
+
+ #[EnumAttr]
+ enum IntFoo: int {
+ #[CaseAttr]
+ case Bar = 1 << 0;
+ case Baz = 1 << 1;
+ public function self() {
+ return $this;
+ }
+
+ }
+
+ return false;
+}())
diff --git a/Zend/tests/enum/backed-cases-int.phpt b/Zend/tests/enum/backed-cases-int.phpt
new file mode 100644
index 0000000000..85d2527c39
--- /dev/null
+++ b/Zend/tests/enum/backed-cases-int.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Int backed enums with can list cases
+--FILE--
+<?php
+
+enum Suit: int {
+ case Hearts = 2;
+ case Diamonds = 1;
+ case Clubs = 4;
+ case Spades = 3;
+}
+
+var_dump(Suit::cases());
+
+?>
+--EXPECT--
+array(4) {
+ [0]=>
+ enum(Suit::Hearts)
+ [1]=>
+ enum(Suit::Diamonds)
+ [2]=>
+ enum(Suit::Clubs)
+ [3]=>
+ enum(Suit::Spades)
+}
diff --git a/Zend/tests/enum/backed-cases-string.phpt b/Zend/tests/enum/backed-cases-string.phpt
new file mode 100644
index 0000000000..6d7deef77e
--- /dev/null
+++ b/Zend/tests/enum/backed-cases-string.phpt
@@ -0,0 +1,26 @@
+--TEST--
+String backed enums can list cases
+--FILE--
+<?php
+
+enum Suit: string {
+ case Hearts = 'H';
+ case Diamonds = 'D';
+ case Clubs = 'C';
+ case Spades = 'S';
+}
+
+var_dump(Suit::cases());
+
+?>
+--EXPECT--
+array(4) {
+ [0]=>
+ enum(Suit::Hearts)
+ [1]=>
+ enum(Suit::Diamonds)
+ [2]=>
+ enum(Suit::Clubs)
+ [3]=>
+ enum(Suit::Spades)
+}
diff --git a/Zend/tests/enum/backed-duplicate-int.phpt b/Zend/tests/enum/backed-duplicate-int.phpt
new file mode 100644
index 0000000000..4da70bc3dd
--- /dev/null
+++ b/Zend/tests/enum/backed-duplicate-int.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Backed enums reject duplicate int values
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 0;
+ case Baz = 0;
+}
+
+?>
+--EXPECTF--
+Fatal error: Duplicate value in enum Foo for cases Bar and Baz in %s on line %s
diff --git a/Zend/tests/enum/backed-duplicate-string.phpt b/Zend/tests/enum/backed-duplicate-string.phpt
new file mode 100644
index 0000000000..7d42c2ac30
--- /dev/null
+++ b/Zend/tests/enum/backed-duplicate-string.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Backed enums reject duplicate string values
+--FILE--
+<?php
+
+enum Suit: string {
+ case Hearts = 'H';
+ case Diamonds = 'D';
+ case Clubs = 'C';
+ case Spades = 'H';
+}
+
+?>
+--EXPECTF--
+Fatal error: Duplicate value in enum Suit for cases Hearts and Spades in %s on line %s
diff --git a/Zend/tests/enum/backed-from-invalid-int.phpt b/Zend/tests/enum/backed-from-invalid-int.phpt
new file mode 100644
index 0000000000..d976f3d0fb
--- /dev/null
+++ b/Zend/tests/enum/backed-from-invalid-int.phpt
@@ -0,0 +1,19 @@
+--TEST--
+BackedEnum::from() reject invalid int
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 0;
+ case Baz = 1;
+}
+
+try {
+ var_dump(Foo::from(2));
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+?>
+--EXPECT--
+2 is not a valid backing value for enum "Foo"
diff --git a/Zend/tests/enum/backed-from-invalid-string.phpt b/Zend/tests/enum/backed-from-invalid-string.phpt
new file mode 100644
index 0000000000..db8b791d8b
--- /dev/null
+++ b/Zend/tests/enum/backed-from-invalid-string.phpt
@@ -0,0 +1,21 @@
+--TEST--
+BackedEnum::from() reject invalid string
+--FILE--
+<?php
+
+enum Suit: string {
+ case Hearts = 'H';
+ case Diamonds = 'D';
+ case Clubs = 'C';
+ case Spades = 'S';
+}
+
+try {
+ var_dump(Suit::from('A'));
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+?>
+--EXPECT--
+"A" is not a valid backing value for enum "Suit"
diff --git a/Zend/tests/enum/backed-from-invalid-type.phpt b/Zend/tests/enum/backed-from-invalid-type.phpt
new file mode 100644
index 0000000000..3f35bef64f
--- /dev/null
+++ b/Zend/tests/enum/backed-from-invalid-type.phpt
@@ -0,0 +1,34 @@
+--TEST--
+BackedEnum::from() reject invalid type
+--FILE--
+<?php
+
+enum Suit: string {
+ case Hearts = 'H';
+ case Diamonds = 'D';
+ case Clubs = 'C';
+ case Spades = 'S';
+}
+
+try {
+ var_dump(Suit::from(42));
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+enum Foo: int {
+ case Bar = 0;
+ case Baz = 1;
+}
+
+try {
+ var_dump(Foo::from('H'));
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+
+?>
+--EXPECT--
+"42" is not a valid backing value for enum "Suit"
+Foo::from(): Argument #1 ($value) must be of type int, string given
diff --git a/Zend/tests/enum/backed-from-unknown-hash.phpt b/Zend/tests/enum/backed-from-unknown-hash.phpt
new file mode 100644
index 0000000000..eb5938d0d6
--- /dev/null
+++ b/Zend/tests/enum/backed-from-unknown-hash.phpt
@@ -0,0 +1,17 @@
+--TEST--
+BackedEnum::from() unknown hash
+--FILE--
+<?php
+
+enum Foo: string {
+ case Bar = 'B';
+}
+
+$s = 'A';
+$s++;
+
+var_dump(Foo::from($s));
+
+?>
+--EXPECT--
+enum(Foo::Bar)
diff --git a/Zend/tests/enum/backed-from.phpt b/Zend/tests/enum/backed-from.phpt
new file mode 100644
index 0000000000..2c77c3e388
--- /dev/null
+++ b/Zend/tests/enum/backed-from.phpt
@@ -0,0 +1,36 @@
+--TEST--
+BackedEnum::from()
+--FILE--
+<?php
+
+enum Suit: string {
+ case Hearts = 'H';
+ case Diamonds = 'D';
+ case Clubs = 'C';
+ case Spades = 'S';
+}
+
+var_dump(Suit::from('H'));
+var_dump(Suit::from('D'));
+var_dump(Suit::from('C'));
+var_dump(Suit::from('S'));
+
+enum Foo: int {
+ case Bar = 1;
+ case Baz = 2;
+ case Beep = 3;
+}
+
+var_dump(Foo::from(1));
+var_dump(Foo::from(2));
+var_dump(Foo::from(3));
+
+?>
+--EXPECT--
+enum(Suit::Hearts)
+enum(Suit::Diamonds)
+enum(Suit::Clubs)
+enum(Suit::Spades)
+enum(Foo::Bar)
+enum(Foo::Baz)
+enum(Foo::Beep)
diff --git a/Zend/tests/enum/backed-int-case-without-value.phpt b/Zend/tests/enum/backed-int-case-without-value.phpt
new file mode 100644
index 0000000000..4b84c069b4
--- /dev/null
+++ b/Zend/tests/enum/backed-int-case-without-value.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Int backed enums with case without value
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar;
+}
+
+var_dump(Foo::Bar->value);
+
+?>
+--EXPECTF--
+Fatal error: Case Bar of backed enum Foo must have a value in %s on line %d
diff --git a/Zend/tests/enum/backed-int-const-expr.phpt b/Zend/tests/enum/backed-int-const-expr.phpt
new file mode 100644
index 0000000000..afb6491c51
--- /dev/null
+++ b/Zend/tests/enum/backed-int-const-expr.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Int enum const expr
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 1 << 0;
+ case Baz = 1 << 1;
+ case Qux = 1 << 2;
+}
+
+var_dump(Foo::Bar->value);
+var_dump(Foo::Baz->value);
+var_dump(Foo::Qux->value);
+
+?>
+--EXPECT--
+int(1)
+int(2)
+int(4)
diff --git a/Zend/tests/enum/backed-int-const-invalid-expr.phpt b/Zend/tests/enum/backed-int-const-invalid-expr.phpt
new file mode 100644
index 0000000000..097bb27883
--- /dev/null
+++ b/Zend/tests/enum/backed-int-const-invalid-expr.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Int enum invalid const expr
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 1 + $x;
+}
+
+var_dump(Foo::Bar->value);
+
+?>
+--EXPECTF--
+Fatal error: Enum case value must be constant in %s on line %d
diff --git a/Zend/tests/enum/backed-int.phpt b/Zend/tests/enum/backed-int.phpt
new file mode 100644
index 0000000000..113629f692
--- /dev/null
+++ b/Zend/tests/enum/backed-int.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Int enum value
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 0;
+ case Baz = 1;
+}
+
+var_dump(Foo::Bar->value);
+var_dump(Foo::Baz->value);
+
+?>
+--EXPECT--
+int(0)
+int(1)
diff --git a/Zend/tests/enum/backed-invalid.phpt b/Zend/tests/enum/backed-invalid.phpt
new file mode 100644
index 0000000000..bc6f71f79d
--- /dev/null
+++ b/Zend/tests/enum/backed-invalid.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Invalid enum backing type
+--FILE--
+<?php
+
+enum Foo: Bar {}
+
+?>
+--EXPECTF--
+Fatal error: Enum backing type must be int or string, Bar given in %s on line %d
diff --git a/Zend/tests/enum/backed-mismatch.phpt b/Zend/tests/enum/backed-mismatch.phpt
new file mode 100644
index 0000000000..0b28fb3be5
--- /dev/null
+++ b/Zend/tests/enum/backed-mismatch.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Mismatched enum backing type
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 'bar';
+}
+
+?>
+--EXPECTF--
+Fatal error: Enum case type string does not match enum backing type int in %s on line %d
diff --git a/Zend/tests/enum/backed-negative-int.phpt b/Zend/tests/enum/backed-negative-int.phpt
new file mode 100644
index 0000000000..4342ecd7b2
--- /dev/null
+++ b/Zend/tests/enum/backed-negative-int.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Backed enum with negative int
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = -1;
+ case Baz = -2;
+}
+
+var_dump(Foo::Bar->value);
+var_dump(Foo::Baz->value);
+var_dump(Foo::from(-1));
+var_dump(Foo::from(-2));
+
+?>
+--EXPECT--
+int(-1)
+int(-2)
+enum(Foo::Bar)
+enum(Foo::Baz)
diff --git a/Zend/tests/enum/backed-string-heredoc.phpt b/Zend/tests/enum/backed-string-heredoc.phpt
new file mode 100644
index 0000000000..b2e9b8f3e9
--- /dev/null
+++ b/Zend/tests/enum/backed-string-heredoc.phpt
@@ -0,0 +1,30 @@
+--TEST--
+String enum value with heredoc
+--FILE--
+<?php
+
+enum Foo: string {
+ case Bar = <<<BAR
+ Bar
+ bar
+ bar
+ BAR;
+
+ case Baz = <<<'BAZ'
+ Baz
+ baz
+ baz
+ BAZ;
+}
+
+echo Foo::Bar->value . "\n";
+echo Foo::Baz->value . "\n";
+
+?>
+--EXPECT--
+Bar
+bar
+bar
+Baz
+baz
+baz
diff --git a/Zend/tests/enum/backed-string.phpt b/Zend/tests/enum/backed-string.phpt
new file mode 100644
index 0000000000..afa7db827e
--- /dev/null
+++ b/Zend/tests/enum/backed-string.phpt
@@ -0,0 +1,17 @@
+--TEST--
+String enum value
+--FILE--
+<?php
+
+enum Foo: string {
+ case Bar = 'bar';
+ case Baz = 'baz';
+}
+
+echo Foo::Bar->value . "\n";
+echo Foo::Baz->value . "\n";
+
+?>
+--EXPECT--
+bar
+baz
diff --git a/Zend/tests/enum/backed-tryFrom-casing.phpt b/Zend/tests/enum/backed-tryFrom-casing.phpt
new file mode 100644
index 0000000000..213faa3a62
--- /dev/null
+++ b/Zend/tests/enum/backed-tryFrom-casing.phpt
@@ -0,0 +1,15 @@
+--TEST--
+BackedEnum::tryFrom() casing in reflection
+--FILE--
+<?php
+
+enum Foo: string {}
+
+$reflectionEnum = new ReflectionEnum(Foo::class);
+$reflectionMethod = $reflectionEnum->getMethod('tryFrom');
+
+echo $reflectionMethod->getName() . "\n";
+
+?>
+--EXPECT--
+tryFrom
diff --git a/Zend/tests/enum/backed-tryFrom-unknown-hash.phpt b/Zend/tests/enum/backed-tryFrom-unknown-hash.phpt
new file mode 100644
index 0000000000..80ffe1dc39
--- /dev/null
+++ b/Zend/tests/enum/backed-tryFrom-unknown-hash.phpt
@@ -0,0 +1,17 @@
+--TEST--
+BackedEnum::tryFrom() unknown hash
+--FILE--
+<?php
+
+enum Foo: string {
+ case Bar = 'B';
+}
+
+$s = 'A';
+$s++;
+
+var_dump(Foo::tryFrom($s));
+
+?>
+--EXPECT--
+enum(Foo::Bar)
diff --git a/Zend/tests/enum/backed-tryFrom.phpt b/Zend/tests/enum/backed-tryFrom.phpt
new file mode 100644
index 0000000000..81c36fcc2b
--- /dev/null
+++ b/Zend/tests/enum/backed-tryFrom.phpt
@@ -0,0 +1,40 @@
+--TEST--
+BackedEnum::tryFrom()
+--FILE--
+<?php
+
+enum Suit: string {
+ case Hearts = 'H';
+ case Diamonds = 'D';
+ case Clubs = 'C';
+ case Spades = 'S';
+}
+
+var_dump(Suit::tryFrom('H'));
+var_dump(Suit::tryFrom('D'));
+var_dump(Suit::tryFrom('C'));
+var_dump(Suit::tryFrom('S'));
+var_dump(Suit::tryFrom('X'));
+
+enum Foo: int {
+ case Bar = 1;
+ case Baz = 2;
+ case Beep = 3;
+}
+
+var_dump(Foo::tryFrom(1));
+var_dump(Foo::tryFrom(2));
+var_dump(Foo::tryFrom(3));
+var_dump(Foo::tryFrom(4));
+
+?>
+--EXPECT--
+enum(Suit::Hearts)
+enum(Suit::Diamonds)
+enum(Suit::Clubs)
+enum(Suit::Spades)
+NULL
+enum(Foo::Bar)
+enum(Foo::Baz)
+enum(Foo::Beep)
+NULL
diff --git a/Zend/tests/enum/backed-type-no-union.phpt b/Zend/tests/enum/backed-type-no-union.phpt
new file mode 100644
index 0000000000..8330f8de3d
--- /dev/null
+++ b/Zend/tests/enum/backed-type-no-union.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Backed enums type can't be union
+--FILE--
+<?php
+
+enum Foo: int|string {}
+
+?>
+--EXPECTF--
+Fatal error: Enum backing type must be int or string, string|int given in %s on line %d
diff --git a/Zend/tests/enum/basic-methods.phpt b/Zend/tests/enum/basic-methods.phpt
new file mode 100644
index 0000000000..ee1c2c24d7
--- /dev/null
+++ b/Zend/tests/enum/basic-methods.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Enum methods
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ case Baz;
+
+ public function dump() {
+ var_dump($this);
+ }
+}
+
+Foo::Bar->dump();
+Foo::Baz->dump();
+
+?>
+--EXPECT--
+enum(Foo::Bar)
+enum(Foo::Baz)
diff --git a/Zend/tests/enum/case-attributes.phpt b/Zend/tests/enum/case-attributes.phpt
new file mode 100644
index 0000000000..a5ec8600cd
--- /dev/null
+++ b/Zend/tests/enum/case-attributes.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Enum case attributes
+--FILE--
+<?php
+
+#[Attribute(Attribute::TARGET_CLASS_CONSTANT)]
+class EnumCaseAttribute {
+ public function __construct(
+ public string $value,
+ ) {}
+}
+
+enum Foo {
+ #[EnumCaseAttribute('Bar')]
+ case Bar;
+}
+
+var_dump((new \ReflectionClassConstant(Foo::class, 'Bar'))->getAttributes(EnumCaseAttribute::class)[0]->newInstance());
+
+?>
+--EXPECT--
+object(EnumCaseAttribute)#1 (1) {
+ ["value"]=>
+ string(3) "Bar"
+}
diff --git a/Zend/tests/enum/case-in-class.phpt b/Zend/tests/enum/case-in-class.phpt
new file mode 100644
index 0000000000..61713e6f89
--- /dev/null
+++ b/Zend/tests/enum/case-in-class.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Enum case in class
+--FILE--
+<?php
+
+class Foo {
+ case Bar;
+}
+
+?>
+--EXPECTF--
+Fatal error: Case can only be used in enums in %s on line %d
diff --git a/Zend/tests/enum/cases-refcount.phpt b/Zend/tests/enum/cases-refcount.phpt
new file mode 100644
index 0000000000..040589ca23
--- /dev/null
+++ b/Zend/tests/enum/cases-refcount.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Enum cases increases refcount
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+function callCases() {
+ Foo::cases();
+}
+
+callCases();
+debug_zval_dump(Foo::Bar);
+
+?>
+--EXPECT--
+object(Foo)#1 (1) refcount(2){
+ ["name"]=>
+ string(3) "Bar" interned
+}
diff --git a/Zend/tests/enum/comparison.phpt b/Zend/tests/enum/comparison.phpt
new file mode 100644
index 0000000000..5df2f282ec
--- /dev/null
+++ b/Zend/tests/enum/comparison.phpt
@@ -0,0 +1,57 @@
+--TEST--
+Enum comparison
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ case Baz;
+}
+
+$bar = Foo::Bar;
+$baz = Foo::Baz;
+
+var_dump($bar === $bar);
+var_dump($bar == $bar);
+
+var_dump($bar === $baz);
+var_dump($bar == $baz);
+
+var_dump($baz === $bar);
+var_dump($baz == $bar);
+
+var_dump($bar > $bar);
+var_dump($bar < $bar);
+var_dump($bar >= $bar);
+var_dump($bar <= $bar);
+
+var_dump($bar > $baz);
+var_dump($bar < $baz);
+var_dump($bar >= $baz);
+var_dump($bar <= $baz);
+
+var_dump($bar > true);
+var_dump($bar < true);
+var_dump($bar >= true);
+var_dump($bar <= true);
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
diff --git a/Zend/tests/enum/constant-aliases.phpt b/Zend/tests/enum/constant-aliases.phpt
new file mode 100644
index 0000000000..1652eb3c48
--- /dev/null
+++ b/Zend/tests/enum/constant-aliases.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Enum constants can alias cases
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ const Baz = self::Bar;
+}
+
+function test(Foo $var) {
+ echo "works\n";
+}
+
+test(Foo::Bar);
+test(Foo::Baz);
+
+?>
+--EXPECT--
+works
+works
diff --git a/Zend/tests/enum/constants.phpt b/Zend/tests/enum/constants.phpt
new file mode 100644
index 0000000000..cc983e5184
--- /dev/null
+++ b/Zend/tests/enum/constants.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Enum allows constants
+--FILE--
+<?php
+
+enum Foo {
+ const BAR = 'Bar';
+}
+
+echo Foo::BAR . "\n";
+
+?>
+--EXPECT--
+Bar
diff --git a/Zend/tests/enum/default-parameter.phpt b/Zend/tests/enum/default-parameter.phpt
new file mode 100644
index 0000000000..02aa05b5a8
--- /dev/null
+++ b/Zend/tests/enum/default-parameter.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Enum in default parameter
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+function baz(Foo $foo = Foo::Bar) {
+ var_dump($foo);
+}
+
+baz();
+
+?>
+--EXPECT--
+enum(Foo::Bar)
diff --git a/Zend/tests/enum/enum-as-constant.phpt b/Zend/tests/enum/enum-as-constant.phpt
new file mode 100644
index 0000000000..26a589ae79
--- /dev/null
+++ b/Zend/tests/enum/enum-as-constant.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Enum cases can be referenced by constants
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+const Beep = Foo::Bar;
+
+class Test {
+ const Beep = Foo::Bar;
+}
+
+var_dump(Beep);
+var_dump(Test::Beep);
+
+?>
+--EXPECT--
+enum(Foo::Bar)
+enum(Foo::Bar)
diff --git a/Zend/tests/enum/enum-as-params.phpt b/Zend/tests/enum/enum-as-params.phpt
new file mode 100644
index 0000000000..90a1f0b5d0
--- /dev/null
+++ b/Zend/tests/enum/enum-as-params.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Enum types as parameters
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+enum Baz {
+ case Qux;
+}
+
+function takesFoo(Foo $foo) {}
+function takesBaz(Baz $baz) {}
+
+takesFoo(Foo::Bar);
+takesBaz(Baz::Qux);
+
+try {
+ takesBaz(Foo::Bar);
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+try {
+ takesFoo(Baz::Qux);
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+?>
+--EXPECTF--
+takesBaz(): Argument #1 ($baz) must be of type Baz, Foo given, called in %s on line %d
+takesFoo(): Argument #1 ($foo) must be of type Foo, Baz given, called in %s on line %d
diff --git a/Zend/tests/enum/enum-attributes.phpt b/Zend/tests/enum/enum-attributes.phpt
new file mode 100644
index 0000000000..e0e57c744c
--- /dev/null
+++ b/Zend/tests/enum/enum-attributes.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Enum attributes
+--FILE--
+<?php
+
+#[Attribute]
+class EnumAttribute {
+ public function __construct(
+ public string $value,
+ ) {}
+}
+
+#[EnumAttribute('Foo')]
+enum Foo {}
+
+var_dump((new \ReflectionClass(Foo::class))->getAttributes(EnumAttribute::class)[0]->newInstance());
+
+?>
+--EXPECT--
+object(EnumAttribute)#1 (1) {
+ ["value"]=>
+ string(3) "Foo"
+}
diff --git a/Zend/tests/enum/enum-in-constant.phpt b/Zend/tests/enum/enum-in-constant.phpt
new file mode 100644
index 0000000000..487b4a6aad
--- /dev/null
+++ b/Zend/tests/enum/enum-in-constant.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Enum in constant
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+class Baz {
+ const BAR = Foo::Bar;
+}
+
+var_dump(Foo::Bar);
+var_dump(Baz::BAR);
+var_dump(Foo::Bar === Baz::BAR);
+
+?>
+--EXPECT--
+enum(Foo::Bar)
+enum(Foo::Bar)
+bool(true)
diff --git a/Zend/tests/enum/enum-in-static-var.phpt b/Zend/tests/enum/enum-in-static-var.phpt
new file mode 100644
index 0000000000..9f5ebc6264
--- /dev/null
+++ b/Zend/tests/enum/enum-in-static-var.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Enum in static var
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+function example() {
+ static $bar = Foo::Bar;
+ return $bar;
+}
+
+var_dump(example());
+var_dump(example());
+
+?>
+--EXPECT--
+enum(Foo::Bar)
+enum(Foo::Bar)
diff --git a/Zend/tests/enum/enum-reserved-non-modifiers.phpt b/Zend/tests/enum/enum-reserved-non-modifiers.phpt
new file mode 100644
index 0000000000..b07114856f
--- /dev/null
+++ b/Zend/tests/enum/enum-reserved-non-modifiers.phpt
@@ -0,0 +1,32 @@
+--TEST--
+enum keyword is reserved_non_modifiers
+--FILE--
+<?php
+
+namespace enum {
+ class Foo {
+ public static function bar() {
+ return 'enum\Foo::bar()';
+ }
+ }
+}
+
+namespace {
+ class Foo {
+ const enum = 'enum const';
+
+ public static function enum() {
+ return 'enum static method';
+ }
+ }
+
+ echo \enum\Foo::bar() . "\n";
+ echo Foo::enum . "\n";
+ echo Foo::enum() . "\n";
+}
+
+?>
+--EXPECT--
+enum\Foo::bar()
+enum const
+enum static method
diff --git a/Zend/tests/enum/enum_exists.phpt b/Zend/tests/enum/enum_exists.phpt
new file mode 100644
index 0000000000..d1e86447c4
--- /dev/null
+++ b/Zend/tests/enum/enum_exists.phpt
@@ -0,0 +1,41 @@
+--TEST--
+enum_exists
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+class Baz {}
+
+spl_autoload_register(function ($className) {
+ echo "Triggered autoloader with class $className\n";
+
+ if ($className === 'Quux') {
+ enum Quux {}
+ }
+});
+
+var_dump(enum_exists(Foo::class));
+var_dump(enum_exists(Foo::Bar::class));
+var_dump(enum_exists(Baz::class));
+var_dump(enum_exists(Qux::class));
+var_dump(enum_exists(Quux::class, false));
+var_dump(enum_exists(Quux::class, true));
+var_dump(enum_exists(Quuz::class, false));
+var_dump(enum_exists(Quuz::class, true));
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(false)
+Triggered autoloader with class Qux
+bool(false)
+bool(false)
+Triggered autoloader with class Quux
+bool(true)
+bool(false)
+Triggered autoloader with class Quuz
+bool(false)
diff --git a/Zend/tests/enum/final.phpt b/Zend/tests/enum/final.phpt
new file mode 100644
index 0000000000..ca13b7da8c
--- /dev/null
+++ b/Zend/tests/enum/final.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Enum is final
+--FILE--
+<?php
+
+enum Foo {}
+
+class Bar extends Foo {}
+
+?>
+--EXPECTF--
+Fatal error: Class Bar may not inherit from final class (Foo) in %s on line %d
diff --git a/Zend/tests/enum/implements.phpt b/Zend/tests/enum/implements.phpt
new file mode 100644
index 0000000000..fc90ab2aef
--- /dev/null
+++ b/Zend/tests/enum/implements.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Enum implements
+--FILE--
+<?php
+
+interface Colorful {
+ public function color(): string;
+}
+
+enum Suit implements Colorful {
+ case Hearts;
+ case Diamonds;
+ case Clubs;
+ case Spades;
+
+ public function color(): string {
+ return match ($this) {
+ self::Hearts, self::Diamonds => 'Red',
+ self::Clubs, self::Spades => 'Black',
+ };
+ }
+}
+
+echo Suit::Hearts->color() . "\n";
+echo Suit::Diamonds->color() . "\n";
+echo Suit::Clubs->color() . "\n";
+echo Suit::Spades->color() . "\n";
+
+?>
+--EXPECT--
+Red
+Red
+Black
+Black
diff --git a/Zend/tests/enum/instanceof-backed-enum.phpt b/Zend/tests/enum/instanceof-backed-enum.phpt
new file mode 100644
index 0000000000..4716835d11
--- /dev/null
+++ b/Zend/tests/enum/instanceof-backed-enum.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Auto implement BackedEnum interface
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+enum Baz: int {
+ case Qux = 0;
+}
+
+var_dump(Foo::Bar instanceof BackedEnum);
+var_dump(Baz::Qux instanceof BackedEnum);
+
+?>
+--EXPECT--
+bool(false)
+bool(true)
diff --git a/Zend/tests/enum/instanceof-unitenum.phpt b/Zend/tests/enum/instanceof-unitenum.phpt
new file mode 100644
index 0000000000..5523796325
--- /dev/null
+++ b/Zend/tests/enum/instanceof-unitenum.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Auto implement UnitEnum interface
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+class Baz {}
+
+var_dump(Foo::Bar instanceof UnitEnum);
+var_dump((new Baz()) instanceof UnitEnum);
+
+?>
+--EXPECT--
+bool(true)
+bool(false)
diff --git a/Zend/tests/enum/instanceof.phpt b/Zend/tests/enum/instanceof.phpt
new file mode 100644
index 0000000000..0e29b9d282
--- /dev/null
+++ b/Zend/tests/enum/instanceof.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Enum instanceof
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+enum Baz {
+ case Qux;
+}
+
+var_dump(Foo::Bar instanceof Foo);
+var_dump(Baz::Qux instanceof Baz);
+
+var_dump(Foo::Bar instanceof Baz);
+var_dump(Baz::Qux instanceof Foo);
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(false)
+bool(false)
diff --git a/Zend/tests/enum/json_encode.phpt b/Zend/tests/enum/json_encode.phpt
new file mode 100644
index 0000000000..016ca6107f
--- /dev/null
+++ b/Zend/tests/enum/json_encode.phpt
@@ -0,0 +1,59 @@
+--TEST--
+Enum in json_encode
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+enum IntFoo: int {
+ case Bar = 0;
+}
+
+enum StringFoo: string {
+ case Bar = 'Bar';
+}
+
+enum CustomFoo implements JsonSerializable {
+ case Bar;
+
+ public function jsonSerialize() {
+ return 'Custom ' . $this->name;
+ }
+}
+
+function test($value) {
+ var_dump(json_encode($value));
+ echo json_last_error_msg() . "\n";
+
+ try {
+ var_dump(json_encode($value, JSON_THROW_ON_ERROR));
+ echo json_last_error_msg() . "\n";
+ } catch (Exception $e) {
+ echo get_class($e) . ': ' . $e->getMessage() . "\n";
+ }
+}
+
+test(Foo::Bar);
+test(IntFoo::Bar);
+test(StringFoo::Bar);
+test(CustomFoo::Bar);
+
+?>
+--EXPECT--
+bool(false)
+Non-backed enums have no default serialization
+JsonException: Non-backed enums have no default serialization
+string(1) "0"
+No error
+string(1) "0"
+No error
+string(5) ""Bar""
+No error
+string(5) ""Bar""
+No error
+string(12) ""Custom Bar""
+No error
+string(12) ""Custom Bar""
+No error
diff --git a/Zend/tests/enum/keyword-no-bc-break.phpt b/Zend/tests/enum/keyword-no-bc-break.phpt
new file mode 100644
index 0000000000..92b8226afa
--- /dev/null
+++ b/Zend/tests/enum/keyword-no-bc-break.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Enum keyword can still be used in classes, namespaces, functions and constants
+--FILE--
+<?php
+
+namespace enum {
+ class Foo {}
+}
+
+namespace foo {
+ class Bar {}
+ class enum extends Bar {}
+}
+
+namespace bar {
+ interface Baz {}
+ class enum implements Baz {}
+}
+
+namespace {
+ class enum {}
+
+ function enum() {
+ return 'enum function';
+ }
+
+ const enum = 'enum constant';
+
+ var_dump(new enum\Foo());
+ var_dump(new enum());
+ var_dump(enum());
+ var_dump(enum);
+}
+
+?>
+--EXPECT--
+object(enum\Foo)#1 (0) {
+}
+object(enum)#1 (0) {
+}
+string(13) "enum function"
+string(13) "enum constant"
diff --git a/Zend/tests/enum/keyword-whitespace.phpt b/Zend/tests/enum/keyword-whitespace.phpt
new file mode 100644
index 0000000000..bdcbd94079
--- /dev/null
+++ b/Zend/tests/enum/keyword-whitespace.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Enum keyword can be followed by arbitrary whitespaces
+--FILE--
+<?php
+
+enum A {}
+enum B {}
+enum C {}
+enum E {}
+enum
+F {}
+enum
+ G {}
+
+?>
+--EXPECT--
diff --git a/Zend/tests/enum/name-property.phpt b/Zend/tests/enum/name-property.phpt
new file mode 100644
index 0000000000..2197f235bb
--- /dev/null
+++ b/Zend/tests/enum/name-property.phpt
@@ -0,0 +1,50 @@
+--TEST--
+Enum name property
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ case Baz;
+}
+
+enum IntFoo: int {
+ case Bar = 0;
+ case Baz = 1;
+}
+
+var_dump((new ReflectionClass(Foo::class))->getProperties());
+var_dump(Foo::Bar->name);
+
+var_dump((new ReflectionClass(IntFoo::class))->getProperties());
+var_dump(IntFoo::Bar->name);
+
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ object(ReflectionProperty)#2 (2) {
+ ["name"]=>
+ string(4) "name"
+ ["class"]=>
+ string(3) "Foo"
+ }
+}
+string(3) "Bar"
+array(2) {
+ [0]=>
+ object(ReflectionProperty)#3 (2) {
+ ["name"]=>
+ string(4) "name"
+ ["class"]=>
+ string(6) "IntFoo"
+ }
+ [1]=>
+ object(ReflectionProperty)#4 (2) {
+ ["name"]=>
+ string(5) "value"
+ ["class"]=>
+ string(6) "IntFoo"
+ }
+}
+string(3) "Bar"
diff --git a/Zend/tests/enum/namespaces.phpt b/Zend/tests/enum/namespaces.phpt
new file mode 100644
index 0000000000..261a885b55
--- /dev/null
+++ b/Zend/tests/enum/namespaces.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Enum namespace
+--FILE--
+<?php
+
+namespace Foo {
+ enum Bar {
+ case Baz;
+
+ public function dump() {
+ var_dump(Bar::Baz);
+ }
+ }
+
+ function dumpBar() {
+ Bar::Baz->dump();
+ }
+}
+
+namespace {
+ use Foo\Bar;
+
+ \Foo\dumpBar();
+ \Foo\Bar::Baz->dump();
+ Bar::Baz->dump();
+}
+
+?>
+--EXPECT--
+enum(Foo\Bar::Baz)
+enum(Foo\Bar::Baz)
+enum(Foo\Bar::Baz)
diff --git a/Zend/tests/enum/no-cases.phpt b/Zend/tests/enum/no-cases.phpt
new file mode 100644
index 0000000000..cf518aefb9
--- /dev/null
+++ b/Zend/tests/enum/no-cases.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Enum no manual cases method
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+
+ public static function cases(): array {
+ return [];
+ }
+}
+
+?>
+--EXPECTF--
+Fatal error: Cannot redeclare Foo::cases() in %s on line %d
diff --git a/Zend/tests/enum/no-class-implements-backed-enum.phpt b/Zend/tests/enum/no-class-implements-backed-enum.phpt
new file mode 100644
index 0000000000..f6f37818da
--- /dev/null
+++ b/Zend/tests/enum/no-class-implements-backed-enum.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Class cannot implement BackedEnum
+--FILE--
+<?php
+
+class Foo implements BackedEnum {}
+
+?>
+--EXPECTF--
+Fatal error: Non-enum class Foo cannot implement interface BackedEnum in %s on line %d
diff --git a/Zend/tests/enum/no-class-implements-unit-enum.phpt b/Zend/tests/enum/no-class-implements-unit-enum.phpt
new file mode 100644
index 0000000000..02ddd4567f
--- /dev/null
+++ b/Zend/tests/enum/no-class-implements-unit-enum.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Class cannot implement UnitEnum
+--FILE--
+<?php
+
+class Foo implements UnitEnum {}
+
+?>
+--EXPECTF--
+Fatal error: Non-enum class Foo cannot implement interface UnitEnum in %s on line %d
diff --git a/Zend/tests/enum/no-clone.phpt b/Zend/tests/enum/no-clone.phpt
new file mode 100644
index 0000000000..2fadbb26b7
--- /dev/null
+++ b/Zend/tests/enum/no-clone.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Enum disallows cloning
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+try {
+ var_dump(clone Foo::Bar);
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+?>
+--EXPECT--
+Trying to clone an uncloneable object of class Foo
diff --git a/Zend/tests/enum/no-constructors.phpt b/Zend/tests/enum/no-constructors.phpt
new file mode 100644
index 0000000000..70504e14eb
--- /dev/null
+++ b/Zend/tests/enum/no-constructors.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Enum disallows constructor
+--FILE--
+<?php
+
+enum Foo {
+ public function __construct() {}
+}
+
+?>
+--EXPECTF--
+Fatal error: Enum may not include __construct in %s on line %d
diff --git a/Zend/tests/enum/no-destruct.phpt b/Zend/tests/enum/no-destruct.phpt
new file mode 100644
index 0000000000..730c29f847
--- /dev/null
+++ b/Zend/tests/enum/no-destruct.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Enum disallows destructor
+--FILE--
+<?php
+
+enum Foo {
+ public function __destruct() {}
+}
+
+?>
+--EXPECTF--
+Fatal error: Enum may not include __destruct in %s on line %d
diff --git a/Zend/tests/enum/no-dynamic-properties.phpt b/Zend/tests/enum/no-dynamic-properties.phpt
new file mode 100644
index 0000000000..21766ce1b4
--- /dev/null
+++ b/Zend/tests/enum/no-dynamic-properties.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Enum case disallows dynamic properties
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+$bar = Foo::Bar;
+
+try {
+ $bar->baz = 'Baz';
+} catch (\Error $e) {
+ echo $e->getMessage();
+}
+
+?>
+--EXPECT--
+Enum properties are immutable
diff --git a/Zend/tests/enum/no-enum-implements-backed-enum.phpt b/Zend/tests/enum/no-enum-implements-backed-enum.phpt
new file mode 100644
index 0000000000..69922c13a8
--- /dev/null
+++ b/Zend/tests/enum/no-enum-implements-backed-enum.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Enum cannot manually implement BackedEnum
+--FILE--
+<?php
+
+enum Foo: int implements BackedEnum {}
+
+?>
+--EXPECTF--
+Fatal error: Class Foo cannot implement previously implemented interface BackedEnum in %s on line %d
diff --git a/Zend/tests/enum/no-enum-implements-unit-enum.phpt b/Zend/tests/enum/no-enum-implements-unit-enum.phpt
new file mode 100644
index 0000000000..458efbb67c
--- /dev/null
+++ b/Zend/tests/enum/no-enum-implements-unit-enum.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Enum cannot manually implement UnitEnum
+--FILE--
+<?php
+
+enum Foo implements UnitEnum {}
+
+?>
+--EXPECTF--
+Fatal error: Class Foo cannot implement previously implemented interface UnitEnum in %s on line %d
diff --git a/Zend/tests/enum/no-from.phpt b/Zend/tests/enum/no-from.phpt
new file mode 100644
index 0000000000..1cf717de88
--- /dev/null
+++ b/Zend/tests/enum/no-from.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Enum no manual from method
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 0;
+
+ public static function from(string|int $value): self {
+ return $this;
+ }
+}
+
+?>
+--EXPECTF--
+Fatal error: Cannot redeclare Foo::from() in %s on line %d
diff --git a/Zend/tests/enum/no-implement-serializable-indirect.phpt b/Zend/tests/enum/no-implement-serializable-indirect.phpt
new file mode 100644
index 0000000000..5e7bdc9338
--- /dev/null
+++ b/Zend/tests/enum/no-implement-serializable-indirect.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Enum must not implement Serializable indirectly
+--FILE--
+<?php
+
+interface MySerializable extends Serializable {}
+
+enum Foo implements MySerializable {
+ case Bar;
+
+ public function serialize() {
+ return serialize('Hello');
+ }
+
+ public function unserialize($data) {
+ return unserialize($data);
+ }
+}
+
+var_dump(unserialize(serialize(Foo::Bar)));
+
+?>
+--EXPECTF--
+Fatal error: Enums may not implement the Serializable interface in %s on line %d
diff --git a/Zend/tests/enum/no-implement-serializable.phpt b/Zend/tests/enum/no-implement-serializable.phpt
new file mode 100644
index 0000000000..62485f2934
--- /dev/null
+++ b/Zend/tests/enum/no-implement-serializable.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Enum must not implement Serializable
+--FILE--
+<?php
+
+enum Foo implements Serializable {
+ case Bar;
+
+ public function serialize() {
+ return serialize('Hello');
+ }
+
+ public function unserialize($data) {
+ return unserialize($data);
+ }
+}
+
+var_dump(unserialize(serialize(Foo::Bar)));
+
+?>
+--EXPECTF--
+Fatal error: Enums may not implement the Serializable interface in %s on line %d
diff --git a/Zend/tests/enum/no-name-property.phpt b/Zend/tests/enum/no-name-property.phpt
new file mode 100644
index 0000000000..a565c08e83
--- /dev/null
+++ b/Zend/tests/enum/no-name-property.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Enum disallows name property
+--FILE--
+<?php
+
+enum Foo {
+ public string $name;
+}
+
+?>
+--EXPECTF--
+Fatal error: Enums may not include properties in %s on line %d
diff --git a/Zend/tests/enum/no-new-through-reflection.phpt b/Zend/tests/enum/no-new-through-reflection.phpt
new file mode 100644
index 0000000000..9a92559cd3
--- /dev/null
+++ b/Zend/tests/enum/no-new-through-reflection.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Enum no new through reflection
+--FILE--
+<?php
+
+enum Foo {}
+
+try {
+ (new \ReflectionClass(Foo::class))->newInstanceWithoutConstructor();
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+?>
+--EXPECT--
+Cannot instantiate enum Foo
diff --git a/Zend/tests/enum/no-new.phpt b/Zend/tests/enum/no-new.phpt
new file mode 100644
index 0000000000..698e954882
--- /dev/null
+++ b/Zend/tests/enum/no-new.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Enum no new
+--FILE--
+<?php
+
+enum Foo {}
+
+try {
+ new Foo();
+} catch (\Error $e) {
+ echo $e->getMessage();
+}
+
+?>
+--EXPECT--
+Cannot instantiate enum Foo
diff --git a/Zend/tests/enum/no-non-backed-enum-implements-backed-enum.phpt b/Zend/tests/enum/no-non-backed-enum-implements-backed-enum.phpt
new file mode 100644
index 0000000000..f560490de4
--- /dev/null
+++ b/Zend/tests/enum/no-non-backed-enum-implements-backed-enum.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Non-backed enum cannot implement BackedEnum
+--FILE--
+<?php
+
+enum Foo implements BackedEnum {}
+
+?>
+--EXPECTF--
+Fatal error: Non-backed enum Foo cannot implement interface BackedEnum in %s on line %d
diff --git a/Zend/tests/enum/no-pass-properties-by-ref.phpt b/Zend/tests/enum/no-pass-properties-by-ref.phpt
new file mode 100644
index 0000000000..8f429dfa14
--- /dev/null
+++ b/Zend/tests/enum/no-pass-properties-by-ref.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Enum properties cannot be passed by-ref
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 0;
+}
+
+function setBarValueByRef(&$bar, $value) {
+ $bar = $value;
+}
+
+try {
+ $bar = Foo::Bar;
+ $value = setBarValueByRef($bar->value, 1);
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+var_dump(Foo::Bar->value);
+
+?>
+--EXPECT--
+Cannot acquire reference to property Foo::$value
+int(0)
diff --git a/Zend/tests/enum/no-properties.phpt b/Zend/tests/enum/no-properties.phpt
new file mode 100644
index 0000000000..e846845d22
--- /dev/null
+++ b/Zend/tests/enum/no-properties.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Enum disallows properties
+--FILE--
+<?php
+
+enum Foo {
+ public $bar;
+}
+
+?>
+--EXPECTF--
+Fatal error: Enums may not include properties in %s on line %d
diff --git a/Zend/tests/enum/no-return-properties-by-ref.phpt b/Zend/tests/enum/no-return-properties-by-ref.phpt
new file mode 100644
index 0000000000..988d480de1
--- /dev/null
+++ b/Zend/tests/enum/no-return-properties-by-ref.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Enum properties cannot be returned by-ref
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 0;
+}
+
+function &getBarValueByRef() {
+ $bar = Foo::Bar;
+ return $bar->value;
+}
+
+try {
+ $value = &getBarValueByRef();
+ $value = 1;
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+var_dump(Foo::Bar->value);
+
+?>
+--EXPECT--
+Cannot acquire reference to property Foo::$value
+int(0)
diff --git a/Zend/tests/enum/no-static-properties.phpt b/Zend/tests/enum/no-static-properties.phpt
new file mode 100644
index 0000000000..4b823e98e9
--- /dev/null
+++ b/Zend/tests/enum/no-static-properties.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Enum disallows static properties
+--FILE--
+<?php
+
+enum Foo {
+ public static $bar;
+}
+
+?>
+--EXPECTF--
+Fatal error: Enums may not include properties in %s on line %d
diff --git a/Zend/tests/enum/no-unsed-value.phpt b/Zend/tests/enum/no-unsed-value.phpt
new file mode 100644
index 0000000000..a1cbdd43ca
--- /dev/null
+++ b/Zend/tests/enum/no-unsed-value.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Enum prevent unsetting value
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 0;
+}
+
+unset(Foo::Bar->value);
+
+?>
+--EXPECTF--
+Fatal error: Cannot use temporary expression in write context in %s on line %d
diff --git a/Zend/tests/enum/no-unset-propertes.phpt b/Zend/tests/enum/no-unset-propertes.phpt
new file mode 100644
index 0000000000..338b22a026
--- /dev/null
+++ b/Zend/tests/enum/no-unset-propertes.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Enum properties cannot be unset
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+enum IntFoo: int {
+ case Bar = 0;
+}
+
+$foo = Foo::Bar;
+try {
+ unset($foo->name);
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+$intFoo = IntFoo::Bar;
+try {
+ unset($intFoo->name);
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+try {
+ unset($intFoo->value);
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+?>
+--EXPECT--
+Enum properties are immutable
+Enum properties are immutable
+Enum properties are immutable
diff --git a/Zend/tests/enum/no-value-property.phpt b/Zend/tests/enum/no-value-property.phpt
new file mode 100644
index 0000000000..d8b12f2ca8
--- /dev/null
+++ b/Zend/tests/enum/no-value-property.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Enum disallows value property
+--FILE--
+<?php
+
+enum Foo: int {
+ public int $value;
+}
+
+?>
+--EXPECTF--
+Fatal error: Enums may not include properties in %s on line %d
diff --git a/Zend/tests/enum/no-write-properties-through-foreach-reference.phpt b/Zend/tests/enum/no-write-properties-through-foreach-reference.phpt
new file mode 100644
index 0000000000..d1c211802f
--- /dev/null
+++ b/Zend/tests/enum/no-write-properties-through-foreach-reference.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Enum properties cannot be written to through reference in foreach
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 0;
+}
+
+try {
+ $bar = Foo::Bar;
+ foreach ([1] as &$bar->value) {}
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+var_dump(Foo::Bar->value);
+
+?>
+--EXPECT--
+Cannot acquire reference to property Foo::$value
+int(0)
diff --git a/Zend/tests/enum/no-write-properties-through-references.phpt b/Zend/tests/enum/no-write-properties-through-references.phpt
new file mode 100644
index 0000000000..81543af78d
--- /dev/null
+++ b/Zend/tests/enum/no-write-properties-through-references.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Enum properties cannot be written to through references
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 0;
+}
+
+try {
+ $bar = Foo::Bar;
+ $value = &$bar->value;
+ $value = 1;
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+var_dump(Foo::Bar->value);
+
+?>
+--EXPECT--
+Cannot acquire reference to property Foo::$value
+int(0)
diff --git a/Zend/tests/enum/no-write-properties.phpt b/Zend/tests/enum/no-write-properties.phpt
new file mode 100644
index 0000000000..13cbe69e74
--- /dev/null
+++ b/Zend/tests/enum/no-write-properties.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Enum properties cannot be written to
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+enum IntFoo: int {
+ case Bar = 0;
+}
+
+$bar = Foo::Bar;
+try {
+ $bar->name = 'Baz';
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+$intBar = Foo::Bar;
+try {
+ $intBar->name = 'Baz';
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+try {
+ $intBar->value = 1;
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+?>
+--EXPECT--
+Enum properties are immutable
+Enum properties are immutable
+Enum properties are immutable
diff --git a/Zend/tests/enum/non-backed-enum-with-expr-value.phpt b/Zend/tests/enum/non-backed-enum-with-expr-value.phpt
new file mode 100644
index 0000000000..95bd85f396
--- /dev/null
+++ b/Zend/tests/enum/non-backed-enum-with-expr-value.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Non-backed enum errors when case has int expression value
+--FILE--
+<?php
+
+enum Foo {
+ case Bar = 1 + 1;
+}
+
+?>
+--EXPECTF--
+Fatal error: Case Bar of non-backed enum Foo must not have a value, try adding ": int" to the enum declaration in %s on line %d
diff --git a/Zend/tests/enum/non-backed-enum-with-int-value.phpt b/Zend/tests/enum/non-backed-enum-with-int-value.phpt
new file mode 100644
index 0000000000..4932e63d18
--- /dev/null
+++ b/Zend/tests/enum/non-backed-enum-with-int-value.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Non-backed enum errors when case has int value
+--FILE--
+<?php
+
+enum Foo {
+ case Bar = 1;
+}
+
+?>
+--EXPECTF--
+Fatal error: Case Bar of non-backed enum Foo must not have a value, try adding ": int" to the enum declaration in %s on line %d
diff --git a/Zend/tests/enum/non-backed-enum-with-invalid-value.phpt b/Zend/tests/enum/non-backed-enum-with-invalid-value.phpt
new file mode 100644
index 0000000000..24b8277805
--- /dev/null
+++ b/Zend/tests/enum/non-backed-enum-with-invalid-value.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Non-backed enum errors when case has invalid value
+--FILE--
+<?php
+
+enum Foo {
+ case Bar = 3.141;
+}
+
+?>
+--EXPECTF--
+Fatal error: Case Bar of non-backed enum Foo must not have a value in %s on line %d
diff --git a/Zend/tests/enum/non-backed-enum-with-string-value.phpt b/Zend/tests/enum/non-backed-enum-with-string-value.phpt
new file mode 100644
index 0000000000..f1a06e1a17
--- /dev/null
+++ b/Zend/tests/enum/non-backed-enum-with-string-value.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Non-backed enum errors when case has string value
+--FILE--
+<?php
+
+enum Foo {
+ case Bar = 'Bar';
+}
+
+?>
+--EXPECTF--
+Fatal error: Case Bar of non-backed enum Foo must not have a value, try adding ": string" to the enum declaration in %s on line %d
diff --git a/Zend/tests/enum/offsetGet-in-const-expr.phpt b/Zend/tests/enum/offsetGet-in-const-expr.phpt
new file mode 100644
index 0000000000..e288b9a694
--- /dev/null
+++ b/Zend/tests/enum/offsetGet-in-const-expr.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Enum offsetGet in constant expression
+--FILE--
+<?php
+
+enum Foo implements ArrayAccess {
+ case Bar;
+
+ public function offsetGet($key) {
+ return 42;
+ }
+
+ public function offsetExists($key) {}
+ public function offsetSet($key, $value) {}
+ public function offsetUnset($key) {}
+}
+
+class X {
+ const FOO_BAR = Foo::Bar[0];
+}
+
+var_dump(X::FOO_BAR);
+
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Cannot use [] on objects in constant expression in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/tests/enum/print_r.phpt b/Zend/tests/enum/print_r.phpt
new file mode 100644
index 0000000000..9cb08fec73
--- /dev/null
+++ b/Zend/tests/enum/print_r.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Enum print_r
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+enum IntFoo: int {
+ case Bar = 42;
+}
+
+enum StringFoo: string {
+ case Bar = 'Bar';
+}
+
+print_r(Foo::Bar);
+print_r(IntFoo::Bar);
+print_r(StringFoo::Bar);
+
+?>
+--EXPECT--
+Foo Enum
+(
+ [name] => Bar
+)
+IntFoo Enum:int
+(
+ [name] => Bar
+ [value] => 42
+)
+StringFoo Enum:string
+(
+ [name] => Bar
+ [value] => Bar
+)
diff --git a/Zend/tests/enum/reflectionclass.phpt b/Zend/tests/enum/reflectionclass.phpt
new file mode 100644
index 0000000000..59b99b3e6d
--- /dev/null
+++ b/Zend/tests/enum/reflectionclass.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Enum reflection getConstants()
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ case Baz;
+}
+
+var_dump((new \ReflectionClass(Foo::class))->getConstants());
+
+?>
+--EXPECT--
+array(2) {
+ ["Bar"]=>
+ enum(Foo::Bar)
+ ["Baz"]=>
+ enum(Foo::Baz)
+}
diff --git a/Zend/tests/enum/serialization-round-trip.phpt b/Zend/tests/enum/serialization-round-trip.phpt
new file mode 100644
index 0000000000..d69cbea71f
--- /dev/null
+++ b/Zend/tests/enum/serialization-round-trip.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Enum unserialize same instance
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+var_dump(Foo::Bar === unserialize(serialize(Foo::Bar)));
+
+?>
+--EXPECT--
+bool(true)
diff --git a/Zend/tests/enum/serialize.phpt b/Zend/tests/enum/serialize.phpt
new file mode 100644
index 0000000000..56545ebfae
--- /dev/null
+++ b/Zend/tests/enum/serialize.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Enum serialize
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+echo serialize(Foo::Bar);
+
+?>
+--EXPECT--
+E:7:"Foo:Bar";
diff --git a/Zend/tests/enum/spl-object-storage.phpt b/Zend/tests/enum/spl-object-storage.phpt
new file mode 100644
index 0000000000..7c72299c34
--- /dev/null
+++ b/Zend/tests/enum/spl-object-storage.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Enum in SplObjectStorage
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ case Baz;
+ case Qux;
+}
+
+$storage = new SplObjectStorage();
+$storage[Foo::Bar] = 'Bar';
+$storage[Foo::Baz] = 'Baz';
+
+var_dump($storage[Foo::Bar]);
+var_dump($storage[Foo::Baz]);
+
+var_dump($storage->contains(Foo::Bar));
+var_dump($storage->contains(Foo::Qux));
+
+$serialized = serialize($storage);
+var_dump($serialized);
+
+$unserialized = unserialize($serialized);
+var_dump($unserialized[Foo::Bar]);
+var_dump($unserialized[Foo::Baz]);
+
+?>
+--EXPECT--
+string(3) "Bar"
+string(3) "Baz"
+bool(true)
+bool(false)
+string(112) "O:16:"SplObjectStorage":2:{i:0;a:4:{i:0;E:7:"Foo:Bar";i:1;s:3:"Bar";i:2;E:7:"Foo:Baz";i:3;s:3:"Baz";}i:1;a:0:{}}"
+string(3) "Bar"
+string(3) "Baz"
diff --git a/Zend/tests/enum/static-methods.phpt b/Zend/tests/enum/static-methods.phpt
new file mode 100644
index 0000000000..361ee77664
--- /dev/null
+++ b/Zend/tests/enum/static-methods.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Enum supports static methods
+--FILE--
+<?php
+
+enum Size {
+ case Small;
+ case Medium;
+ case Large;
+
+ public static function fromLength(int $cm) {
+ return match(true) {
+ $cm < 50 => static::Small,
+ $cm < 100 => static::Medium,
+ default => static::Large,
+ };
+ }
+}
+
+var_dump(Size::fromLength(23));
+var_dump(Size::fromLength(63));
+var_dump(Size::fromLength(123));
+
+?>
+--EXPECT--
+enum(Size::Small)
+enum(Size::Medium)
+enum(Size::Large)
diff --git a/Zend/tests/enum/traits-no-__construct.phpt b/Zend/tests/enum/traits-no-__construct.phpt
new file mode 100644
index 0000000000..0529a2a989
--- /dev/null
+++ b/Zend/tests/enum/traits-no-__construct.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Enum traits no __construct
+--FILE--
+<?php
+
+trait Foo {
+ public function __construct() {
+ echo "Evil code\n";
+ }
+}
+
+enum Bar {
+ use Foo;
+ case Baz;
+}
+
+var_dump(Bar::Baz);
+
+?>
+--EXPECTF--
+Fatal error: Enum may not include __construct in %s on line %d
diff --git a/Zend/tests/enum/traits-no-cases-method.phpt b/Zend/tests/enum/traits-no-cases-method.phpt
new file mode 100644
index 0000000000..9acfb52d0e
--- /dev/null
+++ b/Zend/tests/enum/traits-no-cases-method.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Using cases method from traits in enums has no effect
+--FILE--
+<?php
+
+trait Rectangle {
+ public static function cases(): array {
+ return [];
+ }
+}
+
+enum Suit {
+ use Rectangle;
+
+ case Hearts;
+ case Diamonds;
+ case Clubs;
+ case Spades;
+}
+
+var_dump(Suit::cases());
+
+?>
+--EXPECT--
+array(4) {
+ [0]=>
+ enum(Suit::Hearts)
+ [1]=>
+ enum(Suit::Diamonds)
+ [2]=>
+ enum(Suit::Clubs)
+ [3]=>
+ enum(Suit::Spades)
+}
diff --git a/Zend/tests/enum/traits-no-forbidden-methods.phpt b/Zend/tests/enum/traits-no-forbidden-methods.phpt
new file mode 100644
index 0000000000..1f310f48cd
--- /dev/null
+++ b/Zend/tests/enum/traits-no-forbidden-methods.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Enum cannot have forbidden methods, even via traits
+--FILE--
+<?php
+
+trait Rectangle {
+ public function __construct() {}
+}
+
+enum Suit {
+ use Rectangle;
+
+ case Hearts;
+ case Diamonds;
+ case Clubs;
+ case Spades;
+}
+
+?>
+--EXPECTF--
+Fatal error: Enum may not include __construct in %s on line %d
diff --git a/Zend/tests/enum/traits-no-properties.phpt b/Zend/tests/enum/traits-no-properties.phpt
new file mode 100644
index 0000000000..5a6faf9dea
--- /dev/null
+++ b/Zend/tests/enum/traits-no-properties.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Enum cannot have properties, even via traits
+--FILE--
+<?php
+
+trait Rectangle {
+ protected string $shape = "Rectangle";
+
+ public function shape(): string {
+ return $this->shape;
+ }
+}
+
+enum Suit {
+ use Rectangle;
+
+ case Hearts;
+ case Diamonds;
+ case Clubs;
+ case Spades;
+}
+
+?>
+--EXPECTF--
+Fatal error: Enum "Suit" may not include properties in %s on line %d
diff --git a/Zend/tests/enum/traits.phpt b/Zend/tests/enum/traits.phpt
new file mode 100644
index 0000000000..3de8e1559f
--- /dev/null
+++ b/Zend/tests/enum/traits.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Enum can use traits
+--FILE--
+<?php
+
+trait Rectangle {
+ public function shape(): string {
+ return "Rectangle";
+ }
+}
+
+enum Suit {
+ use Rectangle;
+
+ case Hearts;
+ case Diamonds;
+ case Clubs;
+ case Spades;
+}
+
+echo Suit::Hearts->shape() . PHP_EOL;
+echo Suit::Diamonds->shape() . PHP_EOL;
+echo Suit::Clubs->shape() . PHP_EOL;
+echo Suit::Spades->shape() . PHP_EOL;
+
+?>
+--EXPECT--
+Rectangle
+Rectangle
+Rectangle
+Rectangle
diff --git a/Zend/tests/enum/unit-cases.phpt b/Zend/tests/enum/unit-cases.phpt
new file mode 100644
index 0000000000..83f2232159
--- /dev/null
+++ b/Zend/tests/enum/unit-cases.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Unit enums can list cases
+--FILE--
+<?php
+
+enum Suit {
+ case Hearts;
+ case Diamonds;
+ case Clubs;
+ case Spades;
+ /** @deprecated Typo, use Suit::Hearts */
+ const Hearst = self::Hearts;
+}
+
+var_dump(Suit::cases());
+
+?>
+--EXPECT--
+array(4) {
+ [0]=>
+ enum(Suit::Hearts)
+ [1]=>
+ enum(Suit::Diamonds)
+ [2]=>
+ enum(Suit::Clubs)
+ [3]=>
+ enum(Suit::Spades)
+}
diff --git a/Zend/tests/enum/unserialize-const.phpt b/Zend/tests/enum/unserialize-const.phpt
new file mode 100644
index 0000000000..0731a68dcc
--- /dev/null
+++ b/Zend/tests/enum/unserialize-const.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Enum unserialize const
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ const Baz = Foo::Bar;
+}
+
+var_dump(unserialize('E:7:"Foo:Baz";'));
+
+?>
+--EXPECTF--
+Warning: unserialize(): Foo::Baz is not an enum case in %s on line %d
+
+Notice: unserialize(): Error at offset 14 of 14 bytes in %s on line %d
+bool(false)
diff --git a/Zend/tests/enum/unserialize-missing-colon.phpt b/Zend/tests/enum/unserialize-missing-colon.phpt
new file mode 100644
index 0000000000..86cce32df4
--- /dev/null
+++ b/Zend/tests/enum/unserialize-missing-colon.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Enum unserialize with missing colon
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+var_dump(unserialize('E:6:"FooBar";'));
+
+?>
+--EXPECTF--
+Warning: unserialize(): Invalid enum name 'FooBar' (missing colon) in %s on line %d
+
+Notice: unserialize(): Error at offset 0 of 13 bytes in %s on line %d
+bool(false)
diff --git a/Zend/tests/enum/unserialize-non-enum.phpt b/Zend/tests/enum/unserialize-non-enum.phpt
new file mode 100644
index 0000000000..82f4ec93db
--- /dev/null
+++ b/Zend/tests/enum/unserialize-non-enum.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Enum unserialize non-enum
+--FILE--
+<?php
+
+class Foo {}
+
+var_dump(unserialize('E:7:"Foo:Bar";'));
+
+?>
+--EXPECTF--
+Warning: unserialize(): Class 'Foo' is not an enum in %s on line %d
+
+Notice: unserialize(): Error at offset 0 of 14 bytes in %s on line %d
+bool(false)
diff --git a/Zend/tests/enum/unserialize-non-existent-case.phpt b/Zend/tests/enum/unserialize-non-existent-case.phpt
new file mode 100644
index 0000000000..2364db5b15
--- /dev/null
+++ b/Zend/tests/enum/unserialize-non-existent-case.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Enum unserialize non-existent case
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+var_dump(unserialize('E:7:"Foo:Baz";'));
+
+?>
+--EXPECTF--
+Warning: unserialize(): Undefined constant Foo::Baz in %s on line %d
+
+Notice: unserialize(): Error at offset 14 of 14 bytes in %s on line %d
+bool(false)
diff --git a/Zend/tests/enum/unserialize-refcount.phpt b/Zend/tests/enum/unserialize-refcount.phpt
new file mode 100644
index 0000000000..447b3af182
--- /dev/null
+++ b/Zend/tests/enum/unserialize-refcount.phpt
@@ -0,0 +1,45 @@
+--TEST--
+Enum unserialize refcount
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+debug_zval_dump(Foo::Bar);
+
+$foo = Foo::Bar;
+debug_zval_dump($foo);
+
+$bar = unserialize('E:7:"Foo:Bar";');
+debug_zval_dump($foo);
+
+unset($bar);
+debug_zval_dump($foo);
+
+unset($foo);
+debug_zval_dump(Foo::Bar);
+
+?>
+--EXPECT--
+object(Foo)#1 (1) refcount(2){
+ ["name"]=>
+ string(3) "Bar" interned
+}
+object(Foo)#1 (1) refcount(3){
+ ["name"]=>
+ string(3) "Bar" interned
+}
+object(Foo)#1 (1) refcount(4){
+ ["name"]=>
+ string(3) "Bar" interned
+}
+object(Foo)#1 (1) refcount(3){
+ ["name"]=>
+ string(3) "Bar" interned
+}
+object(Foo)#1 (1) refcount(2){
+ ["name"]=>
+ string(3) "Bar" interned
+}
diff --git a/Zend/tests/enum/unserialize.phpt b/Zend/tests/enum/unserialize.phpt
new file mode 100644
index 0000000000..c5a10a8fe5
--- /dev/null
+++ b/Zend/tests/enum/unserialize.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Enum unserialize
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ case Quux;
+}
+
+$bar = unserialize('E:7:"Foo:Bar";');
+var_dump($bar);
+var_dump($bar === Foo::Bar);
+
+$quux = unserialize('E:8:"Foo:Quux";');
+var_dump($quux);
+var_dump($quux === Foo::Quux);
+
+?>
+--EXPECT--
+enum(Foo::Bar)
+bool(true)
+enum(Foo::Quux)
+bool(true)
diff --git a/Zend/tests/enum/value-property-type.phpt b/Zend/tests/enum/value-property-type.phpt
new file mode 100644
index 0000000000..ed009dd981
--- /dev/null
+++ b/Zend/tests/enum/value-property-type.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Enum value property has automatic type
+--FILE--
+<?php
+
+enum IntEnum: int {
+ case Foo = 0;
+}
+
+enum StringEnum: string {
+ case Foo = 'Foo';
+}
+
+echo (new ReflectionProperty(IntEnum::class, 'value'))->getType() . "\n";
+echo (new ReflectionProperty(StringEnum::class, 'value'))->getType() . "\n";
+
+?>
+--EXPECT--
+int
+string
diff --git a/Zend/tests/enum/var_dump-nested.phpt b/Zend/tests/enum/var_dump-nested.phpt
new file mode 100644
index 0000000000..73a4e51c38
--- /dev/null
+++ b/Zend/tests/enum/var_dump-nested.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Enum var_dump nested
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+var_dump([[Foo::Bar]]);
+
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ array(1) {
+ [0]=>
+ enum(Foo::Bar)
+ }
+}
diff --git a/Zend/tests/enum/var_dump-reference.phpt b/Zend/tests/enum/var_dump-reference.phpt
new file mode 100644
index 0000000000..fe04e7865c
--- /dev/null
+++ b/Zend/tests/enum/var_dump-reference.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Enum var_dump reference
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ case Baz;
+}
+
+$arr = [Foo::Bar];
+$arr[1] = &$arr[0];
+var_dump($arr);
+
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ &enum(Foo::Bar)
+ [1]=>
+ &enum(Foo::Bar)
+}
diff --git a/Zend/tests/enum/var_export.phpt b/Zend/tests/enum/var_export.phpt
new file mode 100644
index 0000000000..430444d13d
--- /dev/null
+++ b/Zend/tests/enum/var_export.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Enum var_export
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+var_export(Foo::Bar);
+
+?>
+--EXPECT--
+Foo::Bar
diff --git a/Zend/tests/exception_001.phpt b/Zend/tests/exception_001.phpt
index 232ef012ed..aba29d4aa3 100644
--- a/Zend/tests/exception_001.phpt
+++ b/Zend/tests/exception_001.phpt
@@ -7,7 +7,7 @@ try {
try {
try {
try {
- throw new Exception(NULL);
+ throw new Exception();
} catch (Exception $e) {
var_dump($e->getMessage());
throw $e;
diff --git a/Zend/tests/gc_010.phpt b/Zend/tests/gc_010.phpt
deleted file mode 100644
index 756c8ebc2a..0000000000
--- a/Zend/tests/gc_010.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-GC 010: Cycle with reference to $GLOBALS
---INI--
-zend.enable_gc=1
---FILE--
-<?php
-$a = array();
-$a[] =& $a;
-var_dump($a);
-$a[] =& $GLOBALS;
-unset($a);
-var_dump(gc_collect_cycles());
-echo "ok\n"
-?>
---EXPECT--
-array(1) {
- [0]=>
- *RECURSION*
-}
-int(1)
-ok
diff --git a/Zend/tests/get_mangled_object_vars.phpt b/Zend/tests/get_mangled_object_vars.phpt
index 735548579e..f9ad008a33 100644
--- a/Zend/tests/get_mangled_object_vars.phpt
+++ b/Zend/tests/get_mangled_object_vars.phpt
@@ -33,10 +33,10 @@ echo "\n";
?>
--EXPECT--
array (
- '' . "\0" . 'B' . "\0" . 'priv' => 4,
'pub' => 1,
'' . "\0" . '*' . "\0" . 'prot' => 2,
'' . "\0" . 'A' . "\0" . 'priv' => 3,
+ '' . "\0" . 'B' . "\0" . 'priv' => 4,
'dyn' => 5,
6 => 6,
)
diff --git a/Zend/tests/globals_001.phpt b/Zend/tests/globals_001.phpt
index 069e88730c..7c54046212 100644
--- a/Zend/tests/globals_001.phpt
+++ b/Zend/tests/globals_001.phpt
@@ -29,6 +29,6 @@ string(%d) "%s"
Warning: Undefined array key "PHP_SELF" in %s on line %d
NULL
-Warning: Undefined variable $_SERVER in %s on line %d
+Warning: Undefined global variable $_SERVER in %s on line %d
NULL
Done
diff --git a/Zend/tests/globals_002.phpt b/Zend/tests/globals_002.phpt
index d8f9ad4aa2..faa9b94ade 100644
--- a/Zend/tests/globals_002.phpt
+++ b/Zend/tests/globals_002.phpt
@@ -32,6 +32,6 @@ string(%d) "%s"
Warning: Undefined array key "PHP_SELF" in %s on line %d
NULL
-Warning: Undefined variable $_SERVER in %s on line %d
+Warning: Undefined global variable $_SERVER in %s on line %d
NULL
Done
diff --git a/Zend/tests/globals_003.phpt b/Zend/tests/globals_003.phpt
index 6ac9d9f779..36e74bde64 100644
--- a/Zend/tests/globals_003.phpt
+++ b/Zend/tests/globals_003.phpt
@@ -38,6 +38,6 @@ string(%d) "%s"
Warning: Undefined array key "PHP_SELF" in %s on line %d
NULL
-Warning: Undefined variable $_SERVER in %s on line %d
+Warning: Undefined global variable $_SERVER in %s on line %d
NULL
Done
diff --git a/Zend/tests/globals_004.phpt b/Zend/tests/globals_004.phpt
index 27520a220c..4c81e5e57a 100644
--- a/Zend/tests/globals_004.phpt
+++ b/Zend/tests/globals_004.phpt
@@ -23,6 +23,6 @@ string(%d) "%s"
Warning: Undefined array key "PHP_SELF" in %s on line %d
NULL
-Warning: Undefined variable $_SERVER in %s on line %d
+Warning: Undefined global variable $_SERVER in %s on line %d
NULL
Done
diff --git a/Zend/tests/inherit_internal_static.phpt b/Zend/tests/inherit_internal_static.phpt
index 4716717f15..6e29301b74 100644
--- a/Zend/tests/inherit_internal_static.phpt
+++ b/Zend/tests/inherit_internal_static.phpt
@@ -1,7 +1,7 @@
--TEST--
Inherit internal static property into userland class
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip requires zend-test'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip requires zend_test'); ?>
--FILE--
<?php
diff --git a/Zend/tests/interface_exists_001.phpt b/Zend/tests/interface_exists_001.phpt
index 84e9c6df1e..4bc01221a8 100644
--- a/Zend/tests/interface_exists_001.phpt
+++ b/Zend/tests/interface_exists_001.phpt
@@ -8,10 +8,8 @@ interface foo {
var_dump(interface_exists('foo'));
var_dump(interface_exists(1));
-var_dump(interface_exists(NULL));
?>
--EXPECT--
bool(true)
bool(false)
-bool(false)
diff --git a/Zend/tests/invalid_const_class_name.phpt b/Zend/tests/invalid_const_class_name.phpt
new file mode 100644
index 0000000000..bedd74e1df
--- /dev/null
+++ b/Zend/tests/invalid_const_class_name.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Invalid constant class name in nested class constant access
+--FILE--
+<?php
+[]::X::X;
+?>
+--EXPECTF--
+Fatal error: Illegal class name in %s on line %d
diff --git a/Zend/tests/iterable_or_null.phpt b/Zend/tests/iterable_or_null.phpt
index 9f798af06d..19cb854437 100644
--- a/Zend/tests/iterable_or_null.phpt
+++ b/Zend/tests/iterable_or_null.phpt
@@ -2,7 +2,7 @@
Test Z_PARAM_ITERABLE() and Z_PARAM_ITERABLE_OR_NULL
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not loaded');
?>
--FILE--
<?php
diff --git a/Zend/tests/list_keyed_leading_comma.phpt b/Zend/tests/list_keyed_leading_comma.phpt
new file mode 100644
index 0000000000..dcadcbf393
--- /dev/null
+++ b/Zend/tests/list_keyed_leading_comma.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Leading comma in keyed list assignment
+--FILE--
+<?php
+
+[, "a" => $b] = [1, "a" => 2];
+
+?>
+--EXPECTF--
+Fatal error: Cannot use empty array entries in keyed array assignment in %s on line %d
diff --git a/Zend/tests/lsb_023.phpt b/Zend/tests/lsb_023.phpt
new file mode 100644
index 0000000000..a8051aa85f
--- /dev/null
+++ b/Zend/tests/lsb_023.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Late Static Binding static:: calls protected / public method of child class even then
+the method is private in parent class
+--FILE--
+<?php
+class A {
+ public static function out() {
+ echo static::value(), PHP_EOL;
+ }
+
+ private static function value() { return 'A'; }
+}
+class B extends A {
+ protected static function value() { return 'B'; }
+}
+class C extends A {
+ public static function value() { return 'C'; }
+}
+A::out();
+B::out();
+C::out();
+echo PHP_EOL;
+--EXPECT--
+A
+B
+C
diff --git a/Zend/tests/lsb_024.phpt b/Zend/tests/lsb_024.phpt
new file mode 100644
index 0000000000..2c71c678d3
--- /dev/null
+++ b/Zend/tests/lsb_024.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Late Static Binding static:: accesses protected / public static variables of child
+class when the variable is private in parent class
+--FILE--
+<?php
+class A {
+ private static $value = 'A';
+
+ public static function out() {
+ echo static::$value, PHP_EOL;
+ }
+}
+class B extends A {
+ protected static $value = 'B';
+}
+class C extends A {
+ public static $value = 'C';
+}
+A::out();
+B::out();
+C::out();
+--EXPECT--
+A
+B
+C
diff --git a/Zend/tests/method_static_var.phpt b/Zend/tests/method_static_var.phpt
index 06574732d7..f92e6d3a5d 100644
--- a/Zend/tests/method_static_var.phpt
+++ b/Zend/tests/method_static_var.phpt
@@ -3,8 +3,6 @@ Initial value of static var in method depends on the include time of the class d
--FILE--
<?php
-/* The current behavior is probably a bug, but we should still test how it currently works. */
-
class Foo {
public static function test() {
static $i = 0;
@@ -22,5 +20,5 @@ Bar::test();
--EXPECT--
int(1)
int(2)
+int(1)
int(2)
-int(3)
diff --git a/Zend/tests/multibyte/multibyte_encoding_001.phpt b/Zend/tests/multibyte/multibyte_encoding_001.phpt
index 3b26dcb989..f95b4311a9 100644
--- a/Zend/tests/multibyte/multibyte_encoding_001.phpt
+++ b/Zend/tests/multibyte/multibyte_encoding_001.phpt
@@ -13,7 +13,7 @@ internal_encoding=SJIS
<?php
declare(encoding='Shift_JIS');
$s = "•\"; // 0x95+0x5c in script, not somewhere else "
-printf("%x:%x\n", ord($s[0]), ord($s[1]));
+printf("%x:%x", ord($s[0]), ord($s[1]));
?>
--EXPECT--
95:5c
diff --git a/Zend/tests/multibyte/multibyte_encoding_003.phpt b/Zend/tests/multibyte/multibyte_encoding_003.phpt
index a0983329f4..f0fb60f6cd 100644
--- a/Zend/tests/multibyte/multibyte_encoding_003.phpt
+++ b/Zend/tests/multibyte/multibyte_encoding_003.phpt
Binary files differ
diff --git a/Zend/tests/named_params/undef_var.phpt b/Zend/tests/named_params/undef_var.phpt
index b1d5682434..5ef41e26dd 100644
--- a/Zend/tests/named_params/undef_var.phpt
+++ b/Zend/tests/named_params/undef_var.phpt
@@ -1,5 +1,5 @@
--TEST--
-Passing undefined variabled to named arg
+Passing undefined variable to named arg
--FILE--
<?php
diff --git a/Zend/tests/null_to_non_nullable_special_func.phpt b/Zend/tests/null_to_non_nullable_special_func.phpt
new file mode 100644
index 0000000000..9dc1c96f72
--- /dev/null
+++ b/Zend/tests/null_to_non_nullable_special_func.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Test null arg behavior for special functions
+--FILE--
+<?php
+
+$null = null;
+var_dump(strlen($null));
+
+?>
+--EXPECTF--
+Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in %s on line %d
+int(0)
diff --git a/Zend/tests/nullsafe_operator/013.phpt b/Zend/tests/nullsafe_operator/013.phpt
index fd1fbc9006..595f292f6f 100644
--- a/Zend/tests/nullsafe_operator/013.phpt
+++ b/Zend/tests/nullsafe_operator/013.phpt
@@ -38,14 +38,21 @@ dump_error(fn() => array_key_exists('foo', $foo?->foo()));
?>
--EXPECTF--
+Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in %s on line %d
int(0)
bool(true)
bool(false)
bool(false)
bool(false)
bool(false)
+
+Deprecated: defined(): Passing null to parameter #1 ($constant_name) of type string is deprecated in %s on line %d
bool(false)
+
+Deprecated: chr(): Passing null to parameter #1 ($codepoint) of type int is deprecated in %s on line %d
string(1) "%s"
+
+Deprecated: ord(): Passing null to parameter #1 ($character) of type string is deprecated in %s on line %d
int(0)
string(98) "call_user_func_array(): Argument #1 ($function) must be a valid callback, no array or string given"
string(77) "call_user_func_array(): Argument #2 ($args) must be of type array, null given"
@@ -55,6 +62,8 @@ string(4) "NULL"
string(52) "func_num_args() expects exactly 0 arguments, 1 given"
string(52) "func_get_args() expects exactly 0 arguments, 1 given"
string(69) "array_slice(): Argument #1 ($array) must be of type array, null given"
+
+Deprecated: array_slice(): Passing null to parameter #2 ($offset) of type int is deprecated in %s on line %d
array(1) {
[0]=>
string(3) "foo"
diff --git a/Zend/tests/objects_033.phpt b/Zend/tests/objects_033.phpt
index 3c19864490..edb722b040 100644
--- a/Zend/tests/objects_033.phpt
+++ b/Zend/tests/objects_033.phpt
@@ -24,5 +24,5 @@ print_r($a, true);
var_dump($a < $b);
?>
--EXPECT--
-bool(false)
-bool(false)
+bool(true)
+bool(true)
diff --git a/Zend/tests/oct_whitespace.phpt b/Zend/tests/oct_whitespace.phpt
new file mode 100644
index 0000000000..cb0bf4ad7a
--- /dev/null
+++ b/Zend/tests/oct_whitespace.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Octal literal followed by whitespace and another number
+--FILE--
+<?php
+var_dump(0o0 2);
+?>
+--EXPECTF--
+Parse error: syntax error, unexpected integer "2", expecting ")" in %s on line %d
diff --git a/Zend/tests/overloaded_func_001.phpt b/Zend/tests/overloaded_func_001.phpt
index 7fc435f920..d78ef1971c 100644
--- a/Zend/tests/overloaded_func_001.phpt
+++ b/Zend/tests/overloaded_func_001.phpt
@@ -2,7 +2,7 @@
Overloaded function 001
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not loaded');
?>
--FILE--
<?php
diff --git a/Zend/tests/overloaded_func_002.phpt b/Zend/tests/overloaded_func_002.phpt
index a02f1e8e37..0a3107182a 100644
--- a/Zend/tests/overloaded_func_002.phpt
+++ b/Zend/tests/overloaded_func_002.phpt
@@ -2,7 +2,7 @@
Overloaded function 002
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not loaded');
?>
--FILE--
<?php
diff --git a/Zend/tests/resource_key.phpt b/Zend/tests/resource_key.phpt
new file mode 100644
index 0000000000..fddd41bcad
--- /dev/null
+++ b/Zend/tests/resource_key.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Behavior of resources as array keys
+--FILE--
+<?php
+
+$r = fopen(__FILE__, 'r');
+$a = [];
+echo "Assign:";
+$a[$r] = 1;
+echo "Add assign:";
+$a[$r] += 1;
+echo "Inc:";
+$a[$r]++;
+echo "Get:";
+var_dump($a[$r]);
+echo "Isset:";
+var_dump(isset($a[$r]));
+echo "Unset:";
+unset($a[$r]);
+
+?>
+--EXPECTF--
+Assign:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
+Add assign:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
+Inc:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
+Get:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
+int(3)
+Isset:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
+bool(true)
+Unset:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
diff --git a/Zend/tests/restrict_globals/globals_in_globals.phpt b/Zend/tests/restrict_globals/globals_in_globals.phpt
new file mode 100644
index 0000000000..fbb811708c
--- /dev/null
+++ b/Zend/tests/restrict_globals/globals_in_globals.phpt
@@ -0,0 +1,11 @@
+--TEST--
+$GLOBALS no longer contains 'GLOBALS'
+--FILE--
+<?php
+
+$g = $GLOBALS;
+var_dump(isset($g['GLOBALS']));
+
+?>
+--EXPECT--
+bool(false)
diff --git a/Zend/tests/restrict_globals/invalid_append.phpt b/Zend/tests/restrict_globals/invalid_append.phpt
new file mode 100644
index 0000000000..8e8b99fb9b
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_append.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Cannot append to $GLOBALS
+--FILE--
+<?php
+
+$GLOBALS[] = 1;
+
+?>
+--EXPECTF--
+Fatal error: Cannot append to $GLOBALS in %s on line %d
diff --git a/Zend/tests/restrict_globals/invalid_append_isset.phpt b/Zend/tests/restrict_globals/invalid_append_isset.phpt
new file mode 100644
index 0000000000..6cb57351e7
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_append_isset.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Cannot append to $GLOBALS in isset()
+--FILE--
+<?php
+isset($GLOBALS[]);
+?>
+--EXPECTF--
+Fatal error: Cannot use [] for reading in %s on line %d
diff --git a/Zend/tests/restrict_globals/invalid_append_unset.phpt b/Zend/tests/restrict_globals/invalid_append_unset.phpt
new file mode 100644
index 0000000000..b7c06179c7
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_append_unset.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Cannot append to $GLOBALS in unset()
+--FILE--
+<?php
+unset($GLOBALS[]);
+?>
+--EXPECTF--
+Fatal error: Cannot use [] for unsetting in %s on line %d
diff --git a/Zend/tests/restrict_globals/invalid_assign.phpt b/Zend/tests/restrict_globals/invalid_assign.phpt
new file mode 100644
index 0000000000..c42cc9e1f9
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_assign.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Cannot assign to $GLOBALS
+--FILE--
+<?php
+
+$GLOBALS = [];
+
+?>
+--EXPECTF--
+Fatal error: $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax in %s on line %d
diff --git a/Zend/tests/restrict_globals/invalid_assign_list.phpt b/Zend/tests/restrict_globals/invalid_assign_list.phpt
new file mode 100644
index 0000000000..8fc3e524a9
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_assign_list.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Cannot list-assign to $GLOBALS
+--FILE--
+<?php
+
+list($GLOBALS) = [1];
+
+?>
+--EXPECTF--
+Fatal error: $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax in %s on line %d
diff --git a/Zend/tests/restrict_globals/invalid_assign_list_ref.phpt b/Zend/tests/restrict_globals/invalid_assign_list_ref.phpt
new file mode 100644
index 0000000000..594a308ea1
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_assign_list_ref.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Cannot list-assign to $GLOBALS (by-ref)
+--FILE--
+<?php
+
+list(&$GLOBALS) = [1];
+
+?>
+--EXPECTF--
+Fatal error: Cannot assign reference to non referencable value in %s on line %d
diff --git a/Zend/tests/restrict_globals/invalid_assign_op.phpt b/Zend/tests/restrict_globals/invalid_assign_op.phpt
new file mode 100644
index 0000000000..a9b36853ea
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_assign_op.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Cannot compound assign to $GLOBALS
+--FILE--
+<?php
+
+$GLOBALS += [];
+
+?>
+--EXPECTF--
+Fatal error: $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax in %s on line %d
diff --git a/Zend/tests/restrict_globals/invalid_assign_ref_lhs.phpt b/Zend/tests/restrict_globals/invalid_assign_ref_lhs.phpt
new file mode 100644
index 0000000000..b14c167646
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_assign_ref_lhs.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Cannot by-ref assign to $GLOBALS (LHS)
+--FILE--
+<?php
+
+$var = [];
+$GLOBALS =& $var;
+
+?>
+--EXPECTF--
+Fatal error: $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax in %s on line %d
diff --git a/Zend/tests/restrict_globals/invalid_assign_ref_rhs.phpt b/Zend/tests/restrict_globals/invalid_assign_ref_rhs.phpt
new file mode 100644
index 0000000000..3cdab0f9c9
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_assign_ref_rhs.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Cannot by-ref assign to $GLOBALS (RHS)
+--FILE--
+<?php
+
+$var = [];
+$var =& $GLOBALS;
+
+?>
+--EXPECTF--
+Fatal error: Cannot acquire reference to $GLOBALS in %s on line %d
diff --git a/Zend/tests/restrict_globals/invalid_foreach.phpt b/Zend/tests/restrict_globals/invalid_foreach.phpt
new file mode 100644
index 0000000000..0e7c74881a
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_foreach.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Cannot use $GLOBALS as foreach result variable
+--FILE--
+<?php
+
+foreach ([1] as $GLOBALS) {}
+
+?>
+--EXPECTF--
+Fatal error: $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax in %s on line %d
diff --git a/Zend/tests/restrict_globals/invalid_foreach_ref.phpt b/Zend/tests/restrict_globals/invalid_foreach_ref.phpt
new file mode 100644
index 0000000000..2c355c09ae
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_foreach_ref.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Cannot use $GLOBALS as foreach result variable (by-ref)
+--FILE--
+<?php
+
+foreach ([1] as &$GLOBALS) {}
+
+?>
+--EXPECTF--
+Fatal error: $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax in %s on line %d
diff --git a/Zend/tests/restrict_globals/invalid_pass_by_ref.phpt b/Zend/tests/restrict_globals/invalid_pass_by_ref.phpt
new file mode 100644
index 0000000000..a0145a0624
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_pass_by_ref.phpt
@@ -0,0 +1,23 @@
+--TEST--
+$GLOBALS cannot be passed by reference (runtime error)
+--FILE--
+<?php
+
+function by_ref(&$ref) {}
+try {
+ by_ref($GLOBALS);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+try {
+ by_ref2($GLOBALS);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+function by_ref2(&$ref) {}
+
+?>
+--EXPECT--
+by_ref(): Argument #1 ($ref) cannot be passed by reference
+by_ref2(): Argument #1 ($ref) cannot be passed by reference
diff --git a/Zend/tests/restrict_globals/invalid_unset.phpt b/Zend/tests/restrict_globals/invalid_unset.phpt
new file mode 100644
index 0000000000..781388b9b2
--- /dev/null
+++ b/Zend/tests/restrict_globals/invalid_unset.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Cannot unset $GLOBALS
+--FILE--
+<?php
+
+unset($GLOBALS);
+
+?>
+--EXPECTF--
+Fatal error: $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax in %s on line %d
diff --git a/Zend/tests/restrict_globals/key_canonicalization.phpt b/Zend/tests/restrict_globals/key_canonicalization.phpt
new file mode 100644
index 0000000000..66d9a29a92
--- /dev/null
+++ b/Zend/tests/restrict_globals/key_canonicalization.phpt
@@ -0,0 +1,11 @@
+--TEST--
+$GLOBALS should have canonicalized keys
+--FILE--
+<?php
+
+${1} = 42;
+var_dump($GLOBALS[1]);
+
+?>
+--EXPECT--
+int(42)
diff --git a/Zend/tests/restrict_globals/valid.phpt b/Zend/tests/restrict_globals/valid.phpt
new file mode 100644
index 0000000000..b99bbe402f
--- /dev/null
+++ b/Zend/tests/restrict_globals/valid.phpt
@@ -0,0 +1,52 @@
+--TEST--
+Supported operations on $GLOBALS
+--FILE--
+<?php
+
+function test() {
+ var_dump($GLOBALS['x']);
+ $GLOBALS['x'] = 1;
+ var_dump($GLOBALS['x']);
+ $GLOBALS['x']++;
+ var_dump($GLOBALS['x']);
+ $GLOBALS['x'] += 2;
+ var_dump($GLOBALS['x']);
+ unset($GLOBALS['y']);
+ var_dump(isset($GLOBALS['x']));
+ var_dump(isset($GLOBALS['y']));
+ $GLOBALS['z'][] = 1;
+}
+
+$y = 1;
+test();
+var_dump($x, $y, $z);
+
+$ref = 1;
+$GLOBALS['z'] =& $ref;
+$ref++;
+var_dump($z);
+
+$x = 1;
+$ref2 =& $GLOBALS['x'];
+$ref2++;
+var_dump($x);
+
+?>
+--EXPECTF--
+Warning: Undefined global variable $x in %s on line %d
+NULL
+int(1)
+int(2)
+int(4)
+bool(true)
+bool(false)
+
+Warning: Undefined variable $y in %s on line %d
+int(4)
+NULL
+array(1) {
+ [0]=>
+ int(1)
+}
+int(2)
+int(2)
diff --git a/Zend/tests/return_types/internal_functions001.phpt b/Zend/tests/return_types/internal_functions001.phpt
index 153e32ca6e..183f394c9b 100644
--- a/Zend/tests/return_types/internal_functions001.phpt
+++ b/Zend/tests/return_types/internal_functions001.phpt
@@ -2,7 +2,7 @@
Return type for internal functions
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not loaded');
// Internal function return types are only checked in debug builds
if (!PHP_DEBUG) die('skip requires debug build');
?>
diff --git a/Zend/tests/return_types/internal_functions002.phpt b/Zend/tests/return_types/internal_functions002.phpt
index 531b6c452d..f6287b72f0 100644
--- a/Zend/tests/return_types/internal_functions002.phpt
+++ b/Zend/tests/return_types/internal_functions002.phpt
@@ -2,7 +2,7 @@
Return type for internal functions 2
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not loaded');
--FILE--
<?php
zend_test_nullable_array_return();
diff --git a/Zend/tests/return_types/internal_functions003.phpt b/Zend/tests/return_types/internal_functions003.phpt
index a7e71204fa..754b14574d 100644
--- a/Zend/tests/return_types/internal_functions003.phpt
+++ b/Zend/tests/return_types/internal_functions003.phpt
@@ -2,7 +2,7 @@
Return type for internal functions 3: Void return type
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not loaded');
--FILE--
<?php
var_dump(zend_test_void_return());
diff --git a/Zend/tests/static_variable_in_dynamic_function.phpt b/Zend/tests/static_variable_in_dynamic_function.phpt
new file mode 100644
index 0000000000..77b71a4883
--- /dev/null
+++ b/Zend/tests/static_variable_in_dynamic_function.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Static variables in dynamically declared function (first use before dynamic def dtor)
+--FILE--
+<?php
+
+$code = <<<'CODE'
+if (1) {
+ function test() {
+ static $x = 0;
+ var_dump(++$x);
+ }
+ test();
+}
+CODE;
+eval($code);
+test();
+
+?>
+--EXPECT--
+int(1)
+int(2)
diff --git a/Zend/tests/static_variable_in_dynamic_function_2.phpt b/Zend/tests/static_variable_in_dynamic_function_2.phpt
new file mode 100644
index 0000000000..f7c160325f
--- /dev/null
+++ b/Zend/tests/static_variable_in_dynamic_function_2.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Static variables in dynamically declared function (first use after dynamic def dtor)
+--FILE--
+<?php
+
+$code = <<<'CODE'
+if (1) {
+ function test() {
+ static $x = 0;
+ var_dump(++$x);
+ }
+}
+CODE;
+eval($code);
+test();
+test();
+
+?>
+--EXPECT--
+int(1)
+int(2)
diff --git a/Zend/tests/str_or_obj_of_class_zpp.phpt b/Zend/tests/str_or_obj_of_class_zpp.phpt
index b8f5d8492f..04a321a692 100644
--- a/Zend/tests/str_or_obj_of_class_zpp.phpt
+++ b/Zend/tests/str_or_obj_of_class_zpp.phpt
@@ -2,7 +2,7 @@
Test Z_PARAM_OBJ_OF_CLASS_OR_STR() and Z_PARAM_OBJ_OF_CLASS_OR_STR_OR_NULL
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not loaded');
?>
--FILE--
<?php
@@ -51,9 +51,11 @@ try {
}
?>
---EXPECT--
+--EXPECTF--
string(6) "string"
string(1) "1"
+
+Deprecated: zend_string_or_stdclass(): Passing null to parameter #1 ($param) of type string is deprecated in %s on line %d
string(0) ""
object(stdClass)#1 (0) {
}
diff --git a/Zend/tests/str_or_obj_zpp.phpt b/Zend/tests/str_or_obj_zpp.phpt
index 301abd8ddc..00eec7a688 100644
--- a/Zend/tests/str_or_obj_zpp.phpt
+++ b/Zend/tests/str_or_obj_zpp.phpt
@@ -2,7 +2,7 @@
Test Z_PARAM_OBJ_OR_STR() and Z_PARAM_OBJ_OR_STR_OR_NULL
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not loaded');
?>
--FILE--
<?php
@@ -34,9 +34,11 @@ try {
}
?>
---EXPECT--
+--EXPECTF--
string(6) "string"
string(1) "1"
+
+Deprecated: zend_string_or_object(): Passing null to parameter #1 ($param) of type object|string is deprecated in %s on line %d
string(0) ""
object(stdClass)#1 (0) {
}
diff --git a/Zend/tests/trait_exists_001.phpt b/Zend/tests/trait_exists_001.phpt
index 8a7c55d586..8699b07cef 100644
--- a/Zend/tests/trait_exists_001.phpt
+++ b/Zend/tests/trait_exists_001.phpt
@@ -8,10 +8,8 @@ trait foo {
var_dump(trait_exists('foo'));
var_dump(trait_exists(1));
-var_dump(trait_exists(NULL));
?>
--EXPECT--
bool(true)
bool(false)
-bool(false)
diff --git a/Zend/tests/traits/bug69579.phpt b/Zend/tests/traits/bug69579.phpt
index 94387ce3cd..c12f54a374 100644
--- a/Zend/tests/traits/bug69579.phpt
+++ b/Zend/tests/traits/bug69579.phpt
@@ -2,7 +2,7 @@
Bug #69579 (Internal trait double-free)
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not loaded');
?>
--FILE--
<?php
diff --git a/Zend/tests/traits/get_declared_traits_004.phpt b/Zend/tests/traits/get_declared_traits_004.phpt
new file mode 100644
index 0000000000..88149686f7
--- /dev/null
+++ b/Zend/tests/traits/get_declared_traits_004.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Testing get_declared_traits() and class_alias()
+--FILE--
+<?php
+
+trait T { }
+class_alias("T", "A");
+foreach (get_declared_traits() as $name) {
+ if (strlen($name) == 1) {
+ echo $name;
+ }
+}
+echo "\n";
+?>
+--EXPECT--
+Ta
diff --git a/Zend/tests/traits/precedence_unknown_class.phpt b/Zend/tests/traits/precedence_unknown_class.phpt
new file mode 100644
index 0000000000..212cba34e4
--- /dev/null
+++ b/Zend/tests/traits/precedence_unknown_class.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Unknown class in absolute trait precedence reference
+--FILE--
+<?php
+
+trait T {}
+class C {
+ use T {
+ WrongClass::method insteadof C;
+ }
+}
+
+?>
+--EXPECTF--
+Fatal error: Could not find trait WrongClass in %s on line %d
diff --git a/Zend/tests/traits/property008.phpt b/Zend/tests/traits/property008.phpt
index ff265be2a0..d4d57f379a 100644
--- a/Zend/tests/traits/property008.phpt
+++ b/Zend/tests/traits/property008.phpt
@@ -42,20 +42,20 @@ var_dump($b);
?>
--EXPECT--
object(SubclassClassicInheritance)#1 (2) {
- ["hello":"SubclassClassicInheritance":private]=>
- int(0)
["hello":"BaseWithPropA":private]=>
int(0)
+ ["hello":"SubclassClassicInheritance":private]=>
+ int(0)
}
object(SubclassA)#2 (2) {
- ["hello":"SubclassA":private]=>
- int(0)
["hello":"BaseWithPropA":private]=>
int(0)
+ ["hello":"SubclassA":private]=>
+ int(0)
}
object(SubclassB)#3 (2) {
- ["hello":"SubclassB":private]=>
- int(0)
["hello":"BaseWithTPropB":private]=>
int(0)
+ ["hello":"SubclassB":private]=>
+ int(0)
}
diff --git a/Zend/tests/type_declarations/internal_function_strict_mode.phpt b/Zend/tests/type_declarations/internal_function_strict_mode.phpt
index 04c59ae341..455164f327 100644
--- a/Zend/tests/type_declarations/internal_function_strict_mode.phpt
+++ b/Zend/tests/type_declarations/internal_function_strict_mode.phpt
@@ -30,6 +30,6 @@ try {
*** Trying Ord With Integer
*** Caught ord(): Argument #1 ($character) must be of type string, int given
*** Trying Array Map With Invalid Callback
-*** Caught array_map(): Argument #1 ($callback) must be a valid callback, first array member is not a valid class name or object
+*** Caught array_map(): Argument #1 ($callback) must be a valid callback or null, first array member is not a valid class name or object
*** Trying Strlen With Float
*** Caught strlen(): Argument #1 ($str) must be of type string, float given
diff --git a/Zend/tests/type_declarations/typed_properties_095.phpt b/Zend/tests/type_declarations/typed_properties_095.phpt
index 8470d4f437..7e92cec682 100644
--- a/Zend/tests/type_declarations/typed_properties_095.phpt
+++ b/Zend/tests/type_declarations/typed_properties_095.phpt
@@ -1,7 +1,7 @@
--TEST--
Typed properties in internal classes
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip requires zend-test'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip requires zend_test'); ?>
--FILE--
<?php
diff --git a/Zend/tests/type_declarations/union_types/inheritance_internal.phpt b/Zend/tests/type_declarations/union_types/inheritance_internal.phpt
index bb53411cad..84d0f88211 100644
--- a/Zend/tests/type_declarations/union_types/inheritance_internal.phpt
+++ b/Zend/tests/type_declarations/union_types/inheritance_internal.phpt
@@ -2,7 +2,7 @@
Inheritance of union type from internal class
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip requires zend-test extension');
+if (!extension_loaded('zend_test')) die('skip requires zend_test extension');
?>
--FILE--
<?php
diff --git a/Zend/tests/undef_index_to_exception.phpt b/Zend/tests/undef_index_to_exception.phpt
index c01aaba658..bbe13c0e71 100644
--- a/Zend/tests/undef_index_to_exception.phpt
+++ b/Zend/tests/undef_index_to_exception.phpt
@@ -42,5 +42,5 @@ array(0) {
Undefined array key "key"
array(0) {
}
-Undefined array key "test"
+Undefined global variable $test
Undefined variable $test
diff --git a/Zend/tests/unset_cv09.phpt b/Zend/tests/unset_cv09.phpt
deleted file mode 100644
index 63a7eab0f2..0000000000
--- a/Zend/tests/unset_cv09.phpt
+++ /dev/null
@@ -1,14 +0,0 @@
---TEST--
-unset() CV 9 (unset() of global variable in array_pop($GLOBALS))
---FILE--
-<?php
-$x = "ok\n";
-echo array_pop($GLOBALS);
-echo $x;
-echo "ok\n";
-?>
---EXPECTF--
-ok
-
-Warning: Undefined variable $x in %s on line %d
-ok
diff --git a/Zend/tests/unset_cv10.phpt b/Zend/tests/unset_cv10.phpt
index c62b8ae57a..e8908be0f7 100644
--- a/Zend/tests/unset_cv10.phpt
+++ b/Zend/tests/unset_cv10.phpt
@@ -2,6 +2,7 @@
unset() CV 10 (unset() of global variable in ArrayObject::offsetUnset($GLOBALS))
--FILE--
<?php
+/* This is working on a copy of $GLOBALS, so nothing interesting happens here. */
$a = new ArrayObject($GLOBALS);
$x = "ok\n";
echo $x;
@@ -12,5 +13,6 @@ echo "ok\n";
--EXPECTF--
ok
-Warning: Undefined variable $x in %s on line %d
+Warning: Undefined array key "x" in %s on line %d
+ok
ok
diff --git a/Zend/zend.c b/Zend/zend.c
index cbd5aef42b..c76a7e6fba 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -34,6 +34,7 @@
#include "zend_cpuinfo.h"
#include "zend_attributes.h"
#include "zend_observer.h"
+#include "Optimizer/zend_optimizer.h"
static size_t global_map_ptr_last = 0;
@@ -60,7 +61,7 @@ ZEND_TSRMLS_CACHE_DEFINE()
#endif
ZEND_API zend_utility_values zend_uv;
-ZEND_API zend_bool zend_dtrace_enabled;
+ZEND_API bool zend_dtrace_enabled;
/* version information */
static char *zend_version_info;
@@ -72,15 +73,15 @@ static uint32_t zend_version_info_length;
ZEND_API zend_class_entry *zend_standard_class_def = NULL;
ZEND_API size_t (*zend_printf)(const char *format, ...);
ZEND_API zend_write_func_t zend_write;
-ZEND_API FILE *(*zend_fopen)(const char *filename, zend_string **opened_path);
-ZEND_API zend_result (*zend_stream_open_function)(const char *filename, zend_file_handle *handle);
+ZEND_API FILE *(*zend_fopen)(zend_string *filename, zend_string **opened_path);
+ZEND_API zend_result (*zend_stream_open_function)(zend_file_handle *handle);
ZEND_API void (*zend_ticks_function)(int ticks);
ZEND_API void (*zend_interrupt_function)(zend_execute_data *execute_data);
ZEND_API void (*zend_error_cb)(int type, const char *error_filename, const uint32_t error_lineno, zend_string *message);
void (*zend_printf_to_smart_string)(smart_string *buf, const char *format, va_list ap);
void (*zend_printf_to_smart_str)(smart_str *buf, const char *format, va_list ap);
ZEND_API char *(*zend_getenv)(const char *name, size_t name_len);
-ZEND_API zend_string *(*zend_resolve_path)(const char *filename, size_t filename_len);
+ZEND_API zend_string *(*zend_resolve_path)(zend_string *filename);
ZEND_API zend_result (*zend_post_startup_cb)(void) = NULL;
ZEND_API void (*zend_post_shutdown_cb)(void) = NULL;
ZEND_API zend_result (*zend_preload_autoload)(zend_string *filename) = NULL;
@@ -92,7 +93,7 @@ static void (*zend_message_dispatcher_p)(zend_long message, const void *data);
static zval *(*zend_get_configuration_directive_p)(zend_string *name);
#if ZEND_RC_DEBUG
-ZEND_API zend_bool zend_rc_debug = 0;
+ZEND_API bool zend_rc_debug = 0;
#endif
static ZEND_INI_MH(OnUpdateErrorReporting) /* {{{ */
@@ -108,7 +109,7 @@ static ZEND_INI_MH(OnUpdateErrorReporting) /* {{{ */
static ZEND_INI_MH(OnUpdateGCEnabled) /* {{{ */
{
- zend_bool val;
+ bool val;
val = zend_ini_parse_bool(new_value);
gc_enable(val);
@@ -290,7 +291,7 @@ ZEND_API zend_string *zend_strpprintf_unchecked(size_t max_len, const char *form
static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent);
-static void print_hash(smart_str *buf, HashTable *ht, int indent, zend_bool is_object) /* {{{ */
+static void print_hash(smart_str *buf, HashTable *ht, int indent, bool is_object) /* {{{ */
{
zval *tmp;
zend_string *string_key;
@@ -456,11 +457,22 @@ static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /*
{
HashTable *properties;
- zend_string *class_name = Z_OBJ_HANDLER_P(expr, get_class_name)(Z_OBJ_P(expr));
+ zend_object *zobj = Z_OBJ_P(expr);
+ zend_string *class_name = Z_OBJ_HANDLER_P(expr, get_class_name)(zobj);
smart_str_appends(buf, ZSTR_VAL(class_name));
zend_string_release_ex(class_name, 0);
- smart_str_appends(buf, " Object\n");
+ if (!(zobj->ce->ce_flags & ZEND_ACC_ENUM)) {
+ smart_str_appends(buf, " Object\n");
+ } else {
+ smart_str_appends(buf, " Enum");
+ if (zobj->ce->enum_backing_type != IS_UNDEF) {
+ smart_str_appendc(buf, ':');
+ smart_str_appends(buf, zend_get_type_by_const(zobj->ce->enum_backing_type));
+ }
+ smart_str_appendc(buf, '\n');
+ }
+
if (GC_IS_RECURSIVE(Z_OBJ_P(expr))) {
smart_str_appends(buf, " *RECURSION*");
return;
@@ -514,17 +526,17 @@ ZEND_API void zend_print_zval_r(zval *expr, int indent) /* {{{ */
}
/* }}} */
-static FILE *zend_fopen_wrapper(const char *filename, zend_string **opened_path) /* {{{ */
+static FILE *zend_fopen_wrapper(zend_string *filename, zend_string **opened_path) /* {{{ */
{
if (opened_path) {
- *opened_path = zend_string_init(filename, strlen(filename), 0);
+ *opened_path = zend_string_copy(filename);
}
- return fopen(filename, "rb");
+ return fopen(ZSTR_VAL(filename), "rb");
}
/* }}} */
#ifdef ZTS
-static zend_bool short_tags_default = 1;
+static bool short_tags_default = 1;
static uint32_t compiler_options_default = ZEND_COMPILE_DEFAULT;
#else
# define short_tags_default 1
@@ -659,6 +671,7 @@ static void compiler_globals_ctor(zend_compiler_globals *compiler_globals) /* {{
zend_hash_copy(compiler_globals->auto_globals, global_auto_globals_table, auto_global_copy_ctor);
compiler_globals->script_encoding_list = NULL;
+ compiler_globals->current_linking_class = NULL;
#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
/* Map region is going to be created and resized at run-time. */
@@ -712,7 +725,7 @@ static void executor_globals_ctor(zend_executor_globals *executor_globals) /* {{
zend_init_exception_op();
zend_init_call_trampoline_op();
memset(&executor_globals->trampoline, 0, sizeof(zend_op_array));
- executor_globals->lambda_count = 0;
+ executor_globals->capture_warnings_during_sccp = 0;
ZVAL_UNDEF(&executor_globals->user_error_handler);
ZVAL_UNDEF(&executor_globals->user_exception_handler);
executor_globals->in_autoload = NULL;
@@ -784,15 +797,10 @@ static void module_destructor_zval(zval *zv) /* {{{ */
}
/* }}} */
-static zend_bool php_auto_globals_create_globals(zend_string *name) /* {{{ */
+static bool php_auto_globals_create_globals(zend_string *name) /* {{{ */
{
- zval globals;
-
- /* IS_ARRAY, but with ref-counter 1 and not IS_TYPE_REFCOUNTED */
- ZVAL_ARR(&globals, &EG(symbol_table));
- Z_TYPE_FLAGS_P(&globals) = 0;
- ZVAL_NEW_REF(&globals, &globals);
- zend_hash_update(&EG(symbol_table), name, &globals);
+ /* While we keep registering $GLOBALS as an auto-global, we do not create an
+ * actual variable for it. Access to it handled specially by the compiler. */
return 0;
}
/* }}} */
@@ -958,6 +966,8 @@ void zend_startup(zend_utility_functions *utility_functions) /* {{{ */
php_win32_cp_setup();
#endif
+ zend_optimizer_startup();
+
#ifdef ZTS
tsrm_set_new_thread_end_handler(zend_new_thread_end_handler);
tsrm_set_shutdown_handler(zend_interned_strings_dtor);
@@ -1117,6 +1127,8 @@ void zend_shutdown(void) /* {{{ */
}
#endif
zend_destroy_rsrc_list_dtors();
+
+ zend_optimizer_shutdown();
}
/* }}} */
@@ -1292,12 +1304,20 @@ static ZEND_COLD void zend_error_impl(
zval params[4];
zval retval;
zval orig_user_error_handler;
- zend_bool in_compilation;
+ bool in_compilation;
zend_class_entry *saved_class_entry;
zend_stack loop_var_stack;
zend_stack delayed_oplines_stack;
int type = orig_type & E_ALL;
+ /* If we're executing a function during SCCP, count any warnings that may be emitted,
+ * but don't perform any other error handling. */
+ if (EG(capture_warnings_during_sccp)) {
+ ZEND_ASSERT(!(type & E_FATAL_ERRORS) && "Fatal error during SCCP");
+ EG(capture_warnings_during_sccp)++;
+ return;
+ }
+
/* Report about uncaught exception in case of fatal errors */
if (EG(exception)) {
zend_execute_data *ex;
@@ -1596,7 +1616,7 @@ ZEND_API ZEND_COLD void zend_value_error(const char *format, ...) /* {{{ */
va_end(va);
} /* }}} */
-ZEND_API ZEND_COLD void zend_output_debug_string(zend_bool trigger_break, const char *format, ...) /* {{{ */
+ZEND_API ZEND_COLD void zend_output_debug_string(bool trigger_break, const char *format, ...) /* {{{ */
{
#if ZEND_DEBUG
va_list args;
@@ -1665,9 +1685,6 @@ ZEND_API zend_result zend_execute_scripts(int type, zval *retval, int file_count
}
if (ret == FAILURE) {
- /* If a failure occurred in one of the earlier files,
- * only destroy the following file handles. */
- zend_file_handle_dtor(file_handle);
continue;
}
@@ -1675,7 +1692,6 @@ ZEND_API zend_result zend_execute_scripts(int type, zval *retval, int file_count
if (file_handle->opened_path) {
zend_hash_add_empty_element(&EG(included_files), file_handle->opened_path);
}
- zend_destroy_file_handle(file_handle);
if (op_array) {
zend_execute(op_array, retval);
zend_exception_restore();
@@ -1687,6 +1703,7 @@ ZEND_API zend_result zend_execute_scripts(int type, zval *retval, int file_count
ret = zend_exception_error(EG(exception), E_ERROR);
}
}
+ zend_destroy_static_vars(op_array);
destroy_op_array(op_array);
efree_size(op_array, sizeof(zend_op_array));
} else if (type==ZEND_REQUIRE) {
diff --git a/Zend/zend.h b/Zend/zend.h
index dc451dc651..aed352cf8d 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -20,7 +20,7 @@
#ifndef ZEND_H
#define ZEND_H
-#define ZEND_VERSION "4.0.5-dev"
+#define ZEND_VERSION "4.1.0-dev"
#define ZEND_ENGINE_3
@@ -107,6 +107,28 @@ typedef struct _zend_trait_alias {
uint32_t modifiers;
} zend_trait_alias;
+typedef struct _zend_class_mutable_data {
+ zval *default_properties_table;
+ HashTable *constants_table;
+ uint32_t ce_flags;
+} zend_class_mutable_data;
+
+typedef struct _zend_class_dependency {
+ zend_string *name;
+ zend_class_entry *ce;
+} zend_class_dependency;
+
+typedef struct _zend_inheritance_cache_entry zend_inheritance_cache_entry;
+
+struct _zend_inheritance_cache_entry {
+ zend_inheritance_cache_entry *next;
+ zend_class_entry *ce;
+ zend_class_entry *parent;
+ zend_class_dependency *dependencies;
+ uint32_t dependencies_count;
+ zend_class_entry *traits_and_interfaces[1];
+};
+
struct _zend_class_entry {
char type;
zend_string *name;
@@ -127,6 +149,9 @@ struct _zend_class_entry {
HashTable properties_info;
HashTable constants_table;
+ ZEND_MAP_PTR_DEF(zend_class_mutable_data*, mutable_data);
+ zend_inheritance_cache_entry *inheritance_cache;
+
struct _zend_property_info **properties_info_table;
zend_function *constructor;
@@ -172,6 +197,9 @@ struct _zend_class_entry {
zend_trait_precedence **trait_precedences;
HashTable *attributes;
+ uint32_t enum_backing_type;
+ HashTable *backed_enum_table;
+
union {
struct {
zend_string *filename;
@@ -190,20 +218,20 @@ typedef struct _zend_utility_functions {
void (*error_function)(int type, const char *error_filename, const uint32_t error_lineno, zend_string *message);
size_t (*printf_function)(const char *format, ...) ZEND_ATTRIBUTE_PTR_FORMAT(printf, 1, 2);
size_t (*write_function)(const char *str, size_t str_length);
- FILE *(*fopen_function)(const char *filename, zend_string **opened_path);
+ FILE *(*fopen_function)(zend_string *filename, zend_string **opened_path);
void (*message_handler)(zend_long message, const void *data);
zval *(*get_configuration_directive)(zend_string *name);
void (*ticks_function)(int ticks);
void (*on_timeout)(int seconds);
- zend_result (*stream_open_function)(const char *filename, zend_file_handle *handle);
+ zend_result (*stream_open_function)(zend_file_handle *handle);
void (*printf_to_smart_string_function)(smart_string *buf, const char *format, va_list ap);
void (*printf_to_smart_str_function)(smart_str *buf, const char *format, va_list ap);
char *(*getenv_function)(const char *name, size_t name_len);
- zend_string *(*resolve_path_function)(const char *filename, size_t filename_len);
+ zend_string *(*resolve_path_function)(zend_string *filename);
} zend_utility_functions;
typedef struct _zend_utility_values {
- zend_bool html_errors;
+ bool html_errors;
} zend_utility_values;
typedef size_t (*zend_write_func_t)(const char *str, size_t str_length);
@@ -255,7 +283,7 @@ ZEND_API void zend_print_flat_zval_r(zval *expr);
#define zend_print_variable(var) \
zend_print_zval((var), 0)
-ZEND_API ZEND_COLD void zend_output_debug_string(zend_bool trigger_break, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
+ZEND_API ZEND_COLD void zend_output_debug_string(bool trigger_break, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
ZEND_API void zend_activate(void);
ZEND_API void zend_deactivate(void);
@@ -278,16 +306,16 @@ END_EXTERN_C()
BEGIN_EXTERN_C()
extern ZEND_API size_t (*zend_printf)(const char *format, ...) ZEND_ATTRIBUTE_PTR_FORMAT(printf, 1, 2);
extern ZEND_API zend_write_func_t zend_write;
-extern ZEND_API FILE *(*zend_fopen)(const char *filename, zend_string **opened_path);
+extern ZEND_API FILE *(*zend_fopen)(zend_string *filename, zend_string **opened_path);
extern ZEND_API void (*zend_ticks_function)(int ticks);
extern ZEND_API void (*zend_interrupt_function)(zend_execute_data *execute_data);
extern ZEND_API void (*zend_error_cb)(int type, const char *error_filename, const uint32_t error_lineno, zend_string *message);
extern ZEND_API void (*zend_on_timeout)(int seconds);
-extern ZEND_API zend_result (*zend_stream_open_function)(const char *filename, zend_file_handle *handle);
+extern ZEND_API zend_result (*zend_stream_open_function)(zend_file_handle *handle);
extern void (*zend_printf_to_smart_string)(smart_string *buf, const char *format, va_list ap);
extern void (*zend_printf_to_smart_str)(smart_str *buf, const char *format, va_list ap);
extern ZEND_API char *(*zend_getenv)(const char *name, size_t name_len);
-extern ZEND_API zend_string *(*zend_resolve_path)(const char *filename, size_t filename_len);
+extern ZEND_API zend_string *(*zend_resolve_path)(zend_string *filename);
/* These two callbacks are especially for opcache */
extern ZEND_API zend_result (*zend_post_startup_cb)(void);
@@ -316,7 +344,7 @@ extern ZEND_API zend_class_entry *zend_standard_class_def;
extern ZEND_API zend_utility_values zend_uv;
/* If DTrace is available and enabled */
-extern ZEND_API zend_bool zend_dtrace_enabled;
+extern ZEND_API bool zend_dtrace_enabled;
END_EXTERN_C()
#define ZEND_UV(name) (zend_uv.name)
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 11760d50f0..ca6214ea1f 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -215,6 +215,9 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_error(int error_code,
case ZPP_ERROR_WRONG_CALLBACK:
zend_wrong_callback_error(num, name);
break;
+ case ZPP_ERROR_WRONG_CALLBACK_OR_NULL:
+ zend_wrong_callback_or_null_error(num, name);
+ break;
case ZPP_ERROR_WRONG_CLASS:
zend_wrong_parameter_class_error(num, name, arg);
break;
@@ -337,6 +340,17 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(uint32_t num, ch
}
/* }}} */
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_or_null_error(uint32_t num, char *error) /* {{{ */
+{
+ if (EG(exception)) {
+ return;
+ }
+
+ zend_argument_type_error(num, "must be a valid callback or null, %s", error);
+ efree(error);
+}
+/* }}} */
+
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_unexpected_extra_named_error(void)
{
const char *space;
@@ -426,9 +440,41 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_class(zval *arg, zend_class_entry **p
}
/* }}} */
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_weak(zval *arg, zend_bool *dest) /* {{{ */
+static ZEND_COLD bool zend_null_arg_deprecated(const char *fallback_type, uint32_t arg_num) {
+ zend_function *func = EG(current_execute_data)->func;
+ ZEND_ASSERT(arg_num > 0);
+ uint32_t arg_offset = arg_num - 1;
+ if (arg_offset >= func->common.num_args) {
+ ZEND_ASSERT(func->common.fn_flags & ZEND_ACC_VARIADIC);
+ arg_offset = func->common.num_args;
+ }
+
+ zend_arg_info *arg_info = &func->common.arg_info[arg_offset];
+ zend_string *func_name = get_active_function_or_method_name();
+ const char *arg_name = get_active_function_arg_name(arg_num);
+
+ /* If no type is specified in arginfo, use the specified fallback_type determined through
+ * zend_parse_parameters instead. */
+ zend_string *type_str = zend_type_to_string(arg_info->type);
+ const char *type = type_str ? ZSTR_VAL(type_str) : fallback_type;
+ zend_error(E_DEPRECATED,
+ "%s(): Passing null to parameter #%" PRIu32 "%s%s%s of type %s is deprecated",
+ ZSTR_VAL(func_name), arg_num,
+ arg_name ? " ($" : "", arg_name ? arg_name : "", arg_name ? ")" : "",
+ type);
+ zend_string_release(func_name);
+ if (type_str) {
+ zend_string_release(type_str);
+ }
+ return !EG(exception);
+}
+
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_weak(zval *arg, bool *dest, uint32_t arg_num) /* {{{ */
{
if (EXPECTED(Z_TYPE_P(arg) <= IS_STRING)) {
+ if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("bool", arg_num)) {
+ return 0;
+ }
*dest = zend_is_true(arg);
} else {
return 0;
@@ -437,16 +483,16 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_weak(zval *arg, zend_bool *dest)
}
/* }}} */
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_slow(zval *arg, zend_bool *dest) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_slow(zval *arg, bool *dest, uint32_t arg_num) /* {{{ */
{
if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
return 0;
}
- return zend_parse_arg_bool_weak(arg, dest);
+ return zend_parse_arg_bool_weak(arg, dest, arg_num);
}
/* }}} */
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(zval *arg, zend_long *dest) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(zval *arg, zend_long *dest, uint32_t arg_num) /* {{{ */
{
if (EXPECTED(Z_TYPE_P(arg) == IS_DOUBLE)) {
if (UNEXPECTED(zend_isnan(Z_DVAL_P(arg)))) {
@@ -479,6 +525,9 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(zval *arg, zend_long *dest)
return 0;
}
} else if (EXPECTED(Z_TYPE_P(arg) < IS_TRUE)) {
+ if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("int", arg_num)) {
+ return 0;
+ }
*dest = 0;
} else if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) {
*dest = 1;
@@ -489,16 +538,16 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(zval *arg, zend_long *dest)
}
/* }}} */
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_slow(zval *arg, zend_long *dest) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_slow(zval *arg, zend_long *dest, uint32_t arg_num) /* {{{ */
{
if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
return 0;
}
- return zend_parse_arg_long_weak(arg, dest);
+ return zend_parse_arg_long_weak(arg, dest, arg_num);
}
/* }}} */
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest, uint32_t arg_num) /* {{{ */
{
if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) {
*dest = (double)Z_LVAL_P(arg);
@@ -517,6 +566,9 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest)
return 0;
}
} else if (EXPECTED(Z_TYPE_P(arg) < IS_TRUE)) {
+ if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("float", arg_num)) {
+ return 0;
+ }
*dest = 0.0;
} else if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) {
*dest = 1.0;
@@ -527,7 +579,7 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest)
}
/* }}} */
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_slow(zval *arg, double *dest) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_slow(zval *arg, double *dest, uint32_t arg_num) /* {{{ */
{
if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) {
/* SSTH Exception: IS_LONG may be accepted instead as IS_DOUBLE */
@@ -535,11 +587,11 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_slow(zval *arg, double *dest)
} else if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
return 0;
}
- return zend_parse_arg_double_weak(arg, dest);
+ return zend_parse_arg_double_weak(arg, dest, arg_num);
}
/* }}} */
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, zval **dest) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, zval **dest, uint32_t arg_num) /* {{{ */
{
if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
return 0;
@@ -558,6 +610,9 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, zval **dest) /
}
zend_string_release(str);
} else if (Z_TYPE_P(arg) < IS_TRUE) {
+ if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("int|float", arg_num)) {
+ return 0;
+ }
ZVAL_LONG(arg, 0);
} else if (Z_TYPE_P(arg) == IS_TRUE) {
ZVAL_LONG(arg, 1);
@@ -569,9 +624,12 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, zval **dest) /
}
/* }}} */
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest, uint32_t arg_num) /* {{{ */
{
if (EXPECTED(Z_TYPE_P(arg) < IS_STRING)) {
+ if (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) && !zend_null_arg_deprecated("string", arg_num)) {
+ return 0;
+ }
convert_to_string(arg);
*dest = Z_STR_P(arg);
} else if (UNEXPECTED(Z_TYPE_P(arg) == IS_OBJECT)) {
@@ -591,24 +649,24 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **des
}
/* }}} */
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest, uint32_t arg_num) /* {{{ */
{
if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
return 0;
}
- return zend_parse_arg_str_weak(arg, dest);
+ return zend_parse_arg_str_weak(arg, dest, arg_num);
}
/* }}} */
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_or_long_slow(zval *arg, zend_string **dest_str, zend_long *dest_long) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_or_long_slow(zval *arg, zend_string **dest_str, zend_long *dest_long, uint32_t arg_num) /* {{{ */
{
if (UNEXPECTED(ZEND_ARG_USES_STRICT_TYPES())) {
return 0;
}
- if (zend_parse_arg_long_weak(arg, dest_long)) {
+ if (zend_parse_arg_long_weak(arg, dest_long, arg_num)) {
*dest_str = NULL;
return 1;
- } else if (zend_parse_arg_str_weak(arg, dest_str)) {
+ } else if (zend_parse_arg_str_weak(arg, dest_str, arg_num)) {
*dest_long = 0;
return 1;
} else {
@@ -617,7 +675,7 @@ ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_or_long_slow(zval *arg, zend_stri
}
/* }}} */
-static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec, char **error) /* {{{ */
+static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec, char **error, uint32_t arg_num) /* {{{ */
{
const char *spec_walk = *spec;
char c = *spec_walk++;
@@ -644,13 +702,13 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec
case 'l':
{
zend_long *p = va_arg(*va, zend_long *);
- zend_bool *is_null = NULL;
+ bool *is_null = NULL;
if (check_null) {
- is_null = va_arg(*va, zend_bool *);
+ is_null = va_arg(*va, bool *);
}
- if (!zend_parse_arg_long(arg, p, is_null, check_null)) {
+ if (!zend_parse_arg_long(arg, p, is_null, check_null, arg_num)) {
return check_null ? "?int" : "int";
}
}
@@ -659,13 +717,13 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec
case 'd':
{
double *p = va_arg(*va, double *);
- zend_bool *is_null = NULL;
+ bool *is_null = NULL;
if (check_null) {
- is_null = va_arg(*va, zend_bool *);
+ is_null = va_arg(*va, bool *);
}
- if (!zend_parse_arg_double(arg, p, is_null, check_null)) {
+ if (!zend_parse_arg_double(arg, p, is_null, check_null, arg_num)) {
return check_null ? "?float" : "float";
}
}
@@ -675,7 +733,7 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec
{
zval **p = va_arg(*va, zval **);
- if (!zend_parse_arg_number(arg, p, check_null)) {
+ if (!zend_parse_arg_number(arg, p, check_null, arg_num)) {
return check_null ? "int|float|null" : "int|float";
}
}
@@ -685,7 +743,7 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec
{
char **p = va_arg(*va, char **);
size_t *pl = va_arg(*va, size_t *);
- if (!zend_parse_arg_string(arg, p, pl, check_null)) {
+ if (!zend_parse_arg_string(arg, p, pl, check_null, arg_num)) {
return check_null ? "?string" : "string";
}
}
@@ -695,7 +753,7 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec
{
char **p = va_arg(*va, char **);
size_t *pl = va_arg(*va, size_t *);
- if (!zend_parse_arg_path(arg, p, pl, check_null)) {
+ if (!zend_parse_arg_path(arg, p, pl, check_null, arg_num)) {
if (Z_TYPE_P(arg) == IS_STRING) {
zend_spprintf(error, 0, "must not contain any null bytes");
return "";
@@ -709,7 +767,7 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec
case 'P':
{
zend_string **str = va_arg(*va, zend_string **);
- if (!zend_parse_arg_path_str(arg, str, check_null)) {
+ if (!zend_parse_arg_path_str(arg, str, check_null, arg_num)) {
if (Z_TYPE_P(arg) == IS_STRING) {
zend_spprintf(error, 0, "must not contain any null bytes");
return "";
@@ -723,7 +781,7 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec
case 'S':
{
zend_string **str = va_arg(*va, zend_string **);
- if (!zend_parse_arg_str(arg, str, check_null)) {
+ if (!zend_parse_arg_str(arg, str, check_null, arg_num)) {
return check_null ? "?string" : "string";
}
}
@@ -731,14 +789,14 @@ static const char *zend_parse_arg_impl(zval *arg, va_list *va, const char **spec
case 'b':
{
- zend_bool *p = va_arg(*va, zend_bool *);
- zend_bool *is_null = NULL;
+ bool *p = va_arg(*va, bool *);
+ bool *is_null = NULL;
if (check_null) {
- is_null = va_arg(*va, zend_bool *);
+ is_null = va_arg(*va, bool *);
}
- if (!zend_parse_arg_bool(arg, p, is_null, check_null)) {
+ if (!zend_parse_arg_bool(arg, p, is_null, check_null, arg_num)) {
return check_null ? "?bool" : "bool";
}
}
@@ -899,7 +957,7 @@ static zend_result zend_parse_arg(uint32_t arg_num, zval *arg, va_list *va, cons
const char *expected_type = NULL;
char *error = NULL;
- expected_type = zend_parse_arg_impl(arg, va, spec, &error);
+ expected_type = zend_parse_arg_impl(arg, va, spec, &error, arg_num);
if (expected_type) {
if (EG(exception)) {
return FAILURE;
@@ -956,8 +1014,8 @@ static zend_result zend_parse_va_args(uint32_t num_args, const char *type_spec,
uint32_t max_num_args = 0;
uint32_t post_varargs = 0;
zval *arg;
- zend_bool have_varargs = 0;
- zend_bool have_optional_args = 0;
+ bool have_varargs = 0;
+ bool have_optional_args = 0;
zval **varargs = NULL;
int *n_varargs = NULL;
@@ -1130,7 +1188,7 @@ ZEND_API zend_result zend_parse_method_parameters(uint32_t num_args, zval *this_
* Z_OBJ(EG(This)) to NULL when calling an internal function with common.scope == NULL.
* In that case EG(This) would still be the $this from the calling code and we'd take the
* wrong branch here. */
- zend_bool is_method = EG(current_execute_data)->func->common.scope != NULL;
+ bool is_method = EG(current_execute_data)->func->common.scope != NULL;
if (!is_method || !this_ptr || Z_TYPE_P(this_ptr) != IS_OBJECT) {
va_start(va, type_spec);
@@ -1213,39 +1271,147 @@ ZEND_API void zend_merge_properties(zval *obj, HashTable *properties) /* {{{ */
}
/* }}} */
+static zend_class_mutable_data *zend_allocate_mutable_data(zend_class_entry *class_type) /* {{{ */
+{
+ zend_class_mutable_data *mutable_data;
+
+ ZEND_ASSERT(class_type->ce_flags & ZEND_ACC_IMMUTABLE);
+ ZEND_ASSERT(ZEND_MAP_PTR(class_type->mutable_data) != NULL);
+ ZEND_ASSERT(ZEND_MAP_PTR_GET_IMM(class_type->mutable_data) == NULL);
+
+ mutable_data = zend_arena_alloc(&CG(arena), sizeof(zend_class_mutable_data));
+ memset(mutable_data, 0, sizeof(zend_class_mutable_data));
+ mutable_data->ce_flags = class_type->ce_flags;
+ ZEND_MAP_PTR_SET_IMM(class_type->mutable_data, mutable_data);
+
+ return mutable_data;
+}
+/* }}} */
+
+ZEND_API HashTable *zend_separate_class_constants_table(zend_class_entry *class_type) /* {{{ */
+{
+ zend_class_mutable_data *mutable_data;
+ HashTable *constants_table;
+ zend_string *key;
+ zend_class_constant *new_c, *c;
+
+ constants_table = zend_arena_alloc(&CG(arena), sizeof(HashTable));
+ zend_hash_init(constants_table, zend_hash_num_elements(&class_type->constants_table), NULL, NULL, 0);
+ zend_hash_extend(constants_table, zend_hash_num_elements(&class_type->constants_table), 0);
+
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&class_type->constants_table, key, c) {
+ if (Z_TYPE(c->value) == IS_CONSTANT_AST) {
+ new_c = zend_arena_alloc(&CG(arena), sizeof(zend_class_constant));
+ memcpy(new_c, c, sizeof(zend_class_constant));
+ c = new_c;
+ }
+ _zend_hash_append_ptr(constants_table, key, c);
+ } ZEND_HASH_FOREACH_END();
+
+ ZEND_ASSERT(class_type->ce_flags & ZEND_ACC_IMMUTABLE);
+ ZEND_ASSERT(ZEND_MAP_PTR(class_type->mutable_data) != NULL);
+
+ mutable_data = ZEND_MAP_PTR_GET_IMM(class_type->mutable_data);
+ if (!mutable_data) {
+ mutable_data = zend_allocate_mutable_data(class_type);
+ }
+
+ mutable_data->constants_table = constants_table;
+
+ return constants_table;
+}
+
ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /* {{{ */
{
- if (!(class_type->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
- zend_class_constant *c;
- zval *val;
- zend_property_info *prop_info;
+ zend_class_mutable_data *mutable_data = NULL;
+ zval *default_properties_table = NULL;
+ zval *static_members_table = NULL;
+ zend_class_constant *c;
+ zval *val;
+ zend_property_info *prop_info;
+ uint32_t ce_flags;
- if (class_type->parent) {
- if (UNEXPECTED(zend_update_class_constants(class_type->parent) != SUCCESS)) {
- return FAILURE;
+ ce_flags = class_type->ce_flags;
+
+ if (ce_flags & ZEND_ACC_CONSTANTS_UPDATED) {
+ return SUCCESS;
+ }
+
+ if (ce_flags & ZEND_ACC_IMMUTABLE) {
+ mutable_data = ZEND_MAP_PTR_GET_IMM(class_type->mutable_data);
+ if (mutable_data) {
+ ce_flags = mutable_data->ce_flags;
+ if (ce_flags & ZEND_ACC_CONSTANTS_UPDATED) {
+ return SUCCESS;
}
+ } else {
+ mutable_data = zend_allocate_mutable_data(class_type);
}
+ }
- ZEND_HASH_FOREACH_PTR(&class_type->constants_table, c) {
- val = &c->value;
- if (Z_TYPE_P(val) == IS_CONSTANT_AST) {
+ if (class_type->parent) {
+ if (UNEXPECTED(zend_update_class_constants(class_type->parent) != SUCCESS)) {
+ return FAILURE;
+ }
+ }
+
+ if (ce_flags & ZEND_ACC_HAS_AST_CONSTANTS) {
+ HashTable *constants_table;
+
+ if (ce_flags & ZEND_ACC_IMMUTABLE) {
+ constants_table = mutable_data->constants_table;
+ if (!constants_table) {
+ constants_table = zend_separate_class_constants_table(class_type);
+ }
+ } else {
+ constants_table = &class_type->constants_table;
+ }
+ ZEND_HASH_FOREACH_PTR(constants_table, c) {
+ if (Z_TYPE(c->value) == IS_CONSTANT_AST) {
+ val = &c->value;
if (UNEXPECTED(zval_update_constant_ex(val, c->ce) != SUCCESS)) {
return FAILURE;
}
}
} ZEND_HASH_FOREACH_END();
+ }
- if (class_type->default_static_members_count && !CE_STATIC_MEMBERS(class_type)) {
- if (class_type->type == ZEND_INTERNAL_CLASS || (class_type->ce_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED))) {
+ if (class_type->default_static_members_count) {
+ static_members_table = CE_STATIC_MEMBERS(class_type);
+ if (!static_members_table) {
+ if (class_type->type == ZEND_INTERNAL_CLASS || (ce_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED))) {
zend_class_init_statics(class_type);
+ static_members_table = CE_STATIC_MEMBERS(class_type);
}
}
+ }
+ default_properties_table = class_type->default_properties_table;
+ if ((ce_flags & ZEND_ACC_IMMUTABLE)
+ && (ce_flags & ZEND_ACC_HAS_AST_PROPERTIES)) {
+ zval *src, *dst, *end;
+
+ default_properties_table = mutable_data->default_properties_table;
+ if (!default_properties_table) {
+ default_properties_table = zend_arena_alloc(&CG(arena), sizeof(zval) * class_type->default_properties_count);
+ src = class_type->default_properties_table;
+ dst = default_properties_table;
+ end = dst + class_type->default_properties_count;
+ do {
+ ZVAL_COPY_VALUE_PROP(dst, src);
+ src++;
+ dst++;
+ } while (dst != end);
+ mutable_data->default_properties_table = default_properties_table;
+ }
+ }
+
+ if (ce_flags & (ZEND_ACC_HAS_AST_PROPERTIES|ZEND_ACC_HAS_AST_STATICS)) {
ZEND_HASH_FOREACH_PTR(&class_type->properties_info, prop_info) {
if (prop_info->flags & ZEND_ACC_STATIC) {
- val = CE_STATIC_MEMBERS(class_type) + prop_info->offset;
+ val = static_members_table + prop_info->offset;
} else {
- val = (zval*)((char*)class_type->default_properties_table + prop_info->offset - OBJ_PROP_TO_OFFSET(0));
+ val = (zval*)((char*)default_properties_table + prop_info->offset - OBJ_PROP_TO_OFFSET(0));
}
if (Z_TYPE_P(val) == IS_CONSTANT_AST) {
if (ZEND_TYPE_IS_SET(prop_info->type)) {
@@ -1268,8 +1434,21 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /
}
}
} ZEND_HASH_FOREACH_END();
+ }
- class_type->ce_flags |= ZEND_ACC_CONSTANTS_UPDATED;
+ ce_flags |= ZEND_ACC_CONSTANTS_UPDATED;
+ ce_flags &= ~ZEND_ACC_HAS_AST_CONSTANTS;
+ ce_flags &= ~ZEND_ACC_HAS_AST_PROPERTIES;
+ if (class_type->ce_flags & ZEND_ACC_IMMUTABLE) {
+ ce_flags &= ~ZEND_ACC_HAS_AST_STATICS;
+ if (mutable_data) {
+ mutable_data->ce_flags = ce_flags;
+ }
+ } else {
+ if (!(ce_flags & ZEND_ACC_PRELOADED)) {
+ ce_flags &= ~ZEND_ACC_HAS_AST_STATICS;
+ }
+ class_type->ce_flags = ce_flags;
}
return SUCCESS;
@@ -1279,7 +1458,7 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /
static zend_always_inline void _object_properties_init(zend_object *object, zend_class_entry *class_type) /* {{{ */
{
if (class_type->default_properties_count) {
- zval *src = class_type->default_properties_table;
+ zval *src = CE_DEFAULT_PROPERTIES_TABLE(class_type);
zval *dst = object->properties_table;
zval *end = src + class_type->default_properties_count;
@@ -1404,11 +1583,13 @@ ZEND_API void object_properties_load(zend_object *object, HashTable *properties)
* calling zend_merge_properties(). */
static zend_always_inline zend_result _object_and_properties_init(zval *arg, zend_class_entry *class_type, HashTable *properties) /* {{{ */
{
- if (UNEXPECTED(class_type->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS))) {
+ if (UNEXPECTED(class_type->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS|ZEND_ACC_ENUM))) {
if (class_type->ce_flags & ZEND_ACC_INTERFACE) {
zend_throw_error(NULL, "Cannot instantiate interface %s", ZSTR_VAL(class_type->name));
} else if (class_type->ce_flags & ZEND_ACC_TRAIT) {
zend_throw_error(NULL, "Cannot instantiate trait %s", ZSTR_VAL(class_type->name));
+ } else if (class_type->ce_flags & ZEND_ACC_ENUM) {
+ zend_throw_error(NULL, "Cannot instantiate enum %s", ZSTR_VAL(class_type->name));
} else {
zend_throw_error(NULL, "Cannot instantiate abstract class %s", ZSTR_VAL(class_type->name));
}
@@ -1531,6 +1712,33 @@ ZEND_API void add_assoc_stringl_ex(zval *arg, const char *key, size_t key_len, c
}
/* }}} */
+ZEND_API void add_assoc_array_ex(zval *arg, const char *key, size_t key_len, zend_array *arr) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_ARR(&tmp, arr);
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
+}
+/* }}} */
+
+ZEND_API void add_assoc_object_ex(zval *arg, const char *key, size_t key_len, zend_object *obj) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_OBJ(&tmp, obj);
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
+}
+/* }}} */
+
+ZEND_API void add_assoc_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_REF(&tmp, ref);
+ zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, &tmp);
+}
+/* }}} */
+
ZEND_API void add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval *value) /* {{{ */
{
zend_symtable_str_update(Z_ARRVAL_P(arg), key, key_len, value);
@@ -1609,6 +1817,33 @@ ZEND_API void add_index_stringl(zval *arg, zend_ulong index, const char *str, si
}
/* }}} */
+ZEND_API void add_index_array(zval *arg, zend_ulong index, zend_array *arr) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_ARR(&tmp, arr);
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
+}
+/* }}} */
+
+ZEND_API void add_index_object(zval *arg, zend_ulong index, zend_object *obj) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_OBJ(&tmp, obj);
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
+}
+/* }}} */
+
+ZEND_API void add_index_reference(zval *arg, zend_ulong index, zend_reference *ref) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_REF(&tmp, ref);
+ zend_hash_index_update(Z_ARRVAL_P(arg), index, &tmp);
+}
+/* }}} */
+
ZEND_API zend_result add_next_index_long(zval *arg, zend_long n) /* {{{ */
{
zval tmp;
@@ -1627,7 +1862,7 @@ ZEND_API zend_result add_next_index_null(zval *arg) /* {{{ */
}
/* }}} */
-ZEND_API zend_result add_next_index_bool(zval *arg, zend_bool b) /* {{{ */
+ZEND_API zend_result add_next_index_bool(zval *arg, bool b) /* {{{ */
{
zval tmp;
@@ -1681,6 +1916,33 @@ ZEND_API zend_result add_next_index_stringl(zval *arg, const char *str, size_t l
}
/* }}} */
+ZEND_API zend_result add_next_index_array(zval *arg, zend_array *arr) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_ARR(&tmp, arr);
+ return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
+}
+/* }}} */
+
+ZEND_API zend_result add_next_index_object(zval *arg, zend_object *obj) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_OBJ(&tmp, obj);
+ return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
+}
+/* }}} */
+
+ZEND_API zend_result add_next_index_reference(zval *arg, zend_reference *ref) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_REF(&tmp, ref);
+ return zend_hash_next_index_insert(Z_ARRVAL_P(arg), &tmp) ? SUCCESS : FAILURE;
+}
+/* }}} */
+
ZEND_API zend_result array_set_zval_key(HashTable *ht, zval *key, zval *value) /* {{{ */
{
zval *result;
@@ -1798,6 +2060,36 @@ ZEND_API void add_property_stringl_ex(zval *arg, const char *key, size_t key_len
}
/* }}} */
+ZEND_API void add_property_array_ex(zval *arg, const char *key, size_t key_len, zend_array *arr) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_ARR(&tmp, arr);
+ add_property_zval_ex(arg, key, key_len, &tmp);
+ zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
+}
+/* }}} */
+
+ZEND_API void add_property_object_ex(zval *arg, const char *key, size_t key_len, zend_object *obj) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_OBJ(&tmp, obj);
+ add_property_zval_ex(arg, key, key_len, &tmp);
+ zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
+}
+/* }}} */
+
+ZEND_API void add_property_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref) /* {{{ */
+{
+ zval tmp;
+
+ ZVAL_REF(&tmp, ref);
+ add_property_zval_ex(arg, key, key_len, &tmp);
+ zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
+}
+/* }}} */
+
ZEND_API void add_property_zval_ex(zval *arg, const char *key, size_t key_len, zval *value) /* {{{ */
{
zend_string *str;
@@ -2838,7 +3130,7 @@ ZEND_API zend_result zend_register_class_alias_ex(const char *name, size_t name_
/* }}} */
// TODO num_symbol_tables as unsigned int?
-ZEND_API zend_result zend_set_hash_symbol(zval *symbol, const char *name, size_t name_length, zend_bool is_ref, int num_symbol_tables, ...) /* {{{ */
+ZEND_API zend_result zend_set_hash_symbol(zval *symbol, const char *name, size_t name_length, bool is_ref, int num_symbol_tables, ...) /* {{{ */
{
HashTable *symbol_table;
va_list symbol_table_list;
@@ -3337,11 +3629,11 @@ ZEND_API zend_string *zend_get_callable_name(zval *callable) /* {{{ */
}
/* }}} */
-ZEND_API zend_bool zend_is_callable_at_frame(
+ZEND_API bool zend_is_callable_at_frame(
zval *callable, zend_object *object, zend_execute_data *frame,
uint32_t check_flags, zend_fcall_info_cache *fcc, char **error) /* {{{ */
{
- zend_bool ret;
+ bool ret;
zend_fcall_info_cache fcc_local;
bool strict_class = 0;
@@ -3458,7 +3750,7 @@ check_func:
}
/* }}} */
-ZEND_API zend_bool zend_is_callable_ex(zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error) /* {{{ */
+ZEND_API bool zend_is_callable_ex(zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error) /* {{{ */
{
/* Determine callability at the first parent user frame. */
zend_execute_data *frame = EG(current_execute_data);
@@ -3466,20 +3758,20 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, zend_object *object, uint
frame = frame->prev_execute_data;
}
- zend_bool ret = zend_is_callable_at_frame(callable, object, frame, check_flags, fcc, error);
+ bool ret = zend_is_callable_at_frame(callable, object, frame, check_flags, fcc, error);
if (callable_name) {
*callable_name = zend_get_callable_name_ex(callable, object);
}
return ret;
}
-ZEND_API zend_bool zend_is_callable(zval *callable, uint32_t check_flags, zend_string **callable_name) /* {{{ */
+ZEND_API bool zend_is_callable(zval *callable, uint32_t check_flags, zend_string **callable_name) /* {{{ */
{
return zend_is_callable_ex(callable, NULL, check_flags, callable_name, NULL, NULL);
}
/* }}} */
-ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_name) /* {{{ */
+ZEND_API bool zend_make_callable(zval *callable, zend_string **callable_name) /* {{{ */
{
zend_fcall_info_cache fcc;
@@ -3679,7 +3971,7 @@ static inline zend_string *zval_make_interned_string(zval *zv) /* {{{ */
return Z_STR_P(zv);
}
-static zend_always_inline zend_bool is_persistent_class(zend_class_entry *ce) {
+static zend_always_inline bool is_persistent_class(zend_class_entry *ce) {
return (ce->type & ZEND_INTERNAL_CLASS)
&& ce->info.internal.module->type == MODULE_PERSISTENT;
}
@@ -3698,6 +3990,11 @@ ZEND_API zend_property_info *zend_declare_typed_property(zend_class_entry *ce, z
property_info = zend_arena_alloc(&CG(arena), sizeof(zend_property_info));
if (Z_TYPE_P(property) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
+ if (access_type & ZEND_ACC_STATIC) {
+ ce->ce_flags |= ZEND_ACC_HAS_AST_STATICS;
+ } else {
+ ce->ce_flags |= ZEND_ACC_HAS_AST_PROPERTIES;
+ }
}
}
@@ -3787,7 +4084,7 @@ ZEND_API zend_property_info *zend_declare_typed_property(zend_class_entry *ce, z
}
/* }}} */
-ZEND_API zend_result zend_try_assign_typed_ref_ex(zend_reference *ref, zval *val, zend_bool strict) /* {{{ */
+ZEND_API zend_result zend_try_assign_typed_ref_ex(zend_reference *ref, zval *val, bool strict) /* {{{ */
{
if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, val, strict))) {
zval_ptr_dtor(val);
@@ -3815,7 +4112,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_null(zend_reference *ref) /* {{{
}
/* }}} */
-ZEND_API zend_result zend_try_assign_typed_ref_bool(zend_reference *ref, zend_bool val) /* {{{ */
+ZEND_API zend_result zend_try_assign_typed_ref_bool(zend_reference *ref, bool val) /* {{{ */
{
zval tmp;
@@ -3905,7 +4202,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval(zend_reference *ref, zval *z
}
/* }}} */
-ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, zend_bool strict) /* {{{ */
+ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, bool strict) /* {{{ */
{
zval tmp;
@@ -4013,6 +4310,7 @@ ZEND_API zend_class_constant *zend_declare_class_constant_ex(zend_class_entry *c
c->ce = ce;
if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
+ ce->ce_flags |= ZEND_ACC_HAS_AST_CONSTANTS;
}
if (!zend_hash_add_ptr(&ce->constants_table, name, c)) {
@@ -4056,7 +4354,7 @@ ZEND_API void zend_declare_class_constant_long(zend_class_entry *ce, const char
}
/* }}} */
-ZEND_API void zend_declare_class_constant_bool(zend_class_entry *ce, const char *name, size_t name_length, zend_bool value) /* {{{ */
+ZEND_API void zend_declare_class_constant_bool(zend_class_entry *ce, const char *name, size_t name_length, bool value) /* {{{ */
{
zval constant;
@@ -4297,7 +4595,7 @@ ZEND_API zend_result zend_update_static_property_stringl(zend_class_entry *scope
}
/* }}} */
-ZEND_API zval *zend_read_property_ex(zend_class_entry *scope, zend_object *object, zend_string *name, zend_bool silent, zval *rv) /* {{{ */
+ZEND_API zval *zend_read_property_ex(zend_class_entry *scope, zend_object *object, zend_string *name, bool silent, zval *rv) /* {{{ */
{
zval *value;
zend_class_entry *old_scope = EG(fake_scope);
@@ -4311,7 +4609,7 @@ ZEND_API zval *zend_read_property_ex(zend_class_entry *scope, zend_object *objec
}
/* }}} */
-ZEND_API zval *zend_read_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_bool silent, zval *rv) /* {{{ */
+ZEND_API zval *zend_read_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, bool silent, zval *rv) /* {{{ */
{
zval *value;
zend_string *str;
@@ -4323,7 +4621,7 @@ ZEND_API zval *zend_read_property(zend_class_entry *scope, zend_object *object,
}
/* }}} */
-ZEND_API zval *zend_read_static_property_ex(zend_class_entry *scope, zend_string *name, zend_bool silent) /* {{{ */
+ZEND_API zval *zend_read_static_property_ex(zend_class_entry *scope, zend_string *name, bool silent) /* {{{ */
{
zval *property;
zend_class_entry *old_scope = EG(fake_scope);
@@ -4336,7 +4634,7 @@ ZEND_API zval *zend_read_static_property_ex(zend_class_entry *scope, zend_string
}
/* }}} */
-ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *name, size_t name_length, zend_bool silent) /* {{{ */
+ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *name, size_t name_length, bool silent) /* {{{ */
{
zend_string *key = zend_string_init(name, name_length, 0);
zval *property = zend_read_static_property_ex(scope, key, silent);
@@ -4382,7 +4680,7 @@ ZEND_API ZEND_COLD const char *zend_get_object_type(const zend_class_entry *ce)
}
/* }}} */
-ZEND_API zend_bool zend_is_iterable(zval *iterable) /* {{{ */
+ZEND_API bool zend_is_iterable(zval *iterable) /* {{{ */
{
switch (Z_TYPE_P(iterable)) {
case IS_ARRAY:
@@ -4395,7 +4693,7 @@ ZEND_API zend_bool zend_is_iterable(zval *iterable) /* {{{ */
}
/* }}} */
-ZEND_API zend_bool zend_is_countable(zval *countable) /* {{{ */
+ZEND_API bool zend_is_countable(zval *countable) /* {{{ */
{
switch (Z_TYPE_P(countable)) {
case IS_ARRAY:
@@ -4419,7 +4717,7 @@ static zend_result get_default_via_ast(zval *default_value_zval, const char *def
zend_string *code = zend_string_concat3(
"<?php ", sizeof("<?php ") - 1, default_value, strlen(default_value), ";", 1);
- ast = zend_compile_string_to_ast(code, &ast_arena, "");
+ ast = zend_compile_string_to_ast(code, &ast_arena, ZSTR_EMPTY_ALLOC());
zend_string_release(code);
if (!ast) {
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 290db040b2..8072befb03 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -278,6 +278,12 @@ typedef struct _zend_fcall_info_cache {
#define CE_STATIC_MEMBERS(ce) \
((zval*)ZEND_MAP_PTR_GET((ce)->static_members_table))
+#define CE_CONSTANTS_TABLE(ce) \
+ zend_class_constants_table(ce)
+
+#define CE_DEFAULT_PROPERTIES_TABLE(ce) \
+ zend_class_default_properties_table(ce)
+
#define ZEND_FCI_INITIALIZED(fci) ((fci).size != 0)
ZEND_API int zend_next_free_module(void);
@@ -352,12 +358,12 @@ ZEND_API ZEND_COLD void zend_wrong_param_count(void);
ZEND_API void zend_release_fcall_info_cache(zend_fcall_info_cache *fcc);
ZEND_API zend_string *zend_get_callable_name_ex(zval *callable, zend_object *object);
ZEND_API zend_string *zend_get_callable_name(zval *callable);
-ZEND_API zend_bool zend_is_callable_at_frame(
+ZEND_API bool zend_is_callable_at_frame(
zval *callable, zend_object *object, zend_execute_data *frame,
uint32_t check_flags, zend_fcall_info_cache *fcc, char **error);
-ZEND_API zend_bool zend_is_callable_ex(zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error);
-ZEND_API zend_bool zend_is_callable(zval *callable, uint32_t check_flags, zend_string **callable_name);
-ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_name);
+ZEND_API bool zend_is_callable_ex(zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error);
+ZEND_API bool zend_is_callable(zval *callable, uint32_t check_flags, zend_string **callable_name);
+ZEND_API bool zend_make_callable(zval *callable, zend_string **callable_name);
ZEND_API const char *zend_get_module_version(const char *module_name);
ZEND_API int zend_get_module_started(const char *module_name);
@@ -376,12 +382,39 @@ ZEND_API zend_class_constant *zend_declare_class_constant_ex(zend_class_entry *c
ZEND_API void zend_declare_class_constant(zend_class_entry *ce, const char *name, size_t name_length, zval *value);
ZEND_API void zend_declare_class_constant_null(zend_class_entry *ce, const char *name, size_t name_length);
ZEND_API void zend_declare_class_constant_long(zend_class_entry *ce, const char *name, size_t name_length, zend_long value);
-ZEND_API void zend_declare_class_constant_bool(zend_class_entry *ce, const char *name, size_t name_length, zend_bool value);
+ZEND_API void zend_declare_class_constant_bool(zend_class_entry *ce, const char *name, size_t name_length, bool value);
ZEND_API void zend_declare_class_constant_double(zend_class_entry *ce, const char *name, size_t name_length, double value);
ZEND_API void zend_declare_class_constant_stringl(zend_class_entry *ce, const char *name, size_t name_length, const char *value, size_t value_length);
ZEND_API void zend_declare_class_constant_string(zend_class_entry *ce, const char *name, size_t name_length, const char *value);
ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type);
+ZEND_API HashTable *zend_separate_class_constants_table(zend_class_entry *class_type);
+
+static zend_always_inline HashTable *zend_class_constants_table(zend_class_entry *ce) {
+ if ((ce->ce_flags & ZEND_ACC_HAS_AST_CONSTANTS)
+ && (ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
+ zend_class_mutable_data *mutable_data =
+ (zend_class_mutable_data*)ZEND_MAP_PTR_GET_IMM(ce->mutable_data);
+ if (mutable_data && mutable_data->constants_table) {
+ return mutable_data->constants_table;
+ } else {
+ return zend_separate_class_constants_table(ce);
+ }
+ } else {
+ return &ce->constants_table;
+ }
+}
+
+static zend_always_inline zval *zend_class_default_properties_table(zend_class_entry *ce) {
+ if ((ce->ce_flags & ZEND_ACC_HAS_AST_PROPERTIES)
+ && (ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
+ zend_class_mutable_data *mutable_data =
+ (zend_class_mutable_data*)ZEND_MAP_PTR_GET_IMM(ce->mutable_data);
+ return mutable_data->default_properties_table;
+ } else {
+ return ce->default_properties_table;
+ }
+}
ZEND_API void zend_update_property_ex(zend_class_entry *scope, zend_object *object, zend_string *name, zval *value);
ZEND_API void zend_update_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zval *value);
@@ -403,11 +436,11 @@ ZEND_API zend_result zend_update_static_property_double(zend_class_entry *scope,
ZEND_API zend_result zend_update_static_property_string(zend_class_entry *scope, const char *name, size_t name_length, const char *value);
ZEND_API zend_result zend_update_static_property_stringl(zend_class_entry *scope, const char *name, size_t name_length, const char *value, size_t value_length);
-ZEND_API zval *zend_read_property_ex(zend_class_entry *scope, zend_object *object, zend_string *name, zend_bool silent, zval *rv);
-ZEND_API zval *zend_read_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_bool silent, zval *rv);
+ZEND_API zval *zend_read_property_ex(zend_class_entry *scope, zend_object *object, zend_string *name, bool silent, zval *rv);
+ZEND_API zval *zend_read_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, bool silent, zval *rv);
-ZEND_API zval *zend_read_static_property_ex(zend_class_entry *scope, zend_string *name, zend_bool silent);
-ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *name, size_t name_length, zend_bool silent);
+ZEND_API zval *zend_read_static_property_ex(zend_class_entry *scope, zend_string *name, bool silent);
+ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *name, size_t name_length, bool silent);
ZEND_API const char *zend_get_type_by_const(int type);
@@ -445,6 +478,9 @@ ZEND_API void add_assoc_double_ex(zval *arg, const char *key, size_t key_len, do
ZEND_API void add_assoc_str_ex(zval *arg, const char *key, size_t key_len, zend_string *str);
ZEND_API void add_assoc_string_ex(zval *arg, const char *key, size_t key_len, const char *str);
ZEND_API void add_assoc_stringl_ex(zval *arg, const char *key, size_t key_len, const char *str, size_t length);
+ZEND_API void add_assoc_array_ex(zval *arg, const char *key, size_t key_len, zend_array *arr);
+ZEND_API void add_assoc_object_ex(zval *arg, const char *key, size_t key_len, zend_object *obj);
+ZEND_API void add_assoc_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref);
ZEND_API void add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval *value);
#define add_assoc_long(__arg, __key, __n) add_assoc_long_ex(__arg, __key, strlen(__key), __n)
@@ -455,6 +491,9 @@ ZEND_API void add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval
#define add_assoc_str(__arg, __key, __str) add_assoc_str_ex(__arg, __key, strlen(__key), __str)
#define add_assoc_string(__arg, __key, __str) add_assoc_string_ex(__arg, __key, strlen(__key), __str)
#define add_assoc_stringl(__arg, __key, __str, __length) add_assoc_stringl_ex(__arg, __key, strlen(__key), __str, __length)
+#define add_assoc_array(__arg, __key, __arr) add_assoc_array_ex(__arg, __key, strlen(__key), __arr)
+#define add_assoc_object(__arg, __key, __obj) add_assoc_object_ex(__arg, __key, strlen(__key), __obj)
+#define add_assoc_reference(__arg, __key, __ref) add_assoc_object_ex(__arg, __key, strlen(__key), __ref)
#define add_assoc_zval(__arg, __key, __value) add_assoc_zval_ex(__arg, __key, strlen(__key), __value)
ZEND_API void add_index_long(zval *arg, zend_ulong index, zend_long n);
@@ -465,6 +504,9 @@ ZEND_API void add_index_double(zval *arg, zend_ulong index, double d);
ZEND_API void add_index_str(zval *arg, zend_ulong index, zend_string *str);
ZEND_API void add_index_string(zval *arg, zend_ulong index, const char *str);
ZEND_API void add_index_stringl(zval *arg, zend_ulong index, const char *str, size_t length);
+ZEND_API void add_index_array(zval *arg, zend_ulong index, zend_array *arr);
+ZEND_API void add_index_object(zval *arg, zend_ulong index, zend_object *obj);
+ZEND_API void add_index_reference(zval *arg, zend_ulong index, zend_reference *ref);
static zend_always_inline zend_result add_index_zval(zval *arg, zend_ulong index, zval *value)
{
@@ -473,12 +515,15 @@ static zend_always_inline zend_result add_index_zval(zval *arg, zend_ulong index
ZEND_API zend_result add_next_index_long(zval *arg, zend_long n);
ZEND_API zend_result add_next_index_null(zval *arg);
-ZEND_API zend_result add_next_index_bool(zval *arg, zend_bool b);
+ZEND_API zend_result add_next_index_bool(zval *arg, bool b);
ZEND_API zend_result add_next_index_resource(zval *arg, zend_resource *r);
ZEND_API zend_result add_next_index_double(zval *arg, double d);
ZEND_API zend_result add_next_index_str(zval *arg, zend_string *str);
ZEND_API zend_result add_next_index_string(zval *arg, const char *str);
ZEND_API zend_result add_next_index_stringl(zval *arg, const char *str, size_t length);
+ZEND_API zend_result add_next_index_array(zval *arg, zend_array *arr);
+ZEND_API zend_result add_next_index_object(zval *arg, zend_object *obj);
+ZEND_API zend_result add_next_index_reference(zval *arg, zend_reference *ref);
static zend_always_inline zend_result add_next_index_zval(zval *arg, zval *value)
{
@@ -495,6 +540,9 @@ ZEND_API void add_property_double_ex(zval *arg, const char *key, size_t key_len,
ZEND_API void add_property_str_ex(zval *arg, const char *key, size_t key_len, zend_string *str);
ZEND_API void add_property_string_ex(zval *arg, const char *key, size_t key_len, const char *str);
ZEND_API void add_property_stringl_ex(zval *arg, const char *key, size_t key_len, const char *str, size_t length);
+ZEND_API void add_property_array_ex(zval *arg, const char *key, size_t key_len, zend_array *arr);
+ZEND_API void add_property_object_ex(zval *arg, const char *key, size_t key_len, zend_object *obj);
+ZEND_API void add_property_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref);
ZEND_API void add_property_zval_ex(zval *arg, const char *key, size_t key_len, zval *value);
#define add_property_long(__arg, __key, __n) add_property_long_ex(__arg, __key, strlen(__key), __n)
@@ -505,6 +553,9 @@ ZEND_API void add_property_zval_ex(zval *arg, const char *key, size_t key_len, z
#define add_property_str(__arg, __key, __str) add_property_str_ex(__arg, __key, strlen(__key), __str)
#define add_property_string(__arg, __key, __str) add_property_string_ex(__arg, __key, strlen(__key), __str)
#define add_property_stringl(__arg, __key, __str, __length) add_property_stringl_ex(__arg, __key, strlen(__key), __str, __length)
+#define add_property_array(__arg, __key, __arr) add_property_array_ex(__arg, __key, strlen(__key), __arr)
+#define add_property_object(__arg, __key, __obj) add_property_object_ex(__arg, __key, strlen(__key), __obj)
+#define add_property_reference(__arg, __key, __ref) add_property_reference_ex(__arg, __key, strlen(__key), __ref)
#define add_property_zval(__arg, __key, __value) add_property_zval_ex(__arg, __key, strlen(__key), __value)
@@ -605,7 +656,7 @@ static zend_always_inline void zend_call_known_instance_method_with_1_params(
ZEND_API void zend_call_known_instance_method_with_2_params(
zend_function *fn, zend_object *object, zval *retval_ptr, zval *param1, zval *param2);
-ZEND_API zend_result zend_set_hash_symbol(zval *symbol, const char *name, size_t name_length, zend_bool is_ref, int num_symbol_tables, ...);
+ZEND_API zend_result zend_set_hash_symbol(zval *symbol, const char *name, size_t name_length, bool is_ref, int num_symbol_tables, ...);
ZEND_API zend_result zend_delete_global_variable(zend_string *name);
@@ -630,9 +681,9 @@ static zend_always_inline zend_result zend_forbid_dynamic_call(const char *func_
ZEND_API ZEND_COLD const char *zend_get_object_type(const zend_class_entry *ce);
-ZEND_API zend_bool zend_is_iterable(zval *iterable);
+ZEND_API bool zend_is_iterable(zval *iterable);
-ZEND_API zend_bool zend_is_countable(zval *countable);
+ZEND_API bool zend_is_countable(zval *countable);
ZEND_API zend_result zend_get_default_from_internal_arg_info(
zval *default_value_zval, zend_internal_arg_info *arg_info);
@@ -779,11 +830,11 @@ END_EXTERN_C()
/* May modify arg in-place. Will free arg in failure case (and take ownership in success case).
* Prefer using the ZEND_TRY_ASSIGN_* macros over these APIs. */
-ZEND_API zend_result zend_try_assign_typed_ref_ex(zend_reference *ref, zval *zv, zend_bool strict);
+ZEND_API zend_result zend_try_assign_typed_ref_ex(zend_reference *ref, zval *zv, bool strict);
ZEND_API zend_result zend_try_assign_typed_ref(zend_reference *ref, zval *zv);
ZEND_API zend_result zend_try_assign_typed_ref_null(zend_reference *ref);
-ZEND_API zend_result zend_try_assign_typed_ref_bool(zend_reference *ref, zend_bool val);
+ZEND_API zend_result zend_try_assign_typed_ref_bool(zend_reference *ref, bool val);
ZEND_API zend_result zend_try_assign_typed_ref_long(zend_reference *ref, zend_long lval);
ZEND_API zend_result zend_try_assign_typed_ref_double(zend_reference *ref, double dval);
ZEND_API zend_result zend_try_assign_typed_ref_empty_string(zend_reference *ref);
@@ -793,7 +844,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_stringl(zend_reference *ref, cons
ZEND_API zend_result zend_try_assign_typed_ref_arr(zend_reference *ref, zend_array *arr);
ZEND_API zend_result zend_try_assign_typed_ref_res(zend_reference *ref, zend_resource *res);
ZEND_API zend_result zend_try_assign_typed_ref_zval(zend_reference *ref, zval *zv);
-ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, zend_bool strict);
+ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, bool strict);
#define _ZEND_TRY_ASSIGN_NULL(zv, is_ref) do { \
zval *_zv = zv; \
@@ -1255,6 +1306,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_long_or_null
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_string_error(uint32_t num, const char *name, zval *arg);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameter_class_or_string_or_null_error(uint32_t num, const char *name, zval *arg);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(uint32_t num, char *error);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_or_null_error(uint32_t num, char *error);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_unexpected_extra_named_error(void);
ZEND_API ZEND_COLD void zend_argument_error(zend_class_entry *error_ce, uint32_t arg_num, const char *format, ...);
ZEND_API ZEND_COLD void zend_argument_type_error(uint32_t arg_num, const char *format, ...);
@@ -1272,6 +1324,7 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
#define ZPP_ERROR_WRONG_ARG 9
#define ZPP_ERROR_WRONG_COUNT 10
#define ZPP_ERROR_UNEXPECTED_EXTRA_NAMED 11
+#define ZPP_ERROR_WRONG_CALLBACK_OR_NULL 12
#define ZEND_PARSE_PARAMETERS_START_EX(flags, min_num_args, max_num_args) do { \
const int _flags = (flags); \
@@ -1282,8 +1335,8 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
zval *_real_arg, *_arg = NULL; \
zend_expected_type _expected_type = Z_EXPECTED_LONG; \
char *_error = NULL; \
- ZEND_ATTRIBUTE_UNUSED zend_bool _dummy; \
- zend_bool _optional = 0; \
+ ZEND_ATTRIBUTE_UNUSED bool _dummy; \
+ bool _optional = 0; \
int _error_code = ZPP_ERROR_OK; \
((void)_i); \
((void)_real_arg); \
@@ -1314,6 +1367,7 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
} while (0)
#define ZEND_PARSE_PARAMETERS_END_EX(failure) \
+ ZEND_ASSERT(_i == _max_num_args || _max_num_args == (uint32_t) -1); \
} while (0); \
if (UNEXPECTED(_error_code != ZPP_ERROR_OK)) { \
if (!(_flags & ZEND_PARSE_PARAMS_QUIET)) { \
@@ -1396,17 +1450,14 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_ITERABLE_EX(dest, 1)
/* old "b" */
-#define Z_PARAM_BOOL_EX2(dest, is_null, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
- if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null))) { \
+#define Z_PARAM_BOOL_EX(dest, is_null, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
+ if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null, _i))) { \
_expected_type = check_null ? Z_EXPECTED_BOOL_OR_NULL : Z_EXPECTED_BOOL; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
-#define Z_PARAM_BOOL_EX(dest, is_null, check_null, separate) \
- Z_PARAM_BOOL_EX2(dest, is_null, check_null, separate, separate)
-
#define Z_PARAM_BOOL(dest) \
Z_PARAM_BOOL_EX(dest, _dummy, 0, 0)
@@ -1414,16 +1465,13 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_BOOL_EX(dest, is_null, 1, 0)
/* old "C" */
-#define Z_PARAM_CLASS_EX2(dest, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
+#define Z_PARAM_CLASS_EX(dest, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
if (UNEXPECTED(!zend_parse_arg_class(_arg, &dest, _i, check_null))) { \
_error_code = ZPP_ERROR_FAILURE; \
break; \
}
-#define Z_PARAM_CLASS_EX(dest, check_null, separate) \
- Z_PARAM_CLASS_EX2(dest, check_null, separate, separate)
-
#define Z_PARAM_CLASS(dest) \
Z_PARAM_CLASS_EX(dest, 0, 0)
@@ -1446,7 +1494,7 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
#define Z_PARAM_OBJ_OR_STR_EX(destination_object, destination_string, allow_null) \
Z_PARAM_PROLOGUE(0, 0); \
- if (UNEXPECTED(!zend_parse_arg_obj_or_str(_arg, &destination_object, NULL, &destination_string, allow_null))) { \
+ if (UNEXPECTED(!zend_parse_arg_obj_or_str(_arg, &destination_object, NULL, &destination_string, allow_null, _i))) { \
_expected_type = allow_null ? Z_EXPECTED_OBJECT_OR_STRING_OR_NULL : Z_EXPECTED_OBJECT_OR_STRING; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
@@ -1460,7 +1508,7 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
#define Z_PARAM_OBJ_OF_CLASS_OR_STR_EX(destination_object, base_ce, destination_string, allow_null) \
Z_PARAM_PROLOGUE(0, 0); \
- if (UNEXPECTED(!zend_parse_arg_obj_or_str(_arg, &destination_object, base_ce, &destination_string, allow_null))) { \
+ if (UNEXPECTED(!zend_parse_arg_obj_or_str(_arg, &destination_object, base_ce, &destination_string, allow_null, _i))) { \
if (base_ce) { \
_error = ZSTR_VAL((base_ce)->name); \
_error_code = allow_null ? ZPP_ERROR_WRONG_CLASS_OR_STRING_OR_NULL : ZPP_ERROR_WRONG_CLASS_OR_STRING; \
@@ -1479,17 +1527,14 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_OBJ_OF_CLASS_OR_STR_EX(destination_object, base_ce, destination_string, 1);
/* old "d" */
-#define Z_PARAM_DOUBLE_EX2(dest, is_null, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
- if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null))) { \
+#define Z_PARAM_DOUBLE_EX(dest, is_null, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
+ if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null, _i))) { \
_expected_type = check_null ? Z_EXPECTED_DOUBLE_OR_NULL : Z_EXPECTED_DOUBLE; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
-#define Z_PARAM_DOUBLE_EX(dest, is_null, check_null, separate) \
- Z_PARAM_DOUBLE_EX2(dest, is_null, check_null, separate, separate)
-
#define Z_PARAM_DOUBLE(dest) \
Z_PARAM_DOUBLE_EX(dest, _dummy, 0, 0)
@@ -1497,21 +1542,18 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_DOUBLE_EX(dest, is_null, 1, 0)
/* old "f" */
-#define Z_PARAM_FUNC_EX2(dest_fci, dest_fcc, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
+#define Z_PARAM_FUNC_EX(dest_fci, dest_fcc, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
if (UNEXPECTED(!zend_parse_arg_func(_arg, &dest_fci, &dest_fcc, check_null, &_error))) { \
if (!_error) { \
_expected_type = check_null ? Z_EXPECTED_FUNC_OR_NULL : Z_EXPECTED_FUNC; \
_error_code = ZPP_ERROR_WRONG_ARG; \
} else { \
- _error_code = ZPP_ERROR_WRONG_CALLBACK; \
+ _error_code = check_null ? ZPP_ERROR_WRONG_CALLBACK_OR_NULL : ZPP_ERROR_WRONG_CALLBACK; \
} \
break; \
} \
-#define Z_PARAM_FUNC_EX(dest_fci, dest_fcc, check_null, separate) \
- Z_PARAM_FUNC_EX2(dest_fci, dest_fcc, check_null, separate, separate)
-
#define Z_PARAM_FUNC(dest_fci, dest_fcc) \
Z_PARAM_FUNC_EX(dest_fci, dest_fcc, 0, 0)
@@ -1538,7 +1580,7 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
#define Z_PARAM_ARRAY_HT_OR_LONG_EX(dest_ht, dest_long, is_null, allow_null) \
Z_PARAM_PROLOGUE(0, 0); \
- if (UNEXPECTED(!zend_parse_arg_array_ht_or_long(_arg, &dest_ht, &dest_long, &is_null, allow_null))) { \
+ if (UNEXPECTED(!zend_parse_arg_array_ht_or_long(_arg, &dest_ht, &dest_long, &is_null, allow_null, _i))) { \
_expected_type = allow_null ? Z_EXPECTED_ARRAY_OR_LONG_OR_NULL : Z_EXPECTED_ARRAY_OR_LONG; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
@@ -1566,17 +1608,14 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_ARRAY_OR_OBJECT_HT_EX(dest, 0, 0)
/* old "l" */
-#define Z_PARAM_LONG_EX2(dest, is_null, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
- if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null))) { \
+#define Z_PARAM_LONG_EX(dest, is_null, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
+ if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, _i))) { \
_expected_type = check_null ? Z_EXPECTED_LONG_OR_NULL : Z_EXPECTED_LONG; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
-#define Z_PARAM_LONG_EX(dest, is_null, check_null, separate) \
- Z_PARAM_LONG_EX2(dest, is_null, check_null, separate, separate)
-
#define Z_PARAM_LONG(dest) \
Z_PARAM_LONG_EX(dest, _dummy, 0, 0)
@@ -1586,7 +1625,7 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
/* old "n" */
#define Z_PARAM_NUMBER_EX(dest, check_null) \
Z_PARAM_PROLOGUE(0, 0); \
- if (UNEXPECTED(!zend_parse_arg_number(_arg, &dest, check_null))) { \
+ if (UNEXPECTED(!zend_parse_arg_number(_arg, &dest, check_null, _i))) { \
_expected_type = check_null ? Z_EXPECTED_NUMBER_OR_NULL : Z_EXPECTED_NUMBER; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
@@ -1599,35 +1638,29 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_NUMBER_EX(dest, 0)
/* old "o" */
-#define Z_PARAM_OBJECT_EX2(dest, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
+#define Z_PARAM_OBJECT_EX(dest, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
if (UNEXPECTED(!zend_parse_arg_object(_arg, &dest, NULL, check_null))) { \
_expected_type = check_null ? Z_EXPECTED_OBJECT_OR_NULL : Z_EXPECTED_OBJECT; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
-#define Z_PARAM_OBJECT_EX(dest, check_null, separate) \
- Z_PARAM_OBJECT_EX2(dest, check_null, separate, separate)
-
#define Z_PARAM_OBJECT(dest) \
Z_PARAM_OBJECT_EX(dest, 0, 0)
#define Z_PARAM_OBJECT_OR_NULL(dest) \
Z_PARAM_OBJECT_EX(dest, 1, 0)
-/* The same as Z_PARAM_OBJECT_EX2 except that dest is a zend_object rather than a zval */
-#define Z_PARAM_OBJ_EX2(dest, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
+/* The same as Z_PARAM_OBJECT_EX except that dest is a zend_object rather than a zval */
+#define Z_PARAM_OBJ_EX(dest, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
if (UNEXPECTED(!zend_parse_arg_obj(_arg, &dest, NULL, check_null))) { \
_expected_type = check_null ? Z_EXPECTED_OBJECT_OR_NULL : Z_EXPECTED_OBJECT; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
-#define Z_PARAM_OBJ_EX(dest, check_null, separate) \
- Z_PARAM_OBJ_EX2(dest, check_null, separate, separate)
-
#define Z_PARAM_OBJ(dest) \
Z_PARAM_OBJ_EX(dest, 0, 0)
@@ -1635,8 +1668,8 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_OBJ_EX(dest, 1, 0)
/* old "O" */
-#define Z_PARAM_OBJECT_OF_CLASS_EX2(dest, _ce, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
+#define Z_PARAM_OBJECT_OF_CLASS_EX(dest, _ce, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
if (UNEXPECTED(!zend_parse_arg_object(_arg, &dest, _ce, check_null))) { \
if (_ce) { \
_error = ZSTR_VAL((_ce)->name); \
@@ -1649,18 +1682,15 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
} \
}
-#define Z_PARAM_OBJECT_OF_CLASS_EX(dest, _ce, check_null, separate) \
- Z_PARAM_OBJECT_OF_CLASS_EX2(dest, _ce, check_null, separate, separate)
-
#define Z_PARAM_OBJECT_OF_CLASS(dest, _ce) \
Z_PARAM_OBJECT_OF_CLASS_EX(dest, _ce, 0, 0)
#define Z_PARAM_OBJECT_OF_CLASS_OR_NULL(dest, _ce) \
Z_PARAM_OBJECT_OF_CLASS_EX(dest, _ce, 1, 0)
-/* The same as Z_PARAM_OBJECT_OF_CLASS_EX2 except that dest is a zend_object rather than a zval */
-#define Z_PARAM_OBJ_OF_CLASS_EX2(dest, _ce, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
+/* The same as Z_PARAM_OBJECT_OF_CLASS_EX except that dest is a zend_object rather than a zval */
+#define Z_PARAM_OBJ_OF_CLASS_EX(dest, _ce, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
if (UNEXPECTED(!zend_parse_arg_obj(_arg, &dest, _ce, check_null))) { \
if (_ce) { \
_error = ZSTR_VAL((_ce)->name); \
@@ -1673,9 +1703,6 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
} \
}
-#define Z_PARAM_OBJ_OF_CLASS_EX(dest, _ce, check_null, separate) \
- Z_PARAM_OBJ_OF_CLASS_EX2(dest, _ce, check_null, separate, separate)
-
#define Z_PARAM_OBJ_OF_CLASS(dest, _ce) \
Z_PARAM_OBJ_OF_CLASS_EX(dest, _ce, 0, 0)
@@ -1684,7 +1711,7 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
#define Z_PARAM_OBJ_OF_CLASS_OR_LONG_EX(dest_obj, _ce, dest_long, is_null, allow_null) \
Z_PARAM_PROLOGUE(0, 0); \
- if (UNEXPECTED(!zend_parse_arg_obj_or_long(_arg, &dest_obj, _ce, &dest_long, &is_null, allow_null))) { \
+ if (UNEXPECTED(!zend_parse_arg_obj_or_long(_arg, &dest_obj, _ce, &dest_long, &is_null, allow_null, _i))) { \
_error = ZSTR_VAL((_ce)->name); \
_error_code = allow_null ? ZPP_ERROR_WRONG_CLASS_OR_LONG_OR_NULL : ZPP_ERROR_WRONG_CLASS_OR_LONG; \
break; \
@@ -1697,17 +1724,14 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_OBJ_OF_CLASS_OR_LONG_EX(dest_obj, _ce, dest_long, is_null, 1)
/* old "p" */
-#define Z_PARAM_PATH_EX2(dest, dest_len, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
- if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null))) { \
+#define Z_PARAM_PATH_EX(dest, dest_len, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
+ if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null, _i))) { \
_expected_type = check_null ? Z_EXPECTED_PATH_OR_NULL : Z_EXPECTED_PATH; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
-#define Z_PARAM_PATH_EX(dest, dest_len, check_null, separate) \
- Z_PARAM_PATH_EX2(dest, dest_len, check_null, separate, separate)
-
#define Z_PARAM_PATH(dest, dest_len) \
Z_PARAM_PATH_EX(dest, dest_len, 0, 0)
@@ -1715,17 +1739,14 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_PATH_EX(dest, dest_len, 1, 0)
/* old "P" */
-#define Z_PARAM_PATH_STR_EX2(dest, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
- if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null))) { \
+#define Z_PARAM_PATH_STR_EX(dest, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
+ if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null, _i))) { \
_expected_type = check_null ? Z_EXPECTED_PATH_OR_NULL : Z_EXPECTED_PATH; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
-#define Z_PARAM_PATH_STR_EX(dest, check_null, separate) \
- Z_PARAM_PATH_STR_EX2(dest, check_null, separate, separate)
-
#define Z_PARAM_PATH_STR(dest) \
Z_PARAM_PATH_STR_EX(dest, 0, 0)
@@ -1733,17 +1754,14 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_PATH_STR_EX(dest, 1, 0)
/* old "r" */
-#define Z_PARAM_RESOURCE_EX2(dest, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
+#define Z_PARAM_RESOURCE_EX(dest, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
if (UNEXPECTED(!zend_parse_arg_resource(_arg, &dest, check_null))) { \
_expected_type = check_null ? Z_EXPECTED_RESOURCE_OR_NULL : Z_EXPECTED_RESOURCE; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
-#define Z_PARAM_RESOURCE_EX(dest, check_null, separate) \
- Z_PARAM_RESOURCE_EX2(dest, check_null, separate, separate)
-
#define Z_PARAM_RESOURCE(dest) \
Z_PARAM_RESOURCE_EX(dest, 0, 0)
@@ -1751,17 +1769,14 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_RESOURCE_EX(dest, 1, 0)
/* old "s" */
-#define Z_PARAM_STRING_EX2(dest, dest_len, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
- if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null))) { \
+#define Z_PARAM_STRING_EX(dest, dest_len, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
+ if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null, _i))) { \
_expected_type = check_null ? Z_EXPECTED_STRING_OR_NULL : Z_EXPECTED_STRING; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
-#define Z_PARAM_STRING_EX(dest, dest_len, check_null, separate) \
- Z_PARAM_STRING_EX2(dest, dest_len, check_null, separate, separate)
-
#define Z_PARAM_STRING(dest, dest_len) \
Z_PARAM_STRING_EX(dest, dest_len, 0, 0)
@@ -1769,17 +1784,14 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
Z_PARAM_STRING_EX(dest, dest_len, 1, 0)
/* old "S" */
-#define Z_PARAM_STR_EX2(dest, check_null, deref, separate) \
- Z_PARAM_PROLOGUE(deref, separate); \
- if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null))) { \
+#define Z_PARAM_STR_EX(dest, check_null, deref) \
+ Z_PARAM_PROLOGUE(deref, 0); \
+ if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null, _i))) { \
_expected_type = check_null ? Z_EXPECTED_STRING_OR_NULL : Z_EXPECTED_STRING; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
}
-#define Z_PARAM_STR_EX(dest, check_null, separate) \
- Z_PARAM_STR_EX2(dest, check_null, separate, separate)
-
#define Z_PARAM_STR(dest) \
Z_PARAM_STR_EX(dest, 0, 0)
@@ -1839,7 +1851,7 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
#define Z_PARAM_ARRAY_HT_OR_STR_EX(dest_ht, dest_str, allow_null) \
Z_PARAM_PROLOGUE(0, 0); \
- if (UNEXPECTED(!zend_parse_arg_array_ht_or_str(_arg, &dest_ht, &dest_str, allow_null))) { \
+ if (UNEXPECTED(!zend_parse_arg_array_ht_or_str(_arg, &dest_ht, &dest_str, allow_null, _i))) { \
_expected_type = allow_null ? Z_EXPECTED_ARRAY_OR_STRING_OR_NULL : Z_EXPECTED_ARRAY_OR_STRING; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
@@ -1853,7 +1865,7 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
#define Z_PARAM_STR_OR_LONG_EX(dest_str, dest_long, is_null, allow_null) \
Z_PARAM_PROLOGUE(0, 0); \
- if (UNEXPECTED(!zend_parse_arg_str_or_long(_arg, &dest_str, &dest_long, &is_null, allow_null))) { \
+ if (UNEXPECTED(!zend_parse_arg_str_or_long(_arg, &dest_str, &dest_long, &is_null, allow_null, _i))) { \
_expected_type = allow_null ? Z_EXPECTED_STRING_OR_LONG_OR_NULL : Z_EXPECTED_STRING_OR_LONG; \
_error_code = ZPP_ERROR_WRONG_ARG; \
break; \
@@ -1870,18 +1882,18 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
/* Inlined implementations shared by new and old parameter parsing APIs */
ZEND_API bool ZEND_FASTCALL zend_parse_arg_class(zval *arg, zend_class_entry **pce, uint32_t num, bool check_null);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_slow(zval *arg, zend_bool *dest);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_weak(zval *arg, zend_bool *dest);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_slow(zval *arg, zend_long *dest);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(zval *arg, zend_long *dest);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_slow(zval *arg, double *dest);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, zval **dest);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_or_long_slow(zval *arg, zend_string **dest_str, zend_long *dest_long);
-
-static zend_always_inline bool zend_parse_arg_bool(zval *arg, zend_bool *dest, zend_bool *is_null, bool check_null)
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_slow(zval *arg, bool *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_weak(zval *arg, bool *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_slow(zval *arg, zend_long *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(zval *arg, zend_long *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_slow(zval *arg, double *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, zval **dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_or_long_slow(zval *arg, zend_string **dest_str, zend_long *dest_long, uint32_t arg_num);
+
+static zend_always_inline bool zend_parse_arg_bool(zval *arg, bool *dest, bool *is_null, bool check_null, uint32_t arg_num)
{
if (check_null) {
*is_null = 0;
@@ -1894,12 +1906,12 @@ static zend_always_inline bool zend_parse_arg_bool(zval *arg, zend_bool *dest, z
*is_null = 1;
*dest = 0;
} else {
- return zend_parse_arg_bool_slow(arg, dest);
+ return zend_parse_arg_bool_slow(arg, dest, arg_num);
}
return 1;
}
-static zend_always_inline bool zend_parse_arg_long(zval *arg, zend_long *dest, zend_bool *is_null, bool check_null)
+static zend_always_inline bool zend_parse_arg_long(zval *arg, zend_long *dest, bool *is_null, bool check_null, uint32_t arg_num)
{
if (check_null) {
*is_null = 0;
@@ -1910,12 +1922,12 @@ static zend_always_inline bool zend_parse_arg_long(zval *arg, zend_long *dest, z
*is_null = 1;
*dest = 0;
} else {
- return zend_parse_arg_long_slow(arg, dest);
+ return zend_parse_arg_long_slow(arg, dest, arg_num);
}
return 1;
}
-static zend_always_inline bool zend_parse_arg_double(zval *arg, double *dest, zend_bool *is_null, bool check_null)
+static zend_always_inline bool zend_parse_arg_double(zval *arg, double *dest, bool *is_null, bool check_null, uint32_t arg_num)
{
if (check_null) {
*is_null = 0;
@@ -1926,40 +1938,40 @@ static zend_always_inline bool zend_parse_arg_double(zval *arg, double *dest, ze
*is_null = 1;
*dest = 0.0;
} else {
- return zend_parse_arg_double_slow(arg, dest);
+ return zend_parse_arg_double_slow(arg, dest, arg_num);
}
return 1;
}
-static zend_always_inline bool zend_parse_arg_number(zval *arg, zval **dest, bool check_null)
+static zend_always_inline bool zend_parse_arg_number(zval *arg, zval **dest, bool check_null, uint32_t arg_num)
{
if (EXPECTED(Z_TYPE_P(arg) == IS_LONG || Z_TYPE_P(arg) == IS_DOUBLE)) {
*dest = arg;
} else if (check_null && EXPECTED(Z_TYPE_P(arg) == IS_NULL)) {
*dest = NULL;
} else {
- return zend_parse_arg_number_slow(arg, dest);
+ return zend_parse_arg_number_slow(arg, dest, arg_num);
}
return 1;
}
-static zend_always_inline bool zend_parse_arg_str(zval *arg, zend_string **dest, bool check_null)
+static zend_always_inline bool zend_parse_arg_str(zval *arg, zend_string **dest, bool check_null, uint32_t arg_num)
{
if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) {
*dest = Z_STR_P(arg);
} else if (check_null && Z_TYPE_P(arg) == IS_NULL) {
*dest = NULL;
} else {
- return zend_parse_arg_str_slow(arg, dest);
+ return zend_parse_arg_str_slow(arg, dest, arg_num);
}
return 1;
}
-static zend_always_inline bool zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, bool check_null)
+static zend_always_inline bool zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, bool check_null, uint32_t arg_num)
{
zend_string *str;
- if (!zend_parse_arg_str(arg, &str, check_null)) {
+ if (!zend_parse_arg_str(arg, &str, check_null, arg_num)) {
return 0;
}
if (check_null && UNEXPECTED(!str)) {
@@ -1972,20 +1984,20 @@ static zend_always_inline bool zend_parse_arg_string(zval *arg, char **dest, siz
return 1;
}
-static zend_always_inline bool zend_parse_arg_path_str(zval *arg, zend_string **dest, bool check_null)
+static zend_always_inline bool zend_parse_arg_path_str(zval *arg, zend_string **dest, bool check_null, uint32_t arg_num)
{
- if (!zend_parse_arg_str(arg, dest, check_null) ||
+ if (!zend_parse_arg_str(arg, dest, check_null, arg_num) ||
(*dest && UNEXPECTED(CHECK_NULL_PATH(ZSTR_VAL(*dest), ZSTR_LEN(*dest))))) {
return 0;
}
return 1;
}
-static zend_always_inline bool zend_parse_arg_path(zval *arg, char **dest, size_t *dest_len, bool check_null)
+static zend_always_inline bool zend_parse_arg_path(zval *arg, char **dest, size_t *dest_len, bool check_null, uint32_t arg_num)
{
zend_string *str;
- if (!zend_parse_arg_path_str(arg, &str, check_null)) {
+ if (!zend_parse_arg_path_str(arg, &str, check_null, arg_num)) {
return 0;
}
if (check_null && UNEXPECTED(!str)) {
@@ -2050,7 +2062,7 @@ static zend_always_inline bool zend_parse_arg_array_ht(zval *arg, HashTable **de
}
static zend_always_inline bool zend_parse_arg_array_ht_or_long(
- zval *arg, HashTable **dest_ht, zend_long *dest_long, zend_bool *is_null, bool allow_null
+ zval *arg, HashTable **dest_ht, zend_long *dest_long, bool *is_null, bool allow_null, uint32_t arg_num
) {
if (allow_null) {
*is_null = 0;
@@ -2066,7 +2078,7 @@ static zend_always_inline bool zend_parse_arg_array_ht_or_long(
*is_null = 1;
} else {
*dest_ht = NULL;
- return zend_parse_arg_long_slow(arg, dest_long);
+ return zend_parse_arg_long_slow(arg, dest_long, arg_num);
}
return 1;
@@ -2099,7 +2111,7 @@ static zend_always_inline bool zend_parse_arg_obj(zval *arg, zend_object **dest,
}
static zend_always_inline bool zend_parse_arg_obj_or_long(
- zval *arg, zend_object **dest_obj, zend_class_entry *ce, zend_long *dest_long, zend_bool *is_null, bool allow_null
+ zval *arg, zend_object **dest_obj, zend_class_entry *ce, zend_long *dest_long, bool *is_null, bool allow_null, uint32_t arg_num
) {
if (allow_null) {
*is_null = 0;
@@ -2115,7 +2127,7 @@ static zend_always_inline bool zend_parse_arg_obj_or_long(
*is_null = 1;
} else {
*dest_obj = NULL;
- return zend_parse_arg_long_slow(arg, dest_long);
+ return zend_parse_arg_long_slow(arg, dest_long, arg_num);
}
return 1;
@@ -2163,7 +2175,7 @@ static zend_always_inline void zend_parse_arg_zval_deref(zval *arg, zval **dest,
}
static zend_always_inline bool zend_parse_arg_array_ht_or_str(
- zval *arg, HashTable **dest_ht, zend_string **dest_str, bool allow_null)
+ zval *arg, HashTable **dest_ht, zend_string **dest_str, bool allow_null, uint32_t arg_num)
{
if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) {
*dest_ht = NULL;
@@ -2176,13 +2188,13 @@ static zend_always_inline bool zend_parse_arg_array_ht_or_str(
*dest_str = NULL;
} else {
*dest_ht = NULL;
- return zend_parse_arg_str_slow(arg, dest_str);
+ return zend_parse_arg_str_slow(arg, dest_str, arg_num);
}
return 1;
}
static zend_always_inline bool zend_parse_arg_str_or_long(zval *arg, zend_string **dest_str, zend_long *dest_long,
- zend_bool *is_null, bool allow_null)
+ bool *is_null, bool allow_null, uint32_t arg_num)
{
if (allow_null) {
*is_null = 0;
@@ -2196,7 +2208,7 @@ static zend_always_inline bool zend_parse_arg_str_or_long(zval *arg, zend_string
*dest_str = NULL;
*is_null = 1;
} else {
- return zend_parse_arg_str_or_long_slow(arg, dest_str, dest_long);
+ return zend_parse_arg_str_or_long_slow(arg, dest_str, dest_long, arg_num);
}
return 1;
}
@@ -2220,7 +2232,7 @@ static zend_always_inline bool zend_parse_arg_obj_or_class_name(
}
static zend_always_inline bool zend_parse_arg_obj_or_str(
- zval *arg, zend_object **destination_object, zend_class_entry *base_ce, zend_string **destination_string, bool allow_null
+ zval *arg, zend_object **destination_object, zend_class_entry *base_ce, zend_string **destination_string, bool allow_null, uint32_t arg_num
) {
if (EXPECTED(Z_TYPE_P(arg) == IS_OBJECT)) {
if (!base_ce || EXPECTED(instanceof_function(Z_OBJCE_P(arg), base_ce))) {
@@ -2231,7 +2243,7 @@ static zend_always_inline bool zend_parse_arg_obj_or_str(
}
*destination_object = NULL;
- return zend_parse_arg_str(arg, destination_string, allow_null);
+ return zend_parse_arg_str(arg, destination_string, allow_null, arg_num);
}
END_EXTERN_C()
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 098dda104a..10e739c0ee 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -114,10 +114,11 @@ static size_t _real_page_size = ZEND_MM_PAGE_SIZE;
#ifndef __APPLE__
# define ZEND_MM_FD -1
#else
+# include <mach/vm_statistics.h>
/* Mac allows to track anonymous page via vmmap per TAG id.
* user land applications are allowed to take from 240 to 255.
*/
-# define ZEND_MM_FD (250<<24)
+# define ZEND_MM_FD VM_MAKE_TAG(250U)
#endif
#ifndef ZEND_MM_STAT
@@ -1510,7 +1511,7 @@ static zend_never_inline void *zend_mm_realloc_huge(zend_mm_heap *heap, void *pt
return zend_mm_realloc_slow(heap, ptr, size, MIN(old_size, copy_size) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
}
-static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *ptr, size_t size, zend_bool use_copy_size, size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
+static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *ptr, size_t size, bool use_copy_size, size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
size_t page_offset;
size_t old_size;
@@ -2789,7 +2790,7 @@ static void alloc_globals_ctor(zend_alloc_globals *alloc_globals)
#if ZEND_MM_CUSTOM
tmp = getenv("USE_ZEND_ALLOC");
if (tmp && !zend_atoi(tmp, 0)) {
- zend_bool tracked = (tmp = getenv("USE_TRACKED_ALLOC")) && zend_atoi(tmp, 0);
+ bool tracked = (tmp = getenv("USE_TRACKED_ALLOC")) && zend_atoi(tmp, 0);
zend_mm_heap *mm_heap = alloc_globals->mm_heap = malloc(sizeof(zend_mm_heap));
memset(mm_heap, 0, sizeof(zend_mm_heap));
mm_heap->use_custom_heap = ZEND_MM_CUSTOM_HEAP_STD;
diff --git a/Zend/zend_arena.h b/Zend/zend_arena.h
index ff2d0a5fe6..a44082e52f 100644
--- a/Zend/zend_arena.h
+++ b/Zend/zend_arena.h
@@ -110,7 +110,7 @@ static zend_always_inline void zend_arena_release(zend_arena **arena_ptr, void *
arena->ptr = (char*)checkpoint;
}
-static zend_always_inline zend_bool zend_arena_contains(zend_arena *arena, void *ptr)
+static zend_always_inline bool zend_arena_contains(zend_arena *arena, void *ptr)
{
while (arena) {
if ((char*)ptr > (char*)arena && (char*)ptr <= arena->ptr) {
@@ -213,7 +213,7 @@ static zend_always_inline void zend_arena_release(zend_arena **arena_ptr, void *
}
}
-static zend_always_inline zend_bool zend_arena_contains(zend_arena *arena, void *ptr)
+static zend_always_inline bool zend_arena_contains(zend_arena *arena, void *ptr)
{
/* TODO: Dummy */
return 1;
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index cb61bec5d7..b8d3515155 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -24,6 +24,7 @@
#include "zend_smart_str.h"
#include "zend_exceptions.h"
#include "zend_constants.h"
+#include "zend_enum.h"
ZEND_API zend_ast_process_t zend_ast_process = NULL;
@@ -423,7 +424,7 @@ ZEND_API zend_ast *zend_ast_create_list(uint32_t init_children, zend_ast_kind ki
}
#endif
-static inline zend_bool is_power_of_two(uint32_t n) {
+static inline bool is_power_of_two(uint32_t n) {
return ((n != 0) && (n == (n & (~n + 1))));
}
@@ -485,16 +486,15 @@ static zend_result zend_ast_add_unpacked_element(zval *result, zval *expr) {
ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
if (key) {
- zend_throw_error(NULL, "Cannot unpack array with string keys");
- return FAILURE;
+ zend_hash_update(Z_ARRVAL_P(result), key, val);
} else {
if (!zend_hash_next_index_insert(Z_ARRVAL_P(result), val)) {
zend_throw_error(NULL,
"Cannot add element to the array as the next element is already occupied");
return FAILURE;
}
- Z_TRY_ADDREF_P(val);
}
+ Z_TRY_ADDREF_P(val);
} ZEND_HASH_FOREACH_END();
return SUCCESS;
}
@@ -741,19 +741,49 @@ ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast
if (UNEXPECTED(zend_ast_evaluate(&op1, ast->child[0], scope) != SUCCESS)) {
ret = FAILURE;
- } else if (UNEXPECTED(zend_ast_evaluate(&op2, ast->child[1], scope) != SUCCESS)) {
+ break;
+ }
+
+ // DIM on objects is disallowed because it allows executing arbitrary expressions
+ if (Z_TYPE(op1) == IS_OBJECT) {
zval_ptr_dtor_nogc(&op1);
+ zend_throw_error(NULL, "Cannot use [] on objects in constant expression");
ret = FAILURE;
- } else {
- zend_fetch_dimension_const(result, &op1, &op2, (ast->attr & ZEND_DIM_IS) ? BP_VAR_IS : BP_VAR_R);
+ break;
+ }
+ if (UNEXPECTED(zend_ast_evaluate(&op2, ast->child[1], scope) != SUCCESS)) {
zval_ptr_dtor_nogc(&op1);
- zval_ptr_dtor_nogc(&op2);
- if (UNEXPECTED(EG(exception))) {
- return FAILURE;
- }
+ ret = FAILURE;
+ break;
}
+
+ zend_fetch_dimension_const(result, &op1, &op2, (ast->attr & ZEND_DIM_IS) ? BP_VAR_IS : BP_VAR_R);
+
+ zval_ptr_dtor_nogc(&op1);
+ zval_ptr_dtor_nogc(&op2);
+ if (UNEXPECTED(EG(exception))) {
+ return FAILURE;
+ }
+
break;
+ case ZEND_AST_CONST_ENUM_INIT:
+ {
+ zend_ast *class_name_ast = ast->child[0];
+ zend_string *class_name = zend_ast_get_str(class_name_ast);
+
+ zend_ast *case_name_ast = ast->child[1];
+ zend_string *case_name = zend_ast_get_str(case_name_ast);
+
+ zend_ast *case_value_ast = ast->child[2];
+ zval *case_value_zv = case_value_ast != NULL
+ ? zend_ast_get_zval(case_value_ast)
+ : NULL;
+
+ zend_class_entry *ce = zend_lookup_class(class_name);
+ zend_enum_new(result, ce, case_name, case_value_zv);
+ break;
+ }
default:
zend_throw_error(NULL, "Unsupported constant expression");
ret = FAILURE;
@@ -1375,7 +1405,7 @@ static ZEND_COLD void zend_ast_export_attribute_group(smart_str *str, zend_ast *
}
}
-static ZEND_COLD void zend_ast_export_attributes(smart_str *str, zend_ast *ast, int indent, zend_bool newlines) {
+static ZEND_COLD void zend_ast_export_attributes(smart_str *str, zend_ast *ast, int indent, bool newlines) {
zend_ast_list *list = zend_ast_get_list(ast);
uint32_t i;
@@ -1497,7 +1527,7 @@ tail_call:
case ZEND_AST_METHOD:
decl = (zend_ast_decl *) ast;
if (decl->child[4]) {
- zend_bool newlines = !(ast->kind == ZEND_AST_CLOSURE || ast->kind == ZEND_AST_ARROW_FUNC);
+ bool newlines = !(ast->kind == ZEND_AST_CLOSURE || ast->kind == ZEND_AST_ARROW_FUNC);
zend_ast_export_attributes(str, decl->child[4], indent, newlines);
}
@@ -1559,6 +1589,8 @@ tail_call:
smart_str_appends(str, "interface ");
} else if (decl->flags & ZEND_ACC_TRAIT) {
smart_str_appends(str, "trait ");
+ } else if (decl->flags & ZEND_ACC_ENUM) {
+ smart_str_appends(str, "enum ");
} else {
if (decl->flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) {
smart_str_appends(str, "abstract ");
@@ -1569,6 +1601,10 @@ tail_call:
smart_str_appends(str, "class ");
}
smart_str_appendl(str, ZSTR_VAL(decl->name), ZSTR_LEN(decl->name));
+ if (decl->flags & ZEND_ACC_ENUM && decl->child[4]) {
+ smart_str_appends(str, ": ");
+ zend_ast_export_type(str, decl->child[4], indent);
+ }
zend_ast_export_class_no_header(str, decl, indent);
smart_str_appendc(str, '\n');
break;
@@ -2151,6 +2187,17 @@ simple_list:
smart_str_appendc(str, '$');
zend_ast_export_name(str, ast->child[1], 0, indent);
APPEND_DEFAULT_VALUE(2);
+ case ZEND_AST_ENUM_CASE:
+ if (ast->child[2]) {
+ zend_ast_export_attributes(str, ast->child[2], indent, 1);
+ }
+ smart_str_appends(str, "case ");
+ zend_ast_export_name(str, ast->child[0], 0, indent);
+ if (ast->child[1]) {
+ smart_str_appends(str, " = ");
+ zend_ast_export_ex(str, ast->child[1], 0, indent);
+ }
+ break;
/* 4 child nodes */
case ZEND_AST_FOR:
@@ -2274,6 +2321,9 @@ zend_ast * ZEND_FASTCALL zend_ast_with_attributes(zend_ast *ast, zend_ast *attr)
case ZEND_AST_CLASS_CONST_GROUP:
ast->child[1] = attr;
break;
+ case ZEND_AST_ENUM_CASE:
+ ast->child[2] = attr;
+ break;
EMPTY_SWITCH_DEFAULT_CASE()
}
diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h
index eb02e9bea0..fb6587b48c 100644
--- a/Zend/zend_ast.h
+++ b/Zend/zend_ast.h
@@ -159,6 +159,10 @@ enum _zend_ast_kind {
ZEND_AST_PROP_GROUP,
ZEND_AST_PROP_ELEM,
ZEND_AST_CONST_ELEM,
+ ZEND_AST_ENUM_CASE,
+
+ // Pseudo node for initializing enums
+ ZEND_AST_CONST_ENUM_INIT,
/* 4 child nodes */
ZEND_AST_FOR = 4 << ZEND_AST_NUM_CHILDREN_SHIFT,
@@ -301,11 +305,11 @@ ZEND_API void ZEND_FASTCALL zend_ast_ref_destroy(zend_ast_ref *ast);
typedef void (*zend_ast_apply_func)(zend_ast **ast_ptr);
ZEND_API void zend_ast_apply(zend_ast *ast, zend_ast_apply_func fn);
-static zend_always_inline zend_bool zend_ast_is_special(zend_ast *ast) {
+static zend_always_inline bool zend_ast_is_special(zend_ast *ast) {
return (ast->kind >> ZEND_AST_SPECIAL_SHIFT) & 1;
}
-static zend_always_inline zend_bool zend_ast_is_list(zend_ast *ast) {
+static zend_always_inline bool zend_ast_is_list(zend_ast *ast) {
return (ast->kind >> ZEND_AST_IS_LIST_SHIFT) & 1;
}
static zend_always_inline zend_ast_list *zend_ast_get_list(zend_ast *ast) {
diff --git a/Zend/zend_attributes.c b/Zend/zend_attributes.c
index f8d384301a..2823d3bafb 100644
--- a/Zend/zend_attributes.c
+++ b/Zend/zend_attributes.c
@@ -163,7 +163,7 @@ ZEND_API zend_string *zend_get_attribute_target_names(uint32_t flags)
return smart_str_extract(&str);
}
-ZEND_API zend_bool zend_is_attribute_repeated(HashTable *attributes, zend_attribute *attr)
+ZEND_API bool zend_is_attribute_repeated(HashTable *attributes, zend_attribute *attr)
{
zend_attribute *other;
@@ -263,15 +263,12 @@ ZEND_API zend_internal_attribute *zend_internal_attribute_get(zend_string *lcnam
void zend_register_attribute_ce(void)
{
zend_internal_attribute *attr;
- zend_class_entry ce;
- zend_string *str;
- zval tmp;
zend_hash_init(&internal_attributes, 8, NULL, free_internal_attribute, 1);
- INIT_CLASS_ENTRY(ce, "Attribute", class_Attribute_methods);
- zend_ce_attribute = zend_register_internal_class(&ce);
- zend_ce_attribute->ce_flags |= ZEND_ACC_FINAL;
+ zend_ce_attribute = register_class_Attribute();
+ attr = zend_internal_attribute_register(zend_ce_attribute, ZEND_ATTRIBUTE_TARGET_CLASS);
+ attr->validator = validate_attribute;
zend_declare_class_constant_long(zend_ce_attribute, ZEND_STRL("TARGET_CLASS"), ZEND_ATTRIBUTE_TARGET_CLASS);
zend_declare_class_constant_long(zend_ce_attribute, ZEND_STRL("TARGET_FUNCTION"), ZEND_ATTRIBUTE_TARGET_FUNCTION);
@@ -281,14 +278,6 @@ void zend_register_attribute_ce(void)
zend_declare_class_constant_long(zend_ce_attribute, ZEND_STRL("TARGET_PARAMETER"), ZEND_ATTRIBUTE_TARGET_PARAMETER);
zend_declare_class_constant_long(zend_ce_attribute, ZEND_STRL("TARGET_ALL"), ZEND_ATTRIBUTE_TARGET_ALL);
zend_declare_class_constant_long(zend_ce_attribute, ZEND_STRL("IS_REPEATABLE"), ZEND_ATTRIBUTE_IS_REPEATABLE);
-
- ZVAL_UNDEF(&tmp);
- str = zend_string_init(ZEND_STRL("flags"), 1);
- zend_declare_typed_property(zend_ce_attribute, str, &tmp, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CODE(IS_LONG, 0, 0));
- zend_string_release(str);
-
- attr = zend_internal_attribute_register(zend_ce_attribute, ZEND_ATTRIBUTE_TARGET_CLASS);
- attr->validator = validate_attribute;
}
void zend_attributes_shutdown(void)
diff --git a/Zend/zend_attributes.h b/Zend/zend_attributes.h
index d19b7e470d..fa21896447 100644
--- a/Zend/zend_attributes.h
+++ b/Zend/zend_attributes.h
@@ -72,7 +72,7 @@ ZEND_API zend_attribute *zend_get_parameter_attribute_str(HashTable *attributes,
ZEND_API zend_result zend_get_attribute_value(zval *ret, zend_attribute *attr, uint32_t i, zend_class_entry *scope);
ZEND_API zend_string *zend_get_attribute_target_names(uint32_t targets);
-ZEND_API zend_bool zend_is_attribute_repeated(HashTable *attributes, zend_attribute *attr);
+ZEND_API bool zend_is_attribute_repeated(HashTable *attributes, zend_attribute *attr);
ZEND_API zend_internal_attribute *zend_internal_attribute_register(zend_class_entry *ce, uint32_t flags);
ZEND_API zend_internal_attribute *zend_internal_attribute_get(zend_string *lcname);
diff --git a/Zend/zend_attributes.stub.php b/Zend/zend_attributes.stub.php
index 90f1a171db..26defa8d4d 100644
--- a/Zend/zend_attributes.stub.php
+++ b/Zend/zend_attributes.stub.php
@@ -1,8 +1,10 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
final class Attribute
{
+ public int $flags;
+
public function __construct(int $flags = Attribute::TARGET_ALL) {}
}
diff --git a/Zend/zend_attributes_arginfo.h b/Zend/zend_attributes_arginfo.h
index 1b0da2ccb8..a09f9161fd 100644
--- a/Zend/zend_attributes_arginfo.h
+++ b/Zend/zend_attributes_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 54eede8541597ec2ac5c04e31d14e2db7e8c5556 */
+ * Stub hash: 0183e750e66999862a7688ecb251017110d06d1f */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Attribute___construct, 0, 0, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "Attribute::TARGET_ALL")
@@ -13,3 +13,20 @@ static const zend_function_entry class_Attribute_methods[] = {
ZEND_ME(Attribute, __construct, arginfo_class_Attribute___construct, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Attribute(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Attribute", class_Attribute_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ zval property_flags_default_value;
+ ZVAL_UNDEF(&property_flags_default_value);
+ zend_string *property_flags_name = zend_string_init("flags", sizeof("flags") - 1, 1);
+ zend_declare_typed_property(class_entry, property_flags_name, &property_flags_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_flags_name);
+
+ return class_entry;
+}
diff --git a/Zend/zend_bitset.h b/Zend/zend_bitset.h
index b7c369c749..2bc0ca105d 100644
--- a/Zend/zend_bitset.h
+++ b/Zend/zend_bitset.h
@@ -122,7 +122,7 @@ static inline uint32_t zend_bitset_len(uint32_t n)
return (n + ((sizeof(zend_long) * 8) - 1)) / (sizeof(zend_long) * 8);
}
-static inline zend_bool zend_bitset_in(zend_bitset set, uint32_t n)
+static inline bool zend_bitset_in(zend_bitset set, uint32_t n)
{
return ZEND_BIT_TEST(set, n);
}
@@ -158,7 +158,7 @@ static inline void zend_bitset_fill(zend_bitset set, uint32_t len)
memset(set, 0xff, len * ZEND_BITSET_ELM_SIZE);
}
-static inline zend_bool zend_bitset_equal(zend_bitset set1, zend_bitset set2, uint32_t len)
+static inline bool zend_bitset_equal(zend_bitset set1, zend_bitset set2, uint32_t len)
{
return memcmp(set1, set2, len * ZEND_BITSET_ELM_SIZE) == 0;
}
@@ -213,7 +213,7 @@ static inline void zend_bitset_union_with_difference(zend_bitset set1, zend_bits
}
}
-static inline zend_bool zend_bitset_subset(zend_bitset set1, zend_bitset set2, uint32_t len)
+static inline bool zend_bitset_subset(zend_bitset set1, zend_bitset set2, uint32_t len)
{
uint32_t i;
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 5ec365c920..4c720c53db 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -32,10 +32,7 @@
/* }}} */
ZEND_MINIT_FUNCTION(core) { /* {{{ */
- zend_class_entry class_entry;
-
- INIT_CLASS_ENTRY(class_entry, "stdClass", NULL);
- zend_standard_class_def = zend_register_internal_class(&class_entry);
+ zend_standard_class_def = register_class_stdClass();
zend_register_default_classes();
@@ -370,7 +367,7 @@ ZEND_FUNCTION(strncasecmp)
ZEND_FUNCTION(error_reporting)
{
zend_long err;
- zend_bool err_is_null = 1;
+ bool err_is_null = 1;
int old_error_reporting;
ZEND_PARSE_PARAMETERS_START(0, 1)
@@ -380,7 +377,7 @@ ZEND_FUNCTION(error_reporting)
old_error_reporting = EG(error_reporting);
- if (!err_is_null) {
+ if (!err_is_null && err != old_error_reporting) {
zend_string *new_val = zend_long_to_str(err);
if (UNEXPECTED(!new_val)) {
RETURN_THROWS();
@@ -426,7 +423,7 @@ static bool validate_constant_array_argument(HashTable *ht, int argument_number)
zval *val;
GC_PROTECT_RECURSION(ht);
- ZEND_HASH_FOREACH_VAL_IND(ht, val) {
+ ZEND_HASH_FOREACH_VAL(ht, val) {
ZVAL_DEREF(val);
if (Z_REFCOUNTED_P(val)) {
if (Z_TYPE_P(val) == IS_ARRAY) {
@@ -459,7 +456,7 @@ static void copy_constant_array(zval *dst, zval *src) /* {{{ */
zval *new_val, *val;
array_init_size(dst, zend_hash_num_elements(Z_ARRVAL_P(src)));
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(src), idx, key, val) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(src), idx, key, val) {
/* constant arrays can't contain references */
ZVAL_DEREF(val);
if (key) {
@@ -483,7 +480,7 @@ ZEND_FUNCTION(define)
{
zend_string *name;
zval *val, val_free;
- zend_bool non_cs = 0;
+ bool non_cs = 0;
zend_constant c;
ZEND_PARSE_PARAMETERS_START(2, 3)
@@ -631,14 +628,14 @@ ZEND_FUNCTION(get_parent_class)
}
/* }}} */
-static void is_a_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool only_subclass) /* {{{ */
+static void is_a_impl(INTERNAL_FUNCTION_PARAMETERS, bool only_subclass) /* {{{ */
{
zval *obj;
zend_string *class_name;
zend_class_entry *instance_ce;
zend_class_entry *ce;
- zend_bool allow_string = only_subclass;
- zend_bool retval;
+ bool allow_string = only_subclass;
+ bool retval;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ZVAL(obj)
@@ -703,6 +700,7 @@ static void add_class_vars(zend_class_entry *scope, zend_class_entry *ce, bool s
zend_property_info *prop_info;
zval *prop, prop_copy;
zend_string *key;
+ zval *default_properties_table = CE_DEFAULT_PROPERTIES_TABLE(ce);
ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop_info) {
if (((prop_info->flags & ZEND_ACC_PROTECTED) &&
@@ -716,7 +714,7 @@ static void add_class_vars(zend_class_entry *scope, zend_class_entry *ce, bool s
prop = &ce->default_static_members_table[prop_info->offset];
ZVAL_DEINDIRECT(prop);
} else if (!statics && (prop_info->flags & ZEND_ACC_STATIC) == 0) {
- prop = &ce->default_properties_table[OBJ_PROP_TO_NUM(prop_info->offset)];
+ prop = &default_properties_table[OBJ_PROP_TO_NUM(prop_info->offset)];
}
if (!prop) {
continue;
@@ -734,7 +732,7 @@ static void add_class_vars(zend_class_entry *scope, zend_class_entry *ce, bool s
/* this is necessary to make it able to work with default array
* properties, returned to user */
if (Z_OPT_TYPE_P(prop) == IS_CONSTANT_AST) {
- if (UNEXPECTED(zval_update_constant_ex(prop, NULL) != SUCCESS)) {
+ if (UNEXPECTED(zval_update_constant_ex(prop, ce) != SUCCESS)) {
return;
}
}
@@ -769,7 +767,6 @@ ZEND_FUNCTION(get_class_vars)
/* {{{ Returns an array of object properties */
ZEND_FUNCTION(get_object_vars)
{
- zval *obj;
zval *value;
HashTable *properties;
zend_string *key;
@@ -777,10 +774,9 @@ ZEND_FUNCTION(get_object_vars)
zend_ulong num_key;
ZEND_PARSE_PARAMETERS_START(1, 1)
- Z_PARAM_OBJECT(obj)
+ Z_PARAM_OBJ(zobj)
ZEND_PARSE_PARAMETERS_END();
- zobj = Z_OBJ_P(obj);
properties = zobj->handlers->get_properties(zobj);
if (properties == NULL) {
RETURN_EMPTY_ARRAY();
@@ -796,7 +792,7 @@ ZEND_FUNCTION(get_object_vars)
array_init_size(return_value, zend_hash_num_elements(properties));
ZEND_HASH_FOREACH_KEY_VAL(properties, num_key, key, value) {
- zend_bool is_dynamic = 1;
+ bool is_dynamic = 1;
if (Z_TYPE_P(value) == IS_INDIRECT) {
value = Z_INDIRECT_P(value);
if (UNEXPECTED(Z_ISUNDEF_P(value))) {
@@ -839,45 +835,27 @@ ZEND_FUNCTION(get_object_vars)
/* {{{ Returns an array of mangled object properties. Does not respect property visibility. */
ZEND_FUNCTION(get_mangled_object_vars)
{
- zval *obj;
+ zend_object *obj;
HashTable *properties;
ZEND_PARSE_PARAMETERS_START(1, 1)
- Z_PARAM_OBJECT(obj)
+ Z_PARAM_OBJ(obj)
ZEND_PARSE_PARAMETERS_END();
- properties = Z_OBJ_HT_P(obj)->get_properties(Z_OBJ_P(obj));
+ properties = obj->handlers->get_properties(obj);
if (!properties) {
ZVAL_EMPTY_ARRAY(return_value);
return;
}
properties = zend_proptable_to_symtable(properties,
- (Z_OBJCE_P(obj)->default_properties_count ||
- Z_OBJ_P(obj)->handlers != &std_object_handlers ||
+ (obj->ce->default_properties_count ||
+ obj->handlers != &std_object_handlers ||
GC_IS_RECURSIVE(properties)));
RETURN_ARR(properties);
}
/* }}} */
-static bool same_name(zend_string *key, zend_string *name) /* {{{ */
-{
- zend_string *lcname;
- bool ret;
-
- if (key == name) {
- return 1;
- }
- if (ZSTR_LEN(key) != ZSTR_LEN(name)) {
- return 0;
- }
- lcname = zend_string_tolower(name);
- ret = memcmp(ZSTR_VAL(lcname), ZSTR_VAL(key), ZSTR_LEN(key)) == 0;
- zend_string_release_ex(lcname, 0);
- return ret;
-}
-/* }}} */
-
/* {{{ Returns an array of method names for class or class instance. */
ZEND_FUNCTION(get_class_methods)
{
@@ -1009,7 +987,7 @@ static inline void class_exists_impl(INTERNAL_FUNCTION_PARAMETERS, int flags, in
zend_string *name;
zend_string *lcname;
zend_class_entry *ce;
- zend_bool autoload = 1;
+ bool autoload = 1;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STR(name)
@@ -1061,11 +1039,16 @@ ZEND_FUNCTION(trait_exists)
}
/* }}} */
+ZEND_FUNCTION(enum_exists)
+{
+ class_exists_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_ENUM, 0);
+}
+
/* {{{ Checks if the function exists */
ZEND_FUNCTION(function_exists)
{
zend_string *name;
- zend_bool exists;
+ bool exists;
zend_string *lcname;
ZEND_PARSE_PARAMETERS_START(1, 1)
@@ -1091,23 +1074,25 @@ ZEND_FUNCTION(function_exists)
ZEND_FUNCTION(class_alias)
{
zend_string *class_name;
- char *alias_name;
+ zend_string *alias_name;
zend_class_entry *ce;
- size_t alias_name_len;
- zend_bool autoload = 1;
+ bool autoload = 1;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ss|b", &class_name, &alias_name, &alias_name_len, &autoload) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(2, 3)
+ Z_PARAM_STR(class_name)
+ Z_PARAM_STR(alias_name)
+ Z_PARAM_OPTIONAL
+ Z_PARAM_BOOL(autoload)
+ ZEND_PARSE_PARAMETERS_END();
ce = zend_lookup_class_ex(class_name, NULL, !autoload ? ZEND_FETCH_CLASS_NO_AUTOLOAD : 0);
if (ce) {
if (ce->type == ZEND_USER_CLASS) {
- if (zend_register_class_alias_ex(alias_name, alias_name_len, ce, 0) == SUCCESS) {
+ if (zend_register_class_alias_ex(ZSTR_VAL(alias_name), ZSTR_LEN(alias_name), ce, 0) == SUCCESS) {
RETURN_TRUE;
} else {
- zend_error(E_WARNING, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), alias_name);
+ zend_error(E_WARNING, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(alias_name));
RETURN_FALSE;
}
} else {
@@ -1174,10 +1159,11 @@ ZEND_FUNCTION(set_error_handler)
zend_fcall_info_cache fcc;
zend_long error_type = E_ALL;
- /* callable argument corresponds to the error handler */
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "f!|l", &fci, &fcc, &error_type) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 2)
+ Z_PARAM_FUNC_OR_NULL(fci, fcc)
+ Z_PARAM_OPTIONAL
+ Z_PARAM_LONG(error_type)
+ ZEND_PARSE_PARAMETERS_END();
if (Z_TYPE(EG(user_error_handler)) != IS_UNDEF) {
ZVAL_COPY(return_value, &EG(user_error_handler));
@@ -1231,10 +1217,9 @@ ZEND_FUNCTION(set_exception_handler)
zend_fcall_info fci;
zend_fcall_info_cache fcc;
- /* callable argument corresponds to the exception handler */
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "f!", &fci, &fcc) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_FUNC_OR_NULL(fci, fcc)
+ ZEND_PARSE_PARAMETERS_END();
if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) {
ZVAL_COPY(return_value, &EG(user_exception_handler));
@@ -1272,30 +1257,28 @@ ZEND_FUNCTION(restore_exception_handler)
}
/* }}} */
-static void copy_class_or_interface_name(zval *array, zend_string *key, zend_class_entry *ce) /* {{{ */
-{
- if ((ce->refcount == 1 && !(ce->ce_flags & ZEND_ACC_IMMUTABLE)) ||
- same_name(key, ce->name)) {
- key = ce->name;
- }
- add_next_index_str(array, zend_string_copy(key));
-}
-/* }}} */
-
static inline void get_declared_class_impl(INTERNAL_FUNCTION_PARAMETERS, int flags, int skip_flags) /* {{{ */
{
zend_string *key;
+ zval *zv, tmp;
zend_class_entry *ce;
ZEND_PARSE_PARAMETERS_NONE();
array_init(return_value);
- ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), key, ce) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(EG(class_table), key, zv) {
+ ce = Z_PTR_P(zv);
if (key
&& ZSTR_VAL(key)[0] != 0
&& (ce->ce_flags & flags)
&& !(ce->ce_flags & skip_flags)) {
- copy_class_or_interface_name(return_value, key, ce);
+ if (EXPECTED(Z_TYPE_P(zv) == IS_PTR)) {
+ ZVAL_STR_COPY(&tmp, ce->name);
+ } else {
+ ZEND_ASSERT(Z_TYPE_P(zv) == IS_ALIAS_PTR);
+ ZVAL_STR_COPY(&tmp, key);
+ }
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
}
} ZEND_HASH_FOREACH_END();
}
@@ -1328,7 +1311,7 @@ ZEND_FUNCTION(get_defined_functions)
zval internal, user;
zend_string *key;
zend_function *func;
- zend_bool exclude_disabled = 1;
+ bool exclude_disabled = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &exclude_disabled) == FAILURE) {
RETURN_THROWS();
@@ -1476,7 +1459,7 @@ static void add_zendext_info(zend_extension *ext, void *arg) /* {{{ */
/* {{{ Return an array containing names of loaded extensions */
ZEND_FUNCTION(get_loaded_extensions)
{
- zend_bool zendext = 0;
+ bool zendext = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &zendext) == FAILURE) {
RETURN_THROWS();
@@ -1499,7 +1482,7 @@ ZEND_FUNCTION(get_loaded_extensions)
/* {{{ Return an array containing the names and values of all defined constants */
ZEND_FUNCTION(get_defined_constants)
{
- zend_bool categorize = 0;
+ bool categorize = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &categorize) == FAILURE) {
RETURN_THROWS();
@@ -1668,7 +1651,7 @@ void debug_print_backtrace_args(zval *arg_array) /* {{{ */
}
/* }}} */
-static inline zend_bool skip_internal_handler(zend_execute_data *skip) /* {{{ */
+static inline bool skip_internal_handler(zend_execute_data *skip) /* {{{ */
{
return !(skip->func && ZEND_USER_CODE(skip->func->common.type))
&& skip->prev_execute_data
@@ -1780,7 +1763,7 @@ ZEND_FUNCTION(debug_print_backtrace)
}
} else {
/* i know this is kinda ugly, but i'm trying to avoid extra cycles in the main execution loop */
- zend_bool build_filename_arg = 1;
+ bool build_filename_arg = 1;
uint32_t include_kind = 0;
if (ptr->func && ZEND_USER_CODE(ptr->func->common.type) && ptr->opline->opcode == ZEND_INCLUDE_OR_EVAL) {
include_kind = ptr->opline->extended_value;
@@ -2011,7 +1994,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
}
} else {
/* i know this is kinda ugly, but i'm trying to avoid extra cycles in the main execution loop */
- zend_bool build_filename_arg = 1;
+ bool build_filename_arg = 1;
zend_string *pseudo_function_name;
uint32_t include_kind = 0;
if (ptr->func && ZEND_USER_CODE(ptr->func->common.type) && ptr->opline->opcode == ZEND_INCLUDE_OR_EVAL) {
diff --git a/Zend/zend_builtin_functions.stub.php b/Zend/zend_builtin_functions.stub.php
index 187e789d23..9df6659f2d 100644
--- a/Zend/zend_builtin_functions.stub.php
+++ b/Zend/zend_builtin_functions.stub.php
@@ -1,6 +1,10 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+
+class stdClass
+{
+}
function zend_version(): string {}
@@ -59,6 +63,8 @@ function interface_exists(string $interface, bool $autoload = true): bool {}
function trait_exists(string $trait, bool $autoload = true): bool {}
+function enum_exists(string $enum, bool $autoload = true): bool {}
+
function function_exists(string $function): bool {}
function class_alias(string $class, string $alias, bool $autoload = true): bool {}
diff --git a/Zend/zend_builtin_functions_arginfo.h b/Zend/zend_builtin_functions_arginfo.h
index e2d640d22f..f707e0a8a3 100644
--- a/Zend/zend_builtin_functions_arginfo.h
+++ b/Zend/zend_builtin_functions_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: b09e9199a21595a3b6f6c02db81c8e22c36c277f */
+ * Stub hash: c333499e3ea100d976f0fa8bb8800ed21b04f1c6 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_version, 0, 0, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -108,6 +108,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_trait_exists, 0, 1, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, autoload, _IS_BOOL, 0, "true")
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enum_exists, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_TYPE_INFO(0, enum, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, autoload, _IS_BOOL, 0, "true")
+ZEND_END_ARG_INFO()
+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_function_exists, 0, 1, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, function, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -238,6 +243,7 @@ ZEND_FUNCTION(property_exists);
ZEND_FUNCTION(class_exists);
ZEND_FUNCTION(interface_exists);
ZEND_FUNCTION(trait_exists);
+ZEND_FUNCTION(enum_exists);
ZEND_FUNCTION(function_exists);
ZEND_FUNCTION(class_alias);
ZEND_FUNCTION(get_included_files);
@@ -298,6 +304,7 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(class_exists, arginfo_class_exists)
ZEND_FE(interface_exists, arginfo_interface_exists)
ZEND_FE(trait_exists, arginfo_trait_exists)
+ ZEND_FE(enum_exists, arginfo_enum_exists)
ZEND_FE(function_exists, arginfo_function_exists)
ZEND_FE(class_alias, arginfo_class_alias)
ZEND_FE(get_included_files, arginfo_get_included_files)
@@ -333,3 +340,18 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(gc_status, arginfo_gc_status)
ZEND_FE_END
};
+
+
+static const zend_function_entry class_stdClass_methods[] = {
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class_stdClass(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "stdClass", class_stdClass_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index e7777c58cf..f1ffe78c69 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -69,11 +69,11 @@ ZEND_METHOD(Closure, __invoke) /* {{{ */
}
/* }}} */
-static zend_bool zend_valid_closure_binding(
+static bool zend_valid_closure_binding(
zend_closure *closure, zval *newthis, zend_class_entry *scope) /* {{{ */
{
zend_function *func = &closure->func;
- zend_bool is_fake_closure = (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) != 0;
+ bool is_fake_closure = (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) != 0;
if (newthis) {
if (func->common.fn_flags & ZEND_ACC_STATIC) {
zend_error(E_WARNING, "Cannot bind an instance to a static closure");
@@ -128,6 +128,7 @@ ZEND_METHOD(Closure, call)
zend_fcall_info_cache fci_cache;
zend_function my_function;
zend_object *newobj;
+ zend_class_entry *newclass;
fci.param_count = 0;
fci.params = NULL;
@@ -140,26 +141,27 @@ ZEND_METHOD(Closure, call)
closure = (zend_closure *) Z_OBJ_P(ZEND_THIS);
newobj = Z_OBJ_P(newthis);
+ newclass = newobj->ce;
- if (!zend_valid_closure_binding(closure, newthis, Z_OBJCE_P(newthis))) {
+ if (!zend_valid_closure_binding(closure, newthis, newclass)) {
return;
}
if (closure->func.common.fn_flags & ZEND_ACC_GENERATOR) {
zval new_closure;
- zend_create_closure(&new_closure, &closure->func, Z_OBJCE_P(newthis), closure->called_scope, newthis);
+ zend_create_closure(&new_closure, &closure->func, newclass, closure->called_scope, newthis);
closure = (zend_closure *) Z_OBJ(new_closure);
fci_cache.function_handler = &closure->func;
} else {
memcpy(&my_function, &closure->func, closure->func.type == ZEND_USER_FUNCTION ? sizeof(zend_op_array) : sizeof(zend_internal_function));
my_function.common.fn_flags &= ~ZEND_ACC_CLOSURE;
/* use scope of passed object */
- my_function.common.scope = Z_OBJCE_P(newthis);
+ my_function.common.scope = newclass;
fci_cache.function_handler = &my_function;
/* Runtime cache relies on bound scope to be immutable, hence we need a separate rt cache in case scope changed */
if (ZEND_USER_CODE(my_function.type)
- && (closure->func.common.scope != Z_OBJCE_P(newthis)
+ && (closure->func.common.scope != newclass
|| (closure->func.common.fn_flags & ZEND_ACC_HEAP_RT_CACHE))) {
void *ptr;
@@ -172,7 +174,7 @@ ZEND_METHOD(Closure, call)
}
}
- fci_cache.called_scope = newobj->ce;
+ fci_cache.called_scope = newclass;
fci_cache.object = fci.object = newobj;
fci.size = sizeof(fci);
@@ -354,9 +356,9 @@ ZEND_METHOD(Closure, fromCallable)
zval *callable;
char *error = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &callable) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_ZVAL(callable)
+ ZEND_PARSE_PARAMETERS_END();
if (Z_TYPE_P(callable) == IS_OBJECT && instanceof_function(Z_OBJCE_P(callable), zend_ce_closure)) {
/* It's already a closure */
@@ -484,6 +486,10 @@ static void zend_closure_free_storage(zend_object *object) /* {{{ */
zend_object_std_dtor(&closure->std);
if (closure->func.type == ZEND_USER_FUNCTION) {
+ /* We don't own the static variables of fake closures. */
+ if (!(closure->func.op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
+ zend_destroy_static_vars(&closure->func.op_array);
+ }
destroy_op_array(&closure->func.op_array);
}
@@ -518,7 +524,7 @@ static zend_object *zend_closure_clone(zend_object *zobject) /* {{{ */
}
/* }}} */
-int zend_closure_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, zend_bool check_only) /* {{{ */
+int zend_closure_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only) /* {{{ */
{
zend_closure *closure = (zend_closure *)obj;
*fptr_ptr = &closure->func;
@@ -541,7 +547,7 @@ static HashTable *zend_closure_get_debug_info(zend_object *object, int *is_temp)
zval val;
struct _zend_arg_info *arg_info = closure->func.common.arg_info;
HashTable *debug_info;
- zend_bool zstr_args = (closure->func.type == ZEND_USER_FUNCTION) || (closure->func.common.fn_flags & ZEND_ACC_USER_ARG_INFO);
+ bool zstr_args = (closure->func.type == ZEND_USER_FUNCTION) || (closure->func.common.fn_flags & ZEND_ACC_USER_ARG_INFO);
*is_temp = 1;
@@ -613,7 +619,9 @@ static HashTable *zend_closure_get_gc(zend_object *obj, zval **table, int *n) /*
*table = Z_TYPE(closure->this_ptr) != IS_NULL ? &closure->this_ptr : NULL;
*n = Z_TYPE(closure->this_ptr) != IS_NULL ? 1 : 0;
- return (closure->func.type == ZEND_USER_FUNCTION) ?
+ /* Fake closures don't own the static variables they reference. */
+ return (closure->func.type == ZEND_USER_FUNCTION
+ && !(closure->func.op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE)) ?
ZEND_MAP_PTR_GET(closure->func.op_array.static_variables_ptr) : NULL;
}
/* }}} */
@@ -627,11 +635,7 @@ ZEND_COLD ZEND_METHOD(Closure, __construct)
void zend_register_closure_ce(void) /* {{{ */
{
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY(ce, "Closure", class_Closure_methods);
- zend_ce_closure = zend_register_internal_class(&ce);
- zend_ce_closure->ce_flags |= ZEND_ACC_FINAL;
+ zend_ce_closure = register_class_Closure();
zend_ce_closure->create_object = zend_closure_new;
zend_ce_closure->serialize = zend_class_serialize_deny;
zend_ce_closure->unserialize = zend_class_unserialize_deny;
@@ -662,7 +666,7 @@ static ZEND_NAMED_FUNCTION(zend_closure_internal_handler) /* {{{ */
}
/* }}} */
-ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_entry *scope, zend_class_entry *called_scope, zval *this_ptr) /* {{{ */
+static void zend_create_closure_ex(zval *res, zend_function *func, zend_class_entry *scope, zend_class_entry *called_scope, zval *this_ptr, bool is_fake) /* {{{ */
{
zend_closure *closure;
@@ -681,12 +685,15 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent
closure->func.common.fn_flags |= ZEND_ACC_CLOSURE;
closure->func.common.fn_flags &= ~ZEND_ACC_IMMUTABLE;
- if (closure->func.op_array.static_variables) {
- closure->func.op_array.static_variables =
- zend_array_dup(closure->func.op_array.static_variables);
+ /* For fake closures, we want to reuse the static variables of the original function. */
+ if (!is_fake) {
+ if (closure->func.op_array.static_variables) {
+ closure->func.op_array.static_variables =
+ zend_array_dup(closure->func.op_array.static_variables);
+ }
+ ZEND_MAP_PTR_INIT(closure->func.op_array.static_variables_ptr,
+ &closure->func.op_array.static_variables);
}
- ZEND_MAP_PTR_INIT(closure->func.op_array.static_variables_ptr,
- &closure->func.op_array.static_variables);
/* Runtime cache is scope-dependent, so we cannot reuse it if the scope changed */
if (!ZEND_MAP_PTR_GET(closure->func.op_array.run_time_cache)
@@ -756,11 +763,16 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent
}
/* }}} */
+ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_entry *scope, zend_class_entry *called_scope, zval *this_ptr)
+{
+ zend_create_closure_ex(res, func, scope, called_scope, this_ptr, /* is_fake */ false);
+}
+
ZEND_API void zend_create_fake_closure(zval *res, zend_function *func, zend_class_entry *scope, zend_class_entry *called_scope, zval *this_ptr) /* {{{ */
{
zend_closure *closure;
- zend_create_closure(res, func, scope, called_scope, this_ptr);
+ zend_create_closure_ex(res, func, scope, called_scope, this_ptr, /* is_fake */ true);
closure = (zend_closure *)Z_OBJ_P(res);
closure->func.common.fn_flags |= ZEND_ACC_FAKE_CLOSURE;
diff --git a/Zend/zend_closures.stub.php b/Zend/zend_closures.stub.php
index 906dedc5cf..4bd93e241f 100644
--- a/Zend/zend_closures.stub.php
+++ b/Zend/zend_closures.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
final class Closure
{
diff --git a/Zend/zend_closures_arginfo.h b/Zend/zend_closures_arginfo.h
index 1ccde0d6dd..56bd16ffb6 100644
--- a/Zend/zend_closures_arginfo.h
+++ b/Zend/zend_closures_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 0a2dd53716d30893aa5dd92a9907b2298abb3f70 */
+ * Stub hash: 62da9b1e75331f30a0c63e82c9fd366e26b5724d */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Closure___construct, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -40,3 +40,14 @@ static const zend_function_entry class_Closure_methods[] = {
ZEND_ME(Closure, fromCallable, arginfo_class_Closure_fromCallable, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Closure(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Closure", class_Closure_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 19a1c543ab..f7e283d76d 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -32,6 +32,7 @@
#include "zend_language_scanner.h"
#include "zend_inheritance.h"
#include "zend_vm.h"
+#include "zend_enum.h"
#define SET_NODE(target, src) do { \
target ## _type = (src)->op_type; \
@@ -87,7 +88,7 @@ ZEND_API zend_executor_globals executor_globals;
#endif
static zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2);
-static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast);
+static bool zend_try_ct_eval_array(zval *result, zend_ast *ast);
static void init_op(zend_op *op)
{
@@ -145,7 +146,7 @@ static zend_string *zend_build_runtime_definition_key(zend_string *name, uint32_
}
/* }}} */
-static zend_bool zend_get_unqualified_name(const zend_string *name, const char **result, size_t *result_len) /* {{{ */
+static bool zend_get_unqualified_name(const zend_string *name, const char **result, size_t *result_len) /* {{{ */
{
const char *ns_separator = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
if (ns_separator != NULL) {
@@ -180,7 +181,7 @@ static const struct reserved_class_name reserved_class_names[] = {
{NULL, 0}
};
-static zend_bool zend_is_reserved_class_name(const zend_string *name) /* {{{ */
+static bool zend_is_reserved_class_name(const zend_string *name) /* {{{ */
{
const struct reserved_class_name *reserved = reserved_class_names;
@@ -259,7 +260,7 @@ static zend_always_inline zend_uchar zend_lookup_builtin_type_by_name(const zend
}
/* }}} */
-static zend_always_inline zend_bool zend_is_confusable_type(const zend_string *name, const char **correct_name) /* {{{ */
+static zend_always_inline bool zend_is_confusable_type(const zend_string *name, const char **correct_name) /* {{{ */
{
const confusable_type_info *info = confusable_types;
@@ -278,7 +279,7 @@ static zend_always_inline zend_bool zend_is_confusable_type(const zend_string *n
}
/* }}} */
-static zend_bool zend_is_not_imported(zend_string *name) {
+static bool zend_is_not_imported(zend_string *name) {
/* Assuming "name" is unqualified here. */
return !FC(imports) || zend_hash_find_ptr_lc(FC(imports), name) == NULL;
}
@@ -393,18 +394,11 @@ static void zend_register_seen_symbol(zend_string *name, uint32_t kind) {
}
}
-static zend_bool zend_have_seen_symbol(zend_string *name, uint32_t kind) {
+static bool zend_have_seen_symbol(zend_string *name, uint32_t kind) {
zval *zv = zend_hash_find(&FC(seen_symbols), name);
return zv && (Z_LVAL_P(zv) & kind) != 0;
}
-ZEND_API void file_handle_dtor(zend_file_handle *fh) /* {{{ */
-{
-
- zend_file_handle_dtor(fh);
-}
-/* }}} */
-
void init_compiler(void) /* {{{ */
{
CG(arena) = zend_arena_create(64 * 1024);
@@ -412,11 +406,13 @@ void init_compiler(void) /* {{{ */
memset(&CG(context), 0, sizeof(CG(context)));
zend_init_compiler_data_structures();
zend_init_rsrc_list();
- zend_llist_init(&CG(open_files), sizeof(zend_file_handle), (void (*)(void *)) file_handle_dtor, 0);
+ zend_stream_init();
CG(unclean_shutdown) = 0;
CG(delayed_variance_obligations) = NULL;
CG(delayed_autoloads) = NULL;
+ CG(unlinked_uses) = NULL;
+ CG(current_linking_class) = NULL;
}
/* }}} */
@@ -428,7 +424,6 @@ void shutdown_compiler(void) /* {{{ */
zend_stack_destroy(&CG(loop_var_stack));
zend_stack_destroy(&CG(delayed_oplines_stack));
zend_stack_destroy(&CG(short_circuiting_opnums));
- zend_arena_destroy(CG(arena));
if (CG(delayed_variance_obligations)) {
zend_hash_destroy(CG(delayed_variance_obligations));
@@ -440,6 +435,12 @@ void shutdown_compiler(void) /* {{{ */
FREE_HASHTABLE(CG(delayed_autoloads));
CG(delayed_autoloads) = NULL;
}
+ if (CG(unlinked_uses)) {
+ zend_hash_destroy(CG(unlinked_uses));
+ FREE_HASHTABLE(CG(unlinked_uses));
+ CG(unlinked_uses) = NULL;
+ }
+ CG(current_linking_class) = NULL;
}
/* }}} */
@@ -472,7 +473,7 @@ ZEND_API int zend_get_compiled_lineno(void) /* {{{ */
}
/* }}} */
-ZEND_API zend_bool zend_is_compiling(void) /* {{{ */
+ZEND_API bool zend_is_compiling(void) /* {{{ */
{
return CG(in_compilation);
}
@@ -609,7 +610,7 @@ static int zend_add_class_name_literal(zend_string *name) /* {{{ */
}
/* }}} */
-static int zend_add_const_name_literal(zend_string *name, zend_bool unqualified) /* {{{ */
+static int zend_add_const_name_literal(zend_string *name, bool unqualified) /* {{{ */
{
zend_string *tmp_name;
@@ -658,7 +659,7 @@ void zend_stop_lexing(void)
}
static inline void zend_begin_loop(
- zend_uchar free_opcode, const znode *loop_var, zend_bool is_switch) /* {{{ */
+ zend_uchar free_opcode, const znode *loop_var, bool is_switch) /* {{{ */
{
zend_brk_cont_element *brk_cont_element;
int parent = CG(context).current_brk_cont;
@@ -860,8 +861,8 @@ zend_string *zend_prefix_with_ns(zend_string *name) {
}
zend_string *zend_resolve_non_class_name(
- zend_string *name, uint32_t type, zend_bool *is_fully_qualified,
- zend_bool case_sensitive, HashTable *current_import_sub
+ zend_string *name, uint32_t type, bool *is_fully_qualified,
+ bool case_sensitive, HashTable *current_import_sub
) {
char *compound;
*is_fully_qualified = 0;
@@ -917,14 +918,14 @@ zend_string *zend_resolve_non_class_name(
}
/* }}} */
-zend_string *zend_resolve_function_name(zend_string *name, uint32_t type, zend_bool *is_fully_qualified) /* {{{ */
+zend_string *zend_resolve_function_name(zend_string *name, uint32_t type, bool *is_fully_qualified) /* {{{ */
{
return zend_resolve_non_class_name(
name, type, is_fully_qualified, 0, FC(imports_function));
}
/* }}} */
-zend_string *zend_resolve_const_name(zend_string *name, uint32_t type, zend_bool *is_fully_qualified) /* {{{ */ {
+zend_string *zend_resolve_const_name(zend_string *name, uint32_t type, bool *is_fully_qualified) /* {{{ */ {
return zend_resolve_non_class_name(
name, type, is_fully_qualified, 1, FC(imports_const));
}
@@ -934,22 +935,35 @@ zend_string *zend_resolve_class_name(zend_string *name, uint32_t type) /* {{{ */
{
char *compound;
+ if (ZEND_FETCH_CLASS_DEFAULT != zend_get_class_fetch_type(name)) {
+ if (type == ZEND_NAME_FQ) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "'\\%s' is an invalid class name", ZSTR_VAL(name));
+ }
+ if (type == ZEND_NAME_RELATIVE) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "'namespace\\%s' is an invalid class name", ZSTR_VAL(name));
+ }
+ ZEND_ASSERT(type == ZEND_NAME_NOT_FQ);
+ return zend_string_copy(name);
+ }
+
if (type == ZEND_NAME_RELATIVE) {
return zend_prefix_with_ns(name);
}
- if (type == ZEND_NAME_FQ || ZSTR_VAL(name)[0] == '\\') {
- /* Remove \ prefix (only relevant if this is a string rather than a label) */
+ if (type == ZEND_NAME_FQ) {
if (ZSTR_VAL(name)[0] == '\\') {
+ /* Remove \ prefix (only relevant if this is a string rather than a label) */
name = zend_string_init(ZSTR_VAL(name) + 1, ZSTR_LEN(name) - 1, 0);
- } else {
- zend_string_addref(name);
- }
- /* Ensure that \self, \parent and \static are not used */
- if (ZEND_FETCH_CLASS_DEFAULT != zend_get_class_fetch_type(name)) {
- zend_error_noreturn(E_COMPILE_ERROR, "'\\%s' is an invalid class name", ZSTR_VAL(name));
+ if (ZEND_FETCH_CLASS_DEFAULT != zend_get_class_fetch_type(name)) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "'\\%s' is an invalid class name", ZSTR_VAL(name));
+ }
+ return name;
}
- return name;
+
+ return zend_string_copy(name);
}
if (FC(imports)) {
@@ -1001,7 +1015,7 @@ static void str_dtor(zval *zv) /* {{{ */ {
}
/* }}} */
-static zend_bool zend_is_call(zend_ast *ast);
+static bool zend_is_call(zend_ast *ast);
static uint32_t zend_add_try_element(uint32_t try_op) /* {{{ */
{
@@ -1022,28 +1036,27 @@ static uint32_t zend_add_try_element(uint32_t try_op) /* {{{ */
}
/* }}} */
+void zend_init_static_variables_map_ptr(zend_op_array *op_array)
+{
+ if (op_array->static_variables) {
+ ZEND_MAP_PTR_INIT(op_array->static_variables_ptr,
+ zend_arena_alloc(&CG(arena), sizeof(HashTable *)));
+ ZEND_MAP_PTR_SET(op_array->static_variables_ptr, NULL);
+ }
+}
+
ZEND_API void function_add_ref(zend_function *function) /* {{{ */
{
if (function->type == ZEND_USER_FUNCTION) {
zend_op_array *op_array = &function->op_array;
-
if (op_array->refcount) {
(*op_array->refcount)++;
}
- if (op_array->static_variables
- && !(GC_FLAGS(op_array->static_variables) & IS_ARRAY_IMMUTABLE)) {
- GC_ADDREF(op_array->static_variables);
- }
- if (CG(compiler_options) & ZEND_COMPILE_PRELOAD) {
- ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_PRELOADED);
- ZEND_MAP_PTR_NEW(op_array->run_time_cache);
- ZEND_MAP_PTR_NEW(op_array->static_variables_ptr);
- } else {
- ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
- ZEND_MAP_PTR_INIT(op_array->run_time_cache, zend_arena_alloc(&CG(arena), sizeof(void*)));
- ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL);
- }
+ ZEND_MAP_PTR_INIT(op_array->run_time_cache, zend_arena_alloc(&CG(arena), sizeof(void *)));
+ ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL);
+
+ zend_init_static_variables_map_ptr(op_array);
}
if (function->common.function_name) {
@@ -1052,7 +1065,7 @@ ZEND_API void function_add_ref(zend_function *function) /* {{{ */
}
/* }}} */
-static zend_never_inline ZEND_COLD ZEND_NORETURN void do_bind_function_error(zend_string *lcname, zend_op_array *op_array, zend_bool compile_time) /* {{{ */
+static zend_never_inline ZEND_COLD ZEND_NORETURN void do_bind_function_error(zend_string *lcname, zend_op_array *op_array, bool compile_time) /* {{{ */
{
zval *zv = zend_hash_find_ex(compile_time ? CG(function_table) : EG(function_table), lcname, 1);
int error_level = compile_time ? E_COMPILE_ERROR : E_ERROR;
@@ -1072,27 +1085,19 @@ static zend_never_inline ZEND_COLD ZEND_NORETURN void do_bind_function_error(zen
}
}
-ZEND_API zend_result do_bind_function(zval *lcname) /* {{{ */
+ZEND_API zend_result do_bind_function(zend_function *func, zval *lcname) /* {{{ */
{
- zend_function *function;
- zval *rtd_key, *zv;
-
- rtd_key = lcname + 1;
- zv = zend_hash_find_ex(EG(function_table), Z_STR_P(rtd_key), 1);
- if (UNEXPECTED(!zv)) {
- do_bind_function_error(Z_STR_P(lcname), NULL, 0);
+ zend_function *added_func = zend_hash_add_ptr(EG(function_table), Z_STR_P(lcname), func);
+ if (UNEXPECTED(!added_func)) {
+ do_bind_function_error(Z_STR_P(lcname), &func->op_array, 0);
return FAILURE;
}
- function = (zend_function*)Z_PTR_P(zv);
- if (UNEXPECTED(function->common.fn_flags & ZEND_ACC_PRELOADED)
- && !(CG(compiler_options) & ZEND_COMPILE_PRELOAD)) {
- zv = zend_hash_add(EG(function_table), Z_STR_P(lcname), zv);
- } else {
- zv = zend_hash_set_bucket_key(EG(function_table), (Bucket*)zv, Z_STR_P(lcname));
+
+ if (func->op_array.refcount) {
+ ++*func->op_array.refcount;
}
- if (UNEXPECTED(!zv)) {
- do_bind_function_error(Z_STR_P(lcname), &function->op_array, 0);
- return FAILURE;
+ if (func->common.function_name) {
+ zend_string_addref(func->common.function_name);
}
return SUCCESS;
}
@@ -1136,7 +1141,12 @@ ZEND_API zend_result do_bind_class(zval *lcname, zend_string *lc_parent_name) /*
return FAILURE;
}
- if (zend_do_link_class(ce, lc_parent_name) == FAILURE) {
+ if (ce->ce_flags & ZEND_ACC_LINKED) {
+ return SUCCESS;
+ }
+
+ ce = zend_do_link_class(ce, lc_parent_name, Z_STR_P(lcname));
+ if (!ce) {
/* Reload bucket pointer, the hash table may have been reallocated */
zv = zend_hash_find(EG(class_table), Z_STR_P(lcname));
zend_hash_set_bucket_key(EG(class_table), (Bucket *) zv, Z_STR_P(rtd_key));
@@ -1187,13 +1197,34 @@ zend_string *zend_type_to_string_resolved(zend_type type, zend_class_entry *scop
if (ZEND_TYPE_HAS_CE(*list_type)) {
str = add_type_string(str, ZEND_TYPE_CE(*list_type)->name);
} else {
- zend_string *resolved = resolve_class_name(ZEND_TYPE_NAME(*list_type), scope);
- str = add_type_string(str, resolved);
- zend_string_release(resolved);
+ if (ZEND_TYPE_HAS_CE_CACHE(*list_type)
+ && ZEND_TYPE_CE_CACHE(*list_type)) {
+ zend_class_entry *ce = ZEND_TYPE_CE_CACHE(*list_type);
+ if (ce->ce_flags & ZEND_ACC_ANON_CLASS) {
+ zend_string *tmp = zend_string_init(ZSTR_VAL(ce->name), strlen(ZSTR_VAL(ce->name)), 0);
+ str = add_type_string(str, tmp);
+ } else {
+ str = add_type_string(str, ce->name);
+ }
+ } else {
+ zend_string *resolved = resolve_class_name(ZEND_TYPE_NAME(*list_type), scope);
+ str = add_type_string(str, resolved);
+ zend_string_release(resolved);
+ }
}
} ZEND_TYPE_LIST_FOREACH_END();
} else if (ZEND_TYPE_HAS_NAME(type)) {
- str = resolve_class_name(ZEND_TYPE_NAME(type), scope);
+ if (ZEND_TYPE_HAS_CE_CACHE(type)
+ && ZEND_TYPE_CE_CACHE(type)) {
+ zend_class_entry *ce = ZEND_TYPE_CE_CACHE(type);
+ if (ce->ce_flags & ZEND_ACC_ANON_CLASS) {
+ str = zend_string_init(ZSTR_VAL(ce->name), strlen(ZSTR_VAL(ce->name)), 0);
+ } else {
+ str = zend_string_copy(ce->name);
+ }
+ } else {
+ str = resolve_class_name(ZEND_TYPE_NAME(type), scope);
+ }
} else if (ZEND_TYPE_HAS_CE(type)) {
str = zend_string_copy(ZEND_TYPE_CE(type)->name);
}
@@ -1246,7 +1277,7 @@ zend_string *zend_type_to_string_resolved(zend_type type, zend_class_entry *scop
}
if (type_mask & MAY_BE_NULL) {
- zend_bool is_union = !str || memchr(ZSTR_VAL(str), '|', ZSTR_LEN(str)) != NULL;
+ bool is_union = !str || memchr(ZSTR_VAL(str), '|', ZSTR_LEN(str)) != NULL;
if (!is_union) {
zend_string *nullable_str = zend_string_concat2("?", 1, ZSTR_VAL(str), ZSTR_LEN(str));
zend_string_release(str);
@@ -1262,7 +1293,7 @@ ZEND_API zend_string *zend_type_to_string(zend_type type) {
return zend_type_to_string_resolved(type, NULL);
}
-static zend_bool is_generator_compatible_class_type(zend_string *name) {
+static bool is_generator_compatible_class_type(zend_string *name) {
return zend_string_equals_literal_ci(name, "Traversable")
|| zend_string_equals_literal_ci(name, "Iterator")
|| zend_string_equals_literal_ci(name, "Generator");
@@ -1277,7 +1308,7 @@ static void zend_mark_function_as_generator() /* {{{ */
if (CG(active_op_array)->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
zend_type return_type = CG(active_op_array)->arg_info[-1].type;
- zend_bool valid_type = (ZEND_TYPE_FULL_MASK(return_type) & (MAY_BE_ITERABLE | MAY_BE_OBJECT)) != 0;
+ bool valid_type = (ZEND_TYPE_FULL_MASK(return_type) & (MAY_BE_ITERABLE | MAY_BE_OBJECT)) != 0;
if (!valid_type) {
zend_type *single_type;
ZEND_TYPE_FOREACH(return_type, single_type) {
@@ -1326,7 +1357,7 @@ ZEND_API uint32_t zend_build_delayed_early_binding_list(const zend_op_array *op_
ZEND_API void zend_do_delayed_early_binding(zend_op_array *op_array, uint32_t first_early_binding_opline) /* {{{ */
{
if (first_early_binding_opline != (uint32_t)-1) {
- zend_bool orig_in_compilation = CG(in_compilation);
+ bool orig_in_compilation = CG(in_compilation);
uint32_t opline_num = first_early_binding_opline;
void **run_time_cache;
@@ -1354,7 +1385,8 @@ ZEND_API void zend_do_delayed_early_binding(zend_op_array *op_array, uint32_t fi
zend_class_entry *parent_ce = zend_hash_find_ex_ptr(EG(class_table), lc_parent_name, 1);
if (parent_ce) {
- if (zend_try_early_bind(ce, parent_ce, Z_STR_P(lcname), zv)) {
+ ce = zend_try_early_bind(ce, parent_ce, Z_STR_P(lcname), zv);
+ if (ce) {
/* Store in run-time cache */
((void**)((char*)run_time_cache + opline->extended_value))[0] = ce;
}
@@ -1433,7 +1465,7 @@ ZEND_API zend_result zend_unmangle_property_name_ex(const zend_string *name, con
}
/* }}} */
-static zend_bool can_ct_eval_const(zend_constant *c) {
+static bool can_ct_eval_const(zend_constant *c) {
if (ZEND_CONSTANT_FLAGS(c) & CONST_DEPRECATED) {
return 0;
}
@@ -1450,7 +1482,7 @@ static zend_bool can_ct_eval_const(zend_constant *c) {
return 0;
}
-static zend_bool zend_try_ct_eval_const(zval *zv, zend_string *name, zend_bool is_fully_qualified) /* {{{ */
+static bool zend_try_ct_eval_const(zval *zv, zend_string *name, bool is_fully_qualified) /* {{{ */
{
zend_constant *c = zend_hash_find_ptr(EG(zend_constants), name);
if (c && can_ct_eval_const(c)) {
@@ -1477,8 +1509,13 @@ static zend_bool zend_try_ct_eval_const(zval *zv, zend_string *name, zend_bool i
}
/* }}} */
-static inline zend_bool zend_is_scope_known() /* {{{ */
+static inline bool zend_is_scope_known() /* {{{ */
{
+ if (!CG(active_op_array)) {
+ /* This can only happen when evaluating a default value string. */
+ return 0;
+ }
+
if (CG(active_op_array)->fn_flags & ZEND_ACC_CLOSURE) {
/* Closures can be rebound to a different scope */
return 0;
@@ -1495,7 +1532,7 @@ static inline zend_bool zend_is_scope_known() /* {{{ */
}
/* }}} */
-static inline zend_bool class_name_refers_to_active_ce(zend_string *class_name, uint32_t fetch_type) /* {{{ */
+static inline bool class_name_refers_to_active_ce(zend_string *class_name, uint32_t fetch_type) /* {{{ */
{
if (!CG(active_class_entry)) {
return 0;
@@ -1560,7 +1597,7 @@ static void zend_ensure_valid_class_fetch_type(uint32_t fetch_type) /* {{{ */
}
/* }}} */
-static zend_bool zend_try_compile_const_expr_resolve_class_name(zval *zv, zend_ast *class_ast) /* {{{ */
+static bool zend_try_compile_const_expr_resolve_class_name(zval *zv, zend_ast *class_ast) /* {{{ */
{
uint32_t fetch_type;
zval *class_name;
@@ -1603,7 +1640,7 @@ static zend_bool zend_try_compile_const_expr_resolve_class_name(zval *zv, zend_a
/* }}} */
/* We don't use zend_verify_const_access because we need to deal with unlinked classes. */
-static zend_bool zend_verify_ct_const_access(zend_class_constant *c, zend_class_entry *scope)
+static bool zend_verify_ct_const_access(zend_class_constant *c, zend_class_entry *scope)
{
if (Z_ACCESS_FLAGS(c->value) & ZEND_ACC_PUBLIC) {
return 1;
@@ -1632,7 +1669,7 @@ static zend_bool zend_verify_ct_const_access(zend_class_constant *c, zend_class_
}
}
-static zend_bool zend_try_ct_eval_class_const(zval *zv, zend_string *class_name, zend_string *name) /* {{{ */
+static bool zend_try_ct_eval_class_const(zval *zv, zend_string *class_name, zend_string *name) /* {{{ */
{
uint32_t fetch_type = zend_get_class_fetch_type(class_name);
zend_class_constant *cc;
@@ -1733,7 +1770,7 @@ void zend_do_extended_fcall_end(void) /* {{{ */
}
/* }}} */
-zend_bool zend_is_auto_global_str(const char *name, size_t len) /* {{{ */ {
+bool zend_is_auto_global_str(const char *name, size_t len) /* {{{ */ {
zend_auto_global *auto_global;
if ((auto_global = zend_hash_str_find_ptr(CG(auto_globals), name, len)) != NULL) {
@@ -1746,7 +1783,7 @@ zend_bool zend_is_auto_global_str(const char *name, size_t len) /* {{{ */ {
}
/* }}} */
-zend_bool zend_is_auto_global(zend_string *name) /* {{{ */
+bool zend_is_auto_global(zend_string *name) /* {{{ */
{
zend_auto_global *auto_global;
@@ -1760,7 +1797,7 @@ zend_bool zend_is_auto_global(zend_string *name) /* {{{ */
}
/* }}} */
-zend_result zend_register_auto_global(zend_string *name, zend_bool jit, zend_auto_global_callback auto_global_callback) /* {{{ */
+zend_result zend_register_auto_global(zend_string *name, bool jit, zend_auto_global_callback auto_global_callback) /* {{{ */
{
zend_auto_global auto_global;
zend_result retval;
@@ -1808,9 +1845,9 @@ int ZEND_FASTCALL zendlex(zend_parser_stack_elem *elem) /* {{{ */
}
/* }}} */
-ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify_handlers) /* {{{ */
+ZEND_API void zend_initialize_class_data(zend_class_entry *ce, bool nullify_handlers) /* {{{ */
{
- zend_bool persistent_hashes = ce->type == ZEND_INTERNAL_CLASS;
+ bool persistent_hashes = ce->type == ZEND_INTERNAL_CLASS;
ce->refcount = 1;
ce->ce_flags = ZEND_ACC_CONSTANTS_UPDATED;
@@ -1831,11 +1868,14 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify
ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
ce->info.user.doc_comment = NULL;
}
+ ZEND_MAP_PTR_INIT(ce->mutable_data, NULL);
ce->default_properties_count = 0;
ce->default_static_members_count = 0;
ce->properties_info_table = NULL;
ce->attributes = NULL;
+ ce->enum_backing_type = IS_UNDEF;
+ ce->backed_enum_table = NULL;
if (nullify_handlers) {
ce->constructor = NULL;
@@ -2243,7 +2283,7 @@ static zend_op *zend_delayed_compile_end(uint32_t offset) /* {{{ */
}
/* }}} */
-static zend_bool zend_ast_kind_is_short_circuited(zend_ast_kind ast_kind)
+static bool zend_ast_kind_is_short_circuited(zend_ast_kind ast_kind)
{
switch (ast_kind) {
case ZEND_AST_DIM:
@@ -2259,7 +2299,7 @@ static zend_bool zend_ast_kind_is_short_circuited(zend_ast_kind ast_kind)
}
}
-static zend_bool zend_ast_is_short_circuited(const zend_ast *ast)
+static bool zend_ast_is_short_circuited(const zend_ast *ast)
{
switch (ast->kind) {
case ZEND_AST_DIM:
@@ -2295,7 +2335,7 @@ static uint32_t zend_short_circuiting_checkpoint()
static void zend_short_circuiting_commit(uint32_t checkpoint, znode *result, zend_ast *ast)
{
- zend_bool is_short_circuited = zend_ast_kind_is_short_circuited(ast->kind)
+ bool is_short_circuited = zend_ast_kind_is_short_circuited(ast->kind)
|| ast->kind == ZEND_AST_ISSET || ast->kind == ZEND_AST_EMPTY;
if (!is_short_circuited) {
ZEND_ASSERT(zend_stack_count(&CG(short_circuiting_opnums)) == checkpoint
@@ -2382,7 +2422,7 @@ static size_t zend_type_get_num_classes(zend_type type) {
}
static void zend_emit_return_type_check(
- znode *expr, zend_arg_info *return_info, zend_bool implicit) /* {{{ */
+ znode *expr, zend_arg_info *return_info, bool implicit) /* {{{ */
{
zend_type type = return_info->type;
if (ZEND_TYPE_IS_SET(type)) {
@@ -2439,7 +2479,7 @@ void zend_emit_final_return(bool return_one) /* {{{ */
{
znode zn;
zend_op *ret;
- zend_bool returns_reference = (CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
+ bool returns_reference = (CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
if ((CG(active_op_array)->fn_flags & ZEND_ACC_HAS_RETURN_TYPE)
&& !(CG(active_op_array)->fn_flags & ZEND_ACC_GENERATOR)) {
@@ -2458,7 +2498,7 @@ void zend_emit_final_return(bool return_one) /* {{{ */
}
/* }}} */
-static inline zend_bool zend_is_variable(zend_ast *ast) /* {{{ */
+static inline bool zend_is_variable(zend_ast *ast) /* {{{ */
{
return ast->kind == ZEND_AST_VAR
|| ast->kind == ZEND_AST_DIM
@@ -2468,7 +2508,7 @@ static inline zend_bool zend_is_variable(zend_ast *ast) /* {{{ */
}
/* }}} */
-static inline zend_bool zend_is_call(zend_ast *ast) /* {{{ */
+static inline bool zend_is_call(zend_ast *ast) /* {{{ */
{
return ast->kind == ZEND_AST_CALL
|| ast->kind == ZEND_AST_METHOD_CALL
@@ -2477,13 +2517,13 @@ static inline zend_bool zend_is_call(zend_ast *ast) /* {{{ */
}
/* }}} */
-static inline zend_bool zend_is_variable_or_call(zend_ast *ast) /* {{{ */
+static inline bool zend_is_variable_or_call(zend_ast *ast) /* {{{ */
{
return zend_is_variable(ast) || zend_is_call(ast);
}
/* }}} */
-static inline zend_bool zend_is_unticked_stmt(zend_ast *ast) /* {{{ */
+static inline bool zend_is_unticked_stmt(zend_ast *ast) /* {{{ */
{
return ast->kind == ZEND_AST_STMT_LIST || ast->kind == ZEND_AST_LABEL
|| ast->kind == ZEND_AST_PROP_DECL || ast->kind == ZEND_AST_CLASS_CONST_GROUP
@@ -2491,7 +2531,7 @@ static inline zend_bool zend_is_unticked_stmt(zend_ast *ast) /* {{{ */
}
/* }}} */
-static inline zend_bool zend_can_write_to_variable(zend_ast *ast) /* {{{ */
+static inline bool zend_can_write_to_variable(zend_ast *ast) /* {{{ */
{
while (
ast->kind == ZEND_AST_DIM
@@ -2504,7 +2544,7 @@ static inline zend_bool zend_can_write_to_variable(zend_ast *ast) /* {{{ */
}
/* }}} */
-static inline zend_bool zend_is_const_default_class_ref(zend_ast *name_ast) /* {{{ */
+static inline bool zend_is_const_default_class_ref(zend_ast *name_ast) /* {{{ */
{
if (name_ast->kind != ZEND_AST_ZVAL) {
return 0;
@@ -2674,7 +2714,7 @@ static zend_op *zend_compile_simple_var_no_cv(znode *result, zend_ast *ast, uint
}
/* }}} */
-static zend_bool is_this_fetch(zend_ast *ast) /* {{{ */
+static bool is_this_fetch(zend_ast *ast) /* {{{ */
{
if (ast->kind == ZEND_AST_VAR && ast->child[0]->kind == ZEND_AST_ZVAL) {
zval *name = zend_ast_get_zval(ast->child[0]);
@@ -2685,7 +2725,22 @@ static zend_bool is_this_fetch(zend_ast *ast) /* {{{ */
}
/* }}} */
-static zend_bool this_guaranteed_exists() /* {{{ */
+static bool is_globals_fetch(const zend_ast *ast)
+{
+ if (ast->kind == ZEND_AST_VAR && ast->child[0]->kind == ZEND_AST_ZVAL) {
+ zval *name = zend_ast_get_zval(ast->child[0]);
+ return Z_TYPE_P(name) == IS_STRING && zend_string_equals_literal(Z_STR_P(name), "GLOBALS");
+ }
+
+ return 0;
+}
+
+static bool is_global_var_fetch(zend_ast *ast)
+{
+ return ast->kind == ZEND_AST_DIM && is_globals_fetch(ast->child[0]);
+}
+
+static bool this_guaranteed_exists() /* {{{ */
{
zend_op_array *op_array = CG(active_op_array);
/* Instance methods always have a $this.
@@ -2705,6 +2760,13 @@ static zend_op *zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t t
}
CG(active_op_array)->fn_flags |= ZEND_ACC_USES_THIS;
return opline;
+ } else if (is_globals_fetch(ast)) {
+ zend_op *opline = zend_emit_op(result, ZEND_FETCH_GLOBALS, NULL, NULL);
+ if (type == BP_VAR_R || type == BP_VAR_IS) {
+ opline->result_type = IS_TMP_VAR;
+ result->op_type = IS_TMP_VAR;
+ }
+ return opline;
} else if (zend_try_compile_cv(result, ast) == FAILURE) {
return zend_compile_simple_var_no_cv(result, ast, type, delayed);
}
@@ -2726,7 +2788,7 @@ static void zend_separate_if_call_and_write(znode *node, zend_ast *ast, uint32_t
}
/* }}} */
-zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref);
+zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, bool by_ref);
void zend_compile_assign(znode *result, zend_ast *ast);
static inline void zend_emit_assign_znode(zend_ast *var_ast, znode *value_node) /* {{{ */
@@ -2750,10 +2812,26 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t
znode var_node, dim_node;
- zend_short_circuiting_mark_inner(var_ast);
- opline = zend_delayed_compile_var(&var_node, var_ast, type, 0);
- if (opline && type == BP_VAR_W && (opline->opcode == ZEND_FETCH_STATIC_PROP_W || opline->opcode == ZEND_FETCH_OBJ_W)) {
- opline->extended_value |= ZEND_FETCH_DIM_WRITE;
+ if (is_globals_fetch(var_ast)) {
+ if (dim_ast == NULL) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Cannot append to $GLOBALS");
+ }
+
+ zend_compile_expr(&dim_node, dim_ast);
+ if (dim_node.op_type == IS_CONST) {
+ convert_to_string(&dim_node.u.constant);
+ }
+
+ opline = zend_delayed_emit_op(result, ZEND_FETCH_R, &dim_node, NULL);
+ opline->extended_value = ZEND_FETCH_GLOBAL;
+ zend_adjust_for_fetch_type(opline, result, type);
+ return opline;
+ } else {
+ zend_short_circuiting_mark_inner(var_ast);
+ opline = zend_delayed_compile_var(&var_node, var_ast, type, 0);
+ if (opline && type == BP_VAR_W && (opline->opcode == ZEND_FETCH_STATIC_PROP_W || opline->opcode == ZEND_FETCH_OBJ_W)) {
+ opline->extended_value |= ZEND_FETCH_DIM_WRITE;
+ }
}
zend_separate_if_call_and_write(&var_node, var_ast, type);
@@ -2795,7 +2873,7 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t
znode obj_node, prop_node;
zend_op *opline;
- zend_bool nullsafe = ast->kind == ZEND_AST_NULLSAFE_PROP;
+ bool nullsafe = ast->kind == ZEND_AST_NULLSAFE_PROP;
if (is_this_fetch(obj_ast)) {
if (this_guaranteed_exists()) {
@@ -2812,7 +2890,7 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t
opline = zend_delayed_compile_var(&obj_node, obj_ast, type, 0);
zend_separate_if_call_and_write(&obj_node, obj_ast, type);
if (nullsafe) {
- /* We will push to the short_cirtcuiting_opnums stack in zend_delayed_compile_end(). */
+ /* We will push to the short_circuiting_opnums stack in zend_delayed_compile_end(). */
opline = zend_delayed_emit_op(NULL, ZEND_JMP_NULL, &obj_node, NULL);
if (opline->op1_type == IS_CONST) {
Z_TRY_ADDREF_P(CT_CONSTANT(opline->op1));
@@ -2904,9 +2982,9 @@ static void zend_verify_list_assign_target(zend_ast *var_ast, zend_ast_attr arra
static inline void zend_emit_assign_ref_znode(zend_ast *var_ast, znode *value_node);
/* Propagate refs used on leaf elements to the surrounding list() structures. */
-static zend_bool zend_propagate_list_refs(zend_ast *ast) { /* {{{ */
+static bool zend_propagate_list_refs(zend_ast *ast) { /* {{{ */
zend_ast_list *list = zend_ast_get_list(ast);
- zend_bool has_refs = 0;
+ bool has_refs = 0;
uint32_t i;
for (i = 0; i < list->children; ++i) {
@@ -2925,14 +3003,23 @@ static zend_bool zend_propagate_list_refs(zend_ast *ast) { /* {{{ */
}
/* }}} */
+static bool list_is_keyed(zend_ast_list *list)
+{
+ for (uint32_t i = 0; i < list->children; i++) {
+ if (list->child[i]) {
+ return list->child[i]->child[1] != NULL;
+ }
+ }
+ return false;
+}
+
static void zend_compile_list_assign(
znode *result, zend_ast *ast, znode *expr_node, zend_ast_attr array_style) /* {{{ */
{
zend_ast_list *list = zend_ast_get_list(ast);
uint32_t i;
- zend_bool has_elems = 0;
- zend_bool is_keyed =
- list->children > 0 && list->child[0] != NULL && list->child[0]->child[1] != NULL;
+ bool has_elems = 0;
+ bool is_keyed = list_is_keyed(list);
if (list->children && expr_node->op_type == IS_CONST && Z_TYPE(expr_node->u.constant) == IS_STRING) {
zval_make_interned_string(&expr_node->u.constant);
@@ -3031,11 +3118,15 @@ static void zend_ensure_writable_variable(const zend_ast *ast) /* {{{ */
if (zend_ast_is_short_circuited(ast)) {
zend_error_noreturn(E_COMPILE_ERROR, "Can't use nullsafe operator in write context");
}
+ if (is_globals_fetch(ast)) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "$GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax");
+ }
}
/* }}} */
/* Detects $a... = $a pattern */
-zend_bool zend_is_assign_to_self(zend_ast *var_ast, zend_ast *expr_ast) /* {{{ */
+bool zend_is_assign_to_self(zend_ast *var_ast, zend_ast *expr_ast) /* {{{ */
{
if (expr_ast->kind != ZEND_AST_VAR || expr_ast->child[0]->kind != ZEND_AST_ZVAL) {
return 0;
@@ -3052,7 +3143,7 @@ zend_bool zend_is_assign_to_self(zend_ast *var_ast, zend_ast *expr_ast) /* {{{ *
{
zend_string *name1 = zval_get_string(zend_ast_get_zval(var_ast->child[0]));
zend_string *name2 = zval_get_string(zend_ast_get_zval(expr_ast->child[0]));
- zend_bool result = zend_string_equals(name1, name2);
+ bool result = zend_string_equals(name1, name2);
zend_string_release_ex(name1, 0);
zend_string_release_ex(name2, 0);
return result;
@@ -3074,7 +3165,9 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
zend_ensure_writable_variable(var_ast);
- switch (var_ast->kind) {
+ /* Treat $GLOBALS['x'] assignment like assignment to variable. */
+ zend_ast_kind kind = is_global_var_fetch(var_ast) ? ZEND_AST_VAR : var_ast->kind;
+ switch (kind) {
case ZEND_AST_VAR:
offset = zend_delayed_compile_begin();
zend_delayed_compile_var(&var_node, var_ast, BP_VAR_W, 0);
@@ -3182,6 +3275,9 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */
if (zend_ast_is_short_circuited(source_ast)) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot take reference of a nullsafe chain");
}
+ if (is_globals_fetch(source_ast)) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Cannot acquire reference to $GLOBALS");
+ }
offset = zend_delayed_compile_begin();
zend_delayed_compile_var(&target_node, target_ast, BP_VAR_W, 1);
@@ -3251,7 +3347,9 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */
zend_ensure_writable_variable(var_ast);
- switch (var_ast->kind) {
+ /* Treat $GLOBALS['x'] assignment like assignment to variable. */
+ zend_ast_kind kind = is_global_var_fetch(var_ast) ? ZEND_AST_VAR : var_ast->kind;
+ switch (kind) {
case ZEND_AST_VAR:
offset = zend_delayed_compile_begin();
zend_delayed_compile_var(&var_node, var_ast, BP_VAR_RW, 0);
@@ -3337,14 +3435,14 @@ uint32_t zend_compile_args(
{
zend_ast_list *args = zend_ast_get_list(ast);
uint32_t i;
- zend_bool uses_arg_unpack = 0;
+ bool uses_arg_unpack = 0;
uint32_t arg_count = 0; /* number of arguments not including unpacks */
/* Whether named arguments are used syntactically, to enforce language level limitations.
* May not actually use named argument passing. */
- zend_bool uses_named_args = 0;
+ bool uses_named_args = 0;
/* Whether there may be any undef arguments due to the use of named arguments. */
- zend_bool may_have_undef = 0;
+ bool may_have_undef = 0;
/* Whether there may be any extra named arguments collected into a variadic. */
*may_have_extra_named_args = 0;
@@ -3421,7 +3519,9 @@ uint32_t zend_compile_args(
arg_count++;
}
- if (zend_is_call(arg)) {
+ /* Treat passing of $GLOBALS the same as passing a call.
+ * This will error at runtime if the argument is by-ref. */
+ if (zend_is_call(arg) || is_globals_fetch(arg)) {
zend_compile_var(&arg_node, arg, BP_VAR_R, 0);
if (arg_node.op_type & (IS_CONST|IS_TMP_VAR)) {
/* Function call was converted into builtin instruction */
@@ -3586,10 +3686,10 @@ void zend_compile_call_common(znode *result, zend_ast *args_ast, zend_function *
}
/* }}} */
-zend_bool zend_compile_function_name(znode *name_node, zend_ast *name_ast) /* {{{ */
+bool zend_compile_function_name(znode *name_node, zend_ast *name_ast) /* {{{ */
{
zend_string *orig_name = zend_ast_get_str(name_ast);
- zend_bool is_fully_qualified;
+ bool is_fully_qualified;
name_node->op_type = IS_CONST;
ZVAL_STR(&name_node->u.constant, zend_resolve_function_name(
@@ -3646,7 +3746,7 @@ void zend_compile_dynamic_call(znode *result, znode *name_node, zend_ast *args_a
}
/* }}} */
-static inline zend_bool zend_args_contain_unpack_or_named(zend_ast_list *args) /* {{{ */
+static inline bool zend_args_contain_unpack_or_named(zend_ast_list *args) /* {{{ */
{
uint32_t i;
for (i = 0; i < args->children; ++i) {
@@ -3802,7 +3902,7 @@ zend_result zend_compile_func_ord(znode *result, zend_ast_list *args) /* {{{ */
/* We can only calculate the stack size for functions that have been fully compiled, otherwise
* additional CV or TMP slots may still be added. This prevents the use of INIT_FCALL for
* directly or indirectly recursive function calls. */
-static zend_bool fbc_is_finalized(zend_function *fbc) {
+static bool fbc_is_finalized(zend_function *fbc) {
return !ZEND_USER_CODE(fbc->type) || (fbc->common.fn_flags & ZEND_ACC_DONE_PASS_TWO);
}
@@ -3874,7 +3974,7 @@ zend_result zend_compile_func_cufa(znode *result, zend_ast_list *args, zend_stri
&& args->child[1]->child[1]->kind == ZEND_AST_ARG_LIST) {
zend_string *orig_name = zend_ast_get_str(args->child[1]->child[0]);
zend_ast_list *list = zend_ast_get_list(args->child[1]->child[1]);
- zend_bool is_fully_qualified;
+ bool is_fully_qualified;
zend_string *name = zend_resolve_function_name(orig_name, args->child[1]->child[0]->attr, &is_fully_qualified);
if (zend_string_equals_literal_ci(name, "array_slice")
@@ -3988,7 +4088,7 @@ static void zend_compile_assert(znode *result, zend_ast_list *args, zend_string
static zend_result zend_compile_func_in_array(znode *result, zend_ast_list *args) /* {{{ */
{
- zend_bool strict = 0;
+ bool strict = 0;
znode array, needly;
zend_op *opline;
@@ -3998,7 +4098,7 @@ static zend_result zend_compile_func_in_array(znode *result, zend_ast_list *args
} else if (args->child[2]->kind == ZEND_AST_CONST) {
zval value;
zend_ast *name_ast = args->child[2]->child[0];
- zend_bool is_fully_qualified;
+ bool is_fully_qualified;
zend_string *resolved_name = zend_resolve_const_name(
zend_ast_get_str(name_ast), name_ast->attr, &is_fully_qualified);
@@ -4023,7 +4123,7 @@ static zend_result zend_compile_func_in_array(znode *result, zend_ast_list *args
}
if (zend_hash_num_elements(Z_ARRVAL(array.u.constant)) > 0) {
- zend_bool ok = 1;
+ bool ok = 1;
zval *val, tmp;
HashTable *src = Z_ARRVAL(array.u.constant);
HashTable *dst = zend_new_array(zend_hash_num_elements(src));
@@ -4180,7 +4280,7 @@ zend_result zend_compile_func_array_slice(znode *result, zend_ast_list *args) /*
&& args->child[1]->kind == ZEND_AST_ZVAL) {
zend_string *orig_name = zend_ast_get_str(args->child[0]->child[0]);
- zend_bool is_fully_qualified;
+ bool is_fully_qualified;
zend_string *name = zend_resolve_function_name(orig_name, args->child[0]->child[0]->attr, &is_fully_qualified);
zend_ast_list *list = zend_ast_get_list(args->child[0]->child[1]);
zval *zv = zend_ast_get_zval(args->child[1]);
@@ -4302,7 +4402,7 @@ void zend_compile_call(znode *result, zend_ast *ast, uint32_t type) /* {{{ */
}
{
- zend_bool runtime_resolution = zend_compile_function_name(&name_node, name_ast);
+ bool runtime_resolution = zend_compile_function_name(&name_node, name_ast);
if (runtime_resolution) {
if (zend_string_equals_literal_ci(zend_ast_get_str(name_ast), "assert")) {
zend_compile_assert(result, zend_ast_get_list(args_ast), Z_STR(name_node.u.constant), NULL);
@@ -4368,7 +4468,7 @@ void zend_compile_method_call(znode *result, zend_ast *ast, uint32_t type) /* {{
znode obj_node, method_node;
zend_op *opline;
zend_function *fbc = NULL;
- zend_bool nullsafe = ast->kind == ZEND_AST_NULLSAFE_METHOD_CALL;
+ bool nullsafe = ast->kind == ZEND_AST_NULLSAFE_METHOD_CALL;
if (is_this_fetch(obj_ast)) {
if (this_guaranteed_exists()) {
@@ -4421,7 +4521,7 @@ void zend_compile_method_call(znode *result, zend_ast *ast, uint32_t type) /* {{
}
/* }}} */
-static zend_bool zend_is_constructor(zend_string *name) /* {{{ */
+static bool zend_is_constructor(zend_string *name) /* {{{ */
{
return zend_string_equals_literal_ci(name, ZEND_CONSTRUCTOR_FUNC_NAME);
}
@@ -4513,7 +4613,7 @@ void zend_compile_static_call(znode *result, zend_ast *ast, uint32_t type) /* {{
}
/* }}} */
-void zend_compile_class_decl(znode *result, zend_ast *ast, zend_bool toplevel);
+void zend_compile_class_decl(znode *result, zend_ast *ast, bool toplevel);
void zend_compile_new(znode *result, zend_ast *ast) /* {{{ */
{
@@ -4569,6 +4669,7 @@ void zend_compile_global_var(zend_ast *ast) /* {{{ */
convert_to_string(&name_node.u.constant);
}
+ // TODO(GLOBALS) Forbid "global $GLOBALS"?
if (is_this_fetch(var_ast)) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot use $this as global variable");
} else if (zend_try_compile_cv(&result, var_ast) == SUCCESS) {
@@ -4640,6 +4741,21 @@ void zend_compile_unset(zend_ast *ast) /* {{{ */
zend_ensure_writable_variable(var_ast);
+ if (is_global_var_fetch(var_ast)) {
+ if (!var_ast->child[1]) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for unsetting");
+ }
+
+ zend_compile_expr(&var_node, var_ast->child[1]);
+ if (var_node.op_type == IS_CONST) {
+ convert_to_string(&var_node.u.constant);
+ }
+
+ opline = zend_emit_op(NULL, ZEND_UNSET_VAR, &var_node, NULL);
+ opline->extended_value = ZEND_FETCH_GLOBAL;
+ return;
+ }
+
switch (var_ast->kind) {
case ZEND_AST_VAR:
if (is_this_fetch(var_ast)) {
@@ -4759,8 +4875,8 @@ static bool zend_has_finally(void) /* {{{ */
void zend_compile_return(zend_ast *ast) /* {{{ */
{
zend_ast *expr_ast = ast->child[0];
- zend_bool is_generator = (CG(active_op_array)->fn_flags & ZEND_ACC_GENERATOR) != 0;
- zend_bool by_ref = (CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
+ bool is_generator = (CG(active_op_array)->fn_flags & ZEND_ACC_GENERATOR) != 0;
+ bool by_ref = (CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
znode expr_node;
zend_op *opline;
@@ -5127,8 +5243,8 @@ void zend_compile_foreach(zend_ast *ast) /* {{{ */
zend_ast *value_ast = ast->child[1];
zend_ast *key_ast = ast->child[2];
zend_ast *stmt_ast = ast->child[3];
- zend_bool by_ref = value_ast->kind == ZEND_AST_REF;
- zend_bool is_variable = zend_is_variable(expr_ast) && zend_can_write_to_variable(expr_ast);
+ bool by_ref = value_ast->kind == ZEND_AST_REF;
+ bool is_variable = zend_is_variable(expr_ast) && zend_can_write_to_variable(expr_ast);
znode expr_node, reset_node, value_node, key_node;
zend_op *opline;
@@ -5297,7 +5413,7 @@ static zend_uchar determine_switch_jumptable_type(zend_ast_list *cases) {
return common_type;
}
-static zend_bool should_use_jumptable(zend_ast_list *cases, zend_uchar jumptable_type) {
+static bool should_use_jumptable(zend_ast_list *cases, zend_uchar jumptable_type) {
if (CG(compiler_options) & ZEND_COMPILE_NO_JUMPTABLES) {
return 0;
}
@@ -5318,7 +5434,7 @@ void zend_compile_switch(zend_ast *ast) /* {{{ */
zend_ast_list *cases = zend_ast_get_list(ast->child[1]);
uint32_t i;
- zend_bool has_default_case = 0;
+ bool has_default_case = 0;
znode expr_node, case_node;
zend_op *opline;
@@ -5463,7 +5579,7 @@ static uint32_t count_match_conds(zend_ast_list *arms)
return num_conds;
}
-static zend_bool can_match_use_jumptable(zend_ast_list *arms) {
+static bool can_match_use_jumptable(zend_ast_list *arms) {
for (uint32_t i = 0; i < arms->children; i++) {
zend_ast *arm_ast = arms->child[i];
if (!arm_ast->child[0]) {
@@ -5494,7 +5610,7 @@ void zend_compile_match(znode *result, zend_ast *ast)
{
zend_ast *expr_ast = ast->child[0];
zend_ast_list *arms = zend_ast_get_list(ast->child[1]);
- zend_bool has_default_arm = 0;
+ bool has_default_arm = 0;
uint32_t opnum_match = (uint32_t)-1;
znode expr_node;
@@ -5506,7 +5622,7 @@ void zend_compile_match(znode *result, zend_ast *ast)
uint32_t num_conds = count_match_conds(arms);
zend_uchar can_use_jumptable = can_match_use_jumptable(arms);
- zend_bool uses_jumptable = can_use_jumptable && num_conds >= 2;
+ bool uses_jumptable = can_use_jumptable && num_conds >= 2;
HashTable *jumptable = NULL;
uint32_t *jmpnz_opnums = NULL;
@@ -5572,7 +5688,7 @@ void zend_compile_match(znode *result, zend_ast *ast)
opnum_default_jmp = zend_emit_jump(0);
}
- zend_bool is_first_case = 1;
+ bool is_first_case = 1;
uint32_t cond_count = 0;
uint32_t *jmp_end_opnums = safe_emalloc(sizeof(uint32_t), arms->children, 0);
@@ -5731,7 +5847,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
zend_ast *var_ast = catch_ast->child[1];
zend_ast *stmt_ast = catch_ast->child[2];
zend_string *var_name = var_ast ? zval_make_interned_string(zend_ast_get_zval(var_ast)) : NULL;
- zend_bool is_last_catch = (i + 1 == catches->children);
+ bool is_last_catch = (i + 1 == catches->children);
uint32_t *jmp_multicatch = safe_emalloc(sizeof(uint32_t), classes->children - 1, 0);
uint32_t opnum_catch = (uint32_t)-1;
@@ -5740,7 +5856,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
for (j = 0; j < classes->children; j++) {
zend_ast *class_ast = classes->child[j];
- zend_bool is_last_class = (j + 1 == classes->children);
+ bool is_last_class = (j + 1 == classes->children);
if (!zend_is_const_default_class_ref(class_ast)) {
zend_error_noreturn(E_COMPILE_ERROR, "Bad class name in the catch statement");
@@ -5847,7 +5963,7 @@ void zend_compile_try(zend_ast *ast) /* {{{ */
/* }}} */
/* Encoding declarations must already be handled during parsing */
-zend_bool zend_handle_encoding_declaration(zend_ast *ast) /* {{{ */
+bool zend_handle_encoding_declaration(zend_ast *ast) /* {{{ */
{
zend_ast_list *declares = zend_ast_get_list(ast);
uint32_t i;
@@ -5899,7 +6015,7 @@ zend_bool zend_handle_encoding_declaration(zend_ast *ast) /* {{{ */
/* }}} */
/* Check whether this is the first statement, not counting declares. */
-static zend_result zend_is_first_statement(zend_ast *ast, zend_bool allow_nop) /* {{{ */
+static zend_result zend_is_first_statement(zend_ast *ast, bool allow_nop) /* {{{ */
{
uint32_t i = 0;
zend_ast_list *file_ast = zend_ast_get_list(CG(ast));
@@ -6075,7 +6191,7 @@ static zend_type zend_compile_single_typename(zend_ast *ast)
}
}
-static zend_bool zend_type_contains_traversable(zend_type type) {
+static bool zend_type_contains_traversable(zend_type type) {
zend_type *single_type;
ZEND_TYPE_FOREACH(type, single_type) {
if (ZEND_TYPE_HAS_NAME(*single_type)
@@ -6089,9 +6205,9 @@ static zend_bool zend_type_contains_traversable(zend_type type) {
// TODO: Ideally we'd canonicalize "iterable" into "array|Traversable" and essentially
// treat it as a built-in type alias.
static zend_type zend_compile_typename(
- zend_ast *ast, zend_bool force_allow_null, zend_bool use_arena) /* {{{ */
+ zend_ast *ast, bool force_allow_null) /* {{{ */
{
- zend_bool allow_null = force_allow_null;
+ bool allow_null = force_allow_null;
zend_ast_attr orig_ast_attr = ast->attr;
zend_type type = ZEND_TYPE_INIT_NONE(0);
if (ast->attr & ZEND_TYPE_NULLABLE) {
@@ -6101,6 +6217,12 @@ static zend_type zend_compile_typename(
if (ast->kind == ZEND_AST_TYPE_UNION) {
zend_ast_list *list = zend_ast_get_list(ast);
+ zend_type_list *type_list;
+ ALLOCA_FLAG(use_heap)
+
+ type_list = do_alloca(ZEND_TYPE_LIST_SIZE(list->children), use_heap);
+ type_list->num_types = 0;
+
for (uint32_t i = 0; i < list->children; i++) {
zend_ast *type_ast = list->child[i];
zend_type single_type = zend_compile_single_typename(type_ast);
@@ -6126,37 +6248,20 @@ static zend_type zend_compile_typename(
ZEND_TYPE_SET_PTR(type, ZEND_TYPE_NAME(single_type));
ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_NAME_BIT;
} else {
- zend_type_list *list;
- if (ZEND_TYPE_HAS_LIST(type)) {
- /* Add name to existing name list. */
- zend_type_list *old_list = ZEND_TYPE_LIST(type);
- if (use_arena) {
- // TODO: Add a zend_arena_realloc API?
- list = zend_arena_alloc(
- &CG(arena), ZEND_TYPE_LIST_SIZE(old_list->num_types + 1));
- memcpy(list, old_list, ZEND_TYPE_LIST_SIZE(old_list->num_types));
- } else {
- list = erealloc(old_list, ZEND_TYPE_LIST_SIZE(old_list->num_types + 1));
- }
- } else {
+ if (type_list->num_types == 0) {
/* Switch from single name to name list. */
- size_t size = ZEND_TYPE_LIST_SIZE(2);
- list = use_arena ? zend_arena_alloc(&CG(arena), size) : emalloc(size);
- list->num_types = 1;
- list->types[0] = type;
- ZEND_TYPE_FULL_MASK(list->types[0]) &= ~_ZEND_TYPE_MAY_BE_MASK;
+ type_list->num_types = 1;
+ type_list->types[0] = type;
+ ZEND_TYPE_FULL_MASK(type_list->types[0]) &= ~_ZEND_TYPE_MAY_BE_MASK;
+ ZEND_TYPE_SET_LIST(type, type_list);
}
- list->types[list->num_types++] = single_type;
- ZEND_TYPE_SET_LIST(type, list);
- if (use_arena) {
- ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_ARENA_BIT;
- }
+ type_list->types[type_list->num_types++] = single_type;
/* Check for trivially redundant class types */
- for (size_t i = 0; i < list->num_types - 1; i++) {
+ for (size_t i = 0; i < type_list->num_types - 1; i++) {
if (zend_string_equals_ci(
- ZEND_TYPE_NAME(list->types[i]), ZEND_TYPE_NAME(single_type))) {
+ ZEND_TYPE_NAME(type_list->types[i]), ZEND_TYPE_NAME(single_type))) {
zend_string *single_type_str = zend_type_to_string(single_type);
zend_error_noreturn(E_COMPILE_ERROR,
"Duplicate type %s is redundant", ZSTR_VAL(single_type_str));
@@ -6165,6 +6270,16 @@ static zend_type zend_compile_typename(
}
}
}
+
+ if (type_list->num_types) {
+ zend_type_list *list = zend_arena_alloc(
+ &CG(arena), ZEND_TYPE_LIST_SIZE(type_list->num_types));
+ memcpy(list, type_list, ZEND_TYPE_LIST_SIZE(type_list->num_types));
+ ZEND_TYPE_SET_LIST(type, list);
+ ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_ARENA_BIT;
+ }
+
+ free_alloca(type_list, use_heap);
} else {
type = zend_compile_single_typename(ast);
}
@@ -6217,7 +6332,7 @@ static zend_type zend_compile_typename(
/* }}} */
/* May convert value from int to float. */
-static zend_bool zend_is_valid_default_value(zend_type type, zval *value)
+static bool zend_is_valid_default_value(zend_type type, zval *value)
{
ZEND_ASSERT(ZEND_TYPE_IS_SET(type));
if (ZEND_TYPE_CONTAINS_CODE(type, Z_TYPE_P(value))) {
@@ -6266,7 +6381,7 @@ static void zend_compile_attributes(HashTable **attributes, zend_ast *ast, uint3
if (args) {
ZEND_ASSERT(args->kind == ZEND_AST_ARG_LIST);
- zend_bool uses_named_args = 0;
+ bool uses_named_args = 0;
for (j = 0; j < args->children; j++) {
zend_ast **arg_ast_ptr = &args->child[j];
zend_ast *arg_ast = *arg_ast_ptr;
@@ -6341,7 +6456,7 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32_t fall
arg_infos->name = NULL;
if (return_type_ast) {
arg_infos->type = zend_compile_typename(
- return_type_ast, /* force_allow_null */ 0, /* use_arena */ 0);
+ return_type_ast, /* force_allow_null */ 0);
ZEND_TYPE_FULL_MASK(arg_infos->type) |= _ZEND_ARG_INFO_FLAGS(
(op_array->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0, /* is_variadic */ 0);
} else {
@@ -6364,8 +6479,8 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32_t fall
zend_ast *attributes_ast = param_ast->child[3];
zend_ast *doc_comment_ast = param_ast->child[4];
zend_string *name = zval_make_interned_string(zend_ast_get_zval(var_ast));
- zend_bool is_ref = (param_ast->attr & ZEND_PARAM_REF) != 0;
- zend_bool is_variadic = (param_ast->attr & ZEND_PARAM_VARIADIC) != 0;
+ bool is_ref = (param_ast->attr & ZEND_PARAM_REF) != 0;
+ bool is_variadic = (param_ast->attr & ZEND_PARAM_VARIADIC) != 0;
uint32_t visibility =
param_ast->attr & (ZEND_ACC_PUBLIC|ZEND_ACC_PROTECTED|ZEND_ACC_PRIVATE);
@@ -6414,7 +6529,7 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32_t fall
if (!optional_param) {
/* Ignore parameters of the form "Type $param = null".
* This is the PHP 5 style way of writing "?Type $param", so allow it for now. */
- zend_bool is_implicit_nullable =
+ bool is_implicit_nullable =
type_ast && Z_TYPE(default_node.u.constant) == IS_NULL;
if (!is_implicit_nullable) {
optional_param = name;
@@ -6440,10 +6555,10 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32_t fall
if (type_ast) {
uint32_t default_type = *default_ast_ptr ? Z_TYPE(default_node.u.constant) : IS_UNDEF;
- zend_bool force_nullable = default_type == IS_NULL && !visibility;
+ bool force_nullable = default_type == IS_NULL && !visibility;
op_array->fn_flags |= ZEND_ACC_HAS_TYPE_HINTS;
- arg_info->type = zend_compile_typename(type_ast, force_nullable, /* use_arena */ 0);
+ arg_info->type = zend_compile_typename(type_ast, force_nullable);
if (ZEND_TYPE_FULL_MASK(arg_info->type) & MAY_BE_VOID) {
zend_error_noreturn(E_COMPILE_ERROR, "void cannot be used as a parameter type");
@@ -6480,7 +6595,7 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32_t fall
if (visibility) {
zend_op_array *op_array = CG(active_op_array);
zend_class_entry *scope = op_array->scope;
- zend_bool is_ctor =
+ bool is_ctor =
scope && zend_is_constructor(op_array->function_name);
if (!is_ctor) {
zend_error_noreturn(E_COMPILE_ERROR,
@@ -6509,7 +6624,7 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32_t fall
/* Recompile the type, as it has different memory management requirements. */
zend_type type = ZEND_TYPE_INIT_NONE(0);
if (type_ast) {
- type = zend_compile_typename(type_ast, /* force_allow_null */ 0, /* use_arena */ 1);
+ type = zend_compile_typename(type_ast, /* force_allow_null */ 0);
}
/* Don't give the property an explicit default value. For typed properties this means
@@ -6544,7 +6659,7 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32_t fall
for (i = 0; i < list->children; i++) {
zend_ast *param_ast = list->child[i];
- zend_bool is_ref = (param_ast->attr & ZEND_PARAM_REF) != 0;
+ bool is_ref = (param_ast->attr & ZEND_PARAM_REF) != 0;
uint32_t visibility =
param_ast->attr & (ZEND_ACC_PUBLIC|ZEND_ACC_PROTECTED|ZEND_ACC_PRIVATE);
if (!visibility) {
@@ -6614,7 +6729,7 @@ static void zend_compile_closure_binding(znode *closure, zend_op_array *op_array
typedef struct {
HashTable uses;
- zend_bool varvars_used;
+ bool varvars_used;
} closure_info;
static void find_implicit_binds_recursively(closure_info *info, zend_ast *ast) {
@@ -6770,10 +6885,10 @@ static void add_stringable_interface(zend_class_entry *ce) {
zend_string_init("stringable", sizeof("stringable") - 1, 0);
}
-zend_string *zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_bool has_body) /* {{{ */
+zend_string *zend_begin_method_decl(zend_op_array *op_array, zend_string *name, bool has_body) /* {{{ */
{
zend_class_entry *ce = CG(active_class_entry);
- zend_bool in_interface = (ce->ce_flags & ZEND_ACC_INTERFACE) != 0;
+ bool in_interface = (ce->ce_flags & ZEND_ACC_INTERFACE) != 0;
uint32_t fn_flags = op_array->fn_flags;
zend_string *lcname;
@@ -6827,9 +6942,18 @@ zend_string *zend_begin_method_decl(zend_op_array *op_array, zend_string *name,
}
/* }}} */
-static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_ast_decl *decl, zend_bool toplevel) /* {{{ */
+static uint32_t zend_add_dynamic_func_def(zend_op_array *def) {
+ zend_op_array *op_array = CG(active_op_array);
+ uint32_t def_offset = op_array->num_dynamic_func_defs++;
+ op_array->dynamic_func_defs = erealloc(
+ op_array->dynamic_func_defs, op_array->num_dynamic_func_defs * sizeof(zend_op_array *));
+ op_array->dynamic_func_defs[def_offset] = def;
+ return def_offset;
+}
+
+static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_ast_decl *decl, bool toplevel) /* {{{ */
{
- zend_string *unqualified_name, *name, *lcname, *key;
+ zend_string *unqualified_name, *name, *lcname;
zend_op *opline;
unqualified_name = decl->name;
@@ -6865,38 +6989,29 @@ static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_as
return;
}
- /* Generate RTD keys until we find one that isn't in use yet. */
- key = NULL;
- do {
- zend_tmp_string_release(key);
- key = zend_build_runtime_definition_key(lcname, decl->start_lineno);
- } while (!zend_hash_add_ptr(CG(function_table), key, op_array));
-
+ uint32_t func_ref = zend_add_dynamic_func_def(op_array);
if (op_array->fn_flags & ZEND_ACC_CLOSURE) {
opline = zend_emit_op_tmp(result, ZEND_DECLARE_LAMBDA_FUNCTION, NULL, NULL);
- opline->extended_value = zend_alloc_cache_slot();
- opline->op1_type = IS_CONST;
- LITERAL_STR(opline->op1, key);
+ opline->op2.num = func_ref;
} else {
opline = get_next_op();
opline->opcode = ZEND_DECLARE_FUNCTION;
opline->op1_type = IS_CONST;
LITERAL_STR(opline->op1, zend_string_copy(lcname));
- /* RTD key is placed after lcname literal in op1 */
- zend_add_literal_string(&key);
+ opline->op2.num = func_ref;
}
zend_string_release_ex(lcname, 0);
}
/* }}} */
-void zend_compile_func_decl(znode *result, zend_ast *ast, zend_bool toplevel) /* {{{ */
+void zend_compile_func_decl(znode *result, zend_ast *ast, bool toplevel) /* {{{ */
{
zend_ast_decl *decl = (zend_ast_decl *) ast;
zend_ast *params_ast = decl->child[0];
zend_ast *uses_ast = decl->child[1];
zend_ast *stmt_ast = decl->child[2];
zend_ast *return_type_ast = decl->child[3];
- zend_bool is_method = decl->kind == ZEND_AST_METHOD;
+ bool is_method = decl->kind == ZEND_AST_METHOD;
zend_string *method_lcname;
zend_class_entry *orig_class_entry = CG(active_class_entry);
@@ -6910,13 +7025,11 @@ void zend_compile_func_decl(znode *result, zend_ast *ast, zend_bool toplevel) /*
if (CG(compiler_options) & ZEND_COMPILE_PRELOAD) {
op_array->fn_flags |= ZEND_ACC_PRELOADED;
- ZEND_MAP_PTR_NEW(op_array->run_time_cache);
- ZEND_MAP_PTR_NEW(op_array->static_variables_ptr);
- } else {
- ZEND_MAP_PTR_INIT(op_array->run_time_cache, zend_arena_alloc(&CG(arena), sizeof(void*)));
- ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL);
}
+ ZEND_MAP_PTR_INIT(op_array->run_time_cache, zend_arena_alloc(&CG(arena), sizeof(void *)));
+ ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL);
+
op_array->fn_flags |= (orig_op_array->fn_flags & ZEND_ACC_STRICT_TYPES);
op_array->fn_flags |= decl->flags;
op_array->line_start = decl->start_lineno;
@@ -6930,7 +7043,7 @@ void zend_compile_func_decl(znode *result, zend_ast *ast, zend_bool toplevel) /*
}
if (is_method) {
- zend_bool has_body = stmt_ast != NULL;
+ bool has_body = stmt_ast != NULL;
method_lcname = zend_begin_method_decl(op_array, decl->name, has_body);
} else {
zend_begin_func_decl(result, op_array, decl, toplevel);
@@ -7002,6 +7115,7 @@ void zend_compile_func_decl(znode *result, zend_ast *ast, zend_bool toplevel) /*
zend_do_extended_stmt();
zend_emit_final_return(0);
+ zend_init_static_variables_map_ptr(op_array);
pass_two(CG(active_op_array));
zend_oparray_context_end(&orig_oparray_context);
@@ -7020,7 +7134,11 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t flags, z
uint32_t i, children = list->children;
if (ce->ce_flags & ZEND_ACC_INTERFACE) {
- zend_error_noreturn(E_COMPILE_ERROR, "Interfaces may not include member variables");
+ zend_error_noreturn(E_COMPILE_ERROR, "Interfaces may not include properties");
+ }
+
+ if (ce->ce_flags & ZEND_ACC_ENUM) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Enums may not include properties");
}
if (flags & ZEND_ACC_ABSTRACT) {
@@ -7039,7 +7157,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t flags, z
zend_type type = ZEND_TYPE_INIT_NONE(0);
if (type_ast) {
- type = zend_compile_typename(type_ast, /* force_allow_null */ 0, /* use_arena */ 1);
+ type = zend_compile_typename(type_ast, /* force_allow_null */ 0);
if (ZEND_TYPE_FULL_MASK(type) & (MAY_BE_VOID|MAY_BE_CALLABLE)) {
zend_string *str = zend_type_to_string(type);
@@ -7311,12 +7429,36 @@ static zend_string *zend_generate_anon_class_name(zend_ast_decl *decl)
return zend_new_interned_string(result);
}
-void zend_compile_class_decl(znode *result, zend_ast *ast, zend_bool toplevel) /* {{{ */
+static void zend_compile_enum_backing_type(zend_class_entry *ce, zend_ast *enum_backing_type_ast)
+{
+ ZEND_ASSERT(ce->ce_flags & ZEND_ACC_ENUM);
+ zend_type type = zend_compile_typename(enum_backing_type_ast, 0);
+ uint32_t type_mask = ZEND_TYPE_PURE_MASK(type);
+ if (ZEND_TYPE_HAS_CLASS(type) || (type_mask != MAY_BE_LONG && type_mask != MAY_BE_STRING)) {
+ zend_string *type_string = zend_type_to_string(type);
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Enum backing type must be int or string, %s given",
+ ZSTR_VAL(type_string));
+ }
+ if (type_mask == MAY_BE_LONG) {
+ ce->enum_backing_type = IS_LONG;
+ } else {
+ ZEND_ASSERT(type_mask == MAY_BE_STRING);
+ ce->enum_backing_type = IS_STRING;
+ }
+ zend_type_release(type, 0);
+
+ ce->backed_enum_table = emalloc(sizeof(HashTable));
+ zend_hash_init(ce->backed_enum_table, 0, NULL, ZVAL_PTR_DTOR, 0);
+}
+
+void zend_compile_class_decl(znode *result, zend_ast *ast, bool toplevel) /* {{{ */
{
zend_ast_decl *decl = (zend_ast_decl *) ast;
zend_ast *extends_ast = decl->child[0];
zend_ast *implements_ast = decl->child[1];
zend_ast *stmt_ast = decl->child[2];
+ zend_ast *enum_backing_type_ast = decl->child[4];
zend_string *name, *lcname;
zend_class_entry *ce = zend_arena_alloc(&CG(arena), sizeof(zend_class_entry));
zend_op *opline;
@@ -7397,6 +7539,14 @@ void zend_compile_class_decl(znode *result, zend_ast *ast, zend_bool toplevel) /
zend_compile_implements(implements_ast);
}
+ if (ce->ce_flags & ZEND_ACC_ENUM) {
+ if (enum_backing_type_ast != NULL) {
+ zend_compile_enum_backing_type(ce, enum_backing_type_ast);
+ }
+ zend_enum_add_interfaces(ce);
+ zend_enum_register_props(ce);
+ }
+
zend_compile_stmt(stmt_ast);
/* Reset lineno for final opcodes and errors */
@@ -7412,31 +7562,36 @@ void zend_compile_class_decl(znode *result, zend_ast *ast, zend_bool toplevel) /
ce->ce_flags |= ZEND_ACC_TOP_LEVEL;
}
- if (toplevel
- /* We currently don't early-bind classes that implement interfaces or use traits */
- && !ce->num_interfaces && !ce->num_traits
+ /* We currently don't early-bind classes that implement interfaces or use traits */
+ if (!ce->num_interfaces && !ce->num_traits
&& !(CG(compiler_options) & ZEND_COMPILE_WITHOUT_EXECUTION)) {
- if (extends_ast) {
- zend_class_entry *parent_ce = zend_lookup_class_ex(
- ce->parent_name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
-
- if (parent_ce
- && ((parent_ce->type != ZEND_INTERNAL_CLASS) || !(CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_CLASSES))
- && ((parent_ce->type != ZEND_USER_CLASS) || !(CG(compiler_options) & ZEND_COMPILE_IGNORE_OTHER_FILES) || (parent_ce->info.user.filename == ce->info.user.filename))) {
-
- CG(zend_lineno) = decl->end_lineno;
- if (zend_try_early_bind(ce, parent_ce, lcname, NULL)) {
+ if (toplevel) {
+ if (extends_ast) {
+ zend_class_entry *parent_ce = zend_lookup_class_ex(
+ ce->parent_name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+
+ if (parent_ce
+ && ((parent_ce->type != ZEND_INTERNAL_CLASS) || !(CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_CLASSES))
+ && ((parent_ce->type != ZEND_USER_CLASS) || !(CG(compiler_options) & ZEND_COMPILE_IGNORE_OTHER_FILES) || (parent_ce->info.user.filename == ce->info.user.filename))) {
+
+ CG(zend_lineno) = decl->end_lineno;
+ if (zend_try_early_bind(ce, parent_ce, lcname, NULL)) {
+ CG(zend_lineno) = ast->lineno;
+ zend_string_release(lcname);
+ return;
+ }
CG(zend_lineno) = ast->lineno;
- zend_string_release(lcname);
- return;
}
- CG(zend_lineno) = ast->lineno;
+ } else if (EXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL)) {
+ zend_string_release(lcname);
+ zend_build_properties_info_table(ce);
+ ce->ce_flags |= ZEND_ACC_LINKED;
+ return;
}
- } else if (EXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL)) {
- zend_string_release(lcname);
+ } else if (!extends_ast) {
+ /* Link unbound simple class */
zend_build_properties_info_table(ce);
ce->ce_flags |= ZEND_ACC_LINKED;
- return;
}
}
@@ -7488,6 +7643,99 @@ void zend_compile_class_decl(znode *result, zend_ast *ast, zend_bool toplevel) /
}
/* }}} */
+static void zend_compile_enum_case(zend_ast *ast)
+{
+ zend_class_entry *enum_class = CG(active_class_entry);
+ if (!(enum_class->ce_flags & ZEND_ACC_ENUM)) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Case can only be used in enums");
+ }
+
+ zend_string *enum_case_name = zval_make_interned_string(zend_ast_get_zval(ast->child[0]));
+ zend_string *enum_class_name = enum_class->name;
+
+ zval class_name_zval;
+ ZVAL_STR_COPY(&class_name_zval, enum_class_name);
+ zend_ast *class_name_ast = zend_ast_create_zval(&class_name_zval);
+
+ zval case_name_zval;
+ ZVAL_STR_COPY(&case_name_zval, enum_case_name);
+ zend_ast *case_name_ast = zend_ast_create_zval(&case_name_zval);
+
+ zend_ast *case_value_zval_ast = NULL;
+ zend_ast *case_value_ast = ast->child[1];
+ if (enum_class->enum_backing_type != IS_UNDEF && case_value_ast == NULL) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Case %s of backed enum %s must have a value",
+ ZSTR_VAL(enum_case_name),
+ ZSTR_VAL(enum_class_name));
+ }
+ if (case_value_ast != NULL) {
+ zend_eval_const_expr(&ast->child[1]);
+ case_value_ast = ast->child[1];
+ if (case_value_ast->kind != ZEND_AST_ZVAL) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Enum case value must be constant");
+ }
+
+ zval case_value_zv;
+ ZVAL_COPY(&case_value_zv, zend_ast_get_zval(case_value_ast));
+ if (enum_class->enum_backing_type == IS_UNDEF) {
+ if (Z_TYPE(case_value_zv) == IS_LONG || Z_TYPE(case_value_zv) == IS_STRING) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Case %s of non-backed enum %s must not have a value, try adding \": %s\" to the enum declaration",
+ ZSTR_VAL(enum_case_name),
+ ZSTR_VAL(enum_class_name),
+ zend_zval_type_name(&case_value_zv));
+ } else {
+ zend_error_noreturn(E_COMPILE_ERROR, "Case %s of non-backed enum %s must not have a value",
+ ZSTR_VAL(enum_case_name),
+ ZSTR_VAL(enum_class_name));
+ }
+ }
+
+ if (enum_class->enum_backing_type != Z_TYPE(case_value_zv)) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Enum case type %s does not match enum backing type %s",
+ zend_get_type_by_const(Z_TYPE(case_value_zv)),
+ zend_get_type_by_const(enum_class->enum_backing_type));
+ }
+
+ case_value_zval_ast = zend_ast_create_zval(&case_value_zv);
+ Z_TRY_ADDREF(case_name_zval);
+ if (enum_class->enum_backing_type == IS_LONG) {
+ zend_long long_key = Z_LVAL(case_value_zv);
+ zval *existing_case_name = zend_hash_index_find(enum_class->backed_enum_table, long_key);
+ if (existing_case_name) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Duplicate value in enum %s for cases %s and %s",
+ ZSTR_VAL(enum_class_name),
+ Z_STRVAL_P(existing_case_name),
+ ZSTR_VAL(enum_case_name));
+ }
+ zend_hash_index_add_new(enum_class->backed_enum_table, long_key, &case_name_zval);
+ } else {
+ ZEND_ASSERT(enum_class->enum_backing_type == IS_STRING);
+ zend_string *string_key = Z_STR(case_value_zv);
+ zval *existing_case_name = zend_hash_find(enum_class->backed_enum_table, string_key);
+ if (existing_case_name != NULL) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Duplicate value in enum %s for cases %s and %s",
+ ZSTR_VAL(enum_class_name),
+ Z_STRVAL_P(existing_case_name),
+ ZSTR_VAL(enum_case_name));
+ }
+ zend_hash_add_new(enum_class->backed_enum_table, string_key, &case_name_zval);
+ }
+ }
+
+ zend_ast *const_enum_init_ast = zend_ast_create(ZEND_AST_CONST_ENUM_INIT, class_name_ast, case_name_ast, case_value_zval_ast);
+
+ zval value_zv;
+ zend_const_expr_to_zval(&value_zv, &const_enum_init_ast);
+ zend_class_constant *c = zend_declare_class_constant_ex(enum_class, enum_case_name, &value_zv, ZEND_ACC_PUBLIC, NULL);
+ Z_ACCESS_FLAGS(c->value) |= ZEND_CLASS_CONST_IS_CASE;
+ zend_ast_destroy(const_enum_init_ast);
+
+ zend_ast *attr_ast = ast->child[2];
+ if (attr_ast) {
+ zend_compile_attributes(&c->attributes, attr_ast, 0, ZEND_ATTRIBUTE_TARGET_CLASS_CONST);
+ }
+}
+
static HashTable *zend_get_import_ht(uint32_t type) /* {{{ */
{
switch (type) {
@@ -7550,7 +7798,7 @@ void zend_compile_use(zend_ast *ast) /* {{{ */
zend_string *current_ns = FC(current_namespace);
uint32_t type = ast->attr;
HashTable *current_import = zend_get_import_ht(type);
- zend_bool case_sensitive = type == ZEND_SYMBOL_CONST;
+ bool case_sensitive = type == ZEND_SYMBOL_CONST;
for (i = 0; i < list->children; ++i) {
zend_ast *use_ast = list->child[i];
@@ -7684,7 +7932,7 @@ void zend_compile_namespace(zend_ast *ast) /* {{{ */
zend_ast *name_ast = ast->child[0];
zend_ast *stmt_ast = ast->child[1];
zend_string *name;
- zend_bool with_bracket = stmt_ast != NULL;
+ bool with_bracket = stmt_ast != NULL;
/* handle mixed syntax declaration or nested namespaces */
if (!FC(has_bracketed_namespaces)) {
@@ -7705,7 +7953,7 @@ void zend_compile_namespace(zend_ast *ast) /* {{{ */
}
}
- zend_bool is_first_namespace = (!with_bracket && !FC(current_namespace))
+ bool is_first_namespace = (!with_bracket && !FC(current_namespace))
|| (with_bracket && !FC(has_bracketed_namespaces));
if (is_first_namespace && FAILURE == zend_is_first_statement(ast, /* allow_nop */ 1)) {
zend_error_noreturn(E_COMPILE_ERROR, "Namespace declaration statement has to be "
@@ -7764,7 +8012,7 @@ void zend_compile_halt_compiler(zend_ast *ast) /* {{{ */
}
/* }}} */
-static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
+static bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
{
zend_op_array *op_array = CG(active_op_array);
zend_class_entry *ce = CG(active_class_entry);
@@ -7786,7 +8034,7 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
ZSTR_LEN(dirname) = zend_dirname(ZSTR_VAL(dirname), ZSTR_LEN(dirname));
#endif
- if (strcmp(ZSTR_VAL(dirname), ".") == 0) {
+ if (zend_string_equals_literal(dirname, ".")) {
dirname = zend_string_extend(dirname, MAXPATHLEN, 0);
#if HAVE_GETCWD
ZEND_IGNORE_VALUE(VCWD_GETCWD(ZSTR_VAL(dirname), MAXPATHLEN));
@@ -7855,7 +8103,7 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
}
/* }}} */
-ZEND_API zend_bool zend_binary_op_produces_error(uint32_t opcode, zval *op1, zval *op2) /* {{{ */
+ZEND_API bool zend_binary_op_produces_error(uint32_t opcode, zval *op1, zval *op2) /* {{{ */
{
if ((opcode == ZEND_CONCAT || opcode == ZEND_FAST_CONCAT)) {
/* Array to string warning. */
@@ -7910,7 +8158,7 @@ ZEND_API zend_bool zend_binary_op_produces_error(uint32_t opcode, zval *op1, zva
}
/* }}} */
-static inline zend_bool zend_try_ct_eval_binary_op(zval *result, uint32_t opcode, zval *op1, zval *op2) /* {{{ */
+static inline bool zend_try_ct_eval_binary_op(zval *result, uint32_t opcode, zval *op1, zval *op2) /* {{{ */
{
if (zend_binary_op_produces_error(opcode, op1, op2)) {
return 0;
@@ -7922,7 +8170,7 @@ static inline zend_bool zend_try_ct_eval_binary_op(zval *result, uint32_t opcode
}
/* }}} */
-zend_bool zend_unary_op_produces_error(uint32_t opcode, zval *op)
+bool zend_unary_op_produces_error(uint32_t opcode, zval *op)
{
if (opcode == ZEND_BW_NOT) {
return Z_TYPE_P(op) <= IS_TRUE || Z_TYPE_P(op) == IS_ARRAY;
@@ -7931,7 +8179,7 @@ zend_bool zend_unary_op_produces_error(uint32_t opcode, zval *op)
return 0;
}
-static inline zend_bool zend_try_ct_eval_unary_op(zval *result, uint32_t opcode, zval *op) /* {{{ */
+static inline bool zend_try_ct_eval_unary_op(zval *result, uint32_t opcode, zval *op) /* {{{ */
{
if (zend_unary_op_produces_error(opcode, op)) {
return 0;
@@ -7943,7 +8191,7 @@ static inline zend_bool zend_try_ct_eval_unary_op(zval *result, uint32_t opcode,
}
/* }}} */
-static inline zend_bool zend_try_ct_eval_unary_pm(zval *result, zend_ast_kind kind, zval *op) /* {{{ */
+static inline bool zend_try_ct_eval_unary_pm(zval *result, zend_ast_kind kind, zval *op) /* {{{ */
{
zval right;
ZVAL_LONG(&right, (kind == ZEND_AST_UNARY_PLUS) ? 1 : -1);
@@ -7959,12 +8207,12 @@ static inline void zend_ct_eval_greater(zval *result, zend_ast_kind kind, zval *
}
/* }}} */
-static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
+static bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
{
zend_ast_list *list = zend_ast_get_list(ast);
zend_ast *last_elem_ast = NULL;
uint32_t i;
- zend_bool is_constant = 1;
+ bool is_constant = 1;
if (ast->attr == ZEND_ARRAY_SYNTAX_LIST) {
zend_error(E_COMPILE_ERROR, "Cannot use list() as standalone expression");
@@ -8026,9 +8274,8 @@ static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
if (key) {
- zend_error_noreturn(E_COMPILE_ERROR, "Cannot unpack array with string keys");
- }
- if (!zend_hash_next_index_insert(Z_ARRVAL_P(result), val)) {
+ zend_hash_update(Z_ARRVAL_P(result), key, val);
+ } else if (!zend_hash_next_index_insert(Z_ARRVAL_P(result), val)) {
zval_ptr_dtor(result);
return 0;
}
@@ -8490,7 +8737,7 @@ void zend_compile_assign_coalesce(znode *result, zend_ast *ast) /* {{{ */
znode var_node_is, var_node_w, default_node, assign_node, *node;
zend_op *opline;
uint32_t coalesce_opnum;
- zend_bool need_frees = 0;
+ bool need_frees = 0;
/* Remember expressions compiled during the initial BP_VAR_IS lookup,
* to avoid double-evaluation when we compile again with BP_VAR_W. */
@@ -8620,7 +8867,7 @@ void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */
znode value_node, key_node;
znode *value_node_ptr = NULL, *key_node_ptr = NULL;
zend_op *opline;
- zend_bool returns_by_ref = (CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
+ bool returns_by_ref = (CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
zend_mark_function_as_generator();
@@ -8680,7 +8927,7 @@ void zend_compile_instanceof(znode *result, zend_ast *ast) /* {{{ */
}
zend_compile_class_ref(&class_node, class_ast,
- ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_EXCEPTION);
+ ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_EXCEPTION | ZEND_FETCH_CLASS_SILENT);
opline = zend_emit_op_tmp(result, ZEND_INSTANCEOF, &obj_node, NULL);
@@ -8733,6 +8980,28 @@ void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */
}
}
+ if (is_globals_fetch(var_ast)) {
+ result->op_type = IS_CONST;
+ ZVAL_BOOL(&result->u.constant, ast->kind == ZEND_AST_ISSET);
+ return;
+ }
+
+ if (is_global_var_fetch(var_ast)) {
+ if (!var_ast->child[1]) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for reading");
+ }
+
+ zend_compile_expr(&var_node, var_ast->child[1]);
+ if (var_node.op_type == IS_CONST) {
+ convert_to_string(&var_node.u.constant);
+ }
+
+ opline = zend_emit_op_tmp(result, ZEND_ISSET_ISEMPTY_VAR, &var_node, NULL);
+ opline->extended_value =
+ ZEND_FETCH_GLOBAL | (ast->kind == ZEND_AST_EMPTY ? ZEND_ISEMPTY : 0);
+ return;
+ }
+
zend_short_circuiting_mark_inner(var_ast);
switch (var_ast->kind) {
case ZEND_AST_VAR:
@@ -8811,7 +9080,7 @@ void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */
zend_ast_list *list = zend_ast_get_list(ast);
zend_op *opline;
uint32_t i, opnum_init = -1;
- zend_bool packed = 1;
+ bool packed = 1;
if (zend_try_ct_eval_array(&result->u.constant, ast)) {
result->op_type = IS_CONST;
@@ -8824,7 +9093,7 @@ void zend_compile_array(znode *result, zend_ast *ast) /* {{{ */
for (i = 0; i < list->children; ++i) {
zend_ast *elem_ast = list->child[i];
zend_ast *value_ast, *key_ast;
- zend_bool by_ref;
+ bool by_ref;
znode value_node, key_node, *key_node_ptr = NULL;
if (elem_ast == NULL) {
@@ -8891,7 +9160,7 @@ void zend_compile_const(znode *result, zend_ast *ast) /* {{{ */
zend_op *opline;
- zend_bool is_fully_qualified;
+ bool is_fully_qualified;
zend_string *orig_name = zend_ast_get_str(name_ast);
zend_string *resolved_name = zend_resolve_const_name(orig_name, name_ast->attr, &is_fully_qualified);
@@ -9168,7 +9437,7 @@ void zend_compile_magic_const(znode *result, zend_ast *ast) /* {{{ */
}
/* }}} */
-zend_bool zend_is_allowed_in_const_expr(zend_ast_kind kind) /* {{{ */
+bool zend_is_allowed_in_const_expr(zend_ast_kind kind) /* {{{ */
{
return kind == ZEND_AST_ZVAL || kind == ZEND_AST_BINARY_OP
|| kind == ZEND_AST_GREATER || kind == ZEND_AST_GREATER_EQUAL
@@ -9180,7 +9449,8 @@ zend_bool zend_is_allowed_in_const_expr(zend_ast_kind kind) /* {{{ */
|| kind == ZEND_AST_UNPACK
|| kind == ZEND_AST_CONST || kind == ZEND_AST_CLASS_CONST
|| kind == ZEND_AST_CLASS_NAME
- || kind == ZEND_AST_MAGIC_CONST || kind == ZEND_AST_COALESCE;
+ || kind == ZEND_AST_MAGIC_CONST || kind == ZEND_AST_COALESCE
+ || kind == ZEND_AST_CONST_ENUM_INIT;
}
/* }}} */
@@ -9255,7 +9525,7 @@ void zend_compile_const_expr_const(zend_ast **ast_ptr) /* {{{ */
zend_ast *ast = *ast_ptr;
zend_ast *name_ast = ast->child[0];
zend_string *orig_name = zend_ast_get_str(name_ast);
- zend_bool is_fully_qualified;
+ bool is_fully_qualified;
zval result;
zend_string *resolved_name;
@@ -9435,6 +9705,9 @@ void zend_compile_stmt(zend_ast *ast) /* {{{ */
case ZEND_AST_METHOD:
zend_compile_func_decl(NULL, ast, 0);
break;
+ case ZEND_AST_ENUM_CASE:
+ zend_compile_enum_case(ast);
+ break;
case ZEND_AST_PROP_GROUP:
zend_compile_prop_group(ast);
break;
@@ -9676,7 +9949,7 @@ zend_op *zend_compile_var(znode *result, zend_ast *ast, uint32_t type, bool by_r
return opcode;
}
-zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref) /* {{{ */
+zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, bool by_ref) /* {{{ */
{
switch (ast->kind) {
case ZEND_AST_VAR:
@@ -9737,7 +10010,7 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
case ZEND_AST_AND:
case ZEND_AST_OR:
{
- zend_bool child0_is_true, child1_is_true;
+ bool child0_is_true, child1_is_true;
zend_eval_const_expr(&ast->child[0]);
zend_eval_const_expr(&ast->child[1]);
if (ast->child[0]->kind != ZEND_AST_ZVAL) {
@@ -9911,7 +10184,7 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
case ZEND_AST_CONST:
{
zend_ast *name_ast = ast->child[0];
- zend_bool is_fully_qualified;
+ bool is_fully_qualified;
zend_string *resolved_name = zend_resolve_const_name(
zend_ast_get_str(name_ast), name_ast->attr, &is_fully_qualified);
@@ -9940,7 +10213,6 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
}
resolved_name = zend_resolve_class_name_ast(class_ast);
-
if (!zend_try_ct_eval_class_const(&result, resolved_name, zend_ast_get_str(name_ast))) {
zend_string_release_ex(resolved_name, 0);
return;
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index a4cb6fca74..9e22837d61 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -107,8 +107,8 @@ typedef struct _zend_file_context {
zend_declarables declarables;
zend_string *current_namespace;
- zend_bool in_namespace;
- zend_bool has_bracketed_namespaces;
+ bool in_namespace;
+ bool has_bracketed_namespaces;
HashTable *imports;
HashTable *imports_function;
@@ -117,17 +117,12 @@ typedef struct _zend_file_context {
HashTable seen_symbols;
} zend_file_context;
-typedef struct {
- uint32_t offset;
- uint32_t len;
-} zend_lexer_ident_ref;
-
typedef union _zend_parser_stack_elem {
zend_ast *ast;
zend_string *str;
zend_ulong num;
unsigned char *ptr;
- zend_lexer_ident_ref ident;
+ unsigned char *ident;
} zend_parser_stack_elem;
void zend_compile_top_stmt(zend_ast *ast);
@@ -158,7 +153,7 @@ typedef struct _zend_brk_cont_element {
int cont;
int brk;
int parent;
- zend_bool is_switch;
+ bool is_switch;
} zend_brk_cont_element;
typedef struct _zend_label {
@@ -238,13 +233,19 @@ typedef struct _zend_oparray_context {
/* op_array or class is preloaded | | | */
#define ZEND_ACC_PRELOADED (1 << 10) /* X | X | | */
/* | | | */
-/* Class Flags (unused: 22...) | | | */
+/* Flag to differenciate cases from constants. | | | */
+/* Stored in Z_ACCESS_FLAGS, must not conflict with | | | */
+/* ZEND_ACC_ visibility flags or IS_CONSTANT_VISITED_MARK | | | */
+#define ZEND_CLASS_CONST_IS_CASE (1 << 6) /* | | | X */
+/* | | | */
+/* Class Flags (unused: 29...) | | | */
/* =========== | | | */
/* | | | */
/* Special class types | | | */
#define ZEND_ACC_INTERFACE (1 << 0) /* X | | | */
#define ZEND_ACC_TRAIT (1 << 1) /* X | | | */
#define ZEND_ACC_ANON_CLASS (1 << 2) /* X | | | */
+#define ZEND_ACC_ENUM (1 << 28) /* X | | | */
/* | | | */
/* Class linked with parent, interfaces and traits | | | */
#define ZEND_ACC_LINKED (1 << 3) /* X | | | */
@@ -287,6 +288,19 @@ typedef struct _zend_oparray_context {
/* Whether this class was used in its unlinked state. | | | */
#define ZEND_ACC_HAS_UNLINKED_USES (1 << 21) /* X | | | */
/* | | | */
+/* stored in opcache (may be partially) | | | */
+#define ZEND_ACC_CACHED (1 << 22) /* X | | | */
+/* | | | */
+/* temporary flag used during delayed variance checks | | | */
+#define ZEND_ACC_CACHEABLE (1 << 23) /* X | | | */
+/* | | | */
+#define ZEND_ACC_HAS_AST_CONSTANTS (1 << 24) /* X | | | */
+#define ZEND_ACC_HAS_AST_PROPERTIES (1 << 25) /* X | | | */
+#define ZEND_ACC_HAS_AST_STATICS (1 << 26) /* X | | | */
+/* | | | */
+/* loaded from file cache to process memory | | | */
+#define ZEND_ACC_FILE_CACHED (1 << 27) /* X | | | */
+/* | | | */
/* Function Flags (unused: 27-30) | | | */
/* ============== | | | */
/* | | | */
@@ -379,7 +393,7 @@ typedef struct _zend_property_info {
((offset - OBJ_PROP_TO_OFFSET(0)) / sizeof(zval))
typedef struct _zend_class_constant {
- zval value; /* access flags are stored in reserved: zval.u2.access_flags */
+ zval value; /* access flags and other constant flags are stored in reserved: zval.u2.access_flags */
zend_string *doc_comment;
HashTable *attributes;
zend_class_entry *ce;
@@ -448,8 +462,13 @@ struct _zend_op_array {
zend_string *doc_comment;
int last_literal;
+ uint32_t num_dynamic_func_defs;
zval *literals;
+ /* Functions that are declared dynamically are stored here and
+ * referenced by index from opcodes. */
+ zend_op_array **dynamic_func_defs;
+
void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};
@@ -768,12 +787,12 @@ zend_ast *zend_ast_append_str(zend_ast *left, zend_ast *right);
zend_ast *zend_negate_num_string(zend_ast *ast);
uint32_t zend_add_class_modifier(uint32_t flags, uint32_t new_flag);
uint32_t zend_add_member_modifier(uint32_t flags, uint32_t new_flag);
-zend_bool zend_handle_encoding_declaration(zend_ast *ast);
+bool zend_handle_encoding_declaration(zend_ast *ast);
/* parser-driven code generators */
void zend_do_free(znode *op1);
-ZEND_API zend_result do_bind_function(zval *lcname);
+ZEND_API zend_result do_bind_function(zend_function *func, zval *lcname);
ZEND_API zend_result do_bind_class(zval *lcname, zend_string *lc_parent_name);
ZEND_API uint32_t zend_build_delayed_early_binding_list(const zend_op_array *op_array);
ZEND_API void zend_do_delayed_early_binding(zend_op_array *op_array, uint32_t first_early_binding_opline);
@@ -787,6 +806,7 @@ void zend_verify_namespace(void);
void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline);
ZEND_API void function_add_ref(zend_function *function);
+void zend_init_static_variables_map_ptr(zend_op_array *op_array);
#define INITIAL_OP_ARRAY_SIZE 64
@@ -798,15 +818,17 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type);
ZEND_API zend_op_array *compile_string(zend_string *source_string, const char *filename);
ZEND_API zend_op_array *compile_filename(int type, zval *filename);
ZEND_API zend_ast *zend_compile_string_to_ast(
- zend_string *code, struct _zend_arena **ast_arena, const char *filename);
+ zend_string *code, struct _zend_arena **ast_arena, zend_string *filename);
ZEND_API int zend_execute_scripts(int type, zval *retval, int file_count, ...);
ZEND_API int open_file_for_scanning(zend_file_handle *file_handle);
ZEND_API void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_size);
ZEND_API void destroy_op_array(zend_op_array *op_array);
+ZEND_API void zend_destroy_static_vars(zend_op_array *op_array);
ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle);
+ZEND_API void zend_cleanup_mutable_class_data(zend_class_entry *ce);
ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce);
ZEND_API void zend_cleanup_internal_classes(void);
-ZEND_API void zend_type_release(zend_type type, zend_bool persistent);
+ZEND_API void zend_type_release(zend_type type, bool persistent);
ZEND_API zend_string *zend_create_member_string(zend_string *class_name, zend_string *member_name);
@@ -840,30 +862,30 @@ static zend_always_inline const char *zend_get_unmangled_property_name(const zen
#define ZEND_FUNCTION_DTOR zend_function_dtor
#define ZEND_CLASS_DTOR destroy_zend_class
-typedef zend_bool (*zend_needs_live_range_cb)(zend_op_array *op_array, zend_op *opline);
+typedef bool (*zend_needs_live_range_cb)(zend_op_array *op_array, zend_op *opline);
ZEND_API void zend_recalc_live_ranges(
zend_op_array *op_array, zend_needs_live_range_cb needs_live_range);
ZEND_API void pass_two(zend_op_array *op_array);
-ZEND_API zend_bool zend_is_compiling(void);
+ZEND_API bool zend_is_compiling(void);
ZEND_API char *zend_make_compiled_string_description(const char *name);
-ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify_handlers);
+ZEND_API void zend_initialize_class_data(zend_class_entry *ce, bool nullify_handlers);
uint32_t zend_get_class_fetch_type(zend_string *name);
ZEND_API zend_uchar zend_get_call_op(const zend_op *init_op, zend_function *fbc);
ZEND_API bool zend_is_smart_branch(const zend_op *opline);
-typedef zend_bool (*zend_auto_global_callback)(zend_string *name);
+typedef bool (*zend_auto_global_callback)(zend_string *name);
typedef struct _zend_auto_global {
zend_string *name;
zend_auto_global_callback auto_global_callback;
- zend_bool jit;
- zend_bool armed;
+ bool jit;
+ bool armed;
} zend_auto_global;
-ZEND_API zend_result zend_register_auto_global(zend_string *name, zend_bool jit, zend_auto_global_callback auto_global_callback);
+ZEND_API zend_result zend_register_auto_global(zend_string *name, bool jit, zend_auto_global_callback auto_global_callback);
ZEND_API void zend_activate_auto_globals(void);
-ZEND_API zend_bool zend_is_auto_global(zend_string *name);
-ZEND_API zend_bool zend_is_auto_global_str(const char *name, size_t len);
+ZEND_API bool zend_is_auto_global(zend_string *name);
+ZEND_API bool zend_is_auto_global_str(const char *name, size_t len);
ZEND_API size_t zend_dirname(char *path, size_t len);
ZEND_API void zend_set_function_arg_flags(zend_function *func);
@@ -1134,6 +1156,6 @@ END_EXTERN_C()
/* The default value for CG(compiler_options) during eval() */
#define ZEND_COMPILE_DEFAULT_FOR_EVAL 0
-ZEND_API zend_bool zend_binary_op_produces_error(uint32_t opcode, zval *op1, zval *op2);
+ZEND_API bool zend_binary_op_produces_error(uint32_t opcode, zval *op1, zval *op2);
#endif /* ZEND_COMPILE_H */
diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c
index f289cc5d91..978c57ecd7 100644
--- a/Zend/zend_constants.c
+++ b/Zend/zend_constants.c
@@ -158,7 +158,7 @@ ZEND_API void zend_register_null_constant(const char *name, size_t name_len, int
zend_register_constant(&c);
}
-ZEND_API void zend_register_bool_constant(const char *name, size_t name_len, zend_bool bval, int flags, int module_number)
+ZEND_API void zend_register_bool_constant(const char *name, size_t name_len, bool bval, int flags, int module_number)
{
zend_constant c;
@@ -374,7 +374,7 @@ ZEND_API zval *zend_get_constant_ex(zend_string *cname, zend_class_entry *scope,
ce = zend_fetch_class(class_name, flags);
}
if (ce) {
- c = zend_hash_find_ptr(&ce->constants_table, constant_name);
+ c = zend_hash_find_ptr(CE_CONSTANTS_TABLE(ce), constant_name);
if (c == NULL) {
if ((flags & ZEND_FETCH_CLASS_SILENT) == 0) {
zend_throw_error(NULL, "Undefined constant %s::%s", ZSTR_VAL(class_name), ZSTR_VAL(constant_name));
@@ -482,13 +482,13 @@ ZEND_API zend_result zend_register_constant(zend_constant *c)
zend_string *lowercase_name = NULL;
zend_string *name;
zend_result ret = SUCCESS;
- zend_bool persistent = (ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT) != 0;
+ bool persistent = (ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT) != 0;
#if 0
printf("Registering constant for module %d\n", c->module_number);
#endif
- char *slash = strrchr(ZSTR_VAL(c->name), '\\');
+ const char *slash = strrchr(ZSTR_VAL(c->name), '\\');
if (slash) {
lowercase_name = zend_string_init(ZSTR_VAL(c->name), ZSTR_LEN(c->name), persistent);
zend_str_tolower(ZSTR_VAL(lowercase_name), slash - ZSTR_VAL(c->name));
diff --git a/Zend/zend_constants.h b/Zend/zend_constants.h
index 0a3c5a7377..0723514447 100644
--- a/Zend/zend_constants.h
+++ b/Zend/zend_constants.h
@@ -76,7 +76,7 @@ ZEND_API bool zend_verify_const_access(zend_class_constant *c, zend_class_entry
ZEND_API zval *zend_get_constant(zend_string *name);
ZEND_API zval *zend_get_constant_str(const char *name, size_t name_len);
ZEND_API zval *zend_get_constant_ex(zend_string *name, zend_class_entry *scope, uint32_t flags);
-ZEND_API void zend_register_bool_constant(const char *name, size_t name_len, zend_bool bval, int flags, int module_number);
+ZEND_API void zend_register_bool_constant(const char *name, size_t name_len, bool bval, int flags, int module_number);
ZEND_API void zend_register_null_constant(const char *name, size_t name_len, int flags, int module_number);
ZEND_API void zend_register_long_constant(const char *name, size_t name_len, zend_long lval, int flags, int module_number);
ZEND_API void zend_register_double_constant(const char *name, size_t name_len, double dval, int flags, int module_number);
diff --git a/Zend/zend_cpuinfo.c b/Zend/zend_cpuinfo.c
index 529ab529a3..bd4dcf298f 100644
--- a/Zend/zend_cpuinfo.c
+++ b/Zend/zend_cpuinfo.c
@@ -90,7 +90,7 @@ static unsigned get_xcr0_eax() {
# endif
}
-static zend_bool is_avx_supported() {
+static bool is_avx_supported() {
if (!(cpuinfo.ecx & ZEND_CPU_FEATURE_AVX)) {
/* No support for AVX */
return 0;
@@ -106,7 +106,7 @@ static zend_bool is_avx_supported() {
return 1;
}
#else
-static zend_bool is_avx_supported() {
+static bool is_avx_supported() {
return 0;
}
#endif
diff --git a/Zend/zend_default_classes.c b/Zend/zend_default_classes.c
index 63cdf66d58..c0fa6f5a67 100644
--- a/Zend/zend_default_classes.c
+++ b/Zend/zend_default_classes.c
@@ -26,6 +26,7 @@
#include "zend_closures.h"
#include "zend_generators.h"
#include "zend_weakrefs.h"
+#include "zend_enum.h"
ZEND_API void zend_register_default_classes(void)
{
@@ -36,4 +37,5 @@ ZEND_API void zend_register_default_classes(void)
zend_register_generator_ce();
zend_register_weakref_ce();
zend_register_attribute_ce();
+ zend_register_enum_ce();
}
diff --git a/Zend/zend_dtrace.c b/Zend/zend_dtrace.c
index 935421121e..cce810c177 100644
--- a/Zend/zend_dtrace.c
+++ b/Zend/zend_dtrace.c
@@ -44,9 +44,9 @@ static inline const char *dtrace_get_executed_filename(void)
ZEND_API zend_op_array *dtrace_compile_file(zend_file_handle *file_handle, int type)
{
zend_op_array *res;
- DTRACE_COMPILE_FILE_ENTRY(ZSTR_VAL(file_handle->opened_path), (char *)file_handle->filename);
+ DTRACE_COMPILE_FILE_ENTRY(ZSTR_VAL(file_handle->opened_path), ZSTR_VAL(file_handle->filename));
res = compile_file(file_handle, type);
- DTRACE_COMPILE_FILE_RETURN(ZSTR_VAL(file_handle->opened_path), (char *)file_handle->filename);
+ DTRACE_COMPILE_FILE_RETURN(ZSTR_VAL(file_handle->opened_path), ZSTR_VAL(file_handle->filename));
return res;
}
diff --git a/Zend/zend_enum.c b/Zend/zend_enum.c
new file mode 100644
index 0000000000..728da8af36
--- /dev/null
+++ b/Zend/zend_enum.c
@@ -0,0 +1,373 @@
+/*
+ +----------------------------------------------------------------------+
+ | Zend Engine |
+ +----------------------------------------------------------------------+
+ | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.00 of the Zend license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.zend.com/license/2_00.txt. |
+ | If you did not receive a copy of the Zend license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@zend.com so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Ilija Tovilo <ilutov@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+#include "zend.h"
+#include "zend_API.h"
+#include "zend_compile.h"
+#include "zend_enum_arginfo.h"
+#include "zend_interfaces.h"
+
+#define ZEND_ENUM_PROPERTY_ERROR() \
+ zend_throw_error(NULL, "Enum properties are immutable")
+
+#define ZEND_ENUM_DISALLOW_MAGIC_METHOD(propertyName, methodName) \
+ do { \
+ if (ce->propertyName) { \
+ zend_error_noreturn(E_COMPILE_ERROR, "Enum may not include %s", methodName); \
+ } \
+ } while (0);
+
+ZEND_API zend_class_entry *zend_ce_unit_enum;
+ZEND_API zend_class_entry *zend_ce_backed_enum;
+
+static zend_object_handlers enum_handlers;
+
+zend_object *zend_enum_new(zval *result, zend_class_entry *ce, zend_string *case_name, zval *backing_value_zv)
+{
+ zend_object *zobj = zend_objects_new(ce);
+ ZVAL_OBJ(result, zobj);
+
+ ZVAL_STR_COPY(OBJ_PROP_NUM(zobj, 0), case_name);
+ if (backing_value_zv != NULL) {
+ ZVAL_COPY(OBJ_PROP_NUM(zobj, 1), backing_value_zv);
+ }
+
+ zobj->handlers = &enum_handlers;
+
+ return zobj;
+}
+
+static void zend_verify_enum_properties(zend_class_entry *ce)
+{
+ zend_property_info *property_info;
+
+ ZEND_HASH_FOREACH_PTR(&ce->properties_info, property_info) {
+ if (zend_string_equals_literal(property_info->name, "name")) {
+ continue;
+ }
+ if (
+ ce->enum_backing_type != IS_UNDEF
+ && zend_string_equals_literal(property_info->name, "value")
+ ) {
+ continue;
+ }
+ // FIXME: File/line number for traits?
+ zend_error_noreturn(E_COMPILE_ERROR, "Enum \"%s\" may not include properties",
+ ZSTR_VAL(ce->name));
+ } ZEND_HASH_FOREACH_END();
+}
+
+static void zend_verify_enum_magic_methods(zend_class_entry *ce)
+{
+ // Only __get, __call and __invoke are allowed
+
+ ZEND_ENUM_DISALLOW_MAGIC_METHOD(constructor, "__construct");
+ ZEND_ENUM_DISALLOW_MAGIC_METHOD(destructor, "__destruct");
+ ZEND_ENUM_DISALLOW_MAGIC_METHOD(clone, "__clone");
+ ZEND_ENUM_DISALLOW_MAGIC_METHOD(__get, "__get");
+ ZEND_ENUM_DISALLOW_MAGIC_METHOD(__set, "__set");
+ ZEND_ENUM_DISALLOW_MAGIC_METHOD(__unset, "__unset");
+ ZEND_ENUM_DISALLOW_MAGIC_METHOD(__isset, "__isset");
+ ZEND_ENUM_DISALLOW_MAGIC_METHOD(__tostring, "__toString");
+ ZEND_ENUM_DISALLOW_MAGIC_METHOD(__debugInfo, "__debugInfo");
+ ZEND_ENUM_DISALLOW_MAGIC_METHOD(__serialize, "__serialize");
+ ZEND_ENUM_DISALLOW_MAGIC_METHOD(__unserialize, "__unserialize");
+
+ const char *forbidden_methods[] = {
+ "__sleep",
+ "__wakeup",
+ "__set_state",
+ };
+
+ uint32_t forbidden_methods_length = sizeof(forbidden_methods) / sizeof(forbidden_methods[0]);
+ for (uint32_t i = 0; i < forbidden_methods_length; ++i) {
+ const char *forbidden_method = forbidden_methods[i];
+
+ if (zend_hash_str_exists(&ce->function_table, forbidden_method, strlen(forbidden_method))) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Enum may not include magic method %s", forbidden_method);
+ }
+ }
+}
+
+static void zend_verify_enum_interfaces(zend_class_entry *ce)
+{
+ if (zend_class_implements_interface(ce, zend_ce_serializable)) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Enums may not implement the Serializable interface");
+ }
+}
+
+void zend_verify_enum(zend_class_entry *ce)
+{
+ zend_verify_enum_properties(ce);
+ zend_verify_enum_magic_methods(ce);
+ zend_verify_enum_interfaces(ce);
+}
+
+static zval *zend_enum_read_property(zend_object *zobj, zend_string *name, int type, void **cache_slot, zval *rv) /* {{{ */
+{
+ if (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) {
+ zend_throw_error(NULL, "Cannot acquire reference to property %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name));
+ return &EG(uninitialized_zval);
+ }
+
+ return zend_std_read_property(zobj, name, type, cache_slot, rv);
+}
+
+static ZEND_COLD zval *zend_enum_write_property(zend_object *object, zend_string *member, zval *value, void **cache_slot)
+{
+ ZEND_ENUM_PROPERTY_ERROR();
+ return &EG(uninitialized_zval);
+}
+
+static ZEND_COLD void zend_enum_unset_property(zend_object *object, zend_string *member, void **cache_slot)
+{
+ ZEND_ENUM_PROPERTY_ERROR();
+}
+
+static zval *zend_enum_get_property_ptr_ptr(zend_object *zobj, zend_string *name, int type, void **cache_slot)
+{
+ return NULL;
+}
+
+static int zend_implement_unit_enum(zend_class_entry *interface, zend_class_entry *class_type)
+{
+ if (class_type->ce_flags & ZEND_ACC_ENUM) {
+ return SUCCESS;
+ }
+
+ zend_error_noreturn(E_ERROR, "Non-enum class %s cannot implement interface %s",
+ ZSTR_VAL(class_type->name),
+ ZSTR_VAL(interface->name));
+
+ return FAILURE;
+}
+
+static int zend_implement_backed_enum(zend_class_entry *interface, zend_class_entry *class_type)
+{
+ if (!(class_type->ce_flags & ZEND_ACC_ENUM)) {
+ zend_error_noreturn(E_ERROR, "Non-enum class %s cannot implement interface %s",
+ ZSTR_VAL(class_type->name),
+ ZSTR_VAL(interface->name));
+ return FAILURE;
+ }
+
+ if (class_type->enum_backing_type == IS_UNDEF) {
+ zend_error_noreturn(E_ERROR, "Non-backed enum %s cannot implement interface %s",
+ ZSTR_VAL(class_type->name),
+ ZSTR_VAL(interface->name));
+ return FAILURE;
+ }
+
+ return SUCCESS;
+}
+
+void zend_register_enum_ce(void)
+{
+ zend_ce_unit_enum = register_class_UnitEnum();
+ zend_ce_unit_enum->interface_gets_implemented = zend_implement_unit_enum;
+
+ zend_ce_backed_enum = register_class_BackedEnum(zend_ce_unit_enum);
+ zend_ce_backed_enum->interface_gets_implemented = zend_implement_backed_enum;
+
+ memcpy(&enum_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ enum_handlers.read_property = zend_enum_read_property;
+ enum_handlers.write_property = zend_enum_write_property;
+ enum_handlers.unset_property = zend_enum_unset_property;
+ enum_handlers.get_property_ptr_ptr = zend_enum_get_property_ptr_ptr;
+ enum_handlers.clone_obj = NULL;
+ enum_handlers.compare = zend_objects_not_comparable;
+}
+
+void zend_enum_add_interfaces(zend_class_entry *ce)
+{
+ uint32_t num_interfaces_before = ce->num_interfaces;
+
+ ce->num_interfaces++;
+ if (ce->enum_backing_type != IS_UNDEF) {
+ ce->num_interfaces++;
+ }
+
+ ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_RESOLVED_INTERFACES));
+
+ ce->interface_names = erealloc(ce->interface_names, sizeof(zend_class_name) * ce->num_interfaces);
+
+ ce->interface_names[num_interfaces_before].name = zend_string_copy(zend_ce_unit_enum->name);
+ ce->interface_names[num_interfaces_before].lc_name = zend_string_init("unitenum", sizeof("unitenum") - 1, 0);
+
+ if (ce->enum_backing_type != IS_UNDEF) {
+ ce->interface_names[num_interfaces_before + 1].name = zend_string_copy(zend_ce_backed_enum->name);
+ ce->interface_names[num_interfaces_before + 1].lc_name = zend_string_init("backedenum", sizeof("backedenum") - 1, 0);
+ }
+}
+
+static ZEND_NAMED_FUNCTION(zend_enum_cases_func)
+{
+ zend_class_entry *ce = execute_data->func->common.scope;
+ zend_class_constant *c;
+
+ ZEND_PARSE_PARAMETERS_NONE();
+
+ array_init(return_value);
+
+ ZEND_HASH_FOREACH_PTR(CE_CONSTANTS_TABLE(ce), c) {
+ if (!(Z_ACCESS_FLAGS(c->value) & ZEND_CLASS_CONST_IS_CASE)) {
+ continue;
+ }
+ zval *zv = &c->value;
+ if (Z_TYPE_P(zv) == IS_CONSTANT_AST) {
+ if (zval_update_constant_ex(zv, c->ce) == FAILURE) {
+ RETURN_THROWS();
+ }
+ }
+ Z_ADDREF_P(zv);
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), zv);
+ } ZEND_HASH_FOREACH_END();
+}
+
+static void zend_enum_from_base(INTERNAL_FUNCTION_PARAMETERS, bool try)
+{
+ zend_class_entry *ce = execute_data->func->common.scope;
+ zend_string *string_key;
+ zend_long long_key;
+
+ zval *case_name_zv;
+ if (ce->enum_backing_type == IS_LONG) {
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_LONG(long_key)
+ ZEND_PARSE_PARAMETERS_END();
+
+ case_name_zv = zend_hash_index_find(ce->backed_enum_table, long_key);
+ } else {
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_STR(string_key)
+ ZEND_PARSE_PARAMETERS_END();
+
+ ZEND_ASSERT(ce->enum_backing_type == IS_STRING);
+ case_name_zv = zend_hash_find(ce->backed_enum_table, string_key);
+ }
+
+ if (case_name_zv == NULL) {
+ if (try) {
+ RETURN_NULL();
+ }
+
+ if (ce->enum_backing_type == IS_LONG) {
+ zend_value_error(ZEND_LONG_FMT " is not a valid backing value for enum \"%s\"", long_key, ZSTR_VAL(ce->name));
+ } else {
+ ZEND_ASSERT(ce->enum_backing_type == IS_STRING);
+ zend_value_error("\"%s\" is not a valid backing value for enum \"%s\"", ZSTR_VAL(string_key), ZSTR_VAL(ce->name));
+ }
+ RETURN_THROWS();
+ }
+
+ // TODO: We might want to store pointers to constants in backed_enum_table instead of names,
+ // to make this lookup more efficient.
+ ZEND_ASSERT(Z_TYPE_P(case_name_zv) == IS_STRING);
+ zend_class_constant *c = zend_hash_find_ptr(CE_CONSTANTS_TABLE(ce), Z_STR_P(case_name_zv));
+ ZEND_ASSERT(c != NULL);
+ zval *case_zv = &c->value;
+ if (Z_TYPE_P(case_zv) == IS_CONSTANT_AST) {
+ if (zval_update_constant_ex(case_zv, c->ce) == FAILURE) {
+ RETURN_THROWS();
+ }
+ }
+
+ ZVAL_COPY(return_value, case_zv);
+}
+
+static ZEND_NAMED_FUNCTION(zend_enum_from_func)
+{
+ zend_enum_from_base(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+
+static ZEND_NAMED_FUNCTION(zend_enum_try_from_func)
+{
+ zend_enum_from_base(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+
+void zend_enum_register_funcs(zend_class_entry *ce)
+{
+ const uint32_t fn_flags =
+ ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_ARENA_ALLOCATED;
+ zend_internal_function *cases_function =
+ zend_arena_alloc(&CG(arena), sizeof(zend_internal_function));
+ memset(cases_function, 0, sizeof(zend_internal_function));
+ cases_function->type = ZEND_INTERNAL_FUNCTION;
+ cases_function->module = EG(current_module);
+ cases_function->handler = zend_enum_cases_func;
+ cases_function->function_name = ZSTR_KNOWN(ZEND_STR_CASES);
+ cases_function->scope = ce;
+ cases_function->fn_flags = fn_flags;
+ cases_function->arg_info = (zend_internal_arg_info *) (arginfo_class_UnitEnum_cases + 1);
+ if (!zend_hash_add_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_CASES), cases_function)) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s::cases()", ZSTR_VAL(ce->name));
+ }
+
+ if (ce->enum_backing_type != IS_UNDEF) {
+ zend_internal_function *from_function =
+ zend_arena_alloc(&CG(arena), sizeof(zend_internal_function));
+ memset(from_function, 0, sizeof(zend_internal_function));
+ from_function->type = ZEND_INTERNAL_FUNCTION;
+ from_function->module = EG(current_module);
+ from_function->handler = zend_enum_from_func;
+ from_function->function_name = ZSTR_KNOWN(ZEND_STR_FROM);
+ from_function->scope = ce;
+ from_function->fn_flags = fn_flags;
+ from_function->num_args = 1;
+ from_function->required_num_args = 1;
+ from_function->arg_info = (zend_internal_arg_info *) (arginfo_class_BackedEnum_from + 1);
+ if (!zend_hash_add_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_FROM), from_function)) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Cannot redeclare %s::from()", ZSTR_VAL(ce->name));
+ }
+
+ zend_internal_function *try_from_function =
+ zend_arena_alloc(&CG(arena), sizeof(zend_internal_function));
+ memset(try_from_function, 0, sizeof(zend_internal_function));
+ try_from_function->type = ZEND_INTERNAL_FUNCTION;
+ try_from_function->module = EG(current_module);
+ try_from_function->handler = zend_enum_try_from_func;
+ try_from_function->function_name = ZSTR_KNOWN(ZEND_STR_TRYFROM);
+ try_from_function->scope = ce;
+ try_from_function->fn_flags = fn_flags;
+ try_from_function->num_args = 1;
+ try_from_function->required_num_args = 1;
+ try_from_function->arg_info = (zend_internal_arg_info *) (arginfo_class_BackedEnum_tryFrom + 1);
+ if (!zend_hash_add_ptr(
+ &ce->function_table, ZSTR_KNOWN(ZEND_STR_TRYFROM_LOWERCASE), try_from_function)) {
+ zend_error_noreturn(E_COMPILE_ERROR,
+ "Cannot redeclare %s::tryFrom()", ZSTR_VAL(ce->name));
+ }
+ }
+}
+
+void zend_enum_register_props(zend_class_entry *ce)
+{
+ zval name_default_value;
+ ZVAL_UNDEF(&name_default_value);
+ zend_type name_type = ZEND_TYPE_INIT_CODE(IS_STRING, 0, 0);
+ zend_declare_typed_property(ce, ZSTR_KNOWN(ZEND_STR_NAME), &name_default_value, ZEND_ACC_PUBLIC, NULL, name_type);
+
+ if (ce->enum_backing_type != IS_UNDEF) {
+ zval value_default_value;
+ ZVAL_UNDEF(&value_default_value);
+ zend_type value_type = ZEND_TYPE_INIT_CODE(ce->enum_backing_type, 0, 0);
+ zend_declare_typed_property(ce, ZSTR_KNOWN(ZEND_STR_VALUE), &value_default_value, ZEND_ACC_PUBLIC, NULL, value_type);
+ }
+}
diff --git a/Zend/zend_enum.h b/Zend/zend_enum.h
new file mode 100644
index 0000000000..c0abe7311f
--- /dev/null
+++ b/Zend/zend_enum.h
@@ -0,0 +1,52 @@
+/*
+ +----------------------------------------------------------------------+
+ | Zend Engine |
+ +----------------------------------------------------------------------+
+ | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.00 of the Zend license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.zend.com/license/2_00.txt. |
+ | If you did not receive a copy of the Zend license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@zend.com so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Ilija Tovilo <ilutov@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+#ifndef ZEND_ENUM_H
+#define ZEND_ENUM_H
+
+#include "zend.h"
+#include "zend_types.h"
+
+BEGIN_EXTERN_C()
+
+extern ZEND_API zend_class_entry *zend_ce_unit_enum;
+extern ZEND_API zend_class_entry *zend_ce_backed_enum;
+
+void zend_register_enum_ce(void);
+void zend_enum_add_interfaces(zend_class_entry *ce);
+zend_object *zend_enum_new(zval *result, zend_class_entry *ce, zend_string *case_name, zval *backing_value_zv);
+void zend_verify_enum(zend_class_entry *ce);
+void zend_enum_register_funcs(zend_class_entry *ce);
+void zend_enum_register_props(zend_class_entry *ce);
+
+static zend_always_inline zval *zend_enum_fetch_case_name(zend_object *zobj)
+{
+ ZEND_ASSERT(zobj->ce->ce_flags & ZEND_ACC_ENUM);
+ return OBJ_PROP_NUM(zobj, 0);
+}
+
+static zend_always_inline zval *zend_enum_fetch_case_value(zend_object *zobj)
+{
+ ZEND_ASSERT(zobj->ce->ce_flags & ZEND_ACC_ENUM);
+ ZEND_ASSERT(zobj->ce->enum_backing_type != IS_UNDEF);
+ return OBJ_PROP_NUM(zobj, 1);
+}
+
+END_EXTERN_C()
+
+#endif /* ZEND_ENUM_H */
diff --git a/Zend/zend_enum.stub.php b/Zend/zend_enum.stub.php
new file mode 100644
index 0000000000..727514a7bd
--- /dev/null
+++ b/Zend/zend_enum.stub.php
@@ -0,0 +1,15 @@
+<?php
+
+/** @generate-class-entries */
+
+interface UnitEnum
+{
+ public static function cases(): array;
+}
+
+interface BackedEnum extends UnitEnum
+{
+ public static function from(int|string $value): static;
+
+ public static function tryFrom(int|string $value): ?static;
+}
diff --git a/Zend/zend_enum_arginfo.h b/Zend/zend_enum_arginfo.h
new file mode 100644
index 0000000000..a1b53cfde4
--- /dev/null
+++ b/Zend/zend_enum_arginfo.h
@@ -0,0 +1,49 @@
+/* This is a generated file, edit the .stub.php file instead.
+ * Stub hash: 7092f1d4ba651f077cff37050899f090f00abf22 */
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_UnitEnum_cases, 0, 0, IS_ARRAY, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_BackedEnum_from, 0, 1, IS_STATIC, 0)
+ ZEND_ARG_TYPE_MASK(0, value, MAY_BE_LONG|MAY_BE_STRING, NULL)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_BackedEnum_tryFrom, 0, 1, IS_STATIC, 1)
+ ZEND_ARG_TYPE_MASK(0, value, MAY_BE_LONG|MAY_BE_STRING, NULL)
+ZEND_END_ARG_INFO()
+
+
+
+
+static const zend_function_entry class_UnitEnum_methods[] = {
+ ZEND_ABSTRACT_ME_WITH_FLAGS(UnitEnum, cases, arginfo_class_UnitEnum_cases, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_ABSTRACT)
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_BackedEnum_methods[] = {
+ ZEND_ABSTRACT_ME_WITH_FLAGS(BackedEnum, from, arginfo_class_BackedEnum_from, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_ABSTRACT)
+ ZEND_ABSTRACT_ME_WITH_FLAGS(BackedEnum, tryFrom, arginfo_class_BackedEnum_tryFrom, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_ABSTRACT)
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class_UnitEnum(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "UnitEnum", class_UnitEnum_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_BackedEnum(zend_class_entry *class_entry_UnitEnum)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "BackedEnum", class_BackedEnum_methods);
+ class_entry = zend_register_internal_interface(&ce);
+ zend_class_implements(class_entry, 1, class_entry_UnitEnum);
+
+ return class_entry;
+}
diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c
index b52b1ab113..af71ac7a65 100644
--- a/Zend/zend_exceptions.c
+++ b/Zend/zend_exceptions.c
@@ -53,14 +53,21 @@ static zend_object_handlers default_exception_handlers;
/* {{{ zend_implement_throwable */
static int zend_implement_throwable(zend_class_entry *interface, zend_class_entry *class_type)
{
- if (instanceof_function(class_type, zend_ce_exception) || instanceof_function(class_type, zend_ce_error)) {
+ /* zend_ce_exception and zend_ce_error may not be initialized yet when this is caleld (e.g when
+ * implementing Throwable for Exception itself). Perform a manual inheritance check. */
+ zend_class_entry *root = class_type;
+ while (root->parent) {
+ root = root->parent;
+ }
+ if (zend_string_equals_literal(root->name, "Exception")
+ || zend_string_equals_literal(root->name, "Error")) {
return SUCCESS;
}
- zend_error_noreturn(E_ERROR, "Class %s cannot implement interface %s, extend %s or %s instead",
+
+ zend_error_noreturn(E_ERROR,
+ "Class %s cannot implement interface %s, extend Exception or Error instead",
ZSTR_VAL(class_type->name),
- ZSTR_VAL(interface->name),
- ZSTR_VAL(zend_ce_exception->name),
- ZSTR_VAL(zend_ce_error->name));
+ ZSTR_VAL(interface->name));
return FAILURE;
}
/* }}} */
@@ -93,7 +100,7 @@ void zend_exception_set_previous(zend_object *exception, zend_object *add_previo
}
ZEND_ASSERT(instanceof_function(add_previous->ce, zend_ce_throwable)
- && "Previous execption must implement Throwable");
+ && "Previous exception must implement Throwable");
ZVAL_OBJ(&pv, add_previous);
ZVAL_OBJ(&zv, exception);
@@ -144,7 +151,7 @@ void zend_exception_restore(void) /* {{{ */
}
/* }}} */
-static zend_always_inline zend_bool is_handle_exception_set() {
+static zend_always_inline bool is_handle_exception_set() {
zend_execute_data *execute_data = EG(current_execute_data);
return !execute_data->func
|| !ZEND_USER_CODE(execute_data->func->common.type)
@@ -339,7 +346,7 @@ ZEND_METHOD(ErrorException, __construct)
{
zend_string *message = NULL, *filename = NULL;
zend_long code = 0, severity = E_ERROR, lineno;
- zend_bool lineno_is_null = 1;
+ bool lineno_is_null = 1;
zval tmp, *object, *previous = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|SllS!l!O!", &message, &code, &severity, &filename, &lineno, &lineno_is_null, &previous, zend_ce_throwable) == FAILURE) {
@@ -478,7 +485,7 @@ ZEND_METHOD(ErrorException, getSeverity)
static void _build_trace_args(zval *arg, smart_str *str) /* {{{ */
{
/* the trivial way would be to do
- * convert_to_string_ex(arg);
+ * convert_to_string(arg);
* append it and kill the now tmp arg.
* but that could cause some E_NOTICE and also damn long lines.
*/
@@ -740,87 +747,50 @@ ZEND_METHOD(Exception, __toString)
}
/* }}} */
-static void declare_exception_properties(zend_class_entry *ce)
-{
- zval val;
-
- zend_declare_property_string(ce, "message", sizeof("message")-1, "", ZEND_ACC_PROTECTED);
- zend_declare_property_string(ce, "string", sizeof("string")-1, "", ZEND_ACC_PRIVATE);
- zend_declare_property_long(ce, "code", sizeof("code")-1, 0, ZEND_ACC_PROTECTED);
- zend_declare_property_null(ce, "file", sizeof("file")-1, ZEND_ACC_PROTECTED);
- zend_declare_property_null(ce, "line", sizeof("line")-1, ZEND_ACC_PROTECTED);
-
- ZVAL_EMPTY_ARRAY(&val);
- zend_declare_typed_property(
- ce, ZSTR_KNOWN(ZEND_STR_TRACE), &val, ZEND_ACC_PRIVATE, NULL,
- (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
-
- ZVAL_NULL(&val);
- zend_declare_typed_property(
- ce, ZSTR_KNOWN(ZEND_STR_PREVIOUS), &val, ZEND_ACC_PRIVATE, NULL,
- (zend_type) ZEND_TYPE_INIT_CE(zend_ce_throwable, /* allow_null */ 1, 0));
-}
-
void zend_register_default_exception(void) /* {{{ */
{
- zend_class_entry ce;
-
- REGISTER_MAGIC_INTERFACE(throwable, Throwable);
- zend_class_implements(zend_ce_throwable, 1, zend_ce_stringable);
+ zend_ce_throwable = register_class_Throwable(zend_ce_stringable);
+ zend_ce_throwable->interface_gets_implemented = zend_implement_throwable;
memcpy(&default_exception_handlers, &std_object_handlers, sizeof(zend_object_handlers));
default_exception_handlers.clone_obj = NULL;
- INIT_CLASS_ENTRY(ce, "Exception", class_Exception_methods);
- zend_ce_exception = zend_register_internal_class_ex(&ce, NULL);
+ zend_ce_exception = register_class_Exception(zend_ce_throwable);
zend_ce_exception->create_object = zend_default_exception_new;
- zend_class_implements(zend_ce_exception, 1, zend_ce_throwable);
- declare_exception_properties(zend_ce_exception);
- INIT_CLASS_ENTRY(ce, "ErrorException", class_ErrorException_methods);
- zend_ce_error_exception = zend_register_internal_class_ex(&ce, zend_ce_exception);
+ zend_ce_error_exception = register_class_ErrorException(zend_ce_exception);
zend_ce_error_exception->create_object = zend_error_exception_new;
+ /* Declared manually because it uses constant E_ERROR. */
zend_declare_property_long(zend_ce_error_exception, "severity", sizeof("severity")-1, E_ERROR, ZEND_ACC_PROTECTED);
- INIT_CLASS_ENTRY(ce, "Error", class_Error_methods);
- zend_ce_error = zend_register_internal_class_ex(&ce, NULL);
+ zend_ce_error = register_class_Error(zend_ce_throwable);
zend_ce_error->create_object = zend_default_exception_new;
- zend_class_implements(zend_ce_error, 1, zend_ce_throwable);
- declare_exception_properties(zend_ce_error);
- INIT_CLASS_ENTRY(ce, "CompileError", class_CompileError_methods);
- zend_ce_compile_error = zend_register_internal_class_ex(&ce, zend_ce_error);
+ zend_ce_compile_error = register_class_CompileError(zend_ce_error);
zend_ce_compile_error->create_object = zend_default_exception_new;
- INIT_CLASS_ENTRY(ce, "ParseError", class_ParseError_methods);
- zend_ce_parse_error = zend_register_internal_class_ex(&ce, zend_ce_compile_error);
+ zend_ce_parse_error = register_class_ParseError(zend_ce_compile_error);
zend_ce_parse_error->create_object = zend_default_exception_new;
- INIT_CLASS_ENTRY(ce, "TypeError", class_TypeError_methods);
- zend_ce_type_error = zend_register_internal_class_ex(&ce, zend_ce_error);
+ zend_ce_type_error = register_class_TypeError(zend_ce_error);
zend_ce_type_error->create_object = zend_default_exception_new;
- INIT_CLASS_ENTRY(ce, "ArgumentCountError", class_ArgumentCountError_methods);
- zend_ce_argument_count_error = zend_register_internal_class_ex(&ce, zend_ce_type_error);
+ zend_ce_argument_count_error = register_class_ArgumentCountError(zend_ce_type_error);
zend_ce_argument_count_error->create_object = zend_default_exception_new;
- INIT_CLASS_ENTRY(ce, "ValueError", class_ValueError_methods);
- zend_ce_value_error = zend_register_internal_class_ex(&ce, zend_ce_error);
+ zend_ce_value_error = register_class_ValueError(zend_ce_error);
zend_ce_value_error->create_object = zend_default_exception_new;
- INIT_CLASS_ENTRY(ce, "ArithmeticError", class_ArithmeticError_methods);
- zend_ce_arithmetic_error = zend_register_internal_class_ex(&ce, zend_ce_error);
+ zend_ce_arithmetic_error = register_class_ArithmeticError(zend_ce_error);
zend_ce_arithmetic_error->create_object = zend_default_exception_new;
- INIT_CLASS_ENTRY(ce, "DivisionByZeroError", class_DivisionByZeroError_methods);
- zend_ce_division_by_zero_error = zend_register_internal_class_ex(&ce, zend_ce_arithmetic_error);
+ zend_ce_division_by_zero_error = register_class_DivisionByZeroError(zend_ce_arithmetic_error);
zend_ce_division_by_zero_error->create_object = zend_default_exception_new;
- INIT_CLASS_ENTRY(zend_ce_unwind_exit, "UnwindExit", NULL);
-
- INIT_CLASS_ENTRY(ce, "UnhandledMatchError", NULL);
- zend_ce_unhandled_match_error = zend_register_internal_class_ex(&ce, zend_ce_error);
+ zend_ce_unhandled_match_error = register_class_UnhandledMatchError(zend_ce_error);
zend_ce_unhandled_match_error->create_object = zend_default_exception_new;
+
+ INIT_CLASS_ENTRY(zend_ce_unwind_exit, "UnwindExit", NULL);
}
/* }}} */
@@ -1017,7 +987,7 @@ ZEND_API ZEND_COLD void zend_throw_unwind_exit(void)
EG(current_execute_data)->opline = EG(exception_op);
}
-ZEND_API zend_bool zend_is_unwind_exit(zend_object *ex)
+ZEND_API bool zend_is_unwind_exit(zend_object *ex)
{
return ex->ce == &zend_ce_unwind_exit;
}
diff --git a/Zend/zend_exceptions.h b/Zend/zend_exceptions.h
index 9d0c18a6da..74724c2424 100644
--- a/Zend/zend_exceptions.h
+++ b/Zend/zend_exceptions.h
@@ -70,7 +70,7 @@ extern ZEND_API void (*zend_throw_exception_hook)(zend_object *ex);
ZEND_API ZEND_COLD zend_result zend_exception_error(zend_object *exception, int severity);
ZEND_API ZEND_COLD void zend_throw_unwind_exit(void);
-ZEND_API zend_bool zend_is_unwind_exit(zend_object *ex);
+ZEND_API bool zend_is_unwind_exit(zend_object *ex);
#include "zend_globals.h"
diff --git a/Zend/zend_exceptions.stub.php b/Zend/zend_exceptions.stub.php
index 3df58543ed..5f6a3a53e4 100644
--- a/Zend/zend_exceptions.stub.php
+++ b/Zend/zend_exceptions.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
interface Throwable extends Stringable
{
@@ -22,6 +22,19 @@ interface Throwable extends Stringable
class Exception implements Throwable
{
+ /** @var string */
+ protected $message = "";
+ /** @var string */
+ private $string = "";
+ /** @var int */
+ protected $code = 0;
+ /** @var string|null */
+ protected $file = null;
+ /** @var int|null */
+ protected $line = null;
+ private array $trace = [];
+ private ?Throwable $previous = null;
+
final private function __clone(): void {}
public function __construct(string $message = "", int $code = 0, ?Throwable $previous = null) {}
@@ -49,13 +62,36 @@ class Exception implements Throwable
class ErrorException extends Exception
{
- public function __construct(string $message = "", int $code = 0, int $severity = E_ERROR, ?string $filename = null, ?int $line = null, ?Throwable $previous = null) {}
+ /** @var int */
+ protected $severity = E_ERROR;
+
+ public function __construct(
+ string $message = "",
+ int $code = 0,
+ int $severity = E_ERROR,
+ ?string $filename = null,
+ ?int $line = null,
+ ?Throwable $previous = null
+ ) {}
final public function getSeverity(): int {}
}
class Error implements Throwable
{
+ /** @var string */
+ protected $message = "";
+ /** @var string */
+ private $string = "";
+ /** @var int */
+ protected $code = 0;
+ /** @var string|null */
+ protected $file = null;
+ /** @var int|null */
+ protected $line = null;
+ private array $trace = [];
+ private ?Throwable $previous = null;
+
/** @implementation-alias Exception::__clone */
final private function __clone(): void {}
diff --git a/Zend/zend_exceptions_arginfo.h b/Zend/zend_exceptions_arginfo.h
index f46ac083dd..b1e4844717 100644
--- a/Zend/zend_exceptions_arginfo.h
+++ b/Zend/zend_exceptions_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 2fa61163fb7db8d87b14f9cf9a42c3cd8093f2a6 */
+ * Stub hash: f322ba2ed3e636b6e99400edfbff98102b7e3d06 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Throwable_getMessage, 0, 0, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -185,3 +185,212 @@ static const zend_function_entry class_DivisionByZeroError_methods[] = {
static const zend_function_entry class_UnhandledMatchError_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Throwable(zend_class_entry *class_entry_Stringable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Throwable", class_Throwable_methods);
+ class_entry = zend_register_internal_interface(&ce);
+ zend_class_implements(class_entry, 1, class_entry_Stringable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_Exception(zend_class_entry *class_entry_Throwable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Exception", class_Exception_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Throwable);
+
+ zval property_message_default_value;
+ ZVAL_EMPTY_STRING(&property_message_default_value);
+ zend_string *property_message_name = zend_string_init("message", sizeof("message") - 1, 1);
+ zend_declare_property_ex(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PROTECTED, NULL);
+ zend_string_release(property_message_name);
+
+ zval property_string_default_value;
+ ZVAL_EMPTY_STRING(&property_string_default_value);
+ zend_string *property_string_name = zend_string_init("string", sizeof("string") - 1, 1);
+ zend_declare_property_ex(class_entry, property_string_name, &property_string_default_value, ZEND_ACC_PRIVATE, NULL);
+ zend_string_release(property_string_name);
+
+ zval property_code_default_value;
+ ZVAL_LONG(&property_code_default_value, 0);
+ zend_string *property_code_name = zend_string_init("code", sizeof("code") - 1, 1);
+ zend_declare_property_ex(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PROTECTED, NULL);
+ zend_string_release(property_code_name);
+
+ zval property_file_default_value;
+ ZVAL_NULL(&property_file_default_value);
+ zend_string *property_file_name = zend_string_init("file", sizeof("file") - 1, 1);
+ zend_declare_property_ex(class_entry, property_file_name, &property_file_default_value, ZEND_ACC_PROTECTED, NULL);
+ zend_string_release(property_file_name);
+
+ zval property_line_default_value;
+ ZVAL_NULL(&property_line_default_value);
+ zend_string *property_line_name = zend_string_init("line", sizeof("line") - 1, 1);
+ zend_declare_property_ex(class_entry, property_line_name, &property_line_default_value, ZEND_ACC_PROTECTED, NULL);
+ zend_string_release(property_line_name);
+
+ zval property_trace_default_value;
+ ZVAL_EMPTY_ARRAY(&property_trace_default_value);
+ zend_string *property_trace_name = zend_string_init("trace", sizeof("trace") - 1, 1);
+ zend_declare_typed_property(class_entry, property_trace_name, &property_trace_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
+ zend_string_release(property_trace_name);
+
+ zend_string *property_previous_class_Throwable = zend_string_init("Throwable", sizeof("Throwable")-1, 1);
+ zval property_previous_default_value;
+ ZVAL_NULL(&property_previous_default_value);
+ zend_string *property_previous_name = zend_string_init("previous", sizeof("previous") - 1, 1);
+ zend_declare_typed_property(class_entry, property_previous_name, &property_previous_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previous_class_Throwable, 0, MAY_BE_NULL));
+ zend_string_release(property_previous_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ErrorException(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ErrorException", class_ErrorException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_Error(zend_class_entry *class_entry_Throwable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Error", class_Error_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Throwable);
+
+ zval property_message_default_value;
+ ZVAL_EMPTY_STRING(&property_message_default_value);
+ zend_string *property_message_name = zend_string_init("message", sizeof("message") - 1, 1);
+ zend_declare_property_ex(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PROTECTED, NULL);
+ zend_string_release(property_message_name);
+
+ zval property_string_default_value;
+ ZVAL_EMPTY_STRING(&property_string_default_value);
+ zend_string *property_string_name = zend_string_init("string", sizeof("string") - 1, 1);
+ zend_declare_property_ex(class_entry, property_string_name, &property_string_default_value, ZEND_ACC_PRIVATE, NULL);
+ zend_string_release(property_string_name);
+
+ zval property_code_default_value;
+ ZVAL_LONG(&property_code_default_value, 0);
+ zend_string *property_code_name = zend_string_init("code", sizeof("code") - 1, 1);
+ zend_declare_property_ex(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PROTECTED, NULL);
+ zend_string_release(property_code_name);
+
+ zval property_file_default_value;
+ ZVAL_NULL(&property_file_default_value);
+ zend_string *property_file_name = zend_string_init("file", sizeof("file") - 1, 1);
+ zend_declare_property_ex(class_entry, property_file_name, &property_file_default_value, ZEND_ACC_PROTECTED, NULL);
+ zend_string_release(property_file_name);
+
+ zval property_line_default_value;
+ ZVAL_NULL(&property_line_default_value);
+ zend_string *property_line_name = zend_string_init("line", sizeof("line") - 1, 1);
+ zend_declare_property_ex(class_entry, property_line_name, &property_line_default_value, ZEND_ACC_PROTECTED, NULL);
+ zend_string_release(property_line_name);
+
+ zval property_trace_default_value;
+ ZVAL_EMPTY_ARRAY(&property_trace_default_value);
+ zend_string *property_trace_name = zend_string_init("trace", sizeof("trace") - 1, 1);
+ zend_declare_typed_property(class_entry, property_trace_name, &property_trace_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
+ zend_string_release(property_trace_name);
+
+ zend_string *property_previous_class_Throwable = zend_string_init("Throwable", sizeof("Throwable")-1, 1);
+ zval property_previous_default_value;
+ ZVAL_NULL(&property_previous_default_value);
+ zend_string *property_previous_name = zend_string_init("previous", sizeof("previous") - 1, 1);
+ zend_declare_typed_property(class_entry, property_previous_name, &property_previous_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previous_class_Throwable, 0, MAY_BE_NULL));
+ zend_string_release(property_previous_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_CompileError(zend_class_entry *class_entry_Error)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "CompileError", class_CompileError_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ParseError(zend_class_entry *class_entry_CompileError)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ParseError", class_ParseError_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_CompileError);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_TypeError(zend_class_entry *class_entry_Error)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "TypeError", class_TypeError_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ArgumentCountError(zend_class_entry *class_entry_TypeError)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ArgumentCountError", class_ArgumentCountError_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_TypeError);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ValueError(zend_class_entry *class_entry_Error)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ValueError", class_ValueError_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ArithmeticError(zend_class_entry *class_entry_Error)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ArithmeticError", class_ArithmeticError_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DivisionByZeroError(zend_class_entry *class_entry_ArithmeticError)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DivisionByZeroError", class_DivisionByZeroError_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_ArithmeticError);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_UnhandledMatchError(zend_class_entry *class_entry_Error)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "UnhandledMatchError", class_UnhandledMatchError_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
+
+ return class_entry;
+}
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 69b0fb5242..f34e1930e2 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -716,12 +716,12 @@ ZEND_API ZEND_COLD void zend_verify_arg_error(
zend_string_release(need_msg);
}
-static zend_bool zend_verify_weak_scalar_type_hint(uint32_t type_mask, zval *arg)
+static bool zend_verify_weak_scalar_type_hint(uint32_t type_mask, zval *arg)
{
zend_long lval;
double dval;
zend_string *str;
- zend_bool bval;
+ bool bval;
/* Type preference order: int -> float -> string -> bool */
if (type_mask & MAY_BE_LONG) {
@@ -739,22 +739,22 @@ static zend_bool zend_verify_weak_scalar_type_hint(uint32_t type_mask, zval *arg
ZVAL_DOUBLE(arg, dval);
return 1;
}
- } else if (zend_parse_arg_long_weak(arg, &lval)) {
+ } else if (zend_parse_arg_long_weak(arg, &lval, 0)) {
zval_ptr_dtor(arg);
ZVAL_LONG(arg, lval);
return 1;
}
}
- if ((type_mask & MAY_BE_DOUBLE) && zend_parse_arg_double_weak(arg, &dval)) {
+ if ((type_mask & MAY_BE_DOUBLE) && zend_parse_arg_double_weak(arg, &dval, 0)) {
zval_ptr_dtor(arg);
ZVAL_DOUBLE(arg, dval);
return 1;
}
- if ((type_mask & MAY_BE_STRING) && zend_parse_arg_str_weak(arg, &str)) {
+ if ((type_mask & MAY_BE_STRING) && zend_parse_arg_str_weak(arg, &str, 0)) {
/* on success "arg" is converted to IS_STRING */
return 1;
}
- if ((type_mask & MAY_BE_BOOL) == MAY_BE_BOOL && zend_parse_arg_bool_weak(arg, &bval)) {
+ if ((type_mask & MAY_BE_BOOL) == MAY_BE_BOOL && zend_parse_arg_bool_weak(arg, &bval, 0)) {
zval_ptr_dtor(arg);
ZVAL_BOOL(arg, bval);
return 1;
@@ -775,29 +775,29 @@ static bool can_convert_to_string(zval *zv) {
}
/* Used to sanity-check internal arginfo types without performing any actual type conversions. */
-static zend_bool zend_verify_weak_scalar_type_hint_no_sideeffect(uint32_t type_mask, zval *arg)
+static bool zend_verify_weak_scalar_type_hint_no_sideeffect(uint32_t type_mask, zval *arg)
{
zend_long lval;
double dval;
- zend_bool bval;
+ bool bval;
- if ((type_mask & MAY_BE_LONG) && zend_parse_arg_long_weak(arg, &lval)) {
+ if ((type_mask & MAY_BE_LONG) && zend_parse_arg_long_weak(arg, &lval, 0)) {
return 1;
}
- if ((type_mask & MAY_BE_DOUBLE) && zend_parse_arg_double_weak(arg, &dval)) {
+ if ((type_mask & MAY_BE_DOUBLE) && zend_parse_arg_double_weak(arg, &dval, 0)) {
return 1;
}
if ((type_mask & MAY_BE_STRING) && can_convert_to_string(arg)) {
return 1;
}
- if ((type_mask & MAY_BE_BOOL) == MAY_BE_BOOL && zend_parse_arg_bool_weak(arg, &bval)) {
+ if ((type_mask & MAY_BE_BOOL) == MAY_BE_BOOL && zend_parse_arg_bool_weak(arg, &bval, 0)) {
return 1;
}
return 0;
}
#endif
-ZEND_API zend_bool zend_verify_scalar_type_hint(uint32_t type_mask, zval *arg, zend_bool strict, zend_bool is_internal_arg)
+ZEND_API bool zend_verify_scalar_type_hint(uint32_t type_mask, zval *arg, bool strict, bool is_internal_arg)
{
if (UNEXPECTED(strict)) {
/* SSTH Exception: IS_LONG may be accepted as IS_DOUBLE (converted) */
@@ -851,20 +851,32 @@ static zend_class_entry *resolve_single_class_type(zend_string *name, zend_class
}
}
-static zend_bool zend_check_and_resolve_property_class_type(
+static bool zend_check_and_resolve_property_class_type(
zend_property_info *info, zend_class_entry *object_ce) {
zend_class_entry *ce;
if (ZEND_TYPE_HAS_LIST(info->type)) {
zend_type *list_type;
ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(info->type), list_type) {
if (ZEND_TYPE_HAS_NAME(*list_type)) {
- zend_string *name = ZEND_TYPE_NAME(*list_type);
- ce = resolve_single_class_type(name, info->ce);
- if (!ce) {
- continue;
+ if (ZEND_TYPE_HAS_CE_CACHE(*list_type)) {
+ ce = ZEND_TYPE_CE_CACHE(*list_type);
+ if (!ce) {
+ zend_string *name = ZEND_TYPE_NAME(*list_type);
+ ce = resolve_single_class_type(name, info->ce);
+ if (UNEXPECTED(!ce)) {
+ continue;
+ }
+ ZEND_TYPE_SET_CE_CACHE(*list_type, ce);
+ }
+ } else {
+ zend_string *name = ZEND_TYPE_NAME(*list_type);
+ ce = resolve_single_class_type(name, info->ce);
+ if (!ce) {
+ continue;
+ }
+ zend_string_release(name);
+ ZEND_TYPE_SET_CE(*list_type, ce);
}
- zend_string_release(name);
- ZEND_TYPE_SET_CE(*list_type, ce);
} else {
ce = ZEND_TYPE_CE(*list_type);
}
@@ -875,14 +887,26 @@ static zend_bool zend_check_and_resolve_property_class_type(
return 0;
} else {
if (UNEXPECTED(ZEND_TYPE_HAS_NAME(info->type))) {
- zend_string *name = ZEND_TYPE_NAME(info->type);
- ce = resolve_single_class_type(name, info->ce);
- if (UNEXPECTED(!ce)) {
- return 0;
- }
+ if (ZEND_TYPE_HAS_CE_CACHE(info->type)) {
+ ce = ZEND_TYPE_CE_CACHE(info->type);
+ if (!ce) {
+ zend_string *name = ZEND_TYPE_NAME(info->type);
+ ce = resolve_single_class_type(name, info->ce);
+ if (UNEXPECTED(!ce)) {
+ return 0;
+ }
+ ZEND_TYPE_SET_CE_CACHE(info->type, ce);
+ }
+ } else {
+ zend_string *name = ZEND_TYPE_NAME(info->type);
+ ce = resolve_single_class_type(name, info->ce);
+ if (UNEXPECTED(!ce)) {
+ return 0;
+ }
- zend_string_release(name);
- ZEND_TYPE_SET_CE(info->type, ce);
+ zend_string_release(name);
+ ZEND_TYPE_SET_CE(info->type, ce);
+ }
} else {
ce = ZEND_TYPE_CE(info->type);
}
@@ -890,7 +914,7 @@ static zend_bool zend_check_and_resolve_property_class_type(
}
}
-static zend_always_inline zend_bool i_zend_check_property_type(zend_property_info *info, zval *property, zend_bool strict)
+static zend_always_inline bool i_zend_check_property_type(zend_property_info *info, zval *property, bool strict)
{
ZEND_ASSERT(!Z_ISREF_P(property));
if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(info->type, Z_TYPE_P(property)))) {
@@ -910,7 +934,7 @@ static zend_always_inline zend_bool i_zend_check_property_type(zend_property_inf
return zend_verify_scalar_type_hint(type_mask, property, strict, 0);
}
-static zend_always_inline zend_bool i_zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict)
+static zend_always_inline bool i_zend_verify_property_type(zend_property_info *info, zval *property, bool strict)
{
if (i_zend_check_property_type(info, property, strict)) {
return 1;
@@ -920,7 +944,7 @@ static zend_always_inline zend_bool i_zend_verify_property_type(zend_property_in
return 0;
}
-ZEND_API zend_bool zend_never_inline zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) {
+ZEND_API bool zend_never_inline zend_verify_property_type(zend_property_info *info, zval *property, bool strict) {
return i_zend_verify_property_type(info, property, strict);
}
@@ -939,7 +963,7 @@ static zend_never_inline zval* zend_assign_to_typed_prop(zend_property_info *inf
return zend_assign_to_variable(property_val, &tmp, IS_TMP_VAR, EX_USES_STRICT_TYPES());
}
-ZEND_API zend_bool zend_value_instanceof_static(zval *zv) {
+ZEND_API bool zend_value_instanceof_static(zval *zv) {
if (Z_TYPE_P(zv) != IS_OBJECT) {
return 0;
}
@@ -959,21 +983,26 @@ ZEND_API zend_bool zend_value_instanceof_static(zval *zv) {
# define HAVE_CACHE_SLOT 1
#endif
-static zend_always_inline zend_bool zend_check_type_slow(
- zend_type type, zval *arg, zend_reference *ref, void **cache_slot, zend_class_entry *scope,
- zend_bool is_return_type, zend_bool is_internal)
+static zend_always_inline bool zend_check_type_slow(
+ zend_type *type, zval *arg, zend_reference *ref, void **cache_slot, zend_class_entry *scope,
+ bool is_return_type, bool is_internal)
{
uint32_t type_mask;
- if (ZEND_TYPE_HAS_CLASS(type) && Z_TYPE_P(arg) == IS_OBJECT) {
+ if (ZEND_TYPE_HAS_CLASS(*type) && Z_TYPE_P(arg) == IS_OBJECT) {
zend_class_entry *ce;
- if (ZEND_TYPE_HAS_LIST(type)) {
+ if (ZEND_TYPE_HAS_LIST(*type)) {
zend_type *list_type;
- ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(type), list_type) {
+ ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(*type), list_type) {
if (HAVE_CACHE_SLOT && *cache_slot) {
ce = *cache_slot;
+ } else if (ZEND_TYPE_HAS_CE_CACHE(*list_type) && ZEND_TYPE_CE_CACHE(*list_type)) {
+ ce = ZEND_TYPE_CE_CACHE(*list_type);
+ if (HAVE_CACHE_SLOT) {
+ *cache_slot = ce;
+ }
} else {
ce = zend_fetch_class(ZEND_TYPE_NAME(*list_type),
- (ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD));
+ ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
if (!ce) {
if (HAVE_CACHE_SLOT) {
cache_slot++;
@@ -983,6 +1012,9 @@ static zend_always_inline zend_bool zend_check_type_slow(
if (HAVE_CACHE_SLOT) {
*cache_slot = ce;
}
+ if (ZEND_TYPE_HAS_CE_CACHE(*list_type)) {
+ ZEND_TYPE_SET_CE_CACHE(*list_type, ce);
+ }
}
if (instanceof_function(Z_OBJCE_P(arg), ce)) {
return 1;
@@ -994,14 +1026,23 @@ static zend_always_inline zend_bool zend_check_type_slow(
} else {
if (EXPECTED(HAVE_CACHE_SLOT && *cache_slot)) {
ce = (zend_class_entry *) *cache_slot;
+ } else if (ZEND_TYPE_HAS_CE_CACHE(*type) && ZEND_TYPE_CE_CACHE(*type)) {
+ ce = ZEND_TYPE_CE_CACHE(*type);
+ if (HAVE_CACHE_SLOT) {
+ *cache_slot = ce;
+ }
} else {
- ce = zend_fetch_class(ZEND_TYPE_NAME(type), (ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD));
+ ce = zend_fetch_class(ZEND_TYPE_NAME(*type),
+ ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
if (UNEXPECTED(!ce)) {
goto builtin_types;
}
if (HAVE_CACHE_SLOT) {
*cache_slot = (void *) ce;
}
+ if (ZEND_TYPE_HAS_CE_CACHE(*type)) {
+ ZEND_TYPE_SET_CE_CACHE(*type, ce);
+ }
}
if (instanceof_function(Z_OBJCE_P(arg), ce)) {
return 1;
@@ -1010,7 +1051,7 @@ static zend_always_inline zend_bool zend_check_type_slow(
}
builtin_types:
- type_mask = ZEND_TYPE_FULL_MASK(type);
+ type_mask = ZEND_TYPE_FULL_MASK(*type);
if ((type_mask & MAY_BE_CALLABLE) && zend_is_callable(arg, 0, NULL)) {
return 1;
}
@@ -1039,19 +1080,19 @@ builtin_types:
* because this case is already checked at compile-time. */
}
-static zend_always_inline zend_bool zend_check_type(
- zend_type type, zval *arg, void **cache_slot, zend_class_entry *scope,
- zend_bool is_return_type, zend_bool is_internal)
+static zend_always_inline bool zend_check_type(
+ zend_type *type, zval *arg, void **cache_slot, zend_class_entry *scope,
+ bool is_return_type, bool is_internal)
{
zend_reference *ref = NULL;
- ZEND_ASSERT(ZEND_TYPE_IS_SET(type));
+ ZEND_ASSERT(ZEND_TYPE_IS_SET(*type));
if (UNEXPECTED(Z_ISREF_P(arg))) {
ref = Z_REF_P(arg);
arg = Z_REFVAL_P(arg);
}
- if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(type, Z_TYPE_P(arg)))) {
+ if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(*type, Z_TYPE_P(arg)))) {
return 1;
}
@@ -1066,7 +1107,7 @@ static zend_always_inline bool zend_verify_recv_arg_type(zend_function *zf, uint
cur_arg_info = &zf->common.arg_info[arg_num-1];
if (ZEND_TYPE_IS_SET(cur_arg_info->type)
- && UNEXPECTED(!zend_check_type(cur_arg_info->type, arg, cache_slot, zf->common.scope, 0, 0))) {
+ && UNEXPECTED(!zend_check_type(&cur_arg_info->type, arg, cache_slot, zf->common.scope, 0, 0))) {
zend_verify_arg_error(zf, cur_arg_info, arg_num, arg);
return 0;
}
@@ -1078,7 +1119,7 @@ static zend_always_inline bool zend_verify_variadic_arg_type(
zend_function *zf, zend_arg_info *arg_info, uint32_t arg_num, zval *arg, void **cache_slot)
{
ZEND_ASSERT(ZEND_TYPE_IS_SET(arg_info->type));
- if (UNEXPECTED(!zend_check_type(arg_info->type, arg, cache_slot, zf->common.scope, 0, 0))) {
+ if (UNEXPECTED(!zend_check_type(&arg_info->type, arg, cache_slot, zf->common.scope, 0, 0))) {
zend_verify_arg_error(zf, arg_info, arg_num, arg);
return 0;
}
@@ -1103,7 +1144,7 @@ static zend_never_inline ZEND_ATTRIBUTE_UNUSED bool zend_verify_internal_arg_typ
}
if (ZEND_TYPE_IS_SET(cur_arg_info->type)
- && UNEXPECTED(!zend_check_type(cur_arg_info->type, arg, /* cache_slot */ NULL, fbc->common.scope, 0, /* is_internal */ 1))) {
+ && UNEXPECTED(!zend_check_type(&cur_arg_info->type, arg, /* cache_slot */ NULL, fbc->common.scope, 0, /* is_internal */ 1))) {
return 0;
}
arg++;
@@ -1115,7 +1156,7 @@ static zend_never_inline ZEND_ATTRIBUTE_UNUSED bool zend_verify_internal_arg_typ
/* Determine whether an internal call should throw, because the passed arguments violate
* an arginfo constraint. This is only checked in debug builds. In release builds, we
* trust that arginfo matches what is enforced by zend_parse_parameters. */
-static zend_always_inline zend_bool zend_internal_call_should_throw(zend_function *fbc, zend_execute_data *call)
+static zend_always_inline bool zend_internal_call_should_throw(zend_function *fbc, zend_execute_data *call)
{
if (fbc->internal_function.handler == ZEND_FN(pass)) {
/* Be lenient about the special pass function. */
@@ -1149,6 +1190,15 @@ static ZEND_COLD void zend_internal_call_arginfo_violation(zend_function *fbc)
fbc->common.scope ? "::" : "",
ZSTR_VAL(fbc->common.function_name));
}
+
+static void zend_verify_internal_read_property_type(zend_object *obj, zend_string *name, zval *val)
+{
+ zend_property_info *prop_info =
+ zend_get_property_info(obj->ce, name, /* silent */ true);
+ if (prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO && ZEND_TYPE_IS_SET(prop_info->type)) {
+ zend_verify_property_type(prop_info, val, /* strict */ true);
+ }
+}
#endif
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data)
@@ -1236,7 +1286,7 @@ static bool zend_verify_internal_return_type(zend_function *zf, zval *ret)
return 1;
}
- if (UNEXPECTED(!zend_check_type(ret_info->type, ret, /* cache_slot */ NULL, NULL, 1, /* is_internal */ 1))) {
+ if (UNEXPECTED(!zend_check_type(&ret_info->type, ret, /* cache_slot */ NULL, NULL, 1, /* is_internal */ 1))) {
zend_verify_internal_return_error(zf, ret);
return 0;
}
@@ -2071,25 +2121,27 @@ try_again:
if (EXPECTED(Z_TYPE_P(dim) == IS_LONG)) {
hval = Z_LVAL_P(dim);
num_index:
- ZEND_HASH_INDEX_FIND(ht, hval, retval, num_undef);
- return retval;
+ if (type != BP_VAR_W) {
+ ZEND_HASH_INDEX_FIND(ht, hval, retval, num_undef);
+ return retval;
num_undef:
- switch (type) {
- case BP_VAR_R:
- zend_undefined_offset(hval);
- /* break missing intentionally */
- case BP_VAR_UNSET:
- case BP_VAR_IS:
- retval = &EG(uninitialized_zval);
- break;
- case BP_VAR_RW:
- if (UNEXPECTED(zend_undefined_offset_write(ht, hval) == FAILURE)) {
- return NULL;
+ switch (type) {
+ case BP_VAR_R:
+ zend_undefined_offset(hval);
+ /* break missing intentionally */
+ case BP_VAR_UNSET:
+ case BP_VAR_IS:
+ retval = &EG(uninitialized_zval);
+ break;
+ case BP_VAR_RW:
+ if (UNEXPECTED(zend_undefined_offset_write(ht, hval) == FAILURE)) {
+ return NULL;
+ }
+ retval = zend_hash_index_add_new(ht, hval, &EG(uninitialized_zval));
+ break;
}
- /* break missing intentionally */
- case BP_VAR_W:
- retval = zend_hash_index_add_new(ht, hval, &EG(uninitialized_zval));
- break;
+ } else {
+ ZEND_HASH_INDEX_LOOKUP(ht, hval, retval);
}
} else if (EXPECTED(Z_TYPE_P(dim) == IS_STRING)) {
offset_key = Z_STR_P(dim);
@@ -2099,54 +2151,31 @@ num_undef:
}
}
str_index:
- retval = zend_hash_find_ex(ht, offset_key, ZEND_CONST_COND(dim_type == IS_CONST, 0));
- if (retval) {
- /* support for $GLOBALS[...] */
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
- retval = Z_INDIRECT_P(retval);
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
- switch (type) {
- case BP_VAR_R:
- zend_undefined_index(offset_key);
- /* break missing intentionally */
- case BP_VAR_UNSET:
- case BP_VAR_IS:
- retval = &EG(uninitialized_zval);
- break;
- case BP_VAR_RW:
- if (UNEXPECTED(zend_undefined_index_write(ht, offset_key))) {
- return NULL;
- }
- /* break missing intentionally */
- case BP_VAR_W:
- ZVAL_NULL(retval);
- break;
- }
+ if (type != BP_VAR_W) {
+ retval = zend_hash_find_ex(ht, offset_key, ZEND_CONST_COND(dim_type == IS_CONST, 0));
+ if (!retval) {
+ switch (type) {
+ case BP_VAR_R:
+ zend_undefined_index(offset_key);
+ /* break missing intentionally */
+ case BP_VAR_UNSET:
+ case BP_VAR_IS:
+ retval = &EG(uninitialized_zval);
+ break;
+ case BP_VAR_RW:
+ /* Key may be released while throwing the undefined index warning. */
+ zend_string_addref(offset_key);
+ if (UNEXPECTED(zend_undefined_index_write(ht, offset_key) == FAILURE)) {
+ zend_string_release(offset_key);
+ return NULL;
+ }
+ retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval));
+ zend_string_release(offset_key);
+ break;
}
}
} else {
- switch (type) {
- case BP_VAR_R:
- zend_undefined_index(offset_key);
- /* break missing intentionally */
- case BP_VAR_UNSET:
- case BP_VAR_IS:
- retval = &EG(uninitialized_zval);
- break;
- case BP_VAR_RW:
- /* Key may be released while throwing the undefined index warning. */
- zend_string_addref(offset_key);
- if (UNEXPECTED(zend_undefined_index_write(ht, offset_key) == FAILURE)) {
- zend_string_release(offset_key);
- return NULL;
- }
- retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval));
- zend_string_release(offset_key);
- break;
- case BP_VAR_W:
- retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval));
- break;
- }
+ retval = zend_hash_lookup(ht, offset_key);
}
} else if (EXPECTED(Z_TYPE_P(dim) == IS_REFERENCE)) {
dim = Z_REFVAL_P(dim);
@@ -2478,7 +2507,7 @@ num_idx:
return zend_hash_index_find(ht, hval);
} else if (Z_TYPE_P(offset) == IS_NULL) {
str_idx:
- return zend_hash_find_ex_ind(ht, ZSTR_EMPTY_ALLOC(), 1);
+ return zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
} else if (Z_TYPE_P(offset) == IS_FALSE) {
hval = 0;
goto num_idx;
@@ -2576,7 +2605,7 @@ str_offset:
}
}
-static zend_never_inline zend_bool ZEND_FASTCALL zend_array_key_exists_fast(HashTable *ht, zval *key OPLINE_DC EXECUTE_DATA_DC)
+static zend_never_inline bool ZEND_FASTCALL zend_array_key_exists_fast(HashTable *ht, zval *key OPLINE_DC EXECUTE_DATA_DC)
{
zend_string *str;
zend_ulong hval;
@@ -2588,11 +2617,11 @@ try_again:
goto num_key;
}
str_key:
- return zend_hash_find_ind(ht, str) != NULL;
+ return zend_hash_exists(ht, str);
} else if (EXPECTED(Z_TYPE_P(key) == IS_LONG)) {
hval = Z_LVAL_P(key);
num_key:
- return zend_hash_index_find(ht, hval) != NULL;
+ return zend_hash_index_exists(ht, hval);
} else if (EXPECTED(Z_ISREF_P(key))) {
key = Z_REFVAL_P(key);
goto try_again;
@@ -2636,12 +2665,12 @@ static ZEND_COLD void ZEND_FASTCALL zend_array_key_exists_error(
}
}
-static zend_always_inline zend_bool promotes_to_array(zval *val) {
+static zend_always_inline bool promotes_to_array(zval *val) {
return Z_TYPE_P(val) <= IS_FALSE
|| (Z_ISREF_P(val) && Z_TYPE_P(Z_REFVAL_P(val)) <= IS_FALSE);
}
-static zend_always_inline zend_bool check_type_array_assignable(zend_type type) {
+static zend_always_inline bool check_type_array_assignable(zend_type type) {
if (!ZEND_TYPE_IS_SET(type)) {
return 1;
}
@@ -2649,7 +2678,7 @@ static zend_always_inline zend_bool check_type_array_assignable(zend_type type)
}
/* Checks whether an array can be assigned to the reference. Throws error if not assignable. */
-ZEND_API zend_bool zend_verify_ref_array_assignable(zend_reference *ref) {
+ZEND_API bool zend_verify_ref_array_assignable(zend_reference *ref) {
zend_property_info *prop;
ZEND_ASSERT(ZEND_REF_HAS_TYPE_SOURCES(ref));
ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) {
@@ -2677,7 +2706,7 @@ static zend_property_info *zend_object_fetch_property_type_info(
return zend_get_typed_property_info_for_slot(obj, slot);
}
-static zend_never_inline zend_bool zend_handle_fetch_obj_flags(
+static zend_never_inline bool zend_handle_fetch_obj_flags(
zval *result, zval *ptr, zend_object *obj, zend_property_info *prop_info, uint32_t flags)
{
switch (flags) {
@@ -2722,7 +2751,7 @@ static zend_never_inline zend_bool zend_handle_fetch_obj_flags(
return 1;
}
-static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type, uint32_t flags, zend_bool init_undef OPLINE_DC EXECUTE_DATA_DC)
+static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type, uint32_t flags, bool init_undef OPLINE_DC EXECUTE_DATA_DC)
{
zval *ptr;
zend_object *zobj;
@@ -3063,7 +3092,7 @@ ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error(zend_property_info
/* 1: valid, 0: invalid, -1: may be valid after type coercion */
static zend_always_inline int i_zend_verify_type_assignable_zval(
- zend_property_info *info, zval *zv, zend_bool strict) {
+ zend_property_info *info, zval *zv, bool strict) {
zend_type type = info->type;
uint32_t type_mask;
zend_uchar zv_type = Z_TYPE_P(zv);
@@ -3106,7 +3135,7 @@ static zend_always_inline int i_zend_verify_type_assignable_zval(
return -1;
}
-ZEND_API zend_bool ZEND_FASTCALL zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict)
+ZEND_API bool ZEND_FASTCALL zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, bool strict)
{
zend_property_info *prop;
@@ -3185,9 +3214,9 @@ static zend_always_inline void i_zval_ptr_dtor_noref(zval *zval_ptr) {
}
}
-ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *orig_value, zend_uchar value_type, zend_bool strict)
+ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *orig_value, zend_uchar value_type, bool strict)
{
- zend_bool ret;
+ bool ret;
zval value;
zend_refcounted *ref = NULL;
@@ -3218,7 +3247,7 @@ ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *orig_value, ze
return variable_ptr;
}
-ZEND_API zend_bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, zend_bool strict) {
+ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, bool strict) {
zval *val = orig_val;
if (Z_ISREF_P(val) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(val))) {
int result;
@@ -3526,7 +3555,7 @@ static zend_always_inline void zend_init_cvs(uint32_t first, uint32_t last EXECU
}
}
-static zend_always_inline void i_init_func_execute_data(zend_op_array *op_array, zval *return_value, zend_bool may_be_trampoline EXECUTE_DATA_DC) /* {{{ */
+static zend_always_inline void i_init_func_execute_data(zend_op_array *op_array, zval *return_value, bool may_be_trampoline EXECUTE_DATA_DC) /* {{{ */
{
uint32_t first_extra_arg, num_args;
ZEND_ASSERT(EX(func) == (zend_function*)op_array);
@@ -4197,10 +4226,12 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
zend_file_handle file_handle;
zend_string *resolved_path;
- resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename));
+ resolved_path = zend_resolve_path(Z_STR_P(inc_filename));
if (EXPECTED(resolved_path)) {
if (zend_hash_exists(&EG(included_files), resolved_path)) {
- goto already_compiled;
+ new_op_array = ZEND_FAKE_OP_ARRAY;
+ zend_string_release_ex(resolved_path, 0);
+ break;
}
} else if (UNEXPECTED(EG(exception))) {
break;
@@ -4214,7 +4245,8 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
resolved_path = zend_string_copy(Z_STR_P(inc_filename));
}
- if (SUCCESS == zend_stream_open(ZSTR_VAL(resolved_path), &file_handle)) {
+ zend_stream_init_filename_ex(&file_handle, resolved_path);
+ if (SUCCESS == zend_stream_open(&file_handle)) {
if (!file_handle.opened_path) {
file_handle.opened_path = zend_string_copy(resolved_path);
@@ -4229,8 +4261,6 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
}
return op_array;
} else {
- zend_file_handle_dtor(&file_handle);
-already_compiled:
new_op_array = ZEND_FAKE_OP_ARRAY;
}
} else if (!EG(exception)) {
@@ -4239,6 +4269,7 @@ already_compiled:
ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN,
Z_STRVAL_P(inc_filename));
}
+ zend_destroy_file_handle(&file_handle);
zend_string_release_ex(resolved_path, 0);
}
break;
@@ -4271,11 +4302,11 @@ already_compiled:
}
/* }}} */
-static zend_never_inline zend_bool ZEND_FASTCALL zend_fe_reset_iterator(zval *array_ptr, int by_ref OPLINE_DC EXECUTE_DATA_DC) /* {{{ */
+static zend_never_inline bool ZEND_FASTCALL zend_fe_reset_iterator(zval *array_ptr, int by_ref OPLINE_DC EXECUTE_DATA_DC) /* {{{ */
{
zend_class_entry *ce = Z_OBJCE_P(array_ptr);
zend_object_iterator *iter = ce->get_iterator(ce, array_ptr, by_ref);
- zend_bool is_empty;
+ bool is_empty;
if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
if (iter) {
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h
index ab96d43c4c..3339f3992d 100644
--- a/Zend/zend_execute.h
+++ b/Zend/zend_execute.h
@@ -43,7 +43,7 @@ ZEND_API void zend_init_code_execute_data(zend_execute_data *execute_data, zend_
ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value);
ZEND_API void execute_ex(zend_execute_data *execute_data);
ZEND_API void execute_internal(zend_execute_data *execute_data, zval *return_value);
-ZEND_API zend_bool zend_is_valid_class_name(zend_string *name);
+ZEND_API bool zend_is_valid_class_name(zend_string *name);
ZEND_API zend_class_entry *zend_lookup_class(zend_string *name);
ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *lcname, uint32_t flags);
ZEND_API zend_class_entry *zend_get_called_scope(zend_execute_data *ex);
@@ -60,21 +60,21 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_function(const zend_function *fbc);
ZEND_COLD void ZEND_FASTCALL zend_param_must_be_ref(const zend_function *func, uint32_t arg_num);
-ZEND_API zend_bool ZEND_FASTCALL zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict);
-ZEND_API zend_bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, zend_bool strict);
+ZEND_API bool ZEND_FASTCALL zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, bool strict);
+ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, bool strict);
ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv);
ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv);
ZEND_API ZEND_COLD zend_result ZEND_FASTCALL zend_undefined_offset_write(HashTable *ht, zend_long lval);
ZEND_API ZEND_COLD zend_result ZEND_FASTCALL zend_undefined_index_write(HashTable *ht, zend_string *offset);
-ZEND_API zend_bool zend_verify_scalar_type_hint(uint32_t type_mask, zval *arg, zend_bool strict, zend_bool is_internal_arg);
+ZEND_API bool zend_verify_scalar_type_hint(uint32_t type_mask, zval *arg, bool strict, bool is_internal_arg);
ZEND_API ZEND_COLD void zend_verify_arg_error(
const zend_function *zf, const zend_arg_info *arg_info, int arg_num, zval *value);
ZEND_API ZEND_COLD void zend_verify_return_error(
const zend_function *zf, zval *value);
-ZEND_API zend_bool zend_verify_ref_array_assignable(zend_reference *ref);
-ZEND_API zend_bool zend_value_instanceof_static(zval *zv);
+ZEND_API bool zend_verify_ref_array_assignable(zend_reference *ref);
+ZEND_API bool zend_value_instanceof_static(zval *zv);
#define ZEND_REF_TYPE_SOURCES(ref) \
@@ -92,7 +92,7 @@ ZEND_API zend_bool zend_value_instanceof_static(zval *zv);
ZEND_API void ZEND_FASTCALL zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop);
ZEND_API void ZEND_FASTCALL zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop);
-ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict);
+ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *value, zend_uchar value_type, bool strict);
static zend_always_inline void zend_copy_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type)
{
@@ -121,7 +121,7 @@ static zend_always_inline void zend_copy_to_variable(zval *variable_ptr, zval *v
}
}
-static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict)
+static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, bool strict)
{
do {
if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
@@ -155,8 +155,8 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval
return variable_ptr;
}
-ZEND_API zend_result zval_update_constant(zval *pp);
-ZEND_API zend_result zval_update_constant_ex(zval *pp, zend_class_entry *scope);
+ZEND_API zend_result ZEND_FASTCALL zval_update_constant(zval *pp);
+ZEND_API zend_result ZEND_FASTCALL zval_update_constant_ex(zval *pp, zend_class_entry *scope);
/* dedicated Zend executor functions - do not use! */
struct _zend_vm_stack {
@@ -317,7 +317,7 @@ ZEND_API const char *zend_get_executed_filename(void);
ZEND_API zend_string *zend_get_executed_filename_ex(void);
ZEND_API uint32_t zend_get_executed_lineno(void);
ZEND_API zend_class_entry *zend_get_executed_scope(void);
-ZEND_API zend_bool zend_is_executing(void);
+ZEND_API bool zend_is_executing(void);
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_cannot_pass_by_reference(uint32_t arg_num);
ZEND_API void zend_set_timeout(zend_long seconds, bool reset_signals);
@@ -418,7 +418,7 @@ ZEND_API int ZEND_FASTCALL zend_handle_undef_args(zend_execute_data *call);
#define ZEND_CLASS_HAS_TYPE_HINTS(ce) ((ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) == ZEND_ACC_HAS_TYPE_HINTS)
-ZEND_API zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict);
+ZEND_API bool zend_verify_property_type(zend_property_info *info, zval *property, bool strict);
ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zval *property);
#define ZEND_REF_ADD_TYPE_SOURCE(ref, source) \
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index b55b2e7385..af3c8cc670 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -258,13 +258,13 @@ void shutdown_executor(void) /* {{{ */
zend_string *key;
zval *zv;
#if ZEND_DEBUG
- zend_bool fast_shutdown = 0;
+ bool fast_shutdown = 0;
#else
- zend_bool fast_shutdown = is_zend_mm() && !EG(full_tables_cleanup);
+ bool fast_shutdown = is_zend_mm() && !EG(full_tables_cleanup);
#endif
zend_try {
- zend_llist_destroy(&CG(open_files));
+ zend_stream_shutdown();
} zend_end_try();
EG(flags) |= EG_FLAGS_IN_RESOURCE_SHUTDOWN;
@@ -278,6 +278,24 @@ void shutdown_executor(void) /* {{{ */
if (!fast_shutdown) {
zend_hash_graceful_reverse_destroy(&EG(symbol_table));
+ /* Constants may contain objects, destroy them before the object store. */
+ if (EG(full_tables_cleanup)) {
+ zend_hash_reverse_apply(EG(zend_constants), clean_non_persistent_constant_full);
+ } else {
+ ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(EG(zend_constants), key, zv) {
+ zend_constant *c = Z_PTR_P(zv);
+ if (_idx == EG(persistent_constants_count)) {
+ break;
+ }
+ zval_ptr_dtor_nogc(&c->value);
+ if (c->name) {
+ zend_string_release_ex(c->name, 0);
+ }
+ efree(c);
+ zend_string_release_ex(key, 0);
+ } ZEND_HASH_FOREACH_END_DEL();
+ }
+
/* Release static properties and static variables prior to the final GC run,
* as they may hold GC roots. */
ZEND_HASH_REVERSE_FOREACH_VAL(EG(function_table), zv) {
@@ -285,27 +303,42 @@ void shutdown_executor(void) /* {{{ */
if (op_array->type == ZEND_INTERNAL_FUNCTION) {
break;
}
- if (op_array->static_variables) {
+ if (ZEND_MAP_PTR(op_array->static_variables_ptr)) {
HashTable *ht = ZEND_MAP_PTR_GET(op_array->static_variables_ptr);
if (ht) {
- zend_array_release(ht);
+ zend_array_destroy(ht);
ZEND_MAP_PTR_SET(op_array->static_variables_ptr, NULL);
}
}
} ZEND_HASH_FOREACH_END();
ZEND_HASH_REVERSE_FOREACH_VAL(EG(class_table), zv) {
zend_class_entry *ce = Z_PTR_P(zv);
+
if (ce->default_static_members_count) {
zend_cleanup_internal_class_data(ce);
}
+
+ if (ZEND_MAP_PTR(ce->mutable_data) && ZEND_MAP_PTR_GET_IMM(ce->mutable_data)) {
+ zend_cleanup_mutable_class_data(ce);
+ } else if (ce->type == ZEND_USER_CLASS && !(ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
+ /* Constants may contain objects, destroy the values before the object store. */
+ zend_class_constant *c;
+ ZEND_HASH_FOREACH_PTR(&ce->constants_table, c) {
+ if (c->ce == ce) {
+ zval_ptr_dtor_nogc(&c->value);
+ ZVAL_UNDEF(&c->value);
+ }
+ } ZEND_HASH_FOREACH_END();
+ }
+
if (ce->ce_flags & ZEND_HAS_STATIC_IN_METHODS) {
zend_op_array *op_array;
ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) {
if (op_array->type == ZEND_USER_FUNCTION) {
- if (op_array->static_variables) {
+ if (ZEND_MAP_PTR(op_array->static_variables_ptr)) {
HashTable *ht = ZEND_MAP_PTR_GET(op_array->static_variables_ptr);
if (ht) {
- zend_array_release(ht);
+ zend_array_destroy(ht);
ZEND_MAP_PTR_SET(op_array->static_variables_ptr, NULL);
}
}
@@ -334,6 +367,8 @@ void shutdown_executor(void) /* {{{ */
gc_collect_cycles();
}
#endif
+ } else {
+ zend_hash_discard(EG(zend_constants), EG(persistent_constants_count));
}
zend_objects_store_free_object_storage(&EG(objects_store), fast_shutdown);
@@ -350,7 +385,6 @@ void shutdown_executor(void) /* {{{ */
* Zend Memory Manager frees memory by its own. We don't have to free
* each allocated block separately.
*/
- zend_hash_discard(EG(zend_constants), EG(persistent_constants_count));
zend_hash_discard(EG(function_table), EG(persistent_functions_count));
zend_hash_discard(EG(class_table), EG(persistent_classes_count));
zend_cleanup_internal_classes();
@@ -358,23 +392,9 @@ void shutdown_executor(void) /* {{{ */
zend_vm_stack_destroy();
if (EG(full_tables_cleanup)) {
- zend_hash_reverse_apply(EG(zend_constants), clean_non_persistent_constant_full);
zend_hash_reverse_apply(EG(function_table), clean_non_persistent_function_full);
zend_hash_reverse_apply(EG(class_table), clean_non_persistent_class_full);
} else {
- ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(EG(zend_constants), key, zv) {
- zend_constant *c = Z_PTR_P(zv);
- if (_idx == EG(persistent_constants_count)) {
- break;
- }
- zval_ptr_dtor_nogc(&c->value);
- if (c->name) {
- zend_string_release_ex(c->name, 0);
- }
- efree(c);
- zend_string_release_ex(key, 0);
- } ZEND_HASH_FOREACH_END_DEL();
-
ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(EG(function_table), key, zv) {
zend_function *func = Z_PTR_P(zv);
if (_idx == EG(persistent_functions_count)) {
@@ -604,13 +624,13 @@ ZEND_API zend_class_entry *zend_get_executed_scope(void) /* {{{ */
}
/* }}} */
-ZEND_API zend_bool zend_is_executing(void) /* {{{ */
+ZEND_API bool zend_is_executing(void) /* {{{ */
{
return EG(current_execute_data) != 0;
}
/* }}} */
-ZEND_API zend_result zval_update_constant_ex(zval *p, zend_class_entry *scope) /* {{{ */
+ZEND_API zend_result ZEND_FASTCALL zval_update_constant_ex(zval *p, zend_class_entry *scope) /* {{{ */
{
if (Z_TYPE_P(p) == IS_CONSTANT_AST) {
zend_ast *ast = Z_ASTVAL_P(p);
@@ -638,7 +658,7 @@ ZEND_API zend_result zval_update_constant_ex(zval *p, zend_class_entry *scope) /
}
/* }}} */
-ZEND_API zend_result zval_update_constant(zval *pp) /* {{{ */
+ZEND_API zend_result ZEND_FASTCALL zval_update_constant(zval *pp) /* {{{ */
{
return zval_update_constant_ex(pp, EG(current_execute_data) ? zend_get_executed_scope() : CG(active_class_entry));
}
@@ -759,7 +779,7 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_
for (i=0; i<fci->param_count; i++) {
zval *param = ZEND_CALL_ARG(call, i+1);
zval *arg = &fci->params[i];
- zend_bool must_wrap = 0;
+ bool must_wrap = 0;
if (UNEXPECTED(Z_ISUNDEF_P(arg))) {
/* Allow forwarding undef slots. This is only used by Closure::__invoke(). */
ZVAL_UNDEF(param);
@@ -806,9 +826,9 @@ cleanup_args:
zend_string *name;
zval *arg;
uint32_t arg_num = ZEND_CALL_NUM_ARGS(call) + 1;
- zend_bool have_named_params = 0;
+ bool have_named_params = 0;
ZEND_HASH_FOREACH_STR_KEY_VAL(fci->named_params, name, arg) {
- zend_bool must_wrap = 0;
+ bool must_wrap = 0;
zval *target;
if (name) {
void *cache_slot[2] = {NULL, NULL};
@@ -1017,7 +1037,7 @@ static const uint32_t valid_chars[8] = {
0xffffffff,
};
-ZEND_API zend_bool zend_is_valid_class_name(zend_string *name) {
+ZEND_API bool zend_is_valid_class_name(zend_string *name) {
for (size_t i = 0; i < ZSTR_LEN(name); i++) {
unsigned char c = ZSTR_VAL(name)[i];
if (!ZEND_BIT_TEST(valid_chars, c)) {
@@ -1059,7 +1079,15 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *
if ((flags & ZEND_FETCH_CLASS_ALLOW_UNLINKED) ||
((flags & ZEND_FETCH_CLASS_ALLOW_NEARLY_LINKED) &&
(ce->ce_flags & ZEND_ACC_NEARLY_LINKED))) {
- ce->ce_flags |= ZEND_ACC_HAS_UNLINKED_USES;
+ if (ce->ce_flags & ZEND_ACC_IMMUTABLE) {
+ if (!CG(unlinked_uses)) {
+ ALLOC_HASHTABLE(CG(unlinked_uses));
+ zend_hash_init(CG(unlinked_uses), 0, NULL, NULL, 0);
+ }
+ zend_hash_index_add_empty_element(CG(unlinked_uses), (zend_long)(zend_uintptr_t)ce);
+ } else {
+ ce->ce_flags |= ZEND_ACC_HAS_UNLINKED_USES;
+ }
return ce;
}
return NULL;
@@ -1210,6 +1238,7 @@ ZEND_API zend_result zend_eval_stringl(const char *str, size_t str_len, zval *re
}
EG(no_extensions)=0;
+ zend_destroy_static_vars(new_op_array);
destroy_op_array(new_op_array);
efree_size(new_op_array, sizeof(zend_op_array));
retval = SUCCESS;
@@ -1494,9 +1523,8 @@ check_fetch_type:
break;
}
- if (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) {
- return zend_lookup_class_ex(class_name, NULL, fetch_type);
- } else if ((ce = zend_lookup_class_ex(class_name, NULL, fetch_type)) == NULL) {
+ ce = zend_lookup_class_ex(class_name, NULL, fetch_type);
+ if (!ce) {
if (!(fetch_type & ZEND_FETCH_CLASS_SILENT) && !EG(exception)) {
if (fetch_sub_type == ZEND_FETCH_CLASS_INTERFACE) {
zend_throw_or_error(fetch_type, NULL, "Interface \"%s\" not found", ZSTR_VAL(class_name));
@@ -1514,11 +1542,8 @@ check_fetch_type:
zend_class_entry *zend_fetch_class_by_name(zend_string *class_name, zend_string *key, int fetch_type) /* {{{ */
{
- zend_class_entry *ce;
-
- if (fetch_type & ZEND_FETCH_CLASS_NO_AUTOLOAD) {
- return zend_lookup_class_ex(class_name, key, fetch_type);
- } else if ((ce = zend_lookup_class_ex(class_name, key, fetch_type)) == NULL) {
+ zend_class_entry *ce = zend_lookup_class_ex(class_name, key, fetch_type);
+ if (!ce) {
if (fetch_type & ZEND_FETCH_CLASS_SILENT) {
return NULL;
}
diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h
index 9f96d3b0fa..57c8775092 100644
--- a/Zend/zend_extensions.h
+++ b/Zend/zend_extensions.h
@@ -44,11 +44,11 @@ You can use the following macro to check the extension API version for compatibi
/* The first number is the engine version and the rest is the date (YYYYMMDD).
* This way engine 2/3 API no. is always greater than engine 1 API no.. */
-#define ZEND_EXTENSION_API_NO 420200930
+#define ZEND_EXTENSION_API_NO 420201009
typedef struct _zend_extension_version_info {
int zend_extension_api_no;
- char *build_id;
+ const char *build_id;
} zend_extension_version_info;
#define ZEND_EXTENSION_BUILD_ID "API" ZEND_TOSTR(ZEND_EXTENSION_API_NO) ZEND_BUILD_TS ZEND_BUILD_DEBUG ZEND_BUILD_SYSTEM ZEND_BUILD_EXTRA
@@ -75,11 +75,11 @@ typedef size_t (*op_array_persist_calc_func_t)(zend_op_array *op_array);
typedef size_t (*op_array_persist_func_t)(zend_op_array *op_array, void *mem);
struct _zend_extension {
- char *name;
- char *version;
- char *author;
- char *URL;
- char *copyright;
+ const char *name;
+ const char *version;
+ const char *author;
+ const char *URL;
+ const char *copyright;
startup_func_t startup;
shutdown_func_t shutdown;
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c
index bfc124719c..7a9dc4dd61 100644
--- a/Zend/zend_gc.c
+++ b/Zend/zend_gc.c
@@ -209,10 +209,10 @@ typedef struct _gc_root_buffer {
typedef struct _zend_gc_globals {
gc_root_buffer *buf; /* preallocated arrays of buffers */
- zend_bool gc_enabled;
- zend_bool gc_active; /* GC currently running, forbid nested GC */
- zend_bool gc_protected; /* GC protected, forbid root additions */
- zend_bool gc_full;
+ bool gc_enabled;
+ bool gc_active; /* GC currently running, forbid nested GC */
+ bool gc_protected; /* GC protected, forbid root additions */
+ bool gc_full;
uint32_t unused; /* linked list of unused buffers */
uint32_t first_unused; /* first unused buffer */
@@ -493,9 +493,9 @@ void gc_reset(void)
}
}
-ZEND_API zend_bool gc_enable(zend_bool enable)
+ZEND_API bool gc_enable(bool enable)
{
- zend_bool old_enabled = GC_G(gc_enabled);
+ bool old_enabled = GC_G(gc_enabled);
GC_G(gc_enabled) = enable;
if (enable && !old_enabled && GC_G(buf) == NULL) {
GC_G(buf) = (gc_root_buffer*) pemalloc(sizeof(gc_root_buffer) * GC_DEFAULT_BUF_SIZE, 1);
@@ -507,19 +507,19 @@ ZEND_API zend_bool gc_enable(zend_bool enable)
return old_enabled;
}
-ZEND_API zend_bool gc_enabled(void)
+ZEND_API bool gc_enabled(void)
{
return GC_G(gc_enabled);
}
-ZEND_API zend_bool gc_protect(zend_bool protect)
+ZEND_API bool gc_protect(bool protect)
{
- zend_bool old_protected = GC_G(gc_protected);
+ bool old_protected = GC_G(gc_protected);
GC_G(gc_protected) = protect;
return old_protected;
}
-ZEND_API zend_bool gc_protected(void)
+ZEND_API bool gc_protected(void)
{
return GC_G(gc_protected);
}
@@ -740,11 +740,8 @@ tail_call:
goto next;
}
} else if (GC_TYPE(ref) == IS_ARRAY) {
- if ((zend_array*)ref != &EG(symbol_table)) {
- ht = (zend_array*)ref;
- } else {
- goto next;
- }
+ ZEND_ASSERT((zend_array*)ref != &EG(symbol_table));
+ ht = (zend_array*)ref;
} else if (GC_TYPE(ref) == IS_REFERENCE) {
if (Z_REFCOUNTED(((zend_reference*)ref)->val)) {
ref = Z_COUNTED(((zend_reference*)ref)->val);
@@ -861,12 +858,8 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
goto next;
}
} else if (GC_TYPE(ref) == IS_ARRAY) {
- if (((zend_array*)ref) == &EG(symbol_table)) {
- GC_REF_SET_BLACK(ref);
- goto next;
- } else {
- ht = (zend_array*)ref;
- }
+ ZEND_ASSERT(((zend_array*)ref) != &EG(symbol_table));
+ ht = (zend_array*)ref;
} else if (GC_TYPE(ref) == IS_REFERENCE) {
if (Z_REFCOUNTED(((zend_reference*)ref)->val)) {
ref = Z_COUNTED(((zend_reference*)ref)->val);
@@ -1046,12 +1039,8 @@ tail_call:
goto next;
}
} else if (GC_TYPE(ref) == IS_ARRAY) {
- if ((zend_array*)ref == &EG(symbol_table)) {
- GC_REF_SET_BLACK(ref);
- goto next;
- } else {
- ht = (zend_array*)ref;
- }
+ ZEND_ASSERT((zend_array*)ref != &EG(symbol_table));
+ ht = (zend_array*)ref;
} else if (GC_TYPE(ref) == IS_REFERENCE) {
if (Z_REFCOUNTED(((zend_reference*)ref)->val)) {
ref = Z_COUNTED(((zend_reference*)ref)->val);
diff --git a/Zend/zend_gc.h b/Zend/zend_gc.h
index f44786425f..3221335733 100644
--- a/Zend/zend_gc.h
+++ b/Zend/zend_gc.h
@@ -35,12 +35,12 @@ ZEND_API void ZEND_FASTCALL gc_possible_root(zend_refcounted *ref);
ZEND_API void ZEND_FASTCALL gc_remove_from_buffer(zend_refcounted *ref);
/* enable/disable automatic start of GC collection */
-ZEND_API zend_bool gc_enable(zend_bool enable);
-ZEND_API zend_bool gc_enabled(void);
+ZEND_API bool gc_enable(bool enable);
+ZEND_API bool gc_enabled(void);
/* enable/disable possible root additions */
-ZEND_API zend_bool gc_protect(zend_bool protect);
-ZEND_API zend_bool gc_protected(void);
+ZEND_API bool gc_protect(bool protect);
+ZEND_API bool gc_protected(void);
/* The default implementation of the gc_collect_cycles callback. */
ZEND_API int zend_gc_collect_cycles(void);
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 68c1865c00..df94446d6f 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -115,7 +115,7 @@ static void zend_generator_cleanup_unfinished_execution(
}
/* }}} */
-ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished_execution) /* {{{ */
+ZEND_API void zend_generator_close(zend_generator *generator, bool finished_execution) /* {{{ */
{
if (EXPECTED(generator->execute_data)) {
zend_execute_data *execute_data = generator->execute_data;
@@ -165,14 +165,14 @@ static void zend_generator_remove_child(zend_generator_node *node, zend_generato
{
ZEND_ASSERT(node->children >= 1);
if (node->children == 1) {
- node->child.single.child = NULL;
+ node->child.single = NULL;
} else {
HashTable *ht = node->child.ht;
zend_hash_index_del(ht, (zend_ulong) child);
if (node->children == 2) {
zend_generator *other_child;
ZEND_HASH_FOREACH_PTR(ht, other_child) {
- node->child.single.child = other_child;
+ node->child.single = other_child;
break;
} ZEND_HASH_FOREACH_END();
zend_hash_destroy(ht);
@@ -479,13 +479,13 @@ static void zend_generator_add_child(zend_generator *generator, zend_generator *
zend_generator_node *node = &generator->node;
if (node->children == 0) {
- node->child.single.child = child;
+ node->child.single = child;
} else {
if (node->children == 1) {
HashTable *ht = emalloc(sizeof(HashTable));
zend_hash_init(ht, 0, NULL, NULL, 0);
zend_hash_index_add_new_ptr(ht,
- (zend_ulong) node->child.single.child, node->child.single.child);
+ (zend_ulong) node->child.single, node->child.single);
node->child.ht = ht;
}
@@ -524,7 +524,7 @@ ZEND_API zend_generator *zend_generator_update_root(zend_generator *generator)
static zend_generator *get_new_root(zend_generator *generator, zend_generator *root)
{
while (!root->execute_data && root->node.children == 1) {
- root = root->node.child.single.child;
+ root = root->node.child.single;
}
if (root->execute_data) {
@@ -614,9 +614,6 @@ static zend_result zend_generator_get_next_delegated_value(zend_generator *gener
p = &ht->arData[pos];
value = &p->val;
- if (Z_TYPE_P(value) == IS_INDIRECT) {
- value = Z_INDIRECT_P(value);
- }
pos++;
} while (Z_ISUNDEF_P(value));
@@ -1115,17 +1112,11 @@ zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *ob
void zend_register_generator_ce(void) /* {{{ */
{
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY(ce, "Generator", class_Generator_methods);
- zend_ce_generator = zend_register_internal_class(&ce);
- zend_ce_generator->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ zend_ce_generator = register_class_Generator(zend_ce_iterator);
zend_ce_generator->create_object = zend_generator_create;
zend_ce_generator->serialize = zend_class_serialize_deny;
zend_ce_generator->unserialize = zend_class_unserialize_deny;
-
/* get_iterator has to be assigned *after* implementing the interface */
- zend_class_implements(zend_ce_generator, 1, zend_ce_iterator);
zend_ce_generator->get_iterator = zend_generator_get_iterator;
memcpy(&zend_generator_handlers, &std_object_handlers, sizeof(zend_object_handlers));
@@ -1135,7 +1126,6 @@ void zend_register_generator_ce(void) /* {{{ */
zend_generator_handlers.clone_obj = NULL;
zend_generator_handlers.get_constructor = zend_generator_get_constructor;
- INIT_CLASS_ENTRY(ce, "ClosedGeneratorException", NULL);
- zend_ce_ClosedGeneratorException = zend_register_internal_class_ex(&ce, zend_ce_exception);
+ zend_ce_ClosedGeneratorException = register_class_ClosedGeneratorException(zend_ce_exception);
}
/* }}} */
diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h
index 35ff09c99d..17b25a99b8 100644
--- a/Zend/zend_generators.h
+++ b/Zend/zend_generators.h
@@ -41,10 +41,7 @@ struct _zend_generator_node {
uint32_t children;
union {
HashTable *ht; /* if multiple children */
- struct { /* if one child */
- zend_generator *leaf; /* TODO: Unused, remove. */
- zend_generator *child;
- } single;
+ zend_generator *single; /* if one child */
} child;
/* One generator can cache a direct pointer to the current root.
* The leaf member points back to the generator using the root cache. */
@@ -97,7 +94,7 @@ static const zend_uchar ZEND_GENERATOR_AT_FIRST_YIELD = 0x4;
static const zend_uchar ZEND_GENERATOR_DO_INIT = 0x8;
void zend_register_generator_ce(void);
-ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished_execution);
+ZEND_API void zend_generator_close(zend_generator *generator, bool finished_execution);
ZEND_API void zend_generator_resume(zend_generator *generator);
ZEND_API void zend_generator_restore_call_stack(zend_generator *generator);
diff --git a/Zend/zend_generators.stub.php b/Zend/zend_generators.stub.php
index 751b328d4c..538596213a 100644
--- a/Zend/zend_generators.stub.php
+++ b/Zend/zend_generators.stub.php
@@ -1,7 +1,8 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+/** @strict-properties */
final class Generator implements Iterator
{
public function rewind(): void {}
diff --git a/Zend/zend_generators_arginfo.h b/Zend/zend_generators_arginfo.h
index 2b6f22f9f5..17a82b1f4b 100644
--- a/Zend/zend_generators_arginfo.h
+++ b/Zend/zend_generators_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 50044c6c8d2a162a988906c0b752a5fe28adb933 */
+ * Stub hash: 06d4e8126db48fe8633ecd40b93904a0f9c59263 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_rewind, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO()
@@ -51,3 +51,25 @@ static const zend_function_entry class_Generator_methods[] = {
static const zend_function_entry class_ClosedGeneratorException_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Generator(zend_class_entry *class_entry_Iterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Generator", class_Generator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ zend_class_implements(class_entry, 1, class_entry_Iterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ClosedGeneratorException(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ClosedGeneratorException", class_ClosedGeneratorException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+
+ return class_entry;
+}
diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h
index e0e8ac7700..6ea35f3f36 100644
--- a/Zend/zend_globals.h
+++ b/Zend/zend_globals.h
@@ -81,19 +81,23 @@ struct _zend_compiler_globals {
/* Refer to zend_yytnamerr() in zend_language_parser.y for meaning of values */
zend_uchar parse_error;
- zend_bool in_compilation;
- zend_bool short_tags;
+ bool in_compilation;
+ bool short_tags;
- zend_bool unclean_shutdown;
+ bool unclean_shutdown;
- zend_bool ini_parser_unbuffered_errors;
+ bool ini_parser_unbuffered_errors;
zend_llist open_files;
struct _zend_ini_parser_param *ini_parser_param;
- zend_bool skip_shebang;
- zend_bool increment_lineno;
+ bool skip_shebang;
+ bool increment_lineno;
+
+ bool variable_width_locale; /* UTF-8, Shift-JIS, Big5, ISO 2022, EUC, etc */
+ bool ascii_compatible_locale; /* locale uses ASCII characters as singletons */
+ /* and don't use them as lead/trail units */
zend_string *doc_comment;
uint32_t extra_fn_flags;
@@ -109,9 +113,9 @@ struct _zend_compiler_globals {
const zend_encoding **script_encoding_list;
size_t script_encoding_list_size;
- zend_bool multibyte;
- zend_bool detect_unicode;
- zend_bool encoding_declared;
+ bool multibyte;
+ bool detect_unicode;
+ bool encoding_declared;
zend_ast *ast;
zend_arena *ast_arena;
@@ -126,6 +130,8 @@ struct _zend_compiler_globals {
HashTable *delayed_variance_obligations;
HashTable *delayed_autoloads;
+ HashTable *unlinked_uses;
+ zend_class_entry *current_linking_class;
uint32_t rtd_key_counter;
@@ -176,13 +182,13 @@ struct _zend_executor_globals {
uint32_t persistent_classes_count;
HashTable *in_autoload;
- zend_bool full_tables_cleanup;
+ bool full_tables_cleanup;
/* for extended information support */
- zend_bool no_extensions;
+ bool no_extensions;
- zend_bool vm_interrupt;
- zend_bool timed_out;
+ bool vm_interrupt;
+ bool timed_out;
zend_long hard_timeout;
#ifdef ZEND_WIN32
@@ -205,7 +211,7 @@ struct _zend_executor_globals {
/* timeout support */
zend_long timeout_seconds;
- int lambda_count;
+ int capture_warnings_during_sccp;
HashTable *ini_directives;
HashTable *modified_ini_directives;
@@ -218,7 +224,7 @@ struct _zend_executor_globals {
struct _zend_module_entry *current_module;
- zend_bool active;
+ bool active;
zend_uchar flags;
zend_long assertions;
@@ -238,7 +244,7 @@ struct _zend_executor_globals {
HashTable weakrefs;
- zend_bool exception_ignore_args;
+ bool exception_ignore_args;
zend_long exception_string_param_max_len;
zend_get_gc_buffer get_gc_buffer;
@@ -264,7 +270,7 @@ struct _zend_ini_scanner_globals {
int yy_state;
zend_stack state_stack;
- char *filename;
+ zend_string *filename;
int lineno;
/* Modes are: ZEND_INI_SCANNER_NORMAL, ZEND_INI_SCANNER_RAW, ZEND_INI_SCANNER_TYPED */
@@ -291,9 +297,9 @@ struct _zend_php_scanner_globals {
zend_stack state_stack;
zend_ptr_stack heredoc_label_stack;
zend_stack nest_location_stack; /* for syntax error reporting */
- zend_bool heredoc_scan_ahead;
+ bool heredoc_scan_ahead;
int heredoc_indentation;
- zend_bool heredoc_indentation_uses_spaces;
+ bool heredoc_indentation_uses_spaces;
/* original (unfiltered) script */
unsigned char *script_org;
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index a3b62160dc..e52939b1eb 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -246,7 +246,7 @@ ZEND_API const HashTable zend_empty_array = {
.pDestructor = ZVAL_PTR_DTOR
};
-static zend_always_inline void _zend_hash_init_int(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent)
+static zend_always_inline void _zend_hash_init_int(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, bool persistent)
{
GC_SET_REFCOUNT(ht, 1);
GC_TYPE_INFO(ht) = GC_ARRAY | (persistent ? ((GC_PERSISTENT|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT) : 0);
@@ -261,7 +261,7 @@ static zend_always_inline void _zend_hash_init_int(HashTable *ht, uint32_t nSize
ht->nTableSize = zend_hash_check_size(nSize);
}
-ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent)
+ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, bool persistent)
{
_zend_hash_init_int(ht, nSize, pDestructor, persistent);
}
@@ -310,7 +310,7 @@ static void ZEND_FASTCALL zend_hash_packed_grow(HashTable *ht)
HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), HT_USED_SIZE(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT));
}
-ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, zend_bool packed)
+ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, bool packed)
{
IS_CONSISTENT(ht);
@@ -365,7 +365,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_to_packed(HashTable *ht)
pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
}
-ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, zend_bool packed)
+ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, bool packed)
{
HT_ASSERT_RC1(ht);
if (nSize == 0) return;
@@ -636,7 +636,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_iterators_advance(HashTable *ht, HashPosit
}
}
-static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, zend_string *key, zend_bool known_hash)
+static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, zend_string *key, bool known_hash)
{
zend_ulong h;
uint32_t nIndex;
@@ -730,31 +730,27 @@ static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_s
IS_CONSISTENT(ht);
HT_ASSERT_RC1(ht);
+ if (!ZSTR_IS_INTERNED(key)) {
+ zend_string_hash_val(key);
+ }
+
if (UNEXPECTED(HT_FLAGS(ht) & (HASH_FLAG_UNINITIALIZED|HASH_FLAG_PACKED))) {
if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) {
zend_hash_real_init_mixed(ht);
- if (!ZSTR_IS_INTERNED(key)) {
- zend_string_addref(key);
- HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
- zend_string_hash_val(key);
- }
goto add_to_hash;
} else {
zend_hash_packed_to_hash(ht);
- if (!ZSTR_IS_INTERNED(key)) {
- zend_string_addref(key);
- HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
- zend_string_hash_val(key);
- }
}
} else if ((flag & HASH_ADD_NEW) == 0 || ZEND_DEBUG) {
- p = zend_hash_find_bucket(ht, key, 0);
+ p = zend_hash_find_bucket(ht, key, 1);
if (p) {
zval *data;
ZEND_ASSERT((flag & HASH_ADD_NEW) == 0);
- if (flag & HASH_ADD) {
+ if (flag & HASH_LOOKUP) {
+ return &p->val;
+ } else if (flag & HASH_ADD) {
if (!(flag & HASH_UPDATE_INDIRECT)) {
return NULL;
}
@@ -781,19 +777,15 @@ static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_s
ZVAL_COPY_VALUE(data, pData);
return data;
}
- if (!ZSTR_IS_INTERNED(key)) {
- zend_string_addref(key);
- HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
- }
- } else if (!ZSTR_IS_INTERNED(key)) {
- zend_string_addref(key);
- HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
- zend_string_hash_val(key);
}
ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */
add_to_hash:
+ if (!ZSTR_IS_INTERNED(key)) {
+ zend_string_addref(key);
+ HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
+ }
idx = ht->nNumUsed++;
ht->nNumOfElements++;
arData = ht->arData;
@@ -803,7 +795,11 @@ add_to_hash:
nIndex = h | ht->nTableMask;
Z_NEXT(p->val) = HT_HASH_EX(arData, nIndex);
HT_HASH_EX(arData, nIndex) = HT_IDX_TO_HASH(idx);
- ZVAL_COPY_VALUE(&p->val, pData);
+ if (flag & HASH_LOOKUP) {
+ ZVAL_NULL(&p->val);
+ } else {
+ ZVAL_COPY_VALUE(&p->val, pData);
+ }
return &p->val;
}
@@ -831,7 +827,9 @@ static zend_always_inline zval *_zend_hash_str_add_or_update_i(HashTable *ht, co
if (p) {
zval *data;
- if (flag & HASH_ADD) {
+ if (flag & HASH_LOOKUP) {
+ return &p->val;
+ } else if (flag & HASH_ADD) {
if (!(flag & HASH_UPDATE_INDIRECT)) {
return NULL;
}
@@ -869,7 +867,11 @@ add_to_hash:
p->key = key = zend_string_init(str, len, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
p->h = ZSTR_H(key) = h;
HT_FLAGS(ht) &= ~HASH_FLAG_STATIC_KEYS;
- ZVAL_COPY_VALUE(&p->val, pData);
+ if (flag & HASH_LOOKUP) {
+ ZVAL_NULL(&p->val);
+ } else {
+ ZVAL_COPY_VALUE(&p->val, pData);
+ }
nIndex = h | ht->nTableMask;
Z_NEXT(p->val) = HT_HASH(ht, nIndex);
HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(idx);
@@ -911,6 +913,11 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key,
return _zend_hash_add_or_update_i(ht, key, pData, HASH_ADD_NEW);
}
+ZEND_API zval* ZEND_FASTCALL zend_hash_lookup(HashTable *ht, zend_string *key)
+{
+ return _zend_hash_add_or_update_i(ht, key, NULL, HASH_LOOKUP);
+}
+
ZEND_API zval* ZEND_FASTCALL zend_hash_str_add_or_update(HashTable *ht, const char *str, size_t len, zval *pData, uint32_t flag)
{
if (flag == HASH_ADD) {
@@ -994,6 +1001,9 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
if (h < ht->nNumUsed) {
p = ht->arData + h;
if (Z_TYPE(p->val) != IS_UNDEF) {
+ if (flag & HASH_LOOKUP) {
+ return &p->val;
+ }
replace:
if (flag & HASH_ADD) {
return NULL;
@@ -1042,6 +1052,9 @@ convert_to_hash:
if ((flag & HASH_ADD_NEW) == 0 || ZEND_DEBUG) {
p = zend_hash_index_find_bucket(ht, h);
if (p) {
+ if (flag & HASH_LOOKUP) {
+ return &p->val;
+ }
ZEND_ASSERT((flag & HASH_ADD_NEW) == 0);
goto replace;
}
@@ -1061,7 +1074,11 @@ add:
ht->nNumOfElements++;
p->h = h;
p->key = NULL;
- ZVAL_COPY_VALUE(&p->val, pData);
+ if (flag & HASH_LOOKUP) {
+ ZVAL_NULL(&p->val);
+ } else {
+ ZVAL_COPY_VALUE(&p->val, pData);
+ }
return &p->val;
}
@@ -1109,6 +1126,11 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert_new(HashTable *ht, zval
return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW | HASH_ADD_NEXT);
}
+ZEND_API zval* ZEND_FASTCALL zend_hash_index_lookup(HashTable *ht, zend_ulong h)
+{
+ return _zend_hash_index_add_or_update_i(ht, h, NULL, HASH_LOOKUP);
+}
+
ZEND_API zval* ZEND_FASTCALL zend_hash_set_bucket_key(HashTable *ht, Bucket *b, zend_string *key)
{
uint32_t nIndex;
@@ -2145,7 +2167,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
}
-ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, zend_bool overwrite)
+ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, bool overwrite)
{
uint32_t idx;
Bucket *p;
@@ -2203,7 +2225,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source
}
-static zend_bool ZEND_FASTCALL zend_hash_replace_checker_wrapper(HashTable *target, zval *source_data, Bucket *p, void *pParam, merge_checker_func_t merge_checker_func)
+static bool ZEND_FASTCALL zend_hash_replace_checker_wrapper(HashTable *target, zval *source_data, Bucket *p, void *pParam, merge_checker_func_t merge_checker_func)
{
zend_hash_key hash_key;
@@ -2494,7 +2516,7 @@ ZEND_API void zend_hash_bucket_packed_swap(Bucket *p, Bucket *q)
q->h = h;
}
-ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, bucket_compare_func_t compar, zend_bool renumber)
+ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, bucket_compare_func_t compar, bool renumber)
{
Bucket *p;
uint32_t i, j;
@@ -2566,7 +2588,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, b
}
}
-static zend_always_inline int zend_hash_compare_impl(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered) {
+static zend_always_inline int zend_hash_compare_impl(HashTable *ht1, HashTable *ht2, compare_func_t compar, bool ordered) {
uint32_t idx1, idx2;
if (ht1->nNumOfElements != ht2->nNumOfElements) {
@@ -2644,7 +2666,7 @@ static zend_always_inline int zend_hash_compare_impl(HashTable *ht1, HashTable *
return 0;
}
-ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered)
+ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, bool ordered)
{
int result;
IS_CONSISTENT(ht1);
@@ -2803,7 +2825,7 @@ convert:
* a "symtable" (contains integer and non-numeric string keys).
* If the proptable didn't need duplicating, its refcount is incremented.
*/
-ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, zend_bool always_duplicate)
+ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, bool always_duplicate)
{
zend_ulong num_key;
zend_string *str_key;
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index ced21a2ca1..25d48f6237 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -32,6 +32,7 @@
#define HASH_UPDATE_INDIRECT (1<<2)
#define HASH_ADD_NEW (1<<3)
#define HASH_ADD_NEXT (1<<4)
+#define HASH_LOOKUP (1<<5)
#define HASH_FLAG_CONSISTENCY ((1<<0) | (1<<1))
#define HASH_FLAG_PACKED (1<<2)
@@ -92,24 +93,24 @@ typedef struct _zend_hash_key {
zend_string *key;
} zend_hash_key;
-typedef zend_bool (*merge_checker_func_t)(HashTable *target_ht, zval *source_data, zend_hash_key *hash_key, void *pParam);
+typedef bool (*merge_checker_func_t)(HashTable *target_ht, zval *source_data, zend_hash_key *hash_key, void *pParam);
BEGIN_EXTERN_C()
/* startup/shutdown */
-ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent);
+ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, bool persistent);
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht);
ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht);
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) \
_zend_hash_init((ht), (nSize), (pDestructor), (persistent))
-ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, zend_bool packed);
+ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, bool packed);
ZEND_API void ZEND_FASTCALL zend_hash_real_init_packed(HashTable *ht);
ZEND_API void ZEND_FASTCALL zend_hash_real_init_mixed(HashTable *ht);
ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht);
ZEND_API void ZEND_FASTCALL zend_hash_to_packed(HashTable *ht);
-ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, zend_bool packed);
+ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, bool packed);
ZEND_API void ZEND_FASTCALL zend_hash_discard(HashTable *ht, uint32_t nNumUsed);
/* additions/updates/changes */
@@ -178,7 +179,7 @@ ZEND_API zval* ZEND_FASTCALL _zend_hash_index_find(const HashTable *ht, zend_ulo
/* The same as zend_hash_find(), but hash value of the key must be already calculated */
ZEND_API zval* ZEND_FASTCALL _zend_hash_find_known_hash(const HashTable *ht, zend_string *key);
-static zend_always_inline zval *zend_hash_find_ex(const HashTable *ht, zend_string *key, zend_bool known_hash)
+static zend_always_inline zval *zend_hash_find_ex(const HashTable *ht, zend_string *key, bool known_hash)
{
if (known_hash) {
return _zend_hash_find_known_hash(ht, key);
@@ -206,18 +207,34 @@ static zend_always_inline zval *zend_hash_find_ex(const HashTable *ht, zend_stri
} while (0)
+/* Find or add NULL, if doesn't exist */
+ZEND_API zval* ZEND_FASTCALL zend_hash_lookup(HashTable *ht, zend_string *key);
+ZEND_API zval* ZEND_FASTCALL zend_hash_index_lookup(HashTable *ht, zend_ulong h);
+
+#define ZEND_HASH_INDEX_LOOKUP(_ht, _h, _ret) do { \
+ if (EXPECTED(HT_FLAGS(_ht) & HASH_FLAG_PACKED)) { \
+ if (EXPECTED((zend_ulong)(_h) < (zend_ulong)(_ht)->nNumUsed)) { \
+ _ret = &_ht->arData[_h].val; \
+ if (EXPECTED(Z_TYPE_P(_ret) != IS_UNDEF)) { \
+ break; \
+ } \
+ } \
+ } \
+ _ret = zend_hash_index_lookup(_ht, _h); \
+ } while (0)
+
/* Misc */
-static zend_always_inline zend_bool zend_hash_exists(const HashTable *ht, zend_string *key)
+static zend_always_inline bool zend_hash_exists(const HashTable *ht, zend_string *key)
{
return zend_hash_find(ht, key) != NULL;
}
-static zend_always_inline zend_bool zend_hash_str_exists(const HashTable *ht, const char *str, size_t len)
+static zend_always_inline bool zend_hash_str_exists(const HashTable *ht, const char *str, size_t len)
{
return zend_hash_str_find(ht, str, len) != NULL;
}
-static zend_always_inline zend_bool zend_hash_index_exists(const HashTable *ht, zend_ulong h)
+static zend_always_inline bool zend_hash_index_exists(const HashTable *ht, zend_ulong h)
{
return zend_hash_index_find(ht, h) != NULL;
}
@@ -257,15 +274,15 @@ ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_end_ex(HashTable *ht, Ha
/* Copying, merging and sorting */
ZEND_API void ZEND_FASTCALL zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor);
-ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, zend_bool overwrite);
+ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, bool overwrite);
ZEND_API void ZEND_FASTCALL zend_hash_merge_ex(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, merge_checker_func_t pMergeSource, void *pParam);
ZEND_API void zend_hash_bucket_swap(Bucket *p, Bucket *q);
ZEND_API void zend_hash_bucket_renum_swap(Bucket *p, Bucket *q);
ZEND_API void zend_hash_bucket_packed_swap(Bucket *p, Bucket *q);
typedef int (*bucket_compare_func_t)(Bucket *a, Bucket *b);
-ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered);
-ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort_func, bucket_compare_func_t compare_func, zend_bool renumber);
+ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, bool ordered);
+ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort_func, bucket_compare_func_t compare_func, bool renumber);
ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, bucket_compare_func_t compar, uint32_t flag);
#define zend_hash_sort(ht, compare_func, renumber) \
@@ -303,7 +320,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source);
ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht);
ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht);
ZEND_API HashTable* ZEND_FASTCALL zend_symtable_to_proptable(HashTable *ht);
-ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, zend_bool always_duplicate);
+ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, bool always_duplicate);
ZEND_API bool ZEND_FASTCALL _zend_handle_numeric_str_ex(const char *key, size_t length, zend_ulong *idx);
@@ -386,7 +403,7 @@ static zend_always_inline zval *zend_hash_find_ind(const HashTable *ht, zend_str
}
-static zend_always_inline zval *zend_hash_find_ex_ind(const HashTable *ht, zend_string *key, zend_bool known_hash)
+static zend_always_inline zval *zend_hash_find_ex_ind(const HashTable *ht, zend_string *key, bool known_hash)
{
zval *zv;
@@ -839,7 +856,7 @@ static zend_always_inline void *zend_hash_find_ptr(const HashTable *ht, zend_str
}
}
-static zend_always_inline void *zend_hash_find_ex_ptr(const HashTable *ht, zend_string *key, zend_bool known_hash)
+static zend_always_inline void *zend_hash_find_ex_ptr(const HashTable *ht, zend_string *key, bool known_hash)
{
zval *zv;
@@ -1188,6 +1205,33 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
ZEND_HASH_FILL_FINISH(); \
} while (0)
+/* Check if an array is a list */
+static zend_always_inline zend_bool zend_array_is_list(zend_array *array)
+{
+ zend_long expected_idx = 0;
+ zend_long num_idx;
+ zend_string* str_idx;
+ /* Empty arrays are lists */
+ if (zend_hash_num_elements(array) == 0) {
+ return 1;
+ }
+
+ /* Packed arrays are lists */
+ if (HT_IS_PACKED(array) && HT_IS_WITHOUT_HOLES(array)) {
+ return 1;
+ }
+
+ /* Check if the list could theoretically be repacked */
+ ZEND_HASH_FOREACH_KEY(array, num_idx, str_idx) {
+ if (str_idx != NULL || num_idx != expected_idx++) {
+ return 0;
+ }
+ } ZEND_HASH_FOREACH_END();
+
+ return 1;
+}
+
+
static zend_always_inline zval *_zend_hash_append_ex(HashTable *ht, zend_string *key, zval *zv, bool interned)
{
uint32_t idx = ht->nNumUsed++;
diff --git a/Zend/zend_highlight.h b/Zend/zend_highlight.h
index c4f819d508..e54a339ec4 100644
--- a/Zend/zend_highlight.h
+++ b/Zend/zend_highlight.h
@@ -40,7 +40,7 @@ BEGIN_EXTERN_C()
ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini);
ZEND_API void zend_strip(void);
ZEND_API zend_result highlight_file(const char *filename, zend_syntax_highlighter_ini *syntax_highlighter_ini);
-ZEND_API void highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, const char *str_name);
+ZEND_API void highlight_string(zend_string *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, const char *str_name);
ZEND_API void zend_html_putc(char c);
ZEND_API void zend_html_puts(const char *s, size_t len);
END_EXTERN_C()
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index 4b161692af..a78a0bd4f7 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -26,6 +26,10 @@
#include "zend_smart_str.h"
#include "zend_operators.h"
#include "zend_exceptions.h"
+#include "zend_enum.h"
+
+ZEND_API zend_class_entry* (*zend_inheritance_cache_get)(zend_class_entry *ce, zend_class_entry *parent, zend_class_entry **traits_and_interfaces) = NULL;
+ZEND_API zend_class_entry* (*zend_inheritance_cache_add)(zend_class_entry *ce, zend_class_entry *proto, zend_class_entry *parent, zend_class_entry **traits_and_interfaces, HashTable *dependencies) = NULL;
static void add_dependency_obligation(zend_class_entry *ce, zend_class_entry *dependency_ce);
static void add_compatibility_obligation(
@@ -35,7 +39,7 @@ static void add_property_compatibility_obligation(
zend_class_entry *ce, const zend_property_info *child_prop,
const zend_property_info *parent_prop);
-static void zend_type_copy_ctor(zend_type *type, zend_bool persistent) {
+static void zend_type_copy_ctor(zend_type *type, bool persistent) {
if (ZEND_TYPE_HAS_LIST(*type)) {
zend_type_list *old_list = ZEND_TYPE_LIST(*type);
size_t size = ZEND_TYPE_LIST_SIZE(old_list->num_types);
@@ -86,32 +90,14 @@ static zend_function *zend_duplicate_internal_function(zend_function *func, zend
static zend_function *zend_duplicate_user_function(zend_function *func) /* {{{ */
{
- zend_function *new_function;
-
- new_function = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
- memcpy(new_function, func, sizeof(zend_op_array));
-
- if (CG(compiler_options) & ZEND_COMPILE_PRELOAD) {
- ZEND_ASSERT(new_function->op_array.fn_flags & ZEND_ACC_PRELOADED);
- ZEND_MAP_PTR_NEW(new_function->op_array.static_variables_ptr);
- } else {
- ZEND_MAP_PTR_INIT(new_function->op_array.static_variables_ptr, &new_function->op_array.static_variables);
- }
-
- HashTable *static_properties_ptr = ZEND_MAP_PTR_GET(func->op_array.static_variables_ptr);
- if (static_properties_ptr) {
- /* See: Zend/tests/method_static_var.phpt */
- ZEND_MAP_PTR_SET(new_function->op_array.static_variables_ptr, static_properties_ptr);
- GC_TRY_ADDREF(static_properties_ptr);
- } else {
- GC_TRY_ADDREF(new_function->op_array.static_variables);
- }
-
- return new_function;
+ zend_op_array *new_op_array = zend_arena_alloc(&CG(arena), sizeof(zend_op_array));
+ memcpy(new_op_array, func, sizeof(zend_op_array));
+ zend_init_static_variables_map_ptr(new_op_array);
+ return (zend_function *) new_op_array;
}
/* }}} */
-static zend_always_inline zend_function *zend_duplicate_function(zend_function *func, zend_class_entry *ce, zend_bool is_interface) /* {{{ */
+static zend_always_inline zend_function *zend_duplicate_function(zend_function *func, zend_class_entry *ce, bool is_interface) /* {{{ */
{
if (UNEXPECTED(func->type == ZEND_INTERNAL_FUNCTION)) {
return zend_duplicate_internal_function(func, ce);
@@ -229,7 +215,7 @@ static zend_string *resolve_class_name(zend_class_entry *scope, zend_string *nam
}
}
-static zend_bool class_visible(zend_class_entry *ce) {
+static bool class_visible(zend_class_entry *ce) {
if (ce->type == ZEND_INTERNAL_CLASS) {
return !(CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_CLASSES);
} else {
@@ -240,7 +226,7 @@ static zend_bool class_visible(zend_class_entry *ce) {
}
static zend_class_entry *lookup_class(
- zend_class_entry *scope, zend_string *name, zend_bool register_unresolved) {
+ zend_class_entry *scope, zend_string *name, bool register_unresolved) {
uint32_t flags = ZEND_FETCH_CLASS_ALLOW_UNLINKED | ZEND_FETCH_CLASS_NO_AUTOLOAD;
zend_class_entry *ce = zend_lookup_class_ex(name, NULL, flags);
if (!CG(in_compilation)) {
@@ -271,7 +257,7 @@ static zend_class_entry *lookup_class(
}
/* Instanceof that's safe to use on unlinked classes. */
-static zend_bool unlinked_instanceof(zend_class_entry *ce1, zend_class_entry *ce2) {
+static bool unlinked_instanceof(zend_class_entry *ce1, zend_class_entry *ce2) {
if (ce1 == ce2) {
return 1;
}
@@ -322,7 +308,7 @@ static zend_bool unlinked_instanceof(zend_class_entry *ce1, zend_class_entry *ce
return 0;
}
-static zend_bool zend_type_contains_traversable(zend_type type) {
+static bool zend_type_contains_traversable(zend_type type) {
zend_type *single_type;
if (ZEND_TYPE_FULL_MASK(type) & MAY_BE_OBJECT) {
return 1;
@@ -337,7 +323,7 @@ static zend_bool zend_type_contains_traversable(zend_type type) {
return 0;
}
-static zend_bool zend_type_permits_self(
+static bool zend_type_permits_self(
zend_type type, zend_class_entry *scope, zend_class_entry *self) {
if (ZEND_TYPE_FULL_MASK(type) & MAY_BE_OBJECT) {
return 1;
@@ -368,11 +354,52 @@ typedef enum {
INHERITANCE_SUCCESS = 1,
} inheritance_status;
+
+static void track_class_dependency(zend_class_entry *ce, zend_string *class_name)
+{
+ HashTable *ht;
+
+ if (!CG(current_linking_class) || ce == CG(current_linking_class)) {
+ return;
+ } else if (!class_name) {
+ class_name = ce->name;
+ } else if (zend_string_equals_literal_ci(class_name, "self")
+ || zend_string_equals_literal_ci(class_name, "parent")) {
+ return;
+ }
+
+ ht = (HashTable*)CG(current_linking_class)->inheritance_cache;
+
+#ifndef ZEND_WIN32
+ if (ce->type == ZEND_USER_CLASS && !(ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
+#else
+ if (!(ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
+#endif
+ // TODO: dependency on not-immutable class ???
+ if (ht) {
+ zend_hash_destroy(ht);
+ FREE_HASHTABLE(ht);
+ CG(current_linking_class)->inheritance_cache = NULL;
+ }
+ CG(current_linking_class)->ce_flags &= ~ZEND_ACC_CACHEABLE;
+ CG(current_linking_class) = NULL;
+ return;
+ }
+
+ /* Record dependency */
+ if (!ht) {
+ ALLOC_HASHTABLE(ht);
+ zend_hash_init(ht, 0, NULL, NULL, 0);
+ CG(current_linking_class)->inheritance_cache = (zend_inheritance_cache_entry*)ht;
+ }
+ zend_hash_add_ptr(ht, class_name, ce);
+}
+
static inheritance_status zend_perform_covariant_class_type_check(
zend_class_entry *fe_scope, zend_string *fe_class_name, zend_class_entry *fe_ce,
zend_class_entry *proto_scope, zend_type proto_type,
- zend_bool register_unresolved) {
- zend_bool have_unresolved = 0;
+ bool register_unresolved) {
+ bool have_unresolved = 0;
if (ZEND_TYPE_FULL_MASK(proto_type) & MAY_BE_OBJECT) {
/* Currently, any class name would be allowed here. We still perform a class lookup
* for forward-compatibility reasons, as we may have named types in the future that
@@ -381,6 +408,7 @@ static inheritance_status zend_perform_covariant_class_type_check(
if (!fe_ce) {
have_unresolved = 1;
} else {
+ track_class_dependency(fe_ce, fe_class_name);
return INHERITANCE_SUCCESS;
}
}
@@ -389,6 +417,7 @@ static inheritance_status zend_perform_covariant_class_type_check(
if (!fe_ce) {
have_unresolved = 1;
} else if (unlinked_instanceof(fe_ce, zend_ce_traversable)) {
+ track_class_dependency(fe_ce, fe_class_name);
return INHERITANCE_SUCCESS;
}
}
@@ -396,8 +425,9 @@ static inheritance_status zend_perform_covariant_class_type_check(
zend_type *single_type;
ZEND_TYPE_FOREACH(proto_type, single_type) {
zend_class_entry *proto_ce;
+ zend_string *proto_class_name = NULL;
if (ZEND_TYPE_HAS_NAME(*single_type)) {
- zend_string *proto_class_name =
+ proto_class_name =
resolve_class_name(proto_scope, ZEND_TYPE_NAME(*single_type));
if (zend_string_equals_ci(fe_class_name, proto_class_name)) {
return INHERITANCE_SUCCESS;
@@ -416,6 +446,8 @@ static inheritance_status zend_perform_covariant_class_type_check(
if (!fe_ce || !proto_ce) {
have_unresolved = 1;
} else if (unlinked_instanceof(fe_ce, proto_ce)) {
+ track_class_dependency(fe_ce, fe_class_name);
+ track_class_dependency(proto_ce, proto_class_name);
return INHERITANCE_SUCCESS;
}
} ZEND_TYPE_FOREACH_END();
@@ -458,7 +490,7 @@ static inheritance_status zend_perform_covariant_type_check(
}
zend_type *single_type;
- zend_bool all_success = 1;
+ bool all_success = 1;
/* First try to check whether we can succeed without resolving anything */
ZEND_TYPE_FOREACH(fe_type, single_type) {
@@ -540,7 +572,7 @@ static inheritance_status zend_do_perform_implementation_check(
{
uint32_t i, num_args, proto_num_args, fe_num_args;
inheritance_status status, local_status;
- zend_bool proto_is_variadic, fe_is_variadic;
+ bool proto_is_variadic, fe_is_variadic;
/* Checks for constructors only if they are declared in an interface,
* or explicitly marked as abstract
@@ -663,8 +695,12 @@ static ZEND_COLD zend_string *zend_get_function_declaration(
}
if (fptr->common.scope) {
- /* cut off on NULL byte ... class@anonymous */
- smart_str_appendl(&str, ZSTR_VAL(fptr->common.scope->name), strlen(ZSTR_VAL(fptr->common.scope->name)));
+ if (fptr->common.scope->ce_flags & ZEND_ACC_ANON_CLASS) {
+ /* cut off on NULL byte ... class@anonymous */
+ smart_str_appends(&str, ZSTR_VAL(fptr->common.scope->name));
+ } else {
+ smart_str_appendl(&str, ZSTR_VAL(fptr->common.scope->name), ZSTR_LEN(fptr->common.scope->name));
+ }
smart_str_appends(&str, "::");
}
@@ -833,7 +869,7 @@ static zend_always_inline inheritance_status do_inheritance_check_on_method_ex(
zend_function *child, zend_class_entry *child_scope,
zend_function *parent, zend_class_entry *parent_scope,
zend_class_entry *ce, zval *child_zv,
- zend_bool check_visibility, zend_bool check_only, zend_bool checked) /* {{{ */
+ bool check_visibility, bool check_only, bool checked) /* {{{ */
{
uint32_t child_flags;
uint32_t parent_flags = parent->common.fn_flags;
@@ -943,12 +979,12 @@ static zend_always_inline inheritance_status do_inheritance_check_on_method_ex(
static zend_never_inline void do_inheritance_check_on_method(
zend_function *child, zend_class_entry *child_scope,
zend_function *parent, zend_class_entry *parent_scope,
- zend_class_entry *ce, zval *child_zv, zend_bool check_visibility)
+ zend_class_entry *ce, zval *child_zv, bool check_visibility)
{
do_inheritance_check_on_method_ex(child, child_scope, parent, parent_scope, ce, child_zv, check_visibility, 0, 0);
}
-static zend_always_inline void do_inherit_method(zend_string *key, zend_function *parent, zend_class_entry *ce, zend_bool is_interface, zend_bool checked) /* {{{ */
+static zend_always_inline void do_inherit_method(zend_string *key, zend_function *parent, zend_class_entry *ce, bool is_interface, bool checked) /* {{{ */
{
zval *child = zend_hash_find_ex(&ce->function_table, key, 1);
@@ -1139,6 +1175,12 @@ static void do_inherit_class_constant(zend_string *name, zend_class_constant *pa
} else if (!(Z_ACCESS_FLAGS(parent_const->value) & ZEND_ACC_PRIVATE)) {
if (Z_TYPE(parent_const->value) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
+ ce->ce_flags |= ZEND_ACC_HAS_AST_CONSTANTS;
+ if (ce->parent->ce_flags & ZEND_ACC_IMMUTABLE) {
+ c = zend_arena_alloc(&CG(arena), sizeof(zend_class_constant));
+ memcpy(c, parent_const, sizeof(zend_class_constant));
+ parent_const = c;
+ }
}
if (ce->type & ZEND_INTERNAL_CLASS) {
c = pemalloc(sizeof(zend_class_constant), 1);
@@ -1189,7 +1231,7 @@ void zend_build_properties_info_table(zend_class_entry *ce)
} ZEND_HASH_FOREACH_END();
}
-ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *parent_ce, zend_bool checked) /* {{{ */
+ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *parent_ce, bool checked) /* {{{ */
{
zend_property_info *property_info;
zend_function *func;
@@ -1251,6 +1293,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par
ZVAL_COPY_OR_DUP_PROP(dst, src);
if (Z_OPT_TYPE_P(dst) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
+ ce->ce_flags |= ZEND_ACC_HAS_AST_PROPERTIES;
}
continue;
} while (dst != end);
@@ -1261,6 +1304,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par
ZVAL_COPY_PROP(dst, src);
if (Z_OPT_TYPE_P(dst) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
+ ce->ce_flags |= ZEND_ACC_HAS_AST_PROPERTIES;
}
continue;
} while (dst != end);
@@ -1323,6 +1367,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par
}
if (Z_TYPE_P(Z_INDIRECT_P(dst)) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
+ ce->ce_flags |= ZEND_ACC_HAS_AST_STATICS;
}
} while (dst != end);
} else {
@@ -1412,7 +1457,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par
}
/* }}} */
-static zend_bool do_inherit_constant_check(HashTable *child_constants_table, zend_class_constant *parent_constant, zend_string *name, const zend_class_entry *iface) /* {{{ */
+static bool do_inherit_constant_check(HashTable *child_constants_table, zend_class_constant *parent_constant, zend_string *name, const zend_class_entry *iface) /* {{{ */
{
zval *zv = zend_hash_find_ex(child_constants_table, name, 1);
zend_class_constant *old_constant;
@@ -1434,6 +1479,12 @@ static void do_inherit_iface_constant(zend_string *name, zend_class_constant *c,
zend_class_constant *ct;
if (Z_TYPE(c->value) == IS_CONSTANT_AST) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
+ ce->ce_flags |= ZEND_ACC_HAS_AST_CONSTANTS;
+ if (iface->ce_flags & ZEND_ACC_IMMUTABLE) {
+ ct = zend_arena_alloc(&CG(arena), sizeof(zend_class_constant));
+ memcpy(ct, c, sizeof(zend_class_constant));
+ c = ct;
+ }
}
if (ce->type & ZEND_INTERNAL_CLASS) {
ct = pemalloc(sizeof(zend_class_constant), 1);
@@ -1549,11 +1600,13 @@ static void zend_do_implement_interfaces(zend_class_entry *ce, zend_class_entry
}
}
- for (i = 0; i < ce->num_interfaces; i++) {
- zend_string_release_ex(ce->interface_names[i].name, 0);
- zend_string_release_ex(ce->interface_names[i].lc_name, 0);
+ if (!(ce->ce_flags & ZEND_ACC_CACHED)) {
+ for (i = 0; i < ce->num_interfaces; i++) {
+ zend_string_release_ex(ce->interface_names[i].name, 0);
+ zend_string_release_ex(ce->interface_names[i].lc_name, 0);
+ }
+ efree(ce->interface_names);
}
- efree(ce->interface_names);
ce->num_interfaces = num_interfaces;
ce->interfaces = interfaces;
@@ -1745,6 +1798,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, zend_class_e
zend_trait_precedence **precedences;
zend_trait_precedence *cur_precedence;
zend_trait_method_reference *cur_method_ref;
+ zend_string *lc_trait_name;
zend_string *lcname;
HashTable **exclude_tables = NULL;
zend_class_entry **aliases = NULL;
@@ -1759,9 +1813,10 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, zend_class_e
while ((cur_precedence = precedences[i])) {
/** Resolve classes for all precedence operations. */
cur_method_ref = &cur_precedence->trait_method;
- trait = zend_fetch_class(cur_method_ref->class_name,
- ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD);
- if (!trait) {
+ lc_trait_name = zend_string_tolower(cur_method_ref->class_name);
+ trait = zend_hash_find_ptr(EG(class_table), lc_trait_name);
+ zend_string_release_ex(lc_trait_name, 0);
+ if (!trait || !(trait->ce_flags & ZEND_ACC_LINKED)) {
zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", ZSTR_VAL(cur_method_ref->class_name));
}
zend_check_trait_usage(ce, trait, traits);
@@ -1784,10 +1839,13 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, zend_class_e
for (j = 0; j < cur_precedence->num_excludes; j++) {
zend_string* class_name = cur_precedence->exclude_class_names[j];
- zend_class_entry *exclude_ce = zend_fetch_class(class_name, ZEND_FETCH_CLASS_TRAIT |ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ zend_class_entry *exclude_ce;
uint32_t trait_num;
- if (!exclude_ce) {
+ lc_trait_name = zend_string_tolower(class_name);
+ exclude_ce = zend_hash_find_ptr(EG(class_table), lc_trait_name);
+ zend_string_release_ex(lc_trait_name, 0);
+ if (!exclude_ce || !(exclude_ce->ce_flags & ZEND_ACC_LINKED)) {
zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", ZSTR_VAL(class_name));
}
trait_num = zend_check_trait_usage(ce, exclude_ce, traits);
@@ -1829,8 +1887,10 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, zend_class_e
lcname = zend_string_tolower(cur_method_ref->method_name);
if (cur_method_ref->class_name) {
/* For all aliases with an explicit class name, resolve the class now. */
- trait = zend_fetch_class(cur_method_ref->class_name, ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD);
- if (!trait) {
+ lc_trait_name = zend_string_tolower(cur_method_ref->class_name);
+ trait = zend_hash_find_ptr(EG(class_table), lc_trait_name);
+ zend_string_release_ex(lc_trait_name, 0);
+ if (!trait || !(trait->ce_flags & ZEND_ACC_LINKED)) {
zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", ZSTR_VAL(cur_method_ref->class_name));
}
zend_check_trait_usage(ce, trait, traits);
@@ -1876,9 +1936,6 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, zend_class_e
}
aliases[i] = trait;
-
- /* TODO: try to avoid this assignment (it's necessary only for reflection) */
- cur_method_ref->class_name = zend_string_copy(trait->name);
}
zend_string_release_ex(lcname, 0);
i++;
@@ -1952,7 +2009,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_ent
zend_property_info *new_prop;
zend_string* prop_name;
const char* class_name_unused;
- zend_bool not_compatible;
+ bool not_compatible;
zval* prop_value;
uint32_t flags;
zend_string *doc_comment;
@@ -2074,37 +2131,13 @@ static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_ent
}
/* }}} */
-static void zend_do_bind_traits(zend_class_entry *ce) /* {{{ */
+static void zend_do_bind_traits(zend_class_entry *ce, zend_class_entry **traits) /* {{{ */
{
HashTable **exclude_tables;
zend_class_entry **aliases;
- zend_class_entry **traits, *trait;
- uint32_t i, j;
ZEND_ASSERT(ce->num_traits > 0);
- traits = emalloc(sizeof(zend_class_entry*) * ce->num_traits);
-
- for (i = 0; i < ce->num_traits; i++) {
- trait = zend_fetch_class_by_name(ce->trait_names[i].name,
- ce->trait_names[i].lc_name, ZEND_FETCH_CLASS_TRAIT);
- if (UNEXPECTED(trait == NULL)) {
- return;
- }
- if (UNEXPECTED(!(trait->ce_flags & ZEND_ACC_TRAIT))) {
- zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ZSTR_VAL(ce->name), ZSTR_VAL(trait->name));
- return;
- }
- for (j = 0; j < i; j++) {
- if (traits[j] == trait) {
- /* skip duplications */
- trait = NULL;
- break;
- }
- }
- traits[i] = trait;
- }
-
/* complete initialization of trait strutures in ce */
zend_traits_init_trait_structures(ce, traits, &exclude_tables, &aliases);
@@ -2121,8 +2154,6 @@ static void zend_do_bind_traits(zend_class_entry *ce) /* {{{ */
/* then flatten the properties into it, to, mostly to notfiy developer about problems */
zend_do_traits_property_binding(ce, traits);
-
- efree(traits);
}
/* }}} */
@@ -2162,7 +2193,7 @@ void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */
{
zend_function *func;
zend_abstract_info ai;
- zend_bool is_explicit_abstract = (ce->ce_flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) != 0;
+ bool is_explicit_abstract = (ce->ce_flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) != 0;
memset(&ai, 0, sizeof(ai));
ZEND_HASH_FOREACH_PTR(&ce->function_table, func) {
@@ -2294,7 +2325,12 @@ static int check_variance_obligation(zval *zv) {
if (obligation->type == OBLIGATION_DEPENDENCY) {
zend_class_entry *dependency_ce = obligation->dependency_ce;
if (dependency_ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE) {
+ zend_class_entry *orig_linking_class = CG(current_linking_class);
+
+ CG(current_linking_class) =
+ (dependency_ce->ce_flags & ZEND_ACC_CACHEABLE) ? dependency_ce : NULL;
resolve_delayed_variance_obligations(dependency_ce);
+ CG(current_linking_class) = orig_linking_class;
}
if (!(dependency_ce->ce_flags & ZEND_ACC_LINKED)) {
return ZEND_HASH_APPLY_KEEP;
@@ -2402,7 +2438,10 @@ static void check_unrecoverable_load_failure(zend_class_entry *ce) {
* to remove the class from the class table and throw an exception, because there is already
* a dependence on the inheritance hierarchy of this specific class. Instead we fall back to
* a fatal error, as would happen if we did not allow exceptions in the first place. */
- if (ce->ce_flags & ZEND_ACC_HAS_UNLINKED_USES) {
+ if ((ce->ce_flags & ZEND_ACC_HAS_UNLINKED_USES)
+ || ((ce->ce_flags & ZEND_ACC_IMMUTABLE)
+ && CG(unlinked_uses)
+ && zend_hash_index_del(CG(unlinked_uses), (zend_long)(zend_uintptr_t)ce) == SUCCESS)) {
zend_string *exception_str;
zval exception_zv;
ZEND_ASSERT(EG(exception) && "Exception must have been thrown");
@@ -2414,13 +2453,179 @@ static void check_unrecoverable_load_failure(zend_class_entry *ce) {
}
}
-ZEND_API zend_result zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name) /* {{{ */
+#define zend_update_inherited_handler(handler) do { \
+ if (ce->handler == (zend_function*)op_array) { \
+ ce->handler = (zend_function*)new_op_array; \
+ } \
+ } while (0)
+
+static zend_class_entry *zend_lazy_class_load(zend_class_entry *pce)
+{
+ zend_class_entry *ce;
+ Bucket *p, *end;
+
+ ce = zend_arena_alloc(&CG(arena), sizeof(zend_class_entry));
+ memcpy(ce, pce, sizeof(zend_class_entry));
+ ce->ce_flags &= ~ZEND_ACC_IMMUTABLE;
+ ce->refcount = 1;
+ ce->inheritance_cache = NULL;
+ ZEND_MAP_PTR_INIT(ce->mutable_data, NULL);
+
+ /* properties */
+ if (ce->default_properties_table) {
+ zval *dst = emalloc(sizeof(zval) * ce->default_properties_count);
+ zval *src = ce->default_properties_table;
+ zval *end = src + ce->default_properties_count;
+
+ ce->default_properties_table = dst;
+ for (; src != end; src++, dst++) {
+ ZVAL_COPY_VALUE_PROP(dst, src);
+ }
+ }
+
+ /* methods */
+ ce->function_table.pDestructor = ZEND_FUNCTION_DTOR;
+ if (!(HT_FLAGS(&ce->function_table) & HASH_FLAG_UNINITIALIZED)) {
+ p = emalloc(HT_SIZE(&ce->function_table));
+ memcpy(p, HT_GET_DATA_ADDR(&ce->function_table), HT_USED_SIZE(&ce->function_table));
+ HT_SET_DATA_ADDR(&ce->function_table, p);
+ p = ce->function_table.arData;
+ end = p + ce->function_table.nNumUsed;
+ for (; p != end; p++) {
+ zend_op_array *op_array, *new_op_array;
+ void ***run_time_cache_ptr;
+ size_t alloc_size;
+
+ op_array = Z_PTR(p->val);
+ ZEND_ASSERT(op_array->type == ZEND_USER_FUNCTION);
+ ZEND_ASSERT(op_array->scope == pce);
+ ZEND_ASSERT(op_array->prototype == NULL);
+ alloc_size = sizeof(zend_op_array) + sizeof(void *);
+ if (op_array->static_variables) {
+ alloc_size += sizeof(HashTable *);
+ }
+ new_op_array = zend_arena_alloc(&CG(arena), alloc_size);
+ Z_PTR(p->val) = new_op_array;
+ memcpy(new_op_array, op_array, sizeof(zend_op_array));
+ run_time_cache_ptr = (void***)(new_op_array + 1);
+ *run_time_cache_ptr = NULL;
+ new_op_array->fn_flags &= ~ZEND_ACC_IMMUTABLE;
+ new_op_array->scope = ce;
+ ZEND_MAP_PTR_INIT(new_op_array->run_time_cache, run_time_cache_ptr);
+ if (op_array->static_variables) {
+ HashTable **static_variables_ptr = (HashTable **) (run_time_cache_ptr + 1);
+ *static_variables_ptr = NULL;
+ ZEND_MAP_PTR_INIT(new_op_array->static_variables_ptr, static_variables_ptr);
+ }
+
+ zend_update_inherited_handler(constructor);
+ zend_update_inherited_handler(destructor);
+ zend_update_inherited_handler(clone);
+ zend_update_inherited_handler(__get);
+ zend_update_inherited_handler(__set);
+ zend_update_inherited_handler(__call);
+ zend_update_inherited_handler(__isset);
+ zend_update_inherited_handler(__unset);
+ zend_update_inherited_handler(__tostring);
+ zend_update_inherited_handler(__callstatic);
+ zend_update_inherited_handler(__debugInfo);
+ zend_update_inherited_handler(__serialize);
+ zend_update_inherited_handler(__unserialize);
+ }
+ }
+
+ /* static members */
+ if (ce->default_static_members_table) {
+ zval *dst = emalloc(sizeof(zval) * ce->default_static_members_count);
+ zval *src = ce->default_static_members_table;
+ zval *end = src + ce->default_static_members_count;
+
+ ce->default_static_members_table = dst;
+ for (; src != end; src++, dst++) {
+ ZVAL_COPY_VALUE(dst, src);
+ }
+ }
+ ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
+
+ /* properties_info */
+ if (!(HT_FLAGS(&ce->properties_info) & HASH_FLAG_UNINITIALIZED)) {
+ p = emalloc(HT_SIZE(&ce->properties_info));
+ memcpy(p, HT_GET_DATA_ADDR(&ce->properties_info), HT_USED_SIZE(&ce->properties_info));
+ HT_SET_DATA_ADDR(&ce->properties_info, p);
+ p = ce->properties_info.arData;
+ end = p + ce->properties_info.nNumUsed;
+ for (; p != end; p++) {
+ zend_property_info *prop_info, *new_prop_info;
+
+ prop_info = Z_PTR(p->val);
+ ZEND_ASSERT(prop_info->ce == pce);
+ new_prop_info= zend_arena_alloc(&CG(arena), sizeof(zend_property_info));
+ Z_PTR(p->val) = new_prop_info;
+ memcpy(new_prop_info, prop_info, sizeof(zend_property_info));
+ new_prop_info->ce = ce;
+ if (ZEND_TYPE_HAS_LIST(new_prop_info->type)) {
+ zend_type_list *new_list;
+ zend_type_list *list = ZEND_TYPE_LIST(new_prop_info->type);
+
+ new_list = zend_arena_alloc(&CG(arena), ZEND_TYPE_LIST_SIZE(list->num_types));
+ memcpy(new_list, list, ZEND_TYPE_LIST_SIZE(list->num_types));
+ ZEND_TYPE_SET_PTR(new_prop_info->type, list);
+ ZEND_TYPE_FULL_MASK(new_prop_info->type) |= _ZEND_TYPE_ARENA_BIT;
+ }
+ }
+ }
+
+ /* constants table */
+ if (!(HT_FLAGS(&ce->constants_table) & HASH_FLAG_UNINITIALIZED)) {
+ p = emalloc(HT_SIZE(&ce->constants_table));
+ memcpy(p, HT_GET_DATA_ADDR(&ce->constants_table), HT_USED_SIZE(&ce->constants_table));
+ HT_SET_DATA_ADDR(&ce->constants_table, p);
+ p = ce->constants_table.arData;
+ end = p + ce->constants_table.nNumUsed;
+ for (; p != end; p++) {
+ zend_class_constant *c, *new_c;
+
+ c = Z_PTR(p->val);
+ ZEND_ASSERT(c->ce == pce);
+ new_c = zend_arena_alloc(&CG(arena), sizeof(zend_class_constant));
+ Z_PTR(p->val) = new_c;
+ memcpy(new_c, c, sizeof(zend_class_constant));
+ new_c->ce = ce;
+ }
+ }
+
+ return ce;
+}
+
+#ifndef ZEND_WIN32
+# define UPDATE_IS_CACHEABLE(ce) do { \
+ if ((ce)->type == ZEND_USER_CLASS) { \
+ is_cacheable &= (ce)->ce_flags; \
+ } \
+ } while (0)
+#else
+// TODO: ASLR may cause different addresses in different workers ???
+# define UPDATE_IS_CACHEABLE(ce) do { \
+ is_cacheable &= (ce)->ce_flags; \
+ } while (0)
+#endif
+
+ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name, zend_string *key) /* {{{ */
{
/* Load parent/interface dependencies first, so we can still gracefully abort linking
* with an exception and remove the class from the class table. This is only possible
* if no variance obligations on the current class have been added during autoloading. */
zend_class_entry *parent = NULL;
- zend_class_entry **interfaces = NULL;
+ zend_class_entry **traits_and_interfaces = NULL;
+ zend_class_entry *proto = NULL;
+ zend_class_entry *orig_linking_class;
+ uint32_t is_cacheable = ce->ce_flags & ZEND_ACC_IMMUTABLE;
+ uint32_t i, j;
+ zval *zv;
+ ALLOCA_FLAG(use_heap)
+
+ SET_ALLOCA_FLAG(use_heap);
+ ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_LINKED));
if (ce->parent_name) {
parent = zend_fetch_class_by_name(
@@ -2428,19 +2633,41 @@ ZEND_API zend_result zend_do_link_class(zend_class_entry *ce, zend_string *lc_pa
ZEND_FETCH_CLASS_ALLOW_NEARLY_LINKED | ZEND_FETCH_CLASS_EXCEPTION);
if (!parent) {
check_unrecoverable_load_failure(ce);
- return FAILURE;
+ return NULL;
}
+ UPDATE_IS_CACHEABLE(parent);
}
- if (ce->num_interfaces) {
- /* Also copy the parent interfaces here, so we don't need to reallocate later. */
- uint32_t i, num_parent_interfaces = parent ? parent->num_interfaces : 0;
- interfaces = emalloc(
- sizeof(zend_class_entry *) * (ce->num_interfaces + num_parent_interfaces));
- if (num_parent_interfaces) {
- memcpy(interfaces, parent->interfaces,
- sizeof(zend_class_entry *) * num_parent_interfaces);
+ if (ce->num_traits || ce->num_interfaces) {
+ traits_and_interfaces = do_alloca(sizeof(zend_class_entry*) * (ce->num_traits + ce->num_interfaces), use_heap);
+
+ for (i = 0; i < ce->num_traits; i++) {
+ zend_class_entry *trait = zend_fetch_class_by_name(ce->trait_names[i].name,
+ ce->trait_names[i].lc_name, ZEND_FETCH_CLASS_TRAIT);
+ if (UNEXPECTED(trait == NULL)) {
+ free_alloca(traits_and_interfaces, use_heap);
+ return NULL;
+ }
+ if (UNEXPECTED(!(trait->ce_flags & ZEND_ACC_TRAIT))) {
+ zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ZSTR_VAL(ce->name), ZSTR_VAL(trait->name));
+ free_alloca(traits_and_interfaces, use_heap);
+ return NULL;
+ }
+ for (j = 0; j < i; j++) {
+ if (traits_and_interfaces[j] == trait) {
+ /* skip duplications */
+ trait = NULL;
+ break;
+ }
+ }
+ traits_and_interfaces[i] = trait;
+ if (trait) {
+ UPDATE_IS_CACHEABLE(trait);
+ }
}
+ }
+
+ if (ce->num_interfaces) {
for (i = 0; i < ce->num_interfaces; i++) {
zend_class_entry *iface = zend_fetch_class_by_name(
ce->interface_names[i].name, ce->interface_names[i].lc_name,
@@ -2448,11 +2675,67 @@ ZEND_API zend_result zend_do_link_class(zend_class_entry *ce, zend_string *lc_pa
ZEND_FETCH_CLASS_ALLOW_NEARLY_LINKED | ZEND_FETCH_CLASS_EXCEPTION);
if (!iface) {
check_unrecoverable_load_failure(ce);
- efree(interfaces);
- return FAILURE;
+ free_alloca(traits_and_interfaces, use_heap);
+ return NULL;
+ }
+ traits_and_interfaces[ce->num_traits + i] = iface;
+ if (iface) {
+ UPDATE_IS_CACHEABLE(iface);
+ }
+ }
+ }
+
+#ifndef ZEND_WIN32
+ if (ce->ce_flags & ZEND_ACC_ENUM) {
+ /* We will add internal methods. */
+ is_cacheable = false;
+ }
+#endif
+
+ if (ce->ce_flags & ZEND_ACC_IMMUTABLE) {
+ if (is_cacheable) {
+ if (zend_inheritance_cache_get && zend_inheritance_cache_add) {
+ zend_class_entry *ret = zend_inheritance_cache_get(ce, parent, traits_and_interfaces);
+ if (ret) {
+ if (traits_and_interfaces) {
+ free_alloca(traits_and_interfaces, use_heap);
+ }
+ zv = zend_hash_find_ex(CG(class_table), key, 1);
+ Z_CE_P(zv) = ret;
+ return ret;
+ }
+ } else {
+ is_cacheable = 0;
}
- interfaces[num_parent_interfaces + i] = iface;
+ proto = ce;
+ }
+ /* Lazy class loading */
+ ce = zend_lazy_class_load(ce);
+ zv = zend_hash_find_ex(CG(class_table), key, 1);
+ Z_CE_P(zv) = ce;
+ if (CG(unlinked_uses)
+ && zend_hash_index_del(CG(unlinked_uses), (zend_long)(zend_uintptr_t)proto) == SUCCESS) {
+ ce->ce_flags |= ZEND_ACC_HAS_UNLINKED_USES;
}
+ } else if (ce->ce_flags & ZEND_ACC_FILE_CACHED) {
+ /* Lazy class loading */
+ ce = zend_lazy_class_load(ce);
+ ce->ce_flags &= ~ZEND_ACC_FILE_CACHED;
+ zv = zend_hash_find_ex(CG(class_table), key, 1);
+ Z_CE_P(zv) = ce;
+ if (CG(unlinked_uses)
+ && zend_hash_index_del(CG(unlinked_uses), (zend_long)(zend_uintptr_t)proto) == SUCCESS) {
+ ce->ce_flags |= ZEND_ACC_HAS_UNLINKED_USES;
+ }
+ }
+
+ orig_linking_class = CG(current_linking_class);
+ CG(current_linking_class) = is_cacheable ? ce : NULL;
+
+ if (ce->ce_flags & ZEND_ACC_ENUM) {
+ /* Only register builtin enum methods during inheritance to avoid persisting them in
+ * opcache. */
+ zend_enum_register_funcs(ce);
}
if (parent) {
@@ -2462,9 +2745,21 @@ ZEND_API zend_result zend_do_link_class(zend_class_entry *ce, zend_string *lc_pa
zend_do_inheritance(ce, parent);
}
if (ce->num_traits) {
- zend_do_bind_traits(ce);
+ zend_do_bind_traits(ce, traits_and_interfaces);
}
- if (interfaces) {
+ if (ce->num_interfaces) {
+ /* Also copy the parent interfaces here, so we don't need to reallocate later. */
+ uint32_t num_parent_interfaces = parent ? parent->num_interfaces : 0;
+ zend_class_entry **interfaces = emalloc(
+ sizeof(zend_class_entry *) * (ce->num_interfaces + num_parent_interfaces));
+
+ if (num_parent_interfaces) {
+ memcpy(interfaces, parent->interfaces,
+ sizeof(zend_class_entry *) * num_parent_interfaces);
+ }
+ memcpy(interfaces + num_parent_interfaces, traits_and_interfaces + ce->num_traits,
+ sizeof(zend_class_entry *) * ce->num_interfaces);
+
zend_do_implement_interfaces(ce, interfaces);
} else if (parent && parent->num_interfaces) {
zend_do_inherit_interfaces(ce, parent);
@@ -2474,24 +2769,61 @@ ZEND_API zend_result zend_do_link_class(zend_class_entry *ce, zend_string *lc_pa
) {
zend_verify_abstract_class(ce);
}
+ if (ce->ce_flags & ZEND_ACC_ENUM) {
+ zend_verify_enum(ce);
+ }
zend_build_properties_info_table(ce);
if (!(ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE)) {
ce->ce_flags |= ZEND_ACC_LINKED;
- return SUCCESS;
+ } else {
+ ce->ce_flags |= ZEND_ACC_NEARLY_LINKED;
+ if (CG(current_linking_class)) {
+ ce->ce_flags |= ZEND_ACC_CACHEABLE;
+ }
+ load_delayed_classes();
+ if (ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE) {
+ resolve_delayed_variance_obligations(ce);
+ if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
+ CG(current_linking_class) = orig_linking_class;
+ report_variance_errors(ce);
+ }
+ }
+ if (ce->ce_flags & ZEND_ACC_CACHEABLE) {
+ ce->ce_flags &= ~ZEND_ACC_CACHEABLE;
+ } else {
+ CG(current_linking_class) = NULL;
+ }
+ }
+
+ if (!CG(current_linking_class)) {
+ is_cacheable = 0;
}
+ CG(current_linking_class) = orig_linking_class;
+
+ if (is_cacheable) {
+ HashTable *ht = (HashTable*)ce->inheritance_cache;
+ zend_class_entry *new_ce;
- ce->ce_flags |= ZEND_ACC_NEARLY_LINKED;
- load_delayed_classes();
- if (ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE) {
- resolve_delayed_variance_obligations(ce);
- if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
- report_variance_errors(ce);
+ ce->inheritance_cache = NULL;
+ new_ce = zend_inheritance_cache_add(ce, proto, parent, traits_and_interfaces, ht);
+ if (new_ce) {
+ zv = zend_hash_find_ex(CG(class_table), key, 1);
+ ce = new_ce;
+ Z_CE_P(zv) = ce;
+ }
+ if (ht) {
+ zend_hash_destroy(ht);
+ FREE_HASHTABLE(ht);
}
}
- return SUCCESS;
+ if (traits_and_interfaces) {
+ free_alloca(traits_and_interfaces, use_heap);
+ }
+
+ return ce;
}
/* }}} */
@@ -2540,21 +2872,66 @@ static inheritance_status zend_can_early_bind(zend_class_entry *ce, zend_class_e
}
/* }}} */
-zend_bool zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding) /* {{{ */
+zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding) /* {{{ */
{
- inheritance_status status = zend_can_early_bind(ce, parent_ce);
+ inheritance_status status;
+ zend_class_entry *proto = NULL;
+ zend_class_entry *orig_linking_class;
+ uint32_t is_cacheable = ce->ce_flags & ZEND_ACC_IMMUTABLE;
+
+ UPDATE_IS_CACHEABLE(parent_ce);
+ if (is_cacheable) {
+ if (zend_inheritance_cache_get && zend_inheritance_cache_add) {
+ zend_class_entry *ret = zend_inheritance_cache_get(ce, parent_ce, NULL);
+ if (ret) {
+ if (delayed_early_binding) {
+ if (UNEXPECTED(zend_hash_set_bucket_key(EG(class_table), (Bucket*)delayed_early_binding, lcname) == NULL)) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name));
+ return NULL;
+ }
+ Z_CE_P(delayed_early_binding) = ret;
+ } else {
+ if (UNEXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ret) == NULL)) {
+ return NULL;
+ }
+ }
+ return ret;
+ }
+ } else {
+ is_cacheable = 0;
+ }
+ proto = ce;
+ }
+ orig_linking_class = CG(current_linking_class);
+ CG(current_linking_class) = NULL;
+ status = zend_can_early_bind(ce, parent_ce);
+ CG(current_linking_class) = orig_linking_class;
if (EXPECTED(status != INHERITANCE_UNRESOLVED)) {
+ if (ce->ce_flags & ZEND_ACC_IMMUTABLE) {
+ /* Lazy class loading */
+ ce = zend_lazy_class_load(ce);
+ } else if (ce->ce_flags & ZEND_ACC_FILE_CACHED) {
+ /* Lazy class loading */
+ ce = zend_lazy_class_load(ce);
+ ce->ce_flags &= ~ZEND_ACC_FILE_CACHED;
+ }
+
if (delayed_early_binding) {
if (UNEXPECTED(zend_hash_set_bucket_key(EG(class_table), (Bucket*)delayed_early_binding, lcname) == NULL)) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name));
- return 0;
+ return NULL;
}
+ Z_CE_P(delayed_early_binding) = ce;
} else {
if (UNEXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) == NULL)) {
- return 0;
+ return NULL;
}
}
+
+ orig_linking_class = CG(current_linking_class);
+ CG(current_linking_class) = is_cacheable ? ce : NULL;
+
zend_do_inheritance_ex(ce, parent_ce, status == INHERITANCE_SUCCESS);
if (parent_ce && parent_ce->num_interfaces) {
zend_do_inherit_interfaces(ce, parent_ce);
@@ -2565,8 +2942,28 @@ zend_bool zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce,
}
ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE));
ce->ce_flags |= ZEND_ACC_LINKED;
- return 1;
+
+ CG(current_linking_class) = orig_linking_class;
+
+ if (is_cacheable) {
+ HashTable *ht = (HashTable*)ce->inheritance_cache;
+ zend_class_entry *new_ce;
+
+ ce->inheritance_cache = NULL;
+ new_ce = zend_inheritance_cache_add(ce, proto, parent_ce, NULL, ht);
+ if (new_ce) {
+ zval *zv = zend_hash_find_ex(CG(class_table), lcname, 1);
+ ce = new_ce;
+ Z_CE_P(zv) = ce;
+ }
+ if (ht) {
+ zend_hash_destroy(ht);
+ FREE_HASHTABLE(ht);
+ }
+ }
+
+ return ce;
}
- return 0;
+ return NULL;
}
/* }}} */
diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h
index e49ec49b6f..c67032f129 100644
--- a/Zend/zend_inheritance.h
+++ b/Zend/zend_inheritance.h
@@ -25,16 +25,19 @@
BEGIN_EXTERN_C()
ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface);
-ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *parent_ce, zend_bool checked);
+ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *parent_ce, bool checked);
#define zend_do_inheritance(ce, parent_ce) \
zend_do_inheritance_ex(ce, parent_ce, 0)
-ZEND_API zend_result zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name);
+ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name, zend_string *key);
void zend_verify_abstract_class(zend_class_entry *ce);
void zend_build_properties_info_table(zend_class_entry *ce);
-zend_bool zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding);
+zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding);
+
+ZEND_API extern zend_class_entry* (*zend_inheritance_cache_get)(zend_class_entry *ce, zend_class_entry *parent, zend_class_entry **traits_and_interfaces);
+ZEND_API extern zend_class_entry* (*zend_inheritance_cache_add)(zend_class_entry *ce, zend_class_entry *proto, zend_class_entry *parent, zend_class_entry **traits_and_interfaces, HashTable *dependencies);
END_EXTERN_C()
diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c
index 75c7faf4c0..b3418b1152 100644
--- a/Zend/zend_ini.c
+++ b/Zend/zend_ini.c
@@ -311,7 +311,7 @@ ZEND_API zend_result zend_alter_ini_entry_ex(zend_string *name, zend_string *new
zend_ini_entry *ini_entry;
zend_string *duplicate;
uint8_t modifiable;
- zend_bool modified;
+ bool modified;
if ((ini_entry = zend_hash_find_ptr(EG(ini_directives), name)) == NULL) {
return FAILURE;
@@ -431,7 +431,7 @@ ZEND_API double zend_ini_double(const char *name, size_t name_length, int orig)
}
/* }}} */
-ZEND_API char *zend_ini_string_ex(const char *name, size_t name_length, int orig, zend_bool *exists) /* {{{ */
+ZEND_API char *zend_ini_string_ex(const char *name, size_t name_length, int orig, bool *exists) /* {{{ */
{
zend_ini_entry *ini_entry;
@@ -457,7 +457,7 @@ ZEND_API char *zend_ini_string_ex(const char *name, size_t name_length, int orig
ZEND_API char *zend_ini_string(const char *name, size_t name_length, int orig) /* {{{ */
{
- zend_bool exists = 1;
+ bool exists = 1;
char *return_value;
return_value = zend_ini_string_ex(name, name_length, orig, &exists);
@@ -483,7 +483,7 @@ ZEND_API zend_string *zend_ini_get_value(zend_string *name) /* {{{ */
}
/* }}} */
-ZEND_API zend_bool zend_ini_parse_bool(zend_string *str)
+ZEND_API bool zend_ini_parse_bool(zend_string *str)
{
if ((ZSTR_LEN(str) == 4 && strcasecmp(ZSTR_VAL(str), "true") == 0)
|| (ZSTR_LEN(str) == 3 && strcasecmp(ZSTR_VAL(str), "yes") == 0)
@@ -573,7 +573,7 @@ ZEND_INI_DISP(display_link_numbers) /* {{{ */
/* Standard message handlers */
ZEND_API ZEND_INI_MH(OnUpdateBool) /* {{{ */
{
- zend_bool *p = (zend_bool *) ZEND_INI_GET_ADDR();
+ bool *p = (bool *) ZEND_INI_GET_ADDR();
*p = zend_ini_parse_bool(new_value);
return SUCCESS;
}
diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h
index d227f3779d..590ff09cef 100644
--- a/Zend/zend_ini.h
+++ b/Zend/zend_ini.h
@@ -84,9 +84,9 @@ ZEND_API void display_ini_entries(zend_module_entry *module);
ZEND_API zend_long zend_ini_long(const char *name, size_t name_length, int orig);
ZEND_API double zend_ini_double(const char *name, size_t name_length, int orig);
ZEND_API char *zend_ini_string(const char *name, size_t name_length, int orig);
-ZEND_API char *zend_ini_string_ex(const char *name, size_t name_length, int orig, zend_bool *exists);
+ZEND_API char *zend_ini_string_ex(const char *name, size_t name_length, int orig, bool *exists);
ZEND_API zend_string *zend_ini_get_value(zend_string *name);
-ZEND_API zend_bool zend_ini_parse_bool(zend_string *str);
+ZEND_API bool zend_ini_parse_bool(zend_string *str);
ZEND_API zend_result zend_ini_register_displayer(const char *name, uint32_t name_length, void (*displayer)(zend_ini_entry *ini_entry, int type));
@@ -141,12 +141,12 @@ END_EXTERN_C()
#define INI_INT(name) zend_ini_long((name), strlen(name), 0)
#define INI_FLT(name) zend_ini_double((name), strlen(name), 0)
#define INI_STR(name) zend_ini_string_ex((name), strlen(name), 0, NULL)
-#define INI_BOOL(name) ((zend_bool) INI_INT(name))
+#define INI_BOOL(name) ((bool) INI_INT(name))
#define INI_ORIG_INT(name) zend_ini_long((name), strlen(name), 1)
#define INI_ORIG_FLT(name) zend_ini_double((name), strlen(name), 1)
#define INI_ORIG_STR(name) zend_ini_string((name), strlen(name), 1)
-#define INI_ORIG_BOOL(name) ((zend_bool) INI_ORIG_INT(name))
+#define INI_ORIG_BOOL(name) ((bool) INI_ORIG_INT(name))
#define REGISTER_INI_ENTRIES() zend_register_ini_entries(ini_entries, module_number)
#define UNREGISTER_INI_ENTRIES() zend_unregister_ini_entries(module_number)
@@ -180,8 +180,8 @@ END_EXTERN_C()
/* INI parsing engine */
typedef void (*zend_ini_parser_cb_t)(zval *arg1, zval *arg2, zval *arg3, int callback_type, void *arg);
BEGIN_EXTERN_C()
-ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg);
-ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg);
+ZEND_API int zend_parse_ini_file(zend_file_handle *fh, bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg);
+ZEND_API int zend_parse_ini_string(char *str, bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg);
END_EXTERN_C()
/* INI entries */
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y
index f9170d9ecc..7eb3753520 100644
--- a/Zend/zend_ini_parser.y
+++ b/Zend/zend_ini_parser.y
@@ -212,7 +212,7 @@ static ZEND_COLD void ini_error(const char *msg)
/* }}} */
/* {{{ zend_parse_ini_file() */
-ZEND_API zend_result zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg)
+ZEND_API zend_result zend_parse_ini_file(zend_file_handle *fh, bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg)
{
int retval;
zend_ini_parser_param ini_parser_param;
@@ -227,7 +227,6 @@ ZEND_API zend_result zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffe
CG(ini_parser_unbuffered_errors) = unbuffered_errors;
retval = ini_parse();
- zend_file_handle_dtor(fh);
shutdown_ini_scanner();
@@ -240,7 +239,7 @@ ZEND_API zend_result zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffe
/* }}} */
/* {{{ zend_parse_ini_string() */
-ZEND_API zend_result zend_parse_ini_string(char *str, zend_bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg)
+ZEND_API zend_result zend_parse_ini_string(char *str, bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg)
{
int retval;
zend_ini_parser_param ini_parser_param;
diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l
index 1d689f3748..b75387714d 100644
--- a/Zend/zend_ini_scanner.l
+++ b/Zend/zend_ini_scanner.l
@@ -231,7 +231,7 @@ static zend_result init_ini_scanner(int scanner_mode, zend_file_handle *fh)
SCNG(yy_in) = fh;
if (fh != NULL) {
- ini_filename = zend_strndup(fh->filename, strlen(fh->filename));
+ ini_filename = zend_string_copy(fh->filename);
} else {
ini_filename = NULL;
}
@@ -248,7 +248,7 @@ void shutdown_ini_scanner(void)
{
zend_stack_destroy(&SCNG(state_stack));
if (ini_filename) {
- free(ini_filename);
+ zend_string_release(ini_filename);
}
}
/* }}} */
@@ -263,7 +263,7 @@ ZEND_COLD int zend_ini_scanner_get_lineno(void)
/* {{{ zend_ini_scanner_get_filename() */
ZEND_COLD char *zend_ini_scanner_get_filename(void)
{
- return ini_filename ? ini_filename : "Unknown";
+ return ini_filename ? ZSTR_VAL(ini_filename) : "Unknown";
}
/* }}} */
@@ -278,7 +278,6 @@ zend_result zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mo
}
if (init_ini_scanner(scanner_mode, fh) == FAILURE) {
- zend_file_handle_dtor(fh);
return FAILURE;
}
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index 0d5af66d92..275026f738 100644
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -436,7 +436,7 @@ static int zend_implement_serializable(zend_class_entry *interface, zend_class_e
typedef struct {
zend_object std;
zend_object_iterator *iter;
- zend_bool rewind_called;
+ bool rewind_called;
} zend_internal_iterator;
static zend_object *zend_internal_iterator_create(zend_class_entry *ce) {
@@ -596,31 +596,25 @@ ZEND_METHOD(InternalIterator, rewind) {
/* {{{ zend_register_interfaces */
ZEND_API void zend_register_interfaces(void)
{
- zend_class_entry ce;
+ zend_ce_traversable = register_class_Traversable();
+ zend_ce_traversable->interface_gets_implemented = zend_implement_traversable;
- REGISTER_MAGIC_INTERFACE(traversable, Traversable);
+ zend_ce_aggregate = register_class_IteratorAggregate(zend_ce_traversable);
+ zend_ce_aggregate->interface_gets_implemented = zend_implement_aggregate;
- REGISTER_MAGIC_INTERFACE(aggregate, IteratorAggregate);
- REGISTER_MAGIC_IMPLEMENT(aggregate, traversable);
+ zend_ce_iterator = register_class_Iterator(zend_ce_traversable);
+ zend_ce_iterator->interface_gets_implemented = zend_implement_iterator;
- REGISTER_MAGIC_INTERFACE(iterator, Iterator);
- REGISTER_MAGIC_IMPLEMENT(iterator, traversable);
+ zend_ce_serializable = register_class_Serializable();
+ zend_ce_serializable->interface_gets_implemented = zend_implement_serializable;
- REGISTER_MAGIC_INTERFACE(serializable, Serializable);
+ zend_ce_arrayaccess = register_class_ArrayAccess();
- INIT_CLASS_ENTRY(ce, "ArrayAccess", class_ArrayAccess_methods);
- zend_ce_arrayaccess = zend_register_internal_interface(&ce);
+ zend_ce_countable = register_class_Countable();
- INIT_CLASS_ENTRY(ce, "Countable", class_Countable_methods);
- zend_ce_countable = zend_register_internal_interface(&ce);
+ zend_ce_stringable = register_class_Stringable();
- INIT_CLASS_ENTRY(ce, "Stringable", class_Stringable_methods);
- zend_ce_stringable = zend_register_internal_interface(&ce);
-
- INIT_CLASS_ENTRY(ce, "InternalIterator", class_InternalIterator_methods);
- zend_ce_internal_iterator = zend_register_internal_class(&ce);
- zend_class_implements(zend_ce_internal_iterator, 1, zend_ce_iterator);
- zend_ce_internal_iterator->ce_flags |= ZEND_ACC_FINAL;
+ zend_ce_internal_iterator = register_class_InternalIterator(zend_ce_iterator);
zend_ce_internal_iterator->create_object = zend_internal_iterator_create;
zend_ce_internal_iterator->serialize = zend_class_serialize_deny;
zend_ce_internal_iterator->unserialize = zend_class_unserialize_deny;
diff --git a/Zend/zend_interfaces.h b/Zend/zend_interfaces.h
index ecdc9b0e1b..78aee0d39f 100644
--- a/Zend/zend_interfaces.h
+++ b/Zend/zend_interfaces.h
@@ -49,17 +49,6 @@ ZEND_API zval* zend_call_method(zend_object *object, zend_class_entry *obj_ce, z
#define zend_call_method_with_2_params(obj, obj_ce, fn_proxy, function_name, retval, arg1, arg2) \
zend_call_method(obj, obj_ce, fn_proxy, function_name, sizeof(function_name)-1, retval, 2, arg1, arg2)
-#define REGISTER_MAGIC_INTERFACE(class_name, class_name_str) \
- {\
- zend_class_entry ce;\
- INIT_CLASS_ENTRY(ce, # class_name_str, class_ ## class_name_str ## _methods) \
- zend_ce_ ## class_name = zend_register_internal_interface(&ce);\
- zend_ce_ ## class_name->interface_gets_implemented = zend_implement_ ## class_name;\
- }
-
-#define REGISTER_MAGIC_IMPLEMENT(class_name, interface_name) \
- zend_class_implements(zend_ce_ ## class_name, 1, zend_ce_ ## interface_name)
-
ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter);
ZEND_API zend_result zend_user_it_valid(zend_object_iterator *_iter);
ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *key);
diff --git a/Zend/zend_interfaces.stub.php b/Zend/zend_interfaces.stub.php
index 8b2cdae981..d1bd4a5037 100644
--- a/Zend/zend_interfaces.stub.php
+++ b/Zend/zend_interfaces.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
interface Traversable {}
diff --git a/Zend/zend_interfaces_arginfo.h b/Zend/zend_interfaces_arginfo.h
index 8a66da1636..c34f5463a0 100644
--- a/Zend/zend_interfaces_arginfo.h
+++ b/Zend/zend_interfaces_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: c6ef101bd3881348a74b60cecd22d1d7f80017c8 */
+ * Stub hash: 34aa50c74f10106c6abd0ed2956d41c98aae6452 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IteratorAggregate_getIterator, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -119,3 +119,87 @@ static const zend_function_entry class_InternalIterator_methods[] = {
ZEND_ME(InternalIterator, rewind, arginfo_class_InternalIterator_rewind, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Traversable(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Traversable", class_Traversable_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_IteratorAggregate(zend_class_entry *class_entry_Traversable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IteratorAggregate", class_IteratorAggregate_methods);
+ class_entry = zend_register_internal_interface(&ce);
+ zend_class_implements(class_entry, 1, class_entry_Traversable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_Iterator(zend_class_entry *class_entry_Traversable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Iterator", class_Iterator_methods);
+ class_entry = zend_register_internal_interface(&ce);
+ zend_class_implements(class_entry, 1, class_entry_Traversable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ArrayAccess(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ArrayAccess", class_ArrayAccess_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_Serializable(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Serializable", class_Serializable_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_Countable(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Countable", class_Countable_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_Stringable(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Stringable", class_Stringable_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_InternalIterator(zend_class_entry *class_entry_Iterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "InternalIterator", class_InternalIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+ zend_class_implements(class_entry, 1, class_entry_Iterator);
+
+ return class_entry;
+}
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index ed800c46f8..54ec8eab25 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -162,6 +162,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%token <ident> T_CLASS "'class'"
%token <ident> T_TRAIT "'trait'"
%token <ident> T_INTERFACE "'interface'"
+%token <ident> T_ENUM "'enum'"
%token <ident> T_EXTENDS "'extends'"
%token <ident> T_IMPLEMENTS "'implements'"
%token <ident> T_NAMESPACE "'namespace'"
@@ -268,6 +269,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%type <ast> attributed_statement attributed_class_statement attributed_parameter
%type <ast> attribute_decl attribute attributes attribute_group namespace_declaration_name
%type <ast> match match_arm_list non_empty_match_arm_list match_arm match_arm_cond_list
+%type <ast> enum_declaration_statement enum_backing_type enum_case enum_case_expr
%type <num> returns_ref function fn is_reference is_variadic variable_modifiers
%type <num> method_modifiers non_empty_member_modifiers member_modifier optional_visibility_modifier
@@ -291,7 +293,7 @@ reserved_non_modifiers:
| T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO
| T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT | T_BREAK
| T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS
- | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_FN | T_MATCH
+ | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_FN | T_MATCH | T_ENUM
;
semi_reserved:
@@ -366,6 +368,7 @@ attributed_statement:
| class_declaration_statement { $$ = $1; }
| trait_declaration_statement { $$ = $1; }
| interface_declaration_statement { $$ = $1; }
+ | enum_declaration_statement { $$ = $1; }
;
top_statement:
@@ -592,6 +595,27 @@ interface_declaration_statement:
{ $$ = zend_ast_create_decl(ZEND_AST_CLASS, ZEND_ACC_INTERFACE, $<num>2, $5, zend_ast_get_str($3), NULL, $4, $7, NULL, NULL); }
;
+enum_declaration_statement:
+ T_ENUM { $<num>$ = CG(zend_lineno); }
+ T_STRING enum_backing_type implements_list backup_doc_comment '{' class_statement_list '}'
+ { $$ = zend_ast_create_decl(ZEND_AST_CLASS, ZEND_ACC_ENUM|ZEND_ACC_FINAL, $<num>2, $6, zend_ast_get_str($3), NULL, $5, $8, NULL, $4); }
+;
+
+enum_backing_type:
+ %empty { $$ = NULL; }
+ | ':' type_expr { $$ = $2; }
+;
+
+enum_case:
+ T_CASE identifier enum_case_expr ';'
+ { $$ = zend_ast_create(ZEND_AST_ENUM_CASE, $2, $3, NULL); }
+;
+
+enum_case_expr:
+ %empty { $$ = NULL; }
+ | '=' expr { $$ = $2; }
+;
+
extends_from:
%empty { $$ = NULL; }
| T_EXTENDS class_name { $$ = $2; }
@@ -859,6 +883,7 @@ attributed_class_statement:
return_type backup_fn_flags method_body backup_fn_flags
{ $$ = zend_ast_create_decl(ZEND_AST_METHOD, $3 | $1 | $12, $2, $5,
zend_ast_get_str($4), $7, NULL, $11, $9, NULL); CG(extra_fn_flags) = $10; }
+ | enum_case { $$ = $1; }
;
class_statement:
diff --git a/Zend/zend_language_scanner.h b/Zend/zend_language_scanner.h
index f08dbb4ea9..ca32329a55 100644
--- a/Zend/zend_language_scanner.h
+++ b/Zend/zend_language_scanner.h
@@ -63,7 +63,7 @@ typedef struct _zend_heredoc_label {
char *label;
int length;
int indentation;
- zend_bool indentation_uses_spaces;
+ bool indentation_uses_spaces;
} zend_heredoc_label;
/* Track locations of unclosed {, [, (, etc. for better syntax error reporting */
@@ -75,10 +75,10 @@ typedef struct _zend_nest_location {
BEGIN_EXTERN_C()
ZEND_API void zend_save_lexical_state(zend_lex_state *lex_state);
ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state);
-ZEND_API void zend_prepare_string_for_scanning(zval *str, const char *filename);
+ZEND_API void zend_prepare_string_for_scanning(zval *str, zend_string *filename);
ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter, const zend_encoding *old_encoding);
ZEND_API zend_result zend_multibyte_set_filter(const zend_encoding *onetime_encoding);
-ZEND_API zend_result zend_lex_tstring(zval *zv, zend_lexer_ident_ref ident_ref);
+ZEND_API zend_result zend_lex_tstring(zval *zv, unsigned char *ident);
END_EXTERN_C()
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index 7e60f5cf05..4fb4202264 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -297,30 +297,25 @@ ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state)
RESET_DOC_COMMENT();
}
-ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle)
+ZEND_API zend_result zend_lex_tstring(zval *zv, unsigned char *ident)
{
- zend_llist_del_element(&CG(open_files), file_handle, (int (*)(void *, void *)) zend_compare_file_handles);
- /* zend_file_handle_dtor() operates on the copy, so we have to NULLify the original here */
- file_handle->opened_path = NULL;
- if (file_handle->free_filename) {
- file_handle->filename = NULL;
+ unsigned char *end = ident;
+ while ((*end >= 'a' && *end <= 'z') || (*end >= 'A' && *end <= 'Z') || *end == '_') {
+ end++;
}
-}
-ZEND_API zend_result zend_lex_tstring(zval *zv, zend_lexer_ident_ref ident_ref)
-{
- char *ident = (char *) SCNG(yy_start) + ident_ref.offset;
- size_t length = ident_ref.len;
- if (length == sizeof("<?=")-1 && memcmp(ident, "<?=", sizeof("<?=")-1) == 0) {
+ size_t length = end - ident;
+ if (length == 0) {
+ ZEND_ASSERT(ident[0] == '<' && ident[1] == '?' && ident[2] == '=');
zend_throw_exception(zend_ce_parse_error, "Cannot use \"<?=\" as an identifier", 0);
return FAILURE;
}
if (SCNG(on_event)) {
- SCNG(on_event)(ON_FEEDBACK, T_STRING, 0, ident, length, SCNG(on_event_context));
+ SCNG(on_event)(ON_FEEDBACK, T_STRING, 0, (char *) ident, length, SCNG(on_event_context));
}
- ZVAL_STRINGL(zv, ident, length);
+ ZVAL_STRINGL(zv, (char *) ident, length);
return SUCCESS;
}
@@ -537,17 +532,13 @@ ZEND_API zend_result open_file_for_scanning(zend_file_handle *file_handle)
if (zend_stream_fixup(file_handle, &buf, &size) == FAILURE) {
/* Still add it to open_files to make destroy_file_handle work */
zend_llist_add_element(&CG(open_files), file_handle);
+ file_handle->in_list = 1;
return FAILURE;
}
ZEND_ASSERT(!EG(exception) && "stream_fixup() should have failed");
zend_llist_add_element(&CG(open_files), file_handle);
- if (file_handle->handle.stream.handle >= (void*)file_handle && file_handle->handle.stream.handle <= (void*)(file_handle+1)) {
- zend_file_handle *fh = (zend_file_handle*)zend_llist_get_last(&CG(open_files));
- size_t diff = (char*)file_handle->handle.stream.handle - (char*)file_handle;
- fh->handle.stream.handle = (void*)(((char*)fh) + diff);
- file_handle->handle.stream.handle = fh->handle.stream.handle;
- }
+ file_handle->in_list = 1;
/* Reset the scanner for scanning the new file */
SCNG(yy_in) = file_handle;
@@ -585,7 +576,7 @@ ZEND_API zend_result open_file_for_scanning(zend_file_handle *file_handle)
if (file_handle->opened_path) {
compiled_filename = zend_string_copy(file_handle->opened_path);
} else {
- compiled_filename = zend_string_init(file_handle->filename, strlen(file_handle->filename), 0);
+ compiled_filename = zend_string_copy(file_handle->filename);
}
zend_set_compiled_filename(compiled_filename);
@@ -601,7 +592,7 @@ END_EXTERN_C()
static zend_op_array *zend_compile(int type)
{
zend_op_array *op_array = NULL;
- zend_bool original_in_compilation = CG(in_compilation);
+ bool original_in_compilation = CG(in_compilation);
CG(in_compilation) = 1;
CG(ast) = NULL;
@@ -631,6 +622,7 @@ static zend_op_array *zend_compile(int type)
zend_emit_final_return(type == ZEND_USER_FUNCTION);
op_array->line_start = 1;
op_array->line_end = last_lineno;
+ zend_init_static_variables_map_ptr(op_array);
pass_two(op_array);
zend_oparray_context_end(&original_oparray_context);
zend_file_context_end(&original_file_context);
@@ -655,9 +647,9 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type)
if (open_file_for_scanning(file_handle)==FAILURE) {
if (!EG(exception)) {
if (type==ZEND_REQUIRE) {
- zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename);
+ zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, ZSTR_VAL(file_handle->filename));
} else {
- zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename);
+ zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, ZSTR_VAL(file_handle->filename));
}
}
} else {
@@ -669,9 +661,9 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type)
}
ZEND_API zend_ast *zend_compile_string_to_ast(
- zend_string *code, zend_arena **ast_arena, const char *filename) {
+ zend_string *code, zend_arena **ast_arena, zend_string *filename) {
zval code_zv;
- zend_bool original_in_compilation;
+ bool original_in_compilation;
zend_lex_state original_lex_state;
zend_ast *ast;
@@ -715,7 +707,7 @@ zend_op_array *compile_filename(int type, zval *filename)
ZVAL_STR(&tmp, zval_get_string(filename));
filename = &tmp;
}
- zend_stream_init_filename(&file_handle, Z_STRVAL_P(filename));
+ zend_stream_init_filename_ex(&file_handle, Z_STR_P(filename));
retval = zend_compile_file(&file_handle, type);
if (retval && file_handle.handle.stream.handle) {
@@ -737,11 +729,10 @@ zend_op_array *compile_filename(int type, zval *filename)
return retval;
}
-ZEND_API void zend_prepare_string_for_scanning(zval *str, const char *filename)
+ZEND_API void zend_prepare_string_for_scanning(zval *str, zend_string *filename)
{
char *buf;
size_t size, old_len;
- zend_string *new_compiled_filename;
/* enforce ZEND_MMAP_AHEAD trailing NULLs for flex... */
old_len = Z_STRLEN_P(str);
@@ -773,10 +764,7 @@ ZEND_API void zend_prepare_string_for_scanning(zval *str, const char *filename)
}
yy_scan_buffer(buf, size);
-
- new_compiled_filename = zend_string_init(filename, strlen(filename), 0);
- zend_set_compiled_filename(new_compiled_filename);
- zend_string_release_ex(new_compiled_filename, 0);
+ zend_set_compiled_filename(filename);
CG(zend_lineno) = 1;
CG(increment_lineno) = 0;
RESET_DOC_COMMENT();
@@ -809,6 +797,7 @@ zend_op_array *compile_string(zend_string *source_string, const char *filename)
zend_lex_state original_lex_state;
zend_op_array *op_array = NULL;
zval tmp;
+ zend_string *filename_str;
if (ZSTR_LEN(source_string) == 0) {
return NULL;
@@ -817,7 +806,9 @@ zend_op_array *compile_string(zend_string *source_string, const char *filename)
ZVAL_STR_COPY(&tmp, source_string);
zend_save_lexical_state(&original_lex_state);
- zend_prepare_string_for_scanning(&tmp, filename);
+ filename_str = zend_string_init(filename, strlen(filename), 0);
+ zend_prepare_string_for_scanning(&tmp, filename_str);
+ zend_string_release(filename_str);
BEGIN(ST_IN_SCRIPTING);
op_array = zend_compile(ZEND_EVAL_CODE);
@@ -838,6 +829,7 @@ zend_result highlight_file(const char *filename, zend_syntax_highlighter_ini *sy
zend_save_lexical_state(&original_lex_state);
if (open_file_for_scanning(&file_handle)==FAILURE) {
zend_message_dispatcher(ZMSG_FAILED_HIGHLIGHT_FOPEN, filename);
+ zend_destroy_file_handle(&file_handle);
zend_restore_lexical_state(&original_lex_state);
return FAILURE;
}
@@ -851,17 +843,15 @@ zend_result highlight_file(const char *filename, zend_syntax_highlighter_ini *sy
return SUCCESS;
}
-void highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, const char *str_name)
+void highlight_string(zend_string *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, const char *filename)
{
zend_lex_state original_lex_state;
- zval tmp;
-
- if (UNEXPECTED(Z_TYPE_P(str) != IS_STRING)) {
- ZVAL_STR(&tmp, zval_get_string_func(str));
- str = &tmp;
- }
+ zval str_zv;
+ zend_string *filename_str = zend_string_init(filename, strlen(filename), 0);
+ ZVAL_STR_COPY(&str_zv, str);
zend_save_lexical_state(&original_lex_state);
- zend_prepare_string_for_scanning(str, str_name);
+ zend_prepare_string_for_scanning(&str_zv, filename_str);
+ zend_string_release(filename_str);
BEGIN(INITIAL);
zend_highlight(syntax_highlighter_ini);
if (SCNG(script_filtered)) {
@@ -869,9 +859,7 @@ void highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter
SCNG(script_filtered) = NULL;
}
zend_restore_lexical_state(&original_lex_state);
- if (UNEXPECTED(str == &tmp)) {
- zval_ptr_dtor(&tmp);
- }
+ zval_ptr_dtor(&str_zv);
}
ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter, const zend_encoding *old_encoding)
@@ -1023,7 +1011,7 @@ static zend_result zend_scan_escape_string(zval *zendlval, char *str, int len, c
/* cache where we started so we can parse after validating */
char *start = s + 1;
size_t len = 0;
- zend_bool valid = 1;
+ bool valid = 1;
unsigned long codepoint;
if (*start != '{') {
@@ -1163,9 +1151,9 @@ static const char *next_newline(const char *str, const char *end, size_t *newlin
return NULL;
}
-static zend_bool strip_multiline_string_indentation(
- zval *zendlval, int indentation, zend_bool using_spaces,
- zend_bool newline_at_start, zend_bool newline_at_end)
+static bool strip_multiline_string_indentation(
+ zval *zendlval, int indentation, bool using_spaces,
+ bool newline_at_start, bool newline_at_end)
{
const char *str = Z_STRVAL_P(zendlval), *end = str + Z_STRLEN_P(zendlval);
char *copy = Z_STRVAL_P(zendlval);
@@ -1372,6 +1360,7 @@ DNUM ({LNUM}?"."{LNUM})|({LNUM}"."{LNUM}?)
EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM})
HNUM "0x"[0-9a-fA-F]+(_[0-9a-fA-F]+)*
BNUM "0b"[01]+(_[01]+)*
+ONUM "0o"[0-7]+(_[0-7]+)*
LABEL [a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*
WHITESPACE [ \n\r\t]+
TABS_AND_SPACES [ \t]*
@@ -1549,6 +1538,19 @@ NEWLINE ("\r"|"\n"|"\r\n")
RETURN_TOKEN_WITH_IDENT(T_TRAIT);
}
+/*
+ * The enum keyword must be followed by whitespace and another identifier.
+ * This avoids the BC break of using enum in classes, namespaces, functions and constants.
+ */
+<ST_IN_SCRIPTING>"enum"{WHITESPACE}("extends"|"implements") {
+ yyless(4);
+ RETURN_TOKEN_WITH_STR(T_STRING, 0);
+}
+<ST_IN_SCRIPTING>"enum"{WHITESPACE}[a-zA-Z_\x80-\xff] {
+ yyless(4);
+ RETURN_TOKEN_WITH_IDENT(T_ENUM);
+}
+
<ST_IN_SCRIPTING>"extends" {
RETURN_TOKEN_WITH_IDENT(T_EXTENDS);
}
@@ -1918,7 +1920,7 @@ NEWLINE ("\r"|"\n"|"\r\n")
/* The +/- 2 skips "0b" */
size_t len = yyleng - 2;
char *end, *bin = yytext + 2;
- zend_bool contains_underscores;
+ bool contains_underscores;
/* Skip any leading 0s */
while (len > 0 && (*bin == '0' || *bin == '_')) {
@@ -1956,11 +1958,61 @@ NEWLINE ("\r"|"\n"|"\r\n")
}
}
+<ST_IN_SCRIPTING>{ONUM} {
+ /* The +/- 2 skips "0o" */
+ size_t len = yyleng - 2;
+ char *end, *octal = yytext + 2;
+ bool contains_underscores = (memchr(octal, '_', len) != NULL);
+
+ /* Skip any leading 0s */
+ while (len > 0 && (*octal == '0' || *octal == '_')) {
+ ++octal;
+ --len;
+ }
+
+ if (len == 0) {
+ ZVAL_LONG(zendlval, 0);
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
+ }
+
+ if (contains_underscores) {
+ octal = estrndup(octal, len);
+ strip_underscores(octal, &len);
+ }
+
+ errno = 0;
+
+ ZVAL_LONG(zendlval, ZEND_STRTOL(octal, &end, 8));
+
+ ZEND_ASSERT(end == octal + len);
+
+ if (!errno) {
+ if (contains_underscores) {
+ efree(octal);
+ }
+ RETURN_TOKEN_WITH_VAL(T_LNUMBER);
+ }
+
+ /* Overflow */
+ ZEND_ASSERT(errno == ERANGE);
+ /* Reset errno */
+ errno = 0;
+
+ /* zend_oct_strtod skips leading '0' */
+ ZVAL_DOUBLE(zendlval, zend_oct_strtod(octal, (const char **)&end));
+ ZEND_ASSERT(!errno);
+ ZEND_ASSERT(end == octal + len);
+ if (contains_underscores) {
+ efree(octal);
+ }
+ RETURN_TOKEN_WITH_VAL(T_DNUMBER);
+}
+
<ST_IN_SCRIPTING>{LNUM} {
size_t len = yyleng;
char *end, *lnum = yytext;
- zend_bool is_octal = lnum[0] == '0';
- zend_bool contains_underscores = (memchr(lnum, '_', len) != NULL);
+ bool is_octal = lnum[0] == '0';
+ bool contains_underscores = (memchr(lnum, '_', len) != NULL);
if (contains_underscores) {
lnum = estrndup(lnum, len);
@@ -2023,7 +2075,7 @@ NEWLINE ("\r"|"\n"|"\r\n")
/* The +/- 2 skips "0x" */
size_t len = yyleng - 2;
char *end, *hex = yytext + 2;
- zend_bool contains_underscores;
+ bool contains_underscores;
/* Skip any leading 0s */
while (len > 0 && (*hex == '0' || *hex == '_')) {
@@ -2077,7 +2129,7 @@ string:
RETURN_TOKEN_WITH_VAL(T_NUM_STRING);
}
-<ST_VAR_OFFSET>{LNUM}|{HNUM}|{BNUM} { /* Offset must be treated as a string */
+<ST_VAR_OFFSET>{LNUM}|{HNUM}|{BNUM}|{ONUM} { /* Offset must be treated as a string */
if (yyleng == 1) {
ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*(yytext)));
} else {
@@ -2090,7 +2142,7 @@ string:
const char *end;
size_t len = yyleng;
char *dnum = yytext;
- zend_bool contains_underscores = (memchr(dnum, '_', len) != NULL);
+ bool contains_underscores = (memchr(dnum, '_', len) != NULL);
if (contains_underscores) {
dnum = estrndup(dnum, len);
@@ -2528,7 +2580,7 @@ skip_escape_conversion:
unsigned char *saved_cursor;
int bprefix = (yytext[0] != '<') ? 1 : 0, spacing = 0, indentation = 0;
zend_heredoc_label *heredoc_label = emalloc(sizeof(zend_heredoc_label));
- zend_bool is_heredoc = 1;
+ bool is_heredoc = 1;
CG(zend_lineno)++;
heredoc_label->length = yyleng-bprefix-3-1-(yytext[yyleng-2]=='\r'?1:0);
@@ -2909,7 +2961,7 @@ heredoc_scan_done:
ZVAL_STRINGL(zendlval, yytext, yyleng - newline);
if (!SCNG(heredoc_scan_ahead) && !EG(exception) && PARSER_MODE()) {
- zend_bool newline_at_start = *(yytext - 1) == '\n' || *(yytext - 1) == '\r';
+ bool newline_at_start = *(yytext - 1) == '\n' || *(yytext - 1) == '\r';
zend_string *copy = Z_STR_P(zendlval);
if (!strip_multiline_string_indentation(
@@ -3010,7 +3062,7 @@ nowdoc_scan_done:
ZVAL_STRINGL(zendlval, yytext, yyleng - newline);
if (!EG(exception) && spacing != -1 && PARSER_MODE()) {
- zend_bool newline_at_start = *(yytext - 1) == '\n' || *(yytext - 1) == '\r';
+ bool newline_at_start = *(yytext - 1) == '\n' || *(yytext - 1) == '\r';
if (!strip_multiline_string_indentation(
zendlval, indentation, spacing == HEREDOC_USING_SPACES,
newline_at_start, newline != 0)) {
@@ -3050,8 +3102,7 @@ emit_token:
emit_token_with_ident:
if (PARSER_MODE()) {
- elem->ident.offset = SCNG(yy_text) - SCNG(yy_start);
- elem->ident.len = SCNG(yy_leng);
+ elem->ident = SCNG(yy_text);
}
if (SCNG(on_event)) {
SCNG(on_event)(ON_TOKEN, token, start_line, yytext, yyleng, SCNG(on_event_context));
diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c
index 78a3310438..8c42b2494e 100644
--- a/Zend/zend_llist.c
+++ b/Zend/zend_llist.c
@@ -112,6 +112,8 @@ ZEND_API void zend_llist_destroy(zend_llist *l)
current = next;
}
+ l->head = NULL;
+ l->tail = NULL;
l->count = 0;
}
diff --git a/Zend/zend_map_ptr.h b/Zend/zend_map_ptr.h
index c6930473cf..c014f225a3 100644
--- a/Zend/zend_map_ptr.h
+++ b/Zend/zend_map_ptr.h
@@ -37,9 +37,13 @@
type * ZEND_MAP_PTR(name)
# define ZEND_MAP_PTR_GET(ptr) \
(*(ZEND_MAP_PTR(ptr)))
+# define ZEND_MAP_PTR_GET_IMM(ptr) \
+ ZEND_MAP_PTR_GET(ptr)
# define ZEND_MAP_PTR_SET(ptr, val) do { \
(*(ZEND_MAP_PTR(ptr))) = (val); \
} while (0)
+# define ZEND_MAP_PTR_SET_IMM(ptr, val) \
+ ZEND_MAP_PTR_SET(ptr, val)
# define ZEND_MAP_PTR_INIT(ptr, val) do { \
ZEND_MAP_PTR(ptr) = (val); \
} while (0)
@@ -51,6 +55,8 @@
# define ZEND_MAP_PTR_SET_REAL_BASE(base, ptr) do { \
base = (ptr); \
} while (0)
+# define ZEND_MAP_PTR_OFFSET2PTR(ptr) \
+ ((void**)((char*)CG(map_ptr_base) + (uintptr_t)ZEND_MAP_PTR(ptr)))
#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
# define ZEND_MAP_PTR(ptr) \
ptr ## __ptr
@@ -66,6 +72,8 @@
(*(ZEND_MAP_PTR_IS_OFFSET(ptr) ? \
ZEND_MAP_PTR_OFFSET2PTR(ptr) : \
((void**)(ZEND_MAP_PTR(ptr)))))
+# define ZEND_MAP_PTR_GET_IMM(ptr) \
+ (*ZEND_MAP_PTR_OFFSET2PTR(ptr))
# define ZEND_MAP_PTR_SET(ptr, val) do { \
void **__p = (void**)(ZEND_MAP_PTR(ptr)); \
if (ZEND_MAP_PTR_IS_OFFSET(ptr)) { \
@@ -73,6 +81,10 @@
} \
*__p = (val); \
} while (0)
+# define ZEND_MAP_PTR_SET_IMM(ptr, val) do { \
+ void **__p = ZEND_MAP_PTR_OFFSET2PTR(ptr); \
+ *__p = (val); \
+ } while (0)
# define ZEND_MAP_PTR_INIT(ptr, val) do { \
ZEND_MAP_PTR(ptr) = (val); \
} while (0)
diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h
index 30d70bbf53..98957def76 100644
--- a/Zend/zend_modules.h
+++ b/Zend/zend_modules.h
@@ -31,7 +31,7 @@
#define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module
#define ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU zend_module
-#define ZEND_MODULE_API_NO 20200930
+#define ZEND_MODULE_API_NO 20201009
#ifdef ZTS
#define USING_ZTS 1
#else
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index be1631f587..f10e2c58a6 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -63,47 +63,62 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
if (!zobj->properties) {
zend_property_info *prop_info;
zend_class_entry *ce = zobj->ce;
- uint32_t flags = 0;
+ int i;
zobj->properties = zend_new_array(ce->default_properties_count);
if (ce->default_properties_count) {
zend_hash_real_init_mixed(zobj->properties);
- ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
- if (!(prop_info->flags & ZEND_ACC_STATIC)) {
- flags |= prop_info->flags;
+ for (i = 0; i < ce->default_properties_count; i++) {
+ prop_info = ce->properties_info_table[i];
- if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
- HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
- }
-
- _zend_hash_append_ind(zobj->properties, prop_info->name,
- OBJ_PROP(zobj, prop_info->offset));
+ if (!prop_info) {
+ continue;
}
- } ZEND_HASH_FOREACH_END();
- if (flags & ZEND_ACC_CHANGED) {
- while (ce->parent && ce->parent->default_properties_count) {
- ce = ce->parent;
- ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
- if (prop_info->ce == ce &&
- !(prop_info->flags & ZEND_ACC_STATIC) &&
- (prop_info->flags & ZEND_ACC_PRIVATE)) {
- zval zv;
-
- if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
- HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
- }
-
- ZVAL_INDIRECT(&zv, OBJ_PROP(zobj, prop_info->offset));
- zend_hash_add(zobj->properties, prop_info->name, &zv);
- }
- } ZEND_HASH_FOREACH_END();
+
+ if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
+ HT_FLAGS(zobj->properties) |= HASH_FLAG_HAS_EMPTY_IND;
}
+
+ _zend_hash_append_ind(zobj->properties, prop_info->name,
+ OBJ_PROP(zobj, prop_info->offset));
}
}
}
}
/* }}} */
+ZEND_API HashTable *zend_std_build_object_properties_array(zend_object *zobj) /* {{{ */
+{
+ zend_property_info *prop_info;
+ zend_class_entry *ce = zobj->ce;
+ HashTable *ht;
+ zval* prop;
+ int i;
+
+ ZEND_ASSERT(!zobj->properties);
+ ht = zend_new_array(ce->default_properties_count);
+ if (ce->default_properties_count) {
+ zend_hash_real_init_mixed(ht);
+ for (i = 0; i < ce->default_properties_count; i++) {
+ prop_info = ce->properties_info_table[i];
+
+ if (!prop_info) {
+ continue;
+ }
+
+ prop = OBJ_PROP(zobj, prop_info->offset);
+ if (UNEXPECTED(Z_TYPE_P(prop) == IS_UNDEF)) {
+ continue;
+ }
+
+ Z_TRY_ADDREF_P(prop);
+ _zend_hash_append(ht, prop_info->name, prop);
+ }
+ }
+ return ht;
+}
+/* }}} */
+
ZEND_API HashTable *zend_std_get_properties(zend_object *zobj) /* {{{ */
{
if (!zobj->properties) {
@@ -209,7 +224,7 @@ static void zend_std_call_issetter(zend_object *zobj, zend_string *prop_name, zv
/* }}} */
-static zend_always_inline zend_bool is_derived_class(zend_class_entry *child_class, zend_class_entry *parent_class) /* {{{ */
+static zend_always_inline bool is_derived_class(zend_class_entry *child_class, zend_class_entry *parent_class) /* {{{ */
{
child_class = child_class->parent;
while (child_class) {
@@ -443,7 +458,7 @@ found:
}
/* }}} */
-ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_info_name, zend_bool is_dynamic) /* {{{ */
+ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_info_name, bool is_dynamic) /* {{{ */
{
zend_property_info *property_info;
const char *class_name = NULL;
@@ -691,7 +706,7 @@ exit:
}
/* }}} */
-static zend_always_inline zend_bool property_uses_strict_types() {
+static zend_always_inline bool property_uses_strict_types() {
zend_execute_data *execute_data = EG(current_execute_data);
return execute_data
&& execute_data->func
@@ -1263,11 +1278,29 @@ static zend_always_inline zend_function *zend_get_user_callstatic_function(zend_
}
/* }}} */
+static zend_always_inline zend_function *get_static_method_fallback(
+ zend_class_entry *ce, zend_string *function_name)
+{
+ zend_object *object;
+ if (ce->__call &&
+ (object = zend_get_this_object(EG(current_execute_data))) != NULL &&
+ instanceof_function(object->ce, ce)) {
+ /* Call the top-level defined __call().
+ * see: tests/classes/__call_004.phpt */
+
+ ZEND_ASSERT(object->ce->__call);
+ return zend_get_user_call_function(object->ce, function_name);
+ } else if (ce->__callstatic) {
+ return zend_get_user_callstatic_function(ce, function_name);
+ } else {
+ return NULL;
+ }
+}
+
ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name, const zval *key) /* {{{ */
{
zend_function *fbc = NULL;
zend_string *lc_function_name;
- zend_object *object;
zend_class_entry *scope;
if (EXPECTED(key != NULL)) {
@@ -1293,19 +1326,7 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st
if (UNEXPECTED(!key)) {
zend_string_release_ex(lc_function_name, 0);
}
- if (ce->__call &&
- (object = zend_get_this_object(EG(current_execute_data))) != NULL &&
- instanceof_function(object->ce, ce)) {
- /* Call the top-level defined __call().
- * see: tests/classes/__call_004.phpt */
-
- ZEND_ASSERT(object->ce->__call);
- return zend_get_user_call_function(object->ce, function_name);
- } else if (ce->__callstatic) {
- return zend_get_user_callstatic_function(ce, function_name);
- } else {
- return NULL;
- }
+ return get_static_method_fallback(ce, function_name);
}
} while (0);
@@ -1321,12 +1342,11 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st
if (UNEXPECTED(fbc->common.scope != scope)) {
if (UNEXPECTED(fbc->op_array.fn_flags & ZEND_ACC_PRIVATE)
|| UNEXPECTED(!zend_check_protected(zend_get_function_root_class(fbc), scope))) {
- if (ce->__callstatic) {
- fbc = zend_get_user_callstatic_function(ce, function_name);
- } else {
+ zend_function *fallback_fbc = get_static_method_fallback(ce, function_name);
+ if (!fallback_fbc) {
zend_bad_method_call(fbc, function_name, scope);
- fbc = NULL;
}
+ fbc = fallback_fbc;
}
}
}
@@ -1440,7 +1460,7 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p
return zend_std_get_static_property_with_info(ce, property_name, type, &prop_info);
}
-ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name) /* {{{ */
+ZEND_API ZEND_COLD bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name) /* {{{ */
{
zend_throw_error(NULL, "Attempt to unset static property %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(property_name));
return 0;
@@ -1550,6 +1570,7 @@ ZEND_API int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
}
if (!zobj1->properties && !zobj2->properties) {
zend_property_info *info;
+ int i;
if (!zobj1->ce->default_properties_count) {
return 0;
@@ -1565,14 +1586,18 @@ ZEND_API int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
}
Z_PROTECT_RECURSION_P(o1);
- ZEND_HASH_FOREACH_PTR(&zobj1->ce->properties_info, info) {
- zval *p1 = OBJ_PROP(zobj1, info->offset);
- zval *p2 = OBJ_PROP(zobj2, info->offset);
+ for (i = 0; i < zobj1->ce->default_properties_count; i++) {
+ zval *p1, *p2;
+
+ info = zobj1->ce->properties_info_table[i];
- if (info->flags & ZEND_ACC_STATIC) {
+ if (!info) {
continue;
}
+ p1 = OBJ_PROP(zobj1, info->offset);
+ p2 = OBJ_PROP(zobj2, info->offset);
+
if (Z_TYPE_P(p1) != IS_UNDEF) {
if (Z_TYPE_P(p2) != IS_UNDEF) {
int ret;
@@ -1592,7 +1617,7 @@ ZEND_API int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
return 1;
}
}
- } ZEND_HASH_FOREACH_END();
+ }
Z_UNPROTECT_RECURSION_P(o1);
return 0;
@@ -1751,7 +1776,7 @@ ZEND_API int zend_std_cast_object_tostring(zend_object *readobj, zval *writeobj,
}
/* }}} */
-ZEND_API int zend_std_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, zend_bool check_only) /* {{{ */
+ZEND_API int zend_std_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only) /* {{{ */
{
zval *func;
zend_class_entry *ce = obj->ce;
diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h
index 5134230354..53eef82928 100644
--- a/Zend/zend_object_handlers.h
+++ b/Zend/zend_object_handlers.h
@@ -36,10 +36,6 @@ struct _zend_property_info;
#define ZEND_ENCODE_DYN_PROP_OFFSET(offset) ((uintptr_t)(-((intptr_t)(offset) + 2)))
-/* The following rule applies to read_property() and read_dimension() implementations:
- If you return a zval which is not otherwise referenced by the extension or the engine's
- symbol table, its reference count should be 0.
-*/
/* Used to fetch property from the object, read-only */
typedef zval *(*zend_object_read_property_t)(zend_object *object, zend_string *member, int type, void **cache_slot, zval *rv);
@@ -47,13 +43,9 @@ typedef zval *(*zend_object_read_property_t)(zend_object *object, zend_string *m
typedef zval *(*zend_object_read_dimension_t)(zend_object *object, zval *offset, int type, zval *rv);
-/* The following rule applies to write_property() and write_dimension() implementations:
- If you receive a value zval in write_property/write_dimension, you may only modify it if
- its reference count is 1. Otherwise, you must create a copy of that zval before making
- any changes. You should NOT modify the reference count of the value passed to you.
+/* Used to set property of the object
You must return the final value of the assigned property.
*/
-/* Used to set property of the object */
typedef zval *(*zend_object_write_property_t)(zend_object *object, zend_string *member, zval *value, void **cache_slot);
/* Used to set dimension of the object */
@@ -118,9 +110,29 @@ typedef zend_array *(*zend_object_get_properties_for_t)(zend_object *object, zen
typedef zend_function *(*zend_object_get_method_t)(zend_object **object, zend_string *method, const zval *key);
typedef zend_function *(*zend_object_get_constructor_t)(zend_object *object);
-/* Object maintenance/destruction */
-typedef void (*zend_object_dtor_obj_t)(zend_object *object);
+/* free_obj should release any resources the object holds, without freeing the
+ * object structure itself. The object does not need to be in a valid state after
+ * free_obj finishes running.
+ *
+ * free_obj will always be invoked, even if the object leaks or a fatal error
+ * occurs. However, during shutdown it may be called once the executor is no
+ * longer active, in which case execution of user code may be skipped.
+ */
typedef void (*zend_object_free_obj_t)(zend_object *object);
+
+/* dtor_obj is called before free_obj. The object must remain in a valid state
+ * after dtor_obj finishes running. Unlike free_obj, it is run prior to
+ * deactivation of the executor during shutdown, which allows user code to run.
+ *
+ * This handler is not guaranteed to be called (e.g. on fatal error), and as
+ * such should not be used to release resources or deallocate memory. Furthermore,
+ * releasing resources in this handler can break detection of memory leaks, as
+ * cycles may be broken early.
+ *
+ * dtor_obj should be used *only* to call user destruction hooks, such as __destruct.
+ */
+typedef void (*zend_object_dtor_obj_t)(zend_object *object);
+
typedef zend_object* (*zend_object_clone_obj_t)(zend_object *object);
/* Get class name for display in var_dump and other debugging functions.
@@ -138,7 +150,7 @@ typedef int (*zend_object_cast_t)(zend_object *readobj, zval *retval, int type);
* Returns FAILURE if the object does not have any sense of overloaded dimensions */
typedef int (*zend_object_count_elements_t)(zend_object *object, zend_long *count);
-typedef int (*zend_object_get_closure_t)(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, zend_bool check_only);
+typedef int (*zend_object_get_closure_t)(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only);
typedef HashTable *(*zend_object_get_gc_t)(zend_object *object, zval **table, int *n);
@@ -191,7 +203,7 @@ ZEND_API void zend_class_init_statics(zend_class_entry *ce);
ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name_strval, const zval *key);
ZEND_API zval *zend_std_get_static_property_with_info(zend_class_entry *ce, zend_string *property_name, int type, struct _zend_property_info **prop_info);
ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type);
-ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name);
+ZEND_API ZEND_COLD bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name);
ZEND_API zend_function *zend_std_get_constructor(zend_object *object);
ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_string *member, int silent);
ZEND_API HashTable *zend_std_get_properties(zend_object *object);
@@ -210,16 +222,18 @@ ZEND_API void zend_std_unset_dimension(zend_object *object, zval *offset);
ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key);
ZEND_API zend_string *zend_std_get_class_name(const zend_object *zobj);
ZEND_API int zend_std_compare_objects(zval *o1, zval *o2);
-ZEND_API int zend_std_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, zend_bool check_only);
+ZEND_API int zend_std_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only);
ZEND_API void rebuild_object_properties(zend_object *zobj);
+ZEND_API HashTable *zend_std_build_object_properties_array(zend_object *zobj);
+
/* Handler for objects that cannot be meaningfully compared.
* Only objects with the same identity will be considered equal. */
ZEND_API int zend_objects_not_comparable(zval *o1, zval *o2);
ZEND_API int zend_check_protected(zend_class_entry *ce, zend_class_entry *scope);
-ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_info_name, zend_bool is_dynamic);
+ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_info_name, bool is_dynamic);
ZEND_API zend_function *zend_get_call_trampoline_func(zend_class_entry *ce, zend_string *method_name, int is_static);
diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c
index 80359b5e1e..104cda6141 100644
--- a/Zend/zend_objects_API.c
+++ b/Zend/zend_objects_API.c
@@ -79,7 +79,7 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_mark_destructed(zend_objects_stor
}
}
-ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_store *objects, zend_bool fast_shutdown)
+ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_store *objects, bool fast_shutdown)
{
zend_object **obj_ptr, **end, *obj;
diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h
index 85ce701cd7..539850f227 100644
--- a/Zend/zend_objects_API.h
+++ b/Zend/zend_objects_API.h
@@ -54,7 +54,7 @@ BEGIN_EXTERN_C()
ZEND_API void ZEND_FASTCALL zend_objects_store_init(zend_objects_store *objects, uint32_t init_size);
ZEND_API void ZEND_FASTCALL zend_objects_store_call_destructors(zend_objects_store *objects);
ZEND_API void ZEND_FASTCALL zend_objects_store_mark_destructed(zend_objects_store *objects);
-ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_store *objects, zend_bool fast_shutdown);
+ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_store *objects, bool fast_shutdown);
ZEND_API void ZEND_FASTCALL zend_objects_store_destroy(zend_objects_store *objects);
/* Store API functions */
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index 6681ef7b68..0cced91a84 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -77,7 +77,7 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz
op_array->last_live_range = 0;
op_array->static_variables = NULL;
- ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
+ ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, NULL);
op_array->last_try_catch = 0;
op_array->fn_flags = 0;
@@ -85,6 +85,9 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz
op_array->last_literal = 0;
op_array->literals = NULL;
+ op_array->num_dynamic_func_defs = 0;
+ op_array->dynamic_func_defs = NULL;
+
ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL);
op_array->cache_size = zend_op_array_extension_handles * sizeof(void*);
@@ -103,7 +106,7 @@ ZEND_API void destroy_zend_function(zend_function *function)
zend_function_dtor(&tmp);
}
-ZEND_API void zend_type_release(zend_type type, zend_bool persistent) {
+ZEND_API void zend_type_release(zend_type type, bool persistent) {
if (ZEND_TYPE_HAS_LIST(type)) {
zend_type *list_type;
ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(type), list_type) {
@@ -163,7 +166,7 @@ ZEND_API void zend_function_dtor(zval *zv)
ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce)
{
- if (CE_STATIC_MEMBERS(ce)) {
+ if (ZEND_MAP_PTR(ce->static_members_table) && CE_STATIC_MEMBERS(ce)) {
zval *static_members = CE_STATIC_MEMBERS(ce);
zval *p = static_members;
zval *end = p + ce->default_static_members_count;
@@ -255,18 +258,76 @@ static void _destroy_zend_class_traits_info(zend_class_entry *ce)
}
}
+ZEND_API void zend_cleanup_mutable_class_data(zend_class_entry *ce)
+{
+ zend_class_mutable_data *mutable_data = ZEND_MAP_PTR_GET_IMM(ce->mutable_data);
+
+ if (mutable_data) {
+ HashTable *constants_table;
+ zval *p;
+
+ constants_table = mutable_data->constants_table;
+ if (constants_table && constants_table != &ce->constants_table) {
+ zend_class_constant *c;
+
+ ZEND_HASH_FOREACH_PTR(constants_table, c) {
+ zval_ptr_dtor_nogc(&c->value);
+ } ZEND_HASH_FOREACH_END();
+ zend_hash_destroy(constants_table);
+ mutable_data->constants_table = NULL;
+ }
+
+ p = mutable_data->default_properties_table;
+ if (p && p != ce->default_properties_table) {
+ zval *end = p + ce->default_properties_count;
+
+ while (p < end) {
+ zval_ptr_dtor_nogc(p);
+ p++;
+ }
+ mutable_data->default_properties_table = NULL;
+ }
+
+ ZEND_MAP_PTR_SET_IMM(ce->mutable_data, NULL);
+ }
+}
+
ZEND_API void destroy_zend_class(zval *zv)
{
zend_property_info *prop_info;
zend_class_entry *ce = Z_PTR_P(zv);
zend_function *fn;
- if (ce->ce_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED)) {
+ if (ce->ce_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED|ZEND_ACC_FILE_CACHED)) {
zend_op_array *op_array;
if (ce->default_static_members_count) {
zend_cleanup_internal_class_data(ce);
}
+
+ if (!(ce->ce_flags & ZEND_ACC_FILE_CACHED)) {
+ if (ZEND_MAP_PTR(ce->mutable_data) && ZEND_MAP_PTR_GET_IMM(ce->mutable_data)) {
+ zend_cleanup_mutable_class_data(ce);
+ }
+ } else {
+ zend_class_constant *c;
+ zval *p, *end;
+
+ ZEND_HASH_FOREACH_PTR(&ce->constants_table, c) {
+ if (c->ce == ce) {
+ zval_ptr_dtor_nogc(&c->value);
+ }
+ } ZEND_HASH_FOREACH_END();
+
+ p = ce->default_properties_table;
+ end = p + ce->default_properties_count;
+
+ while (p < end) {
+ zval_ptr_dtor_nogc(p);
+ p++;
+ }
+ }
+
if (ce->ce_flags & ZEND_HAS_STATIC_IN_METHODS) {
ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) {
if (op_array->type == ZEND_USER_FUNCTION) {
@@ -280,9 +341,40 @@ ZEND_API void destroy_zend_class(zval *zv)
}
switch (ce->type) {
case ZEND_USER_CLASS:
- if (ce->parent_name && !(ce->ce_flags & ZEND_ACC_RESOLVED_PARENT)) {
- zend_string_release_ex(ce->parent_name, 0);
+ if (!(ce->ce_flags & ZEND_ACC_CACHED)) {
+ if (ce->parent_name && !(ce->ce_flags & ZEND_ACC_RESOLVED_PARENT)) {
+ zend_string_release_ex(ce->parent_name, 0);
+ }
+
+ zend_string_release_ex(ce->name, 0);
+ zend_string_release_ex(ce->info.user.filename, 0);
+
+ if (ce->info.user.doc_comment) {
+ zend_string_release_ex(ce->info.user.doc_comment, 0);
+ }
+
+ if (ce->attributes) {
+ zend_hash_release(ce->attributes);
+ }
+ if (ce->backed_enum_table) {
+ zend_hash_release(ce->backed_enum_table);
+ }
+
+ if (ce->num_interfaces > 0 && !(ce->ce_flags & ZEND_ACC_RESOLVED_INTERFACES)) {
+ uint32_t i;
+
+ for (i = 0; i < ce->num_interfaces; i++) {
+ zend_string_release_ex(ce->interface_names[i].name, 0);
+ zend_string_release_ex(ce->interface_names[i].lc_name, 0);
+ }
+ efree(ce->interface_names);
+ }
+
+ if (ce->num_traits > 0) {
+ _destroy_zend_class_traits_info(ce);
+ }
}
+
if (ce->default_properties_table) {
zval *p = ce->default_properties_table;
zval *end = p + ce->default_properties_count;
@@ -325,7 +417,6 @@ ZEND_API void destroy_zend_class(zval *zv)
}
} ZEND_HASH_FOREACH_END();
zend_hash_destroy(&ce->properties_info);
- zend_string_release_ex(ce->name, 0);
zend_hash_destroy(&ce->function_table);
if (zend_hash_num_elements(&ce->constants_table)) {
zend_class_constant *c;
@@ -343,29 +434,9 @@ ZEND_API void destroy_zend_class(zval *zv)
} ZEND_HASH_FOREACH_END();
}
zend_hash_destroy(&ce->constants_table);
- if (ce->num_interfaces > 0) {
- if (!(ce->ce_flags & ZEND_ACC_RESOLVED_INTERFACES)) {
- uint32_t i;
-
- for (i = 0; i < ce->num_interfaces; i++) {
- zend_string_release_ex(ce->interface_names[i].name, 0);
- zend_string_release_ex(ce->interface_names[i].lc_name, 0);
- }
- }
+ if (ce->num_interfaces > 0 && (ce->ce_flags & ZEND_ACC_RESOLVED_INTERFACES)) {
efree(ce->interfaces);
}
- zend_string_release_ex(ce->info.user.filename, 0);
- if (ce->info.user.doc_comment) {
- zend_string_release_ex(ce->info.user.doc_comment, 0);
- }
- if (ce->attributes) {
- zend_hash_release(ce->attributes);
- }
-
- if (ce->num_traits > 0) {
- _destroy_zend_class_traits_info(ce);
- }
-
break;
case ZEND_INTERNAL_CLASS:
if (ce->default_properties_table) {
@@ -446,18 +517,20 @@ void zend_class_add_ref(zval *zv)
}
}
-ZEND_API void destroy_op_array(zend_op_array *op_array)
+ZEND_API void zend_destroy_static_vars(zend_op_array *op_array)
{
- uint32_t i;
-
- if (op_array->static_variables) {
+ if (ZEND_MAP_PTR(op_array->static_variables_ptr)) {
HashTable *ht = ZEND_MAP_PTR_GET(op_array->static_variables_ptr);
- if (ht && !(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
- if (GC_DELREF(ht) == 0) {
- zend_array_destroy(ht);
- }
+ if (ht) {
+ zend_array_destroy(ht);
+ ZEND_MAP_PTR_SET(op_array->static_variables_ptr, NULL);
}
}
+}
+
+ZEND_API void destroy_op_array(zend_op_array *op_array)
+{
+ uint32_t i;
if ((op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE)
&& ZEND_MAP_PTR(op_array->run_time_cache)) {
@@ -534,6 +607,22 @@ ZEND_API void destroy_op_array(zend_op_array *op_array)
}
efree(arg_info);
}
+ if (op_array->static_variables) {
+ zend_array_destroy(op_array->static_variables);
+ }
+ if (op_array->num_dynamic_func_defs) {
+ for (i = 0; i < op_array->num_dynamic_func_defs; i++) {
+ /* Closures overwrite static_variables in their copy.
+ * Make sure to destroy them when the prototype function is destroyed. */
+ if (op_array->dynamic_func_defs[i]->static_variables
+ && (op_array->dynamic_func_defs[i]->fn_flags & ZEND_ACC_CLOSURE)) {
+ zend_array_destroy(op_array->dynamic_func_defs[i]->static_variables);
+ op_array->dynamic_func_defs[i]->static_variables = NULL;
+ }
+ destroy_op_array(op_array->dynamic_func_defs[i]);
+ }
+ efree(op_array->dynamic_func_defs);
+ }
}
static void zend_update_extended_stmts(zend_op_array *op_array)
@@ -754,14 +843,14 @@ static void emit_live_range(
emit_live_range_raw(op_array, var_num, kind, start, end);
}
-static zend_bool is_fake_def(zend_op *opline) {
+static bool is_fake_def(zend_op *opline) {
/* These opcodes only modify the result, not create it. */
return opline->opcode == ZEND_ROPE_ADD
|| opline->opcode == ZEND_ADD_ARRAY_ELEMENT
|| opline->opcode == ZEND_ADD_ARRAY_UNPACK;
}
-static zend_bool keeps_op1_alive(zend_op *opline) {
+static bool keeps_op1_alive(zend_op *opline) {
/* These opcodes don't consume their OP1 operand,
* it is later freed by something else. */
if (opline->opcode == ZEND_CASE
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index d1f2d553fc..db53c71317 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -30,12 +30,21 @@
#include "zend_exceptions.h"
#include "zend_closures.h"
+#include <locale.h>
+#ifdef HAVE_LANGINFO_H
+# include <langinfo.h>
+#endif
+
#ifdef __SSE2__
#include <emmintrin.h>
#endif
+#if defined(ZEND_WIN32) && !defined(ZTS) && defined(_MSC_VER)
+/* This performance improvement of tolower() on Windows gives 10-18% on bench.php */
+#define ZEND_USE_TOLOWER_L 1
+#endif
+
#ifdef ZEND_USE_TOLOWER_L
-#include <locale.h>
static _locale_t current_locale = NULL;
/* this is true global! may lead to strange effects on ZTS, but so may setlocale() */
#define zend_tolower(c) _tolower_l(c, current_locale)
@@ -285,7 +294,7 @@ static zend_always_inline zend_result zendi_try_convert_scalar_to_number(zval *o
}
/* }}} */
-static zend_never_inline zend_long ZEND_FASTCALL zendi_try_get_long(zval *op, zend_bool *failed) /* {{{ */
+static zend_never_inline zend_long ZEND_FASTCALL zendi_try_get_long(zval *op, bool *failed) /* {{{ */
{
*failed = 0;
switch (Z_TYPE_P(op)) {
@@ -377,7 +386,7 @@ static zend_never_inline zend_long ZEND_FASTCALL zendi_try_get_long(zval *op, ze
#define convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, opcode, sigil) \
do { \
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) { \
- zend_bool failed; \
+ bool failed; \
if (Z_ISREF_P(op1)) { \
op1 = Z_REFVAL_P(op1); \
if (Z_TYPE_P(op1) == IS_LONG) { \
@@ -400,7 +409,7 @@ static zend_never_inline zend_long ZEND_FASTCALL zendi_try_get_long(zval *op, ze
} while (0); \
do { \
if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) { \
- zend_bool failed; \
+ bool failed; \
if (Z_ISREF_P(op2)) { \
op2 = Z_REFVAL_P(op2); \
if (Z_TYPE_P(op2) == IS_LONG) { \
@@ -424,14 +433,6 @@ static zend_never_inline zend_long ZEND_FASTCALL zendi_try_get_long(zval *op, ze
ZEND_API void ZEND_FASTCALL convert_to_long(zval *op) /* {{{ */
{
- if (Z_TYPE_P(op) != IS_LONG) {
- convert_to_long_base(op, 10);
- }
-}
-/* }}} */
-
-ZEND_API void ZEND_FASTCALL convert_to_long_base(zval *op, int base) /* {{{ */
-{
zend_long tmp;
try_again:
@@ -456,11 +457,7 @@ try_again:
case IS_STRING:
{
zend_string *str = Z_STR_P(op);
- if (base == 10) {
- ZVAL_LONG(op, zval_get_long(op));
- } else {
- ZVAL_LONG(op, ZEND_STRTOL(ZSTR_VAL(str), NULL, base));
- }
+ ZVAL_LONG(op, zval_get_long(op));
zend_string_release_ex(str, 0);
}
break;
@@ -683,7 +680,7 @@ try_again:
}
/* }}} */
-ZEND_API zend_bool ZEND_FASTCALL _try_convert_to_string(zval *op) /* {{{ */
+ZEND_API bool ZEND_FASTCALL _try_convert_to_string(zval *op) /* {{{ */
{
zend_string *str;
@@ -716,6 +713,13 @@ try_again:
case IS_OBJECT:
if (Z_OBJCE_P(op) == zend_ce_closure) {
convert_scalar_to_array(op);
+ } else if (Z_OBJ_P(op)->properties == NULL
+ && Z_OBJ_HT_P(op)->get_properties_for == NULL
+ && Z_OBJ_HT_P(op)->get_properties == zend_std_get_properties) {
+ /* Optimized version without rebulding properties HashTable */
+ HashTable *ht = zend_std_build_object_properties_array(Z_OBJ_P(op));
+ OBJ_RELEASE(Z_OBJ_P(op));
+ ZVAL_ARR(op, ht);
} else {
HashTable *obj_ht = zend_get_properties_for(op, ZEND_PROP_PURPOSE_ARRAY_CAST);
if (obj_ht) {
@@ -882,7 +886,7 @@ try_again:
}
/* }}} */
-static zend_always_inline zend_string* __zval_get_string_func(zval *op, zend_bool try) /* {{{ */
+static zend_always_inline zend_string* __zval_get_string_func(zval *op, bool try) /* {{{ */
{
try_again:
switch (Z_TYPE_P(op)) {
@@ -1530,7 +1534,7 @@ ZEND_API zend_result ZEND_FASTCALL bitwise_or_function(zval *result, zval *op1,
}
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
- zend_bool failed;
+ bool failed;
ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_OR);
op1_lval = zendi_try_get_long(op1, &failed);
if (UNEXPECTED(failed)) {
@@ -1544,7 +1548,7 @@ ZEND_API zend_result ZEND_FASTCALL bitwise_or_function(zval *result, zval *op1,
op1_lval = Z_LVAL_P(op1);
}
if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
- zend_bool failed;
+ bool failed;
ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_OR);
op2_lval = zendi_try_get_long(op2, &failed);
if (UNEXPECTED(failed)) {
@@ -1612,7 +1616,7 @@ ZEND_API zend_result ZEND_FASTCALL bitwise_and_function(zval *result, zval *op1,
}
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
- zend_bool failed;
+ bool failed;
ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_AND);
op1_lval = zendi_try_get_long(op1, &failed);
if (UNEXPECTED(failed)) {
@@ -1626,7 +1630,7 @@ ZEND_API zend_result ZEND_FASTCALL bitwise_and_function(zval *result, zval *op1,
op1_lval = Z_LVAL_P(op1);
}
if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
- zend_bool failed;
+ bool failed;
ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_AND);
op2_lval = zendi_try_get_long(op2, &failed);
if (UNEXPECTED(failed)) {
@@ -1694,7 +1698,7 @@ ZEND_API zend_result ZEND_FASTCALL bitwise_xor_function(zval *result, zval *op1,
}
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
- zend_bool failed;
+ bool failed;
ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_XOR);
op1_lval = zendi_try_get_long(op1, &failed);
if (UNEXPECTED(failed)) {
@@ -1708,7 +1712,7 @@ ZEND_API zend_result ZEND_FASTCALL bitwise_xor_function(zval *result, zval *op1,
op1_lval = Z_LVAL_P(op1);
}
if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
- zend_bool failed;
+ bool failed;
ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_XOR);
op2_lval = zendi_try_get_long(op2, &failed);
if (UNEXPECTED(failed)) {
@@ -1910,7 +1914,7 @@ ZEND_API zend_result ZEND_FASTCALL concat_function(zval *result, zval *op1, zval
}
/* }}} */
-ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, zend_bool case_insensitive) /* {{{ */
+ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, bool case_insensitive) /* {{{ */
{
zend_string *tmp_str1, *tmp_str2;
zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
@@ -2194,7 +2198,7 @@ static int hash_zval_identical_function(zval *z1, zval *z2) /* {{{ */
}
/* }}} */
-ZEND_API zend_bool ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2) /* {{{ */
{
if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
return 0;
@@ -2265,7 +2269,7 @@ ZEND_API zend_result ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zv
}
/* }}} */
-ZEND_API zend_bool ZEND_FASTCALL zend_class_implements_interface(const zend_class_entry *class_ce, const zend_class_entry *interface_ce) /* {{{ */
+ZEND_API bool ZEND_FASTCALL zend_class_implements_interface(const zend_class_entry *class_ce, const zend_class_entry *interface_ce) /* {{{ */
{
uint32_t i;
ZEND_ASSERT(!(class_ce->ce_flags & ZEND_ACC_INTERFACE));
@@ -2283,7 +2287,7 @@ ZEND_API zend_bool ZEND_FASTCALL zend_class_implements_interface(const zend_clas
}
/* }}} */
-ZEND_API zend_bool ZEND_FASTCALL instanceof_function_slow(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */
+ZEND_API bool ZEND_FASTCALL instanceof_function_slow(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */
{
ZEND_ASSERT(instance_ce != ce && "Should have been checked already");
if (ce->ce_flags & ZEND_ACC_INTERFACE) {
@@ -2335,8 +2339,10 @@ static void ZEND_FASTCALL increment_string(zval *str) /* {{{ */
Z_STR_P(str) = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0);
Z_TYPE_INFO_P(str) = IS_STRING_EX;
} else if (Z_REFCOUNT_P(str) > 1) {
- Z_DELREF_P(str);
+ /* Only release string after allocation succeeded. */
+ zend_string *orig_str = Z_STR_P(str);
Z_STR_P(str) = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0);
+ GC_DELREF(orig_str);
} else {
zend_string_forget_hash_val(Z_STR_P(str));
}
@@ -2547,13 +2553,85 @@ ZEND_API bool ZEND_FASTCALL zend_object_is_true(zval *op) /* {{{ */
}
/* }}} */
-#ifdef ZEND_USE_TOLOWER_L
ZEND_API void zend_update_current_locale(void) /* {{{ */
{
+#ifdef ZEND_USE_TOLOWER_L
+# if defined(ZEND_WIN32) && defined(_MSC_VER)
current_locale = _get_current_locale();
+# else
+ current_locale = uselocale(0);
+# endif
+#endif
+#if defined(ZEND_WIN32) && defined(_MSC_VER)
+ if (MB_CUR_MAX > 1) {
+ unsigned int cp = ___lc_codepage_func();
+ CG(variable_width_locale) = 1;
+ // TODO: EUC-* are also ASCII compatible ???
+ CG(ascii_compatible_locale) =
+ cp == 65001; /* UTF-8 */
+ } else {
+ CG(variable_width_locale) = 0;
+ CG(ascii_compatible_locale) = 1;
+ }
+#elif defined(MB_CUR_MAX)
+ /* Check if current locale uses variable width encoding */
+ if (MB_CUR_MAX > 1) {
+#if HAVE_NL_LANGINFO
+ const char *charmap = nl_langinfo(CODESET);
+#else
+ char buf[16];
+ const char *charmap = NULL;
+ const char *locale = setlocale(LC_CTYPE, NULL);
+
+ if (locale) {
+ const char *dot = strchr(locale, '.');
+ const char *modifier;
+
+ if (dot) {
+ dot++;
+ modifier = strchr(dot, '@');
+ if (!modifier) {
+ charmap = dot;
+ } else if (modifier - dot < sizeof(buf)) {
+ memcpy(buf, dot, modifier - dot);
+ buf[modifier - dot] = '\0';
+ charmap = buf;
+ }
+ }
+ }
+#endif
+ CG(variable_width_locale) = 1;
+ CG(ascii_compatible_locale) = 0;
+
+ if (charmap) {
+ size_t len = strlen(charmap);
+ static const char *ascii_compatible_charmaps[] = {
+ "utf-8",
+ "utf8",
+ // TODO: EUC-* are also ASCII compatible ???
+ NULL
+ };
+ const char **p;
+ /* Check if current locale is ASCII compatible */
+ for (p = ascii_compatible_charmaps; *p; p++) {
+ if (zend_binary_strcasecmp(charmap, len, *p, strlen(*p)) == 0) {
+ CG(ascii_compatible_locale) = 1;
+ break;
+ }
+ }
+ }
+
+ } else {
+ CG(variable_width_locale) = 0;
+ CG(ascii_compatible_locale) = 1;
+ }
+#else
+ /* We can't determine current charset. Assume the worst case */
+ CG(variable_width_locale) = 1;
+ CG(ascii_compatible_locale) = 0;
+#endif
}
/* }}} */
-#endif
static zend_always_inline void zend_str_tolower_impl(char *dest, const char *str, size_t length) /* {{{ */ {
unsigned char *p = (unsigned char*)str;
@@ -2954,15 +3032,6 @@ ZEND_API int ZEND_FASTCALL zend_compare_objects(zval *o1, zval *o2) /* {{{ */
}
/* }}} */
-ZEND_API void ZEND_FASTCALL zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_DC) /* {{{ */
-{
- zend_string *str;
-
- str = zend_strpprintf(0, "%.*G", (int) EG(precision), (double)Z_DVAL_P(op));
- ZVAL_NEW_STR(op, str);
-}
-/* }}} */
-
ZEND_API zend_string* ZEND_FASTCALL zend_long_to_str(zend_long num) /* {{{ */
{
if ((zend_ulong)num <= 9) {
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h
index d543b7b03c..8996a3d959 100644
--- a/Zend/zend_operators.h
+++ b/Zend/zend_operators.h
@@ -54,7 +54,7 @@ ZEND_API zend_result ZEND_FASTCALL shift_left_function(zval *result, zval *op1,
ZEND_API zend_result ZEND_FASTCALL shift_right_function(zval *result, zval *op1, zval *op2);
ZEND_API zend_result ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2);
-ZEND_API zend_bool ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2);
+ZEND_API bool ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2);
ZEND_API zend_result ZEND_FASTCALL is_equal_function(zval *result, zval *op1, zval *op2);
ZEND_API zend_result ZEND_FASTCALL is_identical_function(zval *result, zval *op1, zval *op2);
@@ -63,10 +63,10 @@ ZEND_API zend_result ZEND_FASTCALL is_not_equal_function(zval *result, zval *op1
ZEND_API zend_result ZEND_FASTCALL is_smaller_function(zval *result, zval *op1, zval *op2);
ZEND_API zend_result ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1, zval *op2);
-ZEND_API zend_bool ZEND_FASTCALL zend_class_implements_interface(const zend_class_entry *class_ce, const zend_class_entry *interface_ce);
-ZEND_API zend_bool ZEND_FASTCALL instanceof_function_slow(const zend_class_entry *instance_ce, const zend_class_entry *ce);
+ZEND_API bool ZEND_FASTCALL zend_class_implements_interface(const zend_class_entry *class_ce, const zend_class_entry *interface_ce);
+ZEND_API bool ZEND_FASTCALL instanceof_function_slow(const zend_class_entry *instance_ce, const zend_class_entry *ce);
-static zend_always_inline zend_bool instanceof_function(
+static zend_always_inline bool instanceof_function(
const zend_class_entry *instance_ce, const zend_class_entry *ce) {
return instance_ce == ce || instanceof_function_slow(instance_ce, ce);
}
@@ -262,7 +262,6 @@ ZEND_API void ZEND_FASTCALL convert_scalar_to_number(zval *op);
ZEND_API void ZEND_FASTCALL _convert_to_string(zval *op);
ZEND_API void ZEND_FASTCALL convert_to_long(zval *op);
ZEND_API void ZEND_FASTCALL convert_to_double(zval *op);
-ZEND_API void ZEND_FASTCALL convert_to_long_base(zval *op, int base);
ZEND_API void ZEND_FASTCALL convert_to_null(zval *op);
ZEND_API void ZEND_FASTCALL convert_to_boolean(zval *op);
ZEND_API void ZEND_FASTCALL convert_to_array(zval *op);
@@ -322,8 +321,8 @@ static zend_always_inline zend_string *zval_try_get_tmp_string(zval *op, zend_st
/* Like convert_to_string(), but returns whether the conversion succeeded and does not modify the
* zval in-place if it fails. */
-ZEND_API zend_bool ZEND_FASTCALL _try_convert_to_string(zval *op);
-static zend_always_inline zend_bool try_convert_to_string(zval *op) {
+ZEND_API bool ZEND_FASTCALL _try_convert_to_string(zval *op);
+static zend_always_inline bool try_convert_to_string(zval *op) {
if (Z_TYPE_P(op) == IS_STRING) {
return 1;
}
@@ -406,10 +405,10 @@ again:
ZEND_API int ZEND_FASTCALL zend_compare(zval *op1, zval *op2);
-ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2);
+ZEND_API zend_result ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2);
ZEND_API int ZEND_FASTCALL numeric_compare_function(zval *op1, zval *op2);
-ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, zend_bool case_insensitive);
+ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, bool case_insensitive);
ZEND_API int ZEND_FASTCALL string_compare_function(zval *op1, zval *op2);
ZEND_API int ZEND_FASTCALL string_case_compare_function(zval *op1, zval *op2);
ZEND_API int ZEND_FASTCALL string_locale_compare_function(zval *op1, zval *op2);
@@ -442,77 +441,16 @@ ZEND_API int ZEND_FASTCALL zend_compare_objects(zval *o1, zval *o2);
ZEND_API int ZEND_FASTCALL zend_atoi(const char *str, size_t str_len);
ZEND_API zend_long ZEND_FASTCALL zend_atol(const char *str, size_t str_len);
-ZEND_API void ZEND_FASTCALL zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_DC);
-
-#define convert_to_ex_master(pzv, lower_type, upper_type) \
- if (Z_TYPE_P(pzv)!=upper_type) { \
- convert_to_##lower_type(pzv); \
- }
-
-#define convert_to_explicit_type(pzv, type) \
- do { \
- switch (type) { \
- case IS_NULL: \
- convert_to_null(pzv); \
- break; \
- case IS_LONG: \
- convert_to_long(pzv); \
- break; \
- case IS_DOUBLE: \
- convert_to_double(pzv); \
- break; \
- case _IS_BOOL: \
- convert_to_boolean(pzv); \
- break; \
- case IS_ARRAY: \
- convert_to_array(pzv); \
- break; \
- case IS_OBJECT: \
- convert_to_object(pzv); \
- break; \
- case IS_STRING: \
- convert_to_string(pzv); \
- break; \
- default: \
- assert(0); \
- break; \
- } \
- } while (0);
-
-#define convert_to_explicit_type_ex(pzv, str_type) \
- if (Z_TYPE_P(pzv) != str_type) { \
- convert_to_explicit_type(pzv, str_type); \
- }
-
-#define convert_to_boolean_ex(pzv) do { \
- if (Z_TYPE_INFO_P(pzv) > IS_TRUE) { \
- convert_to_boolean(pzv); \
- } else if (Z_TYPE_INFO_P(pzv) < IS_FALSE) { \
- ZVAL_FALSE(pzv); \
- } \
- } while (0)
-#define convert_to_long_ex(pzv) convert_to_ex_master(pzv, long, IS_LONG)
-#define convert_to_double_ex(pzv) convert_to_ex_master(pzv, double, IS_DOUBLE)
-#define convert_to_string_ex(pzv) convert_to_ex_master(pzv, string, IS_STRING)
-#define convert_to_array_ex(pzv) convert_to_ex_master(pzv, array, IS_ARRAY)
-#define convert_to_object_ex(pzv) convert_to_ex_master(pzv, object, IS_OBJECT)
-#define convert_to_null_ex(pzv) convert_to_ex_master(pzv, null, IS_NULL)
-
-#define convert_scalar_to_number_ex(pzv) \
- if (Z_TYPE_P(pzv)!=IS_LONG && Z_TYPE_P(pzv)!=IS_DOUBLE) { \
- convert_scalar_to_number(pzv); \
- }
-
-#if defined(ZEND_WIN32) && !defined(ZTS) && defined(_MSC_VER)
-/* This performance improvement of tolower() on Windows gives 10-18% on bench.php */
-#define ZEND_USE_TOLOWER_L 1
-#endif
+#define convert_to_null_ex(zv) convert_to_null(zv)
+#define convert_to_boolean_ex(zv) convert_to_boolean(zv)
+#define convert_to_long_ex(zv) convert_to_long(zv)
+#define convert_to_double_ex(zv) convert_to_double(zv)
+#define convert_to_string_ex(zv) convert_to_string(zv)
+#define convert_to_array_ex(zv) convert_to_array(zv)
+#define convert_to_object_ex(zv) convert_to_object(zv)
+#define convert_scalar_to_number_ex(zv) convert_scalar_to_number(zv)
-#ifdef ZEND_USE_TOLOWER_L
ZEND_API void zend_update_current_locale(void);
-#else
-#define zend_update_current_locale()
-#endif
/* The offset in bytes between the value and type fields of a zval */
#define ZVAL_OFFSETOF_TYPE \
@@ -896,7 +834,7 @@ static zend_always_inline bool fast_equal_check_string(zval *op1, zval *op2)
return zend_compare(op1, op2) == 0;
}
-static zend_always_inline zend_bool fast_is_identical_function(zval *op1, zval *op2)
+static zend_always_inline bool fast_is_identical_function(zval *op1, zval *op2)
{
if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
return 0;
@@ -906,7 +844,7 @@ static zend_always_inline zend_bool fast_is_identical_function(zval *op1, zval *
return zend_is_identical(op1, op2);
}
-static zend_always_inline zend_bool fast_is_not_identical_function(zval *op1, zval *op2)
+static zend_always_inline bool fast_is_not_identical_function(zval *op1, zval *op2)
{
if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
return 1;
diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h
index f4acc9930e..cda61117ea 100644
--- a/Zend/zend_portability.h
+++ b/Zend/zend_portability.h
@@ -335,7 +335,7 @@ char *alloca();
#if (defined(HAVE_ALLOCA) || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(HPUX)) && !defined(DARWIN)
# define ZEND_ALLOCA_MAX_SIZE (32 * 1024)
# define ALLOCA_FLAG(name) \
- zend_bool name;
+ bool name;
# define SET_ALLOCA_FLAG(name) \
name = 1
# define do_alloca_ex(size, limit, use_heap) \
diff --git a/Zend/zend_ptr_stack.c b/Zend/zend_ptr_stack.c
index 2030cc132b..80c77e11d7 100644
--- a/Zend/zend_ptr_stack.c
+++ b/Zend/zend_ptr_stack.c
@@ -21,7 +21,7 @@
#include "zend_ptr_stack.h"
#include <stdarg.h>
-ZEND_API void zend_ptr_stack_init_ex(zend_ptr_stack *stack, zend_bool persistent)
+ZEND_API void zend_ptr_stack_init_ex(zend_ptr_stack *stack, bool persistent)
{
stack->top_element = stack->elements = NULL;
stack->top = stack->max = 0;
@@ -96,7 +96,7 @@ ZEND_API void zend_ptr_stack_reverse_apply(zend_ptr_stack *stack, void (*func)(v
}
-ZEND_API void zend_ptr_stack_clean(zend_ptr_stack *stack, void (*func)(void *), zend_bool free_elements)
+ZEND_API void zend_ptr_stack_clean(zend_ptr_stack *stack, void (*func)(void *), bool free_elements)
{
zend_ptr_stack_apply(stack, func);
if (free_elements) {
diff --git a/Zend/zend_ptr_stack.h b/Zend/zend_ptr_stack.h
index 2298e4f211..fd4b59d151 100644
--- a/Zend/zend_ptr_stack.h
+++ b/Zend/zend_ptr_stack.h
@@ -24,7 +24,7 @@ typedef struct _zend_ptr_stack {
int top, max;
void **elements;
void **top_element;
- zend_bool persistent;
+ bool persistent;
} zend_ptr_stack;
@@ -32,13 +32,13 @@ typedef struct _zend_ptr_stack {
BEGIN_EXTERN_C()
ZEND_API void zend_ptr_stack_init(zend_ptr_stack *stack);
-ZEND_API void zend_ptr_stack_init_ex(zend_ptr_stack *stack, zend_bool persistent);
+ZEND_API void zend_ptr_stack_init_ex(zend_ptr_stack *stack, bool persistent);
ZEND_API void zend_ptr_stack_n_push(zend_ptr_stack *stack, int count, ...);
ZEND_API void zend_ptr_stack_n_pop(zend_ptr_stack *stack, int count, ...);
ZEND_API void zend_ptr_stack_destroy(zend_ptr_stack *stack);
ZEND_API void zend_ptr_stack_apply(zend_ptr_stack *stack, void (*func)(void *));
ZEND_API void zend_ptr_stack_reverse_apply(zend_ptr_stack *stack, void (*func)(void *));
-ZEND_API void zend_ptr_stack_clean(zend_ptr_stack *stack, void (*func)(void *), zend_bool free_elements);
+ZEND_API void zend_ptr_stack_clean(zend_ptr_stack *stack, void (*func)(void *), bool free_elements);
ZEND_API int zend_ptr_stack_num_elements(zend_ptr_stack *stack);
END_EXTERN_C()
diff --git a/Zend/zend_signal.h b/Zend/zend_signal.h
index 08c9de20c7..ed89851fa8 100644
--- a/Zend/zend_signal.h
+++ b/Zend/zend_signal.h
@@ -56,8 +56,8 @@ typedef struct _zend_signal_globals_t {
int blocked; /* 1==TRUE, 0==FALSE */
int running; /* in signal handler execution */
int active; /* internal signal handling is enabled */
- zend_bool check; /* check for replaced handlers on shutdown */
- zend_bool reset; /* reset signal handlers on each request */
+ bool check; /* check for replaced handlers on shutdown */
+ bool reset; /* reset signal handlers on each request */
zend_signal_entry_t handlers[NSIG];
zend_signal_queue_t pstorage[ZEND_SIGNAL_QUEUE_SIZE], *phead, *ptail, *pavail; /* pending queue */
} zend_signal_globals_t;
diff --git a/Zend/zend_smart_str.h b/Zend/zend_smart_str.h
index 9211e54bee..756261e937 100644
--- a/Zend/zend_smart_str.h
+++ b/Zend/zend_smart_str.h
@@ -54,7 +54,7 @@ ZEND_API void smart_str_append_printf(smart_str *dest, const char *format, ...)
END_EXTERN_C()
-static zend_always_inline size_t smart_str_alloc(smart_str *str, size_t len, zend_bool persistent) {
+static zend_always_inline size_t smart_str_alloc(smart_str *str, size_t len, bool persistent) {
if (UNEXPECTED(!str->s)) {
goto do_smart_str_realloc;
} else {
@@ -71,14 +71,14 @@ do_smart_str_realloc:
return len;
}
-static zend_always_inline char* smart_str_extend_ex(smart_str *dest, size_t len, zend_bool persistent) {
+static zend_always_inline char* smart_str_extend_ex(smart_str *dest, size_t len, bool persistent) {
size_t new_len = smart_str_alloc(dest, len, persistent);
char *ret = ZSTR_VAL(dest->s) + ZSTR_LEN(dest->s);
ZSTR_LEN(dest->s) = new_len;
return ret;
}
-static zend_always_inline void smart_str_free_ex(smart_str *str, zend_bool persistent) {
+static zend_always_inline void smart_str_free_ex(smart_str *str, bool persistent) {
if (str->s) {
zend_string_release_ex(str->s, persistent);
str->s = NULL;
@@ -108,35 +108,35 @@ static zend_always_inline zend_string *smart_str_extract(smart_str *str) {
}
}
-static zend_always_inline void smart_str_appendc_ex(smart_str *dest, char ch, zend_bool persistent) {
+static zend_always_inline void smart_str_appendc_ex(smart_str *dest, char ch, bool persistent) {
size_t new_len = smart_str_alloc(dest, 1, persistent);
ZSTR_VAL(dest->s)[new_len - 1] = ch;
ZSTR_LEN(dest->s) = new_len;
}
-static zend_always_inline void smart_str_appendl_ex(smart_str *dest, const char *str, size_t len, zend_bool persistent) {
+static zend_always_inline void smart_str_appendl_ex(smart_str *dest, const char *str, size_t len, bool persistent) {
size_t new_len = smart_str_alloc(dest, len, persistent);
memcpy(ZSTR_VAL(dest->s) + ZSTR_LEN(dest->s), str, len);
ZSTR_LEN(dest->s) = new_len;
}
-static zend_always_inline void smart_str_append_ex(smart_str *dest, const zend_string *src, zend_bool persistent) {
+static zend_always_inline void smart_str_append_ex(smart_str *dest, const zend_string *src, bool persistent) {
smart_str_appendl_ex(dest, ZSTR_VAL(src), ZSTR_LEN(src), persistent);
}
-static zend_always_inline void smart_str_append_smart_str_ex(smart_str *dest, const smart_str *src, zend_bool persistent) {
+static zend_always_inline void smart_str_append_smart_str_ex(smart_str *dest, const smart_str *src, bool persistent) {
if (src->s && ZSTR_LEN(src->s)) {
smart_str_append_ex(dest, src->s, persistent);
}
}
-static zend_always_inline void smart_str_append_long_ex(smart_str *dest, zend_long num, zend_bool persistent) {
+static zend_always_inline void smart_str_append_long_ex(smart_str *dest, zend_long num, bool persistent) {
char buf[32];
char *result = zend_print_long_to_buf(buf + sizeof(buf) - 1, num);
smart_str_appendl_ex(dest, result, buf + sizeof(buf) - 1 - result, persistent);
}
-static zend_always_inline void smart_str_append_unsigned_ex(smart_str *dest, zend_ulong num, zend_bool persistent) {
+static zend_always_inline void smart_str_append_unsigned_ex(smart_str *dest, zend_ulong num, bool persistent) {
char buf[32];
char *result = zend_print_ulong_to_buf(buf + sizeof(buf) - 1, num);
smart_str_appendl_ex(dest, result, buf + sizeof(buf) - 1 - result, persistent);
diff --git a/Zend/zend_smart_string.h b/Zend/zend_smart_string.h
index 1f74a63218..d9f484b91e 100644
--- a/Zend/zend_smart_string.h
+++ b/Zend/zend_smart_string.h
@@ -51,7 +51,7 @@
ZEND_API void ZEND_FASTCALL _smart_string_alloc_persistent(smart_string *str, size_t len);
ZEND_API void ZEND_FASTCALL _smart_string_alloc(smart_string *str, size_t len);
-static zend_always_inline size_t smart_string_alloc(smart_string *str, size_t len, zend_bool persistent) {
+static zend_always_inline size_t smart_string_alloc(smart_string *str, size_t len, bool persistent) {
if (UNEXPECTED(!str->c) || UNEXPECTED(len >= str->a - str->len)) {
if (persistent) {
_smart_string_alloc_persistent(str, len);
@@ -62,7 +62,7 @@ static zend_always_inline size_t smart_string_alloc(smart_string *str, size_t le
return str->len + len;
}
-static zend_always_inline void smart_string_free_ex(smart_string *str, zend_bool persistent) {
+static zend_always_inline void smart_string_free_ex(smart_string *str, bool persistent) {
if (str->c) {
pefree(str->c, persistent);
str->c = NULL;
@@ -76,25 +76,25 @@ static zend_always_inline void smart_string_0(smart_string *str) {
}
}
-static zend_always_inline void smart_string_appendc_ex(smart_string *dest, char ch, zend_bool persistent) {
+static zend_always_inline void smart_string_appendc_ex(smart_string *dest, char ch, bool persistent) {
dest->len = smart_string_alloc(dest, 1, persistent);
dest->c[dest->len - 1] = ch;
}
-static zend_always_inline void smart_string_appendl_ex(smart_string *dest, const char *str, size_t len, zend_bool persistent) {
+static zend_always_inline void smart_string_appendl_ex(smart_string *dest, const char *str, size_t len, bool persistent) {
size_t new_len = smart_string_alloc(dest, len, persistent);
memcpy(dest->c + dest->len, str, len);
dest->len = new_len;
}
-static zend_always_inline void smart_string_append_long_ex(smart_string *dest, zend_long num, zend_bool persistent) {
+static zend_always_inline void smart_string_append_long_ex(smart_string *dest, zend_long num, bool persistent) {
char buf[32];
char *result = zend_print_long_to_buf(buf + sizeof(buf) - 1, num);
smart_string_appendl_ex(dest, result, buf + sizeof(buf) - 1 - result, persistent);
}
-static zend_always_inline void smart_string_append_unsigned_ex(smart_string *dest, zend_ulong num, zend_bool persistent) {
+static zend_always_inline void smart_string_append_unsigned_ex(smart_string *dest, zend_ulong num, bool persistent) {
char buf[32];
char *result = zend_print_ulong_to_buf(buf + sizeof(buf) - 1, num);
smart_string_appendl_ex(dest, result, buf + sizeof(buf) - 1 - result, persistent);
diff --git a/Zend/zend_stack.c b/Zend/zend_stack.c
index 1255c941a0..f587452bb7 100644
--- a/Zend/zend_stack.c
+++ b/Zend/zend_stack.c
@@ -141,7 +141,7 @@ ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*
}
}
-ZEND_API void zend_stack_clean(zend_stack *stack, void (*func)(void *), zend_bool free_elements)
+ZEND_API void zend_stack_clean(zend_stack *stack, void (*func)(void *), bool free_elements)
{
int i;
diff --git a/Zend/zend_stack.h b/Zend/zend_stack.h
index a5aa962226..c0a325b778 100644
--- a/Zend/zend_stack.h
+++ b/Zend/zend_stack.h
@@ -40,7 +40,7 @@ ZEND_API void *zend_stack_base(const zend_stack *stack);
ZEND_API int zend_stack_count(const zend_stack *stack);
ZEND_API void zend_stack_apply(zend_stack *stack, int type, int (*apply_function)(void *element));
ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*apply_function)(void *element, void *arg), void *arg);
-ZEND_API void zend_stack_clean(zend_stack *stack, void (*func)(void *), zend_bool free_elements);
+ZEND_API void zend_stack_clean(zend_stack *stack, void (*func)(void *), bool free_elements);
END_EXTERN_C()
#define ZEND_STACK_APPLY_TOPDOWN 1
diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c
index 1dfc5b1bc1..aadc62558e 100644
--- a/Zend/zend_stream.c
+++ b/Zend/zend_stream.c
@@ -64,25 +64,36 @@ ZEND_API void zend_stream_init_fp(zend_file_handle *handle, FILE *fp, const char
memset(handle, 0, sizeof(zend_file_handle));
handle->type = ZEND_HANDLE_FP;
handle->handle.fp = fp;
- handle->filename = filename;
+ handle->filename = filename ? zend_string_init(filename, strlen(filename), 0) : NULL;
}
ZEND_API void zend_stream_init_filename(zend_file_handle *handle, const char *filename) {
memset(handle, 0, sizeof(zend_file_handle));
handle->type = ZEND_HANDLE_FILENAME;
- handle->filename = filename;
+ handle->filename = filename ? zend_string_init(filename, strlen(filename), 0) : NULL;
}
-ZEND_API zend_result zend_stream_open(const char *filename, zend_file_handle *handle) /* {{{ */
+ZEND_API void zend_stream_init_filename_ex(zend_file_handle *handle, zend_string *filename) {
+ memset(handle, 0, sizeof(zend_file_handle));
+ handle->type = ZEND_HANDLE_FILENAME;
+ handle->filename = zend_string_copy(filename);
+}
+
+ZEND_API zend_result zend_stream_open(zend_file_handle *handle) /* {{{ */
{
zend_string *opened_path;
+
+ ZEND_ASSERT(handle->type == ZEND_HANDLE_FILENAME);
if (zend_stream_open_function) {
- return zend_stream_open_function(filename, handle);
+ return zend_stream_open_function(handle);
}
- zend_stream_init_fp(handle, zend_fopen(filename, &opened_path), filename);
- handle->opened_path = opened_path;
- return handle->handle.fp ? SUCCESS : FAILURE;
+ handle->handle.fp = zend_fopen(handle->filename, &opened_path);
+ if (!handle->handle.fp) {
+ return FAILURE;
+ }
+ handle->type = ZEND_HANDLE_FP;
+ return SUCCESS;
} /* }}} */
static int zend_stream_getc(zend_file_handle *file_handle) /* {{{ */
@@ -124,7 +135,7 @@ ZEND_API zend_result zend_stream_fixup(zend_file_handle *file_handle, char **buf
}
if (file_handle->type == ZEND_HANDLE_FILENAME) {
- if (zend_stream_open(file_handle->filename, file_handle) == FAILURE) {
+ if (zend_stream_open(file_handle) == FAILURE) {
return FAILURE;
}
}
@@ -199,7 +210,7 @@ ZEND_API zend_result zend_stream_fixup(zend_file_handle *file_handle, char **buf
return SUCCESS;
} /* }}} */
-ZEND_API void zend_file_handle_dtor(zend_file_handle *fh) /* {{{ */
+static void zend_file_handle_dtor(zend_file_handle *fh) /* {{{ */
{
switch (fh->type) {
case ZEND_HANDLE_FP:
@@ -225,22 +236,22 @@ ZEND_API void zend_file_handle_dtor(zend_file_handle *fh) /* {{{ */
efree(fh->buf);
fh->buf = NULL;
}
- if (fh->free_filename && fh->filename) {
- efree((char*)fh->filename);
+ if (fh->filename) {
+ zend_string_release(fh->filename);
fh->filename = NULL;
}
}
/* }}} */
/* return int to be compatible with Zend linked list API */
-ZEND_API int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *fh2) /* {{{ */
+static int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *fh2) /* {{{ */
{
if (fh1->type != fh2->type) {
return 0;
}
switch (fh1->type) {
case ZEND_HANDLE_FILENAME:
- return strcmp(fh1->filename, fh2->filename) == 0;
+ return zend_string_equals(fh1->filename, fh2->filename);
case ZEND_HANDLE_FP:
return fh1->handle.fp == fh2->handle.fp;
case ZEND_HANDLE_STREAM:
@@ -250,3 +261,25 @@ ZEND_API int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *
}
return 0;
} /* }}} */
+
+ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle) /* {{{ */
+{
+ if (file_handle->in_list) {
+ zend_llist_del_element(&CG(open_files), file_handle, (int (*)(void *, void *)) zend_compare_file_handles);
+ /* zend_file_handle_dtor() operates on the copy, so we have to NULLify the original here */
+ file_handle->opened_path = NULL;
+ file_handle->filename = NULL;
+ } else {
+ zend_file_handle_dtor(file_handle);
+ }
+} /* }}} */
+
+void zend_stream_init(void) /* {{{ */
+{
+ zend_llist_init(&CG(open_files), sizeof(zend_file_handle), (void (*)(void *)) zend_file_handle_dtor, 0);
+} /* }}} */
+
+void zend_stream_shutdown(void) /* {{{ */
+{
+ zend_llist_destroy(&CG(open_files));
+} /* }}} */
diff --git a/Zend/zend_stream.h b/Zend/zend_stream.h
index 023e2d0555..047719e175 100644
--- a/Zend/zend_stream.h
+++ b/Zend/zend_stream.h
@@ -53,12 +53,11 @@ typedef struct _zend_file_handle {
FILE *fp;
zend_stream stream;
} handle;
- const char *filename;
+ zend_string *filename;
zend_string *opened_path;
- zend_stream_type type;
- /* free_filename is used by wincache */
- /* TODO: Clean up filename vs opened_path mess */
- zend_bool free_filename;
+ zend_uchar type; /* packed zend_stream_type */
+ bool primary_script;
+ bool in_list; /* added into CG(open_file) */
char *buf;
size_t len;
} zend_file_handle;
@@ -66,10 +65,13 @@ typedef struct _zend_file_handle {
BEGIN_EXTERN_C()
ZEND_API void zend_stream_init_fp(zend_file_handle *handle, FILE *fp, const char *filename);
ZEND_API void zend_stream_init_filename(zend_file_handle *handle, const char *filename);
-ZEND_API zend_result zend_stream_open(const char *filename, zend_file_handle *handle);
+ZEND_API void zend_stream_init_filename_ex(zend_file_handle *handle, zend_string *filename);
+ZEND_API zend_result zend_stream_open(zend_file_handle *handle);
ZEND_API zend_result zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t *len);
-ZEND_API void zend_file_handle_dtor(zend_file_handle *fh);
-ZEND_API int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *fh2);
+ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle);
+
+void zend_stream_init(void);
+void zend_stream_shutdown(void);
END_EXTERN_C()
#ifdef ZEND_WIN32
diff --git a/Zend/zend_string.c b/Zend/zend_string.c
index 570aeece61..ab074515aa 100644
--- a/Zend/zend_string.c
+++ b/Zend/zend_string.c
@@ -313,7 +313,7 @@ ZEND_API void zend_interned_strings_set_request_storage_handlers(zend_new_intern
interned_string_init_request_handler = init_handler;
}
-ZEND_API void zend_interned_strings_switch_storage(zend_bool request)
+ZEND_API void zend_interned_strings_switch_storage(bool request)
{
if (request) {
zend_new_interned_string = interned_string_request_handler;
@@ -325,7 +325,7 @@ ZEND_API void zend_interned_strings_switch_storage(zend_bool request)
}
#if defined(__GNUC__) && defined(__i386__)
-ZEND_API zend_bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2)
+ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2)
{
char *ptr = ZSTR_VAL(s1);
size_t delta = (char*)s2 - (char*)s1;
@@ -363,7 +363,7 @@ ZEND_API zend_bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_str
}
#ifdef HAVE_VALGRIND
-ZEND_API zend_bool ZEND_FASTCALL I_WRAP_SONAME_FNNAME_ZU(NONE,zend_string_equal_val)(zend_string *s1, zend_string *s2)
+ZEND_API bool ZEND_FASTCALL I_WRAP_SONAME_FNNAME_ZU(NONE,zend_string_equal_val)(zend_string *s1, zend_string *s2)
{
size_t len = ZSTR_LEN(s1);
char *ptr1 = ZSTR_VAL(s1);
@@ -393,7 +393,7 @@ ZEND_API zend_bool ZEND_FASTCALL I_WRAP_SONAME_FNNAME_ZU(NONE,zend_string_equal_
#endif
#elif defined(__GNUC__) && defined(__x86_64__) && !defined(__ILP32__)
-ZEND_API zend_bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2)
+ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2)
{
char *ptr = ZSTR_VAL(s1);
size_t delta = (char*)s2 - (char*)s1;
@@ -431,7 +431,7 @@ ZEND_API zend_bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_str
}
#ifdef HAVE_VALGRIND
-ZEND_API zend_bool ZEND_FASTCALL I_WRAP_SONAME_FNNAME_ZU(NONE,zend_string_equal_val)(zend_string *s1, zend_string *s2)
+ZEND_API bool ZEND_FASTCALL I_WRAP_SONAME_FNNAME_ZU(NONE,zend_string_equal_val)(zend_string *s1, zend_string *s2)
{
size_t len = ZSTR_LEN(s1);
char *ptr1 = ZSTR_VAL(s1);
diff --git a/Zend/zend_string.h b/Zend/zend_string.h
index 96f1a6f4a0..230552e3c4 100644
--- a/Zend/zend_string.h
+++ b/Zend/zend_string.h
@@ -47,7 +47,7 @@ ZEND_API void zend_interned_strings_dtor(void);
ZEND_API void zend_interned_strings_activate(void);
ZEND_API void zend_interned_strings_deactivate(void);
ZEND_API void zend_interned_strings_set_request_storage_handlers(zend_new_interned_string_func_t handler, zend_string_init_interned_func_t init_handler);
-ZEND_API void zend_interned_strings_switch_storage(zend_bool request);
+ZEND_API void zend_interned_strings_switch_storage(bool request);
ZEND_API extern zend_string *zend_empty_string;
ZEND_API extern zend_string *zend_one_char_string[256];
@@ -332,21 +332,21 @@ static zend_always_inline void zend_string_release_ex(zend_string *s, bool persi
#if defined(__GNUC__) && (defined(__i386__) || (defined(__x86_64__) && !defined(__ILP32__)))
BEGIN_EXTERN_C()
-ZEND_API zend_bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2);
+ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2);
END_EXTERN_C()
#else
-static zend_always_inline zend_bool zend_string_equal_val(zend_string *s1, zend_string *s2)
+static zend_always_inline bool zend_string_equal_val(zend_string *s1, zend_string *s2)
{
return !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1));
}
#endif
-static zend_always_inline zend_bool zend_string_equal_content(zend_string *s1, zend_string *s2)
+static zend_always_inline bool zend_string_equal_content(zend_string *s1, zend_string *s2)
{
return ZSTR_LEN(s1) == ZSTR_LEN(s2) && zend_string_equal_val(s1, s2);
}
-static zend_always_inline zend_bool zend_string_equals(zend_string *s1, zend_string *s2)
+static zend_always_inline bool zend_string_equals(zend_string *s1, zend_string *s2)
{
return s1 == s2 || zend_string_equal_content(s1, s2);
}
@@ -551,6 +551,12 @@ EMPTY_SWITCH_DEFAULT_CASE()
_(ZEND_STR_FALSE, "false") \
_(ZEND_STR_NULL_LOWERCASE, "null") \
_(ZEND_STR_MIXED, "mixed") \
+ _(ZEND_STR_SLEEP, "__sleep") \
+ _(ZEND_STR_WAKEUP, "__wakeup") \
+ _(ZEND_STR_CASES, "cases") \
+ _(ZEND_STR_FROM, "from") \
+ _(ZEND_STR_TRYFROM, "tryFrom") \
+ _(ZEND_STR_TRYFROM_LOWERCASE, "tryfrom") \
typedef enum _zend_known_string_id {
diff --git a/Zend/zend_strtod.c b/Zend/zend_strtod.c
index e88fbd001f..9173a15031 100644
--- a/Zend/zend_strtod.c
+++ b/Zend/zend_strtod.c
@@ -4467,9 +4467,6 @@ ZEND_API double zend_oct_strtod(const char *str, const char **endptr)
return 0.0;
}
- /* skip leading zero */
- s++;
-
while ((c = *s++)) {
if (c < '0' || c > '7') {
/* break and return the current value if the number is not well-formed
diff --git a/Zend/zend_ts_hash.c b/Zend/zend_ts_hash.c
index d4e972d0e3..9bbf42c66d 100644
--- a/Zend/zend_ts_hash.c
+++ b/Zend/zend_ts_hash.c
@@ -57,7 +57,7 @@ static void end_write(TsHashTable *ht)
}
/* delegates */
-ZEND_API void zend_ts_hash_init(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent)
+ZEND_API void zend_ts_hash_init(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, bool persistent)
{
#ifdef ZTS
ht->mx_reader = tsrm_mutex_alloc();
@@ -271,7 +271,7 @@ ZEND_API void zend_ts_hash_sort(TsHashTable *ht, sort_func_t sort_func, bucket_c
end_write(ht);
}
-ZEND_API int zend_ts_hash_compare(TsHashTable *ht1, TsHashTable *ht2, compare_func_t compar, zend_bool ordered)
+ZEND_API int zend_ts_hash_compare(TsHashTable *ht1, TsHashTable *ht2, compare_func_t compar, bool ordered)
{
int retval;
diff --git a/Zend/zend_ts_hash.h b/Zend/zend_ts_hash.h
index d1b41b1d6f..12d3c65eb1 100644
--- a/Zend/zend_ts_hash.h
+++ b/Zend/zend_ts_hash.h
@@ -35,7 +35,7 @@ BEGIN_EXTERN_C()
#define TS_HASH(table) (&(table->hash))
/* startup/shutdown */
-ZEND_API void zend_ts_hash_init(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent);
+ZEND_API void zend_ts_hash_init(TsHashTable *ht, uint32_t nSize, dtor_func_t pDestructor, bool persistent);
ZEND_API void zend_ts_hash_destroy(TsHashTable *ht);
ZEND_API void zend_ts_hash_clean(TsHashTable *ht);
@@ -69,7 +69,7 @@ ZEND_API void zend_ts_hash_copy_to_hash(HashTable *target, TsHashTable *source,
ZEND_API void zend_ts_hash_merge(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, bool overwrite);
ZEND_API void zend_ts_hash_merge_ex(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, merge_checker_func_t pMergeSource, void *pParam);
ZEND_API void zend_ts_hash_sort(TsHashTable *ht, sort_func_t sort_func, bucket_compare_func_t compare_func, bool renumber);
-ZEND_API int zend_ts_hash_compare(TsHashTable *ht1, TsHashTable *ht2, compare_func_t compar, zend_bool ordered);
+ZEND_API int zend_ts_hash_compare(TsHashTable *ht1, TsHashTable *ht2, compare_func_t compar, bool ordered);
ZEND_API zval *zend_ts_hash_minmax(TsHashTable *ht, bucket_compare_func_t compar, int flag);
ZEND_API int zend_ts_hash_num_elements(TsHashTable *ht);
diff --git a/Zend/zend_types.h b/Zend/zend_types.h
index 82cf20f1b5..dbe2df23de 100644
--- a/Zend/zend_types.h
+++ b/Zend/zend_types.h
@@ -130,7 +130,7 @@ typedef struct {
* are only supported since C++20). */
void *ptr;
uint32_t type_mask;
- /* TODO: We could use the extra 32-bit of padding on 64-bit systems. */
+ uint32_t ce_cache__ptr; /* map_ptr offset */
} zend_type;
typedef struct {
@@ -138,13 +138,15 @@ typedef struct {
zend_type types[1];
} zend_type_list;
-#define _ZEND_TYPE_EXTRA_FLAGS_SHIFT 24
-#define _ZEND_TYPE_MASK ((1u << 24) - 1)
+#define _ZEND_TYPE_EXTRA_FLAGS_SHIFT 25
+#define _ZEND_TYPE_MASK ((1u << 25) - 1)
/* Only one of these bits may be set. */
-#define _ZEND_TYPE_NAME_BIT (1u << 23)
-#define _ZEND_TYPE_CE_BIT (1u << 22)
-#define _ZEND_TYPE_LIST_BIT (1u << 21)
+#define _ZEND_TYPE_NAME_BIT (1u << 24)
+#define _ZEND_TYPE_CE_BIT (1u << 23)
+#define _ZEND_TYPE_LIST_BIT (1u << 22)
#define _ZEND_TYPE_KIND_MASK (_ZEND_TYPE_LIST_BIT|_ZEND_TYPE_CE_BIT|_ZEND_TYPE_NAME_BIT)
+/* CE cached in map_ptr area */
+#define _ZEND_TYPE_CACHE_BIT (1u << 21)
/* Whether the type list is arena allocated */
#define _ZEND_TYPE_ARENA_BIT (1u << 20)
/* Type mask excluding the flags above. */
@@ -167,6 +169,9 @@ typedef struct {
#define ZEND_TYPE_HAS_LIST(t) \
((((t).type_mask) & _ZEND_TYPE_LIST_BIT) != 0)
+#define ZEND_TYPE_HAS_CE_CACHE(t) \
+ ((((t).type_mask) & _ZEND_TYPE_CACHE_BIT) != 0)
+
#define ZEND_TYPE_USES_ARENA(t) \
((((t).type_mask) & _ZEND_TYPE_ARENA_BIT) != 0)
@@ -185,6 +190,13 @@ typedef struct {
#define ZEND_TYPE_LIST(t) \
((zend_type_list *) (t).ptr)
+#define ZEND_TYPE_CE_CACHE(t) \
+ (*(zend_class_entry **)ZEND_MAP_PTR_OFFSET2PTR((t).ce_cache))
+
+#define ZEND_TYPE_SET_CE_CACHE(t, ce) do { \
+ *((zend_class_entry **)ZEND_MAP_PTR_OFFSET2PTR((t).ce_cache)) = ce; \
+ } while (0)
+
#define ZEND_TYPE_LIST_SIZE(num_types) \
(sizeof(zend_type_list) + ((num_types) - 1) * sizeof(zend_type))
@@ -254,10 +266,10 @@ typedef struct {
(((t).type_mask & _ZEND_TYPE_NULLABLE_BIT) != 0)
#define ZEND_TYPE_INIT_NONE(extra_flags) \
- { NULL, (extra_flags) }
+ { NULL, (extra_flags), 0 }
#define ZEND_TYPE_INIT_MASK(_type_mask) \
- { NULL, (_type_mask) }
+ { NULL, (_type_mask), 0 }
#define ZEND_TYPE_INIT_CODE(code, allow_null, extra_flags) \
ZEND_TYPE_INIT_MASK(((code) == _IS_BOOL ? MAY_BE_BOOL : ((code) == IS_MIXED ? MAY_BE_ANY : (1 << (code)))) \
@@ -265,10 +277,10 @@ typedef struct {
#define ZEND_TYPE_INIT_PTR(ptr, type_kind, allow_null, extra_flags) \
{ (void *) (ptr), \
- (type_kind) | ((allow_null) ? _ZEND_TYPE_NULLABLE_BIT : 0) | (extra_flags) }
+ (type_kind) | ((allow_null) ? _ZEND_TYPE_NULLABLE_BIT : 0) | (extra_flags), 0 }
#define ZEND_TYPE_INIT_PTR_MASK(ptr, type_mask) \
- { (void *) (ptr), (type_mask) }
+ { (void *) (ptr), (type_mask), 0 }
#define ZEND_TYPE_INIT_CE(_ce, allow_null, extra_flags) \
ZEND_TYPE_INIT_PTR(_ce, _ZEND_TYPE_CE_BIT, allow_null, extra_flags)
@@ -613,6 +625,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define GC_ADDREF_EX(p, rc) zend_gc_addref_ex(&(p)->gc, rc)
#define GC_DELREF_EX(p, rc) zend_gc_delref_ex(&(p)->gc, rc)
#define GC_TRY_ADDREF(p) zend_gc_try_addref(&(p)->gc)
+#define GC_TRY_DELREF(p) zend_gc_try_delref(&(p)->gc)
#define GC_TYPE_MASK 0x0000000f
#define GC_FLAGS_MASK 0x000003f0
@@ -1130,7 +1143,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
#endif
#if ZEND_RC_DEBUG
-extern ZEND_API zend_bool zend_rc_debug;
+extern ZEND_API bool zend_rc_debug;
# define ZEND_RC_MOD_CHECK(p) do { \
if (zend_rc_debug && zval_gc_type((p)->u.type_info) != IS_OBJECT) { \
ZEND_ASSERT(!(zval_gc_flags((p)->u.type_info) & GC_IMMUTABLE)); \
@@ -1168,6 +1181,13 @@ static zend_always_inline void zend_gc_try_addref(zend_refcounted_h *p) {
}
}
+static zend_always_inline void zend_gc_try_delref(zend_refcounted_h *p) {
+ if (!(p->u.type_info & GC_IMMUTABLE)) {
+ ZEND_RC_MOD_CHECK(p);
+ --p->refcount;
+ }
+}
+
static zend_always_inline uint32_t zend_gc_delref(zend_refcounted_h *p) {
ZEND_ASSERT(p->refcount > 0);
ZEND_RC_MOD_CHECK(p);
@@ -1339,34 +1359,27 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) {
zend_string *_str = Z_STR_P(_zv); \
ZEND_ASSERT(Z_REFCOUNTED_P(_zv)); \
ZEND_ASSERT(!ZSTR_IS_INTERNED(_str)); \
- Z_DELREF_P(_zv); \
ZVAL_NEW_STR(_zv, zend_string_init( \
ZSTR_VAL(_str), ZSTR_LEN(_str), 0)); \
+ GC_DELREF(_str); \
} \
} while (0)
#define SEPARATE_ARRAY(zv) do { \
- zval *_zv = (zv); \
- zend_array *_arr = Z_ARR_P(_zv); \
- if (UNEXPECTED(GC_REFCOUNT(_arr) > 1)) { \
- if (Z_REFCOUNTED_P(_zv)) { \
- GC_DELREF(_arr); \
- } \
- ZVAL_ARR(_zv, zend_array_dup(_arr)); \
- } \
- } while (0)
-
-#define SEPARATE_ZVAL_IF_NOT_REF(zv) do { \
zval *__zv = (zv); \
- if (Z_TYPE_P(__zv) == IS_ARRAY) { \
- SEPARATE_ARRAY(__zv); \
+ zend_array *_arr = Z_ARR_P(__zv); \
+ if (UNEXPECTED(GC_REFCOUNT(_arr) > 1)) { \
+ ZVAL_ARR(__zv, zend_array_dup(_arr)); \
+ GC_TRY_DELREF(_arr); \
} \
} while (0)
#define SEPARATE_ZVAL_NOREF(zv) do { \
zval *_zv = (zv); \
ZEND_ASSERT(Z_TYPE_P(_zv) != IS_REFERENCE); \
- SEPARATE_ZVAL_IF_NOT_REF(_zv); \
+ if (Z_TYPE_P(_zv) == IS_ARRAY) { \
+ SEPARATE_ARRAY(_zv); \
+ } \
} while (0)
#define SEPARATE_ZVAL(zv) do { \
@@ -1384,13 +1397,8 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) {
break; \
} \
} \
- SEPARATE_ZVAL_IF_NOT_REF(_zv); \
- } while (0)
-
-#define SEPARATE_ARG_IF_REF(varptr) do { \
- ZVAL_DEREF(varptr); \
- if (Z_REFCOUNTED_P(varptr)) { \
- Z_ADDREF_P(varptr); \
+ if (Z_TYPE_P(_zv) == IS_ARRAY) { \
+ SEPARATE_ARRAY(_zv); \
} \
} while (0)
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 75062824f2..115279dcfd 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -446,7 +446,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(16, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|T
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
@@ -461,7 +461,7 @@ ZEND_VM_HANDLER(196, ZEND_CASE_STRICT, TMP|VAR, CONST|TMP|VAR|CV)
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
@@ -475,7 +475,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(17, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CON
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
@@ -1727,8 +1727,9 @@ ZEND_VM_C_LABEL(fetch_this):
} else if (type == BP_VAR_IS) {
retval = &EG(uninitialized_zval);
} else {
- zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(name));
- if (type == BP_VAR_RW) {
+ zend_error(E_WARNING, "Undefined %svariable $%s",
+ (opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
+ if (type == BP_VAR_RW && !EG(exception)) {
retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
} else {
retval = &EG(uninitialized_zval);
@@ -1746,8 +1747,9 @@ ZEND_VM_C_LABEL(fetch_this):
} else if (type == BP_VAR_IS) {
retval = &EG(uninitialized_zval);
} else {
- zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(name));
- if (type == BP_VAR_RW) {
+ zend_error(E_WARNING, "Undefined %svariable $%s",
+ (opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
+ if (type == BP_VAR_RW && !EG(exception)) {
ZVAL_NULL(retval);
} else {
retval = &EG(uninitialized_zval);
@@ -2104,6 +2106,11 @@ ZEND_VM_C_LABEL(fetch_obj_r_fast_copy):
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if (OP2_TYPE != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -2822,6 +2829,7 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
ZEND_VM_LEAVE();
} else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) {
zend_detach_symbol_table(execute_data);
+ zend_destroy_static_vars(&EX(func)->op_array);
destroy_op_array(&EX(func)->op_array);
efree_size(EX(func), sizeof(zend_op_array));
#ifdef ZEND_PREFER_RELOAD
@@ -3892,7 +3900,7 @@ ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL))
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
@@ -4010,7 +4018,7 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL,OBSERVER))
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
@@ -4114,7 +4122,7 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
@@ -4225,7 +4233,7 @@ ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV
}
SAVE_OPLINE();
- if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ if (UNEXPECTED(!zend_check_type_slow(&ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
zend_verify_return_error(EX(func), retval_ptr);
HANDLE_EXCEPTION();
}
@@ -4548,7 +4556,7 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, JMP_ADDR, LAST_CATCH|CACHE_SLOT)
}
catch_ce = CACHED_PTR(opline->extended_value & ~ZEND_LAST_CATCH);
if (UNEXPECTED(catch_ce == NULL)) {
- catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
}
@@ -5002,7 +5010,7 @@ ZEND_VM_C_LABEL(send_again):
HashTable *ht = Z_ARRVAL_P(args);
zval *arg, *top;
zend_string *name;
- zend_bool have_named_params = 0;
+ bool have_named_params = 0;
zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, zend_hash_num_elements(ht));
@@ -5073,7 +5081,7 @@ ZEND_VM_C_LABEL(send_again):
} else if (EXPECTED(Z_TYPE_P(args) == IS_OBJECT)) {
zend_class_entry *ce = Z_OBJCE_P(args);
zend_object_iterator *iter;
- zend_bool have_named_params = 0;
+ bool have_named_params = 0;
if (!ce || !ce->get_iterator) {
zend_type_error("Only arrays and Traversables can be unpacked");
@@ -5090,26 +5098,27 @@ ZEND_VM_C_LABEL(send_again):
HANDLE_EXCEPTION();
}
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
+ const zend_object_iterator_funcs *funcs = iter->funcs;
+ if (funcs->rewind) {
+ funcs->rewind(iter);
}
- for (; iter->funcs->valid(iter) == SUCCESS; ++arg_num) {
+ for (; funcs->valid(iter) == SUCCESS; ++arg_num) {
zval *arg, *top;
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
- arg = iter->funcs->get_current_data(iter);
+ arg = funcs->get_current_data(iter);
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
zend_string *name = NULL;
- if (iter->funcs->get_current_key) {
+ if (funcs->get_current_key) {
zval key;
- iter->funcs->get_current_key(iter, &key);
+ funcs->get_current_key(iter, &key);
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
@@ -5171,7 +5180,7 @@ ZEND_VM_C_LABEL(send_again):
ZEND_CALL_NUM_ARGS(EX(call))++;
}
- iter->funcs->move_forward(iter);
+ funcs->move_forward(iter);
}
zend_iterator_dtor(iter);
@@ -5235,7 +5244,7 @@ ZEND_VM_C_LABEL(send_array):
arg_num = 1;
param = ZEND_CALL_ARG(EX(call), 1);
ZEND_HASH_FOREACH_VAL(ht, arg) {
- zend_bool must_wrap = 0;
+ bool must_wrap = 0;
if (skip > 0) {
skip--;
continue;
@@ -5271,7 +5280,7 @@ ZEND_VM_C_LABEL(send_array):
FREE_OP2();
} else {
zend_string *name;
- zend_bool have_named_params;
+ bool have_named_params;
zend_vm_stack_extend_call_frame(&EX(call), 0, zend_hash_num_elements(ht));
arg_num = 1;
param = ZEND_CALL_ARG(EX(call), 1);
@@ -5292,7 +5301,7 @@ ZEND_VM_C_LABEL(send_array):
HANDLE_EXCEPTION();
}
- zend_bool must_wrap = 0;
+ bool must_wrap = 0;
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
if (UNEXPECTED(!Z_ISREF_P(arg))) {
if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
@@ -5371,7 +5380,7 @@ ZEND_VM_COLD_HELPER(zend_missing_arg_helper, ANY, ANY)
HANDLE_EXCEPTION();
}
-ZEND_VM_COLD_HELPER(zend_verify_recv_arg_type_helper, ANY, ANY, zval *op_1)
+ZEND_VM_HELPER(zend_verify_recv_arg_type_helper, ANY, ANY, zval *op_1)
{
USE_OPLINE
@@ -5819,7 +5828,7 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CO
}
}
- zv = zend_hash_find_ex(&ce->constants_table, Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
+ zv = zend_hash_find_ex(CE_CONSTANTS_TABLE(ce), Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
if (EXPECTED(zv != NULL)) {
c = Z_PTR_P(zv);
scope = EX(func)->op_array.scope;
@@ -5950,9 +5959,11 @@ ZEND_VM_HANDLER(147, ZEND_ADD_ARRAY_UNPACK, ANY, ANY)
{
USE_OPLINE
zval *op1;
+ HashTable *result_ht;
SAVE_OPLINE();
op1 = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ result_ht = Z_ARRVAL_P(EX_VAR(opline->result.var));
ZEND_VM_C_LABEL(add_unpack_again):
if (EXPECTED(Z_TYPE_P(op1) == IS_ARRAY)) {
@@ -5961,16 +5972,14 @@ ZEND_VM_C_LABEL(add_unpack_again):
zend_string *key;
ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+ if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
+ val = Z_REFVAL_P(val);
+ }
+ Z_TRY_ADDREF_P(val);
if (key) {
- zend_throw_error(NULL, "Cannot unpack array with string keys");
- FREE_OP1();
- HANDLE_EXCEPTION();
+ zend_hash_update(result_ht, key, val);
} else {
- if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
- val = Z_REFVAL_P(val);
- }
- Z_TRY_ADDREF_P(val);
- if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), val)) {
+ if (!zend_hash_next_index_insert(result_ht, val)) {
zend_cannot_add_element();
zval_ptr_dtor_nogc(val);
break;
@@ -5995,48 +6004,59 @@ ZEND_VM_C_LABEL(add_unpack_again):
HANDLE_EXCEPTION();
}
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
+ const zend_object_iterator_funcs *funcs = iter->funcs;
+ if (funcs->rewind) {
+ funcs->rewind(iter);
}
- for (; iter->funcs->valid(iter) == SUCCESS; ) {
+ for (; funcs->valid(iter) == SUCCESS; ) {
zval *val;
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
- val = iter->funcs->get_current_data(iter);
+ val = funcs->get_current_data(iter);
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
- if (iter->funcs->get_current_key) {
- zval key;
- iter->funcs->get_current_key(iter, &key);
+ zval key;
+ if (funcs->get_current_key) {
+ funcs->get_current_key(iter, &key);
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
- if (UNEXPECTED(Z_TYPE(key) != IS_LONG)) {
+ if (UNEXPECTED(Z_TYPE(key) != IS_LONG && Z_TYPE(key) != IS_STRING)) {
zend_throw_error(NULL,
- (Z_TYPE(key) == IS_STRING) ?
- "Cannot unpack Traversable with string keys" :
- "Cannot unpack Traversable with non-integer keys");
+ "Keys must be of type int|string during array unpacking");
zval_ptr_dtor(&key);
break;
}
+ } else {
+ ZVAL_UNDEF(&key);
}
ZVAL_DEREF(val);
Z_TRY_ADDREF_P(val);
- if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), val)) {
- zend_cannot_add_element();
- zval_ptr_dtor_nogc(val);
+ zend_ulong num_key;
+ if (Z_TYPE(key) == IS_STRING && !ZEND_HANDLE_NUMERIC(Z_STR(key), num_key)) {
+ zend_hash_update(result_ht, Z_STR(key), val);
+ zval_ptr_dtor_str(&key);
+ } else {
+ if (!zend_hash_next_index_insert(result_ht, val)) {
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(val);
+ break;
+ }
}
- iter->funcs->move_forward(iter);
+ funcs->move_forward(iter);
+ if (UNEXPECTED(EG(exception))) {
+ break;
+ }
}
zend_iterator_dtor(iter);
@@ -6124,6 +6144,11 @@ ZEND_VM_COLD_CONST_HANDLER(51, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
} else {
ZVAL_EMPTY_ARRAY(result);
}
+ } else if (Z_OBJ_P(expr)->properties == NULL
+ && Z_OBJ_HT_P(expr)->get_properties_for == NULL
+ && Z_OBJ_HT_P(expr)->get_properties == zend_std_get_properties) {
+ /* Optimized version without rebulding properties HashTable */
+ ZVAL_ARR(result, zend_std_build_object_properties_array(Z_OBJ_P(expr)));
} else {
HashTable *obj_ht = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_ARRAY_CAST);
if (obj_ht) {
@@ -6217,6 +6242,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL, SPEC(OBSER
zend_vm_stack_free_call_frame(call);
}
+ zend_destroy_static_vars(new_op_array);
destroy_op_array(new_op_array);
efree_size(new_op_array, sizeof(zend_op_array));
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -6372,11 +6398,8 @@ ZEND_VM_C_LABEL(offset_again):
}
}
ZEND_VM_C_LABEL(str_index_dim):
- if (ht == &EG(symbol_table)) {
- zend_delete_global_variable(key);
- } else {
- zend_hash_del(ht, key);
- }
+ ZEND_ASSERT(ht != &EG(symbol_table));
+ zend_hash_del(ht, key);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
ZEND_VM_C_LABEL(num_index_dim):
@@ -6397,6 +6420,7 @@ ZEND_VM_C_LABEL(num_index_dim):
hval = 1;
ZEND_VM_C_GOTO(num_index_dim);
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
ZEND_VM_C_GOTO(num_index_dim);
} else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -6528,7 +6552,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
FREE_OP1_IF_VAR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
+ bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
FREE_OP1();
if (UNEXPECTED(EG(exception))) {
@@ -6621,7 +6645,7 @@ ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
FREE_OP1_VAR_PTR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
+ bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (OP1_TYPE == IS_VAR) {
FREE_OP1_VAR_PTR();
@@ -6649,7 +6673,7 @@ ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
}
}
-ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
+ZEND_VM_HELPER(zend_fe_fetch_object_helper, ANY, ANY)
{
USE_OPLINE
zval *array;
@@ -6658,19 +6682,22 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
HashTable *fe_ht;
HashPosition pos;
Bucket *p;
+ zend_object_iterator *iter;
array = EX_VAR(opline->op1.var);
SAVE_OPLINE();
- if (EXPECTED(Z_TYPE_P(array) == IS_ARRAY)) {
- fe_ht = Z_ARRVAL_P(array);
- pos = Z_FE_POS_P(array);
+
+ ZEND_ASSERT(Z_TYPE_P(array) == IS_OBJECT);
+ if ((iter = zend_iterator_unwrap(array)) == NULL) {
+ /* plain object */
+
+ fe_ht = Z_OBJPROP_P(array);
+ pos = zend_hash_iterator_pos(Z_FE_ITER_P(array), fe_ht);
p = fe_ht->arData + pos;
while (1) {
if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
/* reached end of iteration */
-ZEND_VM_C_LABEL(fe_fetch_r_exit):
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
+ ZEND_VM_C_GOTO(fe_fetch_r_exit);
}
pos++;
value = &p->val;
@@ -6679,111 +6706,74 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit):
if (UNEXPECTED(value_type == IS_INDIRECT)) {
value = Z_INDIRECT_P(value);
value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
+ if (EXPECTED(value_type != IS_UNDEF)
+ && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) {
break;
}
- } else {
+ } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0)
+ || !p->key
+ || zend_check_property_access(Z_OBJ_P(array), p->key, 1) == SUCCESS) {
break;
}
}
p++;
}
- Z_FE_POS_P(array) = pos;
+ EG(ht_iterators)[Z_FE_ITER_P(array)].pos = pos;
if (RETURN_VALUE_USED(opline)) {
- if (!p->key) {
+ if (UNEXPECTED(!p->key)) {
ZVAL_LONG(EX_VAR(opline->result.var), p->h);
- } else {
+ } else if (ZSTR_VAL(p->key)[0]) {
ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+ } else {
+ const char *class_name, *prop_name;
+ size_t prop_name_len;
+ zend_unmangle_property_name_ex(
+ p->key, &class_name, &prop_name, &prop_name_len);
+ ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
}
}
} else {
- zend_object_iterator *iter;
-
- ZEND_ASSERT(Z_TYPE_P(array) == IS_OBJECT);
- if ((iter = zend_iterator_unwrap(array)) == NULL) {
- /* plain object */
-
- fe_ht = Z_OBJPROP_P(array);
- pos = zend_hash_iterator_pos(Z_FE_ITER_P(array), fe_ht);
- p = fe_ht->arData + pos;
- while (1) {
- if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
- /* reached end of iteration */
- ZEND_VM_C_GOTO(fe_fetch_r_exit);
- }
- pos++;
- value = &p->val;
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)
- && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) {
- break;
- }
- } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0)
- || !p->key
- || zend_check_property_access(Z_OBJ_P(array), p->key, 1) == SUCCESS) {
- break;
- }
- }
- p++;
- }
- EG(ht_iterators)[Z_FE_ITER_P(array)].pos = pos;
- if (RETURN_VALUE_USED(opline)) {
- if (UNEXPECTED(!p->key)) {
- ZVAL_LONG(EX_VAR(opline->result.var), p->h);
- } else if (ZSTR_VAL(p->key)[0]) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
- } else {
- const char *class_name, *prop_name;
- size_t prop_name_len;
- zend_unmangle_property_name_ex(
- p->key, &class_name, &prop_name, &prop_name_len);
- ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
- }
+ const zend_object_iterator_funcs *funcs = iter->funcs;
+ if (EXPECTED(++iter->index > 0)) {
+ /* This could cause an endless loop if index becomes zero again.
+ * In case that ever happens we need an additional flag. */
+ funcs->move_forward(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
}
- } else {
- if (EXPECTED(++iter->index > 0)) {
- /* This could cause an endless loop if index becomes zero again.
- * In case that ever happens we need an additional flag. */
- iter->funcs->move_forward(iter);
+ if (UNEXPECTED(funcs->valid(iter) == FAILURE)) {
+ /* reached end of iteration */
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
}
- if (UNEXPECTED(iter->funcs->valid(iter) == FAILURE)) {
- /* reached end of iteration */
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- ZEND_VM_C_GOTO(fe_fetch_r_exit);
- }
- }
- value = iter->funcs->get_current_data(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- if (!value) {
- /* failure in get_current_data */
- ZEND_VM_C_GOTO(fe_fetch_r_exit);
+ZEND_VM_C_LABEL(fe_fetch_r_exit):
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+ ZEND_VM_CONTINUE();
}
- if (RETURN_VALUE_USED(opline)) {
- if (iter->funcs->get_current_key) {
- iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- } else {
- ZVAL_LONG(EX_VAR(opline->result.var), iter->index);
+ }
+ value = funcs->get_current_data(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+ if (!value) {
+ /* failure in get_current_data */
+ ZEND_VM_C_GOTO(fe_fetch_r_exit);
+ }
+ if (RETURN_VALUE_USED(opline)) {
+ if (funcs->get_current_key) {
+ funcs->get_current_key(iter, EX_VAR(opline->result.var));
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
}
+ } else {
+ ZVAL_LONG(EX_VAR(opline->result.var), iter->index);
}
- value_type = Z_TYPE_INFO_P(value);
}
+ value_type = Z_TYPE_INFO_P(value);
}
if (EXPECTED(OP2_TYPE == IS_CV)) {
@@ -6801,6 +6791,64 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit):
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+ZEND_VM_HOT_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
+{
+ USE_OPLINE
+ zval *array;
+ zval *value;
+ uint32_t value_type;
+ HashTable *fe_ht;
+ HashPosition pos;
+ Bucket *p;
+
+ array = EX_VAR(opline->op1.var);
+ if (UNEXPECTED(Z_TYPE_P(array) != IS_ARRAY)) {
+ ZEND_VM_DISPATCH_TO_HELPER(zend_fe_fetch_object_helper);
+ }
+ fe_ht = Z_ARRVAL_P(array);
+ pos = Z_FE_POS_P(array);
+ p = fe_ht->arData + pos;
+ while (1) {
+ if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+ /* reached end of iteration */
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+ ZEND_VM_CONTINUE();
+ }
+ pos++;
+ value = &p->val;
+ value_type = Z_TYPE_INFO_P(value);
+ ZEND_ASSERT(value_type != IS_INDIRECT);
+ if (EXPECTED(value_type != IS_UNDEF)) {
+ break;
+ }
+ p++;
+ }
+ Z_FE_POS_P(array) = pos;
+ if (RETURN_VALUE_USED(opline)) {
+ if (!p->key) {
+ ZVAL_LONG(EX_VAR(opline->result.var), p->h);
+ } else {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+ }
+ }
+
+ if (EXPECTED(OP2_TYPE == IS_CV)) {
+ zval *variable_ptr = EX_VAR(opline->op2.var);
+ SAVE_OPLINE();
+ zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+ zval *res = EX_VAR(opline->op2.var);
+ zend_refcounted *gc = Z_COUNTED_P(value);
+
+ ZVAL_COPY_VALUE_EX(res, value, gc, value_type);
+ if (Z_TYPE_INFO_REFCOUNTED(value_type)) {
+ GC_ADDREF(gc);
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+}
+
ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
{
USE_OPLINE
@@ -6827,16 +6875,9 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
pos++;
value = &p->val;
value_type = Z_TYPE_INFO_P(value);
+ ZEND_ASSERT(value_type != IS_INDIRECT);
if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- break;
- }
- } else {
- break;
- }
+ break;
}
p++;
}
@@ -6905,15 +6946,16 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
}
}
} else {
+ const zend_object_iterator_funcs *funcs = iter->funcs;
if (++iter->index > 0) {
/* This could cause an endless loop if index becomes zero again.
* In case that ever happens we need an additional flag. */
- iter->funcs->move_forward(iter);
+ funcs->move_forward(iter);
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
}
- if (UNEXPECTED(iter->funcs->valid(iter) == FAILURE)) {
+ if (UNEXPECTED(funcs->valid(iter) == FAILURE)) {
/* reached end of iteration */
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
@@ -6922,7 +6964,7 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
ZEND_VM_C_GOTO(fe_fetch_w_exit);
}
}
- value = iter->funcs->get_current_data(iter);
+ value = funcs->get_current_data(iter);
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
@@ -6932,8 +6974,8 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
ZEND_VM_C_GOTO(fe_fetch_w_exit);
}
if (RETURN_VALUE_USED(opline)) {
- if (iter->funcs->get_current_key) {
- iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
+ if (funcs->get_current_key) {
+ funcs->get_current_key(iter, EX_VAR(opline->result.var));
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
@@ -7095,7 +7137,7 @@ ZEND_VM_C_LABEL(isset_again):
ZEND_VM_C_GOTO(num_index_prop);
}
}
- value = zend_hash_find_ex_ind(ht, str, OP2_TYPE == IS_CONST);
+ value = zend_hash_find_ex(ht, str, OP2_TYPE == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
ZEND_VM_C_LABEL(num_index_prop):
@@ -7203,7 +7245,7 @@ ZEND_VM_HANDLER(194, ZEND_ARRAY_KEY_EXISTS, CV|TMPVAR|CONST, CV|TMPVAR|CONST)
zval *key, *subject;
HashTable *ht;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
@@ -7530,7 +7572,8 @@ ZEND_VM_HANDLER(145, ZEND_DECLARE_CLASS_DELAYED, CONST, CONST)
if (UNEXPECTED(!zv)) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name));
} else {
- if (zend_do_link_class(ce, Z_STR_P(RT_CONSTANT(opline, opline->op2))) == FAILURE) {
+ ce = zend_do_link_class(ce, Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(lcname));
+ if (!ce) {
/* Reload bucket pointer, the hash table may have been reallocated */
zv = zend_hash_find(EG(class_table), Z_STR_P(lcname));
zend_hash_set_bucket_key(EG(class_table), (Bucket *) zv, Z_STR_P(lcname + 1));
@@ -7571,7 +7614,8 @@ ZEND_VM_HANDLER(146, ZEND_DECLARE_ANON_CLASS, ANY, ANY, CACHE_SLOT)
ce = Z_CE_P(zv);
if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
SAVE_OPLINE();
- if (zend_do_link_class(ce, (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL) == FAILURE) {
+ ce = zend_do_link_class(ce, (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL, rtd_key);
+ if (!ce) {
HANDLE_EXCEPTION();
}
}
@@ -7581,12 +7625,14 @@ ZEND_VM_HANDLER(146, ZEND_DECLARE_ANON_CLASS, ANY, ANY, CACHE_SLOT)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, ANY)
+ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, NUM)
{
+ zend_function *func;
USE_OPLINE
SAVE_OPLINE();
- do_bind_function(RT_CONSTANT(opline, opline->op1));
+ func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num];
+ do_bind_function(func, RT_CONSTANT(opline, opline->op1));
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -7609,7 +7655,7 @@ ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, C
{
USE_OPLINE
zval *expr;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
expr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -7621,7 +7667,7 @@ ZEND_VM_C_LABEL(try_instanceof):
if (OP2_TYPE == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -7851,23 +7897,14 @@ ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST)
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-ZEND_VM_HANDLER(142, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED, CACHE_SLOT)
+ZEND_VM_HANDLER(142, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, NUM)
{
USE_OPLINE
zend_function *func;
- zval *zfunc;
zval *object;
zend_class_entry *called_scope;
- func = CACHED_PTR(opline->extended_value);
- if (UNEXPECTED(func == NULL)) {
- zfunc = zend_hash_find_ex(EG(function_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
- ZEND_ASSERT(zfunc != NULL);
- func = Z_FUNC_P(zfunc);
- ZEND_ASSERT(func->type == ZEND_USER_FUNCTION);
- CACHE_PTR(opline->extended_value, func);
- }
-
+ func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num];
if (Z_TYPE(EX(This)) == IS_OBJECT) {
called_scope = Z_OBJCE(EX(This));
if (UNEXPECTED((func->common.fn_flags & ZEND_ACC_STATIC) ||
@@ -8288,10 +8325,12 @@ ZEND_VM_COLD_CONST_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
- FREE_OP1();
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(value);
+ }
ZEND_VM_NEXT_OPCODE();
} else {
- zend_bool strict;
+ bool strict;
if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(value) == IS_REFERENCE) {
value = Z_REFVAL_P(value);
@@ -8312,8 +8351,18 @@ ZEND_VM_COLD_CONST_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
zend_string *str;
zval tmp;
+ if (UNEXPECTED(Z_TYPE_P(value) == IS_NULL)) {
+ zend_error(E_DEPRECATED,
+ "strlen(): Passing null to parameter #1 ($string) of type string is deprecated");
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ ZVAL_LONG(EX_VAR(opline->result.var), 0);
+ break;
+ }
+
ZVAL_COPY(&tmp, value);
- if (zend_parse_arg_str_weak(&tmp, &str)) {
+ if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
zval_ptr_dtor(&tmp);
break;
@@ -8545,7 +8594,7 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY, SPEC(OBSERVER))
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
if (ret == NULL) {
@@ -8645,16 +8694,10 @@ ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, UNUSED, REF)
ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
if (!ht) {
- ZEND_ASSERT(EX(func)->op_array.fn_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED));
ht = zend_array_dup(EX(func)->op_array.static_variables);
ZEND_MAP_PTR_SET(EX(func)->op_array.static_variables_ptr, ht);
- } else if (GC_REFCOUNT(ht) > 1) {
- if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
- GC_DELREF(ht);
- }
- ht = zend_array_dup(ht);
- ZEND_MAP_PTR_SET(EX(func)->op_array.static_variables_ptr, ht);
}
+ ZEND_ASSERT(GC_REFCOUNT(ht) == 1);
value = (zval*)((char*)ht->arData + (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT)));
@@ -8703,6 +8746,16 @@ ZEND_VM_HOT_HANDLER(184, ZEND_FETCH_THIS, UNUSED, UNUSED)
}
}
+ZEND_VM_HANDLER(200, ZEND_FETCH_GLOBALS, UNUSED, UNUSED)
+{
+ USE_OPLINE
+
+ /* For symbol tables we need to deal with exactly the same problems as for property tables. */
+ ZVAL_ARR(EX_VAR(opline->result.var),
+ zend_proptable_to_symtable(&EG(symbol_table), /* always_duplicate */ 1));
+ ZEND_VM_NEXT_OPCODE();
+}
+
ZEND_VM_HANDLER(186, ZEND_ISSET_ISEMPTY_THIS, UNUSED, UNUSED)
{
USE_OPLINE
@@ -8879,33 +8932,69 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(189, ZEND_IN_ARRAY, CONST|TMP|VAR|CV, CONST, NUM
HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
zval *result;
- SAVE_OPLINE();
- op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
+ op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
result = zend_hash_find_ex(ht, Z_STR_P(op1), OP1_TYPE == IS_CONST);
- } else if (opline->extended_value) {
+ if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+
+ if (opline->extended_value) {
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
result = zend_hash_index_find(ht, Z_LVAL_P(op1));
- } else {
- result = NULL;
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ SAVE_OPLINE();
+ if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
+ FREE_OP1();
+ ZEND_VM_SMART_BRANCH(result, 0);
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ result = zend_hash_index_find(ht, Z_LVAL_P(op1));
+ FREE_OP1();
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ } else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
} else if (Z_TYPE_P(op1) <= IS_FALSE) {
+ if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
result = zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
+ ZEND_VM_SMART_BRANCH(result, 0);
} else {
zend_string *key;
- zval key_tmp, *val;
+ zval key_tmp;
- result = NULL;
- ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+ if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
+ FREE_OP1();
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ }
+
+ SAVE_OPLINE();
+ ZEND_HASH_FOREACH_STR_KEY(ht, key) {
ZVAL_STR(&key_tmp, key);
if (zend_compare(op1, &key_tmp) == 0) {
- result = val;
- break;
+ FREE_OP1();
+ ZEND_VM_SMART_BRANCH(1, 1);
}
} ZEND_HASH_FOREACH_END();
}
FREE_OP1();
- ZEND_VM_SMART_BRANCH(result, 1);
+ ZEND_VM_SMART_BRANCH(0, 1);
}
ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMPVAR|CV, UNUSED)
@@ -8919,7 +9008,7 @@ ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMPVAR|CV, UNUSED)
while (1) {
if (Z_TYPE_P(op1) == IS_ARRAY) {
- count = zend_array_count(Z_ARRVAL_P(op1));
+ count = zend_hash_num_elements(Z_ARRVAL_P(op1));
break;
} else if (Z_TYPE_P(op1) == IS_OBJECT) {
zend_object *zobj = Z_OBJ_P(op1);
@@ -9302,7 +9391,7 @@ ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_IDENTICAL, op->op1_type == IS_CV && (op->op2_t
/* (Infinite recursion when comparing arrays is an uncatchable fatal error) */
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -9315,7 +9404,7 @@ ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_NOT_IDENTICAL, op->op1_type == IS_CV && (op->o
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -9639,16 +9728,9 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_inf
pos++;
value = &p->val;
value_type = Z_TYPE_INFO_P(value);
+ ZEND_ASSERT(value_type != IS_INDIRECT);
if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- break;
- }
- } else {
- break;
- }
+ break;
}
p++;
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 9d7eae0311..24a4d67bf2 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -1146,6 +1146,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper
ZEND_VM_LEAVE();
} else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) {
zend_detach_symbol_table(execute_data);
+ zend_destroy_static_vars(&EX(func)->op_array);
destroy_op_array(&EX(func)->op_array);
efree_size(EX(func), sizeof(zend_op_array));
#ifdef ZEND_PREFER_RELOAD
@@ -1225,7 +1226,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
ret = 0 ? EX_VAR(opline->result.var) : &retval;
@@ -1286,7 +1287,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
ret = 1 ? EX_VAR(opline->result.var) : &retval;
@@ -1451,7 +1452,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
ret = 0 ? EX_VAR(opline->result.var) : &retval;
@@ -1545,7 +1546,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
ret = 1 ? EX_VAR(opline->result.var) : &retval;
@@ -1640,7 +1641,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
@@ -1744,7 +1745,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
ret = 0 ? EX_VAR(opline->result.var) : &retval;
@@ -1852,7 +1853,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
ret = 1 ? EX_VAR(opline->result.var) : &retval;
@@ -1960,7 +1961,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_OBS
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
@@ -2115,7 +2116,7 @@ send_again:
HashTable *ht = Z_ARRVAL_P(args);
zval *arg, *top;
zend_string *name;
- zend_bool have_named_params = 0;
+ bool have_named_params = 0;
zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, zend_hash_num_elements(ht));
@@ -2186,7 +2187,7 @@ send_again:
} else if (EXPECTED(Z_TYPE_P(args) == IS_OBJECT)) {
zend_class_entry *ce = Z_OBJCE_P(args);
zend_object_iterator *iter;
- zend_bool have_named_params = 0;
+ bool have_named_params = 0;
if (!ce || !ce->get_iterator) {
zend_type_error("Only arrays and Traversables can be unpacked");
@@ -2203,26 +2204,27 @@ send_again:
HANDLE_EXCEPTION();
}
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
+ const zend_object_iterator_funcs *funcs = iter->funcs;
+ if (funcs->rewind) {
+ funcs->rewind(iter);
}
- for (; iter->funcs->valid(iter) == SUCCESS; ++arg_num) {
+ for (; funcs->valid(iter) == SUCCESS; ++arg_num) {
zval *arg, *top;
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
- arg = iter->funcs->get_current_data(iter);
+ arg = funcs->get_current_data(iter);
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
zend_string *name = NULL;
- if (iter->funcs->get_current_key) {
+ if (funcs->get_current_key) {
zval key;
- iter->funcs->get_current_key(iter, &key);
+ funcs->get_current_key(iter, &key);
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
@@ -2284,7 +2286,7 @@ send_again:
ZEND_CALL_NUM_ARGS(EX(call))++;
}
- iter->funcs->move_forward(iter);
+ funcs->move_forward(iter);
}
zend_iterator_dtor(iter);
@@ -2348,7 +2350,7 @@ send_array:
arg_num = 1;
param = ZEND_CALL_ARG(EX(call), 1);
ZEND_HASH_FOREACH_VAL(ht, arg) {
- zend_bool must_wrap = 0;
+ bool must_wrap = 0;
if (skip > 0) {
skip--;
continue;
@@ -2384,7 +2386,7 @@ send_array:
FREE_OP(opline->op2_type, opline->op2.var);
} else {
zend_string *name;
- zend_bool have_named_params;
+ bool have_named_params;
zend_vm_stack_extend_call_frame(&EX(call), 0, zend_hash_num_elements(ht));
arg_num = 1;
param = ZEND_CALL_ARG(EX(call), 1);
@@ -2405,7 +2407,7 @@ send_array:
HANDLE_EXCEPTION();
}
- zend_bool must_wrap = 0;
+ bool must_wrap = 0;
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
if (UNEXPECTED(!Z_ISREF_P(arg))) {
if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
@@ -2452,7 +2454,7 @@ static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_mi
HANDLE_EXCEPTION();
}
-static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_verify_recv_arg_type_helper_SPEC(zval *op_1 ZEND_OPCODE_HANDLER_ARGS_DC)
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_verify_recv_arg_type_helper_SPEC(zval *op_1 ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
@@ -2499,9 +2501,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_UNPACK_SPEC_HANDLER(
{
USE_OPLINE
zval *op1;
+ HashTable *result_ht;
SAVE_OPLINE();
op1 = get_zval_ptr(opline->op1_type, opline->op1, BP_VAR_R);
+ result_ht = Z_ARRVAL_P(EX_VAR(opline->result.var));
add_unpack_again:
if (EXPECTED(Z_TYPE_P(op1) == IS_ARRAY)) {
@@ -2510,16 +2514,14 @@ add_unpack_again:
zend_string *key;
ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+ if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
+ val = Z_REFVAL_P(val);
+ }
+ Z_TRY_ADDREF_P(val);
if (key) {
- zend_throw_error(NULL, "Cannot unpack array with string keys");
- FREE_OP(opline->op1_type, opline->op1.var);
- HANDLE_EXCEPTION();
+ zend_hash_update(result_ht, key, val);
} else {
- if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
- val = Z_REFVAL_P(val);
- }
- Z_TRY_ADDREF_P(val);
- if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), val)) {
+ if (!zend_hash_next_index_insert(result_ht, val)) {
zend_cannot_add_element();
zval_ptr_dtor_nogc(val);
break;
@@ -2544,48 +2546,59 @@ add_unpack_again:
HANDLE_EXCEPTION();
}
- if (iter->funcs->rewind) {
- iter->funcs->rewind(iter);
+ const zend_object_iterator_funcs *funcs = iter->funcs;
+ if (funcs->rewind) {
+ funcs->rewind(iter);
}
- for (; iter->funcs->valid(iter) == SUCCESS; ) {
+ for (; funcs->valid(iter) == SUCCESS; ) {
zval *val;
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
- val = iter->funcs->get_current_data(iter);
+ val = funcs->get_current_data(iter);
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
- if (iter->funcs->get_current_key) {
- zval key;
- iter->funcs->get_current_key(iter, &key);
+ zval key;
+ if (funcs->get_current_key) {
+ funcs->get_current_key(iter, &key);
if (UNEXPECTED(EG(exception) != NULL)) {
break;
}
- if (UNEXPECTED(Z_TYPE(key) != IS_LONG)) {
+ if (UNEXPECTED(Z_TYPE(key) != IS_LONG && Z_TYPE(key) != IS_STRING)) {
zend_throw_error(NULL,
- (Z_TYPE(key) == IS_STRING) ?
- "Cannot unpack Traversable with string keys" :
- "Cannot unpack Traversable with non-integer keys");
+ "Keys must be of type int|string during array unpacking");
zval_ptr_dtor(&key);
break;
}
+ } else {
+ ZVAL_UNDEF(&key);
}
ZVAL_DEREF(val);
Z_TRY_ADDREF_P(val);
- if (!zend_hash_next_index_insert(Z_ARRVAL_P(EX_VAR(opline->result.var)), val)) {
- zend_cannot_add_element();
- zval_ptr_dtor_nogc(val);
+ zend_ulong num_key;
+ if (Z_TYPE(key) == IS_STRING && !ZEND_HANDLE_NUMERIC(Z_STR(key), num_key)) {
+ zend_hash_update(result_ht, Z_STR(key), val);
+ zval_ptr_dtor_str(&key);
+ } else {
+ if (!zend_hash_next_index_insert(result_ht, val)) {
+ zend_cannot_add_element();
+ zval_ptr_dtor_nogc(val);
+ break;
+ }
}
- iter->funcs->move_forward(iter);
+ funcs->move_forward(iter);
+ if (UNEXPECTED(EG(exception))) {
+ break;
+ }
}
zend_iterator_dtor(iter);
@@ -2653,6 +2666,124 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fe_fetch_object_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zval *array;
+ zval *value;
+ uint32_t value_type;
+ HashTable *fe_ht;
+ HashPosition pos;
+ Bucket *p;
+ zend_object_iterator *iter;
+
+ array = EX_VAR(opline->op1.var);
+ SAVE_OPLINE();
+
+ ZEND_ASSERT(Z_TYPE_P(array) == IS_OBJECT);
+ if ((iter = zend_iterator_unwrap(array)) == NULL) {
+ /* plain object */
+
+ fe_ht = Z_OBJPROP_P(array);
+ pos = zend_hash_iterator_pos(Z_FE_ITER_P(array), fe_ht);
+ p = fe_ht->arData + pos;
+ while (1) {
+ if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+ /* reached end of iteration */
+ goto fe_fetch_r_exit;
+ }
+ pos++;
+ value = &p->val;
+ value_type = Z_TYPE_INFO_P(value);
+ if (EXPECTED(value_type != IS_UNDEF)) {
+ if (UNEXPECTED(value_type == IS_INDIRECT)) {
+ value = Z_INDIRECT_P(value);
+ value_type = Z_TYPE_INFO_P(value);
+ if (EXPECTED(value_type != IS_UNDEF)
+ && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) {
+ break;
+ }
+ } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0)
+ || !p->key
+ || zend_check_property_access(Z_OBJ_P(array), p->key, 1) == SUCCESS) {
+ break;
+ }
+ }
+ p++;
+ }
+ EG(ht_iterators)[Z_FE_ITER_P(array)].pos = pos;
+ if (RETURN_VALUE_USED(opline)) {
+ if (UNEXPECTED(!p->key)) {
+ ZVAL_LONG(EX_VAR(opline->result.var), p->h);
+ } else if (ZSTR_VAL(p->key)[0]) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+ } else {
+ const char *class_name, *prop_name;
+ size_t prop_name_len;
+ zend_unmangle_property_name_ex(
+ p->key, &class_name, &prop_name, &prop_name_len);
+ ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
+ }
+ }
+ } else {
+ const zend_object_iterator_funcs *funcs = iter->funcs;
+ if (EXPECTED(++iter->index > 0)) {
+ /* This could cause an endless loop if index becomes zero again.
+ * In case that ever happens we need an additional flag. */
+ funcs->move_forward(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+ if (UNEXPECTED(funcs->valid(iter) == FAILURE)) {
+ /* reached end of iteration */
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+fe_fetch_r_exit:
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+ ZEND_VM_CONTINUE();
+ }
+ }
+ value = funcs->get_current_data(iter);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+ if (!value) {
+ /* failure in get_current_data */
+ goto fe_fetch_r_exit;
+ }
+ if (RETURN_VALUE_USED(opline)) {
+ if (funcs->get_current_key) {
+ funcs->get_current_key(iter, EX_VAR(opline->result.var));
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ UNDEF_RESULT();
+ HANDLE_EXCEPTION();
+ }
+ } else {
+ ZVAL_LONG(EX_VAR(opline->result.var), iter->index);
+ }
+ }
+ value_type = Z_TYPE_INFO_P(value);
+ }
+
+ if (EXPECTED(opline->op2_type == IS_CV)) {
+ zval *variable_ptr = EX_VAR(opline->op2.var);
+ zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
+ } else {
+ zval *res = EX_VAR(opline->op2.var);
+ zend_refcounted *gc = Z_COUNTED_P(value);
+
+ ZVAL_COPY_VALUE_EX(res, value, gc, value_type);
+ if (Z_TYPE_INFO_REFCOUNTED(value_type)) {
+ GC_ADDREF(gc);
+ }
+ }
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -2803,7 +2934,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLE
ce = Z_CE_P(zv);
if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
SAVE_OPLINE();
- if (zend_do_link_class(ce, (opline->op2_type == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL) == FAILURE) {
+ ce = zend_do_link_class(ce, (opline->op2_type == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL, rtd_key);
+ if (!ce) {
HANDLE_EXCEPTION();
}
}
@@ -2815,10 +2947,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLE
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
+ zend_function *func;
USE_OPLINE
SAVE_OPLINE();
- do_bind_function(RT_CONSTANT(opline, opline->op1));
+ func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num];
+ do_bind_function(func, RT_CONSTANT(opline, opline->op1));
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@@ -3167,7 +3301,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
if (ret == NULL) {
@@ -3303,7 +3437,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER_
EG(current_execute_data) = call;
#if ZEND_DEBUG
- zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+ bool should_throw = zend_internal_call_should_throw(fbc, call);
#endif
if (ret == NULL) {
@@ -4433,7 +4567,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_HANDLER(ZEND_
}
catch_ce = CACHED_PTR(opline->extended_value & ~ZEND_LAST_CATCH);
if (UNEXPECTED(catch_ce == NULL)) {
- catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ catch_ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
CACHE_PTR(opline->extended_value & ~ZEND_LAST_CATCH, catch_ce);
}
@@ -4627,6 +4761,11 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_H
} else {
ZVAL_EMPTY_ARRAY(result);
}
+ } else if (Z_OBJ_P(expr)->properties == NULL
+ && Z_OBJ_HT_P(expr)->get_properties_for == NULL
+ && Z_OBJ_HT_P(expr)->get_properties == zend_std_get_properties) {
+ /* Optimized version without rebulding properties HashTable */
+ ZVAL_ARR(result, zend_std_build_object_properties_array(Z_OBJ_P(expr)));
} else {
HashTable *obj_ht = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_ARRAY_CAST);
if (obj_ht) {
@@ -4719,6 +4858,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
zend_vm_stack_free_call_frame(call);
}
+ zend_destroy_static_vars(new_op_array);
destroy_op_array(new_op_array);
efree_size(new_op_array, sizeof(zend_op_array));
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -4788,6 +4928,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER_
zend_vm_stack_free_call_frame(call);
}
+ zend_destroy_static_vars(new_op_array);
destroy_op_array(new_op_array);
efree_size(new_op_array, sizeof(zend_op_array));
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -4851,7 +4992,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
+ bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
@@ -4943,7 +5084,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
+ bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CONST == IS_VAR) {
@@ -5139,6 +5280,32 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_CONST_HANDL
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_function *func;
+ zval *object;
+ zend_class_entry *called_scope;
+
+ func = (zend_function *) EX(func)->op_array.dynamic_func_defs[opline->op2.num];
+ if (Z_TYPE(EX(This)) == IS_OBJECT) {
+ called_scope = Z_OBJCE(EX(This));
+ if (UNEXPECTED((func->common.fn_flags & ZEND_ACC_STATIC) ||
+ (EX(func)->common.fn_flags & ZEND_ACC_STATIC))) {
+ object = NULL;
+ } else {
+ object = &EX(This);
+ }
+ } else {
+ called_scope = Z_CE(EX(This));
+ object = NULL;
+ }
+ zend_create_closure(EX_VAR(opline->result.var), func,
+ EX(func)->op_array.scope, called_scope, object);
+
+ ZEND_VM_NEXT_OPCODE();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -5251,10 +5418,12 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CONST
value = RT_CONSTANT(opline, opline->op1);
if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
-
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(value);
+ }
ZEND_VM_NEXT_OPCODE();
} else {
- zend_bool strict;
+ bool strict;
if ((IS_CONST & (IS_VAR|IS_CV)) && Z_TYPE_P(value) == IS_REFERENCE) {
value = Z_REFVAL_P(value);
@@ -5275,8 +5444,18 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CONST
zend_string *str;
zval tmp;
+ if (UNEXPECTED(Z_TYPE_P(value) == IS_NULL)) {
+ zend_error(E_DEPRECATED,
+ "strlen(): Passing null to parameter #1 ($string) of type string is deprecated");
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ ZVAL_LONG(EX_VAR(opline->result.var), 0);
+ break;
+ }
+
ZVAL_COPY(&tmp, value);
- if (zend_parse_arg_str_weak(&tmp, &str)) {
+ if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
zval_ptr_dtor(&tmp);
break;
@@ -5624,7 +5803,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = RT_CONSTANT(opline, opline->op1);
@@ -5639,7 +5818,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = RT_CONSTANT(opline, opline->op1);
@@ -6107,6 +6286,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if (IS_CONST != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -6838,7 +7022,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONS
}
}
- zv = zend_hash_find_ex(&ce->constants_table, Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
+ zv = zend_hash_find_ex(CE_CONSTANTS_TABLE(ce), Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
if (EXPECTED(zv != NULL)) {
c = Z_PTR_P(zv);
scope = EX(func)->op_array.scope;
@@ -7013,7 +7197,7 @@ isset_again:
goto num_index_prop;
}
}
- value = zend_hash_find_ex_ind(ht, str, IS_CONST == IS_CONST);
+ value = zend_hash_find_ex(ht, str, IS_CONST == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -7121,7 +7305,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CO
zval *key, *subject;
HashTable *ht;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
@@ -7165,7 +7349,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_DELAYED_SPEC_CON
if (UNEXPECTED(!zv)) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name));
} else {
- if (zend_do_link_class(ce, Z_STR_P(RT_CONSTANT(opline, opline->op2))) == FAILURE) {
+ ce = zend_do_link_class(ce, Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(lcname));
+ if (!ce) {
/* Reload bucket pointer, the hash table may have been reallocated */
zv = zend_hash_find(EG(class_table), Z_STR_P(lcname));
zend_hash_set_bucket_key(EG(class_table), (Bucket *) zv, Z_STR_P(lcname + 1));
@@ -7441,33 +7626,69 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CON
HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
zval *result;
- SAVE_OPLINE();
op1 = RT_CONSTANT(opline, opline->op1);
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
result = zend_hash_find_ex(ht, Z_STR_P(op1), IS_CONST == IS_CONST);
- } else if (opline->extended_value) {
+ if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+
+ if (opline->extended_value) {
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
result = zend_hash_index_find(ht, Z_LVAL_P(op1));
- } else {
- result = NULL;
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ SAVE_OPLINE();
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ result = zend_hash_index_find(ht, Z_LVAL_P(op1));
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
} else if (Z_TYPE_P(op1) <= IS_FALSE) {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
result = zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
+ ZEND_VM_SMART_BRANCH(result, 0);
} else {
zend_string *key;
- zval key_tmp, *val;
+ zval key_tmp;
- result = NULL;
- ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+ if ((IS_CONST & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ }
+
+ SAVE_OPLINE();
+ ZEND_HASH_FOREACH_STR_KEY(ht, key) {
ZVAL_STR(&key_tmp, key);
if (zend_compare(op1, &key_tmp) == 0) {
- result = val;
- break;
+
+ ZEND_VM_SMART_BRANCH(1, 1);
}
} ZEND_HASH_FOREACH_END();
}
- ZEND_VM_SMART_BRANCH(result, 1);
+ ZEND_VM_SMART_BRANCH(0, 1);
}
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -8397,6 +8618,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -9169,7 +9395,7 @@ isset_again:
goto num_index_prop;
}
}
- value = zend_hash_find_ex_ind(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
+ value = zend_hash_find_ex(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -9277,7 +9503,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TM
zval *key, *subject;
HashTable *ht;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
@@ -9473,8 +9699,9 @@ fetch_this:
} else if (type == BP_VAR_IS) {
retval = &EG(uninitialized_zval);
} else {
- zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(name));
- if (type == BP_VAR_RW) {
+ zend_error(E_WARNING, "Undefined %svariable $%s",
+ (opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
+ if (type == BP_VAR_RW && !EG(exception)) {
retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
} else {
retval = &EG(uninitialized_zval);
@@ -9492,8 +9719,9 @@ fetch_this:
} else if (type == BP_VAR_IS) {
retval = &EG(uninitialized_zval);
} else {
- zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(name));
- if (type == BP_VAR_RW) {
+ zend_error(E_WARNING, "Undefined %svariable $%s",
+ (opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
+ if (type == BP_VAR_RW && !EG(exception)) {
ZVAL_NULL(retval);
} else {
retval = &EG(uninitialized_zval);
@@ -9763,7 +9991,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYP
}
SAVE_OPLINE();
- if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ if (UNEXPECTED(!zend_check_type_slow(&ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
zend_verify_return_error(EX(func), retval_ptr);
HANDLE_EXCEPTION();
}
@@ -10143,41 +10371,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_U
}
/* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_function *func;
- zval *zfunc;
- zval *object;
- zend_class_entry *called_scope;
-
- func = CACHED_PTR(opline->extended_value);
- if (UNEXPECTED(func == NULL)) {
- zfunc = zend_hash_find_ex(EG(function_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1);
- ZEND_ASSERT(zfunc != NULL);
- func = Z_FUNC_P(zfunc);
- ZEND_ASSERT(func->type == ZEND_USER_FUNCTION);
- CACHE_PTR(opline->extended_value, func);
- }
-
- if (Z_TYPE(EX(This)) == IS_OBJECT) {
- called_scope = Z_OBJCE(EX(This));
- if (UNEXPECTED((func->common.fn_flags & ZEND_ACC_STATIC) ||
- (EX(func)->common.fn_flags & ZEND_ACC_STATIC))) {
- object = NULL;
- } else {
- object = &EX(This);
- }
- } else {
- called_scope = Z_CE(EX(This));
- object = NULL;
- }
- zend_create_closure(EX_VAR(opline->result.var), func,
- EX(func)->op_array.scope, called_scope, object);
-
- ZEND_VM_NEXT_OPCODE();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -10323,7 +10516,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CONST_
while (1) {
if (Z_TYPE_P(op1) == IS_ARRAY) {
- count = zend_array_count(Z_ARRVAL_P(op1));
+ count = zend_hash_num_elements(Z_ARRVAL_P(op1));
break;
} else if (Z_TYPE_P(op1) == IS_OBJECT) {
zend_object *zobj = Z_OBJ_P(op1);
@@ -10780,6 +10973,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if (IS_CV != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -11551,7 +11749,7 @@ isset_again:
goto num_index_prop;
}
}
- value = zend_hash_find_ex_ind(ht, str, IS_CV == IS_CONST);
+ value = zend_hash_find_ex(ht, str, IS_CV == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -11659,7 +11857,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV
zval *key, *subject;
HashTable *ht;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
@@ -14292,6 +14490,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
zend_vm_stack_free_call_frame(call);
}
+ zend_destroy_static_vars(new_op_array);
destroy_op_array(new_op_array);
efree_size(new_op_array, sizeof(zend_op_array));
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -14421,10 +14620,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEN
value = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(value);
+ }
ZEND_VM_NEXT_OPCODE();
} else {
- zend_bool strict;
+ bool strict;
if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(value) == IS_REFERENCE) {
value = Z_REFVAL_P(value);
@@ -14445,8 +14646,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_TMPVAR_HANDLER(ZEN
zend_string *str;
zval tmp;
+ if (UNEXPECTED(Z_TYPE_P(value) == IS_NULL)) {
+ zend_error(E_DEPRECATED,
+ "strlen(): Passing null to parameter #1 ($string) of type string is deprecated");
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ ZVAL_LONG(EX_VAR(opline->result.var), 0);
+ break;
+ }
+
ZVAL_COPY(&tmp, value);
- if (zend_parse_arg_str_weak(&tmp, &str)) {
+ if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
zval_ptr_dtor(&tmp);
break;
@@ -15186,6 +15397,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if (IS_CONST != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -15697,7 +15913,7 @@ isset_again:
goto num_index_prop;
}
}
- value = zend_hash_find_ex_ind(ht, str, IS_CONST == IS_CONST);
+ value = zend_hash_find_ex(ht, str, IS_CONST == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -15805,7 +16021,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_C
zval *key, *subject;
HashTable *ht;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
@@ -15836,7 +16052,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_CONST_H
{
USE_OPLINE
zval *expr;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
expr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -15848,7 +16064,7 @@ try_instanceof:
if (IS_CONST == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -16606,6 +16822,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -17089,7 +17310,7 @@ isset_again:
goto num_index_prop;
}
}
- value = zend_hash_find_ex_ind(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
+ value = zend_hash_find_ex(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -17197,7 +17418,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_T
zval *key, *subject;
HashTable *ht;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
@@ -17229,7 +17450,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HAN
{
USE_OPLINE
zval *expr;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
expr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -17241,7 +17462,7 @@ try_instanceof:
if (IS_VAR == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -17314,8 +17535,9 @@ fetch_this:
} else if (type == BP_VAR_IS) {
retval = &EG(uninitialized_zval);
} else {
- zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(name));
- if (type == BP_VAR_RW) {
+ zend_error(E_WARNING, "Undefined %svariable $%s",
+ (opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
+ if (type == BP_VAR_RW && !EG(exception)) {
retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
} else {
retval = &EG(uninitialized_zval);
@@ -17333,8 +17555,9 @@ fetch_this:
} else if (type == BP_VAR_IS) {
retval = &EG(uninitialized_zval);
} else {
- zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(name));
- if (type == BP_VAR_RW) {
+ zend_error(E_WARNING, "Undefined %svariable $%s",
+ (opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
+ if (type == BP_VAR_RW && !EG(exception)) {
ZVAL_NULL(retval);
} else {
retval = &EG(uninitialized_zval);
@@ -17510,7 +17733,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED_
{
USE_OPLINE
zval *expr;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
expr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -17522,7 +17745,7 @@ try_instanceof:
if (IS_UNUSED == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -17562,7 +17785,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_TMPVAR_UNUSED_HANDL
while (1) {
if (Z_TYPE_P(op1) == IS_ARRAY) {
- count = zend_array_count(Z_ARRVAL_P(op1));
+ count = zend_hash_num_elements(Z_ARRVAL_P(op1));
break;
} else if (Z_TYPE_P(op1) == IS_OBJECT) {
zend_object *zobj = Z_OBJ_P(op1);
@@ -17916,6 +18139,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if (IS_CV != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -18399,7 +18627,7 @@ isset_again:
goto num_index_prop;
}
}
- value = zend_hash_find_ex_ind(ht, str, IS_CV == IS_CONST);
+ value = zend_hash_find_ex(ht, str, IS_CV == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -18507,7 +18735,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_C
zval *key, *subject;
HashTable *ht;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
@@ -18784,6 +19012,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
} else {
ZVAL_EMPTY_ARRAY(result);
}
+ } else if (Z_OBJ_P(expr)->properties == NULL
+ && Z_OBJ_HT_P(expr)->get_properties_for == NULL
+ && Z_OBJ_HT_P(expr)->get_properties == zend_std_get_properties) {
+ /* Optimized version without rebulding properties HashTable */
+ ZVAL_ARR(result, zend_std_build_object_properties_array(Z_OBJ_P(expr)));
} else {
HashTable *obj_ht = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_ARRAY_CAST);
if (obj_ht) {
@@ -18871,7 +19104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
+ bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (UNEXPECTED(EG(exception))) {
@@ -18964,7 +19197,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
+ bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_VAR) {
@@ -19133,7 +19366,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HA
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -19148,7 +19381,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_STRICT_SPEC_TMP_CONST_HAN
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -19162,7 +19395,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONS
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -19584,33 +19817,69 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_TMP_CONST_HANDLE
HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
zval *result;
- SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
result = zend_hash_find_ex(ht, Z_STR_P(op1), IS_TMP_VAR == IS_CONST);
- } else if (opline->extended_value) {
+ if (IS_TMP_VAR & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+
+ if (opline->extended_value) {
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
result = zend_hash_index_find(ht, Z_LVAL_P(op1));
- } else {
- result = NULL;
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ ZEND_VM_SMART_BRANCH(result, 0);
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ result = zend_hash_index_find(ht, Z_LVAL_P(op1));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ } else if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
} else if (Z_TYPE_P(op1) <= IS_FALSE) {
+ if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
result = zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
+ ZEND_VM_SMART_BRANCH(result, 0);
} else {
zend_string *key;
- zval key_tmp, *val;
+ zval key_tmp;
- result = NULL;
- ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+ if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ }
+
+ SAVE_OPLINE();
+ ZEND_HASH_FOREACH_STR_KEY(ht, key) {
ZVAL_STR(&key_tmp, key);
if (zend_compare(op1, &key_tmp) == 0) {
- result = val;
- break;
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ ZEND_VM_SMART_BRANCH(1, 1);
}
} ZEND_HASH_FOREACH_END();
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZEND_VM_SMART_BRANCH(result, 1);
+ ZEND_VM_SMART_BRANCH(0, 1);
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -19985,7 +20254,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_TMP_HAND
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -20000,7 +20269,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_STRICT_SPEC_TMP_TMP_HANDL
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -20014,7 +20283,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP_
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -20029,7 +20298,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_STRICT_SPEC_TMP_VAR_HANDL
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -20117,7 +20386,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UN
}
SAVE_OPLINE();
- if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ if (UNEXPECTED(!zend_check_type_slow(&ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
zend_verify_return_error(EX(func), retval_ptr);
HANDLE_EXCEPTION();
}
@@ -20462,7 +20731,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_STRICT_SPEC_TMP_CV_HANDLE
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -21358,6 +21627,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
} else {
ZVAL_EMPTY_ARRAY(result);
}
+ } else if (Z_OBJ_P(expr)->properties == NULL
+ && Z_OBJ_HT_P(expr)->get_properties_for == NULL
+ && Z_OBJ_HT_P(expr)->get_properties == zend_std_get_properties) {
+ /* Optimized version without rebulding properties HashTable */
+ ZVAL_ARR(result, zend_std_build_object_properties_array(Z_OBJ_P(expr)));
} else {
HashTable *obj_ht = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_ARRAY_CAST);
if (obj_ht) {
@@ -21446,7 +21720,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
+ bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (UNEXPECTED(EG(exception))) {
@@ -21539,7 +21813,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
+ bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR) {
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
@@ -21567,7 +21841,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *array;
@@ -21578,135 +21852,41 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
Bucket *p;
array = EX_VAR(opline->op1.var);
- SAVE_OPLINE();
- if (EXPECTED(Z_TYPE_P(array) == IS_ARRAY)) {
- fe_ht = Z_ARRVAL_P(array);
- pos = Z_FE_POS_P(array);
- p = fe_ht->arData + pos;
- while (1) {
- if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
- /* reached end of iteration */
-fe_fetch_r_exit:
- ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
- ZEND_VM_CONTINUE();
- }
- pos++;
- value = &p->val;
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- break;
- }
- } else {
- break;
- }
- }
- p++;
+ if (UNEXPECTED(Z_TYPE_P(array) != IS_ARRAY)) {
+ ZEND_VM_TAIL_CALL(zend_fe_fetch_object_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+ }
+ fe_ht = Z_ARRVAL_P(array);
+ pos = Z_FE_POS_P(array);
+ p = fe_ht->arData + pos;
+ while (1) {
+ if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+ /* reached end of iteration */
+ ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+ ZEND_VM_CONTINUE();
}
- Z_FE_POS_P(array) = pos;
- if (RETURN_VALUE_USED(opline)) {
- if (!p->key) {
- ZVAL_LONG(EX_VAR(opline->result.var), p->h);
- } else {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
- }
+ pos++;
+ value = &p->val;
+ value_type = Z_TYPE_INFO_P(value);
+ ZEND_ASSERT(value_type != IS_INDIRECT);
+ if (EXPECTED(value_type != IS_UNDEF)) {
+ break;
}
- } else {
- zend_object_iterator *iter;
-
- ZEND_ASSERT(Z_TYPE_P(array) == IS_OBJECT);
- if ((iter = zend_iterator_unwrap(array)) == NULL) {
- /* plain object */
-
- fe_ht = Z_OBJPROP_P(array);
- pos = zend_hash_iterator_pos(Z_FE_ITER_P(array), fe_ht);
- p = fe_ht->arData + pos;
- while (1) {
- if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
- /* reached end of iteration */
- goto fe_fetch_r_exit;
- }
- pos++;
- value = &p->val;
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)
- && EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key, 0) == SUCCESS)) {
- break;
- }
- } else if (EXPECTED(Z_OBJCE_P(array)->default_properties_count == 0)
- || !p->key
- || zend_check_property_access(Z_OBJ_P(array), p->key, 1) == SUCCESS) {
- break;
- }
- }
- p++;
- }
- EG(ht_iterators)[Z_FE_ITER_P(array)].pos = pos;
- if (RETURN_VALUE_USED(opline)) {
- if (UNEXPECTED(!p->key)) {
- ZVAL_LONG(EX_VAR(opline->result.var), p->h);
- } else if (ZSTR_VAL(p->key)[0]) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
- } else {
- const char *class_name, *prop_name;
- size_t prop_name_len;
- zend_unmangle_property_name_ex(
- p->key, &class_name, &prop_name, &prop_name_len);
- ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
- }
- }
+ p++;
+ }
+ Z_FE_POS_P(array) = pos;
+ if (RETURN_VALUE_USED(opline)) {
+ if (!p->key) {
+ ZVAL_LONG(EX_VAR(opline->result.var), p->h);
} else {
- if (EXPECTED(++iter->index > 0)) {
- /* This could cause an endless loop if index becomes zero again.
- * In case that ever happens we need an additional flag. */
- iter->funcs->move_forward(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- if (UNEXPECTED(iter->funcs->valid(iter) == FAILURE)) {
- /* reached end of iteration */
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- goto fe_fetch_r_exit;
- }
- }
- value = iter->funcs->get_current_data(iter);
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- if (!value) {
- /* failure in get_current_data */
- goto fe_fetch_r_exit;
- }
- if (RETURN_VALUE_USED(opline)) {
- if (iter->funcs->get_current_key) {
- iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
- if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
- }
- } else {
- ZVAL_LONG(EX_VAR(opline->result.var), iter->index);
- }
- }
- value_type = Z_TYPE_INFO_P(value);
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
}
}
if (EXPECTED(opline->op2_type == IS_CV)) {
zval *variable_ptr = EX_VAR(opline->op2.var);
+ SAVE_OPLINE();
zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
zval *res = EX_VAR(opline->op2.var);
zend_refcounted *gc = Z_COUNTED_P(value);
@@ -21715,8 +21895,8 @@ fe_fetch_r_exit:
if (Z_TYPE_INFO_REFCOUNTED(value_type)) {
GC_ADDREF(gc);
}
+ ZEND_VM_NEXT_OPCODE();
}
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -21745,16 +21925,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
pos++;
value = &p->val;
value_type = Z_TYPE_INFO_P(value);
+ ZEND_ASSERT(value_type != IS_INDIRECT);
if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- break;
- }
- } else {
- break;
- }
+ break;
}
p++;
}
@@ -21823,15 +21996,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
}
}
} else {
+ const zend_object_iterator_funcs *funcs = iter->funcs;
if (++iter->index > 0) {
/* This could cause an endless loop if index becomes zero again.
* In case that ever happens we need an additional flag. */
- iter->funcs->move_forward(iter);
+ funcs->move_forward(iter);
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
}
- if (UNEXPECTED(iter->funcs->valid(iter) == FAILURE)) {
+ if (UNEXPECTED(funcs->valid(iter) == FAILURE)) {
/* reached end of iteration */
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
@@ -21840,7 +22014,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
goto fe_fetch_w_exit;
}
}
- value = iter->funcs->get_current_data(iter);
+ value = funcs->get_current_data(iter);
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
@@ -21850,8 +22024,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
goto fe_fetch_w_exit;
}
if (RETURN_VALUE_USED(opline)) {
- if (iter->funcs->get_current_key) {
- iter->funcs->get_current_key(iter, EX_VAR(opline->result.var));
+ if (funcs->get_current_key) {
+ funcs->get_current_key(iter, EX_VAR(opline->result.var));
if (UNEXPECTED(EG(exception) != NULL)) {
UNDEF_RESULT();
HANDLE_EXCEPTION();
@@ -22044,7 +22218,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HA
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
@@ -22059,7 +22233,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_STRICT_SPEC_VAR_CONST_HAN
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
@@ -22073,7 +22247,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONS
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
@@ -24194,7 +24368,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_
}
}
- zv = zend_hash_find_ex(&ce->constants_table, Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
+ zv = zend_hash_find_ex(CE_CONSTANTS_TABLE(ce), Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
if (EXPECTED(zv != NULL)) {
c = Z_PTR_P(zv);
scope = EX(func)->op_array.scope;
@@ -24370,11 +24544,8 @@ offset_again:
}
}
str_index_dim:
- if (ht == &EG(symbol_table)) {
- zend_delete_global_variable(key);
- } else {
- zend_hash_del(ht, key);
- }
+ ZEND_ASSERT(ht != &EG(symbol_table));
+ zend_hash_del(ht, key);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_dim:
@@ -24395,6 +24566,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -24606,33 +24778,69 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_VAR_CONST_HANDLE
HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
zval *result;
- SAVE_OPLINE();
- op1 = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
+ op1 = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
result = zend_hash_find_ex(ht, Z_STR_P(op1), IS_VAR == IS_CONST);
- } else if (opline->extended_value) {
+ if (IS_VAR & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+
+ if (opline->extended_value) {
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
result = zend_hash_index_find(ht, Z_LVAL_P(op1));
- } else {
- result = NULL;
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ SAVE_OPLINE();
+ if ((IS_VAR & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ ZEND_VM_SMART_BRANCH(result, 0);
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ result = zend_hash_index_find(ht, Z_LVAL_P(op1));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ } else if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
} else if (Z_TYPE_P(op1) <= IS_FALSE) {
+ if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
result = zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
+ ZEND_VM_SMART_BRANCH(result, 0);
} else {
zend_string *key;
- zval key_tmp, *val;
+ zval key_tmp;
- result = NULL;
- ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+ if ((IS_VAR & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ }
+
+ SAVE_OPLINE();
+ ZEND_HASH_FOREACH_STR_KEY(ht, key) {
ZVAL_STR(&key_tmp, key);
if (zend_compare(op1, &key_tmp) == 0) {
- result = val;
- break;
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ ZEND_VM_SMART_BRANCH(1, 1);
}
} ZEND_HASH_FOREACH_END();
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- ZEND_VM_SMART_BRANCH(result, 1);
+ ZEND_VM_SMART_BRANCH(0, 1);
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -26523,11 +26731,8 @@ offset_again:
}
}
str_index_dim:
- if (ht == &EG(symbol_table)) {
- zend_delete_global_variable(key);
- } else {
- zend_hash_del(ht, key);
- }
+ ZEND_ASSERT(ht != &EG(symbol_table));
+ zend_hash_del(ht, key);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_dim:
@@ -26548,6 +26753,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -26759,7 +26965,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HAND
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
@@ -26774,7 +26980,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_STRICT_SPEC_VAR_TMP_HANDL
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
@@ -26788,7 +26994,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
@@ -26843,7 +27049,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HAND
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
@@ -26858,7 +27064,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_STRICT_SPEC_VAR_VAR_HANDL
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
@@ -26872,7 +27078,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
@@ -27732,7 +27938,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UN
}
SAVE_OPLINE();
- if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ if (UNEXPECTED(!zend_check_type_slow(&ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
zend_verify_return_error(EX(func), retval_ptr);
HANDLE_EXCEPTION();
}
@@ -28570,7 +28776,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_STRICT_SPEC_VAR_CV_HANDLE
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
@@ -30537,11 +30743,8 @@ offset_again:
}
}
str_index_dim:
- if (ht == &EG(symbol_table)) {
- zend_delete_global_variable(key);
- } else {
- zend_hash_del(ht, key);
- }
+ ZEND_ASSERT(ht != &EG(symbol_table));
+ zend_hash_del(ht, key);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_dim:
@@ -30562,6 +30765,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -30790,16 +30994,9 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
pos++;
value = &p->val;
value_type = Z_TYPE_INFO_P(value);
+ ZEND_ASSERT(value_type != IS_INDIRECT);
if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- break;
- }
- } else {
- break;
- }
+ break;
}
p++;
}
@@ -30842,16 +31039,9 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
pos++;
value = &p->val;
value_type = Z_TYPE_INFO_P(value);
+ ZEND_ASSERT(value_type != IS_INDIRECT);
if (EXPECTED(value_type != IS_UNDEF)) {
- if (UNEXPECTED(value_type == IS_INDIRECT)) {
- value = Z_INDIRECT_P(value);
- value_type = Z_TYPE_INFO_P(value);
- if (EXPECTED(value_type != IS_UNDEF)) {
- break;
- }
- } else {
- break;
- }
+ break;
}
p++;
}
@@ -31327,6 +31517,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if (IS_CONST != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -32637,7 +32832,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUS
}
}
- zv = zend_hash_find_ex(&ce->constants_table, Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
+ zv = zend_hash_find_ex(CE_CONSTANTS_TABLE(ce), Z_STR_P(RT_CONSTANT(opline, opline->op2)), 1);
if (EXPECTED(zv != NULL)) {
c = Z_PTR_P(zv);
scope = EX(func)->op_array.scope;
@@ -33240,6 +33435,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -34932,7 +35132,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED
}
SAVE_OPLINE();
- if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ if (UNEXPECTED(!zend_check_type_slow(&ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
zend_verify_return_error(EX(func), retval_ptr);
HANDLE_EXCEPTION();
}
@@ -35247,6 +35447,16 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_THIS_SPEC_UN
}
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ /* For symbol tables we need to deal with exactly the same problems as for property tables. */
+ ZVAL_ARR(EX_VAR(opline->result.var),
+ zend_proptable_to_symtable(&EG(symbol_table), /* always_duplicate */ 1));
+ ZEND_VM_NEXT_OPCODE();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -35729,6 +35939,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if (IS_CV != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -38019,6 +38234,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
} else {
ZVAL_EMPTY_ARRAY(result);
}
+ } else if (Z_OBJ_P(expr)->properties == NULL
+ && Z_OBJ_HT_P(expr)->get_properties_for == NULL
+ && Z_OBJ_HT_P(expr)->get_properties == zend_std_get_properties) {
+ /* Optimized version without rebulding properties HashTable */
+ ZVAL_ARR(result, zend_std_build_object_properties_array(Z_OBJ_P(expr)));
} else {
HashTable *obj_ht = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_ARRAY_CAST);
if (obj_ht) {
@@ -38111,6 +38331,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
zend_vm_stack_free_call_frame(call);
}
+ zend_destroy_static_vars(new_op_array);
destroy_op_array(new_op_array);
efree_size(new_op_array, sizeof(zend_op_array));
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -38174,7 +38395,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
+ bool is_empty = zend_fe_reset_iterator(array_ptr, 0 OPLINE_CC EXECUTE_DATA_CC);
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
@@ -38266,7 +38487,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
- zend_bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
+ bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CV == IS_VAR) {
@@ -38530,10 +38751,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CV_HANDLER(ZEND_OP
value = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
-
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(value);
+ }
ZEND_VM_NEXT_OPCODE();
} else {
- zend_bool strict;
+ bool strict;
if ((IS_CV & (IS_VAR|IS_CV)) && Z_TYPE_P(value) == IS_REFERENCE) {
value = Z_REFVAL_P(value);
@@ -38554,8 +38777,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_STRLEN_SPEC_CV_HANDLER(ZEND_OP
zend_string *str;
zval tmp;
+ if (UNEXPECTED(Z_TYPE_P(value) == IS_NULL)) {
+ zend_error(E_DEPRECATED,
+ "strlen(): Passing null to parameter #1 ($string) of type string is deprecated");
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
+ ZVAL_LONG(EX_VAR(opline->result.var), 0);
+ break;
+ }
+
ZVAL_COPY(&tmp, value);
- if (zend_parse_arg_str_weak(&tmp, &str)) {
+ if (zend_parse_arg_str_weak(&tmp, &str, 1)) {
ZVAL_LONG(EX_VAR(opline->result.var), ZSTR_LEN(str));
zval_ptr_dtor(&tmp);
break;
@@ -38938,7 +39171,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CONST_HAN
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -38953,7 +39186,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -39898,6 +40131,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if (IS_CONST != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -41808,11 +42046,8 @@ offset_again:
}
}
str_index_dim:
- if (ht == &EG(symbol_table)) {
- zend_delete_global_variable(key);
- } else {
- zend_hash_del(ht, key);
- }
+ ZEND_ASSERT(ht != &EG(symbol_table));
+ zend_hash_del(ht, key);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_dim:
@@ -41833,6 +42068,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -41940,7 +42176,7 @@ isset_again:
goto num_index_prop;
}
}
- value = zend_hash_find_ex_ind(ht, str, IS_CONST == IS_CONST);
+ value = zend_hash_find_ex(ht, str, IS_CONST == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -42048,7 +42284,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST
zval *key, *subject;
HashTable *ht;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
@@ -42079,7 +42315,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_CONST_HANDL
{
USE_OPLINE
zval *expr;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
expr = EX_VAR(opline->op1.var);
@@ -42091,7 +42327,7 @@ try_instanceof:
if (IS_CONST == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -42331,33 +42567,69 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER
HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
zval *result;
- SAVE_OPLINE();
- op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+ op1 = EX_VAR(opline->op1.var);
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
result = zend_hash_find_ex(ht, Z_STR_P(op1), IS_CV == IS_CONST);
- } else if (opline->extended_value) {
+ if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
+ zval_ptr_dtor_str(op1);
+ }
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+
+ if (opline->extended_value) {
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
result = zend_hash_index_find(ht, Z_LVAL_P(op1));
- } else {
- result = NULL;
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ SAVE_OPLINE();
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ } else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+ result = zend_hash_index_find(ht, Z_LVAL_P(op1));
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ ZVAL_UNDEFINED_OP1();
}
} else if (Z_TYPE_P(op1) <= IS_FALSE) {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+ SAVE_OPLINE();
+ ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
result = zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
+ ZEND_VM_SMART_BRANCH(result, 0);
} else {
zend_string *key;
- zval key_tmp, *val;
+ zval key_tmp;
- result = NULL;
- ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+ if ((IS_CV & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
+ op1 = Z_REFVAL_P(op1);
+ if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+ result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
+
+ ZEND_VM_SMART_BRANCH(result, 0);
+ }
+ }
+
+ SAVE_OPLINE();
+ ZEND_HASH_FOREACH_STR_KEY(ht, key) {
ZVAL_STR(&key_tmp, key);
if (zend_compare(op1, &key_tmp) == 0) {
- result = val;
- break;
+
+ ZEND_VM_SMART_BRANCH(1, 1);
}
} ZEND_HASH_FOREACH_END();
}
- ZEND_VM_SMART_BRANCH(result, 1);
+ ZEND_VM_SMART_BRANCH(0, 1);
}
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -42367,7 +42639,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_C
/* (Infinite recursion when comparing arrays is an uncatchable fatal error) */
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
op1 = EX_VAR(opline->op1.var);
op2 = RT_CONSTANT(opline, opline->op2);
@@ -42380,7 +42652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
op1 = EX_VAR(opline->op1.var);
op2 = RT_CONSTANT(opline, opline->op2);
@@ -43530,6 +43802,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -45254,11 +45531,8 @@ offset_again:
}
}
str_index_dim:
- if (ht == &EG(symbol_table)) {
- zend_delete_global_variable(key);
- } else {
- zend_hash_del(ht, key);
- }
+ ZEND_ASSERT(ht != &EG(symbol_table));
+ zend_hash_del(ht, key);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_dim:
@@ -45279,6 +45553,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -45388,7 +45663,7 @@ isset_again:
goto num_index_prop;
}
}
- value = zend_hash_find_ex_ind(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
+ value = zend_hash_find_ex(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -45496,7 +45771,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVA
zval *key, *subject;
HashTable *ht;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
@@ -45652,7 +45927,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_TMP_HANDL
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -45667,7 +45942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP_H
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -45722,7 +45997,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDL
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -45737,7 +46012,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_H
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -45827,7 +46102,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_VAR_HANDLER
{
USE_OPLINE
zval *expr;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
expr = EX_VAR(opline->op1.var);
@@ -45839,7 +46114,7 @@ try_instanceof:
if (IS_VAR == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -45996,8 +46271,9 @@ fetch_this:
} else if (type == BP_VAR_IS) {
retval = &EG(uninitialized_zval);
} else {
- zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(name));
- if (type == BP_VAR_RW) {
+ zend_error(E_WARNING, "Undefined %svariable $%s",
+ (opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
+ if (type == BP_VAR_RW && !EG(exception)) {
retval = zend_hash_update(target_symbol_table, name, &EG(uninitialized_zval));
} else {
retval = &EG(uninitialized_zval);
@@ -46015,8 +46291,9 @@ fetch_this:
} else if (type == BP_VAR_IS) {
retval = &EG(uninitialized_zval);
} else {
- zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(name));
- if (type == BP_VAR_RW) {
+ zend_error(E_WARNING, "Undefined %svariable $%s",
+ (opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
+ if (type == BP_VAR_RW && !EG(exception)) {
ZVAL_NULL(retval);
} else {
retval = &EG(uninitialized_zval);
@@ -46634,7 +46911,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNU
}
SAVE_OPLINE();
- if (UNEXPECTED(!zend_check_type_slow(ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
+ if (UNEXPECTED(!zend_check_type_slow(&ret_info->type, retval_ptr, ref, cache_slot, NULL, 1, 0))) {
zend_verify_return_error(EX(func), retval_ptr);
HANDLE_EXCEPTION();
}
@@ -47119,7 +47396,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_UNUSED_HAND
{
USE_OPLINE
zval *expr;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
expr = EX_VAR(opline->op1.var);
@@ -47131,7 +47408,7 @@ try_instanceof:
if (IS_UNUSED == IS_CONST) {
ce = CACHED_PTR(opline->extended_value);
if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
+ ce = zend_lookup_class_ex(Z_STR_P(RT_CONSTANT(opline, opline->op2)), Z_STR_P(RT_CONSTANT(opline, opline->op2) + 1), ZEND_FETCH_CLASS_NO_AUTOLOAD);
if (EXPECTED(ce)) {
CACHE_PTR(opline->extended_value, ce);
}
@@ -47294,16 +47571,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_UNUSED_HAN
ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
if (!ht) {
- ZEND_ASSERT(EX(func)->op_array.fn_flags & (ZEND_ACC_IMMUTABLE|ZEND_ACC_PRELOADED));
ht = zend_array_dup(EX(func)->op_array.static_variables);
ZEND_MAP_PTR_SET(EX(func)->op_array.static_variables_ptr, ht);
- } else if (GC_REFCOUNT(ht) > 1) {
- if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
- GC_DELREF(ht);
- }
- ht = zend_array_dup(ht);
- ZEND_MAP_PTR_SET(EX(func)->op_array.static_variables_ptr, ht);
}
+ ZEND_ASSERT(GC_REFCOUNT(ht) == 1);
value = (zval*)((char*)ht->arData + (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT)));
@@ -47394,7 +47665,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CV_UNUSED_HANDLER(Z
while (1) {
if (Z_TYPE_P(op1) == IS_ARRAY) {
- count = zend_array_count(Z_ARRVAL_P(op1));
+ count = zend_hash_num_elements(Z_ARRVAL_P(op1));
break;
} else if (Z_TYPE_P(op1) == IS_OBJECT) {
zend_object *zobj = Z_OBJ_P(op1);
@@ -47619,7 +47890,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLE
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -47634,7 +47905,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HA
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
op1 = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
@@ -48579,6 +48850,11 @@ fetch_obj_r_fast_copy:
}
retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
+#if ZEND_DEBUG
+ if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
+ zend_verify_internal_read_property_type(zobj, name, retval);
+ }
+#endif
if (IS_CV != IS_CONST) {
zend_tmp_string_release(tmp_name);
@@ -50377,11 +50653,8 @@ offset_again:
}
}
str_index_dim:
- if (ht == &EG(symbol_table)) {
- zend_delete_global_variable(key);
- } else {
- zend_hash_del(ht, key);
- }
+ ZEND_ASSERT(ht != &EG(symbol_table));
+ zend_hash_del(ht, key);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_dim:
@@ -50402,6 +50675,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -50509,7 +50783,7 @@ isset_again:
goto num_index_prop;
}
}
- value = zend_hash_find_ex_ind(ht, str, IS_CV == IS_CONST);
+ value = zend_hash_find_ex(ht, str, IS_CV == IS_CONST);
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
hval = Z_LVAL_P(offset);
num_index_prop:
@@ -50617,7 +50891,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV_HA
zval *key, *subject;
HashTable *ht;
- zend_bool result;
+ bool result;
SAVE_OPLINE();
@@ -50774,7 +51048,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_C
/* (Infinite recursion when comparing arrays is an uncatchable fatal error) */
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
op1 = EX_VAR(opline->op1.var);
op2 = EX_VAR(opline->op2.var);
@@ -50787,7 +51061,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_
{
USE_OPLINE
zval *op1, *op2;
- zend_bool result;
+ bool result;
op1 = EX_VAR(opline->op1.var);
op2 = EX_VAR(opline->op2.var);
@@ -53148,7 +53422,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_MAKE_REF_SPEC_CV_UNUSED_LABEL,
(void*)&&ZEND_DECLARE_FUNCTION_SPEC_LABEL,
- (void*)&&ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_LABEL,
+ (void*)&&ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_LABEL,
(void*)&&ZEND_DECLARE_CONST_SPEC_CONST_CONST_LABEL,
(void*)&&ZEND_DECLARE_CLASS_SPEC_CONST_LABEL,
(void*)&&ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST_LABEL,
@@ -53405,6 +53679,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_JMP_NULL_SPEC_TMPVARCV_LABEL,
(void*)&&ZEND_CHECK_UNDEF_ARGS_SPEC_UNUSED_UNUSED_LABEL,
+ (void*)&&ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED_LABEL,
(void*)&&ZEND_RECV_NOTYPE_SPEC_LABEL,
(void*)&&ZEND_JMP_FORWARD_SPEC_LABEL,
(void*)&&ZEND_NULL_LABEL,
@@ -54458,6 +54733,7 @@ zend_leave_helper_SPEC_LABEL:
ZEND_VM_LEAVE();
} else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) {
zend_detach_symbol_table(execute_data);
+ zend_destroy_static_vars(&EX(func)->op_array);
destroy_op_array(&EX(func)->op_array);
efree_size(EX(func), sizeof(zend_op_array));
#ifdef ZEND_PREFER_RELOAD
@@ -54966,6 +55242,10 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_DECLARE_CLASS_SPEC_CONST)
ZEND_DECLARE_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST):
+ VM_TRACE(ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST)
+ ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_FROM_SPEC_CONST):
VM_TRACE(ZEND_YIELD_FROM_SPEC_CONST)
ZEND_YIELD_FROM_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -55442,10 +55722,6 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED)
ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED):
- VM_TRACE(ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED)
- ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_YIELD_SPEC_CONST_UNUSED):
VM_TRACE(ZEND_YIELD_SPEC_CONST_UNUSED)
ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -57604,6 +57880,10 @@ zend_leave_helper_SPEC_LABEL:
VM_TRACE(ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED)
ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED):
+ VM_TRACE(ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED)
+ ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED):
VM_TRACE(ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED)
ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -61171,7 +61451,7 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_MAKE_REF_SPEC_CV_UNUSED_HANDLER,
ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
- ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER,
+ ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_HANDLER,
ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER,
ZEND_DECLARE_CLASS_SPEC_CONST_HANDLER,
ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST_HANDLER,
@@ -61428,6 +61708,7 @@ void zend_vm_init(void)
ZEND_NULL_HANDLER,
ZEND_JMP_NULL_SPEC_TMPVARCV_HANDLER,
ZEND_CHECK_UNDEF_ARGS_SPEC_UNUSED_UNUSED_HANDLER,
+ ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED_HANDLER,
ZEND_RECV_NOTYPE_SPEC_HANDLER,
ZEND_JMP_FORWARD_SPEC_HANDLER,
ZEND_NULL_HANDLER,
@@ -62534,7 +62815,8 @@ void zend_vm_init(void)
2536 | SPEC_RULE_OP1,
2541 | SPEC_RULE_OP1,
2546,
- 3450
+ 2547,
+ 3451
};
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
zend_opcode_handler_funcs = labels;
@@ -62707,7 +62989,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2549 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2550 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
if (op->op1_type < op->op2_type) {
zend_swap_operands(op);
}
@@ -62715,7 +62997,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2574 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2575 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
if (op->op1_type < op->op2_type) {
zend_swap_operands(op);
}
@@ -62723,7 +63005,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2599 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2600 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
if (op->op1_type < op->op2_type) {
zend_swap_operands(op);
}
@@ -62734,17 +63016,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2624 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 2625 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
} else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2649 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 2650 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2674 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 2675 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
}
break;
case ZEND_MUL:
@@ -62755,17 +63037,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2699 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2700 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
} else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2724 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2725 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2749 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 2750 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
}
break;
case ZEND_IS_IDENTICAL:
@@ -62776,14 +63058,14 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2774 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 2775 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2849 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 2850 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
} else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
- spec = 3074 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 3075 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
}
break;
case ZEND_IS_NOT_IDENTICAL:
@@ -62794,14 +63076,14 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2924 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 2925 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2999 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 3000 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
} else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
- spec = 3079 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+ spec = 3080 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
}
break;
case ZEND_IS_EQUAL:
@@ -62812,12 +63094,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2774 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 2775 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2849 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 2850 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
}
break;
case ZEND_IS_NOT_EQUAL:
@@ -62828,12 +63110,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2924 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 2925 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 2999 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+ spec = 3000 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
}
break;
case ZEND_IS_SMALLER:
@@ -62841,12 +63123,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3084 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 3085 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3159 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 3160 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
}
break;
case ZEND_IS_SMALLER_OR_EQUAL:
@@ -62854,74 +63136,74 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3234 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 3235 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3309 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+ spec = 3310 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
}
break;
case ZEND_QM_ASSIGN:
if (op1_info == MAY_BE_LONG) {
- spec = 3396 | SPEC_RULE_OP1;
+ spec = 3397 | SPEC_RULE_OP1;
} else if (op1_info == MAY_BE_DOUBLE) {
- spec = 3401 | SPEC_RULE_OP1;
+ spec = 3402 | SPEC_RULE_OP1;
} else if ((op->op1_type == IS_CONST) ? !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)) : (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) {
- spec = 3406 | SPEC_RULE_OP1;
+ spec = 3407 | SPEC_RULE_OP1;
}
break;
case ZEND_PRE_INC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 3384 | SPEC_RULE_RETVAL;
+ spec = 3385 | SPEC_RULE_RETVAL;
} else if (op1_info == MAY_BE_LONG) {
- spec = 3386 | SPEC_RULE_RETVAL;
+ spec = 3387 | SPEC_RULE_RETVAL;
}
break;
case ZEND_PRE_DEC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 3388 | SPEC_RULE_RETVAL;
+ spec = 3389 | SPEC_RULE_RETVAL;
} else if (op1_info == MAY_BE_LONG) {
- spec = 3390 | SPEC_RULE_RETVAL;
+ spec = 3391 | SPEC_RULE_RETVAL;
}
break;
case ZEND_POST_INC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 3392;
- } else if (op1_info == MAY_BE_LONG) {
spec = 3393;
+ } else if (op1_info == MAY_BE_LONG) {
+ spec = 3394;
}
break;
case ZEND_POST_DEC:
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
- spec = 3394;
- } else if (op1_info == MAY_BE_LONG) {
spec = 3395;
+ } else if (op1_info == MAY_BE_LONG) {
+ spec = 3396;
}
break;
case ZEND_JMP:
if (OP_JMP_ADDR(op, op->op1) > op) {
- spec = 2548;
+ spec = 2549;
}
break;
case ZEND_RECV:
if (op->op2.num == MAY_BE_ANY) {
- spec = 2547;
+ spec = 2548;
}
break;
case ZEND_SEND_VAL:
if (op->op1_type == IS_CONST && op->op2_type == IS_UNUSED && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
- spec = 3446;
+ spec = 3447;
}
break;
case ZEND_SEND_VAR_EX:
if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
- spec = 3441 | SPEC_RULE_OP1;
+ spec = 3442 | SPEC_RULE_OP1;
}
break;
case ZEND_FE_FETCH_R:
if (op->op2_type == IS_CV && (op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) {
- spec = 3448 | SPEC_RULE_RETVAL;
+ spec = 3449 | SPEC_RULE_RETVAL;
}
break;
case ZEND_FETCH_DIM_R:
@@ -62929,17 +63211,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
- spec = 3411 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+ spec = 3412 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
}
break;
case ZEND_SEND_VAL_EX:
if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
- spec = 3447;
+ spec = 3448;
}
break;
case ZEND_SEND_VAR:
if (op->op2_type == IS_UNUSED && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
- spec = 3436 | SPEC_RULE_OP1;
+ spec = 3437 | SPEC_RULE_OP1;
}
break;
case ZEND_BW_OR:
diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php
index 0795822f96..c7a0df936d 100755
--- a/Zend/zend_vm_gen.php
+++ b/Zend/zend_vm_gen.php
@@ -138,10 +138,10 @@ $vm_ext_decode = array(
);
$vm_kind_name = array(
- ZEND_VM_KIND_CALL => "ZEND_VM_KIND_CALL",
- ZEND_VM_KIND_SWITCH => "ZEND_VM_KIND_SWITCH",
- ZEND_VM_KIND_GOTO => "ZEND_VM_KIND_GOTO",
- ZEND_VM_KIND_HYBRID => "ZEND_VM_KIND_HYBRID",
+ ZEND_VM_KIND_CALL => "ZEND_VM_KIND_CALL",
+ ZEND_VM_KIND_SWITCH => "ZEND_VM_KIND_SWITCH",
+ ZEND_VM_KIND_GOTO => "ZEND_VM_KIND_GOTO",
+ ZEND_VM_KIND_HYBRID => "ZEND_VM_KIND_HYBRID",
);
$op_types = array(
@@ -150,7 +150,7 @@ $op_types = array(
"TMP",
"VAR",
"UNUSED",
- "CV"
+ "CV",
);
$op_types_ex = array(
@@ -590,9 +590,9 @@ function is_hot_helper($name) {
if (isset($helpers[$name]["hot"])) {
return $helpers[$name]["hot"];
- } else {
- return false;
}
+
+ return false;
}
// Returns name of specialized helper
@@ -637,7 +637,8 @@ function helper_name($name, $spec, $op1, $op2, $extra_spec) {
$extra = extra_spec_name(array_intersect_key($extra_spec, $helpers[$name]["spec"]));
}
}
- return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].$extra;
+
+ return $name . ($spec ? "_SPEC" : "") . $prefix[$op1] . $prefix[$op2] . $extra;
}
function opcode_name($name, $spec, $op1, $op2, $extra_spec) {
@@ -688,7 +689,8 @@ function opcode_name($name, $spec, $op1, $op2, $extra_spec) {
$extra = extra_spec_name(array_intersect_key($extra_spec, $opcode["spec"]));
}
}
- return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].$extra;
+
+ return $name . ($spec ? "_SPEC" : "") . $prefix[$op1] . $prefix[$op2] . $extra;
}
// Formats condition, protecting it by parentheses when needed.
@@ -701,7 +703,7 @@ function format_condition($condition) {
return $condition;
}
- return "(".$condition.")";
+ return "(" . $condition . ")";
}
// Generates code for opcode handler or helper
@@ -811,7 +813,7 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null)
$code = "{\n\tfprintf(stderr, \"$name\\n\");\n" . substr($code, 1);
}
// Updating code according to selected threading model
- switch($kind) {
+ switch ($kind) {
case ZEND_VM_KIND_HYBRID:
$code = preg_replace_callback(
array(
@@ -1071,7 +1073,7 @@ function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno,
// Generate opcode handler's entry point according to selected threading model
$additional_func = false;
$spec_name = $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].($spec?extra_spec_name($extra_spec):"");
- switch($kind) {
+ switch ($kind) {
case ZEND_VM_KIND_HYBRID:
if (is_inline_hybrid_handler($name, $opcode["hot"], $op1, $op2, $extra_spec)) {
$out = fopen('php://memory', 'w+');
@@ -1164,7 +1166,7 @@ function gen_helper($f, $spec, $kind, $name, $op1, $op2, $param, $code, $lineno,
$spec_name = $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].($spec?extra_spec_name($extra_spec):"");
// Generate helper's entry point according to selected threading model
- switch($kind) {
+ switch ($kind) {
case ZEND_VM_KIND_HYBRID:
out($f, $spec_name . "_LABEL:\n");
break;
@@ -1226,7 +1228,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
// Emit labels for specialized executor
// For each opcode in opcode number order
- foreach($opcodes as $num => $dsc) {
+ foreach ($opcodes as $num => $dsc) {
if (isset($dsc['alias'])) {
$specs[$num] = $specs[$opnames[$dsc['alias']]];
continue;
@@ -1276,7 +1278,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
$foreach_op1 = function($do) use ($dsc, $op_types) {
return function($_, $op2) use ($do, $dsc, $op_types) {
// For each op1.op_type except ANY
- foreach($op_types as $op1) {
+ foreach ($op_types as $op1) {
if ($op1 != "ANY") {
if (!isset($dsc["op1"][$op1])) {
if ($op1 == "TMP" || $op1 == "VAR") {
@@ -1302,7 +1304,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
$foreach_op2 = function($do) use ($dsc, $op_types) {
return function($op1, $_) use ($do, $dsc, $op_types) {
// For each op2.op_type except ANY
- foreach($op_types as $op2) {
+ foreach ($op_types as $op2) {
if ($op2 != "ANY") {
if (!isset($dsc["op2"][$op2])) {
if ($op2 == "TMP" || $op2 == "VAR") {
@@ -1328,7 +1330,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
$foreach_op_data = function($do) use ($dsc, $op_types) {
return function($op1, $op2, $extra_spec = array()) use ($do, $dsc, $op_types) {
// For each op_data.op_type except ANY
- foreach($op_types as $op_data) {
+ foreach ($op_types as $op_data) {
if ($op_data != "ANY") {
if (!isset($dsc["spec"]["OP_DATA"][$op_data])) {
if ($op_data == "TMP" || $op_data == "VAR") {
@@ -1448,7 +1450,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
// Emit labels for unspecialized executor
// For each opcode in opcode number order
- foreach($opcodes as $num => $dsc) {
+ foreach ($opcodes as $num => $dsc) {
while ($next != $num) {
// If some opcode numbers are not used then fill hole with pointers
// to handler of undefined opcode
@@ -1529,7 +1531,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
$l = fopen(__DIR__ . "/zend_vm_handlers.h", "w+") or die("ERROR: Cannot create zend_vm_handlers.h\n");
out($l, "#define VM_HANDLERS(_) \\\n");
foreach ($list as $n => $name) {
- if (!is_null($name)) {
+ if (null !== $name) {
out($l, "\t_($n, $name) \\\n");
}
}
@@ -1644,7 +1646,7 @@ function extra_spec_handler($dsc) {
if (isset($specs["OP_DATA"])) {
$op_data_specs = $specs["OP_DATA"];
$specs["OP_DATA"] = array();
- foreach($op_types_ex as $op_data) {
+ foreach ($op_types_ex as $op_data) {
if (isset($dsc["spec"]["OP_DATA"][$op_data])) {
$specs["OP_DATA"][] = $op_data;
}
@@ -1694,10 +1696,10 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
// Produce specialized executor
$op1t = $op_types_ex;
// for each op1.op_type
- foreach($op1t as $op1) {
+ foreach ($op1t as $op1) {
$op2t = $op_types_ex;
// for each op2.op_type
- foreach($op2t as $op2) {
+ foreach ($op2t as $op2) {
// for each handlers in helpers in original order
foreach ($list as $lineno => $dsc) {
if (isset($dsc["handler"])) {
@@ -2255,7 +2257,7 @@ function parse_operand_spec($def, $lineno, $str, &$flags) {
$flags = 0;
$a = explode("|",$str);
- foreach($a as $val) {
+ foreach ($a as $val) {
if (isset($vm_op_decode[$val])) {
$flags |= $vm_op_decode[$val];
} else {
@@ -2276,7 +2278,7 @@ function parse_ext_spec($def, $lineno, $str) {
$flags = 0;
$a = explode("|",$str);
- foreach($a as $val) {
+ foreach ($a as $val) {
if (isset($vm_ext_decode[$val])) {
$flags |= $vm_ext_decode[$val];
} else {
@@ -2291,7 +2293,7 @@ function parse_spec_rules($def, $lineno, $str) {
$ret = array();
$a = explode(",", $str);
- foreach($a as $rule) {
+ foreach ($a as $rule) {
$n = strpos($rule, "=");
if ($n !== false) {
$id = trim(substr($rule, 0, $n));
@@ -2336,6 +2338,62 @@ function parse_spec_rules($def, $lineno, $str) {
return $ret;
}
+function gen_vm_opcodes_header(
+ array $opcodes, int $max_opcode, int $max_opcode_len, array $vm_op_flags
+): string {
+ $str = HEADER_TEXT;
+ $str .= "#ifndef ZEND_VM_OPCODES_H\n#define ZEND_VM_OPCODES_H\n\n";
+ $str .= "#define ZEND_VM_SPEC\t\t" . ZEND_VM_SPEC . "\n";
+ $str .= "#define ZEND_VM_LINES\t\t" . ZEND_VM_LINES . "\n";
+ $str .= "#define ZEND_VM_KIND_CALL\t" . ZEND_VM_KIND_CALL . "\n";
+ $str .= "#define ZEND_VM_KIND_SWITCH\t" . ZEND_VM_KIND_SWITCH . "\n";
+ $str .= "#define ZEND_VM_KIND_GOTO\t" . ZEND_VM_KIND_GOTO . "\n";
+ $str .= "#define ZEND_VM_KIND_HYBRID\t" . ZEND_VM_KIND_HYBRID . "\n";
+ if ($GLOBALS["vm_kind_name"][ZEND_VM_KIND] === "ZEND_VM_KIND_HYBRID") {
+ $str .= "/* HYBRID requires support for computed GOTO and global register variables*/\n";
+ $str .= "#if (defined(__GNUC__) && defined(HAVE_GCC_GLOBAL_REGS))\n";
+ $str .= "# define ZEND_VM_KIND\t\tZEND_VM_KIND_HYBRID\n";
+ $str .= "#else\n";
+ $str .= "# define ZEND_VM_KIND\t\tZEND_VM_KIND_CALL\n";
+ $str .= "#endif\n";
+ } else {
+ $str .= "#define ZEND_VM_KIND\t\t" . $GLOBALS["vm_kind_name"][ZEND_VM_KIND] . "\n";
+ }
+ $str .= "\n";
+ $str .= "#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) && !defined(__SANITIZE_ADDRESS__)\n";
+ $str .= "# if ((defined(i386) && !defined(__PIC__)) || defined(__x86_64__) || defined(_M_X64))\n";
+ $str .= "# define ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE 16\n";
+ $str .= "# endif\n";
+ $str .= "#endif\n";
+ $str .= "\n";
+ foreach ($vm_op_flags as $name => $val) {
+ $str .= sprintf("#define %-24s 0x%08x\n", $name, $val);
+ }
+ $str .= "#define ZEND_VM_OP1_FLAGS(flags) (flags & 0xff)\n";
+ $str .= "#define ZEND_VM_OP2_FLAGS(flags) ((flags >> 8) & 0xff)\n";
+ $str .= "\n";
+ $str .= "BEGIN_EXTERN_C()\n\n";
+ $str .= "ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode);\n";
+ $str .= "ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode);\n\n";
+ $str .= "END_EXTERN_C()\n\n";
+
+ $code_len = strlen((string) $max_opcode);
+ foreach ($opcodes as $code => $dsc) {
+ $code = str_pad((string)$code, $code_len, " ", STR_PAD_LEFT);
+ $op = str_pad($dsc["op"], $max_opcode_len);
+ if ($code <= $max_opcode) {
+ $str .= "#define $op $code\n";
+ }
+ }
+
+ $code = str_pad((string)$max_opcode, $code_len, " ", STR_PAD_LEFT);
+ $op = str_pad("ZEND_VM_LAST_OPCODE", $max_opcode_len);
+ $str .= "\n#define $op $code\n";
+
+ $str .= "\n#endif\n";
+ return $str;
+}
+
function gen_vm($def, $skel) {
global $definition_file, $skeleton_file, $executor_file,
$op_types, $list, $opcodes, $helpers, $params, $opnames,
@@ -2446,8 +2504,8 @@ function gen_vm($def, $skel) {
$opcodes[$orig_code]['type_spec'][$code] = $condition;
}
$op = $m[4];
- $op1 = parse_operand_spec($def, $lineno, $m[5], $flags1);
- $op2 = parse_operand_spec($def, $lineno, $m[6], $flags2);
+ $op1 = parse_operand_spec($def, $lineno, $m[5], $flags1);
+ $op2 = parse_operand_spec($def, $lineno, $m[6], $flags2);
$flags = $flags1 | ($flags2 << 8);
if (!empty($m[8])) {
$flags |= parse_ext_spec($def, $lineno, $m[8]);
@@ -2494,10 +2552,11 @@ function gen_vm($def, $skel) {
}
// Store parameters
- if (ZEND_VM_KIND == ZEND_VM_KIND_GOTO
+ if ((ZEND_VM_KIND == ZEND_VM_KIND_GOTO
|| ZEND_VM_KIND == ZEND_VM_KIND_SWITCH
- || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID && $hot)) {
- foreach (explode(",", $param) as $p) {
+ || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID && $hot))
+ && $param) {
+ foreach (explode(",", $param ) as $p) {
$p = trim($p);
if ($p !== "") {
$params[$p] = 1;
@@ -2574,60 +2633,8 @@ function gen_vm($def, $skel) {
}
// Generate opcode #defines (zend_vm_opcodes.h)
- $code_len = strlen((string)$max_opcode);
- $f = fopen(__DIR__ . "/zend_vm_opcodes.h", "w+") or die("ERROR: Cannot create zend_vm_opcodes.h\n");
-
- // Insert header
- out($f, HEADER_TEXT);
- fputs($f, "#ifndef ZEND_VM_OPCODES_H\n#define ZEND_VM_OPCODES_H\n\n");
- fputs($f, "#define ZEND_VM_SPEC\t\t" . ZEND_VM_SPEC . "\n");
- fputs($f, "#define ZEND_VM_LINES\t\t" . ZEND_VM_LINES . "\n");
- fputs($f, "#define ZEND_VM_KIND_CALL\t" . ZEND_VM_KIND_CALL . "\n");
- fputs($f, "#define ZEND_VM_KIND_SWITCH\t" . ZEND_VM_KIND_SWITCH . "\n");
- fputs($f, "#define ZEND_VM_KIND_GOTO\t" . ZEND_VM_KIND_GOTO . "\n");
- fputs($f, "#define ZEND_VM_KIND_HYBRID\t" . ZEND_VM_KIND_HYBRID . "\n");
- if ($GLOBALS["vm_kind_name"][ZEND_VM_KIND] === "ZEND_VM_KIND_HYBRID") {
- fputs($f, "/* HYBRID requires support for computed GOTO and global register variables*/\n");
- fputs($f, "#if (defined(__GNUC__) && defined(HAVE_GCC_GLOBAL_REGS))\n");
- fputs($f, "# define ZEND_VM_KIND\t\tZEND_VM_KIND_HYBRID\n");
- fputs($f, "#else\n");
- fputs($f, "# define ZEND_VM_KIND\t\tZEND_VM_KIND_CALL\n");
- fputs($f, "#endif\n");
- } else {
- fputs($f, "#define ZEND_VM_KIND\t\t" . $GLOBALS["vm_kind_name"][ZEND_VM_KIND] . "\n");
- }
- fputs($f, "\n");
- fputs($f, "#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) && !defined(__SANITIZE_ADDRESS__)\n");
- fputs($f, "# if ((defined(i386) && !defined(__PIC__)) || defined(__x86_64__) || defined(_M_X64))\n");
- fputs($f, "# define ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE 16\n");
- fputs($f, "# endif\n");
- fputs($f, "#endif\n");
- fputs($f, "\n");
- foreach($vm_op_flags as $name => $val) {
- fprintf($f, "#define %-24s 0x%08x\n", $name, $val);
- }
- fputs($f, "#define ZEND_VM_OP1_FLAGS(flags) (flags & 0xff)\n");
- fputs($f, "#define ZEND_VM_OP2_FLAGS(flags) ((flags >> 8) & 0xff)\n");
- fputs($f, "\n");
- fputs($f, "BEGIN_EXTERN_C()\n\n");
- fputs($f, "ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode);\n");
- fputs($f, "ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode);\n\n");
- fputs($f, "END_EXTERN_C()\n\n");
-
- foreach ($opcodes as $code => $dsc) {
- $code = str_pad((string)$code,$code_len," ",STR_PAD_LEFT);
- $op = str_pad($dsc["op"],$max_opcode_len);
- if ($code <= $max_opcode) {
- fputs($f,"#define $op $code\n");
- }
- }
-
- $code = str_pad((string)$max_opcode,$code_len," ",STR_PAD_LEFT);
- $op = str_pad("ZEND_VM_LAST_OPCODE",$max_opcode_len);
- fputs($f,"\n#define $op $code\n");
-
- fputs($f, "\n#endif\n");
- fclose($f);
+ $str = gen_vm_opcodes_header($opcodes, $max_opcode, $max_opcode_len, $vm_op_flags);
+ write_file_if_changed(__DIR__ . "/zend_vm_opcodes.h", $str);
echo "zend_vm_opcodes.h generated successfully.\n";
// zend_vm_opcodes.c
@@ -2847,7 +2854,7 @@ function gen_vm($def, $skel) {
out($f, "\tuint32_t spec = zend_spec_handlers[opcode];\n");
if (isset($used_extra_spec["TYPE"])) {
out($f, "\tswitch (opcode) {\n");
- foreach($opcodes as $code => $dsc) {
+ foreach ($opcodes as $code => $dsc) {
if (isset($dsc['type_spec'])) {
$orig_op = $dsc['op'];
out($f, "\t\tcase $orig_op:\n");
@@ -2857,7 +2864,7 @@ function gen_vm($def, $skel) {
out($f, "\t\t\t}\n");
}
$first = true;
- foreach($dsc['type_spec'] as $code => $condition) {
+ foreach ($dsc['type_spec'] as $code => $condition) {
$condition = format_condition($condition);
if ($first) {
out($f, "\t\t\tif $condition {\n");
@@ -2885,7 +2892,7 @@ function gen_vm($def, $skel) {
}
}
$has_commutative = false;
- foreach($opcodes as $code => $dsc) {
+ foreach ($opcodes as $code => $dsc) {
if (!isset($dsc['is_type_spec']) &&
!isset($dsc['type_spec']) &&
isset($dsc["spec"]["COMMUTATIVE"])) {
@@ -2980,6 +2987,18 @@ function gen_vm($def, $skel) {
echo "zend_vm_execute.h generated successfully.\n";
}
+function write_file_if_changed(string $filename, string $contents) {
+ if (file_exists($filename)) {
+ $orig_contents = file_get_contents($filename);
+ if ($orig_contents === $contents) {
+ // Unchanged, no need to write.
+ return;
+ }
+ }
+
+ file_put_contents($filename, $contents);
+}
+
function usage() {
echo("\nUsage: php zend_vm_gen.php [options]\n".
"\nOptions:".
diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h
index a2e85dde9b..2fbc04273d 100644
--- a/Zend/zend_vm_handlers.h
+++ b/Zend/zend_vm_handlers.h
@@ -1158,7 +1158,7 @@
_(2286, ZEND_MAKE_REF_SPEC_VAR_UNUSED) \
_(2288, ZEND_MAKE_REF_SPEC_CV_UNUSED) \
_(2289, ZEND_DECLARE_FUNCTION_SPEC) \
- _(2290, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED) \
+ _(2290, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST) \
_(2291, ZEND_DECLARE_CONST_SPEC_CONST_CONST) \
_(2292, ZEND_DECLARE_CLASS_SPEC_CONST) \
_(2293, ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST) \
@@ -1352,498 +1352,499 @@
_(2543, ZEND_JMP_NULL_SPEC_TMPVARCV) \
_(2545, ZEND_JMP_NULL_SPEC_TMPVARCV) \
_(2546, ZEND_CHECK_UNDEF_ARGS_SPEC_UNUSED_UNUSED) \
- _(2547, ZEND_RECV_NOTYPE_SPEC) \
- _(2548, ZEND_JMP_FORWARD_SPEC) \
- _(2554, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
- _(2555, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2547, ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED) \
+ _(2548, ZEND_RECV_NOTYPE_SPEC) \
+ _(2549, ZEND_JMP_FORWARD_SPEC) \
+ _(2555, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
_(2556, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2558, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2559, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
- _(2560, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2557, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2559, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2560, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
_(2561, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2563, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2569, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
- _(2570, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2562, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2564, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2570, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
_(2571, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2573, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2579, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
- _(2580, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2572, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2574, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2580, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
_(2581, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2583, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2584, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
- _(2585, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2582, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2584, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2585, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
_(2586, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2588, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2594, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
- _(2595, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2587, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2589, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2595, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
_(2596, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2598, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2604, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2605, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2597, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2599, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2605, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
_(2606, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2608, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2609, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2610, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2607, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2609, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2610, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
_(2611, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2613, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2619, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2620, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2612, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2614, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2620, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
_(2621, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2623, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2625, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+ _(2622, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2624, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
_(2626, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
- _(2628, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
- _(2629, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
- _(2630, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2627, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+ _(2629, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+ _(2630, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
_(2631, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2633, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2634, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
- _(2635, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2632, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2634, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2635, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
_(2636, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2638, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2644, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
- _(2645, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2637, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2639, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2645, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
_(2646, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2648, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2650, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+ _(2647, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2649, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
_(2651, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
- _(2653, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
- _(2654, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
- _(2655, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2652, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+ _(2654, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+ _(2655, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
_(2656, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2658, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2659, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
- _(2660, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2657, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2659, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2660, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
_(2661, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2663, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2669, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
- _(2670, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2662, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2664, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2670, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
_(2671, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2673, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2675, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(2672, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2674, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
_(2676, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
- _(2678, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
- _(2679, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2680, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2677, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(2679, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(2680, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
_(2681, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2683, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2684, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2685, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2682, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2684, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2685, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
_(2686, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2688, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2694, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2695, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2687, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2689, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2695, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
_(2696, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2698, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2704, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
- _(2705, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2697, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2699, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2705, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
_(2706, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2708, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2709, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
- _(2710, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2707, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2709, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2710, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
_(2711, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2713, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2719, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
- _(2720, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2712, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2714, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2720, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
_(2721, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2723, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
- _(2729, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
- _(2730, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2722, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2724, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+ _(2730, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
_(2731, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2733, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2734, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
- _(2735, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2732, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2734, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2735, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
_(2736, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2738, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2744, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
- _(2745, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2737, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2739, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2745, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
_(2746, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2748, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2754, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2755, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2747, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2749, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2755, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
_(2756, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2758, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2759, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2760, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2757, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2759, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2760, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
_(2761, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2763, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2769, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2770, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2762, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2764, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2770, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
_(2771, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2773, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2789, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
- _(2790, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(2791, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(2792, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2793, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2794, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2795, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2796, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2797, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2801, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2802, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2803, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2804, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
- _(2805, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(2806, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(2807, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2808, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2809, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2810, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2811, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2812, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2816, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2817, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2818, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2834, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
- _(2835, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(2836, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(2837, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2838, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2839, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2840, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2841, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2842, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2846, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2847, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2848, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2864, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2865, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(2866, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(2867, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2868, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2869, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2870, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2871, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2872, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2876, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2877, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2878, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2879, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2880, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(2881, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(2882, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2883, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2884, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2885, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2886, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2887, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2891, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2892, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2893, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2909, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(2910, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(2911, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(2912, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2913, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2914, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2915, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2916, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2917, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2921, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(2922, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2923, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2939, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
- _(2940, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(2941, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(2942, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2943, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2944, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2945, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2946, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2947, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2951, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2952, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2953, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2954, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
- _(2955, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(2956, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(2957, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2958, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2959, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2960, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2961, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2962, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2966, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2967, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2968, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2984, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
- _(2985, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(2986, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(2987, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2988, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2989, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2990, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2991, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2992, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(2996, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(2997, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(2998, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3014, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(3015, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3016, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3017, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3018, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3019, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3020, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3021, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3022, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3026, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3027, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3028, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3029, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(3030, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3031, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3032, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3033, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3034, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3035, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3036, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3037, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3041, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3042, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3043, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3059, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(3060, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3061, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3062, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3063, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3064, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3065, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3066, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3067, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3071, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3072, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3073, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3074, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
- _(3078, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \
- _(3079, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
- _(3083, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \
- _(3087, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
- _(3088, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3089, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3090, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
- _(3091, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3092, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3096, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
- _(3097, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3098, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3099, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
- _(3100, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3101, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3102, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3103, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3104, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3105, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3106, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3107, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3111, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3112, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3113, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3114, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
- _(3115, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3116, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3117, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3118, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3119, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3120, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3121, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3122, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3126, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3127, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3128, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3144, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
- _(3145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3147, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3148, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3149, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3150, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3151, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3156, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3157, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3158, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3162, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
- _(3163, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3164, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3165, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
- _(3166, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3167, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3171, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
- _(3172, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3173, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3174, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(3175, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3176, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3177, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3178, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3179, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3180, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3181, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3182, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3186, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3187, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3188, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3189, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(3190, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3191, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3192, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3193, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3194, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3195, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3196, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3197, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3201, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3202, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3203, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3219, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(3220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3222, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3223, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3224, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3225, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3226, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3231, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3232, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3233, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3237, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
- _(3238, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3239, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3240, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
- _(3241, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3242, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3246, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
- _(3247, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3248, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3249, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
- _(3250, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3251, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3252, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3253, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3254, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3255, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3256, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3257, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3261, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3262, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3263, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3264, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
- _(3265, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3266, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3267, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3268, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3269, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3270, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3271, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3272, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3276, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3277, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3278, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3294, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
- _(3295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3297, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3298, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3299, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3300, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3301, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3306, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
- _(3307, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3308, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3312, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
- _(3313, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3314, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3315, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
- _(3316, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3317, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3321, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
- _(3322, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
- _(3323, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
- _(3324, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(3325, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3326, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3327, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3328, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3329, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3330, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3331, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3332, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3336, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3337, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3338, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3339, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(3340, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3341, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3342, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3343, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3344, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3345, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3346, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3347, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3351, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3352, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3353, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3369, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
- _(3370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
- _(3371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
- _(3372, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3373, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3374, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3375, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3376, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3381, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
- _(3382, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
- _(3383, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
- _(3384, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
- _(3385, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
- _(3386, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \
- _(3387, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \
- _(3388, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
- _(3389, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
- _(3390, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \
- _(3391, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \
- _(3392, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \
- _(3393, ZEND_POST_INC_LONG_SPEC_CV) \
- _(3394, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \
- _(3395, ZEND_POST_DEC_LONG_SPEC_CV) \
- _(3396, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \
- _(3397, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+ _(2772, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2774, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2790, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2791, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2792, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2793, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2794, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2795, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2796, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2797, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2798, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2802, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2803, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2804, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2805, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2806, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2807, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2808, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2809, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2810, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2811, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2812, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2813, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2817, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2818, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2819, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2835, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2836, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2837, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2838, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2839, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2840, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2841, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2842, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2843, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2847, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2848, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2849, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2865, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2866, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2867, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2868, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2869, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2870, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2871, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2872, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2873, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2877, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2878, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2879, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2880, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2881, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2882, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2883, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2884, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2885, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2886, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2887, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2888, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2892, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2893, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2894, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2910, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(2911, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2912, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2913, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2914, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2915, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2916, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2917, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2918, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2922, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(2923, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2924, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2940, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2941, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2942, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2943, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2944, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2945, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2946, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2947, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2948, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2952, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2953, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2954, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2955, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2956, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2957, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2958, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2959, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2960, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2961, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2962, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2963, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2967, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2968, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2969, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2985, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(2986, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(2987, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(2988, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2989, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2990, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2991, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2992, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2993, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(2997, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(2998, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(2999, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3015, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3016, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3017, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3018, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3019, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3020, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3021, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3022, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3023, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3027, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3028, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3029, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3030, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3031, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3032, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3033, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3034, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3035, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3036, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3037, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3038, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3042, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3043, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3044, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3060, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3061, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3062, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3063, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3064, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3065, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3066, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3067, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3068, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3072, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3073, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3074, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3075, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
+ _(3079, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \
+ _(3080, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
+ _(3084, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \
+ _(3088, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+ _(3089, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3090, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3091, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+ _(3092, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3093, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3097, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+ _(3098, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3099, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3100, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+ _(3101, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3102, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3103, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3104, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3105, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3106, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3107, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3108, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3112, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3113, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3114, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3115, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+ _(3116, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3117, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3118, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3119, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3120, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3121, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3122, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3123, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3127, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3128, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3129, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+ _(3146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3147, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3148, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3149, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3150, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3151, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3153, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3157, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3158, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3159, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3163, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3164, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3165, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3166, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3167, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3168, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3172, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3173, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3174, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3175, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3176, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3177, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3178, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3179, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3180, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3181, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3182, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3183, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3187, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3188, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3189, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3190, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3191, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3192, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3193, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3194, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3195, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3196, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3197, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3198, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3202, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3203, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3204, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3222, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3223, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3224, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3225, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3226, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3228, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3232, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3233, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3234, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3238, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+ _(3239, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3240, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3241, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+ _(3242, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3243, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3247, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+ _(3248, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3249, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3250, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3251, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3252, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3253, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3254, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3255, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3256, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3257, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3258, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3262, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3263, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3264, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3265, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3266, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3267, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3268, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3269, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3270, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3271, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3272, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3273, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3277, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3278, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+ _(3296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3297, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3298, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3299, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3300, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3301, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3303, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3307, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+ _(3308, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3309, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3313, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3314, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3315, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3316, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3317, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3318, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3322, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+ _(3323, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+ _(3324, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+ _(3325, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3326, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3327, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3328, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3329, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3330, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3331, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3332, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3333, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3337, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3338, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3339, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3340, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3341, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3342, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3343, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3344, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3345, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3346, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3347, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3348, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3352, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3353, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+ _(3371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+ _(3372, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+ _(3373, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3374, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3375, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3376, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3378, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3382, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+ _(3383, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+ _(3384, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+ _(3385, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
+ _(3386, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
+ _(3387, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \
+ _(3388, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \
+ _(3389, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
+ _(3390, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
+ _(3391, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \
+ _(3392, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \
+ _(3393, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \
+ _(3394, ZEND_POST_INC_LONG_SPEC_CV) \
+ _(3395, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \
+ _(3396, ZEND_POST_DEC_LONG_SPEC_CV) \
+ _(3397, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \
_(3398, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
- _(3400, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
- _(3401, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \
- _(3402, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+ _(3399, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+ _(3401, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+ _(3402, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \
_(3403, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
- _(3405, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
- _(3406, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \
- _(3407, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+ _(3404, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+ _(3406, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+ _(3407, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \
_(3408, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
- _(3410, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
- _(3412, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+ _(3409, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+ _(3411, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
_(3413, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
- _(3415, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
- _(3416, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
- _(3417, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3414, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+ _(3416, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+ _(3417, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
_(3418, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
- _(3420, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
- _(3421, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
- _(3422, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3419, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3421, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3422, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
_(3423, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
- _(3425, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
- _(3431, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \
- _(3432, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+ _(3424, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3426, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+ _(3432, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \
_(3433, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
- _(3435, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
- _(3438, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \
- _(3440, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \
- _(3443, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \
- _(3445, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \
- _(3446, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \
- _(3447, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \
- _(3448, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \
- _(3449, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \
- _(3449+1, ZEND_NULL)
+ _(3434, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+ _(3436, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+ _(3439, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \
+ _(3441, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \
+ _(3444, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \
+ _(3446, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \
+ _(3447, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \
+ _(3448, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \
+ _(3449, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \
+ _(3450, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \
+ _(3450+1, ZEND_NULL)
diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c
index 56a31aa19a..f25dc2e12d 100644
--- a/Zend/zend_vm_opcodes.c
+++ b/Zend/zend_vm_opcodes.c
@@ -22,7 +22,7 @@
#include <zend.h>
#include <zend_vm_opcodes.h>
-static const char *zend_vm_opcodes_names[200] = {
+static const char *zend_vm_opcodes_names[201] = {
"ZEND_NOP",
"ZEND_ADD",
"ZEND_SUB",
@@ -223,9 +223,10 @@ static const char *zend_vm_opcodes_names[200] = {
"ZEND_MATCH_ERROR",
"ZEND_JMP_NULL",
"ZEND_CHECK_UNDEF_ARGS",
+ "ZEND_FETCH_GLOBALS",
};
-static uint32_t zend_vm_opcodes_flags[200] = {
+static uint32_t zend_vm_opcodes_flags[201] = {
0x00000000,
0x00000b0b,
0x00000b0b,
@@ -367,8 +368,8 @@ static uint32_t zend_vm_opcodes_flags[200] = {
0x00047305,
0x00000000,
0x00000101,
- 0x00000000,
- 0x00040103,
+ 0x00001000,
+ 0x00001003,
0x00000303,
0x00000003,
0x00000303,
@@ -426,6 +427,7 @@ static uint32_t zend_vm_opcodes_flags[200] = {
0x0000010b,
0x0000200b,
0x00000101,
+ 0x00000101,
};
ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) {
diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h
index 653e320b85..e7e40c8a85 100644
--- a/Zend/zend_vm_opcodes.h
+++ b/Zend/zend_vm_opcodes.h
@@ -282,7 +282,8 @@ END_EXTERN_C()
#define ZEND_MATCH_ERROR 197
#define ZEND_JMP_NULL 198
#define ZEND_CHECK_UNDEF_ARGS 199
+#define ZEND_FETCH_GLOBALS 200
-#define ZEND_VM_LAST_OPCODE 199
+#define ZEND_VM_LAST_OPCODE 200
#endif
diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c
index 04c5043210..13ab6c3bb8 100644
--- a/Zend/zend_weakrefs.c
+++ b/Zend/zend_weakrefs.c
@@ -181,8 +181,8 @@ static zend_object* zend_weakref_new(zend_class_entry *ce) {
return &wr->std;
}
-static zend_always_inline zend_bool zend_weakref_find(zval *referent, zval *return_value) {
- void *tagged_ptr = zend_hash_index_find_ptr(&EG(weakrefs), (zend_ulong) Z_OBJ_P(referent));
+static zend_always_inline bool zend_weakref_find(zend_object *referent, zval *return_value) {
+ void *tagged_ptr = zend_hash_index_find_ptr(&EG(weakrefs), (zend_ulong) referent);
if (!tagged_ptr) {
return 0;
}
@@ -209,13 +209,13 @@ found_weakref:
return 0;
}
-static zend_always_inline void zend_weakref_create(zval *referent, zval *return_value) {
+static zend_always_inline void zend_weakref_create(zend_object *referent, zval *return_value) {
zend_weakref *wr;
object_init_ex(return_value, zend_ce_weakref);
wr = zend_weakref_fetch(return_value);
- wr->referent = Z_OBJ_P(referent);
+ wr->referent = referent;
zend_weakref_register(wr->referent, ZEND_WEAKREF_ENCODE(wr, ZEND_WEAKREF_TAG_REF));
}
@@ -245,10 +245,10 @@ ZEND_COLD ZEND_METHOD(WeakReference, __construct)
ZEND_METHOD(WeakReference, create)
{
- zval *referent;
+ zend_object *referent;
ZEND_PARSE_PARAMETERS_START(1,1)
- Z_PARAM_OBJECT(referent)
+ Z_PARAM_OBJ(referent)
ZEND_PARSE_PARAMETERS_END();
if (zend_weakref_find(referent, return_value)) {
@@ -402,12 +402,12 @@ static HashTable *zend_weakmap_get_properties_for(zend_object *object, zend_prop
zend_ulong obj_addr;
zval *val;
ZEND_HASH_FOREACH_NUM_KEY_VAL(&wm->ht, obj_addr, val) {
+ zend_object *obj = (zend_object*)obj_addr;
zval pair;
- zval obj_zv;
array_init(&pair);
- ZVAL_OBJ_COPY(&obj_zv, (zend_object *) obj_addr);
- add_assoc_zval(&pair, "key", &obj_zv);
+ GC_ADDREF(obj);
+ add_assoc_object(&pair, "key", obj);
Z_TRY_ADDREF_P(val);
add_assoc_zval(&pair, "value", val);
@@ -597,11 +597,7 @@ ZEND_METHOD(WeakMap, getIterator)
void zend_register_weakref_ce(void) /* {{{ */
{
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY(ce, "WeakReference", class_WeakReference_methods);
- zend_ce_weakref = zend_register_internal_class(&ce);
- zend_ce_weakref->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ zend_ce_weakref = register_class_WeakReference();
zend_ce_weakref->create_object = zend_weakref_new;
zend_ce_weakref->serialize = zend_class_serialize_deny;
@@ -613,11 +609,7 @@ void zend_register_weakref_ce(void) /* {{{ */
zend_weakref_handlers.free_obj = zend_weakref_free;
zend_weakref_handlers.clone_obj = NULL;
- INIT_CLASS_ENTRY(ce, "WeakMap", class_WeakMap_methods);
- zend_ce_weakmap = zend_register_internal_class(&ce);
- zend_ce_weakmap->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
- zend_class_implements(
- zend_ce_weakmap, 3, zend_ce_arrayaccess, zend_ce_countable, zend_ce_aggregate);
+ zend_ce_weakmap = register_class_WeakMap(zend_ce_arrayaccess, zend_ce_countable, zend_ce_aggregate);
zend_ce_weakmap->create_object = zend_weakmap_create_object;
zend_ce_weakmap->get_iterator = zend_weakmap_get_iterator;
diff --git a/Zend/zend_weakrefs.stub.php b/Zend/zend_weakrefs.stub.php
index c341e0a463..e8c0c3c92d 100644
--- a/Zend/zend_weakrefs.stub.php
+++ b/Zend/zend_weakrefs.stub.php
@@ -1,7 +1,8 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+/** @strict-properties */
final class WeakReference
{
public function __construct() {}
@@ -11,6 +12,7 @@ final class WeakReference
public function get(): ?object {}
}
+/** @strict-properties */
final class WeakMap implements ArrayAccess, Countable, IteratorAggregate
{
/**
diff --git a/Zend/zend_weakrefs_arginfo.h b/Zend/zend_weakrefs_arginfo.h
index da953a9800..d737faebe5 100644
--- a/Zend/zend_weakrefs_arginfo.h
+++ b/Zend/zend_weakrefs_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 0569bc7e10a1ec15a3a9eec481da27b647eb1d1d */
+ * Stub hash: 97fff017125955a3def85d9ed5a31746de7b808a */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_WeakReference___construct, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -63,3 +63,26 @@ static const zend_function_entry class_WeakMap_methods[] = {
ZEND_ME(WeakMap, getIterator, arginfo_class_WeakMap_getIterator, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_WeakReference(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "WeakReference", class_WeakReference_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_WeakMap(zend_class_entry *class_entry_ArrayAccess, zend_class_entry *class_entry_Countable, zend_class_entry *class_entry_IteratorAggregate)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "WeakMap", class_WeakMap_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ zend_class_implements(class_entry, 3, class_entry_ArrayAccess, class_entry_Countable, class_entry_IteratorAggregate);
+
+ return class_entry;
+}
diff --git a/appveyor/build.bat b/appveyor/build.bat
index c8005734e1..3593228389 100644
--- a/appveyor/build.bat
+++ b/appveyor/build.bat
@@ -20,7 +20,7 @@ if not exist "%SDK_RUNNER%" (
if not exist "%PHP_BUILD_CACHE_SDK_DIR%" (
echo Cloning remote SDK repository
- git clone --branch %SDK_BRANCH% %SDK_REMOTE% "%PHP_BUILD_CACHE_SDK_DIR%" 2>&1
+ git clone --branch %SDK_BRANCH% %SDK_REMOTE% --depth 1 "%PHP_BUILD_CACHE_SDK_DIR%" 2>&1
)
for /f "tokens=*" %%a in ('type %PHP_BUILD_CACHE_SDK_DIR%\VERSION') do set GOT_SDK_VER=%%a
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 6f6eb1d6cf..bf67866c7a 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -85,7 +85,7 @@ jobs:
configurationName: DEBUG_ZTS_MSAN
configurationParameters: '--enable-debug --enable-zts'
runTestsParameters: --msan
- timeoutInMinutes: 90
+ timeoutInMinutes: 120
- template: azure/community_job.yml
parameters:
configurationName: COMMUNITY
@@ -103,3 +103,12 @@ jobs:
configurationName: DEBUG_NTS_FILE_CACHE
configurationParameters: '--enable-debug --disable-zts'
timeoutInMinutes: 90
+ - template: azure/job.yml
+ parameters:
+ configurationName: DEBUG_NTS_REPEAT
+ configurationParameters: '--enable-debug --disable-zts'
+ runTestsParameters: '--repeat 2'
+ - template: azure/libmysqlclient_job.yml
+ parameters:
+ configurationName: LIBMYSQLCLIENT_DEBUG_NTS
+ configurationParameters: '--enable-debug --disable-zts'
diff --git a/azure/apt.yml b/azure/apt.yml
index 71f58ce8da..9166509dcc 100644
--- a/azure/apt.yml
+++ b/azure/apt.yml
@@ -40,8 +40,25 @@ steps:
postgresql-contrib \
snmpd \
snmp-mibs-downloader \
+ freetds-dev \
unixodbc-dev \
llvm \
- libc-client-dev libkrb5-dev dovecot-core dovecot-pop3d dovecot-imapd \
+ libc-client-dev \
+ libkrb5-dev \
+ dovecot-core \
+ dovecot-pop3d \
+ dovecot-imapd \
+ sendmail \
+ firebird-dev \
${{ parameters.packages }}
displayName: 'APT'
+ - script: |
+ mkdir /opt/oracle
+ wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip
+ unzip instantclient-basiclite-linuxx64.zip
+ wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-sdk-linuxx64.zip
+ unzip instantclient-sdk-linuxx64.zip
+ mv instantclient_*_* /opt/oracle/instantclient
+ # Interferes with libldap2 headers.
+ rm /opt/oracle/instantclient/sdk/include/ldap.h
+ displayName: 'Install Oracle Instant Client'
diff --git a/azure/configure.yml b/azure/configure.yml
index 0bfbf6d92e..9869de514e 100644
--- a/azure/configure.yml
+++ b/azure/configure.yml
@@ -61,6 +61,11 @@ steps:
--with-imap \
--with-kerberos \
--with-imap-ssl \
+ --with-pdo-odbc=unixODBC,/usr \
+ --with-pdo-firebird \
+ --with-pdo-dblib \
+ --with-pdo-oci=shared,instantclient,/opt/oracle/instantclient \
+ --with-oci8=shared,instantclient,/opt/oracle/instantclient \
--enable-werror \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d
diff --git a/azure/coverage_job.yml b/azure/coverage_job.yml
index 184ebcfafa..2b8ff10efc 100644
--- a/azure/coverage_job.yml
+++ b/azure/coverage_job.yml
@@ -10,6 +10,7 @@ jobs:
pool:
vmImage: 'ubuntu-18.04'
steps:
+ - template: mssql.yml
- template: apt.yml
- script: |
sudo -H pip install gcovr
diff --git a/azure/file_cache_job.yml b/azure/file_cache_job.yml
index 7c8b392a66..1c5fda3f80 100644
--- a/azure/file_cache_job.yml
+++ b/azure/file_cache_job.yml
@@ -10,6 +10,7 @@ jobs:
pool:
vmImage: 'ubuntu-18.04'
steps:
+ - template: mssql.yml
- template: apt.yml
- template: configure.yml
parameters:
diff --git a/azure/job.yml b/azure/job.yml
index f85744eede..f354c4d717 100644
--- a/azure/job.yml
+++ b/azure/job.yml
@@ -10,6 +10,7 @@ jobs:
pool:
vmImage: 'ubuntu-20.04'
steps:
+ - template: mssql.yml
- template: apt.yml
- template: configure.yml
parameters:
diff --git a/azure/libmysqlclient_job.yml b/azure/libmysqlclient_job.yml
new file mode 100644
index 0000000000..e61b8de95f
--- /dev/null
+++ b/azure/libmysqlclient_job.yml
@@ -0,0 +1,37 @@
+parameters:
+ configurationName: ''
+ configurationParameters: ''
+ runTestsParameters: ''
+ timeoutInMinutes: 60
+
+jobs:
+ - job: ${{ parameters.configurationName }}
+ timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
+ pool:
+ vmImage: 'ubuntu-20.04'
+ steps:
+ - script: |
+ sudo apt-get update -y | true
+ sudo apt install bison re2c
+ displayName: 'APT'
+ - script: |
+ set -o
+ sudo service mysql start
+ mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test"
+ # Ensure local_infile tests can run.
+ mysql -uroot -proot -e "SET GLOBAL local_infile = true"
+ displayName: 'Setup MySQL server'
+ # Does not support caching_sha2_auth :(
+ #- template: libmysqlclient_test.yml
+ # parameters:
+ # configurationName: ${{ parameters.configurationName }} - MySQL 5.6.49
+ # libmysql: mysql-5.6.49-linux-glibc2.12-x86_64.tar.gz
+ - template: libmysqlclient_test.yml
+ parameters:
+ configurationName: ${{ parameters.configurationName }} - MySQL 5.7.31
+ libmysql: mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
+ - template: libmysqlclient_test.yml
+ parameters:
+ configurationName: ${{ parameters.configurationName }} - MySQL 8.0.21
+ libmysql: mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz
+ configurationParameters: ${{ parameters.configurationParameters }} --enable-werror
diff --git a/azure/libmysqlclient_test.yml b/azure/libmysqlclient_test.yml
new file mode 100644
index 0000000000..c163345dc4
--- /dev/null
+++ b/azure/libmysqlclient_test.yml
@@ -0,0 +1,53 @@
+parameters:
+ configurationName: ''
+ configurationParameters: ''
+ libmysql: ''
+
+steps:
+ - script: |
+ set -e
+ LIBMYSQL=${{ parameters.libmysql }}
+ MYSQL_BASE=${LIBMYSQL%%-linux-*}
+ MYSQL_VERSION=${MYSQL_BASE#*-}
+ MYSQL_DIR=$HOME/$MYSQL_BASE
+ mkdir -p $MYSQL_DIR
+ URL=https://cdn.mysql.com/Downloads/MySQL-${MYSQL_VERSION%.*}/$LIBMYSQL
+ wget -nv $URL
+ tar -xf $LIBMYSQL --strip-components=1 -C $MYSQL_DIR
+ PDO_MYSQL=${MYSQL_DIR}
+ MYSQLI=${MYSQL_DIR}/bin/mysql_config
+ ./buildconf --force
+ ./configure ${{ parameters.configurationParameters }} \
+ --enable-option-checking=fatal \
+ --disable-all \
+ --enable-pdo \
+ --with-pdo-mysql=${PDO_MYSQL} \
+ --with-mysqli=${MYSQLI}
+ make clean
+ make -j$(/usr/bin/nproc) >/dev/null
+ displayName: 'Build ${{ parameters.configurationName }}'
+ condition: or(succeeded(), failed())
+ - script: |
+ export MYSQL_TEST_USER=root
+ export MYSQL_TEST_PASSWD=root
+ export PDO_MYSQL_TEST_DSN="mysql:host=127.0.0.1;dbname=test"
+ export PDO_MYSQL_TEST_HOST=127.0.0.1
+ export PDO_MYSQL_TEST_USER=root
+ export PDO_MYSQL_TEST_PASS=root
+ export TEST_PHP_JUNIT=junit.xml
+ export REPORT_EXIT_STATUS=no
+ rm -rf junit.xml | true
+ sapi/cli/php run-tests.php -P -q \
+ -g FAIL,XFAIL,BORK,WARN,LEAK,XLEAK,SKIP \
+ --offline --show-diff --show-slow 1000 --set-timeout 120 \
+ ext/pdo_mysql
+ displayName: 'Test ${{ parameters.configurationName }}'
+ condition: or(succeeded(), failed())
+ - task: PublishTestResults@2
+ inputs:
+ testResultsFormat: 'JUnit'
+ testResultsFiles: junit.xml
+ testRunTitle: '${{ parameters.configurationName }}'
+ failTaskOnFailedTests: true
+ displayName: 'Export ${{ parameters.configurationName }} Results'
+ condition: or(succeeded(), failed())
diff --git a/azure/macos/job.yml b/azure/macos/job.yml
index 39fe19268b..ed2e8d9d22 100644
--- a/azure/macos/job.yml
+++ b/azure/macos/job.yml
@@ -21,7 +21,6 @@ jobs:
./configure ${{ parameters.configurationParameters }} \
--enable-option-checking=fatal \
--prefix=/usr/local \
- --disable-phpdbg \
--enable-fpm \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
@@ -72,7 +71,7 @@ jobs:
displayName: 'Configure Build'
- script: |
export PATH="/usr/local/opt/bison/bin:$PATH"
- make -j$(sysctl -n hw.ncpu) >/dev/null
+ make -j$(sysctl -n hw.logicalcpu) >/dev/null
displayName: 'Make Build'
- script: |
sudo make install
diff --git a/azure/mssql.yml b/azure/mssql.yml
new file mode 100644
index 0000000000..09b2af9617
--- /dev/null
+++ b/azure/mssql.yml
@@ -0,0 +1,5 @@
+# this template should be included close to the beginning, before setup.yml
+# the container needs time to come up or the sqlcmd operation in setup.yml will have a login timeout
+steps:
+ - script: docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" -p 1433:1433 --name sql1 -h sql1 -d mcr.microsoft.com/mssql/server:2019-CU8-ubuntu-16.04
+ displayName: 'Start MSSQL container'
diff --git a/azure/setup.yml b/azure/setup.yml
index 489df88159..6164d12d81 100644
--- a/azure/setup.yml
+++ b/azure/setup.yml
@@ -5,8 +5,12 @@ steps:
sudo service postgresql start
sudo service slapd start
mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test"
+ # Ensure local_infile tests can run.
+ mysql -uroot -proot -e "SET GLOBAL local_infile = true"
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';"
sudo -u postgres psql -c "CREATE DATABASE test;"
+ docker exec sql1 /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U SA -P "<YourStrong@Passw0rd>" -Q "create login pdo_test with password='password', check_policy=off; create user pdo_test for login pdo_test; grant alter, control to pdo_test;"
+ sudo locale-gen de_DE
displayName: 'Setup'
- script: ./azure/setup-slapd.sh
displayName: 'Configure slapd'
diff --git a/azure/test.yml b/azure/test.yml
index 4a1f97b734..95fa7b4a09 100644
--- a/azure/test.yml
+++ b/azure/test.yml
@@ -9,6 +9,9 @@ steps:
export PDO_MYSQL_TEST_DSN="mysql:host=localhost;dbname=test"
export PDO_MYSQL_TEST_USER=root
export PDO_MYSQL_TEST_PASS=root
+ export PDO_DBLIB_TEST_DSN="dblib:host=127.0.0.1;dbname=master;version=7.0"
+ export PDO_DBLIB_TEST_USER="pdo_test"
+ export PDO_DBLIB_TEST_PASS="password"
export TEST_PHP_JUNIT=junit.xml
export REPORT_EXIT_STATUS=no
export SKIP_IO_CAPTURE_TESTS=1
diff --git a/build/Makefile.global b/build/Makefile.global
index 6566d052de..2ff838cb33 100644
--- a/build/Makefile.global
+++ b/build/Makefile.global
@@ -111,7 +111,7 @@ test: all
clean:
find . -name \*.gcno -o -name \*.gcda | xargs rm -f
- find . -name \*.lo -o -name \*.o | xargs rm -f
+ find . -name \*.lo -o -name \*.o -o -name \*.dep | xargs rm -f
find . -name \*.la -o -name \*.a | xargs rm -f
find . -name \*.so | xargs rm -f
find . -name .libs -a -type d|xargs rm -rf
@@ -142,23 +142,13 @@ prof-clean:
prof-use:
CCACHE_DISABLE=1 $(MAKE) PROF_FLAGS=-fprofile-use all
-# only php above 7.1.0 supports nullable return type
%_arginfo.h: %.stub.php
@if test -e "$(top_srcdir)/build/gen_stub.php"; then \
- if test ! -z "$(PHP_EXECUTABLE)" && test -x "$(PHP_EXECUTABLE)"; then \
+ if test ! -z "$(PHP)"; then \
echo Parse $< to generate $@;\
- $(PHP_EXECUTABLE) $(top_srcdir)/build/gen_stub.php $<; \
- elif type php >/dev/null 2>/dev/null; then \
- if test `php -v | head -n1 | cut -d" " -f 2 | sed "s/$$/\n7.0.99/" | sort -rV | head -n1` != "7.0.99"; then \
- echo Parse $< to generate $@;\
- php $(top_srcdir)/build/gen_stub.php $<; \
- fi; \
+ $(PHP) $(top_srcdir)/build/gen_stub.php $<; \
fi; \
fi;
-# As we don't track includes, this is just a heuristic
-%.c: %_arginfo.h
- @touch $@
-
.PHONY: all clean install distclean test prof-gen prof-clean prof-use
.NOEXPORT:
diff --git a/build/gen_stub.php b/build/gen_stub.php
index d84851091b..084e142e34 100755
--- a/build/gen_stub.php
+++ b/build/gen_stub.php
@@ -2,11 +2,13 @@
<?php declare(strict_types=1);
use PhpParser\Comment\Doc as DocComment;
+use PhpParser\ConstExprEvaluator;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\Class_;
+use PhpParser\Node\Stmt\Interface_;
use PhpParser\PrettyPrinter\Standard;
use PhpParser\PrettyPrinterAbstract;
@@ -54,6 +56,7 @@ function processStubFile(string $stubFile, Context $context): ?FileInfo {
initPhpParser();
$fileInfo = parseStubFile($stubCode);
+
$arginfoCode = generateArgInfoCode($fileInfo, $stubHash);
if (($context->forceRegeneration || $stubHash !== $oldStubHash) && file_put_contents($arginfoFile, $arginfoCode)) {
echo "Saved $arginfoFile\n";
@@ -63,11 +66,15 @@ function processStubFile(string $stubFile, Context $context): ?FileInfo {
foreach ($fileInfo->getAllFuncInfos() as $funcInfo) {
$funcInfo->discardInfoForOldPhpVersions();
}
+ foreach ($fileInfo->getAllPropertyInfos() as $propertyInfo) {
+ $propertyInfo->discardInfoForOldPhpVersions();
+ }
+
$arginfoCode = generateArgInfoCode($fileInfo, $stubHash);
if (($context->forceRegeneration || $stubHash !== $oldStubHash) && file_put_contents($legacyFile, $arginfoCode)) {
echo "Saved $legacyFile\n";
}
- }
+ }
return $fileInfo;
} catch (Exception $e) {
@@ -293,7 +300,7 @@ class Type {
return null;
}
- public function toArginfoType(): ?ArginfoType {
+ public function toArginfoType(): ArginfoType {
$classTypes = [];
$builtinTypes = [];
foreach ($this->types as $type) {
@@ -457,6 +464,24 @@ class ArgInfo {
}
}
+class PropertyName {
+ /** @var Name */
+ public $class;
+ /** @var string */
+ public $property;
+
+ public function __construct(Name $class, string $property)
+ {
+ $this->class = $class;
+ $this->property = $property;
+ }
+
+ public function __toString()
+ {
+ return $this->class->toString() . "::$" . $this->property;
+ }
+}
+
interface FunctionOrMethodName {
public function getDeclaration(): string;
public function getArgInfoName(): string;
@@ -805,6 +830,14 @@ class FuncInfo {
}
}
+ public function discardInfoForOldPhpVersions(): void {
+ $this->return->type = null;
+ foreach ($this->args as $arg) {
+ $arg->type = null;
+ $arg->defaultValue = null;
+ }
+ }
+
private function getFlagsAsArginfoString(): string
{
$flags = "ZEND_ACC_PUBLIC";
@@ -941,14 +974,6 @@ class FuncInfo {
return $methodSynopsis;
}
- public function discardInfoForOldPhpVersions(): void {
- $this->return->type = null;
- foreach ($this->args as $arg) {
- $arg->type = null;
- $arg->defaultValue = null;
- }
- }
-
private function appendMethodSynopsisTypeToElement(DOMDocument $doc, DOMElement $elementToAppend, Type $type) {
if (count($type->types) > 1) {
$typeElement = $doc->createElement('type');
@@ -966,16 +991,321 @@ class FuncInfo {
}
}
+class PropertyInfo
+{
+ /** @var PropertyName */
+ public $name;
+ /** @var int */
+ public $flags;
+ /** @var Type|null */
+ public $type;
+ /** @var Expr|null */
+ public $defaultValue;
+
+ public function __construct(PropertyName $name, int $flags, ?Type $type, ?Expr $defaultValue)
+ {
+ $this->name = $name;
+ $this->flags = $flags;
+ $this->type = $type;
+ $this->defaultValue = $defaultValue;
+ }
+
+ public function discardInfoForOldPhpVersions(): void {
+ $this->type = null;
+ }
+
+ public function getDeclaration(): string {
+ $code = "\n";
+
+ $propertyName = $this->name->property;
+
+ $defaultValueConstant = false;
+ if ($this->defaultValue === null) {
+ $defaultValue = null;
+ $defaultValueType = "undefined";
+ } else {
+ $evaluator = new ConstExprEvaluator(
+ function (Expr $expr) use (&$defaultValueConstant) {
+ if ($expr instanceof Expr\ConstFetch) {
+ $defaultValueConstant = true;
+ return null;
+ }
+
+ throw new Exception("Property $this->name has an unsupported default value");
+ }
+ );
+ $defaultValue = $evaluator->evaluateDirectly($this->defaultValue);
+ $defaultValueType = gettype($defaultValue);
+ }
+
+ if ($defaultValueConstant) {
+ echo "Skipping code generation for property $this->name, because it has a constant default value\n";
+ return "";
+ }
+
+ $typeCode = "";
+ if ($this->type) {
+ $arginfoType = $this->type->toArginfoType();
+ if ($arginfoType->hasClassType()) {
+ if (count($arginfoType->classTypes) >= 2) {
+ foreach ($arginfoType->classTypes as $classType) {
+ $className = $classType->name;
+ $code .= "\tzend_string *property_{$propertyName}_class_{$className} = zend_string_init(\"$className\", sizeof(\"$className\") - 1, 1);\n";
+ }
+
+ $classTypeCount = count($arginfoType->classTypes);
+ $code .= "\tzend_type_list *property_{$propertyName}_type_list = malloc(ZEND_TYPE_LIST_SIZE($classTypeCount));\n";
+ $code .= "\tproperty_{$propertyName}_type_list->num_types = $classTypeCount;\n";
+
+ foreach ($arginfoType->classTypes as $k => $classType) {
+ $className = $classType->name;
+ $code .= "\tproperty_{$propertyName}_type_list->types[$k] = (zend_type) ZEND_TYPE_INIT_CLASS(property_{$propertyName}_class_{$className}, 0, 0);\n";
+ }
+
+ $typeMaskCode = $this->type->toArginfoType()->toTypeMask();
+
+ $code .= "\tzend_type property_{$propertyName}_type = ZEND_TYPE_INIT_PTR(property_{$propertyName}_type_list, _ZEND_TYPE_LIST_BIT, 0, $typeMaskCode);\n";
+ $typeCode = "property_{$propertyName}_type";
+ } else {
+ $className = $arginfoType->classTypes[0]->name;
+ $code .= "\tzend_string *property_{$propertyName}_class_{$className} = zend_string_init(\"$className\", sizeof(\"$className\")-1, 1);\n";
+
+ $typeCode = "(zend_type) ZEND_TYPE_INIT_CLASS(property_{$propertyName}_class_{$className}, 0, " . $arginfoType->toTypeMask() . ")";
+ }
+ } else {
+ $typeCode = "(zend_type) ZEND_TYPE_INIT_MASK(" . $arginfoType->toTypeMask() . ")";
+ }
+ }
+
+ $code .= $this->initializeValue($defaultValueType, $defaultValue, $this->type !== null);
+
+ $code .= "\tzend_string *property_{$propertyName}_name = zend_string_init(\"$propertyName\", sizeof(\"$propertyName\") - 1, 1);\n";
+ $nameCode = "property_{$propertyName}_name";
+
+ if ($this->type !== null) {
+ $code .= "\tzend_declare_typed_property(class_entry, $nameCode, &property_{$propertyName}_default_value, " . $this->getFlagsAsString() . ", NULL, $typeCode);\n";
+ } else {
+ $code .= "\tzend_declare_property_ex(class_entry, $nameCode, &property_{$propertyName}_default_value, " . $this->getFlagsAsString() . ", NULL);\n";
+ }
+ $code .= "\tzend_string_release(property_{$propertyName}_name);\n";
+
+ return $code;
+ }
+
+ /**
+ * @param mixed $value
+ */
+ private function initializeValue(string $type, $value, bool $isTyped): string
+ {
+ $name = $this->name->property;
+ $zvalName = "property_{$name}_default_value";
+
+ $code = "\tzval $zvalName;\n";
+
+ switch ($type) {
+ case "undefined":
+ if ($isTyped) {
+ $code .= "\tZVAL_UNDEF(&$zvalName);\n";
+ } else {
+ $code .= "\tZVAL_NULL(&$zvalName);\n";
+ }
+ break;
+
+ case "NULL":
+ $code .= "\tZVAL_NULL(&$zvalName);\n";
+ break;
+
+ case "boolean":
+ $code .= "\tZVAL_BOOL(&$zvalName, " . ((int) $value) . ");\n";
+ break;
+
+ case "integer":
+ $code .= "\tZVAL_LONG(&$zvalName, $value);\n";
+ break;
+
+ case "double":
+ $code .= "\tZVAL_DOUBLE(&$zvalName, $value);\n";
+ break;
+
+ case "string":
+ if ($value === "") {
+ $code .= "\tZVAL_EMPTY_STRING(&$zvalName);\n";
+ } else {
+ $code .= "\tzend_string *{$zvalName}_str = zend_string_init(\"$value\", sizeof(\"$value\") - 1, 1);\n";
+ $code .= "\tZVAL_STR(&$zvalName, {$zvalName}_str);\n";
+ }
+ break;
+
+ case "array":
+ if (empty($value)) {
+ $code .= "\tZVAL_EMPTY_ARRAY(&$zvalName);\n";
+ } else {
+ throw new Exception("Unimplemented property default value");
+ }
+ break;
+
+ default:
+ throw new Exception("Invalid property default value");
+ }
+
+ return $code;
+ }
+
+ private function getFlagsAsString(): string
+ {
+ $flags = "ZEND_ACC_PUBLIC";
+ if ($this->flags & Class_::MODIFIER_PROTECTED) {
+ $flags = "ZEND_ACC_PROTECTED";
+ } elseif ($this->flags & Class_::MODIFIER_PRIVATE) {
+ $flags = "ZEND_ACC_PRIVATE";
+ }
+
+ if ($this->flags & Class_::MODIFIER_STATIC) {
+ $flags .= "|ZEND_ACC_STATIC";
+ }
+
+ return $flags;
+ }
+}
+
class ClassInfo {
/** @var Name */
public $name;
+ /** @var int */
+ public $flags;
+ /** @var string */
+ public $type;
+ /** @var string|null */
+ public $alias;
+ /** @var bool */
+ public $isDeprecated;
+ /** @var bool */
+ public $isStrictProperties;
+ /** @var Name[] */
+ public $extends;
+ /** @var Name[] */
+ public $implements;
+ /** @var PropertyInfo[] */
+ public $propertyInfos;
/** @var FuncInfo[] */
public $funcInfos;
- public function __construct(Name $name, array $funcInfos) {
+ /**
+ * @param Name[] $extends
+ * @param Name[] $implements
+ * @param PropertyInfo[] $propertyInfos
+ * @param FuncInfo[] $funcInfos
+ */
+ public function __construct(
+ Name $name,
+ int $flags,
+ string $type,
+ ?string $alias,
+ bool $isDeprecated,
+ bool $isStrictProperties,
+ array $extends,
+ array $implements,
+ array $propertyInfos,
+ array $funcInfos
+ ) {
$this->name = $name;
+ $this->flags = $flags;
+ $this->type = $type;
+ $this->alias = $alias;
+ $this->isDeprecated = $isDeprecated;
+ $this->isStrictProperties = $isStrictProperties;
+ $this->extends = $extends;
+ $this->implements = $implements;
+ $this->propertyInfos = $propertyInfos;
$this->funcInfos = $funcInfos;
}
+
+ public function getRegistration(): string
+ {
+ $params = [];
+ foreach ($this->extends as $extends) {
+ $params[] = "zend_class_entry *class_entry_" . implode("_", $extends->parts);
+ }
+ foreach ($this->implements as $implements) {
+ $params[] = "zend_class_entry *class_entry_" . implode("_", $implements->parts);
+ }
+
+ $escapedName = implode("_", $this->name->parts);
+
+ $code = "static zend_class_entry *register_class_$escapedName(" . (empty($params) ? "void" : implode(", ", $params)) . ")\n";
+
+ $code .= "{\n";
+ $code .= "\tzend_class_entry ce, *class_entry;\n\n";
+ if (count($this->name->parts) > 1) {
+ $className = $this->name->getLast();
+ $namespace = addslashes((string) $this->name->slice(0, -1));
+
+ $code .= "\tINIT_NS_CLASS_ENTRY(ce, \"$namespace\", \"$className\", class_{$escapedName}_methods);\n";
+ } else {
+ $code .= "\tINIT_CLASS_ENTRY(ce, \"$this->name\", class_{$escapedName}_methods);\n";
+ }
+
+ if ($this->type === "class" || $this->type === "trait") {
+ $code .= "\tclass_entry = zend_register_internal_class_ex(&ce, " . (isset($this->extends[0]) ? "class_entry_" . str_replace("\\", "_", $this->extends[0]->toString()) : "NULL") . ");\n";
+ } else {
+ $code .= "\tclass_entry = zend_register_internal_interface(&ce);\n";
+ }
+ if ($this->getFlagsAsString()) {
+ $code .= "\tclass_entry->ce_flags |= " . $this->getFlagsAsString() . ";\n";
+ }
+
+ $implements = array_map(
+ function (Name $item) {
+ return "class_entry_" . implode("_", $item->parts);
+ },
+ $this->type === "interface" ? $this->extends : $this->implements
+ );
+
+ if (!empty($implements)) {
+ $code .= "\tzend_class_implements(class_entry, " . count($implements) . ", " . implode(", ", $implements) . ");\n";
+ }
+
+ if ($this->alias) {
+ $code .= "\tzend_register_class_alias(\"" . str_replace("\\", "_", $this->alias) . "\", class_entry);\n";
+ }
+
+ foreach ($this->propertyInfos as $property) {
+ $code .= $property->getDeclaration();
+ }
+
+ $code .= "\n\treturn class_entry;\n";
+
+ $code .= "}\n";
+
+ return $code;
+ }
+
+ private function getFlagsAsString(): string
+ {
+ $flags = [];
+
+ if ($this->type === "trait") {
+ $flags[] = "ZEND_ACC_TRAIT";
+ }
+
+ if ($this->flags & Class_::MODIFIER_FINAL) {
+ $flags[] = "ZEND_ACC_FINAL";
+ }
+
+ if ($this->flags & Class_::MODIFIER_ABSTRACT) {
+ $flags[] = "ZEND_ACC_ABSTRACT";
+ }
+
+ if ($this->isDeprecated) {
+ $flags[] = "ZEND_ACC_DEPRECATED";
+ }
+
+ if ($this->isStrictProperties) {
+ $flags[] = "ZEND_ACC_NO_DYNAMIC_PROPERTIES";
+ }
+
+ return implode("|", $flags);
+ }
}
class FileInfo {
@@ -989,6 +1319,8 @@ class FileInfo {
public $declarationPrefix = "";
/** @var bool */
public $generateLegacyArginfo = false;
+ /** @var bool */
+ public $generateClassEntries = false;
/**
* @return iterable<FuncInfo>
@@ -999,6 +1331,15 @@ class FileInfo {
yield from $classInfo->funcInfos;
}
}
+
+ /**
+ * @return iterable<PropertyInfo>
+ */
+ public function getAllPropertyInfos(): iterable {
+ foreach ($this->classInfos as $classInfo) {
+ yield from $classInfo->propertyInfos;
+ }
+ }
}
class DocCommentTag {
@@ -1028,7 +1369,7 @@ class DocCommentTag {
if ($this->name === "param") {
preg_match('/^\s*([\w\|\\\\\[\]]+)\s*\$\w+.*$/', $value, $matches);
} elseif ($this->name === "return") {
- preg_match('/^\s*([\w\|\\\\\[\]]+)\s*$/', $value, $matches);
+ preg_match('/^\s*([\w\|\\\\\[\]]+)(\s+|$)/', $value, $matches);
}
if (isset($matches[1]) === false) {
@@ -1082,128 +1423,223 @@ function parseFunctionLike(
Node\FunctionLike $func,
?string $cond
): FuncInfo {
- $comment = $func->getDocComment();
- $paramMeta = [];
- $aliasType = null;
- $alias = null;
- $isDeprecated = false;
- $verify = true;
- $docReturnType = null;
- $docParamTypes = [];
-
- if ($comment) {
- $tags = parseDocComment($comment);
- foreach ($tags as $tag) {
- if ($tag->name === 'prefer-ref') {
- $varName = $tag->getVariableName();
- if (!isset($paramMeta[$varName])) {
- $paramMeta[$varName] = [];
- }
- $paramMeta[$varName]['preferRef'] = true;
- } else if ($tag->name === 'alias' || $tag->name === 'implementation-alias') {
- $aliasType = $tag->name;
- $aliasParts = explode("::", $tag->getValue());
- if (count($aliasParts) === 1) {
- $alias = new FunctionName(new Name($aliasParts[0]));
- } else {
- $alias = new MethodName(new Name($aliasParts[0]), $aliasParts[1]);
+ try {
+ $comment = $func->getDocComment();
+ $paramMeta = [];
+ $aliasType = null;
+ $alias = null;
+ $isDeprecated = false;
+ $verify = true;
+ $docReturnType = null;
+ $docParamTypes = [];
+
+ if ($comment) {
+ $tags = parseDocComment($comment);
+ foreach ($tags as $tag) {
+ if ($tag->name === 'prefer-ref') {
+ $varName = $tag->getVariableName();
+ if (!isset($paramMeta[$varName])) {
+ $paramMeta[$varName] = [];
+ }
+ $paramMeta[$varName]['preferRef'] = true;
+ } else if ($tag->name === 'alias' || $tag->name === 'implementation-alias') {
+ $aliasType = $tag->name;
+ $aliasParts = explode("::", $tag->getValue());
+ if (count($aliasParts) === 1) {
+ $alias = new FunctionName(new Name($aliasParts[0]));
+ } else {
+ $alias = new MethodName(new Name($aliasParts[0]), $aliasParts[1]);
+ }
+ } else if ($tag->name === 'deprecated') {
+ $isDeprecated = true;
+ } else if ($tag->name === 'no-verify') {
+ $verify = false;
+ } else if ($tag->name === 'return') {
+ $docReturnType = $tag->getType();
+ } else if ($tag->name === 'param') {
+ $docParamTypes[$tag->getVariableName()] = $tag->getType();
}
- } else if ($tag->name === 'deprecated') {
- $isDeprecated = true;
- } else if ($tag->name === 'no-verify') {
- $verify = false;
- } else if ($tag->name === 'return') {
- $docReturnType = $tag->getType();
- } else if ($tag->name === 'param') {
- $docParamTypes[$tag->getVariableName()] = $tag->getType();
}
}
- }
- $varNameSet = [];
- $args = [];
- $numRequiredArgs = 0;
- $foundVariadic = false;
- foreach ($func->getParams() as $i => $param) {
- $varName = $param->var->name;
- $preferRef = !empty($paramMeta[$varName]['preferRef']);
- unset($paramMeta[$varName]);
+ $varNameSet = [];
+ $args = [];
+ $numRequiredArgs = 0;
+ $foundVariadic = false;
+ foreach ($func->getParams() as $i => $param) {
+ $varName = $param->var->name;
+ $preferRef = !empty($paramMeta[$varName]['preferRef']);
+ unset($paramMeta[$varName]);
- if (isset($varNameSet[$varName])) {
- throw new Exception("Duplicate parameter name $varName for function $name");
- }
- $varNameSet[$varName] = true;
+ if (isset($varNameSet[$varName])) {
+ throw new Exception("Duplicate parameter name $varName");
+ }
+ $varNameSet[$varName] = true;
- if ($preferRef) {
- $sendBy = ArgInfo::SEND_PREFER_REF;
- } else if ($param->byRef) {
- $sendBy = ArgInfo::SEND_BY_REF;
- } else {
- $sendBy = ArgInfo::SEND_BY_VAL;
- }
+ if ($preferRef) {
+ $sendBy = ArgInfo::SEND_PREFER_REF;
+ } else if ($param->byRef) {
+ $sendBy = ArgInfo::SEND_BY_REF;
+ } else {
+ $sendBy = ArgInfo::SEND_BY_VAL;
+ }
+
+ if ($foundVariadic) {
+ throw new Exception("Only the last parameter can be variadic");
+ }
+
+ $type = $param->type ? Type::fromNode($param->type) : null;
+ if ($type === null && !isset($docParamTypes[$varName])) {
+ throw new Exception("Missing parameter type");
+ }
+
+ if ($param->default instanceof Expr\ConstFetch &&
+ $param->default->name->toLowerString() === "null" &&
+ $type && !$type->isNullable()
+ ) {
+ $simpleType = $type->tryToSimpleType();
+ if ($simpleType === null) {
+ throw new Exception("Parameter $varName has null default, but is not nullable");
+ }
+ }
+
+ $foundVariadic = $param->variadic;
- if ($foundVariadic) {
- throw new Exception("Error in function $name: only the last parameter can be variadic");
+ $args[] = new ArgInfo(
+ $varName,
+ $sendBy,
+ $param->variadic,
+ $type,
+ isset($docParamTypes[$varName]) ? Type::fromPhpDoc($docParamTypes[$varName]) : null,
+ $param->default ? $prettyPrinter->prettyPrintExpr($param->default) : null
+ );
+ if (!$param->default && !$param->variadic) {
+ $numRequiredArgs = $i + 1;
+ }
}
- $type = $param->type ? Type::fromNode($param->type) : null;
- if ($type === null && !isset($docParamTypes[$varName])) {
- throw new Exception("Missing parameter type for function $name()");
+ foreach (array_keys($paramMeta) as $var) {
+ throw new Exception("Found metadata for invalid param $var");
}
- if ($param->default instanceof Expr\ConstFetch &&
- $param->default->name->toLowerString() === "null" &&
- $type && !$type->isNullable()
- ) {
- $simpleType = $type->tryToSimpleType();
- if ($simpleType === null) {
- throw new Exception(
- "Parameter $varName of function $name has null default, but is not nullable");
- }
+ $returnType = $func->getReturnType();
+ if ($returnType === null && $docReturnType === null && !$name->isConstructor() && !$name->isDestructor()) {
+ throw new Exception("Missing return type");
}
- $foundVariadic = $param->variadic;
+ $return = new ReturnInfo(
+ $func->returnsByRef(),
+ $returnType ? Type::fromNode($returnType) : null,
+ $docReturnType ? Type::fromPhpDoc($docReturnType) : null
+ );
- $args[] = new ArgInfo(
- $varName,
- $sendBy,
- $param->variadic,
- $type,
- isset($docParamTypes[$varName]) ? Type::fromPhpDoc($docParamTypes[$varName]) : null,
- $param->default ? $prettyPrinter->prettyPrintExpr($param->default) : null
+ return new FuncInfo(
+ $name,
+ $classFlags,
+ $flags,
+ $aliasType,
+ $alias,
+ $isDeprecated,
+ $verify,
+ $args,
+ $return,
+ $numRequiredArgs,
+ $cond
);
- if (!$param->default && !$param->variadic) {
- $numRequiredArgs = $i + 1;
+ } catch (Exception $e) {
+ throw new Exception($name . "(): " .$e->getMessage());
+ }
+}
+
+function parseProperty(
+ Name $class,
+ int $flags,
+ Stmt\PropertyProperty $property,
+ ?Node $type,
+ ?DocComment $comment
+): PropertyInfo {
+ $docType = false;
+
+ if ($comment) {
+ $tags = parseDocComment($comment);
+ foreach ($tags as $tag) {
+ if ($tag->name === 'var') {
+ $docType = true;
+ }
}
}
- foreach (array_keys($paramMeta) as $var) {
- throw new Exception("Found metadata for invalid param $var of function $name");
+ $propertyType = $type ? Type::fromNode($type) : null;
+ if ($propertyType === null && !$docType) {
+ throw new Exception("Missing type for property $class::\$$property->name");
}
- $returnType = $func->getReturnType();
- if ($returnType === null && $docReturnType === null && !$name->isConstructor() && !$name->isDestructor()) {
- throw new Exception("Missing return type for function $name()");
+ if ($property->default instanceof Expr\ConstFetch &&
+ $property->default->name->toLowerString() === "null" &&
+ $propertyType && !$propertyType->isNullable()
+ ) {
+ $simpleType = $propertyType->tryToSimpleType();
+ if ($simpleType === null) {
+ throw new Exception(
+ "Property $class::\$$property->name has null default, but is not nullable");
+ }
}
- $return = new ReturnInfo(
- $func->returnsByRef(),
- $returnType ? Type::fromNode($returnType) : null,
- $docReturnType ? Type::fromPhpDoc($docReturnType) : null
+ return new PropertyInfo(
+ new PropertyName($class, $property->name->__toString()),
+ $flags,
+ $propertyType,
+ $property->default
);
+}
+
+/**
+ * @param PropertyInfo[] $properties
+ * @param FuncInfo[] $methods
+ */
+function parseClass(Name $name, Stmt\ClassLike $class, array $properties, array $methods): ClassInfo {
+ $flags = $class instanceof Class_ ? $class->flags : 0;
+ $comment = $class->getDocComment();
+ $alias = null;
+ $isDeprecated = false;
+ $isStrictProperties = false;
- return new FuncInfo(
+ if ($comment) {
+ $tags = parseDocComment($comment);
+ foreach ($tags as $tag) {
+ if ($tag->name === 'alias') {
+ $alias = $tag->getValue();
+ } else if ($tag->name === 'deprecated') {
+ $isDeprecated = true;
+ } else if ($tag->name === 'strict-properties') {
+ $isStrictProperties = true;
+ }
+ }
+ }
+
+ $extends = [];
+ $implements = [];
+
+ if ($class instanceof Class_) {
+ if ($class->extends) {
+ $extends[] = $class->extends;
+ }
+ $implements = $class->implements;
+ } elseif ($class instanceof Interface_) {
+ $extends = $class->extends;
+ }
+
+ return new ClassInfo(
$name,
- $classFlags,
$flags,
- $aliasType,
+ $class instanceof Class_ ? "class" : ($class instanceof Interface_ ? "interface" : "trait"),
$alias,
$isDeprecated,
- $verify,
- $args,
- $return,
- $numRequiredArgs,
- $cond
+ $isStrictProperties,
+ $extends,
+ $implements,
+ $properties,
+ $methods
);
}
@@ -1279,6 +1715,7 @@ function handleStatements(FileInfo $fileInfo, array $stmts, PrettyPrinterAbstrac
if ($stmt instanceof Stmt\ClassLike) {
$className = $stmt->namespacedName;
+ $propertyInfos = [];
$methodInfos = [];
foreach ($stmt->stmts as $classStmt) {
$cond = handlePreprocessorConditions($conds, $classStmt);
@@ -1286,7 +1723,7 @@ function handleStatements(FileInfo $fileInfo, array $stmts, PrettyPrinterAbstrac
continue;
}
- if (!$classStmt instanceof Stmt\ClassMethod) {
+ if (!$classStmt instanceof Stmt\ClassMethod && !$classStmt instanceof Stmt\Property) {
throw new Exception("Not implemented {$classStmt->getType()}");
}
@@ -1301,20 +1738,32 @@ function handleStatements(FileInfo $fileInfo, array $stmts, PrettyPrinterAbstrac
}
if (!($flags & Class_::VISIBILITY_MODIFIER_MASK)) {
- throw new Exception("Method visibility modifier is required");
+ throw new Exception("Visibility modifier is required");
}
- $methodInfos[] = parseFunctionLike(
- $prettyPrinter,
- new MethodName($className, $classStmt->name->toString()),
- $classFlags,
- $flags,
- $classStmt,
- $cond
- );
+ if ($classStmt instanceof Stmt\Property) {
+ foreach ($classStmt->props as $property) {
+ $propertyInfos[] = parseProperty(
+ $className,
+ $flags,
+ $property,
+ $classStmt->type,
+ $classStmt->getDocComment()
+ );
+ }
+ } else if ($classStmt instanceof Stmt\ClassMethod) {
+ $methodInfos[] = parseFunctionLike(
+ $prettyPrinter,
+ new MethodName($className, $classStmt->name->toString()),
+ $classFlags,
+ $flags,
+ $classStmt,
+ $cond
+ );
+ }
}
- $fileInfo->classInfos[] = new ClassInfo($className, $methodInfos);
+ $fileInfo->classInfos[] = parseClass($className, $stmt, $propertyInfos, $methodInfos);
continue;
}
@@ -1346,10 +1795,18 @@ function parseStubFile(string $code): FileInfo {
$fileInfo->declarationPrefix = $tag->value ? $tag->value . " " : "";
} else if ($tag->name === 'generate-legacy-arginfo') {
$fileInfo->generateLegacyArginfo = true;
+ } else if ($tag->name === 'generate-class-entries') {
+ $fileInfo->generateClassEntries = true;
+ $fileInfo->declarationPrefix = $tag->value ? $tag->value . " " : "";
}
}
}
+ // Generating class entries require generating function/method entries
+ if ($fileInfo->generateClassEntries && !$fileInfo->generateFunctionEntries) {
+ $fileInfo->generateFunctionEntries = true;
+ }
+
handleStatements($fileInfo, $stmts, $prettyPrinter);
return $fileInfo;
}
@@ -1531,6 +1988,20 @@ function generateArgInfoCode(FileInfo $fileInfo, string $stubHash): string {
}
}
+ if ($fileInfo->generateClassEntries) {
+ $code .= generateClassEntryCode($fileInfo);
+ }
+
+ return $code;
+}
+
+function generateClassEntryCode(FileInfo $fileInfo): string {
+ $code = "";
+
+ foreach ($fileInfo->classInfos as $class) {
+ $code .= "\n" . $class->getRegistration();
+ }
+
return $code;
}
@@ -1868,6 +2339,7 @@ foreach ($fileInfos as $fileInfo) {
/** @var FuncInfo $funcInfo */
$funcMap[$funcInfo->name->__toString()] = $funcInfo;
+ // TODO: Don't use aliasMap for methodsynopsis?
if ($funcInfo->aliasType === "alias") {
$aliasMap[$funcInfo->alias->__toString()] = $funcInfo;
}
@@ -1877,7 +2349,11 @@ foreach ($fileInfos as $fileInfo) {
if ($verify) {
$errors = [];
- foreach ($aliasMap as $aliasFunc) {
+ foreach ($funcMap as $aliasFunc) {
+ if (!$aliasFunc->alias) {
+ continue;
+ }
+
if (!isset($funcMap[$aliasFunc->alias->__toString()])) {
$errors[] = "Aliased function {$aliasFunc->alias}() cannot be found";
continue;
@@ -1930,11 +2406,12 @@ if ($verify) {
$aliasArgs, $aliasedArgs
);
- if ((!$aliasedFunc->isMethod() || $aliasedFunc->isFinalMethod()) &&
- (!$aliasFunc->isMethod() || $aliasFunc->isFinalMethod()) &&
- $aliasFunc->return != $aliasedFunc->return
- ) {
- $errors[] = "{$aliasFunc->name}() and {$aliasedFunc->name}() must have the same return type";
+ if (!$aliasedFunc->name->isConstructor() && !$aliasFunc->name->isConstructor()) {
+ $aliasedReturnType = $aliasedFunc->return->type ?? $aliasedFunc->return->phpDocType;
+ $aliasReturnType = $aliasFunc->return->type ?? $aliasFunc->return->phpDocType;
+ if ($aliasReturnType != $aliasedReturnType) {
+ $errors[] = "{$aliasFunc->name}() and {$aliasedFunc->name}() must have the same return type";
+ }
}
}
diff --git a/build/php.m4 b/build/php.m4
index 9746ba28f3..8994e1fe6a 100644
--- a/build/php.m4
+++ b/build/php.m4
@@ -257,8 +257,12 @@ dnl Choose the right compiler/flags/etc. for the source-file.
*.cpp|*.cc|*.cxx[)] ac_comp="$b_cxx_pre $ac_inc $b_cxx_meta $3 -c $ac_srcdir$ac_src -o $ac_bdir$ac_obj.$b_lo $b_cxx_post" ;;
esac
+dnl Generate Makefiles with dependencies
+ ac_comp="$ac_comp -MMD -MF $ac_bdir$ac_obj.dep -MT $ac_bdir[$]ac_obj.lo"
+
dnl Create a rule for the object/source combo.
cat >>Makefile.objects<<EOF
+-include $ac_bdir[$]ac_obj.dep
$ac_bdir[$]ac_obj.lo: $ac_srcdir[$]ac_src
$ac_comp
EOF
@@ -1872,6 +1876,30 @@ AC_DEFUN([PHP_PROG_RE2C],[
PHP_SUBST(RE2C)
])
+AC_DEFUN([PHP_PROG_PHP],[
+ AC_CHECK_PROG(PHP, php, php)
+
+ if test -n "$PHP"; then
+ AC_MSG_CHECKING([for php version])
+ php_version=$($PHP -v | head -n1 | cut -d ' ' -f 2)
+ if test -z "$php_version"; then
+ php_version=0.0.0
+ fi
+ ac_IFS=$IFS; IFS="."
+ set $php_version
+ IFS=$ac_IFS
+ php_version_num=`expr [$]{1:-0} \* 10000 + [$]{2:-0} \* 100 + [$]{3:-0}`
+ dnl Minimum supported version for gen_stubs.php is PHP 7.1.
+ if test "$php_version_num" -lt 70100; then
+ AC_MSG_RESULT([$php_version (too old)])
+ unset PHP
+ else
+ AC_MSG_RESULT([$php_version (ok)])
+ fi
+ fi
+ PHP_SUBST(PHP)
+])
+
dnl ----------------------------------------------------------------------------
dnl Common setup macros: PHP_SETUP_<what>
dnl ----------------------------------------------------------------------------
@@ -1903,7 +1931,7 @@ dnl
AC_DEFUN([PHP_SETUP_OPENSSL],[
found_openssl=no
- PKG_CHECK_MODULES([OPENSSL], [openssl >= 1.0.1], [found_openssl=yes])
+ PKG_CHECK_MODULES([OPENSSL], [openssl >= 1.0.2], [found_openssl=yes])
if test "$found_openssl" = "yes"; then
PHP_EVAL_LIBLINE($OPENSSL_LIBS, $1)
diff --git a/configure.ac b/configure.ac
index 7f428748ed..7bf90a4454 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,7 +17,7 @@ dnl Basic autoconf initialization, generation of config.nice.
dnl ----------------------------------------------------------------------------
AC_PREREQ([2.68])
-AC_INIT([PHP],[8.0.5-dev],[https://bugs.php.net],[php],[https://www.php.net])
+AC_INIT([PHP],[8.1.0-dev],[https://bugs.php.net],[php],[https://www.php.net])
AC_CONFIG_SRCDIR([main/php_version.h])
AC_CONFIG_AUX_DIR([build])
AC_PRESERVE_HELP_ORDER
@@ -155,6 +155,7 @@ dnl Checks for some support/generator progs.
PHP_PROG_AWK
PHP_PROG_BISON([3.0.0])
PHP_PROG_RE2C([0.13.4])
+PHP_PROG_PHP()
PHP_ARG_ENABLE([re2c-cgoto],
[whether to enable computed goto gcc extension with re2c],
@@ -222,12 +223,6 @@ case $host_alias in
*dgux*)
CPPFLAGS="$CPPFLAGS -D_BSD_TIMEOFDAY_FLAVOR"
;;
- *darwin*)
- if test -n "$GCC"; then
- AX_CHECK_COMPILE_FLAG([-no-cpp-precomp],
- [CPPFLAGS="$CPPFLAGS -no-cpp-precomp"])
- fi
- ;;
*mips*)
CPPFLAGS="$CPPFLAGS -D_XPG_IV"
;;
@@ -1289,10 +1284,10 @@ if test -n "${PHP_BUILD_PROVIDER}"; then
AC_DEFINE_UNQUOTED(PHP_BUILD_PROVIDER,"$PHP_BUILD_PROVIDER",[build provider])
fi
if test -n "${PHP_BUILD_COMPILER}"; then
- AC_DEFINE_UNQUOTED(COMPILER,"$PHP_BUILD_COMPILER",[used compiler for build])
+ AC_DEFINE_UNQUOTED(PHP_BUILD_COMPILER,"$PHP_BUILD_COMPILER",[used compiler for build])
fi
if test -n "${PHP_BUILD_ARCH}"; then
- AC_DEFINE_UNQUOTED(ARCHITECTURE,"$PHP_BUILD_ARCH",[build architecture])
+ AC_DEFINE_UNQUOTED(PHP_BUILD_ARCH,"$PHP_BUILD_ARCH",[build architecture])
fi
PHP_SUBST_OLD(PHP_INSTALLED_SAPIS)
@@ -1439,6 +1434,14 @@ PHP_SUBST(install_targets)
PHP_SUBST(install_binary_targets)
PHP_INSTALL_HEADERS([Zend/ TSRM/ include/ main/ main/streams/])
+PHP_INSTALL_HEADERS([Zend/Optimizer], [ \
+ zend_call_graph.h \
+ zend_cfg.h \
+ zend_dump.h \
+ zend_func_info.h \
+ zend_inference.h \
+ zend_optimizer.h \
+ zend_ssa.h])
PHP_ADD_SOURCES(TSRM, TSRM.c, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
@@ -1471,12 +1474,33 @@ PHP_ADD_SOURCES(Zend, \
zend_closures.c zend_weakrefs.c zend_float.c zend_string.c zend_signal.c zend_generators.c \
zend_virtual_cwd.c zend_ast.c zend_objects.c zend_object_handlers.c zend_objects_API.c \
zend_default_classes.c zend_inheritance.c zend_smart_str.c zend_cpuinfo.c zend_gdb.c \
- zend_observer.c zend_system_id.c, \
- -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
+ zend_observer.c zend_system_id.c zend_enum.c \
+ Optimizer/zend_optimizer.c \
+ Optimizer/pass1.c \
+ Optimizer/pass3.c \
+ Optimizer/optimize_func_calls.c \
+ Optimizer/block_pass.c \
+ Optimizer/optimize_temp_vars_5.c \
+ Optimizer/nop_removal.c \
+ Optimizer/compact_literals.c \
+ Optimizer/zend_cfg.c \
+ Optimizer/zend_dfg.c \
+ Optimizer/dfa_pass.c \
+ Optimizer/zend_ssa.c \
+ Optimizer/zend_inference.c \
+ Optimizer/zend_func_info.c \
+ Optimizer/zend_call_graph.c \
+ Optimizer/sccp.c \
+ Optimizer/scdf.c \
+ Optimizer/dce.c \
+ Optimizer/escape_analysis.c \
+ Optimizer/compact_vars.c \
+ Optimizer/zend_dump.c \
+ , -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
PHP_ADD_BUILD_DIR(main main/streams)
PHP_ADD_BUILD_DIR(TSRM)
-PHP_ADD_BUILD_DIR(Zend)
+PHP_ADD_BUILD_DIR(Zend Zend/Optimizer)
PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/scripts/Makefile.frag,$abs_srcdir/scripts,scripts)
PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/Zend/Makefile.frag,$abs_srcdir/Zend,Zend)
diff --git a/docs/parameter-parsing-api.md b/docs/parameter-parsing-api.md
index 2883c7014c..c962fc6ee5 100644
--- a/docs/parameter-parsing-api.md
+++ b/docs/parameter-parsing-api.md
@@ -93,7 +93,7 @@ The following characters also have a meaning in the specifier string:
* `|` - indicates that the remaining parameters are optional, they should be
initialized to default values by the extension since they will not be touched
by the parsing function if they are not passed to it.
-* `/` - use SEPARATE_ZVAL_IF_NOT_REF() on the parameter it follows
+* `/` - use SEPARATE_ZVAL() on the parameter it follows
* `!` - the parameter it follows can be of specified type or NULL. If NULL is
passed and the output for such type is a pointer, then the output pointer is
set to a native NULL pointer. For 'b', 'l' and 'd', an extra argument of type
diff --git a/docs/release-process.md b/docs/release-process.md
index 29198a440e..a86fb59fc0 100644
--- a/docs/release-process.md
+++ b/docs/release-process.md
@@ -278,15 +278,13 @@
* If that fails for any non-trivially fixable reason, you can manually copy
the old information to `include/releases.inc`.
- 2. Update `phpweb/include/version.inc` (X_Y=major_minor release number):
+ 2. Update $data['X.Y'] in `phpweb/include/version.inc`
+ (X.Y=major.minor release, e.g. '8.0'):
- * `$PHP_X_Y_VERSION` to the correct version
- * `$PHP_X_Y_DATE` to the release date
- * `$PHP_X_Y_SHA256` array and update all the SHA256 sums
- * `$PHP_X_Y_TAGS` array should include `security` if this is a security
- release
- * Make sure there are no outdated "notes" or edited "date" keys in the
- `$RELEASES[X][$PHP_X_VERSION]["source"]` array.
+ * `version` to the full version number (e.g. '8.0.1')
+ * `date` to the release date in `j M Y` format (e.g. '5 Jan 2021')
+ * `tags` array should include `security` if this is a security release
+ * `sha256` array and sub-elements for all SHA256 sums
3. Create the release file (`releases/x_y_z.php`):
@@ -357,14 +355,13 @@
1. Commit the new binaries to `phpweb/distributions/`
- 2. Update `phpweb/include/version.inc` (X_Y=major_minor release number):
+ 2. Update $data['X.Y'] in `phpweb/include/version.inc`
+ (X.Y=major.minor release, e.g. '8.0'):
- * If only releasing for one OS, make sure you edit only those variables.
- * `$PHP_X_Y_VERSION` to the correct version
- * `$PHP_X_Y_DATE` to the release date
- * `$PHP_X_Y_SHA256` array and update all the SHA256 sums
- * Make sure there are no outdated "notes" or edited "date" keys in the
- `$RELEASES[X][$PHP_X_VERSION]["source"]` array.
+ * `version` to the full version number (e.g. '8.0.1-pl1')
+ * `date` to the release date in `j M Y` format (e.g. '9 Jan 2021')
+ * `tags` array should include `security` if this is a security release
+ * `sha256` array and sub-elements for all SHA256 sums
3. Add a short notice to phpweb stating that there is a new release, and
highlight the major important things (security fixes) and when it is
diff --git a/ext/bcmath/bcmath.c b/ext/bcmath/bcmath.c
index 870749af50..0e6e201458 100644
--- a/ext/bcmath/bcmath.c
+++ b/ext/bcmath/bcmath.c
@@ -154,7 +154,7 @@ PHP_FUNCTION(bcadd)
{
zend_string *left, *right;
zend_long scale_param;
- zend_bool scale_param_is_null = 1;
+ bool scale_param_is_null = 1;
bc_num first, second, result;
int scale;
@@ -205,7 +205,7 @@ PHP_FUNCTION(bcsub)
{
zend_string *left, *right;
zend_long scale_param;
- zend_bool scale_param_is_null = 1;
+ bool scale_param_is_null = 1;
bc_num first, second, result;
int scale;
@@ -256,7 +256,7 @@ PHP_FUNCTION(bcmul)
{
zend_string *left, *right;
zend_long scale_param;
- zend_bool scale_param_is_null = 1;
+ bool scale_param_is_null = 1;
bc_num first, second, result;
int scale;
@@ -307,7 +307,7 @@ PHP_FUNCTION(bcdiv)
{
zend_string *left, *right;
zend_long scale_param;
- zend_bool scale_param_is_null = 1;
+ bool scale_param_is_null = 1;
bc_num first, second, result;
int scale = BCG(bc_precision);
@@ -363,7 +363,7 @@ PHP_FUNCTION(bcmod)
{
zend_string *left, *right;
zend_long scale_param;
- zend_bool scale_param_is_null = 1;
+ bool scale_param_is_null = 1;
bc_num first, second, result;
int scale = BCG(bc_precision);
@@ -419,7 +419,7 @@ PHP_FUNCTION(bcpowmod)
{
zend_string *left, *right, *modulus;
zend_long scale_param;
- zend_bool scale_param_is_null = 1;
+ bool scale_param_is_null = 1;
bc_num first, second, mod, result;
int scale = BCG(bc_precision);
@@ -478,7 +478,7 @@ PHP_FUNCTION(bcpow)
{
zend_string *left, *right;
zend_long scale_param;
- zend_bool scale_param_is_null = 1;
+ bool scale_param_is_null = 1;
bc_num first, second, result;
int scale = BCG(bc_precision);
@@ -529,7 +529,7 @@ PHP_FUNCTION(bcsqrt)
{
zend_string *left;
zend_long scale_param;
- zend_bool scale_param_is_null = 1;
+ bool scale_param_is_null = 1;
bc_num result;
int scale = BCG(bc_precision);
@@ -572,7 +572,7 @@ PHP_FUNCTION(bccomp)
{
zend_string *left, *right;
zend_long scale_param;
- zend_bool scale_param_is_null = 1;
+ bool scale_param_is_null = 1;
bc_num first, second;
int scale = BCG(bc_precision);
@@ -618,7 +618,7 @@ PHP_FUNCTION(bccomp)
PHP_FUNCTION(bcscale)
{
zend_long old_scale, new_scale;
- zend_bool new_scale_is_null = 1;
+ bool new_scale_is_null = 1;
ZEND_PARSE_PARAMETERS_START(0, 1)
Z_PARAM_OPTIONAL
diff --git a/ext/bcmath/bcmath.stub.php b/ext/bcmath/bcmath.stub.php
index acd63f000e..e0b86ebe5b 100644
--- a/ext/bcmath/bcmath.stub.php
+++ b/ext/bcmath/bcmath.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function bcadd(string $num1, string $num2, ?int $scale = null): string {}
diff --git a/ext/bcmath/bcmath_arginfo.h b/ext/bcmath/bcmath_arginfo.h
index 3e0104e04c..aaaa187c8c 100644
--- a/ext/bcmath/bcmath_arginfo.h
+++ b/ext/bcmath/bcmath_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 0c1e2a6163a5fc0f42bf79bbc530af7c5fd77074 */
+ * Stub hash: 6a16fed65c0e488e65c43e7df3bd1744e9349cc7 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcadd, 0, 2, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, num1, IS_STRING, 0)
diff --git a/ext/bcmath/tests/bcadd.phpt b/ext/bcmath/tests/bcadd.phpt
index 61552eecde..b24ce8dbd7 100644
--- a/ext/bcmath/tests/bcadd.phpt
+++ b/ext/bcmath/tests/bcadd.phpt
@@ -1,7 +1,7 @@
--TEST--
bcadd() function
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcadd_error.phpt b/ext/bcmath/tests/bcadd_error.phpt
new file mode 100644
index 0000000000..320bf39068
--- /dev/null
+++ b/ext/bcmath/tests/bcadd_error.phpt
@@ -0,0 +1,23 @@
+--TEST--
+bcadd() requires well-formed values
+--EXTENSIONS--
+bcmath
+--FILE--
+<?php
+
+try {
+ bcadd('a', '1');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+ bcadd('1', 'a');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+?>
+--EXPECT--
+bcadd(): Argument #1 ($num1) is not well-formed
+bcadd(): Argument #2 ($num2) is not well-formed
diff --git a/ext/bcmath/tests/bcadd_variation001.phpt b/ext/bcmath/tests/bcadd_variation001.phpt
index 4bd828cda3..447958b4a2 100644
--- a/ext/bcmath/tests/bcadd_variation001.phpt
+++ b/ext/bcmath/tests/bcadd_variation001.phpt
@@ -1,7 +1,7 @@
--TEST--
bcadd() with non-integers
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=5
--FILE--
diff --git a/ext/bcmath/tests/bccomp.phpt b/ext/bcmath/tests/bccomp.phpt
index b2bf9f4ac2..ba2fc79532 100644
--- a/ext/bcmath/tests/bccomp.phpt
+++ b/ext/bcmath/tests/bccomp.phpt
@@ -1,7 +1,7 @@
--TEST--
bccomp() function
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bccomp_error.phpt b/ext/bcmath/tests/bccomp_error.phpt
new file mode 100644
index 0000000000..90645c52f7
--- /dev/null
+++ b/ext/bcmath/tests/bccomp_error.phpt
@@ -0,0 +1,23 @@
+--TEST--
+bccomp() requires well-formed values
+--EXTENSIONS--
+bcmath
+--FILE--
+<?php
+
+try {
+ bccomp('a', '1');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+ bccomp('1', 'a');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+?>
+--EXPECT--
+bccomp(): Argument #1 ($num1) is not well-formed
+bccomp(): Argument #2 ($num2) is not well-formed
diff --git a/ext/bcmath/tests/bccomp_variation001.phpt b/ext/bcmath/tests/bccomp_variation001.phpt
index 9eff0dd33a..1aa2387c7f 100644
--- a/ext/bcmath/tests/bccomp_variation001.phpt
+++ b/ext/bcmath/tests/bccomp_variation001.phpt
@@ -1,7 +1,7 @@
--TEST--
bccomp() with non-integers
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bccomp_variation002.phpt b/ext/bcmath/tests/bccomp_variation002.phpt
index cb65712f06..ae7ba7fafe 100644
--- a/ext/bcmath/tests/bccomp_variation002.phpt
+++ b/ext/bcmath/tests/bccomp_variation002.phpt
@@ -1,7 +1,7 @@
--TEST--
bccomp() with negative value
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcdiv.phpt b/ext/bcmath/tests/bcdiv.phpt
index cda19496d5..0ae0069ce5 100644
--- a/ext/bcmath/tests/bcdiv.phpt
+++ b/ext/bcmath/tests/bcdiv.phpt
@@ -1,7 +1,7 @@
--TEST--
bcdiv() function
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcdiv_error1.phpt b/ext/bcmath/tests/bcdiv_error1.phpt
index a89ae98cfb..7b5908f555 100644
--- a/ext/bcmath/tests/bcdiv_error1.phpt
+++ b/ext/bcmath/tests/bcdiv_error1.phpt
@@ -4,8 +4,8 @@ bcdiv — Divide two arbitrary precision numbers
TestFest2009
Antoni Torrents
antoni@solucionsinternet.com
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
try {
diff --git a/ext/bcmath/tests/bcdiv_error2.phpt b/ext/bcmath/tests/bcdiv_error2.phpt
new file mode 100644
index 0000000000..a4e1cae353
--- /dev/null
+++ b/ext/bcmath/tests/bcdiv_error2.phpt
@@ -0,0 +1,23 @@
+--TEST--
+bcdiv() requires well-formed values
+--EXTENSIONS--
+bcmath
+--FILE--
+<?php
+
+try {
+ bcdiv('a', '1');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+ bcdiv('1', 'a');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+?>
+--EXPECT--
+bcdiv(): Argument #1 ($num1) is not well-formed
+bcdiv(): Argument #2 ($num2) is not well-formed
diff --git a/ext/bcmath/tests/bcmod.phpt b/ext/bcmath/tests/bcmod.phpt
index 3e9ab25cb8..1cfc835456 100644
--- a/ext/bcmath/tests/bcmod.phpt
+++ b/ext/bcmath/tests/bcmod.phpt
@@ -1,7 +1,7 @@
--TEST--
bcmod() function
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcmod_error2.phpt b/ext/bcmath/tests/bcmod_error2.phpt
index c4d49486b3..59939b3f08 100644
--- a/ext/bcmath/tests/bcmod_error2.phpt
+++ b/ext/bcmath/tests/bcmod_error2.phpt
@@ -1,7 +1,7 @@
--TEST--
bcmod() - mod by 0
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcmod_error3.phpt b/ext/bcmath/tests/bcmod_error3.phpt
new file mode 100644
index 0000000000..8df986fe76
--- /dev/null
+++ b/ext/bcmath/tests/bcmod_error3.phpt
@@ -0,0 +1,23 @@
+--TEST--
+bcmod() requires well-formed values
+--EXTENSIONS--
+bcmath
+--FILE--
+<?php
+
+try {
+ bcmod('a', '1');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+ bcmod('1', 'a');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+?>
+--EXPECT--
+bcmod(): Argument #1 ($num1) is not well-formed
+bcmod(): Argument #2 ($num2) is not well-formed
diff --git a/ext/bcmath/tests/bcmul.phpt b/ext/bcmath/tests/bcmul.phpt
index 20893552da..2e2a8a7a11 100644
--- a/ext/bcmath/tests/bcmul.phpt
+++ b/ext/bcmath/tests/bcmul.phpt
@@ -1,7 +1,7 @@
--TEST--
bcmul() function
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcmul_error.phpt b/ext/bcmath/tests/bcmul_error.phpt
new file mode 100644
index 0000000000..361b46163e
--- /dev/null
+++ b/ext/bcmath/tests/bcmul_error.phpt
@@ -0,0 +1,23 @@
+--TEST--
+bcmul() requires well-formed values
+--EXTENSIONS--
+bcmath
+--FILE--
+<?php
+
+try {
+ bcmul('a', '1');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+ bcmul('1', 'a');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+?>
+--EXPECT--
+bcmul(): Argument #1 ($num1) is not well-formed
+bcmul(): Argument #2 ($num2) is not well-formed
diff --git a/ext/bcmath/tests/bcpow.phpt b/ext/bcmath/tests/bcpow.phpt
index ad642a57be..1850e34279 100644
--- a/ext/bcmath/tests/bcpow.phpt
+++ b/ext/bcmath/tests/bcpow.phpt
@@ -1,7 +1,7 @@
--TEST--
bcpow() function
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcpow_error1.phpt b/ext/bcmath/tests/bcpow_error1.phpt
index 38d9bda181..d2b1a10704 100644
--- a/ext/bcmath/tests/bcpow_error1.phpt
+++ b/ext/bcmath/tests/bcpow_error1.phpt
@@ -1,9 +1,7 @@
--TEST--
bcpow() does not support non-integral exponents
---SKIPIF--
-<?php
-if (!extension_loaded('bcmath')) die('skip bcmath extension is not available');
-?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
try {
diff --git a/ext/bcmath/tests/bcpow_error2.phpt b/ext/bcmath/tests/bcpow_error2.phpt
index d6271b18eb..733d628b41 100644
--- a/ext/bcmath/tests/bcpow_error2.phpt
+++ b/ext/bcmath/tests/bcpow_error2.phpt
@@ -1,9 +1,7 @@
--TEST--
bcpow() does not support exponents >= 2**63
---SKIPIF--
-<?php
-if (!extension_loaded('bcmath')) die('skip bcmath extension is not available');
-?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
try {
diff --git a/ext/bcmath/tests/bcpow_error3.phpt b/ext/bcmath/tests/bcpow_error3.phpt
new file mode 100644
index 0000000000..f47c85d4da
--- /dev/null
+++ b/ext/bcmath/tests/bcpow_error3.phpt
@@ -0,0 +1,23 @@
+--TEST--
+bcpow() requires well-formed values
+--EXTENSIONS--
+bcmath
+--FILE--
+<?php
+
+try {
+ bcpow('a', '1');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+ bcpow('1', 'a');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+?>
+--EXPECT--
+bcpow(): Argument #1 ($num) is not well-formed
+bcpow(): Argument #2 ($exponent) is not well-formed
diff --git a/ext/bcmath/tests/bcpow_variation001.phpt b/ext/bcmath/tests/bcpow_variation001.phpt
index df55f15ae5..9bcea231fb 100644
--- a/ext/bcmath/tests/bcpow_variation001.phpt
+++ b/ext/bcmath/tests/bcpow_variation001.phpt
@@ -1,7 +1,7 @@
--TEST--
bcpow() with a negative exponent
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcpowmod.phpt b/ext/bcmath/tests/bcpowmod.phpt
index c171e2d4a1..285648024f 100644
--- a/ext/bcmath/tests/bcpowmod.phpt
+++ b/ext/bcmath/tests/bcpowmod.phpt
@@ -1,7 +1,7 @@
--TEST--
bcpowmod() - Raise an arbitrary precision number to another, reduced by a specified modulus
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcpowmod_error.phpt b/ext/bcmath/tests/bcpowmod_error.phpt
new file mode 100644
index 0000000000..ff2862310c
--- /dev/null
+++ b/ext/bcmath/tests/bcpowmod_error.phpt
@@ -0,0 +1,30 @@
+--TEST--
+bcpowmod() requires well-formed values
+--EXTENSIONS--
+bcmath
+--FILE--
+<?php
+
+try {
+ bcpowmod('a', '1', '1');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+ bcpowmod('1', 'a', '1');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+ bcpowmod('1', '1', 'a');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+?>
+--EXPECT--
+bcpowmod(): Argument #1 ($num) is not well-formed
+bcpowmod(): Argument #2 ($exponent) is not well-formed
+bcpowmod(): Argument #3 ($modulus) is not well-formed
diff --git a/ext/bcmath/tests/bcpowmod_negative_exponent.phpt b/ext/bcmath/tests/bcpowmod_negative_exponent.phpt
index 518f9eb0a9..7814e2bd41 100644
--- a/ext/bcmath/tests/bcpowmod_negative_exponent.phpt
+++ b/ext/bcmath/tests/bcpowmod_negative_exponent.phpt
@@ -2,8 +2,8 @@
bc_raisemod's expo can't be negative
--CREDITS--
Gabriel Caruso (carusogabriel34@gmail.com)
---SKIPIF--
-<?php if(!extension_loaded('bcmath')) die('skip bcmath extension not loaded'); ?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
try {
diff --git a/ext/bcmath/tests/bcpowmod_zero_modulus.phpt b/ext/bcmath/tests/bcpowmod_zero_modulus.phpt
index bc30dc0afd..8540a0d6df 100644
--- a/ext/bcmath/tests/bcpowmod_zero_modulus.phpt
+++ b/ext/bcmath/tests/bcpowmod_zero_modulus.phpt
@@ -2,8 +2,8 @@
bc_raisemod's mod can't be zero
--CREDITS--
Gabriel Caruso (carusogabriel34@gmail.com)
---SKIPIF--
-<?php if(!extension_loaded('bcmath')) die('skip bcmath extension not loaded'); ?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
try {
diff --git a/ext/bcmath/tests/bcscale.phpt b/ext/bcmath/tests/bcscale.phpt
index 4fc2f85eb9..e402c48367 100644
--- a/ext/bcmath/tests/bcscale.phpt
+++ b/ext/bcmath/tests/bcscale.phpt
@@ -1,7 +1,7 @@
--TEST--
bcscale() function
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcscale_variation001.phpt b/ext/bcmath/tests/bcscale_variation001.phpt
index 0718d724c2..8d9d32e064 100644
--- a/ext/bcmath/tests/bcscale_variation001.phpt
+++ b/ext/bcmath/tests/bcscale_variation001.phpt
@@ -1,7 +1,7 @@
--TEST--
bcscale() fails with negative argument
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcscale_variation002.phpt b/ext/bcmath/tests/bcscale_variation002.phpt
index 11df405bea..205f39d4c8 100644
--- a/ext/bcmath/tests/bcscale_variation002.phpt
+++ b/ext/bcmath/tests/bcscale_variation002.phpt
@@ -1,7 +1,7 @@
--TEST--
bcadd() incorrect argument count
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=-2
--FILE--
diff --git a/ext/bcmath/tests/bcscale_variation003.phpt b/ext/bcmath/tests/bcscale_variation003.phpt
index 0812aadab6..40d17db2c5 100644
--- a/ext/bcmath/tests/bcscale_variation003.phpt
+++ b/ext/bcmath/tests/bcscale_variation003.phpt
@@ -1,7 +1,7 @@
--TEST--
bcscale() return value
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcsqrt.phpt b/ext/bcmath/tests/bcsqrt.phpt
index b2a8d8adbc..92512dd0d0 100644
--- a/ext/bcmath/tests/bcsqrt.phpt
+++ b/ext/bcmath/tests/bcsqrt.phpt
@@ -1,7 +1,7 @@
--TEST--
bcsqrt() function
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcsqrt_error1.phpt b/ext/bcmath/tests/bcsqrt_error1.phpt
index bdc850f979..78923f4a94 100644
--- a/ext/bcmath/tests/bcsqrt_error1.phpt
+++ b/ext/bcmath/tests/bcsqrt_error1.phpt
@@ -3,8 +3,8 @@ bcsqrt — Get the square root of an arbitrary precision number
--CREDITS--
Antoni Torrents
antoni@solucionsinternet.com
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
try {
diff --git a/ext/bcmath/tests/bcsqrt_error2.phpt b/ext/bcmath/tests/bcsqrt_error2.phpt
new file mode 100644
index 0000000000..1ef934d3bc
--- /dev/null
+++ b/ext/bcmath/tests/bcsqrt_error2.phpt
@@ -0,0 +1,16 @@
+--TEST--
+bcsqrt() requires a well-formed value
+--EXTENSIONS--
+bcmath
+--FILE--
+<?php
+
+try {
+ bcsqrt('a');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+?>
+--EXPECT--
+bcsqrt(): Argument #1 ($num) is not well-formed
diff --git a/ext/bcmath/tests/bcsqrt_variation001.phpt b/ext/bcmath/tests/bcsqrt_variation001.phpt
index 1f3d284c13..dfa1944ab8 100644
--- a/ext/bcmath/tests/bcsqrt_variation001.phpt
+++ b/ext/bcmath/tests/bcsqrt_variation001.phpt
@@ -1,7 +1,7 @@
--TEST--
bcsqrt() with argument of 0
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcsub.phpt b/ext/bcmath/tests/bcsub.phpt
index 8d85d23233..3d0765bef3 100644
--- a/ext/bcmath/tests/bcsub.phpt
+++ b/ext/bcmath/tests/bcsub.phpt
@@ -1,7 +1,7 @@
--TEST--
bcsub() function
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/bcsub_error.phpt b/ext/bcmath/tests/bcsub_error.phpt
new file mode 100644
index 0000000000..4e1abd3fa9
--- /dev/null
+++ b/ext/bcmath/tests/bcsub_error.phpt
@@ -0,0 +1,23 @@
+--TEST--
+bcsub() requires well-formed values
+--EXTENSIONS--
+bcmath
+--FILE--
+<?php
+
+try {
+ bcsub('a', '1');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+try {
+ bcsub('1', 'a');
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
+?>
+--EXPECT--
+bcsub(): Argument #1 ($num1) is not well-formed
+bcsub(): Argument #2 ($num2) is not well-formed
diff --git a/ext/bcmath/tests/bug.66364.phpt b/ext/bcmath/tests/bug.66364.phpt
index 08777c5f59..c138176fb6 100644
--- a/ext/bcmath/tests/bug.66364.phpt
+++ b/ext/bcmath/tests/bug.66364.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #66364 (BCMath bcmul ignores scale parameter)
---SKIPIF--
-<?php
-if (!extension_loaded('bcmath')) die('skip bcmath extension not available');
-?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
var_dump(bcmul('0.3', '0.2', 4));
diff --git a/ext/bcmath/tests/bug44995.phpt b/ext/bcmath/tests/bug44995.phpt
index 9758022225..09b76722aa 100644
--- a/ext/bcmath/tests/bug44995.phpt
+++ b/ext/bcmath/tests/bug44995.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #44995 (bcpowmod() fails if scale != 0)
---SKIPIF--
-<?php
-if (!extension_loaded('bcmath')) die('skip bcmath extension not available');
-?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
var_dump(bcpowmod('4', '4', '3', 1));
diff --git a/ext/bcmath/tests/bug46781.phpt b/ext/bcmath/tests/bug46781.phpt
index d9e4fe5111..15e04e555a 100644
--- a/ext/bcmath/tests/bug46781.phpt
+++ b/ext/bcmath/tests/bug46781.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #46781 (BC math handles minus zero incorrectly)
---SKIPIF--
-<?php
-if (!extension_loaded('bcmath')) die('skip bcmath extension is not available');
-?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
var_dump(bcadd('-0.0', '-0.0', 1));
diff --git a/ext/bcmath/tests/bug54598.phpt b/ext/bcmath/tests/bug54598.phpt
index 5f3337fadc..fa4d850c10 100644
--- a/ext/bcmath/tests/bug54598.phpt
+++ b/ext/bcmath/tests/bug54598.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #54598 (bcpowmod() may return 1 if modulus is 1)
---SKIPIF--
-<?php
-if (!extension_loaded('bcmath')) die('skip bcmath extension is not available');
-?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
var_dump(bcpowmod(5, 0, 1));
diff --git a/ext/bcmath/tests/bug60377.phpt b/ext/bcmath/tests/bug60377.phpt
index 73d3b2ac1b..16d058441a 100644
--- a/ext/bcmath/tests/bug60377.phpt
+++ b/ext/bcmath/tests/bug60377.phpt
@@ -1,7 +1,9 @@
--TEST--
bcscale related problem on 64bits platforms
+--EXTENSIONS--
+bcmath
--SKIPIF--
-<?php if(!extension_loaded("bcmath")) die("skip");
+<?php
if (PHP_INT_SIZE != 8) die("skip: 64-bit only"); ?>
--FILE--
<?php
diff --git a/ext/bcmath/tests/bug72093.phpt b/ext/bcmath/tests/bug72093.phpt
index 3a6405d04a..a424a59e04 100644
--- a/ext/bcmath/tests/bug72093.phpt
+++ b/ext/bcmath/tests/bug72093.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug 72093: bcpowmod fails on negative scale and corrupts _one_ definition
---SKIPIF--
-<?php
-if(!extension_loaded("bcmath")) print "skip";
-?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
try {
diff --git a/ext/bcmath/tests/bug75178.phpt b/ext/bcmath/tests/bug75178.phpt
index 9025e61c73..940a3567de 100644
--- a/ext/bcmath/tests/bug75178.phpt
+++ b/ext/bcmath/tests/bug75178.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #75178 (bcpowmod() misbehaves for non-integer base or modulus)
---SKIPIF--
-<?php
-if (!extension_loaded('bcmath')) die('skip bcmath extension is not available');
-?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
try {
diff --git a/ext/bcmath/tests/bug78878.phpt b/ext/bcmath/tests/bug78878.phpt
index 7edc666f75..9d9d0db48c 100644
--- a/ext/bcmath/tests/bug78878.phpt
+++ b/ext/bcmath/tests/bug78878.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #78878 (Buffer underflow in bc_shift_addsub)
---SKIPIF--
-<?php
-if (!extension_loaded('bcmath')) die('skip bcmath extension not available');
-?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
try {
diff --git a/ext/bcmath/tests/bug80545.phpt b/ext/bcmath/tests/bug80545.phpt
index 680c4c0631..f1e256776d 100644
--- a/ext/bcmath/tests/bug80545.phpt
+++ b/ext/bcmath/tests/bug80545.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #80545 (bcadd('a', 'a') and bcadd('1', 'a') doesn't throw an exception)
---SKIPIF--
-<?php
-if (!extension_loaded('bcmath')) die('skip bcmath extension not available');
-?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
diff --git a/ext/bcmath/tests/negative_scale.phpt b/ext/bcmath/tests/negative_scale.phpt
index 96d1e1b600..3b93775590 100644
--- a/ext/bcmath/tests/negative_scale.phpt
+++ b/ext/bcmath/tests/negative_scale.phpt
@@ -1,7 +1,7 @@
--TEST--
all errors on negative scale
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale=0
--FILE--
diff --git a/ext/bcmath/tests/scale.phpt b/ext/bcmath/tests/scale.phpt
index e2e65cab22..ad3cb45ea7 100644
--- a/ext/bcmath/tests/scale.phpt
+++ b/ext/bcmath/tests/scale.phpt
@@ -1,9 +1,7 @@
--TEST--
BCMath functions return result with requested scale
---SKIPIF--
-<?php
-if (!extension_loaded('bcmath')) die('skip bcmath extension not available');
-?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
echo
diff --git a/ext/bcmath/tests/scale_ini.phpt b/ext/bcmath/tests/scale_ini.phpt
index c75cf8edda..f5e5fe4526 100644
--- a/ext/bcmath/tests/scale_ini.phpt
+++ b/ext/bcmath/tests/scale_ini.phpt
@@ -1,9 +1,7 @@
--TEST--
BCMath functions return result with default scale
---SKIPIF--
-<?php
-if (!extension_loaded('bcmath')) die('skip bcmath extension not available');
-?>
+--EXTENSIONS--
+bcmath
--INI--
bcmath.scale = 5
--FILE--
diff --git a/ext/bcmath/tests/str2num_formatting.phpt b/ext/bcmath/tests/str2num_formatting.phpt
index 83e633bdaf..ee3f0ae4a8 100644
--- a/ext/bcmath/tests/str2num_formatting.phpt
+++ b/ext/bcmath/tests/str2num_formatting.phpt
@@ -4,8 +4,8 @@ bcmath lib arguments formatting
1 and 2 argument of bcadd/bcsub/bcmul/bcdiv/bcmod/bcpowmod/bcpow/bccomp (last one works different then others internally);
1 argument of bcsqrt
All of the name above must be well-formed
---SKIPIF--
-<?php if(!extension_loaded("bcmath")) print "skip"; ?>
+--EXTENSIONS--
+bcmath
--FILE--
<?php
echo bcadd("1", "2"),"\n";
@@ -46,6 +46,12 @@ try {
echo $e->getMessage() . PHP_EOL;
}
+try {
+ echo bcadd("1.a", "2");
+} catch (\ValueError $e) {
+ echo $e->getMessage() . PHP_EOL;
+}
+
echo "\n";
echo bccomp("1", "2"),"\n";
@@ -99,6 +105,7 @@ bcadd(): Argument #1 ($num1) is not well-formed
bcadd(): Argument #1 ($num1) is not well-formed
bcadd(): Argument #1 ($num1) is not well-formed
bcadd(): Argument #1 ($num1) is not well-formed
+bcadd(): Argument #1 ($num1) is not well-formed
-1
-1
diff --git a/ext/bz2/bz2.c b/ext/bz2/bz2.c
index d83853aef9..5f6f37ff33 100644
--- a/ext/bz2/bz2.c
+++ b/ext/bz2/bz2.c
@@ -496,7 +496,7 @@ PHP_FUNCTION(bzdecompress)
zend_string *dest;
size_t source_len;
int error;
- zend_bool small = 0;
+ bool small = 0;
#ifdef PHP_WIN32
unsigned __int64 size = 0;
#else
diff --git a/ext/bz2/bz2.stub.php b/ext/bz2/bz2.stub.php
index ebedfea799..e635006d11 100644
--- a/ext/bz2/bz2.stub.php
+++ b/ext/bz2/bz2.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
/**
* @param string|resource $file
@@ -14,18 +14,21 @@ function bzread($bz, int $length = 1024): string|false {}
/**
* @param resource $bz
* @implementation-alias fwrite
+ * @no-verify Uses different parameter name
*/
function bzwrite($bz, string $data, ?int $length = null): int|false {}
/**
* @param resource $bz
* @implementation-alias fflush
+ * @no-verify Uses different parameter name
*/
function bzflush($bz): bool {}
/**
* @param resource $bz
* @implementation-alias fclose
+ * @no-verify Uses different parameter name
*/
function bzclose($bz): bool {}
diff --git a/ext/bz2/bz2_arginfo.h b/ext/bz2/bz2_arginfo.h
index f3c2d86320..21ac13b0c5 100644
--- a/ext/bz2/bz2_arginfo.h
+++ b/ext/bz2/bz2_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 0cd7792480671883ebae30ae8358b8f8e3390474 */
+ * Stub hash: 8116780e328f137ca15ae445c9d6b45cf2f41f06 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_bzopen, 0, 0, 2)
ZEND_ARG_INFO(0, file)
diff --git a/ext/bz2/tests/001.phpt b/ext/bz2/tests/001.phpt
index 9561d5ac0f..6b86bd6b0b 100644
--- a/ext/bz2/tests/001.phpt
+++ b/ext/bz2/tests/001.phpt
@@ -1,7 +1,7 @@
--TEST--
bzopen() and invalid parameters
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
diff --git a/ext/bz2/tests/002.phpt b/ext/bz2/tests/002.phpt
index 3ff0aedeb5..00254776f7 100644
--- a/ext/bz2/tests/002.phpt
+++ b/ext/bz2/tests/002.phpt
@@ -1,7 +1,7 @@
--TEST--
bzopen() using fd opened in wrong mode
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
diff --git a/ext/bz2/tests/003-mb.phpt b/ext/bz2/tests/003-mb.phpt
index 75ec54ae4d..3189b473a4 100644
--- a/ext/bz2/tests/003-mb.phpt
+++ b/ext/bz2/tests/003-mb.phpt
@@ -1,7 +1,7 @@
--TEST--
bzread() tests
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
diff --git a/ext/bz2/tests/003.phpt b/ext/bz2/tests/003.phpt
index 229dd87058..4b6ee820dd 100644
--- a/ext/bz2/tests/003.phpt
+++ b/ext/bz2/tests/003.phpt
@@ -1,7 +1,7 @@
--TEST--
bzread() tests
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
diff --git a/ext/bz2/tests/004.phpt b/ext/bz2/tests/004.phpt
index 15eb90f89a..e644bfa6ce 100644
--- a/ext/bz2/tests/004.phpt
+++ b/ext/bz2/tests/004.phpt
@@ -1,7 +1,7 @@
--TEST--
bzread() tests with invalid files
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
diff --git a/ext/bz2/tests/005.phpt b/ext/bz2/tests/005.phpt
index 5fc7ef0b7c..769cace33f 100644
--- a/ext/bz2/tests/005.phpt
+++ b/ext/bz2/tests/005.phpt
@@ -1,7 +1,7 @@
--TEST--
bzcompress()/bzdecompress() tests
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
diff --git a/ext/bz2/tests/bug51997.phpt b/ext/bz2/tests/bug51997.phpt
index 303e0b3b67..249c72a3f5 100644
--- a/ext/bz2/tests/bug51997.phpt
+++ b/ext/bz2/tests/bug51997.phpt
@@ -1,7 +1,7 @@
--TEST--
Bug #51997 (SEEK_CUR with 0 value, returns a warning)
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
diff --git a/ext/bz2/tests/bug71263.phpt b/ext/bz2/tests/bug71263.phpt
index b20bbd8ef1..594f1aeee1 100644
--- a/ext/bz2/tests/bug71263.phpt
+++ b/ext/bz2/tests/bug71263.phpt
@@ -1,7 +1,7 @@
--TEST--
Bug #71263: fread() does not report bzip2.decompress errors
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip bz2 extension not loaded"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
diff --git a/ext/bz2/tests/bug72447.phpt b/ext/bz2/tests/bug72447.phpt
index 15321042df..7cbd43a443 100644
--- a/ext/bz2/tests/bug72447.phpt
+++ b/ext/bz2/tests/bug72447.phpt
@@ -1,7 +1,7 @@
--TEST--
Bug #72447: Type Confusion in php_bz2_filter_create()
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
$input = "AAAAAAAA";
diff --git a/ext/bz2/tests/bug72613.phpt b/ext/bz2/tests/bug72613.phpt
index d9463e212a..2dfc8c65d3 100644
--- a/ext/bz2/tests/bug72613.phpt
+++ b/ext/bz2/tests/bug72613.phpt
@@ -1,7 +1,7 @@
--TEST--
Bug #72613 (Inadequate error handling in bzread())
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
$fp = bzopen(__DIR__.'/72613.bz2', 'r');
diff --git a/ext/bz2/tests/bug75776.phpt b/ext/bz2/tests/bug75776.phpt
index 43cc6e07b5..e3cf299f25 100644
--- a/ext/bz2/tests/bug75776.phpt
+++ b/ext/bz2/tests/bug75776.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #75776 (Flushing streams with compression filter is broken)
---SKIPIF--
-<?php
-if (!extension_loaded('bz2')) die('skip bz2 extension not available');
-?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
$text = str_repeat('0123456789abcdef', 1000);
diff --git a/ext/bz2/tests/bz2_filter_compress.phpt b/ext/bz2/tests/bz2_filter_compress.phpt
index e735d8876c..974f2599d5 100644
--- a/ext/bz2/tests/bz2_filter_compress.phpt
+++ b/ext/bz2/tests/bz2_filter_compress.phpt
@@ -1,7 +1,7 @@
--TEST--
bzip2.compress (with convert.base64-encode)
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
$text = 'I am the very model of a modern major general, I\'ve information vegetable, animal, and mineral.';
diff --git a/ext/bz2/tests/bz2_filter_decompress.phpt b/ext/bz2/tests/bz2_filter_decompress.phpt
index ca92f55934..0e1839f42b 100644
--- a/ext/bz2/tests/bz2_filter_decompress.phpt
+++ b/ext/bz2/tests/bz2_filter_decompress.phpt
@@ -1,7 +1,7 @@
--TEST--
bzip2.decompress (with convert.base64-decode)
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
$text = 'QlpoNDFBWSZTWRN6QG0AAAoVgECFACA395UgIABIintI1N6mpowIQ0E1MTTAQGYTNcRyMZm5kgW3ib7hVboE7Tmqj3ToGZ5G3q1ZauD2G58hibSck8KS95EEAbx1Cn+LuSKcKEgJvSA2gA==';
diff --git a/ext/bz2/tests/bzopen_string_filename_with_null_bytes.phpt b/ext/bz2/tests/bzopen_string_filename_with_null_bytes.phpt
index 1261981c6b..b76515a178 100644
--- a/ext/bz2/tests/bzopen_string_filename_with_null_bytes.phpt
+++ b/ext/bz2/tests/bzopen_string_filename_with_null_bytes.phpt
@@ -1,7 +1,7 @@
--TEST--
bzopen(): throw TypeError if filename contains null bytes
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
diff --git a/ext/bz2/tests/with_files.phpt b/ext/bz2/tests/with_files.phpt
index e24e28211f..d06666e665 100644
--- a/ext/bz2/tests/with_files.phpt
+++ b/ext/bz2/tests/with_files.phpt
@@ -1,7 +1,7 @@
--TEST--
BZ2 with files
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
diff --git a/ext/bz2/tests/with_strings.phpt b/ext/bz2/tests/with_strings.phpt
index e04cc514a8..488a092c94 100644
--- a/ext/bz2/tests/with_strings.phpt
+++ b/ext/bz2/tests/with_strings.phpt
@@ -1,12 +1,10 @@
--TEST--
BZ2 with strings
---SKIPIF--
-<?php if (!extension_loaded("bz2")) print "skip"; ?>
+--EXTENSIONS--
+bz2
--FILE--
<?php
-error_reporting(E_ALL);
-
# This FAILS
$blaat = <<<HEREDOC
This is some random data
@@ -17,11 +15,8 @@ HEREDOC;
$blaat2 = bzdecompress(bzcompress($blaat));
-$tests = <<<TESTS
- \$blaat === \$blaat2
-TESTS;
+var_dump($blaat === $blaat2);
-include(__DIR__ . '/../../../tests/quicktester.inc');
?>
--EXPECT--
-OK
+bool(true)
diff --git a/ext/calendar/cal_unix.c b/ext/calendar/cal_unix.c
index f1740c86af..4a74170b51 100644
--- a/ext/calendar/cal_unix.c
+++ b/ext/calendar/cal_unix.c
@@ -28,7 +28,7 @@ PHP_FUNCTION(unixtojd)
{
time_t ts;
zend_long tl = 0;
- zend_bool tl_is_null = 1;
+ bool tl_is_null = 1;
struct tm *ta, tmbuf;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!", &tl, &tl_is_null) == FAILURE) {
diff --git a/ext/calendar/calendar.c b/ext/calendar/calendar.c
index 5dd4f1ef49..61ceecd6fc 100644
--- a/ext/calendar/calendar.c
+++ b/ext/calendar/calendar.c
@@ -474,7 +474,7 @@ static char *heb_number_to_chars(int n, int fl, char **ret)
PHP_FUNCTION(jdtojewish)
{
zend_long julday, fl = 0;
- zend_bool heb = 0;
+ bool heb = 0;
int year, month, day;
char *dayp, *yearp;
diff --git a/ext/calendar/calendar.stub.php b/ext/calendar/calendar.stub.php
index 575784df37..0941dde3d6 100644
--- a/ext/calendar/calendar.stub.php
+++ b/ext/calendar/calendar.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function cal_days_in_month(int $calendar, int $month, int $year): int {}
diff --git a/ext/calendar/calendar_arginfo.h b/ext/calendar/calendar_arginfo.h
index b8d5bfc95f..cc02f9608c 100644
--- a/ext/calendar/calendar_arginfo.h
+++ b/ext/calendar/calendar_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: ced2659f54bb25693831315625fe90b33e2f7cbe */
+ * Stub hash: d383ac249ddc88aee4cfaaefd37e85d913281f8e */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_cal_days_in_month, 0, 3, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, calendar, IS_LONG, 0)
diff --git a/ext/calendar/easter.c b/ext/calendar/easter.c
index 291fd4a272..ffca84b8e6 100644
--- a/ext/calendar/easter.c
+++ b/ext/calendar/easter.c
@@ -28,7 +28,7 @@ static void _cal_easter(INTERNAL_FUNCTION_PARAMETERS, zend_long gm)
struct tm te;
zend_long year, golden, solar, lunar, pfm, dom, tmp, easter, result;
zend_long method = CAL_EASTER_DEFAULT;
- zend_bool year_is_null = 1;
+ bool year_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(),
"|l!l", &year, &year_is_null, &method) == FAILURE) {
diff --git a/ext/calendar/tests/bug52744.phpt b/ext/calendar/tests/bug52744.phpt
index 886086a294..99fd65f61b 100644
--- a/ext/calendar/tests/bug52744.phpt
+++ b/ext/calendar/tests/bug52744.phpt
@@ -1,7 +1,7 @@
--TEST--
Bug #52744 (cal_days_in_month incorrect for December 1 BCE)
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
var_dump(cal_days_in_month(CAL_GREGORIAN, 12, -1));
diff --git a/ext/calendar/tests/bug53574_1.phpt b/ext/calendar/tests/bug53574_1.phpt
index 6aba600619..c4a265f8f0 100644
--- a/ext/calendar/tests/bug53574_1.phpt
+++ b/ext/calendar/tests/bug53574_1.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #53574 (Integer overflow in SdnToJulian; leads to segfault)
+--EXTENSIONS--
+calendar
--SKIPIF--
<?php
-include 'skipif.inc';
if (PHP_INT_SIZE != 4) {
die("skip this test is for 32bit platform only");
}
diff --git a/ext/calendar/tests/bug53574_2.phpt b/ext/calendar/tests/bug53574_2.phpt
index 6e3154a916..cbd4b7ad2c 100644
--- a/ext/calendar/tests/bug53574_2.phpt
+++ b/ext/calendar/tests/bug53574_2.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #53574 (Integer overflow in SdnToJulian; leads to segfault)
+--EXTENSIONS--
+calendar
--SKIPIF--
<?php
-include 'skipif.inc';
if (PHP_INT_SIZE == 4) {
die("skip this test is for 64bit platform only");
}
diff --git a/ext/calendar/tests/bug54254.phpt b/ext/calendar/tests/bug54254.phpt
index f623fad809..8dced655bb 100644
--- a/ext/calendar/tests/bug54254.phpt
+++ b/ext/calendar/tests/bug54254.phpt
@@ -1,7 +1,7 @@
--TEST--
Bug #54254 (cal_days_in_month incompatible with jdtojewish in non-leap-years)
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
var_dump(cal_days_in_month(CAL_JEWISH, 1, 5771));
diff --git a/ext/calendar/tests/bug55797_1.phpt b/ext/calendar/tests/bug55797_1.phpt
index c9374c9d38..05880803d2 100644
--- a/ext/calendar/tests/bug55797_1.phpt
+++ b/ext/calendar/tests/bug55797_1.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #55797: Integer overflow in SdnToGregorian leads to segfault (in optimized builds)
+--EXTENSIONS--
+calendar
--SKIPIF--
<?php
-include 'skipif.inc';
if (PHP_INT_SIZE != 4) {
die("skip this test is for 32bit platform only");
}
diff --git a/ext/calendar/tests/bug55797_2.phpt b/ext/calendar/tests/bug55797_2.phpt
index b60fd0eba4..7cbe88a139 100644
--- a/ext/calendar/tests/bug55797_2.phpt
+++ b/ext/calendar/tests/bug55797_2.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #55797: Integer overflow in SdnToGregorian leads to segfault (in optimized builds)
+--EXTENSIONS--
+calendar
--SKIPIF--
<?php
-include 'skipif.inc';
if (PHP_INT_SIZE == 4) {
die("skip this test is for 64bit platform only");
}
diff --git a/ext/calendar/tests/bug67976.phpt b/ext/calendar/tests/bug67976.phpt
index 74e0bc81b1..1c8e56ad64 100644
--- a/ext/calendar/tests/bug67976.phpt
+++ b/ext/calendar/tests/bug67976.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #67976 (cal_days_month() fails for final month of the French calendar)
---SKIPIF--
-<?php
-if (!extension_loaded('calendar')) die('skip ext/calendar required');
-?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
var_dump(cal_days_in_month(CAL_FRENCH, 13, 14));
diff --git a/ext/calendar/tests/bug71894.phpt b/ext/calendar/tests/bug71894.phpt
index ea2d6004e7..c98c5a7808 100644
--- a/ext/calendar/tests/bug71894.phpt
+++ b/ext/calendar/tests/bug71894.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #71894 (AddressSanitizer: global-buffer-overflow in zif_cal_from_jd)
---SKIPIF--
-<?php
-if (!extension_loaded('calendar')) die('skip ext/calendar required');
-?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
var_dump(cal_from_jd(347997, CAL_JEWISH));
diff --git a/ext/calendar/tests/bug80185.phpt b/ext/calendar/tests/bug80185.phpt
index eab5cf1c4b..dfc843270e 100644
--- a/ext/calendar/tests/bug80185.phpt
+++ b/ext/calendar/tests/bug80185.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #80185 (jdtounix() fails after 2037)
+--EXTENSIONS--
+calendar
--SKIPIF--
<?php
-if (!extension_loaded('calendar')) die('skip ext/calendar required');
if (PHP_INT_SIZE != 8) die("skip for 64bit platforms only");
?>
--FILE--
diff --git a/ext/calendar/tests/bug80185_32bit.phpt b/ext/calendar/tests/bug80185_32bit.phpt
index 98a1bea2a3..a7fe96e0ff 100644
--- a/ext/calendar/tests/bug80185_32bit.phpt
+++ b/ext/calendar/tests/bug80185_32bit.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #80185 (jdtounix() fails after 2037)
+--EXTENSIONS--
+calendar
--SKIPIF--
<?php
-if (!extension_loaded('calendar')) die('skip ext/calendar required');
if (PHP_INT_SIZE != 4) die("skip for 32bit platforms only");
?>
--FILE--
diff --git a/ext/calendar/tests/cal_days_in_month.phpt b/ext/calendar/tests/cal_days_in_month.phpt
index fbd6362b0f..d94d39f2f6 100644
--- a/ext/calendar/tests/cal_days_in_month.phpt
+++ b/ext/calendar/tests/cal_days_in_month.phpt
@@ -1,7 +1,7 @@
--TEST--
cal_days_in_month()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
$num = cal_days_in_month(CAL_GREGORIAN, 8, 2003);
diff --git a/ext/calendar/tests/cal_days_in_month_error1.phpt b/ext/calendar/tests/cal_days_in_month_error1.phpt
index 2b7ee0ea88..f334888479 100644
--- a/ext/calendar/tests/cal_days_in_month_error1.phpt
+++ b/ext/calendar/tests/cal_days_in_month_error1.phpt
@@ -2,8 +2,8 @@
Test cal_days_in_month() function : error conditions
--CREDITS--
edgarsandi - <edgar.r.sandi@gmail.com>
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
try {
diff --git a/ext/calendar/tests/cal_from_jd.phpt b/ext/calendar/tests/cal_from_jd.phpt
index 9614522a05..4b2e27e9ab 100644
--- a/ext/calendar/tests/cal_from_jd.phpt
+++ b/ext/calendar/tests/cal_from_jd.phpt
@@ -1,7 +1,7 @@
--TEST--
cal_from_jd()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
print_r(cal_from_jd(1748326, CAL_GREGORIAN));
diff --git a/ext/calendar/tests/cal_from_jd_error1.phpt b/ext/calendar/tests/cal_from_jd_error1.phpt
index feafe240b5..3b4e11b835 100644
--- a/ext/calendar/tests/cal_from_jd_error1.phpt
+++ b/ext/calendar/tests/cal_from_jd_error1.phpt
@@ -2,8 +2,8 @@
Test cal_from_jd() function : error conditions
--CREDITS--
edgarsandi - <edgar.r.sandi@gmail.com>
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
try {
diff --git a/ext/calendar/tests/cal_info.phpt b/ext/calendar/tests/cal_info.phpt
index 0d4b823486..18884917e5 100644
--- a/ext/calendar/tests/cal_info.phpt
+++ b/ext/calendar/tests/cal_info.phpt
@@ -2,8 +2,8 @@
cal_info()
--INI--
date.timezone=UTC
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
print_r(cal_info());
diff --git a/ext/calendar/tests/cal_to_jd.phpt b/ext/calendar/tests/cal_to_jd.phpt
index fde1e0b455..cfcc5904b3 100644
--- a/ext/calendar/tests/cal_to_jd.phpt
+++ b/ext/calendar/tests/cal_to_jd.phpt
@@ -1,7 +1,7 @@
--TEST--
cal_to_jd()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
echo cal_to_jd(CAL_GREGORIAN, 8, 26, 74), "\n";
diff --git a/ext/calendar/tests/cal_to_jd_error1.phpt b/ext/calendar/tests/cal_to_jd_error1.phpt
index b8585c7f05..1cef36af69 100644
--- a/ext/calendar/tests/cal_to_jd_error1.phpt
+++ b/ext/calendar/tests/cal_to_jd_error1.phpt
@@ -2,8 +2,8 @@
Test cal_to_jd() function : error conditions
--CREDITS--
edgarsandi - <edgar.r.sandi@gmail.com>
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
try {
diff --git a/ext/calendar/tests/easter_date.phpt b/ext/calendar/tests/easter_date.phpt
index c784f02ebd..a41c310de9 100644
--- a/ext/calendar/tests/easter_date.phpt
+++ b/ext/calendar/tests/easter_date.phpt
@@ -4,8 +4,8 @@ easter_date()
date.timezone=UTC
--ENV--
TZ=UTC
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
putenv('TZ=UTC');
diff --git a/ext/calendar/tests/easter_days.phpt b/ext/calendar/tests/easter_days.phpt
index 04aa7ae11b..56ca7eaeb5 100644
--- a/ext/calendar/tests/easter_days.phpt
+++ b/ext/calendar/tests/easter_days.phpt
@@ -1,7 +1,7 @@
--TEST--
easter_days()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
echo easter_days(1999), "\n";
diff --git a/ext/calendar/tests/frenchtojd.phpt b/ext/calendar/tests/frenchtojd.phpt
index 73addb6b80..ca63789afe 100644
--- a/ext/calendar/tests/frenchtojd.phpt
+++ b/ext/calendar/tests/frenchtojd.phpt
@@ -1,7 +1,7 @@
--TEST--
frenchtojd()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
echo frenchtojd(-1,-1,-1), "\n";
diff --git a/ext/calendar/tests/gregoriantojd.phpt b/ext/calendar/tests/gregoriantojd.phpt
index aeecb3af51..9210aab036 100644
--- a/ext/calendar/tests/gregoriantojd.phpt
+++ b/ext/calendar/tests/gregoriantojd.phpt
@@ -1,7 +1,7 @@
--TEST--
gregoriantojd()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
echo gregoriantojd( 0, 0, 0). "\n";
diff --git a/ext/calendar/tests/gregoriantojd_overflow.phpt b/ext/calendar/tests/gregoriantojd_overflow.phpt
index 8cb4796e5c..f75aec7222 100644
--- a/ext/calendar/tests/gregoriantojd_overflow.phpt
+++ b/ext/calendar/tests/gregoriantojd_overflow.phpt
@@ -1,8 +1,9 @@
--TEST--
gregoriantojd()
+--EXTENSIONS--
+calendar
--SKIPIF--
<?php if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only"); ?>
-<?php include 'skipif.inc'; ?>
--FILE--
<?php
echo gregoriantojd(5, 5, 6000000) . "\n";
diff --git a/ext/calendar/tests/jddayofweek.phpt b/ext/calendar/tests/jddayofweek.phpt
index 0f3ca8a3f8..d3a5e90706 100644
--- a/ext/calendar/tests/jddayofweek.phpt
+++ b/ext/calendar/tests/jddayofweek.phpt
@@ -1,7 +1,7 @@
--TEST--
jddayofweek()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
foreach (array(2440588, 2452162, 2453926, -1000) as $jd) {
diff --git a/ext/calendar/tests/jdmonthname.phpt b/ext/calendar/tests/jdmonthname.phpt
index 07ed1161b1..3405f4100a 100644
--- a/ext/calendar/tests/jdmonthname.phpt
+++ b/ext/calendar/tests/jdmonthname.phpt
@@ -1,7 +1,7 @@
--TEST--
jdmonthname()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
foreach (array(2440588, 2452162, 2453926) as $jd) {
diff --git a/ext/calendar/tests/jdtofrench.phpt b/ext/calendar/tests/jdtofrench.phpt
index 2601d14a07..232f4ee97e 100644
--- a/ext/calendar/tests/jdtofrench.phpt
+++ b/ext/calendar/tests/jdtofrench.phpt
@@ -1,7 +1,7 @@
--TEST--
jdtofrench()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
echo jdtofrench(0). "\n";
diff --git a/ext/calendar/tests/jdtogregorian.phpt b/ext/calendar/tests/jdtogregorian.phpt
index e8bf4a49aa..b04309219b 100644
--- a/ext/calendar/tests/jdtogregorian.phpt
+++ b/ext/calendar/tests/jdtogregorian.phpt
@@ -1,7 +1,7 @@
--TEST--
jdtogregorian()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
echo jdtogregorian(0). "\n";
diff --git a/ext/calendar/tests/jdtogregorian_overflow.phpt b/ext/calendar/tests/jdtogregorian_overflow.phpt
index 9d4a1d6b4d..782e32797b 100644
--- a/ext/calendar/tests/jdtogregorian_overflow.phpt
+++ b/ext/calendar/tests/jdtogregorian_overflow.phpt
@@ -2,9 +2,10 @@
jdtogregorian(): test overflow
--CREDITS--
neweracracker@gmail.com
+--EXTENSIONS--
+calendar
--SKIPIF--
<?php
-if (!extension_loaded('calendar')) die('skip ext/calendar required');
if (PHP_INT_SIZE != 4) die('skip this test is for 32bit platforms only');
?>
--FILE--
diff --git a/ext/calendar/tests/jdtojewish.phpt b/ext/calendar/tests/jdtojewish.phpt
index 4fd104c50c..6b1c2e3f77 100644
--- a/ext/calendar/tests/jdtojewish.phpt
+++ b/ext/calendar/tests/jdtojewish.phpt
@@ -1,7 +1,7 @@
--TEST--
jdtojewish() function
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
diff --git a/ext/calendar/tests/jdtojewish64.phpt b/ext/calendar/tests/jdtojewish64.phpt
index da1e7f74c8..5f36558ee1 100644
--- a/ext/calendar/tests/jdtojewish64.phpt
+++ b/ext/calendar/tests/jdtojewish64.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #64895: Integer overflow in SndToJewish
+--EXTENSIONS--
+calendar
--SKIPIF--
<?php
-include 'skipif.inc';
if (PHP_INT_SIZE == 4) {
die("skip this test is for 64bit platform only");
}
diff --git a/ext/calendar/tests/jdtojewish_hebrew.phpt b/ext/calendar/tests/jdtojewish_hebrew.phpt
index f7df0358f7..ceb53c219e 100644
--- a/ext/calendar/tests/jdtojewish_hebrew.phpt
+++ b/ext/calendar/tests/jdtojewish_hebrew.phpt
@@ -1,9 +1,7 @@
--TEST--
Test all hebrew month names
---SKIPIF--
-<?php
-if (!extension_loaded('calendar')) die('skip calendar extension not available');
-?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
for ($year = 5000; $year <= 5001; $year++) {
diff --git a/ext/calendar/tests/jdtojewish_overflow.phpt b/ext/calendar/tests/jdtojewish_overflow.phpt
index 17a47e06e1..a3d8ba46f5 100644
--- a/ext/calendar/tests/jdtojewish_overflow.phpt
+++ b/ext/calendar/tests/jdtojewish_overflow.phpt
@@ -2,10 +2,8 @@
jdtojewish(): test overflow
--CREDITS--
neweracracker@gmail.com
---SKIPIF--
-<?php
-if (!extension_loaded('calendar')) die('skip ext/calendar required');
-?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
for ($i=324542840; $i<324542850; $i++) {
diff --git a/ext/calendar/tests/jdtojulian.phpt b/ext/calendar/tests/jdtojulian.phpt
index f4082e76ec..b13906b777 100644
--- a/ext/calendar/tests/jdtojulian.phpt
+++ b/ext/calendar/tests/jdtojulian.phpt
@@ -1,7 +1,7 @@
--TEST--
jdtojulian()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
echo jdtojulian(0). "\n";
diff --git a/ext/calendar/tests/jdtomonthname.phpt b/ext/calendar/tests/jdtomonthname.phpt
index fb70067bbe..23c970cfa7 100644
--- a/ext/calendar/tests/jdtomonthname.phpt
+++ b/ext/calendar/tests/jdtomonthname.phpt
@@ -1,7 +1,7 @@
--TEST--
jdtomonthname() test
---SKIPIF--
-<?php if (!extension_loaded("calendar")) print "skip"; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
diff --git a/ext/calendar/tests/jdtounix.phpt b/ext/calendar/tests/jdtounix.phpt
index 8d85543300..f9da430c54 100644
--- a/ext/calendar/tests/jdtounix.phpt
+++ b/ext/calendar/tests/jdtounix.phpt
@@ -2,8 +2,8 @@
jdtounix()
--INI--
date.timezone=UTC
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
echo date("Y-m-d",jdtounix(2440588)). "\n";
diff --git a/ext/calendar/tests/jdtounix_error1.phpt b/ext/calendar/tests/jdtounix_error1.phpt
index ba85958ec8..0032e376db 100644
--- a/ext/calendar/tests/jdtounix_error1.phpt
+++ b/ext/calendar/tests/jdtounix_error1.phpt
@@ -4,8 +4,8 @@ Test jdtounix() function : error conditions
edgarsandi - <edgar.r.sandi@gmail.com>
--INI--
date.timezone=UTC
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
try {
diff --git a/ext/calendar/tests/jewishtojd.phpt b/ext/calendar/tests/jewishtojd.phpt
index 2dd0381619..174a860729 100644
--- a/ext/calendar/tests/jewishtojd.phpt
+++ b/ext/calendar/tests/jewishtojd.phpt
@@ -1,7 +1,7 @@
--TEST--
jewishtojd()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
echo jewishtojd(-1,-1,-1). "\n";
diff --git a/ext/calendar/tests/juliantojd.phpt b/ext/calendar/tests/juliantojd.phpt
index 2f65d84f36..19a6b27048 100644
--- a/ext/calendar/tests/juliantojd.phpt
+++ b/ext/calendar/tests/juliantojd.phpt
@@ -1,7 +1,7 @@
--TEST--
juliantojd()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--FILE--
<?php
echo juliantojd( 0, 0, 0). "\n";
diff --git a/ext/calendar/tests/juliantojd_overflow.phpt b/ext/calendar/tests/juliantojd_overflow.phpt
index fb04c95495..cdf1b203d9 100644
--- a/ext/calendar/tests/juliantojd_overflow.phpt
+++ b/ext/calendar/tests/juliantojd_overflow.phpt
@@ -1,8 +1,9 @@
--TEST--
juliantojd()
+--EXTENSIONS--
+calendar
--SKIPIF--
<?php if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only"); ?>
-<?php include 'skipif.inc'; ?>
--FILE--
<?php
echo juliantojd(5, 5, 6000000000) . "\n";
diff --git a/ext/calendar/tests/skipif.inc b/ext/calendar/tests/skipif.inc
deleted file mode 100644
index e867fafd29..0000000000
--- a/ext/calendar/tests/skipif.inc
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-if(!extension_loaded("calendar"))
- print "skip - CALENDAR extension not available";
-?>
diff --git a/ext/calendar/tests/unixtojd.phpt b/ext/calendar/tests/unixtojd.phpt
index 28a05c0c6f..3d0ffa3fea 100644
--- a/ext/calendar/tests/unixtojd.phpt
+++ b/ext/calendar/tests/unixtojd.phpt
@@ -1,7 +1,7 @@
--TEST--
unixtojd()
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--ENV--
TZ=UTC
--FILE--
diff --git a/ext/calendar/tests/unixtojd_error1.phpt b/ext/calendar/tests/unixtojd_error1.phpt
index 000f047f0a..6b8fad05eb 100644
--- a/ext/calendar/tests/unixtojd_error1.phpt
+++ b/ext/calendar/tests/unixtojd_error1.phpt
@@ -2,8 +2,8 @@
Test unixtojd() function : error conditions
--CREDITS--
edgarsandi - <edgar.r.sandi@gmail.com>
---SKIPIF--
-<?php include 'skipif.inc'; ?>
+--EXTENSIONS--
+calendar
--INI--
date.timezone=UTC
--FILE--
diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c
index 3282bd9e50..0c4a3d82ed 100644
--- a/ext/com_dotnet/com_com.c
+++ b/ext/com_dotnet/com_com.c
@@ -279,7 +279,7 @@ PHP_FUNCTION(com_get_active_object)
char *module_name;
size_t module_name_len;
zend_long code_page;
- zend_bool code_page_is_null = 1;
+ bool code_page_is_null = 1;
IUnknown *unk = NULL;
IDispatch *obj = NULL;
HRESULT res;
@@ -751,7 +751,7 @@ PHP_FUNCTION(com_print_typeinfo)
char *ifacename = NULL;
char *typelibname = NULL;
size_t ifacelen;
- zend_bool wantsink = 0;
+ bool wantsink = 0;
php_com_dotnet_object *obj = NULL;
ITypeInfo *typeinfo;
@@ -814,7 +814,7 @@ PHP_FUNCTION(com_load_typelib)
char *name;
size_t namelen;
ITypeLib *pTL = NULL;
- zend_bool cs = TRUE;
+ bool cs = TRUE;
int codepage = COMG(code_page);
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "s|b", &name, &namelen, &cs)) {
diff --git a/ext/com_dotnet/com_extension.c b/ext/com_dotnet/com_extension.c
index 5e2c1f69de..6c256e7fc0 100644
--- a/ext/com_dotnet/com_extension.c
+++ b/ext/com_dotnet/com_extension.c
@@ -159,40 +159,33 @@ static PHP_GINIT_FUNCTION(com_dotnet)
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(com_dotnet)
{
- zend_class_entry ce, *tmp;
+ zend_class_entry *tmp;
php_com_wrapper_minit(INIT_FUNC_ARGS_PASSTHRU);
php_com_persist_minit(INIT_FUNC_ARGS_PASSTHRU);
- INIT_CLASS_ENTRY(ce, "com_exception", NULL);
- php_com_exception_class_entry = zend_register_internal_class_ex(&ce, zend_ce_exception);
- php_com_exception_class_entry->ce_flags |= ZEND_ACC_FINAL;
+ php_com_exception_class_entry = register_class_com_exception(zend_ce_exception);
/* php_com_exception_class_entry->constructor->common.fn_flags |= ZEND_ACC_PROTECTED; */
- INIT_CLASS_ENTRY(ce, "com_safearray_proxy", NULL);
- php_com_saproxy_class_entry = zend_register_internal_class(&ce);
- php_com_saproxy_class_entry->ce_flags |= ZEND_ACC_FINAL;
+ php_com_saproxy_class_entry = register_class_com_safearray_proxy();
/* php_com_saproxy_class_entry->constructor->common.fn_flags |= ZEND_ACC_PROTECTED; */
php_com_saproxy_class_entry->get_iterator = php_com_saproxy_iter_get;
- INIT_CLASS_ENTRY(ce, "variant", class_variant_methods);
- ce.create_object = php_com_object_new;
- php_com_variant_class_entry = zend_register_internal_class(&ce);
+ php_com_variant_class_entry = register_class_variant();
+ php_com_variant_class_entry->create_object = php_com_object_new;
php_com_variant_class_entry->get_iterator = php_com_iter_get;
php_com_variant_class_entry->serialize = zend_class_serialize_deny;
php_com_variant_class_entry->unserialize = zend_class_unserialize_deny;
- INIT_CLASS_ENTRY(ce, "com", class_com_methods);
- ce.create_object = php_com_object_new;
- tmp = zend_register_internal_class_ex(&ce, php_com_variant_class_entry);
+ tmp = register_class_com(php_com_variant_class_entry);
+ tmp->create_object = php_com_object_new;
tmp->get_iterator = php_com_iter_get;
tmp->serialize = zend_class_serialize_deny;
tmp->unserialize = zend_class_unserialize_deny;
#if HAVE_MSCOREE_H
- INIT_CLASS_ENTRY(ce, "dotnet", class_dotnet_methods);
- ce.create_object = php_com_object_new;
- tmp = zend_register_internal_class_ex(&ce, php_com_variant_class_entry);
+ tmp = register_class_dotnet(php_com_variant_class_entry);
+ tmp->create_object = php_com_object_new;
tmp->get_iterator = php_com_iter_get;
tmp->serialize = zend_class_serialize_deny;
tmp->unserialize = zend_class_unserialize_deny;
diff --git a/ext/com_dotnet/com_extension.stub.php b/ext/com_dotnet/com_extension.stub.php
index e3194efe06..8c46f319b9 100644
--- a/ext/com_dotnet/com_extension.stub.php
+++ b/ext/com_dotnet/com_extension.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function variant_set(variant $variant, mixed $value): void {}
@@ -71,18 +71,22 @@ class variant
public function __construct(mixed $value = null, int $type = VT_EMPTY, int $codepage = CP_ACP) {}
}
-class com
+class com extends variant
{
public function __construct(string $module_name, array|string|null $server_name = null, int $codepage = CP_ACP, string $typelib = "") {}
}
#if HAVE_MSCOREE_H
-class dotnet
+class dotnet extends variant
{
public function __construct(string $assembly_name, string $datatype_name, int $codepage = CP_ACP) {}
}
#endif
-final class com_exception extends exception
+final class com_safearray_proxy
+{
+}
+
+final class com_exception extends Exception
{
}
diff --git a/ext/com_dotnet/com_extension_arginfo.h b/ext/com_dotnet/com_extension_arginfo.h
index d290161fd0..cf9a08e711 100644
--- a/ext/com_dotnet/com_extension_arginfo.h
+++ b/ext/com_dotnet/com_extension_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 6b162963bcceb90144fdd3165137fb567f916812 */
+ * Stub hash: ba77cee0a718bcbe7ac280f07a41f9e97a8e2246 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_variant_set, 0, 2, IS_VOID, 0)
ZEND_ARG_OBJ_INFO(0, variant, variant, 0)
@@ -228,6 +228,63 @@ static const zend_function_entry class_dotnet_methods[] = {
};
+static const zend_function_entry class_com_safearray_proxy_methods[] = {
+ ZEND_FE_END
+};
+
+
static const zend_function_entry class_com_exception_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_variant(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "variant", class_variant_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_com(zend_class_entry *class_entry_variant)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "com", class_com_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_variant);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_dotnet(zend_class_entry *class_entry_variant)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "dotnet", class_dotnet_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_variant);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_com_safearray_proxy(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "com_safearray_proxy", class_com_safearray_proxy_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_com_exception(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "com_exception", class_com_exception_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c
index fb4af4efec..c0e335a165 100644
--- a/ext/com_dotnet/com_handlers.c
+++ b/ext/com_dotnet/com_handlers.c
@@ -335,7 +335,7 @@ static zend_function *com_method_get(zend_object **object_ptr, zend_string *name
f.arg_info = ecalloc(bindptr.lpfuncdesc->cParams, sizeof(zend_arg_info));
for (i = 0; i < bindptr.lpfuncdesc->cParams; i++) {
- zend_bool by_ref = (bindptr.lpfuncdesc->lprgelemdescParam[i].paramdesc.wParamFlags & PARAMFLAG_FOUT) != 0;
+ bool by_ref = (bindptr.lpfuncdesc->lprgelemdescParam[i].paramdesc.wParamFlags & PARAMFLAG_FOUT) != 0;
f.arg_info[i].type = (zend_type) ZEND_TYPE_INIT_NONE(_ZEND_ARG_INFO_FLAGS(by_ref, 0));
}
diff --git a/ext/com_dotnet/com_persist.c b/ext/com_dotnet/com_persist.c
index 3bde7175d8..2c2cc4226e 100644
--- a/ext/com_dotnet/com_persist.c
+++ b/ext/com_dotnet/com_persist.c
@@ -363,7 +363,7 @@ CPH_METHOD(SaveToFile)
HRESULT res;
char *filename, *fullpath = NULL;
size_t filename_len;
- zend_bool remember = TRUE;
+ bool remember = TRUE;
OLECHAR *olefilename = NULL;
CPH_FETCH();
@@ -721,16 +721,12 @@ static zend_object* helper_new(zend_class_entry *ce)
int php_com_persist_minit(INIT_FUNC_ARGS)
{
- zend_class_entry ce;
-
memcpy(&helper_handlers, &std_object_handlers, sizeof(helper_handlers));
helper_handlers.free_obj = helper_free_storage;
helper_handlers.clone_obj = helper_clone;
- INIT_CLASS_ENTRY(ce, "COMPersistHelper", class_COMPersistHelper_methods);
- ce.create_object = helper_new;
- helper_ce = zend_register_internal_class(&ce);
- helper_ce->ce_flags |= ZEND_ACC_FINAL;
+ helper_ce = register_class_COMPersistHelper();
+ helper_ce->create_object = helper_new;
le_istream = zend_register_list_destructors_ex(istream_dtor,
NULL, "com_dotnet_istream_wrapper", module_number);
diff --git a/ext/com_dotnet/com_persist.stub.php b/ext/com_dotnet/com_persist.stub.php
index b0e9ef6b5c..2a2b7ac5cb 100644
--- a/ext/com_dotnet/com_persist.stub.php
+++ b/ext/com_dotnet/com_persist.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
final class COMPersistHelper
{
diff --git a/ext/com_dotnet/com_persist_arginfo.h b/ext/com_dotnet/com_persist_arginfo.h
index dc8bd6fa48..410782098d 100644
--- a/ext/com_dotnet/com_persist_arginfo.h
+++ b/ext/com_dotnet/com_persist_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 2c2759e6c1894713439e3ee8da7f56810d00d8cf */
+ * Stub hash: d14d30fb232f08da37ba0df0b9186eb8bac5e1a4 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_COMPersistHelper___construct, 0, 0, 0)
ZEND_ARG_OBJ_INFO_WITH_DEFAULT_VALUE(0, variant, variant, 1, "null")
@@ -52,3 +52,14 @@ static const zend_function_entry class_COMPersistHelper_methods[] = {
ZEND_ME(COMPersistHelper, SaveToStream, arginfo_class_COMPersistHelper_SaveToStream, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_COMPersistHelper(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "COMPersistHelper", class_COMPersistHelper_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
diff --git a/ext/com_dotnet/php_com_dotnet.h b/ext/com_dotnet/php_com_dotnet.h
index 025e1a7dd0..7a554d7268 100644
--- a/ext/com_dotnet/php_com_dotnet.h
+++ b/ext/com_dotnet/php_com_dotnet.h
@@ -36,13 +36,13 @@ PHP_RSHUTDOWN_FUNCTION(com_dotnet);
PHP_MINFO_FUNCTION(com_dotnet);
ZEND_BEGIN_MODULE_GLOBALS(com_dotnet)
- zend_bool allow_dcom;
- zend_bool autoreg_verbose;
- zend_bool autoreg_on;
- zend_bool autoreg_case_sensitive;
+ bool allow_dcom;
+ bool autoreg_verbose;
+ bool autoreg_on;
+ bool autoreg_case_sensitive;
void *dotnet_runtime_stuff; /* opaque to avoid cluttering up other modules */
int code_page; /* default code_page if left unspecified */
- zend_bool rshutdown_started;
+ bool rshutdown_started;
ZEND_END_MODULE_GLOBALS(com_dotnet)
#if defined(ZTS) && defined(COMPILE_DL_COM_DOTNET)
diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h
index e80bf6e312..d2b772e063 100644
--- a/ext/com_dotnet/php_com_dotnet_internal.h
+++ b/ext/com_dotnet/php_com_dotnet_internal.h
@@ -51,9 +51,9 @@ typedef struct _php_com_dotnet_object {
static inline int php_com_is_valid_object(zval *zv)
{
zend_class_entry *ce = Z_OBJCE_P(zv);
- return strcmp("com", ce->name->val) == 0 ||
- strcmp("dotnet", ce->name->val) == 0 ||
- strcmp("variant", ce->name->val) == 0;
+ return zend_string_equals_literal(ce->name, "com") ||
+ zend_string_equals_literal(ce->name, "dotnet") ||
+ zend_string_equals_literal(ce->name, "variant");
}
#define CDNO_FETCH(zv) (php_com_dotnet_object*)Z_OBJ_P(zv)
diff --git a/ext/com_dotnet/tests/27974.phpt b/ext/com_dotnet/tests/27974.phpt
index c76dda9ed5..ca7735a829 100644
--- a/ext/com_dotnet/tests/27974.phpt
+++ b/ext/com_dotnet/tests/27974.phpt
@@ -1,8 +1,7 @@
--TEST--
COM: mapping a safearray
---SKIPIF--
-<?php
-if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present"; ?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
error_reporting(E_ALL);
diff --git a/ext/com_dotnet/tests/bug33386.phpt b/ext/com_dotnet/tests/bug33386.phpt
index 7f305d2eb5..10e9021a0b 100644
--- a/ext/com_dotnet/tests/bug33386.phpt
+++ b/ext/com_dotnet/tests/bug33386.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #33386 (ScriptControl only sees last function of class)
+--EXTENSIONS--
+com_dotnet
--SKIPIF--
<?php
-if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present";
if (4 != PHP_INT_SIZE) print "skip MSScriptControl isn't available under x64";
?>
--FILE--
diff --git a/ext/com_dotnet/tests/bug34272.phpt b/ext/com_dotnet/tests/bug34272.phpt
index ce8a552dfd..27dc5142d3 100644
--- a/ext/com_dotnet/tests/bug34272.phpt
+++ b/ext/com_dotnet/tests/bug34272.phpt
@@ -1,8 +1,7 @@
--TEST--
Bug #34272 (empty array onto COM object blows up)
---SKIPIF--
-<?php
-if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present"; ?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
error_reporting(E_ALL);
diff --git a/ext/com_dotnet/tests/bug39596.phpt b/ext/com_dotnet/tests/bug39596.phpt
index 1510db49cf..d6215f0596 100644
--- a/ext/com_dotnet/tests/bug39596.phpt
+++ b/ext/com_dotnet/tests/bug39596.phpt
@@ -1,8 +1,7 @@
--TEST--
Bug #39596 (Creating Variant of type VT_ARRAY)
---SKIPIF--
-<?php
-if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present"; ?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
error_reporting(E_ALL);
diff --git a/ext/com_dotnet/tests/bug39606.phpt b/ext/com_dotnet/tests/bug39606.phpt
index f646c6a7c3..6f01acd471 100644
--- a/ext/com_dotnet/tests/bug39606.phpt
+++ b/ext/com_dotnet/tests/bug39606.phpt
@@ -1,8 +1,7 @@
--TEST--
COM: Loading typelib corrupts memory
---SKIPIF--
-<?php
-if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present"; ?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
error_reporting(E_ALL);
diff --git a/ext/com_dotnet/tests/bug45280.phpt b/ext/com_dotnet/tests/bug45280.phpt
index 393799e374..a461871f2f 100644
--- a/ext/com_dotnet/tests/bug45280.phpt
+++ b/ext/com_dotnet/tests/bug45280.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #45280 (Reflection of instantiated COM classes causes PHP to crash)
---SKIPIF--
-<?php
-if (!extension_loaded("com_dotnet")){ echo "skip COM/.Net support not present"; }
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
$dict = new COM("Scripting.Dictionary");
diff --git a/ext/com_dotnet/tests/bug49192.phpt b/ext/com_dotnet/tests/bug49192.phpt
index cd85a9a64c..519ac21180 100644
--- a/ext/com_dotnet/tests/bug49192.phpt
+++ b/ext/com_dotnet/tests/bug49192.phpt
@@ -1,8 +1,7 @@
--TEST--
Bug #49192 (PHP crashes when GC invoked on COM object)
---SKIPIF--
-<?php
-if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present"; ?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
diff --git a/ext/com_dotnet/tests/bug62474.phpt b/ext/com_dotnet/tests/bug62474.phpt
index cc8e252224..531ba9a640 100644
--- a/ext/com_dotnet/tests/bug62474.phpt
+++ b/ext/com_dotnet/tests/bug62474.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #62474 (com_event_sink crashes on certain arguments)
---SKIPIF--
-<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
var_dump(com_event_sink(new variant, function() {}, array()));
diff --git a/ext/com_dotnet/tests/bug63208.phpt b/ext/com_dotnet/tests/bug63208.phpt
index ae62dbba98..67ea9f50f9 100644
--- a/ext/com_dotnet/tests/bug63208.phpt
+++ b/ext/com_dotnet/tests/bug63208.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #63208 (BSTR to PHP string conversion not binary safe)
---SKIPIF--
-<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
$string = "\u{0905}b\0cd";
diff --git a/ext/com_dotnet/tests/bug64130.phpt b/ext/com_dotnet/tests/bug64130.phpt
index 0f8e083295..ba47c85322 100644
--- a/ext/com_dotnet/tests/bug64130.phpt
+++ b/ext/com_dotnet/tests/bug64130.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #64130 (COM obj parameters passed by reference are not updated)
+--EXTENSIONS--
+com_dotnet
--SKIPIF--
<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
if (PHP_INT_SIZE != 4) die('skip for 32bit platforms only');
try {
$ie = new com('InternetExplorer.Application');
diff --git a/ext/com_dotnet/tests/bug66322.phpt b/ext/com_dotnet/tests/bug66322.phpt
index de37e4fa75..56988a82cc 100644
--- a/ext/com_dotnet/tests/bug66322.phpt
+++ b/ext/com_dotnet/tests/bug66322.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #66322 (COMPersistHelper::SaveToFile can save to wrong location)
+--EXTENSIONS--
+com_dotnet
--SKIPIF--
<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
try {
new COM('Word.Application');
} catch (com_exception $ex) {
diff --git a/ext/com_dotnet/tests/bug66431_0.phpt b/ext/com_dotnet/tests/bug66431_0.phpt
index 5f9bc5c0b0..ef4d63f441 100644
--- a/ext/com_dotnet/tests/bug66431_0.phpt
+++ b/ext/com_dotnet/tests/bug66431_0.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #66431 Special Character via COM Interface (CP_UTF8), Scripting.FileSystemObject
---SKIPIF--
-<?php
-if (!extension_loaded("com_dotnet")){ echo "skip COM/.Net support not present"; }
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
diff --git a/ext/com_dotnet/tests/bug66431_1.phpt b/ext/com_dotnet/tests/bug66431_1.phpt
index 7ebf16a10d..7f783dbf64 100644
--- a/ext/com_dotnet/tests/bug66431_1.phpt
+++ b/ext/com_dotnet/tests/bug66431_1.phpt
@@ -1,9 +1,9 @@
--TEST--
Bug #66431 Special Character via COM Interface (CP_UTF8), Application.Word
+--EXTENSIONS--
+com_dotnet
--SKIPIF--
<?php
-if (!extension_loaded("com_dotnet")){ echo "skip COM/.Net support not present"; }
-
try {
new COM("word.application", NULL, CP_UTF8);
} catch (Exception $e) {
diff --git a/ext/com_dotnet/tests/bug69939.phpt b/ext/com_dotnet/tests/bug69939.phpt
index 49ad20787a..d650382d93 100644
--- a/ext/com_dotnet/tests/bug69939.phpt
+++ b/ext/com_dotnet/tests/bug69939.phpt
@@ -1,8 +1,7 @@
--TEST--
Bug #69939 (Casting object to bool returns false)
---SKIPIF--
-<?php
-if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present"; ?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
var_dump((bool) new COM('WScript.Shell'));
diff --git a/ext/com_dotnet/tests/bug72498.phpt b/ext/com_dotnet/tests/bug72498.phpt
index b9bd498af3..67285e8523 100644
--- a/ext/com_dotnet/tests/bug72498.phpt
+++ b/ext/com_dotnet/tests/bug72498.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #72498 variant_date_from_timestamp null dereference
---SKIPIF--
-<?php
-if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present";
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
diff --git a/ext/com_dotnet/tests/bug73679.phpt b/ext/com_dotnet/tests/bug73679.phpt
index 235fd3e33e..9815cdcaac 100644
--- a/ext/com_dotnet/tests/bug73679.phpt
+++ b/ext/com_dotnet/tests/bug73679.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #73679 DOTNET read access violation using invalid codepage
+--EXTENSIONS--
+com_dotnet
--SKIPIF--
<?php
-if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present";
if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platforms only");
?>
--FILE--
diff --git a/ext/com_dotnet/tests/bug77177.phpt b/ext/com_dotnet/tests/bug77177.phpt
index 8fcfd5a378..19e4c11995 100644
--- a/ext/com_dotnet/tests/bug77177.phpt
+++ b/ext/com_dotnet/tests/bug77177.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #77177 (Serializing or unserializing COM objects crashes)
---SKIPIF--
-<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
$com = new COM("WScript.Shell");
diff --git a/ext/com_dotnet/tests/bug77578.phpt b/ext/com_dotnet/tests/bug77578.phpt
index 910f24909b..2bf2cbf2c0 100644
--- a/ext/com_dotnet/tests/bug77578.phpt
+++ b/ext/com_dotnet/tests/bug77578.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #77578 (Crash when php unload)
---SKIPIF--
-<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
// To actually be able to verify the crash during shutdown on Windows, we have
diff --git a/ext/com_dotnet/tests/bug77621.phpt b/ext/com_dotnet/tests/bug77621.phpt
index 32e879dcd0..74972749e5 100644
--- a/ext/com_dotnet/tests/bug77621.phpt
+++ b/ext/com_dotnet/tests/bug77621.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #77621 (Already defined constants are not properly reported)
---SKIPIF--
-<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
-?>
+--EXTENSIONS--
+com_dotnet
--INI--
com.autoregister_verbose=1
--FILE--
diff --git a/ext/com_dotnet/tests/bug78650.phpt b/ext/com_dotnet/tests/bug78650.phpt
index c362de95bb..ca2a235af2 100644
--- a/ext/com_dotnet/tests/bug78650.phpt
+++ b/ext/com_dotnet/tests/bug78650.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #78650 (new COM Crash)
---SKIPIF--
-<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
$fname = __DIR__ . '/bug78650/foo/bar';
diff --git a/ext/com_dotnet/tests/bug78694.phpt b/ext/com_dotnet/tests/bug78694.phpt
index adf0c828ca..f44b00a4f4 100644
--- a/ext/com_dotnet/tests/bug78694.phpt
+++ b/ext/com_dotnet/tests/bug78694.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #78694 (Appending to a variant array causes segfault)
---SKIPIF--
-<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
foreach ([new com('WScript.Shell'), new variant([])] as $var) {
diff --git a/ext/com_dotnet/tests/bug79242.phpt b/ext/com_dotnet/tests/bug79242.phpt
index 46c5d8af3b..cda4d58ff9 100644
--- a/ext/com_dotnet/tests/bug79242.phpt
+++ b/ext/com_dotnet/tests/bug79242.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #79242 (COM error constants don't match com_exception codes)
+--EXTENSIONS--
+com_dotnet
--SKIPIF--
<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platforms only");
?>
--FILE--
diff --git a/ext/com_dotnet/tests/bug79247.phpt b/ext/com_dotnet/tests/bug79247.phpt
index 55e24b1796..2cda351d54 100644
--- a/ext/com_dotnet/tests/bug79247.phpt
+++ b/ext/com_dotnet/tests/bug79247.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #79247 (Garbage collecting variant objects segfaults)
---SKIPIF--
-<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
$keep = new variant(null);
diff --git a/ext/com_dotnet/tests/bug79248.phpt b/ext/com_dotnet/tests/bug79248.phpt
index fda67551a7..c43c1f5338 100644
--- a/ext/com_dotnet/tests/bug79248.phpt
+++ b/ext/com_dotnet/tests/bug79248.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #79248 (Traversing empty VT_ARRAY throws com_exception)
---SKIPIF--
-<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
$v = new variant([], VT_ARRAY);
diff --git a/ext/com_dotnet/tests/bug79299.phpt b/ext/com_dotnet/tests/bug79299.phpt
index 99c1a99742..ac4a94cd77 100644
--- a/ext/com_dotnet/tests/bug79299.phpt
+++ b/ext/com_dotnet/tests/bug79299.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #79299 (com_print_typeinfo prints duplicate variables)
---SKIPIF--
-<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
$dict = new COM("Scripting.Dictionary");
diff --git a/ext/com_dotnet/tests/bug79332.phpt b/ext/com_dotnet/tests/bug79332.phpt
index 93add95d15..28443478d9 100644
--- a/ext/com_dotnet/tests/bug79332.phpt
+++ b/ext/com_dotnet/tests/bug79332.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #79332 (php_istreams are never freed)
---SKIPIF--
-<?php
-if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
-?>
+--EXTENSIONS--
+com_dotnet
--FILE--
<?php
$ph = new COMPersistHelper(null);
diff --git a/ext/com_dotnet/tests/variants.phpt b/ext/com_dotnet/tests/variants.phpt
index e28823c3ad..8547e65efb 100644
--- a/ext/com_dotnet/tests/variants.phpt
+++ b/ext/com_dotnet/tests/variants.phpt
@@ -1,8 +1,9 @@
--TEST--
COM: General variant tests
+--EXTENSIONS--
+com_dotnet
--SKIPIF--
<?php
-if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present";
if (4 != PHP_INT_SIZE) print "skip x86 only"; ?>
--FILE--
<?php
diff --git a/ext/com_dotnet/tests/variants_x64.phpt b/ext/com_dotnet/tests/variants_x64.phpt
index 1ca93c5709..0017ec64fd 100644
--- a/ext/com_dotnet/tests/variants_x64.phpt
+++ b/ext/com_dotnet/tests/variants_x64.phpt
@@ -1,8 +1,9 @@
--TEST--
COM: General variant tests
+--EXTENSIONS--
+com_dotnet
--SKIPIF--
<?php
-if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present";
if (8 != PHP_INT_SIZE) print "skip x64 only";
if ((string) variant_cat(new VARIANT(false), new VARIANT(0.5)) != 'False0.5')
print "skip English locale only";
diff --git a/ext/ctype/ctype.stub.php b/ext/ctype/ctype.stub.php
index bcc722c12d..8bbc744d5a 100644
--- a/ext/ctype/ctype.stub.php
+++ b/ext/ctype/ctype.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function ctype_alnum(mixed $text): bool {}
diff --git a/ext/ctype/ctype_arginfo.h b/ext/ctype/ctype_arginfo.h
index 10d8ae9bf1..94d783fa9a 100644
--- a/ext/ctype/ctype_arginfo.h
+++ b/ext/ctype/ctype_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: aa287af25fe33a05d15d85b92b0edcfae00284a2 */
+ * Stub hash: 155783e1858a7f24dbc1c3e810d5cffee5468bf7 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ctype_alnum, 0, 1, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, text, IS_MIXED, 0)
diff --git a/ext/ctype/tests/001.phpt b/ext/ctype/tests/001.phpt
index 1351faed94..ba9fe48497 100644
--- a/ext/ctype/tests/001.phpt
+++ b/ext/ctype/tests/001.phpt
@@ -1,7 +1,7 @@
--TEST--
ctype on integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
setlocale(LC_ALL,"C");
diff --git a/ext/ctype/tests/002.phpt b/ext/ctype/tests/002.phpt
index b1dd87f306..8ceea190a2 100644
--- a/ext/ctype/tests/002.phpt
+++ b/ext/ctype/tests/002.phpt
@@ -1,7 +1,7 @@
--TEST--
ctype on strings
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
diff --git a/ext/ctype/tests/bug25745.phpt b/ext/ctype/tests/bug25745.phpt
index 3996dd8242..8c8da4eb42 100644
--- a/ext/ctype/tests/bug25745.phpt
+++ b/ext/ctype/tests/bug25745.phpt
@@ -1,7 +1,7 @@
--TEST--
Bug #25745 (ctype functions fail with non-ascii characters)
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
$funcs = array(
diff --git a/ext/ctype/tests/bug34645.phpt b/ext/ctype/tests/bug34645.phpt
index 7aa386235d..6d0ca825d1 100644
--- a/ext/ctype/tests/bug34645.phpt
+++ b/ext/ctype/tests/bug34645.phpt
@@ -1,7 +1,7 @@
--TEST--
Bug #34645 (ctype corrupts memory when validating large numbers)
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
$id = 394829384;
diff --git a/ext/ctype/tests/ctype_alnum_basic.phpt b/ext/ctype/tests/ctype_alnum_basic.phpt
index 7cc71a27b2..bf8202d79f 100644
--- a/ext/ctype/tests/ctype_alnum_basic.phpt
+++ b/ext/ctype/tests/ctype_alnum_basic.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_alnum() function : basic functionality
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
echo "*** Testing ctype_alnum() : basic functionality ***\n";
diff --git a/ext/ctype/tests/ctype_alnum_variation1.phpt b/ext/ctype/tests/ctype_alnum_variation1.phpt
index 5af4f14e15..0f9f5090c3 100644
--- a/ext/ctype/tests/ctype_alnum_variation1.phpt
+++ b/ext/ctype/tests/ctype_alnum_variation1.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_alnum() function : usage variations - Different data types as $c arg
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_alnum_variation2.phpt b/ext/ctype/tests/ctype_alnum_variation2.phpt
index 1e6147c6e6..9651bedb14 100644
--- a/ext/ctype/tests/ctype_alnum_variation2.phpt
+++ b/ext/ctype/tests/ctype_alnum_variation2.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_alnum() function : usage variations - different integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_alnum_variation3.phpt b/ext/ctype/tests/ctype_alnum_variation3.phpt
index f7de0707d2..82a862397d 100644
--- a/ext/ctype/tests/ctype_alnum_variation3.phpt
+++ b/ext/ctype/tests/ctype_alnum_variation3.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_alnum() function : usage variations - different string values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_alnum_variation4.phpt b/ext/ctype/tests/ctype_alnum_variation4.phpt
index d998190ac4..67382986a8 100644
--- a/ext/ctype/tests/ctype_alnum_variation4.phpt
+++ b/ext/ctype/tests/ctype_alnum_variation4.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_alnum() function : usage variations - octal and hexadecimal values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_alpha_basic.phpt b/ext/ctype/tests/ctype_alpha_basic.phpt
index a17d4d92bf..641d29a1eb 100644
--- a/ext/ctype/tests/ctype_alpha_basic.phpt
+++ b/ext/ctype/tests/ctype_alpha_basic.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_alpha() function : basic functionality
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
echo "*** Testing ctype_alpha() : basic functionality ***\n";
diff --git a/ext/ctype/tests/ctype_alpha_variation1.phpt b/ext/ctype/tests/ctype_alpha_variation1.phpt
index a372e926b9..c49bc57043 100644
--- a/ext/ctype/tests/ctype_alpha_variation1.phpt
+++ b/ext/ctype/tests/ctype_alpha_variation1.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_alpha() function : usage variations - different data types as $c arg
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_alpha_variation2.phpt b/ext/ctype/tests/ctype_alpha_variation2.phpt
index f36dbf2da8..e8f55a8b97 100644
--- a/ext/ctype/tests/ctype_alpha_variation2.phpt
+++ b/ext/ctype/tests/ctype_alpha_variation2.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_alpha() function : usage variations - different integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_alpha_variation3.phpt b/ext/ctype/tests/ctype_alpha_variation3.phpt
index 3f7402e52c..d7184d3a7a 100644
--- a/ext/ctype/tests/ctype_alpha_variation3.phpt
+++ b/ext/ctype/tests/ctype_alpha_variation3.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_alpha() function : usage variations - different strings
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_alpha_variation4.phpt b/ext/ctype/tests/ctype_alpha_variation4.phpt
index f5e96a19ff..829300ea8b 100644
--- a/ext/ctype/tests/ctype_alpha_variation4.phpt
+++ b/ext/ctype/tests/ctype_alpha_variation4.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_alpha() function : usage variations - Octal and hexadecimal values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_cntrl_basic.phpt b/ext/ctype/tests/ctype_cntrl_basic.phpt
index 4052663c0d..3822386f29 100644
--- a/ext/ctype/tests/ctype_cntrl_basic.phpt
+++ b/ext/ctype/tests/ctype_cntrl_basic.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_cntrl() function : basic functionality
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
echo "*** Testing ctype_cntrl() : basic functionality ***\n";
diff --git a/ext/ctype/tests/ctype_cntrl_variation1.phpt b/ext/ctype/tests/ctype_cntrl_variation1.phpt
index 7e8c6b19d7..336b1f068e 100644
--- a/ext/ctype/tests/ctype_cntrl_variation1.phpt
+++ b/ext/ctype/tests/ctype_cntrl_variation1.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_cntrl() function : usage variations - Different data types as $c arg
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_cntrl_variation2.phpt b/ext/ctype/tests/ctype_cntrl_variation2.phpt
index c5b3451828..c2d7e34f64 100644
--- a/ext/ctype/tests/ctype_cntrl_variation2.phpt
+++ b/ext/ctype/tests/ctype_cntrl_variation2.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_cntrl() function : usage variations - different integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_cntrl_variation3.phpt b/ext/ctype/tests/ctype_cntrl_variation3.phpt
index f177c7bc27..3db325bb35 100644
--- a/ext/ctype/tests/ctype_cntrl_variation3.phpt
+++ b/ext/ctype/tests/ctype_cntrl_variation3.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_cntrl() function : usage variations - Different strings
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_cntrl_variation4.phpt b/ext/ctype/tests/ctype_cntrl_variation4.phpt
index ee56823243..e9202c3325 100644
--- a/ext/ctype/tests/ctype_cntrl_variation4.phpt
+++ b/ext/ctype/tests/ctype_cntrl_variation4.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_cntrl() function : usage variations - Octal and hexadecimal values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_digit_basic.phpt b/ext/ctype/tests/ctype_digit_basic.phpt
index 7959b7ff18..463a39a20b 100644
--- a/ext/ctype/tests/ctype_digit_basic.phpt
+++ b/ext/ctype/tests/ctype_digit_basic.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_digit() function : basic functionality
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
echo "*** Testing ctype_digit() : basic functionality ***\n";
diff --git a/ext/ctype/tests/ctype_digit_variation1.phpt b/ext/ctype/tests/ctype_digit_variation1.phpt
index 65126ffc58..190c075a70 100644
--- a/ext/ctype/tests/ctype_digit_variation1.phpt
+++ b/ext/ctype/tests/ctype_digit_variation1.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_digit() function : usage variations - different data types as $c arg
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_digit_variation2.phpt b/ext/ctype/tests/ctype_digit_variation2.phpt
index e7b79263db..76300585cd 100644
--- a/ext/ctype/tests/ctype_digit_variation2.phpt
+++ b/ext/ctype/tests/ctype_digit_variation2.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_digit() function : usage variations - different integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_digit_variation3.phpt b/ext/ctype/tests/ctype_digit_variation3.phpt
index bb42c2e0d8..47f2ca6528 100644
--- a/ext/ctype/tests/ctype_digit_variation3.phpt
+++ b/ext/ctype/tests/ctype_digit_variation3.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_digit() function : usage variations - different strings
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_digit_variation4.phpt b/ext/ctype/tests/ctype_digit_variation4.phpt
index 2bf78b4df4..63fff0275a 100644
--- a/ext/ctype/tests/ctype_digit_variation4.phpt
+++ b/ext/ctype/tests/ctype_digit_variation4.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_digit() function : usage variations - octal and hexadecimal values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_graph_basic.phpt b/ext/ctype/tests/ctype_graph_basic.phpt
index c38529bbea..6a5df1a3a6 100644
--- a/ext/ctype/tests/ctype_graph_basic.phpt
+++ b/ext/ctype/tests/ctype_graph_basic.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_graph() function : basic functionality
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
echo "*** Testing ctype_graph() : basic functionality ***\n";
diff --git a/ext/ctype/tests/ctype_graph_variation1.phpt b/ext/ctype/tests/ctype_graph_variation1.phpt
index 1d7bc182e8..3a04e9c3f5 100644
--- a/ext/ctype/tests/ctype_graph_variation1.phpt
+++ b/ext/ctype/tests/ctype_graph_variation1.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_graph() function : usage variations - different data types as $c arg
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_graph_variation2.phpt b/ext/ctype/tests/ctype_graph_variation2.phpt
index 3304a16240..3361798a05 100644
--- a/ext/ctype/tests/ctype_graph_variation2.phpt
+++ b/ext/ctype/tests/ctype_graph_variation2.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_graph() function : usage variations - different integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_graph_variation3.phpt b/ext/ctype/tests/ctype_graph_variation3.phpt
index 733825bfde..cbce657e37 100644
--- a/ext/ctype/tests/ctype_graph_variation3.phpt
+++ b/ext/ctype/tests/ctype_graph_variation3.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_graph() function : usage variations - different strings
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_graph_variation4.phpt b/ext/ctype/tests/ctype_graph_variation4.phpt
index 8fbaab39d3..de49393d02 100644
--- a/ext/ctype/tests/ctype_graph_variation4.phpt
+++ b/ext/ctype/tests/ctype_graph_variation4.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_graph() function : usage variations - octal and hexadecimal values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_lower_basic.phpt b/ext/ctype/tests/ctype_lower_basic.phpt
index 79560917f5..dce5e1813f 100644
--- a/ext/ctype/tests/ctype_lower_basic.phpt
+++ b/ext/ctype/tests/ctype_lower_basic.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_lower() function : basic functionality
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
echo "*** Testing ctype_lower() : basic functionality ***\n";
diff --git a/ext/ctype/tests/ctype_lower_variation1.phpt b/ext/ctype/tests/ctype_lower_variation1.phpt
index b236eed2b9..4c606caad7 100644
--- a/ext/ctype/tests/ctype_lower_variation1.phpt
+++ b/ext/ctype/tests/ctype_lower_variation1.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_lower() function : usage variations - different data types as $c arg
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_lower_variation2.phpt b/ext/ctype/tests/ctype_lower_variation2.phpt
index b3ed8d03e5..86feadd15c 100644
--- a/ext/ctype/tests/ctype_lower_variation2.phpt
+++ b/ext/ctype/tests/ctype_lower_variation2.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_lower() function : usage variations - different integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_lower_variation3.phpt b/ext/ctype/tests/ctype_lower_variation3.phpt
index bba8be038b..5bb9fa91e1 100644
--- a/ext/ctype/tests/ctype_lower_variation3.phpt
+++ b/ext/ctype/tests/ctype_lower_variation3.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_lower() function : usage variations - different strings
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_lower_variation4.phpt b/ext/ctype/tests/ctype_lower_variation4.phpt
index f7cfc18b86..f1ad56580f 100644
--- a/ext/ctype/tests/ctype_lower_variation4.phpt
+++ b/ext/ctype/tests/ctype_lower_variation4.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_lower() function : usage variations - octal and hexadecimal values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_print_basic.phpt b/ext/ctype/tests/ctype_print_basic.phpt
index aa354e869e..df3eeebaf1 100644
--- a/ext/ctype/tests/ctype_print_basic.phpt
+++ b/ext/ctype/tests/ctype_print_basic.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_print() function : basic functionality
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
echo "*** Testing ctype_print() : basic functionality ***\n";
diff --git a/ext/ctype/tests/ctype_print_variation1.phpt b/ext/ctype/tests/ctype_print_variation1.phpt
index 06ba0d82e0..49f9e95cee 100644
--- a/ext/ctype/tests/ctype_print_variation1.phpt
+++ b/ext/ctype/tests/ctype_print_variation1.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_print() function : usage variations - different data types as $c arg
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_print_variation2.phpt b/ext/ctype/tests/ctype_print_variation2.phpt
index 1178118020..12617de81d 100644
--- a/ext/ctype/tests/ctype_print_variation2.phpt
+++ b/ext/ctype/tests/ctype_print_variation2.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_print() function : usage variations - different integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_print_variation3.phpt b/ext/ctype/tests/ctype_print_variation3.phpt
index f79cfa20ac..dc7ac0d9ca 100644
--- a/ext/ctype/tests/ctype_print_variation3.phpt
+++ b/ext/ctype/tests/ctype_print_variation3.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_print() function : usage variations - different strings
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_print_variation4.phpt b/ext/ctype/tests/ctype_print_variation4.phpt
index be0d148019..94e76ecaf0 100644
--- a/ext/ctype/tests/ctype_print_variation4.phpt
+++ b/ext/ctype/tests/ctype_print_variation4.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_print() function : usage variations - octal and hexadecimal values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_punct_basic.phpt b/ext/ctype/tests/ctype_punct_basic.phpt
index 2110385646..32c7bd0da3 100644
--- a/ext/ctype/tests/ctype_punct_basic.phpt
+++ b/ext/ctype/tests/ctype_punct_basic.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_punct() function : basic functionality
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
echo "*** Testing ctype_punct() : basic functionality ***\n";
diff --git a/ext/ctype/tests/ctype_punct_variation1.phpt b/ext/ctype/tests/ctype_punct_variation1.phpt
index 52f05f76e9..4fcf9bc61b 100644
--- a/ext/ctype/tests/ctype_punct_variation1.phpt
+++ b/ext/ctype/tests/ctype_punct_variation1.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_punct() function : usage variations - different data types as $c argument
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_punct_variation2.phpt b/ext/ctype/tests/ctype_punct_variation2.phpt
index a1dc709e44..1a39cb499c 100644
--- a/ext/ctype/tests/ctype_punct_variation2.phpt
+++ b/ext/ctype/tests/ctype_punct_variation2.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_punct() function : usage variations - different integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_punct_variation3.phpt b/ext/ctype/tests/ctype_punct_variation3.phpt
index 18da4a117a..cd189eec38 100644
--- a/ext/ctype/tests/ctype_punct_variation3.phpt
+++ b/ext/ctype/tests/ctype_punct_variation3.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_punct() function : usage variations - different punctuation
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_punct_variation4.phpt b/ext/ctype/tests/ctype_punct_variation4.phpt
index ea581f520f..29b112b19a 100644
--- a/ext/ctype/tests/ctype_punct_variation4.phpt
+++ b/ext/ctype/tests/ctype_punct_variation4.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_punct() function : usage variations - Octal and Hexadecimal values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_space_basic.phpt b/ext/ctype/tests/ctype_space_basic.phpt
index 7aabb25cf0..7061d8f949 100644
--- a/ext/ctype/tests/ctype_space_basic.phpt
+++ b/ext/ctype/tests/ctype_space_basic.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_space() function : basic functionality
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
echo "*** Testing ctype_space() : basic functionality ***\n";
diff --git a/ext/ctype/tests/ctype_space_variation1.phpt b/ext/ctype/tests/ctype_space_variation1.phpt
index 63cdd65f24..a2622fa503 100644
--- a/ext/ctype/tests/ctype_space_variation1.phpt
+++ b/ext/ctype/tests/ctype_space_variation1.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_space() function : usage variations - different data types as $c argument
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_space_variation2.phpt b/ext/ctype/tests/ctype_space_variation2.phpt
index 146c7137f0..22d5b62688 100644
--- a/ext/ctype/tests/ctype_space_variation2.phpt
+++ b/ext/ctype/tests/ctype_space_variation2.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_space() function : usage variations - different integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_space_variation3.phpt b/ext/ctype/tests/ctype_space_variation3.phpt
index cd32107863..2022f3860a 100644
--- a/ext/ctype/tests/ctype_space_variation3.phpt
+++ b/ext/ctype/tests/ctype_space_variation3.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_space() function : usage variations - different strings
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_space_variation4.phpt b/ext/ctype/tests/ctype_space_variation4.phpt
index f1fa47cb1f..3ee6dbc1ef 100644
--- a/ext/ctype/tests/ctype_space_variation4.phpt
+++ b/ext/ctype/tests/ctype_space_variation4.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_space() function : usage variations - octal and hexadecimal values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_upper_basic.phpt b/ext/ctype/tests/ctype_upper_basic.phpt
index 65e13892dc..2db702ed75 100644
--- a/ext/ctype/tests/ctype_upper_basic.phpt
+++ b/ext/ctype/tests/ctype_upper_basic.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_upper() function : basic functionality
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
echo "*** Testing ctype_upper() : basic functionality ***\n";
diff --git a/ext/ctype/tests/ctype_upper_variation1.phpt b/ext/ctype/tests/ctype_upper_variation1.phpt
index 719edceb62..faca6a6eb4 100644
--- a/ext/ctype/tests/ctype_upper_variation1.phpt
+++ b/ext/ctype/tests/ctype_upper_variation1.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_upper() function : usage variations - different data types
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_upper_variation2.phpt b/ext/ctype/tests/ctype_upper_variation2.phpt
index e9da4fd45f..2b5b678012 100644
--- a/ext/ctype/tests/ctype_upper_variation2.phpt
+++ b/ext/ctype/tests/ctype_upper_variation2.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_upper() function : usage variations - different integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_upper_variation3.phpt b/ext/ctype/tests/ctype_upper_variation3.phpt
index 7a1243f84f..c4d064edb0 100644
--- a/ext/ctype/tests/ctype_upper_variation3.phpt
+++ b/ext/ctype/tests/ctype_upper_variation3.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_upper() function : usage variations - different strings
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_upper_variation4.phpt b/ext/ctype/tests/ctype_upper_variation4.phpt
index 4f8b777528..d8dda95883 100644
--- a/ext/ctype/tests/ctype_upper_variation4.phpt
+++ b/ext/ctype/tests/ctype_upper_variation4.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_upper() function : usage variations - octal and hexadecimal values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_xdigit_basic.phpt b/ext/ctype/tests/ctype_xdigit_basic.phpt
index 8c1527d9dd..c3f8bac4f2 100644
--- a/ext/ctype/tests/ctype_xdigit_basic.phpt
+++ b/ext/ctype/tests/ctype_xdigit_basic.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_xdigit() function : basic functionality
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
echo "*** Testing ctype_xdigit() : basic functionality ***\n";
diff --git a/ext/ctype/tests/ctype_xdigit_variation1.phpt b/ext/ctype/tests/ctype_xdigit_variation1.phpt
index 42a26f4ced..f753ff681c 100644
--- a/ext/ctype/tests/ctype_xdigit_variation1.phpt
+++ b/ext/ctype/tests/ctype_xdigit_variation1.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_xdigit() function : usage variations - different data typse as $c arg
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_xdigit_variation2.phpt b/ext/ctype/tests/ctype_xdigit_variation2.phpt
index 106ce3370d..e343f3ab3e 100644
--- a/ext/ctype/tests/ctype_xdigit_variation2.phpt
+++ b/ext/ctype/tests/ctype_xdigit_variation2.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_xdigit() function : usage variations - different integers
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_xdigit_variation3.phpt b/ext/ctype/tests/ctype_xdigit_variation3.phpt
index 5bad5edea0..205b8c71ad 100644
--- a/ext/ctype/tests/ctype_xdigit_variation3.phpt
+++ b/ext/ctype/tests/ctype_xdigit_variation3.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_xdigit() function : usage variations - Different strings
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/ctype_xdigit_variation4.phpt b/ext/ctype/tests/ctype_xdigit_variation4.phpt
index 4d15c8a395..def93e2250 100644
--- a/ext/ctype/tests/ctype_xdigit_variation4.phpt
+++ b/ext/ctype/tests/ctype_xdigit_variation4.phpt
@@ -1,7 +1,7 @@
--TEST--
Test ctype_xdigit() function : usage variations - heaxadecimal and octal values
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
+--EXTENSIONS--
+ctype
--FILE--
<?php
/*
diff --git a/ext/ctype/tests/skipif.inc b/ext/ctype/tests/skipif.inc
deleted file mode 100644
index 55f6c11469..0000000000
--- a/ext/ctype/tests/skipif.inc
+++ /dev/null
@@ -1 +0,0 @@
-<?php if (!extension_loaded('ctype')) die('skip ctype extension not available');?>
diff --git a/ext/curl/curl.stub.php b/ext/curl/curl.stub.php
index 8fd8fd91c5..0ed4e2d182 100644
--- a/ext/curl/curl.stub.php
+++ b/ext/curl/curl.stub.php
@@ -1,15 +1,18 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+/** @strict-properties */
final class CurlHandle
{
}
+/** @strict-properties */
final class CurlMultiHandle
{
}
+/** @strict-properties */
final class CurlShareHandle
{
}
diff --git a/ext/curl/curl_arginfo.h b/ext/curl/curl_arginfo.h
index e6bb94b7b4..6485c33fba 100644
--- a/ext/curl/curl_arginfo.h
+++ b/ext/curl/curl_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: f1d616c644ad366405816cde0384f6f391773ebf */
+ * Stub hash: b0f2f56d0a38656637190456e5ebd87bf052ee14 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_close, 0, 1, IS_VOID, 0)
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
@@ -241,3 +241,36 @@ static const zend_function_entry class_CurlMultiHandle_methods[] = {
static const zend_function_entry class_CurlShareHandle_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_CurlHandle(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "CurlHandle", class_CurlHandle_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_CurlMultiHandle(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "CurlMultiHandle", class_CurlMultiHandle_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_CurlShareHandle(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "CurlShareHandle", class_CurlShareHandle_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/curl/curl_file.c b/ext/curl/curl_file.c
index aad162604a..a8f8a793b2 100644
--- a/ext/curl/curl_file.c
+++ b/ext/curl/curl_file.c
@@ -25,6 +25,7 @@
#include "curl_file_arginfo.h"
PHP_CURL_API zend_class_entry *curl_CURLFile_class;
+PHP_CURL_API zend_class_entry *curl_CURLStringFile_class;
static void curlfile_ctor(INTERNAL_FUNCTION_PARAMETERS)
{
@@ -120,14 +121,34 @@ ZEND_METHOD(CURLFile, setPostFilename)
}
/* }}} */
+ZEND_METHOD(CURLStringFile, __construct)
+{
+ zend_string *data, *postname, *mime = NULL;
+ zval *object;
+
+ object = ZEND_THIS;
+
+ ZEND_PARSE_PARAMETERS_START(2,3)
+ Z_PARAM_STR(data)
+ Z_PARAM_STR(postname)
+ Z_PARAM_OPTIONAL
+ Z_PARAM_STR(mime)
+ ZEND_PARSE_PARAMETERS_END();
+
+ zend_update_property_str(curl_CURLStringFile_class, Z_OBJ_P(object), "data", sizeof("data") - 1, data);
+ zend_update_property_str(curl_CURLStringFile_class, Z_OBJ_P(object), "postname", sizeof("postname")-1, postname);
+ if (mime) {
+ zend_update_property_str(curl_CURLStringFile_class, Z_OBJ_P(object), "mime", sizeof("mime")-1, mime);
+ } else {
+ zend_update_property_string(curl_CURLStringFile_class, Z_OBJ_P(object), "mime", sizeof("mime")-1, "application/octet-stream");
+ }
+}
+
void curlfile_register_class(void)
{
- zend_class_entry ce;
- INIT_CLASS_ENTRY( ce, "CURLFile", class_CURLFile_methods );
- curl_CURLFile_class = zend_register_internal_class(&ce);
+ curl_CURLFile_class = register_class_CURLFile();
curl_CURLFile_class->serialize = zend_class_serialize_deny;
curl_CURLFile_class->unserialize = zend_class_unserialize_deny;
- zend_declare_property_string(curl_CURLFile_class, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC);
- zend_declare_property_string(curl_CURLFile_class, "mime", sizeof("mime")-1, "", ZEND_ACC_PUBLIC);
- zend_declare_property_string(curl_CURLFile_class, "postname", sizeof("postname")-1, "", ZEND_ACC_PUBLIC);
+
+ curl_CURLStringFile_class = register_class_CURLStringFile();
}
diff --git a/ext/curl/curl_file.stub.php b/ext/curl/curl_file.stub.php
index 28a218c698..041b780b9a 100644
--- a/ext/curl/curl_file.stub.php
+++ b/ext/curl/curl_file.stub.php
@@ -1,9 +1,16 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class CURLFile
{
+ /** @var string */
+ public $name = "";
+ /** @var string */
+ public $mime = "";
+ /** @var string */
+ public $postname = "";
+
public function __construct(string $filename, ?string $mime_type = null, ?string $posted_filename = null) {}
/** @return string */
@@ -21,3 +28,12 @@ class CURLFile
/** @return void */
public function setPostFilename(string $posted_filename) {}
}
+
+class CURLStringFile
+{
+ public string $data;
+ public string $postname;
+ public string $mime;
+
+ public function __construct(string $data, string $postname, string $mime = "application/octet-stream") {}
+}
diff --git a/ext/curl/curl_file_arginfo.h b/ext/curl/curl_file_arginfo.h
index c745d597da..9ce38d70aa 100644
--- a/ext/curl/curl_file_arginfo.h
+++ b/ext/curl/curl_file_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: a81720edab23748f6dce30306f5a5ffc9634da5d */
+ * Stub hash: fdeef1c2a9e835b443d6e4cced23656ce21d8a30 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_CURLFile___construct, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@@ -22,6 +22,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_CURLFile_setPostFilename, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, posted_filename, IS_STRING, 0)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_CURLStringFile___construct, 0, 0, 2)
+ ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, postname, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mime, IS_STRING, 0, "\"application/octet-stream\"")
+ZEND_END_ARG_INFO()
+
ZEND_METHOD(CURLFile, __construct);
ZEND_METHOD(CURLFile, getFilename);
@@ -29,6 +35,7 @@ ZEND_METHOD(CURLFile, getMimeType);
ZEND_METHOD(CURLFile, getPostFilename);
ZEND_METHOD(CURLFile, setMimeType);
ZEND_METHOD(CURLFile, setPostFilename);
+ZEND_METHOD(CURLStringFile, __construct);
static const zend_function_entry class_CURLFile_methods[] = {
@@ -40,3 +47,65 @@ static const zend_function_entry class_CURLFile_methods[] = {
ZEND_ME(CURLFile, setPostFilename, arginfo_class_CURLFile_setPostFilename, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+
+static const zend_function_entry class_CURLStringFile_methods[] = {
+ ZEND_ME(CURLStringFile, __construct, arginfo_class_CURLStringFile___construct, ZEND_ACC_PUBLIC)
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class_CURLFile(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "CURLFile", class_CURLFile_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ zval property_name_default_value;
+ ZVAL_EMPTY_STRING(&property_name_default_value);
+ zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
+ zend_declare_property_ex(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_name_name);
+
+ zval property_mime_default_value;
+ ZVAL_EMPTY_STRING(&property_mime_default_value);
+ zend_string *property_mime_name = zend_string_init("mime", sizeof("mime") - 1, 1);
+ zend_declare_property_ex(class_entry, property_mime_name, &property_mime_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_mime_name);
+
+ zval property_postname_default_value;
+ ZVAL_EMPTY_STRING(&property_postname_default_value);
+ zend_string *property_postname_name = zend_string_init("postname", sizeof("postname") - 1, 1);
+ zend_declare_property_ex(class_entry, property_postname_name, &property_postname_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_postname_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_CURLStringFile(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "CURLStringFile", class_CURLStringFile_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ zval property_data_default_value;
+ ZVAL_UNDEF(&property_data_default_value);
+ zend_string *property_data_name = zend_string_init("data", sizeof("data") - 1, 1);
+ zend_declare_typed_property(class_entry, property_data_name, &property_data_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_data_name);
+
+ zval property_postname_default_value;
+ ZVAL_UNDEF(&property_postname_default_value);
+ zend_string *property_postname_name = zend_string_init("postname", sizeof("postname") - 1, 1);
+ zend_declare_typed_property(class_entry, property_postname_name, &property_postname_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_postname_name);
+
+ zval property_mime_default_value;
+ ZVAL_UNDEF(&property_mime_default_value);
+ zend_string *property_mime_name = zend_string_init("mime", sizeof("mime") - 1, 1);
+ zend_declare_typed_property(class_entry, property_mime_name, &property_mime_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_mime_name);
+
+ return class_entry;
+}
diff --git a/ext/curl/curl_private.h b/ext/curl/curl_private.h
index 6ed2eba3c3..3c219d7014 100644
--- a/ext/curl/curl_private.h
+++ b/ext/curl/curl_private.h
@@ -65,17 +65,16 @@ typedef struct {
typedef struct {
zval func_name;
zend_fcall_info_cache fci_cache;
- int method;
-} php_curl_progress, php_curl_fnmatch, php_curlm_server_push;
+} php_curl_callback;
typedef struct {
php_curl_write *write;
php_curl_write *write_header;
php_curl_read *read;
zval std_err;
- php_curl_progress *progress;
+ php_curl_callback *progress;
#if LIBCURL_VERSION_NUM >= 0x071500 /* Available since 7.21.0 */
- php_curl_fnmatch *fnmatch;
+ php_curl_callback *fnmatch;
#endif
} php_curl_handlers;
@@ -89,21 +88,25 @@ struct _php_curl_send_headers {
};
struct _php_curl_free {
- zend_llist str;
zend_llist post;
zend_llist stream;
+#if LIBCURL_VERSION_NUM < 0x073800 /* 7.56.0 */
+ zend_llist buffers;
+#endif
HashTable *slist;
};
typedef struct {
CURL *cp;
- php_curl_handlers *handlers;
+ php_curl_handlers handlers;
struct _php_curl_free *to_free;
struct _php_curl_send_headers header;
struct _php_curl_error err;
- zend_bool in_callback;
+ bool in_callback;
uint32_t* clone;
zval postfields;
+ /* For CURLOPT_PRIVATE */
+ zval private_data;
/* CurlShareHandle object set using CURLOPT_SHARE. */
struct _php_curlsh *share;
zend_object std;
@@ -112,14 +115,13 @@ typedef struct {
#define CURLOPT_SAFE_UPLOAD -1
typedef struct {
- php_curlm_server_push *server_push;
+ php_curl_callback *server_push;
} php_curlm_handlers;
typedef struct {
- int still_running;
CURLM *multi;
zend_llist easyh;
- php_curlm_handlers *handlers;
+ php_curlm_handlers handlers;
struct {
int no;
} err;
@@ -153,8 +155,8 @@ static inline php_curlsh *curl_share_from_obj(zend_object *obj) {
#define Z_CURL_SHARE_P(zv) curl_share_from_obj(Z_OBJ_P(zv))
-void curl_multi_register_class(const zend_function_entry *method_entries);
-void curl_share_register_class(const zend_function_entry *method_entries);
+void curl_multi_register_handlers(void);
+void curl_share_register_handlers(void);
void curlfile_register_class(void);
int curl_cast_object(zend_object *obj, zval *result, int type);
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index 808785c445..d8ce11df37 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -97,26 +97,14 @@ static ZEND_ATTRIBUTE_UNUSED unsigned long php_curl_ssl_id(void)
# define php_curl_ret(__ret) RETVAL_FALSE; return;
#endif
-static int php_curl_option_str(php_curl *ch, zend_long option, const char *str, const size_t len, zend_bool make_copy)
+static int php_curl_option_str(php_curl *ch, zend_long option, const char *str, const size_t len)
{
- CURLcode error = CURLE_OK;
-
if (strlen(str) != len) {
zend_value_error("%s(): cURL option must not contain any null bytes", get_active_function_name());
return FAILURE;
}
- if (make_copy) {
- char *copystr;
-
- /* Strings passed to libcurl as 'char *' arguments, are copied by the library since 7.17.0 */
- copystr = estrndup(str, len);
- error = curl_easy_setopt(ch->cp, option, copystr);
- zend_llist_add_element(&ch->to_free->str, &copystr);
- } else {
- error = curl_easy_setopt(ch->cp, option, str);
- }
-
+ CURLcode error = curl_easy_setopt(ch->cp, option, str);
SAVE_CURL_ERROR(ch, error);
return error == CURLE_OK ? SUCCESS : FAILURE;
@@ -136,11 +124,11 @@ static int php_curl_option_url(php_curl *ch, const char *url, const size_t len)
memmove(_tmp, "file:///", sizeof("file:///") - 1);
memmove(_tmp + sizeof("file:///") - 1, url + sizeof("file://") - 1, len - sizeof("file://") + 1);
- return php_curl_option_str(ch, CURLOPT_URL, _tmp, len + 1, 0);
+ return php_curl_option_str(ch, CURLOPT_URL, _tmp, len + 1);
}
#endif
- return php_curl_option_str(ch, CURLOPT_URL, url, len, 0);
+ return php_curl_option_str(ch, CURLOPT_URL, url, len);
}
/* }}} */
@@ -148,59 +136,59 @@ void _php_curl_verify_handlers(php_curl *ch, int reporterror) /* {{{ */
{
php_stream *stream;
- ZEND_ASSERT(ch && ch->handlers);
+ ZEND_ASSERT(ch);
- if (!Z_ISUNDEF(ch->handlers->std_err)) {
- stream = (php_stream *)zend_fetch_resource2_ex(&ch->handlers->std_err, NULL, php_file_le_stream(), php_file_le_pstream());
+ if (!Z_ISUNDEF(ch->handlers.std_err)) {
+ stream = (php_stream *)zend_fetch_resource2_ex(&ch->handlers.std_err, NULL, php_file_le_stream(), php_file_le_pstream());
if (stream == NULL) {
if (reporterror) {
php_error_docref(NULL, E_WARNING, "CURLOPT_STDERR resource has gone away, resetting to stderr");
}
- zval_ptr_dtor(&ch->handlers->std_err);
- ZVAL_UNDEF(&ch->handlers->std_err);
+ zval_ptr_dtor(&ch->handlers.std_err);
+ ZVAL_UNDEF(&ch->handlers.std_err);
curl_easy_setopt(ch->cp, CURLOPT_STDERR, stderr);
}
}
- if (ch->handlers->read && !Z_ISUNDEF(ch->handlers->read->stream)) {
- stream = (php_stream *)zend_fetch_resource2_ex(&ch->handlers->read->stream, NULL, php_file_le_stream(), php_file_le_pstream());
+ if (ch->handlers.read && !Z_ISUNDEF(ch->handlers.read->stream)) {
+ stream = (php_stream *)zend_fetch_resource2_ex(&ch->handlers.read->stream, NULL, php_file_le_stream(), php_file_le_pstream());
if (stream == NULL) {
if (reporterror) {
php_error_docref(NULL, E_WARNING, "CURLOPT_INFILE resource has gone away, resetting to default");
}
- zval_ptr_dtor(&ch->handlers->read->stream);
- ZVAL_UNDEF(&ch->handlers->read->stream);
- ch->handlers->read->res = NULL;
- ch->handlers->read->fp = 0;
+ zval_ptr_dtor(&ch->handlers.read->stream);
+ ZVAL_UNDEF(&ch->handlers.read->stream);
+ ch->handlers.read->res = NULL;
+ ch->handlers.read->fp = 0;
curl_easy_setopt(ch->cp, CURLOPT_INFILE, (void *) ch);
}
}
- if (ch->handlers->write_header && !Z_ISUNDEF(ch->handlers->write_header->stream)) {
- stream = (php_stream *)zend_fetch_resource2_ex(&ch->handlers->write_header->stream, NULL, php_file_le_stream(), php_file_le_pstream());
+ if (ch->handlers.write_header && !Z_ISUNDEF(ch->handlers.write_header->stream)) {
+ stream = (php_stream *)zend_fetch_resource2_ex(&ch->handlers.write_header->stream, NULL, php_file_le_stream(), php_file_le_pstream());
if (stream == NULL) {
if (reporterror) {
php_error_docref(NULL, E_WARNING, "CURLOPT_WRITEHEADER resource has gone away, resetting to default");
}
- zval_ptr_dtor(&ch->handlers->write_header->stream);
- ZVAL_UNDEF(&ch->handlers->write_header->stream);
- ch->handlers->write_header->fp = 0;
+ zval_ptr_dtor(&ch->handlers.write_header->stream);
+ ZVAL_UNDEF(&ch->handlers.write_header->stream);
+ ch->handlers.write_header->fp = 0;
- ch->handlers->write_header->method = PHP_CURL_IGNORE;
+ ch->handlers.write_header->method = PHP_CURL_IGNORE;
curl_easy_setopt(ch->cp, CURLOPT_WRITEHEADER, (void *) ch);
}
}
- if (ch->handlers->write && !Z_ISUNDEF(ch->handlers->write->stream)) {
- stream = (php_stream *)zend_fetch_resource2_ex(&ch->handlers->write->stream, NULL, php_file_le_stream(), php_file_le_pstream());
+ if (ch->handlers.write && !Z_ISUNDEF(ch->handlers.write->stream)) {
+ stream = (php_stream *)zend_fetch_resource2_ex(&ch->handlers.write->stream, NULL, php_file_le_stream(), php_file_le_pstream());
if (stream == NULL) {
if (reporterror) {
php_error_docref(NULL, E_WARNING, "CURLOPT_FILE resource has gone away, resetting to default");
}
- zval_ptr_dtor(&ch->handlers->write->stream);
- ZVAL_UNDEF(&ch->handlers->write->stream);
- ch->handlers->write->fp = 0;
+ zval_ptr_dtor(&ch->handlers.write->stream);
+ ZVAL_UNDEF(&ch->handlers.write->stream);
+ ch->handlers.write->fp = 0;
- ch->handlers->write->method = PHP_CURL_STDOUT;
+ ch->handlers.write->method = PHP_CURL_STDOUT;
curl_easy_setopt(ch->cp, CURLOPT_FILE, (void *) ch);
}
}
@@ -1153,6 +1141,10 @@ PHP_MINIT_FUNCTION(curl)
REGISTER_CURL_CONSTANT(CURLOPT_TLS13_CIPHERS);
#endif
+#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
+ REGISTER_CURL_CONSTANT(CURLOPT_DOH_URL);
+#endif
+
#if LIBCURL_VERSION_NUM >= 0x074000 /* Available since 7.64.0 */
REGISTER_CURL_CONSTANT(CURLOPT_HTTP09_ALLOWED);
#endif
@@ -1185,10 +1177,7 @@ PHP_MINIT_FUNCTION(curl)
return FAILURE;
}
- zend_class_entry ce;
- INIT_CLASS_ENTRY(ce, "CurlHandle", class_CurlHandle_methods);
- curl_ce = zend_register_internal_class(&ce);
- curl_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ curl_ce = register_class_CurlHandle();
curl_ce->create_object = curl_create_object;
curl_ce->serialize = zend_class_serialize_deny;
curl_ce->unserialize = zend_class_unserialize_deny;
@@ -1202,8 +1191,11 @@ PHP_MINIT_FUNCTION(curl)
curl_object_handlers.cast_object = curl_cast_object;
curl_object_handlers.compare = zend_objects_not_comparable;
- curl_multi_register_class(class_CurlMultiHandle_methods);
- curl_share_register_class(class_CurlShareHandle_methods);
+ curl_multi_ce = register_class_CurlMultiHandle();
+ curl_multi_register_handlers();
+
+ curl_share_ce = register_class_CurlShareHandle();
+ curl_share_register_handlers();
curlfile_register_class();
return SUCCESS;
@@ -1266,34 +1258,33 @@ static HashTable *curl_get_gc(zend_object *object, zval **table, int *n)
zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create();
zend_get_gc_buffer_add_zval(gc_buffer, &curl->postfields);
- if (curl->handlers) {
- if (curl->handlers->read) {
- zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->read->func_name);
- zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->read->stream);
- }
+ if (curl->handlers.read) {
+ zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.read->func_name);
+ zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.read->stream);
+ }
- if (curl->handlers->write) {
- zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->write->func_name);
- zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->write->stream);
- }
+ if (curl->handlers.write) {
+ zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.write->func_name);
+ zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.write->stream);
+ }
- if (curl->handlers->write_header) {
- zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->write_header->func_name);
- zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->write_header->stream);
- }
+ if (curl->handlers.write_header) {
+ zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.write_header->func_name);
+ zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.write_header->stream);
+ }
- if (curl->handlers->progress) {
- zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->progress->func_name);
- }
+ if (curl->handlers.progress) {
+ zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.progress->func_name);
+ }
#if LIBCURL_VERSION_NUM >= 0x071500
- if (curl->handlers->fnmatch) {
- zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->fnmatch->func_name);
- }
+ if (curl->handlers.fnmatch) {
+ zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.fnmatch->func_name);
+ }
#endif
- zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->std_err);
- }
+ zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.std_err);
+ zend_get_gc_buffer_add_zval(gc_buffer, &curl->private_data);
zend_get_gc_buffer_use(gc_buffer, table, n);
@@ -1349,7 +1340,7 @@ static size_t curl_write_nothing(char *data, size_t size, size_t nmemb, void *ct
static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
{
php_curl *ch = (php_curl *) ctx;
- php_curl_write *t = ch->handlers->write;
+ php_curl_write *t = ch->handlers.write;
size_t length = size * nmemb;
#if PHP_CURL_DEBUG
@@ -1411,43 +1402,38 @@ static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
static int curl_fnmatch(void *ctx, const char *pattern, const char *string)
{
php_curl *ch = (php_curl *) ctx;
- php_curl_fnmatch *t = ch->handlers->fnmatch;
+ php_curl_callback *t = ch->handlers.fnmatch;
int rval = CURL_FNMATCHFUNC_FAIL;
- switch (t->method) {
- case PHP_CURL_USER: {
- zval argv[3];
- zval retval;
- int error;
- zend_fcall_info fci;
-
- GC_ADDREF(&ch->std);
- ZVAL_OBJ(&argv[0], &ch->std);
- ZVAL_STRING(&argv[1], pattern);
- ZVAL_STRING(&argv[2], string);
-
- fci.size = sizeof(fci);
- ZVAL_COPY_VALUE(&fci.function_name, &t->func_name);
- fci.object = NULL;
- fci.retval = &retval;
- fci.param_count = 3;
- fci.params = argv;
- fci.named_params = NULL;
-
- ch->in_callback = 1;
- error = zend_call_function(&fci, &t->fci_cache);
- ch->in_callback = 0;
- if (error == FAILURE) {
- php_error_docref(NULL, E_WARNING, "Cannot call the CURLOPT_FNMATCH_FUNCTION");
- } else if (!Z_ISUNDEF(retval)) {
- _php_curl_verify_handlers(ch, 1);
- rval = zval_get_long(&retval);
- }
- zval_ptr_dtor(&argv[0]);
- zval_ptr_dtor(&argv[1]);
- zval_ptr_dtor(&argv[2]);
- break;
- }
- }
+ zval argv[3];
+ zval retval;
+ int error;
+ zend_fcall_info fci;
+
+ GC_ADDREF(&ch->std);
+ ZVAL_OBJ(&argv[0], &ch->std);
+ ZVAL_STRING(&argv[1], pattern);
+ ZVAL_STRING(&argv[2], string);
+
+ fci.size = sizeof(fci);
+ ZVAL_COPY_VALUE(&fci.function_name, &t->func_name);
+ fci.object = NULL;
+ fci.retval = &retval;
+ fci.param_count = 3;
+ fci.params = argv;
+ fci.named_params = NULL;
+
+ ch->in_callback = 1;
+ error = zend_call_function(&fci, &t->fci_cache);
+ ch->in_callback = 0;
+ if (error == FAILURE) {
+ php_error_docref(NULL, E_WARNING, "Cannot call the CURLOPT_FNMATCH_FUNCTION");
+ } else if (!Z_ISUNDEF(retval)) {
+ _php_curl_verify_handlers(ch, 1);
+ rval = zval_get_long(&retval);
+ }
+ zval_ptr_dtor(&argv[0]);
+ zval_ptr_dtor(&argv[1]);
+ zval_ptr_dtor(&argv[2]);
return rval;
}
/* }}} */
@@ -1456,7 +1442,7 @@ static int curl_fnmatch(void *ctx, const char *pattern, const char *string)
static size_t curl_progress(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
{
php_curl *ch = (php_curl *)clientp;
- php_curl_progress *t = ch->handlers->progress;
+ php_curl_callback *t = ch->handlers.progress;
size_t rval = 0;
#if PHP_CURL_DEBUG
@@ -1464,43 +1450,38 @@ static size_t curl_progress(void *clientp, double dltotal, double dlnow, double
fprintf(stderr, "clientp = %x, dltotal = %f, dlnow = %f, ultotal = %f, ulnow = %f\n", clientp, dltotal, dlnow, ultotal, ulnow);
#endif
- switch (t->method) {
- case PHP_CURL_USER: {
- zval argv[5];
- zval retval;
- int error;
- zend_fcall_info fci;
-
- GC_ADDREF(&ch->std);
- ZVAL_OBJ(&argv[0], &ch->std);
- ZVAL_LONG(&argv[1], (zend_long)dltotal);
- ZVAL_LONG(&argv[2], (zend_long)dlnow);
- ZVAL_LONG(&argv[3], (zend_long)ultotal);
- ZVAL_LONG(&argv[4], (zend_long)ulnow);
-
- fci.size = sizeof(fci);
- ZVAL_COPY_VALUE(&fci.function_name, &t->func_name);
- fci.object = NULL;
- fci.retval = &retval;
- fci.param_count = 5;
- fci.params = argv;
- fci.named_params = NULL;
-
- ch->in_callback = 1;
- error = zend_call_function(&fci, &t->fci_cache);
- ch->in_callback = 0;
- if (error == FAILURE) {
- php_error_docref(NULL, E_WARNING, "Cannot call the CURLOPT_PROGRESSFUNCTION");
- } else if (!Z_ISUNDEF(retval)) {
- _php_curl_verify_handlers(ch, 1);
- if (0 != zval_get_long(&retval)) {
- rval = 1;
- }
- }
- zval_ptr_dtor(&argv[0]);
- break;
- }
- }
+ zval argv[5];
+ zval retval;
+ int error;
+ zend_fcall_info fci;
+
+ GC_ADDREF(&ch->std);
+ ZVAL_OBJ(&argv[0], &ch->std);
+ ZVAL_LONG(&argv[1], (zend_long)dltotal);
+ ZVAL_LONG(&argv[2], (zend_long)dlnow);
+ ZVAL_LONG(&argv[3], (zend_long)ultotal);
+ ZVAL_LONG(&argv[4], (zend_long)ulnow);
+
+ fci.size = sizeof(fci);
+ ZVAL_COPY_VALUE(&fci.function_name, &t->func_name);
+ fci.object = NULL;
+ fci.retval = &retval;
+ fci.param_count = 5;
+ fci.params = argv;
+ fci.named_params = NULL;
+
+ ch->in_callback = 1;
+ error = zend_call_function(&fci, &t->fci_cache);
+ ch->in_callback = 0;
+ if (error == FAILURE) {
+ php_error_docref(NULL, E_WARNING, "Cannot call the CURLOPT_PROGRESSFUNCTION");
+ } else if (!Z_ISUNDEF(retval)) {
+ _php_curl_verify_handlers(ch, 1);
+ if (0 != zval_get_long(&retval)) {
+ rval = 1;
+ }
+ }
+ zval_ptr_dtor(&argv[0]);
return rval;
}
/* }}} */
@@ -1509,7 +1490,7 @@ static size_t curl_progress(void *clientp, double dltotal, double dlnow, double
static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx)
{
php_curl *ch = (php_curl *)ctx;
- php_curl_read *t = ch->handlers->read;
+ php_curl_read *t = ch->handlers.read;
int length = 0;
switch (t->method) {
@@ -1571,15 +1552,15 @@ static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx)
static size_t curl_write_header(char *data, size_t size, size_t nmemb, void *ctx)
{
php_curl *ch = (php_curl *) ctx;
- php_curl_write *t = ch->handlers->write_header;
+ php_curl_write *t = ch->handlers.write_header;
size_t length = size * nmemb;
switch (t->method) {
case PHP_CURL_STDOUT:
/* Handle special case write when we're returning the entire transfer
*/
- if (ch->handlers->write->method == PHP_CURL_RETURN && length > 0) {
- smart_str_appendl(&ch->handlers->write->buf, data, (int) length);
+ if (ch->handlers.write->method == PHP_CURL_RETURN && length > 0) {
+ smart_str_appendl(&ch->handlers.write->buf, data, (int) length);
} else {
PHPWRITE(data, length);
}
@@ -1647,13 +1628,6 @@ static int curl_debug(CURL *cp, curl_infotype type, char *buf, size_t buf_len, v
}
/* }}} */
-/* {{{ curl_free_string */
-static void curl_free_string(void **string)
-{
- efree((char *)*string);
-}
-/* }}} */
-
/* {{{ curl_free_post */
static void curl_free_post(void **post)
{
@@ -1681,6 +1655,15 @@ static void curl_free_cb_arg(void **cb_arg_p)
}
/* }}} */
+#if LIBCURL_VERSION_NUM < 0x073800 /* 7.56.0 */
+/* {{{ curl_free_buffers */
+static void curl_free_buffers(void **buffer)
+{
+ zend_string_release((zend_string *) *buffer);
+}
+/* }}} */
+#endif
+
/* {{{ curl_free_slist */
static void curl_free_slist(zval *el)
{
@@ -1757,22 +1740,24 @@ php_curl *init_curl_handle_into_zval(zval *curl)
void init_curl_handle(php_curl *ch)
{
- ch->to_free = ecalloc(1, sizeof(struct _php_curl_free));
- ch->handlers = ecalloc(1, sizeof(php_curl_handlers));
- ch->handlers->write = ecalloc(1, sizeof(php_curl_write));
- ch->handlers->write_header = ecalloc(1, sizeof(php_curl_write));
- ch->handlers->read = ecalloc(1, sizeof(php_curl_read));
- ch->handlers->progress = NULL;
- ch->handlers->fnmatch = NULL;
- ch->clone = emalloc(sizeof(uint32_t));
- *ch->clone = 1;
+ ch->to_free = ecalloc(1, sizeof(struct _php_curl_free));
+ ch->handlers.write = ecalloc(1, sizeof(php_curl_write));
+ ch->handlers.write_header = ecalloc(1, sizeof(php_curl_write));
+ ch->handlers.read = ecalloc(1, sizeof(php_curl_read));
+ ch->handlers.progress = NULL;
+ ch->handlers.fnmatch = NULL;
+ ch->clone = emalloc(sizeof(uint32_t));
+ *ch->clone = 1;
memset(&ch->err, 0, sizeof(struct _php_curl_error));
- zend_llist_init(&ch->to_free->str, sizeof(char *), (llist_dtor_func_t)curl_free_string, 0);
zend_llist_init(&ch->to_free->post, sizeof(struct HttpPost *), (llist_dtor_func_t)curl_free_post, 0);
zend_llist_init(&ch->to_free->stream, sizeof(struct mime_data_cb_arg *), (llist_dtor_func_t)curl_free_cb_arg, 0);
+#if LIBCURL_VERSION_NUM < 0x073800 /* 7.56.0 */
+ zend_llist_init(&ch->to_free->buffers, sizeof(zend_string *), (llist_dtor_func_t)curl_free_buffers, 0);
+#endif
+
ch->to_free->slist = emalloc(sizeof(HashTable));
zend_hash_init(ch->to_free->slist, 4, NULL, curl_free_slist, 0);
ZVAL_UNDEF(&ch->postfields);
@@ -1870,9 +1855,9 @@ PHP_FUNCTION(curl_init)
ch->cp = cp;
- ch->handlers->write->method = PHP_CURL_STDOUT;
- ch->handlers->read->method = PHP_CURL_DIRECT;
- ch->handlers->write_header->method = PHP_CURL_IGNORE;
+ ch->handlers.write->method = PHP_CURL_STDOUT;
+ ch->handlers.read->method = PHP_CURL_DIRECT;
+ ch->handlers.write_header->method = PHP_CURL_IGNORE;
_php_curl_set_default_options(ch);
@@ -1887,35 +1872,35 @@ PHP_FUNCTION(curl_init)
void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source)
{
- if (!Z_ISUNDEF(source->handlers->write->stream)) {
- Z_ADDREF(source->handlers->write->stream);
+ if (!Z_ISUNDEF(source->handlers.write->stream)) {
+ Z_ADDREF(source->handlers.write->stream);
}
- ch->handlers->write->stream = source->handlers->write->stream;
- ch->handlers->write->method = source->handlers->write->method;
- if (!Z_ISUNDEF(source->handlers->read->stream)) {
- Z_ADDREF(source->handlers->read->stream);
+ ch->handlers.write->stream = source->handlers.write->stream;
+ ch->handlers.write->method = source->handlers.write->method;
+ if (!Z_ISUNDEF(source->handlers.read->stream)) {
+ Z_ADDREF(source->handlers.read->stream);
}
- ch->handlers->read->stream = source->handlers->read->stream;
- ch->handlers->read->method = source->handlers->read->method;
- ch->handlers->write_header->method = source->handlers->write_header->method;
- if (!Z_ISUNDEF(source->handlers->write_header->stream)) {
- Z_ADDREF(source->handlers->write_header->stream);
+ ch->handlers.read->stream = source->handlers.read->stream;
+ ch->handlers.read->method = source->handlers.read->method;
+ ch->handlers.write_header->method = source->handlers.write_header->method;
+ if (!Z_ISUNDEF(source->handlers.write_header->stream)) {
+ Z_ADDREF(source->handlers.write_header->stream);
}
- ch->handlers->write_header->stream = source->handlers->write_header->stream;
+ ch->handlers.write_header->stream = source->handlers.write_header->stream;
- ch->handlers->write->fp = source->handlers->write->fp;
- ch->handlers->write_header->fp = source->handlers->write_header->fp;
- ch->handlers->read->fp = source->handlers->read->fp;
- ch->handlers->read->res = source->handlers->read->res;
+ ch->handlers.write->fp = source->handlers.write->fp;
+ ch->handlers.write_header->fp = source->handlers.write_header->fp;
+ ch->handlers.read->fp = source->handlers.read->fp;
+ ch->handlers.read->res = source->handlers.read->res;
- if (!Z_ISUNDEF(source->handlers->write->func_name)) {
- ZVAL_COPY(&ch->handlers->write->func_name, &source->handlers->write->func_name);
+ if (!Z_ISUNDEF(source->handlers.write->func_name)) {
+ ZVAL_COPY(&ch->handlers.write->func_name, &source->handlers.write->func_name);
}
- if (!Z_ISUNDEF(source->handlers->read->func_name)) {
- ZVAL_COPY(&ch->handlers->read->func_name, &source->handlers->read->func_name);
+ if (!Z_ISUNDEF(source->handlers.read->func_name)) {
+ ZVAL_COPY(&ch->handlers.read->func_name, &source->handlers.read->func_name);
}
- if (!Z_ISUNDEF(source->handlers->write_header->func_name)) {
- ZVAL_COPY(&ch->handlers->write_header->func_name, &source->handlers->write_header->func_name);
+ if (!Z_ISUNDEF(source->handlers.write_header->func_name)) {
+ ZVAL_COPY(&ch->handlers.write_header->func_name, &source->handlers.write_header->func_name);
}
curl_easy_setopt(ch->cp, CURLOPT_ERRORBUFFER, ch->err.str);
@@ -1923,24 +1908,24 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source)
curl_easy_setopt(ch->cp, CURLOPT_INFILE, (void *) ch);
curl_easy_setopt(ch->cp, CURLOPT_WRITEHEADER, (void *) ch);
- if (source->handlers->progress) {
- ch->handlers->progress = ecalloc(1, sizeof(php_curl_progress));
- if (!Z_ISUNDEF(source->handlers->progress->func_name)) {
- ZVAL_COPY(&ch->handlers->progress->func_name, &source->handlers->progress->func_name);
+ if (source->handlers.progress) {
+ ch->handlers.progress = ecalloc(1, sizeof(php_curl_callback));
+ if (!Z_ISUNDEF(source->handlers.progress->func_name)) {
+ ZVAL_COPY(&ch->handlers.progress->func_name, &source->handlers.progress->func_name);
}
- ch->handlers->progress->method = source->handlers->progress->method;
curl_easy_setopt(ch->cp, CURLOPT_PROGRESSDATA, (void *) ch);
}
- if (source->handlers->fnmatch) {
- ch->handlers->fnmatch = ecalloc(1, sizeof(php_curl_fnmatch));
- if (!Z_ISUNDEF(source->handlers->fnmatch->func_name)) {
- ZVAL_COPY(&ch->handlers->fnmatch->func_name, &source->handlers->fnmatch->func_name);
+ if (source->handlers.fnmatch) {
+ ch->handlers.fnmatch = ecalloc(1, sizeof(php_curl_callback));
+ if (!Z_ISUNDEF(source->handlers.fnmatch->func_name)) {
+ ZVAL_COPY(&ch->handlers.fnmatch->func_name, &source->handlers.fnmatch->func_name);
}
- ch->handlers->fnmatch->method = source->handlers->fnmatch->method;
curl_easy_setopt(ch->cp, CURLOPT_FNMATCH_DATA, (void *) ch);
}
+ ZVAL_COPY(&ch->private_data, &source->private_data);
+
efree(ch->to_free->slist);
efree(ch->to_free);
ch->to_free = source->to_free;
@@ -2115,6 +2100,78 @@ static inline int build_mime_structure_from_hash(php_curl *ch, zval *zpostfields
continue;
}
+ if (Z_TYPE_P(current) == IS_OBJECT && instanceof_function(Z_OBJCE_P(current), curl_CURLStringFile_class)) {
+ /* new-style file upload from string */
+ zval *prop, rv;
+ char *type = NULL, *filename = NULL;
+
+ prop = zend_read_property(curl_CURLStringFile_class, Z_OBJ_P(current), "postname", sizeof("postname")-1, 0, &rv);
+ if (EG(exception)) {
+ zend_string_release_ex(string_key, 0);
+ return FAILURE;
+ }
+ ZVAL_DEREF(prop);
+ ZEND_ASSERT(Z_TYPE_P(prop) == IS_STRING);
+
+ filename = Z_STRVAL_P(prop);
+
+ prop = zend_read_property(curl_CURLStringFile_class, Z_OBJ_P(current), "mime", sizeof("mime")-1, 0, &rv);
+ if (EG(exception)) {
+ zend_string_release_ex(string_key, 0);
+ return FAILURE;
+ }
+ ZVAL_DEREF(prop);
+ ZEND_ASSERT(Z_TYPE_P(prop) == IS_STRING);
+
+ type = Z_STRVAL_P(prop);
+
+ prop = zend_read_property(curl_CURLStringFile_class, Z_OBJ_P(current), "data", sizeof("data")-1, 0, &rv);
+ if (EG(exception)) {
+ zend_string_release_ex(string_key, 0);
+ return FAILURE;
+ }
+ ZVAL_DEREF(prop);
+ ZEND_ASSERT(Z_TYPE_P(prop) == IS_STRING);
+
+ postval = Z_STR_P(prop);
+
+#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
+ zval_ptr_dtor(&ch->postfields);
+ ZVAL_COPY(&ch->postfields, zpostfields);
+
+ part = curl_mime_addpart(mime);
+ if (part == NULL) {
+ zend_string_release_ex(string_key, 0);
+ return FAILURE;
+ }
+ if ((form_error = curl_mime_name(part, ZSTR_VAL(string_key))) != CURLE_OK
+ || (form_error = curl_mime_data(part, ZSTR_VAL(postval), ZSTR_LEN(postval))) != CURLE_OK
+ || (form_error = curl_mime_filename(part, filename)) != CURLE_OK
+ || (form_error = curl_mime_type(part, type)) != CURLE_OK) {
+ error = form_error;
+ }
+#else
+ postval = zend_string_copy(postval);
+ zend_llist_add_element(&ch->to_free->buffers, &postval);
+
+ form_error = curl_formadd(&first, &last,
+ CURLFORM_COPYNAME, ZSTR_VAL(string_key),
+ CURLFORM_NAMELENGTH, ZSTR_LEN(string_key),
+ CURLFORM_BUFFER, filename,
+ CURLFORM_CONTENTTYPE, type,
+ CURLFORM_BUFFERPTR, ZSTR_VAL(postval),
+ CURLFORM_BUFFERLENGTH, ZSTR_LEN(postval),
+ CURLFORM_END);
+ if (form_error != CURL_FORMADD_OK) {
+ /* Not nice to convert between enums but we only have place for one error type */
+ error = (CURLcode)form_error;
+ }
+#endif
+
+ zend_string_release_ex(string_key, 0);
+ continue;
+ }
+
postval = zval_get_tmp_string(current, &tmp_postval);
#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
@@ -2466,7 +2523,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
{
zend_string *tmp_str;
zend_string *str = zval_get_tmp_string(zvalue, &tmp_str);
- int ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str), 0);
+ int ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str));
zend_tmp_string_release(tmp_str);
return ret;
}
@@ -2486,6 +2543,9 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
#if LIBCURL_VERSION_NUM >= 0x072800 /* Available since 7.40.0 */
case CURLOPT_UNIX_SOCKET_PATH:
#endif
+#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
+ case CURLOPT_DOH_URL:
+#endif
case CURLOPT_KRBLEVEL:
{
if (Z_ISNULL_P(zvalue)) {
@@ -2493,7 +2553,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
} else {
zend_string *tmp_str;
zend_string *str = zval_get_tmp_string(zvalue, &tmp_str);
- int ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str), 0);
+ int ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str));
zend_tmp_string_release(tmp_str);
return ret;
}
@@ -2503,11 +2563,9 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
/* Curl private option */
case CURLOPT_PRIVATE:
{
- zend_string *tmp_str;
- zend_string *str = zval_get_tmp_string(zvalue, &tmp_str);
- int ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str), 1);
- zend_tmp_string_release(tmp_str);
- return ret;
+ zval_ptr_dtor(&ch->private_data);
+ ZVAL_COPY(&ch->private_data, zvalue);
+ return SUCCESS;
}
/* Curl url option */
@@ -2547,17 +2605,17 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
switch (option) {
case CURLOPT_FILE:
if (!what) {
- if (!Z_ISUNDEF(ch->handlers->write->stream)) {
- zval_ptr_dtor(&ch->handlers->write->stream);
- ZVAL_UNDEF(&ch->handlers->write->stream);
+ if (!Z_ISUNDEF(ch->handlers.write->stream)) {
+ zval_ptr_dtor(&ch->handlers.write->stream);
+ ZVAL_UNDEF(&ch->handlers.write->stream);
}
- ch->handlers->write->fp = NULL;
- ch->handlers->write->method = PHP_CURL_STDOUT;
+ ch->handlers.write->fp = NULL;
+ ch->handlers.write->method = PHP_CURL_STDOUT;
} else if (what->mode[0] != 'r' || what->mode[1] == '+') {
- zval_ptr_dtor(&ch->handlers->write->stream);
- ch->handlers->write->fp = fp;
- ch->handlers->write->method = PHP_CURL_FILE;
- ZVAL_COPY(&ch->handlers->write->stream, zvalue);
+ zval_ptr_dtor(&ch->handlers.write->stream);
+ ch->handlers.write->fp = fp;
+ ch->handlers.write->method = PHP_CURL_FILE;
+ ZVAL_COPY(&ch->handlers.write->stream, zvalue);
} else {
zend_value_error("%s(): The provided file handle must be writable", get_active_function_name());
return FAILURE;
@@ -2565,17 +2623,17 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
break;
case CURLOPT_WRITEHEADER:
if (!what) {
- if (!Z_ISUNDEF(ch->handlers->write_header->stream)) {
- zval_ptr_dtor(&ch->handlers->write_header->stream);
- ZVAL_UNDEF(&ch->handlers->write_header->stream);
+ if (!Z_ISUNDEF(ch->handlers.write_header->stream)) {
+ zval_ptr_dtor(&ch->handlers.write_header->stream);
+ ZVAL_UNDEF(&ch->handlers.write_header->stream);
}
- ch->handlers->write_header->fp = NULL;
- ch->handlers->write_header->method = PHP_CURL_IGNORE;
+ ch->handlers.write_header->fp = NULL;
+ ch->handlers.write_header->method = PHP_CURL_IGNORE;
} else if (what->mode[0] != 'r' || what->mode[1] == '+') {
- zval_ptr_dtor(&ch->handlers->write_header->stream);
- ch->handlers->write_header->fp = fp;
- ch->handlers->write_header->method = PHP_CURL_FILE;
- ZVAL_COPY(&ch->handlers->write_header->stream, zvalue);
+ zval_ptr_dtor(&ch->handlers.write_header->stream);
+ ch->handlers.write_header->fp = fp;
+ ch->handlers.write_header->method = PHP_CURL_FILE;
+ ZVAL_COPY(&ch->handlers.write_header->stream, zvalue);
} else {
zend_value_error("%s(): The provided file handle must be writable", get_active_function_name());
return FAILURE;
@@ -2583,28 +2641,28 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
break;
case CURLOPT_INFILE:
if (!what) {
- if (!Z_ISUNDEF(ch->handlers->read->stream)) {
- zval_ptr_dtor(&ch->handlers->read->stream);
- ZVAL_UNDEF(&ch->handlers->read->stream);
+ if (!Z_ISUNDEF(ch->handlers.read->stream)) {
+ zval_ptr_dtor(&ch->handlers.read->stream);
+ ZVAL_UNDEF(&ch->handlers.read->stream);
}
- ch->handlers->read->fp = NULL;
- ch->handlers->read->res = NULL;
+ ch->handlers.read->fp = NULL;
+ ch->handlers.read->res = NULL;
} else {
- zval_ptr_dtor(&ch->handlers->read->stream);
- ch->handlers->read->fp = fp;
- ch->handlers->read->res = Z_RES_P(zvalue);
- ZVAL_COPY(&ch->handlers->read->stream, zvalue);
+ zval_ptr_dtor(&ch->handlers.read->stream);
+ ch->handlers.read->fp = fp;
+ ch->handlers.read->res = Z_RES_P(zvalue);
+ ZVAL_COPY(&ch->handlers.read->stream, zvalue);
}
break;
case CURLOPT_STDERR:
if (!what) {
- if (!Z_ISUNDEF(ch->handlers->std_err)) {
- zval_ptr_dtor(&ch->handlers->std_err);
- ZVAL_UNDEF(&ch->handlers->std_err);
+ if (!Z_ISUNDEF(ch->handlers.std_err)) {
+ zval_ptr_dtor(&ch->handlers.std_err);
+ ZVAL_UNDEF(&ch->handlers.std_err);
}
} else if (what->mode[0] != 'r' || what->mode[1] == '+') {
- zval_ptr_dtor(&ch->handlers->std_err);
- ZVAL_COPY(&ch->handlers->std_err, zvalue);
+ zval_ptr_dtor(&ch->handlers.std_err);
+ ZVAL_COPY(&ch->handlers.std_err, zvalue);
} else {
zend_value_error("%s(): The provided file handle must be writable", get_active_function_name());
return FAILURE;
@@ -2716,12 +2774,12 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
break;
case CURLOPT_HEADERFUNCTION:
- if (!Z_ISUNDEF(ch->handlers->write_header->func_name)) {
- zval_ptr_dtor(&ch->handlers->write_header->func_name);
- ch->handlers->write_header->fci_cache = empty_fcall_info_cache;
+ if (!Z_ISUNDEF(ch->handlers.write_header->func_name)) {
+ zval_ptr_dtor(&ch->handlers.write_header->func_name);
+ ch->handlers.write_header->fci_cache = empty_fcall_info_cache;
}
- ZVAL_COPY(&ch->handlers->write_header->func_name, zvalue);
- ch->handlers->write_header->method = PHP_CURL_USER;
+ ZVAL_COPY(&ch->handlers.write_header->func_name, zvalue);
+ ch->handlers.write_header->method = PHP_CURL_USER;
break;
case CURLOPT_POSTFIELDS:
@@ -2747,40 +2805,39 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
case CURLOPT_PROGRESSFUNCTION:
curl_easy_setopt(ch->cp, CURLOPT_PROGRESSFUNCTION, curl_progress);
curl_easy_setopt(ch->cp, CURLOPT_PROGRESSDATA, ch);
- if (ch->handlers->progress == NULL) {
- ch->handlers->progress = ecalloc(1, sizeof(php_curl_progress));
- } else if (!Z_ISUNDEF(ch->handlers->progress->func_name)) {
- zval_ptr_dtor(&ch->handlers->progress->func_name);
- ch->handlers->progress->fci_cache = empty_fcall_info_cache;
+ if (ch->handlers.progress == NULL) {
+ ch->handlers.progress = ecalloc(1, sizeof(php_curl_callback));
+ } else if (!Z_ISUNDEF(ch->handlers.progress->func_name)) {
+ zval_ptr_dtor(&ch->handlers.progress->func_name);
+ ch->handlers.progress->fci_cache = empty_fcall_info_cache;
}
- ZVAL_COPY(&ch->handlers->progress->func_name, zvalue);
- ch->handlers->progress->method = PHP_CURL_USER;
+ ZVAL_COPY(&ch->handlers.progress->func_name, zvalue);
break;
case CURLOPT_READFUNCTION:
- if (!Z_ISUNDEF(ch->handlers->read->func_name)) {
- zval_ptr_dtor(&ch->handlers->read->func_name);
- ch->handlers->read->fci_cache = empty_fcall_info_cache;
+ if (!Z_ISUNDEF(ch->handlers.read->func_name)) {
+ zval_ptr_dtor(&ch->handlers.read->func_name);
+ ch->handlers.read->fci_cache = empty_fcall_info_cache;
}
- ZVAL_COPY(&ch->handlers->read->func_name, zvalue);
- ch->handlers->read->method = PHP_CURL_USER;
+ ZVAL_COPY(&ch->handlers.read->func_name, zvalue);
+ ch->handlers.read->method = PHP_CURL_USER;
break;
case CURLOPT_RETURNTRANSFER:
if (zend_is_true(zvalue)) {
- ch->handlers->write->method = PHP_CURL_RETURN;
+ ch->handlers.write->method = PHP_CURL_RETURN;
} else {
- ch->handlers->write->method = PHP_CURL_STDOUT;
+ ch->handlers.write->method = PHP_CURL_STDOUT;
}
break;
case CURLOPT_WRITEFUNCTION:
- if (!Z_ISUNDEF(ch->handlers->write->func_name)) {
- zval_ptr_dtor(&ch->handlers->write->func_name);
- ch->handlers->write->fci_cache = empty_fcall_info_cache;
+ if (!Z_ISUNDEF(ch->handlers.write->func_name)) {
+ zval_ptr_dtor(&ch->handlers.write->func_name);
+ ch->handlers.write->fci_cache = empty_fcall_info_cache;
}
- ZVAL_COPY(&ch->handlers->write->func_name, zvalue);
- ch->handlers->write->method = PHP_CURL_USER;
+ ZVAL_COPY(&ch->handlers.write->func_name, zvalue);
+ ch->handlers.write->method = PHP_CURL_USER;
break;
/* Curl off_t options */
@@ -2821,7 +2878,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
return FAILURE;
}
- ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str), 0);
+ ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str));
zend_tmp_string_release(tmp_str);
return ret;
}
@@ -2856,14 +2913,13 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
case CURLOPT_FNMATCH_FUNCTION:
curl_easy_setopt(ch->cp, CURLOPT_FNMATCH_FUNCTION, curl_fnmatch);
curl_easy_setopt(ch->cp, CURLOPT_FNMATCH_DATA, ch);
- if (ch->handlers->fnmatch == NULL) {
- ch->handlers->fnmatch = ecalloc(1, sizeof(php_curl_fnmatch));
- } else if (!Z_ISUNDEF(ch->handlers->fnmatch->func_name)) {
- zval_ptr_dtor(&ch->handlers->fnmatch->func_name);
- ch->handlers->fnmatch->fci_cache = empty_fcall_info_cache;
+ if (ch->handlers.fnmatch == NULL) {
+ ch->handlers.fnmatch = ecalloc(1, sizeof(php_curl_callback));
+ } else if (!Z_ISUNDEF(ch->handlers.fnmatch->func_name)) {
+ zval_ptr_dtor(&ch->handlers.fnmatch->func_name);
+ ch->handlers.fnmatch->fci_cache = empty_fcall_info_cache;
}
- ZVAL_COPY(&ch->handlers->fnmatch->func_name, zvalue);
- ch->handlers->fnmatch->method = PHP_CURL_USER;
+ ZVAL_COPY(&ch->handlers.fnmatch->func_name, zvalue);
break;
default:
@@ -2943,7 +2999,7 @@ PHP_FUNCTION(curl_setopt_array)
Cleanup an execution phase */
void _php_curl_cleanup_handle(php_curl *ch)
{
- smart_str_free(&ch->handlers->write->buf);
+ smart_str_free(&ch->handlers.write->buf);
if (ch->header.str) {
zend_string_release_ex(ch->header.str, 0);
ch->header.str = NULL;
@@ -2975,32 +3031,32 @@ PHP_FUNCTION(curl_exec)
SAVE_CURL_ERROR(ch, error);
if (error != CURLE_OK) {
- smart_str_free(&ch->handlers->write->buf);
+ smart_str_free(&ch->handlers.write->buf);
RETURN_FALSE;
}
- if (!Z_ISUNDEF(ch->handlers->std_err)) {
+ if (!Z_ISUNDEF(ch->handlers.std_err)) {
php_stream *stream;
- stream = (php_stream*)zend_fetch_resource2_ex(&ch->handlers->std_err, NULL, php_file_le_stream(), php_file_le_pstream());
+ stream = (php_stream*)zend_fetch_resource2_ex(&ch->handlers.std_err, NULL, php_file_le_stream(), php_file_le_pstream());
if (stream) {
php_stream_flush(stream);
}
}
- if (ch->handlers->write->method == PHP_CURL_RETURN && ch->handlers->write->buf.s) {
- smart_str_0(&ch->handlers->write->buf);
- RETURN_STR_COPY(ch->handlers->write->buf.s);
+ if (ch->handlers.write->method == PHP_CURL_RETURN && ch->handlers.write->buf.s) {
+ smart_str_0(&ch->handlers.write->buf);
+ RETURN_STR_COPY(ch->handlers.write->buf.s);
}
/* flush the file handle, so any remaining data is synched to disk */
- if (ch->handlers->write->method == PHP_CURL_FILE && ch->handlers->write->fp) {
- fflush(ch->handlers->write->fp);
+ if (ch->handlers.write->method == PHP_CURL_FILE && ch->handlers.write->fp) {
+ fflush(ch->handlers.write->fp);
}
- if (ch->handlers->write_header->method == PHP_CURL_FILE && ch->handlers->write_header->fp) {
- fflush(ch->handlers->write_header->fp);
+ if (ch->handlers.write_header->method == PHP_CURL_FILE && ch->handlers.write_header->fp) {
+ fflush(ch->handlers.write_header->fp);
}
- if (ch->handlers->write->method == PHP_CURL_RETURN) {
+ if (ch->handlers.write->method == PHP_CURL_RETURN) {
RETURN_EMPTY_STRING();
} else {
RETURN_TRUE;
@@ -3014,7 +3070,7 @@ PHP_FUNCTION(curl_getinfo)
zval *zid;
php_curl *ch;
zend_long option;
- zend_bool option_is_null = 1;
+ bool option_is_null = 1;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_OBJECT_OF_CLASS(zid, curl_ce)
@@ -3188,6 +3244,13 @@ PHP_FUNCTION(curl_getinfo)
}
break;
}
+ case CURLINFO_PRIVATE:
+ if (!Z_ISUNDEF(ch->private_data)) {
+ RETURN_COPY(&ch->private_data);
+ } else {
+ RETURN_FALSE;
+ }
+ break;
default: {
int type = CURLINFO_TYPEMASK & option;
switch (type) {
@@ -3351,44 +3414,48 @@ static void curl_free_obj(zend_object *object)
/* cURL destructors should be invoked only by last curl handle */
if (--(*ch->clone) == 0) {
- zend_llist_clean(&ch->to_free->str);
zend_llist_clean(&ch->to_free->post);
zend_llist_clean(&ch->to_free->stream);
+
+#if LIBCURL_VERSION_NUM < 0x073800 /* 7.56.0 */
+ zend_llist_clean(&ch->to_free->buffers);
+#endif
+
zend_hash_destroy(ch->to_free->slist);
efree(ch->to_free->slist);
efree(ch->to_free);
efree(ch->clone);
}
- smart_str_free(&ch->handlers->write->buf);
- zval_ptr_dtor(&ch->handlers->write->func_name);
- zval_ptr_dtor(&ch->handlers->read->func_name);
- zval_ptr_dtor(&ch->handlers->write_header->func_name);
- zval_ptr_dtor(&ch->handlers->std_err);
+ smart_str_free(&ch->handlers.write->buf);
+ zval_ptr_dtor(&ch->handlers.write->func_name);
+ zval_ptr_dtor(&ch->handlers.read->func_name);
+ zval_ptr_dtor(&ch->handlers.write_header->func_name);
+ zval_ptr_dtor(&ch->handlers.std_err);
if (ch->header.str) {
zend_string_release_ex(ch->header.str, 0);
}
- zval_ptr_dtor(&ch->handlers->write_header->stream);
- zval_ptr_dtor(&ch->handlers->write->stream);
- zval_ptr_dtor(&ch->handlers->read->stream);
+ zval_ptr_dtor(&ch->handlers.write_header->stream);
+ zval_ptr_dtor(&ch->handlers.write->stream);
+ zval_ptr_dtor(&ch->handlers.read->stream);
- efree(ch->handlers->write);
- efree(ch->handlers->write_header);
- efree(ch->handlers->read);
+ efree(ch->handlers.write);
+ efree(ch->handlers.write_header);
+ efree(ch->handlers.read);
- if (ch->handlers->progress) {
- zval_ptr_dtor(&ch->handlers->progress->func_name);
- efree(ch->handlers->progress);
+ if (ch->handlers.progress) {
+ zval_ptr_dtor(&ch->handlers.progress->func_name);
+ efree(ch->handlers.progress);
}
- if (ch->handlers->fnmatch) {
- zval_ptr_dtor(&ch->handlers->fnmatch->func_name);
- efree(ch->handlers->fnmatch);
+ if (ch->handlers.fnmatch) {
+ zval_ptr_dtor(&ch->handlers.fnmatch->func_name);
+ efree(ch->handlers.fnmatch);
}
- efree(ch->handlers);
zval_ptr_dtor(&ch->postfields);
+ zval_ptr_dtor(&ch->private_data);
if (ch->share) {
OBJ_RELEASE(&ch->share->std);
@@ -3421,43 +3488,43 @@ PHP_FUNCTION(curl_strerror)
Reset all handlers of a given php_curl */
static void _php_curl_reset_handlers(php_curl *ch)
{
- if (!Z_ISUNDEF(ch->handlers->write->stream)) {
- zval_ptr_dtor(&ch->handlers->write->stream);
- ZVAL_UNDEF(&ch->handlers->write->stream);
+ if (!Z_ISUNDEF(ch->handlers.write->stream)) {
+ zval_ptr_dtor(&ch->handlers.write->stream);
+ ZVAL_UNDEF(&ch->handlers.write->stream);
}
- ch->handlers->write->fp = NULL;
- ch->handlers->write->method = PHP_CURL_STDOUT;
+ ch->handlers.write->fp = NULL;
+ ch->handlers.write->method = PHP_CURL_STDOUT;
- if (!Z_ISUNDEF(ch->handlers->write_header->stream)) {
- zval_ptr_dtor(&ch->handlers->write_header->stream);
- ZVAL_UNDEF(&ch->handlers->write_header->stream);
+ if (!Z_ISUNDEF(ch->handlers.write_header->stream)) {
+ zval_ptr_dtor(&ch->handlers.write_header->stream);
+ ZVAL_UNDEF(&ch->handlers.write_header->stream);
}
- ch->handlers->write_header->fp = NULL;
- ch->handlers->write_header->method = PHP_CURL_IGNORE;
+ ch->handlers.write_header->fp = NULL;
+ ch->handlers.write_header->method = PHP_CURL_IGNORE;
- if (!Z_ISUNDEF(ch->handlers->read->stream)) {
- zval_ptr_dtor(&ch->handlers->read->stream);
- ZVAL_UNDEF(&ch->handlers->read->stream);
+ if (!Z_ISUNDEF(ch->handlers.read->stream)) {
+ zval_ptr_dtor(&ch->handlers.read->stream);
+ ZVAL_UNDEF(&ch->handlers.read->stream);
}
- ch->handlers->read->fp = NULL;
- ch->handlers->read->res = NULL;
- ch->handlers->read->method = PHP_CURL_DIRECT;
+ ch->handlers.read->fp = NULL;
+ ch->handlers.read->res = NULL;
+ ch->handlers.read->method = PHP_CURL_DIRECT;
- if (!Z_ISUNDEF(ch->handlers->std_err)) {
- zval_ptr_dtor(&ch->handlers->std_err);
- ZVAL_UNDEF(&ch->handlers->std_err);
+ if (!Z_ISUNDEF(ch->handlers.std_err)) {
+ zval_ptr_dtor(&ch->handlers.std_err);
+ ZVAL_UNDEF(&ch->handlers.std_err);
}
- if (ch->handlers->progress) {
- zval_ptr_dtor(&ch->handlers->progress->func_name);
- efree(ch->handlers->progress);
- ch->handlers->progress = NULL;
+ if (ch->handlers.progress) {
+ zval_ptr_dtor(&ch->handlers.progress->func_name);
+ efree(ch->handlers.progress);
+ ch->handlers.progress = NULL;
}
- if (ch->handlers->fnmatch) {
- zval_ptr_dtor(&ch->handlers->fnmatch->func_name);
- efree(ch->handlers->fnmatch);
- ch->handlers->fnmatch = NULL;
+ if (ch->handlers.fnmatch) {
+ zval_ptr_dtor(&ch->handlers.fnmatch->func_name);
+ efree(ch->handlers.fnmatch);
+ ch->handlers.fnmatch = NULL;
}
}
diff --git a/ext/curl/multi.c b/ext/curl/multi.c
index 3b329088c2..e0c0f7969d 100644
--- a/ext/curl/multi.c
+++ b/ext/curl/multi.c
@@ -67,7 +67,6 @@ PHP_FUNCTION(curl_multi_init)
object_init_ex(return_value, curl_multi_ce);
mh = Z_CURL_MULTI_P(return_value);
mh->multi = curl_multi_init();
- mh->handlers = ecalloc(1, sizeof(php_curlm_handlers));
zend_llist_init(&mh->easyh, sizeof(zval), _php_curl_multi_cleanup_list, 0);
}
@@ -244,12 +243,12 @@ PHP_FUNCTION(curl_multi_getcontent)
ch = Z_CURL_P(z_ch);
- if (ch->handlers->write->method == PHP_CURL_RETURN) {
- if (!ch->handlers->write->buf.s) {
+ if (ch->handlers.write->method == PHP_CURL_RETURN) {
+ if (!ch->handlers.write->buf.s) {
RETURN_EMPTY_STRING();
}
- smart_str_0(&ch->handlers->write->buf);
- RETURN_STR_COPY(ch->handlers->write->buf.s);
+ smart_str_0(&ch->handlers.write->buf);
+ RETURN_STR_COPY(ch->handlers.write->buf.s);
}
RETURN_NULL();
@@ -370,7 +369,7 @@ static int _php_server_push_callback(CURL *parent_ch, CURL *easy, size_t num_hea
php_curl *parent;
php_curlm *mh = (php_curlm *)userp;
size_t rval = CURL_PUSH_DENY;
- php_curlm_server_push *t = mh->handlers->server_push;
+ php_curl_callback *t = mh->handlers.server_push;
zval *pz_parent_ch = NULL;
zval pz_ch;
zval headers;
@@ -459,15 +458,14 @@ static int _php_curl_multi_setopt(php_curlm *mh, zend_long option, zval *zvalue,
}
#if LIBCURL_VERSION_NUM > 0x072D00 /* Available since 7.45.0 */
case CURLMOPT_PUSHFUNCTION:
- if (mh->handlers->server_push == NULL) {
- mh->handlers->server_push = ecalloc(1, sizeof(php_curlm_server_push));
- } else if (!Z_ISUNDEF(mh->handlers->server_push->func_name)) {
- zval_ptr_dtor(&mh->handlers->server_push->func_name);
- mh->handlers->server_push->fci_cache = empty_fcall_info_cache;
+ if (mh->handlers.server_push == NULL) {
+ mh->handlers.server_push = ecalloc(1, sizeof(php_curl_callback));
+ } else if (!Z_ISUNDEF(mh->handlers.server_push->func_name)) {
+ zval_ptr_dtor(&mh->handlers.server_push->func_name);
+ mh->handlers.server_push->fci_cache = empty_fcall_info_cache;
}
- ZVAL_COPY(&mh->handlers->server_push->func_name, zvalue);
- mh->handlers->server_push->method = PHP_CURL_USER;
+ ZVAL_COPY(&mh->handlers.server_push->func_name, zvalue);
error = curl_multi_setopt(mh->multi, option, _php_server_push_callback);
if (error != CURLM_OK) {
return 0;
@@ -553,12 +551,9 @@ void curl_multi_free_obj(zend_object *object)
curl_multi_cleanup(mh->multi);
zend_llist_clean(&mh->easyh);
- if (mh->handlers->server_push) {
- zval_ptr_dtor(&mh->handlers->server_push->func_name);
- efree(mh->handlers->server_push);
- }
- if (mh->handlers) {
- efree(mh->handlers);
+ if (mh->handlers.server_push) {
+ zval_ptr_dtor(&mh->handlers.server_push->func_name);
+ efree(mh->handlers.server_push);
}
zend_object_std_dtor(&mh->std);
@@ -570,10 +565,8 @@ static HashTable *curl_multi_get_gc(zend_object *object, zval **table, int *n)
zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create();
- if (curl_multi->handlers) {
- if (curl_multi->handlers->server_push) {
- zend_get_gc_buffer_add_zval(gc_buffer, &curl_multi->handlers->server_push->func_name);
- }
+ if (curl_multi->handlers.server_push) {
+ zend_get_gc_buffer_add_zval(gc_buffer, &curl_multi->handlers.server_push->func_name);
}
zend_llist_position pos;
@@ -587,11 +580,7 @@ static HashTable *curl_multi_get_gc(zend_object *object, zval **table, int *n)
return zend_std_get_properties(object);
}
-void curl_multi_register_class(const zend_function_entry *method_entries) {
- zend_class_entry ce_multi;
- INIT_CLASS_ENTRY(ce_multi, "CurlMultiHandle", method_entries);
- curl_multi_ce = zend_register_internal_class(&ce_multi);
- curl_multi_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+void curl_multi_register_handlers(void) {
curl_multi_ce->create_object = curl_multi_create_object;
curl_multi_ce->serialize = zend_class_serialize_deny;
curl_multi_ce->unserialize = zend_class_unserialize_deny;
diff --git a/ext/curl/php_curl.h b/ext/curl/php_curl.h
index 88806262ec..09e20602f4 100644
--- a/ext/curl/php_curl.h
+++ b/ext/curl/php_curl.h
@@ -39,5 +39,6 @@ PHP_CURL_API extern zend_class_entry *curl_ce;
PHP_CURL_API extern zend_class_entry *curl_share_ce;
PHP_CURL_API extern zend_class_entry *curl_multi_ce;
PHP_CURL_API extern zend_class_entry *curl_CURLFile_class;
+PHP_CURL_API extern zend_class_entry *curl_CURLStringFile_class;
#endif /* _PHP_CURL_H */
diff --git a/ext/curl/share.c b/ext/curl/share.c
index 6ab0f92ba5..6debf13137 100644
--- a/ext/curl/share.c
+++ b/ext/curl/share.c
@@ -162,11 +162,7 @@ void curl_share_free_obj(zend_object *object)
zend_object_std_dtor(&sh->std);
}
-void curl_share_register_class(const zend_function_entry *method_entries) {
- zend_class_entry ce_share;
- INIT_CLASS_ENTRY(ce_share, "CurlShareHandle", method_entries);
- curl_share_ce = zend_register_internal_class(&ce_share);
- curl_share_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+void curl_share_register_handlers(void) {
curl_share_ce->create_object = curl_share_create_object;
curl_share_ce->serialize = &zend_class_serialize_deny;
curl_share_ce->unserialize = &zend_class_unserialize_deny;
diff --git a/ext/curl/tests/curl_string_file_upload.phpt b/ext/curl/tests/curl_string_file_upload.phpt
new file mode 100644
index 0000000000..65a041e146
--- /dev/null
+++ b/ext/curl/tests/curl_string_file_upload.phpt
@@ -0,0 +1,86 @@
+--TEST--
+CURL file uploading from string
+--SKIPIF--
+<?php include 'skipif.inc'; ?>
+--FILE--
+<?php
+
+function testcurl($ch, $postname, $data, $mime = null)
+{
+ if (is_null($mime)) {
+ // for default mime value
+ $file = new CURLStringFile($data, $postname);
+ } else {
+ $file = new CURLStringFile($data, $postname, $mime);
+ }
+ curl_setopt($ch, CURLOPT_POSTFIELDS, array("file" => $file));
+ var_dump(curl_exec($ch));
+}
+
+include 'server.inc';
+$host = curl_cli_server_start();
+$ch = curl_init();
+curl_setopt($ch, CURLOPT_URL, "{$host}/get.php?test=string_file");
+curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+
+$data = "test\0test";
+var_dump(md5($data));
+testcurl($ch, 'foo.txt', $data);
+testcurl($ch, 'foo.txt', $data, 'text/plain');
+testcurl($ch, '', $data);
+testcurl($ch, 'foo.txt', '');
+testcurl($ch, "foo.txt\0broken_string", $data, "text/plain\0broken_string");
+
+// properties
+$file = new CURLStringFile($data, 'foo.txt');
+$file->mime = 'text/plain';
+var_dump($file->mime);
+var_dump($file->postname);
+var_dump(md5($file->data));
+curl_setopt($ch, CURLOPT_POSTFIELDS, array("file" => $file));
+var_dump(curl_exec($ch));
+
+// serialization / deserialization
+$old = new CURLStringFile($data, 'foo.txt', 'text/plain');
+$serialized = serialize($old);
+$new = unserialize($serialized);
+curl_setopt($ch, CURLOPT_POSTFIELDS, array("file" => $new));
+var_dump(curl_exec($ch));
+
+// destroy object before send request
+$file = new CURLStringFile($data, 'foo.txt', 'text/plain');
+curl_setopt($ch, CURLOPT_POSTFIELDS, array("file" => $file));
+unset($file);
+var_dump(curl_exec($ch));
+
+// clone curl handler
+$file = new CURLStringFile($data, 'foo.txt', 'text/plain');
+curl_setopt($ch, CURLOPT_POSTFIELDS, array("file" => $file));
+$ch2 = clone $ch;
+var_dump(curl_exec($ch2));
+
+// properties are references
+
+$file = new CURLStringFile($data, 'foo.txt', 'text/plain');
+$data =& $file->data;
+$postname =& $file->postname;
+$mime =& $file->mime;
+curl_setopt($ch, CURLOPT_POSTFIELDS, array("file" => $file));
+var_dump(curl_exec($ch));
+
+?>
+--EXPECTF--
+string(%d) "62942c05ed0d1b501c4afe6dc1c4db1b"
+string(%d) "foo.txt|application/octet-stream|62942c05ed0d1b501c4afe6dc1c4db1b"
+string(%d) "foo.txt|text/plain|62942c05ed0d1b501c4afe6dc1c4db1b"
+string(%d) "error:4"
+string(%d) "foo.txt|application/octet-stream|d41d8cd98f00b204e9800998ecf8427e"
+string(%d) "foo.txt|text/plain|62942c05ed0d1b501c4afe6dc1c4db1b"
+string(%d) "text/plain"
+string(%d) "foo.txt"
+string(%d) "62942c05ed0d1b501c4afe6dc1c4db1b"
+string(%d) "foo.txt|text/plain|62942c05ed0d1b501c4afe6dc1c4db1b"
+string(%d) "foo.txt|text/plain|62942c05ed0d1b501c4afe6dc1c4db1b"
+string(%d) "foo.txt|text/plain|62942c05ed0d1b501c4afe6dc1c4db1b"
+string(%d) "foo.txt|text/plain|62942c05ed0d1b501c4afe6dc1c4db1b"
+string(%d) "foo.txt|text/plain|62942c05ed0d1b501c4afe6dc1c4db1b"
diff --git a/ext/curl/tests/curlopt_private.phpt b/ext/curl/tests/curlopt_private.phpt
new file mode 100644
index 0000000000..663283195e
--- /dev/null
+++ b/ext/curl/tests/curlopt_private.phpt
@@ -0,0 +1,25 @@
+--TEST--
+CURLOPT_PRIVATE
+--SKIPIF--
+<?php
+if (!extension_loaded('curl')) exit("skip curl extension not loaded");
+?>
+--FILE--
+<?php
+$curl = curl_init("foobar");
+$obj = new stdClass;
+curl_setopt($curl, CURLOPT_PRIVATE, $obj);
+var_dump($obj === curl_getinfo($curl, CURLINFO_PRIVATE));
+
+$curl2 = curl_copy_handle($curl);
+var_dump($obj === curl_getinfo($curl2, CURLINFO_PRIVATE));
+$obj2 = new stdClass;
+curl_setopt($curl2, CURLOPT_PRIVATE, $obj2);
+var_dump($obj === curl_getinfo($curl, CURLINFO_PRIVATE));
+var_dump($obj2 === curl_getinfo($curl2, CURLINFO_PRIVATE));
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/curl/tests/responder/get.inc b/ext/curl/tests/responder/get.inc
index 64ab267d50..4ed9ae0282 100644
--- a/ext/curl/tests/responder/get.inc
+++ b/ext/curl/tests/responder/get.inc
@@ -31,6 +31,15 @@
echo $_FILES['file']['name'] . '|' . $_FILES['file']['type'] . '|' . $_FILES['file']['size'];
}
break;
+ case 'string_file':
+ if (isset($_FILES['file'])) {
+ if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
+ echo $_FILES['file']['name'] . '|' . $_FILES['file']['type'] . '|' . md5_file($_FILES['file']['tmp_name']);
+ } else {
+ echo 'error:' . $_FILES['file']['error'];
+ }
+ }
+ break;
case 'method':
echo $_SERVER['REQUEST_METHOD'];
break;
diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c
index e8154ca068..857489e04d 100644
--- a/ext/date/lib/parse_date.c
+++ b/ext/date/lib/parse_date.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.15.3 on Mon Dec 21 10:30:58 2020 */
+/* Generated by re2c 0.15.3 on Mon Dec 21 10:32:00 2020 */
#line 1 "parse_date.re"
/*
* The MIT License (MIT)
@@ -333,44 +333,55 @@ uchar *fill(Scanner *s, uchar *cursor){
}
#endif
+static timelib_error_message *alloc_error_message(timelib_error_message **messages, int *count)
+{
+ /* Realloc in power of two increments */
+ int is_pow2 = (*count & (*count - 1)) == 0;
+ if (is_pow2) {
+ size_t alloc_size = *count ? *count * 2 : 1;
+ *messages = timelib_realloc(*messages, alloc_size * sizeof(timelib_error_message));
+ }
+ return *messages + (*count)++;
+}
+
static void add_warning(Scanner *s, int error_code, char *error)
{
- s->errors->warning_count++;
- s->errors->warning_messages = timelib_realloc(s->errors->warning_messages, s->errors->warning_count * sizeof(timelib_error_message));
- s->errors->warning_messages[s->errors->warning_count - 1].error_code = error_code;
- s->errors->warning_messages[s->errors->warning_count - 1].position = s->tok ? s->tok - s->str : 0;
- s->errors->warning_messages[s->errors->warning_count - 1].character = s->tok ? *s->tok : 0;
- s->errors->warning_messages[s->errors->warning_count - 1].message = timelib_strdup(error);
+ timelib_error_message *message =
+ alloc_error_message(&s->errors->warning_messages, &s->errors->warning_count);
+ message->error_code = error_code;
+ message->position = s->tok ? s->tok - s->str : 0;
+ message->character = s->tok ? *s->tok : 0;
+ message->message = timelib_strdup(error);
}
static void add_error(Scanner *s, int error_code, char *error)
{
- s->errors->error_count++;
- s->errors->error_messages = timelib_realloc(s->errors->error_messages, s->errors->error_count * sizeof(timelib_error_message));
- s->errors->error_messages[s->errors->error_count - 1].error_code = error_code;
- s->errors->error_messages[s->errors->error_count - 1].position = s->tok ? s->tok - s->str : 0;
- s->errors->error_messages[s->errors->error_count - 1].character = s->tok ? *s->tok : 0;
- s->errors->error_messages[s->errors->error_count - 1].message = timelib_strdup(error);
+ timelib_error_message *message =
+ alloc_error_message(&s->errors->error_messages, &s->errors->error_count);
+ message->error_code = error_code;
+ message->position = s->tok ? s->tok - s->str : 0;
+ message->character = s->tok ? *s->tok : 0;
+ message->message = timelib_strdup(error);
}
static void add_pbf_warning(Scanner *s, int error_code, char *error, const char *sptr, const char *cptr)
{
- s->errors->warning_count++;
- s->errors->warning_messages = timelib_realloc(s->errors->warning_messages, s->errors->warning_count * sizeof(timelib_error_message));
- s->errors->warning_messages[s->errors->warning_count - 1].error_code = error_code;
- s->errors->warning_messages[s->errors->warning_count - 1].position = cptr - sptr;
- s->errors->warning_messages[s->errors->warning_count - 1].character = *cptr;
- s->errors->warning_messages[s->errors->warning_count - 1].message = timelib_strdup(error);
+ timelib_error_message *message =
+ alloc_error_message(&s->errors->warning_messages, &s->errors->warning_count);
+ message->error_code = error_code;
+ message->position = cptr - sptr;
+ message->character = *cptr;
+ message->message = timelib_strdup(error);
}
static void add_pbf_error(Scanner *s, int error_code, char *error, const char *sptr, const char *cptr)
{
- s->errors->error_count++;
- s->errors->error_messages = timelib_realloc(s->errors->error_messages, s->errors->error_count * sizeof(timelib_error_message));
- s->errors->error_messages[s->errors->error_count - 1].error_code = error_code;
- s->errors->error_messages[s->errors->error_count - 1].position = cptr - sptr;
- s->errors->error_messages[s->errors->error_count - 1].character = *cptr;
- s->errors->error_messages[s->errors->error_count - 1].message = timelib_strdup(error);
+ timelib_error_message *message =
+ alloc_error_message(&s->errors->error_messages, &s->errors->error_count);
+ message->error_code = error_code;
+ message->position = cptr - sptr;
+ message->character = *cptr;
+ message->message = timelib_strdup(error);
}
static timelib_sll timelib_meridian(const char **ptr, timelib_sll h)
diff --git a/ext/date/lib/parse_iso_intervals.c b/ext/date/lib/parse_iso_intervals.c
index c79a42b87a..202e5bf41d 100644
--- a/ext/date/lib/parse_iso_intervals.c
+++ b/ext/date/lib/parse_iso_intervals.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.15.3 on Mon Dec 21 10:30:56 2020 */
+/* Generated by re2c 0.15.3 on Mon Dec 21 10:32:02 2020 */
#line 1 "parse_iso_intervals.re"
/*
* The MIT License (MIT)
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index 8c0f5a62b1..e74a1ec22f 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -785,7 +785,7 @@ static void php_date(INTERNAL_FUNCTION_PARAMETERS, int localtime)
{
zend_string *format;
zend_long ts;
- zend_bool ts_is_null = 1;
+ bool ts_is_null = 1;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STR(format)
@@ -941,7 +941,7 @@ PHP_FUNCTION(idate)
{
zend_string *format;
zend_long ts;
- zend_bool ts_is_null = 1;
+ bool ts_is_null = 1;
int ret;
ZEND_PARSE_PARAMETERS_START(1, 2)
@@ -1012,7 +1012,7 @@ PHP_FUNCTION(strtotime)
int parse_error, epoch_does_not_fit_in_zend_long;
timelib_error_container *error;
zend_long preset_ts, ts;
- zend_bool preset_ts_is_null = 1;
+ bool preset_ts_is_null = 1;
timelib_time *t, *now;
timelib_tzinfo *tzi;
@@ -1065,7 +1065,7 @@ PHP_FUNCTION(strtotime)
PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt)
{
zend_long hou, min, sec, mon, day, yea;
- zend_bool min_is_null = 1, sec_is_null = 1, mon_is_null = 1, day_is_null = 1, yea_is_null = 1;
+ bool min_is_null = 1, sec_is_null = 1, mon_is_null = 1, day_is_null = 1, yea_is_null = 1;
timelib_time *now;
timelib_tzinfo *tzi = NULL;
zend_long ts, adjust_seconds = 0;
@@ -1179,7 +1179,7 @@ PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gmt)
{
zend_string *format;
zend_long timestamp;
- zend_bool timestamp_is_null = 1;
+ bool timestamp_is_null = 1;
struct tm ta;
int max_reallocs = 5;
size_t buf_len = 256, real_len;
@@ -1300,8 +1300,8 @@ PHP_FUNCTION(time)
PHP_FUNCTION(localtime)
{
zend_long timestamp;
- zend_bool timestamp_is_null = 1;
- zend_bool associative = 0;
+ bool timestamp_is_null = 1;
+ bool associative = 0;
timelib_tzinfo *tzi;
timelib_time *ts;
@@ -1353,7 +1353,7 @@ PHP_FUNCTION(localtime)
PHP_FUNCTION(getdate)
{
zend_long timestamp;
- zend_bool timestamp_is_null = 1;
+ bool timestamp_is_null = 1;
timelib_tzinfo *tzi;
timelib_time *ts;
@@ -1603,10 +1603,7 @@ static int date_interval_has_property(zend_object *object, zend_string *name, in
static void date_register_classes(void) /* {{{ */
{
- zend_class_entry ce_date, ce_immutable, ce_timezone, ce_interval, ce_period, ce_interface;
-
- INIT_CLASS_ENTRY(ce_interface, "DateTimeInterface", class_DateTimeInterface_methods);
- date_ce_interface = zend_register_internal_interface(&ce_interface);
+ date_ce_interface = register_class_DateTimeInterface();
date_ce_interface->interface_gets_implemented = implement_date_interface_handler;
#define REGISTER_DATE_INTERFACE_CONST_STRING(const_name, value) \
@@ -1626,9 +1623,8 @@ static void date_register_classes(void) /* {{{ */
REGISTER_DATE_INTERFACE_CONST_STRING("RSS", DATE_FORMAT_RFC1123);
REGISTER_DATE_INTERFACE_CONST_STRING("W3C", DATE_FORMAT_RFC3339);
- INIT_CLASS_ENTRY(ce_date, "DateTime", class_DateTime_methods);
- ce_date.create_object = date_object_new_date;
- date_ce_date = zend_register_internal_class_ex(&ce_date, NULL);
+ date_ce_date = register_class_DateTime(date_ce_interface);
+ date_ce_date->create_object = date_object_new_date;
memcpy(&date_object_handlers_date, &std_object_handlers, sizeof(zend_object_handlers));
date_object_handlers_date.offset = XtOffsetOf(php_date_obj, std);
date_object_handlers_date.free_obj = date_object_free_storage_date;
@@ -1636,21 +1632,17 @@ static void date_register_classes(void) /* {{{ */
date_object_handlers_date.compare = date_object_compare_date;
date_object_handlers_date.get_properties_for = date_object_get_properties_for;
date_object_handlers_date.get_gc = date_object_get_gc;
- zend_class_implements(date_ce_date, 1, date_ce_interface);
- INIT_CLASS_ENTRY(ce_immutable, "DateTimeImmutable", class_DateTimeImmutable_methods);
- ce_immutable.create_object = date_object_new_date;
- date_ce_immutable = zend_register_internal_class_ex(&ce_immutable, NULL);
+ date_ce_immutable = register_class_DateTimeImmutable(date_ce_interface);
+ date_ce_immutable->create_object = date_object_new_date;
memcpy(&date_object_handlers_immutable, &std_object_handlers, sizeof(zend_object_handlers));
date_object_handlers_immutable.clone_obj = date_object_clone_date;
date_object_handlers_immutable.compare = date_object_compare_date;
date_object_handlers_immutable.get_properties_for = date_object_get_properties_for;
date_object_handlers_immutable.get_gc = date_object_get_gc;
- zend_class_implements(date_ce_immutable, 1, date_ce_interface);
- INIT_CLASS_ENTRY(ce_timezone, "DateTimeZone", class_DateTimeZone_methods);
- ce_timezone.create_object = date_object_new_timezone;
- date_ce_timezone = zend_register_internal_class_ex(&ce_timezone, NULL);
+ date_ce_timezone = register_class_DateTimeZone();
+ date_ce_timezone->create_object = date_object_new_timezone;
memcpy(&date_object_handlers_timezone, &std_object_handlers, sizeof(zend_object_handlers));
date_object_handlers_timezone.offset = XtOffsetOf(php_timezone_obj, std);
date_object_handlers_timezone.free_obj = date_object_free_storage_timezone;
@@ -1678,9 +1670,8 @@ static void date_register_classes(void) /* {{{ */
REGISTER_TIMEZONE_CLASS_CONST_STRING("ALL_WITH_BC", PHP_DATE_TIMEZONE_GROUP_ALL_W_BC);
REGISTER_TIMEZONE_CLASS_CONST_STRING("PER_COUNTRY", PHP_DATE_TIMEZONE_PER_COUNTRY);
- INIT_CLASS_ENTRY(ce_interval, "DateInterval", class_DateInterval_methods);
- ce_interval.create_object = date_object_new_interval;
- date_ce_interval = zend_register_internal_class_ex(&ce_interval, NULL);
+ date_ce_interval = register_class_DateInterval();
+ date_ce_interval->create_object = date_object_new_interval;
memcpy(&date_object_handlers_interval, &std_object_handlers, sizeof(zend_object_handlers));
date_object_handlers_interval.offset = XtOffsetOf(php_interval_obj, std);
date_object_handlers_interval.free_obj = date_object_free_storage_interval;
@@ -1693,11 +1684,9 @@ static void date_register_classes(void) /* {{{ */
date_object_handlers_interval.get_gc = date_object_get_gc_interval;
date_object_handlers_interval.compare = date_interval_compare_objects;
- INIT_CLASS_ENTRY(ce_period, "DatePeriod", class_DatePeriod_methods);
- ce_period.create_object = date_object_new_period;
- date_ce_period = zend_register_internal_class_ex(&ce_period, NULL);
+ date_ce_period = register_class_DatePeriod(zend_ce_aggregate);
+ date_ce_period->create_object = date_object_new_period;
date_ce_period->get_iterator = date_object_period_get_iterator;
- zend_class_implements(date_ce_period, 1, zend_ce_aggregate);
memcpy(&date_object_handlers_period, &std_object_handlers, sizeof(zend_object_handlers));
date_object_handlers_period.offset = XtOffsetOf(php_period_obj, std);
date_object_handlers_period.free_obj = date_object_free_storage_period;
@@ -2281,6 +2270,14 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, const char *time_str, size
timelib_unixtime2local(now, (timelib_sll) sec);
php_date_set_time_fraction(now, usec);
+ if (!format
+ && time_str_len == sizeof("now") - 1
+ && memcmp(time_str, "now", sizeof("now") - 1) == 0) {
+ timelib_time_dtor(dateobj->time);
+ dateobj->time = now;
+ return 1;
+ }
+
options = TIMELIB_NO_CLONE;
if (flags & PHP_DATE_INIT_FORMAT) {
options |= TIMELIB_OVERRIDE_TIME;
@@ -3331,7 +3328,10 @@ PHP_FUNCTION(date_timestamp_get)
}
dateobj = Z_PHPDATE_P(object);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
- timelib_update_ts(dateobj->time, NULL);
+
+ if (!dateobj->time->sse_uptodate) {
+ timelib_update_ts(dateobj->time, NULL);
+ }
timestamp = timelib_date_to_int(dateobj->time, &epoch_does_not_fit_in_zend_long);
@@ -3350,7 +3350,7 @@ PHP_FUNCTION(date_diff)
zval *object1, *object2;
php_date_obj *dateobj1, *dateobj2;
php_interval_obj *interval;
- zend_bool absolute = 0;
+ bool absolute = 0;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OO|b", &object1, date_ce_interface, &object2, date_ce_interface, &absolute) == FAILURE) {
RETURN_THROWS();
@@ -3733,7 +3733,7 @@ static zval *date_interval_read_property(zend_object *object, zend_string *name,
}
#define GET_VALUE_FROM_STRUCT(n,m) \
- if (strcmp(ZSTR_VAL(name), m) == 0) { \
+ if (zend_string_equals_literal(name, m)) { \
value = obj->diff->n; \
break; \
}
@@ -3744,7 +3744,7 @@ static zval *date_interval_read_property(zend_object *object, zend_string *name,
GET_VALUE_FROM_STRUCT(h, "h");
GET_VALUE_FROM_STRUCT(i, "i");
GET_VALUE_FROM_STRUCT(s, "s");
- if (strcmp(ZSTR_VAL(name), "f") == 0) {
+ if (zend_string_equals_literal(name, "f")) {
fvalue = obj->diff->us / 1000000.0;
break;
}
@@ -3782,7 +3782,7 @@ static zval *date_interval_write_property(zend_object *object, zend_string *name
}
#define SET_VALUE_FROM_STRUCT(n,m) \
- if (strcmp(ZSTR_VAL(name), m) == 0) { \
+ if (zend_string_equals_literal(name, m)) { \
obj->diff->n = zval_get_long(value); \
break; \
}
@@ -3794,7 +3794,7 @@ static zval *date_interval_write_property(zend_object *object, zend_string *name
SET_VALUE_FROM_STRUCT(h, "h");
SET_VALUE_FROM_STRUCT(i, "i");
SET_VALUE_FROM_STRUCT(s, "s");
- if (strcmp(ZSTR_VAL(name), "f") == 0) {
+ if (zend_string_equals_literal(name, "f")) {
obj->diff->us = zval_get_double(value) * 1000000;
break;
}
@@ -3812,15 +3812,16 @@ static zval *date_interval_get_property_ptr_ptr(zend_object *object, zend_string
{
zval *ret;
- if(zend_binary_strcmp("y", sizeof("y") - 1, ZSTR_VAL(name), ZSTR_LEN(name)) == 0 ||
- zend_binary_strcmp("m", sizeof("m") - 1, ZSTR_VAL(name), ZSTR_LEN(name)) == 0 ||
- zend_binary_strcmp("d", sizeof("d") - 1, ZSTR_VAL(name), ZSTR_LEN(name)) == 0 ||
- zend_binary_strcmp("h", sizeof("h") - 1, ZSTR_VAL(name), ZSTR_LEN(name)) == 0 ||
- zend_binary_strcmp("i", sizeof("i") - 1, ZSTR_VAL(name), ZSTR_LEN(name)) == 0 ||
- zend_binary_strcmp("s", sizeof("s") - 1, ZSTR_VAL(name), ZSTR_LEN(name)) == 0 ||
- zend_binary_strcmp("f", sizeof("f") - 1, ZSTR_VAL(name), ZSTR_LEN(name)) == 0 ||
- zend_binary_strcmp("days", sizeof("days") - 1, ZSTR_VAL(name), ZSTR_LEN(name)) == 0 ||
- zend_binary_strcmp("invert", sizeof("invert") - 1, ZSTR_VAL(name), ZSTR_LEN(name)) == 0) {
+ if (
+ zend_string_equals_literal(name, "y") ||
+ zend_string_equals_literal(name, "m") ||
+ zend_string_equals_literal(name, "d") ||
+ zend_string_equals_literal(name, "h") ||
+ zend_string_equals_literal(name, "i") ||
+ zend_string_equals_literal(name, "s") ||
+ zend_string_equals_literal(name, "f") ||
+ zend_string_equals_literal(name, "days") ||
+ zend_string_equals_literal(name, "invert") ) {
/* Fallback to read_property. */
ret = NULL;
} else {
@@ -4462,7 +4463,7 @@ PHP_FUNCTION(date_default_timezone_get)
static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_sunset)
{
double latitude, longitude, zenith, gmt_offset, altitude;
- zend_bool latitude_is_null = 1, longitude_is_null = 1, zenith_is_null = 1, gmt_offset_is_null = 1;
+ bool latitude_is_null = 1, longitude_is_null = 1, zenith_is_null = 1, gmt_offset_is_null = 1;
double h_rise, h_set, N;
timelib_sll rise, set, transit;
zend_long time, retformat = SUNFUNCS_RET_STRING;
diff --git a/ext/date/php_date.stub.php b/ext/date/php_date.stub.php
index cb01b7e073..63d590d9c9 100644
--- a/ext/date/php_date.stub.php
+++ b/ext/date/php_date.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function strtotime(string $datetime, ?int $baseTimestamp = null): int|false {}
diff --git a/ext/date/php_date_arginfo.h b/ext/date/php_date_arginfo.h
index cf50abb43f..8f90dd8cba 100644
--- a/ext/date/php_date_arginfo.h
+++ b/ext/date/php_date_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 880a93d8a3461635447318317869fa7d3d7762dd */
+ * Stub hash: 108136459e578cc699cffcb84d3335a11f8d5c9d */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strtotime, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, datetime, IS_STRING, 0)
@@ -657,3 +657,66 @@ static const zend_function_entry class_DatePeriod_methods[] = {
ZEND_ME(DatePeriod, getIterator, arginfo_class_DatePeriod_getIterator, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_DateTimeInterface(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DateTimeInterface", class_DateTimeInterface_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DateTime(zend_class_entry *class_entry_DateTimeInterface)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DateTime", class_DateTime_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_DateTimeInterface);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DateTimeImmutable(zend_class_entry *class_entry_DateTimeInterface)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DateTimeImmutable", class_DateTimeImmutable_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_DateTimeInterface);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DateTimeZone(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DateTimeZone", class_DateTimeZone_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DateInterval(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DateInterval", class_DateInterval_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DatePeriod(zend_class_entry *class_entry_IteratorAggregate)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DatePeriod", class_DatePeriod_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_IteratorAggregate);
+
+ return class_entry;
+}
diff --git a/ext/date/tests/DateTimeZone_clone_basic2.phpt b/ext/date/tests/DateTimeZone_clone_basic2.phpt
index b41eeddfbd..f7f81cb275 100644
--- a/ext/date/tests/DateTimeZone_clone_basic2.phpt
+++ b/ext/date/tests/DateTimeZone_clone_basic2.phpt
@@ -51,28 +51,28 @@ object(DateTimeZoneExt1)#%d (4) {
string(13) "Europe/London"
}
object(DateTimeZoneExt2)#%d (6) {
- ["property3"]=>
- bool(true)
- ["property4"]=>
- float(10.5)
["property1"]=>
int(99)
["property2"]=>
string(5) "Hello"
+ ["property3"]=>
+ bool(true)
+ ["property4"]=>
+ float(10.5)
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/London"
}
object(DateTimeZoneExt2)#%d (6) {
- ["property3"]=>
- bool(true)
- ["property4"]=>
- float(10.5)
["property1"]=>
int(99)
["property2"]=>
string(5) "Hello"
+ ["property3"]=>
+ bool(true)
+ ["property4"]=>
+ float(10.5)
["timezone_type"]=>
int(3)
["timezone"]=>
diff --git a/ext/date/tests/DateTime_clone_basic2.phpt b/ext/date/tests/DateTime_clone_basic2.phpt
index 261879283e..439bf4b23f 100644
--- a/ext/date/tests/DateTime_clone_basic2.phpt
+++ b/ext/date/tests/DateTime_clone_basic2.phpt
@@ -55,14 +55,14 @@ object(DateTimeExt1)#%d (5) {
string(3) "GMT"
}
object(DateTimeExt2)#%d (7) {
- ["property3"]=>
- bool(true)
- ["property4"]=>
- float(10.5)
["property1"]=>
int(99)
["property2"]=>
string(5) "Hello"
+ ["property3"]=>
+ bool(true)
+ ["property4"]=>
+ float(10.5)
["date"]=>
string(26) "2009-02-03 12:34:41.000000"
["timezone_type"]=>
@@ -71,14 +71,14 @@ object(DateTimeExt2)#%d (7) {
string(3) "GMT"
}
object(DateTimeExt2)#%d (7) {
- ["property3"]=>
- bool(true)
- ["property4"]=>
- float(10.5)
["property1"]=>
int(99)
["property2"]=>
string(5) "Hello"
+ ["property3"]=>
+ bool(true)
+ ["property4"]=>
+ float(10.5)
["date"]=>
string(26) "2009-02-03 12:34:41.000000"
["timezone_type"]=>
diff --git a/ext/date/tests/bug54283.phpt b/ext/date/tests/bug54283.phpt
index 65669b6b39..cadedd8691 100644
--- a/ext/date/tests/bug54283.phpt
+++ b/ext/date/tests/bug54283.phpt
@@ -10,5 +10,6 @@ try {
}
?>
---EXPECT--
+--EXPECTF--
+Deprecated: DatePeriod::__construct(): Passing null to parameter #1 ($start) of type string is deprecated in %s on line %d
string(51) "DatePeriod::__construct(): Unknown or bad format ()"
diff --git a/ext/date/tests/bug73837.phpt b/ext/date/tests/bug73837.phpt
index c11aa2c56b..7319a1327f 100644
--- a/ext/date/tests/bug73837.phpt
+++ b/ext/date/tests/bug73837.phpt
@@ -11,8 +11,9 @@ for ( $i = 0; $i < 1000; $i++ )
$collect[$key] = true;
}
+// For low-resolution clocks, we may construct many objects in the same tick.
var_dump($n = count( $collect ));
-echo ( $n > 700 ) ? "microseconds differ\n" : "microseconds do not differ enough ($n)\n";
+echo $n > 400 ? "microseconds differ\n" : "microseconds do not differ enough ($n)\n";
?>
--EXPECTF--
int(%d)
diff --git a/ext/date/tests/bug73858.phpt b/ext/date/tests/bug73858.phpt
index fb41390b0f..b6074ff01a 100644
--- a/ext/date/tests/bug73858.phpt
+++ b/ext/date/tests/bug73858.phpt
@@ -15,8 +15,8 @@ $e = new DateTime($es);
$d= $e->diff($s);
var_dump($d->days); // 0 ... but should be 30
-$s = (new DateTime(null))->setTimestamp(strtotime($ss)); // verbose setup method
-$e = (new DateTime(null))->setTimestamp(strtotime($es)); // verbose setup method
+$s = (new DateTime("now"))->setTimestamp(strtotime($ss)); // verbose setup method
+$e = (new DateTime("now"))->setTimestamp(strtotime($es)); // verbose setup method
$d = $e->diff($s);
var_dump($d->days); // 30 ... and should be 30
@@ -24,13 +24,13 @@ var_dump($d->days); // 30 ... and should be 30
Next we will try mix/match the code to see what happens, surprisingly it seems that the end date ($e)
is the important one, if it uses the verbose method it returns the correct values.
*/
-$s = (new DateTime(null))->setTimestamp(strtotime($ss)); // verbose setup method
+$s = (new DateTime("now"))->setTimestamp(strtotime($ss)); // verbose setup method
$e = new DateTime($es);
$d= $e->diff($s);
var_dump($d->days); // 0 ... but should be 30
$s = new DateTime($ss);
-$e = (new DateTime(null))->setTimestamp(strtotime($es)); // verbose setup method
+$e = (new DateTime("now"))->setTimestamp(strtotime($es)); // verbose setup method
$d= $e->diff($s);
var_dump($d->days); // 30 ... and should be 30
@@ -39,7 +39,7 @@ This test just proves that the $e date is important BUT NOT because it's the one
on, that's just coincidental that seems to imply that the "- 1 second" in the date string is the problem.
*/
$s = new DateTime($ss);
-$e = (new DateTime(null))->setTimestamp(strtotime($es)); // verbose setup method
+$e = (new DateTime("now"))->setTimestamp(strtotime($es)); // verbose setup method
$d= $s->diff($e);
var_dump($d->days); // 30 ... and should be 30
diff --git a/ext/date/tests/date_interval_create_from_date_string_nullparam.phpt b/ext/date/tests/date_interval_create_from_date_string_nullparam.phpt
index e03386ad3c..afac12b7a3 100644
--- a/ext/date/tests/date_interval_create_from_date_string_nullparam.phpt
+++ b/ext/date/tests/date_interval_create_from_date_string_nullparam.phpt
@@ -8,5 +8,7 @@ $i = date_interval_create_from_date_string(null);
var_dump($i);
?>
--EXPECTF--
+Deprecated: date_interval_create_from_date_string(): Passing null to parameter #1 ($datetime) of type string is deprecated in %s on line %d
+
Warning: date_interval_create_from_date_string(): Unknown or bad format () at position 0 ( ): Empty string in %sdate_interval_create_from_date_string_nullparam.php on line 2
bool(false)
diff --git a/ext/date/tests/date_timestamp_set_nullparam2.phpt b/ext/date/tests/date_timestamp_set_nullparam2.phpt
index c22dc3011a..2e5894bc24 100644
--- a/ext/date/tests/date_timestamp_set_nullparam2.phpt
+++ b/ext/date/tests/date_timestamp_set_nullparam2.phpt
@@ -13,7 +13,8 @@ $dtms021 = date_create();
var_dump(date_timestamp_set($dtms021, null));
?>
---EXPECT--
+--EXPECTF--
+Deprecated: date_timestamp_set(): Passing null to parameter #2 ($timestamp) of type int is deprecated in %s on line %d
object(DateTime)#1 (3) {
["date"]=>
string(26) "1970-01-01 00:00:00.000000"
diff --git a/ext/date/tests/microtime_error.phpt b/ext/date/tests/microtime_error.phpt
deleted file mode 100644
index ce13875e67..0000000000
--- a/ext/date/tests/microtime_error.phpt
+++ /dev/null
@@ -1,56 +0,0 @@
---TEST--
-Test wrong number of arguments for microtime()
---FILE--
-<?php
-/*
- * Function is implemented in ext/standard/microtime.c
-*/
-
-echo "\n-- Bad Arg types --\n";
-
-$bad_args = array(null,
- 1.5,
- "hello",
- array('k'=>'v', array(0)),
- new stdClass,
- 1);
-foreach ($bad_args as $bad_arg) {
- echo "\n--> bad arg: ";
- var_dump($bad_arg);
- try {
- var_dump(microtime($bad_arg));
- } catch (TypeError $e) {
- echo $e->getMessage(), "\n";
- }
-}
-
-?>
---EXPECTF--
--- Bad Arg types --
-
---> bad arg: NULL
-string(%d) "%s %s"
-
---> bad arg: float(1.5)
-float(%s)
-
---> bad arg: string(5) "hello"
-float(%s)
-
---> bad arg: array(2) {
- ["k"]=>
- string(1) "v"
- [0]=>
- array(1) {
- [0]=>
- int(0)
- }
-}
-microtime(): Argument #1 ($as_float) must be of type bool, array given
-
---> bad arg: object(stdClass)#%d (0) {
-}
-microtime(): Argument #1 ($as_float) must be of type bool, stdClass given
-
---> bad arg: int(1)
-float(%s)
diff --git a/ext/dba/dba.c b/ext/dba/dba.c
index 7e8ef11b03..f0f1beed75 100644
--- a/ext/dba/dba.c
+++ b/ext/dba/dba.c
@@ -114,8 +114,8 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free)
group = zend_hash_get_current_data_ex(Z_ARRVAL_P(key), &pos);
zend_hash_move_forward_ex(Z_ARRVAL_P(key), &pos);
name = zend_hash_get_current_data_ex(Z_ARRVAL_P(key), &pos);
- convert_to_string_ex(group);
- convert_to_string_ex(name);
+ convert_to_string(group);
+ convert_to_string(name);
if (Z_STRLEN_P(group) == 0) {
*key_str = Z_STRVAL_P(name);
*key_free = NULL;
@@ -542,8 +542,8 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
zend_string *opened_path = NULL;
char *lock_name;
#ifdef PHP_WIN32
- zend_bool restarted = 0;
- zend_bool need_creation = 0;
+ bool restarted = 0;
+ bool need_creation = 0;
#endif
if (ac < 2) {
@@ -860,7 +860,7 @@ restart:
fcntl(info->fd, F_SETFL, flags & ~O_APPEND);
#elif defined(PHP_WIN32)
} else if (modenr == DBA_CREAT && need_creation && !restarted) {
- zend_bool close_both;
+ bool close_both;
close_both = (info->fp != info->lock.fp);
php_stream_free(info->lock.fp, persistent ? PHP_STREAM_FREE_CLOSE_PERSISTENT : PHP_STREAM_FREE_CLOSE);
@@ -1155,7 +1155,7 @@ PHP_FUNCTION(dba_sync)
PHP_FUNCTION(dba_handlers)
{
dba_handler *hptr;
- zend_bool full_info = 0;
+ bool full_info = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &full_info) == FAILURE) {
RETURN_THROWS();
diff --git a/ext/dba/dba.stub.php b/ext/dba/dba.stub.php
index 12cccbe506..e9da43da18 100644
--- a/ext/dba/dba.stub.php
+++ b/ext/dba/dba.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
/**
* @param string $path
diff --git a/ext/dba/dba_arginfo.h b/ext/dba/dba_arginfo.h
index d92eae0448..17cb1152df 100644
--- a/ext/dba/dba_arginfo.h
+++ b/ext/dba/dba_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 63980c2a7227d1b5dbd566efb3efbf8c45c55c0d */
+ * Stub hash: 092664d2d3fa28578e6c8e82160319678c211f0f */
ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_popen, 0, 0, 2)
ZEND_ARG_INFO(0, path)
diff --git a/ext/dba/dba_inifile.c b/ext/dba/dba_inifile.c
index dd3d42290f..ec50aeba15 100644
--- a/ext/dba/dba_inifile.c
+++ b/ext/dba/dba_inifile.c
@@ -120,7 +120,7 @@ DBA_EXISTS_FUNC(inifile)
DBA_DELETE_FUNC(inifile)
{
int res;
- zend_bool found = 0;
+ bool found = 0;
INIFILE_DATA;
INIFILE_GKEY;
diff --git a/ext/dba/libinifile/inifile.c b/ext/dba/libinifile/inifile.c
index 43227c42d7..72f0ef4d9c 100644
--- a/ext/dba/libinifile/inifile.c
+++ b/ext/dba/libinifile/inifile.c
@@ -406,7 +406,7 @@ static int inifile_copy_to(inifile *dba, size_t pos_start, size_t pos_end, inifi
/* {{{ inifile_filter
* copy from to dba while ignoring key name (group must equal)
*/
-static int inifile_filter(inifile *dba, inifile *from, const key_type *key, zend_bool *found)
+static int inifile_filter(inifile *dba, inifile *from, const key_type *key, bool *found)
{
size_t pos_start = 0, pos_next = 0, pos_curr;
int ret = SUCCESS;
@@ -418,7 +418,7 @@ static int inifile_filter(inifile *dba, inifile *from, const key_type *key, zend
switch(inifile_key_cmp(&ln.key, key)) {
case 0:
if (found) {
- *found = (zend_bool) 1;
+ *found = (bool) 1;
}
pos_curr = php_stream_tell(from->fp);
if (pos_start != pos_next) {
@@ -453,7 +453,7 @@ static int inifile_filter(inifile *dba, inifile *from, const key_type *key, zend
/* }}} */
/* {{{ inifile_delete_replace_append */
-static int inifile_delete_replace_append(inifile *dba, const key_type *key, const val_type *value, int append, zend_bool *found)
+static int inifile_delete_replace_append(inifile *dba, const key_type *key, const val_type *value, int append, bool *found)
{
size_t pos_grp_start=0, pos_grp_next;
inifile *ini_tmp = NULL;
@@ -562,7 +562,7 @@ int inifile_delete(inifile *dba, const key_type *key)
/* }}} */
/* {{{ inifile_delete_ex */
-int inifile_delete_ex(inifile *dba, const key_type *key, zend_bool *found)
+int inifile_delete_ex(inifile *dba, const key_type *key, bool *found)
{
return inifile_delete_replace_append(dba, key, NULL, 0, found);
}
@@ -576,7 +576,7 @@ int inifile_replace(inifile *dba, const key_type *key, const val_type *value)
/* }}} */
/* {{{ inifile_replace_ex */
-int inifile_replace_ex(inifile *dba, const key_type *key, const val_type *value, zend_bool *found)
+int inifile_replace_ex(inifile *dba, const key_type *key, const val_type *value, bool *found)
{
return inifile_delete_replace_append(dba, key, value, 0, found);
}
diff --git a/ext/dba/libinifile/inifile.h b/ext/dba/libinifile/inifile.h
index ec33f80ee7..d1816b1d2e 100644
--- a/ext/dba/libinifile/inifile.h
+++ b/ext/dba/libinifile/inifile.h
@@ -45,9 +45,9 @@ val_type inifile_fetch(inifile *dba, const key_type *key, int skip);
int inifile_firstkey(inifile *dba);
int inifile_nextkey(inifile *dba);
int inifile_delete(inifile *dba, const key_type *key);
-int inifile_delete_ex(inifile *dba, const key_type *key, zend_bool *found);
+int inifile_delete_ex(inifile *dba, const key_type *key, bool *found);
int inifile_replace(inifile *dba, const key_type *key, const val_type *val);
-int inifile_replace_ex(inifile *dba, const key_type *key, const val_type *val, zend_bool *found);
+int inifile_replace_ex(inifile *dba, const key_type *key, const val_type *val, bool *found);
int inifile_append(inifile *dba, const key_type *key, const val_type *val);
char *inifile_version();
diff --git a/ext/dba/tests/dba_handlers.phpt b/ext/dba/tests/dba_handlers.phpt
index e896116818..966b44a629 100644
--- a/ext/dba/tests/dba_handlers.phpt
+++ b/ext/dba/tests/dba_handlers.phpt
@@ -31,7 +31,7 @@ check(dba_handlers());
echo "Test 2\n";
-check(dba_handlers(null));
+check(dba_handlers(false));
echo "Test 3\n";
diff --git a/ext/dom/attr.c b/ext/dom/attr.c
index e348f8fc5a..383f390951 100644
--- a/ext/dom/attr.c
+++ b/ext/dom/attr.c
@@ -81,7 +81,7 @@ int dom_attr_name_read(dom_object *obj, zval *retval)
attrp = (xmlAttrPtr) dom_object_get_node(obj);
if (attrp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -117,7 +117,7 @@ int dom_attr_value_read(dom_object *obj, zval *retval)
xmlChar *content;
if (attrp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -138,7 +138,7 @@ int dom_attr_value_write(dom_object *obj, zval *newval)
xmlAttrPtr attrp = (xmlAttrPtr) dom_object_get_node(obj);
if (attrp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -171,7 +171,7 @@ int dom_attr_owner_element_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
diff --git a/ext/dom/characterdata.c b/ext/dom/characterdata.c
index cd332c8db4..fa8f3dfc71 100644
--- a/ext/dom/characterdata.c
+++ b/ext/dom/characterdata.c
@@ -41,7 +41,7 @@ int dom_characterdata_data_read(dom_object *obj, zval *retval)
xmlChar *content;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -61,7 +61,7 @@ int dom_characterdata_data_write(dom_object *obj, zval *newval)
zend_string *str;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -90,7 +90,7 @@ int dom_characterdata_length_read(dom_object *obj, zval *retval)
long length = 0;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
diff --git a/ext/dom/document.c b/ext/dom/document.c
index dbbabb8bff..fd6563803e 100644
--- a/ext/dom/document.c
+++ b/ext/dom/document.c
@@ -55,7 +55,7 @@ int dom_document_doctype_read(dom_object *obj, zval *retval)
xmlDtdPtr dtdptr;
if (docp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -95,7 +95,7 @@ int dom_document_document_element_read(dom_object *obj, zval *retval)
xmlNode *root;
if (docp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -121,7 +121,7 @@ int dom_document_encoding_read(dom_object *obj, zval *retval)
char *encoding;
if (docp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -143,7 +143,7 @@ zend_result dom_document_encoding_write(dom_object *obj, zval *newval)
xmlCharEncodingHandlerPtr handler;
if (docp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -183,7 +183,7 @@ int dom_document_standalone_read(dom_object *obj, zval *retval)
docp = (xmlDocPtr) dom_object_get_node(obj);
if (docp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -197,7 +197,7 @@ int dom_document_standalone_write(dom_object *obj, zval *newval)
zend_long standalone;
if (docp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -220,7 +220,7 @@ int dom_document_version_read(dom_object *obj, zval *retval)
char *version;
if (docp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -241,7 +241,7 @@ int dom_document_version_write(dom_object *obj, zval *newval)
zend_string *str;
if (docp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -452,7 +452,7 @@ int dom_document_document_uri_read(dom_object *obj, zval *retval)
char *url;
if (docp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -472,7 +472,7 @@ int dom_document_document_uri_write(dom_object *obj, zval *newval)
zend_string *str;
if (docp == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -795,7 +795,7 @@ PHP_METHOD(DOMDocument, importNode)
xmlNodePtr nodep, retnodep;
dom_object *intern, *nodeobj;
int ret;
- zend_bool recursive = 0;
+ bool recursive = 0;
/* See http://www.xmlsoft.org/html/libxml-tree.html#xmlDocCopyNode for meaning of values */
int extended_recursive;
diff --git a/ext/dom/documenttype.c b/ext/dom/documenttype.c
index e910cf4009..0046ac7f45 100644
--- a/ext/dom/documenttype.c
+++ b/ext/dom/documenttype.c
@@ -33,7 +33,7 @@ int dom_documenttype_name_read(dom_object *obj, zval *retval)
xmlDtdPtr dtdptr = (xmlDtdPtr) dom_object_get_node(obj);
if (dtdptr == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -56,7 +56,7 @@ int dom_documenttype_entities_read(dom_object *obj, zval *retval)
dom_object *intern;
if (doctypep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -84,7 +84,7 @@ int dom_documenttype_notations_read(dom_object *obj, zval *retval)
dom_object *intern;
if (doctypep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -110,7 +110,7 @@ int dom_documenttype_public_id_read(dom_object *obj, zval *retval)
xmlDtdPtr dtdptr = (xmlDtdPtr) dom_object_get_node(obj);
if (dtdptr == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -135,7 +135,7 @@ int dom_documenttype_system_id_read(dom_object *obj, zval *retval)
xmlDtdPtr dtdptr = (xmlDtdPtr) dom_object_get_node(obj);
if (dtdptr == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -160,7 +160,7 @@ int dom_documenttype_internal_subset_read(dom_object *obj, zval *retval)
xmlDtdPtr intsubset;
if (dtdptr == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
diff --git a/ext/dom/dom_iterators.c b/ext/dom/dom_iterators.c
index f56d249034..c3fbb356e4 100644
--- a/ext/dom/dom_iterators.c
+++ b/ext/dom/dom_iterators.c
@@ -182,7 +182,7 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter) /* {{{ */
int previndex=0;
HashTable *nodeht;
zval *entry;
- zend_bool do_curobj_undef = 1;
+ bool do_curobj_undef = 1;
php_dom_iterator *iterator = (php_dom_iterator *)iter;
diff --git a/ext/dom/element.c b/ext/dom/element.c
index 450d694c41..1d93aa3371 100644
--- a/ext/dom/element.c
+++ b/ext/dom/element.c
@@ -117,7 +117,7 @@ int dom_element_tag_name_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -1014,7 +1014,7 @@ PHP_METHOD(DOMElement, hasAttributeNS)
}
/* }}} end dom_element_has_attribute_ns */
-static void php_set_attribute_id(xmlAttrPtr attrp, zend_bool is_id) /* {{{ */
+static void php_set_attribute_id(xmlAttrPtr attrp, bool is_id) /* {{{ */
{
if (is_id == 1 && attrp->atype != XML_ATTRIBUTE_ID) {
xmlChar *id_val;
@@ -1044,7 +1044,7 @@ PHP_METHOD(DOMElement, setIdAttribute)
dom_object *intern;
char *name;
size_t name_len;
- zend_bool is_id;
+ bool is_id;
id = ZEND_THIS;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sb", &name, &name_len, &is_id) == FAILURE) {
@@ -1080,7 +1080,7 @@ PHP_METHOD(DOMElement, setIdAttributeNS)
dom_object *intern;
size_t uri_len, name_len;
char *uri, *name;
- zend_bool is_id;
+ bool is_id;
id = ZEND_THIS;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssb", &uri, &uri_len, &name, &name_len, &is_id) == FAILURE) {
@@ -1114,7 +1114,7 @@ PHP_METHOD(DOMElement, setIdAttributeNode)
xmlNode *nodep;
xmlAttrPtr attrp;
dom_object *intern, *attrobj;
- zend_bool is_id;
+ bool is_id;
id = ZEND_THIS;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &node, dom_attr_class_entry, &is_id) == FAILURE) {
diff --git a/ext/dom/entity.c b/ext/dom/entity.c
index 7ad43a1ee3..53f2b20bd1 100644
--- a/ext/dom/entity.c
+++ b/ext/dom/entity.c
@@ -41,7 +41,7 @@ int dom_entity_public_id_read(dom_object *obj, zval *retval)
xmlEntity *nodep = (xmlEntity *) dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -66,7 +66,7 @@ int dom_entity_system_id_read(dom_object *obj, zval *retval)
xmlEntity *nodep = (xmlEntity *) dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -92,7 +92,7 @@ int dom_entity_notation_name_read(dom_object *obj, zval *retval)
char *content;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
diff --git a/ext/dom/node.c b/ext/dom/node.c
index a6f88b5c0f..253073598c 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -45,7 +45,7 @@ int dom_node_node_name_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -127,7 +127,7 @@ int dom_node_node_value_read(dom_object *obj, zval *retval)
char *str = NULL;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -166,7 +166,7 @@ int dom_node_node_value_write(dom_object *obj, zval *newval)
zend_string *str;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -212,7 +212,7 @@ int dom_node_node_type_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -240,7 +240,7 @@ int dom_node_parent_node_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -267,7 +267,7 @@ int dom_node_child_nodes_read(dom_object *obj, zval *retval)
dom_object *intern;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -291,7 +291,7 @@ int dom_node_first_child_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -322,7 +322,7 @@ int dom_node_last_child_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -353,7 +353,7 @@ int dom_node_previous_sibling_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -381,7 +381,7 @@ int dom_node_next_sibling_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -409,7 +409,7 @@ int dom_node_previous_element_sibling_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -442,7 +442,7 @@ int dom_node_next_element_sibling_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -474,7 +474,7 @@ int dom_node_attributes_read(dom_object *obj, zval *retval)
dom_object *intern;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -502,7 +502,7 @@ int dom_node_owner_document_read(dom_object *obj, zval *retval)
xmlDocPtr docp;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -533,7 +533,7 @@ int dom_node_namespace_uri_read(dom_object *obj, zval *retval)
char *str = NULL;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -573,7 +573,7 @@ int dom_node_prefix_read(dom_object *obj, zval *retval)
char *str = NULL;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -611,7 +611,7 @@ int dom_node_prefix_write(dom_object *obj, zval *newval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -682,7 +682,7 @@ int dom_node_local_name_read(dom_object *obj, zval *retval)
xmlNode *nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -708,7 +708,7 @@ int dom_node_base_uri_read(dom_object *obj, zval *retval)
xmlChar *baseuri;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -736,7 +736,7 @@ int dom_node_text_content_read(dom_object *obj, zval *retval)
char *str = NULL;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -758,7 +758,7 @@ int dom_node_text_content_write(dom_object *obj, zval *newval)
zend_string *str;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -1271,7 +1271,7 @@ PHP_METHOD(DOMNode, cloneNode)
xmlNode *n, *node;
int ret;
dom_object *intern;
- zend_bool recursive = 0;
+ bool recursive = 0;
id = ZEND_THIS;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &recursive) == FAILURE) {
@@ -1543,7 +1543,7 @@ static void dom_canonicalization(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{
xmlDocPtr docp;
xmlNodeSetPtr nodeset = NULL;
dom_object *intern;
- zend_bool exclusive=0, with_comments=0;
+ bool exclusive=0, with_comments=0;
xmlChar **inclusive_ns_prefixes = NULL;
char *file = NULL;
int ret = -1;
diff --git a/ext/dom/notation.c b/ext/dom/notation.c
index f1e0c1ba38..15148d9a6f 100644
--- a/ext/dom/notation.c
+++ b/ext/dom/notation.c
@@ -42,7 +42,7 @@ int dom_notation_public_id_read(dom_object *obj, zval *retval)
xmlEntityPtr nodep = (xmlEntityPtr) dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -67,7 +67,7 @@ int dom_notation_system_id_read(dom_object *obj, zval *retval)
xmlEntityPtr nodep = (xmlEntityPtr) dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
diff --git a/ext/dom/parentnode.c b/ext/dom/parentnode.c
index 375c692dca..25f79595a3 100644
--- a/ext/dom/parentnode.c
+++ b/ext/dom/parentnode.c
@@ -35,7 +35,7 @@ int dom_parent_node_first_element_child_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -68,7 +68,7 @@ int dom_parent_node_last_element_child_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -102,7 +102,7 @@ int dom_parent_node_child_element_count(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c
index 351c138622..618b2fe7d0 100644
--- a/ext/dom/php_dom.c
+++ b/ext/dom/php_dom.c
@@ -559,8 +559,6 @@ void dom_xpath_objects_free_storage(zend_object *object);
/* {{{ PHP_MINIT_FUNCTION(dom) */
PHP_MINIT_FUNCTION(dom)
{
- zend_class_entry ce;
-
memcpy(&dom_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
dom_object_handlers.offset = XtOffsetOf(dom_object, std);
dom_object_handlers.free_obj = dom_objects_free_storage;
@@ -579,20 +577,17 @@ PHP_MINIT_FUNCTION(dom)
zend_hash_init(&classes, 0, NULL, NULL, 1);
- INIT_CLASS_ENTRY(ce, "DOMException", class_DOMException_methods);
- dom_domexception_class_entry = zend_register_internal_class_ex(&ce, zend_ce_exception);
- dom_domexception_class_entry->ce_flags |= ZEND_ACC_FINAL;
- zend_declare_property_long(dom_domexception_class_entry, "code", sizeof("code")-1, 0, ZEND_ACC_PUBLIC);
+ dom_domexception_class_entry = register_class_DOMException(zend_ce_exception);
- INIT_CLASS_ENTRY(ce, "DOMParentNode", class_DOMParentNode_methods);
- dom_parentnode_class_entry = zend_register_internal_interface(&ce);
+ dom_parentnode_class_entry = register_class_DOMParentNode();
- INIT_CLASS_ENTRY(ce, "DOMChildNode", class_DOMChildNode_methods);
- dom_childnode_class_entry = zend_register_internal_interface(&ce);
+ dom_childnode_class_entry = register_class_DOMChildNode();
- REGISTER_DOM_CLASS(ce, "DOMImplementation", NULL, class_DOMImplementation_methods, dom_domimplementation_class_entry);
+ dom_domimplementation_class_entry = register_class_DOMImplementation();
+ dom_domimplementation_class_entry->create_object = dom_objects_new;
- REGISTER_DOM_CLASS(ce, "DOMNode", NULL, class_DOMNode_methods, dom_node_class_entry);
+ dom_node_class_entry = register_class_DOMNode();
+ dom_node_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_node_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_node_prop_handlers, "nodeName", sizeof("nodeName")-1, dom_node_node_name_read, NULL);
@@ -611,9 +606,10 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_node_prop_handlers, "localName", sizeof("localName")-1, dom_node_local_name_read, NULL);
dom_register_prop_handler(&dom_node_prop_handlers, "baseURI", sizeof("baseURI")-1, dom_node_base_uri_read, NULL);
dom_register_prop_handler(&dom_node_prop_handlers, "textContent", sizeof("textContent")-1, dom_node_text_content_read, dom_node_text_content_write);
- zend_hash_add_ptr(&classes, ce.name, &dom_node_prop_handlers);
+ zend_hash_add_ptr(&classes, dom_node_class_entry->name, &dom_node_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMNameSpaceNode", NULL, NULL, dom_namespace_node_class_entry);
+ dom_namespace_node_class_entry = register_class_DOMNameSpaceNode();
+ dom_namespace_node_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_namespace_node_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_namespace_node_prop_handlers, "nodeName", sizeof("nodeName")-1, dom_node_node_name_read, NULL);
@@ -624,9 +620,10 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_namespace_node_prop_handlers, "namespaceURI", sizeof("namespaceURI")-1, dom_node_namespace_uri_read, NULL);
dom_register_prop_handler(&dom_namespace_node_prop_handlers, "ownerDocument", sizeof("ownerDocument")-1, dom_node_owner_document_read, NULL);
dom_register_prop_handler(&dom_namespace_node_prop_handlers, "parentNode", sizeof("parentNode")-1, dom_node_parent_node_read, NULL);
- zend_hash_add_ptr(&classes, ce.name, &dom_namespace_node_prop_handlers);
+ zend_hash_add_ptr(&classes, dom_namespace_node_class_entry->name, &dom_namespace_node_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMDocumentFragment", dom_node_class_entry, class_DOMDocumentFragment_methods, dom_documentfragment_class_entry);
+ dom_documentfragment_class_entry = register_class_DOMDocumentFragment(dom_node_class_entry, dom_parentnode_class_entry);
+ dom_documentfragment_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_documentfragment_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_documentfragment_prop_handlers, "firstElementChild", sizeof("firstElementChild")-1, dom_parent_node_first_element_child_read, NULL);
@@ -634,10 +631,10 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_documentfragment_prop_handlers, "childElementCount", sizeof("childElementCount")-1, dom_parent_node_child_element_count, NULL);
zend_hash_merge(&dom_documentfragment_prop_handlers, &dom_node_prop_handlers, dom_copy_prop_handler, 0);
- zend_hash_add_ptr(&classes, ce.name, &dom_documentfragment_prop_handlers);
- zend_class_implements(dom_documentfragment_class_entry, 1, dom_parentnode_class_entry);
+ zend_hash_add_ptr(&classes, dom_documentfragment_class_entry->name, &dom_documentfragment_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMDocument", dom_node_class_entry, class_DOMDocument_methods, dom_document_class_entry);
+ dom_document_class_entry = register_class_DOMDocument(dom_node_class_entry, dom_parentnode_class_entry);
+ dom_document_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_document_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_document_prop_handlers, "doctype", sizeof("doctype")-1, dom_document_doctype_read, NULL);
dom_register_prop_handler(&dom_document_prop_handlers, "implementation", sizeof("implementation")-1, dom_document_implementation_read, NULL);
@@ -664,30 +661,26 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_document_prop_handlers, "childElementCount", sizeof("childElementCount")-1, dom_parent_node_child_element_count, NULL);
zend_hash_merge(&dom_document_prop_handlers, &dom_node_prop_handlers, dom_copy_prop_handler, 0);
- zend_hash_add_ptr(&classes, ce.name, &dom_document_prop_handlers);
- zend_class_implements(dom_document_class_entry, 1, dom_parentnode_class_entry);
+ zend_hash_add_ptr(&classes, dom_document_class_entry->name, &dom_document_prop_handlers);
- INIT_CLASS_ENTRY(ce, "DOMNodeList", class_DOMNodeList_methods);
- ce.create_object = dom_nnodemap_objects_new;
- dom_nodelist_class_entry = zend_register_internal_class_ex(&ce, NULL);
+ dom_nodelist_class_entry = register_class_DOMNodeList(zend_ce_aggregate, zend_ce_countable);
+ dom_nodelist_class_entry->create_object = dom_nnodemap_objects_new;
dom_nodelist_class_entry->get_iterator = php_dom_get_iterator;
- zend_class_implements(dom_nodelist_class_entry, 2, zend_ce_aggregate, zend_ce_countable);
zend_hash_init(&dom_nodelist_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_nodelist_prop_handlers, "length", sizeof("length")-1, dom_nodelist_length_read, NULL);
- zend_hash_add_ptr(&classes, ce.name, &dom_nodelist_prop_handlers);
+ zend_hash_add_ptr(&classes, dom_nodelist_class_entry->name, &dom_nodelist_prop_handlers);
- INIT_CLASS_ENTRY(ce, "DOMNamedNodeMap", class_DOMNamedNodeMap_methods);
- ce.create_object = dom_nnodemap_objects_new;
- dom_namednodemap_class_entry = zend_register_internal_class_ex(&ce, NULL);
+ dom_namednodemap_class_entry = register_class_DOMNamedNodeMap(zend_ce_aggregate, zend_ce_countable);
+ dom_namednodemap_class_entry->create_object = dom_nnodemap_objects_new;
dom_namednodemap_class_entry->get_iterator = php_dom_get_iterator;
- zend_class_implements(dom_namednodemap_class_entry, 2, zend_ce_aggregate, zend_ce_countable);
zend_hash_init(&dom_namednodemap_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_namednodemap_prop_handlers, "length", sizeof("length")-1, dom_namednodemap_length_read, NULL);
- zend_hash_add_ptr(&classes, ce.name, &dom_namednodemap_prop_handlers);
+ zend_hash_add_ptr(&classes, dom_namednodemap_class_entry->name, &dom_namednodemap_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMCharacterData", dom_node_class_entry, class_DOMCharacterData_methods, dom_characterdata_class_entry);
+ dom_characterdata_class_entry = register_class_DOMCharacterData(dom_node_class_entry, dom_childnode_class_entry);
+ dom_characterdata_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_characterdata_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_characterdata_prop_handlers, "data", sizeof("data")-1, dom_characterdata_data_read, dom_characterdata_data_write);
@@ -695,11 +688,10 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_characterdata_prop_handlers, "previousElementSibling", sizeof("previousElementSibling")-1, dom_node_previous_element_sibling_read, NULL);
dom_register_prop_handler(&dom_characterdata_prop_handlers, "nextElementSibling", sizeof("nextElementSibling")-1, dom_node_next_element_sibling_read, NULL);
zend_hash_merge(&dom_characterdata_prop_handlers, &dom_node_prop_handlers, dom_copy_prop_handler, 0);
- zend_hash_add_ptr(&classes, ce.name, &dom_characterdata_prop_handlers);
-
- zend_class_implements(dom_characterdata_class_entry, 1, dom_childnode_class_entry);
+ zend_hash_add_ptr(&classes, dom_characterdata_class_entry->name, &dom_characterdata_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMAttr", dom_node_class_entry, class_DOMAttr_methods, dom_attr_class_entry);
+ dom_attr_class_entry = register_class_DOMAttr(dom_node_class_entry);
+ dom_attr_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_attr_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_attr_prop_handlers, "name", sizeof("name")-1, dom_attr_name_read, NULL);
@@ -708,9 +700,10 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_attr_prop_handlers, "ownerElement", sizeof("ownerElement")-1, dom_attr_owner_element_read, NULL);
dom_register_prop_handler(&dom_attr_prop_handlers, "schemaTypeInfo", sizeof("schemaTypeInfo")-1, dom_attr_schema_type_info_read, NULL);
zend_hash_merge(&dom_attr_prop_handlers, &dom_node_prop_handlers, dom_copy_prop_handler, 0);
- zend_hash_add_ptr(&classes, ce.name, &dom_attr_prop_handlers);
+ zend_hash_add_ptr(&classes, dom_attr_class_entry->name, &dom_attr_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMElement", dom_node_class_entry, class_DOMElement_methods, dom_element_class_entry);
+ dom_element_class_entry = register_class_DOMElement(dom_node_class_entry, dom_parentnode_class_entry, dom_childnode_class_entry);
+ dom_element_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_element_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_element_prop_handlers, "tagName", sizeof("tagName")-1, dom_element_tag_name_read, NULL);
@@ -721,24 +714,26 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_element_prop_handlers, "previousElementSibling", sizeof("previousElementSibling")-1, dom_node_previous_element_sibling_read, NULL);
dom_register_prop_handler(&dom_element_prop_handlers, "nextElementSibling", sizeof("nextElementSibling")-1, dom_node_next_element_sibling_read, NULL);
zend_hash_merge(&dom_element_prop_handlers, &dom_node_prop_handlers, dom_copy_prop_handler, 0);
- zend_hash_add_ptr(&classes, ce.name, &dom_element_prop_handlers);
-
- zend_class_implements(dom_element_class_entry, 2, dom_parentnode_class_entry, dom_childnode_class_entry);
+ zend_hash_add_ptr(&classes, dom_element_class_entry->name, &dom_element_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMText", dom_characterdata_class_entry, class_DOMText_methods, dom_text_class_entry);
+ dom_text_class_entry = register_class_DOMText(dom_characterdata_class_entry);
+ dom_text_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_text_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_text_prop_handlers, "wholeText", sizeof("wholeText")-1, dom_text_whole_text_read, NULL);
zend_hash_merge(&dom_text_prop_handlers, &dom_characterdata_prop_handlers, dom_copy_prop_handler, 0);
- zend_hash_add_ptr(&classes, ce.name, &dom_text_prop_handlers);
+ zend_hash_add_ptr(&classes, dom_text_class_entry->name, &dom_text_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMComment", dom_characterdata_class_entry, class_DOMComment_methods, dom_comment_class_entry);
- zend_hash_add_ptr(&classes, ce.name, &dom_characterdata_prop_handlers);
+ dom_comment_class_entry = register_class_DOMComment(dom_characterdata_class_entry);
+ dom_comment_class_entry->create_object = dom_objects_new;
+ zend_hash_add_ptr(&classes, dom_comment_class_entry->name, &dom_characterdata_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMCdataSection", dom_text_class_entry, class_DOMCdataSection_methods, dom_cdatasection_class_entry);
- zend_hash_add_ptr(&classes, ce.name, &dom_text_prop_handlers);
+ dom_cdatasection_class_entry = register_class_DOMCdataSection(dom_text_class_entry);
+ dom_cdatasection_class_entry->create_object = dom_objects_new;
+ zend_hash_add_ptr(&classes, dom_cdatasection_class_entry->name, &dom_text_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMDocumentType", dom_node_class_entry, class_DOMDocumentType_methods, dom_documenttype_class_entry);
+ dom_documenttype_class_entry = register_class_DOMDocumentType(dom_node_class_entry);
+ dom_documenttype_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_documenttype_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_documenttype_prop_handlers, "name", sizeof("name")-1, dom_documenttype_name_read, NULL);
@@ -748,17 +743,19 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_documenttype_prop_handlers, "systemId", sizeof("systemId")-1, dom_documenttype_system_id_read, NULL);
dom_register_prop_handler(&dom_documenttype_prop_handlers, "internalSubset", sizeof("internalSubset")-1, dom_documenttype_internal_subset_read, NULL);
zend_hash_merge(&dom_documenttype_prop_handlers, &dom_node_prop_handlers, dom_copy_prop_handler, 0);
- zend_hash_add_ptr(&classes, ce.name, &dom_documenttype_prop_handlers);
+ zend_hash_add_ptr(&classes, dom_documenttype_class_entry->name, &dom_documenttype_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMNotation", dom_node_class_entry, class_DOMNotation_methods, dom_notation_class_entry);
+ dom_notation_class_entry = register_class_DOMNotation(dom_node_class_entry);
+ dom_notation_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_notation_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_notation_prop_handlers, "publicId", sizeof("publicId")-1, dom_notation_public_id_read, NULL);
dom_register_prop_handler(&dom_notation_prop_handlers, "systemId", sizeof("systemId")-1, dom_notation_system_id_read, NULL);
zend_hash_merge(&dom_notation_prop_handlers, &dom_node_prop_handlers, dom_copy_prop_handler, 0);
- zend_hash_add_ptr(&classes, ce.name, &dom_notation_prop_handlers);
+ zend_hash_add_ptr(&classes, dom_notation_class_entry->name, &dom_notation_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMEntity", dom_node_class_entry, class_DOMEntity_methods, dom_entity_class_entry);
+ dom_entity_class_entry = register_class_DOMEntity(dom_node_class_entry);
+ dom_entity_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_entity_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_entity_prop_handlers, "publicId", sizeof("publicId")-1, dom_entity_public_id_read, NULL);
@@ -768,32 +765,33 @@ PHP_MINIT_FUNCTION(dom)
dom_register_prop_handler(&dom_entity_prop_handlers, "encoding", sizeof("encoding")-1, dom_entity_encoding_read, dom_entity_encoding_write);
dom_register_prop_handler(&dom_entity_prop_handlers, "version", sizeof("version")-1, dom_entity_version_read, dom_entity_version_write);
zend_hash_merge(&dom_entity_prop_handlers, &dom_node_prop_handlers, dom_copy_prop_handler, 0);
- zend_hash_add_ptr(&classes, ce.name, &dom_entity_prop_handlers);
+ zend_hash_add_ptr(&classes, dom_entity_class_entry->name, &dom_entity_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMEntityReference", dom_node_class_entry, class_DOMEntityReference_methods, dom_entityreference_class_entry);
- zend_hash_add_ptr(&classes, ce.name, &dom_node_prop_handlers);
+ dom_entityreference_class_entry = register_class_DOMEntityReference(dom_node_class_entry);
+ dom_entityreference_class_entry->create_object = dom_objects_new;
+ zend_hash_add_ptr(&classes, dom_entityreference_class_entry->name, &dom_node_prop_handlers);
- REGISTER_DOM_CLASS(ce, "DOMProcessingInstruction", dom_node_class_entry, class_DOMProcessingInstruction_methods, dom_processinginstruction_class_entry);
+ dom_processinginstruction_class_entry = register_class_DOMProcessingInstruction(dom_node_class_entry);
+ dom_processinginstruction_class_entry->create_object = dom_objects_new;
zend_hash_init(&dom_processinginstruction_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_processinginstruction_prop_handlers, "target", sizeof("target")-1, dom_processinginstruction_target_read, NULL);
dom_register_prop_handler(&dom_processinginstruction_prop_handlers, "data", sizeof("data")-1, dom_processinginstruction_data_read, dom_processinginstruction_data_write);
zend_hash_merge(&dom_processinginstruction_prop_handlers, &dom_node_prop_handlers, dom_copy_prop_handler, 0);
- zend_hash_add_ptr(&classes, ce.name, &dom_processinginstruction_prop_handlers);
+ zend_hash_add_ptr(&classes, dom_processinginstruction_class_entry->name, &dom_processinginstruction_prop_handlers);
#ifdef LIBXML_XPATH_ENABLED
memcpy(&dom_xpath_object_handlers, &dom_object_handlers, sizeof(zend_object_handlers));
dom_xpath_object_handlers.offset = XtOffsetOf(dom_xpath_object, dom) + XtOffsetOf(dom_object, std);
dom_xpath_object_handlers.free_obj = dom_xpath_objects_free_storage;
- INIT_CLASS_ENTRY(ce, "DOMXPath", class_DOMXPath_methods);
- ce.create_object = dom_xpath_objects_new;
- dom_xpath_class_entry = zend_register_internal_class_ex(&ce, NULL);
+ dom_xpath_class_entry = register_class_DOMXPath();
+ dom_xpath_class_entry->create_object = dom_xpath_objects_new;
zend_hash_init(&dom_xpath_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1);
dom_register_prop_handler(&dom_xpath_prop_handlers, "document", sizeof("document")-1, dom_xpath_document_read, NULL);
dom_register_prop_handler(&dom_xpath_prop_handlers, "registerNodeNamespaces", sizeof("registerNodeNamespaces")-1, dom_xpath_register_node_ns_read, dom_xpath_register_node_ns_write);
- zend_hash_add_ptr(&classes, ce.name, &dom_xpath_prop_handlers);
+ zend_hash_add_ptr(&classes, dom_xpath_class_entry->name, &dom_xpath_prop_handlers);
#endif
REGISTER_LONG_CONSTANT("XML_ELEMENT_NODE", XML_ELEMENT_NODE, CONST_CS | CONST_PERSISTENT);
@@ -1125,7 +1123,7 @@ void php_dom_create_iterator(zval *return_value, int ce_type) /* {{{ */
/* }}} */
/* {{{ php_dom_create_object */
-PHP_DOM_EXPORT zend_bool php_dom_create_object(xmlNodePtr obj, zval *return_value, dom_object *domobj)
+PHP_DOM_EXPORT bool php_dom_create_object(xmlNodePtr obj, zval *return_value, dom_object *domobj)
{
zend_class_entry *ce;
dom_object *intern;
@@ -1305,10 +1303,10 @@ xmlNode *dom_get_elements_by_tag_name_ns_raw(xmlNodePtr nodep, char *ns, char *l
/* }}} */
/* }}} end dom_element_get_elements_by_tag_name_ns_raw */
-static inline zend_bool is_empty_node(xmlNodePtr nodep)
+static inline bool is_empty_node(xmlNodePtr nodep)
{
xmlChar *strContent = xmlNodeGetContent(nodep);
- zend_bool ret = strContent == NULL || *strContent == '\0';
+ bool ret = strContent == NULL || *strContent == '\0';
xmlFree(strContent);
return ret;
}
diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h
index 24e1ea646a..0c5fc9778f 100644
--- a/ext/dom/php_dom.h
+++ b/ext/dom/php_dom.h
@@ -132,11 +132,6 @@ void dom_parent_node_after(dom_object *context, zval *nodes, int nodesc);
void dom_parent_node_before(dom_object *context, zval *nodes, int nodesc);
void dom_child_node_remove(dom_object *context);
-#define REGISTER_DOM_CLASS(ce, name, parent_ce, funcs, entry) \
-INIT_CLASS_ENTRY(ce, name, funcs); \
-ce.create_object = dom_objects_new; \
-entry = zend_register_internal_class_ex(&ce, parent_ce);
-
#define DOM_GET_OBJ(__ptr, __id, __prtype, __intern) { \
__intern = Z_DOMOBJ_P(__id); \
if (__intern->ptr == NULL || !(__ptr = (__prtype)((php_libxml_node_ptr *)__intern->ptr)->node)) { \
diff --git a/ext/dom/php_dom.stub.php b/ext/dom/php_dom.stub.php
index 2a9a9cff80..72c63883fc 100644
--- a/ext/dom/php_dom.stub.php
+++ b/ext/dom/php_dom.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class DOMDocumentType extends DOMNode
{
@@ -360,6 +360,8 @@ class DOMDocument extends DOMNode implements DOMParentNode
final class DOMException extends Exception
{
+ /** @var int */
+ public $code = 0;
}
class DOMText extends DOMCharacterData
diff --git a/ext/dom/php_dom_arginfo.h b/ext/dom/php_dom_arginfo.h
index c3c54a4de7..b6e621b1bc 100644
--- a/ext/dom/php_dom_arginfo.h
+++ b/ext/dom/php_dom_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: a4767d6ea60859c8897f681fb69d6f73b1f50471 */
+ * Stub hash: c41e6d58eb8b0bbdb07401c4f1eb92c6ba3d324c */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_dom_import_simplexml, 0, 1, DOMElement, 1)
ZEND_ARG_TYPE_INFO(0, node, IS_OBJECT, 0)
@@ -847,3 +847,236 @@ static const zend_function_entry class_DOMXPath_methods[] = {
#endif
ZEND_FE_END
};
+
+static zend_class_entry *register_class_DOMDocumentType(zend_class_entry *class_entry_DOMNode)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMDocumentType", class_DOMDocumentType_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMNode);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMCdataSection(zend_class_entry *class_entry_DOMText)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMCdataSection", class_DOMCdataSection_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMText);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMComment(zend_class_entry *class_entry_DOMCharacterData)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMComment", class_DOMComment_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMCharacterData);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMParentNode(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMParentNode", class_DOMParentNode_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMChildNode(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMChildNode", class_DOMChildNode_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMNode(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMNode", class_DOMNode_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMNameSpaceNode(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMNameSpaceNode", class_DOMNameSpaceNode_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMImplementation(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMImplementation", class_DOMImplementation_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMDocumentFragment(zend_class_entry *class_entry_DOMNode, zend_class_entry *class_entry_DOMParentNode)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMDocumentFragment", class_DOMDocumentFragment_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMNode);
+ zend_class_implements(class_entry, 1, class_entry_DOMParentNode);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMNodeList(zend_class_entry *class_entry_IteratorAggregate, zend_class_entry *class_entry_Countable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMNodeList", class_DOMNodeList_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 2, class_entry_IteratorAggregate, class_entry_Countable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMCharacterData(zend_class_entry *class_entry_DOMNode, zend_class_entry *class_entry_DOMChildNode)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMCharacterData", class_DOMCharacterData_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMNode);
+ zend_class_implements(class_entry, 1, class_entry_DOMChildNode);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMAttr(zend_class_entry *class_entry_DOMNode)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMAttr", class_DOMAttr_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMNode);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMElement(zend_class_entry *class_entry_DOMNode, zend_class_entry *class_entry_DOMParentNode, zend_class_entry *class_entry_DOMChildNode)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMElement", class_DOMElement_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMNode);
+ zend_class_implements(class_entry, 2, class_entry_DOMParentNode, class_entry_DOMChildNode);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMDocument(zend_class_entry *class_entry_DOMNode, zend_class_entry *class_entry_DOMParentNode)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMDocument", class_DOMDocument_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMNode);
+ zend_class_implements(class_entry, 1, class_entry_DOMParentNode);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMException(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMException", class_DOMException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ zval property_code_default_value;
+ ZVAL_LONG(&property_code_default_value, 0);
+ zend_string *property_code_name = zend_string_init("code", sizeof("code") - 1, 1);
+ zend_declare_property_ex(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_code_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMText(zend_class_entry *class_entry_DOMCharacterData)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMText", class_DOMText_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMCharacterData);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMNamedNodeMap(zend_class_entry *class_entry_IteratorAggregate, zend_class_entry *class_entry_Countable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMNamedNodeMap", class_DOMNamedNodeMap_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 2, class_entry_IteratorAggregate, class_entry_Countable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMEntity(zend_class_entry *class_entry_DOMNode)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMEntity", class_DOMEntity_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMNode);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMEntityReference(zend_class_entry *class_entry_DOMNode)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMEntityReference", class_DOMEntityReference_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMNode);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMNotation(zend_class_entry *class_entry_DOMNode)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMNotation", class_DOMNotation_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMNode);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMProcessingInstruction(zend_class_entry *class_entry_DOMNode)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMProcessingInstruction", class_DOMProcessingInstruction_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DOMNode);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DOMXPath(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DOMXPath", class_DOMXPath_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/dom/processinginstruction.c b/ext/dom/processinginstruction.c
index 73367442eb..9c4e208387 100644
--- a/ext/dom/processinginstruction.c
+++ b/ext/dom/processinginstruction.c
@@ -75,7 +75,7 @@ int dom_processinginstruction_target_read(dom_object *obj, zval *retval)
xmlNodePtr nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -99,7 +99,7 @@ int dom_processinginstruction_data_read(dom_object *obj, zval *retval)
nodep = dom_object_get_node(obj);
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
@@ -119,7 +119,7 @@ int dom_processinginstruction_data_write(dom_object *obj, zval *newval)
zend_string *str;
if (nodep == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
diff --git a/ext/dom/tests/DOMCharacterData_data_error_002.phpt b/ext/dom/tests/DOMCharacterData_data_error_002.phpt
index 401e0f2f8c..a88ee509bf 100644
--- a/ext/dom/tests/DOMCharacterData_data_error_002.phpt
+++ b/ext/dom/tests/DOMCharacterData_data_error_002.phpt
@@ -8,7 +8,11 @@ Eric Berg <ehberg@gmail.com>
--FILE--
<?php
$character_data = new DOMCharacterData();
-print $character_data->data;
+try {
+ print $character_data->data;
+} catch (DOMException $exception) {
+ echo $exception->getMessage() . "\n";
+}
?>
---EXPECTF--
-Warning: main(): Invalid State Error in %s on line %d
+--EXPECT--
+Invalid State Error
diff --git a/ext/dom/tests/DOMCharacterData_length_error_001.phpt b/ext/dom/tests/DOMCharacterData_length_error_001.phpt
index 34d5273be4..79d936bdd0 100644
--- a/ext/dom/tests/DOMCharacterData_length_error_001.phpt
+++ b/ext/dom/tests/DOMCharacterData_length_error_001.phpt
@@ -8,7 +8,11 @@ Jason Bouffard <jbouffard1@yahoo.com>
--FILE--
<?php
$character_data = new DOMCharacterData();
-print $character_data->length;
+try {
+ print $character_data->length;
+} catch (DOMException $exception) {
+ echo $exception->getMessage() . "\n";
+}
?>
---EXPECTF--
-Warning: main(): Invalid State Error in %s
+--EXPECT--
+Invalid State Error
diff --git a/ext/dom/tests/DOMDocumentType_entities_error_001.phpt b/ext/dom/tests/DOMDocumentType_entities_error_001.phpt
index 4d047a0058..f93ae21386 100644
--- a/ext/dom/tests/DOMDocumentType_entities_error_001.phpt
+++ b/ext/dom/tests/DOMDocumentType_entities_error_001.phpt
@@ -8,7 +8,11 @@ Eric Lee Stewart <ericleestewart@gmail.com>
--FILE--
<?php
$doctype = new DOMDocumentType();
-$entities = $doctype->entities;
+try {
+ $doctype->entities;
+} catch (DOMException $exception) {
+ echo $exception->getMessage() . "\n";
+}
?>
---EXPECTF--
-Warning: main(): Invalid State Error in %s on line %d
+--EXPECT--
+Invalid State Error
diff --git a/ext/dom/tests/DOMDocumentType_internalSubset_error_001.phpt b/ext/dom/tests/DOMDocumentType_internalSubset_error_001.phpt
index 5825914777..b05712ce24 100644
--- a/ext/dom/tests/DOMDocumentType_internalSubset_error_001.phpt
+++ b/ext/dom/tests/DOMDocumentType_internalSubset_error_001.phpt
@@ -8,7 +8,11 @@ Eric Lee Stewart <ericleestewart@gmail.com>
--FILE--
<?php
$doctype = new DOMDocumentType();
-$internalSubset = $doctype->internalSubset;
+try {
+ $doctype->internalSubset;
+} catch (DOMException $exception) {
+ echo $exception->getMessage() . "\n";
+}
?>
---EXPECTF--
-Warning: main(): Invalid State Error in %s on line %d
+--EXPECT--
+Invalid State Error
diff --git a/ext/dom/tests/DOMDocumentType_name_error_001.phpt b/ext/dom/tests/DOMDocumentType_name_error_001.phpt
index 026ea2393a..7eda99dca5 100644
--- a/ext/dom/tests/DOMDocumentType_name_error_001.phpt
+++ b/ext/dom/tests/DOMDocumentType_name_error_001.phpt
@@ -8,7 +8,11 @@ Eric Lee Stewart <ericleestewart@gmail.com>
--FILE--
<?php
$doctype = new DOMDocumentType();
-$name = $doctype->name;
+try {
+ $doctype->name;
+} catch (DOMException $exception) {
+ echo $exception->getMessage() . "\n";
+}
?>
---EXPECTF--
-Warning: main(): Invalid State Error in %s on line %d
+--EXPECT--
+Invalid State Error
diff --git a/ext/dom/tests/DOMDocumentType_notations_error_001.phpt b/ext/dom/tests/DOMDocumentType_notations_error_001.phpt
index a18f47f3f1..53b8c9c0d1 100644
--- a/ext/dom/tests/DOMDocumentType_notations_error_001.phpt
+++ b/ext/dom/tests/DOMDocumentType_notations_error_001.phpt
@@ -8,7 +8,11 @@ Eric Lee Stewart <ericleestewart@gmail.com>
--FILE--
<?php
$doctype = new DOMDocumentType();
-$notations = $doctype->notations;
+try {
+ $notations = $doctype->notations;
+} catch (DOMException $exception) {
+ echo $exception->getMessage() . "\n";
+}
?>
---EXPECTF--
-Warning: main(): Invalid State Error in %s on line %d
+--EXPECT--
+Invalid State Error
diff --git a/ext/dom/tests/DOMDocumentType_publicId_error_001.phpt b/ext/dom/tests/DOMDocumentType_publicId_error_001.phpt
index df6c2bd908..c46f94faeb 100644
--- a/ext/dom/tests/DOMDocumentType_publicId_error_001.phpt
+++ b/ext/dom/tests/DOMDocumentType_publicId_error_001.phpt
@@ -8,7 +8,11 @@ Eric Lee Stewart <ericleestewart@gmail.com>
--FILE--
<?php
$doctype = new DOMDocumentType();
-$publicId = $doctype->publicId;
+try {
+ $publicId = $doctype->publicId;
+} catch (DOMException $exception) {
+ echo $exception->getMessage() . "\n";
+}
?>
---EXPECTF--
-Warning: main(): Invalid State Error in %s on line %d
+--EXPECT--
+Invalid State Error
diff --git a/ext/dom/tests/DOMDocumentType_systemId_error_001.phpt b/ext/dom/tests/DOMDocumentType_systemId_error_001.phpt
index e302fcc7f1..a8dfe3bdfb 100644
--- a/ext/dom/tests/DOMDocumentType_systemId_error_001.phpt
+++ b/ext/dom/tests/DOMDocumentType_systemId_error_001.phpt
@@ -8,7 +8,11 @@ Eric Lee Stewart <ericleestewart@gmail.com>
--FILE--
<?php
$doctype = new DOMDocumentType();
-$systemId = $doctype->systemId;
+try {
+ $systemId = $doctype->systemId;
+} catch (DOMException $exception) {
+ echo $exception->getMessage() . "\n";
+}
?>
---EXPECTF--
-Warning: main(): Invalid State Error in %s on line %d
+--EXPECT--
+Invalid State Error
diff --git a/ext/dom/tests/DOMDocument_saveHTMLFile_invalid_filename.phpt b/ext/dom/tests/DOMDocument_saveHTMLFile_invalid_filename.phpt
index 12b45a491b..4e724585f1 100644
--- a/ext/dom/tests/DOMDocument_saveHTMLFile_invalid_filename.phpt
+++ b/ext/dom/tests/DOMDocument_saveHTMLFile_invalid_filename.phpt
@@ -9,7 +9,7 @@ require_once __DIR__ .'/skipif.inc';
?>
--FILE--
<?php
-$filename = null;
+$filename = '';
$doc = new DOMDocument('1.0');
$root = $doc->createElement('html');
$root = $doc->appendChild($root);
diff --git a/ext/dom/tests/dom003.phpt b/ext/dom/tests/dom003.phpt
index 20db09d40e..d846995db5 100644
--- a/ext/dom/tests/dom003.phpt
+++ b/ext/dom/tests/dom003.phpt
@@ -30,6 +30,8 @@ object(DOMException)#%d (%d) {
string(23) "Hierarchy Request Error"
["string":"Exception":private]=>
string(0) ""
+ ["code"]=>
+ int(3)
["file":protected]=>
string(%d) "%sdom003.php"
["line":protected]=>
@@ -57,8 +59,6 @@ object(DOMException)#%d (%d) {
}
["previous":"Exception":private]=>
NULL
- ["code"]=>
- int(3)
}
--- Don't catch exception with try/catch
diff --git a/ext/dom/tests/dom_set_attr_node.phpt b/ext/dom/tests/dom_set_attr_node.phpt
index 6160cd48f2..bb573ffda0 100644
--- a/ext/dom/tests/dom_set_attr_node.phpt
+++ b/ext/dom/tests/dom_set_attr_node.phpt
@@ -40,6 +40,8 @@ object(DOMException)#%d (7) {
string(20) "Wrong Document Error"
["string":"Exception":private]=>
string(0) ""
+ ["code"]=>
+ int(4)
["file":protected]=>
string(%d) "%sdom_set_attr_node.php"
["line":protected]=>
@@ -67,6 +69,4 @@ object(DOMException)#%d (7) {
}
["previous":"Exception":private]=>
NULL
- ["code"]=>
- int(4)
}
diff --git a/ext/dom/text.c b/ext/dom/text.c
index 7a45be2463..c19d3e9194 100644
--- a/ext/dom/text.c
+++ b/ext/dom/text.c
@@ -74,7 +74,7 @@ int dom_text_whole_text_read(dom_object *obj, zval *retval)
node = dom_object_get_node(obj);
if (node == NULL) {
- php_dom_throw_error(INVALID_STATE_ERR, 0);
+ php_dom_throw_error(INVALID_STATE_ERR, 1);
return FAILURE;
}
diff --git a/ext/dom/xml_common.h b/ext/dom/xml_common.h
index 40548c2d1a..671710e2e8 100644
--- a/ext/dom/xml_common.h
+++ b/ext/dom/xml_common.h
@@ -53,7 +53,7 @@ static inline dom_object *php_dom_obj_from_obj(zend_object *obj) {
PHP_DOM_EXPORT extern zend_class_entry *dom_node_class_entry;
PHP_DOM_EXPORT dom_object *php_dom_object_get_data(xmlNodePtr obj);
-PHP_DOM_EXPORT zend_bool php_dom_create_object(xmlNodePtr obj, zval* return_value, dom_object *domobj);
+PHP_DOM_EXPORT bool php_dom_create_object(xmlNodePtr obj, zval* return_value, dom_object *domobj);
PHP_DOM_EXPORT xmlNodePtr dom_object_get_node(dom_object *obj);
#define DOM_XMLNS_NAMESPACE \
diff --git a/ext/dom/xpath.c b/ext/dom/xpath.c
index 1f97601c42..6ea3533188 100644
--- a/ext/dom/xpath.c
+++ b/ext/dom/xpath.c
@@ -208,7 +208,7 @@ static void dom_xpath_ext_function_object_php(xmlXPathParserContextPtr ctxt, int
PHP_METHOD(DOMXPath, __construct)
{
zval *doc;
- zend_bool register_node_ns = 1;
+ bool register_node_ns = 1;
xmlDocPtr docp = NULL;
dom_object *docobj;
dom_xpath_object *intern;
@@ -335,7 +335,7 @@ static void php_xpath_eval(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */
char *expr;
xmlDoc *docp = NULL;
xmlNsPtr *ns = NULL;
- zend_bool register_node_ns;
+ bool register_node_ns;
id = ZEND_THIS;
intern = Z_XPATHOBJ_P(id);
diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c
index b602620c2a..b99dd24ac5 100644
--- a/ext/enchant/enchant.c
+++ b/ext/enchant/enchant.c
@@ -186,11 +186,7 @@ static void php_enchant_dict_free(zend_object *object) /* {{{ */
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(enchant)
{
- zend_class_entry bce, dce;
-
- INIT_CLASS_ENTRY(bce, "EnchantBroker", class_EnchantBroker_methods);
- enchant_broker_ce = zend_register_internal_class(&bce);
- enchant_broker_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ enchant_broker_ce = register_class_EnchantBroker();
enchant_broker_ce->create_object = enchant_broker_create_object;
enchant_broker_ce->serialize = zend_class_serialize_deny;
enchant_broker_ce->unserialize = zend_class_unserialize_deny;
@@ -201,9 +197,7 @@ PHP_MINIT_FUNCTION(enchant)
enchant_broker_handlers.clone_obj = NULL;
enchant_broker_handlers.compare = zend_objects_not_comparable;
- INIT_CLASS_ENTRY(dce, "EnchantDictionary", class_EnchantDictionary_methods);
- enchant_dict_ce = zend_register_internal_class(&dce);
- enchant_dict_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ enchant_dict_ce = register_class_EnchantDictionary();
enchant_dict_ce->create_object = enchant_dict_create_object;
enchant_dict_ce->serialize = zend_class_serialize_deny;
enchant_dict_ce->unserialize = zend_class_unserialize_deny;
diff --git a/ext/enchant/enchant.stub.php b/ext/enchant/enchant.stub.php
index dcd11cea38..3e7b1e87ae 100644
--- a/ext/enchant/enchant.stub.php
+++ b/ext/enchant/enchant.stub.php
@@ -1,11 +1,13 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+/** @strict-properties */
final class EnchantBroker
{
}
+/** @strict-properties */
final class EnchantDictionary
{
}
diff --git a/ext/enchant/enchant_arginfo.h b/ext/enchant/enchant_arginfo.h
index 34fa122b54..b8902b32ce 100644
--- a/ext/enchant/enchant_arginfo.h
+++ b/ext/enchant/enchant_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 31f7c4cd39e58d6474b90acd65f4b7bda7a6ddf3 */
+ * Stub hash: b55b5d39b48d38af9c28bd810c77adcda466f1bd */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_enchant_broker_init, 0, 0, EnchantBroker, MAY_BE_FALSE)
ZEND_END_ARG_INFO()
@@ -157,3 +157,25 @@ static const zend_function_entry class_EnchantBroker_methods[] = {
static const zend_function_entry class_EnchantDictionary_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_EnchantBroker(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "EnchantBroker", class_EnchantBroker_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_EnchantDictionary(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "EnchantDictionary", class_EnchantDictionary_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/exif/exif.c b/ext/exif/exif.c
index 7a69ba470e..e54d508b0e 100644
--- a/ext/exif/exif.c
+++ b/ext/exif/exif.c
@@ -2036,7 +2036,7 @@ typedef struct {
char *valid_end; /* exclusive */
} exif_offset_info;
-static zend_always_inline zend_bool ptr_offset_overflows(char *ptr, size_t offset) {
+static zend_always_inline bool ptr_offset_overflows(char *ptr, size_t offset) {
return UINTPTR_MAX - (uintptr_t) ptr < offset;
}
@@ -2072,7 +2072,7 @@ static inline char *exif_offset_info_try_get(
return start;
}
-static inline zend_bool exif_offset_info_contains(
+static inline bool exif_offset_info_contains(
const exif_offset_info *info, char *start, size_t length) {
char *end;
if (ptr_offset_overflows(start, length)) {
@@ -4478,7 +4478,7 @@ static bool exif_read_from_file(image_info_type *ImageInfo, char *FileName, int
PHP_FUNCTION(exif_read_data)
{
zend_string *z_sections_needed = NULL;
- zend_bool sub_arrays = 0, read_thumbnail = 0, read_all = 0;
+ bool sub_arrays = 0, read_thumbnail = 0, read_all = 0;
zval *stream;
bool ret;
int i, sections_needed = 0;
@@ -4489,7 +4489,7 @@ PHP_FUNCTION(exif_read_data)
ZEND_PARSE_PARAMETERS_START(1, 4)
Z_PARAM_ZVAL(stream)
Z_PARAM_OPTIONAL
- Z_PARAM_STR_EX(z_sections_needed, 1, 0)
+ Z_PARAM_STR_OR_NULL(z_sections_needed)
Z_PARAM_BOOL(sub_arrays)
Z_PARAM_BOOL(read_thumbnail)
ZEND_PARSE_PARAMETERS_END();
diff --git a/ext/exif/exif.stub.php b/ext/exif/exif.stub.php
index 9a8afe8577..bcaadbd697 100644
--- a/ext/exif/exif.stub.php
+++ b/ext/exif/exif.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function exif_tagname(int $index): string|false {}
diff --git a/ext/exif/exif_arginfo.h b/ext/exif/exif_arginfo.h
index 91dd8b0e61..d39a9b7e2e 100644
--- a/ext/exif/exif_arginfo.h
+++ b/ext/exif/exif_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: ef23ff502ea9658af29e50d57366c281f7a7eb6c */
+ * Stub hash: 466379e651a4944e15a0163eabfb29b7d988d747 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_exif_tagname, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, index, IS_LONG, 0)
diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c
index e3da06698f..21c6dcf451 100644
--- a/ext/ffi/ffi.c
+++ b/ext/ffi/ffi.c
@@ -124,8 +124,8 @@ struct _zend_ffi_type {
typedef struct _zend_ffi_field {
size_t offset;
- zend_bool is_const;
- zend_bool is_nested; /* part of nested anonymous struct */
+ bool is_const;
+ bool is_nested; /* part of nested anonymous struct */
uint8_t first_bit;
uint8_t bits;
zend_ffi_type *type;
@@ -140,7 +140,7 @@ typedef enum _zend_ffi_symbol_kind {
typedef struct _zend_ffi_symbol {
zend_ffi_symbol_kind kind;
- zend_bool is_const;
+ bool is_const;
zend_ffi_type *type;
union {
void *addr;
@@ -158,7 +158,7 @@ typedef struct _zend_ffi {
DL_HANDLE lib;
HashTable *symbols;
HashTable *tags;
- zend_bool persistent;
+ bool persistent;
} zend_ffi;
#define ZEND_FFI_TYPE_OWNED (1<<0)
@@ -209,7 +209,7 @@ static void _zend_ffi_type_dtor(zend_ffi_type *type);
static void zend_ffi_finalize_type(zend_ffi_dcl *dcl);
static int zend_ffi_is_same_type(zend_ffi_type *type1, zend_ffi_type *type2);
static zend_ffi_type *zend_ffi_remember_type(zend_ffi_type *type);
-static char *zend_ffi_parse_directives(const char *filename, char *code_pos, char **scope_name, char **lib, zend_bool preload);
+static char *zend_ffi_parse_directives(const char *filename, char *code_pos, char **scope_name, char **lib, bool preload);
static ZEND_FUNCTION(ffi_trampoline);
static ZEND_COLD void zend_ffi_return_unsupported(zend_ffi_type *type);
static ZEND_COLD void zend_ffi_pass_unsupported(zend_ffi_type *type);
@@ -482,7 +482,7 @@ static zend_never_inline zend_ffi_cdata *zend_ffi_cdata_to_zval_slow_ret(void *p
}
/* }}} */
-static zend_always_inline void zend_ffi_cdata_to_zval(zend_ffi_cdata *cdata, void *ptr, zend_ffi_type *type, int read_type, zval *rv, zend_ffi_flags flags, zend_bool is_ret, zend_bool debug_union) /* {{{ */
+static zend_always_inline void zend_ffi_cdata_to_zval(zend_ffi_cdata *cdata, void *ptr, zend_ffi_type *type, int read_type, zval *rv, zend_ffi_flags flags, bool is_ret, bool debug_union) /* {{{ */
{
if (read_type == BP_VAR_R) {
zend_ffi_type_kind kind = type->kind;
@@ -1826,7 +1826,7 @@ typedef struct _zend_ffi_cdata_iterator {
zend_object_iterator it;
zend_long key;
zval value;
- zend_bool by_ref;
+ bool by_ref;
} zend_ffi_cdata_iterator;
static void zend_ffi_cdata_it_dtor(zend_object_iterator *iter) /* {{{ */
@@ -2031,7 +2031,7 @@ static HashTable *zend_ffi_cdata_get_debug_info(zend_object *obj, int *is_temp)
}
/* }}} */
-static int zend_ffi_cdata_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, zend_bool check_only) /* {{{ */
+static int zend_ffi_cdata_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only) /* {{{ */
{
zend_ffi_cdata *cdata = (zend_ffi_cdata*)obj;
zend_ffi_type *type = ZEND_FFI_TYPE(cdata->type);
@@ -3122,7 +3122,7 @@ static zend_ffi_type *zend_ffi_remember_type(zend_ffi_type *type) /* {{{ */
}
/* }}} */
-static zend_ffi *zend_ffi_load(const char *filename, zend_bool preload) /* {{{ */
+static zend_ffi *zend_ffi_load(const char *filename, bool preload) /* {{{ */
{
struct stat buf;
int fd;
@@ -3479,7 +3479,7 @@ static int zend_ffi_validate_vla(zend_ffi_type *type) /* {{{ */
}
/* }}} */
-static int zend_ffi_validate_incomplete_type(zend_ffi_type *type, zend_bool allow_incomplete_tag, zend_bool allow_incomplete_array) /* {{{ */
+static int zend_ffi_validate_incomplete_type(zend_ffi_type *type, bool allow_incomplete_tag, bool allow_incomplete_array) /* {{{ */
{
if (!allow_incomplete_tag && (type->attr & ZEND_FFI_ATTR_INCOMPLETE_TAG)) {
if (FFI_G(tags)) {
@@ -3523,7 +3523,7 @@ static int zend_ffi_validate_incomplete_type(zend_ffi_type *type, zend_bool allo
}
/* }}} */
-static int zend_ffi_validate_type(zend_ffi_type *type, zend_bool allow_incomplete_tag, zend_bool allow_incomplete_array) /* {{{ */
+static int zend_ffi_validate_type(zend_ffi_type *type, bool allow_incomplete_tag, bool allow_incomplete_array) /* {{{ */
{
if (type->kind == ZEND_FFI_TYPE_VOID) {
zend_ffi_throw_parser_error("void type is not allowed at line %d", FFI_G(line));
@@ -3533,7 +3533,7 @@ static int zend_ffi_validate_type(zend_ffi_type *type, zend_bool allow_incomplet
}
/* }}} */
-static int zend_ffi_validate_var_type(zend_ffi_type *type, zend_bool allow_incomplete_array) /* {{{ */
+static int zend_ffi_validate_var_type(zend_ffi_type *type, bool allow_incomplete_array) /* {{{ */
{
if (type->kind == ZEND_FFI_TYPE_FUNC) {
zend_ffi_throw_parser_error("function type is not allowed at line %d", FFI_G(line));
@@ -3617,9 +3617,9 @@ ZEND_METHOD(FFI, new) /* {{{ */
zend_ffi_type *type, *type_ptr;
zend_ffi_cdata *cdata;
void *ptr;
- zend_bool owned = 1;
- zend_bool persistent = 0;
- zend_bool is_const = 0;
+ bool owned = 1;
+ bool persistent = 0;
+ bool is_const = 0;
zend_ffi_flags flags = ZEND_FFI_FLAG_OWNED;
ZEND_FFI_VALIDATE_API_RESTRICTION();
@@ -3736,7 +3736,7 @@ ZEND_METHOD(FFI, free) /* {{{ */
ZEND_FFI_VALIDATE_API_RESTRICTION();
ZEND_PARSE_PARAMETERS_START(1, 1)
- Z_PARAM_OBJECT_OF_CLASS_EX2(zv, zend_ffi_cdata_ce, 0, 1, 0);
+ Z_PARAM_OBJECT_OF_CLASS_EX(zv, zend_ffi_cdata_ce, 0, 1);
ZEND_PARSE_PARAMETERS_END();
cdata = (zend_ffi_cdata*)Z_OBJ_P(zv);
@@ -3769,7 +3769,7 @@ ZEND_METHOD(FFI, cast) /* {{{ */
zend_object *ztype = NULL;
zend_ffi_type *old_type, *type, *type_ptr;
zend_ffi_cdata *old_cdata, *cdata;
- zend_bool is_const = 0;
+ bool is_const = 0;
zval *zv, *arg;
void *ptr;
@@ -4227,7 +4227,7 @@ ZEND_METHOD(FFI, memcpy) /* {{{ */
ZEND_FFI_VALIDATE_API_RESTRICTION();
ZEND_PARSE_PARAMETERS_START(3, 3)
- Z_PARAM_OBJECT_OF_CLASS_EX2(zv1, zend_ffi_cdata_ce, 0, 1, 0);
+ Z_PARAM_OBJECT_OF_CLASS_EX(zv1, zend_ffi_cdata_ce, 0, 1);
Z_PARAM_ZVAL(zv2)
Z_PARAM_LONG(size)
ZEND_PARSE_PARAMETERS_END();
@@ -4357,7 +4357,7 @@ ZEND_METHOD(FFI, memset) /* {{{ */
ZEND_FFI_VALIDATE_API_RESTRICTION();
ZEND_PARSE_PARAMETERS_START(3, 3)
- Z_PARAM_OBJECT_OF_CLASS_EX2(zv, zend_ffi_cdata_ce, 0, 1, 0);
+ Z_PARAM_OBJECT_OF_CLASS_EX(zv, zend_ffi_cdata_ce, 0, 1);
Z_PARAM_LONG(ch)
Z_PARAM_LONG(size)
ZEND_PARSE_PARAMETERS_END();
@@ -4385,11 +4385,11 @@ ZEND_METHOD(FFI, string) /* {{{ */
zend_ffi_type *type;
void *ptr;
zend_long size;
- zend_bool size_is_null = 1;
+ bool size_is_null = 1;
ZEND_FFI_VALIDATE_API_RESTRICTION();
ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_OBJECT_OF_CLASS_EX2(zv, zend_ffi_cdata_ce, 0, 1, 0);
+ Z_PARAM_OBJECT_OF_CLASS_EX(zv, zend_ffi_cdata_ce, 0, 1);
Z_PARAM_OPTIONAL
Z_PARAM_LONG_OR_NULL(size, size_is_null)
ZEND_PARSE_PARAMETERS_END();
@@ -4470,7 +4470,7 @@ ZEND_METHOD(FFI_CType, getName) /* {{{ */
}
}
-static char *zend_ffi_parse_directives(const char *filename, char *code_pos, char **scope_name, char **lib, zend_bool preload) /* {{{ */
+static char *zend_ffi_parse_directives(const char *filename, char *code_pos, char **scope_name, char **lib, bool preload) /* {{{ */
{
char *p;
@@ -4834,7 +4834,7 @@ static int zend_ffi_preload(char *preload) /* {{{ */
{
zend_ffi *ffi;
char *s = NULL, *e, *filename;
- zend_bool is_glob = 0;
+ bool is_glob = 0;
e = preload;
while (*e) {
@@ -4899,22 +4899,15 @@ static int zend_ffi_preload(char *preload) /* {{{ */
/* {{{ ZEND_MINIT_FUNCTION */
ZEND_MINIT_FUNCTION(ffi)
{
- zend_class_entry ce;
-
REGISTER_INI_ENTRIES();
FFI_G(is_cli) = strcmp(sapi_module.name, "cli") == 0;
- INIT_NS_CLASS_ENTRY(ce, "FFI", "Exception", NULL);
- zend_ffi_exception_ce = zend_register_internal_class_ex(&ce, zend_ce_error);
+ zend_ffi_exception_ce = register_class_FFI_Exception(zend_ce_error);
- INIT_NS_CLASS_ENTRY(ce, "FFI", "ParserException", NULL);
- zend_ffi_parser_exception_ce = zend_register_internal_class_ex(&ce, zend_ffi_exception_ce);
- zend_ffi_parser_exception_ce->ce_flags |= ZEND_ACC_FINAL;
+ zend_ffi_parser_exception_ce = register_class_FFI_ParserException(zend_ffi_exception_ce);
- INIT_CLASS_ENTRY(ce, "FFI", class_FFI_methods);
- zend_ffi_ce = zend_register_internal_class(&ce);
- zend_ffi_ce->ce_flags |= ZEND_ACC_FINAL;
+ zend_ffi_ce = register_class_FFI();
zend_ffi_ce->create_object = zend_ffi_new;
zend_ffi_ce->serialize = zend_class_serialize_deny;
zend_ffi_ce->unserialize = zend_class_unserialize_deny;
@@ -4949,9 +4942,7 @@ ZEND_MINIT_FUNCTION(ffi)
zend_declare_class_constant_long(zend_ffi_ce, "__BIGGEST_ALIGNMENT__", sizeof("__BIGGEST_ALIGNMENT__")-1, __BIGGEST_ALIGNMENT__);
- INIT_NS_CLASS_ENTRY(ce, "FFI", "CData", NULL);
- zend_ffi_cdata_ce = zend_register_internal_class(&ce);
- zend_ffi_cdata_ce->ce_flags |= ZEND_ACC_FINAL;
+ zend_ffi_cdata_ce = register_class_FFI_CData();
zend_ffi_cdata_ce->create_object = zend_ffi_cdata_new;
zend_ffi_cdata_ce->get_iterator = zend_ffi_cdata_get_iterator;
zend_ffi_cdata_ce->serialize = zend_class_serialize_deny;
@@ -5027,9 +5018,7 @@ ZEND_MINIT_FUNCTION(ffi)
zend_ffi_cdata_free_handlers.get_properties = zend_fake_get_properties;
zend_ffi_cdata_free_handlers.get_gc = zend_fake_get_gc;
- INIT_NS_CLASS_ENTRY(ce, "FFI", "CType", class_FFI_CType_methods);
- zend_ffi_ctype_ce = zend_register_internal_class(&ce);
- zend_ffi_ctype_ce->ce_flags |= ZEND_ACC_FINAL;
+ zend_ffi_ctype_ce = register_class_FFI_CType();
zend_ffi_ctype_ce->create_object = zend_ffi_ctype_new;
zend_ffi_ctype_ce->serialize = zend_class_serialize_deny;
zend_ffi_ctype_ce->unserialize = zend_class_unserialize_deny;
@@ -5438,8 +5427,8 @@ void zend_ffi_add_enum_val(zend_ffi_dcl *enum_dcl, const char *name, size_t name
const zend_ffi_type *sym_type;
int64_t value;
zend_ffi_type *enum_type = ZEND_FFI_TYPE(enum_dcl->type);
- zend_bool overflow = 0;
- zend_bool is_signed =
+ bool overflow = 0;
+ bool is_signed =
(enum_type->enumeration.kind == ZEND_FFI_TYPE_SINT8 ||
enum_type->enumeration.kind == ZEND_FFI_TYPE_SINT16 ||
enum_type->enumeration.kind == ZEND_FFI_TYPE_SINT32 ||
@@ -5624,7 +5613,7 @@ void zend_ffi_add_field(zend_ffi_dcl *struct_dcl, const char *name, size_t name_
struct_type->size += field_type->size;
}
field->type = field_dcl->type;
- field->is_const = (zend_bool)(field_dcl->attr & ZEND_FFI_ATTR_CONST);
+ field->is_const = (bool)(field_dcl->attr & ZEND_FFI_ATTR_CONST);
field->is_nested = 0;
field->first_bit = 0;
field->bits = 0;
@@ -5792,7 +5781,7 @@ void zend_ffi_add_bit_field(zend_ffi_dcl *struct_dcl, const char *name, size_t n
}
}
field->type = field_dcl->type;
- field->is_const = (zend_bool)(field_dcl->attr & ZEND_FFI_ATTR_CONST);
+ field->is_const = (bool)(field_dcl->attr & ZEND_FFI_ATTR_CONST);
field->is_nested = 0;
field_dcl->type = field_type; /* reset "owned" flag */
@@ -6111,7 +6100,7 @@ void zend_ffi_declare(const char *name, size_t name_len, zend_ffi_dcl *dcl) /* {
if ((dcl->flags & ZEND_FFI_DCL_STORAGE_CLASS) == ZEND_FFI_DCL_TYPEDEF
&& sym->kind == ZEND_FFI_SYM_TYPE
&& zend_ffi_is_same_type(ZEND_FFI_TYPE(sym->type), ZEND_FFI_TYPE(dcl->type))
- && sym->is_const == (zend_bool)(dcl->attr & ZEND_FFI_ATTR_CONST)) {
+ && sym->is_const == (bool)(dcl->attr & ZEND_FFI_ATTR_CONST)) {
/* allowed redeclaration */
zend_ffi_type_dtor(dcl->type);
return;
@@ -6129,7 +6118,7 @@ void zend_ffi_declare(const char *name, size_t name_len, zend_ffi_dcl *dcl) /* {
} else {
if (sym->kind == ZEND_FFI_SYM_VAR
&& zend_ffi_is_same_type(ZEND_FFI_TYPE(sym->type), type)
- && sym->is_const == (zend_bool)(dcl->attr & ZEND_FFI_ATTR_CONST)) {
+ && sym->is_const == (bool)(dcl->attr & ZEND_FFI_ATTR_CONST)) {
/* allowed redeclaration */
zend_ffi_type_dtor(dcl->type);
return;
@@ -6158,7 +6147,7 @@ void zend_ffi_declare(const char *name, size_t name_len, zend_ffi_dcl *dcl) /* {
sym = pemalloc(sizeof(zend_ffi_symbol), FFI_G(persistent));
sym->kind = ZEND_FFI_SYM_TYPE;
sym->type = dcl->type;
- sym->is_const = (zend_bool)(dcl->attr & ZEND_FFI_ATTR_CONST);
+ sym->is_const = (bool)(dcl->attr & ZEND_FFI_ATTR_CONST);
dcl->type = ZEND_FFI_TYPE(dcl->type); /* reset "owned" flag */
zend_hash_str_add_new_ptr(FFI_G(symbols), name, name_len, sym);
} else {
@@ -6174,7 +6163,7 @@ void zend_ffi_declare(const char *name, size_t name_len, zend_ffi_dcl *dcl) /* {
sym = pemalloc(sizeof(zend_ffi_symbol), FFI_G(persistent));
sym->kind = (type->kind == ZEND_FFI_TYPE_FUNC) ? ZEND_FFI_SYM_FUNC : ZEND_FFI_SYM_VAR;
sym->type = dcl->type;
- sym->is_const = (zend_bool)(dcl->attr & ZEND_FFI_ATTR_CONST);
+ sym->is_const = (bool)(dcl->attr & ZEND_FFI_ATTR_CONST);
dcl->type = type; /* reset "owned" flag */
zend_hash_str_add_new_ptr(FFI_G(symbols), name, name_len, sym);
} else {
@@ -6186,7 +6175,7 @@ void zend_ffi_declare(const char *name, size_t name_len, zend_ffi_dcl *dcl) /* {
}
/* }}} */
-void zend_ffi_declare_tag(const char *name, size_t name_len, zend_ffi_dcl *dcl, zend_bool incomplete) /* {{{ */
+void zend_ffi_declare_tag(const char *name, size_t name_len, zend_ffi_dcl *dcl, bool incomplete) /* {{{ */
{
zend_ffi_tag *tag;
zend_ffi_type *type;
diff --git a/ext/ffi/ffi.g b/ext/ffi/ffi.g
index 4d7c003906..0dd94dfb6d 100644
--- a/ext/ffi/ffi.g
+++ b/ext/ffi/ffi.g
@@ -335,7 +335,7 @@ enumerator(zend_ffi_dcl *enum_dcl, int64_t *min, int64_t *max, int64_t *last):
declarator(zend_ffi_dcl *dcl, const char **name, size_t *name_len):
{zend_ffi_dcl nested_dcl = {ZEND_FFI_DCL_CHAR, 0, 0, 0, NULL};}
- {zend_bool nested = 0;}
+ {bool nested = 0;}
pointer(dcl)?
( ID(name, name_len)
| "("
@@ -350,7 +350,7 @@ declarator(zend_ffi_dcl *dcl, const char **name, size_t *name_len):
abstract_declarator(zend_ffi_dcl *dcl):
{zend_ffi_dcl nested_dcl = {ZEND_FFI_DCL_CHAR, 0, 0, 0, NULL};}
- {zend_bool nested = 0;}
+ {bool nested = 0;}
pointer(dcl)?
( &nested_declarator_start
"("
@@ -365,7 +365,7 @@ abstract_declarator(zend_ffi_dcl *dcl):
parameter_declarator(zend_ffi_dcl *dcl, const char **name, size_t *name_len):
{zend_ffi_dcl nested_dcl = {ZEND_FFI_DCL_CHAR, 0, 0, 0, NULL};}
- {zend_bool nested = 0;}
+ {bool nested = 0;}
pointer(dcl)?
( &nested_declarator_start
"("
@@ -440,7 +440,7 @@ array_or_function_declarators(zend_ffi_dcl *dcl, zend_ffi_dcl *nested_dcl):
parameter_declaration(HashTable **args):
{const char *name = NULL;}
{size_t name_len = 0;}
- {zend_bool old_allow_vla = FFI_G(allow_vla);}
+ {bool old_allow_vla = FFI_G(allow_vla);}
{FFI_G(allow_vla) = 1;}
{zend_ffi_dcl param_dcl = ZEND_FFI_ATTR_INIT;}
specifier_qualifier_list(&param_dcl)
@@ -498,7 +498,7 @@ attrib(zend_ffi_dcl *dcl):
{size_t name_len;}
{int n;}
{zend_ffi_val val;}
- {zend_bool orig_attribute_parsing;}
+ {bool orig_attribute_parsing;}
( ID(&name, &name_len)
( /* empty */
{zend_ffi_add_attribute(dcl, name, name_len);}
diff --git a/ext/ffi/ffi.stub.php b/ext/ffi/ffi.stub.php
index 61178774b8..a6649a79d9 100644
--- a/ext/ffi/ffi.stub.php
+++ b/ext/ffi/ffi.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
namespace {
diff --git a/ext/ffi/ffi_arginfo.h b/ext/ffi/ffi_arginfo.h
index fac33f1dbd..0d58573922 100644
--- a/ext/ffi/ffi_arginfo.h
+++ b/ext/ffi/ffi_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: b01d17eaac68e56d3f2c2c2bc86d44bcc8ea7c26 */
+ * Stub hash: e1d300639ded25533502902180fb76dd5b4d92b2 */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_FFI_cdef, 0, 0, FFI, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, code, IS_STRING, 0, "\"\"")
@@ -144,3 +144,57 @@ static const zend_function_entry class_FFI_Exception_methods[] = {
static const zend_function_entry class_FFI_ParserException_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_FFI(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "FFI", class_FFI_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_FFI_CData(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_NS_CLASS_ENTRY(ce, "FFI", "CData", class_FFI_CData_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_FFI_CType(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_NS_CLASS_ENTRY(ce, "FFI", "CType", class_FFI_CType_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_FFI_Exception(zend_class_entry *class_entry_Error)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_NS_CLASS_ENTRY(ce, "FFI", "Exception", class_FFI_Exception_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_FFI_ParserException(zend_class_entry *class_entry_FFI_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_NS_CLASS_ENTRY(ce, "FFI", "ParserException", class_FFI_ParserException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_FFI_Exception);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
diff --git a/ext/ffi/ffi_parser.c b/ext/ffi/ffi_parser.c
index 03d05eb6d9..d50c6f4abf 100644
--- a/ext/ffi/ffi_parser.c
+++ b/ext/ffi/ffi_parser.c
@@ -2569,7 +2569,7 @@ static int parse_enumerator(int sym, zend_ffi_dcl *enum_dcl, int64_t *min, int64
static int parse_declarator(int sym, zend_ffi_dcl *dcl, const char **name, size_t *name_len) {
zend_ffi_dcl nested_dcl = {ZEND_FFI_DCL_CHAR, 0, 0, 0, NULL};
- zend_bool nested = 0;
+ bool nested = 0;
if (sym == YY__STAR) {
sym = parse_pointer(sym, dcl);
}
@@ -2598,7 +2598,7 @@ static int parse_declarator(int sym, zend_ffi_dcl *dcl, const char **name, size_
static int parse_abstract_declarator(int sym, zend_ffi_dcl *dcl) {
zend_ffi_dcl nested_dcl = {ZEND_FFI_DCL_CHAR, 0, 0, 0, NULL};
- zend_bool nested = 0;
+ bool nested = 0;
if (sym == YY__STAR) {
sym = parse_pointer(sym, dcl);
}
@@ -2623,7 +2623,7 @@ static int parse_abstract_declarator(int sym, zend_ffi_dcl *dcl) {
static int parse_parameter_declarator(int sym, zend_ffi_dcl *dcl, const char **name, size_t *name_len) {
zend_ffi_dcl nested_dcl = {ZEND_FFI_DCL_CHAR, 0, 0, 0, NULL};
- zend_bool nested = 0;
+ bool nested = 0;
if (sym == YY__STAR) {
sym = parse_pointer(sym, dcl);
}
@@ -2863,7 +2863,7 @@ _yy_state_119:
static int parse_parameter_declaration(int sym, HashTable **args) {
const char *name = NULL;
size_t name_len = 0;
- zend_bool old_allow_vla = FFI_G(allow_vla);
+ bool old_allow_vla = FFI_G(allow_vla);
FFI_G(allow_vla) = 1;
zend_ffi_dcl param_dcl = ZEND_FFI_ATTR_INIT;
sym = parse_specifier_qualifier_list(sym, &param_dcl);
@@ -2965,7 +2965,7 @@ static int parse_attrib(int sym, zend_ffi_dcl *dcl) {
size_t name_len;
int n;
zend_ffi_val val;
- zend_bool orig_attribute_parsing;
+ bool orig_attribute_parsing;
if (sym == YY_ID || sym == YY_CONST || sym == YY___CONST || sym == YY___CONST__) {
if (sym == YY_ID) {
sym = parse_ID(sym, &name, &name_len);
diff --git a/ext/ffi/php_ffi.h b/ext/ffi/php_ffi.h
index 3a10b45478..4b395dc83d 100644
--- a/ext/ffi/php_ffi.h
+++ b/ext/ffi/php_ffi.h
@@ -30,7 +30,7 @@ typedef struct _zend_ffi_type zend_ffi_type;
ZEND_BEGIN_MODULE_GLOBALS(ffi)
zend_ffi_api_restriction restriction;
- zend_bool is_cli;
+ bool is_cli;
/* predefined ffi_types */
HashTable types;
@@ -54,9 +54,9 @@ ZEND_BEGIN_MODULE_GLOBALS(ffi)
int line;
HashTable *symbols;
HashTable *tags;
- zend_bool allow_vla;
- zend_bool attribute_parsing;
- zend_bool persistent;
+ bool allow_vla;
+ bool attribute_parsing;
+ bool persistent;
uint32_t default_type_attr;
ZEND_END_MODULE_GLOBALS(ffi)
@@ -214,7 +214,7 @@ void ZEND_NORETURN zend_ffi_parser_error(const char *msg, ...);
int zend_ffi_is_typedef_name(const char *name, size_t name_len);
void zend_ffi_resolve_typedef(const char *name, size_t name_len, zend_ffi_dcl *dcl);
void zend_ffi_resolve_const(const char *name, size_t name_len, zend_ffi_val *val);
-void zend_ffi_declare_tag(const char *name, size_t name_len, zend_ffi_dcl *dcl, zend_bool incomplete);
+void zend_ffi_declare_tag(const char *name, size_t name_len, zend_ffi_dcl *dcl, bool incomplete);
void zend_ffi_make_enum_type(zend_ffi_dcl *dcl);
void zend_ffi_add_enum_val(zend_ffi_dcl *enum_dcl, const char *name, size_t name_len, zend_ffi_val *val, int64_t *min, int64_t *max, int64_t *last);
void zend_ffi_make_struct_type(zend_ffi_dcl *dcl);
diff --git a/ext/ffi/tests/bug79096.phpt b/ext/ffi/tests/bug79096.phpt
index d7470eb302..229058048e 100644
--- a/ext/ffi/tests/bug79096.phpt
+++ b/ext/ffi/tests/bug79096.phpt
@@ -3,7 +3,7 @@ Bug #79096 (FFI Struct Segfault)
--SKIPIF--
<?php
if (!extension_loaded('ffi')) die('skip ffi extension not available');
-if (!extension_loaded('zend-test')) die('skip zend-test extension not available');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not available');
?>
--FILE--
<?php
diff --git a/ext/ffi/tests/bug79177.phpt b/ext/ffi/tests/bug79177.phpt
index 0667faa52d..994ccfa6b9 100644
--- a/ext/ffi/tests/bug79177.phpt
+++ b/ext/ffi/tests/bug79177.phpt
@@ -3,7 +3,7 @@ Bug #79177 (FFI doesn't handle well PHP exceptions within callback)
--SKIPIF--
<?php
if (!extension_loaded('ffi')) die('skip ffi extension not available');
-if (!extension_loaded('zend-test')) die('skip zend-test extension not available');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not available');
?>
--FILE--
<?php
diff --git a/ext/ffi/tests/bug79532.phpt b/ext/ffi/tests/bug79532.phpt
index b6887dc7cb..943f8f2576 100644
--- a/ext/ffi/tests/bug79532.phpt
+++ b/ext/ffi/tests/bug79532.phpt
@@ -3,7 +3,7 @@ Bug #79532 (sizeof off_t can be wrong)
--SKIPIF--
<?php
if (!extension_loaded('ffi')) die('skip ffi extension not available');
-if (!extension_loaded('zend-test')) die('skip zend-test extension not available');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not available');
?>
--FILE--
<?php
diff --git a/ext/ffi/tests/bug80847.phpt b/ext/ffi/tests/bug80847.phpt
index bfa750159c..24ded10833 100644
--- a/ext/ffi/tests/bug80847.phpt
+++ b/ext/ffi/tests/bug80847.phpt
@@ -3,7 +3,8 @@ Bug #80847 (Nested structs)
--SKIPIF--
<?php
if (!extension_loaded('ffi')) die('skip ffi extension not available');
-if (!extension_loaded('zend-test')) die('skip zend-test extension not available');
+if (!extension_loaded('zend_test')) die('skip zend_test extension not available');
+if (PHP_OS_FAMILY == 'Windows' && ((1 << 31) > 0)) die('xfail libffi doesn\'t properly support passing big strctures by value on Windows/64');
?>
--FILE--
<?php
diff --git a/ext/fileinfo/fileinfo.c b/ext/fileinfo/fileinfo.c
index cfb933bdb8..5609b26015 100644
--- a/ext/fileinfo/fileinfo.c
+++ b/ext/fileinfo/fileinfo.c
@@ -51,22 +51,12 @@ typedef struct _finfo_object {
zend_object zo;
} finfo_object;
-#define FILEINFO_DECLARE_INIT_OBJECT(object) \
- zval *object = getThis();
-
static inline finfo_object *php_finfo_fetch_object(zend_object *obj) {
return (finfo_object *)((char*)(obj) - XtOffsetOf(finfo_object, zo));
}
#define Z_FINFO_P(zv) php_finfo_fetch_object(Z_OBJ_P((zv)))
-#define FILEINFO_REGISTER_OBJECT(_object, _ptr) \
-{ \
- finfo_object *obj; \
- obj = Z_FINFO_P(_object); \
- obj->ptr = _ptr; \
-}
-
#define FILEINFO_FROM_OBJECT(finfo, object) \
{ \
finfo_object *obj = Z_FINFO_P(object); \
@@ -112,28 +102,12 @@ PHP_FILEINFO_API zend_object *finfo_objects_new(zend_class_entry *class_type)
options, magic_errno(magic), magic_error(magic)); \
RETURN_FALSE; \
}
-
-/* True global resources - no need for thread safety here */
-static int le_fileinfo;
-/* }}} */
-
-void finfo_resource_destructor(zend_resource *rsrc) /* {{{ */
-{
- if (rsrc->ptr) {
- php_fileinfo *finfo = (php_fileinfo *) rsrc->ptr;
- magic_close(finfo->magic);
- efree(rsrc->ptr);
- rsrc->ptr = NULL;
- }
-}
/* }}} */
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(finfo)
{
- zend_class_entry _finfo_class_entry;
- INIT_CLASS_ENTRY(_finfo_class_entry, "finfo", class_finfo_methods);
- finfo_class_entry = zend_register_internal_class(&_finfo_class_entry);
+ finfo_class_entry = register_class_finfo();
finfo_class_entry->create_object = finfo_objects_new;
finfo_class_entry->serialize = zend_class_serialize_deny;
finfo_class_entry->unserialize = zend_class_unserialize_deny;
@@ -144,8 +118,6 @@ PHP_MINIT_FUNCTION(finfo)
finfo_object_handlers.free_obj = finfo_objects_free;
finfo_object_handlers.clone_obj = NULL;
- le_fileinfo = zend_register_list_destructors_ex(finfo_resource_destructor, NULL, "file_info", module_number);
-
REGISTER_LONG_CONSTANT("FILEINFO_NONE", MAGIC_NONE, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILEINFO_SYMLINK", MAGIC_SYMLINK, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FILEINFO_MIME", MAGIC_MIME, CONST_CS|CONST_PERSISTENT);
@@ -204,14 +176,14 @@ PHP_MINFO_FUNCTION(fileinfo)
}
/* }}} */
-/* {{{ Create a new fileinfo resource. */
+/* {{{ Construct a new fileinfo object. */
PHP_FUNCTION(finfo_open)
{
zend_long options = MAGIC_NONE;
char *file = NULL;
size_t file_len = 0;
php_fileinfo *finfo;
- FILEINFO_DECLARE_INIT_OBJECT(object)
+ zval *object = getThis();
char resolved_path[MAXPATHLEN];
zend_error_handling zeh;
@@ -287,30 +259,28 @@ PHP_FUNCTION(finfo_open)
}
if (object) {
+ finfo_object *obj;
zend_restore_error_handling(&zeh);
- FILEINFO_REGISTER_OBJECT(object, finfo);
+ obj = Z_FINFO_P(object);
+ obj->ptr = finfo;
} else {
- RETURN_RES(zend_register_resource(finfo, le_fileinfo));
+ zend_object *zobj = finfo_objects_new(finfo_class_entry);
+ finfo_object *obj = php_finfo_fetch_object(zobj);
+ obj->ptr = finfo;
+ RETURN_OBJ(zobj);
}
}
/* }}} */
-/* {{{ Close fileinfo resource. */
+/* {{{ Close fileinfo object - a NOP. */
PHP_FUNCTION(finfo_close)
{
- php_fileinfo *finfo;
- zval *zfinfo;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zfinfo) == FAILURE) {
- RETURN_THROWS();
- }
+ zval *self;
- if ((finfo = (php_fileinfo *)zend_fetch_resource(Z_RES_P(zfinfo), "file_info", le_fileinfo)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &self, finfo_class_entry) == FAILURE) {
RETURN_THROWS();
}
- zend_list_close(Z_RES_P(zfinfo));
-
RETURN_TRUE;
}
/* }}} */
@@ -320,22 +290,12 @@ PHP_FUNCTION(finfo_set_flags)
{
zend_long options;
php_fileinfo *finfo;
- zval *zfinfo;
- FILEINFO_DECLARE_INIT_OBJECT(object)
+ zval *self;
- if (object) {
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &options) == FAILURE) {
- RETURN_THROWS();
- }
- FILEINFO_FROM_OBJECT(finfo, object);
- } else {
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &zfinfo, &options) == FAILURE) {
- RETURN_THROWS();
- }
- if ((finfo = (php_fileinfo *)zend_fetch_resource(Z_RES_P(zfinfo), "file_info", le_fileinfo)) == NULL) {
- RETURN_THROWS();
- }
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ol", &self, finfo_class_entry, &options) == FAILURE) {
+ RETURN_THROWS();
}
+ FILEINFO_FROM_OBJECT(finfo, self);
FINFO_SET_OPTION(finfo->magic, options)
finfo->options = options;
@@ -354,12 +314,10 @@ static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mime
char *ret_val = NULL, *buffer = NULL;
size_t buffer_len;
php_fileinfo *finfo = NULL;
- zval *zfinfo, *zcontext = NULL;
+ zval *zcontext = NULL;
zval *what;
char mime_directory[] = "directory";
-
struct magic_set *magic = NULL;
- FILEINFO_DECLARE_INIT_OBJECT(object)
if (mimetype_emu) {
@@ -389,19 +347,12 @@ static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mime
php_error_docref(NULL, E_WARNING, "Failed to load magic database");
goto common;
}
- } else if (object) {
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lr!", &buffer, &buffer_len, &options, &zcontext) == FAILURE) {
- RETURN_THROWS();
- }
- FILEINFO_FROM_OBJECT(finfo, object);
- magic = finfo->magic;
} else {
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|lr!", &zfinfo, &buffer, &buffer_len, &options, &zcontext) == FAILURE) {
- RETURN_THROWS();
- }
- if ((finfo = (php_fileinfo *)zend_fetch_resource(Z_RES_P(zfinfo), "file_info", le_fileinfo)) == NULL) {
+ zval *self;
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os|lr!", &self, finfo_class_entry, &buffer, &buffer_len, &options, &zcontext) == FAILURE) {
RETURN_THROWS();
}
+ FILEINFO_FROM_OBJECT(finfo, self);
magic = finfo->magic;
}
diff --git a/ext/fileinfo/fileinfo.stub.php b/ext/fileinfo/fileinfo.stub.php
index 4ed4e445f1..5a9d346c7c 100644
--- a/ext/fileinfo/fileinfo.stub.php
+++ b/ext/fileinfo/fileinfo.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class finfo
{
@@ -28,30 +28,21 @@ class finfo
public function set_flags(int $flags) {}
}
-/** @return resource|false */
-function finfo_open(int $flags = FILEINFO_NONE, ?string $magic_database = null) {}
+function finfo_open(int $flags = FILEINFO_NONE, ?string $magic_database = null): finfo|false {}
-/**
- * @param resource $finfo
- */
-function finfo_close($finfo): bool {}
+function finfo_close(finfo $finfo): bool {}
-/**
- * @param resource $finfo
- */
-function finfo_set_flags($finfo, int $flags): bool {}
+function finfo_set_flags(finfo $finfo, int $flags): bool {}
/**
- * @param resource $finfo
* @param resource|null $context
*/
-function finfo_file($finfo, string $filename, int $flags = FILEINFO_NONE, $context = null): string|false {}
+function finfo_file(finfo $finfo, string $filename, int $flags = FILEINFO_NONE, $context = null): string|false {}
/**
- * @param resource $finfo
* @param resource|null $context
*/
-function finfo_buffer($finfo, string $string, int $flags = FILEINFO_NONE, $context = null): string|false {}
+function finfo_buffer(finfo $finfo, string $string, int $flags = FILEINFO_NONE, $context = null): string|false {}
/**
* @param resource|string $filename
diff --git a/ext/fileinfo/fileinfo_arginfo.h b/ext/fileinfo/fileinfo_arginfo.h
index 34b3698842..45025b1027 100644
--- a/ext/fileinfo/fileinfo_arginfo.h
+++ b/ext/fileinfo/fileinfo_arginfo.h
@@ -1,29 +1,29 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 648085986695281bd5a8fb536d5ec6c2a9f8c6e8 */
+ * Stub hash: 2cd166d444d7324a9fe70170db434c05ccfbf386 */
-ZEND_BEGIN_ARG_INFO_EX(arginfo_finfo_open, 0, 0, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_finfo_open, 0, 0, finfo, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "FILEINFO_NONE")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, magic_database, IS_STRING, 1, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_finfo_close, 0, 1, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, finfo)
+ ZEND_ARG_OBJ_INFO(0, finfo, finfo, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_finfo_set_flags, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, finfo)
+ ZEND_ARG_OBJ_INFO(0, finfo, finfo, 0)
ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_finfo_file, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, finfo)
+ ZEND_ARG_OBJ_INFO(0, finfo, finfo, 0)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "FILEINFO_NONE")
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_finfo_buffer, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, finfo)
+ ZEND_ARG_OBJ_INFO(0, finfo, finfo, 0)
ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "FILEINFO_NONE")
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null")
@@ -33,7 +33,10 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mime_content_type, 0, 1, MAY_BE_
ZEND_ARG_INFO(0, filename)
ZEND_END_ARG_INFO()
-#define arginfo_class_finfo___construct arginfo_finfo_open
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_finfo___construct, 0, 0, 0)
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "FILEINFO_NONE")
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, magic_database, IS_STRING, 1, "null")
+ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_finfo_file, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@@ -78,3 +81,13 @@ static const zend_function_entry class_finfo_methods[] = {
ZEND_ME_MAPPING(set_flags, finfo_set_flags, arginfo_class_finfo_set_flags, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_finfo(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "finfo", class_finfo_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/fileinfo/tests/bug61964-mb.phpt b/ext/fileinfo/tests/bug61964-mb.phpt
index 1142ad7eed..c4a6976f2e 100644
--- a/ext/fileinfo/tests/bug61964-mb.phpt
+++ b/ext/fileinfo/tests/bug61964-mb.phpt
@@ -45,8 +45,10 @@ rmdir($dir);
?>
--EXPECTF--
bool(false)%A
-resource(%d) of type (file_info)
-resource(%d) of type (file_info)
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
+}
bool(false)%A
Warning: finfo_open(): offset `string' invalid in %sbug61964-mb.php on line %d
diff --git a/ext/fileinfo/tests/bug61964.phpt b/ext/fileinfo/tests/bug61964.phpt
index ecb12fe752..7bd97a019c 100644
--- a/ext/fileinfo/tests/bug61964.phpt
+++ b/ext/fileinfo/tests/bug61964.phpt
@@ -45,8 +45,10 @@ rmdir($dir);
?>
--EXPECTF--
bool(false)%A
-resource(%d) of type (file_info)
-resource(%d) of type (file_info)
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
+}
bool(false)%A
Warning: finfo_open(): offset `string' invalid in %sbug61964.php on line %d
diff --git a/ext/fileinfo/tests/finfo_close_basic.phpt b/ext/fileinfo/tests/finfo_close_basic.phpt
index 1ff05dff21..f4fe98de62 100644
--- a/ext/fileinfo/tests/finfo_close_basic.phpt
+++ b/ext/fileinfo/tests/finfo_close_basic.phpt
@@ -21,7 +21,8 @@ unset( $finfo );
?>
--EXPECTF--
*** Testing finfo_close() : basic functionality ***
-resource(%d) of type (file_info)
+object(finfo)#%d (0) {
+}
bool(true)
object(finfo)#%d (%d) {
}
diff --git a/ext/fileinfo/tests/finfo_close_error.phpt b/ext/fileinfo/tests/finfo_close_error.phpt
index b42510f130..a32baf8450 100644
--- a/ext/fileinfo/tests/finfo_close_error.phpt
+++ b/ext/fileinfo/tests/finfo_close_error.phpt
@@ -19,4 +19,4 @@ try {
*** Testing finfo_close() : error conditions ***
-- Testing finfo_close() function with wrong resource type --
-finfo_close(): supplied resource is not a valid file_info resource
+finfo_close(): Argument #1 ($finfo) must be of type finfo, resource given
diff --git a/ext/fileinfo/tests/finfo_file_001.phpt b/ext/fileinfo/tests/finfo_file_001.phpt
index 71d88bbd43..fb11aa8921 100644
--- a/ext/fileinfo/tests/finfo_file_001.phpt
+++ b/ext/fileinfo/tests/finfo_file_001.phpt
@@ -16,11 +16,6 @@ try {
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
-try {
- var_dump(finfo_file($fp, NULL));
-} catch (\ValueError $e) {
- echo $e->getMessage() . \PHP_EOL;
-}
var_dump(finfo_file($fp, '.'));
var_dump(finfo_file($fp, '&'));
@@ -28,7 +23,6 @@ var_dump(finfo_file($fp, '&'));
--EXPECTF--
finfo_file(): Argument #1 ($finfo) must not contain any null bytes
finfo_file(): Argument #1 ($finfo) cannot be empty
-finfo_file(): Argument #1 ($finfo) cannot be empty
string(9) "directory"
Warning: finfo_file(&): Failed to open stream: No such file or directory in %s on line %d
diff --git a/ext/fileinfo/tests/finfo_open_001.phpt b/ext/fileinfo/tests/finfo_open_001.phpt
index ef36bc21f0..c7c73c1b5c 100644
--- a/ext/fileinfo/tests/finfo_open_001.phpt
+++ b/ext/fileinfo/tests/finfo_open_001.phpt
@@ -20,8 +20,10 @@ var_dump(finfo_open(FILEINFO_MIME, '/foo/bar/inexistent'));
?>
--EXPECTF--
finfo_open(): Argument #2 ($magic_database) must not contain any null bytes
-resource(%d) of type (file_info)
-resource(%d) of type (file_info)
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
+}
Warning: finfo_open(%s123): Failed to open stream: No such file or directory in %s on line %d
diff --git a/ext/fileinfo/tests/finfo_open_basic.phpt b/ext/fileinfo/tests/finfo_open_basic.phpt
index bd1b03c5a3..bf0a597d74 100644
--- a/ext/fileinfo/tests/finfo_open_basic.phpt
+++ b/ext/fileinfo/tests/finfo_open_basic.phpt
@@ -25,14 +25,21 @@ var_dump( new finfo() );
?>
--EXPECTF--
*** Testing finfo_open() : basic functionality ***
-resource(%d) of type (file_info)
-resource(%d) of type (file_info)
-resource(%d) of type (file_info)
-resource(%d) of type (file_info)
-resource(%d) of type (file_info)
-resource(%d) of type (file_info)
-resource(%d) of type (file_info)
-object(finfo)#%d (%d) {
-}
-object(finfo)#%d (%d) {
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
}
diff --git a/ext/fileinfo/tests/finfo_open_error.phpt b/ext/fileinfo/tests/finfo_open_error.phpt
index 881c26f664..0d697ec818 100644
--- a/ext/fileinfo/tests/finfo_open_error.phpt
+++ b/ext/fileinfo/tests/finfo_open_error.phpt
@@ -1,7 +1,7 @@
--TEST--
Test finfo_open() function : error functionality
--SKIPIF--
-<?php require_once(__DIR__ . '/skipif.inc');
+<?php require_once(__DIR__ . '/skipif.inc')?>
--FILE--
<?php
$magicFile = __DIR__ . DIRECTORY_SEPARATOR . 'magic';
@@ -35,6 +35,7 @@ Warning: finfo_open(): Failed to load magic database at "%sfoobarfile" in %sfinf
bool(false)
Warning: finfo_open(): using regular magic file `%smagic' in %sfinfo_open_error.php on line %d
-resource(6) of type (file_info)
+object(finfo)#%d (0) {
+}
finfo_open(): Argument #1 ($flags) must be of type int, string given
finfo::__construct(): Argument #1 ($flags) must be of type int, string given
diff --git a/ext/fileinfo/tests/finfo_open_variation1.phpt b/ext/fileinfo/tests/finfo_open_variation1.phpt
index 93a3b108a6..035902fcef 100644
--- a/ext/fileinfo/tests/finfo_open_variation1.phpt
+++ b/ext/fileinfo/tests/finfo_open_variation1.phpt
@@ -16,5 +16,7 @@ var_dump( finfo_open( FILEINFO_DEVICES | FILEINFO_RAW, $magicFile ) );
?>
--EXPECTF--
*** Testing finfo_open() : variations in opening ***
-resource(%d) of type (file_info)
-resource(%d) of type (file_info)
+object(finfo)#%d (0) {
+}
+object(finfo)#%d (0) {
+}
diff --git a/ext/filter/filter.c b/ext/filter/filter.c
index 4aa9368213..43c6938aea 100644
--- a/ext/filter/filter.c
+++ b/ext/filter/filter.c
@@ -308,7 +308,7 @@ static unsigned int php_sapi_filter_init(void)
return SUCCESS;
}
-static void php_zval_filter(zval *value, zend_long filter, zend_long flags, zval *options, char* charset, zend_bool copy) /* {{{ */
+static void php_zval_filter(zval *value, zend_long filter, zend_long flags, zval *options, char* charset, bool copy) /* {{{ */
{
filter_list_entry filter_func;
@@ -433,7 +433,7 @@ static unsigned int php_sapi_filter(int arg, const char *var, char **val, size_t
}
/* }}} */
-static void php_zval_filter_recursive(zval *value, zend_long filter, zend_long flags, zval *options, char *charset, zend_bool copy) /* {{{ */
+static void php_zval_filter_recursive(zval *value, zend_long filter, zend_long flags, zval *options, char *charset, bool copy) /* {{{ */
{
if (Z_TYPE_P(value) == IS_ARRAY) {
zval *element;
@@ -602,7 +602,7 @@ static void php_filter_call(
/* }}} */
static void php_filter_array_handler(zval *input, HashTable *op_ht, zend_long op_long,
- zval *return_value, zend_bool add_empty
+ zval *return_value, bool add_empty
) /* {{{ */ {
zend_string *arg_key;
zval *tmp, *arg_elm;
@@ -737,7 +737,7 @@ PHP_FUNCTION(filter_input_array)
{
zend_long fetch_from;
zval *array_input = NULL;
- zend_bool add_empty = 1;
+ bool add_empty = 1;
HashTable *op_ht = NULL;
zend_long op_long = FILTER_DEFAULT;
@@ -787,7 +787,7 @@ PHP_FUNCTION(filter_input_array)
PHP_FUNCTION(filter_var_array)
{
zval *array_input = NULL;
- zend_bool add_empty = 1;
+ bool add_empty = 1;
HashTable *op_ht = NULL;
zend_long op_long = FILTER_DEFAULT;
diff --git a/ext/filter/filter.stub.php b/ext/filter/filter.stub.php
index de92b93519..3dd00911a2 100644
--- a/ext/filter/filter.stub.php
+++ b/ext/filter/filter.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function filter_has_var(int $input_type, string $var_name): bool {}
diff --git a/ext/filter/filter_arginfo.h b/ext/filter/filter_arginfo.h
index c4e4479e79..bdcfcf1f87 100644
--- a/ext/filter/filter_arginfo.h
+++ b/ext/filter/filter_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: b5f2e4a79eb6f30fe143b3086845435d0a0a6ef0 */
+ * Stub hash: 6285ac516fc8972995db91f1c8bf0c171c8fe594 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_filter_has_var, 0, 2, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, input_type, IS_LONG, 0)
diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c
index 4a66d685e9..93367fc414 100644
--- a/ext/filter/logical_filters.c
+++ b/ext/filter/logical_filters.c
@@ -240,6 +240,13 @@ void php_filter_int(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
error = 1;
}
} else if (allow_octal) {
+ /* Support explicit octal prefix notation */
+ if (*p == 'o' || *p == 'O') {
+ p++; len--;
+ if (len == 0) {
+ RETURN_VALIDATION_FAILED
+ }
+ }
if (php_filter_parse_octal(p, len, &ctx_value) < 0) {
error = 1;
}
@@ -620,7 +627,7 @@ void php_filter_validate_url(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
if (
url->scheme == NULL ||
/* some schemas allow the host to be empty */
- (url->host == NULL && (strcmp(ZSTR_VAL(url->scheme), "mailto") && strcmp(ZSTR_VAL(url->scheme), "news") && strcmp(ZSTR_VAL(url->scheme), "file"))) ||
+ (url->host == NULL && (!zend_string_equals_literal(url->scheme, "mailto") && !zend_string_equals_literal(url->scheme, "news") && !zend_string_equals_literal(url->scheme, "file"))) ||
((flags & FILTER_FLAG_PATH_REQUIRED) && url->path == NULL) || ((flags & FILTER_FLAG_QUERY_REQUIRED) && url->query == NULL)
) {
bad_url:
@@ -895,12 +902,12 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
case 1: case 0:
break;
case 2:
- if (!strcmp("::", Z_STRVAL_P(value))) {
+ if (zend_string_equals_literal(Z_STR_P(value), "::")) {
RETURN_VALIDATION_FAILED
}
break;
case 3:
- if (!strcmp("::1", Z_STRVAL_P(value)) || !strcmp("5f:", Z_STRVAL_P(value))) {
+ if (zend_string_equals_literal(Z_STR_P(value), "::1") || zend_string_equals_literal(Z_STR_P(value), "5f:")) {
RETURN_VALIDATION_FAILED
}
break;
diff --git a/ext/filter/tests/013.phpt b/ext/filter/tests/013.phpt
index c9dd915d83..3f663ac762 100644
--- a/ext/filter/tests/013.phpt
+++ b/ext/filter/tests/013.phpt
@@ -38,6 +38,11 @@ var_dump(filter_var(345, FILTER_VALIDATE_INT, array("options" => array("min_rang
var_dump(filter_var("0ff", FILTER_VALIDATE_INT));
var_dump(filter_var("010", FILTER_VALIDATE_INT));
+// Explicit octal prefix
+var_dump(filter_var("0o16", FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_OCTAL)));
+var_dump(filter_var("0O16", FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_OCTAL)));
+var_dump(filter_var("0o016", FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_OCTAL)));
+
echo "Done\n";
?>
--EXPECT--
@@ -71,4 +76,7 @@ bool(false)
bool(false)
bool(false)
bool(false)
+int(14)
+int(14)
+int(14)
Done
diff --git a/ext/filter/tests/055.phpt b/ext/filter/tests/055.phpt
index 0edc241efd..32ede68034 100644
--- a/ext/filter/tests/055.phpt
+++ b/ext/filter/tests/055.phpt
@@ -5,18 +5,18 @@ filter_var() and FILTER_VALIDATE_MAC
--FILE--
<?php
$values = Array(
- array("01-23-45-67-89-ab", null),
+ array("01-23-45-67-89-ab", 0),
array("01-23-45-67-89-ab", array("options" => array("separator" => "-"))),
array("01-23-45-67-89-ab", array("options" => array("separator" => "."))),
array("01-23-45-67-89-ab", array("options" => array("separator" => ":"))),
- array("01-23-45-67-89-AB", null),
- array("01-23-45-67-89-aB", null),
- array("01:23:45:67:89:ab", null),
- array("01:23:45:67:89:AB", null),
- array("01:23:45:67:89:aB", null),
- array("01:23:45-67:89:aB", null),
- array("xx:23:45:67:89:aB", null),
- array("0123.4567.89ab", null),
+ array("01-23-45-67-89-AB", 0),
+ array("01-23-45-67-89-aB", 0),
+ array("01:23:45:67:89:ab", 0),
+ array("01:23:45:67:89:AB", 0),
+ array("01:23:45:67:89:aB", 0),
+ array("01:23:45-67:89:aB", 0),
+ array("xx:23:45:67:89:aB", 0),
+ array("0123.4567.89ab", 0),
array("01-23-45-67-89-ab", array("options" => array("separator" => "--"))),
array("01-23-45-67-89-ab", array("options" => array("separator" => ""))),
);
diff --git a/ext/filter/tests/057.phpt b/ext/filter/tests/057.phpt
index 7c57a2670b..7ad83e81b0 100644
--- a/ext/filter/tests/057.phpt
+++ b/ext/filter/tests/057.phpt
@@ -19,9 +19,13 @@ foreach (array(null, true, false, 1, "", new stdClass) as $invalid) {
}
?>
--EXPECTF--
+Deprecated: filter_input_array(): Passing null to parameter #2 ($options) of type array|int is deprecated in %s on line %d
+
Warning: filter_input_array(): Unknown filter with ID 0 in %s on line %d
bool(false)
+Deprecated: filter_var_array(): Passing null to parameter #2 ($options) of type array|int is deprecated in %s on line %d
+
Warning: filter_var_array(): Unknown filter with ID 0 in %s on line %d
bool(false)
diff --git a/ext/filter/tests/bug77423.phpt b/ext/filter/tests/bug77423.phpt
index 761c7c359a..bf63b7595c 100644
--- a/ext/filter/tests/bug77423.phpt
+++ b/ext/filter/tests/bug77423.phpt
@@ -1,5 +1,7 @@
--TEST--
Bug #77423 (parse_url() will deliver a wrong host to user)
+--SKIPIF--
+<?php if (!function_exists('filter_var')) { echo "skip requires filter\n"; } ?>
--FILE--
<?php
$urls = array(
diff --git a/ext/filter/tests/surprising_integer_literals.phpt b/ext/filter/tests/surprising_integer_literals.phpt
new file mode 100644
index 0000000000..abb7b9caea
--- /dev/null
+++ b/ext/filter/tests/surprising_integer_literals.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Surprising result with integer literals (hex/octal)
+--SKIPIF--
+<?php if (!extension_loaded("filter")) die("skip"); ?>
+--FILE--
+<?php
+echo 'Hex', \PHP_EOL;
+var_dump(filter_var('0x', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX));
+var_dump(filter_var('0xg', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX));
+var_dump(filter_var('0X', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX));
+var_dump(filter_var('0Xg', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX));
+var_dump(filter_var('', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX));
+echo 'Octal', \PHP_EOL;
+var_dump(filter_var('0o', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL));
+var_dump(filter_var('0og', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL));
+var_dump(filter_var('0O', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL));
+var_dump(filter_var('0Og', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL));
+var_dump(filter_var('O', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL));
+var_dump(filter_var('Og', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL));
+var_dump(filter_var('', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL));
+?>
+--EXPECT--
+Hex
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+Octal
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c
index 7ce3386c57..a10ef3a72a 100644
--- a/ext/ftp/ftp.c
+++ b/ext/ftp/ftp.c
@@ -232,7 +232,7 @@ ftp_login(ftpbuf_t *ftp, const char *user, const size_t user_len, const char *pa
SSL_CTX *ctx = NULL;
long ssl_ctx_options = SSL_OP_ALL;
int err, res;
- zend_bool retry;
+ bool retry;
#endif
if (ftp == NULL) {
return 0;
@@ -1361,7 +1361,7 @@ ftp_getresp(ftpbuf_t *ftp)
int single_send(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t size) {
#ifdef HAVE_FTP_SSL
int err;
- zend_bool retry = 0;
+ bool retry = 0;
SSL *handle = NULL;
php_socket_t fd;
size_t sent;
@@ -1460,7 +1460,7 @@ my_recv(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len)
int n, nr_bytes;
#ifdef HAVE_FTP_SSL
int err;
- zend_bool retry = 0;
+ bool retry = 0;
SSL *handle = NULL;
php_socket_t fd;
#endif
@@ -1745,7 +1745,7 @@ data_accept(databuf_t *data, ftpbuf_t *ftp)
SSL_CTX *ctx;
SSL_SESSION *session;
int err, res;
- zend_bool retry;
+ bool retry;
#endif
if (data->fd != -1) {
diff --git a/ext/ftp/ftp.stub.php b/ext/ftp/ftp.stub.php
index f4812655a4..2aaa5140f3 100644
--- a/ext/ftp/ftp.stub.php
+++ b/ext/ftp/ftp.stub.php
@@ -1,134 +1,63 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
-/** @return resource|false */
-function ftp_connect(string $hostname, int $port = 21, int $timeout = 90) {}
+/** @strict-properties */
+final class FTPConnection
+{
+}
+
+function ftp_connect(string $hostname, int $port = 21, int $timeout = 90): FTPConnection|false {}
#ifdef HAVE_FTP_SSL
-/** @return resource|false */
-function ftp_ssl_connect(string $hostname, int $port = 21, int $timeout = 90) {}
+function ftp_ssl_connect(string $hostname, int $port = 21, int $timeout = 90): FTPConnection|false {}
#endif
-/** @param resource $ftp */
-function ftp_login($ftp, string $username, string $password): bool {}
-
-/** @param resource $ftp */
-function ftp_pwd($ftp): string|false {}
-
-/** @param resource $ftp */
-function ftp_cdup($ftp): bool {}
-
-/** @param resource $ftp */
-function ftp_chdir($ftp, string $directory): bool {}
-
-/** @param resource $ftp */
-function ftp_exec($ftp, string $command): bool {}
-
-/** @param resource $ftp */
-function ftp_raw($ftp, string $command): array {}
-
-/** @param resource $ftp */
-function ftp_mkdir($ftp, string $directory): string|false {}
-
-/** @param resource $ftp */
-function ftp_rmdir($ftp, string $directory): bool {}
-
-/** @param resource $ftp */
-function ftp_chmod($ftp, int $permissions, string $filename): int|false {}
-
-/**
- * @param resource $ftp
- * @param string $response
- */
-function ftp_alloc($ftp, int $size, &$response = null): bool {}
-
-/** @param resource $ftp */
-function ftp_nlist($ftp, string $directory): array|false {}
-
-/** @param resource $ftp */
-function ftp_rawlist($ftp, string $directory, bool $recursive = false): array|false {}
-
-/** @param resource $ftp */
-function ftp_mlsd($ftp, string $directory): array|false {}
-
-/** @param resource $ftp */
-function ftp_systype($ftp): string|false {}
-
-/**
- * @param resource $ftp
- * @param resource $stream
- */
-function ftp_fget($ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
-
-/**
- * @param resource $ftp
- * @param resource $stream
- */
-function ftp_nb_fget($ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): int {}
-
-/** @param resource $ftp */
-function ftp_pasv($ftp, bool $enable): bool {}
-
-/** @param resource $ftp */
-function ftp_get($ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
-
-/** @param resource $ftp */
-function ftp_nb_get($ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): int {}
-
-/** @param resource $ftp */
-function ftp_nb_continue($ftp): int {}
-
-/**
- * @param resource $ftp
- * @param resource $stream
- */
-function ftp_fput($ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): bool {}
-
-/**
- * @param resource $ftp
- * @param resource $stream
- */
-function ftp_nb_fput($ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): int {}
-
-/** @param resource $ftp */
-function ftp_put($ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
-
-/** @param resource $ftp */
-function ftp_append($ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY): bool {}
-
-/** @param resource $ftp */
-function ftp_nb_put($ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): int|false {}
-
-/** @param resource $ftp */
-function ftp_size($ftp, string $filename): int {}
-
-/** @param resource $ftp */
-function ftp_mdtm($ftp, string $filename): int {}
-
-/** @param resource $ftp */
-function ftp_rename($ftp, string $from, string $to): bool {}
-
-/** @param resource $ftp */
-function ftp_delete($ftp, string $filename): bool {}
-
-/** @param resource $ftp */
-function ftp_site($ftp, string $command): bool {}
-
-/** @param resource $ftp */
-function ftp_close($ftp): bool {}
-
-/**
- * @param resource $ftp
- * @alias ftp_close
- */
-function ftp_quit($ftp): bool {}
-
-/**
- * @param resource $ftp
- * @param int|bool $value
- */
-function ftp_set_option($ftp, int $option, $value): bool {}
-
-/** @param resource $ftp */
-function ftp_get_option($ftp, int $option): int|bool {}
+function ftp_login(FTPConnection $ftp, string $username, string $password): bool {}
+function ftp_pwd(FTPConnection $ftp): string|false {}
+function ftp_cdup(FTPConnection $ftp): bool {}
+function ftp_chdir(FTPConnection $ftp, string $directory): bool {}
+function ftp_exec(FTPConnection $ftp, string $command): bool {}
+function ftp_raw(FTPConnection $ftp, string $command): array {}
+function ftp_mkdir(FTPConnection $ftp, string $directory): string|false {}
+function ftp_rmdir(FTPConnection $ftp, string $directory): bool {}
+function ftp_chmod(FTPConnection $ftp, int $permissions, string $filename): int|false {}
+
+/** @param string $response */
+function ftp_alloc(FTPConnection $ftp, int $size, &$response = null): bool {}
+function ftp_nlist(FTPConnection $ftp, string $directory): array|false {}
+function ftp_rawlist(FTPConnection $ftp, string $directory, bool $recursive = false): array|false {}
+function ftp_mlsd(FTPConnection $ftp, string $directory): array|false {}
+function ftp_systype(FTPConnection $ftp): string|false {}
+
+/** @param resource $stream */
+function ftp_fget(FTPConnection $ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
+
+/** @param resource $stream */
+function ftp_nb_fget(FTPConnection $ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): int {}
+function ftp_pasv(FTPConnection $ftp, bool $enable): bool {}
+function ftp_get(FTPConnection $ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
+function ftp_nb_get(FTPConnection $ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): int {}
+function ftp_nb_continue(FTPConnection $ftp): int {}
+
+/** @param resource $stream */
+function ftp_fput(FTPConnection $ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): bool {}
+
+/** @param resource $stream */
+function ftp_nb_fput(FTPConnection $ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): int {}
+function ftp_put(FTPConnection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
+function ftp_append(FTPConnection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY): bool {}
+function ftp_nb_put(FTPConnection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): int|false {}
+function ftp_size(FTPConnection $ftp, string $filename): int {}
+function ftp_mdtm(FTPConnection $ftp, string $filename): int {}
+function ftp_rename(FTPConnection $ftp, string $from, string $to): bool {}
+function ftp_delete(FTPConnection $ftp, string $filename): bool {}
+function ftp_site(FTPConnection $ftp, string $command): bool {}
+function ftp_close(FTPConnection $ftp): bool {}
+
+/** @alias ftp_close */
+function ftp_quit(FTPConnection $ftp): bool {}
+
+/** @param int|bool $value */
+function ftp_set_option(FTPConnection $ftp, int $option, $value): bool {}
+function ftp_get_option(FTPConnection $ftp, int $option): int|bool {}
diff --git a/ext/ftp/ftp_arginfo.h b/ext/ftp/ftp_arginfo.h
index e1a9d770bc..7553304b62 100644
--- a/ext/ftp/ftp_arginfo.h
+++ b/ext/ftp/ftp_arginfo.h
@@ -1,14 +1,14 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 4957601533b387d70ebb15811821fc06507cdbc2 */
+ * Stub hash: db52e4b33562b93173c41d00f20e313553b173b4 */
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_connect, 0, 0, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ftp_connect, 0, 1, FTPConnection, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, port, IS_LONG, 0, "21")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_LONG, 0, "90")
ZEND_END_ARG_INFO()
#if defined(HAVE_FTP_SSL)
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_ssl_connect, 0, 0, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ftp_ssl_connect, 0, 1, FTPConnection, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, port, IS_LONG, 0, "21")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_LONG, 0, "90")
@@ -16,60 +16,60 @@ ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_login, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, username, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, password, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_pwd, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_cdup, 0, 1, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_chdir, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_exec, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, command, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_raw, 0, 2, IS_ARRAY, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, command, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_mkdir, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
ZEND_END_ARG_INFO()
#define arginfo_ftp_rmdir arginfo_ftp_chdir
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_chmod, 0, 3, MAY_BE_LONG|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, permissions, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_alloc, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, response, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_nlist, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_rawlist, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, recursive, _IS_BOOL, 0, "false")
ZEND_END_ARG_INFO()
@@ -79,7 +79,7 @@ ZEND_END_ARG_INFO()
#define arginfo_ftp_systype arginfo_ftp_pwd
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_fget, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_INFO(0, stream)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -87,7 +87,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_fget, 0, 3, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_fget, 0, 3, IS_LONG, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_INFO(0, stream)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -95,12 +95,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_fget, 0, 3, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_pasv, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, enable, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_get, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, local_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -108,7 +108,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_get, 0, 3, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_get, 0, 3, IS_LONG, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, local_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -116,11 +116,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_get, 0, 3, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_continue, 0, 1, IS_LONG, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_fput, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_INFO(0, stream)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -128,7 +128,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_fput, 0, 3, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_fput, 0, 3, IS_LONG, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_INFO(0, stream)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -136,7 +136,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_fput, 0, 3, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_put, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, local_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -144,14 +144,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_put, 0, 3, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_append, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, local_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_nb_put, 0, 3, MAY_BE_LONG|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, local_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -159,20 +159,20 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_nb_put, 0, 3, MAY_BE_LONG|MA
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_size, 0, 2, IS_LONG, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_END_ARG_INFO()
#define arginfo_ftp_mdtm arginfo_ftp_size
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_rename, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, from, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, to, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_delete, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -183,13 +183,13 @@ ZEND_END_ARG_INFO()
#define arginfo_ftp_quit arginfo_ftp_cdup
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_set_option, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0)
ZEND_ARG_INFO(0, value)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_get_option, 0, 2, MAY_BE_LONG|MAY_BE_BOOL)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0)
ZEND_END_ARG_INFO()
@@ -274,3 +274,19 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(ftp_get_option, arginfo_ftp_get_option)
ZEND_FE_END
};
+
+
+static const zend_function_entry class_FTPConnection_methods[] = {
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class_FTPConnection(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "FTPConnection", class_FTPConnection_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c
index a6dca8c874..52d88fcf96 100644
--- a/ext/ftp/php_ftp.c
+++ b/ext/ftp/php_ftp.c
@@ -29,13 +29,15 @@
#include "ext/standard/info.h"
#include "ext/standard/file.h"
+#include "Zend/zend_exceptions.h"
+#include "Zend/zend_interfaces.h"
#include "php_ftp.h"
#include "ftp.h"
#include "ftp_arginfo.h"
-static int le_ftpbuf;
-#define le_ftpbuf_name "FTP Buffer"
+static zend_class_entry *php_ftp_ce = NULL;
+static zend_object_handlers ftp_object_handlers;
zend_module_entry php_ftp_module_entry = {
STANDARD_MODULE_HEADER_EX,
@@ -56,11 +58,41 @@ zend_module_entry php_ftp_module_entry = {
ZEND_GET_MODULE(php_ftp)
#endif
-static void ftp_destructor_ftpbuf(zend_resource *rsrc)
-{
- ftpbuf_t *ftp = (ftpbuf_t *)rsrc->ptr;
+typedef struct _php_ftp_object {
+ ftpbuf_t *ftp;
+ zend_object std;
+} php_ftp_object;
+
+static inline zend_object *ftp_object_to_zend_object(php_ftp_object *obj) {
+ return ((zend_object*)(obj + 1)) - 1;
+}
+
+static inline php_ftp_object *ftp_object_from_zend_object(zend_object *zobj) {
+ return ((php_ftp_object*)(zobj + 1)) - 1;
+}
+
+static zend_object* ftp_object_create(zend_class_entry* ce) {
+ php_ftp_object *obj = zend_object_alloc(sizeof(php_ftp_object), ce);
+ zend_object *zobj = ftp_object_to_zend_object(obj);
+ obj->ftp = NULL;
+ zend_object_std_init(zobj, ce);
+ object_properties_init(zobj, ce);
+ zobj->handlers = &ftp_object_handlers;
+
+ return zobj;
+}
- ftp_close(ftp);
+static zend_function *ftp_object_get_constructor(zend_object *zobj) {
+ zend_throw_error(NULL, "Cannot directly construct FTPConnection, use ftp_connect() or ftp_ssl_connect() instead");
+ return NULL;
+}
+
+static void ftp_object_destroy(zend_object *zobj) {
+ php_ftp_object *obj = ftp_object_from_zend_object(zobj);
+
+ if (obj->ftp) {
+ ftp_close(obj->ftp);
+ }
}
PHP_MINIT_FUNCTION(ftp)
@@ -76,7 +108,17 @@ PHP_MINIT_FUNCTION(ftp)
#endif
#endif
- le_ftpbuf = zend_register_list_destructors_ex(ftp_destructor_ftpbuf, NULL, le_ftpbuf_name, module_number);
+ php_ftp_ce = register_class_FTPConnection();
+ php_ftp_ce->create_object = ftp_object_create;
+ php_ftp_ce->serialize = zend_class_serialize_deny;
+ php_ftp_ce->unserialize = zend_class_unserialize_deny;
+
+ memcpy(&ftp_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ ftp_object_handlers.offset = XtOffsetOf(php_ftp_object, std);
+ ftp_object_handlers.get_constructor = ftp_object_get_constructor;
+ ftp_object_handlers.dtor_obj = ftp_object_destroy;
+ ftp_object_handlers.clone_obj = NULL;
+
REGISTER_LONG_CONSTANT("FTP_ASCII", FTPTYPE_ASCII, CONST_PERSISTENT | CONST_CS);
REGISTER_LONG_CONSTANT("FTP_TEXT", FTPTYPE_ASCII, CONST_PERSISTENT | CONST_CS);
REGISTER_LONG_CONSTANT("FTP_BINARY", FTPTYPE_IMAGE, CONST_PERSISTENT | CONST_CS);
@@ -143,7 +185,8 @@ PHP_FUNCTION(ftp_connect)
ftp->use_ssl = 0;
#endif
- RETURN_RES(zend_register_resource(ftp, le_ftpbuf));
+ object_init_ex(return_value, php_ftp_ce);
+ ftp_object_from_zend_object(Z_OBJ_P(return_value))->ftp = ftp;
}
/* }}} */
@@ -177,11 +220,19 @@ PHP_FUNCTION(ftp_ssl_connect)
/* enable ssl */
ftp->use_ssl = 1;
- RETURN_RES(zend_register_resource(ftp, le_ftpbuf));
+ object_init_ex(return_value, php_ftp_ce);
+ ftp_object_from_zend_object(Z_OBJ_P(return_value))->ftp = ftp;
}
/* }}} */
#endif
+#define GET_FTPBUF(ftpbuf, zftp) \
+ ftpbuf = ftp_object_from_zend_object(Z_OBJ_P(zftp))->ftp; \
+ if (!ftpbuf) { \
+ zend_throw_exception(zend_ce_value_error, "FTPConnection is already closed", 0); \
+ RETURN_THROWS(); \
+ }
+
/* {{{ Logs into the FTP server */
PHP_FUNCTION(ftp_login)
{
@@ -190,13 +241,10 @@ PHP_FUNCTION(ftp_login)
char *user, *pass;
size_t user_len, pass_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss", &z_ftp, &user, &user_len, &pass, &pass_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss", &z_ftp, php_ftp_ce, &user, &user_len, &pass, &pass_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* log in */
if (!ftp_login(ftp, user, user_len, pass, pass_len)) {
@@ -215,13 +263,10 @@ PHP_FUNCTION(ftp_pwd)
ftpbuf_t *ftp;
const char *pwd;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_ftp) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &z_ftp, php_ftp_ce) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (!(pwd = ftp_pwd(ftp))) {
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
@@ -238,13 +283,10 @@ PHP_FUNCTION(ftp_cdup)
zval *z_ftp;
ftpbuf_t *ftp;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_ftp) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &z_ftp, php_ftp_ce) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (!ftp_cdup(ftp)) {
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
@@ -263,13 +305,10 @@ PHP_FUNCTION(ftp_chdir)
char *dir;
size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &dir, &dir_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* change directories */
if (!ftp_chdir(ftp, dir, dir_len)) {
@@ -289,13 +328,10 @@ PHP_FUNCTION(ftp_exec)
char *cmd;
size_t cmd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &cmd, &cmd_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* execute serverside command */
if (!ftp_exec(ftp, cmd, cmd_len)) {
@@ -315,13 +351,10 @@ PHP_FUNCTION(ftp_raw)
char *cmd;
size_t cmd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &cmd, &cmd_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* execute arbitrary ftp command */
ftp_raw(ftp, cmd, cmd_len, return_value);
@@ -337,13 +370,10 @@ PHP_FUNCTION(ftp_mkdir)
zend_string *tmp;
size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &dir, &dir_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* create directory */
if (NULL == (tmp = ftp_mkdir(ftp, dir, dir_len))) {
@@ -363,13 +393,10 @@ PHP_FUNCTION(ftp_rmdir)
char *dir;
size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &dir, &dir_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* remove directorie */
if (!ftp_rmdir(ftp, dir, dir_len)) {
@@ -390,13 +417,10 @@ PHP_FUNCTION(ftp_chmod)
size_t filename_len;
zend_long mode;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlp", &z_ftp, &mode, &filename, &filename_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olp", &z_ftp, php_ftp_ce, &mode, &filename, &filename_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (!ftp_chmod(ftp, mode, filename, filename_len)) {
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
@@ -415,13 +439,10 @@ PHP_FUNCTION(ftp_alloc)
zend_long size, ret;
zend_string *response = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z", &z_ftp, &size, &zresponse) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol|z", &z_ftp, php_ftp_ce, &size, &zresponse) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
ret = ftp_alloc(ftp, size, zresponse ? &response : NULL);
@@ -445,13 +466,10 @@ PHP_FUNCTION(ftp_nlist)
char **nlist, **ptr, *dir;
size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp", &z_ftp, &dir, &dir_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Op", &z_ftp, php_ftp_ce, &dir, &dir_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* get list of files */
if (NULL == (nlist = ftp_nlist(ftp, dir, dir_len))) {
@@ -473,15 +491,12 @@ PHP_FUNCTION(ftp_rawlist)
ftpbuf_t *ftp;
char **llist, **ptr, *dir;
size_t dir_len;
- zend_bool recursive = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|b", &z_ftp, &dir, &dir_len, &recursive) == FAILURE) {
- RETURN_THROWS();
- }
+ bool recursive = 0;
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|b", &z_ftp, php_ftp_ce, &dir, &dir_len, &recursive) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* get raw directory listing */
if (NULL == (llist = ftp_list(ftp, dir, dir_len, recursive))) {
@@ -505,13 +520,10 @@ PHP_FUNCTION(ftp_mlsd)
size_t dir_len;
zval entry;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &dir, &dir_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* get raw directory listing */
if (NULL == (llist = ftp_mlsd(ftp, dir, dir_len))) {
@@ -539,13 +551,10 @@ PHP_FUNCTION(ftp_systype)
ftpbuf_t *ftp;
const char *syst;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_ftp) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &z_ftp, php_ftp_ce) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (NULL == (syst = ftp_syst(ftp))) {
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
@@ -567,13 +576,10 @@ PHP_FUNCTION(ftp_fget)
size_t file_len;
zend_long mode=FTPTYPE_IMAGE, resumepos=0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrs|ll", &z_ftp, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ors|ll", &z_ftp, php_ftp_ce, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
php_stream_from_res(stream, Z_RES_P(z_file));
XTYPE(xtype, mode);
@@ -612,13 +618,10 @@ PHP_FUNCTION(ftp_nb_fget)
size_t file_len;
zend_long mode=FTPTYPE_IMAGE, resumepos=0, ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrs|ll", &z_ftp, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ors|ll", &z_ftp, php_ftp_ce, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
php_stream_from_res(stream, Z_RES_P(z_file));
XTYPE(xtype, mode);
@@ -655,15 +658,12 @@ PHP_FUNCTION(ftp_pasv)
{
zval *z_ftp;
ftpbuf_t *ftp;
- zend_bool pasv;
+ bool pasv;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rb", &z_ftp, &pasv) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &z_ftp, php_ftp_ce, &pasv) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (!ftp_pasv(ftp, pasv ? 1 : 0)) {
RETURN_FALSE;
@@ -684,13 +684,10 @@ PHP_FUNCTION(ftp_get)
size_t local_len, remote_len;
zend_long mode=FTPTYPE_IMAGE, resumepos=0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|ll", &z_ftp, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Opp|ll", &z_ftp, php_ftp_ce, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
XTYPE(xtype, mode);
/* ignore autoresume if autoseek is switched off */
@@ -749,13 +746,10 @@ PHP_FUNCTION(ftp_nb_get)
int ret;
zend_long mode=FTPTYPE_IMAGE, resumepos=0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss|ll", &z_ftp, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss|ll", &z_ftp, php_ftp_ce, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
XTYPE(xtype, mode);
/* ignore autoresume if autoseek is switched off */
@@ -816,13 +810,10 @@ PHP_FUNCTION(ftp_nb_continue)
ftpbuf_t *ftp;
zend_long ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_ftp) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &z_ftp, php_ftp_ce) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (!ftp->nb) {
php_error_docref(NULL, E_WARNING, "No nbronous transfer to continue");
@@ -859,13 +850,10 @@ PHP_FUNCTION(ftp_fput)
php_stream *stream;
char *remote;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsr|ll", &z_ftp, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osr|ll", &z_ftp, php_ftp_ce, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
php_stream_from_zval(stream, z_file);
XTYPE(xtype, mode);
@@ -908,13 +896,10 @@ PHP_FUNCTION(ftp_nb_fput)
php_stream *stream;
char *remote;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsr|ll", &z_ftp, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osr|ll", &z_ftp, php_ftp_ce, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
php_stream_from_res(stream, Z_RES_P(z_file));
XTYPE(xtype, mode);
@@ -961,13 +946,10 @@ PHP_FUNCTION(ftp_put)
zend_long mode=FTPTYPE_IMAGE, startpos=0;
php_stream *instream;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|ll", &z_ftp, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Opp|ll", &z_ftp, php_ftp_ce, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
XTYPE(xtype, mode);
if (!(instream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "rt" : "rb", REPORT_ERRORS, NULL))) {
@@ -1014,13 +996,10 @@ PHP_FUNCTION(ftp_append)
zend_long mode=FTPTYPE_IMAGE;
php_stream *instream;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|l", &z_ftp, &remote, &remote_len, &local, &local_len, &mode) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Opp|l", &z_ftp, php_ftp_ce, &remote, &remote_len, &local, &local_len, &mode) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
XTYPE(xtype, mode);
if (!(instream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "rt" : "rb", REPORT_ERRORS, NULL))) {
@@ -1049,13 +1028,10 @@ PHP_FUNCTION(ftp_nb_put)
zend_long mode=FTPTYPE_IMAGE, startpos=0, ret;
php_stream *instream;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|ll", &z_ftp, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Opp|ll", &z_ftp, php_ftp_ce, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
XTYPE(xtype, mode);
if (!(instream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "rt" : "rb", REPORT_ERRORS, NULL))) {
@@ -1107,13 +1083,10 @@ PHP_FUNCTION(ftp_size)
char *file;
size_t file_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp", &z_ftp, &file, &file_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Op", &z_ftp, php_ftp_ce, &file, &file_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* get file size */
RETURN_LONG(ftp_size(ftp, file, file_len));
@@ -1128,13 +1101,10 @@ PHP_FUNCTION(ftp_mdtm)
char *file;
size_t file_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp", &z_ftp, &file, &file_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Op", &z_ftp, php_ftp_ce, &file, &file_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* get file mod time */
RETURN_LONG(ftp_mdtm(ftp, file, file_len));
@@ -1149,13 +1119,10 @@ PHP_FUNCTION(ftp_rename)
char *src, *dest;
size_t src_len, dest_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss", &z_ftp, &src, &src_len, &dest, &dest_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss", &z_ftp, php_ftp_ce, &src, &src_len, &dest, &dest_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* rename the file */
if (!ftp_rename(ftp, src, src_len, dest, dest_len)) {
@@ -1175,13 +1142,10 @@ PHP_FUNCTION(ftp_delete)
char *file;
size_t file_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &file, &file_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &file, &file_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* delete the file */
if (!ftp_delete(ftp, file, file_len)) {
@@ -1201,13 +1165,10 @@ PHP_FUNCTION(ftp_site)
char *cmd;
size_t cmd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &cmd, &cmd_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* send the site command */
if (!ftp_site(ftp, cmd, cmd_len)) {
@@ -1223,18 +1184,19 @@ PHP_FUNCTION(ftp_site)
PHP_FUNCTION(ftp_close)
{
zval *z_ftp;
- ftpbuf_t *ftp;
+ php_ftp_object *obj;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_ftp) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &z_ftp, php_ftp_ce) == FAILURE) {
RETURN_THROWS();
}
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_THROWS();
+ obj = ftp_object_from_zend_object(Z_OBJ_P(z_ftp));
+ if (obj->ftp) {
+ ftp_quit(obj->ftp);
+ ftp_close(obj->ftp);
+ obj->ftp = NULL;
}
- ftp_quit(ftp);
-
RETURN_TRUE;
}
/* }}} */
@@ -1246,13 +1208,10 @@ PHP_FUNCTION(ftp_set_option)
zend_long option;
ftpbuf_t *ftp;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz", &z_ftp, &option, &z_value) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olz", &z_ftp, php_ftp_ce, &option, &z_value) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
switch (option) {
case PHP_FTP_OPT_TIMEOUT_SEC:
@@ -1298,13 +1257,10 @@ PHP_FUNCTION(ftp_get_option)
zend_long option;
ftpbuf_t *ftp;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &z_ftp, &option) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &z_ftp, php_ftp_ce, &option) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
switch (option) {
case PHP_FTP_OPT_TIMEOUT_SEC:
diff --git a/ext/ftp/tests/007.phpt b/ext/ftp/tests/007.phpt
index 0520b37293..1ae879f901 100644
--- a/ext/ftp/tests/007.phpt
+++ b/ext/ftp/tests/007.phpt
@@ -180,36 +180,36 @@ try {
fclose($ftp);
?>
--EXPECT--
-ftp_login(): supplied resource is not a valid FTP Buffer resource
-ftp_pwd(): supplied resource is not a valid FTP Buffer resource
-ftp_cdup(): supplied resource is not a valid FTP Buffer resource
-ftp_chdir(): supplied resource is not a valid FTP Buffer resource
-ftp_exec(): supplied resource is not a valid FTP Buffer resource
-ftp_raw(): supplied resource is not a valid FTP Buffer resource
-ftp_mkdir(): supplied resource is not a valid FTP Buffer resource
-ftp_rmdir(): supplied resource is not a valid FTP Buffer resource
-ftp_chmod(): supplied resource is not a valid FTP Buffer resource
-ftp_alloc(): supplied resource is not a valid FTP Buffer resource
-ftp_nlist(): supplied resource is not a valid FTP Buffer resource
-ftp_rawlist(): supplied resource is not a valid FTP Buffer resource
-ftp_mlsd(): supplied resource is not a valid FTP Buffer resource
-ftp_systype(): supplied resource is not a valid FTP Buffer resource
-ftp_fget(): supplied resource is not a valid FTP Buffer resource
-ftp_nb_fget(): supplied resource is not a valid FTP Buffer resource
-ftp_pasv(): supplied resource is not a valid FTP Buffer resource
-ftp_get(): supplied resource is not a valid FTP Buffer resource
-ftp_nb_get(): supplied resource is not a valid FTP Buffer resource
-ftp_nb_continue(): supplied resource is not a valid FTP Buffer resource
-ftp_fput(): supplied resource is not a valid FTP Buffer resource
-ftp_nb_fput(): supplied resource is not a valid FTP Buffer resource
-ftp_put(): supplied resource is not a valid FTP Buffer resource
-ftp_append(): supplied resource is not a valid FTP Buffer resource
-ftp_nb_put(): supplied resource is not a valid FTP Buffer resource
-ftp_size(): supplied resource is not a valid FTP Buffer resource
-ftp_mdtm(): supplied resource is not a valid FTP Buffer resource
-ftp_rename(): supplied resource is not a valid FTP Buffer resource
-ftp_delete(): supplied resource is not a valid FTP Buffer resource
-ftp_site(): supplied resource is not a valid FTP Buffer resource
-ftp_close(): supplied resource is not a valid FTP Buffer resource
-ftp_set_option(): supplied resource is not a valid FTP Buffer resource
-ftp_get_option(): supplied resource is not a valid FTP Buffer resource
+ftp_login(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_pwd(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_cdup(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_chdir(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_exec(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_raw(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_mkdir(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_rmdir(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_chmod(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_alloc(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nlist(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_rawlist(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_mlsd(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_systype(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_fget(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nb_fget(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_pasv(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_get(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nb_get(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nb_continue(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_fput(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nb_fput(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_put(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_append(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nb_put(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_size(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_mdtm(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_rename(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_delete(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_site(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_close(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_set_option(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_get_option(): Argument #1 ($ftp) must be of type FTPConnection, resource given
diff --git a/ext/ftp/tests/CONFLICTS b/ext/ftp/tests/CONFLICTS
deleted file mode 100644
index 254defddb5..0000000000
--- a/ext/ftp/tests/CONFLICTS
+++ /dev/null
@@ -1 +0,0 @@
-server
diff --git a/ext/ftp/tests/dead-resource.phpt b/ext/ftp/tests/dead-resource.phpt
new file mode 100644
index 0000000000..75a9931d54
--- /dev/null
+++ b/ext/ftp/tests/dead-resource.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Attempt to use a closed FTPConnection
+--SKIPIF--
+<?php
+require 'skipif.inc';
+--FILE--
+<?php
+require 'server.inc';
+
+$ftp = ftp_connect('127.0.0.1', $port);
+if (!$ftp) die("Couldn't connect to the server");
+var_dump(ftp_login($ftp, 'user', 'pass'));
+var_dump(ftp_close($ftp));
+
+try {
+ var_dump(ftp_login($ftp, 'user', 'pass'));
+ echo "Login did not throw\n";
+} catch (ValueError $ex) {
+ echo "Exception: ", $ex->getMessage(), "\n";
+}
+--EXPECT--
+bool(true)
+bool(true)
+Exception: FTPConnection is already closed
diff --git a/ext/ftp/tests/ftp_constructor.phpt b/ext/ftp/tests/ftp_constructor.phpt
new file mode 100644
index 0000000000..881677f6a5
--- /dev/null
+++ b/ext/ftp/tests/ftp_constructor.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Attempt to instantiate an FTPConnection directly
+--SKIPIF--
+<?php
+require 'skipif.inc';
+--FILE--
+<?php
+
+try {
+ new FTPConnection();
+} catch (Error $ex) {
+ echo "Exception: ", $ex->getMessage(), "\n";
+}
+--EXPECT--
+Exception: Cannot directly construct FTPConnection, use ftp_connect() or ftp_ssl_connect() instead
diff --git a/ext/ftp/tests/ftp_set_option_errors.phpt b/ext/ftp/tests/ftp_set_option_errors.phpt
index 3f5476f6c3..5e5ef328f3 100644
--- a/ext/ftp/tests/ftp_set_option_errors.phpt
+++ b/ext/ftp/tests/ftp_set_option_errors.phpt
@@ -13,40 +13,22 @@ $ftp = ftp_connect('127.0.0.1', $port);
ftp_login($ftp, 'user', 'pass');
$ftp or die("Couldn't connect to the server");
-try {
- ftp_set_option($ftp, FTP_TIMEOUT_SEC, 0);
-} catch (ValueError $exception) {
- echo $exception->getMessage() . "\n";
+$options = [
+ [ 'option' => FTP_TIMEOUT_SEC, 'value' => 0 ],
+ [ 'option' => FTP_TIMEOUT_SEC, 'value' => '0' ],
+ [ 'option' => FTP_USEPASVADDRESS, 'value' => ['1'] ],
+ [ 'option' => FTP_AUTOSEEK, 'value' => 'true' ],
+ [ 'option' => FOO_BAR, 'value' => 1 ],
+];
+foreach ($options as $option) try {
+ var_dump(ftp_set_option($ftp, $option['option'], $option['value']));
+} catch (\Throwable $ex) {
+ echo "Exception: ", $ex->getMessage(), "\n";
}
-try {
- ftp_set_option($ftp, FTP_TIMEOUT_SEC, '0');
-} catch (TypeError $exception) {
- echo $exception->getMessage() . "\n";
-}
-
-try {
- ftp_set_option($ftp, FTP_USEPASVADDRESS, ['1']);
-} catch (TypeError $exception) {
- echo $exception->getMessage() . "\n";
-}
-
-try {
- ftp_set_option($ftp, FTP_AUTOSEEK, 'true');
-} catch (TypeError $exception) {
- echo $exception->getMessage() . "\n";
-}
-
-try {
- ftp_set_option($ftp, FOO_BAR, 1);
-} catch (ValueError $exception) {
- echo $exception->getMessage() . "\n";
-}
-
-?>
--EXPECT--
-ftp_set_option(): Argument #3 ($value) must be greater than 0 for the FTP_TIMEOUT_SEC option
-ftp_set_option(): Argument #3 ($value) must be of type int for the FTP_TIMEOUT_SEC option, string given
-ftp_set_option(): Argument #3 ($value) must be of type bool for the FTP_USEPASVADDRESS option, array given
-ftp_set_option(): Argument #3 ($value) must be of type bool for the FTP_AUTOSEEK option, string given
-ftp_set_option(): Argument #2 ($option) must be one of FTP_TIMEOUT_SEC, FTP_AUTOSEEK, or FTP_USEPASVADDRESS
+Exception: ftp_set_option(): Argument #3 ($value) must be greater than 0 for the FTP_TIMEOUT_SEC option
+Exception: ftp_set_option(): Argument #3 ($value) must be of type int for the FTP_TIMEOUT_SEC option, string given
+Exception: ftp_set_option(): Argument #3 ($value) must be of type bool for the FTP_USEPASVADDRESS option, array given
+Exception: ftp_set_option(): Argument #3 ($value) must be of type bool for the FTP_AUTOSEEK option, string given
+Exception: ftp_set_option(): Argument #2 ($option) must be one of FTP_TIMEOUT_SEC, FTP_AUTOSEEK, or FTP_USEPASVADDRESS
diff --git a/ext/ftp/tests/server.inc b/ext/ftp/tests/server.inc
index 38599391d6..8bc836fc40 100644
--- a/ext/ftp/tests/server.inc
+++ b/ext/ftp/tests/server.inc
@@ -4,59 +4,21 @@ $socket = null;
$errno = 0;
$context = stream_context_create(array('ssl' => array('local_cert' => dirname(__FILE__).'/cert.pem')));
-for ($i=0; $i<10 && !$socket; ++$i) {
- $port = rand(50000, 65535);
-
- $socket = @stream_socket_server("tcp://127.0.0.1:$port", $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
-}
-//set anther random port that is not the same as $port
-do{
- $pasv_port = rand(50000, 65535);
-}while($pasv_port == $port);
-
+$socket = stream_socket_server("tcp://127.0.0.1:0", $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
if (!$socket) {
echo "$errstr ($errno)\n";
die("could not start/bind the ftp server\n");
}
-$pid = pcntl_fork();
+$socket_name = stream_socket_get_name($socket, false);
+$port = (int) substr($socket_name, strrpos($socket_name, ':') + 1);
-function pasv_listen($action){
- global $pasv_port, $tmp_file;
- $tmp_file = 'nm2.php';
- $pid = pcntl_fork();
- if($pid === 0){
- $soc = stream_socket_server("tcp://127.0.0.1:$pasv_port");
- $fs = stream_socket_accept($soc, 3);
- switch ($action) {
- case 'fget':
- case 'get':
- //listen for 3 seconds 3 seconds
- fputs($fs, "I am passive.\r\n");
- break;
- case 'put':
- file_put_contents($tmp_file, stream_get_contents($fs));
- break;
- case 'list':
- fputs($fs, "drwxr-x--- 3 owner group 4096 Jul 12 12:16 .\r\n");
- fputs($fs, "drwxr-x--- 3 owner group 4096 Jul 12 12:16 ..\r\n");
- fputs($fs, "drwxr-x--- 3 owner group 4096 Jul 12 12:16 public_ftp\r\n");
- break;
- case 'list_null':
- fputs($fs, "\r\n");
- break;
- }
- fclose($fs);
- exit;
- }
-}
+$pid = pcntl_fork();
if ($pid) {
-
function dump_and_exit($buf)
{
var_dump($buf);
- fclose($GLOBALS['s']);
exit;
}
@@ -90,10 +52,14 @@ if ($pid) {
if (!$s) die("Error accepting a new connection\n");
+ register_shutdown_function(function() use($pid, $s) {
+ fclose($s);
+ pcntl_waitpid($pid, $status);
+ });
+
fputs($s, "220----- PHP FTP server 0.3 -----\r\n220 Service ready\r\n");
$buf = fread($s, 2048);
-
function user_auth($buf) {
global $user, $s, $ssl, $bug37799;
@@ -143,7 +109,6 @@ if ($pid) {
$user = $m[1];
if ($user !== 'user' && $user !== 'anonymous') {
fputs($s, "530 Not logged in.\r\n");
- fclose($s);
exit;
}
@@ -163,7 +128,6 @@ if ($pid) {
fputs($s, "230 User logged in\r\n");
} else {
fputs($s, "530 Not logged in.\r\n");
- fclose($s);
exit;
}
}
@@ -432,25 +396,20 @@ if ($pid) {
$i=0;
if (empty($bug73457)) {
- do {
- if (!empty($ssl)) {
- $soc = @stream_socket_server("tcp://127.0.0.1:$pasv_port", $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
- } else {
- $soc = @stream_socket_server("tcp://127.0.0.1:$pasv_port");
- }
- /* Could bind port, Try another port */
- if (!$soc) {
- $pasv_port = rand(50000, 65535);
- }
- $i++;
- } while ($i<10 && !$soc);
-
+ if (!empty($ssl)) {
+ $soc = stream_socket_server("tcp://127.0.0.1:0", $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
+ } else {
+ $soc = stream_socket_server("tcp://127.0.0.1:0");
+ }
if (!$soc) {
echo "$errstr ($errno)\n";
die("could not bind passive port\n");
}
+
+ $soc_name = stream_socket_get_name($soc, false);
+ $pasv_port = (int) substr($soc_name, strrpos($soc_name, ':') + 1);
} else {
- $pasv_port=1234;
+ $pasv_port = 1234;
}
$p2 = $pasv_port % ((int) 1 << 8);
@@ -548,7 +507,6 @@ if ($pid) {
dump_and_exit($buf);
}
}
- fclose($s);
exit;
}
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index 46704c60cf..609a61ebc2 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -57,8 +57,6 @@
#include "gd_compat.h"
-static int le_gd_font;
-
#include <gd.h>
#include <gd_errors.h>
#include <gdfontt.h> /* 1 Tiny font */
@@ -219,10 +217,7 @@ void php_gd_assign_libgdimageptr_as_extgdimage(zval *val, gdImagePtr image)
static void php_gd_object_minit_helper()
{
- zend_class_entry ce;
- INIT_CLASS_ENTRY(ce, "GdImage", class_GdImage_methods);
- gd_image_ce = zend_register_internal_class(&ce);
- gd_image_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ gd_image_ce = register_class_GdImage();
gd_image_ce->create_object = php_gd_image_object_create;
gd_image_ce->serialize = zend_class_serialize_deny;
gd_image_ce->unserialize = zend_class_unserialize_deny;
@@ -236,6 +231,72 @@ static void php_gd_object_minit_helper()
php_gd_image_object_handlers.offset = XtOffsetOf(php_gd_image_object, std);
}
+static zend_class_entry *gd_font_ce = NULL;
+static zend_object_handlers php_gd_font_object_handlers;
+
+typedef struct _php_gd_font_object {
+ gdFontPtr font;
+ zend_object std;
+} php_gd_font_object;
+
+static php_gd_font_object *php_gd_font_object_from_zend_object(zend_object *zobj)
+{
+ return ((php_gd_font_object*)(zobj + 1)) - 1;
+}
+
+static zend_object *php_gd_font_object_to_zend_object(php_gd_font_object *obj)
+{
+ return ((zend_object*)(obj + 1)) - 1;
+}
+
+static zend_object *php_gd_font_object_create(zend_class_entry *ce)
+{
+ php_gd_font_object *obj = zend_object_alloc(sizeof(php_gd_font_object), ce);
+ zend_object *zobj = php_gd_font_object_to_zend_object(obj);
+
+ obj->font = NULL;
+ zend_object_std_init(zobj, ce);
+ object_properties_init(zobj, ce);
+ zobj->handlers = &php_gd_font_object_handlers;
+
+ return zobj;
+}
+
+static void php_gd_font_object_free(zend_object *zobj)
+{
+ php_gd_font_object *obj = php_gd_font_object_from_zend_object(zobj);
+
+ if (obj->font) {
+ if (obj->font->data) {
+ efree(obj->font->data);
+ }
+ efree(obj->font);
+ obj->font = NULL;
+ }
+
+ zend_object_std_dtor(zobj);
+}
+
+static zend_function *php_gd_font_object_get_constructor(zend_object *object)
+{
+ zend_throw_error(NULL, "You cannot initialize a GdFont object except through helper functions");
+ return NULL;
+}
+
+static void php_gd_font_minit_helper()
+{
+ gd_font_ce = register_class_GdFont();
+ gd_font_ce->create_object = php_gd_font_object_create;
+ gd_font_ce->serialize = zend_class_serialize_deny;
+ gd_font_ce->unserialize = zend_class_unserialize_deny;
+
+ /* setting up the object handlers for the GdFont class */
+ memcpy(&php_gd_font_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ php_gd_font_object_handlers.clone_obj = NULL;
+ php_gd_font_object_handlers.free_obj = php_gd_font_object_free;
+ php_gd_font_object_handlers.get_constructor = php_gd_font_object_get_constructor;
+ php_gd_font_object_handlers.offset = XtOffsetOf(php_gd_font_object, std);
+}
/*********************************************************
*
@@ -266,19 +327,6 @@ PHP_INI_BEGIN()
PHP_INI_END()
/* }}} */
-/* {{{ php_free_gd_font */
-static void php_free_gd_font(zend_resource *rsrc)
-{
- gdFontPtr fp = (gdFontPtr) rsrc->ptr;
-
- if (fp->data) {
- efree(fp->data);
- }
-
- efree(fp);
-}
-/* }}} */
-
/* {{{ php_gd_error_method */
void php_gd_error_method(int type, const char *format, va_list args)
{
@@ -303,8 +351,8 @@ void php_gd_error_method(int type, const char *format, va_list args)
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(gd)
{
- le_gd_font = zend_register_list_destructors_ex(php_free_gd_font, NULL, "gd font", module_number);
php_gd_object_minit_helper();
+ php_gd_font_minit_helper();
#if defined(HAVE_GD_FREETYPE) && defined(HAVE_GD_BUNDLED)
gdFontCacheMutexSetup();
@@ -615,7 +663,6 @@ PHP_FUNCTION(gd_info)
/* {{{ Load a new font */
PHP_FUNCTION(imageloadfont)
{
- zval *ind;
zend_string *file;
int hdr_size = sizeof(gdFont) - sizeof(char *);
int body_size, n = 0, b, i, body_size_check;
@@ -626,7 +673,7 @@ PHP_FUNCTION(imageloadfont)
RETURN_THROWS();
}
- stream = php_stream_open_wrapper(ZSTR_VAL(file), "rb", IGNORE_PATH | IGNORE_URL_WIN | REPORT_ERRORS, NULL);
+ stream = php_stream_open_wrapper(ZSTR_VAL(file), "rb", IGNORE_PATH | REPORT_ERRORS, NULL);
if (stream == NULL) {
RETURN_FALSE;
}
@@ -705,13 +752,8 @@ PHP_FUNCTION(imageloadfont)
}
php_stream_close(stream);
- ind = zend_list_insert(font, le_gd_font);
-
- /* Adding 5 to the font index so we will never have font indices
- * that overlap with the old fonts (with indices 1-5). The first
- * list index given out is always 1.
- */
- RETURN_LONG(Z_RES_HANDLE_P(ind) + 5);
+ object_init_ex(return_value, gd_font_ce);
+ php_gd_font_object_from_zend_object(Z_OBJ_P(return_value))->font = font;
}
/* }}} */
@@ -801,7 +843,7 @@ PHP_FUNCTION(imageistruecolor)
PHP_FUNCTION(imagetruecolortopalette)
{
zval *IM;
- zend_bool dither;
+ bool dither;
zend_long ncolors;
gdImagePtr im;
@@ -954,7 +996,7 @@ PHP_FUNCTION(imagefilledarc)
PHP_FUNCTION(imagealphablending)
{
zval *IM;
- zend_bool blend;
+ bool blend;
gdImagePtr im;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &IM, gd_image_ce, &blend) == FAILURE) {
@@ -973,7 +1015,7 @@ PHP_FUNCTION(imagealphablending)
PHP_FUNCTION(imagesavealpha)
{
zval *IM;
- zend_bool save;
+ bool save;
gdImagePtr im;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &IM, gd_image_ce, &save) == FAILURE) {
@@ -1141,7 +1183,7 @@ PHP_FUNCTION(imagecopyresampled)
PHP_FUNCTION(imagegrabwindow)
{
HWND window;
- zend_bool client_area = 0;
+ bool client_area = 0;
RECT rc = {0};
int Width, Height;
HDC hdc;
@@ -1270,7 +1312,7 @@ PHP_FUNCTION(imagerotate)
gdImagePtr im_dst, im_src;
double degrees;
zend_long color;
- zend_bool ignoretransparent = 0;
+ bool ignoretransparent = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Odl|b", &SIM, gd_image_ce, &degrees, &color, &ignoretransparent) == FAILURE) {
RETURN_THROWS();
@@ -1586,7 +1628,7 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type,
}
- stream = php_stream_open_wrapper(file, "rb", REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL);
+ stream = php_stream_open_wrapper(file, "rb", REPORT_ERRORS|IGNORE_PATH, NULL);
if (stream == NULL) {
RETURN_FALSE;
}
@@ -1878,7 +1920,7 @@ PHP_FUNCTION(imagexbm)
char *file = NULL;
size_t file_len = 0;
zend_long foreground_color;
- zend_bool foreground_color_is_null = 1;
+ bool foreground_color_is_null = 1;
gdImagePtr im;
int i;
gdIOCtx *ctx = NULL;
@@ -1891,7 +1933,7 @@ PHP_FUNCTION(imagexbm)
im = php_gd_libgdimageptr_from_zval_p(imgind);
if (file != NULL) {
- stream = php_stream_open_wrapper(file, "wb", REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL);
+ stream = php_stream_open_wrapper(file, "wb", REPORT_ERRORS|IGNORE_PATH, NULL);
if (stream == NULL) {
RETURN_FALSE;
}
@@ -2016,7 +2058,7 @@ PHP_FUNCTION(imagegd2)
PHP_FUNCTION(imagebmp)
{
zval *imgind;
- zend_bool compressed = 1;
+ bool compressed = 1;
gdImagePtr im;
gdIOCtx *ctx = NULL;
zval *to_zval = NULL;
@@ -2566,7 +2608,7 @@ PHP_FUNCTION(imagecolortransparent)
{
zval *IM;
zend_long COL = 0;
- zend_bool COL_IS_NULL = 1;
+ bool COL_IS_NULL = 1;
gdImagePtr im;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|l!", &IM, gd_image_ce, &COL, &COL_IS_NULL) == FAILURE) {
@@ -2587,8 +2629,8 @@ PHP_FUNCTION(imagecolortransparent)
PHP_FUNCTION(imageinterlace)
{
zval *IM;
- zend_bool INT = 0;
- zend_bool INT_IS_NULL = 1;
+ bool INT = 0;
+ bool INT_IS_NULL = 1;
gdImagePtr im;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|b!", &IM, gd_image_ce, &INT, &INT_IS_NULL) == FAILURE) {
@@ -2614,7 +2656,7 @@ static void php_imagepolygon(INTERNAL_FUNCTION_PARAMETERS, int filled)
{
zval *IM, *POINTS;
zend_long NPOINTS, COL;
- zend_bool COL_IS_NULL = 1;
+ bool COL_IS_NULL = 1;
zval *var = NULL;
gdImagePtr im;
gdPointPtr points;
@@ -2703,42 +2745,21 @@ PHP_FUNCTION(imagefilledpolygon)
/* }}} */
/* {{{ php_find_gd_font */
-static gdFontPtr php_find_gd_font(int size)
+static gdFontPtr php_find_gd_font(zend_object *font_obj, zend_long font_int)
{
- gdFontPtr font;
+ if (font_obj) {
+ return php_gd_font_object_from_zend_object(font_obj)->font;
+ }
- switch (size) {
- case 1:
- font = gdFontTiny;
- break;
- case 2:
- font = gdFontSmall;
- break;
- case 3:
- font = gdFontMediumBold;
- break;
- case 4:
- font = gdFontLarge;
- break;
- case 5:
- font = gdFontGiant;
- break;
- default: {
- zval *zv = zend_hash_index_find(&EG(regular_list), size - 5);
- if (!zv || (Z_RES_P(zv))->type != le_gd_font) {
- if (size < 1) {
- font = gdFontTiny;
- } else {
- font = gdFontGiant;
- }
- } else {
- font = (gdFontPtr)Z_RES_P(zv)->ptr;
- }
- }
- break;
- }
-
- return font;
+ switch (font_int) {
+ case 1: return gdFontTiny;
+ case 2: return gdFontSmall;
+ case 3: return gdFontMediumBold;
+ case 4: return gdFontLarge;
+ case 5: return gdFontGiant;
+ }
+
+ return font_int < 1 ? gdFontTiny : gdFontGiant;
}
/* }}} */
@@ -2748,14 +2769,15 @@ static gdFontPtr php_find_gd_font(int size)
*/
static void php_imagefontsize(INTERNAL_FUNCTION_PARAMETERS, int arg)
{
- zend_long SIZE;
+ zend_object *font_obj;
+ zend_long font_int;
gdFontPtr font;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &SIZE) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_OBJ_OF_CLASS_OR_LONG(font_obj, gd_font_ce, font_int)
+ ZEND_PARSE_PARAMETERS_END();
- font = php_find_gd_font(SIZE);
+ font = php_find_gd_font(font_obj, font_int);
RETURN_LONG(arg ? font->h : font->w);
}
/* }}} */
@@ -2809,17 +2831,24 @@ static void php_gdimagecharup(gdImagePtr im, gdFontPtr f, int x, int y, int c, i
static void php_imagechar(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
zval *IM;
- zend_long SIZE, X, Y, COL;
+ zend_long X, Y, COL;
char *C;
size_t C_len;
gdImagePtr im;
- int ch = 0, col, x, y, size, i, l = 0;
+ int ch = 0, col, x, y, i, l = 0;
unsigned char *str = NULL;
+ zend_object *font_obj;
+ zend_long font_int;
gdFontPtr font;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olllsl", &IM, gd_image_ce, &SIZE, &X, &Y, &C, &C_len, &COL) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(6, 6)
+ Z_PARAM_OBJECT_OF_CLASS(IM, gd_image_ce)
+ Z_PARAM_OBJ_OF_CLASS_OR_LONG(font_obj, gd_font_ce, font_int)
+ Z_PARAM_LONG(X)
+ Z_PARAM_LONG(Y)
+ Z_PARAM_STRING(C, C_len)
+ Z_PARAM_LONG(COL)
+ ZEND_PARSE_PARAMETERS_END();
im = php_gd_libgdimageptr_from_zval_p(IM);
@@ -2834,9 +2863,8 @@ static void php_imagechar(INTERNAL_FUNCTION_PARAMETERS, int mode)
y = Y;
x = X;
- size = SIZE;
- font = php_find_gd_font(size);
+ font = php_find_gd_font(font_obj, font_int);
switch (mode) {
case 0:
@@ -3154,7 +3182,7 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode)
if (key == NULL) {
continue;
}
- if (strcmp("linespacing", ZSTR_VAL(key)) == 0) {
+ if (zend_string_equals_literal(key, "linespacing")) {
strex.flags |= gdFTEX_LINESPACE;
strex.linespacing = zval_get_double(item);
}
@@ -3363,7 +3391,7 @@ static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS)
zval *IM;
gdImagePtr im;
zend_long tmp, blocksize;
- zend_bool mode = 0;
+ bool mode = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oll|b", &IM, gd_image_ce, &tmp, &blocksize, &mode) == FAILURE) {
RETURN_THROWS();
@@ -3541,7 +3569,7 @@ PHP_FUNCTION(imageflip)
PHP_FUNCTION(imageantialias)
{
zval *IM;
- zend_bool alias;
+ bool alias;
gdImagePtr im;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &IM, gd_image_ce, &alias) == FAILURE) {
@@ -3992,7 +4020,7 @@ PHP_FUNCTION(imageresolution)
zval *IM;
gdImagePtr im;
zend_long res_x, res_y;
- zend_bool res_x_is_null = 1, res_y_is_null = 1;
+ bool res_x_is_null = 1, res_y_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|l!l!", &IM, gd_image_ce, &res_x, &res_x_is_null, &res_y, &res_y_is_null) == FAILURE) {
RETURN_THROWS();
@@ -4100,7 +4128,7 @@ static gdIOCtx *create_stream_context_from_zval(zval *to_zval) {
return NULL;
}
- stream = php_stream_open_wrapper(Z_STRVAL_P(to_zval), "wb", REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL);
+ stream = php_stream_open_wrapper(Z_STRVAL_P(to_zval), "wb", REPORT_ERRORS|IGNORE_PATH, NULL);
if (stream == NULL) {
return NULL;
}
diff --git a/ext/gd/gd.stub.php b/ext/gd/gd.stub.php
index 732baa77e7..593b678a43 100644
--- a/ext/gd/gd.stub.php
+++ b/ext/gd/gd.stub.php
@@ -1,14 +1,15 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
-final class GdImage
-{
-}
+/** @strict-properties */
+final class GdImage {}
+/** @strict-properties */
+final class GdFont {}
function gd_info(): array {}
-function imageloadfont(string $filename): int|false {}
+function imageloadfont(string $filename): GdFont|false {}
function imagesetstyle(GdImage $image, array $style): bool {}
@@ -187,17 +188,17 @@ function imageopenpolygon(GdImage $image, array $points, int $num_points_or_colo
function imagefilledpolygon(GdImage $image, array $points, int $num_points_or_color, ?int $color = null): bool {}
-function imagefontwidth(int $font): int {}
+function imagefontwidth(GdFont|int $font): int {}
-function imagefontheight(int $font): int {}
+function imagefontheight(GdFont|int $font): int {}
-function imagechar(GdImage $image, int $font, int $x, int $y, string $char, int $color): bool {}
+function imagechar(GdImage $image, GdFont|int $font, int $x, int $y, string $char, int $color): bool {}
-function imagecharup(GdImage $image, int $font, int $x, int $y, string $char, int $color): bool {}
+function imagecharup(GdImage $image, GdFont|int $font, int $x, int $y, string $char, int $color): bool {}
-function imagestring(GdImage $image, int $font, int $x, int $y, string $string, int $color): bool {}
+function imagestring(GdImage $image, GdFont|int $font, int $x, int $y, string $string, int $color): bool {}
-function imagestringup(GdImage $image, int $font, int $x, int $y, string $string, int $color): bool {}
+function imagestringup(GdImage $image, GdFont|int $font, int $x, int $y, string $string, int $color): bool {}
function imagecopy(GdImage $dst_image, GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height): bool {}
diff --git a/ext/gd/gd_arginfo.h b/ext/gd/gd_arginfo.h
index 74e93e024a..20fe428657 100644
--- a/ext/gd/gd_arginfo.h
+++ b/ext/gd/gd_arginfo.h
@@ -1,10 +1,10 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 012a149dba5332fcb73544771b881fc7e6d53925 */
+ * Stub hash: a53aa5d7eafd82e0b0adf0b220f0a548e4ac2a84 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gd_info, 0, 0, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imageloadfont, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_imageloadfont, 0, 1, GdFont, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -380,14 +380,14 @@ ZEND_END_ARG_INFO()
#define arginfo_imagefilledpolygon arginfo_imagepolygon
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagefontwidth, 0, 1, IS_LONG, 0)
- ZEND_ARG_TYPE_INFO(0, font, IS_LONG, 0)
+ ZEND_ARG_OBJ_TYPE_MASK(0, font, GdFont, MAY_BE_LONG, NULL)
ZEND_END_ARG_INFO()
#define arginfo_imagefontheight arginfo_imagefontwidth
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagechar, 0, 6, _IS_BOOL, 0)
ZEND_ARG_OBJ_INFO(0, image, GdImage, 0)
- ZEND_ARG_TYPE_INFO(0, font, IS_LONG, 0)
+ ZEND_ARG_OBJ_TYPE_MASK(0, font, GdFont, MAY_BE_LONG, NULL)
ZEND_ARG_TYPE_INFO(0, x, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, y, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, char, IS_STRING, 0)
@@ -398,7 +398,7 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagestring, 0, 6, _IS_BOOL, 0)
ZEND_ARG_OBJ_INFO(0, image, GdImage, 0)
- ZEND_ARG_TYPE_INFO(0, font, IS_LONG, 0)
+ ZEND_ARG_OBJ_TYPE_MASK(0, font, GdFont, MAY_BE_LONG, NULL)
ZEND_ARG_TYPE_INFO(0, x, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, y, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
@@ -831,3 +831,30 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_GdImage_methods[] = {
ZEND_FE_END
};
+
+
+static const zend_function_entry class_GdFont_methods[] = {
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class_GdImage(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "GdImage", class_GdImage_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_GdFont(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "GdFont", class_GdFont_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/gd/tests/imagetruecolortopalette_error3.phpt b/ext/gd/tests/imagetruecolortopalette_error3.phpt
index 0af49bf38c..58bd1cf1e8 100644
--- a/ext/gd/tests/imagetruecolortopalette_error3.phpt
+++ b/ext/gd/tests/imagetruecolortopalette_error3.phpt
@@ -14,7 +14,7 @@ require __DIR__ . '/func.inc';
$image = imagecreatetruecolor(50, 50);
trycatch_dump(
- fn() => imagetruecolortopalette($image, true, null)
+ fn() => imagetruecolortopalette($image, true, 0)
);
?>
diff --git a/ext/gettext/gettext.stub.php b/ext/gettext/gettext.stub.php
index 84654ab741..0b664107eb 100644
--- a/ext/gettext/gettext.stub.php
+++ b/ext/gettext/gettext.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function textdomain(?string $domain): string {}
diff --git a/ext/gettext/gettext_arginfo.h b/ext/gettext/gettext_arginfo.h
index 32811d5b66..80bdec52cb 100644
--- a/ext/gettext/gettext_arginfo.h
+++ b/ext/gettext/gettext_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 3fbd90b87dfcbc5a1a0a2aea8d0cc45516e221ce */
+ * Stub hash: bc0c8a6b95afdacad81cc19b5aeb727a58f0cb38 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_textdomain, 0, 1, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 1)
diff --git a/ext/gettext/tests/bug53251.phpt b/ext/gettext/tests/bug53251.phpt
index b3e2e9e66c..2c0ea62d65 100644
--- a/ext/gettext/tests/bug53251.phpt
+++ b/ext/gettext/tests/bug53251.phpt
@@ -3,6 +3,7 @@ Bug #53251 (bindtextdomain with null dir doesn't return old value)
--SKIPIF--
<?php
if (!extension_loaded('gettext')) die('skip gettext extension not available');
+if (getenv('SKIP_REPEAT')) die('skip gettext leaks global state across requests');
?>
--FILE--
<?php
diff --git a/ext/gettext/tests/gettext_bindtextdomain-cwd.phpt b/ext/gettext/tests/gettext_bindtextdomain-cwd.phpt
index e9bc37b410..dbfa1506d5 100644
--- a/ext/gettext/tests/gettext_bindtextdomain-cwd.phpt
+++ b/ext/gettext/tests/gettext_bindtextdomain-cwd.phpt
@@ -8,6 +8,10 @@ if (!extension_loaded("gettext")) {
if (!setlocale(LC_ALL, 'en_US.UTF-8')) {
die("skip en_US.UTF-8 locale not supported.");
}
+if (getenv('SKIP_REPEAT')) {
+ die('skip gettext leaks global state across requests');
+}
+?>
--FILE--
<?php
$base_dir = __DIR__;
diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c
index 0f4b317fd0..800878e278 100644
--- a/ext/gmp/gmp.c
+++ b/ext/gmp/gmp.c
@@ -72,7 +72,7 @@ PHP_GMP_API zend_class_entry *php_gmp_class_entry(void) {
typedef struct _gmp_temp {
mpz_t num;
- zend_bool is_used;
+ bool is_used;
} gmp_temp_t;
#define GMP_ROUND_ZERO 0
@@ -527,9 +527,7 @@ static ZEND_GINIT_FUNCTION(gmp)
/* {{{ ZEND_MINIT_FUNCTION */
ZEND_MINIT_FUNCTION(gmp)
{
- zend_class_entry tmp_ce;
- INIT_CLASS_ENTRY(tmp_ce, "GMP", class_GMP_methods);
- gmp_ce = zend_register_internal_class(&tmp_ce);
+ gmp_ce = register_class_GMP();
gmp_ce->create_object = gmp_create_object;
gmp_ce->serialize = gmp_serialize;
gmp_ce->unserialize = gmp_unserialize;
@@ -598,13 +596,16 @@ static zend_result convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, ui
return SUCCESS;
case IS_STRING: {
char *numstr = Z_STRVAL_P(val);
- zend_bool skip_lead = 0;
+ bool skip_lead = 0;
int ret;
if (Z_STRLEN_P(val) >= 2 && numstr[0] == '0') {
if ((base == 0 || base == 16) && (numstr[1] == 'x' || numstr[1] == 'X')) {
base = 16;
skip_lead = 1;
+ } else if ((base == 0 || base == 8) && (numstr[1] == 'o' || numstr[1] == 'O')) {
+ base = 8;
+ skip_lead = 1;
} else if ((base == 0 || base == 2) && (numstr[1] == 'b' || numstr[1] == 'B')) {
base = 2;
skip_lead = 1;
@@ -627,7 +628,7 @@ static zend_result convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, ui
}
default: {
zend_long lval;
- if (!zend_parse_arg_long_slow(val, &lval)) {
+ if (!zend_parse_arg_long_slow(val, &lval, arg_pos)) {
zend_argument_type_error(arg_pos, "must be of type GMP|string|int, %s given", zend_zval_type_name(val));
return FAILURE;
}
@@ -674,7 +675,7 @@ static void gmp_cmp(zval *return_value, zval *a_arg, zval *b_arg) /* {{{ */
{
mpz_ptr gmpnum_a, gmpnum_b;
gmp_temp_t temp_a, temp_b;
- zend_bool use_si = 0;
+ bool use_si = 0;
zend_long res;
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1);
@@ -1624,7 +1625,7 @@ ZEND_FUNCTION(gmp_kronecker)
zval *a_arg, *b_arg;
mpz_ptr gmpnum_a, gmpnum_b;
gmp_temp_t temp_a, temp_b;
- zend_bool use_a_si = 0, use_b_si = 0;
+ bool use_a_si = 0, use_b_si = 0;
int result;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz", &a_arg, &b_arg) == FAILURE){
@@ -1861,7 +1862,7 @@ ZEND_FUNCTION(gmp_setbit)
{
zval *a_arg;
zend_long index;
- zend_bool set = 1;
+ bool set = 1;
mpz_ptr gmpnum_a;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol|b", &a_arg, gmp_ce, &index, &set) == FAILURE) {
diff --git a/ext/gmp/gmp.stub.php b/ext/gmp/gmp.stub.php
index 729ae37245..06e96c8392 100644
--- a/ext/gmp/gmp.stub.php
+++ b/ext/gmp/gmp.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class GMP
{
diff --git a/ext/gmp/gmp_arginfo.h b/ext/gmp/gmp_arginfo.h
index fd341edbb5..2bb3674545 100644
--- a/ext/gmp/gmp_arginfo.h
+++ b/ext/gmp/gmp_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: a1eb4fd58c0b2155692611386c77035f1ef11c2c */
+ * Stub hash: 69215fb94adb4156c974360e5698e842471cb27d */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_init, 0, 1, GMP, 0)
ZEND_ARG_TYPE_MASK(0, num, MAY_BE_LONG|MAY_BE_STRING, NULL)
@@ -296,3 +296,13 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_GMP_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_GMP(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "GMP", class_GMP_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/gmp/php_gmp.h b/ext/gmp/php_gmp.h
index 9db9d696de..82872ef9d2 100644
--- a/ext/gmp/php_gmp.h
+++ b/ext/gmp/php_gmp.h
@@ -30,7 +30,7 @@ ZEND_MODULE_DEACTIVATE_D(gmp);
ZEND_MODULE_INFO_D(gmp);
ZEND_BEGIN_MODULE_GLOBALS(gmp)
- zend_bool rand_initialized;
+ bool rand_initialized;
gmp_randstate_t rand_state;
ZEND_END_MODULE_GLOBALS(gmp)
diff --git a/ext/gmp/tests/gmp_init_integer_notations.phpt b/ext/gmp/tests/gmp_init_integer_notations.phpt
new file mode 100644
index 0000000000..0a705f7cd3
--- /dev/null
+++ b/ext/gmp/tests/gmp_init_integer_notations.phpt
@@ -0,0 +1,50 @@
+--TEST--
+gmp_init() with various integer notations
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--FILE--
+<?php
+
+var_dump(gmp_init("0x16"));
+var_dump(gmp_init("0X16"));
+var_dump(gmp_init("0o16"));
+var_dump(gmp_init("0o16"));
+var_dump(gmp_init("016"));
+var_dump(gmp_init("016"));
+var_dump(gmp_init("0b11"));
+var_dump(gmp_init("0b11"));
+
+?>
+--EXPECT--
+object(GMP)#1 (1) {
+ ["num"]=>
+ string(2) "22"
+}
+object(GMP)#1 (1) {
+ ["num"]=>
+ string(2) "22"
+}
+object(GMP)#1 (1) {
+ ["num"]=>
+ string(2) "14"
+}
+object(GMP)#1 (1) {
+ ["num"]=>
+ string(2) "14"
+}
+object(GMP)#1 (1) {
+ ["num"]=>
+ string(2) "14"
+}
+object(GMP)#1 (1) {
+ ["num"]=>
+ string(2) "14"
+}
+object(GMP)#1 (1) {
+ ["num"]=>
+ string(1) "3"
+}
+object(GMP)#1 (1) {
+ ["num"]=>
+ string(1) "3"
+}
diff --git a/ext/gmp/tests/surprising_integer_literals.phpt b/ext/gmp/tests/surprising_integer_literals.phpt
new file mode 100644
index 0000000000..de7289ea0b
--- /dev/null
+++ b/ext/gmp/tests/surprising_integer_literals.phpt
@@ -0,0 +1,33 @@
+--TEST--
+Surprising result with integer literals (hex/binary/octal)
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--FILE--
+<?php
+
+$values = [
+ '0x',
+ '0X',
+ '0b',
+ '0B',
+ '0o',
+ '0O',
+ ''
+];
+
+foreach ($values as $value) {
+ try {
+ var_dump(gmp_init($value));
+ } catch (\ValueError $e) {
+ echo $e->getMessage(), \PHP_EOL;
+ }
+}
+?>
+--EXPECT--
+gmp_init(): Argument #1 ($num) is not an integer string
+gmp_init(): Argument #1 ($num) is not an integer string
+gmp_init(): Argument #1 ($num) is not an integer string
+gmp_init(): Argument #1 ($num) is not an integer string
+gmp_init(): Argument #1 ($num) is not an integer string
+gmp_init(): Argument #1 ($num) is not an integer string
+gmp_init(): Argument #1 ($num) is not an integer string
diff --git a/ext/hash/bench.php b/ext/hash/bench.php
index 436390f7d5..9daafd5209 100755
--- a/ext/hash/bench.php
+++ b/ext/hash/bench.php
@@ -1,95 +1,25 @@
#!/usr/bin/env php
<?php
-/*
- This gives rather interesting results :)
+error_reporting(E_ALL);
- Measures on a Notebook P4M-1.7 256MB Windows 2000:
- sha1 0.556691
- tiger160,3 0.774469
- tiger192,3 0.776314
- tiger128,3 0.777004
- ripemd128 0.896674
- sha256 1.011164
- md5 1.016032
- tiger160,4 1.056617
- tiger128,4 1.063101
- tiger192,4 1.069258
- haval160,3 1.125099
- haval128,3 1.125679
- haval224,3 1.128017
- haval192,3 1.130026
- haval256,3 1.134846
- ripemd160 1.150693
- haval128,4 1.686261
- haval192,4 1.687274
- haval160,4 1.693091
- haval256,4 1.699323
- haval224,4 1.743094
- haval160,5 2.003452
- haval192,5 2.008341
- haval256,5 2.009048
- haval128,5 2.009555
- haval224,5 2.015539
- sha384 3.370734
- sha512 3.381121
- whirlpool 6.912327
- snefru 9.268168
-
- Measures on a Desktop P4-2.4 512MB Debian (Linux-2.4):
- md5 0.147739
- haval128,3 0.317006
- haval192,3 0.317524
- haval256,3 0.317526
- haval160,3 0.323035
- haval224,3 0.333318
- ripemd128 0.353447
- sha1 0.376200
- ripemd160 0.413758
- sha256 0.435957
- haval160,4 0.452357
- haval224,4 0.454531
- haval128,4 0.458026
- haval256,4 0.459051
- haval192,4 0.468094
- haval128,5 0.524262
- haval160,5 0.529573
- haval224,5 0.533655
- haval256,5 0.534446
- haval192,5 0.543726
- tiger128,3 0.577975
- tiger160,3 0.579951
- tiger192,3 0.597111
- tiger192,4 0.781408
- tiger160,4 0.801243
- tiger128,4 0.812239
- sha512 1.298627
- sha384 1.313607
- whirlpool 1.556159
- snefru 5.703742
-
-*/
-
-error_reporting(E_ALL&~E_NOTICE);
-
-$data = file_get_contents(__FILE__);
+$data = str_repeat("\x00", (int) ($argv[1] ?? (2 * 1024)));
$time = array();
foreach (hash_algos() as $algo) {
- $time[$algo] = 0;
+ $time[$algo] = 0;
}
for ($j = 0; $j < 10; $j++) {
foreach (hash_algos() as $algo) {
- $start = microtime(true);
+ $start = hrtime(true);
for ($i = 0; $i < 1000; $i++) {
hash($algo, $data);
}
- $time[$algo] += microtime(true)-$start;
+ $time[$algo] += hrtime(true)-$start;
}
}
asort($time, SORT_NUMERIC);
foreach ($time as $a => $t) {
- printf("%-12s %02.6f\n", $a, $t);
+ printf("%-12s %02.6f\n", $a, $t/1000000000);
}
-?>
diff --git a/ext/hash/config.m4 b/ext/hash/config.m4
index d84e89cc6b..0dbb081b6c 100644
--- a/ext/hash/config.m4
+++ b/ext/hash/config.m4
@@ -33,13 +33,18 @@ else
PHP_ADD_BUILD_DIR(ext/hash/$SHA3_DIR, 1)
fi
+PHP_ADD_BUILD_DIR(ext/hash/murmur, 1)
+PHP_HASH_CFLAGS="$PHP_HASH_CFLAGS -I@ext_srcdir@/xxhash"
+
EXT_HASH_SOURCES="hash.c hash_md.c hash_sha.c hash_ripemd.c hash_haval.c \
hash_tiger.c hash_gost.c hash_snefru.c hash_whirlpool.c hash_adler32.c \
- hash_crc32.c hash_fnv.c hash_joaat.c $EXT_HASH_SHA3_SOURCES"
+ hash_crc32.c hash_fnv.c hash_joaat.c $EXT_HASH_SHA3_SOURCES
+ murmur/PMurHash.c murmur/PMurHash128.c hash_murmur.c hash_xxhash.c"
EXT_HASH_HEADERS="php_hash.h php_hash_md.h php_hash_sha.h php_hash_ripemd.h \
php_hash_haval.h php_hash_tiger.h php_hash_gost.h php_hash_snefru.h \
php_hash_whirlpool.h php_hash_adler32.h php_hash_crc32.h \
- php_hash_fnv.h php_hash_joaat.h php_hash_sha3.h"
+ php_hash_fnv.h php_hash_joaat.h php_hash_sha3.h php_hash_murmur.h \
+ php_hash_xxhash.h"
PHP_NEW_EXTENSION(hash, $EXT_HASH_SOURCES, 0,,$PHP_HASH_CFLAGS)
PHP_INSTALL_HEADERS(ext/hash, $EXT_HASH_HEADERS)
diff --git a/ext/hash/config.w32 b/ext/hash/config.w32
index 5d6be6b922..d38b032efd 100644
--- a/ext/hash/config.w32
+++ b/ext/hash/config.w32
@@ -11,7 +11,7 @@ PHP_HASH = 'yes';
EXTENSION('hash', 'hash.c hash_md.c hash_sha.c hash_ripemd.c hash_haval.c ' +
'hash_tiger.c hash_gost.c hash_snefru.c hash_whirlpool.c ' +
'hash_adler32.c hash_crc32.c hash_joaat.c hash_fnv.c ' +
- 'hash_sha3.c', false);
+ 'hash_sha3.c hash_murmur.c hash_xxhash.c', false);
var hash_sha3_dir = 'ext/hash/sha3/generic' + (X64 ? '64' : '32') + 'lc';
@@ -28,7 +28,19 @@ if (!CHECK_HEADER_ADD_INCLUDE('KeccakHash.h', 'CFLAGS_HASH', hash_sha3_dir)) {
ADD_FLAG('CFLAGS_HASH', '/DKeccakP200_excluded /DKeccakP400_excluded /DKeccakP800_excluded /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');
+var hash_murmur_dir = 'ext/hash/murmur';
+if (!CHECK_HEADER_ADD_INCLUDE('PMurHash.h', 'CFLAGS_HASH', hash_murmur_dir)) {
+ ERROR('Unable to locate murmur headers');
+}
+ADD_SOURCES(hash_murmur_dir, 'PMurHash.c PMurHash128.c', 'hash');
+
+var hash_xxhash_dir = 'ext/hash/xxhash';
+if (!CHECK_HEADER_ADD_INCLUDE('xxhash.h', 'CFLAGS_HASH', hash_xxhash_dir)) {
+ ERROR('Unable to locate xxhash headers');
+}
+
PHP_INSTALL_HEADERS('ext/hash/', 'php_hash.h php_hash_md.h php_hash_sha.h ' +
'php_hash_ripemd.h php_hash_haval.h php_hash_tiger.h ' +
'php_hash_gost.h php_hash_snefru.h php_hash_whirlpool.h ' +
- 'php_hash_adler32.h php_hash_crc32.h php_hash_sha3.h');
+ 'php_hash_adler32.h php_hash_crc32.h php_hash_sha3.h ' +
+ 'php_hash_murmur.h php_hash_xxhash.h');
diff --git a/ext/hash/hash.c b/ext/hash/hash.c
index 4e3820f35e..bf1d1577ca 100644
--- a/ext/hash/hash.c
+++ b/ext/hash/hash.c
@@ -52,7 +52,7 @@ struct mhash_bc_entry {
int value;
};
-#define MHASH_NUM_ALGOS 35
+#define MHASH_NUM_ALGOS 42
static struct mhash_bc_entry mhash_to_hash[MHASH_NUM_ALGOS] = {
{"CRC32", "crc32", 0}, /* used by bzip */
@@ -90,6 +90,13 @@ static struct mhash_bc_entry mhash_to_hash[MHASH_NUM_ALGOS] = {
{"FNV1A64", "fnv1a64", 32},
{"JOAAT", "joaat", 33},
{"CRC32C", "crc32c", 34}, /* Castagnoli's CRC, used by iSCSI, SCTP, Btrfs, ext4, etc */
+ {"MURMUR3A", "murmur3a", 35},
+ {"MURMUR3C", "murmur3c", 36},
+ {"MURMUR3F", "murmur3f", 37},
+ {"XXH32", "xxh32", 38},
+ {"XXH64", "xxh64", 39},
+ {"XXH3", "xxh3", 40},
+ {"XXH128", "xxh128", 41},
};
#endif
@@ -346,7 +353,7 @@ PHP_HASH_API int php_hash_unserialize(php_hashcontext_object *hash, zend_long ma
/* Userspace */
static void php_hash_do_hash(
- zval *return_value, zend_string *algo, char *data, size_t data_len, zend_bool raw_output, bool isfilename
+ zval *return_value, zend_string *algo, char *data, size_t data_len, bool raw_output, bool isfilename, HashTable *args
) /* {{{ */ {
zend_string *digest;
const php_hash_ops *ops;
@@ -371,7 +378,7 @@ static void php_hash_do_hash(
}
context = php_hash_alloc_context(ops);
- ops->hash_init(context);
+ ops->hash_init(context, args);
if (isfilename) {
char buf[1024];
@@ -414,16 +421,18 @@ PHP_FUNCTION(hash)
zend_string *algo;
char *data;
size_t data_len;
- zend_bool raw_output = 0;
+ bool raw_output = 0;
+ HashTable *args = NULL;
- ZEND_PARSE_PARAMETERS_START(2, 3)
+ ZEND_PARSE_PARAMETERS_START(2, 4)
Z_PARAM_STR(algo)
Z_PARAM_STRING(data, data_len)
Z_PARAM_OPTIONAL
Z_PARAM_BOOL(raw_output)
+ Z_PARAM_ARRAY_HT(args)
ZEND_PARSE_PARAMETERS_END();
- php_hash_do_hash(return_value, algo, data, data_len, raw_output, 0);
+ php_hash_do_hash(return_value, algo, data, data_len, raw_output, 0, args);
}
/* }}} */
@@ -434,16 +443,18 @@ PHP_FUNCTION(hash_file)
zend_string *algo;
char *data;
size_t data_len;
- zend_bool raw_output = 0;
+ bool raw_output = 0;
+ HashTable *args = NULL;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_STR(algo)
Z_PARAM_STRING(data, data_len)
Z_PARAM_OPTIONAL
Z_PARAM_BOOL(raw_output)
+ Z_PARAM_ARRAY_HT(args)
ZEND_PARSE_PARAMETERS_END();
- php_hash_do_hash(return_value, algo, data, data_len, raw_output, 1);
+ php_hash_do_hash(return_value, algo, data, data_len, raw_output, 1, args);
}
/* }}} */
@@ -465,7 +476,7 @@ static inline void php_hash_hmac_prep_key(unsigned char *K, const php_hash_ops *
memset(K, 0, ops->block_size);
if (key_len > ops->block_size) {
/* Reduce the key first */
- ops->hash_init(context);
+ ops->hash_init(context, NULL);
ops->hash_update(context, key, key_len);
ops->hash_final(K, context);
} else {
@@ -476,14 +487,14 @@ static inline void php_hash_hmac_prep_key(unsigned char *K, const php_hash_ops *
}
static inline void php_hash_hmac_round(unsigned char *final, const php_hash_ops *ops, void *context, const unsigned char *key, const unsigned char *data, const zend_long data_size) {
- ops->hash_init(context);
+ ops->hash_init(context, NULL);
ops->hash_update(context, key, ops->block_size);
ops->hash_update(context, data, data_size);
ops->hash_final(final, context);
}
static void php_hash_do_hash_hmac(
- zval *return_value, zend_string *algo, char *data, size_t data_len, char *key, size_t key_len, zend_bool raw_output, bool isfilename
+ zval *return_value, zend_string *algo, char *data, size_t data_len, char *key, size_t key_len, bool raw_output, bool isfilename
) /* {{{ */ {
zend_string *digest;
unsigned char *K;
@@ -519,7 +530,7 @@ static void php_hash_do_hash_hmac(
if (isfilename) {
char buf[1024];
ssize_t n;
- ops->hash_init(context);
+ ops->hash_init(context, NULL);
ops->hash_update(context, K, ops->block_size);
while ((n = php_stream_read(stream, buf, sizeof(buf))) > 0) {
ops->hash_update(context, (unsigned char *) buf, n);
@@ -567,7 +578,7 @@ PHP_FUNCTION(hash_hmac)
zend_string *algo;
char *data, *key;
size_t data_len, key_len;
- zend_bool raw_output = 0;
+ bool raw_output = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sss|b", &algo, &data, &data_len, &key, &key_len, &raw_output) == FAILURE) {
RETURN_THROWS();
@@ -584,7 +595,7 @@ PHP_FUNCTION(hash_hmac_file)
zend_string *algo;
char *data, *key;
size_t data_len, key_len;
- zend_bool raw_output = 0;
+ bool raw_output = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sss|b", &algo, &data, &data_len, &key, &key_len, &raw_output) == FAILURE) {
RETURN_THROWS();
@@ -602,8 +613,9 @@ PHP_FUNCTION(hash_init)
void *context;
const php_hash_ops *ops;
php_hashcontext_object *hash;
+ HashTable *args = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|lS", &algo, &options, &key) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|lSh", &algo, &options, &key, &args) == FAILURE) {
RETURN_THROWS();
}
@@ -629,7 +641,7 @@ PHP_FUNCTION(hash_init)
hash = php_hashcontext_from_object(Z_OBJ_P(return_value));
context = php_hash_alloc_context(ops);
- ops->hash_init(context);
+ ops->hash_init(context, args);
hash->ops = ops;
hash->context = context;
@@ -647,7 +659,7 @@ PHP_FUNCTION(hash_init)
ops->hash_update(context, (unsigned char *) ZSTR_VAL(key), ZSTR_LEN(key));
ops->hash_final((unsigned char *) K, context);
/* Make the context ready to start over */
- ops->hash_init(context);
+ ops->hash_init(context, args);
} else {
memcpy(K, ZSTR_VAL(key), ZSTR_LEN(key));
}
@@ -765,7 +777,7 @@ PHP_FUNCTION(hash_final)
{
zval *zhash;
php_hashcontext_object *hash;
- zend_bool raw_output = 0;
+ bool raw_output = 0;
zend_string *digest;
size_t digest_len;
@@ -789,7 +801,7 @@ PHP_FUNCTION(hash_final)
}
/* Feed this result into the outer hash */
- hash->ops->hash_init(hash->context);
+ hash->ops->hash_init(hash->context, NULL);
hash->ops->hash_update(hash->context, hash->key, hash->ops->block_size);
hash->ops->hash_update(hash->context, (unsigned char *) ZSTR_VAL(digest), hash->ops->digest_size);
hash->ops->hash_final((unsigned char *) ZSTR_VAL(digest), hash->context);
@@ -912,7 +924,7 @@ PHP_FUNCTION(hash_hkdf)
context = php_hash_alloc_context(ops);
// Extract
- ops->hash_init(context);
+ ops->hash_init(context, NULL);
K = emalloc(ops->block_size);
php_hash_hmac_prep_key(K, ops, context,
(unsigned char *) (salt ? ZSTR_VAL(salt) : ""), salt ? ZSTR_LEN(salt) : 0);
@@ -932,7 +944,7 @@ PHP_FUNCTION(hash_hkdf)
c[0] = (i & 0xFF);
php_hash_hmac_prep_key(K, ops, context, prk, ops->digest_size);
- ops->hash_init(context);
+ ops->hash_init(context, NULL);
ops->hash_update(context, K, ops->block_size);
if (i > 1) {
@@ -974,11 +986,12 @@ PHP_FUNCTION(hash_pbkdf2)
unsigned char *computed_salt, *digest, *temp, *result, *K1, *K2 = NULL;
zend_long loops, i, j, iterations, digest_length = 0, length = 0;
size_t pass_len, salt_len = 0;
- zend_bool raw_output = 0;
+ bool raw_output = 0;
const php_hash_ops *ops;
void *context;
+ HashTable *args;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sssl|lb", &algo, &pass, &pass_len, &salt, &salt_len, &iterations, &length, &raw_output) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sssl|lbh", &algo, &pass, &pass_len, &salt, &salt_len, &iterations, &length, &raw_output, &args) == FAILURE) {
RETURN_THROWS();
}
@@ -1004,7 +1017,7 @@ PHP_FUNCTION(hash_pbkdf2)
}
context = php_hash_alloc_context(ops);
- ops->hash_init(context);
+ ops->hash_init(context, args);
K1 = emalloc(ops->block_size);
K2 = emalloc(ops->block_size);
@@ -1209,7 +1222,7 @@ PHP_FUNCTION(mhash)
if (key) {
php_hash_do_hash_hmac(return_value, algo, data, data_len, key, key_len, 1, 0);
} else {
- php_hash_do_hash(return_value, algo, data, data_len, 1, 0);
+ php_hash_do_hash(return_value, algo, data, data_len, 1, 0, NULL);
}
if (algo) {
@@ -1316,13 +1329,13 @@ PHP_FUNCTION(mhash_keygen_s2k)
}
context = php_hash_alloc_context(ops);
- ops->hash_init(context);
+ ops->hash_init(context, NULL);
key = ecalloc(1, times * block_size);
digest = emalloc(ops->digest_size + 1);
for (i = 0; i < times; i++) {
- ops->hash_init(context);
+ ops->hash_init(context, NULL);
for (j=0;j<i;j++) {
ops->hash_update(context, &null, 1);
@@ -1389,7 +1402,7 @@ static zend_object *php_hashcontext_clone(zend_object *zobj) {
newobj->ops = oldobj->ops;
newobj->options = oldobj->options;
newobj->context = php_hash_alloc_context(newobj->ops);
- newobj->ops->hash_init(newobj->context);
+ newobj->ops->hash_init(newobj->context, NULL);
if (SUCCESS != newobj->ops->hash_copy(newobj->ops, oldobj->context, newobj->context)) {
efree(newobj->context);
@@ -1526,8 +1539,8 @@ PHP_METHOD(HashContext, __unserialize)
hash->ops = ops;
hash->context = php_hash_alloc_context(ops);
- ops->hash_init(hash->context);
hash->options = options;
+ ops->hash_init(hash->context, NULL);
unserialize_result = ops->hash_unserialize(hash, magic, hash_zv);
if (unserialize_result != SUCCESS) {
@@ -1544,8 +1557,6 @@ PHP_METHOD(HashContext, __unserialize)
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(hash)
{
- zend_class_entry ce;
-
zend_hash_init(&php_hash_hashtable, 35, NULL, NULL, 1);
php_hash_register_algo("md2", &php_hash_md2_ops);
@@ -1586,6 +1597,13 @@ PHP_MINIT_FUNCTION(hash)
php_hash_register_algo("fnv164", &php_hash_fnv164_ops);
php_hash_register_algo("fnv1a64", &php_hash_fnv1a64_ops);
php_hash_register_algo("joaat", &php_hash_joaat_ops);
+ php_hash_register_algo("murmur3a", &php_hash_murmur3a_ops);
+ php_hash_register_algo("murmur3c", &php_hash_murmur3c_ops);
+ php_hash_register_algo("murmur3f", &php_hash_murmur3f_ops);
+ php_hash_register_algo("xxh32", &php_hash_xxh32_ops);
+ php_hash_register_algo("xxh64", &php_hash_xxh64_ops);
+ php_hash_register_algo("xxh3", &php_hash_xxh3_64_ops);
+ php_hash_register_algo("xxh128", &php_hash_xxh3_128_ops);
PHP_HASH_HAVAL_REGISTER(3,128);
PHP_HASH_HAVAL_REGISTER(3,160);
@@ -1607,9 +1625,7 @@ PHP_MINIT_FUNCTION(hash)
REGISTER_LONG_CONSTANT("HASH_HMAC", PHP_HASH_HMAC, CONST_CS | CONST_PERSISTENT);
- INIT_CLASS_ENTRY(ce, "HashContext", class_HashContext_methods);
- php_hashcontext_ce = zend_register_internal_class(&ce);
- php_hashcontext_ce->ce_flags |= ZEND_ACC_FINAL;
+ php_hashcontext_ce = register_class_HashContext();
php_hashcontext_ce->create_object = php_hashcontext_create;
memcpy(&php_hashcontext_handlers, &std_object_handlers,
diff --git a/ext/hash/hash.stub.php b/ext/hash/hash.stub.php
index c0d4cbca7c..c59fdfa64f 100644
--- a/ext/hash/hash.stub.php
+++ b/ext/hash/hash.stub.php
@@ -1,16 +1,15 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+function hash(string $algo, string $data, bool $binary = false, array $options = []): string|false {}
-function hash(string $algo, string $data, bool $binary = false): string|false {}
-
-function hash_file(string $algo, string $filename, bool $binary = false): string|false {}
+function hash_file(string $algo, string $filename, bool $binary = false, array $options = []): string|false {}
function hash_hmac(string $algo, string $data, string $key, bool $binary = false): string|false {}
function hash_hmac_file(string $algo, string $data, string $key, bool $binary = false): string|false {}
-function hash_init(string $algo, int $flags = 0, string $key = ""): HashContext {}
+function hash_init(string $algo, int $flags = 0, string $key = "", array $options = []): HashContext {}
function hash_update(HashContext $context, string $data): bool {}
diff --git a/ext/hash/hash_adler32.c b/ext/hash/hash_adler32.c
index d45012f8e6..5acd621b2d 100644
--- a/ext/hash/hash_adler32.c
+++ b/ext/hash/hash_adler32.c
@@ -18,7 +18,7 @@
#include "php_hash.h"
#include "php_hash_adler32.h"
-PHP_HASH_API void PHP_ADLER32Init(PHP_ADLER32_CTX *context)
+PHP_HASH_API void PHP_ADLER32Init(PHP_ADLER32_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->state = 1;
}
diff --git a/ext/hash/hash_arginfo.h b/ext/hash/hash_arginfo.h
index db043da97b..f6ba16d4c4 100644
--- a/ext/hash/hash_arginfo.h
+++ b/ext/hash/hash_arginfo.h
@@ -1,16 +1,18 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 9352e0ac98e2ac53dc15d5024f9ef0c8092c4e9c */
+ * Stub hash: 3973a03a64b0939de0c3677da55a5104c29b1b99 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_hash, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, algo, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, binary, _IS_BOOL, 0, "false")
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_hash_file, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, algo, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, binary, _IS_BOOL, 0, "false")
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_hash_hmac, 0, 3, MAY_BE_STRING|MAY_BE_FALSE)
@@ -26,6 +28,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_hash_init, 0, 1, HashContext, 0)
ZEND_ARG_TYPE_INFO(0, algo, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, key, IS_STRING, 0, "\"\"")
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_hash_update, 0, 2, _IS_BOOL, 0)
@@ -201,3 +204,14 @@ static const zend_function_entry class_HashContext_methods[] = {
ZEND_ME(HashContext, __unserialize, arginfo_class_HashContext___unserialize, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_HashContext(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "HashContext", class_HashContext_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
diff --git a/ext/hash/hash_crc32.c b/ext/hash/hash_crc32.c
index ade32a3b35..d77cdde013 100644
--- a/ext/hash/hash_crc32.c
+++ b/ext/hash/hash_crc32.c
@@ -20,7 +20,7 @@
#include "php_hash_crc32_tables.h"
#include "ext/standard/crc32_x86.h"
-PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context)
+PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->state = ~0;
}
diff --git a/ext/hash/hash_fnv.c b/ext/hash/hash_fnv.c
index 2ee81b9c86..3a48d40484 100644
--- a/ext/hash/hash_fnv.c
+++ b/ext/hash/hash_fnv.c
@@ -83,7 +83,7 @@ const php_hash_ops php_hash_fnv1a64_ops = {
/* {{{ PHP_FNV132Init
* 32-bit FNV-1 hash initialisation
*/
-PHP_HASH_API void PHP_FNV132Init(PHP_FNV132_CTX *context)
+PHP_HASH_API void PHP_FNV132Init(PHP_FNV132_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->state = PHP_FNV1_32_INIT;
}
@@ -118,7 +118,7 @@ PHP_HASH_API void PHP_FNV132Final(unsigned char digest[4], PHP_FNV132_CTX * cont
/* {{{ PHP_FNV164Init
* 64-bit FNV-1 hash initialisation
*/
-PHP_HASH_API void PHP_FNV164Init(PHP_FNV164_CTX *context)
+PHP_HASH_API void PHP_FNV164Init(PHP_FNV164_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->state = PHP_FNV1_64_INIT;
}
diff --git a/ext/hash/hash_gost.c b/ext/hash/hash_gost.c
index 46ea032c32..d1f4a31765 100644
--- a/ext/hash/hash_gost.c
+++ b/ext/hash/hash_gost.c
@@ -235,15 +235,15 @@ static inline void GostTransform(PHP_GOST_CTX *context, const unsigned char inpu
Gost(context, data);
}
-PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *context)
+PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
memset(context, 0, sizeof(*context));
context->tables = &tables_test;
}
-PHP_HASH_API void PHP_GOSTInitCrypto(PHP_GOST_CTX *context)
+PHP_HASH_API void PHP_GOSTInitCrypto(PHP_GOST_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
- PHP_GOSTInit(context);
+ PHP_GOSTInit(context, NULL);
context->tables = &tables_crypto;
}
diff --git a/ext/hash/hash_haval.c b/ext/hash/hash_haval.c
index 84ff242bd9..9b117db8d9 100644
--- a/ext/hash/hash_haval.c
+++ b/ext/hash/hash_haval.c
@@ -253,7 +253,7 @@ const php_hash_ops php_hash_##p##haval##b##_ops = { \
php_hash_unserialize, \
PHP_HAVAL_SPEC, \
((b) / 8), 128, sizeof(PHP_HAVAL_CTX), 1 }; \
-PHP_HASH_API void PHP_##p##HAVAL##b##Init(PHP_HAVAL_CTX *context) \
+PHP_HASH_API void PHP_##p##HAVAL##b##Init(PHP_HAVAL_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) \
{ int i; context->count[0] = context->count[1] = 0; \
for(i = 0; i < 8; i++) context->state[i] = D0[i]; \
context->passes = p; context->output = b; \
diff --git a/ext/hash/hash_joaat.c b/ext/hash/hash_joaat.c
index 5d5a2e53b9..41fde52f30 100644
--- a/ext/hash/hash_joaat.c
+++ b/ext/hash/hash_joaat.c
@@ -36,7 +36,7 @@ const php_hash_ops php_hash_joaat_ops = {
0
};
-PHP_HASH_API void PHP_JOAATInit(PHP_JOAAT_CTX *context)
+PHP_HASH_API void PHP_JOAATInit(PHP_JOAAT_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->state = 0;
}
diff --git a/ext/hash/hash_md.c b/ext/hash/hash_md.c
index 94fafbbf79..a34936d625 100644
--- a/ext/hash/hash_md.c
+++ b/ext/hash/hash_md.c
@@ -19,7 +19,7 @@
const php_hash_ops php_hash_md5_ops = {
"md5",
- (php_hash_init_func_t) PHP_MD5Init,
+ (php_hash_init_func_t) PHP_MD5InitArgs,
(php_hash_update_func_t) PHP_MD5Update,
(php_hash_final_func_t) PHP_MD5Final,
php_hash_copy,
@@ -34,7 +34,7 @@ const php_hash_ops php_hash_md5_ops = {
const php_hash_ops php_hash_md4_ops = {
"md4",
- (php_hash_init_func_t) PHP_MD4Init,
+ (php_hash_init_func_t) PHP_MD4InitArgs,
(php_hash_update_func_t) PHP_MD4Update,
(php_hash_final_func_t) PHP_MD4Final,
php_hash_copy,
@@ -51,7 +51,7 @@ static int php_md2_unserialize(php_hashcontext_object *hash, zend_long magic, co
const php_hash_ops php_hash_md2_ops = {
"md2",
- (php_hash_init_func_t) PHP_MD2Init,
+ (php_hash_init_func_t) PHP_MD2InitArgs,
(php_hash_update_func_t) PHP_MD2Update,
(php_hash_final_func_t) PHP_MD2Final,
php_hash_copy,
@@ -182,10 +182,10 @@ static void MD4Transform(uint32_t state[4], const unsigned char block[64])
state[3] += d;
}
-/* {{{ PHP_MD4Init
+/* {{{ PHP_MD4InitArgs
* MD4 initialization. Begins an MD4 operation, writing a new context.
*/
-PHP_HASH_API void PHP_MD4Init(PHP_MD4_CTX * context)
+PHP_HASH_API void PHP_MD4InitArgs(PHP_MD4_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants.
@@ -287,7 +287,7 @@ static const unsigned char MD2_S[256] = {
242, 239, 183, 14, 102, 88, 208, 228, 166, 119, 114, 248, 235, 117, 75, 10,
49, 68, 80, 180, 143, 237, 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 };
-PHP_HASH_API void PHP_MD2Init(PHP_MD2_CTX *context)
+PHP_HASH_API void PHP_MD2InitArgs(PHP_MD2_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
memset(context, 0, sizeof(PHP_MD2_CTX));
}
diff --git a/ext/hash/hash_murmur.c b/ext/hash/hash_murmur.c
new file mode 100644
index 0000000000..d3d9f640c0
--- /dev/null
+++ b/ext/hash/hash_murmur.c
@@ -0,0 +1,225 @@
+/*
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Anatol Belski <ab@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+#include "php_hash.h"
+#include "php_hash_murmur.h"
+
+#include "murmur/PMurHash.h"
+#include "murmur/PMurHash128.h"
+
+
+const php_hash_ops php_hash_murmur3a_ops = {
+ "murmur3a",
+ (php_hash_init_func_t) PHP_MURMUR3AInit,
+ (php_hash_update_func_t) PHP_MURMUR3AUpdate,
+ (php_hash_final_func_t) PHP_MURMUR3AFinal,
+ (php_hash_copy_func_t) PHP_MURMUR3ACopy,
+ php_hash_serialize,
+ php_hash_unserialize,
+ PHP_MURMUR3A_SPEC,
+ 4,
+ 4,
+ sizeof(PHP_MURMUR3A_CTX),
+ 0
+};
+
+PHP_HASH_API void PHP_MURMUR3AInit(PHP_MURMUR3A_CTX *ctx, HashTable *args)
+{
+ if (args) {
+ zval *seed = zend_hash_str_find_deref(args, "seed", sizeof("seed") - 1);
+ /* This might be a bit too restrictive, but thinking that a seed might be set
+ once and for all, it should be done a clean way. */
+ if (seed && IS_LONG == Z_TYPE_P(seed)) {
+ ctx->h = (uint32_t)Z_LVAL_P(seed);
+ } else {
+ ctx->h = 0;
+ }
+ } else {
+ ctx->h = 0;
+ }
+ ctx->carry = 0;
+ ctx->len = 0;
+}
+
+PHP_HASH_API void PHP_MURMUR3AUpdate(PHP_MURMUR3A_CTX *ctx, const unsigned char *in, size_t len)
+{
+ ctx->len += len;
+ PMurHash32_Process(&ctx->h, &ctx->carry, in, len);
+}
+
+PHP_HASH_API void PHP_MURMUR3AFinal(unsigned char digest[4], PHP_MURMUR3A_CTX *ctx)
+{
+ ctx->h = PMurHash32_Result(ctx->h, ctx->carry, ctx->len);
+
+ digest[0] = (unsigned char)((ctx->h >> 24) & 0xff);
+ digest[1] = (unsigned char)((ctx->h >> 16) & 0xff);
+ digest[2] = (unsigned char)((ctx->h >> 8) & 0xff);
+ digest[3] = (unsigned char)(ctx->h & 0xff);
+}
+
+PHP_HASH_API int PHP_MURMUR3ACopy(const php_hash_ops *ops, PHP_MURMUR3A_CTX *orig_context, PHP_MURMUR3A_CTX *copy_context)
+{
+ copy_context->h = orig_context->h;
+ copy_context->carry = orig_context->carry;
+ copy_context->len = orig_context->len;
+ return SUCCESS;
+}
+
+const php_hash_ops php_hash_murmur3c_ops = {
+ "murmur3c",
+ (php_hash_init_func_t) PHP_MURMUR3CInit,
+ (php_hash_update_func_t) PHP_MURMUR3CUpdate,
+ (php_hash_final_func_t) PHP_MURMUR3CFinal,
+ (php_hash_copy_func_t) PHP_MURMUR3CCopy,
+ php_hash_serialize,
+ php_hash_unserialize,
+ PHP_MURMUR3C_SPEC,
+ 16,
+ 4,
+ sizeof(PHP_MURMUR3C_CTX),
+ 0
+};
+
+PHP_HASH_API void PHP_MURMUR3CInit(PHP_MURMUR3C_CTX *ctx, HashTable *args)
+{
+ if (args) {
+ zval *seed = zend_hash_str_find_deref(args, "seed", sizeof("seed") - 1);
+ /* This might be a bit too restrictive, but thinking that a seed might be set
+ once and for all, it should be done a clean way. */
+ if (seed && IS_LONG == Z_TYPE_P(seed)) {
+ uint32_t _seed = (uint32_t)Z_LVAL_P(seed);
+ ctx->h[0] = _seed;
+ ctx->h[1] = _seed;
+ ctx->h[2] = _seed;
+ ctx->h[3] = _seed;
+ } else {
+ memset(&ctx->h, 0, sizeof ctx->h);
+ }
+ } else {
+ memset(&ctx->h, 0, sizeof ctx->h);
+ }
+ memset(&ctx->carry, 0, sizeof ctx->carry);
+ ctx->len = 0;
+}
+
+PHP_HASH_API void PHP_MURMUR3CUpdate(PHP_MURMUR3C_CTX *ctx, const unsigned char *in, size_t len)
+{
+ ctx->len += len;
+ PMurHash128x86_Process(ctx->h, ctx->carry, in, len);
+}
+
+PHP_HASH_API void PHP_MURMUR3CFinal(unsigned char digest[16], PHP_MURMUR3C_CTX *ctx)
+{
+ uint32_t h[4] = {0, 0, 0, 0};
+ PMurHash128x86_Result(ctx->h, ctx->carry, ctx->len, h);
+
+ digest[0] = (unsigned char)((h[0] >> 24) & 0xff);
+ digest[1] = (unsigned char)((h[0] >> 16) & 0xff);
+ digest[2] = (unsigned char)((h[0] >> 8) & 0xff);
+ digest[3] = (unsigned char)(h[0] & 0xff);
+ digest[4] = (unsigned char)((h[1] >> 24) & 0xff);
+ digest[5] = (unsigned char)((h[1] >> 16) & 0xff);
+ digest[6] = (unsigned char)((h[1] >> 8) & 0xff);
+ digest[7] = (unsigned char)(h[1] & 0xff);
+ digest[8] = (unsigned char)((h[2] >> 24) & 0xff);
+ digest[9] = (unsigned char)((h[2] >> 16) & 0xff);
+ digest[10] = (unsigned char)((h[2] >> 8) & 0xff);
+ digest[11] = (unsigned char)(h[2] & 0xff);
+ digest[12] = (unsigned char)((h[3] >> 24) & 0xff);
+ digest[13] = (unsigned char)((h[3] >> 16) & 0xff);
+ digest[14] = (unsigned char)((h[3] >> 8) & 0xff);
+ digest[15] = (unsigned char)(h[3] & 0xff);
+}
+
+PHP_HASH_API int PHP_MURMUR3CCopy(const php_hash_ops *ops, PHP_MURMUR3C_CTX *orig_context, PHP_MURMUR3C_CTX *copy_context)
+{
+ memcpy(&copy_context->h, &orig_context->h, sizeof orig_context->h);
+ memcpy(&copy_context->carry, &orig_context->carry, sizeof orig_context->carry);
+ copy_context->len = orig_context->len;
+ return SUCCESS;
+}
+
+const php_hash_ops php_hash_murmur3f_ops = {
+ "murmur3f",
+ (php_hash_init_func_t) PHP_MURMUR3FInit,
+ (php_hash_update_func_t) PHP_MURMUR3FUpdate,
+ (php_hash_final_func_t) PHP_MURMUR3FFinal,
+ (php_hash_copy_func_t) PHP_MURMUR3FCopy,
+ php_hash_serialize,
+ php_hash_unserialize,
+ PHP_MURMUR3F_SPEC,
+ 16,
+ 8,
+ sizeof(PHP_MURMUR3F_CTX),
+ 0
+};
+
+PHP_HASH_API void PHP_MURMUR3FInit(PHP_MURMUR3F_CTX *ctx, HashTable *args)
+{
+ if (args) {
+ zval *seed = zend_hash_str_find_deref(args, "seed", sizeof("seed") - 1);
+ /* This might be a bit too restrictive, but thinking that a seed might be set
+ once and for all, it should be done a clean way. */
+ if (seed && IS_LONG == Z_TYPE_P(seed)) {
+ uint64_t _seed = (uint64_t)Z_LVAL_P(seed);
+ ctx->h[0] = _seed;
+ ctx->h[1] = _seed;
+ } else {
+ memset(&ctx->h, 0, sizeof ctx->h);
+ }
+ } else {
+ memset(&ctx->h, 0, sizeof ctx->h);
+ }
+ memset(&ctx->carry, 0, sizeof ctx->carry);
+ ctx->len = 0;
+}
+
+PHP_HASH_API void PHP_MURMUR3FUpdate(PHP_MURMUR3F_CTX *ctx, const unsigned char *in, size_t len)
+{
+ ctx->len += len;
+ PMurHash128x64_Process(ctx->h, ctx->carry, in, len);
+}
+
+PHP_HASH_API void PHP_MURMUR3FFinal(unsigned char digest[16], PHP_MURMUR3F_CTX *ctx)
+{
+ uint64_t h[2] = {0, 0};
+ PMurHash128x64_Result(ctx->h, ctx->carry, ctx->len, h);
+
+ digest[0] = (unsigned char)((h[0] >> 56) & 0xff);
+ digest[1] = (unsigned char)((h[0] >> 48) & 0xff);
+ digest[2] = (unsigned char)((h[0] >> 40) & 0xff);
+ digest[3] = (unsigned char)((h[0] >> 32) & 0xff);
+ digest[4] = (unsigned char)((h[0] >> 24) & 0xff);
+ digest[5] = (unsigned char)((h[0] >> 16) & 0xff);
+ digest[6] = (unsigned char)((h[0] >> 8) & 0xff);
+ digest[7] = (unsigned char)(h[0] & 0xff);
+ digest[8] = (unsigned char)((h[1] >> 56) & 0xff);
+ digest[9] = (unsigned char)((h[1] >> 48) & 0xff);
+ digest[10] = (unsigned char)((h[1] >> 40) & 0xff);
+ digest[11] = (unsigned char)((h[1] >> 32) & 0xff);
+ digest[12] = (unsigned char)((h[1] >> 24) & 0xff);
+ digest[13] = (unsigned char)((h[1] >> 16) & 0xff);
+ digest[14] = (unsigned char)((h[1] >> 8) & 0xff);
+ digest[15] = (unsigned char)(h[1] & 0xff);
+}
+
+PHP_HASH_API int PHP_MURMUR3FCopy(const php_hash_ops *ops, PHP_MURMUR3F_CTX *orig_context, PHP_MURMUR3F_CTX *copy_context)
+{
+ memcpy(&copy_context->h, &orig_context->h, sizeof orig_context->h);
+ memcpy(&copy_context->carry, &orig_context->carry, sizeof orig_context->carry);
+ copy_context->len = orig_context->len;
+ return SUCCESS;
+}
diff --git a/ext/hash/hash_ripemd.c b/ext/hash/hash_ripemd.c
index db1d1dc02b..58c40b06a7 100644
--- a/ext/hash/hash_ripemd.c
+++ b/ext/hash/hash_ripemd.c
@@ -84,7 +84,7 @@ const php_hash_ops php_hash_ripemd320_ops = {
/* {{{ PHP_RIPEMD128Init
* ripemd128 initialization. Begins a ripemd128 operation, writing a new context.
*/
-PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX * context)
+PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants.
@@ -99,7 +99,7 @@ PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX * context)
/* {{{ PHP_RIPEMD256Init
* ripemd256 initialization. Begins a ripemd256 operation, writing a new context.
*/
-PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX * context)
+PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants.
@@ -118,7 +118,7 @@ PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX * context)
/* {{{ PHP_RIPEMD160Init
* ripemd160 initialization. Begins a ripemd160 operation, writing a new context.
*/
-PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX * context)
+PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants.
@@ -134,7 +134,7 @@ PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX * context)
/* {{{ PHP_RIPEMD320Init
* ripemd320 initialization. Begins a ripemd320 operation, writing a new context.
*/
-PHP_HASH_API void PHP_RIPEMD320Init(PHP_RIPEMD320_CTX * context)
+PHP_HASH_API void PHP_RIPEMD320Init(PHP_RIPEMD320_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants.
diff --git a/ext/hash/hash_sha.c b/ext/hash/hash_sha.c
index 4ea5b768d7..acc23a21bf 100644
--- a/ext/hash/hash_sha.c
+++ b/ext/hash/hash_sha.c
@@ -64,7 +64,7 @@ static void SHADecode32(uint32_t *output, const unsigned char *input, unsigned i
const php_hash_ops php_hash_sha1_ops = {
"sha1",
- (php_hash_init_func_t) PHP_SHA1Init,
+ (php_hash_init_func_t) PHP_SHA1InitArgs,
(php_hash_update_func_t) PHP_SHA1Update,
(php_hash_final_func_t) PHP_SHA1Final,
php_hash_copy,
@@ -81,7 +81,7 @@ const php_hash_ops php_hash_sha1_ops = {
const php_hash_ops php_hash_sha256_ops = {
"sha256",
- (php_hash_init_func_t) PHP_SHA256Init,
+ (php_hash_init_func_t) PHP_SHA256InitArgs,
(php_hash_update_func_t) PHP_SHA256Update,
(php_hash_final_func_t) PHP_SHA256Final,
php_hash_copy,
@@ -96,7 +96,7 @@ const php_hash_ops php_hash_sha256_ops = {
const php_hash_ops php_hash_sha224_ops = {
"sha224",
- (php_hash_init_func_t) PHP_SHA224Init,
+ (php_hash_init_func_t) PHP_SHA224InitArgs,
(php_hash_update_func_t) PHP_SHA224Update,
(php_hash_final_func_t) PHP_SHA224Final,
php_hash_copy,
@@ -136,10 +136,10 @@ static const uint32_t SHA256_K[64] = {
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 };
-/* {{{ PHP_SHA256Init
+/* {{{ PHP_SHA256InitArgs
* SHA256 initialization. Begins an SHA256 operation, writing a new context.
*/
-PHP_HASH_API void PHP_SHA256Init(PHP_SHA256_CTX * context)
+PHP_HASH_API void PHP_SHA256InitArgs(PHP_SHA256_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants.
@@ -196,10 +196,10 @@ static void SHA256Transform(uint32_t state[8], const unsigned char block[64])
}
/* }}} */
-/* {{{ PHP_SHA224Init
+/* {{{ PHP_SHA224InitArgs
* SHA224 initialization. Begins an SHA224 operation, writing a new context.
*/
-PHP_HASH_API void PHP_SHA224Init(PHP_SHA224_CTX * context)
+PHP_HASH_API void PHP_SHA224InitArgs(PHP_SHA224_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants.
@@ -445,10 +445,10 @@ static void SHADecode64(uint64_t *output, const unsigned char *input, unsigned i
}
/* }}} */
-/* {{{ PHP_SHA384Init
+/* {{{ PHP_SHA384InitArgs
* SHA384 initialization. Begins an SHA384 operation, writing a new context.
*/
-PHP_HASH_API void PHP_SHA384Init(PHP_SHA384_CTX * context)
+PHP_HASH_API void PHP_SHA384InitArgs(PHP_SHA384_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants.
@@ -591,7 +591,7 @@ PHP_HASH_API void PHP_SHA384Final(unsigned char digest[48], PHP_SHA384_CTX * con
const php_hash_ops php_hash_sha384_ops = {
"sha384",
- (php_hash_init_func_t) PHP_SHA384Init,
+ (php_hash_init_func_t) PHP_SHA384InitArgs,
(php_hash_update_func_t) PHP_SHA384Update,
(php_hash_final_func_t) PHP_SHA384Final,
php_hash_copy,
@@ -604,10 +604,10 @@ const php_hash_ops php_hash_sha384_ops = {
1
};
-/* {{{ PHP_SHA512Init
+/* {{{ PHP_SHA512InitArgs
* SHA512 initialization. Begins an SHA512 operation, writing a new context.
*/
-PHP_HASH_API void PHP_SHA512Init(PHP_SHA512_CTX * context)
+PHP_HASH_API void PHP_SHA512InitArgs(PHP_SHA512_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants.
@@ -623,10 +623,10 @@ PHP_HASH_API void PHP_SHA512Init(PHP_SHA512_CTX * context)
}
/* }}} */
-/* {{{ PHP_SHA512_256Init
+/* {{{ PHP_SHA512_256InitArgs
* SHA512/245 initialization. Identical algorithm to SHA512, using alternate initval and truncation
*/
-PHP_HASH_API void PHP_SHA512_256Init(PHP_SHA512_CTX * context)
+PHP_HASH_API void PHP_SHA512_256InitArgs(PHP_SHA512_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
@@ -641,10 +641,10 @@ PHP_HASH_API void PHP_SHA512_256Init(PHP_SHA512_CTX * context)
}
/* }}} */
-/* {{{ PHP_SHA512_224Init
+/* {{{ PHP_SHA512_224InitArgs
* SHA512/224 initialization. Identical algorithm to SHA512, using alternate initval and truncation
*/
-PHP_HASH_API void PHP_SHA512_224Init(PHP_SHA512_CTX * context)
+PHP_HASH_API void PHP_SHA512_224InitArgs(PHP_SHA512_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
@@ -768,7 +768,7 @@ PHP_HASH_API void PHP_SHA512_224Final(unsigned char digest[28], PHP_SHA512_CTX *
const php_hash_ops php_hash_sha512_ops = {
"sha512",
- (php_hash_init_func_t) PHP_SHA512Init,
+ (php_hash_init_func_t) PHP_SHA512InitArgs,
(php_hash_update_func_t) PHP_SHA512Update,
(php_hash_final_func_t) PHP_SHA512Final,
php_hash_copy,
@@ -783,7 +783,7 @@ const php_hash_ops php_hash_sha512_ops = {
const php_hash_ops php_hash_sha512_256_ops = {
"sha512/256",
- (php_hash_init_func_t) PHP_SHA512_256Init,
+ (php_hash_init_func_t) PHP_SHA512_256InitArgs,
(php_hash_update_func_t) PHP_SHA512_256Update,
(php_hash_final_func_t) PHP_SHA512_256Final,
php_hash_copy,
@@ -798,7 +798,7 @@ const php_hash_ops php_hash_sha512_256_ops = {
const php_hash_ops php_hash_sha512_224_ops = {
"sha512/224",
- (php_hash_init_func_t) PHP_SHA512_224Init,
+ (php_hash_init_func_t) PHP_SHA512_224InitArgs,
(php_hash_update_func_t) PHP_SHA512_224Update,
(php_hash_final_func_t) PHP_SHA512_224Final,
php_hash_copy,
diff --git a/ext/hash/hash_sha3.c b/ext/hash/hash_sha3.c
index 52bd495f9d..123e599d04 100644
--- a/ext/hash/hash_sha3.c
+++ b/ext/hash/hash_sha3.c
@@ -220,7 +220,7 @@ static int php_sha3_unserialize(php_hashcontext_object *hash,
// ==========================================================================
#define DECLARE_SHA3_OPS(bits) \
-void PHP_SHA3##bits##Init(PHP_SHA3_##bits##_CTX* ctx) { \
+void PHP_SHA3##bits##Init(PHP_SHA3_##bits##_CTX* ctx, ZEND_ATTRIBUTE_UNUSED HashTable *args) { \
PHP_SHA3_Init(ctx, bits); \
} \
void PHP_SHA3##bits##Update(PHP_SHA3_##bits##_CTX* ctx, \
@@ -315,7 +315,7 @@ static int php_keccak_unserialize(php_hashcontext_object *hash, zend_long magic,
// ==========================================================================
#define DECLARE_SHA3_OPS(bits) \
-void PHP_SHA3##bits##Init(PHP_SHA3_##bits##_CTX* ctx) { \
+void PHP_SHA3##bits##Init(PHP_SHA3_##bits##_CTX* ctx, ZEND_ATTRIBUTE_UNUSED HashTable *args) { \
ZEND_ASSERT(sizeof(Keccak_HashInstance) <= sizeof(PHP_SHA3_##bits##_CTX)); \
Keccak_HashInitialize_SHA3_##bits((Keccak_HashInstance *)ctx); \
} \
diff --git a/ext/hash/hash_snefru.c b/ext/hash/hash_snefru.c
index 292bfef2cb..66f9300b11 100644
--- a/ext/hash/hash_snefru.c
+++ b/ext/hash/hash_snefru.c
@@ -128,7 +128,7 @@ static inline void SnefruTransform(PHP_SNEFRU_CTX *context, const unsigned char
ZEND_SECURE_ZERO(&context->state[8], sizeof(uint32_t) * 8);
}
-PHP_HASH_API void PHP_SNEFRUInit(PHP_SNEFRU_CTX *context)
+PHP_HASH_API void PHP_SNEFRUInit(PHP_SNEFRU_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
memset(context, 0, sizeof(*context));
}
diff --git a/ext/hash/hash_tiger.c b/ext/hash/hash_tiger.c
index 8e0f365dc4..b360dd6ade 100644
--- a/ext/hash/hash_tiger.c
+++ b/ext/hash/hash_tiger.c
@@ -174,7 +174,7 @@ static inline void TigerDigest(unsigned char *digest_str, unsigned int digest_le
}
}
-PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context)
+PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
memset(context, 0, sizeof(*context));
context->state[0] = L64(0x0123456789ABCDEF);
@@ -182,7 +182,7 @@ PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context)
context->state[2] = L64(0xF096A5B4C3B2E187);
}
-PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context)
+PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
memset(context, 0, sizeof(*context));
context->passes = 1;
diff --git a/ext/hash/hash_whirlpool.c b/ext/hash/hash_whirlpool.c
index 8d5cbb7737..2a64e864c1 100644
--- a/ext/hash/hash_whirlpool.c
+++ b/ext/hash/hash_whirlpool.c
@@ -263,7 +263,7 @@ static void WhirlpoolTransform(PHP_WHIRLPOOL_CTX *context)
ZEND_SECURE_ZERO(state, sizeof(state));
}
-PHP_HASH_API void PHP_WHIRLPOOLInit(PHP_WHIRLPOOL_CTX *context)
+PHP_HASH_API void PHP_WHIRLPOOLInit(PHP_WHIRLPOOL_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
memset(context, 0, sizeof(*context));
}
diff --git a/ext/hash/hash_xxhash.c b/ext/hash/hash_xxhash.c
new file mode 100644
index 0000000000..15e3c1f9e1
--- /dev/null
+++ b/ext/hash/hash_xxhash.c
@@ -0,0 +1,266 @@
+/*
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Anatol Belski <ab@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+#include "php_hash.h"
+#include "php_hash_xxhash.h"
+
+static int php_hash_xxh32_unserialize(
+ php_hashcontext_object *hash, zend_long magic, const zval *zv);
+static int php_hash_xxh64_unserialize(
+ php_hashcontext_object *hash, zend_long magic, const zval *zv);
+
+const php_hash_ops php_hash_xxh32_ops = {
+ "xxh32",
+ (php_hash_init_func_t) PHP_XXH32Init,
+ (php_hash_update_func_t) PHP_XXH32Update,
+ (php_hash_final_func_t) PHP_XXH32Final,
+ (php_hash_copy_func_t) PHP_XXH32Copy,
+ php_hash_serialize,
+ php_hash_xxh32_unserialize,
+ PHP_XXH32_SPEC,
+ 4,
+ 4,
+ sizeof(PHP_XXH32_CTX),
+ 0
+};
+
+PHP_HASH_API void PHP_XXH32Init(PHP_XXH32_CTX *ctx, HashTable *args)
+{
+ /* XXH32_createState() is not used intentionally. */
+ memset(&ctx->s, 0, sizeof ctx->s);
+
+ if (args) {
+ zval *seed = zend_hash_str_find_deref(args, "seed", sizeof("seed") - 1);
+ /* This might be a bit too restrictive, but thinking that a seed might be set
+ once and for all, it should be done a clean way. */
+ if (seed && IS_LONG == Z_TYPE_P(seed)) {
+ XXH32_reset(&ctx->s, (XXH32_hash_t)Z_LVAL_P(seed));
+ } else {
+ XXH32_reset(&ctx->s, 0);
+ }
+ } else {
+ XXH32_reset(&ctx->s, 0);
+ }
+}
+
+PHP_HASH_API void PHP_XXH32Update(PHP_XXH32_CTX *ctx, const unsigned char *in, size_t len)
+{
+ XXH32_update(&ctx->s, in, len);
+}
+
+PHP_HASH_API void PHP_XXH32Final(unsigned char digest[4], PHP_XXH32_CTX *ctx)
+{
+ XXH32_canonicalFromHash((XXH32_canonical_t*)digest, XXH32_digest(&ctx->s));
+}
+
+PHP_HASH_API int PHP_XXH32Copy(const php_hash_ops *ops, PHP_XXH32_CTX *orig_context, PHP_XXH32_CTX *copy_context)
+{
+ copy_context->s = orig_context->s;
+ return SUCCESS;
+}
+
+static int php_hash_xxh32_unserialize(
+ php_hashcontext_object *hash, zend_long magic, const zval *zv)
+{
+ PHP_XXH32_CTX *ctx = (PHP_XXH32_CTX *) hash->context;
+ int r = FAILURE;
+ if (magic == PHP_HASH_SERIALIZE_MAGIC_SPEC
+ && (r = php_hash_unserialize_spec(hash, zv, PHP_XXH32_SPEC)) == SUCCESS
+ && ctx->s.memsize < 16) {
+ return SUCCESS;
+ } else {
+ return r != SUCCESS ? r : -2000;
+ }
+}
+
+const php_hash_ops php_hash_xxh64_ops = {
+ "xxh64",
+ (php_hash_init_func_t) PHP_XXH64Init,
+ (php_hash_update_func_t) PHP_XXH64Update,
+ (php_hash_final_func_t) PHP_XXH64Final,
+ (php_hash_copy_func_t) PHP_XXH64Copy,
+ php_hash_serialize,
+ php_hash_xxh64_unserialize,
+ PHP_XXH64_SPEC,
+ 8,
+ 8,
+ sizeof(PHP_XXH64_CTX),
+ 0
+};
+
+PHP_HASH_API void PHP_XXH64Init(PHP_XXH64_CTX *ctx, HashTable *args)
+{
+ /* XXH64_createState() is not used intentionally. */
+ memset(&ctx->s, 0, sizeof ctx->s);
+
+ if (args) {
+ zval *seed = zend_hash_str_find_deref(args, "seed", sizeof("seed") - 1);
+ /* This might be a bit too restrictive, but thinking that a seed might be set
+ once and for all, it should be done a clean way. */
+ if (seed && IS_LONG == Z_TYPE_P(seed)) {
+ XXH64_reset(&ctx->s, (XXH64_hash_t)Z_LVAL_P(seed));
+ } else {
+ XXH64_reset(&ctx->s, 0);
+ }
+ } else {
+ XXH64_reset(&ctx->s, 0);
+ }
+}
+
+PHP_HASH_API void PHP_XXH64Update(PHP_XXH64_CTX *ctx, const unsigned char *in, size_t len)
+{
+ XXH64_update(&ctx->s, in, len);
+}
+
+PHP_HASH_API void PHP_XXH64Final(unsigned char digest[8], PHP_XXH64_CTX *ctx)
+{
+ XXH64_canonicalFromHash((XXH64_canonical_t*)digest, XXH64_digest(&ctx->s));
+}
+
+PHP_HASH_API int PHP_XXH64Copy(const php_hash_ops *ops, PHP_XXH64_CTX *orig_context, PHP_XXH64_CTX *copy_context)
+{
+ copy_context->s = orig_context->s;
+ return SUCCESS;
+}
+
+const php_hash_ops php_hash_xxh3_64_ops = {
+ "xxh3",
+ (php_hash_init_func_t) PHP_XXH3_64_Init,
+ (php_hash_update_func_t) PHP_XXH3_64_Update,
+ (php_hash_final_func_t) PHP_XXH3_64_Final,
+ (php_hash_copy_func_t) PHP_XXH3_64_Copy,
+ php_hash_serialize,
+ php_hash_unserialize,
+ NULL,
+ 8,
+ 8,
+ sizeof(PHP_XXH3_64_CTX),
+ 0
+};
+
+typedef XXH_errorcode (*xxh3_reset_with_secret_func_t)(XXH3_state_t*, const void*, size_t);
+typedef XXH_errorcode (*xxh3_reset_with_seed_func_t)(XXH3_state_t*, XXH64_hash_t);
+
+zend_always_inline static void _PHP_XXH3_Init(PHP_XXH3_64_CTX *ctx, HashTable *args,
+ xxh3_reset_with_seed_func_t func_init_seed, xxh3_reset_with_secret_func_t func_init_secret, const char* algo_name)
+{
+ memset(&ctx->s, 0, sizeof ctx->s);
+
+ if (args) {
+ zval *_seed = zend_hash_str_find_deref(args, "seed", sizeof("seed") - 1);
+ zval *_secret = zend_hash_str_find_deref(args, "secret", sizeof("secret") - 1);
+
+ if (_seed && _secret) {
+ zend_throw_error(NULL, "%s: Only one of seed or secret is to be passed for initialization", algo_name);
+ return;
+ }
+
+ if (_seed && IS_LONG == Z_TYPE_P(_seed)) {
+ /* This might be a bit too restrictive, but thinking that a seed might be set
+ once and for all, it should be done a clean way. */
+ func_init_seed(&ctx->s, (XXH64_hash_t)Z_LVAL_P(_seed));
+ return;
+ } else if (_secret) {
+ convert_to_string(_secret);
+ size_t len = Z_STRLEN_P(_secret);
+ if (len < PHP_XXH3_SECRET_SIZE_MIN) {
+ zend_throw_error(NULL, "%s: Secret length must be >= %u bytes, %zu bytes passed", algo_name, XXH3_SECRET_SIZE_MIN, len);
+ return;
+ }
+ if (len > sizeof(ctx->secret)) {
+ len = sizeof(ctx->secret);
+ php_error_docref(NULL, E_WARNING, "%s: Secret content exceeding %zu bytes discarded", algo_name, sizeof(ctx->secret));
+ }
+ memcpy((unsigned char *)ctx->secret, Z_STRVAL_P(_secret), len);
+ func_init_secret(&ctx->s, ctx->secret, len);
+ return;
+ }
+ }
+
+ func_init_seed(&ctx->s, 0);
+}
+
+PHP_HASH_API void PHP_XXH3_64_Init(PHP_XXH3_64_CTX *ctx, HashTable *args)
+{
+ _PHP_XXH3_Init(ctx, args, XXH3_64bits_reset_withSeed, XXH3_64bits_reset_withSecret, "xxh3");
+}
+
+PHP_HASH_API void PHP_XXH3_64_Update(PHP_XXH3_64_CTX *ctx, const unsigned char *in, size_t len)
+{
+ XXH3_64bits_update(&ctx->s, in, len);
+}
+
+PHP_HASH_API void PHP_XXH3_64_Final(unsigned char digest[8], PHP_XXH3_64_CTX *ctx)
+{
+ XXH64_canonicalFromHash((XXH64_canonical_t*)digest, XXH3_64bits_digest(&ctx->s));
+}
+
+PHP_HASH_API int PHP_XXH3_64_Copy(const php_hash_ops *ops, PHP_XXH3_64_CTX *orig_context, PHP_XXH3_64_CTX *copy_context)
+{
+ copy_context->s = orig_context->s;
+ return SUCCESS;
+}
+
+static int php_hash_xxh64_unserialize(
+ php_hashcontext_object *hash, zend_long magic, const zval *zv)
+{
+ PHP_XXH64_CTX *ctx = (PHP_XXH64_CTX *) hash->context;
+ int r = FAILURE;
+ if (magic == PHP_HASH_SERIALIZE_MAGIC_SPEC
+ && (r = php_hash_unserialize_spec(hash, zv, PHP_XXH64_SPEC)) == SUCCESS
+ && ctx->s.memsize < 32) {
+ return SUCCESS;
+ } else {
+ return r != SUCCESS ? r : -2000;
+ }
+}
+
+const php_hash_ops php_hash_xxh3_128_ops = {
+ "xxh128",
+ (php_hash_init_func_t) PHP_XXH3_128_Init,
+ (php_hash_update_func_t) PHP_XXH3_128_Update,
+ (php_hash_final_func_t) PHP_XXH3_128_Final,
+ (php_hash_copy_func_t) PHP_XXH3_128_Copy,
+ php_hash_serialize,
+ php_hash_unserialize,
+ NULL,
+ 16,
+ 8,
+ sizeof(PHP_XXH3_128_CTX),
+ 0
+};
+
+PHP_HASH_API void PHP_XXH3_128_Init(PHP_XXH3_128_CTX *ctx, HashTable *args)
+{
+ _PHP_XXH3_Init(ctx, args, XXH3_128bits_reset_withSeed, XXH3_128bits_reset_withSecret, "xxh128");
+}
+
+PHP_HASH_API void PHP_XXH3_128_Update(PHP_XXH3_128_CTX *ctx, const unsigned char *in, size_t len)
+{
+ XXH3_128bits_update(&ctx->s, in, len);
+}
+
+PHP_HASH_API void PHP_XXH3_128_Final(unsigned char digest[16], PHP_XXH3_128_CTX *ctx)
+{
+ XXH128_canonicalFromHash((XXH128_canonical_t*)digest, XXH3_128bits_digest(&ctx->s));
+}
+
+PHP_HASH_API int PHP_XXH3_128_Copy(const php_hash_ops *ops, PHP_XXH3_128_CTX *orig_context, PHP_XXH3_128_CTX *copy_context)
+{
+ copy_context->s = orig_context->s;
+ return SUCCESS;
+}
+
diff --git a/ext/hash/murmur/PMurHash.c b/ext/hash/murmur/PMurHash.c
new file mode 100644
index 0000000000..0716ca13c8
--- /dev/null
+++ b/ext/hash/murmur/PMurHash.c
@@ -0,0 +1,226 @@
+/*-----------------------------------------------------------------------------
+ * MurmurHash3 was written by Austin Appleby, and is placed in the public
+ * domain.
+ *
+ * This implementation was written by Shane Day, and is also public domain.
+ *
+ * This is a portable ANSI C implementation of MurmurHash3_x86_32 (Murmur3A)
+ * with support for progressive processing.
+ */
+
+/*-----------------------------------------------------------------------------
+
+If you want to understand the MurmurHash algorithm you would be much better
+off reading the original source. Just point your browser at:
+http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
+
+
+What this version provides?
+
+1. Progressive data feeding. Useful when the entire payload to be hashed
+does not fit in memory or when the data is streamed through the application.
+Also useful when hashing a number of strings with a common prefix. A partial
+hash of a prefix string can be generated and reused for each suffix string.
+
+How does it work?
+
+We can only process entire 32 bit chunks of input, except for the very end
+that may be shorter. So along with the partial hash we need to give back to
+the caller a carry containing up to 3 bytes that we were unable to process.
+This carry also needs to record the number of bytes the carry holds. I use
+the low 2 bits as a count (0..3) and the carry bytes are shifted into the
+high byte in stream order.
+
+To handle endianess I simply use a macro that reads a uint32_t and define
+that macro to be a direct read on little endian machines, a read and swap
+on big endian machines, or a byte-by-byte read if the endianess is unknown.
+
+-----------------------------------------------------------------------------*/
+
+
+#include "PMurHash.h"
+
+// /* MSVC warnings we choose to ignore */
+// #if defined(_MSC_VER)
+// #pragma warning(disable: 4127) /* conditional expression is constant */
+// #endif
+
+/*-----------------------------------------------------------------------------
+ * Endianess, misalignment capabilities and util macros
+ *
+ * The following 3 macros are defined in this section. The other macros defined
+ * are only needed to help derive these 3.
+ *
+ * READ_UINT32(x) Read a little endian unsigned 32-bit int
+ * UNALIGNED_SAFE Defined if READ_UINT32 works on non-word boundaries
+ * ROTL32(x,r) Rotate x left by r bits
+ */
+
+/* I386 or AMD64 */
+#if defined(_M_I86) || defined(_M_IX86) || defined(_X86_) || defined(__i386__) || defined(__i386) || defined(i386) \
+ || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) || defined(__amd64)
+ #define UNALIGNED_SAFE
+#endif
+/* I386 or AMD64 */
+#if defined(_M_I86) || defined(_M_IX86) || defined(_X86_) || defined(__i386__) || defined(__i386) || defined(i386) \
+ || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) || defined(__amd64)
+ #define UNALIGNED_SAFE
+#endif
+
+/* Find best way to ROTL */
+#if defined(_MSC_VER)
+ #define FORCE_INLINE static __forceinline
+ #include <stdlib.h> /* Microsoft put _rotl declaration in here */
+ #define ROTL32(x,y) _rotl(x,y)
+#else
+ #define FORCE_INLINE static inline __attribute__((always_inline))
+ /* gcc recognises this code and generates a rotate instruction for CPUs with one */
+ #define ROTL32(x,r) (((uint32_t)x << r) | ((uint32_t)x >> (32 - r)))
+#endif
+
+#include "endianness.h"
+
+#define READ_UINT32(ptr) getblock32((uint32_t *)ptr, 0)
+
+/*-----------------------------------------------------------------------------
+ * Core murmurhash algorithm macros */
+
+static const uint32_t kC1 = 0xcc9e2d51;
+static const uint32_t kC2 = 0x1b873593;
+
+/* This is the main processing body of the algorithm. It operates
+ * on each full 32-bits of input. */
+#define doblock(h1, k1) \
+do {\
+ k1 *= kC1;\
+ k1 = ROTL32(k1,15);\
+ k1 *= kC2;\
+\
+ h1 ^= k1;\
+ h1 = ROTL32(h1,13);\
+ h1 = h1*5+0xe6546b64;\
+} while(0)
+
+/* Append unaligned bytes to carry, forcing hash churn if we have 4 bytes */
+/* cnt=bytes to process, h1=name of h1 var, c=carry, n=bytes in c, ptr/len=payload */
+#define dobytes(cnt, h1, c, n, ptr, len) \
+do {\
+ unsigned __cnt = cnt;\
+ while(__cnt--) {\
+ c = c>>8 | (uint32_t)*ptr++<<24;\
+ n++; len--;\
+ if(n==4) {\
+ doblock(h1, c);\
+ n = 0;\
+ }\
+ }\
+} while(0)
+
+/*---------------------------------------------------------------------------*/
+
+/* Main hashing function. Initialise carry to 0 and h1 to 0 or an initial seed
+ * if wanted. Both ph1 and pcarry are required arguments. */
+void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int len)
+{
+ uint32_t h1 = *ph1;
+ uint32_t c = *pcarry;
+
+ const uint8_t *ptr = (uint8_t*)key;
+ const uint8_t *end;
+
+ /* Extract carry count from low 2 bits of c value */
+ int n = c & 3;
+
+#if defined(UNALIGNED_SAFE)
+ /* This CPU handles unaligned word access */
+// #pragma message ( "UNALIGNED_SAFE" )
+ /* Consume any carry bytes */
+ int i = (4-n) & 3;
+ if(i && i <= len) {
+ dobytes(i, h1, c, n, ptr, len);
+ }
+
+ /* Process 32-bit chunks */
+ end = ptr + (len & ~3);
+ for( ; ptr < end ; ptr+=4) {
+ uint32_t k1 = READ_UINT32(ptr);
+ doblock(h1, k1);
+ }
+
+#else /*UNALIGNED_SAFE*/
+ /* This CPU does not handle unaligned word access */
+// #pragma message ( "ALIGNED" )
+ /* Consume enough so that the next data byte is word aligned */
+ int i = -(intptr_t)(void *)ptr & 3;
+ if(i && i <= len) {
+ dobytes(i, h1, c, n, ptr, len);
+ }
+
+ /* We're now aligned. Process in aligned blocks. Specialise for each possible carry count */
+ end = ptr + (len & ~3);
+ switch(n) { /* how many bytes in c */
+ case 0: /* c=[----] w=[3210] b=[3210]=w c'=[----] */
+ for( ; ptr < end ; ptr+=4) {
+ uint32_t k1 = READ_UINT32(ptr);
+ doblock(h1, k1);
+ }
+ break;
+ case 1: /* c=[0---] w=[4321] b=[3210]=c>>24|w<<8 c'=[4---] */
+ for( ; ptr < end ; ptr+=4) {
+ uint32_t k1 = c>>24;
+ c = READ_UINT32(ptr);
+ k1 |= c<<8;
+ doblock(h1, k1);
+ }
+ break;
+ case 2: /* c=[10--] w=[5432] b=[3210]=c>>16|w<<16 c'=[54--] */
+ for( ; ptr < end ; ptr+=4) {
+ uint32_t k1 = c>>16;
+ c = READ_UINT32(ptr);
+ k1 |= c<<16;
+ doblock(h1, k1);
+ }
+ break;
+ case 3: /* c=[210-] w=[6543] b=[3210]=c>>8|w<<24 c'=[654-] */
+ for( ; ptr < end ; ptr+=4) {
+ uint32_t k1 = c>>8;
+ c = READ_UINT32(ptr);
+ k1 |= c<<24;
+ doblock(h1, k1);
+ }
+ }
+#endif /*UNALIGNED_SAFE*/
+
+ /* Advance over whole 32-bit chunks, possibly leaving 1..3 bytes */
+ len -= len & ~3;
+
+ /* Append any remaining bytes into carry */
+ dobytes(len, h1, c, n, ptr, len);
+
+ /* Copy out new running hash and carry */
+ *ph1 = h1;
+ *pcarry = (c & ~0xff) | n;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* Finalize a hash. To match the original Murmur3A the total_length must be provided */
+uint32_t PMurHash32_Result(uint32_t h, uint32_t carry, uint32_t total_length)
+{
+ uint32_t k1;
+ int n = carry & 3;
+ if(n) {
+ k1 = carry >> (4-n)*8;
+ k1 *= kC1; k1 = ROTL32(k1,15); k1 *= kC2; h ^= k1;
+ }
+ h ^= total_length;
+
+ /* fmix */
+ h ^= h >> 16;
+ h *= 0x85ebca6b;
+ h ^= h >> 13;
+ h *= 0xc2b2ae35;
+ h ^= h >> 16;
+
+ return h;
+}
diff --git a/ext/hash/murmur/PMurHash.h b/ext/hash/murmur/PMurHash.h
new file mode 100644
index 0000000000..f80eb11f40
--- /dev/null
+++ b/ext/hash/murmur/PMurHash.h
@@ -0,0 +1,31 @@
+/*-----------------------------------------------------------------------------
+ * MurmurHash3 was written by Austin Appleby, and is placed in the public
+ * domain.
+ *
+ * This implementation was written by Shane Day, and is also public domain.
+ *
+ * This implementation was modified to match PMurHash128.cpp.
+ */
+
+/* ------------------------------------------------------------------------- */
+
+// Microsoft Visual Studio
+
+#if defined(_MSC_VER) && (_MSC_VER < 1600)
+
+typedef unsigned char uint8_t;
+typedef unsigned int uint32_t;
+
+// Other compilers
+
+#else // defined(_MSC_VER)
+
+#include <stdint.h>
+
+#endif // !defined(_MSC_VER)
+
+/* ------------------------------------------------------------------------- */
+/* Prototypes */
+
+void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int len);
+uint32_t PMurHash32_Result(uint32_t h1, uint32_t carry, uint32_t total_length);
diff --git a/ext/hash/murmur/PMurHash128.c b/ext/hash/murmur/PMurHash128.c
new file mode 100644
index 0000000000..2856542190
--- /dev/null
+++ b/ext/hash/murmur/PMurHash128.c
@@ -0,0 +1,640 @@
+/*-----------------------------------------------------------------------------
+ * MurmurHash3 was written by Austin Appleby, and is placed in the public
+ * domain.
+ *
+ * This is a c++ implementation of MurmurHash3_128 with support for progressive
+ * processing based on PMurHash implementation written by Shane Day.
+ */
+
+/*-----------------------------------------------------------------------------
+
+If you want to understand the MurmurHash algorithm you would be much better
+off reading the original source. Just point your browser at:
+http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
+
+
+What this version provides?
+
+1. Progressive data feeding. Useful when the entire payload to be hashed
+does not fit in memory or when the data is streamed through the application.
+Also useful when hashing a number of strings with a common prefix. A partial
+hash of a prefix string can be generated and reused for each suffix string.
+
+How does it work?
+
+We can only process entire 128 bit chunks of input, except for the very end
+that may be shorter. So along with the partial hash we need to give back to
+the caller a carry containing up to 15 bytes that we were unable to process.
+This carry also needs to record the number of bytes the carry holds. I use
+the low 4 bits as a count (0..15) and the carry bytes are shifted into the
+high byte in stream order.
+
+To handle endianess I simply use a macro that reads an uint and define
+that macro to be a direct read on little endian machines, a read and swap
+on big endian machines.
+
+-----------------------------------------------------------------------------*/
+
+
+#include "PMurHash128.h"
+
+/*-----------------------------------------------------------------------------
+ * Endianess, misalignment capabilities and util macros
+ *
+ * The following 5 macros are defined in this section. The other macros defined
+ * are only needed to help derive these 5.
+ *
+ * READ_UINT32(x,i) Read a little endian unsigned 32-bit int at index
+ * READ_UINT64(x,i) Read a little endian unsigned 64-bit int at index
+ * UNALIGNED_SAFE Defined if READ_UINTXX works on non-word boundaries
+ * ROTL32(x,r) Rotate x left by r bits
+ * ROTL64(x,r) Rotate x left by r bits
+ * BIG_CONSTANT
+ * FORCE_INLINE
+ */
+
+/* I386 or AMD64 */
+#if defined(_M_I86) || defined(_M_IX86) || defined(_X86_) || defined(__i386__) || defined(__i386) || defined(i386) \
+ || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) || defined(__amd64)
+ #define UNALIGNED_SAFE
+#endif
+
+/* Find best way to ROTL */
+#if defined(_MSC_VER)
+ #define FORCE_INLINE static __forceinline
+ #include <stdlib.h> /* Microsoft put _rotl declaration in here */
+ #define ROTL32(x,y) _rotl(x,y)
+ #define ROTL64(x,y) _rotl64(x,y)
+ #define BIG_CONSTANT(x) (x)
+#else
+ #define FORCE_INLINE static inline __attribute__((always_inline))
+ /* gcc recognises this code and generates a rotate instruction for CPUs with one */
+ #define ROTL32(x,r) (((uint32_t)x << r) | ((uint32_t)x >> (32 - r)))
+ #define ROTL64(x,r) (((uint64_t)x << r) | ((uint64_t)x >> (64 - r)))
+ #define BIG_CONSTANT(x) (x##LLU)
+#endif
+
+#include "endianness.h"
+
+#define READ_UINT64(ptr,i) getblock64((uint64_t *)ptr,i)
+#define READ_UINT32(ptr,i) getblock32((uint32_t *)ptr,i)
+
+//-----------------------------------------------------------------------------
+// Finalization mix - force all bits of a hash block to avalanche
+
+FORCE_INLINE uint32_t fmix32 ( uint32_t h )
+{
+ h ^= h >> 16;
+ h *= 0x85ebca6b;
+ h ^= h >> 13;
+ h *= 0xc2b2ae35;
+ h ^= h >> 16;
+
+ return h;
+}
+
+//----------
+
+FORCE_INLINE uint64_t fmix64 ( uint64_t k )
+{
+ k ^= k >> 33;
+ k *= BIG_CONSTANT(0xff51afd7ed558ccd);
+ k ^= k >> 33;
+ k *= BIG_CONSTANT(0xc4ceb9fe1a85ec53);
+ k ^= k >> 33;
+
+ return k;
+}
+
+/*-----------------------------------------------------------------------------*
+ PMurHash128x86
+ *-----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------------
+ * Core murmurhash algorithm macros */
+
+static const uint32_t kC1 = 0x239b961b;
+static const uint32_t kC2 = 0xab0e9789;
+static const uint32_t kC3 = 0x38b34ae5;
+static const uint32_t kC4 = 0xa1e38b93;
+
+/* This is the main processing body of the algorithm. It operates
+ * on each full 128-bits of input. */
+#define doblock128x86(h1, h2, h3, h4, k1, k2, k3,k4)\
+do {\
+ k1 *= kC1; k1 = ROTL32(k1,15); k1 *= kC2; h1 ^= k1;\
+\
+ h1 = ROTL32(h1,19); h1 += h2; h1 = h1*5+0x561ccd1b;\
+\
+ k2 *= kC2; k2 = ROTL32(k2,16); k2 *= kC3; h2 ^= k2;\
+\
+ h2 = ROTL32(h2,17); h2 += h3; h2 = h2*5+0x0bcaa747;\
+\
+ k3 *= kC3; k3 = ROTL32(k3,17); k3 *= kC4; h3 ^= k3;\
+\
+ h3 = ROTL32(h3,15); h3 += h4; h3 = h3*5+0x96cd1c35;\
+\
+ k4 *= kC4; k4 = ROTL32(k4,18); k4 *= kC1; h4 ^= k4;\
+\
+ h4 = ROTL32(h4,13); h4 += h1; h4 = h4*5+0x32ac3b17;\
+} while(0)
+
+/* Append unaligned bytes to carry, forcing hash churn if we have 16 bytes */
+/* cnt=bytes to process, h1-h4=hash k1-k4=carry, n=bytes in carry, ptr/len=payload */
+#define dobytes128x86(cnt, h1, h2, h3, h4, k1, k2, k3, k4, n, ptr, len)\
+do {\
+ unsigned __cnt = cnt;\
+ for(;__cnt--; len--) {\
+ switch(n) {\
+ case 0: case 1: case 2: case 3:\
+ k1 = k1>>8 | (uint32_t)*ptr++<<24;\
+ ++n; break;\
+\
+ case 4: case 5: case 6: case 7:\
+ k2 = k2>>8 | (uint32_t)*ptr++<<24;\
+ ++n; break;\
+\
+ case 8: case 9: case 10: case 11:\
+ k3 = k3>>8 | (uint32_t)*ptr++<<24;\
+ ++n; break;\
+\
+ case 12: case 13: case 14:\
+ k4 = k4>>8 | (uint32_t)*ptr++<<24;\
+ ++n; break;\
+\
+ case 15:\
+ k4 = k4>>8 | (uint32_t)*ptr++<<24;\
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);\
+ n = 0; break;\
+ }\
+ }\
+} while(0)
+
+/* Finalize a hash. To match the original Murmur3_128x86 the total_length must be provided */
+void PMurHash128x86_Result(const uint32_t *ph, const uint32_t *pcarry, uint32_t total_length, uint32_t *out)
+{
+ uint32_t h1 = ph[0];
+ uint32_t h2 = ph[1];
+ uint32_t h3 = ph[2];
+ uint32_t h4 = ph[3];
+
+ uint32_t k1, k2, k3, k4 = pcarry[3];
+
+ int n = k4 & 15;
+ switch(n) {
+ case 1: case 2: case 3: case 4:
+ k1 = pcarry[0] >> (4-n)*8;
+ goto finrot_k1;
+
+ case 5: case 6: case 7: case 8:
+ k2 = pcarry[1] >> (8-n)*8;
+ goto finrot_k21;
+
+ case 9: case 10: case 11: case 12:
+ k3 = pcarry[2] >> (12-n)*8;
+ goto finrot_k321;
+
+ case 13: case 14: case 15:
+ k4 >>= (16-n)*8;
+ goto finrot_k4321;
+
+ default:
+ goto skiprot;
+ }
+finrot_k4321:
+ k4 *= kC4; k4 = ROTL32(k4,18); k4 *= kC1; h4 ^= k4;
+ k3 = pcarry[2];
+finrot_k321:
+ k3 *= kC3; k3 = ROTL32(k3,17); k3 *= kC4; h3 ^= k3;
+ k2 = pcarry[1];
+finrot_k21:
+ k2 *= kC2; k2 = ROTL32(k2,16); k2 *= kC3; h2 ^= k2;
+ k1 = pcarry[0];
+finrot_k1:
+ k1 *= kC1; k1 = ROTL32(k1,15); k1 *= kC2; h1 ^= k1;
+skiprot:
+
+ //----------
+ // finalization
+
+ h1 ^= total_length; h2 ^= total_length;
+ h3 ^= total_length; h4 ^= total_length;
+
+ h1 += h2; h1 += h3; h1 += h4;
+ h2 += h1; h3 += h1; h4 += h1;
+
+ h1 = fmix32(h1);
+ h2 = fmix32(h2);
+ h3 = fmix32(h3);
+ h4 = fmix32(h4);
+
+ h1 += h2; h1 += h3; h1 += h4;
+ h2 += h1; h3 += h1; h4 += h1;
+
+ out[0] = h1;
+ out[1] = h2;
+ out[2] = h3;
+ out[3] = h4;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* Main hashing function. Initialise carry[4] to {0,0,0,0} and h[4] to an initial {seed,seed,seed,seed}
+ * if wanted. Both ph and pcarry are required arguments. */
+void PMurHash128x86_Process(uint32_t * const ph, uint32_t * const pcarry, const void * const key, int len)
+{
+ uint32_t h1 = ph[0];
+ uint32_t h2 = ph[1];
+ uint32_t h3 = ph[2];
+ uint32_t h4 = ph[3];
+
+ uint32_t k1 = pcarry[0];
+ uint32_t k2 = pcarry[1];
+ uint32_t k3 = pcarry[2];
+ uint32_t k4 = pcarry[3];
+
+ const uint8_t *ptr = (uint8_t*)key;
+ const uint8_t *end;
+
+ /* Extract carry count from low 4 bits of c value */
+ int n = k4 & 15;
+
+#if defined(UNALIGNED_SAFE)
+ /* This CPU handles unaligned word access */
+// #pragma message ( "UNALIGNED_SAFE" )
+ /* Consume any carry bytes */
+ int i = (16-n) & 15;
+ if(i && i <= len) {
+ dobytes128x86(i, h1, h2, h3, h4, k1, k2, k3, k4, n, ptr, len);
+ }
+
+ /* Process 128-bit chunks */
+ end = ptr + (len & ~15);
+ for( ; ptr < end ; ptr+=16) {
+ k1 = READ_UINT32(ptr, 0);
+ k2 = READ_UINT32(ptr, 1);
+ k3 = READ_UINT32(ptr, 2);
+ k4 = READ_UINT32(ptr, 3);
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);
+ }
+
+#else /*UNALIGNED_SAFE*/
+ /* This CPU does not handle unaligned word access */
+// #pragma message ( "ALIGNED" )
+ /* Consume enough so that the next data byte is word aligned */
+ int i = -(intptr_t)(void *)ptr & 3;
+ if(i && i <= len) {
+ dobytes128x86(i, h1, h2, h3, h4, k1, k2, k3, k4, n, ptr, len);
+ }
+ /* We're now aligned. Process in aligned blocks. Specialise for each possible carry count */
+ end = ptr + (len & ~15);
+
+ switch(n) { /* how many bytes in c */
+ case 0: /*
+ k1=[----] k2=[----] k2=[----] k4=[----] w=[3210 7654 ba98 fedc] b=[3210 7654 ba98 fedc] */
+ for( ; ptr < end ; ptr+=16) {
+ k1 = READ_UINT32(ptr, 0);
+ k2 = READ_UINT32(ptr, 1);
+ k3 = READ_UINT32(ptr, 2);
+ k4 = READ_UINT32(ptr, 3);
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);
+ }
+ break;
+ case 1: case 2: case 3: /*
+ k1=[10--] k2=[----] k3=[----] k4=[----] w=[5432 9876 dcba hgfe] b=[3210 7654 ba98 fedc] k1'=[hg--] */
+ {
+ const int lshift = n*8, rshift = 32-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint32_t c = k1>>rshift; // --10
+ k2 = READ_UINT32(ptr, 0); // 5432
+ c |= k2<<lshift; // 3210.
+ k1 = READ_UINT32(ptr, 1); // 9876
+ k2 = k1<<lshift | k2>>rshift; // 7654.
+ k4 = READ_UINT32(ptr, 2); // dcba
+ k3 = k4<<lshift | k1>>rshift; // ba98.
+ k1 = READ_UINT32(ptr, 3); // hgfe.
+ k4 = k1<<lshift | k4>>rshift; // fedc.
+ doblock128x86(h1, h2, h3, h4, c, k2, k3, k4);
+ }
+ }
+ break;
+ case 4: /*
+ k1=[3210] k2=[----] k3=[----] k4=[----] w=[7654 ba98 fedc jihg] b=[3210 7654 ba98 fedc] k1'=[jihg] */
+ for( ; ptr < end ; ptr+=16) {
+ k2 = READ_UINT32(ptr, 0);
+ k3 = READ_UINT32(ptr, 1);
+ k4 = READ_UINT32(ptr, 2);
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);
+ k1 = READ_UINT32(ptr, 3);
+ }
+ break;
+ case 5: case 6: case 7: /*
+ k1=[3210] k2=[54--] k3=[----] k4=[----] w=[9876 dcba hgfe lkji] b=[3210 7654 ba98 fedc] k1'=[jihg] k2'=[lk--] */
+ {
+ const int lshift = n*8-32, rshift = 32-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint32_t c = k2>>rshift; // --54
+ k3 = READ_UINT32(ptr, 0); // 9876
+ c |= k3<<lshift; // 7654.
+ k4 = READ_UINT32(ptr, 1); // dcba
+ k3 = k4<<lshift | k3>>rshift; // ba98.
+ k2 = READ_UINT32(ptr, 2); // hgfe
+ k4 = k2<<lshift | k4>>rshift; // fedc.
+ doblock128x86(h1, h2, h3, h4, k1, c, k3, k4);
+ k1 = k2>>rshift; // --hg
+ k2 = READ_UINT32(ptr, 3); // lkji.
+ k1 |= k2<<lshift; // jihg.
+ }
+ }
+ case 8: /*
+ k1=[3210] k2=[7654] k3=[----] k4=[----] w=[ba98 fedc jihg nmlk] b=[3210 7654 ba98 fedc] k1'=[jihg] k2'=[nmlk] */
+ for( ; ptr < end ; ptr+=16) {
+ k3 = READ_UINT32(ptr, 0);
+ k4 = READ_UINT32(ptr, 1);
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);
+ k1 = READ_UINT32(ptr, 2);
+ k2 = READ_UINT32(ptr, 3);
+ }
+ break;
+ case 9: case 10: case 11: /*
+ k1=[3210] k2=[7654] k3=[98--] k4=[----] w=[dcba hgfe lkji ponm] b=[3210 7654 ba98 fedc] k1'=[jihg] k2'=[nmlk] k3'=[po--] */
+ {
+ const int lshift = n*8-64, rshift = 32-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint32_t c = k3>>rshift; // --98
+ k4 = READ_UINT32(ptr, 0); // dcba
+ c |= k4<<lshift; // ba98.
+ k3 = READ_UINT32(ptr, 1); // hgfe
+ k4 = k3<<lshift | k4>>rshift; // fedc.
+ doblock128x86(h1, h2, h3, h4, k1, k2, c, k4);
+ k2 = READ_UINT32(ptr, 2); // lkji
+ k1 = k2<<lshift | k3>>rshift; // jihg.
+ k3 = READ_UINT32(ptr, 3); // ponm.
+ k2 = k3<<lshift | k2>>rshift; // nmlk.
+ }
+ }
+ case 12: /*
+ k1=[3210] k2=[7654] k3=[ba98] k4=[----] w=[fedc jihg nmlk rqpo] b=[3210 7654 ba98 fedc] k1'=[jihg] k2'=[nmlk] k3'=[rqpo] */
+ for( ; ptr < end ; ptr+=16) {
+ k4 = READ_UINT32(ptr, 0);
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);
+ k1 = READ_UINT32(ptr, 1);
+ k2 = READ_UINT32(ptr, 2);
+ k3 = READ_UINT32(ptr, 3);
+ }
+ break;
+ default: /* 12 < n <= 15
+ k1=[3210] k2=[7654] k3=[ba98] k4=[dc--] w=[hgfe lkji ponm tsrq] b=[3210 7654 ba98 fedc] k1'=[jihg] k2'=[nmlk] k3'=[rqpo] k3'=[ts--] */
+ {
+ const int lshift = n*8-96, rshift = 32-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint32_t c = k4>>rshift; // --dc
+ k4 = READ_UINT32(ptr, 0); // hgfe
+ c |= k4<<lshift; // fedc.
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, c);
+ k3 = READ_UINT32(ptr, 1); // lkji
+ k1 = k3<<lshift | k4>>rshift; // jihg.
+ c = READ_UINT32(ptr, 2); // ponm
+ k2 = c<<lshift | k3>>rshift; // nmlk.
+ k4 = READ_UINT32(ptr, 3); // tsrq.
+ k3 = k4<<lshift | c>>rshift; // rqpo.
+ }
+ }
+ }
+#endif /*UNALIGNED_SAFE*/
+
+ /* Advance over whole 128-bit chunks, possibly leaving 1..15 bytes */
+ len -= len & ~15;
+
+ /* Append any remaining bytes into carry */
+ dobytes128x86(len, h1, h2, h3, h4, k1, k2, k3, k4, n, ptr, len);
+
+ /* Copy out new running hash and carry */
+ ph[0] = h1;
+ ph[1] = h2;
+ ph[2] = h3;
+ ph[3] = h4;
+ pcarry[0] = k1;
+ pcarry[1] = k2;
+ pcarry[2] = k3;
+ pcarry[3] = (k4 & ~0xff) | n;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* All in one go */
+
+/* MurmurHash3_x86_128 api */
+void PMurHash128x86(const void * key, const int len, uint32_t seed, void * out)
+{
+ uint32_t carry[4] = {0, 0, 0, 0};
+ uint32_t h[4] = {seed, seed, seed, seed};
+ PMurHash128x86_Process(h, carry, key, len);
+ PMurHash128x86_Result(h, carry, (uint32_t) len, (uint32_t *) out);
+}
+
+/*-----------------------------------------------------------------------------*
+ PMurHash128x64
+ *-----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------------
+ * Core murmurhash algorithm macros */
+
+static const uint64_t kC1L = BIG_CONSTANT(0x87c37b91114253d5);
+static const uint64_t kC2L = BIG_CONSTANT(0x4cf5ad432745937f);
+
+/* This is the main processing body of the algorithm. It operates
+ * on each full 128-bits of input. */
+#define doblock128x64(h1, h2, k1, k2)\
+do {\
+ k1 *= kC1L; k1 = ROTL64(k1,31); k1 *= kC2L; h1 ^= k1;\
+\
+ h1 = ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729;\
+\
+ k2 *= kC2L; k2 = ROTL64(k2,33); k2 *= kC1L; h2 ^= k2;\
+\
+ h2 = ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5;\
+} while(0)
+
+/* Append unaligned bytes to carry, forcing hash churn if we have 16 bytes */
+/* cnt=bytes to process, h1,h2=hash k1,k2=carry, n=bytes in carry, ptr/len=payload */
+#define dobytes128x64(cnt, h1, h2, k1, k2, n, ptr, len) \
+do {\
+ unsigned __cnt = cnt;\
+ for(;__cnt--; len--) {\
+ switch(n) {\
+ case 0: case 1: case 2: case 3:\
+ case 4: case 5: case 6: case 7:\
+ k1 = k1>>8 | (uint64_t)*ptr++<<56;\
+ n++; break;\
+\
+ case 8: case 9: case 10: case 11:\
+ case 12: case 13: case 14:\
+ k2 = k2>>8 | (uint64_t)*ptr++<<56;\
+ n++; break;\
+\
+ case 15:\
+ k2 = k2>>8 | (uint64_t)*ptr++<<56;\
+ doblock128x64(h1, h2, k1, k2);\
+ n = 0; break;\
+ }\
+ }\
+} while(0)
+
+/* Finalize a hash. To match the original Murmur3_128x64 the total_length must be provided */
+void PMurHash128x64_Result(const uint64_t * const ph, const uint64_t * const pcarry,
+ const uint32_t total_length, uint64_t * const out)
+{
+ uint64_t h1 = ph[0];
+ uint64_t h2 = ph[1];
+
+ uint64_t k1;
+ uint64_t k2 = pcarry[1];
+
+ int n = k2 & 15;
+ if (n) {
+ k1 = pcarry[0];
+ if (n > 8) {
+ k2 >>= (16-n)*8;
+ k2 *= kC2L; k2 = ROTL64(k2,33); k2 *= kC1L; h2 ^= k2;
+ } else {
+ k1 >>= (8-n)*8;
+ }
+ k1 *= kC1L; k1 = ROTL64(k1,31); k1 *= kC2L; h1 ^= k1;
+ }
+
+ //----------
+ // finalization
+
+ h1 ^= total_length; h2 ^= total_length;
+
+ h1 += h2;
+ h2 += h1;
+
+ h1 = fmix64(h1);
+ h2 = fmix64(h2);
+
+ h1 += h2;
+ h2 += h1;
+
+ out[0] = h1;
+ out[1] = h2;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* Main hashing function. Initialise carry[2] to {0,0} and h[2] to an initial {seed,seed}
+ * if wanted. Both ph and pcarry are required arguments. */
+void PMurHash128x64_Process(uint64_t * const ph, uint64_t * const pcarry, const void * const key, int len)
+{
+ uint64_t h1 = ph[0];
+ uint64_t h2 = ph[1];
+
+ uint64_t k1 = pcarry[0];
+ uint64_t k2 = pcarry[1];
+
+ const uint8_t *ptr = (uint8_t*)key;
+ const uint8_t *end;
+
+ /* Extract carry count from low 4 bits of c value */
+ int n = k2 & 15;
+
+#if defined(UNALIGNED_SAFE)
+ /* This CPU handles unaligned word access */
+// #pragma message ( "UNALIGNED_SAFE" )
+ /* Consume any carry bytes */
+ int i = (16-n) & 15;
+ if(i && i <= len) {
+ dobytes128x64(i, h1, h2, k1, k2, n, ptr, len);
+ }
+
+ /* Process 128-bit chunks */
+ end = ptr + (len & ~15);
+ for( ; ptr < end ; ptr+=16) {
+ k1 = READ_UINT64(ptr, 0);
+ k2 = READ_UINT64(ptr, 1);
+ doblock128x64(h1, h2, k1, k2);
+ }
+
+#else /*UNALIGNED_SAFE*/
+ /* This CPU does not handle unaligned word access */
+// #pragma message ( "ALIGNED" )
+ /* Consume enough so that the next data byte is word aligned */
+ int i = -(intptr_t)(void *)ptr & 7;
+ if(i && i <= len) {
+ dobytes128x64(i, h1, h2, k1, k2, n, ptr, len);
+ }
+ /* We're now aligned. Process in aligned blocks. Specialise for each possible carry count */
+ end = ptr + (len & ~15);
+
+ switch(n) { /* how many bytes in c */
+ case 0: /*
+ k1=[--------] k2=[--------] w=[76543210 fedcba98] b=[76543210 fedcba98] */
+ for( ; ptr < end ; ptr+=16) {
+ k1 = READ_UINT64(ptr, 0);
+ k2 = READ_UINT64(ptr, 1);
+ doblock128x64(h1, h2, k1, k2);
+ }
+ break;
+ case 1: case 2: case 3: case 4: case 5: case 6: case 7: /*
+ k1=[10------] k2=[--------] w=[98765432 hgfedcba] b=[76543210 fedcba98] k1'=[hg------] */
+ {
+ const int lshift = n*8, rshift = 64-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint64_t c = k1>>rshift;
+ k2 = READ_UINT64(ptr, 0);
+ c |= k2<<lshift;
+ k1 = READ_UINT64(ptr, 1);
+ k2 = k2>>rshift | k1<<lshift;
+ doblock128x64(h1, h2, c, k2);
+ }
+ }
+ break;
+ case 8: /*
+ k1=[76543210] k2=[--------] w=[fedcba98 nmlkjihg] b=[76543210 fedcba98] k1`=[nmlkjihg] */
+ for( ; ptr < end ; ptr+=16) {
+ k2 = READ_UINT64(ptr, 0);
+ doblock128x64(h1, h2, k1, k2);
+ k1 = READ_UINT64(ptr, 1);
+ }
+ break;
+ default: /* 8 < n <= 15
+ k1=[76543210] k2=[98------] w=[hgfedcba ponmlkji] b=[76543210 fedcba98] k1`=[nmlkjihg] k2`=[po------] */
+ {
+ const int lshift = n*8-64, rshift = 64-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint64_t c = k2 >> rshift;
+ k2 = READ_UINT64(ptr, 0);
+ c |= k2 << lshift;
+ doblock128x64(h1, h2, k1, c);
+ k1 = k2 >> rshift;
+ k2 = READ_UINT64(ptr, 1);
+ k1 |= k2 << lshift;
+ }
+ }
+ }
+#endif /*UNALIGNED_SAFE*/
+
+ /* Advance over whole 128-bit chunks, possibly leaving 1..15 bytes */
+ len -= len & ~15;
+
+ /* Append any remaining bytes into carry */
+ dobytes128x64(len, h1, h2, k1, k2, n, ptr, len);
+
+ /* Copy out new running hash and carry */
+ ph[0] = h1;
+ ph[1] = h2;
+ pcarry[0] = k1;
+ pcarry[1] = (k2 & ~0xff) | n;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* All in one go */
+
+/* MurmurHash3_x64_128 api */
+void PMurHash128x64(const void * key, const int len, uint32_t seed, void * out)
+{
+ uint64_t carry[2] = {0, 0};
+ uint64_t h[2] = {seed, seed};
+ PMurHash128x64_Process(h, carry, key, len);
+ PMurHash128x64_Result(h, carry, (uint32_t) len, (uint64_t *) out);
+}
diff --git a/ext/hash/murmur/PMurHash128.h b/ext/hash/murmur/PMurHash128.h
new file mode 100644
index 0000000000..0d372ff355
--- /dev/null
+++ b/ext/hash/murmur/PMurHash128.h
@@ -0,0 +1,39 @@
+/*-----------------------------------------------------------------------------
+ * MurmurHash3 was written by Austin Appleby, and is placed in the public
+ * domain.
+ *
+ * This is a c++ implementation of MurmurHash3_128 with support for progressive
+ * processing based on PMurHash implementation written by Shane Day.
+ */
+
+/* ------------------------------------------------------------------------- */
+
+// Microsoft Visual Studio
+
+#if defined(_MSC_VER) && (_MSC_VER < 1600)
+
+typedef unsigned char uint8_t;
+typedef unsigned int uint32_t;
+typedef unsigned __int64 uint64_t;
+
+// Other compilers
+
+#else // defined(_MSC_VER)
+
+#include <stdint.h>
+
+#endif // !defined(_MSC_VER)
+
+/* ------------------------------------------------------------------------- */
+/* Formal prototypes */
+
+// PMurHash128x64
+void PMurHash128x64_Process(uint64_t ph[2], uint64_t pcarry[2], const void *key, int len);
+void PMurHash128x64_Result(const uint64_t ph[2], const uint64_t pcarry[2], uint32_t total_length, uint64_t out[2]);
+void PMurHash128x64(const void * key, const int len, uint32_t seed, void * out);
+
+// PMurHash128x86
+void PMurHash128x86_Process(uint32_t ph[4], uint32_t pcarry[4], const void *key, int len);
+void PMurHash128x86_Result(const uint32_t ph[4], const uint32_t pcarry[4], uint32_t total_length, uint32_t out[4]);
+void PMurHash128x86(const void * key, const int len, uint32_t seed, void * out);
+
diff --git a/ext/hash/murmur/endianness.h b/ext/hash/murmur/endianness.h
new file mode 100644
index 0000000000..3dbb2e6a3d
--- /dev/null
+++ b/ext/hash/murmur/endianness.h
@@ -0,0 +1,84 @@
+static const union {
+ uint8_t u8[2];
+ uint16_t u16;
+} EndianMix = {{ 1, 0 }};
+FORCE_INLINE int IsBigEndian()
+{
+ // Constant-folded by the compiler.
+ return EndianMix.u16 != 1;
+}
+
+#if defined(_MSC_VER)
+# include <stdlib.h>
+# define BSWAP32(u) _byteswap_ulong(u)
+# define BSWAP64(u) _byteswap_uint64(u)
+#else
+# ifdef __has_builtin
+# if __has_builtin(__builtin_bswap32)
+# define BSWAP32(u) __builtin_bswap32(u)
+# endif // __has_builtin(__builtin_bswap32)
+# if __has_builtin(__builtin_bswap64)
+# define BSWAP64(u) __builtin_bswap64(u)
+# endif // __has_builtin(__builtin_bswap64)
+# elif defined(__GNUC__) && ( \
+ __GNUC__ > 4 || ( \
+ __GNUC__ == 4 && ( \
+ __GNUC_MINOR__ >= 3 \
+ ) \
+ ) \
+ )
+# define BSWAP32(u) __builtin_bswap32(u)
+# define BSWAP64(u) __builtin_bswap64(u)
+# endif // __has_builtin
+#endif // defined(_MSC_VER)
+
+#ifndef BSWAP32
+FORCE_INLINE uint32_t BSWAP32(uint32_t u)
+{
+ return (((u & 0xff000000) >> 24)
+ | ((u & 0x00ff0000) >> 8)
+ | ((u & 0x0000ff00) << 8)
+ | ((u & 0x000000ff) << 24));
+}
+#endif
+#ifndef BSWAP64
+FORCE_INLINE uint64_t BSWAP64(uint64_t u)
+{
+ return (((u & 0xff00000000000000ULL) >> 56)
+ | ((u & 0x00ff000000000000ULL) >> 40)
+ | ((u & 0x0000ff0000000000ULL) >> 24)
+ | ((u & 0x000000ff00000000ULL) >> 8)
+ | ((u & 0x00000000ff000000ULL) << 8)
+ | ((u & 0x0000000000ff0000ULL) << 24)
+ | ((u & 0x000000000000ff00ULL) << 40)
+ | ((u & 0x00000000000000ffULL) << 56));
+}
+#endif
+
+#if defined(__clang__) || defined(__GNUC__) && __GNUC__ >= 8
+# define NO_SANITIZE_ALIGNMENT __attribute__((no_sanitize("alignment")))
+#else
+# define NO_SANITIZE_ALIGNMENT
+#endif
+
+NO_SANITIZE_ALIGNMENT
+FORCE_INLINE uint32_t getblock32 ( const uint32_t * const p, const int i)
+{
+ if (IsBigEndian()) {
+ return BSWAP32(p[i]);
+ } else {
+ return p[i];
+ }
+}
+
+NO_SANITIZE_ALIGNMENT
+FORCE_INLINE uint64_t getblock64 ( const uint64_t * const p, const int i)
+{
+ if (IsBigEndian()) {
+ return BSWAP64(p[i]);
+ } else {
+ return p[i];
+ }
+}
+
+#undef NO_SANITIZE_ALIGNMENT
diff --git a/ext/hash/php_hash.h b/ext/hash/php_hash.h
index 33cc6a473a..6bea4bebd4 100644
--- a/ext/hash/php_hash.h
+++ b/ext/hash/php_hash.h
@@ -31,7 +31,7 @@
typedef struct _php_hashcontext_object php_hashcontext_object;
-typedef void (*php_hash_init_func_t)(void *context);
+typedef void (*php_hash_init_func_t)(void *context, HashTable *args);
typedef void (*php_hash_update_func_t)(void *context, const unsigned char *buf, size_t count);
typedef void (*php_hash_final_func_t)(unsigned char *digest, void *context);
typedef int (*php_hash_copy_func_t)(const void *ops, void *orig_context, void *dest_context);
@@ -105,6 +105,13 @@ extern const php_hash_ops php_hash_fnv1a32_ops;
extern const php_hash_ops php_hash_fnv164_ops;
extern const php_hash_ops php_hash_fnv1a64_ops;
extern const php_hash_ops php_hash_joaat_ops;
+extern const php_hash_ops php_hash_murmur3a_ops;
+extern const php_hash_ops php_hash_murmur3c_ops;
+extern const php_hash_ops php_hash_murmur3f_ops;
+extern const php_hash_ops php_hash_xxh32_ops;
+extern const php_hash_ops php_hash_xxh64_ops;
+extern const php_hash_ops php_hash_xxh3_64_ops;
+extern const php_hash_ops php_hash_xxh3_128_ops;
#define PHP_HASH_HAVAL_OPS(p,b) extern const php_hash_ops php_hash_##p##haval##b##_ops;
diff --git a/ext/hash/php_hash_adler32.h b/ext/hash/php_hash_adler32.h
index 049f16b28e..db2db38114 100644
--- a/ext/hash/php_hash_adler32.h
+++ b/ext/hash/php_hash_adler32.h
@@ -24,7 +24,7 @@ typedef struct {
} PHP_ADLER32_CTX;
#define PHP_ADLER32_SPEC "l."
-PHP_HASH_API void PHP_ADLER32Init(PHP_ADLER32_CTX *context);
+PHP_HASH_API void PHP_ADLER32Init(PHP_ADLER32_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args);
PHP_HASH_API void PHP_ADLER32Update(PHP_ADLER32_CTX *context, const unsigned char *input, size_t len);
PHP_HASH_API void PHP_ADLER32Final(unsigned char digest[4], PHP_ADLER32_CTX *context);
PHP_HASH_API int PHP_ADLER32Copy(const php_hash_ops *ops, PHP_ADLER32_CTX *orig_context, PHP_ADLER32_CTX *copy_context);
diff --git a/ext/hash/php_hash_crc32.h b/ext/hash/php_hash_crc32.h
index 4c1b0fedc9..1003e4b39b 100644
--- a/ext/hash/php_hash_crc32.h
+++ b/ext/hash/php_hash_crc32.h
@@ -24,7 +24,7 @@ typedef struct {
} PHP_CRC32_CTX;
#define PHP_CRC32_SPEC "l."
-PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context);
+PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args);
PHP_HASH_API void PHP_CRC32Update(PHP_CRC32_CTX *context, const unsigned char *input, size_t len);
PHP_HASH_API void PHP_CRC32BUpdate(PHP_CRC32_CTX *context, const unsigned char *input, size_t len);
PHP_HASH_API void PHP_CRC32CUpdate(PHP_CRC32_CTX *context, const unsigned char *input, size_t len);
diff --git a/ext/hash/php_hash_fnv.h b/ext/hash/php_hash_fnv.h
index 6728b2e902..f4dacb223e 100644
--- a/ext/hash/php_hash_fnv.h
+++ b/ext/hash/php_hash_fnv.h
@@ -52,12 +52,12 @@ typedef struct {
#define PHP_FNV164_SPEC "q."
-PHP_HASH_API void PHP_FNV132Init(PHP_FNV132_CTX *context);
+PHP_HASH_API void PHP_FNV132Init(PHP_FNV132_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args);
PHP_HASH_API void PHP_FNV132Update(PHP_FNV132_CTX *context, const unsigned char *input, size_t inputLen);
PHP_HASH_API void PHP_FNV1a32Update(PHP_FNV132_CTX *context, const unsigned char *input, size_t inputLen);
PHP_HASH_API void PHP_FNV132Final(unsigned char digest[16], PHP_FNV132_CTX * context);
-PHP_HASH_API void PHP_FNV164Init(PHP_FNV164_CTX *context);
+PHP_HASH_API void PHP_FNV164Init(PHP_FNV164_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args);
PHP_HASH_API void PHP_FNV164Update(PHP_FNV164_CTX *context, const unsigned char *input, size_t inputLen);
PHP_HASH_API void PHP_FNV1a64Update(PHP_FNV164_CTX *context, const unsigned char *input, size_t inputLen);
PHP_HASH_API void PHP_FNV164Final(unsigned char digest[16], PHP_FNV164_CTX * context);
diff --git a/ext/hash/php_hash_gost.h b/ext/hash/php_hash_gost.h
index eb9441faa6..850b089506 100644
--- a/ext/hash/php_hash_gost.h
+++ b/ext/hash/php_hash_gost.h
@@ -29,7 +29,7 @@ typedef struct {
} PHP_GOST_CTX;
#define PHP_GOST_SPEC "l16l2bb32"
-PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *);
+PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *args);
PHP_HASH_API void PHP_GOSTUpdate(PHP_GOST_CTX *, const unsigned char *, size_t);
PHP_HASH_API void PHP_GOSTFinal(unsigned char[64], PHP_GOST_CTX *);
diff --git a/ext/hash/php_hash_haval.h b/ext/hash/php_hash_haval.h
index 43802b4183..2ae0af6bf8 100644
--- a/ext/hash/php_hash_haval.h
+++ b/ext/hash/php_hash_haval.h
@@ -30,7 +30,7 @@ typedef struct {
} PHP_HAVAL_CTX;
#define PHP_HAVAL_SPEC "l8l2b128"
-#define PHP_HASH_HAVAL_INIT_DECL(p,b) PHP_HASH_API void PHP_##p##HAVAL##b##Init(PHP_HAVAL_CTX *); \
+#define PHP_HASH_HAVAL_INIT_DECL(p,b) PHP_HASH_API void PHP_##p##HAVAL##b##Init(PHP_HAVAL_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); \
PHP_HASH_API void PHP_HAVAL##b##Final(unsigned char*, PHP_HAVAL_CTX *);
PHP_HASH_API void PHP_HAVALUpdate(PHP_HAVAL_CTX *, const unsigned char *, size_t);
diff --git a/ext/hash/php_hash_joaat.h b/ext/hash/php_hash_joaat.h
index b0df8a67b3..113983c2a4 100644
--- a/ext/hash/php_hash_joaat.h
+++ b/ext/hash/php_hash_joaat.h
@@ -22,7 +22,7 @@ typedef struct {
} PHP_JOAAT_CTX;
#define PHP_JOAAT_SPEC "l."
-PHP_HASH_API void PHP_JOAATInit(PHP_JOAAT_CTX *context);
+PHP_HASH_API void PHP_JOAATInit(PHP_JOAAT_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args);
PHP_HASH_API void PHP_JOAATUpdate(PHP_JOAAT_CTX *context, const unsigned char *input, size_t inputLen);
PHP_HASH_API void PHP_JOAATFinal(unsigned char digest[16], PHP_JOAAT_CTX * context);
diff --git a/ext/hash/php_hash_md.h b/ext/hash/php_hash_md.h
index 2a677fe54d..ce155b3e1f 100644
--- a/ext/hash/php_hash_md.h
+++ b/ext/hash/php_hash_md.h
@@ -28,7 +28,8 @@ typedef struct {
} PHP_MD4_CTX;
#define PHP_MD4_SPEC "l4l2b64."
-PHP_HASH_API void PHP_MD4Init(PHP_MD4_CTX *);
+#define PHP_MD4Init(ctx) PHP_MD4InitArgs(ctx, NULL)
+PHP_HASH_API void PHP_MD4InitArgs(PHP_MD4_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_MD4Update(PHP_MD4_CTX *context, const unsigned char *, size_t);
PHP_HASH_API void PHP_MD4Final(unsigned char[16], PHP_MD4_CTX *);
@@ -41,7 +42,8 @@ typedef struct {
} PHP_MD2_CTX;
#define PHP_MD2_SPEC "b48b16b16b."
-PHP_HASH_API void PHP_MD2Init(PHP_MD2_CTX *context);
+#define PHP_MD2Init(ctx) PHP_MD2InitArgs(ctx, NULL)
+PHP_HASH_API void PHP_MD2InitArgs(PHP_MD2_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args);
PHP_HASH_API void PHP_MD2Update(PHP_MD2_CTX *context, const unsigned char *, size_t);
PHP_HASH_API void PHP_MD2Final(unsigned char[16], PHP_MD2_CTX *);
diff --git a/ext/hash/php_hash_murmur.h b/ext/hash/php_hash_murmur.h
new file mode 100644
index 0000000000..598912141b
--- /dev/null
+++ b/ext/hash/php_hash_murmur.h
@@ -0,0 +1,57 @@
+/*
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Anatol Belski <ab@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+#ifndef PHP_HASH_MURMUR_H
+#define PHP_HASH_MURMUR_H
+
+typedef struct {
+ uint32_t h;
+ uint32_t carry;
+ uint32_t len;
+} PHP_MURMUR3A_CTX;
+#define PHP_MURMUR3A_SPEC "lll"
+
+PHP_HASH_API void PHP_MURMUR3AInit(PHP_MURMUR3A_CTX *ctx, HashTable *args);
+PHP_HASH_API void PHP_MURMUR3AUpdate(PHP_MURMUR3A_CTX *ctx, const unsigned char *in, size_t len);
+PHP_HASH_API void PHP_MURMUR3AFinal(unsigned char digest[4], PHP_MURMUR3A_CTX *ctx);
+PHP_HASH_API int PHP_MURMUR3ACopy(const php_hash_ops *ops, PHP_MURMUR3A_CTX *orig_context, PHP_MURMUR3A_CTX *copy_context);
+
+typedef struct {
+ uint32_t h[4];
+ uint32_t carry[4];
+ uint32_t len;
+} PHP_MURMUR3C_CTX;
+#define PHP_MURMUR3C_SPEC "lllllllll"
+
+PHP_HASH_API void PHP_MURMUR3CInit(PHP_MURMUR3C_CTX *ctx, HashTable *args);
+PHP_HASH_API void PHP_MURMUR3CUpdate(PHP_MURMUR3C_CTX *ctx, const unsigned char *in, size_t len);
+PHP_HASH_API void PHP_MURMUR3CFinal(unsigned char digest[16], PHP_MURMUR3C_CTX *ctx);
+PHP_HASH_API int PHP_MURMUR3CCopy(const php_hash_ops *ops, PHP_MURMUR3C_CTX *orig_context, PHP_MURMUR3C_CTX *copy_context);
+
+typedef struct {
+ uint64_t h[2];
+ uint64_t carry[2];
+ uint32_t len;
+} PHP_MURMUR3F_CTX;
+#define PHP_MURMUR3F_SPEC "qqqql"
+
+PHP_HASH_API void PHP_MURMUR3FInit(PHP_MURMUR3F_CTX *ctx, HashTable *args);
+PHP_HASH_API void PHP_MURMUR3FUpdate(PHP_MURMUR3F_CTX *ctx, const unsigned char *in, size_t len);
+PHP_HASH_API void PHP_MURMUR3FFinal(unsigned char digest[16], PHP_MURMUR3F_CTX *ctx);
+PHP_HASH_API int PHP_MURMUR3FCopy(const php_hash_ops *ops, PHP_MURMUR3F_CTX *orig_context, PHP_MURMUR3F_CTX *copy_context);
+
+#endif /* PHP_HASH_MURMUR_H */
+
diff --git a/ext/hash/php_hash_ripemd.h b/ext/hash/php_hash_ripemd.h
index dd9913b85b..55a430a4f2 100644
--- a/ext/hash/php_hash_ripemd.h
+++ b/ext/hash/php_hash_ripemd.h
@@ -47,19 +47,19 @@ typedef struct {
} PHP_RIPEMD320_CTX;
#define PHP_RIPEMD320_SPEC "l10l2b64."
-PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX *);
+PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_RIPEMD128Update(PHP_RIPEMD128_CTX *, const unsigned char *, size_t);
PHP_HASH_API void PHP_RIPEMD128Final(unsigned char[16], PHP_RIPEMD128_CTX *);
-PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX *);
+PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_RIPEMD160Update(PHP_RIPEMD160_CTX *, const unsigned char *, size_t);
PHP_HASH_API void PHP_RIPEMD160Final(unsigned char[20], PHP_RIPEMD160_CTX *);
-PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX *);
+PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_RIPEMD256Update(PHP_RIPEMD256_CTX *, const unsigned char *, size_t);
PHP_HASH_API void PHP_RIPEMD256Final(unsigned char[32], PHP_RIPEMD256_CTX *);
-PHP_HASH_API void PHP_RIPEMD320Init(PHP_RIPEMD320_CTX *);
+PHP_HASH_API void PHP_RIPEMD320Init(PHP_RIPEMD320_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_RIPEMD320Update(PHP_RIPEMD320_CTX *, const unsigned char *, size_t);
PHP_HASH_API void PHP_RIPEMD320Final(unsigned char[40], PHP_RIPEMD320_CTX *);
diff --git a/ext/hash/php_hash_sha.h b/ext/hash/php_hash_sha.h
index 16da927363..4240a6228e 100644
--- a/ext/hash/php_hash_sha.h
+++ b/ext/hash/php_hash_sha.h
@@ -29,7 +29,8 @@ typedef struct {
} PHP_SHA224_CTX;
#define PHP_SHA224_SPEC "l8l2b64."
-PHP_HASH_API void PHP_SHA224Init(PHP_SHA224_CTX *);
+#define PHP_SHA224Init(ctx) PHP_SHA224InitArgs(ctx, NULL)
+PHP_HASH_API void PHP_SHA224InitArgs(PHP_SHA224_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_SHA224Update(PHP_SHA224_CTX *, const unsigned char *, size_t);
PHP_HASH_API void PHP_SHA224Final(unsigned char[28], PHP_SHA224_CTX *);
@@ -41,7 +42,8 @@ typedef struct {
} PHP_SHA256_CTX;
#define PHP_SHA256_SPEC "l8l2b64."
-PHP_HASH_API void PHP_SHA256Init(PHP_SHA256_CTX *);
+#define PHP_SHA256Init(ctx) PHP_SHA256InitArgs(ctx, NULL)
+PHP_HASH_API void PHP_SHA256InitArgs(PHP_SHA256_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_SHA256Update(PHP_SHA256_CTX *, const unsigned char *, size_t);
PHP_HASH_API void PHP_SHA256Final(unsigned char[32], PHP_SHA256_CTX *);
@@ -53,7 +55,8 @@ typedef struct {
} PHP_SHA384_CTX;
#define PHP_SHA384_SPEC "q8q2b128."
-PHP_HASH_API void PHP_SHA384Init(PHP_SHA384_CTX *);
+#define PHP_SHA384Init(ctx) PHP_SHA384InitArgs(ctx, NULL)
+PHP_HASH_API void PHP_SHA384InitArgs(PHP_SHA384_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_SHA384Update(PHP_SHA384_CTX *, const unsigned char *, size_t);
PHP_HASH_API void PHP_SHA384Final(unsigned char[48], PHP_SHA384_CTX *);
@@ -65,15 +68,18 @@ typedef struct {
} PHP_SHA512_CTX;
#define PHP_SHA512_SPEC "q8q2b128."
-PHP_HASH_API void PHP_SHA512Init(PHP_SHA512_CTX *);
+#define PHP_SHA512Init(ctx) PHP_SHA512InitArgs(ctx, NULL)
+PHP_HASH_API void PHP_SHA512InitArgs(PHP_SHA512_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_SHA512Update(PHP_SHA512_CTX *, const unsigned char *, size_t);
PHP_HASH_API void PHP_SHA512Final(unsigned char[64], PHP_SHA512_CTX *);
-PHP_HASH_API void PHP_SHA512_256Init(PHP_SHA512_CTX *);
+#define PHP_SHA512_256Init(ctx) PHP_SHA512_256InitArgs(ctx, NULL)
+PHP_HASH_API void PHP_SHA512_256InitArgs(PHP_SHA512_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
#define PHP_SHA512_256Update PHP_SHA512Update
PHP_HASH_API void PHP_SHA512_256Final(unsigned char[32], PHP_SHA512_CTX *);
-PHP_HASH_API void PHP_SHA512_224Init(PHP_SHA512_CTX *);
+#define PHP_SHA512_224Init(ctx) PHP_SHA512_224InitArgs(ctx, NULL)
+PHP_HASH_API void PHP_SHA512_224InitArgs(PHP_SHA512_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
#define PHP_SHA512_224Update PHP_SHA512Update
PHP_HASH_API void PHP_SHA512_224Final(unsigned char[28], PHP_SHA512_CTX *);
diff --git a/ext/hash/php_hash_sha3.h b/ext/hash/php_hash_sha3.h
index f75191f339..b8bd310cce 100644
--- a/ext/hash/php_hash_sha3.h
+++ b/ext/hash/php_hash_sha3.h
@@ -36,19 +36,19 @@ typedef PHP_SHA3_CTX PHP_SHA3_256_CTX;
typedef PHP_SHA3_CTX PHP_SHA3_384_CTX;
typedef PHP_SHA3_CTX PHP_SHA3_512_CTX;
-PHP_HASH_API void PHP_SHA3224Init(PHP_SHA3_224_CTX*);
+PHP_HASH_API void PHP_SHA3224Init(PHP_SHA3_224_CTX*, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_SHA3224Update(PHP_SHA3_224_CTX*, const unsigned char*, size_t);
PHP_HASH_API void PHP_SAH3224Final(unsigned char[32], PHP_SHA3_224_CTX*);
-PHP_HASH_API void PHP_SHA3256Init(PHP_SHA3_256_CTX*);
+PHP_HASH_API void PHP_SHA3256Init(PHP_SHA3_256_CTX*, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_SHA3256Update(PHP_SHA3_256_CTX*, const unsigned char*, size_t);
PHP_HASH_API void PHP_SAH3256Final(unsigned char[32], PHP_SHA3_256_CTX*);
-PHP_HASH_API void PHP_SHA3384Init(PHP_SHA3_384_CTX*);
+PHP_HASH_API void PHP_SHA3384Init(PHP_SHA3_384_CTX*, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_SHA3384Update(PHP_SHA3_384_CTX*, const unsigned char*, size_t);
PHP_HASH_API void PHP_SAH3384Final(unsigned char[32], PHP_SHA3_384_CTX*);
-PHP_HASH_API void PHP_SHA3512Init(PHP_SHA3_512_CTX*);
+PHP_HASH_API void PHP_SHA3512Init(PHP_SHA3_512_CTX*, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_SHA3512Update(PHP_SHA3_512_CTX*, const unsigned char*, size_t);
PHP_HASH_API void PHP_SAH3512Final(unsigned char[32], PHP_SHA3_512_CTX*);
diff --git a/ext/hash/php_hash_snefru.h b/ext/hash/php_hash_snefru.h
index 0f339e9309..c533b576a9 100644
--- a/ext/hash/php_hash_snefru.h
+++ b/ext/hash/php_hash_snefru.h
@@ -32,7 +32,7 @@ typedef struct {
} PHP_SNEFRU_CTX;
#define PHP_SNEFRU_SPEC "l16l2bb32"
-PHP_HASH_API void PHP_SNEFRUInit(PHP_SNEFRU_CTX *);
+PHP_HASH_API void PHP_SNEFRUInit(PHP_SNEFRU_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_SNEFRUUpdate(PHP_SNEFRU_CTX *, const unsigned char *, size_t);
PHP_HASH_API void PHP_SNEFRUFinal(unsigned char[32], PHP_SNEFRU_CTX *);
diff --git a/ext/hash/php_hash_tiger.h b/ext/hash/php_hash_tiger.h
index d30276ddea..6854c35887 100644
--- a/ext/hash/php_hash_tiger.h
+++ b/ext/hash/php_hash_tiger.h
@@ -27,8 +27,8 @@ typedef struct {
} PHP_TIGER_CTX;
#define PHP_TIGER_SPEC "q3qb64l"
-PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context);
-PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context);
+PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args);
+PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args);
PHP_HASH_API void PHP_TIGERUpdate(PHP_TIGER_CTX *context, const unsigned char *input, size_t len);
PHP_HASH_API void PHP_TIGER128Final(unsigned char digest[16], PHP_TIGER_CTX *context);
PHP_HASH_API void PHP_TIGER160Final(unsigned char digest[20], PHP_TIGER_CTX *context);
diff --git a/ext/hash/php_hash_whirlpool.h b/ext/hash/php_hash_whirlpool.h
index fbd5948a48..376d75a940 100644
--- a/ext/hash/php_hash_whirlpool.h
+++ b/ext/hash/php_hash_whirlpool.h
@@ -29,7 +29,7 @@ typedef struct {
} PHP_WHIRLPOOL_CTX;
#define PHP_WHIRLPOOL_SPEC "q8b32iib64."
-PHP_HASH_API void PHP_WHIRLPOOLInit(PHP_WHIRLPOOL_CTX *);
+PHP_HASH_API void PHP_WHIRLPOOLInit(PHP_WHIRLPOOL_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHP_HASH_API void PHP_WHIRLPOOLUpdate(PHP_WHIRLPOOL_CTX *, const unsigned char *, size_t);
PHP_HASH_API void PHP_WHIRLPOOLFinal(unsigned char[64], PHP_WHIRLPOOL_CTX *);
diff --git a/ext/hash/php_hash_xxhash.h b/ext/hash/php_hash_xxhash.h
new file mode 100644
index 0000000000..1a66e742f3
--- /dev/null
+++ b/ext/hash/php_hash_xxhash.h
@@ -0,0 +1,73 @@
+/*
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Anatol Belski <ab@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+#ifndef PHP_HASH_XXHASH_H
+#define PHP_HASH_XXHASH_H
+
+#define XXH_INLINE_ALL 1
+#include "xxhash.h"
+
+typedef struct {
+ XXH32_state_t s;
+} PHP_XXH32_CTX;
+#define PHP_XXH32_SPEC "llllllllllll"
+
+PHP_HASH_API void PHP_XXH32Init(PHP_XXH32_CTX *ctx, HashTable *args);
+PHP_HASH_API void PHP_XXH32Update(PHP_XXH32_CTX *ctx, const unsigned char *in, size_t len);
+PHP_HASH_API void PHP_XXH32Final(unsigned char digest[4], PHP_XXH32_CTX *ctx);
+PHP_HASH_API int PHP_XXH32Copy(const php_hash_ops *ops, PHP_XXH32_CTX *orig_context, PHP_XXH32_CTX *copy_context);
+
+typedef struct {
+ XXH64_state_t s;
+} PHP_XXH64_CTX;
+#define PHP_XXH64_SPEC "qqqqqqqqqllq"
+
+PHP_HASH_API void PHP_XXH64Init(PHP_XXH64_CTX *ctx, HashTable *args);
+PHP_HASH_API void PHP_XXH64Update(PHP_XXH64_CTX *ctx, const unsigned char *in, size_t len);
+PHP_HASH_API void PHP_XXH64Final(unsigned char digest[8], PHP_XXH64_CTX *ctx);
+PHP_HASH_API int PHP_XXH64Copy(const php_hash_ops *ops, PHP_XXH64_CTX *orig_context, PHP_XXH64_CTX *copy_context);
+
+#define PHP_XXH3_SECRET_SIZE_MIN XXH3_SECRET_SIZE_MIN
+#define PHP_XXH3_SECRET_SIZE_MAX 256
+
+typedef struct {
+ XXH3_state_t s;
+ /* The value must survive the whole streaming cycle from init to final.
+
+ A more flexible mechanism would be to carry zend_string* passed through
+ the options. However, that will require to introduce a destructor
+ handler for ctx, so then it wolud be automatically called from the
+ object destructor. Until that is given, the viable way is to use a
+ plausible max secret length. */
+ const unsigned char secret[PHP_XXH3_SECRET_SIZE_MAX];
+} PHP_XXH3_CTX;
+
+typedef PHP_XXH3_CTX PHP_XXH3_64_CTX;
+
+PHP_HASH_API void PHP_XXH3_64_Init(PHP_XXH3_64_CTX *ctx, HashTable *args);
+PHP_HASH_API void PHP_XXH3_64_Update(PHP_XXH3_64_CTX *ctx, const unsigned char *in, size_t len);
+PHP_HASH_API void PHP_XXH3_64_Final(unsigned char digest[8], PHP_XXH3_64_CTX *ctx);
+PHP_HASH_API int PHP_XXH3_64_Copy(const php_hash_ops *ops, PHP_XXH3_64_CTX *orig_context, PHP_XXH3_64_CTX *copy_context);
+
+typedef PHP_XXH3_CTX PHP_XXH3_128_CTX;
+
+PHP_HASH_API void PHP_XXH3_128_Init(PHP_XXH3_128_CTX *ctx, HashTable *args);
+PHP_HASH_API void PHP_XXH3_128_Update(PHP_XXH3_128_CTX *ctx, const unsigned char *in, size_t len);
+PHP_HASH_API void PHP_XXH3_128_Final(unsigned char digest[16], PHP_XXH3_128_CTX *ctx);
+PHP_HASH_API int PHP_XXH3_128_Copy(const php_hash_ops *ops, PHP_XXH3_128_CTX *orig_context, PHP_XXH3_128_CTX *copy_context);
+
+#endif /* PHP_HASH_XXHASH_H */
+
diff --git a/ext/hash/tests/hash-clone.phpt b/ext/hash/tests/hash-clone.phpt
index 57567c0bc5..32105ae44e 100644
--- a/ext/hash/tests/hash-clone.phpt
+++ b/ext/hash/tests/hash-clone.phpt
@@ -143,6 +143,27 @@ string(16) "bebc746a33b6ab62"
string(5) "joaat"
string(8) "aaebf370"
string(8) "aaebf370"
+string(8) "murmur3a"
+string(8) "1b328135"
+string(8) "1b328135"
+string(8) "murmur3c"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(8) "murmur3f"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(5) "xxh32"
+string(8) "eee74423"
+string(8) "eee74423"
+string(5) "xxh64"
+string(16) "9d6ab4708056a619"
+string(16) "9d6ab4708056a619"
+string(4) "xxh3"
+string(16) "5766323c279a20f7"
+string(16) "5766323c279a20f7"
+string(6) "xxh128"
+string(32) "4c49537a833936440d853ed4173b4a81"
+string(32) "4c49537a833936440d853ed4173b4a81"
string(10) "haval128,3"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "86362472c8895e68e223ef8b3711d8d9"
@@ -302,6 +323,27 @@ string(16) "893899e4415a920f"
string(5) "joaat"
string(8) "aaebf370"
string(8) "836fb0e5"
+string(8) "murmur3a"
+string(8) "1b328135"
+string(8) "18578d03"
+string(8) "murmur3c"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(32) "2af4fdc002fda7b7491459e70377823f"
+string(8) "murmur3f"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(32) "28249178bb182686ef793aa56abb6aea"
+string(5) "xxh32"
+string(8) "eee74423"
+string(8) "3b7a100b"
+string(5) "xxh64"
+string(16) "9d6ab4708056a619"
+string(16) "5a90002ef76d172f"
+string(4) "xxh3"
+string(16) "5766323c279a20f7"
+string(16) "f091393ec20f3d52"
+string(6) "xxh128"
+string(32) "4c49537a833936440d853ed4173b4a81"
+string(32) "d39635b874a0644d5f0f475611e3edb5"
string(10) "haval128,3"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"
diff --git a/ext/hash/tests/hash_algos.phpt b/ext/hash/tests/hash_algos.phpt
index cff71a7771..e2e51f3c70 100644
--- a/ext/hash/tests/hash_algos.phpt
+++ b/ext/hash/tests/hash_algos.phpt
@@ -9,7 +9,7 @@ var_dump(hash_algos());
?>
--EXPECTF--
*** Testing hash_algos() : basic functionality ***
-array(53) {
+array(60) {
[%d]=>
string(3) "md2"
[%d]=>
@@ -87,6 +87,20 @@ array(53) {
[%d]=>
string(5) "joaat"
[%d]=>
+ string(8) "murmur3a"
+ [%d]=>
+ string(8) "murmur3c"
+ [%d]=>
+ string(8) "murmur3f"
+ [%d]=>
+ string(5) "xxh32"
+ [%d]=>
+ string(5) "xxh64"
+ [%d]=>
+ string(4) "xxh3"
+ [%d]=>
+ string(6) "xxh128"
+ [%d]=>
string(10) "haval128,3"
[%d]=>
string(10) "haval160,3"
diff --git a/ext/hash/tests/hash_copy_001.phpt b/ext/hash/tests/hash_copy_001.phpt
index 271326178d..ef0d90f700 100644
--- a/ext/hash/tests/hash_copy_001.phpt
+++ b/ext/hash/tests/hash_copy_001.phpt
@@ -143,6 +143,27 @@ string(16) "bebc746a33b6ab62"
string(5) "joaat"
string(8) "aaebf370"
string(8) "aaebf370"
+string(8) "murmur3a"
+string(8) "1b328135"
+string(8) "1b328135"
+string(8) "murmur3c"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(8) "murmur3f"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(5) "xxh32"
+string(8) "eee74423"
+string(8) "eee74423"
+string(5) "xxh64"
+string(16) "9d6ab4708056a619"
+string(16) "9d6ab4708056a619"
+string(4) "xxh3"
+string(16) "5766323c279a20f7"
+string(16) "5766323c279a20f7"
+string(6) "xxh128"
+string(32) "4c49537a833936440d853ed4173b4a81"
+string(32) "4c49537a833936440d853ed4173b4a81"
string(10) "haval128,3"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "86362472c8895e68e223ef8b3711d8d9"
@@ -302,6 +323,27 @@ string(16) "893899e4415a920f"
string(5) "joaat"
string(8) "aaebf370"
string(8) "836fb0e5"
+string(8) "murmur3a"
+string(8) "1b328135"
+string(8) "18578d03"
+string(8) "murmur3c"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(32) "2af4fdc002fda7b7491459e70377823f"
+string(8) "murmur3f"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(32) "28249178bb182686ef793aa56abb6aea"
+string(5) "xxh32"
+string(8) "eee74423"
+string(8) "3b7a100b"
+string(5) "xxh64"
+string(16) "9d6ab4708056a619"
+string(16) "5a90002ef76d172f"
+string(4) "xxh3"
+string(16) "5766323c279a20f7"
+string(16) "f091393ec20f3d52"
+string(6) "xxh128"
+string(32) "4c49537a833936440d853ed4173b4a81"
+string(32) "d39635b874a0644d5f0f475611e3edb5"
string(10) "haval128,3"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"
diff --git a/ext/hash/tests/hash_init_error.phpt b/ext/hash/tests/hash_init_error.phpt
index fdea4174d6..4256b570e4 100644
--- a/ext/hash/tests/hash_init_error.phpt
+++ b/ext/hash/tests/hash_init_error.phpt
@@ -37,7 +37,7 @@ catch (\Error $e) {
?>
---EXPECT--
+--EXPECTF--
*** Testing hash_init(): error conditions ***
-- Testing hash_init() function with unknown algorithms --
@@ -48,4 +48,6 @@ hash_init(): Argument #1 ($algo) must be a cryptographic hashing algorithm if HM
-- Testing hash_init() function with HASH_HMAC and no key --
hash_init(): Argument #3 ($key) cannot be empty when HMAC is requested
+
+Deprecated: hash_init(): Passing null to parameter #3 ($key) of type string is deprecated in %s on line %d
hash_init(): Argument #3 ($key) cannot be empty when HMAC is requested
diff --git a/ext/hash/tests/hash_serialize_001.phpt b/ext/hash/tests/hash_serialize_001.phpt
index d515d2c5c5..ed80cdec49 100644
--- a/ext/hash/tests/hash_serialize_001.phpt
+++ b/ext/hash/tests/hash_serialize_001.phpt
@@ -6,6 +6,7 @@ Hash: serialize()/unserialize()
$algos = hash_algos();
foreach ($algos as $algo) {
+ if (not_serializable($algo)) continue;
var_dump($algo);
$ctx0 = hash_init($algo);
$serial = serialize($ctx0);
@@ -23,6 +24,7 @@ foreach ($algos as $algo) {
// serialize/unserialize produces same results as all-on-one
foreach ($algos as $algo) {
+ if (not_serializable($algo)) continue;
var_dump($algo);
$orig = hash_init($algo);
hash_update($orig, "I can't remember anything");
@@ -37,6 +39,11 @@ foreach ($algos as $algo) {
var_dump(hash_final($copy));
}
+function not_serializable(string $algo)
+{
+ return in_array($algo, ["xxh3", "xxh128"]);
+}
+
echo "Done\n";
?>
--EXPECT--
@@ -154,6 +161,21 @@ string(16) "bebc746a33b6ab62"
string(5) "joaat"
string(8) "aaebf370"
string(8) "aaebf370"
+string(8) "murmur3a"
+string(8) "1b328135"
+string(8) "1b328135"
+string(8) "murmur3c"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(8) "murmur3f"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(5) "xxh32"
+string(8) "eee74423"
+string(8) "eee74423"
+string(5) "xxh64"
+string(16) "9d6ab4708056a619"
+string(16) "9d6ab4708056a619"
string(10) "haval128,3"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "86362472c8895e68e223ef8b3711d8d9"
@@ -313,6 +335,21 @@ string(16) "893899e4415a920f"
string(5) "joaat"
string(8) "836fb0e5"
string(8) "836fb0e5"
+string(8) "murmur3a"
+string(8) "18578d03"
+string(8) "18578d03"
+string(8) "murmur3c"
+string(32) "2af4fdc002fda7b7491459e70377823f"
+string(32) "2af4fdc002fda7b7491459e70377823f"
+string(8) "murmur3f"
+string(32) "28249178bb182686ef793aa56abb6aea"
+string(32) "28249178bb182686ef793aa56abb6aea"
+string(5) "xxh32"
+string(8) "3b7a100b"
+string(8) "3b7a100b"
+string(5) "xxh64"
+string(16) "5a90002ef76d172f"
+string(16) "5a90002ef76d172f"
string(10) "haval128,3"
string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"
string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"
diff --git a/ext/hash/tests/hash_serialize_002.phpt b/ext/hash/tests/hash_serialize_002.phpt
index b6b4ccfb5e..15ecf94c1e 100644
--- a/ext/hash/tests/hash_serialize_002.phpt
+++ b/ext/hash/tests/hash_serialize_002.phpt
@@ -4,7 +4,7 @@ Hash: serialize()/unserialize() with HASH_HMAC
<?php
$algos = hash_algos();
-$non_crypto = ["adler32", "crc32", "crc32b", "crc32c", "fnv132", "fnv1a32", "fnv164", "fnv1a64", "joaat"];
+$non_crypto = ["adler32", "crc32", "crc32b", "crc32c", "fnv132", "fnv1a32", "fnv164", "fnv1a64", "joaat", "murmur3a", "murmur3c", "murmur3f", "xxh32", "xxh64", "xxh3", "xxh128"];
$key = "This is the key that I have";
foreach ($algos as $algo) {
diff --git a/ext/hash/tests/murmurhash3.phpt b/ext/hash/tests/murmurhash3.phpt
new file mode 100644
index 0000000000..6331b312d9
--- /dev/null
+++ b/ext/hash/tests/murmurhash3.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Hash: MurmurHash3 test
+--FILE--
+<?php
+
+$h = hash("murmur3a", "foo");
+echo $h, "\n";
+
+$h = hash("murmur3c", "Two hashes meet in a bar", false);
+echo $h, "\n";
+$h = hash("murmur3c", "hash me!");
+echo $h, "\n";
+
+$h = hash("murmur3f", "Two hashes meet in a bar", false);
+echo $h, "\n";
+$h = hash("murmur3f", "hash me!");
+echo $h, "\n";
+
+$ctx = hash_init("murmur3a");
+hash_update($ctx, "hello");
+hash_update($ctx, " there");
+$h0 = hash_final($ctx);
+$h1 = hash("murmur3a", "hello there");
+echo $h0, " ", $h1, "\n";
+
+$ctx = hash_init("murmur3c");
+hash_update($ctx, "hello");
+hash_update($ctx, " there");
+$h0 = hash_final($ctx);
+$h1 = hash("murmur3c", "hello there");
+echo $h0, " ", $h1, "\n";
+
+$ctx = hash_init("murmur3f");
+hash_update($ctx, "hello");
+hash_update($ctx, " there");
+$h0 = hash_final($ctx);
+$h1 = hash("murmur3f", "hello there");
+echo $h0, " ", $h1, "\n";
+
+?>
+--EXPECT--
+f6a5c420
+8036c2707453c6f37348142be7eaf75c
+c7009299985a5627a9280372a9280372
+40256ed26fa6ece7785092ed33c8b659
+c43668294e89db0ba5772846e5804467
+6440964d 6440964d
+2bcadca212d62deb69712a721e593089 2bcadca212d62deb69712a721e593089
+81514cc240f57a165c95eb63f9c0eedf 81514cc240f57a165c95eb63f9c0eedf
diff --git a/ext/hash/tests/murmurhash3_seed.phpt b/ext/hash/tests/murmurhash3_seed.phpt
new file mode 100644
index 0000000000..68cc10a719
--- /dev/null
+++ b/ext/hash/tests/murmurhash3_seed.phpt
@@ -0,0 +1,52 @@
+--TEST--
+Hash: MurmurHash3 seed
+--FILE--
+<?php
+
+$ctx = hash_init("murmur3f", options: ["seed" => 42]);
+hash_update($ctx, "Two");
+hash_update($ctx, " hashes");
+hash_update($ctx, " meet");
+hash_update($ctx, " in");
+hash_update($ctx, " a");
+hash_update($ctx, " bar.");
+$h0 = hash_final($ctx);
+echo $h0, "\n";
+
+$h0 = hash("murmur3f", "Two hashes meet in a bar.", options: ["seed" => 42]);
+echo $h0, "\n";
+
+$ctx = hash_init("murmur3c", options: ["seed" => 106]);
+hash_update($ctx, "Two");
+hash_update($ctx, " hashes");
+hash_update($ctx, " meet");
+hash_update($ctx, " in");
+hash_update($ctx, " a");
+hash_update($ctx, " bar.");
+$h0 = hash_final($ctx);
+echo $h0, "\n";
+
+$h0 = hash("murmur3c", "Two hashes meet in a bar.", options: ["seed" => 106]);
+echo $h0, "\n";
+
+$ctx = hash_init("murmur3a", options: ["seed" => 2345]);
+hash_update($ctx, "Two");
+hash_update($ctx, " hashes");
+hash_update($ctx, " meet");
+hash_update($ctx, " in");
+hash_update($ctx, " a");
+hash_update($ctx, " bar.");
+$h0 = hash_final($ctx);
+echo $h0, "\n";
+
+$h0 = hash("murmur3a", "Two hashes meet in a bar.", options: ["seed" => 2345]);
+echo $h0, "\n";
+
+?>
+--EXPECT--
+95855f9be0db784a5c37e878c4a4dcee
+95855f9be0db784a5c37e878c4a4dcee
+f64c9eb40287fa686575163893e283b2
+f64c9eb40287fa686575163893e283b2
+7f7ec59b
+7f7ec59b
diff --git a/ext/hash/tests/xxhash_secret.phpt b/ext/hash/tests/xxhash_secret.phpt
new file mode 100644
index 0000000000..91e7d929d3
--- /dev/null
+++ b/ext/hash/tests/xxhash_secret.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Hash: xxHash secret
+--FILE--
+<?php
+
+foreach (["xxh3", "xxh128"] as $a) {
+
+ //$secret = random_bytes(256);
+ $secret = str_repeat('a', 256);
+
+ try {
+ $ctx = hash_init($a, options: ["seed" => 24, "secret" => $secret]);
+ } catch (Throwable $e) {
+ var_dump($e->getMessage());
+ }
+
+ try {
+ $ctx = hash_init($a, options: ["secret" => str_repeat('a', 17)]);
+ } catch (Throwable $e) {
+ var_dump($e->getMessage());
+ }
+
+ $ctx = hash_init($a, options: ["secret" => $secret]);
+ hash_update($ctx, "Lorem");
+ hash_update($ctx, " ipsum dolor");
+ hash_update($ctx, " sit amet,");
+ hash_update($ctx, " consectetur adipiscing elit.");
+ $h0 = hash_final($ctx);
+
+ $h1 = hash($a, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", options: ["secret" => $secret]);
+ echo $h0 , " == ", $h1, " == ", (($h0 == $h1) ? "true" : "false"), "\n";
+
+}
+
+?>
+--EXPECT--
+string(67) "xxh3: Only one of seed or secret is to be passed for initialization"
+string(57) "xxh3: Secret length must be >= 136 bytes, 17 bytes passed"
+8028aa834c03557a == 8028aa834c03557a == true
+string(69) "xxh128: Only one of seed or secret is to be passed for initialization"
+string(59) "xxh128: Secret length must be >= 136 bytes, 17 bytes passed"
+54279097795e7218093a05d4d781cbb9 == 54279097795e7218093a05d4d781cbb9 == true
diff --git a/ext/hash/tests/xxhash_seed.phpt b/ext/hash/tests/xxhash_seed.phpt
new file mode 100644
index 0000000000..8e14d18ea0
--- /dev/null
+++ b/ext/hash/tests/xxhash_seed.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Hash: xxHash seed
+--FILE--
+<?php
+
+foreach (["xxh32", "xxh64", "xxh3", "xxh128"] as $a) {
+
+ $ctx = hash_init($a, options: ["seed" => 42]);
+ hash_update($ctx, "Lorem");
+ hash_update($ctx, " ipsum dolor");
+ hash_update($ctx, " sit amet,");
+ hash_update($ctx, " consectetur adipiscing elit.");
+ $h0 = hash_final($ctx);
+ echo $h0, "\n";
+
+ $h0 = hash($a, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", options: ["seed" => 42]);
+ echo $h0, "\n";
+}
+
+?>
+--EXPECT--
+3d0cc7e5
+3d0cc7e5
+9c9aa071b5d22a15
+9c9aa071b5d22a15
+366409913c16b70d
+366409913c16b70d
+f87856a7589354e92aeca886c71ed7fb
+f87856a7589354e92aeca886c71ed7fb
diff --git a/ext/hash/tests/xxhash_unserialize_memsize.phpt b/ext/hash/tests/xxhash_unserialize_memsize.phpt
new file mode 100644
index 0000000000..6de78ee071
--- /dev/null
+++ b/ext/hash/tests/xxhash_unserialize_memsize.phpt
@@ -0,0 +1,27 @@
+--TEST--
+xxhash memsize must be in range when unserializing
+--FILE--
+<?php
+try {
+ $str = <<<'STR'
+ O:11:"HashContext":5:{i:0;s:5:"xxh32";i:1;i:0;i:2;a:12:{i:0;i:0;i:1;i:0;i:2;i:606290984;i:3;i:-2048144777;i:4;i:0;i:5;i:1640531535;i:6;i:0;i:7;i:0;i:8;i:0;i:9;i:0;i:10;i:30;i:11;i:0;}i:3;i:2;i:4;a:0:{}}
+ STR;
+ $hash = unserialize($str);
+ hash_update($hash, '');
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+
+try {
+ $str = <<<'STR'
+ O:11:"HashContext":5:{i:0;s:5:"xxh64";i:1;i:0;i:2;a:22:{i:0;i:0;i:1;i:0;i:2;i:6;i:3;i:2;i:4;i:8;i:5;i:9;i:6;i:0;i:7;i:0;i:8;i:1;i:9;i:5;i:10;i:0;i:11;i:0;i:12;i:0;i:13;i:0;i:14;i:0;i:15;i:0;i:16;i:0;i:17;i:0;i:18;i:70;i:19;i:0;i:20;i:0;i:21;i:0;}i:3;i:2;i:4;a:0:{}}
+ STR;
+ $hash = unserialize($str);
+ hash_update($hash, '');
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+Incomplete or ill-formed serialization data ("xxh32" code -2000)
+Incomplete or ill-formed serialization data ("xxh64" code -2000)
diff --git a/ext/hash/xxhash/xxhash.h b/ext/hash/xxhash/xxhash.h
new file mode 100644
index 0000000000..2d56d23c5d
--- /dev/null
+++ b/ext/hash/xxhash/xxhash.h
@@ -0,0 +1,4766 @@
+/*
+ * xxHash - Extremely Fast Hash algorithm
+ * Header File
+ * Copyright (C) 2012-2020 Yann Collet
+ *
+ * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You can contact the author at:
+ * - xxHash homepage: https://www.xxhash.com
+ * - xxHash source repository: https://github.com/Cyan4973/xxHash
+ */
+
+/* TODO: update */
+/* Notice extracted from xxHash homepage:
+
+xxHash is an extremely fast hash algorithm, running at RAM speed limits.
+It also successfully passes all tests from the SMHasher suite.
+
+Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz)
+
+Name Speed Q.Score Author
+xxHash 5.4 GB/s 10
+CrapWow 3.2 GB/s 2 Andrew
+MumurHash 3a 2.7 GB/s 10 Austin Appleby
+SpookyHash 2.0 GB/s 10 Bob Jenkins
+SBox 1.4 GB/s 9 Bret Mulvey
+Lookup3 1.2 GB/s 9 Bob Jenkins
+SuperFastHash 1.2 GB/s 1 Paul Hsieh
+CityHash64 1.05 GB/s 10 Pike & Alakuijala
+FNV 0.55 GB/s 5 Fowler, Noll, Vo
+CRC32 0.43 GB/s 9
+MD5-32 0.33 GB/s 10 Ronald L. Rivest
+SHA1-32 0.28 GB/s 10
+
+Q.Score is a measure of quality of the hash function.
+It depends on successfully passing SMHasher test set.
+10 is a perfect score.
+
+Note: SMHasher's CRC32 implementation is not the fastest one.
+Other speed-oriented implementations can be faster,
+especially in combination with PCLMUL instruction:
+https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html?showComment=1552696407071#c3490092340461170735
+
+A 64-bit version, named XXH64, is available since r35.
+It offers much better speed, but for 64-bit applications only.
+Name Speed on 64 bits Speed on 32 bits
+XXH64 13.8 GB/s 1.9 GB/s
+XXH32 6.8 GB/s 6.0 GB/s
+*/
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+/* ****************************
+ * INLINE mode
+ ******************************/
+/*!
+ * XXH_INLINE_ALL (and XXH_PRIVATE_API)
+ * Use these build macros to inline xxhash into the target unit.
+ * Inlining improves performance on small inputs, especially when the length is
+ * expressed as a compile-time constant:
+ *
+ * https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html
+ *
+ * It also keeps xxHash symbols private to the unit, so they are not exported.
+ *
+ * Usage:
+ * #define XXH_INLINE_ALL
+ * #include "xxhash.h"
+ *
+ * Do not compile and link xxhash.o as a separate object, as it is not useful.
+ */
+#if (defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)) \
+ && !defined(XXH_INLINE_ALL_31684351384)
+ /* this section should be traversed only once */
+# define XXH_INLINE_ALL_31684351384
+ /* give access to the advanced API, required to compile implementations */
+# undef XXH_STATIC_LINKING_ONLY /* avoid macro redef */
+# define XXH_STATIC_LINKING_ONLY
+ /* make all functions private */
+# undef XXH_PUBLIC_API
+# if defined(__GNUC__)
+# define XXH_PUBLIC_API static __inline __attribute__((unused))
+# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
+# define XXH_PUBLIC_API static inline
+# elif defined(_MSC_VER)
+# define XXH_PUBLIC_API static __inline
+# else
+ /* note: this version may generate warnings for unused static functions */
+# define XXH_PUBLIC_API static
+# endif
+
+ /*
+ * This part deals with the special case where a unit wants to inline xxHash,
+ * but "xxhash.h" has previously been included without XXH_INLINE_ALL, such
+ * as part of some previously included *.h header file.
+ * Without further action, the new include would just be ignored,
+ * and functions would effectively _not_ be inlined (silent failure).
+ * The following macros solve this situation by prefixing all inlined names,
+ * avoiding naming collision with previous inclusions.
+ */
+# ifdef XXH_NAMESPACE
+# error "XXH_INLINE_ALL with XXH_NAMESPACE is not supported"
+ /*
+ * Note: Alternative: #undef all symbols (it's a pretty large list).
+ * Without #error: it compiles, but functions are actually not inlined.
+ */
+# endif
+# define XXH_NAMESPACE XXH_INLINE_
+ /*
+ * Some identifiers (enums, type names) are not symbols, but they must
+ * still be renamed to avoid redeclaration.
+ * Alternative solution: do not redeclare them.
+ * However, this requires some #ifdefs, and is a more dispersed action.
+ * Meanwhile, renaming can be achieved in a single block
+ */
+# define XXH_IPREF(Id) XXH_INLINE_ ## Id
+# define XXH_OK XXH_IPREF(XXH_OK)
+# define XXH_ERROR XXH_IPREF(XXH_ERROR)
+# define XXH_errorcode XXH_IPREF(XXH_errorcode)
+# define XXH32_canonical_t XXH_IPREF(XXH32_canonical_t)
+# define XXH64_canonical_t XXH_IPREF(XXH64_canonical_t)
+# define XXH128_canonical_t XXH_IPREF(XXH128_canonical_t)
+# define XXH32_state_s XXH_IPREF(XXH32_state_s)
+# define XXH32_state_t XXH_IPREF(XXH32_state_t)
+# define XXH64_state_s XXH_IPREF(XXH64_state_s)
+# define XXH64_state_t XXH_IPREF(XXH64_state_t)
+# define XXH3_state_s XXH_IPREF(XXH3_state_s)
+# define XXH3_state_t XXH_IPREF(XXH3_state_t)
+# define XXH128_hash_t XXH_IPREF(XXH128_hash_t)
+ /* Ensure the header is parsed again, even if it was previously included */
+# undef XXHASH_H_5627135585666179
+# undef XXHASH_H_STATIC_13879238742
+#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */
+
+
+
+/* ****************************************************************
+ * Stable API
+ *****************************************************************/
+#ifndef XXHASH_H_5627135585666179
+#define XXHASH_H_5627135585666179 1
+
+/* specific declaration modes for Windows */
+#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API)
+# if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT))
+# ifdef XXH_EXPORT
+# define XXH_PUBLIC_API __declspec(dllexport)
+# elif XXH_IMPORT
+# define XXH_PUBLIC_API __declspec(dllimport)
+# endif
+# else
+# define XXH_PUBLIC_API /* do nothing */
+# endif
+#endif
+
+/*!
+ * XXH_NAMESPACE, aka Namespace Emulation:
+ *
+ * If you want to include _and expose_ xxHash functions from within your own
+ * library, but also want to avoid symbol collisions with other libraries which
+ * may also include xxHash, you can use XXH_NAMESPACE to automatically prefix
+ * any public symbol from xxhash library with the value of XXH_NAMESPACE
+ * (therefore, avoid empty or numeric values).
+ *
+ * Note that no change is required within the calling program as long as it
+ * includes `xxhash.h`: Regular symbol names will be automatically translated
+ * by this header.
+ */
+#ifdef XXH_NAMESPACE
+# define XXH_CAT(A,B) A##B
+# define XXH_NAME2(A,B) XXH_CAT(A,B)
+# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber)
+/* XXH32 */
+# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32)
+# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState)
+# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState)
+# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset)
+# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update)
+# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest)
+# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState)
+# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash)
+# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical)
+/* XXH64 */
+# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64)
+# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState)
+# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState)
+# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset)
+# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update)
+# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest)
+# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState)
+# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash)
+# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical)
+/* XXH3_64bits */
+# define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits)
+# define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret)
+# define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed)
+# define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState)
+# define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState)
+# define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState)
+# define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset)
+# define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed)
+# define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret)
+# define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update)
+# define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest)
+# define XXH3_generateSecret XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret)
+/* XXH3_128bits */
+# define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128)
+# define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits)
+# define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed)
+# define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret)
+# define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset)
+# define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed)
+# define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret)
+# define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update)
+# define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest)
+# define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual)
+# define XXH128_cmp XXH_NAME2(XXH_NAMESPACE, XXH128_cmp)
+# define XXH128_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH128_canonicalFromHash)
+# define XXH128_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH128_hashFromCanonical)
+#endif
+
+
+/* *************************************
+* Version
+***************************************/
+#define XXH_VERSION_MAJOR 0
+#define XXH_VERSION_MINOR 8
+#define XXH_VERSION_RELEASE 0
+#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)
+XXH_PUBLIC_API unsigned XXH_versionNumber (void);
+
+
+/* ****************************
+* Definitions
+******************************/
+#include <stddef.h> /* size_t */
+typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;
+
+
+/*-**********************************************************************
+* 32-bit hash
+************************************************************************/
+#if !defined (__VMS) \
+ && (defined (__cplusplus) \
+ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
+# include <stdint.h>
+ typedef uint32_t XXH32_hash_t;
+#else
+# include <limits.h>
+# if UINT_MAX == 0xFFFFFFFFUL
+ typedef unsigned int XXH32_hash_t;
+# else
+# if ULONG_MAX == 0xFFFFFFFFUL
+ typedef unsigned long XXH32_hash_t;
+# else
+# error "unsupported platform: need a 32-bit type"
+# endif
+# endif
+#endif
+
+/*!
+ * XXH32():
+ * Calculate the 32-bit hash of sequence "length" bytes stored at memory address "input".
+ * The memory between input & input+length must be valid (allocated and read-accessible).
+ * "seed" can be used to alter the result predictably.
+ * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s
+ *
+ * Note: XXH3 provides competitive speed for both 32-bit and 64-bit systems,
+ * and offers true 64/128 bit hash results. It provides a superior level of
+ * dispersion, and greatly reduces the risks of collisions.
+ */
+XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed);
+
+/******* Streaming *******/
+
+/*
+ * Streaming functions generate the xxHash value from an incrememtal input.
+ * This method is slower than single-call functions, due to state management.
+ * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized.
+ *
+ * An XXH state must first be allocated using `XXH*_createState()`.
+ *
+ * Start a new hash by initializing the state with a seed using `XXH*_reset()`.
+ *
+ * Then, feed the hash state by calling `XXH*_update()` as many times as necessary.
+ *
+ * The function returns an error code, with 0 meaning OK, and any other value
+ * meaning there is an error.
+ *
+ * Finally, a hash value can be produced anytime, by using `XXH*_digest()`.
+ * This function returns the nn-bits hash as an int or long long.
+ *
+ * It's still possible to continue inserting input into the hash state after a
+ * digest, and generate new hash values later on by invoking `XXH*_digest()`.
+ *
+ * When done, release the state using `XXH*_freeState()`.
+ */
+
+typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */
+XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void);
+XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr);
+XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state);
+
+XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, XXH32_hash_t seed);
+XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length);
+XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr);
+
+/******* Canonical representation *******/
+
+/*
+ * The default return values from XXH functions are unsigned 32 and 64 bit
+ * integers.
+ * This the simplest and fastest format for further post-processing.
+ *
+ * However, this leaves open the question of what is the order on the byte level,
+ * since little and big endian conventions will store the same number differently.
+ *
+ * The canonical representation settles this issue by mandating big-endian
+ * convention, the same convention as human-readable numbers (large digits first).
+ *
+ * When writing hash values to storage, sending them over a network, or printing
+ * them, it's highly recommended to use the canonical representation to ensure
+ * portability across a wider range of systems, present and future.
+ *
+ * The following functions allow transformation of hash values to and from
+ * canonical format.
+ */
+
+typedef struct { unsigned char digest[4]; } XXH32_canonical_t;
+XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash);
+XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src);
+
+
+#ifndef XXH_NO_LONG_LONG
+/*-**********************************************************************
+* 64-bit hash
+************************************************************************/
+#if !defined (__VMS) \
+ && (defined (__cplusplus) \
+ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
+# include <stdint.h>
+ typedef uint64_t XXH64_hash_t;
+#else
+ /* the following type must have a width of 64-bit */
+ typedef unsigned long long XXH64_hash_t;
+#endif
+
+/*!
+ * XXH64():
+ * Returns the 64-bit hash of sequence of length @length stored at memory
+ * address @input.
+ * @seed can be used to alter the result predictably.
+ *
+ * This function usually runs faster on 64-bit systems, but slower on 32-bit
+ * systems (see benchmark).
+ *
+ * Note: XXH3 provides competitive speed for both 32-bit and 64-bit systems,
+ * and offers true 64/128 bit hash results. It provides a superior level of
+ * dispersion, and greatly reduces the risks of collisions.
+ */
+XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t length, XXH64_hash_t seed);
+
+/******* Streaming *******/
+typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */
+XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void);
+XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr);
+XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state);
+
+XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, XXH64_hash_t seed);
+XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length);
+XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr);
+
+/******* Canonical representation *******/
+typedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t;
+XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash);
+XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src);
+
+
+/*-**********************************************************************
+* XXH3 64-bit variant
+************************************************************************/
+
+/* ************************************************************************
+ * XXH3 is a new hash algorithm featuring:
+ * - Improved speed for both small and large inputs
+ * - True 64-bit and 128-bit outputs
+ * - SIMD acceleration
+ * - Improved 32-bit viability
+ *
+ * Speed analysis methodology is explained here:
+ *
+ * https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html
+ *
+ * In general, expect XXH3 to run about ~2x faster on large inputs and >3x
+ * faster on small ones compared to XXH64, though exact differences depend on
+ * the platform.
+ *
+ * The algorithm is portable: Like XXH32 and XXH64, it generates the same hash
+ * on all platforms.
+ *
+ * It benefits greatly from SIMD and 64-bit arithmetic, but does not require it.
+ *
+ * Almost all 32-bit and 64-bit targets that can run XXH32 smoothly can run
+ * XXH3 at competitive speeds, even if XXH64 runs slowly. Further details are
+ * explained in the implementation.
+ *
+ * Optimized implementations are provided for AVX512, AVX2, SSE2, NEON, POWER8,
+ * ZVector and scalar targets. This can be controlled with the XXH_VECTOR macro.
+ *
+ * XXH3 offers 2 variants, _64bits and _128bits.
+ * When only 64 bits are needed, prefer calling the _64bits variant, as it
+ * reduces the amount of mixing, resulting in faster speed on small inputs.
+ *
+ * It's also generally simpler to manipulate a scalar return type than a struct.
+ *
+ * The 128-bit version adds additional strength, but it is slightly slower.
+ *
+ * The XXH3 algorithm is still in development.
+ * The results it produces may still change in future versions.
+ *
+ * Results produced by v0.7.x are not comparable with results from v0.7.y.
+ * However, the API is completely stable, and it can safely be used for
+ * ephemeral data (local sessions).
+ *
+ * Avoid storing values in long-term storage until the algorithm is finalized.
+ * XXH3's return values will be officially finalized upon reaching v0.8.0.
+ *
+ * After which, return values of XXH3 and XXH128 will no longer change in
+ * future versions.
+ *
+ * The API supports one-shot hashing, streaming mode, and custom secrets.
+ */
+
+/* XXH3_64bits():
+ * default 64-bit variant, using default secret and default seed of 0.
+ * It's the fastest variant. */
+XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* data, size_t len);
+
+/*
+ * XXH3_64bits_withSeed():
+ * This variant generates a custom secret on the fly
+ * based on default secret altered using the `seed` value.
+ * While this operation is decently fast, note that it's not completely free.
+ * Note: seed==0 produces the same results as XXH3_64bits().
+ */
+XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* data, size_t len, XXH64_hash_t seed);
+
+/*
+ * XXH3_64bits_withSecret():
+ * It's possible to provide any blob of bytes as a "secret" to generate the hash.
+ * This makes it more difficult for an external actor to prepare an intentional collision.
+ * The main condition is that secretSize *must* be large enough (>= XXH3_SECRET_SIZE_MIN).
+ * However, the quality of produced hash values depends on secret's entropy.
+ * Technically, the secret must look like a bunch of random bytes.
+ * Avoid "trivial" or structured data such as repeated sequences or a text document.
+ * Whenever unsure about the "randomness" of the blob of bytes,
+ * consider relabelling it as a "custom seed" instead,
+ * and employ "XXH3_generateSecret()" (see below)
+ * to generate a high entropy secret derived from the custom seed.
+ */
+#define XXH3_SECRET_SIZE_MIN 136
+XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize);
+
+
+/******* Streaming *******/
+/*
+ * Streaming requires state maintenance.
+ * This operation costs memory and CPU.
+ * As a consequence, streaming is slower than one-shot hashing.
+ * For better performance, prefer one-shot functions whenever applicable.
+ */
+typedef struct XXH3_state_s XXH3_state_t;
+XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void);
+XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr);
+XXH_PUBLIC_API void XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state);
+
+/*
+ * XXH3_64bits_reset():
+ * Initialize with default parameters.
+ * digest will be equivalent to `XXH3_64bits()`.
+ */
+XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH3_state_t* statePtr);
+/*
+ * XXH3_64bits_reset_withSeed():
+ * Generate a custom secret from `seed`, and store it into `statePtr`.
+ * digest will be equivalent to `XXH3_64bits_withSeed()`.
+ */
+XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed);
+/*
+ * XXH3_64bits_reset_withSecret():
+ * `secret` is referenced, it _must outlive_ the hash streaming session.
+ * Similar to one-shot API, `secretSize` must be >= `XXH3_SECRET_SIZE_MIN`,
+ * and the quality of produced hash values depends on secret's entropy
+ * (secret's content should look like a bunch of random bytes).
+ * When in doubt about the randomness of a candidate `secret`,
+ * consider employing `XXH3_generateSecret()` instead (see below).
+ */
+XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize);
+
+XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH3_state_t* statePtr, const void* input, size_t length);
+XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* statePtr);
+
+/* note : canonical representation of XXH3 is the same as XXH64
+ * since they both produce XXH64_hash_t values */
+
+
+/*-**********************************************************************
+* XXH3 128-bit variant
+************************************************************************/
+
+typedef struct {
+ XXH64_hash_t low64;
+ XXH64_hash_t high64;
+} XXH128_hash_t;
+
+XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* data, size_t len);
+XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed(const void* data, size_t len, XXH64_hash_t seed);
+XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize);
+
+/******* Streaming *******/
+/*
+ * Streaming requires state maintenance.
+ * This operation costs memory and CPU.
+ * As a consequence, streaming is slower than one-shot hashing.
+ * For better performance, prefer one-shot functions whenever applicable.
+ *
+ * XXH3_128bits uses the same XXH3_state_t as XXH3_64bits().
+ * Use already declared XXH3_createState() and XXH3_freeState().
+ *
+ * All reset and streaming functions have same meaning as their 64-bit counterpart.
+ */
+
+XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH3_state_t* statePtr);
+XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed);
+XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize);
+
+XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH3_state_t* statePtr, const void* input, size_t length);
+XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* statePtr);
+
+/* Following helper functions make it possible to compare XXH128_hast_t values.
+ * Since XXH128_hash_t is a structure, this capability is not offered by the language.
+ * Note: For better performance, these functions can be inlined using XXH_INLINE_ALL */
+
+/*!
+ * XXH128_isEqual():
+ * Return: 1 if `h1` and `h2` are equal, 0 if they are not.
+ */
+XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2);
+
+/*!
+ * XXH128_cmp():
+ *
+ * This comparator is compatible with stdlib's `qsort()`/`bsearch()`.
+ *
+ * return: >0 if *h128_1 > *h128_2
+ * =0 if *h128_1 == *h128_2
+ * <0 if *h128_1 < *h128_2
+ */
+XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2);
+
+
+/******* Canonical representation *******/
+typedef struct { unsigned char digest[sizeof(XXH128_hash_t)]; } XXH128_canonical_t;
+XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash);
+XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* src);
+
+
+#endif /* XXH_NO_LONG_LONG */
+
+#endif /* XXHASH_H_5627135585666179 */
+
+
+
+#if defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742)
+#define XXHASH_H_STATIC_13879238742
+/* ****************************************************************************
+ * This section contains declarations which are not guaranteed to remain stable.
+ * They may change in future versions, becoming incompatible with a different
+ * version of the library.
+ * These declarations should only be used with static linking.
+ * Never use them in association with dynamic linking!
+ ***************************************************************************** */
+
+/*
+ * These definitions are only present to allow static allocation
+ * of XXH states, on stack or in a struct, for example.
+ * Never **ever** access their members directly.
+ */
+
+struct XXH32_state_s {
+ XXH32_hash_t total_len_32;
+ XXH32_hash_t large_len;
+ XXH32_hash_t v1;
+ XXH32_hash_t v2;
+ XXH32_hash_t v3;
+ XXH32_hash_t v4;
+ XXH32_hash_t mem32[4];
+ XXH32_hash_t memsize;
+ XXH32_hash_t reserved; /* never read nor write, might be removed in a future version */
+}; /* typedef'd to XXH32_state_t */
+
+
+#ifndef XXH_NO_LONG_LONG /* defined when there is no 64-bit support */
+
+struct XXH64_state_s {
+ XXH64_hash_t total_len;
+ XXH64_hash_t v1;
+ XXH64_hash_t v2;
+ XXH64_hash_t v3;
+ XXH64_hash_t v4;
+ XXH64_hash_t mem64[4];
+ XXH32_hash_t memsize;
+ XXH32_hash_t reserved32; /* required for padding anyway */
+ XXH64_hash_t reserved64; /* never read nor write, might be removed in a future version */
+}; /* typedef'd to XXH64_state_t */
+
+#if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11+ */
+# include <stdalign.h>
+# define XXH_ALIGN(n) alignas(n)
+#elif defined(__GNUC__)
+# define XXH_ALIGN(n) __attribute__ ((aligned(n)))
+#elif defined(_MSC_VER)
+# define XXH_ALIGN(n) __declspec(align(n))
+#else
+# define XXH_ALIGN(n) /* disabled */
+#endif
+
+/* Old GCC versions only accept the attribute after the type in structures. */
+#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) /* C11+ */ \
+ && defined(__GNUC__)
+# define XXH_ALIGN_MEMBER(align, type) type XXH_ALIGN(align)
+#else
+# define XXH_ALIGN_MEMBER(align, type) XXH_ALIGN(align) type
+#endif
+
+#define XXH3_INTERNALBUFFER_SIZE 256
+#define XXH3_SECRET_DEFAULT_SIZE 192
+struct XXH3_state_s {
+ XXH_ALIGN_MEMBER(64, XXH64_hash_t acc[8]);
+ /* used to store a custom secret generated from a seed */
+ XXH_ALIGN_MEMBER(64, unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]);
+ XXH_ALIGN_MEMBER(64, unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]);
+ XXH32_hash_t bufferedSize;
+ XXH32_hash_t reserved32;
+ size_t nbStripesSoFar;
+ XXH64_hash_t totalLen;
+ size_t nbStripesPerBlock;
+ size_t secretLimit;
+ XXH64_hash_t seed;
+ XXH64_hash_t reserved64;
+ const unsigned char* extSecret; /* reference to external secret;
+ * if == NULL, use .customSecret instead */
+ /* note: there may be some padding at the end due to alignment on 64 bytes */
+}; /* typedef'd to XXH3_state_t */
+
+#undef XXH_ALIGN_MEMBER
+
+/* When the XXH3_state_t structure is merely emplaced on stack,
+ * it should be initialized with XXH3_INITSTATE() or a memset()
+ * in case its first reset uses XXH3_NNbits_reset_withSeed().
+ * This init can be omitted if the first reset uses default or _withSecret mode.
+ * This operation isn't necessary when the state is created with XXH3_createState().
+ * Note that this doesn't prepare the state for a streaming operation,
+ * it's still necessary to use XXH3_NNbits_reset*() afterwards.
+ */
+#define XXH3_INITSTATE(XXH3_state_ptr) { (XXH3_state_ptr)->seed = 0; }
+
+
+/* === Experimental API === */
+/* Symbols defined below must be considered tied to a specific library version. */
+
+/*
+ * XXH3_generateSecret():
+ *
+ * Derive a high-entropy secret from any user-defined content, named customSeed.
+ * The generated secret can be used in combination with `*_withSecret()` functions.
+ * The `_withSecret()` variants are useful to provide a higher level of protection than 64-bit seed,
+ * as it becomes much more difficult for an external actor to guess how to impact the calculation logic.
+ *
+ * The function accepts as input a custom seed of any length and any content,
+ * and derives from it a high-entropy secret of length XXH3_SECRET_DEFAULT_SIZE
+ * into an already allocated buffer secretBuffer.
+ * The generated secret is _always_ XXH_SECRET_DEFAULT_SIZE bytes long.
+ *
+ * The generated secret can then be used with any `*_withSecret()` variant.
+ * Functions `XXH3_128bits_withSecret()`, `XXH3_64bits_withSecret()`,
+ * `XXH3_128bits_reset_withSecret()` and `XXH3_64bits_reset_withSecret()`
+ * are part of this list. They all accept a `secret` parameter
+ * which must be very long for implementation reasons (>= XXH3_SECRET_SIZE_MIN)
+ * _and_ feature very high entropy (consist of random-looking bytes).
+ * These conditions can be a high bar to meet, so
+ * this function can be used to generate a secret of proper quality.
+ *
+ * customSeed can be anything. It can have any size, even small ones,
+ * and its content can be anything, even stupidly "low entropy" source such as a bunch of zeroes.
+ * The resulting `secret` will nonetheless provide all expected qualities.
+ *
+ * Supplying NULL as the customSeed copies the default secret into `secretBuffer`.
+ * When customSeedSize > 0, supplying NULL as customSeed is undefined behavior.
+ */
+XXH_PUBLIC_API void XXH3_generateSecret(void* secretBuffer, const void* customSeed, size_t customSeedSize);
+
+
+/* simple short-cut to pre-selected XXH3_128bits variant */
+XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t seed);
+
+
+#endif /* XXH_NO_LONG_LONG */
+
+
+#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)
+# define XXH_IMPLEMENTATION
+#endif
+
+#endif /* defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) */
+
+
+/* ======================================================================== */
+/* ======================================================================== */
+/* ======================================================================== */
+
+
+/*-**********************************************************************
+ * xxHash implementation
+ *-**********************************************************************
+ * xxHash's implementation used to be hosted inside xxhash.c.
+ *
+ * However, inlining requires implementation to be visible to the compiler,
+ * hence be included alongside the header.
+ * Previously, implementation was hosted inside xxhash.c,
+ * which was then #included when inlining was activated.
+ * This construction created issues with a few build and install systems,
+ * as it required xxhash.c to be stored in /include directory.
+ *
+ * xxHash implementation is now directly integrated within xxhash.h.
+ * As a consequence, xxhash.c is no longer needed in /include.
+ *
+ * xxhash.c is still available and is still useful.
+ * In a "normal" setup, when xxhash is not inlined,
+ * xxhash.h only exposes the prototypes and public symbols,
+ * while xxhash.c can be built into an object file xxhash.o
+ * which can then be linked into the final binary.
+ ************************************************************************/
+
+#if ( defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) \
+ || defined(XXH_IMPLEMENTATION) ) && !defined(XXH_IMPLEM_13a8737387)
+# define XXH_IMPLEM_13a8737387
+
+/* *************************************
+* Tuning parameters
+***************************************/
+/*!
+ * XXH_FORCE_MEMORY_ACCESS:
+ * By default, access to unaligned memory is controlled by `memcpy()`, which is
+ * safe and portable.
+ *
+ * Unfortunately, on some target/compiler combinations, the generated assembly
+ * is sub-optimal.
+ *
+ * The below switch allow selection of a different access method
+ * in the search for improved performance.
+ * Method 0 (default):
+ * Use `memcpy()`. Safe and portable. Default.
+ * Method 1:
+ * `__attribute__((packed))` statement. It depends on compiler extensions
+ * and is therefore not portable.
+ * This method is safe if your compiler supports it, and *generally* as
+ * fast or faster than `memcpy`.
+ * Method 2:
+ * Direct access via cast. This method doesn't depend on the compiler but
+ * violates the C standard.
+ * It can generate buggy code on targets which do not support unaligned
+ * memory accesses.
+ * But in some circumstances, it's the only known way to get the most
+ * performance (example: GCC + ARMv6)
+ * Method 3:
+ * Byteshift. This can generate the best code on old compilers which don't
+ * inline small `memcpy()` calls, and it might also be faster on big-endian
+ * systems which lack a native byteswap instruction.
+ * See https://stackoverflow.com/a/32095106/646947 for details.
+ * Prefer these methods in priority order (0 > 1 > 2 > 3)
+ */
+#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
+# if !defined(__clang__) && defined(__GNUC__) && defined(__ARM_FEATURE_UNALIGNED) && defined(__ARM_ARCH) && (__ARM_ARCH == 6)
+# define XXH_FORCE_MEMORY_ACCESS 2
+# elif !defined(__clang__) && ((defined(__INTEL_COMPILER) && !defined(_WIN32)) || \
+ (defined(__GNUC__) && (defined(__ARM_ARCH) && __ARM_ARCH >= 7)))
+# define XXH_FORCE_MEMORY_ACCESS 1
+# endif
+#endif
+
+/*!
+ * XXH_ACCEPT_NULL_INPUT_POINTER:
+ * If the input pointer is NULL, xxHash's default behavior is to dereference it,
+ * triggering a segfault.
+ * When this macro is enabled, xxHash actively checks the input for a null pointer.
+ * If it is, the result for null input pointers is the same as a zero-length input.
+ */
+#ifndef XXH_ACCEPT_NULL_INPUT_POINTER /* can be defined externally */
+# define XXH_ACCEPT_NULL_INPUT_POINTER 0
+#endif
+
+/*!
+ * XXH_FORCE_ALIGN_CHECK:
+ * This is an important performance trick
+ * for architectures without decent unaligned memory access performance.
+ * It checks for input alignment, and when conditions are met,
+ * uses a "fast path" employing direct 32-bit/64-bit read,
+ * resulting in _dramatically faster_ read speed.
+ *
+ * The check costs one initial branch per hash, which is generally negligible, but not zero.
+ * Moreover, it's not useful to generate binary for an additional code path
+ * if memory access uses same instruction for both aligned and unaligned adresses.
+ *
+ * In these cases, the alignment check can be removed by setting this macro to 0.
+ * Then the code will always use unaligned memory access.
+ * Align check is automatically disabled on x86, x64 & arm64,
+ * which are platforms known to offer good unaligned memory accesses performance.
+ *
+ * This option does not affect XXH3 (only XXH32 and XXH64).
+ */
+#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */
+# if defined(__i386) || defined(__x86_64__) || defined(__aarch64__) \
+ || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) /* visual */
+# define XXH_FORCE_ALIGN_CHECK 0
+# else
+# define XXH_FORCE_ALIGN_CHECK 1
+# endif
+#endif
+
+/*!
+ * XXH_NO_INLINE_HINTS:
+ *
+ * By default, xxHash tries to force the compiler to inline almost all internal
+ * functions.
+ *
+ * This can usually improve performance due to reduced jumping and improved
+ * constant folding, but significantly increases the size of the binary which
+ * might not be favorable.
+ *
+ * Additionally, sometimes the forced inlining can be detrimental to performance,
+ * depending on the architecture.
+ *
+ * XXH_NO_INLINE_HINTS marks all internal functions as static, giving the
+ * compiler full control on whether to inline or not.
+ *
+ * When not optimizing (-O0), optimizing for size (-Os, -Oz), or using
+ * -fno-inline with GCC or Clang, this will automatically be defined.
+ */
+#ifndef XXH_NO_INLINE_HINTS
+# if defined(__OPTIMIZE_SIZE__) /* -Os, -Oz */ \
+ || defined(__NO_INLINE__) /* -O0, -fno-inline */
+# define XXH_NO_INLINE_HINTS 1
+# else
+# define XXH_NO_INLINE_HINTS 0
+# endif
+#endif
+
+/*!
+ * XXH_REROLL:
+ * Whether to reroll XXH32_finalize, and XXH64_finalize,
+ * instead of using an unrolled jump table/if statement loop.
+ *
+ * This is automatically defined on -Os/-Oz on GCC and Clang.
+ */
+#ifndef XXH_REROLL
+# if defined(__OPTIMIZE_SIZE__)
+# define XXH_REROLL 1
+# else
+# define XXH_REROLL 0
+# endif
+#endif
+
+
+/* *************************************
+* Includes & Memory related functions
+***************************************/
+/*!
+ * Modify the local functions below should you wish to use
+ * different memory routines for malloc() and free()
+ */
+#include <stdlib.h>
+
+static void* XXH_malloc(size_t s) { return malloc(s); }
+static void XXH_free(void* p) { free(p); }
+
+/*! and for memcpy() */
+#include <string.h>
+static void* XXH_memcpy(void* dest, const void* src, size_t size)
+{
+ return memcpy(dest,src,size);
+}
+
+#include <limits.h> /* ULLONG_MAX */
+
+
+/* *************************************
+* Compiler Specific Options
+***************************************/
+#ifdef _MSC_VER /* Visual Studio warning fix */
+# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
+#endif
+
+#if XXH_NO_INLINE_HINTS /* disable inlining hints */
+# if defined(__GNUC__)
+# define XXH_FORCE_INLINE static __attribute__((unused))
+# else
+# define XXH_FORCE_INLINE static
+# endif
+# define XXH_NO_INLINE static
+/* enable inlining hints */
+#elif defined(_MSC_VER) /* Visual Studio */
+# define XXH_FORCE_INLINE static __forceinline
+# define XXH_NO_INLINE static __declspec(noinline)
+#elif defined(__GNUC__)
+# define XXH_FORCE_INLINE static __inline__ __attribute__((always_inline, unused))
+# define XXH_NO_INLINE static __attribute__((noinline))
+#elif defined (__cplusplus) \
+ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* C99 */
+# define XXH_FORCE_INLINE static inline
+# define XXH_NO_INLINE static
+#else
+# define XXH_FORCE_INLINE static
+# define XXH_NO_INLINE static
+#endif
+
+
+
+/* *************************************
+* Debug
+***************************************/
+/*
+ * XXH_DEBUGLEVEL is expected to be defined externally, typically via the
+ * compiler's command line options. The value must be a number.
+ */
+#ifndef XXH_DEBUGLEVEL
+# ifdef DEBUGLEVEL /* backwards compat */
+# define XXH_DEBUGLEVEL DEBUGLEVEL
+# else
+# define XXH_DEBUGLEVEL 0
+# endif
+#endif
+
+#if (XXH_DEBUGLEVEL>=1)
+# include <assert.h> /* note: can still be disabled with NDEBUG */
+# define XXH_ASSERT(c) assert(c)
+#else
+# define XXH_ASSERT(c) ((void)0)
+#endif
+
+/* note: use after variable declarations */
+#define XXH_STATIC_ASSERT(c) do { enum { XXH_sa = 1/(int)(!!(c)) }; } while (0)
+
+
+/* *************************************
+* Basic Types
+***************************************/
+#if !defined (__VMS) \
+ && (defined (__cplusplus) \
+ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
+# include <stdint.h>
+ typedef uint8_t xxh_u8;
+#else
+ typedef unsigned char xxh_u8;
+#endif
+typedef XXH32_hash_t xxh_u32;
+
+#ifdef XXH_OLD_NAMES
+# define BYTE xxh_u8
+# define U8 xxh_u8
+# define U32 xxh_u32
+#endif
+
+/* *** Memory access *** */
+
+#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3))
+/*
+ * Manual byteshift. Best for old compilers which don't inline memcpy.
+ * We actually directly use XXH_readLE32 and XXH_readBE32.
+ */
+#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2))
+
+/*
+ * Force direct memory access. Only works on CPU which support unaligned memory
+ * access in hardware.
+ */
+static xxh_u32 XXH_read32(const void* memPtr) { return *(const xxh_u32*) memPtr; }
+
+#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1))
+
+/*
+ * __pack instructions are safer but compiler specific, hence potentially
+ * problematic for some compilers.
+ *
+ * Currently only defined for GCC and ICC.
+ */
+#ifdef XXH_OLD_NAMES
+typedef union { xxh_u32 u32; } __attribute__((packed)) unalign;
+#endif
+static xxh_u32 XXH_read32(const void* ptr)
+{
+ typedef union { xxh_u32 u32; } __attribute__((packed)) xxh_unalign;
+ return ((const xxh_unalign*)ptr)->u32;
+}
+
+#else
+
+/*
+ * Portable and safe solution. Generally efficient.
+ * see: https://stackoverflow.com/a/32095106/646947
+ */
+static xxh_u32 XXH_read32(const void* memPtr)
+{
+ xxh_u32 val;
+ memcpy(&val, memPtr, sizeof(val));
+ return val;
+}
+
+#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */
+
+
+/* *** Endianess *** */
+typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess;
+
+/*!
+ * XXH_CPU_LITTLE_ENDIAN:
+ * Defined to 1 if the target is little endian, or 0 if it is big endian.
+ * It can be defined externally, for example on the compiler command line.
+ *
+ * If it is not defined, a runtime check (which is usually constant folded)
+ * is used instead.
+ */
+#ifndef XXH_CPU_LITTLE_ENDIAN
+/*
+ * Try to detect endianness automatically, to avoid the nonstandard behavior
+ * in `XXH_isLittleEndian()`
+ */
+# if defined(_WIN32) /* Windows is always little endian */ \
+ || defined(__LITTLE_ENDIAN__) \
+ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+# define XXH_CPU_LITTLE_ENDIAN 1
+# elif defined(__BIG_ENDIAN__) \
+ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+# define XXH_CPU_LITTLE_ENDIAN 0
+# else
+/*
+ * runtime test, presumed to simplify to a constant by compiler
+ */
+static int XXH_isLittleEndian(void)
+{
+ /*
+ * Portable and well-defined behavior.
+ * Don't use static: it is detrimental to performance.
+ */
+ const union { xxh_u32 u; xxh_u8 c[4]; } one = { 1 };
+ return one.c[0];
+}
+# define XXH_CPU_LITTLE_ENDIAN XXH_isLittleEndian()
+# endif
+#endif
+
+
+
+
+/* ****************************************
+* Compiler-specific Functions and Macros
+******************************************/
+#define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
+
+#ifdef __has_builtin
+# define XXH_HAS_BUILTIN(x) __has_builtin(x)
+#else
+# define XXH_HAS_BUILTIN(x) 0
+#endif
+
+#if !defined(NO_CLANG_BUILTIN) && XXH_HAS_BUILTIN(__builtin_rotateleft32) \
+ && XXH_HAS_BUILTIN(__builtin_rotateleft64)
+# define XXH_rotl32 __builtin_rotateleft32
+# define XXH_rotl64 __builtin_rotateleft64
+/* Note: although _rotl exists for minGW (GCC under windows), performance seems poor */
+#elif defined(_MSC_VER)
+# define XXH_rotl32(x,r) _rotl(x,r)
+# define XXH_rotl64(x,r) _rotl64(x,r)
+#else
+# define XXH_rotl32(x,r) (((x) << (r)) | ((x) >> (32 - (r))))
+# define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r))))
+#endif
+
+#if defined(_MSC_VER) /* Visual Studio */
+# define XXH_swap32 _byteswap_ulong
+#elif XXH_GCC_VERSION >= 403
+# define XXH_swap32 __builtin_bswap32
+#else
+static xxh_u32 XXH_swap32 (xxh_u32 x)
+{
+ return ((x << 24) & 0xff000000 ) |
+ ((x << 8) & 0x00ff0000 ) |
+ ((x >> 8) & 0x0000ff00 ) |
+ ((x >> 24) & 0x000000ff );
+}
+#endif
+
+
+/* ***************************
+* Memory reads
+*****************************/
+typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment;
+
+/*
+ * XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load.
+ *
+ * This is ideal for older compilers which don't inline memcpy.
+ */
+#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3))
+
+XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* memPtr)
+{
+ const xxh_u8* bytePtr = (const xxh_u8 *)memPtr;
+ return bytePtr[0]
+ | ((xxh_u32)bytePtr[1] << 8)
+ | ((xxh_u32)bytePtr[2] << 16)
+ | ((xxh_u32)bytePtr[3] << 24);
+}
+
+XXH_FORCE_INLINE xxh_u32 XXH_readBE32(const void* memPtr)
+{
+ const xxh_u8* bytePtr = (const xxh_u8 *)memPtr;
+ return bytePtr[3]
+ | ((xxh_u32)bytePtr[2] << 8)
+ | ((xxh_u32)bytePtr[1] << 16)
+ | ((xxh_u32)bytePtr[0] << 24);
+}
+
+#else
+XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* ptr)
+{
+ return XXH_CPU_LITTLE_ENDIAN ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr));
+}
+
+static xxh_u32 XXH_readBE32(const void* ptr)
+{
+ return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr);
+}
+#endif
+
+XXH_FORCE_INLINE xxh_u32
+XXH_readLE32_align(const void* ptr, XXH_alignment align)
+{
+ if (align==XXH_unaligned) {
+ return XXH_readLE32(ptr);
+ } else {
+ return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u32*)ptr : XXH_swap32(*(const xxh_u32*)ptr);
+ }
+}
+
+
+/* *************************************
+* Misc
+***************************************/
+XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; }
+
+
+/* *******************************************************************
+* 32-bit hash functions
+*********************************************************************/
+static const xxh_u32 XXH_PRIME32_1 = 0x9E3779B1U; /* 0b10011110001101110111100110110001 */
+static const xxh_u32 XXH_PRIME32_2 = 0x85EBCA77U; /* 0b10000101111010111100101001110111 */
+static const xxh_u32 XXH_PRIME32_3 = 0xC2B2AE3DU; /* 0b11000010101100101010111000111101 */
+static const xxh_u32 XXH_PRIME32_4 = 0x27D4EB2FU; /* 0b00100111110101001110101100101111 */
+static const xxh_u32 XXH_PRIME32_5 = 0x165667B1U; /* 0b00010110010101100110011110110001 */
+
+#ifdef XXH_OLD_NAMES
+# define PRIME32_1 XXH_PRIME32_1
+# define PRIME32_2 XXH_PRIME32_2
+# define PRIME32_3 XXH_PRIME32_3
+# define PRIME32_4 XXH_PRIME32_4
+# define PRIME32_5 XXH_PRIME32_5
+#endif
+
+static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input)
+{
+ acc += input * XXH_PRIME32_2;
+ acc = XXH_rotl32(acc, 13);
+ acc *= XXH_PRIME32_1;
+#if defined(__GNUC__) && defined(__SSE4_1__) && !defined(XXH_ENABLE_AUTOVECTORIZE)
+ /*
+ * UGLY HACK:
+ * This inline assembly hack forces acc into a normal register. This is the
+ * only thing that prevents GCC and Clang from autovectorizing the XXH32
+ * loop (pragmas and attributes don't work for some resason) without globally
+ * disabling SSE4.1.
+ *
+ * The reason we want to avoid vectorization is because despite working on
+ * 4 integers at a time, there are multiple factors slowing XXH32 down on
+ * SSE4:
+ * - There's a ridiculous amount of lag from pmulld (10 cycles of latency on
+ * newer chips!) making it slightly slower to multiply four integers at
+ * once compared to four integers independently. Even when pmulld was
+ * fastest, Sandy/Ivy Bridge, it is still not worth it to go into SSE
+ * just to multiply unless doing a long operation.
+ *
+ * - Four instructions are required to rotate,
+ * movqda tmp, v // not required with VEX encoding
+ * pslld tmp, 13 // tmp <<= 13
+ * psrld v, 19 // x >>= 19
+ * por v, tmp // x |= tmp
+ * compared to one for scalar:
+ * roll v, 13 // reliably fast across the board
+ * shldl v, v, 13 // Sandy Bridge and later prefer this for some reason
+ *
+ * - Instruction level parallelism is actually more beneficial here because
+ * the SIMD actually serializes this operation: While v1 is rotating, v2
+ * can load data, while v3 can multiply. SSE forces them to operate
+ * together.
+ *
+ * How this hack works:
+ * __asm__("" // Declare an assembly block but don't declare any instructions
+ * : // However, as an Input/Output Operand,
+ * "+r" // constrain a read/write operand (+) as a general purpose register (r).
+ * (acc) // and set acc as the operand
+ * );
+ *
+ * Because of the 'r', the compiler has promised that seed will be in a
+ * general purpose register and the '+' says that it will be 'read/write',
+ * so it has to assume it has changed. It is like volatile without all the
+ * loads and stores.
+ *
+ * Since the argument has to be in a normal register (not an SSE register),
+ * each time XXH32_round is called, it is impossible to vectorize.
+ */
+ __asm__("" : "+r" (acc));
+#endif
+ return acc;
+}
+
+/* mix all bits */
+static xxh_u32 XXH32_avalanche(xxh_u32 h32)
+{
+ h32 ^= h32 >> 15;
+ h32 *= XXH_PRIME32_2;
+ h32 ^= h32 >> 13;
+ h32 *= XXH_PRIME32_3;
+ h32 ^= h32 >> 16;
+ return(h32);
+}
+
+#define XXH_get32bits(p) XXH_readLE32_align(p, align)
+
+static xxh_u32
+XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align)
+{
+#define XXH_PROCESS1 do { \
+ h32 += (*ptr++) * XXH_PRIME32_5; \
+ h32 = XXH_rotl32(h32, 11) * XXH_PRIME32_1; \
+} while (0)
+
+#define XXH_PROCESS4 do { \
+ h32 += XXH_get32bits(ptr) * XXH_PRIME32_3; \
+ ptr += 4; \
+ h32 = XXH_rotl32(h32, 17) * XXH_PRIME32_4; \
+} while (0)
+
+ /* Compact rerolled version */
+ if (XXH_REROLL) {
+ len &= 15;
+ while (len >= 4) {
+ XXH_PROCESS4;
+ len -= 4;
+ }
+ while (len > 0) {
+ XXH_PROCESS1;
+ --len;
+ }
+ return XXH32_avalanche(h32);
+ } else {
+ switch(len&15) /* or switch(bEnd - p) */ {
+ case 12: XXH_PROCESS4;
+ /* fallthrough */
+ case 8: XXH_PROCESS4;
+ /* fallthrough */
+ case 4: XXH_PROCESS4;
+ return XXH32_avalanche(h32);
+
+ case 13: XXH_PROCESS4;
+ /* fallthrough */
+ case 9: XXH_PROCESS4;
+ /* fallthrough */
+ case 5: XXH_PROCESS4;
+ XXH_PROCESS1;
+ return XXH32_avalanche(h32);
+
+ case 14: XXH_PROCESS4;
+ /* fallthrough */
+ case 10: XXH_PROCESS4;
+ /* fallthrough */
+ case 6: XXH_PROCESS4;
+ XXH_PROCESS1;
+ XXH_PROCESS1;
+ return XXH32_avalanche(h32);
+
+ case 15: XXH_PROCESS4;
+ /* fallthrough */
+ case 11: XXH_PROCESS4;
+ /* fallthrough */
+ case 7: XXH_PROCESS4;
+ /* fallthrough */
+ case 3: XXH_PROCESS1;
+ /* fallthrough */
+ case 2: XXH_PROCESS1;
+ /* fallthrough */
+ case 1: XXH_PROCESS1;
+ /* fallthrough */
+ case 0: return XXH32_avalanche(h32);
+ }
+ XXH_ASSERT(0);
+ return h32; /* reaching this point is deemed impossible */
+ }
+}
+
+#ifdef XXH_OLD_NAMES
+# define PROCESS1 XXH_PROCESS1
+# define PROCESS4 XXH_PROCESS4
+#else
+# undef XXH_PROCESS1
+# undef XXH_PROCESS4
+#endif
+
+XXH_FORCE_INLINE xxh_u32
+XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align)
+{
+ const xxh_u8* bEnd = input + len;
+ xxh_u32 h32;
+
+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1)
+ if (input==NULL) {
+ len=0;
+ bEnd=input=(const xxh_u8*)(size_t)16;
+ }
+#endif
+
+ if (len>=16) {
+ const xxh_u8* const limit = bEnd - 15;
+ xxh_u32 v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2;
+ xxh_u32 v2 = seed + XXH_PRIME32_2;
+ xxh_u32 v3 = seed + 0;
+ xxh_u32 v4 = seed - XXH_PRIME32_1;
+
+ do {
+ v1 = XXH32_round(v1, XXH_get32bits(input)); input += 4;
+ v2 = XXH32_round(v2, XXH_get32bits(input)); input += 4;
+ v3 = XXH32_round(v3, XXH_get32bits(input)); input += 4;
+ v4 = XXH32_round(v4, XXH_get32bits(input)); input += 4;
+ } while (input < limit);
+
+ h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7)
+ + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18);
+ } else {
+ h32 = seed + XXH_PRIME32_5;
+ }
+
+ h32 += (xxh_u32)len;
+
+ return XXH32_finalize(h32, input, len&15, align);
+}
+
+
+XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed)
+{
+#if 0
+ /* Simple version, good for code maintenance, but unfortunately slow for small inputs */
+ XXH32_state_t state;
+ XXH32_reset(&state, seed);
+ XXH32_update(&state, (const xxh_u8*)input, len);
+ return XXH32_digest(&state);
+
+#else
+
+ if (XXH_FORCE_ALIGN_CHECK) {
+ if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */
+ return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_aligned);
+ } }
+
+ return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned);
+#endif
+}
+
+
+
+/******* Hash streaming *******/
+
+XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void)
+{
+ return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t));
+}
+XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr)
+{
+ XXH_free(statePtr);
+ return XXH_OK;
+}
+
+XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState)
+{
+ memcpy(dstState, srcState, sizeof(*dstState));
+}
+
+XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed)
+{
+ XXH32_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */
+ memset(&state, 0, sizeof(state));
+ state.v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2;
+ state.v2 = seed + XXH_PRIME32_2;
+ state.v3 = seed + 0;
+ state.v4 = seed - XXH_PRIME32_1;
+ /* do not write into reserved, planned to be removed in a future version */
+ memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved));
+ return XXH_OK;
+}
+
+
+XXH_PUBLIC_API XXH_errorcode
+XXH32_update(XXH32_state_t* state, const void* input, size_t len)
+{
+ if (input==NULL)
+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1)
+ return XXH_OK;
+#else
+ return XXH_ERROR;
+#endif
+
+ { const xxh_u8* p = (const xxh_u8*)input;
+ const xxh_u8* const bEnd = p + len;
+
+ state->total_len_32 += (XXH32_hash_t)len;
+ state->large_len |= (XXH32_hash_t)((len>=16) | (state->total_len_32>=16));
+
+ if (state->memsize + len < 16) { /* fill in tmp buffer */
+ XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, len);
+ state->memsize += (XXH32_hash_t)len;
+ return XXH_OK;
+ }
+
+ if (state->memsize) { /* some data left from previous update */
+ XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, 16-state->memsize);
+ { const xxh_u32* p32 = state->mem32;
+ state->v1 = XXH32_round(state->v1, XXH_readLE32(p32)); p32++;
+ state->v2 = XXH32_round(state->v2, XXH_readLE32(p32)); p32++;
+ state->v3 = XXH32_round(state->v3, XXH_readLE32(p32)); p32++;
+ state->v4 = XXH32_round(state->v4, XXH_readLE32(p32));
+ }
+ p += 16-state->memsize;
+ state->memsize = 0;
+ }
+
+ if (p <= bEnd-16) {
+ const xxh_u8* const limit = bEnd - 16;
+ xxh_u32 v1 = state->v1;
+ xxh_u32 v2 = state->v2;
+ xxh_u32 v3 = state->v3;
+ xxh_u32 v4 = state->v4;
+
+ do {
+ v1 = XXH32_round(v1, XXH_readLE32(p)); p+=4;
+ v2 = XXH32_round(v2, XXH_readLE32(p)); p+=4;
+ v3 = XXH32_round(v3, XXH_readLE32(p)); p+=4;
+ v4 = XXH32_round(v4, XXH_readLE32(p)); p+=4;
+ } while (p<=limit);
+
+ state->v1 = v1;
+ state->v2 = v2;
+ state->v3 = v3;
+ state->v4 = v4;
+ }
+
+ if (p < bEnd) {
+ XXH_memcpy(state->mem32, p, (size_t)(bEnd-p));
+ state->memsize = (unsigned)(bEnd-p);
+ }
+ }
+
+ return XXH_OK;
+}
+
+
+XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* state)
+{
+ xxh_u32 h32;
+
+ if (state->large_len) {
+ h32 = XXH_rotl32(state->v1, 1)
+ + XXH_rotl32(state->v2, 7)
+ + XXH_rotl32(state->v3, 12)
+ + XXH_rotl32(state->v4, 18);
+ } else {
+ h32 = state->v3 /* == seed */ + XXH_PRIME32_5;
+ }
+
+ h32 += state->total_len_32;
+
+ return XXH32_finalize(h32, (const xxh_u8*)state->mem32, state->memsize, XXH_aligned);
+}
+
+
+/******* Canonical representation *******/
+
+/*
+ * The default return values from XXH functions are unsigned 32 and 64 bit
+ * integers.
+ *
+ * The canonical representation uses big endian convention, the same convention
+ * as human-readable numbers (large digits first).
+ *
+ * This way, hash values can be written into a file or buffer, remaining
+ * comparable across different systems.
+ *
+ * The following functions allow transformation of hash values to and from their
+ * canonical format.
+ */
+XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash)
+{
+ XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t));
+ if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash);
+ memcpy(dst, &hash, sizeof(*dst));
+}
+
+XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src)
+{
+ return XXH_readBE32(src);
+}
+
+
+#ifndef XXH_NO_LONG_LONG
+
+/* *******************************************************************
+* 64-bit hash functions
+*********************************************************************/
+
+/******* Memory access *******/
+
+typedef XXH64_hash_t xxh_u64;
+
+#ifdef XXH_OLD_NAMES
+# define U64 xxh_u64
+#endif
+
+/*!
+ * XXH_REROLL_XXH64:
+ * Whether to reroll the XXH64_finalize() loop.
+ *
+ * Just like XXH32, we can unroll the XXH64_finalize() loop. This can be a
+ * performance gain on 64-bit hosts, as only one jump is required.
+ *
+ * However, on 32-bit hosts, because arithmetic needs to be done with two 32-bit
+ * registers, and 64-bit arithmetic needs to be simulated, it isn't beneficial
+ * to unroll. The code becomes ridiculously large (the largest function in the
+ * binary on i386!), and rerolling it saves anywhere from 3kB to 20kB. It is
+ * also slightly faster because it fits into cache better and is more likely
+ * to be inlined by the compiler.
+ *
+ * If XXH_REROLL is defined, this is ignored and the loop is always rerolled.
+ */
+#ifndef XXH_REROLL_XXH64
+# if (defined(__ILP32__) || defined(_ILP32)) /* ILP32 is often defined on 32-bit GCC family */ \
+ || !(defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) /* x86-64 */ \
+ || defined(_M_ARM64) || defined(__aarch64__) || defined(__arm64__) /* aarch64 */ \
+ || defined(__PPC64__) || defined(__PPC64LE__) || defined(__ppc64__) || defined(__powerpc64__) /* ppc64 */ \
+ || defined(__mips64__) || defined(__mips64)) /* mips64 */ \
+ || (!defined(SIZE_MAX) || SIZE_MAX < ULLONG_MAX) /* check limits */
+# define XXH_REROLL_XXH64 1
+# else
+# define XXH_REROLL_XXH64 0
+# endif
+#endif /* !defined(XXH_REROLL_XXH64) */
+
+#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3))
+/*
+ * Manual byteshift. Best for old compilers which don't inline memcpy.
+ * We actually directly use XXH_readLE64 and XXH_readBE64.
+ */
+#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2))
+
+/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */
+static xxh_u64 XXH_read64(const void* memPtr) { return *(const xxh_u64*) memPtr; }
+
+#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1))
+
+/*
+ * __pack instructions are safer, but compiler specific, hence potentially
+ * problematic for some compilers.
+ *
+ * Currently only defined for GCC and ICC.
+ */
+#ifdef XXH_OLD_NAMES
+typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) unalign64;
+#endif
+static xxh_u64 XXH_read64(const void* ptr)
+{
+ typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) xxh_unalign64;
+ return ((const xxh_unalign64*)ptr)->u64;
+}
+
+#else
+
+/*
+ * Portable and safe solution. Generally efficient.
+ * see: https://stackoverflow.com/a/32095106/646947
+ */
+static xxh_u64 XXH_read64(const void* memPtr)
+{
+ xxh_u64 val;
+ memcpy(&val, memPtr, sizeof(val));
+ return val;
+}
+
+#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */
+
+#if defined(_MSC_VER) /* Visual Studio */
+# define XXH_swap64 _byteswap_uint64
+#elif XXH_GCC_VERSION >= 403
+# define XXH_swap64 __builtin_bswap64
+#else
+static xxh_u64 XXH_swap64 (xxh_u64 x)
+{
+ return ((x << 56) & 0xff00000000000000ULL) |
+ ((x << 40) & 0x00ff000000000000ULL) |
+ ((x << 24) & 0x0000ff0000000000ULL) |
+ ((x << 8) & 0x000000ff00000000ULL) |
+ ((x >> 8) & 0x00000000ff000000ULL) |
+ ((x >> 24) & 0x0000000000ff0000ULL) |
+ ((x >> 40) & 0x000000000000ff00ULL) |
+ ((x >> 56) & 0x00000000000000ffULL);
+}
+#endif
+
+
+/* XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. */
+#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3))
+
+XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* memPtr)
+{
+ const xxh_u8* bytePtr = (const xxh_u8 *)memPtr;
+ return bytePtr[0]
+ | ((xxh_u64)bytePtr[1] << 8)
+ | ((xxh_u64)bytePtr[2] << 16)
+ | ((xxh_u64)bytePtr[3] << 24)
+ | ((xxh_u64)bytePtr[4] << 32)
+ | ((xxh_u64)bytePtr[5] << 40)
+ | ((xxh_u64)bytePtr[6] << 48)
+ | ((xxh_u64)bytePtr[7] << 56);
+}
+
+XXH_FORCE_INLINE xxh_u64 XXH_readBE64(const void* memPtr)
+{
+ const xxh_u8* bytePtr = (const xxh_u8 *)memPtr;
+ return bytePtr[7]
+ | ((xxh_u64)bytePtr[6] << 8)
+ | ((xxh_u64)bytePtr[5] << 16)
+ | ((xxh_u64)bytePtr[4] << 24)
+ | ((xxh_u64)bytePtr[3] << 32)
+ | ((xxh_u64)bytePtr[2] << 40)
+ | ((xxh_u64)bytePtr[1] << 48)
+ | ((xxh_u64)bytePtr[0] << 56);
+}
+
+#else
+XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* ptr)
+{
+ return XXH_CPU_LITTLE_ENDIAN ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr));
+}
+
+static xxh_u64 XXH_readBE64(const void* ptr)
+{
+ return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr);
+}
+#endif
+
+XXH_FORCE_INLINE xxh_u64
+XXH_readLE64_align(const void* ptr, XXH_alignment align)
+{
+ if (align==XXH_unaligned)
+ return XXH_readLE64(ptr);
+ else
+ return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u64*)ptr : XXH_swap64(*(const xxh_u64*)ptr);
+}
+
+
+/******* xxh64 *******/
+
+static const xxh_u64 XXH_PRIME64_1 = 0x9E3779B185EBCA87ULL; /* 0b1001111000110111011110011011000110000101111010111100101010000111 */
+static const xxh_u64 XXH_PRIME64_2 = 0xC2B2AE3D27D4EB4FULL; /* 0b1100001010110010101011100011110100100111110101001110101101001111 */
+static const xxh_u64 XXH_PRIME64_3 = 0x165667B19E3779F9ULL; /* 0b0001011001010110011001111011000110011110001101110111100111111001 */
+static const xxh_u64 XXH_PRIME64_4 = 0x85EBCA77C2B2AE63ULL; /* 0b1000010111101011110010100111011111000010101100101010111001100011 */
+static const xxh_u64 XXH_PRIME64_5 = 0x27D4EB2F165667C5ULL; /* 0b0010011111010100111010110010111100010110010101100110011111000101 */
+
+#ifdef XXH_OLD_NAMES
+# define PRIME64_1 XXH_PRIME64_1
+# define PRIME64_2 XXH_PRIME64_2
+# define PRIME64_3 XXH_PRIME64_3
+# define PRIME64_4 XXH_PRIME64_4
+# define PRIME64_5 XXH_PRIME64_5
+#endif
+
+static xxh_u64 XXH64_round(xxh_u64 acc, xxh_u64 input)
+{
+ acc += input * XXH_PRIME64_2;
+ acc = XXH_rotl64(acc, 31);
+ acc *= XXH_PRIME64_1;
+ return acc;
+}
+
+static xxh_u64 XXH64_mergeRound(xxh_u64 acc, xxh_u64 val)
+{
+ val = XXH64_round(0, val);
+ acc ^= val;
+ acc = acc * XXH_PRIME64_1 + XXH_PRIME64_4;
+ return acc;
+}
+
+static xxh_u64 XXH64_avalanche(xxh_u64 h64)
+{
+ h64 ^= h64 >> 33;
+ h64 *= XXH_PRIME64_2;
+ h64 ^= h64 >> 29;
+ h64 *= XXH_PRIME64_3;
+ h64 ^= h64 >> 32;
+ return h64;
+}
+
+
+#define XXH_get64bits(p) XXH_readLE64_align(p, align)
+
+static xxh_u64
+XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align)
+{
+#define XXH_PROCESS1_64 do { \
+ h64 ^= (*ptr++) * XXH_PRIME64_5; \
+ h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1; \
+} while (0)
+
+#define XXH_PROCESS4_64 do { \
+ h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; \
+ ptr += 4; \
+ h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; \
+} while (0)
+
+#define XXH_PROCESS8_64 do { \
+ xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); \
+ ptr += 8; \
+ h64 ^= k1; \
+ h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4; \
+} while (0)
+
+ /* Rerolled version for 32-bit targets is faster and much smaller. */
+ if (XXH_REROLL || XXH_REROLL_XXH64) {
+ len &= 31;
+ while (len >= 8) {
+ XXH_PROCESS8_64;
+ len -= 8;
+ }
+ if (len >= 4) {
+ XXH_PROCESS4_64;
+ len -= 4;
+ }
+ while (len > 0) {
+ XXH_PROCESS1_64;
+ --len;
+ }
+ return XXH64_avalanche(h64);
+ } else {
+ switch(len & 31) {
+ case 24: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 16: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 8: XXH_PROCESS8_64;
+ return XXH64_avalanche(h64);
+
+ case 28: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 20: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 12: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 4: XXH_PROCESS4_64;
+ return XXH64_avalanche(h64);
+
+ case 25: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 17: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 9: XXH_PROCESS8_64;
+ XXH_PROCESS1_64;
+ return XXH64_avalanche(h64);
+
+ case 29: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 21: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 13: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 5: XXH_PROCESS4_64;
+ XXH_PROCESS1_64;
+ return XXH64_avalanche(h64);
+
+ case 26: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 18: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 10: XXH_PROCESS8_64;
+ XXH_PROCESS1_64;
+ XXH_PROCESS1_64;
+ return XXH64_avalanche(h64);
+
+ case 30: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 22: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 14: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 6: XXH_PROCESS4_64;
+ XXH_PROCESS1_64;
+ XXH_PROCESS1_64;
+ return XXH64_avalanche(h64);
+
+ case 27: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 19: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 11: XXH_PROCESS8_64;
+ XXH_PROCESS1_64;
+ XXH_PROCESS1_64;
+ XXH_PROCESS1_64;
+ return XXH64_avalanche(h64);
+
+ case 31: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 23: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 15: XXH_PROCESS8_64;
+ /* fallthrough */
+ case 7: XXH_PROCESS4_64;
+ /* fallthrough */
+ case 3: XXH_PROCESS1_64;
+ /* fallthrough */
+ case 2: XXH_PROCESS1_64;
+ /* fallthrough */
+ case 1: XXH_PROCESS1_64;
+ /* fallthrough */
+ case 0: return XXH64_avalanche(h64);
+ }
+ }
+ /* impossible to reach */
+ XXH_ASSERT(0);
+ return 0; /* unreachable, but some compilers complain without it */
+}
+
+#ifdef XXH_OLD_NAMES
+# define PROCESS1_64 XXH_PROCESS1_64
+# define PROCESS4_64 XXH_PROCESS4_64
+# define PROCESS8_64 XXH_PROCESS8_64
+#else
+# undef XXH_PROCESS1_64
+# undef XXH_PROCESS4_64
+# undef XXH_PROCESS8_64
+#endif
+
+XXH_FORCE_INLINE xxh_u64
+XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align)
+{
+ const xxh_u8* bEnd = input + len;
+ xxh_u64 h64;
+
+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1)
+ if (input==NULL) {
+ len=0;
+ bEnd=input=(const xxh_u8*)(size_t)32;
+ }
+#endif
+
+ if (len>=32) {
+ const xxh_u8* const limit = bEnd - 32;
+ xxh_u64 v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2;
+ xxh_u64 v2 = seed + XXH_PRIME64_2;
+ xxh_u64 v3 = seed + 0;
+ xxh_u64 v4 = seed - XXH_PRIME64_1;
+
+ do {
+ v1 = XXH64_round(v1, XXH_get64bits(input)); input+=8;
+ v2 = XXH64_round(v2, XXH_get64bits(input)); input+=8;
+ v3 = XXH64_round(v3, XXH_get64bits(input)); input+=8;
+ v4 = XXH64_round(v4, XXH_get64bits(input)); input+=8;
+ } while (input<=limit);
+
+ h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
+ h64 = XXH64_mergeRound(h64, v1);
+ h64 = XXH64_mergeRound(h64, v2);
+ h64 = XXH64_mergeRound(h64, v3);
+ h64 = XXH64_mergeRound(h64, v4);
+
+ } else {
+ h64 = seed + XXH_PRIME64_5;
+ }
+
+ h64 += (xxh_u64) len;
+
+ return XXH64_finalize(h64, input, len, align);
+}
+
+
+XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t len, XXH64_hash_t seed)
+{
+#if 0
+ /* Simple version, good for code maintenance, but unfortunately slow for small inputs */
+ XXH64_state_t state;
+ XXH64_reset(&state, seed);
+ XXH64_update(&state, (const xxh_u8*)input, len);
+ return XXH64_digest(&state);
+
+#else
+
+ if (XXH_FORCE_ALIGN_CHECK) {
+ if ((((size_t)input) & 7)==0) { /* Input is aligned, let's leverage the speed advantage */
+ return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_aligned);
+ } }
+
+ return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned);
+
+#endif
+}
+
+/******* Hash Streaming *******/
+
+XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void)
+{
+ return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t));
+}
+XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr)
+{
+ XXH_free(statePtr);
+ return XXH_OK;
+}
+
+XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dstState, const XXH64_state_t* srcState)
+{
+ memcpy(dstState, srcState, sizeof(*dstState));
+}
+
+XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, XXH64_hash_t seed)
+{
+ XXH64_state_t state; /* use a local state to memcpy() in order to avoid strict-aliasing warnings */
+ memset(&state, 0, sizeof(state));
+ state.v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2;
+ state.v2 = seed + XXH_PRIME64_2;
+ state.v3 = seed + 0;
+ state.v4 = seed - XXH_PRIME64_1;
+ /* do not write into reserved64, might be removed in a future version */
+ memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved64));
+ return XXH_OK;
+}
+
+XXH_PUBLIC_API XXH_errorcode
+XXH64_update (XXH64_state_t* state, const void* input, size_t len)
+{
+ if (input==NULL)
+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1)
+ return XXH_OK;
+#else
+ return XXH_ERROR;
+#endif
+
+ { const xxh_u8* p = (const xxh_u8*)input;
+ const xxh_u8* const bEnd = p + len;
+
+ state->total_len += len;
+
+ if (state->memsize + len < 32) { /* fill in tmp buffer */
+ XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, len);
+ state->memsize += (xxh_u32)len;
+ return XXH_OK;
+ }
+
+ if (state->memsize) { /* tmp buffer is full */
+ XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, 32-state->memsize);
+ state->v1 = XXH64_round(state->v1, XXH_readLE64(state->mem64+0));
+ state->v2 = XXH64_round(state->v2, XXH_readLE64(state->mem64+1));
+ state->v3 = XXH64_round(state->v3, XXH_readLE64(state->mem64+2));
+ state->v4 = XXH64_round(state->v4, XXH_readLE64(state->mem64+3));
+ p += 32-state->memsize;
+ state->memsize = 0;
+ }
+
+ if (p+32 <= bEnd) {
+ const xxh_u8* const limit = bEnd - 32;
+ xxh_u64 v1 = state->v1;
+ xxh_u64 v2 = state->v2;
+ xxh_u64 v3 = state->v3;
+ xxh_u64 v4 = state->v4;
+
+ do {
+ v1 = XXH64_round(v1, XXH_readLE64(p)); p+=8;
+ v2 = XXH64_round(v2, XXH_readLE64(p)); p+=8;
+ v3 = XXH64_round(v3, XXH_readLE64(p)); p+=8;
+ v4 = XXH64_round(v4, XXH_readLE64(p)); p+=8;
+ } while (p<=limit);
+
+ state->v1 = v1;
+ state->v2 = v2;
+ state->v3 = v3;
+ state->v4 = v4;
+ }
+
+ if (p < bEnd) {
+ XXH_memcpy(state->mem64, p, (size_t)(bEnd-p));
+ state->memsize = (unsigned)(bEnd-p);
+ }
+ }
+
+ return XXH_OK;
+}
+
+
+XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* state)
+{
+ xxh_u64 h64;
+
+ if (state->total_len >= 32) {
+ xxh_u64 const v1 = state->v1;
+ xxh_u64 const v2 = state->v2;
+ xxh_u64 const v3 = state->v3;
+ xxh_u64 const v4 = state->v4;
+
+ h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
+ h64 = XXH64_mergeRound(h64, v1);
+ h64 = XXH64_mergeRound(h64, v2);
+ h64 = XXH64_mergeRound(h64, v3);
+ h64 = XXH64_mergeRound(h64, v4);
+ } else {
+ h64 = state->v3 /*seed*/ + XXH_PRIME64_5;
+ }
+
+ h64 += (xxh_u64) state->total_len;
+
+ return XXH64_finalize(h64, (const xxh_u8*)state->mem64, (size_t)state->total_len, XXH_aligned);
+}
+
+
+/******* Canonical representation *******/
+
+XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash)
+{
+ XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t));
+ if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash);
+ memcpy(dst, &hash, sizeof(*dst));
+}
+
+XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src)
+{
+ return XXH_readBE64(src);
+}
+
+
+
+/* *********************************************************************
+* XXH3
+* New generation hash designed for speed on small keys and vectorization
+************************************************************************ */
+
+/* === Compiler specifics === */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */
+# define XXH_RESTRICT restrict
+#else
+/* Note: it might be useful to define __restrict or __restrict__ for some C++ compilers */
+# define XXH_RESTRICT /* disable */
+#endif
+
+#if (defined(__GNUC__) && (__GNUC__ >= 3)) \
+ || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) \
+ || defined(__clang__)
+# define XXH_likely(x) __builtin_expect(x, 1)
+# define XXH_unlikely(x) __builtin_expect(x, 0)
+#else
+# define XXH_likely(x) (x)
+# define XXH_unlikely(x) (x)
+#endif
+
+#if defined(__GNUC__)
+# if defined(__AVX2__)
+# include <immintrin.h>
+# elif defined(__SSE2__)
+# include <emmintrin.h>
+# elif defined(__ARM_NEON__) || defined(__ARM_NEON)
+# define inline __inline__ /* circumvent a clang bug */
+# include <arm_neon.h>
+# undef inline
+# endif
+#elif defined(_MSC_VER)
+# include <intrin.h>
+#endif
+
+/*
+ * One goal of XXH3 is to make it fast on both 32-bit and 64-bit, while
+ * remaining a true 64-bit/128-bit hash function.
+ *
+ * This is done by prioritizing a subset of 64-bit operations that can be
+ * emulated without too many steps on the average 32-bit machine.
+ *
+ * For example, these two lines seem similar, and run equally fast on 64-bit:
+ *
+ * xxh_u64 x;
+ * x ^= (x >> 47); // good
+ * x ^= (x >> 13); // bad
+ *
+ * However, to a 32-bit machine, there is a major difference.
+ *
+ * x ^= (x >> 47) looks like this:
+ *
+ * x.lo ^= (x.hi >> (47 - 32));
+ *
+ * while x ^= (x >> 13) looks like this:
+ *
+ * // note: funnel shifts are not usually cheap.
+ * x.lo ^= (x.lo >> 13) | (x.hi << (32 - 13));
+ * x.hi ^= (x.hi >> 13);
+ *
+ * The first one is significantly faster than the second, simply because the
+ * shift is larger than 32. This means:
+ * - All the bits we need are in the upper 32 bits, so we can ignore the lower
+ * 32 bits in the shift.
+ * - The shift result will always fit in the lower 32 bits, and therefore,
+ * we can ignore the upper 32 bits in the xor.
+ *
+ * Thanks to this optimization, XXH3 only requires these features to be efficient:
+ *
+ * - Usable unaligned access
+ * - A 32-bit or 64-bit ALU
+ * - If 32-bit, a decent ADC instruction
+ * - A 32 or 64-bit multiply with a 64-bit result
+ * - For the 128-bit variant, a decent byteswap helps short inputs.
+ *
+ * The first two are already required by XXH32, and almost all 32-bit and 64-bit
+ * platforms which can run XXH32 can run XXH3 efficiently.
+ *
+ * Thumb-1, the classic 16-bit only subset of ARM's instruction set, is one
+ * notable exception.
+ *
+ * First of all, Thumb-1 lacks support for the UMULL instruction which
+ * performs the important long multiply. This means numerous __aeabi_lmul
+ * calls.
+ *
+ * Second of all, the 8 functional registers are just not enough.
+ * Setup for __aeabi_lmul, byteshift loads, pointers, and all arithmetic need
+ * Lo registers, and this shuffling results in thousands more MOVs than A32.
+ *
+ * A32 and T32 don't have this limitation. They can access all 14 registers,
+ * do a 32->64 multiply with UMULL, and the flexible operand allowing free
+ * shifts is helpful, too.
+ *
+ * Therefore, we do a quick sanity check.
+ *
+ * If compiling Thumb-1 for a target which supports ARM instructions, we will
+ * emit a warning, as it is not a "sane" platform to compile for.
+ *
+ * Usually, if this happens, it is because of an accident and you probably need
+ * to specify -march, as you likely meant to compile for a newer architecture.
+ *
+ * Credit: large sections of the vectorial and asm source code paths
+ * have been contributed by @easyaspi314
+ */
+#if defined(__thumb__) && !defined(__thumb2__) && defined(__ARM_ARCH_ISA_ARM)
+# warning "XXH3 is highly inefficient without ARM or Thumb-2."
+#endif
+
+/* ==========================================
+ * Vectorization detection
+ * ========================================== */
+#define XXH_SCALAR 0 /* Portable scalar version */
+#define XXH_SSE2 1 /* SSE2 for Pentium 4 and all x86_64 */
+#define XXH_AVX2 2 /* AVX2 for Haswell and Bulldozer */
+#define XXH_AVX512 3 /* AVX512 for Skylake and Icelake */
+#define XXH_NEON 4 /* NEON for most ARMv7-A and all AArch64 */
+#define XXH_VSX 5 /* VSX and ZVector for POWER8/z13 */
+
+#ifndef XXH_VECTOR /* can be defined on command line */
+# if defined(__AVX512F__)
+# define XXH_VECTOR XXH_AVX512
+# elif defined(__AVX2__)
+# define XXH_VECTOR XXH_AVX2
+# elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2))
+# define XXH_VECTOR XXH_SSE2
+# elif defined(__GNUC__) /* msvc support maybe later */ \
+ && (defined(__ARM_NEON__) || defined(__ARM_NEON)) \
+ && (defined(__LITTLE_ENDIAN__) /* We only support little endian NEON */ \
+ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
+# define XXH_VECTOR XXH_NEON
+# elif (defined(__PPC64__) && defined(__POWER8_VECTOR__)) \
+ || (defined(__s390x__) && defined(__VEC__)) \
+ && defined(__GNUC__) /* TODO: IBM XL */
+# define XXH_VECTOR XXH_VSX
+# else
+# define XXH_VECTOR XXH_SCALAR
+# endif
+#endif
+
+/*
+ * Controls the alignment of the accumulator,
+ * for compatibility with aligned vector loads, which are usually faster.
+ */
+#ifndef XXH_ACC_ALIGN
+# if defined(XXH_X86DISPATCH)
+# define XXH_ACC_ALIGN 64 /* for compatibility with avx512 */
+# elif XXH_VECTOR == XXH_SCALAR /* scalar */
+# define XXH_ACC_ALIGN 8
+# elif XXH_VECTOR == XXH_SSE2 /* sse2 */
+# define XXH_ACC_ALIGN 16
+# elif XXH_VECTOR == XXH_AVX2 /* avx2 */
+# define XXH_ACC_ALIGN 32
+# elif XXH_VECTOR == XXH_NEON /* neon */
+# define XXH_ACC_ALIGN 16
+# elif XXH_VECTOR == XXH_VSX /* vsx */
+# define XXH_ACC_ALIGN 16
+# elif XXH_VECTOR == XXH_AVX512 /* avx512 */
+# define XXH_ACC_ALIGN 64
+# endif
+#endif
+
+#if defined(XXH_X86DISPATCH) || XXH_VECTOR == XXH_SSE2 \
+ || XXH_VECTOR == XXH_AVX2 || XXH_VECTOR == XXH_AVX512
+# define XXH_SEC_ALIGN XXH_ACC_ALIGN
+#else
+# define XXH_SEC_ALIGN 8
+#endif
+
+/*
+ * UGLY HACK:
+ * GCC usually generates the best code with -O3 for xxHash.
+ *
+ * However, when targeting AVX2, it is overzealous in its unrolling resulting
+ * in code roughly 3/4 the speed of Clang.
+ *
+ * There are other issues, such as GCC splitting _mm256_loadu_si256 into
+ * _mm_loadu_si128 + _mm256_inserti128_si256. This is an optimization which
+ * only applies to Sandy and Ivy Bridge... which don't even support AVX2.
+ *
+ * That is why when compiling the AVX2 version, it is recommended to use either
+ * -O2 -mavx2 -march=haswell
+ * or
+ * -O2 -mavx2 -mno-avx256-split-unaligned-load
+ * for decent performance, or to use Clang instead.
+ *
+ * Fortunately, we can control the first one with a pragma that forces GCC into
+ * -O2, but the other one we can't control without "failed to inline always
+ * inline function due to target mismatch" warnings.
+ */
+#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \
+ && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \
+ && defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__) /* respect -O0 and -Os */
+# pragma GCC push_options
+# pragma GCC optimize("-O2")
+#endif
+
+
+#if XXH_VECTOR == XXH_NEON
+/*
+ * NEON's setup for vmlal_u32 is a little more complicated than it is on
+ * SSE2, AVX2, and VSX.
+ *
+ * While PMULUDQ and VMULEUW both perform a mask, VMLAL.U32 performs an upcast.
+ *
+ * To do the same operation, the 128-bit 'Q' register needs to be split into
+ * two 64-bit 'D' registers, performing this operation::
+ *
+ * [ a | b ]
+ * | '---------. .--------' |
+ * | x |
+ * | .---------' '--------. |
+ * [ a & 0xFFFFFFFF | b & 0xFFFFFFFF ],[ a >> 32 | b >> 32 ]
+ *
+ * Due to significant changes in aarch64, the fastest method for aarch64 is
+ * completely different than the fastest method for ARMv7-A.
+ *
+ * ARMv7-A treats D registers as unions overlaying Q registers, so modifying
+ * D11 will modify the high half of Q5. This is similar to how modifying AH
+ * will only affect bits 8-15 of AX on x86.
+ *
+ * VZIP takes two registers, and puts even lanes in one register and odd lanes
+ * in the other.
+ *
+ * On ARMv7-A, this strangely modifies both parameters in place instead of
+ * taking the usual 3-operand form.
+ *
+ * Therefore, if we want to do this, we can simply use a D-form VZIP.32 on the
+ * lower and upper halves of the Q register to end up with the high and low
+ * halves where we want - all in one instruction.
+ *
+ * vzip.32 d10, d11 @ d10 = { d10[0], d11[0] }; d11 = { d10[1], d11[1] }
+ *
+ * Unfortunately we need inline assembly for this: Instructions modifying two
+ * registers at once is not possible in GCC or Clang's IR, and they have to
+ * create a copy.
+ *
+ * aarch64 requires a different approach.
+ *
+ * In order to make it easier to write a decent compiler for aarch64, many
+ * quirks were removed, such as conditional execution.
+ *
+ * NEON was also affected by this.
+ *
+ * aarch64 cannot access the high bits of a Q-form register, and writes to a
+ * D-form register zero the high bits, similar to how writes to W-form scalar
+ * registers (or DWORD registers on x86_64) work.
+ *
+ * The formerly free vget_high intrinsics now require a vext (with a few
+ * exceptions)
+ *
+ * Additionally, VZIP was replaced by ZIP1 and ZIP2, which are the equivalent
+ * of PUNPCKL* and PUNPCKH* in SSE, respectively, in order to only modify one
+ * operand.
+ *
+ * The equivalent of the VZIP.32 on the lower and upper halves would be this
+ * mess:
+ *
+ * ext v2.4s, v0.4s, v0.4s, #2 // v2 = { v0[2], v0[3], v0[0], v0[1] }
+ * zip1 v1.2s, v0.2s, v2.2s // v1 = { v0[0], v2[0] }
+ * zip2 v0.2s, v0.2s, v1.2s // v0 = { v0[1], v2[1] }
+ *
+ * Instead, we use a literal downcast, vmovn_u64 (XTN), and vshrn_n_u64 (SHRN):
+ *
+ * shrn v1.2s, v0.2d, #32 // v1 = (uint32x2_t)(v0 >> 32);
+ * xtn v0.2s, v0.2d // v0 = (uint32x2_t)(v0 & 0xFFFFFFFF);
+ *
+ * This is available on ARMv7-A, but is less efficient than a single VZIP.32.
+ */
+
+/*
+ * Function-like macro:
+ * void XXH_SPLIT_IN_PLACE(uint64x2_t &in, uint32x2_t &outLo, uint32x2_t &outHi)
+ * {
+ * outLo = (uint32x2_t)(in & 0xFFFFFFFF);
+ * outHi = (uint32x2_t)(in >> 32);
+ * in = UNDEFINED;
+ * }
+ */
+# if !defined(XXH_NO_VZIP_HACK) /* define to disable */ \
+ && defined(__GNUC__) \
+ && !defined(__aarch64__) && !defined(__arm64__)
+# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \
+ do { \
+ /* Undocumented GCC/Clang operand modifier: %e0 = lower D half, %f0 = upper D half */ \
+ /* https://github.com/gcc-mirror/gcc/blob/38cf91e5/gcc/config/arm/arm.c#L22486 */ \
+ /* https://github.com/llvm-mirror/llvm/blob/2c4ca683/lib/Target/ARM/ARMAsmPrinter.cpp#L399 */ \
+ __asm__("vzip.32 %e0, %f0" : "+w" (in)); \
+ (outLo) = vget_low_u32 (vreinterpretq_u32_u64(in)); \
+ (outHi) = vget_high_u32(vreinterpretq_u32_u64(in)); \
+ } while (0)
+# else
+# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \
+ do { \
+ (outLo) = vmovn_u64 (in); \
+ (outHi) = vshrn_n_u64 ((in), 32); \
+ } while (0)
+# endif
+#endif /* XXH_VECTOR == XXH_NEON */
+
+/*
+ * VSX and Z Vector helpers.
+ *
+ * This is very messy, and any pull requests to clean this up are welcome.
+ *
+ * There are a lot of problems with supporting VSX and s390x, due to
+ * inconsistent intrinsics, spotty coverage, and multiple endiannesses.
+ */
+#if XXH_VECTOR == XXH_VSX
+# if defined(__s390x__)
+# include <s390intrin.h>
+# else
+/* gcc's altivec.h can have the unwanted consequence to unconditionally
+ * #define bool, vector, and pixel keywords,
+ * with bad consequences for programs already using these keywords for other purposes.
+ * The paragraph defining these macros is skipped when __APPLE_ALTIVEC__ is defined.
+ * __APPLE_ALTIVEC__ is _generally_ defined automatically by the compiler,
+ * but it seems that, in some cases, it isn't.
+ * Force the build macro to be defined, so that keywords are not altered.
+ */
+# if defined(__GNUC__) && !defined(__APPLE_ALTIVEC__)
+# define __APPLE_ALTIVEC__
+# endif
+# include <altivec.h>
+# endif
+
+typedef __vector unsigned long long xxh_u64x2;
+typedef __vector unsigned char xxh_u8x16;
+typedef __vector unsigned xxh_u32x4;
+
+# ifndef XXH_VSX_BE
+# if defined(__BIG_ENDIAN__) \
+ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+# define XXH_VSX_BE 1
+# elif defined(__VEC_ELEMENT_REG_ORDER__) && __VEC_ELEMENT_REG_ORDER__ == __ORDER_BIG_ENDIAN__
+# warning "-maltivec=be is not recommended. Please use native endianness."
+# define XXH_VSX_BE 1
+# else
+# define XXH_VSX_BE 0
+# endif
+# endif /* !defined(XXH_VSX_BE) */
+
+# if XXH_VSX_BE
+/* A wrapper for POWER9's vec_revb. */
+# if defined(__POWER9_VECTOR__) || (defined(__clang__) && defined(__s390x__))
+# define XXH_vec_revb vec_revb
+# else
+XXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val)
+{
+ xxh_u8x16 const vByteSwap = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
+ 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08 };
+ return vec_perm(val, val, vByteSwap);
+}
+# endif
+# endif /* XXH_VSX_BE */
+
+/*
+ * Performs an unaligned load and byte swaps it on big endian.
+ */
+XXH_FORCE_INLINE xxh_u64x2 XXH_vec_loadu(const void *ptr)
+{
+ xxh_u64x2 ret;
+ memcpy(&ret, ptr, sizeof(xxh_u64x2));
+# if XXH_VSX_BE
+ ret = XXH_vec_revb(ret);
+# endif
+ return ret;
+}
+
+/*
+ * vec_mulo and vec_mule are very problematic intrinsics on PowerPC
+ *
+ * These intrinsics weren't added until GCC 8, despite existing for a while,
+ * and they are endian dependent. Also, their meaning swap depending on version.
+ * */
+# if defined(__s390x__)
+ /* s390x is always big endian, no issue on this platform */
+# define XXH_vec_mulo vec_mulo
+# define XXH_vec_mule vec_mule
+# elif defined(__clang__) && XXH_HAS_BUILTIN(__builtin_altivec_vmuleuw)
+/* Clang has a better way to control this, we can just use the builtin which doesn't swap. */
+# define XXH_vec_mulo __builtin_altivec_vmulouw
+# define XXH_vec_mule __builtin_altivec_vmuleuw
+# else
+/* gcc needs inline assembly */
+/* Adapted from https://github.com/google/highwayhash/blob/master/highwayhash/hh_vsx.h. */
+XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mulo(xxh_u32x4 a, xxh_u32x4 b)
+{
+ xxh_u64x2 result;
+ __asm__("vmulouw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b));
+ return result;
+}
+XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b)
+{
+ xxh_u64x2 result;
+ __asm__("vmuleuw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b));
+ return result;
+}
+# endif /* XXH_vec_mulo, XXH_vec_mule */
+#endif /* XXH_VECTOR == XXH_VSX */
+
+
+/* prefetch
+ * can be disabled, by declaring XXH_NO_PREFETCH build macro */
+#if defined(XXH_NO_PREFETCH)
+# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */
+#else
+# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) /* _mm_prefetch() is not defined outside of x86/x64 */
+# include <mmintrin.h> /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */
+# define XXH_PREFETCH(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0)
+# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) )
+# define XXH_PREFETCH(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */)
+# else
+# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */
+# endif
+#endif /* XXH_NO_PREFETCH */
+
+
+/* ==========================================
+ * XXH3 default settings
+ * ========================================== */
+
+#define XXH_SECRET_DEFAULT_SIZE 192 /* minimum XXH3_SECRET_SIZE_MIN */
+
+#if (XXH_SECRET_DEFAULT_SIZE < XXH3_SECRET_SIZE_MIN)
+# error "default keyset is not large enough"
+#endif
+
+/* Pseudorandom secret taken directly from FARSH */
+XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = {
+ 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c,
+ 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f,
+ 0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21,
+ 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c,
+ 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3,
+ 0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8,
+ 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d,
+ 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64,
+ 0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb,
+ 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e,
+ 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce,
+ 0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e,
+};
+
+
+#ifdef XXH_OLD_NAMES
+# define kSecret XXH3_kSecret
+#endif
+
+/*
+ * Calculates a 32-bit to 64-bit long multiply.
+ *
+ * Wraps __emulu on MSVC x86 because it tends to call __allmul when it doesn't
+ * need to (but it shouldn't need to anyways, it is about 7 instructions to do
+ * a 64x64 multiply...). Since we know that this will _always_ emit MULL, we
+ * use that instead of the normal method.
+ *
+ * If you are compiling for platforms like Thumb-1 and don't have a better option,
+ * you may also want to write your own long multiply routine here.
+ *
+ * XXH_FORCE_INLINE xxh_u64 XXH_mult32to64(xxh_u64 x, xxh_u64 y)
+ * {
+ * return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF);
+ * }
+ */
+#if defined(_MSC_VER) && defined(_M_IX86)
+# include <intrin.h>
+# define XXH_mult32to64(x, y) __emulu((unsigned)(x), (unsigned)(y))
+#else
+/*
+ * Downcast + upcast is usually better than masking on older compilers like
+ * GCC 4.2 (especially 32-bit ones), all without affecting newer compilers.
+ *
+ * The other method, (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF), will AND both operands
+ * and perform a full 64x64 multiply -- entirely redundant on 32-bit.
+ */
+# define XXH_mult32to64(x, y) ((xxh_u64)(xxh_u32)(x) * (xxh_u64)(xxh_u32)(y))
+#endif
+
+/*
+ * Calculates a 64->128-bit long multiply.
+ *
+ * Uses __uint128_t and _umul128 if available, otherwise uses a scalar version.
+ */
+static XXH128_hash_t
+XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs)
+{
+ /*
+ * GCC/Clang __uint128_t method.
+ *
+ * On most 64-bit targets, GCC and Clang define a __uint128_t type.
+ * This is usually the best way as it usually uses a native long 64-bit
+ * multiply, such as MULQ on x86_64 or MUL + UMULH on aarch64.
+ *
+ * Usually.
+ *
+ * Despite being a 32-bit platform, Clang (and emscripten) define this type
+ * despite not having the arithmetic for it. This results in a laggy
+ * compiler builtin call which calculates a full 128-bit multiply.
+ * In that case it is best to use the portable one.
+ * https://github.com/Cyan4973/xxHash/issues/211#issuecomment-515575677
+ */
+#if defined(__GNUC__) && !defined(__wasm__) \
+ && defined(__SIZEOF_INT128__) \
+ || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 128)
+
+ __uint128_t const product = (__uint128_t)lhs * (__uint128_t)rhs;
+ XXH128_hash_t r128;
+ r128.low64 = (xxh_u64)(product);
+ r128.high64 = (xxh_u64)(product >> 64);
+ return r128;
+
+ /*
+ * MSVC for x64's _umul128 method.
+ *
+ * xxh_u64 _umul128(xxh_u64 Multiplier, xxh_u64 Multiplicand, xxh_u64 *HighProduct);
+ *
+ * This compiles to single operand MUL on x64.
+ */
+#elif defined(_M_X64) || defined(_M_IA64)
+
+#ifndef _MSC_VER
+# pragma intrinsic(_umul128)
+#endif
+ xxh_u64 product_high;
+ xxh_u64 const product_low = _umul128(lhs, rhs, &product_high);
+ XXH128_hash_t r128;
+ r128.low64 = product_low;
+ r128.high64 = product_high;
+ return r128;
+
+#else
+ /*
+ * Portable scalar method. Optimized for 32-bit and 64-bit ALUs.
+ *
+ * This is a fast and simple grade school multiply, which is shown below
+ * with base 10 arithmetic instead of base 0x100000000.
+ *
+ * 9 3 // D2 lhs = 93
+ * x 7 5 // D2 rhs = 75
+ * ----------
+ * 1 5 // D2 lo_lo = (93 % 10) * (75 % 10) = 15
+ * 4 5 | // D2 hi_lo = (93 / 10) * (75 % 10) = 45
+ * 2 1 | // D2 lo_hi = (93 % 10) * (75 / 10) = 21
+ * + 6 3 | | // D2 hi_hi = (93 / 10) * (75 / 10) = 63
+ * ---------
+ * 2 7 | // D2 cross = (15 / 10) + (45 % 10) + 21 = 27
+ * + 6 7 | | // D2 upper = (27 / 10) + (45 / 10) + 63 = 67
+ * ---------
+ * 6 9 7 5 // D4 res = (27 * 10) + (15 % 10) + (67 * 100) = 6975
+ *
+ * The reasons for adding the products like this are:
+ * 1. It avoids manual carry tracking. Just like how
+ * (9 * 9) + 9 + 9 = 99, the same applies with this for UINT64_MAX.
+ * This avoids a lot of complexity.
+ *
+ * 2. It hints for, and on Clang, compiles to, the powerful UMAAL
+ * instruction available in ARM's Digital Signal Processing extension
+ * in 32-bit ARMv6 and later, which is shown below:
+ *
+ * void UMAAL(xxh_u32 *RdLo, xxh_u32 *RdHi, xxh_u32 Rn, xxh_u32 Rm)
+ * {
+ * xxh_u64 product = (xxh_u64)*RdLo * (xxh_u64)*RdHi + Rn + Rm;
+ * *RdLo = (xxh_u32)(product & 0xFFFFFFFF);
+ * *RdHi = (xxh_u32)(product >> 32);
+ * }
+ *
+ * This instruction was designed for efficient long multiplication, and
+ * allows this to be calculated in only 4 instructions at speeds
+ * comparable to some 64-bit ALUs.
+ *
+ * 3. It isn't terrible on other platforms. Usually this will be a couple
+ * of 32-bit ADD/ADCs.
+ */
+
+ /* First calculate all of the cross products. */
+ xxh_u64 const lo_lo = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs & 0xFFFFFFFF);
+ xxh_u64 const hi_lo = XXH_mult32to64(lhs >> 32, rhs & 0xFFFFFFFF);
+ xxh_u64 const lo_hi = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs >> 32);
+ xxh_u64 const hi_hi = XXH_mult32to64(lhs >> 32, rhs >> 32);
+
+ /* Now add the products together. These will never overflow. */
+ xxh_u64 const cross = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + lo_hi;
+ xxh_u64 const upper = (hi_lo >> 32) + (cross >> 32) + hi_hi;
+ xxh_u64 const lower = (cross << 32) | (lo_lo & 0xFFFFFFFF);
+
+ XXH128_hash_t r128;
+ r128.low64 = lower;
+ r128.high64 = upper;
+ return r128;
+#endif
+}
+
+/*
+ * Does a 64-bit to 128-bit multiply, then XOR folds it.
+ *
+ * The reason for the separate function is to prevent passing too many structs
+ * around by value. This will hopefully inline the multiply, but we don't force it.
+ */
+static xxh_u64
+XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs)
+{
+ XXH128_hash_t product = XXH_mult64to128(lhs, rhs);
+ return product.low64 ^ product.high64;
+}
+
+/* Seems to produce slightly better code on GCC for some reason. */
+XXH_FORCE_INLINE xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift)
+{
+ XXH_ASSERT(0 <= shift && shift < 64);
+ return v64 ^ (v64 >> shift);
+}
+
+/*
+ * This is a fast avalanche stage,
+ * suitable when input bits are already partially mixed
+ */
+static XXH64_hash_t XXH3_avalanche(xxh_u64 h64)
+{
+ h64 = XXH_xorshift64(h64, 37);
+ h64 *= 0x165667919E3779F9ULL;
+ h64 = XXH_xorshift64(h64, 32);
+ return h64;
+}
+
+/*
+ * This is a stronger avalanche,
+ * inspired by Pelle Evensen's rrmxmx
+ * preferable when input has not been previously mixed
+ */
+static XXH64_hash_t XXH3_rrmxmx(xxh_u64 h64, xxh_u64 len)
+{
+ /* this mix is inspired by Pelle Evensen's rrmxmx */
+ h64 ^= XXH_rotl64(h64, 49) ^ XXH_rotl64(h64, 24);
+ h64 *= 0x9FB21C651E98DF25ULL;
+ h64 ^= (h64 >> 35) + len ;
+ h64 *= 0x9FB21C651E98DF25ULL;
+ return XXH_xorshift64(h64, 28);
+}
+
+
+/* ==========================================
+ * Short keys
+ * ==========================================
+ * One of the shortcomings of XXH32 and XXH64 was that their performance was
+ * sub-optimal on short lengths. It used an iterative algorithm which strongly
+ * favored lengths that were a multiple of 4 or 8.
+ *
+ * Instead of iterating over individual inputs, we use a set of single shot
+ * functions which piece together a range of lengths and operate in constant time.
+ *
+ * Additionally, the number of multiplies has been significantly reduced. This
+ * reduces latency, especially when emulating 64-bit multiplies on 32-bit.
+ *
+ * Depending on the platform, this may or may not be faster than XXH32, but it
+ * is almost guaranteed to be faster than XXH64.
+ */
+
+/*
+ * At very short lengths, there isn't enough input to fully hide secrets, or use
+ * the entire secret.
+ *
+ * There is also only a limited amount of mixing we can do before significantly
+ * impacting performance.
+ *
+ * Therefore, we use different sections of the secret and always mix two secret
+ * samples with an XOR. This should have no effect on performance on the
+ * seedless or withSeed variants because everything _should_ be constant folded
+ * by modern compilers.
+ *
+ * The XOR mixing hides individual parts of the secret and increases entropy.
+ *
+ * This adds an extra layer of strength for custom secrets.
+ */
+XXH_FORCE_INLINE XXH64_hash_t
+XXH3_len_1to3_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
+{
+ XXH_ASSERT(input != NULL);
+ XXH_ASSERT(1 <= len && len <= 3);
+ XXH_ASSERT(secret != NULL);
+ /*
+ * len = 1: combined = { input[0], 0x01, input[0], input[0] }
+ * len = 2: combined = { input[1], 0x02, input[0], input[1] }
+ * len = 3: combined = { input[2], 0x03, input[0], input[1] }
+ */
+ { xxh_u8 const c1 = input[0];
+ xxh_u8 const c2 = input[len >> 1];
+ xxh_u8 const c3 = input[len - 1];
+ xxh_u32 const combined = ((xxh_u32)c1 << 16) | ((xxh_u32)c2 << 24)
+ | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8);
+ xxh_u64 const bitflip = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed;
+ xxh_u64 const keyed = (xxh_u64)combined ^ bitflip;
+ return XXH64_avalanche(keyed);
+ }
+}
+
+XXH_FORCE_INLINE XXH64_hash_t
+XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
+{
+ XXH_ASSERT(input != NULL);
+ XXH_ASSERT(secret != NULL);
+ XXH_ASSERT(4 <= len && len < 8);
+ seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32;
+ { xxh_u32 const input1 = XXH_readLE32(input);
+ xxh_u32 const input2 = XXH_readLE32(input + len - 4);
+ xxh_u64 const bitflip = (XXH_readLE64(secret+8) ^ XXH_readLE64(secret+16)) - seed;
+ xxh_u64 const input64 = input2 + (((xxh_u64)input1) << 32);
+ xxh_u64 const keyed = input64 ^ bitflip;
+ return XXH3_rrmxmx(keyed, len);
+ }
+}
+
+XXH_FORCE_INLINE XXH64_hash_t
+XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
+{
+ XXH_ASSERT(input != NULL);
+ XXH_ASSERT(secret != NULL);
+ XXH_ASSERT(8 <= len && len <= 16);
+ { xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed;
+ xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed;
+ xxh_u64 const input_lo = XXH_readLE64(input) ^ bitflip1;
+ xxh_u64 const input_hi = XXH_readLE64(input + len - 8) ^ bitflip2;
+ xxh_u64 const acc = len
+ + XXH_swap64(input_lo) + input_hi
+ + XXH3_mul128_fold64(input_lo, input_hi);
+ return XXH3_avalanche(acc);
+ }
+}
+
+XXH_FORCE_INLINE XXH64_hash_t
+XXH3_len_0to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
+{
+ XXH_ASSERT(len <= 16);
+ { if (XXH_likely(len > 8)) return XXH3_len_9to16_64b(input, len, secret, seed);
+ if (XXH_likely(len >= 4)) return XXH3_len_4to8_64b(input, len, secret, seed);
+ if (len) return XXH3_len_1to3_64b(input, len, secret, seed);
+ return XXH64_avalanche(seed ^ (XXH_readLE64(secret+56) ^ XXH_readLE64(secret+64)));
+ }
+}
+
+/*
+ * DISCLAIMER: There are known *seed-dependent* multicollisions here due to
+ * multiplication by zero, affecting hashes of lengths 17 to 240.
+ *
+ * However, they are very unlikely.
+ *
+ * Keep this in mind when using the unseeded XXH3_64bits() variant: As with all
+ * unseeded non-cryptographic hashes, it does not attempt to defend itself
+ * against specially crafted inputs, only random inputs.
+ *
+ * Compared to classic UMAC where a 1 in 2^31 chance of 4 consecutive bytes
+ * cancelling out the secret is taken an arbitrary number of times (addressed
+ * in XXH3_accumulate_512), this collision is very unlikely with random inputs
+ * and/or proper seeding:
+ *
+ * This only has a 1 in 2^63 chance of 8 consecutive bytes cancelling out, in a
+ * function that is only called up to 16 times per hash with up to 240 bytes of
+ * input.
+ *
+ * This is not too bad for a non-cryptographic hash function, especially with
+ * only 64 bit outputs.
+ *
+ * The 128-bit variant (which trades some speed for strength) is NOT affected
+ * by this, although it is always a good idea to use a proper seed if you care
+ * about strength.
+ */
+XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input,
+ const xxh_u8* XXH_RESTRICT secret, xxh_u64 seed64)
+{
+#if defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \
+ && defined(__i386__) && defined(__SSE2__) /* x86 + SSE2 */ \
+ && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable like XXH32 hack */
+ /*
+ * UGLY HACK:
+ * GCC for x86 tends to autovectorize the 128-bit multiply, resulting in
+ * slower code.
+ *
+ * By forcing seed64 into a register, we disrupt the cost model and
+ * cause it to scalarize. See `XXH32_round()`
+ *
+ * FIXME: Clang's output is still _much_ faster -- On an AMD Ryzen 3600,
+ * XXH3_64bits @ len=240 runs at 4.6 GB/s with Clang 9, but 3.3 GB/s on
+ * GCC 9.2, despite both emitting scalar code.
+ *
+ * GCC generates much better scalar code than Clang for the rest of XXH3,
+ * which is why finding a more optimal codepath is an interest.
+ */
+ __asm__ ("" : "+r" (seed64));
+#endif
+ { xxh_u64 const input_lo = XXH_readLE64(input);
+ xxh_u64 const input_hi = XXH_readLE64(input+8);
+ return XXH3_mul128_fold64(
+ input_lo ^ (XXH_readLE64(secret) + seed64),
+ input_hi ^ (XXH_readLE64(secret+8) - seed64)
+ );
+ }
+}
+
+/* For mid range keys, XXH3 uses a Mum-hash variant. */
+XXH_FORCE_INLINE XXH64_hash_t
+XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
+ const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
+ XXH64_hash_t seed)
+{
+ XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize;
+ XXH_ASSERT(16 < len && len <= 128);
+
+ { xxh_u64 acc = len * XXH_PRIME64_1;
+ if (len > 32) {
+ if (len > 64) {
+ if (len > 96) {
+ acc += XXH3_mix16B(input+48, secret+96, seed);
+ acc += XXH3_mix16B(input+len-64, secret+112, seed);
+ }
+ acc += XXH3_mix16B(input+32, secret+64, seed);
+ acc += XXH3_mix16B(input+len-48, secret+80, seed);
+ }
+ acc += XXH3_mix16B(input+16, secret+32, seed);
+ acc += XXH3_mix16B(input+len-32, secret+48, seed);
+ }
+ acc += XXH3_mix16B(input+0, secret+0, seed);
+ acc += XXH3_mix16B(input+len-16, secret+16, seed);
+
+ return XXH3_avalanche(acc);
+ }
+}
+
+#define XXH3_MIDSIZE_MAX 240
+
+XXH_NO_INLINE XXH64_hash_t
+XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
+ const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
+ XXH64_hash_t seed)
+{
+ XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize;
+ XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX);
+
+ #define XXH3_MIDSIZE_STARTOFFSET 3
+ #define XXH3_MIDSIZE_LASTOFFSET 17
+
+ { xxh_u64 acc = len * XXH_PRIME64_1;
+ int const nbRounds = (int)len / 16;
+ int i;
+ for (i=0; i<8; i++) {
+ acc += XXH3_mix16B(input+(16*i), secret+(16*i), seed);
+ }
+ acc = XXH3_avalanche(acc);
+ XXH_ASSERT(nbRounds >= 8);
+#if defined(__clang__) /* Clang */ \
+ && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \
+ && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */
+ /*
+ * UGLY HACK:
+ * Clang for ARMv7-A tries to vectorize this loop, similar to GCC x86.
+ * In everywhere else, it uses scalar code.
+ *
+ * For 64->128-bit multiplies, even if the NEON was 100% optimal, it
+ * would still be slower than UMAAL (see XXH_mult64to128).
+ *
+ * Unfortunately, Clang doesn't handle the long multiplies properly and
+ * converts them to the nonexistent "vmulq_u64" intrinsic, which is then
+ * scalarized into an ugly mess of VMOV.32 instructions.
+ *
+ * This mess is difficult to avoid without turning autovectorization
+ * off completely, but they are usually relatively minor and/or not
+ * worth it to fix.
+ *
+ * This loop is the easiest to fix, as unlike XXH32, this pragma
+ * _actually works_ because it is a loop vectorization instead of an
+ * SLP vectorization.
+ */
+ #pragma clang loop vectorize(disable)
+#endif
+ for (i=8 ; i < nbRounds; i++) {
+ acc += XXH3_mix16B(input+(16*i), secret+(16*(i-8)) + XXH3_MIDSIZE_STARTOFFSET, seed);
+ }
+ /* last bytes */
+ acc += XXH3_mix16B(input + len - 16, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET, seed);
+ return XXH3_avalanche(acc);
+ }
+}
+
+
+/* ======= Long Keys ======= */
+
+#define XXH_STRIPE_LEN 64
+#define XXH_SECRET_CONSUME_RATE 8 /* nb of secret bytes consumed at each accumulation */
+#define XXH_ACC_NB (XXH_STRIPE_LEN / sizeof(xxh_u64))
+
+#ifdef XXH_OLD_NAMES
+# define STRIPE_LEN XXH_STRIPE_LEN
+# define ACC_NB XXH_ACC_NB
+#endif
+
+XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64)
+{
+ if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64);
+ memcpy(dst, &v64, sizeof(v64));
+}
+
+/* Several intrinsic functions below are supposed to accept __int64 as argument,
+ * as documented in https://software.intel.com/sites/landingpage/IntrinsicsGuide/ .
+ * However, several environments do not define __int64 type,
+ * requiring a workaround.
+ */
+#if !defined (__VMS) \
+ && (defined (__cplusplus) \
+ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
+ typedef int64_t xxh_i64;
+#else
+ /* the following type must have a width of 64-bit */
+ typedef long long xxh_i64;
+#endif
+
+/*
+ * XXH3_accumulate_512 is the tightest loop for long inputs, and it is the most optimized.
+ *
+ * It is a hardened version of UMAC, based off of FARSH's implementation.
+ *
+ * This was chosen because it adapts quite well to 32-bit, 64-bit, and SIMD
+ * implementations, and it is ridiculously fast.
+ *
+ * We harden it by mixing the original input to the accumulators as well as the product.
+ *
+ * This means that in the (relatively likely) case of a multiply by zero, the
+ * original input is preserved.
+ *
+ * On 128-bit inputs, we swap 64-bit pairs when we add the input to improve
+ * cross-pollination, as otherwise the upper and lower halves would be
+ * essentially independent.
+ *
+ * This doesn't matter on 64-bit hashes since they all get merged together in
+ * the end, so we skip the extra step.
+ *
+ * Both XXH3_64bits and XXH3_128bits use this subroutine.
+ */
+
+#if (XXH_VECTOR == XXH_AVX512) || defined(XXH_X86DISPATCH)
+
+#ifndef XXH_TARGET_AVX512
+# define XXH_TARGET_AVX512 /* disable attribute target */
+#endif
+
+XXH_FORCE_INLINE XXH_TARGET_AVX512 void
+XXH3_accumulate_512_avx512(void* XXH_RESTRICT acc,
+ const void* XXH_RESTRICT input,
+ const void* XXH_RESTRICT secret)
+{
+ XXH_ALIGN(64) __m512i* const xacc = (__m512i *) acc;
+ XXH_ASSERT((((size_t)acc) & 63) == 0);
+ XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i));
+
+ {
+ /* data_vec = input[0]; */
+ __m512i const data_vec = _mm512_loadu_si512 (input);
+ /* key_vec = secret[0]; */
+ __m512i const key_vec = _mm512_loadu_si512 (secret);
+ /* data_key = data_vec ^ key_vec; */
+ __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec);
+ /* data_key_lo = data_key >> 32; */
+ __m512i const data_key_lo = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1));
+ /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */
+ __m512i const product = _mm512_mul_epu32 (data_key, data_key_lo);
+ /* xacc[0] += swap(data_vec); */
+ __m512i const data_swap = _mm512_shuffle_epi32(data_vec, (_MM_PERM_ENUM)_MM_SHUFFLE(1, 0, 3, 2));
+ __m512i const sum = _mm512_add_epi64(*xacc, data_swap);
+ /* xacc[0] += product; */
+ *xacc = _mm512_add_epi64(product, sum);
+ }
+}
+
+/*
+ * XXH3_scrambleAcc: Scrambles the accumulators to improve mixing.
+ *
+ * Multiplication isn't perfect, as explained by Google in HighwayHash:
+ *
+ * // Multiplication mixes/scrambles bytes 0-7 of the 64-bit result to
+ * // varying degrees. In descending order of goodness, bytes
+ * // 3 4 2 5 1 6 0 7 have quality 228 224 164 160 100 96 36 32.
+ * // As expected, the upper and lower bytes are much worse.
+ *
+ * Source: https://github.com/google/highwayhash/blob/0aaf66b/highwayhash/hh_avx2.h#L291
+ *
+ * Since our algorithm uses a pseudorandom secret to add some variance into the
+ * mix, we don't need to (or want to) mix as often or as much as HighwayHash does.
+ *
+ * This isn't as tight as XXH3_accumulate, but still written in SIMD to avoid
+ * extraction.
+ *
+ * Both XXH3_64bits and XXH3_128bits use this subroutine.
+ */
+
+XXH_FORCE_INLINE XXH_TARGET_AVX512 void
+XXH3_scrambleAcc_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
+{
+ XXH_ASSERT((((size_t)acc) & 63) == 0);
+ XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i));
+ { XXH_ALIGN(64) __m512i* const xacc = (__m512i*) acc;
+ const __m512i prime32 = _mm512_set1_epi32((int)XXH_PRIME32_1);
+
+ /* xacc[0] ^= (xacc[0] >> 47) */
+ __m512i const acc_vec = *xacc;
+ __m512i const shifted = _mm512_srli_epi64 (acc_vec, 47);
+ __m512i const data_vec = _mm512_xor_si512 (acc_vec, shifted);
+ /* xacc[0] ^= secret; */
+ __m512i const key_vec = _mm512_loadu_si512 (secret);
+ __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec);
+
+ /* xacc[0] *= XXH_PRIME32_1; */
+ __m512i const data_key_hi = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1));
+ __m512i const prod_lo = _mm512_mul_epu32 (data_key, prime32);
+ __m512i const prod_hi = _mm512_mul_epu32 (data_key_hi, prime32);
+ *xacc = _mm512_add_epi64(prod_lo, _mm512_slli_epi64(prod_hi, 32));
+ }
+}
+
+XXH_FORCE_INLINE XXH_TARGET_AVX512 void
+XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
+{
+ XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 63) == 0);
+ XXH_STATIC_ASSERT(XXH_SEC_ALIGN == 64);
+ XXH_ASSERT(((size_t)customSecret & 63) == 0);
+ (void)(&XXH_writeLE64);
+ { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i);
+ __m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA, -(xxh_i64)seed64);
+
+ XXH_ALIGN(64) const __m512i* const src = (const __m512i*) XXH3_kSecret;
+ XXH_ALIGN(64) __m512i* const dest = ( __m512i*) customSecret;
+ int i;
+ for (i=0; i < nbRounds; ++i) {
+ /* GCC has a bug, _mm512_stream_load_si512 accepts 'void*', not 'void const*',
+ * this will warn "discards ‘const’ qualifier". */
+ union {
+ XXH_ALIGN(64) const __m512i* cp;
+ XXH_ALIGN(64) void* p;
+ } remote_const_void;
+ remote_const_void.cp = src + i;
+ dest[i] = _mm512_add_epi64(_mm512_stream_load_si512(remote_const_void.p), seed);
+ } }
+}
+
+#endif
+
+#if (XXH_VECTOR == XXH_AVX2) || defined(XXH_X86DISPATCH)
+
+#ifndef XXH_TARGET_AVX2
+# define XXH_TARGET_AVX2 /* disable attribute target */
+#endif
+
+XXH_FORCE_INLINE XXH_TARGET_AVX2 void
+XXH3_accumulate_512_avx2( void* XXH_RESTRICT acc,
+ const void* XXH_RESTRICT input,
+ const void* XXH_RESTRICT secret)
+{
+ XXH_ASSERT((((size_t)acc) & 31) == 0);
+ { XXH_ALIGN(32) __m256i* const xacc = (__m256i *) acc;
+ /* Unaligned. This is mainly for pointer arithmetic, and because
+ * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */
+ const __m256i* const xinput = (const __m256i *) input;
+ /* Unaligned. This is mainly for pointer arithmetic, and because
+ * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */
+ const __m256i* const xsecret = (const __m256i *) secret;
+
+ size_t i;
+ for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) {
+ /* data_vec = xinput[i]; */
+ __m256i const data_vec = _mm256_loadu_si256 (xinput+i);
+ /* key_vec = xsecret[i]; */
+ __m256i const key_vec = _mm256_loadu_si256 (xsecret+i);
+ /* data_key = data_vec ^ key_vec; */
+ __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec);
+ /* data_key_lo = data_key >> 32; */
+ __m256i const data_key_lo = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1));
+ /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */
+ __m256i const product = _mm256_mul_epu32 (data_key, data_key_lo);
+ /* xacc[i] += swap(data_vec); */
+ __m256i const data_swap = _mm256_shuffle_epi32(data_vec, _MM_SHUFFLE(1, 0, 3, 2));
+ __m256i const sum = _mm256_add_epi64(xacc[i], data_swap);
+ /* xacc[i] += product; */
+ xacc[i] = _mm256_add_epi64(product, sum);
+ } }
+}
+
+XXH_FORCE_INLINE XXH_TARGET_AVX2 void
+XXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
+{
+ XXH_ASSERT((((size_t)acc) & 31) == 0);
+ { XXH_ALIGN(32) __m256i* const xacc = (__m256i*) acc;
+ /* Unaligned. This is mainly for pointer arithmetic, and because
+ * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */
+ const __m256i* const xsecret = (const __m256i *) secret;
+ const __m256i prime32 = _mm256_set1_epi32((int)XXH_PRIME32_1);
+
+ size_t i;
+ for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) {
+ /* xacc[i] ^= (xacc[i] >> 47) */
+ __m256i const acc_vec = xacc[i];
+ __m256i const shifted = _mm256_srli_epi64 (acc_vec, 47);
+ __m256i const data_vec = _mm256_xor_si256 (acc_vec, shifted);
+ /* xacc[i] ^= xsecret; */
+ __m256i const key_vec = _mm256_loadu_si256 (xsecret+i);
+ __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec);
+
+ /* xacc[i] *= XXH_PRIME32_1; */
+ __m256i const data_key_hi = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1));
+ __m256i const prod_lo = _mm256_mul_epu32 (data_key, prime32);
+ __m256i const prod_hi = _mm256_mul_epu32 (data_key_hi, prime32);
+ xacc[i] = _mm256_add_epi64(prod_lo, _mm256_slli_epi64(prod_hi, 32));
+ }
+ }
+}
+
+XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
+{
+ XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 31) == 0);
+ XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE / sizeof(__m256i)) == 6);
+ XXH_STATIC_ASSERT(XXH_SEC_ALIGN <= 64);
+ (void)(&XXH_writeLE64);
+ XXH_PREFETCH(customSecret);
+ { __m256i const seed = _mm256_set_epi64x(-(xxh_i64)seed64, (xxh_i64)seed64, -(xxh_i64)seed64, (xxh_i64)seed64);
+
+ XXH_ALIGN(64) const __m256i* const src = (const __m256i*) XXH3_kSecret;
+ XXH_ALIGN(64) __m256i* dest = ( __m256i*) customSecret;
+
+# if defined(__GNUC__) || defined(__clang__)
+ /*
+ * On GCC & Clang, marking 'dest' as modified will cause the compiler:
+ * - do not extract the secret from sse registers in the internal loop
+ * - use less common registers, and avoid pushing these reg into stack
+ * The asm hack causes Clang to assume that XXH3_kSecretPtr aliases with
+ * customSecret, and on aarch64, this prevented LDP from merging two
+ * loads together for free. Putting the loads together before the stores
+ * properly generates LDP.
+ */
+ __asm__("" : "+r" (dest));
+# endif
+
+ /* GCC -O2 need unroll loop manually */
+ dest[0] = _mm256_add_epi64(_mm256_stream_load_si256(src+0), seed);
+ dest[1] = _mm256_add_epi64(_mm256_stream_load_si256(src+1), seed);
+ dest[2] = _mm256_add_epi64(_mm256_stream_load_si256(src+2), seed);
+ dest[3] = _mm256_add_epi64(_mm256_stream_load_si256(src+3), seed);
+ dest[4] = _mm256_add_epi64(_mm256_stream_load_si256(src+4), seed);
+ dest[5] = _mm256_add_epi64(_mm256_stream_load_si256(src+5), seed);
+ }
+}
+
+#endif
+
+#if (XXH_VECTOR == XXH_SSE2) || defined(XXH_X86DISPATCH)
+
+#ifndef XXH_TARGET_SSE2
+# define XXH_TARGET_SSE2 /* disable attribute target */
+#endif
+
+XXH_FORCE_INLINE XXH_TARGET_SSE2 void
+XXH3_accumulate_512_sse2( void* XXH_RESTRICT acc,
+ const void* XXH_RESTRICT input,
+ const void* XXH_RESTRICT secret)
+{
+ /* SSE2 is just a half-scale version of the AVX2 version. */
+ XXH_ASSERT((((size_t)acc) & 15) == 0);
+ { XXH_ALIGN(16) __m128i* const xacc = (__m128i *) acc;
+ /* Unaligned. This is mainly for pointer arithmetic, and because
+ * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */
+ const __m128i* const xinput = (const __m128i *) input;
+ /* Unaligned. This is mainly for pointer arithmetic, and because
+ * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */
+ const __m128i* const xsecret = (const __m128i *) secret;
+
+ size_t i;
+ for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) {
+ /* data_vec = xinput[i]; */
+ __m128i const data_vec = _mm_loadu_si128 (xinput+i);
+ /* key_vec = xsecret[i]; */
+ __m128i const key_vec = _mm_loadu_si128 (xsecret+i);
+ /* data_key = data_vec ^ key_vec; */
+ __m128i const data_key = _mm_xor_si128 (data_vec, key_vec);
+ /* data_key_lo = data_key >> 32; */
+ __m128i const data_key_lo = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1));
+ /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */
+ __m128i const product = _mm_mul_epu32 (data_key, data_key_lo);
+ /* xacc[i] += swap(data_vec); */
+ __m128i const data_swap = _mm_shuffle_epi32(data_vec, _MM_SHUFFLE(1,0,3,2));
+ __m128i const sum = _mm_add_epi64(xacc[i], data_swap);
+ /* xacc[i] += product; */
+ xacc[i] = _mm_add_epi64(product, sum);
+ } }
+}
+
+XXH_FORCE_INLINE XXH_TARGET_SSE2 void
+XXH3_scrambleAcc_sse2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
+{
+ XXH_ASSERT((((size_t)acc) & 15) == 0);
+ { XXH_ALIGN(16) __m128i* const xacc = (__m128i*) acc;
+ /* Unaligned. This is mainly for pointer arithmetic, and because
+ * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */
+ const __m128i* const xsecret = (const __m128i *) secret;
+ const __m128i prime32 = _mm_set1_epi32((int)XXH_PRIME32_1);
+
+ size_t i;
+ for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) {
+ /* xacc[i] ^= (xacc[i] >> 47) */
+ __m128i const acc_vec = xacc[i];
+ __m128i const shifted = _mm_srli_epi64 (acc_vec, 47);
+ __m128i const data_vec = _mm_xor_si128 (acc_vec, shifted);
+ /* xacc[i] ^= xsecret[i]; */
+ __m128i const key_vec = _mm_loadu_si128 (xsecret+i);
+ __m128i const data_key = _mm_xor_si128 (data_vec, key_vec);
+
+ /* xacc[i] *= XXH_PRIME32_1; */
+ __m128i const data_key_hi = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1));
+ __m128i const prod_lo = _mm_mul_epu32 (data_key, prime32);
+ __m128i const prod_hi = _mm_mul_epu32 (data_key_hi, prime32);
+ xacc[i] = _mm_add_epi64(prod_lo, _mm_slli_epi64(prod_hi, 32));
+ }
+ }
+}
+
+XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
+{
+ XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0);
+ (void)(&XXH_writeLE64);
+ { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m128i);
+
+# if defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER < 1900
+ // MSVC 32bit mode does not support _mm_set_epi64x before 2015
+ XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, -(xxh_i64)seed64 };
+ __m128i const seed = _mm_load_si128((__m128i const*)seed64x2);
+# else
+ __m128i const seed = _mm_set_epi64x(-(xxh_i64)seed64, (xxh_i64)seed64);
+# endif
+ int i;
+
+ XXH_ALIGN(64) const float* const src = (float const*) XXH3_kSecret;
+ XXH_ALIGN(XXH_SEC_ALIGN) __m128i* dest = (__m128i*) customSecret;
+# if defined(__GNUC__) || defined(__clang__)
+ /*
+ * On GCC & Clang, marking 'dest' as modified will cause the compiler:
+ * - do not extract the secret from sse registers in the internal loop
+ * - use less common registers, and avoid pushing these reg into stack
+ */
+ __asm__("" : "+r" (dest));
+# endif
+
+ for (i=0; i < nbRounds; ++i) {
+ dest[i] = _mm_add_epi64(_mm_castps_si128(_mm_load_ps(src+i*4)), seed);
+ } }
+}
+
+#endif
+
+#if (XXH_VECTOR == XXH_NEON)
+
+XXH_FORCE_INLINE void
+XXH3_accumulate_512_neon( void* XXH_RESTRICT acc,
+ const void* XXH_RESTRICT input,
+ const void* XXH_RESTRICT secret)
+{
+ XXH_ASSERT((((size_t)acc) & 15) == 0);
+ {
+ XXH_ALIGN(16) uint64x2_t* const xacc = (uint64x2_t *) acc;
+ /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */
+ uint8_t const* const xinput = (const uint8_t *) input;
+ uint8_t const* const xsecret = (const uint8_t *) secret;
+
+ size_t i;
+ for (i=0; i < XXH_STRIPE_LEN / sizeof(uint64x2_t); i++) {
+ /* data_vec = xinput[i]; */
+ uint8x16_t data_vec = vld1q_u8(xinput + (i * 16));
+ /* key_vec = xsecret[i]; */
+ uint8x16_t key_vec = vld1q_u8(xsecret + (i * 16));
+ uint64x2_t data_key;
+ uint32x2_t data_key_lo, data_key_hi;
+ /* xacc[i] += swap(data_vec); */
+ uint64x2_t const data64 = vreinterpretq_u64_u8(data_vec);
+ uint64x2_t const swapped = vextq_u64(data64, data64, 1);
+ xacc[i] = vaddq_u64 (xacc[i], swapped);
+ /* data_key = data_vec ^ key_vec; */
+ data_key = vreinterpretq_u64_u8(veorq_u8(data_vec, key_vec));
+ /* data_key_lo = (uint32x2_t) (data_key & 0xFFFFFFFF);
+ * data_key_hi = (uint32x2_t) (data_key >> 32);
+ * data_key = UNDEFINED; */
+ XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi);
+ /* xacc[i] += (uint64x2_t) data_key_lo * (uint64x2_t) data_key_hi; */
+ xacc[i] = vmlal_u32 (xacc[i], data_key_lo, data_key_hi);
+
+ }
+ }
+}
+
+XXH_FORCE_INLINE void
+XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
+{
+ XXH_ASSERT((((size_t)acc) & 15) == 0);
+
+ { uint64x2_t* xacc = (uint64x2_t*) acc;
+ uint8_t const* xsecret = (uint8_t const*) secret;
+ uint32x2_t prime = vdup_n_u32 (XXH_PRIME32_1);
+
+ size_t i;
+ for (i=0; i < XXH_STRIPE_LEN/sizeof(uint64x2_t); i++) {
+ /* xacc[i] ^= (xacc[i] >> 47); */
+ uint64x2_t acc_vec = xacc[i];
+ uint64x2_t shifted = vshrq_n_u64 (acc_vec, 47);
+ uint64x2_t data_vec = veorq_u64 (acc_vec, shifted);
+
+ /* xacc[i] ^= xsecret[i]; */
+ uint8x16_t key_vec = vld1q_u8(xsecret + (i * 16));
+ uint64x2_t data_key = veorq_u64(data_vec, vreinterpretq_u64_u8(key_vec));
+
+ /* xacc[i] *= XXH_PRIME32_1 */
+ uint32x2_t data_key_lo, data_key_hi;
+ /* data_key_lo = (uint32x2_t) (xacc[i] & 0xFFFFFFFF);
+ * data_key_hi = (uint32x2_t) (xacc[i] >> 32);
+ * xacc[i] = UNDEFINED; */
+ XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi);
+ { /*
+ * prod_hi = (data_key >> 32) * XXH_PRIME32_1;
+ *
+ * Avoid vmul_u32 + vshll_n_u32 since Clang 6 and 7 will
+ * incorrectly "optimize" this:
+ * tmp = vmul_u32(vmovn_u64(a), vmovn_u64(b));
+ * shifted = vshll_n_u32(tmp, 32);
+ * to this:
+ * tmp = "vmulq_u64"(a, b); // no such thing!
+ * shifted = vshlq_n_u64(tmp, 32);
+ *
+ * However, unlike SSE, Clang lacks a 64-bit multiply routine
+ * for NEON, and it scalarizes two 64-bit multiplies instead.
+ *
+ * vmull_u32 has the same timing as vmul_u32, and it avoids
+ * this bug completely.
+ * See https://bugs.llvm.org/show_bug.cgi?id=39967
+ */
+ uint64x2_t prod_hi = vmull_u32 (data_key_hi, prime);
+ /* xacc[i] = prod_hi << 32; */
+ xacc[i] = vshlq_n_u64(prod_hi, 32);
+ /* xacc[i] += (prod_hi & 0xFFFFFFFF) * XXH_PRIME32_1; */
+ xacc[i] = vmlal_u32(xacc[i], data_key_lo, prime);
+ }
+ } }
+}
+
+#endif
+
+#if (XXH_VECTOR == XXH_VSX)
+
+XXH_FORCE_INLINE void
+XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc,
+ const void* XXH_RESTRICT input,
+ const void* XXH_RESTRICT secret)
+{
+ xxh_u64x2* const xacc = (xxh_u64x2*) acc; /* presumed aligned */
+ xxh_u64x2 const* const xinput = (xxh_u64x2 const*) input; /* no alignment restriction */
+ xxh_u64x2 const* const xsecret = (xxh_u64x2 const*) secret; /* no alignment restriction */
+ xxh_u64x2 const v32 = { 32, 32 };
+ size_t i;
+ for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) {
+ /* data_vec = xinput[i]; */
+ xxh_u64x2 const data_vec = XXH_vec_loadu(xinput + i);
+ /* key_vec = xsecret[i]; */
+ xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i);
+ xxh_u64x2 const data_key = data_vec ^ key_vec;
+ /* shuffled = (data_key << 32) | (data_key >> 32); */
+ xxh_u32x4 const shuffled = (xxh_u32x4)vec_rl(data_key, v32);
+ /* product = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)shuffled & 0xFFFFFFFF); */
+ xxh_u64x2 const product = XXH_vec_mulo((xxh_u32x4)data_key, shuffled);
+ xacc[i] += product;
+
+ /* swap high and low halves */
+#ifdef __s390x__
+ xacc[i] += vec_permi(data_vec, data_vec, 2);
+#else
+ xacc[i] += vec_xxpermdi(data_vec, data_vec, 2);
+#endif
+ }
+}
+
+XXH_FORCE_INLINE void
+XXH3_scrambleAcc_vsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
+{
+ XXH_ASSERT((((size_t)acc) & 15) == 0);
+
+ { xxh_u64x2* const xacc = (xxh_u64x2*) acc;
+ const xxh_u64x2* const xsecret = (const xxh_u64x2*) secret;
+ /* constants */
+ xxh_u64x2 const v32 = { 32, 32 };
+ xxh_u64x2 const v47 = { 47, 47 };
+ xxh_u32x4 const prime = { XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1 };
+ size_t i;
+ for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) {
+ /* xacc[i] ^= (xacc[i] >> 47); */
+ xxh_u64x2 const acc_vec = xacc[i];
+ xxh_u64x2 const data_vec = acc_vec ^ (acc_vec >> v47);
+
+ /* xacc[i] ^= xsecret[i]; */
+ xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i);
+ xxh_u64x2 const data_key = data_vec ^ key_vec;
+
+ /* xacc[i] *= XXH_PRIME32_1 */
+ /* prod_lo = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)prime & 0xFFFFFFFF); */
+ xxh_u64x2 const prod_even = XXH_vec_mule((xxh_u32x4)data_key, prime);
+ /* prod_hi = ((xxh_u64x2)data_key >> 32) * ((xxh_u64x2)prime >> 32); */
+ xxh_u64x2 const prod_odd = XXH_vec_mulo((xxh_u32x4)data_key, prime);
+ xacc[i] = prod_odd + (prod_even << v32);
+ } }
+}
+
+#endif
+
+/* scalar variants - universal */
+
+XXH_FORCE_INLINE void
+XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc,
+ const void* XXH_RESTRICT input,
+ const void* XXH_RESTRICT secret)
+{
+ XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */
+ const xxh_u8* const xinput = (const xxh_u8*) input; /* no alignment restriction */
+ const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */
+ size_t i;
+ XXH_ASSERT(((size_t)acc & (XXH_ACC_ALIGN-1)) == 0);
+ for (i=0; i < XXH_ACC_NB; i++) {
+ xxh_u64 const data_val = XXH_readLE64(xinput + 8*i);
+ xxh_u64 const data_key = data_val ^ XXH_readLE64(xsecret + i*8);
+ xacc[i ^ 1] += data_val; /* swap adjacent lanes */
+ xacc[i] += XXH_mult32to64(data_key & 0xFFFFFFFF, data_key >> 32);
+ }
+}
+
+XXH_FORCE_INLINE void
+XXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
+{
+ XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */
+ const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */
+ size_t i;
+ XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0);
+ for (i=0; i < XXH_ACC_NB; i++) {
+ xxh_u64 const key64 = XXH_readLE64(xsecret + 8*i);
+ xxh_u64 acc64 = xacc[i];
+ acc64 = XXH_xorshift64(acc64, 47);
+ acc64 ^= key64;
+ acc64 *= XXH_PRIME32_1;
+ xacc[i] = acc64;
+ }
+}
+
+XXH_FORCE_INLINE void
+XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
+{
+ /*
+ * We need a separate pointer for the hack below,
+ * which requires a non-const pointer.
+ * Any decent compiler will optimize this out otherwise.
+ */
+ const xxh_u8* kSecretPtr = XXH3_kSecret;
+ XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0);
+
+#if defined(__clang__) && defined(__aarch64__)
+ /*
+ * UGLY HACK:
+ * Clang generates a bunch of MOV/MOVK pairs for aarch64, and they are
+ * placed sequentially, in order, at the top of the unrolled loop.
+ *
+ * While MOVK is great for generating constants (2 cycles for a 64-bit
+ * constant compared to 4 cycles for LDR), long MOVK chains stall the
+ * integer pipelines:
+ * I L S
+ * MOVK
+ * MOVK
+ * MOVK
+ * MOVK
+ * ADD
+ * SUB STR
+ * STR
+ * By forcing loads from memory (as the asm line causes Clang to assume
+ * that XXH3_kSecretPtr has been changed), the pipelines are used more
+ * efficiently:
+ * I L S
+ * LDR
+ * ADD LDR
+ * SUB STR
+ * STR
+ * XXH3_64bits_withSeed, len == 256, Snapdragon 835
+ * without hack: 2654.4 MB/s
+ * with hack: 3202.9 MB/s
+ */
+ __asm__("" : "+r" (kSecretPtr));
+#endif
+ /*
+ * Note: in debug mode, this overrides the asm optimization
+ * and Clang will emit MOVK chains again.
+ */
+ XXH_ASSERT(kSecretPtr == XXH3_kSecret);
+
+ { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / 16;
+ int i;
+ for (i=0; i < nbRounds; i++) {
+ /*
+ * The asm hack causes Clang to assume that kSecretPtr aliases with
+ * customSecret, and on aarch64, this prevented LDP from merging two
+ * loads together for free. Putting the loads together before the stores
+ * properly generates LDP.
+ */
+ xxh_u64 lo = XXH_readLE64(kSecretPtr + 16*i) + seed64;
+ xxh_u64 hi = XXH_readLE64(kSecretPtr + 16*i + 8) - seed64;
+ XXH_writeLE64((xxh_u8*)customSecret + 16*i, lo);
+ XXH_writeLE64((xxh_u8*)customSecret + 16*i + 8, hi);
+ } }
+}
+
+
+typedef void (*XXH3_f_accumulate_512)(void* XXH_RESTRICT, const void*, const void*);
+typedef void (*XXH3_f_scrambleAcc)(void* XXH_RESTRICT, const void*);
+typedef void (*XXH3_f_initCustomSecret)(void* XXH_RESTRICT, xxh_u64);
+
+
+#if (XXH_VECTOR == XXH_AVX512)
+
+#define XXH3_accumulate_512 XXH3_accumulate_512_avx512
+#define XXH3_scrambleAcc XXH3_scrambleAcc_avx512
+#define XXH3_initCustomSecret XXH3_initCustomSecret_avx512
+
+#elif (XXH_VECTOR == XXH_AVX2)
+
+#define XXH3_accumulate_512 XXH3_accumulate_512_avx2
+#define XXH3_scrambleAcc XXH3_scrambleAcc_avx2
+#define XXH3_initCustomSecret XXH3_initCustomSecret_avx2
+
+#elif (XXH_VECTOR == XXH_SSE2)
+
+#define XXH3_accumulate_512 XXH3_accumulate_512_sse2
+#define XXH3_scrambleAcc XXH3_scrambleAcc_sse2
+#define XXH3_initCustomSecret XXH3_initCustomSecret_sse2
+
+#elif (XXH_VECTOR == XXH_NEON)
+
+#define XXH3_accumulate_512 XXH3_accumulate_512_neon
+#define XXH3_scrambleAcc XXH3_scrambleAcc_neon
+#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar
+
+#elif (XXH_VECTOR == XXH_VSX)
+
+#define XXH3_accumulate_512 XXH3_accumulate_512_vsx
+#define XXH3_scrambleAcc XXH3_scrambleAcc_vsx
+#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar
+
+#else /* scalar */
+
+#define XXH3_accumulate_512 XXH3_accumulate_512_scalar
+#define XXH3_scrambleAcc XXH3_scrambleAcc_scalar
+#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar
+
+#endif
+
+
+
+#ifndef XXH_PREFETCH_DIST
+# ifdef __clang__
+# define XXH_PREFETCH_DIST 320
+# else
+# if (XXH_VECTOR == XXH_AVX512)
+# define XXH_PREFETCH_DIST 512
+# else
+# define XXH_PREFETCH_DIST 384
+# endif
+# endif /* __clang__ */
+#endif /* XXH_PREFETCH_DIST */
+
+/*
+ * XXH3_accumulate()
+ * Loops over XXH3_accumulate_512().
+ * Assumption: nbStripes will not overflow the secret size
+ */
+XXH_FORCE_INLINE void
+XXH3_accumulate( xxh_u64* XXH_RESTRICT acc,
+ const xxh_u8* XXH_RESTRICT input,
+ const xxh_u8* XXH_RESTRICT secret,
+ size_t nbStripes,
+ XXH3_f_accumulate_512 f_acc512)
+{
+ size_t n;
+ for (n = 0; n < nbStripes; n++ ) {
+ const xxh_u8* const in = input + n*XXH_STRIPE_LEN;
+ XXH_PREFETCH(in + XXH_PREFETCH_DIST);
+ f_acc512(acc,
+ in,
+ secret + n*XXH_SECRET_CONSUME_RATE);
+ }
+}
+
+XXH_FORCE_INLINE void
+XXH3_hashLong_internal_loop(xxh_u64* XXH_RESTRICT acc,
+ const xxh_u8* XXH_RESTRICT input, size_t len,
+ const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
+ XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_scrambleAcc f_scramble)
+{
+ size_t const nbStripesPerBlock = (secretSize - XXH_STRIPE_LEN) / XXH_SECRET_CONSUME_RATE;
+ size_t const block_len = XXH_STRIPE_LEN * nbStripesPerBlock;
+ size_t const nb_blocks = (len - 1) / block_len;
+
+ size_t n;
+
+ XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN);
+
+ for (n = 0; n < nb_blocks; n++) {
+ XXH3_accumulate(acc, input + n*block_len, secret, nbStripesPerBlock, f_acc512);
+ f_scramble(acc, secret + secretSize - XXH_STRIPE_LEN);
+ }
+
+ /* last partial block */
+ XXH_ASSERT(len > XXH_STRIPE_LEN);
+ { size_t const nbStripes = ((len - 1) - (block_len * nb_blocks)) / XXH_STRIPE_LEN;
+ XXH_ASSERT(nbStripes <= (secretSize / XXH_SECRET_CONSUME_RATE));
+ XXH3_accumulate(acc, input + nb_blocks*block_len, secret, nbStripes, f_acc512);
+
+ /* last stripe */
+ { const xxh_u8* const p = input + len - XXH_STRIPE_LEN;
+#define XXH_SECRET_LASTACC_START 7 /* not aligned on 8, last secret is different from acc & scrambler */
+ f_acc512(acc, p, secret + secretSize - XXH_STRIPE_LEN - XXH_SECRET_LASTACC_START);
+ } }
+}
+
+XXH_FORCE_INLINE xxh_u64
+XXH3_mix2Accs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret)
+{
+ return XXH3_mul128_fold64(
+ acc[0] ^ XXH_readLE64(secret),
+ acc[1] ^ XXH_readLE64(secret+8) );
+}
+
+static XXH64_hash_t
+XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret, xxh_u64 start)
+{
+ xxh_u64 result64 = start;
+ size_t i = 0;
+
+ for (i = 0; i < 4; i++) {
+ result64 += XXH3_mix2Accs(acc+2*i, secret + 16*i);
+#if defined(__clang__) /* Clang */ \
+ && (defined(__arm__) || defined(__thumb__)) /* ARMv7 */ \
+ && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \
+ && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */
+ /*
+ * UGLY HACK:
+ * Prevent autovectorization on Clang ARMv7-a. Exact same problem as
+ * the one in XXH3_len_129to240_64b. Speeds up shorter keys > 240b.
+ * XXH3_64bits, len == 256, Snapdragon 835:
+ * without hack: 2063.7 MB/s
+ * with hack: 2560.7 MB/s
+ */
+ __asm__("" : "+r" (result64));
+#endif
+ }
+
+ return XXH3_avalanche(result64);
+}
+
+#define XXH3_INIT_ACC { XXH_PRIME32_3, XXH_PRIME64_1, XXH_PRIME64_2, XXH_PRIME64_3, \
+ XXH_PRIME64_4, XXH_PRIME32_2, XXH_PRIME64_5, XXH_PRIME32_1 }
+
+XXH_FORCE_INLINE XXH64_hash_t
+XXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len,
+ const void* XXH_RESTRICT secret, size_t secretSize,
+ XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_scrambleAcc f_scramble)
+{
+ XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC;
+
+ XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, f_acc512, f_scramble);
+
+ /* converge into final hash */
+ XXH_STATIC_ASSERT(sizeof(acc) == 64);
+ /* do not align on 8, so that the secret is different from the accumulator */
+#define XXH_SECRET_MERGEACCS_START 11
+ XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START);
+ return XXH3_mergeAccs(acc, (const xxh_u8*)secret + XXH_SECRET_MERGEACCS_START, (xxh_u64)len * XXH_PRIME64_1);
+}
+
+/*
+ * It's important for performance that XXH3_hashLong is not inlined.
+ */
+XXH_NO_INLINE XXH64_hash_t
+XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len,
+ XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen)
+{
+ (void)seed64;
+ return XXH3_hashLong_64b_internal(input, len, secret, secretLen, XXH3_accumulate_512, XXH3_scrambleAcc);
+}
+
+/*
+ * It's important for performance that XXH3_hashLong is not inlined.
+ * Since the function is not inlined, the compiler may not be able to understand that,
+ * in some scenarios, its `secret` argument is actually a compile time constant.
+ * This variant enforces that the compiler can detect that,
+ * and uses this opportunity to streamline the generated code for better performance.
+ */
+XXH_NO_INLINE XXH64_hash_t
+XXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len,
+ XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen)
+{
+ (void)seed64; (void)secret; (void)secretLen;
+ return XXH3_hashLong_64b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_accumulate_512, XXH3_scrambleAcc);
+}
+
+/*
+ * XXH3_hashLong_64b_withSeed():
+ * Generate a custom key based on alteration of default XXH3_kSecret with the seed,
+ * and then use this key for long mode hashing.
+ *
+ * This operation is decently fast but nonetheless costs a little bit of time.
+ * Try to avoid it whenever possible (typically when seed==0).
+ *
+ * It's important for performance that XXH3_hashLong is not inlined. Not sure
+ * why (uop cache maybe?), but the difference is large and easily measurable.
+ */
+XXH_FORCE_INLINE XXH64_hash_t
+XXH3_hashLong_64b_withSeed_internal(const void* input, size_t len,
+ XXH64_hash_t seed,
+ XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_scrambleAcc f_scramble,
+ XXH3_f_initCustomSecret f_initSec)
+{
+ if (seed == 0)
+ return XXH3_hashLong_64b_internal(input, len,
+ XXH3_kSecret, sizeof(XXH3_kSecret),
+ f_acc512, f_scramble);
+ { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE];
+ f_initSec(secret, seed);
+ return XXH3_hashLong_64b_internal(input, len, secret, sizeof(secret),
+ f_acc512, f_scramble);
+ }
+}
+
+/*
+ * It's important for performance that XXH3_hashLong is not inlined.
+ */
+XXH_NO_INLINE XXH64_hash_t
+XXH3_hashLong_64b_withSeed(const void* input, size_t len,
+ XXH64_hash_t seed, const xxh_u8* secret, size_t secretLen)
+{
+ (void)secret; (void)secretLen;
+ return XXH3_hashLong_64b_withSeed_internal(input, len, seed,
+ XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret);
+}
+
+
+typedef XXH64_hash_t (*XXH3_hashLong64_f)(const void* XXH_RESTRICT, size_t,
+ XXH64_hash_t, const xxh_u8* XXH_RESTRICT, size_t);
+
+XXH_FORCE_INLINE XXH64_hash_t
+XXH3_64bits_internal(const void* XXH_RESTRICT input, size_t len,
+ XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen,
+ XXH3_hashLong64_f f_hashLong)
+{
+ XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN);
+ /*
+ * If an action is to be taken if `secretLen` condition is not respected,
+ * it should be done here.
+ * For now, it's a contract pre-condition.
+ * Adding a check and a branch here would cost performance at every hash.
+ * Also, note that function signature doesn't offer room to return an error.
+ */
+ if (len <= 16)
+ return XXH3_len_0to16_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64);
+ if (len <= 128)
+ return XXH3_len_17to128_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64);
+ if (len <= XXH3_MIDSIZE_MAX)
+ return XXH3_len_129to240_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64);
+ return f_hashLong(input, len, seed64, (const xxh_u8*)secret, secretLen);
+}
+
+
+/* === Public entry point === */
+
+XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* input, size_t len)
+{
+ return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default);
+}
+
+XXH_PUBLIC_API XXH64_hash_t
+XXH3_64bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize)
+{
+ return XXH3_64bits_internal(input, len, 0, secret, secretSize, XXH3_hashLong_64b_withSecret);
+}
+
+XXH_PUBLIC_API XXH64_hash_t
+XXH3_64bits_withSeed(const void* input, size_t len, XXH64_hash_t seed)
+{
+ return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed);
+}
+
+
+/* === XXH3 streaming === */
+
+/*
+ * Malloc's a pointer that is always aligned to align.
+ *
+ * This must be freed with `XXH_alignedFree()`.
+ *
+ * malloc typically guarantees 16 byte alignment on 64-bit systems and 8 byte
+ * alignment on 32-bit. This isn't enough for the 32 byte aligned loads in AVX2
+ * or on 32-bit, the 16 byte aligned loads in SSE2 and NEON.
+ *
+ * This underalignment previously caused a rather obvious crash which went
+ * completely unnoticed due to XXH3_createState() not actually being tested.
+ * Credit to RedSpah for noticing this bug.
+ *
+ * The alignment is done manually: Functions like posix_memalign or _mm_malloc
+ * are avoided: To maintain portability, we would have to write a fallback
+ * like this anyways, and besides, testing for the existence of library
+ * functions without relying on external build tools is impossible.
+ *
+ * The method is simple: Overallocate, manually align, and store the offset
+ * to the original behind the returned pointer.
+ *
+ * Align must be a power of 2 and 8 <= align <= 128.
+ */
+static void* XXH_alignedMalloc(size_t s, size_t align)
+{
+ XXH_ASSERT(align <= 128 && align >= 8); /* range check */
+ XXH_ASSERT((align & (align-1)) == 0); /* power of 2 */
+ XXH_ASSERT(s != 0 && s < (s + align)); /* empty/overflow */
+ { /* Overallocate to make room for manual realignment and an offset byte */
+ xxh_u8* base = (xxh_u8*)XXH_malloc(s + align);
+ if (base != NULL) {
+ /*
+ * Get the offset needed to align this pointer.
+ *
+ * Even if the returned pointer is aligned, there will always be
+ * at least one byte to store the offset to the original pointer.
+ */
+ size_t offset = align - ((size_t)base & (align - 1)); /* base % align */
+ /* Add the offset for the now-aligned pointer */
+ xxh_u8* ptr = base + offset;
+
+ XXH_ASSERT((size_t)ptr % align == 0);
+
+ /* Store the offset immediately before the returned pointer. */
+ ptr[-1] = (xxh_u8)offset;
+ return ptr;
+ }
+ return NULL;
+ }
+}
+/*
+ * Frees an aligned pointer allocated by XXH_alignedMalloc(). Don't pass
+ * normal malloc'd pointers, XXH_alignedMalloc has a specific data layout.
+ */
+static void XXH_alignedFree(void* p)
+{
+ if (p != NULL) {
+ xxh_u8* ptr = (xxh_u8*)p;
+ /* Get the offset byte we added in XXH_malloc. */
+ xxh_u8 offset = ptr[-1];
+ /* Free the original malloc'd pointer */
+ xxh_u8* base = ptr - offset;
+ XXH_free(base);
+ }
+}
+XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void)
+{
+ XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64);
+ if (state==NULL) return NULL;
+ XXH3_INITSTATE(state);
+ return state;
+}
+
+XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr)
+{
+ XXH_alignedFree(statePtr);
+ return XXH_OK;
+}
+
+XXH_PUBLIC_API void
+XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state)
+{
+ memcpy(dst_state, src_state, sizeof(*dst_state));
+}
+
+static void
+XXH3_64bits_reset_internal(XXH3_state_t* statePtr,
+ XXH64_hash_t seed,
+ const void* secret, size_t secretSize)
+{
+ size_t const initStart = offsetof(XXH3_state_t, bufferedSize);
+ size_t const initLength = offsetof(XXH3_state_t, nbStripesPerBlock) - initStart;
+ XXH_ASSERT(offsetof(XXH3_state_t, nbStripesPerBlock) > initStart);
+ XXH_ASSERT(statePtr != NULL);
+ /* set members from bufferedSize to nbStripesPerBlock (excluded) to 0 */
+ memset((char*)statePtr + initStart, 0, initLength);
+ statePtr->acc[0] = XXH_PRIME32_3;
+ statePtr->acc[1] = XXH_PRIME64_1;
+ statePtr->acc[2] = XXH_PRIME64_2;
+ statePtr->acc[3] = XXH_PRIME64_3;
+ statePtr->acc[4] = XXH_PRIME64_4;
+ statePtr->acc[5] = XXH_PRIME32_2;
+ statePtr->acc[6] = XXH_PRIME64_5;
+ statePtr->acc[7] = XXH_PRIME32_1;
+ statePtr->seed = seed;
+ statePtr->extSecret = (const unsigned char*)secret;
+ XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN);
+ statePtr->secretLimit = secretSize - XXH_STRIPE_LEN;
+ statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE;
+}
+
+XXH_PUBLIC_API XXH_errorcode
+XXH3_64bits_reset(XXH3_state_t* statePtr)
+{
+ if (statePtr == NULL) return XXH_ERROR;
+ XXH3_64bits_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE);
+ return XXH_OK;
+}
+
+XXH_PUBLIC_API XXH_errorcode
+XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize)
+{
+ if (statePtr == NULL) return XXH_ERROR;
+ XXH3_64bits_reset_internal(statePtr, 0, secret, secretSize);
+ if (secret == NULL) return XXH_ERROR;
+ if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR;
+ return XXH_OK;
+}
+
+XXH_PUBLIC_API XXH_errorcode
+XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed)
+{
+ if (statePtr == NULL) return XXH_ERROR;
+ if (seed==0) return XXH3_64bits_reset(statePtr);
+ if (seed != statePtr->seed) XXH3_initCustomSecret(statePtr->customSecret, seed);
+ XXH3_64bits_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE);
+ return XXH_OK;
+}
+
+/* Note : when XXH3_consumeStripes() is invoked,
+ * there must be a guarantee that at least one more byte must be consumed from input
+ * so that the function can blindly consume all stripes using the "normal" secret segment */
+XXH_FORCE_INLINE void
+XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc,
+ size_t* XXH_RESTRICT nbStripesSoFarPtr, size_t nbStripesPerBlock,
+ const xxh_u8* XXH_RESTRICT input, size_t nbStripes,
+ const xxh_u8* XXH_RESTRICT secret, size_t secretLimit,
+ XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_scrambleAcc f_scramble)
+{
+ XXH_ASSERT(nbStripes <= nbStripesPerBlock); /* can handle max 1 scramble per invocation */
+ XXH_ASSERT(*nbStripesSoFarPtr < nbStripesPerBlock);
+ if (nbStripesPerBlock - *nbStripesSoFarPtr <= nbStripes) {
+ /* need a scrambling operation */
+ size_t const nbStripesToEndofBlock = nbStripesPerBlock - *nbStripesSoFarPtr;
+ size_t const nbStripesAfterBlock = nbStripes - nbStripesToEndofBlock;
+ XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripesToEndofBlock, f_acc512);
+ f_scramble(acc, secret + secretLimit);
+ XXH3_accumulate(acc, input + nbStripesToEndofBlock * XXH_STRIPE_LEN, secret, nbStripesAfterBlock, f_acc512);
+ *nbStripesSoFarPtr = nbStripesAfterBlock;
+ } else {
+ XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripes, f_acc512);
+ *nbStripesSoFarPtr += nbStripes;
+ }
+}
+
+/*
+ * Both XXH3_64bits_update and XXH3_128bits_update use this routine.
+ */
+XXH_FORCE_INLINE XXH_errorcode
+XXH3_update(XXH3_state_t* state,
+ const xxh_u8* input, size_t len,
+ XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_scrambleAcc f_scramble)
+{
+ if (input==NULL)
+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1)
+ return XXH_OK;
+#else
+ return XXH_ERROR;
+#endif
+
+ { const xxh_u8* const bEnd = input + len;
+ const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret;
+
+ state->totalLen += len;
+
+ if (state->bufferedSize + len <= XXH3_INTERNALBUFFER_SIZE) { /* fill in tmp buffer */
+ XXH_memcpy(state->buffer + state->bufferedSize, input, len);
+ state->bufferedSize += (XXH32_hash_t)len;
+ return XXH_OK;
+ }
+ /* total input is now > XXH3_INTERNALBUFFER_SIZE */
+
+ #define XXH3_INTERNALBUFFER_STRIPES (XXH3_INTERNALBUFFER_SIZE / XXH_STRIPE_LEN)
+ XXH_STATIC_ASSERT(XXH3_INTERNALBUFFER_SIZE % XXH_STRIPE_LEN == 0); /* clean multiple */
+
+ /*
+ * Internal buffer is partially filled (always, except at beginning)
+ * Complete it, then consume it.
+ */
+ if (state->bufferedSize) {
+ size_t const loadSize = XXH3_INTERNALBUFFER_SIZE - state->bufferedSize;
+ XXH_memcpy(state->buffer + state->bufferedSize, input, loadSize);
+ input += loadSize;
+ XXH3_consumeStripes(state->acc,
+ &state->nbStripesSoFar, state->nbStripesPerBlock,
+ state->buffer, XXH3_INTERNALBUFFER_STRIPES,
+ secret, state->secretLimit,
+ f_acc512, f_scramble);
+ state->bufferedSize = 0;
+ }
+ XXH_ASSERT(input < bEnd);
+
+ /* Consume input by a multiple of internal buffer size */
+ if (input+XXH3_INTERNALBUFFER_SIZE < bEnd) {
+ const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE;
+ do {
+ XXH3_consumeStripes(state->acc,
+ &state->nbStripesSoFar, state->nbStripesPerBlock,
+ input, XXH3_INTERNALBUFFER_STRIPES,
+ secret, state->secretLimit,
+ f_acc512, f_scramble);
+ input += XXH3_INTERNALBUFFER_SIZE;
+ } while (input<limit);
+ /* for last partial stripe */
+ memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN);
+ }
+ XXH_ASSERT(input < bEnd);
+
+ /* Some remaining input (always) : buffer it */
+ XXH_memcpy(state->buffer, input, (size_t)(bEnd-input));
+ state->bufferedSize = (XXH32_hash_t)(bEnd-input);
+ }
+
+ return XXH_OK;
+}
+
+XXH_PUBLIC_API XXH_errorcode
+XXH3_64bits_update(XXH3_state_t* state, const void* input, size_t len)
+{
+ return XXH3_update(state, (const xxh_u8*)input, len,
+ XXH3_accumulate_512, XXH3_scrambleAcc);
+}
+
+
+XXH_FORCE_INLINE void
+XXH3_digest_long (XXH64_hash_t* acc,
+ const XXH3_state_t* state,
+ const unsigned char* secret)
+{
+ /*
+ * Digest on a local copy. This way, the state remains unaltered, and it can
+ * continue ingesting more input afterwards.
+ */
+ memcpy(acc, state->acc, sizeof(state->acc));
+ if (state->bufferedSize >= XXH_STRIPE_LEN) {
+ size_t const nbStripes = (state->bufferedSize - 1) / XXH_STRIPE_LEN;
+ size_t nbStripesSoFar = state->nbStripesSoFar;
+ XXH3_consumeStripes(acc,
+ &nbStripesSoFar, state->nbStripesPerBlock,
+ state->buffer, nbStripes,
+ secret, state->secretLimit,
+ XXH3_accumulate_512, XXH3_scrambleAcc);
+ /* last stripe */
+ XXH3_accumulate_512(acc,
+ state->buffer + state->bufferedSize - XXH_STRIPE_LEN,
+ secret + state->secretLimit - XXH_SECRET_LASTACC_START);
+ } else { /* bufferedSize < XXH_STRIPE_LEN */
+ xxh_u8 lastStripe[XXH_STRIPE_LEN];
+ size_t const catchupSize = XXH_STRIPE_LEN - state->bufferedSize;
+ XXH_ASSERT(state->bufferedSize > 0); /* there is always some input buffered */
+ memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize);
+ memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize);
+ XXH3_accumulate_512(acc,
+ lastStripe,
+ secret + state->secretLimit - XXH_SECRET_LASTACC_START);
+ }
+}
+
+XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state)
+{
+ const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret;
+ if (state->totalLen > XXH3_MIDSIZE_MAX) {
+ XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB];
+ XXH3_digest_long(acc, state, secret);
+ return XXH3_mergeAccs(acc,
+ secret + XXH_SECRET_MERGEACCS_START,
+ (xxh_u64)state->totalLen * XXH_PRIME64_1);
+ }
+ /* totalLen <= XXH3_MIDSIZE_MAX: digesting a short input */
+ if (state->seed)
+ return XXH3_64bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed);
+ return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen),
+ secret, state->secretLimit + XXH_STRIPE_LEN);
+}
+
+
+#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x))
+
+XXH_PUBLIC_API void
+XXH3_generateSecret(void* secretBuffer, const void* customSeed, size_t customSeedSize)
+{
+ XXH_ASSERT(secretBuffer != NULL);
+ if (customSeedSize == 0) {
+ memcpy(secretBuffer, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE);
+ return;
+ }
+ XXH_ASSERT(customSeed != NULL);
+
+ { size_t const segmentSize = sizeof(XXH128_hash_t);
+ size_t const nbSegments = XXH_SECRET_DEFAULT_SIZE / segmentSize;
+ XXH128_canonical_t scrambler;
+ XXH64_hash_t seeds[12];
+ size_t segnb;
+ XXH_ASSERT(nbSegments == 12);
+ XXH_ASSERT(segmentSize * nbSegments == XXH_SECRET_DEFAULT_SIZE); /* exact multiple */
+ XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0));
+
+ /*
+ * Copy customSeed to seeds[], truncating or repeating as necessary.
+ */
+ { size_t toFill = XXH_MIN(customSeedSize, sizeof(seeds));
+ size_t filled = toFill;
+ memcpy(seeds, customSeed, toFill);
+ while (filled < sizeof(seeds)) {
+ toFill = XXH_MIN(filled, sizeof(seeds) - filled);
+ memcpy((char*)seeds + filled, seeds, toFill);
+ filled += toFill;
+ } }
+
+ /* generate secret */
+ memcpy(secretBuffer, &scrambler, sizeof(scrambler));
+ for (segnb=1; segnb < nbSegments; segnb++) {
+ size_t const segmentStart = segnb * segmentSize;
+ XXH128_canonical_t segment;
+ XXH128_canonicalFromHash(&segment,
+ XXH128(&scrambler, sizeof(scrambler), XXH_readLE64(seeds + segnb) + segnb) );
+ memcpy((char*)secretBuffer + segmentStart, &segment, sizeof(segment));
+ } }
+}
+
+
+/* ==========================================
+ * XXH3 128 bits (a.k.a XXH128)
+ * ==========================================
+ * XXH3's 128-bit variant has better mixing and strength than the 64-bit variant,
+ * even without counting the significantly larger output size.
+ *
+ * For example, extra steps are taken to avoid the seed-dependent collisions
+ * in 17-240 byte inputs (See XXH3_mix16B and XXH128_mix32B).
+ *
+ * This strength naturally comes at the cost of some speed, especially on short
+ * lengths. Note that longer hashes are about as fast as the 64-bit version
+ * due to it using only a slight modification of the 64-bit loop.
+ *
+ * XXH128 is also more oriented towards 64-bit machines. It is still extremely
+ * fast for a _128-bit_ hash on 32-bit (it usually clears XXH64).
+ */
+
+XXH_FORCE_INLINE XXH128_hash_t
+XXH3_len_1to3_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
+{
+ /* A doubled version of 1to3_64b with different constants. */
+ XXH_ASSERT(input != NULL);
+ XXH_ASSERT(1 <= len && len <= 3);
+ XXH_ASSERT(secret != NULL);
+ /*
+ * len = 1: combinedl = { input[0], 0x01, input[0], input[0] }
+ * len = 2: combinedl = { input[1], 0x02, input[0], input[1] }
+ * len = 3: combinedl = { input[2], 0x03, input[0], input[1] }
+ */
+ { xxh_u8 const c1 = input[0];
+ xxh_u8 const c2 = input[len >> 1];
+ xxh_u8 const c3 = input[len - 1];
+ xxh_u32 const combinedl = ((xxh_u32)c1 <<16) | ((xxh_u32)c2 << 24)
+ | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8);
+ xxh_u32 const combinedh = XXH_rotl32(XXH_swap32(combinedl), 13);
+ xxh_u64 const bitflipl = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed;
+ xxh_u64 const bitfliph = (XXH_readLE32(secret+8) ^ XXH_readLE32(secret+12)) - seed;
+ xxh_u64 const keyed_lo = (xxh_u64)combinedl ^ bitflipl;
+ xxh_u64 const keyed_hi = (xxh_u64)combinedh ^ bitfliph;
+ XXH128_hash_t h128;
+ h128.low64 = XXH64_avalanche(keyed_lo);
+ h128.high64 = XXH64_avalanche(keyed_hi);
+ return h128;
+ }
+}
+
+XXH_FORCE_INLINE XXH128_hash_t
+XXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
+{
+ XXH_ASSERT(input != NULL);
+ XXH_ASSERT(secret != NULL);
+ XXH_ASSERT(4 <= len && len <= 8);
+ seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32;
+ { xxh_u32 const input_lo = XXH_readLE32(input);
+ xxh_u32 const input_hi = XXH_readLE32(input + len - 4);
+ xxh_u64 const input_64 = input_lo + ((xxh_u64)input_hi << 32);
+ xxh_u64 const bitflip = (XXH_readLE64(secret+16) ^ XXH_readLE64(secret+24)) + seed;
+ xxh_u64 const keyed = input_64 ^ bitflip;
+
+ /* Shift len to the left to ensure it is even, this avoids even multiplies. */
+ XXH128_hash_t m128 = XXH_mult64to128(keyed, XXH_PRIME64_1 + (len << 2));
+
+ m128.high64 += (m128.low64 << 1);
+ m128.low64 ^= (m128.high64 >> 3);
+
+ m128.low64 = XXH_xorshift64(m128.low64, 35);
+ m128.low64 *= 0x9FB21C651E98DF25ULL;
+ m128.low64 = XXH_xorshift64(m128.low64, 28);
+ m128.high64 = XXH3_avalanche(m128.high64);
+ return m128;
+ }
+}
+
+XXH_FORCE_INLINE XXH128_hash_t
+XXH3_len_9to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
+{
+ XXH_ASSERT(input != NULL);
+ XXH_ASSERT(secret != NULL);
+ XXH_ASSERT(9 <= len && len <= 16);
+ { xxh_u64 const bitflipl = (XXH_readLE64(secret+32) ^ XXH_readLE64(secret+40)) - seed;
+ xxh_u64 const bitfliph = (XXH_readLE64(secret+48) ^ XXH_readLE64(secret+56)) + seed;
+ xxh_u64 const input_lo = XXH_readLE64(input);
+ xxh_u64 input_hi = XXH_readLE64(input + len - 8);
+ XXH128_hash_t m128 = XXH_mult64to128(input_lo ^ input_hi ^ bitflipl, XXH_PRIME64_1);
+ /*
+ * Put len in the middle of m128 to ensure that the length gets mixed to
+ * both the low and high bits in the 128x64 multiply below.
+ */
+ m128.low64 += (xxh_u64)(len - 1) << 54;
+ input_hi ^= bitfliph;
+ /*
+ * Add the high 32 bits of input_hi to the high 32 bits of m128, then
+ * add the long product of the low 32 bits of input_hi and XXH_PRIME32_2 to
+ * the high 64 bits of m128.
+ *
+ * The best approach to this operation is different on 32-bit and 64-bit.
+ */
+ if (sizeof(void *) < sizeof(xxh_u64)) { /* 32-bit */
+ /*
+ * 32-bit optimized version, which is more readable.
+ *
+ * On 32-bit, it removes an ADC and delays a dependency between the two
+ * halves of m128.high64, but it generates an extra mask on 64-bit.
+ */
+ m128.high64 += (input_hi & 0xFFFFFFFF00000000ULL) + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2);
+ } else {
+ /*
+ * 64-bit optimized (albeit more confusing) version.
+ *
+ * Uses some properties of addition and multiplication to remove the mask:
+ *
+ * Let:
+ * a = input_hi.lo = (input_hi & 0x00000000FFFFFFFF)
+ * b = input_hi.hi = (input_hi & 0xFFFFFFFF00000000)
+ * c = XXH_PRIME32_2
+ *
+ * a + (b * c)
+ * Inverse Property: x + y - x == y
+ * a + (b * (1 + c - 1))
+ * Distributive Property: x * (y + z) == (x * y) + (x * z)
+ * a + (b * 1) + (b * (c - 1))
+ * Identity Property: x * 1 == x
+ * a + b + (b * (c - 1))
+ *
+ * Substitute a, b, and c:
+ * input_hi.hi + input_hi.lo + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1))
+ *
+ * Since input_hi.hi + input_hi.lo == input_hi, we get this:
+ * input_hi + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1))
+ */
+ m128.high64 += input_hi + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2 - 1);
+ }
+ /* m128 ^= XXH_swap64(m128 >> 64); */
+ m128.low64 ^= XXH_swap64(m128.high64);
+
+ { /* 128x64 multiply: h128 = m128 * XXH_PRIME64_2; */
+ XXH128_hash_t h128 = XXH_mult64to128(m128.low64, XXH_PRIME64_2);
+ h128.high64 += m128.high64 * XXH_PRIME64_2;
+
+ h128.low64 = XXH3_avalanche(h128.low64);
+ h128.high64 = XXH3_avalanche(h128.high64);
+ return h128;
+ } }
+}
+
+/*
+ * Assumption: `secret` size is >= XXH3_SECRET_SIZE_MIN
+ */
+XXH_FORCE_INLINE XXH128_hash_t
+XXH3_len_0to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
+{
+ XXH_ASSERT(len <= 16);
+ { if (len > 8) return XXH3_len_9to16_128b(input, len, secret, seed);
+ if (len >= 4) return XXH3_len_4to8_128b(input, len, secret, seed);
+ if (len) return XXH3_len_1to3_128b(input, len, secret, seed);
+ { XXH128_hash_t h128;
+ xxh_u64 const bitflipl = XXH_readLE64(secret+64) ^ XXH_readLE64(secret+72);
+ xxh_u64 const bitfliph = XXH_readLE64(secret+80) ^ XXH_readLE64(secret+88);
+ h128.low64 = XXH64_avalanche(seed ^ bitflipl);
+ h128.high64 = XXH64_avalanche( seed ^ bitfliph);
+ return h128;
+ } }
+}
+
+/*
+ * A bit slower than XXH3_mix16B, but handles multiply by zero better.
+ */
+XXH_FORCE_INLINE XXH128_hash_t
+XXH128_mix32B(XXH128_hash_t acc, const xxh_u8* input_1, const xxh_u8* input_2,
+ const xxh_u8* secret, XXH64_hash_t seed)
+{
+ acc.low64 += XXH3_mix16B (input_1, secret+0, seed);
+ acc.low64 ^= XXH_readLE64(input_2) + XXH_readLE64(input_2 + 8);
+ acc.high64 += XXH3_mix16B (input_2, secret+16, seed);
+ acc.high64 ^= XXH_readLE64(input_1) + XXH_readLE64(input_1 + 8);
+ return acc;
+}
+
+
+XXH_FORCE_INLINE XXH128_hash_t
+XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len,
+ const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
+ XXH64_hash_t seed)
+{
+ XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize;
+ XXH_ASSERT(16 < len && len <= 128);
+
+ { XXH128_hash_t acc;
+ acc.low64 = len * XXH_PRIME64_1;
+ acc.high64 = 0;
+ if (len > 32) {
+ if (len > 64) {
+ if (len > 96) {
+ acc = XXH128_mix32B(acc, input+48, input+len-64, secret+96, seed);
+ }
+ acc = XXH128_mix32B(acc, input+32, input+len-48, secret+64, seed);
+ }
+ acc = XXH128_mix32B(acc, input+16, input+len-32, secret+32, seed);
+ }
+ acc = XXH128_mix32B(acc, input, input+len-16, secret, seed);
+ { XXH128_hash_t h128;
+ h128.low64 = acc.low64 + acc.high64;
+ h128.high64 = (acc.low64 * XXH_PRIME64_1)
+ + (acc.high64 * XXH_PRIME64_4)
+ + ((len - seed) * XXH_PRIME64_2);
+ h128.low64 = XXH3_avalanche(h128.low64);
+ h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64);
+ return h128;
+ }
+ }
+}
+
+XXH_NO_INLINE XXH128_hash_t
+XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len,
+ const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
+ XXH64_hash_t seed)
+{
+ XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize;
+ XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX);
+
+ { XXH128_hash_t acc;
+ int const nbRounds = (int)len / 32;
+ int i;
+ acc.low64 = len * XXH_PRIME64_1;
+ acc.high64 = 0;
+ for (i=0; i<4; i++) {
+ acc = XXH128_mix32B(acc,
+ input + (32 * i),
+ input + (32 * i) + 16,
+ secret + (32 * i),
+ seed);
+ }
+ acc.low64 = XXH3_avalanche(acc.low64);
+ acc.high64 = XXH3_avalanche(acc.high64);
+ XXH_ASSERT(nbRounds >= 4);
+ for (i=4 ; i < nbRounds; i++) {
+ acc = XXH128_mix32B(acc,
+ input + (32 * i),
+ input + (32 * i) + 16,
+ secret + XXH3_MIDSIZE_STARTOFFSET + (32 * (i - 4)),
+ seed);
+ }
+ /* last bytes */
+ acc = XXH128_mix32B(acc,
+ input + len - 16,
+ input + len - 32,
+ secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET - 16,
+ 0ULL - seed);
+
+ { XXH128_hash_t h128;
+ h128.low64 = acc.low64 + acc.high64;
+ h128.high64 = (acc.low64 * XXH_PRIME64_1)
+ + (acc.high64 * XXH_PRIME64_4)
+ + ((len - seed) * XXH_PRIME64_2);
+ h128.low64 = XXH3_avalanche(h128.low64);
+ h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64);
+ return h128;
+ }
+ }
+}
+
+XXH_FORCE_INLINE XXH128_hash_t
+XXH3_hashLong_128b_internal(const void* XXH_RESTRICT input, size_t len,
+ const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
+ XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_scrambleAcc f_scramble)
+{
+ XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC;
+
+ XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, secret, secretSize, f_acc512, f_scramble);
+
+ /* converge into final hash */
+ XXH_STATIC_ASSERT(sizeof(acc) == 64);
+ XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START);
+ { XXH128_hash_t h128;
+ h128.low64 = XXH3_mergeAccs(acc,
+ secret + XXH_SECRET_MERGEACCS_START,
+ (xxh_u64)len * XXH_PRIME64_1);
+ h128.high64 = XXH3_mergeAccs(acc,
+ secret + secretSize
+ - sizeof(acc) - XXH_SECRET_MERGEACCS_START,
+ ~((xxh_u64)len * XXH_PRIME64_2));
+ return h128;
+ }
+}
+
+/*
+ * It's important for performance that XXH3_hashLong is not inlined.
+ */
+XXH_NO_INLINE XXH128_hash_t
+XXH3_hashLong_128b_default(const void* XXH_RESTRICT input, size_t len,
+ XXH64_hash_t seed64,
+ const void* XXH_RESTRICT secret, size_t secretLen)
+{
+ (void)seed64; (void)secret; (void)secretLen;
+ return XXH3_hashLong_128b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret),
+ XXH3_accumulate_512, XXH3_scrambleAcc);
+}
+
+/*
+ * It's important for performance that XXH3_hashLong is not inlined.
+ */
+XXH_NO_INLINE XXH128_hash_t
+XXH3_hashLong_128b_withSecret(const void* XXH_RESTRICT input, size_t len,
+ XXH64_hash_t seed64,
+ const void* XXH_RESTRICT secret, size_t secretLen)
+{
+ (void)seed64;
+ return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, secretLen,
+ XXH3_accumulate_512, XXH3_scrambleAcc);
+}
+
+XXH_FORCE_INLINE XXH128_hash_t
+XXH3_hashLong_128b_withSeed_internal(const void* XXH_RESTRICT input, size_t len,
+ XXH64_hash_t seed64,
+ XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_scrambleAcc f_scramble,
+ XXH3_f_initCustomSecret f_initSec)
+{
+ if (seed64 == 0)
+ return XXH3_hashLong_128b_internal(input, len,
+ XXH3_kSecret, sizeof(XXH3_kSecret),
+ f_acc512, f_scramble);
+ { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE];
+ f_initSec(secret, seed64);
+ return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, sizeof(secret),
+ f_acc512, f_scramble);
+ }
+}
+
+/*
+ * It's important for performance that XXH3_hashLong is not inlined.
+ */
+XXH_NO_INLINE XXH128_hash_t
+XXH3_hashLong_128b_withSeed(const void* input, size_t len,
+ XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen)
+{
+ (void)secret; (void)secretLen;
+ return XXH3_hashLong_128b_withSeed_internal(input, len, seed64,
+ XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret);
+}
+
+typedef XXH128_hash_t (*XXH3_hashLong128_f)(const void* XXH_RESTRICT, size_t,
+ XXH64_hash_t, const void* XXH_RESTRICT, size_t);
+
+XXH_FORCE_INLINE XXH128_hash_t
+XXH3_128bits_internal(const void* input, size_t len,
+ XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen,
+ XXH3_hashLong128_f f_hl128)
+{
+ XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN);
+ /*
+ * If an action is to be taken if `secret` conditions are not respected,
+ * it should be done here.
+ * For now, it's a contract pre-condition.
+ * Adding a check and a branch here would cost performance at every hash.
+ */
+ if (len <= 16)
+ return XXH3_len_0to16_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64);
+ if (len <= 128)
+ return XXH3_len_17to128_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64);
+ if (len <= XXH3_MIDSIZE_MAX)
+ return XXH3_len_129to240_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64);
+ return f_hl128(input, len, seed64, secret, secretLen);
+}
+
+
+/* === Public XXH128 API === */
+
+XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* input, size_t len)
+{
+ return XXH3_128bits_internal(input, len, 0,
+ XXH3_kSecret, sizeof(XXH3_kSecret),
+ XXH3_hashLong_128b_default);
+}
+
+XXH_PUBLIC_API XXH128_hash_t
+XXH3_128bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize)
+{
+ return XXH3_128bits_internal(input, len, 0,
+ (const xxh_u8*)secret, secretSize,
+ XXH3_hashLong_128b_withSecret);
+}
+
+XXH_PUBLIC_API XXH128_hash_t
+XXH3_128bits_withSeed(const void* input, size_t len, XXH64_hash_t seed)
+{
+ return XXH3_128bits_internal(input, len, seed,
+ XXH3_kSecret, sizeof(XXH3_kSecret),
+ XXH3_hashLong_128b_withSeed);
+}
+
+XXH_PUBLIC_API XXH128_hash_t
+XXH128(const void* input, size_t len, XXH64_hash_t seed)
+{
+ return XXH3_128bits_withSeed(input, len, seed);
+}
+
+
+/* === XXH3 128-bit streaming === */
+
+/*
+ * All the functions are actually the same as for 64-bit streaming variant.
+ * The only difference is the finalizatiom routine.
+ */
+
+static void
+XXH3_128bits_reset_internal(XXH3_state_t* statePtr,
+ XXH64_hash_t seed,
+ const void* secret, size_t secretSize)
+{
+ XXH3_64bits_reset_internal(statePtr, seed, secret, secretSize);
+}
+
+XXH_PUBLIC_API XXH_errorcode
+XXH3_128bits_reset(XXH3_state_t* statePtr)
+{
+ if (statePtr == NULL) return XXH_ERROR;
+ XXH3_128bits_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE);
+ return XXH_OK;
+}
+
+XXH_PUBLIC_API XXH_errorcode
+XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize)
+{
+ if (statePtr == NULL) return XXH_ERROR;
+ XXH3_128bits_reset_internal(statePtr, 0, secret, secretSize);
+ if (secret == NULL) return XXH_ERROR;
+ if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR;
+ return XXH_OK;
+}
+
+XXH_PUBLIC_API XXH_errorcode
+XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed)
+{
+ if (statePtr == NULL) return XXH_ERROR;
+ if (seed==0) return XXH3_128bits_reset(statePtr);
+ if (seed != statePtr->seed) XXH3_initCustomSecret(statePtr->customSecret, seed);
+ XXH3_128bits_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE);
+ return XXH_OK;
+}
+
+XXH_PUBLIC_API XXH_errorcode
+XXH3_128bits_update(XXH3_state_t* state, const void* input, size_t len)
+{
+ return XXH3_update(state, (const xxh_u8*)input, len,
+ XXH3_accumulate_512, XXH3_scrambleAcc);
+}
+
+XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state)
+{
+ const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret;
+ if (state->totalLen > XXH3_MIDSIZE_MAX) {
+ XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB];
+ XXH3_digest_long(acc, state, secret);
+ XXH_ASSERT(state->secretLimit + XXH_STRIPE_LEN >= sizeof(acc) + XXH_SECRET_MERGEACCS_START);
+ { XXH128_hash_t h128;
+ h128.low64 = XXH3_mergeAccs(acc,
+ secret + XXH_SECRET_MERGEACCS_START,
+ (xxh_u64)state->totalLen * XXH_PRIME64_1);
+ h128.high64 = XXH3_mergeAccs(acc,
+ secret + state->secretLimit + XXH_STRIPE_LEN
+ - sizeof(acc) - XXH_SECRET_MERGEACCS_START,
+ ~((xxh_u64)state->totalLen * XXH_PRIME64_2));
+ return h128;
+ }
+ }
+ /* len <= XXH3_MIDSIZE_MAX : short code */
+ if (state->seed)
+ return XXH3_128bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed);
+ return XXH3_128bits_withSecret(state->buffer, (size_t)(state->totalLen),
+ secret, state->secretLimit + XXH_STRIPE_LEN);
+}
+
+/* 128-bit utility functions */
+
+#include <string.h> /* memcmp, memcpy */
+
+/* return : 1 is equal, 0 if different */
+XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2)
+{
+ /* note : XXH128_hash_t is compact, it has no padding byte */
+ return !(memcmp(&h1, &h2, sizeof(h1)));
+}
+
+/* This prototype is compatible with stdlib's qsort().
+ * return : >0 if *h128_1 > *h128_2
+ * <0 if *h128_1 < *h128_2
+ * =0 if *h128_1 == *h128_2 */
+XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2)
+{
+ XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1;
+ XXH128_hash_t const h2 = *(const XXH128_hash_t*)h128_2;
+ int const hcmp = (h1.high64 > h2.high64) - (h2.high64 > h1.high64);
+ /* note : bets that, in most cases, hash values are different */
+ if (hcmp) return hcmp;
+ return (h1.low64 > h2.low64) - (h2.low64 > h1.low64);
+}
+
+
+/*====== Canonical representation ======*/
+XXH_PUBLIC_API void
+XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash)
+{
+ XXH_STATIC_ASSERT(sizeof(XXH128_canonical_t) == sizeof(XXH128_hash_t));
+ if (XXH_CPU_LITTLE_ENDIAN) {
+ hash.high64 = XXH_swap64(hash.high64);
+ hash.low64 = XXH_swap64(hash.low64);
+ }
+ memcpy(dst, &hash.high64, sizeof(hash.high64));
+ memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64));
+}
+
+XXH_PUBLIC_API XXH128_hash_t
+XXH128_hashFromCanonical(const XXH128_canonical_t* src)
+{
+ XXH128_hash_t h;
+ h.high64 = XXH_readBE64(src);
+ h.low64 = XXH_readBE64(src->digest + 8);
+ return h;
+}
+
+/* Pop our optimization override from above */
+#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \
+ && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \
+ && defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__) /* respect -O0 and -Os */
+# pragma GCC pop_options
+#endif
+
+#endif /* XXH_NO_LONG_LONG */
+
+
+#endif /* XXH_IMPLEMENTATION */
+
+
+#if defined (__cplusplus)
+}
+#endif
diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c
index 90c209cbcb..7ccbb82662 100644
--- a/ext/iconv/iconv.c
+++ b/ext/iconv/iconv.c
@@ -1820,7 +1820,7 @@ PHP_FUNCTION(iconv_substr)
size_t charset_len;
zend_string *str;
zend_long offset, length = 0;
- zend_bool len_is_null = 1;
+ bool len_is_null = 1;
php_iconv_err_t err;
diff --git a/ext/iconv/iconv.stub.php b/ext/iconv/iconv.stub.php
index 84dc48a5e9..1daf9bb1a7 100644
--- a/ext/iconv/iconv.stub.php
+++ b/ext/iconv/iconv.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function iconv_strlen(string $string, ?string $encoding = null): int|false {}
diff --git a/ext/iconv/iconv_arginfo.h b/ext/iconv/iconv_arginfo.h
index 619d52631f..250c08ef55 100644
--- a/ext/iconv/iconv_arginfo.h
+++ b/ext/iconv/iconv_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 5d05deb60466c6e1ee73b44ad0b09a032bc8410e */
+ * Stub hash: c7b11a7cd853ede0ca7c5540995d8a7224d00da0 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_iconv_strlen, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
diff --git a/ext/iconv/tests/iconv_mime_decode-charset-length-cve-2007-4840.phpt b/ext/iconv/tests/iconv_mime_decode-charset-length-cve-2007-4840.phpt
index 59a8668957..b6af4749e8 100644
--- a/ext/iconv/tests/iconv_mime_decode-charset-length-cve-2007-4840.phpt
+++ b/ext/iconv/tests/iconv_mime_decode-charset-length-cve-2007-4840.phpt
@@ -5,7 +5,7 @@ iconv_mime_decode() charset parameter length checks (CVE-2007-4840)
--FILE--
<?php
$a = str_repeat("/", 9000000);
-var_dump(iconv_mime_decode("a", null, $a));
+var_dump(iconv_mime_decode("a", 0, $a));
?>
--EXPECTF--
Warning: iconv_mime_decode(): Encoding parameter exceeds the maximum allowed length of 64 characters in %s on line %d
diff --git a/ext/iconv/tests/iconv_mime_decode_headers-charset-length-cve-2007-4840.phpt b/ext/iconv/tests/iconv_mime_decode_headers-charset-length-cve-2007-4840.phpt
index 818b599500..1ef4121305 100644
--- a/ext/iconv/tests/iconv_mime_decode_headers-charset-length-cve-2007-4840.phpt
+++ b/ext/iconv/tests/iconv_mime_decode_headers-charset-length-cve-2007-4840.phpt
@@ -5,7 +5,7 @@ iconv_mime_decode_headers() charset parameter length checks (CVE-2007-4840)
--FILE--
<?php
$a = str_repeat("/", 9000000);
-var_dump(iconv_mime_decode_headers("a", null, $a));
+var_dump(iconv_mime_decode_headers("a", 0, $a));
?>
--EXPECTF--
Warning: iconv_mime_decode_headers(): Encoding parameter exceeds the maximum allowed length of 64 characters in %s on line %d
diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c
index 9ff1ae0618..9a1ded643b 100644
--- a/ext/imap/php_imap.c
+++ b/ext/imap/php_imap.c
@@ -34,6 +34,8 @@
#include "php.h"
#include "php_ini.h"
#include "php_streams.h"
+#include "Zend/zend_exceptions.h"
+#include "Zend/zend_interfaces.h"
#include "ext/standard/php_string.h"
#include "ext/standard/info.h"
#include "ext/standard/file.h"
@@ -138,19 +140,67 @@ ZEND_TSRMLS_CACHE_DEFINE()
ZEND_GET_MODULE(imap)
#endif
-/* True globals, no need for thread safety */
-static int le_imap;
+/* Imap class entry definition */
+static zend_class_entry *php_imap_ce = NULL;
+static zend_object_handlers imap_object_handlers;
-// TODO Promote to ValueError?
-#define PHP_IMAP_CHECK_MSGNO(msgindex, arg_pos) \
- if (msgindex < 1) { \
- zend_argument_value_error(arg_pos, "must be greater than 0"); \
+typedef struct _php_imap_object {
+ MAILSTREAM *imap_stream;
+ long flags;
+ zend_object std;
+} php_imap_object;
+
+static inline zend_object *imap_object_to_zend_object(php_imap_object *obj) {
+ return ((zend_object*)(obj + 1)) - 1;
+}
+
+static inline php_imap_object *imap_object_from_zend_object(zend_object *zobj) {
+ return ((php_imap_object*)(zobj + 1)) - 1;
+}
+
+static zend_object* imap_object_create(zend_class_entry* ce) {
+ php_imap_object *obj = zend_object_alloc(sizeof(php_imap_object), ce);
+ zend_object *zobj = imap_object_to_zend_object(obj);
+ obj->imap_stream = NULL;
+ obj->flags = 0;
+ zend_object_std_init(zobj, ce);
+ object_properties_init(zobj, ce);
+ zobj->handlers = &imap_object_handlers;
+
+ return zobj;
+}
+
+static zend_function *imap_object_get_constructor(zend_object *zobj) {
+ zend_throw_error(NULL, "Cannot directly construct IMAPConnection, use imap_open() instead");
+ return NULL;
+}
+
+static void imap_object_destroy(zend_object *zobj) {
+ php_imap_object *obj = imap_object_from_zend_object(zobj);
+
+ if (obj->imap_stream) {
+ /* Do not try to close prototype streams */
+ if (!(obj->flags & OP_PROTOTYPE)) {
+ mail_close_full(obj->imap_stream, obj->flags);
+ }
+ }
+
+ if (IMAPG(imap_user)) {
+ efree(IMAPG(imap_user));
+ IMAPG(imap_user) = 0;
+ }
+ if (IMAPG(imap_password)) {
+ efree(IMAPG(imap_password));
+ IMAPG(imap_password) = 0;
+ }
+}
+
+#define GET_IMAP_STREAM(imap_conn_struct, zval_imap_obj) \
+ imap_conn_struct = imap_object_from_zend_object(Z_OBJ_P(zval_imap_obj)); \
+ if (!imap_conn_struct) { \
+ zend_throw_exception(zend_ce_value_error, "IMAPConnection is already closed", 0); \
RETURN_THROWS(); \
- } \
- if (((unsigned) msgindex) > imap_le_struct->imap_stream->nmsgs) { \
- php_error_docref(NULL, E_WARNING, "Bad message number"); \
- RETURN_FALSE; \
- } \
+ }
#define PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgindex, arg_pos) \
if (msgindex < 1) { \
@@ -162,43 +212,31 @@ static int le_imap;
if (func_flags & uid_flag) { \
/* This should be cached; if it causes an extra RTT to the IMAP server, */ \
/* then that's the price we pay for making sure we don't crash. */ \
- unsigned int msg_no_from_uid = mail_msgno(imap_le_struct->imap_stream, msgindex); \
+ unsigned int msg_no_from_uid = mail_msgno(imap_conn_struct->imap_stream, msgindex); \
if (msg_no_from_uid == 0) { \
php_error_docref(NULL, E_WARNING, "UID does not exist"); \
RETURN_FALSE; \
} \
} else { \
- if (((unsigned) msgindex) > imap_le_struct->imap_stream->nmsgs) { \
+ if (((unsigned) msgindex) > imap_conn_struct->imap_stream->nmsgs) { \
php_error_docref(NULL, E_WARNING, "Bad message number"); \
RETURN_FALSE; \
} \
} \
-/* {{{ mail_close_it */
-static void mail_close_it(zend_resource *rsrc)
-{
- pils *imap_le_struct = (pils *)rsrc->ptr;
-
- /* Do not try to close prototype streams */
- if (!(imap_le_struct->flags & OP_PROTOTYPE)) {
- mail_close_full(imap_le_struct->imap_stream, imap_le_struct->flags);
- }
-
- if (IMAPG(imap_user)) {
- efree(IMAPG(imap_user));
- IMAPG(imap_user) = 0;
- }
- if (IMAPG(imap_password)) {
- efree(IMAPG(imap_password));
- IMAPG(imap_password) = 0;
- }
-
- efree(imap_le_struct);
-}
-/* }}} */
+// TODO Promote to ValueError?
+#define PHP_IMAP_CHECK_MSGNO(msgindex, arg_pos) \
+ if (msgindex < 1) { \
+ zend_argument_value_error(arg_pos, "must be greater than 0"); \
+ RETURN_THROWS(); \
+ } \
+ if (((unsigned) msgindex) > imap_conn_struct->imap_stream->nmsgs) { \
+ php_error_docref(NULL, E_WARNING, "Bad message number"); \
+ RETURN_FALSE; \
+ } \
-/* {{{ add_assoc_object */
-static zval *add_assoc_object(zval *arg, char *key, zval *tmp)
+/* {{{ php_imap_hash_add_object */
+static zval *php_imap_hash_add_object(zval *arg, char *key, zval *tmp)
{
HashTable *symtable;
@@ -211,8 +249,8 @@ static zval *add_assoc_object(zval *arg, char *key, zval *tmp)
}
/* }}} */
-/* {{{ add_next_index_object */
-static inline zval *add_next_index_object(zval *arg, zval *tmp)
+/* {{{ php_imap_list_add_object */
+static inline zval *php_imap_list_add_object(zval *arg, zval *tmp)
{
HashTable *symtable;
@@ -439,6 +477,17 @@ PHP_MINIT_FUNCTION(imap)
ssl_onceonlyinit ();
#endif
+ php_imap_ce = register_class_IMAPConnection();
+ php_imap_ce->create_object = imap_object_create;
+ php_imap_ce->serialize = zend_class_serialize_deny;
+ php_imap_ce->unserialize = zend_class_unserialize_deny;
+
+ memcpy(&imap_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ imap_object_handlers.offset = XtOffsetOf(php_imap_object, std);
+ imap_object_handlers.get_constructor = imap_object_get_constructor;
+ imap_object_handlers.dtor_obj = imap_object_destroy;
+ imap_object_handlers.clone_obj = NULL;
+
/* lets allow NIL */
REGISTER_LONG_CONSTANT("NIL", NIL, CONST_PERSISTENT | CONST_CS);
@@ -633,7 +682,6 @@ PHP_MINIT_FUNCTION(imap)
mail_parameters (NIL, SET_SSHTIMEOUT, 0);
}
- le_imap = zend_register_list_destructors_ex(mail_close_it, NULL, "imap", module_number);
return SUCCESS;
}
/* }}} */
@@ -728,7 +776,6 @@ PHP_FUNCTION(imap_open)
zend_string *mailbox, *user, *passwd;
zend_long retries = 0, flags = 0, cl_flags = 0;
MAILSTREAM *imap_stream;
- pils *imap_le_struct;
HashTable *params = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "PSS|llh", &mailbox, &user, &passwd, &flags, &retries, &params) == FAILURE) {
@@ -835,31 +882,27 @@ PHP_FUNCTION(imap_open)
RETURN_FALSE;
}
- imap_le_struct = emalloc(sizeof(pils));
- imap_le_struct->imap_stream = imap_stream;
- imap_le_struct->flags = cl_flags;
-
- RETURN_RES(zend_register_resource(imap_le_struct, le_imap));
+ object_init_ex(return_value, php_imap_ce);
+ imap_object_from_zend_object(Z_OBJ_P(return_value))->imap_stream = imap_stream;
+ imap_object_from_zend_object(Z_OBJ_P(return_value))->flags = cl_flags;
}
/* }}} */
/* {{{ Reopen an IMAP stream to a new mailbox */
PHP_FUNCTION(imap_reopen)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *mailbox;
zend_long options = 0, retries = 0;
- pils *imap_le_struct;
- long flags=NIL;
- long cl_flags=NIL;
+ php_imap_object *imap_conn_struct;
+ long flags = 0;
+ long cl_flags = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS|ll", &streamind, &mailbox, &options, &retries) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS|ll", &imap_conn_obj, php_imap_ce, &mailbox, &options, &retries) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* TODO Verify these are the only options available as they are pulled from the php.net documentation */
/* Check for PHP_EXPUNGE and not CL_EXPUNGE as the user land facing CL_EXPUNGE constant is defined
@@ -883,7 +926,7 @@ PHP_FUNCTION(imap_reopen)
cl_flags = CL_EXPUNGE;
flags ^= PHP_EXPUNGE;
}
- imap_le_struct->flags = cl_flags;
+ imap_conn_struct->flags = cl_flags;
}
#ifdef SET_MAXLOGINTRIALS
if (retries) {
@@ -895,9 +938,9 @@ PHP_FUNCTION(imap_reopen)
RETURN_FALSE;
}
- imap_le_struct->imap_stream = mail_open(imap_le_struct->imap_stream, ZSTR_VAL(mailbox), flags);
- if (imap_le_struct->imap_stream == NIL) {
- zend_list_close(Z_RES_P(streamind));
+ imap_conn_struct->imap_stream = mail_open(imap_conn_struct->imap_stream, ZSTR_VAL(mailbox), flags);
+ if (imap_conn_struct->imap_stream == NIL) {
+ /* IMAPConnection object will release it self. */
php_error_docref(NULL, E_WARNING, "Couldn't re-open stream");
RETURN_FALSE;
}
@@ -908,16 +951,15 @@ PHP_FUNCTION(imap_reopen)
/* {{{ Append a new message to a specified mailbox */
PHP_FUNCTION(imap_append)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *folder, *message, *internal_date = NULL, *flags = NULL;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
STRING st;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSS|S!S!", &streamind, &folder, &message, &flags, &internal_date) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS|S!S!", &imap_conn_obj, php_imap_ce, &folder, &message, &flags, &internal_date) == FAILURE) {
RETURN_THROWS();
}
-
if (internal_date) {
zend_string *regex = zend_string_init("/[0-3][0-9]-((Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec))-[0-9]{4} [0-2][0-9]:[0-5][0-9]:[0-5][0-9] [+-][0-9]{4}/", sizeof("/[0-3][0-9]-((Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec))-[0-9]{4} [0-2][0-9]:[0-5][0-9]:[0-5][0-9] [+-][0-9]{4}/") - 1, 0);
pcre_cache_entry *pce; /* Compiled regex */
@@ -943,13 +985,11 @@ PHP_FUNCTION(imap_append)
/* TODO Check if flags are valid (documentation is not present on php.net so need to check this first) */
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
INIT (&st, mail_string, (void *) ZSTR_VAL(message), ZSTR_LEN(message));
- if (mail_append_full(imap_le_struct->imap_stream, ZSTR_VAL(folder), (flags ? ZSTR_VAL(flags) : NIL), (internal_date ? ZSTR_VAL(internal_date) : NIL), &st)) {
+ if (mail_append_full(imap_conn_struct->imap_stream, ZSTR_VAL(folder), (flags ? ZSTR_VAL(flags) : NIL), (internal_date ? ZSTR_VAL(internal_date) : NIL), &st)) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -960,54 +1000,48 @@ PHP_FUNCTION(imap_append)
/* {{{ Gives the number of messages in the current mailbox */
PHP_FUNCTION(imap_num_msg)
{
- zval *streamind;
- pils *imap_le_struct;
+ zval *imap_conn_obj;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &streamind) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &imap_conn_obj, php_imap_ce) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
- RETURN_LONG(imap_le_struct->imap_stream->nmsgs);
+ RETURN_LONG(imap_conn_struct->imap_stream->nmsgs);
}
/* }}} */
/* {{{ Check if the IMAP stream is still active */
PHP_FUNCTION(imap_ping)
{
- zval *streamind;
- pils *imap_le_struct;
+ zval *imap_conn_obj;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &streamind) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &imap_conn_obj, php_imap_ce) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
- RETURN_BOOL(mail_ping(imap_le_struct->imap_stream));
+ RETURN_BOOL(mail_ping(imap_conn_struct->imap_stream));
}
/* }}} */
/* {{{ Gives the number of recent messages in current mailbox */
PHP_FUNCTION(imap_num_recent)
{
- zval *streamind;
- pils *imap_le_struct;
+ zval *imap_conn_obj;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &streamind) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &imap_conn_obj, php_imap_ce) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
- RETURN_LONG(imap_le_struct->imap_stream->recent);
+ RETURN_LONG(imap_conn_struct->imap_stream->recent);
}
/* }}} */
@@ -1015,24 +1049,22 @@ PHP_FUNCTION(imap_num_recent)
/* {{{ Returns the quota set to the mailbox account qroot */
PHP_FUNCTION(imap_get_quota)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *qroot;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS", &streamind, &qroot) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &imap_conn_obj, php_imap_ce, &qroot) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
array_init(return_value);
IMAPG(quota_return) = &return_value;
/* set the callback for the GET_QUOTA function */
mail_parameters(NIL, SET_QUOTA, (void *) mail_getquota);
- if (!imap_getquota(imap_le_struct->imap_stream, ZSTR_VAL(qroot))) {
+ if (!imap_getquota(imap_conn_struct->imap_stream, ZSTR_VAL(qroot))) {
php_error_docref(NULL, E_WARNING, "C-client imap_getquota failed");
zend_array_destroy(Z_ARR_P(return_value));
RETURN_FALSE;
@@ -1043,24 +1075,22 @@ PHP_FUNCTION(imap_get_quota)
/* {{{ Returns the quota set to the mailbox account mbox */
PHP_FUNCTION(imap_get_quotaroot)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *mbox;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS", &streamind, &mbox) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &imap_conn_obj, php_imap_ce, &mbox) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
array_init(return_value);
IMAPG(quota_return) = &return_value;
/* set the callback for the GET_QUOTAROOT function */
mail_parameters(NIL, SET_QUOTA, (void *) mail_getquota);
- if (!imap_getquotaroot(imap_le_struct->imap_stream, ZSTR_VAL(mbox))) {
+ if (!imap_getquotaroot(imap_conn_struct->imap_stream, ZSTR_VAL(mbox))) {
php_error_docref(NULL, E_WARNING, "C-client imap_getquotaroot failed");
zend_array_destroy(Z_ARR_P(return_value));
RETURN_FALSE;
@@ -1071,61 +1101,55 @@ PHP_FUNCTION(imap_get_quotaroot)
/* {{{ Will set the quota for qroot mailbox */
PHP_FUNCTION(imap_set_quota)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *qroot;
zend_long mailbox_size;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
STRINGLIST limits;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSl", &streamind, &qroot, &mailbox_size) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSl", &imap_conn_obj, php_imap_ce, &qroot, &mailbox_size) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
limits.text.data = (unsigned char*)"STORAGE";
limits.text.size = mailbox_size;
limits.next = NIL;
- RETURN_BOOL(imap_setquota(imap_le_struct->imap_stream, ZSTR_VAL(qroot), &limits));
+ RETURN_BOOL(imap_setquota(imap_conn_struct->imap_stream, ZSTR_VAL(qroot), &limits));
}
/* }}} */
/* {{{ Sets the ACL for a given mailbox */
PHP_FUNCTION(imap_setacl)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *mailbox, *id, *rights;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSSS", &streamind, &mailbox, &id, &rights) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSSS", &imap_conn_obj, php_imap_ce, &mailbox, &id, &rights) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
- RETURN_BOOL(imap_setacl(imap_le_struct->imap_stream, ZSTR_VAL(mailbox), ZSTR_VAL(id), ZSTR_VAL(rights)));
+ RETURN_BOOL(imap_setacl(imap_conn_struct->imap_stream, ZSTR_VAL(mailbox), ZSTR_VAL(id), ZSTR_VAL(rights)));
}
/* }}} */
/* {{{ Gets the ACL for a given mailbox */
PHP_FUNCTION(imap_getacl)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *mailbox;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS", &streamind, &mailbox) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &imap_conn_obj, php_imap_ce, &mailbox) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* initializing the special array for the return values */
array_init(return_value);
@@ -1134,7 +1158,7 @@ PHP_FUNCTION(imap_getacl)
/* set the callback for the GET_ACL function */
mail_parameters(NIL, SET_ACL, (void *) mail_getacl);
- if (!imap_getacl(imap_le_struct->imap_stream, ZSTR_VAL(mailbox))) {
+ if (!imap_getacl(imap_conn_struct->imap_stream, ZSTR_VAL(mailbox))) {
php_error(E_WARNING, "c-client imap_getacl failed");
zend_array_destroy(Z_ARR_P(return_value));
RETURN_FALSE;
@@ -1148,18 +1172,16 @@ PHP_FUNCTION(imap_getacl)
/* {{{ Permanently delete all messages marked for deletion */
PHP_FUNCTION(imap_expunge)
{
- zval *streamind;
- pils *imap_le_struct;
+ zval *imap_conn_obj;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &streamind) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &imap_conn_obj, php_imap_ce) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
- mail_expunge (imap_le_struct->imap_stream);
+ mail_expunge (imap_conn_struct->imap_stream);
RETURN_TRUE;
}
@@ -1168,24 +1190,22 @@ PHP_FUNCTION(imap_expunge)
/* {{{ This function garbage collects (purges) the cache of entries of a specific type. */
PHP_FUNCTION(imap_gc)
{
- zval *streamind;
- pils *imap_le_struct;
+ zval *imap_conn_obj;
+ php_imap_object *imap_conn_struct;
zend_long flags;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &streamind, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &imap_conn_obj, php_imap_ce, &flags) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
if (flags && ((flags & ~(GC_TEXTS | GC_ELT | GC_ENV)) != 0)) {
zend_argument_value_error(2, "must be a bitmask of IMAP_GC_TEXTS, IMAP_GC_ELT, and IMAP_GC_ENV");
RETURN_THROWS();
}
- mail_gc(imap_le_struct->imap_stream, flags);
+ mail_gc(imap_conn_struct->imap_stream, flags);
// TODO Return void?
RETURN_TRUE;
@@ -1195,36 +1215,36 @@ PHP_FUNCTION(imap_gc)
/* {{{ Close an IMAP stream */
PHP_FUNCTION(imap_close)
{
- zval *streamind;
- pils *imap_le_struct=NULL;
- zend_long options = 0, flags = NIL;
+ zval *imap_conn_obj;
+ php_imap_object *imap_conn_struct = NULL;
+ zend_long options = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l", &streamind, &options) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|l", &imap_conn_obj, php_imap_ce, &options) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
if (options) {
- flags = options;
-
/* Check that flags is exactly equal to PHP_EXPUNGE or zero */
- if (flags && ((flags & ~PHP_EXPUNGE) != 0)) {
+ if (options && ((options & ~PHP_EXPUNGE) != 0)) {
zend_argument_value_error(2, "must be CL_EXPUNGE or 0");
RETURN_THROWS();
}
/* Do the translation from PHP's internal PHP_EXPUNGE define to c-client's CL_EXPUNGE */
- if (flags & PHP_EXPUNGE) {
- flags ^= PHP_EXPUNGE;
- flags |= CL_EXPUNGE;
+ if (options & PHP_EXPUNGE) {
+ options ^= PHP_EXPUNGE;
+ options |= CL_EXPUNGE;
}
- imap_le_struct->flags = flags;
+ imap_conn_struct->flags = options;
}
- zend_list_close(Z_RES_P(streamind));
+ /* Do not try to close prototype streams */
+ if (!(imap_conn_struct->flags & OP_PROTOTYPE)) {
+ mail_close_full(imap_conn_struct->imap_stream, imap_conn_struct->flags);
+ imap_conn_struct->imap_stream = NULL;
+ }
// TODO Return void?
RETURN_TRUE;
@@ -1234,27 +1254,25 @@ PHP_FUNCTION(imap_close)
/* {{{ Returns headers for all messages in a mailbox */
PHP_FUNCTION(imap_headers)
{
- zval *streamind;
- pils *imap_le_struct;
+ zval *imap_conn_obj;
+ php_imap_object *imap_conn_struct;
unsigned long i;
char *t;
unsigned int msgno;
char tmp[MAILTMPLEN];
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &streamind) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &imap_conn_obj, php_imap_ce) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* Initialize return array */
array_init(return_value);
- for (msgno = 1; msgno <= imap_le_struct->imap_stream->nmsgs; msgno++) {
- MESSAGECACHE * cache = mail_elt (imap_le_struct->imap_stream, msgno);
- mail_fetchstructure(imap_le_struct->imap_stream, msgno, NIL);
+ for (msgno = 1; msgno <= imap_conn_struct->imap_stream->nmsgs; msgno++) {
+ MESSAGECACHE * cache = mail_elt (imap_conn_struct->imap_stream, msgno);
+ mail_fetchstructure(imap_conn_struct->imap_stream, msgno, NIL);
tmp[0] = cache->recent ? (cache->seen ? 'R': 'N') : ' ';
tmp[1] = (cache->recent | cache->seen) ? ' ' : 'U';
tmp[2] = cache->flagged ? 'F' : ' ';
@@ -1265,17 +1283,17 @@ PHP_FUNCTION(imap_headers)
mail_date(tmp+11, cache);
tmp[22] = ' ';
tmp[23] = '\0';
- mail_fetchfrom(tmp+23, imap_le_struct->imap_stream, msgno, (long)20);
+ mail_fetchfrom(tmp+23, imap_conn_struct->imap_stream, msgno, (long)20);
strcat(tmp, " ");
if ((i = cache->user_flags)) {
strcat(tmp, "{");
while (i) {
- strlcat(tmp, imap_le_struct->imap_stream->user_flags[find_rightmost_bit (&i)], sizeof(tmp));
+ strlcat(tmp, imap_conn_struct->imap_stream->user_flags[find_rightmost_bit (&i)], sizeof(tmp));
if (i) strlcat(tmp, " ", sizeof(tmp));
}
strlcat(tmp, "} ", sizeof(tmp));
}
- mail_fetchsubject(t = tmp + strlen(tmp), imap_le_struct->imap_stream, msgno, (long)25);
+ mail_fetchsubject(t = tmp + strlen(tmp), imap_conn_struct->imap_stream, msgno, (long)25);
snprintf(t += strlen(t), sizeof(tmp) - strlen(tmp), " (%ld chars)", cache->rfc822_size);
add_next_index_string(return_value, tmp);
}
@@ -1285,19 +1303,17 @@ PHP_FUNCTION(imap_headers)
/* {{{ Read the message body */
PHP_FUNCTION(imap_body)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_long msgno, flags = 0;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
char *body;
unsigned long body_len = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|l", &streamind, &msgno, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol|l", &imap_conn_obj, php_imap_ce, &msgno, &flags) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 2);
@@ -1308,7 +1324,7 @@ PHP_FUNCTION(imap_body)
PHP_IMAP_CHECK_MSGNO_MAYBE_UID_POST_FLAG_CHECKS(msgno, 2, flags, FT_UID);
- body = mail_fetchtext_full (imap_le_struct->imap_stream, msgno, &body_len, flags);
+ body = mail_fetchtext_full (imap_conn_struct->imap_stream, msgno, &body_len, flags);
if (body_len == 0) {
RETVAL_EMPTY_STRING();
} else {
@@ -1321,25 +1337,23 @@ PHP_FUNCTION(imap_body)
/* {{{ Copy specified message to a mailbox */
PHP_FUNCTION(imap_mail_copy)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_long options = 0;
zend_string *seq, *folder;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSS|l", &streamind, &seq, &folder, &options) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS|l", &imap_conn_obj, php_imap_ce, &seq, &folder, &options) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
if (options && ((options & ~(CP_UID | CP_MOVE)) != 0)) {
zend_argument_value_error(4, "must be a bitmask of CP_UID, and CP_MOVE");
RETURN_THROWS();
}
- if (mail_copy_full(imap_le_struct->imap_stream, ZSTR_VAL(seq), ZSTR_VAL(folder), options) == T) {
+ if (mail_copy_full(imap_conn_struct->imap_stream, ZSTR_VAL(seq), ZSTR_VAL(folder), options) == T) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -1351,18 +1365,16 @@ PHP_FUNCTION(imap_mail_copy)
/* {{{ Move specified message to a mailbox */
PHP_FUNCTION(imap_mail_move)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *seq, *folder;
zend_long options = 0;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSS|l", &streamind, &seq, &folder, &options) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS|l", &imap_conn_obj, php_imap_ce, &seq, &folder, &options) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
if (options && ((options & ~CP_UID) != 0)) {
zend_argument_value_error(4, "must be CP_UID or 0");
@@ -1372,7 +1384,7 @@ PHP_FUNCTION(imap_mail_move)
/* Add CP_MOVE flag */
options = (options | CP_MOVE);
- if (mail_copy_full(imap_le_struct->imap_stream, ZSTR_VAL(seq), ZSTR_VAL(folder), options) == T) {
+ if (mail_copy_full(imap_conn_struct->imap_stream, ZSTR_VAL(seq), ZSTR_VAL(folder), options) == T) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -1383,19 +1395,17 @@ PHP_FUNCTION(imap_mail_move)
/* {{{ Create a new mailbox */
PHP_FUNCTION(imap_createmailbox)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *folder;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS", &streamind, &folder) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &imap_conn_obj, php_imap_ce, &folder) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
- if (mail_create(imap_le_struct->imap_stream, ZSTR_VAL(folder)) == T) {
+ if (mail_create(imap_conn_struct->imap_stream, ZSTR_VAL(folder)) == T) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -1406,19 +1416,17 @@ PHP_FUNCTION(imap_createmailbox)
/* {{{ Rename a mailbox */
PHP_FUNCTION(imap_renamemailbox)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *old_mailbox, *new_mailbox;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSS", &streamind, &old_mailbox, &new_mailbox) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS", &imap_conn_obj, php_imap_ce, &old_mailbox, &new_mailbox) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
- if (mail_rename(imap_le_struct->imap_stream, ZSTR_VAL(old_mailbox), ZSTR_VAL(new_mailbox)) == T) {
+ if (mail_rename(imap_conn_struct->imap_stream, ZSTR_VAL(old_mailbox), ZSTR_VAL(new_mailbox)) == T) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -1429,19 +1437,17 @@ PHP_FUNCTION(imap_renamemailbox)
/* {{{ Delete a mailbox */
PHP_FUNCTION(imap_deletemailbox)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *folder;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS", &streamind, &folder) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &imap_conn_obj, php_imap_ce, &folder) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
- if (mail_delete(imap_le_struct->imap_stream, ZSTR_VAL(folder)) == T) {
+ if (mail_delete(imap_conn_struct->imap_stream, ZSTR_VAL(folder)) == T) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -1452,24 +1458,22 @@ PHP_FUNCTION(imap_deletemailbox)
/* {{{ Read the list of mailboxes */
PHP_FUNCTION(imap_list)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *ref, *pat;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
STRINGLIST *cur=NIL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSS", &streamind, &ref, &pat) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS", &imap_conn_obj, php_imap_ce, &ref, &pat) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* set flag for normal, old mailbox list */
IMAPG(folderlist_style) = FLIST_ARRAY;
IMAPG(imap_folders) = IMAPG(imap_folders_tail) = NIL;
- mail_list(imap_le_struct->imap_stream, ZSTR_VAL(ref), ZSTR_VAL(pat));
+ mail_list(imap_conn_struct->imap_stream, ZSTR_VAL(ref), ZSTR_VAL(pat));
if (IMAPG(imap_folders) == NIL) {
RETURN_FALSE;
}
@@ -1490,25 +1494,23 @@ PHP_FUNCTION(imap_list)
/* Author: CJH */
PHP_FUNCTION(imap_getmailboxes)
{
- zval *streamind, mboxob;
+ zval *imap_conn_obj, mboxob;
zend_string *ref, *pat;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
FOBJECTLIST *cur=NIL;
char *delim=NIL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSS", &streamind, &ref, &pat) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS", &imap_conn_obj, php_imap_ce, &ref, &pat) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* set flag for new, improved array of objects mailbox list */
IMAPG(folderlist_style) = FLIST_OBJECT;
IMAPG(imap_folder_objects) = IMAPG(imap_folder_objects_tail) = NIL;
- mail_list(imap_le_struct->imap_stream, ZSTR_VAL(ref), ZSTR_VAL(pat));
+ mail_list(imap_conn_struct->imap_stream, ZSTR_VAL(ref), ZSTR_VAL(pat));
if (IMAPG(imap_folder_objects) == NIL) {
RETURN_FALSE;
}
@@ -1527,7 +1529,7 @@ PHP_FUNCTION(imap_getmailboxes)
#else
add_property_string(&mboxob, "delimiter", cur->delimiter);
#endif
- add_next_index_object(return_value, &mboxob);
+ php_imap_list_add_object(return_value, &mboxob);
cur=cur->next;
}
mail_free_foblist(&IMAPG(imap_folder_objects), &IMAPG(imap_folder_objects_tail));
@@ -1539,21 +1541,19 @@ PHP_FUNCTION(imap_getmailboxes)
/* {{{ Read list of mailboxes containing a certain string */
PHP_FUNCTION(imap_listscan)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *ref, *pat, *content;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
STRINGLIST *cur=NIL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSSS", &streamind, &ref, &pat, &content) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSSS", &imap_conn_obj, php_imap_ce, &ref, &pat, &content) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
IMAPG(imap_folders) = NIL;
- mail_scan(imap_le_struct->imap_stream, ZSTR_VAL(ref), ZSTR_VAL(pat), ZSTR_VAL(content));
+ mail_scan(imap_conn_struct->imap_stream, ZSTR_VAL(ref), ZSTR_VAL(pat), ZSTR_VAL(content));
if (IMAPG(imap_folders) == NIL) {
RETURN_FALSE;
}
@@ -1573,30 +1573,28 @@ PHP_FUNCTION(imap_listscan)
/* {{{ Get mailbox properties */
PHP_FUNCTION(imap_check)
{
- zval *streamind;
- pils *imap_le_struct;
+ zval *imap_conn_obj;
+ php_imap_object *imap_conn_struct;
char date[100];
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &streamind) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &imap_conn_obj, php_imap_ce) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
- if (mail_ping (imap_le_struct->imap_stream) == NIL) {
+ if (mail_ping (imap_conn_struct->imap_stream) == NIL) {
RETURN_FALSE;
}
- if (imap_le_struct->imap_stream && imap_le_struct->imap_stream->mailbox) {
+ if (imap_conn_struct->imap_stream && imap_conn_struct->imap_stream->mailbox) {
rfc822_date(date);
object_init(return_value);
add_property_string(return_value, "Date", date);
- add_property_string(return_value, "Driver", imap_le_struct->imap_stream->dtb->name);
- add_property_string(return_value, "Mailbox", imap_le_struct->imap_stream->mailbox);
- add_property_long(return_value, "Nmsgs", imap_le_struct->imap_stream->nmsgs);
- add_property_long(return_value, "Recent", imap_le_struct->imap_stream->recent);
+ add_property_string(return_value, "Driver", imap_conn_struct->imap_stream->dtb->name);
+ add_property_string(return_value, "Mailbox", imap_conn_struct->imap_stream->mailbox);
+ add_property_long(return_value, "Nmsgs", imap_conn_struct->imap_stream->nmsgs);
+ add_property_long(return_value, "Recent", imap_conn_struct->imap_stream->recent);
} else {
RETURN_FALSE;
}
@@ -1606,18 +1604,16 @@ PHP_FUNCTION(imap_check)
/* {{{ Mark a message for deletion */
PHP_FUNCTION(imap_delete)
{
- zval *streamind;
- pils *imap_le_struct;
+ zval *imap_conn_obj;
+ php_imap_object *imap_conn_struct;
zend_string *sequence;
zend_long flags = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS|l", &streamind, &sequence, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS|l", &imap_conn_obj, php_imap_ce, &sequence, &flags) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
// TODO Check sequence validity?
@@ -1626,7 +1622,9 @@ PHP_FUNCTION(imap_delete)
RETURN_THROWS();
}
- mail_setflag_full(imap_le_struct->imap_stream, ZSTR_VAL(sequence), "\\DELETED", flags);
+ mail_setflag_full(imap_conn_struct->imap_stream, ZSTR_VAL(sequence), "\\DELETED", flags);
+
+ // TODO Return void?
RETURN_TRUE;
}
/* }}} */
@@ -1634,45 +1632,41 @@ PHP_FUNCTION(imap_delete)
/* {{{ Remove the delete flag from a message */
PHP_FUNCTION(imap_undelete)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *sequence;
zend_long flags = 0;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS|l", &streamind, &sequence, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS|l", &imap_conn_obj, php_imap_ce, &sequence, &flags) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* TODO Check if flags are valid (documentation is not present on php.net so need to check this first) */
- mail_clearflag_full(imap_le_struct->imap_stream, ZSTR_VAL(sequence), "\\DELETED", flags);
+ mail_clearflag_full(imap_conn_struct->imap_stream, ZSTR_VAL(sequence), "\\DELETED", flags);
// TODO Return void?
- RETVAL_TRUE;
+ RETURN_TRUE;
}
/* }}} */
/* {{{ Read the headers of the message */
PHP_FUNCTION(imap_headerinfo)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_long msgno, fromlength = 0, subjectlength = 0;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
MESSAGECACHE *cache;
ENVELOPE *en;
char dummy[2000], fulladdress[MAILTMPLEN + 1];
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|ll", &streamind, &msgno, &fromlength, &subjectlength) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol|ll", &imap_conn_obj, php_imap_ce, &msgno, &fromlength, &subjectlength) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
PHP_IMAP_CHECK_MSGNO(msgno, 2);
@@ -1686,13 +1680,13 @@ PHP_FUNCTION(imap_headerinfo)
RETURN_THROWS();
}
- if (mail_fetchstructure(imap_le_struct->imap_stream, msgno, NIL)) {
- cache = mail_elt(imap_le_struct->imap_stream, msgno);
+ if (mail_fetchstructure(imap_conn_struct->imap_stream, msgno, NIL)) {
+ cache = mail_elt(imap_conn_struct->imap_stream, msgno);
} else {
RETURN_FALSE;
}
- en = mail_fetchenvelope(imap_le_struct->imap_stream, msgno);
+ en = mail_fetchenvelope(imap_conn_struct->imap_stream, msgno);
/* call a function to parse all the text, so that we can use the
same function to parse text from other sources */
@@ -1720,12 +1714,12 @@ PHP_FUNCTION(imap_headerinfo)
if (en->from && fromlength) {
fulladdress[0] = 0x00;
- mail_fetchfrom(fulladdress, imap_le_struct->imap_stream, msgno, fromlength);
+ mail_fetchfrom(fulladdress, imap_conn_struct->imap_stream, msgno, fromlength);
add_property_string(return_value, "fetchfrom", fulladdress);
}
if (en->subject && subjectlength) {
fulladdress[0] = 0x00;
- mail_fetchsubject(fulladdress, imap_le_struct->imap_stream, msgno, subjectlength);
+ mail_fetchsubject(fulladdress, imap_conn_struct->imap_stream, msgno, subjectlength);
add_property_string(return_value, "fetchsubject", fulladdress);
}
}
@@ -1758,25 +1752,23 @@ PHP_FUNCTION(imap_rfc822_parse_headers)
/* {{{ Return a list of subscribed mailboxes */
PHP_FUNCTION(imap_lsub)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *ref, *pat;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
STRINGLIST *cur=NIL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSS", &streamind, &ref, &pat) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS", &imap_conn_obj, php_imap_ce, &ref, &pat) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* set flag for normal, old mailbox list */
IMAPG(folderlist_style) = FLIST_ARRAY;
IMAPG(imap_sfolders) = NIL;
ZEND_IGNORE_LEAKS_BEGIN();
- mail_lsub(imap_le_struct->imap_stream, ZSTR_VAL(ref), ZSTR_VAL(pat));
+ mail_lsub(imap_conn_struct->imap_stream, ZSTR_VAL(ref), ZSTR_VAL(pat));
ZEND_IGNORE_LEAKS_END();
if (IMAPG(imap_sfolders) == NIL) {
RETURN_FALSE;
@@ -1797,26 +1789,24 @@ PHP_FUNCTION(imap_lsub)
/* Author: CJH */
PHP_FUNCTION(imap_getsubscribed)
{
- zval *streamind, mboxob;
+ zval *imap_conn_obj, mboxob;
zend_string *ref, *pat;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
FOBJECTLIST *cur=NIL;
char *delim=NIL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSS", &streamind, &ref, &pat) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS", &imap_conn_obj, php_imap_ce, &ref, &pat) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* set flag for new, improved array of objects list */
IMAPG(folderlist_style) = FLIST_OBJECT;
IMAPG(imap_sfolder_objects) = IMAPG(imap_sfolder_objects_tail) = NIL;
ZEND_IGNORE_LEAKS_BEGIN();
- mail_lsub(imap_le_struct->imap_stream, ZSTR_VAL(ref), ZSTR_VAL(pat));
+ mail_lsub(imap_conn_struct->imap_stream, ZSTR_VAL(ref), ZSTR_VAL(pat));
ZEND_IGNORE_LEAKS_END();
if (IMAPG(imap_sfolder_objects) == NIL) {
RETURN_FALSE;
@@ -1836,7 +1826,7 @@ PHP_FUNCTION(imap_getsubscribed)
#else
add_property_string(&mboxob, "delimiter", cur->delimiter);
#endif
- add_next_index_object(return_value, &mboxob);
+ php_imap_list_add_object(return_value, &mboxob);
cur=cur->next;
}
mail_free_foblist (&IMAPG(imap_sfolder_objects), &IMAPG(imap_sfolder_objects_tail));
@@ -1848,19 +1838,17 @@ PHP_FUNCTION(imap_getsubscribed)
/* {{{ Subscribe to a mailbox */
PHP_FUNCTION(imap_subscribe)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *folder;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS", &streamind, &folder) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &imap_conn_obj, php_imap_ce, &folder) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
- if (mail_subscribe(imap_le_struct->imap_stream, ZSTR_VAL(folder)) == T) {
+ if (mail_subscribe(imap_conn_struct->imap_stream, ZSTR_VAL(folder)) == T) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -1871,19 +1859,17 @@ PHP_FUNCTION(imap_subscribe)
/* {{{ Unsubscribe from a mailbox */
PHP_FUNCTION(imap_unsubscribe)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *folder;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS", &streamind, &folder) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &imap_conn_obj, php_imap_ce, &folder) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
- if (mail_unsubscribe(imap_le_struct->imap_stream, ZSTR_VAL(folder)) == T) {
+ if (mail_unsubscribe(imap_conn_struct->imap_stream, ZSTR_VAL(folder)) == T) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -1894,18 +1880,16 @@ PHP_FUNCTION(imap_unsubscribe)
/* {{{ Read the full structure of a message */
PHP_FUNCTION(imap_fetchstructure)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_long msgno, flags = 0;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
BODY *body;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|l", &streamind, &msgno, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol|l", &imap_conn_obj, php_imap_ce, &msgno, &flags) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 2);
@@ -1918,7 +1902,7 @@ PHP_FUNCTION(imap_fetchstructure)
object_init(return_value);
- mail_fetchstructure_full(imap_le_struct->imap_stream, msgno, &body , flags);
+ mail_fetchstructure_full(imap_conn_struct->imap_stream, msgno, &body , flags);
if (!body) {
php_error_docref(NULL, E_WARNING, "No body information available");
@@ -1932,20 +1916,18 @@ PHP_FUNCTION(imap_fetchstructure)
/* {{{ Get a specific body section */
PHP_FUNCTION(imap_fetchbody)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_long msgno, flags = 0;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
char *body;
zend_string *sec;
unsigned long len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlS|l", &streamind, &msgno, &sec, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OlS|l", &imap_conn_obj, php_imap_ce, &msgno, &sec, &flags) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 2);
@@ -1956,7 +1938,7 @@ PHP_FUNCTION(imap_fetchbody)
PHP_IMAP_CHECK_MSGNO_MAYBE_UID_POST_FLAG_CHECKS(msgno, 2, flags, FT_UID);
- body = mail_fetchbody_full(imap_le_struct->imap_stream, msgno, ZSTR_VAL(sec), &len, flags);
+ body = mail_fetchbody_full(imap_conn_struct->imap_stream, msgno, ZSTR_VAL(sec), &len, flags);
if (!body) {
php_error_docref(NULL, E_WARNING, "No body information available");
@@ -1971,20 +1953,18 @@ PHP_FUNCTION(imap_fetchbody)
/* {{{ Get a specific body section's MIME headers */
PHP_FUNCTION(imap_fetchmime)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_long msgno, flags = 0;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
char *body;
zend_string *sec;
unsigned long len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlS|l", &streamind, &msgno, &sec, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OlS|l", &imap_conn_obj, php_imap_ce, &msgno, &sec, &flags) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 2);
@@ -1995,7 +1975,7 @@ PHP_FUNCTION(imap_fetchmime)
PHP_IMAP_CHECK_MSGNO_MAYBE_UID_POST_FLAG_CHECKS(msgno, 2, flags, FT_UID);
- body = mail_fetch_mime(imap_le_struct->imap_stream, msgno, ZSTR_VAL(sec), &len, flags);
+ body = mail_fetch_mime(imap_conn_struct->imap_stream, msgno, ZSTR_VAL(sec), &len, flags);
if (!body) {
php_error_docref(NULL, E_WARNING, "No body MIME information available");
@@ -2009,20 +1989,19 @@ PHP_FUNCTION(imap_fetchmime)
/* {{{ Save a specific body section to a file */
PHP_FUNCTION(imap_savebody)
{
- zval *stream, *out;
- pils *imap_le_struct = NULL;
+ zval *imap_conn_obj;
+ zval *out;
+ php_imap_object *imap_conn_struct = NULL;
php_stream *writer = NULL;
zend_string *section = NULL;
int close_stream = 1;
zend_long msgno, flags = 0;
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "rzl|Sl", &stream, &out, &msgno, &section, &flags)) {
+ if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "Ozl|Sl", &imap_conn_obj, php_imap_ce, &out, &msgno, &section, &flags)) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(stream), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 3)
@@ -2056,7 +2035,7 @@ PHP_FUNCTION(imap_savebody)
IMAPG(gets_stream) = writer;
mail_parameters(NIL, SET_GETS, (void *) php_mail_gets);
- mail_fetchbody_full(imap_le_struct->imap_stream, msgno, section?ZSTR_VAL(section):"", NULL, flags);
+ mail_fetchbody_full(imap_conn_struct->imap_stream, msgno, section?ZSTR_VAL(section):"", NULL, flags);
mail_parameters(NIL, SET_GETS, (void *) NULL);
IMAPG(gets_stream) = NULL;
@@ -2159,26 +2138,24 @@ PHP_FUNCTION(imap_binary)
/* {{{ Returns info about the current mailbox */
PHP_FUNCTION(imap_mailboxmsginfo)
{
- zval *streamind;
- pils *imap_le_struct;
+ zval *imap_conn_obj;
+ php_imap_object *imap_conn_struct;
char date[100];
unsigned long msgno;
zend_ulong unreadmsg = 0, deletedmsg = 0, msize = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &streamind) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &imap_conn_obj, php_imap_ce) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* Initialize return object */
object_init(return_value);
- for (msgno = 1; msgno <= imap_le_struct->imap_stream->nmsgs; msgno++) {
- MESSAGECACHE * cache = mail_elt (imap_le_struct->imap_stream, msgno);
- mail_fetchstructure (imap_le_struct->imap_stream, msgno, NIL);
+ for (msgno = 1; msgno <= imap_conn_struct->imap_stream->nmsgs; msgno++) {
+ MESSAGECACHE * cache = mail_elt (imap_conn_struct->imap_stream, msgno);
+ mail_fetchstructure (imap_conn_struct->imap_stream, msgno, NIL);
if (!cache->seen || cache->recent) {
unreadmsg++;
@@ -2191,13 +2168,13 @@ PHP_FUNCTION(imap_mailboxmsginfo)
}
add_property_long(return_value, "Unread", unreadmsg);
add_property_long(return_value, "Deleted", deletedmsg);
- add_property_long(return_value, "Nmsgs", imap_le_struct->imap_stream->nmsgs);
+ add_property_long(return_value, "Nmsgs", imap_conn_struct->imap_stream->nmsgs);
add_property_long(return_value, "Size", msize);
rfc822_date(date);
add_property_string(return_value, "Date", date);
- add_property_string(return_value, "Driver", imap_le_struct->imap_stream->dtb->name);
- add_property_string(return_value, "Mailbox", imap_le_struct->imap_stream->mailbox);
- add_property_long(return_value, "Recent", imap_le_struct->imap_stream->recent);
+ add_property_string(return_value, "Driver", imap_conn_struct->imap_stream->dtb->name);
+ add_property_string(return_value, "Mailbox", imap_conn_struct->imap_stream->mailbox);
+ add_property_long(return_value, "Recent", imap_conn_struct->imap_stream->recent);
}
/* }}} */
@@ -2278,7 +2255,7 @@ PHP_FUNCTION(imap_rfc822_parse_adrlist)
if (addresstmp->adl) {
add_property_string(&tovals, "adl", addresstmp->adl);
}
- add_next_index_object(return_value, &tovals);
+ php_imap_list_add_object(return_value, &tovals);
} while ((addresstmp = addresstmp->next));
mail_free_envelope(&env);
@@ -2637,25 +2614,23 @@ PHP_FUNCTION(imap_mutf7_to_utf8)
/* {{{ Sets flags on messages */
PHP_FUNCTION(imap_setflag_full)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *sequence, *flag;
zend_long flags = 0;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSS|l", &streamind, &sequence, &flag, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS|l", &imap_conn_obj, php_imap_ce, &sequence, &flag, &flags) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
if (flags && ((flags & ~ST_UID) != 0)) {
zend_argument_value_error(4, "must be ST_UID or 0");
RETURN_THROWS();
}
- mail_setflag_full(imap_le_struct->imap_stream, ZSTR_VAL(sequence), ZSTR_VAL(flag), (flags ? flags : NIL));
+ mail_setflag_full(imap_conn_struct->imap_stream, ZSTR_VAL(sequence), ZSTR_VAL(flag), (flags ? flags : NIL));
RETURN_TRUE;
}
/* }}} */
@@ -2663,25 +2638,23 @@ PHP_FUNCTION(imap_setflag_full)
/* {{{ Clears flags on messages */
PHP_FUNCTION(imap_clearflag_full)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *sequence, *flag;
zend_long flags = 0;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSS|l", &streamind, &sequence, &flag, &flags) ==FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS|l", &imap_conn_obj, php_imap_ce, &sequence, &flag, &flags) ==FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
if (flags && ((flags & ~ST_UID) != 0)) {
zend_argument_value_error(4, "must be ST_UID or 0");
RETURN_THROWS();
}
- mail_clearflag_full(imap_le_struct->imap_stream, ZSTR_VAL(sequence), ZSTR_VAL(flag), flags);
+ mail_clearflag_full(imap_conn_struct->imap_stream, ZSTR_VAL(sequence), ZSTR_VAL(flag), flags);
RETURN_TRUE;
}
/* }}} */
@@ -2689,23 +2662,21 @@ PHP_FUNCTION(imap_clearflag_full)
/* {{{ Sort an array of message headers, optionally including only messages that meet specified criteria. */
PHP_FUNCTION(imap_sort)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *criteria = NULL, *charset = NULL;
zend_long sort, flags = 0;
- zend_bool rev;
- pils *imap_le_struct;
+ bool rev;
+ php_imap_object *imap_conn_struct;
unsigned long *slst, *sl;
char *search_criteria;
SORTPGM *mypgm=NIL;
SEARCHPGM *spg=NIL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlb|lS!S!", &streamind, &sort, &rev, &flags, &criteria, &charset) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olb|lS!S!", &imap_conn_obj, php_imap_ce, &sort, &rev, &flags, &criteria, &charset) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
if (!(sort == SORTDATE || sort == SORTARRIVAL || sort == SORTFROM || sort == SORTSUBJECT || sort == SORTTO ||
sort == SORTCC || sort == SORTSIZE) ) {
@@ -2734,7 +2705,7 @@ PHP_FUNCTION(imap_sort)
mypgm->function = (short) sort;
mypgm->next = NIL;
- slst = mail_sort(imap_le_struct->imap_stream, (charset ? ZSTR_VAL(charset) : NIL), spg, mypgm, flags);
+ slst = mail_sort(imap_conn_struct->imap_stream, (charset ? ZSTR_VAL(charset) : NIL), spg, mypgm, flags);
mail_free_sortpgm(&mypgm);
if (spg && !(flags & SE_FREE)) {
@@ -2742,7 +2713,7 @@ PHP_FUNCTION(imap_sort)
}
array_init(return_value);
- if (slst != NIL && slst != 0) {
+ if (slst != NULL) {
for (sl = slst; *sl; sl++) {
add_next_index_long(return_value, *sl);
}
@@ -2754,17 +2725,15 @@ PHP_FUNCTION(imap_sort)
/* {{{ Get the full unfiltered header for a message */
PHP_FUNCTION(imap_fetchheader)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_long msgno, flags = 0;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|l", &streamind, &msgno, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol|l", &imap_conn_obj, php_imap_ce, &msgno, &flags) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 2);
@@ -2775,45 +2744,41 @@ PHP_FUNCTION(imap_fetchheader)
PHP_IMAP_CHECK_MSGNO_MAYBE_UID_POST_FLAG_CHECKS(msgno, 2, flags, FT_UID);
- RETVAL_STRING(mail_fetchheader_full(imap_le_struct->imap_stream, msgno, NIL, NIL, flags));
+ RETVAL_STRING(mail_fetchheader_full(imap_conn_struct->imap_stream, msgno, NIL, NIL, flags));
}
/* }}} */
/* {{{ Get the unique message id associated with a standard sequential message number */
PHP_FUNCTION(imap_uid)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_long msgno;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &streamind, &msgno) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &imap_conn_obj, php_imap_ce, &msgno) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
PHP_IMAP_CHECK_MSGNO(msgno, 2);
- RETURN_LONG(mail_uid(imap_le_struct->imap_stream, msgno));
+ RETURN_LONG(mail_uid(imap_conn_struct->imap_stream, msgno));
}
/* }}} */
/* {{{ Get the sequence number associated with a UID */
PHP_FUNCTION(imap_msgno)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_long msg_uid;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &streamind, &msg_uid) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &imap_conn_obj, php_imap_ce, &msg_uid) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* Do NOT use the PHP_IMAP_CHECK_MSGNO() macro as UID cannot be checked for their upper bound. */
if (msg_uid < 1) {
@@ -2821,25 +2786,23 @@ PHP_FUNCTION(imap_msgno)
RETURN_THROWS();
}
- RETURN_LONG(mail_msgno(imap_le_struct->imap_stream, msg_uid));
+ RETURN_LONG(mail_msgno(imap_conn_struct->imap_stream, msg_uid));
}
/* }}} */
/* {{{ Get status info from a mailbox */
PHP_FUNCTION(imap_status)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *mbx;
zend_long flags;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rSl", &streamind, &mbx, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSl", &imap_conn_obj, php_imap_ce, &mbx, &flags) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
if (flags && ((flags & ~(SA_MESSAGES | SA_RECENT | SA_UNSEEN | SA_UIDNEXT | SA_UIDVALIDITY /*| SA_ALL*/)) != 0)) {
zend_argument_value_error(3, "must be a bitmask of SA_* constants");
@@ -2848,7 +2811,7 @@ PHP_FUNCTION(imap_status)
object_init(return_value);
- if (mail_status(imap_le_struct->imap_stream, ZSTR_VAL(mbx), flags)) {
+ if (mail_status(imap_conn_struct->imap_stream, ZSTR_VAL(mbx), flags)) {
add_property_long(return_value, "flags", IMAPG(status_flags));
if (IMAPG(status_flags) & SA_MESSAGES) {
add_property_long(return_value, "messages", IMAPG(status_messages));
@@ -2874,25 +2837,23 @@ PHP_FUNCTION(imap_status)
/* {{{ Read the structure of a specified body section of a specific message */
PHP_FUNCTION(imap_bodystruct)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_long msgno;
zend_string *section;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
zval parametres, param, dparametres, dparam;
PARAMETER *par, *dpar;
BODY *body;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlS", &streamind, &msgno, &section) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OlS", &imap_conn_obj, php_imap_ce, &msgno, &section) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
PHP_IMAP_CHECK_MSGNO(msgno, 2);
- body=mail_body(imap_le_struct->imap_stream, msgno, (unsigned char*)ZSTR_VAL(section));
+ body=mail_body(imap_conn_struct->imap_stream, msgno, (unsigned char*)ZSTR_VAL(section));
if (body == NULL) {
RETURN_FALSE;
}
@@ -2947,9 +2908,9 @@ PHP_FUNCTION(imap_bodystruct)
object_init(&dparam);
add_property_string(&dparam, "attribute", dpar->attribute);
add_property_string(&dparam, "value", dpar->value);
- add_next_index_object(&dparametres, &dparam);
+ php_imap_list_add_object(&dparametres, &dparam);
} while ((dpar = dpar->next));
- add_assoc_object(return_value, "dparameters", &dparametres);
+ php_imap_hash_add_object(return_value, "dparameters", &dparametres);
} else {
add_property_long(return_value, "ifdparameters", 0);
}
@@ -2968,13 +2929,13 @@ PHP_FUNCTION(imap_bodystruct)
add_property_string(&param, "value", par->value);
}
- add_next_index_object(&parametres, &param);
+ php_imap_list_add_object(&parametres, &param);
} while ((par = par->next));
} else {
object_init(&parametres);
add_property_long(return_value, "ifparameters", 0);
}
- add_assoc_object(return_value, "parameters", &parametres);
+ php_imap_hash_add_object(return_value, "parameters", &parametres);
}
/* }}} */
@@ -2982,40 +2943,38 @@ PHP_FUNCTION(imap_bodystruct)
/* {{{ Read an overview of the information in the headers of the given message sequence */
PHP_FUNCTION(imap_fetch_overview)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *sequence;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
zval myoverview;
zend_string *address;
zend_long status, flags = 0L;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS|l", &streamind, &sequence, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS|l", &imap_conn_obj, php_imap_ce, &sequence, &flags) == FAILURE) {
RETURN_THROWS();
}
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
+
if (flags && ((flags & ~FT_UID) != 0)) {
zend_argument_value_error(3, "must be FT_UID or 0");
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
-
array_init(return_value);
status = (flags & FT_UID)
- ? mail_uid_sequence(imap_le_struct->imap_stream, (unsigned char*)ZSTR_VAL(sequence))
- : mail_sequence(imap_le_struct->imap_stream, (unsigned char*)ZSTR_VAL(sequence));
+ ? mail_uid_sequence(imap_conn_struct->imap_stream, (unsigned char*)ZSTR_VAL(sequence))
+ : mail_sequence(imap_conn_struct->imap_stream, (unsigned char*)ZSTR_VAL(sequence));
if (status) {
MESSAGECACHE *elt;
ENVELOPE *env;
unsigned long i;
- for (i = 1; i <= imap_le_struct->imap_stream->nmsgs; i++) {
- if (((elt = mail_elt (imap_le_struct->imap_stream, i))->sequence) &&
- (env = mail_fetch_structure (imap_le_struct->imap_stream, i, NIL, NIL))) {
+ for (i = 1; i <= imap_conn_struct->imap_stream->nmsgs; i++) {
+ if (((elt = mail_elt (imap_conn_struct->imap_stream, i))->sequence) &&
+ (env = mail_fetch_structure (imap_conn_struct->imap_stream, i, NIL, NIL))) {
object_init(&myoverview);
if (env->subject) {
add_property_string(&myoverview, "subject", env->subject);
@@ -3047,7 +3006,7 @@ PHP_FUNCTION(imap_fetch_overview)
add_property_string(&myoverview, "in_reply_to", env->in_reply_to);
}
add_property_long(&myoverview, "size", elt->rfc822_size);
- add_property_long(&myoverview, "uid", mail_uid(imap_le_struct->imap_stream, i));
+ add_property_long(&myoverview, "uid", mail_uid(imap_conn_struct->imap_stream, i));
add_property_long(&myoverview, "msgno", i);
add_property_long(&myoverview, "recent", elt->recent);
add_property_long(&myoverview, "flagged", elt->flagged);
@@ -3056,7 +3015,7 @@ PHP_FUNCTION(imap_fetch_overview)
add_property_long(&myoverview, "seen", elt->seen);
add_property_long(&myoverview, "draft", elt->draft);
add_property_long(&myoverview, "udate", mail_longdate(elt));
- add_next_index_object(return_value, &myoverview);
+ php_imap_list_add_object(return_value, &myoverview);
}
}
}
@@ -3093,47 +3052,47 @@ PHP_FUNCTION(imap_mail_compose)
env = mail_newenvelope();
if ((pvalue = zend_hash_str_find(envelope, "remail", sizeof("remail") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
env->remail = cpystr(Z_STRVAL_P(pvalue));
}
if ((pvalue = zend_hash_str_find(envelope, "return_path", sizeof("return_path") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
PHP_RFC822_PARSE_ADRLIST(&env->return_path, pvalue);
}
if ((pvalue = zend_hash_str_find(envelope, "date", sizeof("date") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
env->date = (unsigned char*)cpystr(Z_STRVAL_P(pvalue));
}
if ((pvalue = zend_hash_str_find(envelope, "from", sizeof("from") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
PHP_RFC822_PARSE_ADRLIST(&env->from, pvalue);
}
if ((pvalue = zend_hash_str_find(envelope, "reply_to", sizeof("reply_to") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
PHP_RFC822_PARSE_ADRLIST(&env->reply_to, pvalue);
}
if ((pvalue = zend_hash_str_find(envelope, "in_reply_to", sizeof("in_reply_to") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
env->in_reply_to = cpystr(Z_STRVAL_P(pvalue));
}
if ((pvalue = zend_hash_str_find(envelope, "subject", sizeof("subject") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
env->subject = cpystr(Z_STRVAL_P(pvalue));
}
if ((pvalue = zend_hash_str_find(envelope, "to", sizeof("to") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
PHP_RFC822_PARSE_ADRLIST(&env->to, pvalue);
}
if ((pvalue = zend_hash_str_find(envelope, "cc", sizeof("cc") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
PHP_RFC822_PARSE_ADRLIST(&env->cc, pvalue);
}
if ((pvalue = zend_hash_str_find(envelope, "bcc", sizeof("bcc") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
PHP_RFC822_PARSE_ADRLIST(&env->bcc, pvalue);
}
if ((pvalue = zend_hash_str_find(envelope, "message_id", sizeof("message_id") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
env->message_id=cpystr(Z_STRVAL_P(pvalue));
}
@@ -3143,7 +3102,7 @@ PHP_FUNCTION(imap_mail_compose)
SEPARATE_ARRAY(pvalue);
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pvalue), env_data) {
custom_headers_param = mail_newbody_parameter();
- convert_to_string_ex(env_data);
+ convert_to_string(env_data);
custom_headers_param->value = (char *) fs_get(Z_STRLEN_P(env_data) + 1);
custom_headers_param->attribute = NULL;
memcpy(custom_headers_param->value, Z_STRVAL_P(env_data), Z_STRLEN_P(env_data) + 1);
@@ -3185,7 +3144,7 @@ PHP_FUNCTION(imap_mail_compose)
}
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "charset", sizeof("charset") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
tmp_param = mail_newbody_parameter();
tmp_param->value = cpystr(Z_STRVAL_P(pvalue));
tmp_param->attribute = cpystr("CHARSET");
@@ -3200,7 +3159,7 @@ PHP_FUNCTION(imap_mail_compose)
if (key == NULL) continue;
disp_param = mail_newbody_parameter();
disp_param->attribute = cpystr(ZSTR_VAL(key));
- convert_to_string_ex(disp_data);
+ convert_to_string(disp_data);
disp_param->value = (char *) fs_get(Z_STRLEN_P(disp_data) + 1);
memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1);
disp_param->next = tmp_param;
@@ -3210,19 +3169,19 @@ PHP_FUNCTION(imap_mail_compose)
}
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "subtype", sizeof("subtype") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->subtype = cpystr(Z_STRVAL_P(pvalue));
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "id", sizeof("id") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->id = cpystr(Z_STRVAL_P(pvalue));
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "description", sizeof("description") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->description = cpystr(Z_STRVAL_P(pvalue));
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "disposition.type", sizeof("disposition.type") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->disposition.type = (char *) fs_get(Z_STRLEN_P(pvalue) + 1);
memcpy(bod->disposition.type, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue)+1);
}
@@ -3234,7 +3193,7 @@ PHP_FUNCTION(imap_mail_compose)
if (key == NULL) continue;
disp_param = mail_newbody_parameter();
disp_param->attribute = cpystr(ZSTR_VAL(key));
- convert_to_string_ex(disp_data);
+ convert_to_string(disp_data);
disp_param->value = (char *) fs_get(Z_STRLEN_P(disp_data) + 1);
memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1);
disp_param->next = tmp_param;
@@ -3247,7 +3206,7 @@ PHP_FUNCTION(imap_mail_compose)
bod->nested.msg = mail_newmsg();
} else {
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "contents.data", sizeof("contents.data") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->contents.text.data = fs_get(Z_STRLEN_P(pvalue) + 1);
memcpy(bod->contents.text.data, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue)+1);
bod->contents.text.size = Z_STRLEN_P(pvalue);
@@ -3264,7 +3223,7 @@ PHP_FUNCTION(imap_mail_compose)
bod->size.bytes = zval_get_long(pvalue);
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "md5", sizeof("md5") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->md5 = cpystr(Z_STRVAL_P(pvalue));
}
} else if (Z_TYPE_P(data) == IS_ARRAY && topbod->type == TYPEMULTIPART) {
@@ -3296,7 +3255,7 @@ PHP_FUNCTION(imap_mail_compose)
}
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "charset", sizeof("charset") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
tmp_param = mail_newbody_parameter();
tmp_param->value = (char *) fs_get(Z_STRLEN_P(pvalue) + 1);
memcpy(tmp_param->value, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue) + 1);
@@ -3312,7 +3271,7 @@ PHP_FUNCTION(imap_mail_compose)
if (key == NULL) continue;
disp_param = mail_newbody_parameter();
disp_param->attribute = cpystr(ZSTR_VAL(key));
- convert_to_string_ex(disp_data);
+ convert_to_string(disp_data);
disp_param->value = (char *)fs_get(Z_STRLEN_P(disp_data) + 1);
memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1);
disp_param->next = tmp_param;
@@ -3322,19 +3281,19 @@ PHP_FUNCTION(imap_mail_compose)
}
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "subtype", sizeof("subtype") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->subtype = cpystr(Z_STRVAL_P(pvalue));
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "id", sizeof("id") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->id = cpystr(Z_STRVAL_P(pvalue));
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "description", sizeof("description") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->description = cpystr(Z_STRVAL_P(pvalue));
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "disposition.type", sizeof("disposition.type") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->disposition.type = (char *) fs_get(Z_STRLEN_P(pvalue) + 1);
memcpy(bod->disposition.type, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue)+1);
}
@@ -3346,7 +3305,7 @@ PHP_FUNCTION(imap_mail_compose)
if (key == NULL) continue;
disp_param = mail_newbody_parameter();
disp_param->attribute = cpystr(ZSTR_VAL(key));
- convert_to_string_ex(disp_data);
+ convert_to_string(disp_data);
disp_param->value = (char *) fs_get(Z_STRLEN_P(disp_data) + 1);
memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1);
disp_param->next = tmp_param;
@@ -3359,7 +3318,7 @@ PHP_FUNCTION(imap_mail_compose)
bod->nested.msg = mail_newmsg();
} else {
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "contents.data", sizeof("contents.data") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->contents.text.data = fs_get(Z_STRLEN_P(pvalue) + 1);
memcpy(bod->contents.text.data, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue) + 1);
bod->contents.text.size = Z_STRLEN_P(pvalue);
@@ -3376,7 +3335,7 @@ PHP_FUNCTION(imap_mail_compose)
bod->size.bytes = zval_get_long(pvalue);
}
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "md5", sizeof("md5") - 1)) != NULL) {
- convert_to_string_ex(pvalue);
+ convert_to_string(pvalue);
bod->md5 = cpystr(Z_STRVAL_P(pvalue));
}
}
@@ -3705,22 +3664,20 @@ PHP_FUNCTION(imap_mail)
/* {{{ Return a list of messages matching the given criteria */
PHP_FUNCTION(imap_search)
{
- zval *streamind;
+ zval *imap_conn_obj;
zend_string *criteria, *charset = NULL;
zend_long flags = SE_FREE;
- pils *imap_le_struct;
+ php_imap_object *imap_conn_struct;
char *search_criteria;
MESSAGELIST *cur;
int argc = ZEND_NUM_ARGS();
SEARCHPGM *pgm = NIL;
- if (zend_parse_parameters(argc, "rS|lS", &streamind, &criteria, &flags, &charset) == FAILURE) {
+ if (zend_parse_parameters(argc, "OS|lS", &imap_conn_obj, php_imap_ce, &criteria, &flags, &charset) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* TODO Update docs to allow SE_FREE as an option */
if (flags && ((flags & ~(SE_FREE | SE_UID)) != 0)) {
@@ -3733,7 +3690,7 @@ PHP_FUNCTION(imap_search)
IMAPG(imap_messages) = IMAPG(imap_messages_tail) = NIL;
pgm = mail_criteria(search_criteria);
- mail_search_full(imap_le_struct->imap_stream, (argc == 4 ? ZSTR_VAL(charset) : NIL), pgm, flags);
+ mail_search_full(imap_conn_struct->imap_stream, (argc == 4 ? ZSTR_VAL(charset) : NIL), pgm, flags);
if (pgm && !(flags & SE_FREE)) {
mail_free_searchpgm(&pgm);
@@ -4051,7 +4008,7 @@ static zend_string* _php_imap_parse_address (ADDRESS *addresslist, zval *paddres
if (addresstmp->adl) add_property_string(&tmpvals, "adl", addresstmp->adl);
if (addresstmp->mailbox) add_property_string(&tmpvals, "mailbox", addresstmp->mailbox);
if (addresstmp->host) add_property_string(&tmpvals, "host", addresstmp->host);
- add_next_index_object(paddress, &tmpvals);
+ php_imap_list_add_object(paddress, &tmpvals);
} while ((addresstmp = addresstmp->next));
return fulladdress;
}
@@ -4082,7 +4039,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en)
if (fulladdress) {
add_property_str(myzvalue, "toaddress", fulladdress);
}
- add_assoc_object(myzvalue, "to", &paddress);
+ php_imap_hash_add_object(myzvalue, "to", &paddress);
}
if (en->from) {
@@ -4091,7 +4048,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en)
if (fulladdress) {
add_property_str(myzvalue, "fromaddress", fulladdress);
}
- add_assoc_object(myzvalue, "from", &paddress);
+ php_imap_hash_add_object(myzvalue, "from", &paddress);
}
if (en->cc) {
@@ -4100,7 +4057,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en)
if (fulladdress) {
add_property_str(myzvalue, "ccaddress", fulladdress);
}
- add_assoc_object(myzvalue, "cc", &paddress);
+ php_imap_hash_add_object(myzvalue, "cc", &paddress);
}
if (en->bcc) {
@@ -4109,7 +4066,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en)
if (fulladdress) {
add_property_str(myzvalue, "bccaddress", fulladdress);
}
- add_assoc_object(myzvalue, "bcc", &paddress);
+ php_imap_hash_add_object(myzvalue, "bcc", &paddress);
}
if (en->reply_to) {
@@ -4118,7 +4075,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en)
if (fulladdress) {
add_property_str(myzvalue, "reply_toaddress", fulladdress);
}
- add_assoc_object(myzvalue, "reply_to", &paddress);
+ php_imap_hash_add_object(myzvalue, "reply_to", &paddress);
}
if (en->sender) {
@@ -4127,7 +4084,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en)
if (fulladdress) {
add_property_str(myzvalue, "senderaddress", fulladdress);
}
- add_assoc_object(myzvalue, "sender", &paddress);
+ php_imap_hash_add_object(myzvalue, "sender", &paddress);
}
if (en->return_path) {
@@ -4136,7 +4093,9 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en)
if (fulladdress) {
add_property_str(myzvalue, "return_pathaddress", fulladdress);
}
- add_assoc_object(myzvalue, "return_path", &paddress);
+ php_imap_hash_add_object(myzvalue, "return_path", &paddress);
+ // From rebase might need?
+ //add_assoc_object(myzvalue, "return_path", &paddress);
}
}
/* }}} */
@@ -4201,9 +4160,9 @@ void _php_imap_add_body(zval *arg, BODY *body)
object_init(&dparam);
add_property_string(&dparam, "attribute", dpar->attribute);
add_property_string(&dparam, "value", dpar->value);
- add_next_index_object(&dparametres, &dparam);
+ php_imap_list_add_object(&dparametres, &dparam);
} while ((dpar = dpar->next));
- add_assoc_object(arg, "dparameters", &dparametres);
+ php_imap_hash_add_object(arg, "dparameters", &dparametres);
} else {
add_property_long(arg, "ifdparameters", 0);
}
@@ -4222,13 +4181,13 @@ void _php_imap_add_body(zval *arg, BODY *body)
add_property_string(&param, "value", par->value);
}
- add_next_index_object(&parametres, &param);
+ php_imap_list_add_object(&parametres, &param);
} while ((par = par->next));
} else {
object_init(&parametres);
add_property_long(arg, "ifparameters", 0);
}
- add_assoc_object(arg, "parameters", &parametres);
+ php_imap_hash_add_object(arg, "parameters", &parametres);
/* multipart message ? */
if (body->type == TYPEMULTIPART) {
@@ -4236,9 +4195,9 @@ void _php_imap_add_body(zval *arg, BODY *body)
for (part = body->CONTENT_PART; part; part = part->next) {
object_init(&param);
_php_imap_add_body(&param, &part->body);
- add_next_index_object(&parametres, &param);
+ php_imap_list_add_object(&parametres, &param);
}
- add_assoc_object(arg, "parts", &parametres);
+ php_imap_hash_add_object(arg, "parts", &parametres);
}
/* encapsulated message ? */
@@ -4247,8 +4206,8 @@ void _php_imap_add_body(zval *arg, BODY *body)
array_init(&parametres);
object_init(&param);
_php_imap_add_body(&param, body);
- add_next_index_object(&parametres, &param);
- add_assoc_object(arg, "parts", &parametres);
+ php_imap_list_add_object(&parametres, &param);
+ php_imap_hash_add_object(arg, "parts", &parametres);
}
}
/* }}} */
@@ -4301,25 +4260,23 @@ static int build_thread_tree(THREADNODE *top, zval **tree)
/* {{{ Return threaded by REFERENCES tree */
PHP_FUNCTION(imap_thread)
{
- zval *streamind;
- pils *imap_le_struct;
+ zval *imap_conn_obj;
+ php_imap_object *imap_conn_struct;
zend_long flags = SE_FREE;
char criteria[] = "ALL";
THREADNODE *top;
SEARCHPGM *pgm = NIL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l", &streamind, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|l", &imap_conn_obj, php_imap_ce, &flags) == FAILURE) {
RETURN_THROWS();
}
- if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) {
- RETURN_THROWS();
- }
+ GET_IMAP_STREAM(imap_conn_struct, imap_conn_obj);
/* TODO Check if flags are valid (documentation is not present on php.net so need to check this first) */
pgm = mail_criteria(criteria);
- top = mail_thread(imap_le_struct->imap_stream, "REFERENCES", NIL, pgm, flags);
+ top = mail_thread(imap_conn_struct->imap_stream, "REFERENCES", NIL, pgm, flags);
if (pgm && !(flags & SE_FREE)) {
mail_free_searchpgm(&pgm);
}
diff --git a/ext/imap/php_imap.h b/ext/imap/php_imap.h
index 0ba2306ede..a35c284106 100644
--- a/ext/imap/php_imap.h
+++ b/ext/imap/php_imap.h
@@ -85,11 +85,6 @@ typedef enum {
FLIST_OBJECT
} folderlist_style_t;
-typedef struct php_imap_le_struct {
- MAILSTREAM *imap_stream;
- long flags;
-} pils;
-
typedef struct php_imap_mailbox_struct {
SIZEDTEXT text;
DTYPE delimiter;
@@ -147,7 +142,7 @@ ZEND_BEGIN_MODULE_GLOBALS(imap)
#endif
/* php_stream for php_mail_gets() */
php_stream *gets_stream;
- zend_bool enable_rsh;
+ bool enable_rsh;
ZEND_END_MODULE_GLOBALS(imap)
#if defined(ZTS) && defined(COMPILE_DL_IMAP)
diff --git a/ext/imap/php_imap.stub.php b/ext/imap/php_imap.stub.php
index d8b01988df..5a1349d0f4 100644
--- a/ext/imap/php_imap.stub.php
+++ b/ext/imap/php_imap.stub.php
@@ -1,33 +1,24 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
-/**
- * @return resource|false
- */
-function imap_open(string $mailbox, string $user, string $password, int $flags = 0, int $retries = 0, array $options = []) {}
+/** @strict-properties */
+final class IMAPConnection {
+}
-/**
- * @param resource $imap
- */
-function imap_reopen($imap, string $mailbox, int $flags = 0, int $retries = 0): bool {}
+function imap_open(string $mailbox, string $user, string $password, int $flags = 0, int $retries = 0, array $options = []): IMAPConnection|false {}
-/**
- * @param resource $imap
- */
-function imap_close($imap, int $flags = 0): bool {}
+function imap_reopen(IMAPConnection $imap, string $mailbox, int $flags = 0, int $retries = 0): bool {}
-/** @param resource $imap */
-function imap_num_msg($imap): int|false {}
+function imap_close(IMAPConnection $imap, int $flags = 0): bool {}
-/** @param resource $imap */
-function imap_num_recent($imap): int {}
+function imap_num_msg(IMAPConnection $imap): int|false {}
-/** @param resource $imap */
-function imap_headers($imap): array|false {}
+function imap_num_recent(IMAPConnection $imap): int {}
-/** @param resource $imap */
-function imap_headerinfo($imap, int $message_num, int $from_length = 0, int $subject_length = 0): stdClass|false {}
+function imap_headers(IMAPConnection $imap): array|false {}
+
+function imap_headerinfo(IMAPConnection $imap, int $message_num, int $from_length = 0, int $subject_length = 0): stdClass|false {}
function imap_rfc822_parse_headers(string $headers, string $default_hostname = "UNKNOWN"): stdClass {}
@@ -35,117 +26,87 @@ function imap_rfc822_write_address(string $mailbox, string $hostname, string $pe
function imap_rfc822_parse_adrlist(string $string, string $default_hostname): array {}
-/** @param resource $imap */
-function imap_body($imap, int $message_num, int $flags = 0): string|false {}
+function imap_body(IMAPConnection $imap, int $message_num, int $flags = 0): string|false {}
/**
- * @param resource $imap
* @alias imap_body
*/
-function imap_fetchtext($imap, int $message_num, int $flags = 0): string|false {}
+function imap_fetchtext(IMAPConnection $imap, int $message_num, int $flags = 0): string|false {}
-/**
- * @param resource $imap
- * @return stdClass|false
- */
-function imap_bodystruct($imap, int $message_num, string $section) {}
+function imap_bodystruct(IMAPConnection $imap, int $message_num, string $section): stdClass|false {}
-/** @param resource $imap */
-function imap_fetchbody($imap, int $message_num, string $section, int $flags = 0): string|false {}
+function imap_fetchbody(IMAPConnection $imap, int $message_num, string $section, int $flags = 0): string|false {}
-/** @param resource $imap */
-function imap_fetchmime($imap, int $message_num, string $section, int $flags = 0): string|false {}
+function imap_fetchmime(IMAPConnection $imap, int $message_num, string $section, int $flags = 0): string|false {}
/**
- * @param resource $imap
* @param resource|string|int $file
*/
-function imap_savebody($imap, $file, int $message_num, string $section = "", int $flags = 0): bool {}
+function imap_savebody(IMAPConnection $imap, $file, int $message_num, string $section = "", int $flags = 0): bool {}
-/** @param resource $imap */
-function imap_fetchheader($imap, int $message_num, int $flags = 0): string|false {}
+function imap_fetchheader(IMAPConnection $imap, int $message_num, int $flags = 0): string|false {}
-/** @param resource $imap */
-function imap_fetchstructure($imap, int $message_num, int $flags = 0): stdClass|false {}
+function imap_fetchstructure(IMAPConnection $imap, int $message_num, int $flags = 0): stdClass|false {}
/**
- * @param resource $imap
*/
-function imap_gc($imap, int $flags): bool {}
+function imap_gc(IMAPConnection $imap, int $flags): bool {}
/**
- * @param resource $imap
*/
-function imap_expunge($imap): bool {}
+function imap_expunge(IMAPConnection $imap): bool {}
/**
- * @param resource $imap
*/
-function imap_delete($imap, string $message_num, int $flags = 0): bool {}
+function imap_delete(IMAPConnection $imap, string $message_num, int $flags = 0): bool {}
/**
- * @param resource $imap
*/
-function imap_undelete($imap, string $message_num, int $flags = 0): bool {}
+function imap_undelete(IMAPConnection $imap, string $message_num, int $flags = 0): bool {}
-/** @param resource $imap */
-function imap_check($imap): stdClass|false {}
+function imap_check(IMAPConnection $imap): stdClass|false {}
-/** @param resource $imap */
-function imap_listscan($imap, string $reference, string $pattern, string $content): array|false {}
+function imap_listscan(IMAPConnection $imap, string $reference, string $pattern, string $content): array|false {}
/**
- * @param resource $imap
* @alias imap_listscan
*/
-function imap_scan($imap, string $reference, string $pattern, string $content): array|false {}
+function imap_scan(IMAPConnection $imap, string $reference, string $pattern, string $content): array|false {}
/**
- * @param resource $imap
* @alias imap_listscan
*/
-function imap_scanmailbox($imap, string $reference, string $pattern, string $content): array|false {}
+function imap_scanmailbox(IMAPConnection $imap, string $reference, string $pattern, string $content): array|false {}
-/** @param resource $imap */
-function imap_mail_copy($imap, string $message_nums, string $mailbox, int $flags = 0): bool {}
+function imap_mail_copy(IMAPConnection $imap, string $message_nums, string $mailbox, int $flags = 0): bool {}
-/** @param resource $imap */
-function imap_mail_move($imap, string $message_nums, string $mailbox, int $flags = 0): bool {}
+function imap_mail_move(IMAPConnection $imap, string $message_nums, string $mailbox, int $flags = 0): bool {}
function imap_mail_compose(array $envelope, array $bodies): string|false {}
-/** @param resource $imap */
-function imap_createmailbox($imap, string $mailbox): bool {}
+function imap_createmailbox(IMAPConnection $imap, string $mailbox): bool {}
/**
- * @param resource $imap
* @alias imap_createmailbox
*/
-function imap_create($imap, string $mailbox): bool {}
+function imap_create(IMAPConnection $imap, string $mailbox): bool {}
-/** @param resource $imap */
-function imap_renamemailbox($imap, string $from, string $to): bool {}
+function imap_renamemailbox(IMAPConnection $imap, string $from, string $to): bool {}
/**
- * @param resource $imap
* @alias imap_renamemailbox
*/
-function imap_rename($imap, string $from, string $to): bool {}
+function imap_rename(IMAPConnection $imap, string $from, string $to): bool {}
-/** @param resource $imap */
-function imap_deletemailbox($imap, string $mailbox): bool {}
+function imap_deletemailbox(IMAPConnection $imap, string $mailbox): bool {}
-/** @param resource $imap */
-function imap_subscribe($imap, string $mailbox): bool {}
+function imap_subscribe(IMAPConnection $imap, string $mailbox): bool {}
-/** @param resource $imap */
-function imap_unsubscribe($imap, string $mailbox): bool {}
+function imap_unsubscribe(IMAPConnection $imap, string $mailbox): bool {}
-/** @param resource $imap */
-function imap_append($imap, string $folder, string $message, ?string $options = null, ?string $internal_date = null): bool {}
+function imap_append(IMAPConnection $imap, string $folder, string $message, ?string $options = null, ?string $internal_date = null): bool {}
-/** @param resource $imap */
-function imap_ping($imap): bool {}
+function imap_ping(IMAPConnection $imap): bool {}
function imap_base64(string $string): string|false {}
@@ -157,56 +118,39 @@ function imap_binary(string $string): string|false {}
function imap_utf8(string $mime_encoded_text): string {}
-/**
- * @param resource $imap
- * @return stdClass|false
- */
-function imap_status($imap, string $mailbox, int $flags) {}
+function imap_status(IMAPConnection $imap, string $mailbox, int $flags): stdClass|false {}
-/** @param resource $imap */
-function imap_mailboxmsginfo($imap): stdClass {}
+function imap_mailboxmsginfo(IMAPConnection $imap): stdClass {}
-/** @param resource $imap */
-function imap_setflag_full($imap, string $sequence, string $flag, int $options = 0): bool {}
+function imap_setflag_full(IMAPConnection $imap, string $sequence, string $flag, int $options = 0): bool {}
-/** @param resource $imap */
-function imap_clearflag_full($imap, string $sequence, string $flag, int $options = 0): bool {}
+function imap_clearflag_full(IMAPConnection $imap, string $sequence, string $flag, int $options = 0): bool {}
-/** @param resource $imap */
-function imap_sort($imap, int $criteria, bool $reverse, int $flags = 0, ?string $search_criteria = null, ?string $charset = null): array|false {}
+function imap_sort(IMAPConnection $imap, int $criteria, bool $reverse, int $flags = 0, ?string $search_criteria = null, ?string $charset = null): array|false {}
-/** @param resource $imap */
-function imap_uid($imap, int $message_num): int|false {}
+function imap_uid(IMAPConnection $imap, int $message_num): int|false {}
-/** @param resource $imap */
-function imap_msgno($imap, int $message_uid): int {}
+function imap_msgno(IMAPConnection $imap, int $message_uid): int {}
-/** @param resource $imap */
-function imap_list($imap, string $reference, string $pattern): array|false {}
+function imap_list(IMAPConnection $imap, string $reference, string $pattern): array|false {}
/**
- * @param resource $imap
* @alias imap_list
*/
-function imap_listmailbox($imap, string $reference, string $pattern): array|false {}
+function imap_listmailbox(IMAPConnection $imap, string $reference, string $pattern): array|false {}
-/** @param resource $imap */
-function imap_lsub($imap, string $reference, string $pattern): array|false {}
+function imap_lsub(IMAPConnection $imap, string $reference, string $pattern): array|false {}
/**
- * @param resource $imap
* @alias imap_lsub
*/
-function imap_listsubscribed($imap, string $reference, string $pattern): array|false {}
+function imap_listsubscribed(IMAPConnection $imap, string $reference, string $pattern): array|false {}
-/** @param resource $imap */
-function imap_getsubscribed($imap, string $reference, string $pattern): array|false {}
+function imap_getsubscribed(IMAPConnection $imap, string $reference, string $pattern): array|false {}
-/** @param resource $imap */
-function imap_getmailboxes($imap, string $reference, string $pattern): array|false {}
+function imap_getmailboxes(IMAPConnection $imap, string $reference, string $pattern): array|false {}
-/** @param resource $imap */
-function imap_fetch_overview($imap, string $sequence, int $flags = 0): array|false {}
+function imap_fetch_overview(IMAPConnection $imap, string $sequence, int $flags = 0): array|false {}
function imap_alerts(): array|false {}
@@ -214,8 +158,7 @@ function imap_errors(): array|false {}
function imap_last_error(): string|false {}
-/** @param resource $imap */
-function imap_search($imap, string $criteria, int $flags = SE_FREE, string $charset = ""): array|false {}
+function imap_search(IMAPConnection $imap, string $criteria, int $flags = SE_FREE, string $charset = ""): array|false {}
function imap_utf7_decode(string $string): string|false {}
@@ -229,26 +172,20 @@ function imap_mutf7_to_utf8(string $string): string|false {}
function imap_mime_header_decode(string $string): array|false {}
-/** @param resource $imap */
-function imap_thread($imap, int $flags = SE_FREE): array|false {}
+function imap_thread(IMAPConnection $imap, int $flags = SE_FREE): array|false {}
function imap_timeout(int $timeout_type, int $timeout = -1): int|bool {}
#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)
-/** @param resource $imap */
-function imap_get_quota($imap, string $quota_root): array|false {}
+function imap_get_quota(IMAPConnection $imap, string $quota_root): array|false {}
-/** @param resource $imap */
-function imap_get_quotaroot($imap, string $mailbox): array|false {}
+function imap_get_quotaroot(IMAPConnection $imap, string $mailbox): array|false {}
-/** @param resource $imap */
-function imap_set_quota($imap, string $quota_root, int $mailbox_size): bool {}
+function imap_set_quota(IMAPConnection $imap, string $quota_root, int $mailbox_size): bool {}
-/** @param resource $imap */
-function imap_setacl($imap, string $mailbox, string $user_id, string $rights): bool {}
+function imap_setacl(IMAPConnection $imap, string $mailbox, string $user_id, string $rights): bool {}
-/** @param resource $imap */
-function imap_getacl($imap, string $mailbox): array|false {}
+function imap_getacl(IMAPConnection $imap, string $mailbox): array|false {}
#endif
function imap_mail(string $to, string $subject, string $message, ?string $additional_headers = null, ?string $cc = null, ?string $bcc = null, ?string $return_path = null): bool {}
diff --git a/ext/imap/php_imap_arginfo.h b/ext/imap/php_imap_arginfo.h
index 027baa2d32..a648ebd6a6 100644
--- a/ext/imap/php_imap_arginfo.h
+++ b/ext/imap/php_imap_arginfo.h
@@ -1,7 +1,7 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: d6d158112a802d867646b8f85402b8762599180b */
+ * Stub hash: 4ac7b33357082ac0103b125ec3ce1d389eccf5c7 */
-ZEND_BEGIN_ARG_INFO_EX(arginfo_imap_open, 0, 0, 3)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_imap_open, 0, 3, IMAPConnection, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, mailbox, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, user, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, password, IS_STRING, 0)
@@ -11,31 +11,31 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_imap_open, 0, 0, 3)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_reopen, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, mailbox, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, retries, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_close, 0, 1, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_num_msg, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_num_recent, 0, 1, IS_LONG, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_headers, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_imap_headerinfo, 0, 2, stdClass, MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, message_num, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, from_length, IS_LONG, 0, "0")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, subject_length, IS_LONG, 0, "0")
@@ -58,21 +58,21 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_rfc822_parse_adrlist, 0, 2,
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_body, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, message_num, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
#define arginfo_imap_fetchtext arginfo_imap_body
-ZEND_BEGIN_ARG_INFO_EX(arginfo_imap_bodystruct, 0, 0, 3)
- ZEND_ARG_INFO(0, imap)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_imap_bodystruct, 0, 3, stdClass, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, message_num, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, section, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_fetchbody, 0, 3, MAY_BE_STRING|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, message_num, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, section, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
@@ -81,7 +81,7 @@ ZEND_END_ARG_INFO()
#define arginfo_imap_fetchmime arginfo_imap_fetchbody
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_savebody, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_INFO(0, file)
ZEND_ARG_TYPE_INFO(0, message_num, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, section, IS_STRING, 0, "\"\"")
@@ -91,22 +91,22 @@ ZEND_END_ARG_INFO()
#define arginfo_imap_fetchheader arginfo_imap_body
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_imap_fetchstructure, 0, 2, stdClass, MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, message_num, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_gc, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_expunge, 0, 1, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_delete, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, message_num, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
@@ -114,11 +114,11 @@ ZEND_END_ARG_INFO()
#define arginfo_imap_undelete arginfo_imap_delete
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_imap_check, 0, 1, stdClass, MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_listscan, 0, 4, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, reference, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, pattern, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, content, IS_STRING, 0)
@@ -129,7 +129,7 @@ ZEND_END_ARG_INFO()
#define arginfo_imap_scanmailbox arginfo_imap_listscan
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_mail_copy, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, message_nums, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, mailbox, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
@@ -143,14 +143,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_mail_compose, 0, 2, MAY_BE_
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_createmailbox, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, mailbox, IS_STRING, 0)
ZEND_END_ARG_INFO()
#define arginfo_imap_create arginfo_imap_createmailbox
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_renamemailbox, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, from, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, to, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -164,7 +164,7 @@ ZEND_END_ARG_INFO()
#define arginfo_imap_unsubscribe arginfo_imap_createmailbox
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_append, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, folder, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, message, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_STRING, 1, "null")
@@ -187,18 +187,18 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_utf8, 0, 1, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, mime_encoded_text, IS_STRING, 0)
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_INFO_EX(arginfo_imap_status, 0, 0, 3)
- ZEND_ARG_INFO(0, imap)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_imap_status, 0, 3, stdClass, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, mailbox, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_imap_mailboxmsginfo, 0, 1, stdClass, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_setflag_full, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, sequence, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, flag, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_LONG, 0, "0")
@@ -207,7 +207,7 @@ ZEND_END_ARG_INFO()
#define arginfo_imap_clearflag_full arginfo_imap_setflag_full
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_sort, 0, 3, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, criteria, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, reverse, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
@@ -216,17 +216,17 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_sort, 0, 3, MAY_BE_ARRAY|MA
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_uid, 0, 2, MAY_BE_LONG|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, message_num, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_msgno, 0, 2, IS_LONG, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, message_uid, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_list, 0, 3, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, reference, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, pattern, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -242,7 +242,7 @@ ZEND_END_ARG_INFO()
#define arginfo_imap_getmailboxes arginfo_imap_list
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_fetch_overview, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, sequence, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
@@ -256,7 +256,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_last_error, 0, 0, MAY_BE_ST
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_search, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, criteria, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "SE_FREE")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, charset, IS_STRING, 0, "\"\"")
@@ -283,7 +283,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_mime_header_decode, 0, 1, M
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_thread, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "SE_FREE")
ZEND_END_ARG_INFO()
@@ -294,21 +294,21 @@ ZEND_END_ARG_INFO()
#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_get_quota, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, quota_root, IS_STRING, 0)
ZEND_END_ARG_INFO()
#endif
#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_get_quotaroot, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, mailbox, IS_STRING, 0)
ZEND_END_ARG_INFO()
#endif
#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_set_quota, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, quota_root, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, mailbox_size, IS_LONG, 0)
ZEND_END_ARG_INFO()
@@ -316,7 +316,7 @@ ZEND_END_ARG_INFO()
#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_setacl, 0, 4, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, imap)
+ ZEND_ARG_OBJ_INFO(0, imap, IMAPConnection, 0)
ZEND_ARG_TYPE_INFO(0, mailbox, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, user_id, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, rights, IS_STRING, 0)
@@ -512,3 +512,19 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(imap_mail, arginfo_imap_mail)
ZEND_FE_END
};
+
+
+static const zend_function_entry class_IMAPConnection_methods[] = {
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class_IMAPConnection(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IMAPConnection", class_IMAPConnection_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/imap/tests/bug45705_1.phpt b/ext/imap/tests/bug45705_1.phpt
index b8d33e6758..c2c8f15517 100644
--- a/ext/imap/tests/bug45705_1.phpt
+++ b/ext/imap/tests/bug45705_1.phpt
@@ -9,7 +9,7 @@ extension_loaded('imap') or die('skip imap extension not available in this build
$address = 'John Doe <john@example.com>';
var_dump($address);
-imap_rfc822_parse_adrlist($address, null);
+imap_rfc822_parse_adrlist($address, '');
var_dump($address);
?>
diff --git a/ext/imap/tests/bug75774.phpt b/ext/imap/tests/bug75774.phpt
index 08883ad8f0..dc6b2910b6 100644
--- a/ext/imap/tests/bug75774.phpt
+++ b/ext/imap/tests/bug75774.phpt
@@ -20,6 +20,5 @@ fclose($var1);
unlink($fn);
?>
---EXPECTF--
-Warning: imap_append(): Internal date not correctly formatted in %s on line %d
-imap_append(): supplied resource is not a valid imap resource
+--EXPECT--
+imap_append(): Argument #1 ($imap) must be of type IMAPConnection, resource given
diff --git a/ext/imap/tests/imap_constructor.phpt b/ext/imap/tests/imap_constructor.phpt
new file mode 100644
index 0000000000..bc5da991d1
--- /dev/null
+++ b/ext/imap/tests/imap_constructor.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Attempt to instantiate an IMAPConnection directly
+--SKIPIF--
+<?php
+extension_loaded('imap') or die('skip imap extension not available in this build');
+--FILE--
+<?php
+
+try {
+ new IMAPConnection();
+} catch (Error $ex) {
+ echo "Exception: ", $ex->getMessage(), "\n";
+}
+--EXPECT--
+Exception: Cannot directly construct IMAPConnection, use imap_open() instead
diff --git a/ext/imap/tests/imap_errors_basic.phpt b/ext/imap/tests/imap_errors_basic.phpt
index f691a5c705..9a92877007 100644
--- a/ext/imap/tests/imap_errors_basic.phpt
+++ b/ext/imap/tests/imap_errors_basic.phpt
@@ -1,31 +1,24 @@
--TEST--
-Test imap_errors() function : invalid password
+Test imap_errors() function : anonymous user not supported
--SKIPIF--
<?php
require_once __DIR__.'/setup/skipif.inc';
?>
--FILE--
<?php
-echo "*** Testing imap_errors() : invalid password ***\n";
+echo "*** Testing imap_errors() : anonymous user not supported ***\n";
require_once __DIR__.'/setup/imap_include.inc';
-$password = "bogus"; // invalid password to use in this test
-echo "Issue opening with invalid password, 1 retry\n";
-$mbox = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, $password, OP_READONLY, 1);
+$mbox = @imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD, OP_ANONYMOUS);
echo "List any errors\n";
var_dump(imap_errors());
?>
--EXPECTF--
-*** Testing imap_errors() : invalid password ***
-Issue opening with invalid password, 1 retry
-
-Warning: imap_open(): Couldn't open stream %s in %s on line %d
+*** Testing imap_errors() : anonymous user not supported ***
List any errors
-array(%d) {
+array(1) {
[0]=>
string(%d) "%s"
- [1]=>
- string(%d) "%s"
}
diff --git a/ext/imap/tests/imap_final.phpt b/ext/imap/tests/imap_final.phpt
new file mode 100644
index 0000000000..a896b4e6c4
--- /dev/null
+++ b/ext/imap/tests/imap_final.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Check that IMAPConnection is declared final
+--SKIPIF--
+<?php
+extension_loaded('imap') or die('skip imap extension not available in this build');
+--FILE--
+<?php
+
+class T extends IMAPConnection {}
+--EXPECTF--
+Fatal error: Class T may not inherit from final class (IMAPConnection) in %s on line %d
diff --git a/ext/imap/tests/setup/dovecot.conf b/ext/imap/tests/setup/dovecot.conf
index c465ba3ce9..21687a31e4 100644
--- a/ext/imap/tests/setup/dovecot.conf
+++ b/ext/imap/tests/setup/dovecot.conf
@@ -2,15 +2,29 @@
# Pigeonhole version 0.4.21 (92477967)
listen = *, ::
-# To make authentication work
+# For SSL need to setup a certificate
+# See https://wiki.dovecot.org/SSL/DovecotConfiguration
ssl = no
-disable_plaintext_auth = no
-auth_mechanisms = plain cram-md5
+# Disable plaintext to prevent a warning at each login
+disable_plaintext_auth = yes
+
+auth_mechanisms = cram-md5
auth_username_format = %u
-auth_debug = yes
auth_verbose = yes
-#log
+auth_debug = yes
+auth_failure_delay = 1secs
+
+# This need dovecot 2.3.12.
+# login_proxy_timeout = 500milliseconds
+# ^ This would allow to kill login processes early, but needs testing. So would use v instead
+# login_proxy_timeout = 5s
+# There is a 1 second delay between each reconnection attempt.
+# https://doc.dovecot.org/settings/core/#login-proxy-max-reconnects
+# This need dovecot 2.3.12.
+# login_proxy_max_reconnects = 3
+
+# Log config
log_path = /var/log/dovecot.log
# If not set, use the value from log_path
info_log_path = /var/log/dovecot-info.log
diff --git a/ext/intl/breakiterator/breakiterator.stub.php b/ext/intl/breakiterator/breakiterator.stub.php
index 35a57e44b9..bae4726be4 100644
--- a/ext/intl/breakiterator/breakiterator.stub.php
+++ b/ext/intl/breakiterator/breakiterator.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class IntlBreakIterator implements IteratorAggregate
{
@@ -86,12 +86,6 @@ class IntlRuleBasedBreakIterator extends IntlBreakIterator
public function getRuleStatusVec() {}
}
-class IntlPartsIterator extends IntlIterator
-{
- /** @return IntlBreakIterator */
- public function getBreakIterator() {}
-}
-
class IntlCodePointBreakIterator extends IntlBreakIterator
{
/** @return int */
diff --git a/ext/intl/breakiterator/breakiterator_arginfo.h b/ext/intl/breakiterator/breakiterator_arginfo.h
index ec8c0c3ce7..aa025ee901 100644
--- a/ext/intl/breakiterator/breakiterator_arginfo.h
+++ b/ext/intl/breakiterator/breakiterator_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 6a121ed9817667820f05677a772781d6b788796b */
+ * Stub hash: 9e9dc1cd1302038f351f6075393494d1a58f0d74 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlBreakIterator_createCharacterInstance, 0, 0, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, locale, IS_STRING, 1, "null")
@@ -72,8 +72,6 @@ ZEND_END_ARG_INFO()
#define arginfo_class_IntlRuleBasedBreakIterator_getRuleStatusVec arginfo_class_IntlBreakIterator_createCodePointInstance
-#define arginfo_class_IntlPartsIterator_getBreakIterator arginfo_class_IntlBreakIterator_createCodePointInstance
-
#define arginfo_class_IntlCodePointBreakIterator_getLastCodePoint arginfo_class_IntlBreakIterator_createCodePointInstance
@@ -104,7 +102,6 @@ ZEND_METHOD(IntlRuleBasedBreakIterator, getBinaryRules);
ZEND_METHOD(IntlRuleBasedBreakIterator, getRules);
ZEND_METHOD(IntlRuleBasedBreakIterator, getRuleStatus);
ZEND_METHOD(IntlRuleBasedBreakIterator, getRuleStatusVec);
-ZEND_METHOD(IntlPartsIterator, getBreakIterator);
ZEND_METHOD(IntlCodePointBreakIterator, getLastCodePoint);
@@ -145,13 +142,38 @@ static const zend_function_entry class_IntlRuleBasedBreakIterator_methods[] = {
};
-static const zend_function_entry class_IntlPartsIterator_methods[] = {
- ZEND_ME(IntlPartsIterator, getBreakIterator, arginfo_class_IntlPartsIterator_getBreakIterator, ZEND_ACC_PUBLIC)
- ZEND_FE_END
-};
-
-
static const zend_function_entry class_IntlCodePointBreakIterator_methods[] = {
ZEND_ME(IntlCodePointBreakIterator, getLastCodePoint, arginfo_class_IntlCodePointBreakIterator_getLastCodePoint, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_IntlBreakIterator(zend_class_entry *class_entry_IteratorAggregate)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IntlBreakIterator", class_IntlBreakIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_IteratorAggregate);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_IntlRuleBasedBreakIterator(zend_class_entry *class_entry_IntlBreakIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IntlRuleBasedBreakIterator", class_IntlRuleBasedBreakIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_IntlBreakIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_IntlCodePointBreakIterator(zend_class_entry *class_entry_IntlBreakIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IntlCodePointBreakIterator", class_IntlCodePointBreakIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_IntlBreakIterator);
+
+ return class_entry;
+}
diff --git a/ext/intl/breakiterator/breakiterator_class.cpp b/ext/intl/breakiterator/breakiterator_class.cpp
index 3f236db2d4..aa9dd03493 100644
--- a/ext/intl/breakiterator/breakiterator_class.cpp
+++ b/ext/intl/breakiterator/breakiterator_class.cpp
@@ -220,13 +220,11 @@ static zend_object *BreakIterator_object_create(zend_class_entry *ce)
*/
U_CFUNC void breakiterator_register_BreakIterator_class(void)
{
- zend_class_entry ce;
-
/* Create and register 'BreakIterator' class. */
- INIT_CLASS_ENTRY(ce, "IntlBreakIterator", class_IntlBreakIterator_methods);
- ce.create_object = BreakIterator_object_create;
- ce.get_iterator = _breakiterator_get_iterator;
- BreakIterator_ce_ptr = zend_register_internal_class(&ce);
+
+ BreakIterator_ce_ptr = register_class_IntlBreakIterator(zend_ce_aggregate);
+ BreakIterator_ce_ptr->create_object = BreakIterator_object_create;
+ BreakIterator_ce_ptr->get_iterator = _breakiterator_get_iterator;
memcpy(&BreakIterator_handlers, &std_object_handlers,
sizeof BreakIterator_handlers);
@@ -236,8 +234,6 @@ U_CFUNC void breakiterator_register_BreakIterator_class(void)
BreakIterator_handlers.get_debug_info = BreakIterator_get_debug_info;
BreakIterator_handlers.free_obj = BreakIterator_objects_free;
- zend_class_implements(BreakIterator_ce_ptr, 1, zend_ce_aggregate);
-
zend_declare_class_constant_long(BreakIterator_ce_ptr,
"DONE", sizeof("DONE") - 1, BreakIterator::DONE );
@@ -271,15 +267,9 @@ U_CFUNC void breakiterator_register_BreakIterator_class(void)
/* Create and register 'RuleBasedBreakIterator' class. */
- INIT_CLASS_ENTRY(ce, "IntlRuleBasedBreakIterator",
- class_IntlRuleBasedBreakIterator_methods);
- RuleBasedBreakIterator_ce_ptr = zend_register_internal_class_ex(&ce,
- BreakIterator_ce_ptr);
+ RuleBasedBreakIterator_ce_ptr = register_class_IntlRuleBasedBreakIterator(BreakIterator_ce_ptr);
/* Create and register 'CodePointBreakIterator' class. */
- INIT_CLASS_ENTRY(ce, "IntlCodePointBreakIterator",
- class_IntlCodePointBreakIterator_methods);
- CodePointBreakIterator_ce_ptr = zend_register_internal_class_ex(&ce,
- BreakIterator_ce_ptr);
+ CodePointBreakIterator_ce_ptr = register_class_IntlCodePointBreakIterator(BreakIterator_ce_ptr);
}
/* }}} */
diff --git a/ext/intl/breakiterator/breakiterator_iterators.cpp b/ext/intl/breakiterator/breakiterator_iterators.cpp
index 7c955a5ecb..4eb0fd8da9 100644
--- a/ext/intl/breakiterator/breakiterator_iterators.cpp
+++ b/ext/intl/breakiterator/breakiterator_iterators.cpp
@@ -24,7 +24,7 @@
extern "C" {
#define USE_BREAKITERATOR_POINTER
#include "breakiterator_class.h"
-#include "breakiterator_arginfo.h"
+#include "breakiterator_iterators_arginfo.h"
#include "../intl_convert.h"
#include "../locale/locale.h"
#include <zend_exceptions.h>
@@ -287,12 +287,8 @@ U_CFUNC PHP_METHOD(IntlPartsIterator, getBreakIterator)
U_CFUNC void breakiterator_register_IntlPartsIterator_class(void)
{
- zend_class_entry ce;
-
/* Create and register 'BreakIterator' class. */
- INIT_CLASS_ENTRY(ce, "IntlPartsIterator", class_IntlPartsIterator_methods);
- IntlPartsIterator_ce_ptr = zend_register_internal_class_ex(&ce,
- IntlIterator_ce_ptr);
+ IntlPartsIterator_ce_ptr = register_class_IntlPartsIterator(IntlIterator_ce_ptr);
IntlPartsIterator_ce_ptr->create_object = IntlPartsIterator_object_create;
memcpy(&IntlPartsIterator_handlers, &IntlIterator_handlers,
diff --git a/ext/intl/breakiterator/breakiterator_iterators.stub.php b/ext/intl/breakiterator/breakiterator_iterators.stub.php
new file mode 100644
index 0000000000..9a82640c20
--- /dev/null
+++ b/ext/intl/breakiterator/breakiterator_iterators.stub.php
@@ -0,0 +1,9 @@
+<?php
+
+/** @generate-class-entries */
+
+class IntlPartsIterator extends IntlIterator
+{
+ /** @return IntlBreakIterator */
+ public function getBreakIterator() {}
+}
diff --git a/ext/intl/breakiterator/breakiterator_iterators_arginfo.h b/ext/intl/breakiterator/breakiterator_iterators_arginfo.h
new file mode 100644
index 0000000000..0b7279607c
--- /dev/null
+++ b/ext/intl/breakiterator/breakiterator_iterators_arginfo.h
@@ -0,0 +1,24 @@
+/* This is a generated file, edit the .stub.php file instead.
+ * Stub hash: 5e165fe25d6d13824da9d7c5f0a089ee11626689 */
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlPartsIterator_getBreakIterator, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
+
+ZEND_METHOD(IntlPartsIterator, getBreakIterator);
+
+
+static const zend_function_entry class_IntlPartsIterator_methods[] = {
+ ZEND_ME(IntlPartsIterator, getBreakIterator, arginfo_class_IntlPartsIterator_getBreakIterator, ZEND_ACC_PUBLIC)
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class_IntlPartsIterator(zend_class_entry *class_entry_IntlIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IntlPartsIterator", class_IntlPartsIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_IntlIterator);
+
+ return class_entry;
+}
diff --git a/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp b/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp
index f17733da24..eb54c321f6 100644
--- a/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp
+++ b/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp
@@ -35,7 +35,7 @@ static void _php_intlrbbi_constructor_body(INTERNAL_FUNCTION_PARAMETERS)
{
char *rules;
size_t rules_len;
- zend_bool compiled = 0;
+ bool compiled = 0;
UErrorCode status = U_ZERO_ERROR;
BREAKITER_METHOD_INIT_VARS;
object = ZEND_THIS;
diff --git a/ext/intl/calendar/calendar.stub.php b/ext/intl/calendar/calendar.stub.php
index 3da6ebb1d0..68a2050c3a 100644
--- a/ext/intl/calendar/calendar.stub.php
+++ b/ext/intl/calendar/calendar.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class IntlCalendar
{
diff --git a/ext/intl/calendar/calendar_arginfo.h b/ext/intl/calendar/calendar_arginfo.h
index 8537836d5b..55a0d25f58 100644
--- a/ext/intl/calendar/calendar_arginfo.h
+++ b/ext/intl/calendar/calendar_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 18a92d3af801f11e5c3b90e5d272fd98b3515c40 */
+ * Stub hash: a0800bd27fe214cce7420e689e9d7b519a7b6835 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlCalendar___construct, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -270,3 +270,23 @@ static const zend_function_entry class_IntlGregorianCalendar_methods[] = {
ZEND_ME_MAPPING(isLeapYear, intlgregcal_is_leap_year, arginfo_class_IntlGregorianCalendar_isLeapYear, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_IntlCalendar(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IntlCalendar", class_IntlCalendar_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_IntlGregorianCalendar(zend_class_entry *class_entry_IntlCalendar)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IntlGregorianCalendar", class_IntlGregorianCalendar_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_IntlCalendar);
+
+ return class_entry;
+}
diff --git a/ext/intl/calendar/calendar_class.cpp b/ext/intl/calendar/calendar_class.cpp
index a46ef62e68..8c1bdf3185 100644
--- a/ext/intl/calendar/calendar_class.cpp
+++ b/ext/intl/calendar/calendar_class.cpp
@@ -268,12 +268,9 @@ static zend_object *Calendar_object_create(zend_class_entry *ce)
*/
void calendar_register_IntlCalendar_class(void)
{
- zend_class_entry ce;
-
/* Create and register 'IntlCalendar' class. */
- INIT_CLASS_ENTRY(ce, "IntlCalendar", class_IntlCalendar_methods);
- ce.create_object = Calendar_object_create;
- Calendar_ce_ptr = zend_register_internal_class(&ce);
+ Calendar_ce_ptr = register_class_IntlCalendar();
+ Calendar_ce_ptr->create_object = Calendar_object_create;
memcpy( &Calendar_handlers, &std_object_handlers,
sizeof Calendar_handlers);
@@ -331,8 +328,6 @@ void calendar_register_IntlCalendar_class(void)
CALENDAR_DECL_LONG_CONST("WALLTIME_NEXT_VALID", UCAL_WALLTIME_NEXT_VALID);
/* Create and register 'IntlGregorianCalendar' class. */
- INIT_CLASS_ENTRY(ce, "IntlGregorianCalendar", class_IntlGregorianCalendar_methods);
- GregorianCalendar_ce_ptr = zend_register_internal_class_ex(&ce,
- Calendar_ce_ptr);
+ GregorianCalendar_ce_ptr = register_class_IntlGregorianCalendar(Calendar_ce_ptr);
}
/* }}} */
diff --git a/ext/intl/calendar/calendar_methods.cpp b/ext/intl/calendar/calendar_methods.cpp
index bcef9cf3b9..19d43b2b23 100644
--- a/ext/intl/calendar/calendar_methods.cpp
+++ b/ext/intl/calendar/calendar_methods.cpp
@@ -165,7 +165,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_keyword_values_for_locale)
*locale;
size_t key_len,
locale_len;
- zend_bool commonly_used;
+ bool commonly_used;
intl_error_reset(NULL);
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssb",
@@ -440,7 +440,7 @@ U_CFUNC PHP_FUNCTION(intlcal_roll)
U_CFUNC PHP_FUNCTION(intlcal_clear)
{
zend_long field;
- zend_bool field_is_null = 1;
+ bool field_is_null = 1;
CALENDAR_METHOD_INIT_VARS;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(),
@@ -757,7 +757,7 @@ U_CFUNC PHP_FUNCTION(intlcal_is_set)
U_CFUNC PHP_FUNCTION(intlcal_is_weekend)
{
double date;
- zend_bool date_is_null = 1;
+ bool date_is_null = 1;
CALENDAR_METHOD_INIT_VARS;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(),
@@ -799,7 +799,7 @@ U_CFUNC PHP_FUNCTION(intlcal_set_first_day_of_week)
U_CFUNC PHP_FUNCTION(intlcal_set_lenient)
{
- zend_bool is_lenient;
+ bool is_lenient;
CALENDAR_METHOD_INIT_VARS;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(),
diff --git a/ext/intl/calendar/gregoriancalendar_methods.cpp b/ext/intl/calendar/gregoriancalendar_methods.cpp
index 64b7539789..9cbb62ebdb 100644
--- a/ext/intl/calendar/gregoriancalendar_methods.cpp
+++ b/ext/intl/calendar/gregoriancalendar_methods.cpp
@@ -44,7 +44,7 @@ static inline GregorianCalendar *fetch_greg(Calendar_object *co) {
}
static void _php_intlgregcal_constructor_body(
- INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
+ INTERNAL_FUNCTION_PARAMETERS, bool is_constructor)
{
zval *tz_object = NULL;
zval args_a[6] = {0},
diff --git a/ext/intl/collator/collator.stub.php b/ext/intl/collator/collator.stub.php
index f42d1508cb..7a987a25ab 100644
--- a/ext/intl/collator/collator.stub.php
+++ b/ext/intl/collator/collator.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class Collator
{
diff --git a/ext/intl/collator/collator_arginfo.h b/ext/intl/collator/collator_arginfo.h
index 1b7dcc408f..480541ee1c 100644
--- a/ext/intl/collator/collator_arginfo.h
+++ b/ext/intl/collator/collator_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 869c6e60a8f2b153ef79f28a08e165ff3ec2bc14 */
+ * Stub hash: 9907156bf1d28af7bf6a1858dffc58994c12756f */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Collator___construct, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 0)
@@ -85,3 +85,13 @@ static const zend_function_entry class_Collator_methods[] = {
ZEND_ME_MAPPING(getSortKey, collator_get_sort_key, arginfo_class_Collator_getSortKey, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Collator(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Collator", class_Collator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/intl/collator/collator_class.c b/ext/intl/collator/collator_class.c
index 44452c147f..7be73e8ea2 100644
--- a/ext/intl/collator/collator_class.c
+++ b/ext/intl/collator/collator_class.c
@@ -63,12 +63,9 @@ zend_object *Collator_object_create(zend_class_entry *ce )
*/
void collator_register_Collator_class( void )
{
- zend_class_entry ce;
-
/* Create and register 'Collator' class. */
- INIT_CLASS_ENTRY( ce, "Collator", class_Collator_methods );
- ce.create_object = Collator_object_create;
- Collator_ce_ptr = zend_register_internal_class( &ce );
+ Collator_ce_ptr = register_class_Collator();
+ Collator_ce_ptr->create_object = Collator_object_create;
memcpy(&Collator_handlers, &std_object_handlers,
sizeof Collator_handlers);
diff --git a/ext/intl/common/common.stub.php b/ext/intl/common/common.stub.php
index a0a8a20ffb..dc93c1f35d 100644
--- a/ext/intl/common/common.stub.php
+++ b/ext/intl/common/common.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class IntlIterator implements Iterator
{
diff --git a/ext/intl/common/common_arginfo.h b/ext/intl/common/common_arginfo.h
index 08679923cb..5a4bc9055b 100644
--- a/ext/intl/common/common_arginfo.h
+++ b/ext/intl/common/common_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: cf905a693064ae31b6434e84f6c63bf7c9b804a6 */
+ * Stub hash: fb470896fab2e63e898a5d49ff8d7f59257be9e3 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlIterator_current, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -28,3 +28,14 @@ static const zend_function_entry class_IntlIterator_methods[] = {
ZEND_ME(IntlIterator, valid, arginfo_class_IntlIterator_valid, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_IntlIterator(zend_class_entry *class_entry_Iterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IntlIterator", class_IntlIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Iterator);
+
+ return class_entry;
+}
diff --git a/ext/intl/common/common_enum.cpp b/ext/intl/common/common_enum.cpp
index 9d823ead57..1ea046b87c 100644
--- a/ext/intl/common/common_enum.cpp
+++ b/ext/intl/common/common_enum.cpp
@@ -286,15 +286,10 @@ PHP_METHOD(IntlIterator, valid)
*/
U_CFUNC void intl_register_IntlIterator_class(void)
{
- zend_class_entry ce;
-
/* Create and register 'IntlIterator' class. */
- INIT_CLASS_ENTRY(ce, "IntlIterator", class_IntlIterator_methods);
- ce.create_object = IntlIterator_object_create;
- IntlIterator_ce_ptr = zend_register_internal_class(&ce);
+ IntlIterator_ce_ptr = register_class_IntlIterator(zend_ce_iterator);
+ IntlIterator_ce_ptr->create_object = IntlIterator_object_create;
IntlIterator_ce_ptr->get_iterator = IntlIterator_get_iterator;
- zend_class_implements(IntlIterator_ce_ptr, 1,
- zend_ce_iterator);
memcpy(&IntlIterator_handlers, &std_object_handlers,
sizeof IntlIterator_handlers);
diff --git a/ext/intl/converter/converter.c b/ext/intl/converter/converter.c
index 697ebcda0b..7c4ac65262 100644
--- a/ext/intl/converter/converter.c
+++ b/ext/intl/converter/converter.c
@@ -134,7 +134,7 @@ PHP_METHOD(UConverter, fromUCallback) {
/* }}} */
/* {{{ php_converter_check_limits */
-static inline zend_bool php_converter_check_limits(php_converter_object *objval, zend_long available, zend_long needed) {
+static inline bool php_converter_check_limits(php_converter_object *objval, zend_long available, zend_long needed) {
if (available < needed) {
php_converter_throw_failure(objval, U_BUFFER_OVERFLOW_ERROR, "Buffer overrun " ZEND_LONG_FMT " bytes needed, " ZEND_LONG_FMT " available", needed, available);
return 0;
@@ -333,8 +333,8 @@ static void php_converter_from_u_callback(const void *context,
/* }}} */
/* {{{ php_converter_set_callbacks */
-static inline zend_bool php_converter_set_callbacks(php_converter_object *objval, UConverter *cnv) {
- zend_bool ret = 1;
+static inline bool php_converter_set_callbacks(php_converter_object *objval, UConverter *cnv) {
+ bool ret = 1;
UErrorCode error = U_ZERO_ERROR;
if (objval->obj.ce == php_converter_ce) {
@@ -363,7 +363,7 @@ static inline zend_bool php_converter_set_callbacks(php_converter_object *objval
/* }}} */
/* {{{ php_converter_set_encoding */
-static zend_bool php_converter_set_encoding(php_converter_object *objval,
+static bool php_converter_set_encoding(php_converter_object *objval,
UConverter **pcnv,
const char *enc, size_t enc_len
) {
@@ -705,7 +705,7 @@ PHP_METHOD(UConverter, convert) {
char *str;
size_t str_len;
zend_string *ret;
- zend_bool reverse = 0;
+ bool reverse = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|b",
&str, &str_len, &reverse) == FAILURE) {
@@ -966,10 +966,7 @@ static zend_object *php_converter_clone_object(zend_object *object) {
/* {{{ php_converter_minit */
int php_converter_minit(INIT_FUNC_ARGS) {
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY(ce, "UConverter", class_UConverter_methods);
- php_converter_ce = zend_register_internal_class(&ce);
+ php_converter_ce = register_class_UConverter();
php_converter_ce->create_object = php_converter_create_object;
memcpy(&php_converter_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
php_converter_object_handlers.offset = XtOffsetOf(php_converter_object, obj);
diff --git a/ext/intl/converter/converter.stub.php b/ext/intl/converter/converter.stub.php
index 5b82b098f4..8847bdcab0 100644
--- a/ext/intl/converter/converter.stub.php
+++ b/ext/intl/converter/converter.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class UConverter
{
diff --git a/ext/intl/converter/converter_arginfo.h b/ext/intl/converter/converter_arginfo.h
index 8b8f8fc1f5..be90347d12 100644
--- a/ext/intl/converter/converter_arginfo.h
+++ b/ext/intl/converter/converter_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: e33e2614c969c59b79c6062f7a347a8e8e486d85 */
+ * Stub hash: c01b6c9d6a6754a2fffde1279bec3a984e6a2f34 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_UConverter___construct, 0, 0, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, destination_encoding, IS_STRING, 1, "null")
@@ -113,3 +113,13 @@ static const zend_function_entry class_UConverter_methods[] = {
ZEND_ME(UConverter, transcode, arginfo_class_UConverter_transcode, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_UConverter(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "UConverter", class_UConverter_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/intl/dateformat/dateformat.stub.php b/ext/intl/dateformat/dateformat.stub.php
index e6f9522dd4..7b7043cebd 100644
--- a/ext/intl/dateformat/dateformat.stub.php
+++ b/ext/intl/dateformat/dateformat.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class IntlDateFormatter
{
diff --git a/ext/intl/dateformat/dateformat_arginfo.h b/ext/intl/dateformat/dateformat_arginfo.h
index 8830fa615e..ecbe43daa0 100644
--- a/ext/intl/dateformat/dateformat_arginfo.h
+++ b/ext/intl/dateformat/dateformat_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: faeef90c9c1324c6a25f0df36c7239ddc2b43ee4 */
+ * Stub hash: a83ee23ab33293a878280f137260da9f8914218a */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlDateFormatter___construct, 0, 0, 3)
ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 1)
@@ -125,3 +125,13 @@ static const zend_function_entry class_IntlDateFormatter_methods[] = {
ZEND_ME_MAPPING(getErrorMessage, datefmt_get_error_message, arginfo_class_IntlDateFormatter_getErrorMessage, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_IntlDateFormatter(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IntlDateFormatter", class_IntlDateFormatter_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/intl/dateformat/dateformat_attr.c b/ext/intl/dateformat/dateformat_attr.c
index 2d2dbdfb6c..eee33b9925 100644
--- a/ext/intl/dateformat/dateformat_attr.c
+++ b/ext/intl/dateformat/dateformat_attr.c
@@ -69,7 +69,7 @@ PHP_FUNCTION( datefmt_get_pattern )
UChar value_buf[64];
uint32_t length = USIZE( value_buf );
UChar* value = value_buf;
- zend_bool is_pattern_localized = false;
+ bool is_pattern_localized = false;
DATE_FORMAT_METHOD_INIT_VARS;
@@ -106,7 +106,7 @@ PHP_FUNCTION( datefmt_set_pattern )
size_t value_len = 0;
int32_t slength = 0;
UChar* svalue = NULL;
- zend_bool is_pattern_localized = false;
+ bool is_pattern_localized = false;
DATE_FORMAT_METHOD_INIT_VARS;
@@ -184,7 +184,7 @@ PHP_FUNCTION( datefmt_is_lenient )
/* {{{ Set formatter lenient. */
PHP_FUNCTION( datefmt_set_lenient )
{
- zend_bool isLenient = false;
+ bool isLenient = false;
DATE_FORMAT_METHOD_INIT_VARS;
diff --git a/ext/intl/dateformat/dateformat_attrcpp.cpp b/ext/intl/dateformat/dateformat_attrcpp.cpp
index 343ef170d2..547c00c14c 100644
--- a/ext/intl/dateformat/dateformat_attrcpp.cpp
+++ b/ext/intl/dateformat/dateformat_attrcpp.cpp
@@ -158,7 +158,7 @@ U_CFUNC PHP_FUNCTION(datefmt_set_calendar)
{
zend_object *calendar_obj;
zend_long calendar_long;
- zend_bool calendar_is_null;
+ bool calendar_is_null;
DATE_FORMAT_METHOD_INIT_VARS;
object = getThis();
diff --git a/ext/intl/dateformat/dateformat_class.c b/ext/intl/dateformat/dateformat_class.c
index 7d9dde20b0..b6e0283677 100644
--- a/ext/intl/dateformat/dateformat_class.c
+++ b/ext/intl/dateformat/dateformat_class.c
@@ -107,12 +107,9 @@ zend_object *IntlDateFormatter_object_clone(zend_object *object)
*/
void dateformat_register_IntlDateFormatter_class( void )
{
- zend_class_entry ce;
-
/* Create and register 'IntlDateFormatter' class. */
- INIT_CLASS_ENTRY( ce, "IntlDateFormatter", class_IntlDateFormatter_methods );
- ce.create_object = IntlDateFormatter_object_create;
- IntlDateFormatter_ce_ptr = zend_register_internal_class( &ce );
+ IntlDateFormatter_ce_ptr = register_class_IntlDateFormatter();
+ IntlDateFormatter_ce_ptr->create_object = IntlDateFormatter_object_create;
memcpy(&IntlDateFormatter_handlers, &std_object_handlers,
sizeof IntlDateFormatter_handlers);
diff --git a/ext/intl/dateformat/dateformat_create.cpp b/ext/intl/dateformat/dateformat_create.cpp
index e80b5d0131..40d2077c84 100644
--- a/ext/intl/dateformat/dateformat_create.cpp
+++ b/ext/intl/dateformat/dateformat_create.cpp
@@ -55,7 +55,7 @@ static zend_result datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
zend_long time_type = 0;
zend_object *calendar_obj = NULL;
zend_long calendar_long = 0;
- zend_bool calendar_is_null = 1;
+ bool calendar_is_null = 1;
Calendar *cal = NULL;
zend_long calendar_type;
bool calendar_owned;
diff --git a/ext/intl/dateformat/dateformat_helpers.cpp b/ext/intl/dateformat/dateformat_helpers.cpp
index 46c909bf95..b6700fdf40 100644
--- a/ext/intl/dateformat/dateformat_helpers.cpp
+++ b/ext/intl/dateformat/dateformat_helpers.cpp
@@ -29,7 +29,7 @@ extern "C" {
using icu::GregorianCalendar;
int datefmt_process_calendar_arg(
- zend_object *calendar_obj, zend_long calendar_long, zend_bool calendar_is_null, Locale const& locale,
+ zend_object *calendar_obj, zend_long calendar_long, bool calendar_is_null, Locale const& locale,
const char *func_name, intl_error *err, Calendar*& cal, zend_long& cal_int_type, bool& calendar_owned
) {
char *msg;
diff --git a/ext/intl/dateformat/dateformat_helpers.h b/ext/intl/dateformat/dateformat_helpers.h
index 1f2d7eb32e..50466e6ca6 100644
--- a/ext/intl/dateformat/dateformat_helpers.h
+++ b/ext/intl/dateformat/dateformat_helpers.h
@@ -31,7 +31,7 @@ using icu::Calendar;
using icu::DateFormat;
int datefmt_process_calendar_arg(
- zend_object *calendar_obj, zend_long calendar_long, zend_bool calendar_is_null, Locale const& locale,
+ zend_object *calendar_obj, zend_long calendar_long, bool calendar_is_null, Locale const& locale,
const char *func_name, intl_error *err, Calendar*& cal, zend_long& cal_int_type, bool& calendar_owned
);
diff --git a/ext/intl/formatter/formatter.stub.php b/ext/intl/formatter/formatter.stub.php
index 19e6148b8a..a16ad53518 100644
--- a/ext/intl/formatter/formatter.stub.php
+++ b/ext/intl/formatter/formatter.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class NumberFormatter
{
diff --git a/ext/intl/formatter/formatter_arginfo.h b/ext/intl/formatter/formatter_arginfo.h
index a621605977..c06fd4d231 100644
--- a/ext/intl/formatter/formatter_arginfo.h
+++ b/ext/intl/formatter/formatter_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: de7625297bcdb8c7e4944a319c019ed68508ea2c */
+ * Stub hash: 4fa61766d54f40d3295da0992b16e08ede9aaab1 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_NumberFormatter___construct, 0, 0, 2)
ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 0)
@@ -111,3 +111,13 @@ static const zend_function_entry class_NumberFormatter_methods[] = {
ZEND_ME_MAPPING(getErrorMessage, numfmt_get_error_message, arginfo_class_NumberFormatter_getErrorMessage, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_NumberFormatter(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "NumberFormatter", class_NumberFormatter_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/intl/formatter/formatter_class.c b/ext/intl/formatter/formatter_class.c
index f7965ec7d1..e2ff9989b6 100644
--- a/ext/intl/formatter/formatter_class.c
+++ b/ext/intl/formatter/formatter_class.c
@@ -94,12 +94,9 @@ zend_object *NumberFormatter_object_clone(zend_object *object)
*/
void formatter_register_class( void )
{
- zend_class_entry ce;
-
/* Create and register 'NumberFormatter' class. */
- INIT_CLASS_ENTRY( ce, "NumberFormatter", class_NumberFormatter_methods );
- ce.create_object = NumberFormatter_object_create;
- NumberFormatter_ce_ptr = zend_register_internal_class( &ce );
+ NumberFormatter_ce_ptr = register_class_NumberFormatter();
+ NumberFormatter_ce_ptr->create_object = NumberFormatter_object_create;
NumberFormatter_ce_ptr->serialize = zend_class_serialize_deny;
NumberFormatter_ce_ptr->unserialize = zend_class_unserialize_deny;
diff --git a/ext/intl/formatter/formatter_format.c b/ext/intl/formatter/formatter_format.c
index aa9c5915ad..f467d42c1c 100644
--- a/ext/intl/formatter/formatter_format.c
+++ b/ext/intl/formatter/formatter_format.c
@@ -59,7 +59,7 @@ PHP_FUNCTION( numfmt_format )
switch(type) {
case FORMAT_TYPE_INT32:
- convert_to_long_ex(number);
+ convert_to_long(number);
formatted_len = unum_format(FORMATTER_OBJECT(nfo), (int32_t)Z_LVAL_P(number),
formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
if (INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR) {
@@ -91,7 +91,7 @@ PHP_FUNCTION( numfmt_format )
break;
case FORMAT_TYPE_DOUBLE:
- convert_to_double_ex(number);
+ convert_to_double(number);
formatted_len = unum_formatDouble(FORMATTER_OBJECT(nfo), Z_DVAL_P(number), formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
if (INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR) {
intl_error_reset(INTL_DATA_ERROR_P(nfo));
diff --git a/ext/intl/grapheme/grapheme_string.c b/ext/intl/grapheme/grapheme_string.c
index 7d8df14d2e..88a5920001 100644
--- a/ext/intl/grapheme/grapheme_string.c
+++ b/ext/intl/grapheme/grapheme_string.c
@@ -345,7 +345,7 @@ PHP_FUNCTION(grapheme_substr)
UBreakIterator* bi = NULL;
int sub_str_start_pos, sub_str_end_pos;
int32_t (*iter_func)(UBreakIterator *);
- zend_bool no_length = 1;
+ bool no_length = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl|l!", &str, &str_len, &lstart, &length, &no_length) == FAILURE) {
RETURN_THROWS();
@@ -546,7 +546,7 @@ static void strstr_common_handler(INTERNAL_FUNCTION_PARAMETERS, int f_ignore_cas
const char *found;
size_t haystack_len, needle_len;
int32_t ret_pos, uchar_pos;
- zend_bool part = 0;
+ bool part = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|b", &haystack, &haystack_len, &needle, &needle_len, &part) == FAILURE) {
RETURN_THROWS();
diff --git a/ext/intl/intl_error.c b/ext/intl/intl_error.c
index 6babe70152..64cf45ce61 100644
--- a/ext/intl/intl_error.c
+++ b/ext/intl/intl_error.c
@@ -203,17 +203,6 @@ void intl_errors_set_code( intl_error* err, UErrorCode err_code )
}
/* }}} */
-void intl_register_IntlException_class( void )
-{
- zend_class_entry ce;
-
- /* Create and register 'IntlException' class. */
- INIT_CLASS_ENTRY_EX( ce, "IntlException", sizeof( "IntlException" ) - 1, NULL );
- IntlException_ce_ptr = zend_register_internal_class_ex( &ce,
- zend_ce_exception );
- IntlException_ce_ptr->create_object = zend_ce_exception->create_object;
-}
-
smart_str intl_parse_error_to_string( UParseError* pe )
{
smart_str ret = {0};
diff --git a/ext/intl/intl_error.h b/ext/intl/intl_error.h
index 927e5cdfd2..bcf5d2cc4a 100644
--- a/ext/intl/intl_error.h
+++ b/ext/intl/intl_error.h
@@ -47,7 +47,4 @@ void intl_errors_set( intl_error* err, UErrorCode code, const char* msg,
// Other error helpers
smart_str intl_parse_error_to_string( UParseError* pe );
-// exported to be called on extension MINIT
-void intl_register_IntlException_class( void );
-
#endif // INTL_ERROR_H
diff --git a/ext/intl/locale/locale.stub.php b/ext/intl/locale/locale.stub.php
index e5703293c0..f20d2d3d97 100644
--- a/ext/intl/locale/locale.stub.php
+++ b/ext/intl/locale/locale.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class Locale
{
diff --git a/ext/intl/locale/locale_arginfo.h b/ext/intl/locale/locale_arginfo.h
index e952146362..cf61cfa9d1 100644
--- a/ext/intl/locale/locale_arginfo.h
+++ b/ext/intl/locale/locale_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 4135dc9df49d3fe20275d49bad428a2e3e0a8752 */
+ * Stub hash: 6b873a68045fb5cf75e23991a3c77aa01a8893ee */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Locale_getDefault, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -98,3 +98,13 @@ static const zend_function_entry class_Locale_methods[] = {
ZEND_ME_MAPPING(acceptFromHttp, locale_accept_from_http, arginfo_class_Locale_acceptFromHttp, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Locale(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Locale", class_Locale_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/intl/locale/locale_class.c b/ext/intl/locale/locale_class.c
index 0670f55620..852988b4a6 100644
--- a/ext/intl/locale/locale_class.c
+++ b/ext/intl/locale/locale_class.c
@@ -30,19 +30,8 @@ zend_class_entry *Locale_ce_ptr = NULL;
*/
void locale_register_Locale_class( void )
{
- zend_class_entry ce;
-
/* Create and register 'Locale' class. */
- INIT_CLASS_ENTRY( ce, "Locale", class_Locale_methods );
- ce.create_object = NULL;
- Locale_ce_ptr = zend_register_internal_class( &ce );
-
- /* Declare 'Locale' class properties. */
- if( !Locale_ce_ptr )
- {
- zend_error( E_ERROR,
- "Locale: Failed to register Locale class.");
- return;
- }
+ Locale_ce_ptr = register_class_Locale();
+ Locale_ce_ptr->create_object = NULL;
}
/* }}} */
diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c
index 9357475f55..d002fd0f82 100644
--- a/ext/intl/locale/locale_methods.c
+++ b/ext/intl/locale/locale_methods.c
@@ -1171,7 +1171,7 @@ PHP_FUNCTION(locale_filter_matches)
char* cur_lang_tag = NULL;
char* cur_loc_range = NULL;
- zend_bool boolCanonical = 0;
+ bool boolCanonical = 0;
UErrorCode status = U_ZERO_ERROR;
intl_error_reset( NULL );
@@ -1444,7 +1444,7 @@ PHP_FUNCTION(locale_lookup)
zval* arr = NULL;
HashTable* hash_arr = NULL;
- zend_bool boolCanonical = 0;
+ bool boolCanonical = 0;
zend_string* result_str = NULL;
intl_error_reset( NULL );
diff --git a/ext/intl/msgformat/msgformat.stub.php b/ext/intl/msgformat/msgformat.stub.php
index a9a3e3e181..f46e663203 100644
--- a/ext/intl/msgformat/msgformat.stub.php
+++ b/ext/intl/msgformat/msgformat.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class MessageFormatter
{
diff --git a/ext/intl/msgformat/msgformat_arginfo.h b/ext/intl/msgformat/msgformat_arginfo.h
index 3bad9aa498..67bfff9f26 100644
--- a/ext/intl/msgformat/msgformat_arginfo.h
+++ b/ext/intl/msgformat/msgformat_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: ece8c5157dc3a62ca2951d058b3c5497bb5cb836 */
+ * Stub hash: 0d5b34913965434a4015e2b6ac7288edbbafc3f3 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_MessageFormatter___construct, 0, 0, 2)
ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 0)
@@ -69,3 +69,13 @@ static const zend_function_entry class_MessageFormatter_methods[] = {
ZEND_ME_MAPPING(getErrorMessage, msgfmt_get_error_message, arginfo_class_MessageFormatter_getErrorMessage, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_MessageFormatter(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "MessageFormatter", class_MessageFormatter_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/intl/msgformat/msgformat_class.c b/ext/intl/msgformat/msgformat_class.c
index d8bf9a006c..d8274a1440 100644
--- a/ext/intl/msgformat/msgformat_class.c
+++ b/ext/intl/msgformat/msgformat_class.c
@@ -93,12 +93,9 @@ zend_object *MessageFormatter_object_clone(zend_object *object)
*/
void msgformat_register_class( void )
{
- zend_class_entry ce;
-
/* Create and register 'MessageFormatter' class. */
- INIT_CLASS_ENTRY( ce, "MessageFormatter", class_MessageFormatter_methods );
- ce.create_object = MessageFormatter_object_create;
- MessageFormatter_ce_ptr = zend_register_internal_class( &ce );
+ MessageFormatter_ce_ptr = register_class_MessageFormatter();
+ MessageFormatter_ce_ptr->create_object = MessageFormatter_object_create;
memcpy(&MessageFormatter_handlers, &std_object_handlers,
sizeof MessageFormatter_handlers);
diff --git a/ext/intl/normalizer/normalizer.stub.php b/ext/intl/normalizer/normalizer.stub.php
index 243ace532d..0c9e1785dc 100644
--- a/ext/intl/normalizer/normalizer.stub.php
+++ b/ext/intl/normalizer/normalizer.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class Normalizer
{
diff --git a/ext/intl/normalizer/normalizer_arginfo.h b/ext/intl/normalizer/normalizer_arginfo.h
index cd5a41de60..8f10d9cd86 100644
--- a/ext/intl/normalizer/normalizer_arginfo.h
+++ b/ext/intl/normalizer/normalizer_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 3b9ef4888cc32bd009fb87db52859953902454fc */
+ * Stub hash: 651065249a99f9ee50126d58223b8f4527e3fc09 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Normalizer_normalize, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
@@ -31,3 +31,13 @@ static const zend_function_entry class_Normalizer_methods[] = {
#endif
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Normalizer(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Normalizer", class_Normalizer_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/intl/normalizer/normalizer_class.c b/ext/intl/normalizer/normalizer_class.c
index 7a46acb0b2..29299da206 100644
--- a/ext/intl/normalizer/normalizer_class.c
+++ b/ext/intl/normalizer/normalizer_class.c
@@ -30,20 +30,8 @@ zend_class_entry *Normalizer_ce_ptr = NULL;
*/
void normalizer_register_Normalizer_class( void )
{
- zend_class_entry ce;
-
/* Create and register 'Normalizer' class. */
- INIT_CLASS_ENTRY( ce, "Normalizer", class_Normalizer_methods );
- ce.create_object = NULL;
- Normalizer_ce_ptr = zend_register_internal_class( &ce );
-
- /* Declare 'Normalizer' class properties. */
- if( !Normalizer_ce_ptr )
- {
- zend_error( E_ERROR,
- "Normalizer: attempt to create properties "
- "on a non-registered class." );
- return;
- }
+ Normalizer_ce_ptr = register_class_Normalizer();
+ Normalizer_ce_ptr->create_object = NULL;
}
/* }}} */
diff --git a/ext/intl/php_intl.c b/ext/intl/php_intl.c
index 2b91266e7e..01361ed262 100644
--- a/ext/intl/php_intl.c
+++ b/ext/intl/php_intl.c
@@ -215,7 +215,8 @@ PHP_MINIT_FUNCTION( intl )
spoofchecker_register_constants( INIT_FUNC_ARGS_PASSTHRU );
/* Register 'IntlException' PHP class */
- intl_register_IntlException_class( );
+ IntlException_ce_ptr = register_class_IntlException(zend_ce_exception);
+ IntlException_ce_ptr->create_object = zend_ce_exception->create_object;
/* Register 'IntlIterator' PHP class */
intl_register_IntlIterator_class( );
@@ -224,7 +225,7 @@ PHP_MINIT_FUNCTION( intl )
breakiterator_register_BreakIterator_class( );
/* Register 'IntlPartsIterator' class */
- breakiterator_register_IntlPartsIterator_class( );
+ breakiterator_register_IntlPartsIterator_class();
/* Global error handling. */
intl_error_init( NULL );
diff --git a/ext/intl/php_intl.h b/ext/intl/php_intl.h
index b878371764..4dfb24e96e 100644
--- a/ext/intl/php_intl.h
+++ b/ext/intl/php_intl.h
@@ -50,7 +50,7 @@ ZEND_BEGIN_MODULE_GLOBALS(intl)
UBreakIterator* grapheme_iterator;
intl_error g_error;
zend_long error_level;
- zend_bool use_exceptions;
+ bool use_exceptions;
ZEND_END_MODULE_GLOBALS(intl)
#if defined(ZTS) && defined(COMPILE_DL_INTL)
diff --git a/ext/intl/php_intl.stub.php b/ext/intl/php_intl.stub.php
index 0a388d786d..8b309b2e4b 100644
--- a/ext/intl/php_intl.stub.php
+++ b/ext/intl/php_intl.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class IntlException extends Exception
{
diff --git a/ext/intl/php_intl_arginfo.h b/ext/intl/php_intl_arginfo.h
index f0badd2d79..382f39aa96 100644
--- a/ext/intl/php_intl_arginfo.h
+++ b/ext/intl/php_intl_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 7c89762dffb3a8b4aae51ea823af2494e7dd25d5 */
+ * Stub hash: 9d6b4d36a39e4bb346ea0d45d4be8c941070bd67 */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_intlcal_create_instance, 0, 0, IntlCalendar, 1)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, timezone, "null")
@@ -1170,3 +1170,13 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_IntlException_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_IntlException(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IntlException", class_IntlException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+
+ return class_entry;
+}
diff --git a/ext/intl/resourcebundle/resourcebundle.stub.php b/ext/intl/resourcebundle/resourcebundle.stub.php
index fccd65e3df..c55749b152 100644
--- a/ext/intl/resourcebundle/resourcebundle.stub.php
+++ b/ext/intl/resourcebundle/resourcebundle.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class ResourceBundle implements IteratorAggregate, Countable
{
diff --git a/ext/intl/resourcebundle/resourcebundle_arginfo.h b/ext/intl/resourcebundle/resourcebundle_arginfo.h
index fca8a23104..99468a299a 100644
--- a/ext/intl/resourcebundle/resourcebundle_arginfo.h
+++ b/ext/intl/resourcebundle/resourcebundle_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: ba5e5a57404b44d2be662e9a6b5abb1a44ccfb22 */
+ * Stub hash: 23040d115ab2c1900fa537313f3a7ff4a57b9715 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ResourceBundle___construct, 0, 0, 2)
ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 1)
@@ -50,3 +50,14 @@ static const zend_function_entry class_ResourceBundle_methods[] = {
ZEND_ME(ResourceBundle, getIterator, arginfo_class_ResourceBundle_getIterator, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_ResourceBundle(zend_class_entry *class_entry_IteratorAggregate, zend_class_entry *class_entry_Countable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ResourceBundle", class_ResourceBundle_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 2, class_entry_IteratorAggregate, class_entry_Countable);
+
+ return class_entry;
+}
diff --git a/ext/intl/resourcebundle/resourcebundle_class.c b/ext/intl/resourcebundle/resourcebundle_class.c
index fd763dcf37..a10e1cfd9b 100644
--- a/ext/intl/resourcebundle/resourcebundle_class.c
+++ b/ext/intl/resourcebundle/resourcebundle_class.c
@@ -80,7 +80,7 @@ static int resourcebundle_ctor(INTERNAL_FUNCTION_PARAMETERS)
size_t bundlename_len = 0;
const char *locale;
size_t locale_len = 0;
- zend_bool fallback = 1;
+ bool fallback = 1;
zval *object = return_value;
ResourceBundle_object *rb = Z_INTL_RESOURCEBUNDLE_P( object );
@@ -167,7 +167,7 @@ static void resourcebundle_array_fetch(zend_object *object, zval *offset, zval *
{
int32_t meindex = 0;
char * mekey = NULL;
- zend_bool is_numeric = 0;
+ bool is_numeric = 0;
char *pbuf;
ResourceBundle_object *rb;
@@ -232,7 +232,7 @@ zval *resourcebundle_array_get(zend_object *object, zval *offset, int type, zval
/* {{{ Get resource identified by numerical index or key name. */
PHP_FUNCTION( resourcebundle_get )
{
- zend_bool fallback = 1;
+ bool fallback = 1;
zval * offset;
zval * object;
@@ -366,14 +366,9 @@ PHP_METHOD(ResourceBundle, getIterator) {
*/
void resourcebundle_register_class( void )
{
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY( ce, "ResourceBundle", class_ResourceBundle_methods );
-
- ce.create_object = ResourceBundle_object_create;
- ce.get_iterator = resourcebundle_get_iterator;
-
- ResourceBundle_ce_ptr = zend_register_internal_class( &ce );
+ ResourceBundle_ce_ptr = register_class_ResourceBundle(zend_ce_aggregate, zend_ce_countable);
+ ResourceBundle_ce_ptr->create_object = ResourceBundle_object_create;
+ ResourceBundle_ce_ptr->get_iterator = resourcebundle_get_iterator;
ResourceBundle_object_handlers = std_object_handlers;
ResourceBundle_object_handlers.offset = XtOffsetOf(ResourceBundle_object, zend);
@@ -381,7 +376,5 @@ void resourcebundle_register_class( void )
ResourceBundle_object_handlers.free_obj = ResourceBundle_object_free;
ResourceBundle_object_handlers.read_dimension = resourcebundle_array_get;
ResourceBundle_object_handlers.count_elements = resourcebundle_array_count;
-
- zend_class_implements(ResourceBundle_ce_ptr, 2, zend_ce_aggregate, zend_ce_countable);
}
/* }}} */
diff --git a/ext/intl/resourcebundle/resourcebundle_iterator.h b/ext/intl/resourcebundle/resourcebundle_iterator.h
index fa2e24d848..dc92fa824e 100644
--- a/ext/intl/resourcebundle/resourcebundle_iterator.h
+++ b/ext/intl/resourcebundle/resourcebundle_iterator.h
@@ -22,7 +22,7 @@
typedef struct {
zend_object_iterator intern;
ResourceBundle_object *subject;
- zend_bool is_table;
+ bool is_table;
zend_long length;
zval current;
char *currentkey;
diff --git a/ext/intl/spoofchecker/spoofchecker.stub.php b/ext/intl/spoofchecker/spoofchecker.stub.php
index 4fdd49473c..a1e4948045 100644
--- a/ext/intl/spoofchecker/spoofchecker.stub.php
+++ b/ext/intl/spoofchecker/spoofchecker.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class Spoofchecker
{
diff --git a/ext/intl/spoofchecker/spoofchecker_arginfo.h b/ext/intl/spoofchecker/spoofchecker_arginfo.h
index 6079794fdf..e3d81bf37a 100644
--- a/ext/intl/spoofchecker/spoofchecker_arginfo.h
+++ b/ext/intl/spoofchecker/spoofchecker_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 10c330c8e06dbe21833f9c556b005fde2ea0ab42 */
+ * Stub hash: b0317673c829b873b95aac34d362cd5ad004aca9 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Spoofchecker___construct, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -51,3 +51,13 @@ static const zend_function_entry class_Spoofchecker_methods[] = {
#endif
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Spoofchecker(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Spoofchecker", class_Spoofchecker_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/intl/spoofchecker/spoofchecker_class.c b/ext/intl/spoofchecker/spoofchecker_class.c
index e1c8dc63a1..bbb341cda4 100644
--- a/ext/intl/spoofchecker/spoofchecker_class.c
+++ b/ext/intl/spoofchecker/spoofchecker_class.c
@@ -90,12 +90,9 @@ static zend_object *spoofchecker_clone_obj(zend_object *object) /* {{{ */
*/
void spoofchecker_register_Spoofchecker_class(void)
{
- zend_class_entry ce;
-
/* Create and register 'Spoofchecker' class. */
- INIT_CLASS_ENTRY(ce, "Spoofchecker", class_Spoofchecker_methods);
- ce.create_object = Spoofchecker_object_create;
- Spoofchecker_ce_ptr = zend_register_internal_class(&ce);
+ Spoofchecker_ce_ptr = register_class_Spoofchecker();
+ Spoofchecker_ce_ptr->create_object = Spoofchecker_object_create;
memcpy(&Spoofchecker_handlers, &std_object_handlers,
sizeof Spoofchecker_handlers);
diff --git a/ext/intl/tests/bug48227.phpt b/ext/intl/tests/bug48227.phpt
index 11f89df535..b143a7eda2 100644
--- a/ext/intl/tests/bug48227.phpt
+++ b/ext/intl/tests/bug48227.phpt
@@ -15,8 +15,10 @@ foreach (['', 1, NULL, $x] as $value) {
}
?>
---EXPECT--
+--EXPECTF--
NumberFormatter::format(): Argument #1 ($num) must be of type int|float, string given
string(1) "1"
+
+Deprecated: NumberFormatter::format(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
string(1) "0"
NumberFormatter::format(): Argument #1 ($num) must be of type int|float, NumberFormatter given
diff --git a/ext/intl/tests/bug72241.phpt b/ext/intl/tests/bug72241.phpt
index 05336969e2..c2017d7470 100644
--- a/ext/intl/tests/bug72241.phpt
+++ b/ext/intl/tests/bug72241.phpt
@@ -6,8 +6,7 @@ Bug #72241: get_icu_value_internal out-of-bounds read
<?php
$var1=str_repeat("A", 1000);
$out = locale_get_primary_language($var1);
-echo strlen($out) . PHP_EOL;
-echo unpack('H*', $out)[1] . PHP_EOL;
+var_dump($out);
?>
--EXPECT--
-0
+NULL
diff --git a/ext/intl/tests/collator_compare_variant2.phpt b/ext/intl/tests/collator_compare_variant2.phpt
index 15c725bc4f..9be10e2935 100644
--- a/ext/intl/tests/collator_compare_variant2.phpt
+++ b/ext/intl/tests/collator_compare_variant2.phpt
@@ -71,12 +71,11 @@ function ut_main()
array( 'ab' , 'b' ),
array( 'ab' , 'a' ),
array( 123 , 'abc' ),
- array( 'ac' , null ),
+ array( 'ac' , '' ),
array( '.' , '.' ),
// Try to compare long strings.
array( 'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcde',
'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdea'),
- array( null , null )
);
$res_str .= compare_pairs( 'en_US', $test_params );
@@ -91,7 +90,7 @@ function ut_main()
array( 'а', 'b' ),
array( 'а', 'bb' ),
array( 'а', 'ab' ),
- array( 'а', null )
+ array( 'а', '' )
);
$res_str .= compare_pairs( 'ru_RU', $test_params );
@@ -120,10 +119,9 @@ ut_run();
'ab' < 'b'
'ab' > 'a'
123 < 'abc'
-'ac' > NULL
+'ac' > ''
'.' = '.'
'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcde' < 'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdea'
-NULL = NULL
'а' < 'б'
'а' < 'аа'
'аб' < 'ба'
@@ -131,5 +129,5 @@ NULL = NULL
'а' < 'b'
'а' < 'bb'
'а' < 'ab'
-'а' > NULL
+'а' > ''
'y' < 'k'
diff --git a/ext/intl/tests/collator_get_sort_key_variant7.phpt b/ext/intl/tests/collator_get_sort_key_variant7.phpt
index 8ac0154d4f..12dd66aece 100644
--- a/ext/intl/tests/collator_get_sort_key_variant7.phpt
+++ b/ext/intl/tests/collator_get_sort_key_variant7.phpt
@@ -33,7 +33,7 @@ function ut_main()
$test_params = array(
'abc', 'abd', 'aaa',
'аа', 'а', 'z',
- '', null , '3',
+ '', '3',
'y' , 'i' , 'k'
);
@@ -70,8 +70,6 @@ source: z
key: 5c01050105
source:
key: 0101
-source:
-key: 0101
source: 3
key: 1901050105
source: y
diff --git a/ext/intl/tests/formatter_fail.phpt b/ext/intl/tests/formatter_fail.phpt
index 937a52f098..1d9ca34128 100644
--- a/ext/intl/tests/formatter_fail.phpt
+++ b/ext/intl/tests/formatter_fail.phpt
@@ -107,6 +107,18 @@ ArgumentCountError: NumberFormatter::create() expects at least 2 arguments, 0 gi
Error: NumberFormatter object is already constructed in %s on line %d
'U_ZERO_ERROR'
+Deprecated: NumberFormatter::__construct(): Passing null to parameter #1 ($locale) of type string is deprecated in %s on line %d
+
+Deprecated: NumberFormatter::__construct(): Passing null to parameter #2 ($style) of type int is deprecated in %s on line %d
+
+Deprecated: NumberFormatter::create(): Passing null to parameter #1 ($locale) of type string is deprecated in %s on line %d
+
+Deprecated: NumberFormatter::create(): Passing null to parameter #2 ($style) of type int is deprecated in %s on line %d
+
+Deprecated: numfmt_create(): Passing null to parameter #1 ($locale) of type string is deprecated in %s on line %d
+
+Deprecated: numfmt_create(): Passing null to parameter #2 ($style) of type int is deprecated in %s on line %d
+
IntlException: Constructor failed in %s on line %d
'numfmt_create: number formatter creation failed: U_UNSUPPORTED_ERROR'
'numfmt_create: number formatter creation failed: U_UNSUPPORTED_ERROR'
diff --git a/ext/intl/tests/gregoriancalendar___construct_error.phpt b/ext/intl/tests/gregoriancalendar___construct_error.phpt
index 2bc87c723d..4ddcca3228 100644
--- a/ext/intl/tests/gregoriancalendar___construct_error.phpt
+++ b/ext/intl/tests/gregoriancalendar___construct_error.phpt
@@ -29,7 +29,7 @@ try {
echo $e->getMessage(), "\n";
}
try {
- var_dump(new IntlGregorianCalendar(1,2,3,4,NULL,array()));
+ var_dump(new IntlGregorianCalendar(1,2,3,4,5,array()));
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
}
diff --git a/ext/intl/tests/gregoriancalendar___construct_variant1.phpt b/ext/intl/tests/gregoriancalendar___construct_variant1.phpt
index 22dae52d77..1a225fe620 100644
--- a/ext/intl/tests/gregoriancalendar___construct_variant1.phpt
+++ b/ext/intl/tests/gregoriancalendar___construct_variant1.phpt
@@ -10,7 +10,7 @@ ini_set("intl.error_level", E_WARNING);
date_default_timezone_set('Europe/Amsterdam');
-$intlcal = intlgregcal_create_instance(2012, 1, 29, 16, 0, NULL);
+$intlcal = intlgregcal_create_instance(2012, 1, 29, 16, 0, 0);
var_dump($intlcal->getTimeZone()->getId());
var_dump($intlcal->getTime(), (float)strtotime('2012-02-29 16:00:00') * 1000);
diff --git a/ext/intl/tests/msgfmt_fail2.phpt b/ext/intl/tests/msgfmt_fail2.phpt
index f604de0727..8823e36a6f 100644
--- a/ext/intl/tests/msgfmt_fail2.phpt
+++ b/ext/intl/tests/msgfmt_fail2.phpt
@@ -126,9 +126,21 @@ ArgumentCountError: msgfmt_create() expects exactly 2 arguments, 1 given in %s o
ArgumentCountError: MessageFormatter::create() expects exactly 2 arguments, 1 given in %s on line %d
'U_ZERO_ERROR'
+Deprecated: MessageFormatter::__construct(): Passing null to parameter #1 ($locale) of type string is deprecated in %s on line %d
+
+Deprecated: MessageFormatter::__construct(): Passing null to parameter #2 ($pattern) of type string is deprecated in %s on line %d
+
IntlException: msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR in %s on line %d
'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
+
+Deprecated: MessageFormatter::create(): Passing null to parameter #1 ($locale) of type string is deprecated in %s on line %d
+
+Deprecated: MessageFormatter::create(): Passing null to parameter #2 ($pattern) of type string is deprecated in %s on line %d
'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
+
+Deprecated: msgfmt_create(): Passing null to parameter #1 ($locale) of type string is deprecated in %s on line %d
+
+Deprecated: msgfmt_create(): Passing null to parameter #2 ($pattern) of type string is deprecated in %s on line %d
'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
IntlException: msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR in %s on line %d
diff --git a/ext/intl/tests/ut_common.inc b/ext/intl/tests/ut_common.inc
index 4a2675b01f..fdc013dea4 100644
--- a/ext/intl/tests/ut_common.inc
+++ b/ext/intl/tests/ut_common.inc
@@ -142,7 +142,7 @@ function ut_nfmt_create( $locale, $style, $pattern = null )
return numfmt_create( $locale, $style, $pattern );
}
}
-function ut_nfmt_format( $fmt, $number, $type = null )
+function ut_nfmt_format( $fmt, $number, $type = NumberFormatter::TYPE_DEFAULT )
{
return $GLOBALS['oo-mode'] ? $fmt->format( $number, $type ) : numfmt_format( $fmt, $number, $type );
}
diff --git a/ext/intl/timezone/timezone.stub.php b/ext/intl/timezone/timezone.stub.php
index 60ec7524a6..e8d46bde87 100644
--- a/ext/intl/timezone/timezone.stub.php
+++ b/ext/intl/timezone/timezone.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class IntlTimeZone
{
diff --git a/ext/intl/timezone/timezone_arginfo.h b/ext/intl/timezone/timezone_arginfo.h
index f59fd9024b..da54bf3c3a 100644
--- a/ext/intl/timezone/timezone_arginfo.h
+++ b/ext/intl/timezone/timezone_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: afd0e74b29d54cde9789787b924af9b43539a7f4 */
+ * Stub hash: 02045a0de09413796dd1ca7495b0b1beff14a074 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlTimeZone___construct, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -152,3 +152,13 @@ static const zend_function_entry class_IntlTimeZone_methods[] = {
ZEND_ME_MAPPING(useDaylightTime, intltz_use_daylight_time, arginfo_class_IntlTimeZone_useDaylightTime, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_IntlTimeZone(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IntlTimeZone", class_IntlTimeZone_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/intl/timezone/timezone_class.cpp b/ext/intl/timezone/timezone_class.cpp
index f5749fd621..13e691ad97 100644
--- a/ext/intl/timezone/timezone_class.cpp
+++ b/ext/intl/timezone/timezone_class.cpp
@@ -396,18 +396,9 @@ static zend_object *TimeZone_object_create(zend_class_entry *ce)
*/
U_CFUNC void timezone_register_IntlTimeZone_class(void)
{
- zend_class_entry ce;
-
/* Create and register 'IntlTimeZone' class. */
- INIT_CLASS_ENTRY(ce, "IntlTimeZone", class_IntlTimeZone_methods);
- ce.create_object = TimeZone_object_create;
- TimeZone_ce_ptr = zend_register_internal_class(&ce);
- if (!TimeZone_ce_ptr) {
- //can't happen now without bigger problems before
- php_error_docref(NULL, E_ERROR,
- "IntlTimeZone: class registration has failed.");
- return;
- }
+ TimeZone_ce_ptr = register_class_IntlTimeZone();
+ TimeZone_ce_ptr->create_object = TimeZone_object_create;
memcpy(&TimeZone_handlers, &std_object_handlers,
sizeof TimeZone_handlers);
diff --git a/ext/intl/timezone/timezone_class.h b/ext/intl/timezone/timezone_class.h
index 8fe4524415..3d5f04008a 100644
--- a/ext/intl/timezone/timezone_class.h
+++ b/ext/intl/timezone/timezone_class.h
@@ -39,7 +39,7 @@ typedef struct {
const TimeZone *utimezone;
//whether to delete the timezone on object free
- zend_bool should_delete;
+ bool should_delete;
zend_object zo;
} TimeZone_object;
diff --git a/ext/intl/timezone/timezone_methods.cpp b/ext/intl/timezone/timezone_methods.cpp
index 3a2d28ada6..6b48d4f8ee 100644
--- a/ext/intl/timezone/timezone_methods.cpp
+++ b/ext/intl/timezone/timezone_methods.cpp
@@ -158,7 +158,7 @@ int_offset:
}
} else if (Z_TYPE_P(arg) == IS_DOUBLE) {
double_offset:
- convert_to_long_ex(arg);
+ convert_to_long(arg);
goto int_offset;
} else if (Z_TYPE_P(arg) == IS_OBJECT || Z_TYPE_P(arg) == IS_STRING) {
zend_long lval;
@@ -224,7 +224,7 @@ U_CFUNC PHP_FUNCTION(intltz_create_time_zone_id_enumeration)
size_t region_len = 0;
int32_t offset,
*offsetp = NULL;
- zend_bool arg3isnull = 1;
+ bool arg3isnull = 1;
intl_error_reset(NULL);
@@ -411,7 +411,7 @@ U_CFUNC PHP_FUNCTION(intltz_use_daylight_time)
U_CFUNC PHP_FUNCTION(intltz_get_offset)
{
double date;
- zend_bool local;
+ bool local;
zval *rawOffsetArg,
*dstOffsetArg;
int32_t rawOffset,
@@ -484,7 +484,7 @@ static const TimeZone::EDisplayType display_types[] = {
U_CFUNC PHP_FUNCTION(intltz_get_display_name)
{
- zend_bool daylight = 0;
+ bool daylight = 0;
zend_long display_type = TimeZone::LONG;
const char *locale_str = NULL;
size_t dummy = 0;
diff --git a/ext/intl/transliterator/transliterator.stub.php b/ext/intl/transliterator/transliterator.stub.php
index c14a4cf0c0..e8e147ac8e 100644
--- a/ext/intl/transliterator/transliterator.stub.php
+++ b/ext/intl/transliterator/transliterator.stub.php
@@ -1,9 +1,11 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class Transliterator
{
+ public string $id;
+
final private function __construct() {}
/**
diff --git a/ext/intl/transliterator/transliterator_arginfo.h b/ext/intl/transliterator/transliterator_arginfo.h
index 406a086293..94318cb3b7 100644
--- a/ext/intl/transliterator/transliterator_arginfo.h
+++ b/ext/intl/transliterator/transliterator_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 4bcb458de884a68797bee28339399fb8c8664605 */
+ * Stub hash: c34871965e0d58bb15beda1787b7cdd0754bb28f */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Transliterator___construct, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -50,3 +50,19 @@ static const zend_function_entry class_Transliterator_methods[] = {
ZEND_ME_MAPPING(getErrorMessage, transliterator_get_error_message, arginfo_class_Transliterator_getErrorMessage, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Transliterator(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Transliterator", class_Transliterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ zval property_id_default_value;
+ ZVAL_UNDEF(&property_id_default_value);
+ zend_string *property_id_name = zend_string_init("id", sizeof("id") - 1, 1);
+ zend_declare_typed_property(class_entry, property_id_name, &property_id_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_id_name);
+
+ return class_entry;
+}
diff --git a/ext/intl/transliterator/transliterator_class.c b/ext/intl/transliterator/transliterator_class.c
index e444f0eef4..0ca4fda755 100644
--- a/ext/intl/transliterator/transliterator_class.c
+++ b/ext/intl/transliterator/transliterator_class.c
@@ -189,19 +189,10 @@ err:
/* {{{ get_property_ptr_ptr handler */
static zval *Transliterator_get_property_ptr_ptr( zend_object *object, zend_string *name, int type, void **cache_slot )
{
- zval *retval;
-
- if(zend_binary_strcmp( "id", sizeof( "id" ) - 1,
- ZSTR_VAL( name ), ZSTR_LEN( name ) ) == 0 )
- {
- retval = NULL; /* fallback to read_property */
- }
- else
- {
- retval = zend_std_get_property_ptr_ptr( object, name, type, cache_slot );
+ if (zend_string_equals_literal(name, "id")) {
+ return NULL; /* fallback to read_property */
}
-
- return retval;
+ return zend_std_get_property_ptr_ptr( object, name, type, cache_slot );
}
/* }}} */
@@ -210,15 +201,10 @@ static zval *Transliterator_read_property( zend_object *object, zend_string *nam
{
zval *retval;
- if( ( type != BP_VAR_R && type != BP_VAR_IS ) &&
- ( zend_binary_strcmp( "id", sizeof( "id" ) - 1,
- ZSTR_VAL( name ), ZSTR_LEN( name ) ) == 0 ) )
- {
+ if ((type != BP_VAR_R && type != BP_VAR_IS) && zend_string_equals_literal(name, "id")) {
zend_throw_error(NULL, "Transliterator::$id is read-only");
retval = &EG( uninitialized_zval );
- }
- else
- {
+ } else {
retval = zend_std_read_property( object, name, type, cache_slot, rv );
}
@@ -238,14 +224,9 @@ static zval *Transliterator_write_property( zend_object *object, zend_string *na
} else {
scope = zend_get_executed_scope();
}
- if( ( scope != Transliterator_ce_ptr ) &&
- ( zend_binary_strcmp( "id", sizeof( "id" ) - 1,
- ZSTR_VAL( name ), ZSTR_LEN( name ) ) == 0 ) )
- {
+ if ((scope != Transliterator_ce_ptr) && zend_string_equals_literal(name, "id")) {
zend_throw_error(NULL, "Transliterator::$id is read-only");
- }
- else
- {
+ } else {
value = zend_std_write_property( object, name, value, cache_slot );
}
@@ -258,14 +239,10 @@ static zval *Transliterator_write_property( zend_object *object, zend_string *na
*/
void transliterator_register_Transliterator_class( void )
{
- zend_class_entry ce;
-
/* Create and register 'Transliterator' class. */
- INIT_CLASS_ENTRY( ce, "Transliterator", class_Transliterator_methods );
- ce.create_object = Transliterator_object_create;
- Transliterator_ce_ptr = zend_register_internal_class( &ce );
- memcpy( &Transliterator_handlers, &std_object_handlers,
- sizeof Transliterator_handlers );
+ Transliterator_ce_ptr = register_class_Transliterator();
+ Transliterator_ce_ptr->create_object = Transliterator_object_create;
+ memcpy( &Transliterator_handlers, &std_object_handlers, sizeof Transliterator_handlers );
Transliterator_handlers.offset = XtOffsetOf(Transliterator_object, zo);
Transliterator_handlers.free_obj = Transliterator_objects_free;
Transliterator_handlers.clone_obj = Transliterator_clone_obj;
@@ -273,17 +250,6 @@ void transliterator_register_Transliterator_class( void )
Transliterator_handlers.read_property = Transliterator_read_property;
Transliterator_handlers.write_property = Transliterator_write_property;
- /* Declare 'Transliterator' class properties */
- if( !Transliterator_ce_ptr )
- {
- zend_error( E_ERROR,
- "Transliterator: attempt to create properties "
- "on a non-registered class." );
- return;
- }
- zend_declare_property_null( Transliterator_ce_ptr,
- "id", sizeof( "id" ) - 1, ZEND_ACC_PUBLIC );
-
/* constants are declared in transliterator_register_constants, called from MINIT */
}
diff --git a/ext/intl/uchar/uchar.c b/ext/intl/uchar/uchar.c
index 0f44b454b4..ee90007546 100644
--- a/ext/intl/uchar/uchar.c
+++ b/ext/intl/uchar/uchar.c
@@ -612,10 +612,9 @@ IC_CHAR_METHOD_CHAR(getBidiPairedBracket)
/* }}} */
int php_uchar_minit(INIT_FUNC_ARGS) {
- zend_class_entry tmp, *ce;
+ zend_class_entry *ce;
- INIT_CLASS_ENTRY(tmp, "IntlChar", class_IntlChar_methods);
- ce = zend_register_internal_class(&tmp);
+ ce = register_class_IntlChar();
#define IC_CONSTL(name, val) \
zend_declare_class_constant_long(ce, name, strlen(name), val);
diff --git a/ext/intl/uchar/uchar.stub.php b/ext/intl/uchar/uchar.stub.php
index f3ebd78bcb..2bb667e44e 100644
--- a/ext/intl/uchar/uchar.stub.php
+++ b/ext/intl/uchar/uchar.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class IntlChar
{
diff --git a/ext/intl/uchar/uchar_arginfo.h b/ext/intl/uchar/uchar_arginfo.h
index c4e22cd767..680e336bfb 100644
--- a/ext/intl/uchar/uchar_arginfo.h
+++ b/ext/intl/uchar/uchar_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 05ea5d884642e75721f90728fb24b7ad5ce46897 */
+ * Stub hash: 65836ce6bd16316bb022bc75ce5e2fbbdd1880b7 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlChar_hasBinaryProperty, 0, 0, 2)
ZEND_ARG_TYPE_MASK(0, codepoint, MAY_BE_LONG|MAY_BE_STRING, NULL)
@@ -295,3 +295,13 @@ static const zend_function_entry class_IntlChar_methods[] = {
ZEND_ME(IntlChar, toupper, arginfo_class_IntlChar_toupper, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_IntlChar(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IntlChar", class_IntlChar_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/json/json.c b/ext/json/json.c
index df46294cd6..d8e17ef9da 100644
--- a/ext/json/json.c
+++ b/ext/json/json.c
@@ -44,13 +44,9 @@ PHP_JSON_API ZEND_DECLARE_MODULE_GLOBALS(json)
/* {{{ MINIT */
static PHP_MINIT_FUNCTION(json)
{
- zend_class_entry ce;
+ php_json_serializable_ce = register_class_JsonSerializable();
- INIT_CLASS_ENTRY(ce, "JsonSerializable", class_JsonSerializable_methods);
- php_json_serializable_ce = zend_register_internal_interface(&ce);
-
- INIT_CLASS_ENTRY(ce, "JsonException", NULL);
- php_json_exception_ce = zend_register_internal_class_ex(&ce, zend_ce_exception);
+ php_json_exception_ce = register_class_JsonException(zend_ce_exception);
/* options for json_encode */
PHP_JSON_REGISTER_CONSTANT("JSON_HEX_TAG", PHP_JSON_HEX_TAG);
@@ -191,6 +187,8 @@ static const char *php_json_get_error_msg(php_json_error_code error_code) /* {{{
return "The decoded property name is invalid";
case PHP_JSON_ERROR_UTF16:
return "Single unpaired UTF-16 surrogate in unicode escape";
+ case PHP_JSON_ERROR_NON_BACKED_ENUM:
+ return "Non-backed enums have no default serialization";
default:
return "Unknown error";
}
@@ -265,15 +263,15 @@ PHP_FUNCTION(json_decode)
{
char *str;
size_t str_len;
- zend_bool assoc = 0; /* return JS objects as PHP objects by default */
- zend_bool assoc_null = 1;
+ bool assoc = 0; /* return JS objects as PHP objects by default */
+ bool assoc_null = 1;
zend_long depth = PHP_JSON_PARSER_DEFAULT_DEPTH;
zend_long options = 0;
ZEND_PARSE_PARAMETERS_START(1, 4)
Z_PARAM_STRING(str, str_len)
Z_PARAM_OPTIONAL
- Z_PARAM_BOOL_EX(assoc, assoc_null, 1, 0)
+ Z_PARAM_BOOL_OR_NULL(assoc, assoc_null)
Z_PARAM_LONG(depth)
Z_PARAM_LONG(options)
ZEND_PARSE_PARAMETERS_END();
diff --git a/ext/json/json.stub.php b/ext/json/json.stub.php
index 55cc9068bf..5b0d72cef2 100644
--- a/ext/json/json.stub.php
+++ b/ext/json/json.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function json_encode(mixed $value, int $flags = 0, int $depth = 512): string|false {}
diff --git a/ext/json/json_arginfo.h b/ext/json/json_arginfo.h
index ded4bf663e..ee8954c3ed 100644
--- a/ext/json/json_arginfo.h
+++ b/ext/json/json_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 200044f4196cd8efd1ec9a2e93d4bbb63618b3c9 */
+ * Stub hash: 6dcef13e46c3dfc2546d3ccc38da07e6c009bbe5 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_json_encode, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
@@ -48,3 +48,23 @@ static const zend_function_entry class_JsonSerializable_methods[] = {
static const zend_function_entry class_JsonException_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_JsonSerializable(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "JsonSerializable", class_JsonSerializable_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_JsonException(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "JsonException", class_JsonException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+
+ return class_entry;
+}
diff --git a/ext/json/json_encoder.c b/ext/json/json_encoder.c
index 92e4a10933..c76ddaf0fd 100644
--- a/ext/json/json_encoder.c
+++ b/ext/json/json_encoder.c
@@ -27,6 +27,7 @@
#include "php_json.h"
#include "php_json_encoder.h"
#include <zend_exceptions.h>
+#include "zend_enum.h"
static const char digits[] = "0123456789abcdef";
@@ -36,29 +37,10 @@ static int php_json_escape_string(
static int php_json_determine_array_type(zval *val) /* {{{ */
{
- int i;
- HashTable *myht = Z_ARRVAL_P(val);
-
- i = myht ? zend_hash_num_elements(myht) : 0;
- if (i > 0) {
- zend_string *key;
- zend_ulong index, idx;
+ zend_array *myht = Z_ARRVAL_P(val);
- if (HT_IS_PACKED(myht) && HT_IS_WITHOUT_HOLES(myht)) {
- return PHP_JSON_OUTPUT_ARRAY;
- }
-
- idx = 0;
- ZEND_HASH_FOREACH_KEY(myht, index, key) {
- if (key) {
- return PHP_JSON_OUTPUT_OBJECT;
- } else {
- if (index != idx) {
- return PHP_JSON_OUTPUT_OBJECT;
- }
- }
- idx++;
- } ZEND_HASH_FOREACH_END();
+ if (myht) {
+ return zend_array_is_list(myht) ? PHP_JSON_OUTPUT_ARRAY : PHP_JSON_OUTPUT_OBJECT;
}
return PHP_JSON_OUTPUT_ARRAY;
@@ -134,6 +116,67 @@ static int php_json_encode_array(smart_str *buf, zval *val, int options, php_jso
myht = Z_ARRVAL_P(val);
prop_ht = NULL;
r = (options & PHP_JSON_FORCE_OBJECT) ? PHP_JSON_OUTPUT_OBJECT : php_json_determine_array_type(val);
+ } else if (Z_OBJ_P(val)->properties == NULL
+ && Z_OBJ_HT_P(val)->get_properties_for == NULL
+ && Z_OBJ_HT_P(val)->get_properties == zend_std_get_properties) {
+ /* Optimized version without rebulding properties HashTable */
+ zend_object *obj = Z_OBJ_P(val);
+ zend_class_entry *ce = obj->ce;
+ zend_property_info *prop_info;
+ zval *prop;
+ int i;
+
+ if (GC_IS_RECURSIVE(obj)) {
+ encoder->error_code = PHP_JSON_ERROR_RECURSION;
+ smart_str_appendl(buf, "null", 4);
+ return FAILURE;
+ }
+
+ PHP_JSON_HASH_PROTECT_RECURSION(obj);
+ smart_str_appendc(buf, '{');
+ for (i = 0; i < ce->default_properties_count; i++) {
+ prop_info = ce->properties_info_table[i];
+ if (!prop_info) {
+ continue;
+ }
+ if (ZSTR_VAL(prop_info->name)[0] == '\0' && ZSTR_LEN(prop_info->name) > 0) {
+ /* Skip protected and private members. */
+ continue;
+ }
+ prop = OBJ_PROP(obj, prop_info->offset);
+ if (Z_TYPE_P(prop) == IS_UNDEF) {
+ continue;
+ }
+
+ if (need_comma) {
+ smart_str_appendc(buf, ',');
+ } else {
+ need_comma = 1;
+ }
+
+ php_json_pretty_print_char(buf, options, '\n');
+ php_json_pretty_print_indent(buf, options, encoder);
+
+ if (php_json_escape_string(buf, ZSTR_VAL(prop_info->name), ZSTR_LEN(prop_info->name),
+ options & ~PHP_JSON_NUMERIC_CHECK, encoder) == FAILURE &&
+ (options & PHP_JSON_PARTIAL_OUTPUT_ON_ERROR) &&
+ buf->s) {
+ ZSTR_LEN(buf->s) -= 4;
+ smart_str_appendl(buf, "\"\"", 2);
+ }
+
+ smart_str_appendc(buf, ':');
+ php_json_pretty_print_char(buf, options, ' ');
+
+ if (php_json_encode_zval(buf, prop, options, encoder) == FAILURE &&
+ !(options & PHP_JSON_PARTIAL_OUTPUT_ON_ERROR)) {
+ PHP_JSON_HASH_UNPROTECT_RECURSION(obj);
+ return FAILURE;
+ }
+ }
+ smart_str_appendc(buf, '}');
+ PHP_JSON_HASH_UNPROTECT_RECURSION(obj);
+ return SUCCESS;
} else {
prop_ht = myht = zend_get_properties_for(val, ZEND_PROP_PURPOSE_JSON);
r = PHP_JSON_OUTPUT_OBJECT;
@@ -528,6 +571,19 @@ static int php_json_encode_serializable_object(smart_str *buf, zval *val, int op
}
/* }}} */
+static int php_json_encode_serializable_enum(smart_str *buf, zval *val, int options, php_json_encoder *encoder)
+{
+ zend_class_entry *ce = Z_OBJCE_P(val);
+ if (ce->enum_backing_type == IS_UNDEF) {
+ encoder->error_code = PHP_JSON_ERROR_NON_BACKED_ENUM;
+ smart_str_appendc(buf, '0');
+ return FAILURE;
+ }
+
+ zval *value_zv = zend_enum_fetch_case_value(Z_OBJ_P(val));
+ return php_json_encode_zval(buf, value_zv, options, encoder);
+}
+
int php_json_encode_zval(smart_str *buf, zval *val, int options, php_json_encoder *encoder) /* {{{ */
{
again:
@@ -564,6 +620,9 @@ again:
if (instanceof_function(Z_OBJCE_P(val), php_json_serializable_ce)) {
return php_json_encode_serializable_object(buf, val, options, encoder);
}
+ if (Z_OBJCE_P(val)->ce_flags & ZEND_ACC_ENUM) {
+ return php_json_encode_serializable_enum(buf, val, options, encoder);
+ }
/* fallthrough -- Non-serializable object */
case IS_ARRAY: {
/* Avoid modifications (and potential freeing) of the array through a reference when a
diff --git a/ext/json/json_scanner.re b/ext/json/json_scanner.re
index 03ccdde58b..c8e3e0ebf5 100644
--- a/ext/json/json_scanner.re
+++ b/ext/json/json_scanner.re
@@ -168,7 +168,7 @@ std:
return PHP_JSON_T_FALSE;
}
<JS>INT {
- zend_bool bigint = 0, negative = s->token[0] == '-';
+ bool bigint = 0, negative = s->token[0] == '-';
size_t digits = (size_t) (s->cursor - s->token - negative);
if (digits >= PHP_JSON_INT_MAX_LENGTH) {
if (digits == PHP_JSON_INT_MAX_LENGTH) {
diff --git a/ext/json/php_json.h b/ext/json/php_json.h
index ee8affa1d1..7d258805b2 100644
--- a/ext/json/php_json.h
+++ b/ext/json/php_json.h
@@ -50,7 +50,8 @@ typedef enum {
PHP_JSON_ERROR_INF_OR_NAN,
PHP_JSON_ERROR_UNSUPPORTED_TYPE,
PHP_JSON_ERROR_INVALID_PROPERTY_NAME,
- PHP_JSON_ERROR_UTF16
+ PHP_JSON_ERROR_UTF16,
+ PHP_JSON_ERROR_NON_BACKED_ENUM,
} php_json_error_code;
/* json_decode() options */
@@ -100,7 +101,7 @@ PHP_JSON_API int php_json_encode_ex(smart_str *buf, zval *val, int options, zend
PHP_JSON_API int php_json_encode(smart_str *buf, zval *val, int options);
PHP_JSON_API int php_json_decode_ex(zval *return_value, const char *str, size_t str_len, zend_long options, zend_long depth);
-static inline int php_json_decode(zval *return_value, const char *str, int str_len, zend_bool assoc, zend_long depth)
+static inline int php_json_decode(zval *return_value, const char *str, int str_len, bool assoc, zend_long depth)
{
return php_json_decode_ex(return_value, str, str_len, assoc ? PHP_JSON_OBJECT_AS_ARRAY : 0, depth);
}
diff --git a/ext/json/tests/001.phpt b/ext/json/tests/001.phpt
index b7e6003ac5..12ff6c15ef 100644
--- a/ext/json/tests/001.phpt
+++ b/ext/json/tests/001.phpt
@@ -31,6 +31,8 @@ NULL
NULL
NULL
NULL
+
+Deprecated: json_decode(): Passing null to parameter #1 ($json) of type string is deprecated in %s on line %d
NULL
object(stdClass)#%d (1) {
["test"]=>
diff --git a/ext/json/tests/bug69187.phpt b/ext/json/tests/bug69187.phpt
index b7d7deafc6..4d076c4b50 100644
--- a/ext/json/tests/bug69187.phpt
+++ b/ext/json/tests/bug69187.phpt
@@ -2,8 +2,6 @@
Bug #69187 json_last_error return BC in PHP7
--FILE--
<?php
-var_dump(json_decode(NULL));
-var_dump(json_last_error());
var_dump(json_decode(FALSE));
var_dump(json_last_error());
var_dump(json_decode(""));
@@ -33,8 +31,6 @@ NULL
int(4)
NULL
int(4)
-NULL
-int(4)
int(0)
int(0)
int(1)
diff --git a/ext/json/tests/bug72069.phpt b/ext/json/tests/bug72069.phpt
index 500df25af7..a37aa38ea1 100644
--- a/ext/json/tests/bug72069.phpt
+++ b/ext/json/tests/bug72069.phpt
@@ -3,14 +3,14 @@ Bug #72069 (Behavior \JsonSerializable different from json_encode)
--FILE--
<?php
-$result = json_encode(['end' => json_decode(null, true)]);
+$result = json_encode(['end' => json_decode('', true)]);
var_dump($result);
class A implements \JsonSerializable
{
function jsonSerialize()
{
- return ['end' => json_decode(null, true)];
+ return ['end' => json_decode('', true)];
}
}
$a = new A();
diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c
index c4dfe0c5b0..5108d68b4e 100644
--- a/ext/ldap/ldap.c
+++ b/ext/ldap/ldap.c
@@ -34,6 +34,7 @@
#include "ext/standard/dl.h"
#include "php_ldap.h"
#include "ldap_arginfo.h"
+#include "Zend/zend_interfaces.h"
#ifdef PHP_WIN32
#include <string.h>
@@ -75,18 +76,26 @@ typedef struct {
#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
zval rebindproc;
#endif
+ zend_object std;
} ldap_linkdata;
typedef struct {
+ LDAPMessage *result;
+ zend_object std;
+} ldap_resultdata;
+
+typedef struct {
LDAPMessage *data;
BerElement *ber;
zval res;
-} ldap_resultentry;
+ zend_object std;
+} ldap_result_entry;
ZEND_DECLARE_MODULE_GLOBALS(ldap)
static PHP_GINIT_FUNCTION(ldap);
-static int le_link, le_result, le_result_entry;
+static zend_class_entry *ldap_link_ce, *ldap_result_ce, *ldap_result_entry_ce;
+static zend_object_handlers ldap_link_object_handlers, ldap_result_object_handlers, ldap_result_entry_object_handlers;
#ifdef COMPILE_DL_LDAP
#ifdef ZTS
@@ -95,42 +104,139 @@ ZEND_TSRMLS_CACHE_DEFINE()
ZEND_GET_MODULE(ldap)
#endif
-static void _close_ldap_link(zend_resource *rsrc) /* {{{ */
-{
- ldap_linkdata *ld = (ldap_linkdata *)rsrc->ptr;
+static inline ldap_linkdata *ldap_link_from_obj(zend_object *obj) {
+ return (ldap_linkdata *)((char *)(obj) - XtOffsetOf(ldap_linkdata, std));
+}
+
+#define Z_LDAP_LINK_P(zv) ldap_link_from_obj(Z_OBJ_P(zv))
+
+static zend_object *ldap_link_create_object(zend_class_entry *class_type) {
+ ldap_linkdata *intern = zend_object_alloc(sizeof(ldap_linkdata), class_type);
+
+ zend_object_std_init(&intern->std, class_type);
+ object_properties_init(&intern->std, class_type);
+ intern->std.handlers = &ldap_link_object_handlers;
+
+ return &intern->std;
+}
+
+static zend_function *ldap_link_get_constructor(zend_object *object) {
+ zend_throw_error(NULL, "Cannot directly construct LDAP, use ldap_create() instead");
+ return NULL;
+}
+static void ldap_link_free(ldap_linkdata *ld)
+{
/* We use ldap_destroy rather than ldap_unbind here, because ldap_unbind
* will skip the destructor entirely if a critical client control is set. */
ldap_destroy(ld->link);
+ ld->link = NULL;
#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
zval_ptr_dtor(&ld->rebindproc);
#endif
- efree(ld);
LDAPG(num_links)--;
}
-/* }}} */
-static void _free_ldap_result(zend_resource *rsrc) /* {{{ */
+static void ldap_link_free_obj(zend_object *obj)
{
- LDAPMessage *result = (LDAPMessage *)rsrc->ptr;
- ldap_msgfree(result);
+ ldap_linkdata *ld = ldap_link_from_obj(obj);
+
+ if (ld->link) {
+ ldap_link_free(ld);
+ }
+
+ zend_object_std_dtor(&ld->std);
}
-/* }}} */
-static void _free_ldap_result_entry(zend_resource *rsrc) /* {{{ */
+static inline ldap_resultdata *ldap_result_from_obj(zend_object *obj) {
+ return (ldap_resultdata *)((char *)(obj) - XtOffsetOf(ldap_resultdata, std));
+}
+
+#define Z_LDAP_RESULT_P(zv) ldap_result_from_obj(Z_OBJ_P(zv))
+
+static zend_object *ldap_result_create_object(zend_class_entry *class_type) {
+ ldap_resultdata *intern = zend_object_alloc(sizeof(ldap_resultdata), class_type);
+
+ zend_object_std_init(&intern->std, class_type);
+ object_properties_init(&intern->std, class_type);
+ intern->std.handlers = &ldap_result_object_handlers;
+
+ return &intern->std;
+}
+
+static zend_function *ldap_result_get_constructor(zend_object *object) {
+ zend_throw_error(NULL, "Cannot directly construct LDAPResult, use the dedicated functions instead");
+ return NULL;
+}
+
+static void ldap_result_free(ldap_resultdata *result)
{
- ldap_resultentry *entry = (ldap_resultentry *)rsrc->ptr;
+ ldap_msgfree(result->result);
+ result->result = NULL;
+}
+
+static void ldap_result_free_obj(zend_object *obj)
+{
+ ldap_resultdata *result = ldap_result_from_obj(obj);
+
+ if (result->result) {
+ ldap_result_free(result);
+ }
+
+ zend_object_std_dtor(&result->std);
+}
+
+static inline ldap_result_entry *ldap_result_entry_from_obj(zend_object *obj) {
+ return (ldap_result_entry *)((char *)(obj) - XtOffsetOf(ldap_result_entry, std));
+}
+
+#define Z_LDAP_RESULT_ENTRY_P(zv) ldap_result_entry_from_obj(Z_OBJ_P(zv))
+
+static zend_object *ldap_result_entry_create_object(zend_class_entry *class_type) {
+ ldap_result_entry *intern = zend_object_alloc(sizeof(ldap_result_entry), class_type);
+
+ zend_object_std_init(&intern->std, class_type);
+ object_properties_init(&intern->std, class_type);
+ intern->std.handlers = &ldap_result_entry_object_handlers;
+
+ return &intern->std;
+}
+
+static zend_function *ldap_result_entry_get_constructor(zend_object *obj) {
+ zend_throw_error(NULL, "Cannot directly construct LDAPResultEntry, use the dedicated functions instead");
+ return NULL;
+}
+
+static void ldap_result_entry_free_obj(zend_object *obj)
+{
+ ldap_result_entry *entry = ldap_result_entry_from_obj(obj);
if (entry->ber != NULL) {
ber_free(entry->ber, 0);
entry->ber = NULL;
}
zval_ptr_dtor(&entry->res);
- efree(entry);
+
+ zend_object_std_dtor(&entry->std);
+}
+
+#define VERIFY_LDAP_LINK_CONNECTED(ld) \
+{ \
+ if (!ld->link) { \
+ zend_throw_error(NULL, "LDAP connection has already been closed"); \
+ RETURN_THROWS(); \
+ } \
+}
+
+#define VERIFY_LDAP_RESULT_OPEN(lr) \
+{ \
+ if (!lr->result) { \
+ zend_throw_error(NULL, "LDAP result has already been closed"); \
+ RETURN_THROWS(); \
+ } \
}
-/* }}} */
/* {{{ Parse controls from and to arrays */
static void _php_ldap_control_to_array(LDAP *ld, LDAPControl* ctrl, zval* array, int request)
@@ -720,6 +826,42 @@ PHP_MINIT_FUNCTION(ldap)
{
REGISTER_INI_ENTRIES();
+ ldap_link_ce = register_class_LDAP();
+ ldap_link_ce->create_object = ldap_link_create_object;
+ ldap_link_ce->serialize = zend_class_serialize_deny;
+ ldap_link_ce->unserialize = zend_class_unserialize_deny;
+
+ memcpy(&ldap_link_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ ldap_link_object_handlers.offset = XtOffsetOf(ldap_linkdata, std);
+ ldap_link_object_handlers.free_obj = ldap_link_free_obj;
+ ldap_link_object_handlers.get_constructor = ldap_link_get_constructor;
+ ldap_link_object_handlers.clone_obj = NULL;
+ ldap_link_object_handlers.compare = zend_objects_not_comparable;
+
+ ldap_result_ce = register_class_LDAPResult();
+ ldap_result_ce->create_object = ldap_result_create_object;
+ ldap_result_ce->serialize = zend_class_serialize_deny;
+ ldap_result_ce->unserialize = zend_class_unserialize_deny;
+
+ memcpy(&ldap_result_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ ldap_result_object_handlers.offset = XtOffsetOf(ldap_resultdata, std);
+ ldap_result_object_handlers.free_obj = ldap_result_free_obj;
+ ldap_result_object_handlers.get_constructor = ldap_result_get_constructor;
+ ldap_result_object_handlers.clone_obj = NULL;
+ ldap_result_object_handlers.compare = zend_objects_not_comparable;
+
+ ldap_result_entry_ce = register_class_LDAPResultEntry();
+ ldap_result_entry_ce->create_object = ldap_result_entry_create_object;
+ ldap_result_entry_ce->serialize = zend_class_serialize_deny;
+ ldap_result_entry_ce->unserialize = zend_class_unserialize_deny;
+
+ memcpy(&ldap_result_entry_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ ldap_result_entry_object_handlers.offset = XtOffsetOf(ldap_result_entry, std);
+ ldap_result_entry_object_handlers.free_obj = ldap_result_entry_free_obj;
+ ldap_result_entry_object_handlers.get_constructor = ldap_result_entry_get_constructor;
+ ldap_result_entry_object_handlers.clone_obj = NULL;
+ ldap_result_entry_object_handlers.compare = zend_objects_not_comparable;
+
/* Constants to be used with deref-parameter in php_ldap_do_search() */
REGISTER_LONG_CONSTANT("LDAP_DEREF_NEVER", LDAP_DEREF_NEVER, CONST_PERSISTENT | CONST_CS);
REGISTER_LONG_CONSTANT("LDAP_DEREF_SEARCHING", LDAP_DEREF_SEARCHING, CONST_PERSISTENT | CONST_CS);
@@ -925,10 +1067,6 @@ PHP_MINIT_FUNCTION(ldap)
REGISTER_STRING_CONSTANT("LDAP_CONTROL_VLVRESPONSE", LDAP_CONTROL_VLVRESPONSE, CONST_PERSISTENT | CONST_CS);
#endif
- le_link = zend_register_list_destructors_ex(_close_ldap_link, NULL, "ldap link", module_number);
- le_result = zend_register_list_destructors_ex(_free_ldap_result, NULL, "ldap result", module_number);
- le_result_entry = zend_register_list_destructors_ex(_free_ldap_result_entry, NULL, "ldap result entry", module_number);
-
ldap_module_entry.type = type;
return SUCCESS;
@@ -1019,7 +1157,8 @@ PHP_FUNCTION(ldap_connect)
RETURN_FALSE;
}
- ld = ecalloc(1, sizeof(ldap_linkdata));
+ object_init_ex(return_value, ldap_link_ce);
+ ld = Z_LDAP_LINK_P(return_value);
{
int rc = LDAP_SUCCESS;
@@ -1028,7 +1167,6 @@ PHP_FUNCTION(ldap_connect)
size_t urllen = hostlen + sizeof( "ldap://:65535" );
if (port <= 0 || port > 65535) {
- efree(ld);
zend_argument_value_error(2, "must be between 1 and 65535");
RETURN_THROWS();
}
@@ -1047,7 +1185,7 @@ PHP_FUNCTION(ldap_connect)
*/
ldap = ldap_init(host, port);
if (ldap == NULL) {
- efree(ld);
+ zval_ptr_dtor(return_value);
php_error_docref(NULL, E_WARNING, "Could not create session handle");
RETURN_FALSE;
}
@@ -1056,20 +1194,20 @@ PHP_FUNCTION(ldap_connect)
efree(url);
}
if (rc != LDAP_SUCCESS) {
- efree(ld);
+ zval_ptr_dtor(return_value);
php_error_docref(NULL, E_WARNING, "Could not create session handle: %s", ldap_err2string(rc));
RETURN_FALSE;
}
}
if (ldap == NULL) {
- efree(ld);
+ zval_ptr_dtor(return_value);
RETURN_FALSE;
} else {
#ifdef HAVE_ORALDAP
if (ssl) {
if (ldap_init_SSL(&ldap->ld_sb, wallet, walletpasswd, authmode)) {
- efree(ld);
+ zval_ptr_dtor(return_value);
php_error_docref(NULL, E_WARNING, "SSL init failed");
RETURN_FALSE;
}
@@ -1077,7 +1215,6 @@ PHP_FUNCTION(ldap_connect)
#endif
LDAPG(num_links)++;
ld->link = ldap;
- RETURN_RES(zend_register_resource(ld, le_link));
}
}
@@ -1119,13 +1256,12 @@ PHP_FUNCTION(ldap_bind)
ldap_linkdata *ld;
int rc;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|s!s!", &link, &ldap_bind_dn, &ldap_bind_dnlen, &ldap_bind_pw, &ldap_bind_pwlen) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|s!s!", &link, ldap_link_ce, &ldap_bind_dn, &ldap_bind_dnlen, &ldap_bind_pw, &ldap_bind_pwlen) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
if (ldap_bind_dn != NULL && memchr(ldap_bind_dn, '\0', ldap_bind_dnlen) != NULL) {
_set_lderrno(ld->link, LDAP_INVALID_CREDENTIALS);
@@ -1172,16 +1308,16 @@ PHP_FUNCTION(ldap_bind_ext)
size_t ldap_bind_dnlen, ldap_bind_pwlen;
ldap_linkdata *ld;
LDAPControl **lserverctrls = NULL;
+ ldap_resultdata *result;
LDAPMessage *ldap_res;
int rc;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|s!s!a!", &link, &ldap_bind_dn, &ldap_bind_dnlen, &ldap_bind_pw, &ldap_bind_pwlen, &serverctrls) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|s!s!a!", &link, ldap_link_ce, &ldap_bind_dn, &ldap_bind_dnlen, &ldap_bind_pw, &ldap_bind_pwlen, &serverctrls) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
if (ldap_bind_dn != NULL && memchr(ldap_bind_dn, '\0', ldap_bind_dnlen) != NULL) {
_set_lderrno(ld->link, LDAP_INVALID_CREDENTIALS);
@@ -1227,7 +1363,9 @@ PHP_FUNCTION(ldap_bind_ext)
}
/* return a PHP control object */
- RETVAL_RES(zend_register_resource(ldap_res, le_result));
+ object_init_ex(return_value, ldap_result_ce);
+ result = Z_LDAP_RESULT_P(return_value);
+ result->result = ldap_res;
}
cleanup:
@@ -1337,13 +1475,12 @@ PHP_FUNCTION(ldap_sasl_bind)
size_t rc, dn_len, passwd_len, mech_len, realm_len, authc_id_len, authz_id_len, props_len;
php_ldap_bictx *ctx;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|s!s!s!s!s!s!s!", &link, &binddn, &dn_len, &passwd, &passwd_len, &sasl_mech, &mech_len, &sasl_realm, &realm_len, &sasl_authc_id, &authc_id_len, &sasl_authz_id, &authz_id_len, &props, &props_len) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|s!s!s!s!s!s!s!", &link, ldap_link_ce, &binddn, &dn_len, &passwd, &passwd_len, &sasl_mech, &mech_len, &sasl_realm, &realm_len, &sasl_authc_id, &authc_id_len, &sasl_authz_id, &authz_id_len, &props, &props_len) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
ctx = _php_sasl_setdefs(ld->link, sasl_mech, sasl_realm, sasl_authc_id, passwd, sasl_authz_id);
@@ -1369,15 +1506,15 @@ PHP_FUNCTION(ldap_unbind)
zval *link;
ldap_linkdata *ld;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &link) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &link, ldap_link_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
+
+ ldap_link_free(ld);
- zend_list_close(Z_RES_P(link));
RETURN_TRUE;
}
/* }}} */
@@ -1430,6 +1567,7 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
zend_string *ldap_filter = NULL, *ldap_base_dn = NULL;
char **ldap_attrs = NULL;
ldap_linkdata *ld = NULL;
+ ldap_resultdata *result;
LDAPMessage *ldap_res = NULL;
LDAPControl **lserverctrls = NULL;
int ldap_attrsonly = 0, ldap_sizelimit = -1, ldap_timelimit = -1, ldap_deref = -1;
@@ -1487,7 +1625,7 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
if (Z_TYPE_P(link) == IS_ARRAY) {
int i, nlinks, nbases, nfilters, *rcs;
ldap_linkdata **lds;
- zval *entry, resource;
+ zval *entry, object;
nlinks = zend_hash_num_elements(Z_ARRVAL_P(link));
if (nlinks == 0) {
@@ -1533,11 +1671,19 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
for (i=0; i<nlinks; i++) {
entry = zend_hash_get_current_data(Z_ARRVAL_P(link));
- ld = (ldap_linkdata *) zend_fetch_resource_ex(entry, "ldap link", le_link);
- if (ld == NULL) {
+ if (Z_TYPE_P(entry) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(entry), ldap_link_ce)) {
+ zend_argument_value_error(1, "must only contain objects of type LDAP");
+ ret = 0;
+ goto cleanup_parallel;
+ }
+
+ ld = Z_LDAP_LINK_P(entry);
+ if (!ld->link) {
+ zend_throw_error(NULL, "LDAP connection has already been closed");
ret = 0;
goto cleanup_parallel;
}
+
if (nbases != 0) { /* base_dn an array? */
entry = zend_hash_get_current_data(base_dn_ht);
zend_hash_move_forward(base_dn_ht);
@@ -1583,8 +1729,10 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
rcs[i] = ldap_result(lds[i]->link, LDAP_RES_ANY, 1 /* LDAP_MSG_ALL */, NULL, &ldap_res);
}
if (rcs[i] != -1) {
- ZVAL_RES(&resource, zend_register_resource(ldap_res, le_result));
- add_next_index_zval(return_value, &resource);
+ object_init_ex(&object, ldap_result_ce);
+ result = Z_LDAP_RESULT_P(&object);
+ result->result = ldap_res;
+ add_next_index_zval(return_value, &object);
} else {
add_next_index_bool(return_value, 0);
}
@@ -1593,22 +1741,23 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
cleanup_parallel:
efree(lds);
efree(rcs);
- } else {
- ld = (ldap_linkdata *) zend_fetch_resource_ex(link, "ldap link", le_link);
- if (ld == NULL) {
+ } else if (Z_TYPE_P(link) == IS_OBJECT && instanceof_function(Z_OBJCE_P(link), ldap_link_ce)) {
+ ld = Z_LDAP_LINK_P(link);
+ if (!ld->link) {
+ zend_throw_error(NULL, "LDAP connection has already been closed");
ret = 0;
goto cleanup;
}
if (!base_dn_str) {
- zend_argument_type_error(2, "must be of type string when argument #1 ($ldap) is a resource");
+ zend_argument_type_error(2, "must be of type string when argument #1 ($ldap) is an LDAP instance");
ret = 0;
goto cleanup;
}
ldap_base_dn = zend_string_copy(base_dn_str);
if (!filter_str) {
- zend_argument_type_error(3, "must be of type string when argument #1 ($ldap) is a resource");
+ zend_argument_type_error(3, "must be of type string when argument #1 ($ldap) is an LDAP instance");
ret = 0;
goto cleanup;
}
@@ -1652,9 +1801,12 @@ cleanup_parallel:
php_error_docref(NULL, E_WARNING, "Partial search results returned: Adminlimit exceeded");
}
#endif
-
- RETVAL_RES(zend_register_resource(ldap_res, le_result));
+ object_init_ex(return_value, ldap_result_ce);
+ result = Z_LDAP_RESULT_P(return_value);
+ result->result = ldap_res;
}
+ } else {
+ zend_argument_type_error(1, "must be of type LDAP|array, %s given", zend_zval_type_name(link));
}
cleanup:
@@ -1705,17 +1857,17 @@ PHP_FUNCTION(ldap_search)
PHP_FUNCTION(ldap_free_result)
{
zval *result;
- LDAPMessage *ldap_result;
+ ldap_resultdata *ldap_result;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &result) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &result, ldap_result_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ldap_result = (LDAPMessage *)zend_fetch_resource(Z_RES_P(result), "ldap result", le_result)) == NULL) {
- RETURN_THROWS();
- }
+ ldap_result = Z_LDAP_RESULT_P(result);
+ VERIFY_LDAP_RESULT_OPEN(ldap_result);
+
+ ldap_result_free(ldap_result);
- zend_list_close(Z_RES_P(result)); /* Delete list entry */
RETVAL_TRUE;
}
/* }}} */
@@ -1725,21 +1877,19 @@ PHP_FUNCTION(ldap_count_entries)
{
zval *link, *result;
ldap_linkdata *ld;
- LDAPMessage *ldap_result;
+ ldap_resultdata *ldap_result;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &link, ldap_link_ce, &result, ldap_result_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((ldap_result = (LDAPMessage *)zend_fetch_resource(Z_RES_P(result), "ldap result", le_result)) == NULL) {
- RETURN_THROWS();
- }
+ ldap_result = Z_LDAP_RESULT_P(result);
+ VERIFY_LDAP_RESULT_OPEN(ldap_result);
- RETURN_LONG(ldap_count_entries(ld->link, ldap_result));
+ RETURN_LONG(ldap_count_entries(ld->link, ldap_result->result));
}
/* }}} */
@@ -1748,26 +1898,25 @@ PHP_FUNCTION(ldap_first_entry)
{
zval *link, *result;
ldap_linkdata *ld;
- ldap_resultentry *resultentry;
- LDAPMessage *ldap_result, *entry;
+ ldap_result_entry *resultentry;
+ ldap_resultdata *ldap_result;
+ LDAPMessage *entry;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &link, ldap_link_ce, &result, ldap_result_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((ldap_result = (LDAPMessage *)zend_fetch_resource(Z_RES_P(result), "ldap result", le_result)) == NULL) {
- RETURN_THROWS();
- }
+ ldap_result = Z_LDAP_RESULT_P(result);
+ VERIFY_LDAP_RESULT_OPEN(ldap_result);
- if ((entry = ldap_first_entry(ld->link, ldap_result)) == NULL) {
+ if ((entry = ldap_first_entry(ld->link, ldap_result->result)) == NULL) {
RETVAL_FALSE;
} else {
- resultentry = emalloc(sizeof(ldap_resultentry));
- RETVAL_RES(zend_register_resource(resultentry, le_result_entry));
+ object_init_ex(return_value, ldap_result_entry_ce);
+ resultentry = Z_LDAP_RESULT_ENTRY_P(return_value);
ZVAL_COPY(&resultentry->res, result);
resultentry->data = entry;
resultentry->ber = NULL;
@@ -1780,25 +1929,23 @@ PHP_FUNCTION(ldap_next_entry)
{
zval *link, *result_entry;
ldap_linkdata *ld;
- ldap_resultentry *resultentry, *resultentry_next;
+ ldap_result_entry *resultentry, *resultentry_next;
LDAPMessage *entry_next;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result_entry) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &link, ldap_link_ce, &result_entry, ldap_result_entry_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
- if ((resultentry = (ldap_resultentry *)zend_fetch_resource(Z_RES_P(result_entry), "ldap result entry", le_result_entry)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
+
+ resultentry = Z_LDAP_RESULT_ENTRY_P(result_entry);
if ((entry_next = ldap_next_entry(ld->link, resultentry->data)) == NULL) {
RETVAL_FALSE;
} else {
- resultentry_next = emalloc(sizeof(ldap_resultentry));
- RETVAL_RES(zend_register_resource(resultentry_next, le_result_entry));
+ object_init_ex(return_value, ldap_result_entry_ce);
+ resultentry_next = Z_LDAP_RESULT_ENTRY_P(return_value);
ZVAL_COPY(&resultentry_next->res, &resultentry->res);
resultentry_next->data = entry_next;
resultentry_next->ber = NULL;
@@ -1810,7 +1957,8 @@ PHP_FUNCTION(ldap_next_entry)
PHP_FUNCTION(ldap_get_entries)
{
zval *link, *result;
- LDAPMessage *ldap_result, *ldap_result_entry;
+ ldap_resultdata *ldap_result;
+ LDAPMessage *ldap_result_entry;
zval tmp1, tmp2;
ldap_linkdata *ld;
LDAP *ldap;
@@ -1821,19 +1969,18 @@ PHP_FUNCTION(ldap_get_entries)
struct berval **ldap_value;
char *dn;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &link, ldap_link_ce, &result, ldap_result_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
- if ((ldap_result = (LDAPMessage *)zend_fetch_resource(Z_RES_P(result), "ldap result", le_result)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
+
+ ldap_result = Z_LDAP_RESULT_P(result);
+ VERIFY_LDAP_RESULT_OPEN(ldap_result);
ldap = ld->link;
- num_entries = ldap_count_entries(ldap, ldap_result);
+ num_entries = ldap_count_entries(ldap, ldap_result->result);
array_init(return_value);
add_assoc_long(return_value, "count", num_entries);
@@ -1842,7 +1989,7 @@ PHP_FUNCTION(ldap_get_entries)
return;
}
- ldap_result_entry = ldap_first_entry(ldap, ldap_result);
+ ldap_result_entry = ldap_first_entry(ldap, ldap_result->result);
if (ldap_result_entry == NULL) {
zend_array_destroy(Z_ARR_P(return_value));
RETURN_FALSE;
@@ -1911,20 +2058,17 @@ PHP_FUNCTION(ldap_first_attribute)
{
zval *link, *result_entry;
ldap_linkdata *ld;
- ldap_resultentry *resultentry;
+ ldap_result_entry *resultentry;
char *attribute;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result_entry) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &link, ldap_link_ce, &result_entry, ldap_result_entry_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((resultentry = (ldap_resultentry *)zend_fetch_resource(Z_RES_P(result_entry), "ldap result entry", le_result_entry)) == NULL) {
- RETURN_THROWS();
- }
+ resultentry = Z_LDAP_RESULT_ENTRY_P(result_entry);
if ((attribute = ldap_first_attribute(ld->link, resultentry->data, &resultentry->ber)) == NULL) {
RETURN_FALSE;
@@ -1942,20 +2086,17 @@ PHP_FUNCTION(ldap_next_attribute)
{
zval *link, *result_entry;
ldap_linkdata *ld;
- ldap_resultentry *resultentry;
+ ldap_result_entry *resultentry;
char *attribute;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result_entry) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &link, ldap_link_ce, &result_entry, ldap_result_entry_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((resultentry = (ldap_resultentry *)zend_fetch_resource(Z_RES_P(result_entry), "ldap result entry", le_result_entry)) == NULL) {
- RETURN_THROWS();
- }
+ resultentry = Z_LDAP_RESULT_ENTRY_P(result_entry);
if (resultentry->ber == NULL) {
php_error_docref(NULL, E_WARNING, "Called before calling ldap_first_attribute() or no attributes found in result entry");
@@ -1985,23 +2126,20 @@ PHP_FUNCTION(ldap_get_attributes)
zval *link, *result_entry;
zval tmp;
ldap_linkdata *ld;
- ldap_resultentry *resultentry;
+ ldap_result_entry *resultentry;
char *attribute;
struct berval **ldap_value;
int i, num_values, num_attrib;
BerElement *ber;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result_entry) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &link, ldap_link_ce, &result_entry, ldap_result_entry_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((resultentry = (ldap_resultentry *)zend_fetch_resource(Z_RES_P(result_entry), "ldap result entry", le_result_entry)) == NULL) {
- RETURN_THROWS();
- }
+ resultentry = Z_LDAP_RESULT_ENTRY_P(result_entry);
array_init(return_value);
num_attrib = 0;
@@ -2042,23 +2180,20 @@ PHP_FUNCTION(ldap_get_values_len)
{
zval *link, *result_entry;
ldap_linkdata *ld;
- ldap_resultentry *resultentry;
+ ldap_result_entry *resultentry;
char *attr;
struct berval **ldap_value_len;
int i, num_values;
size_t attr_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrs", &link, &result_entry, &attr, &attr_len) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOs", &link, ldap_link_ce, &result_entry, ldap_result_entry_ce, &attr, &attr_len) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((resultentry = (ldap_resultentry *)zend_fetch_resource(Z_RES_P(result_entry), "ldap result entry", le_result_entry)) == NULL) {
- RETURN_THROWS();
- }
+ resultentry = Z_LDAP_RESULT_ENTRY_P(result_entry);
if ((ldap_value_len = ldap_get_values_len(ld->link, resultentry->data, attr)) == NULL) {
php_error_docref(NULL, E_WARNING, "Cannot get the value(s) of attribute %s", ldap_err2string(_get_lderrno(ld->link)));
@@ -2083,20 +2218,17 @@ PHP_FUNCTION(ldap_get_dn)
{
zval *link, *result_entry;
ldap_linkdata *ld;
- ldap_resultentry *resultentry;
+ ldap_result_entry *resultentry;
char *text;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result_entry) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &link, ldap_link_ce, &result_entry, ldap_result_entry_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((resultentry = (ldap_resultentry *)zend_fetch_resource(Z_RES_P(result_entry), "ldap result entry", le_result_entry)) == NULL) {
- RETURN_THROWS();
- }
+ resultentry = Z_LDAP_RESULT_ENTRY_P(result_entry);
text = ldap_get_dn(ld->link, resultentry->data);
if (text != NULL) {
@@ -2179,6 +2311,7 @@ static void php_ldap_do_modify(INTERNAL_FUNCTION_PARAMETERS, int oper, int ext)
char *dn;
LDAPMod **ldap_mods;
LDAPControl **lserverctrls = NULL;
+ ldap_resultdata *result;
LDAPMessage *ldap_res;
int i, j, num_attribs, num_values, msgid;
size_t dn_len;
@@ -2187,13 +2320,12 @@ static void php_ldap_do_modify(INTERNAL_FUNCTION_PARAMETERS, int oper, int ext)
zend_ulong index;
int is_full_add=0; /* flag for full add operation so ldap_mod_add can be put back into oper, gerrit THomson */
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsa/|a!", &link, &dn, &dn_len, &entry, &serverctrls) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osa/|a!", &link, ldap_link_ce, &dn, &dn_len, &entry, &serverctrls) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
num_attribs = zend_hash_num_elements(Z_ARRVAL_P(entry));
ldap_mods = safe_emalloc((num_attribs+1), sizeof(LDAPMod *), 0);
@@ -2303,7 +2435,9 @@ static void php_ldap_do_modify(INTERNAL_FUNCTION_PARAMETERS, int oper, int ext)
}
/* return a PHP control object */
- RETVAL_RES(zend_register_resource(ldap_res, le_result));
+ object_init_ex(return_value, ldap_result_ce);
+ result = Z_LDAP_RESULT_P(return_value);
+ result->result = ldap_res;
} else RETVAL_TRUE;
} else {
if (ext) {
@@ -2323,7 +2457,9 @@ static void php_ldap_do_modify(INTERNAL_FUNCTION_PARAMETERS, int oper, int ext)
}
/* return a PHP control object */
- RETVAL_RES(zend_register_resource(ldap_res, le_result));
+ object_init_ex(return_value, ldap_result_ce);
+ result = Z_LDAP_RESULT_P(return_value);
+ result->result = ldap_res;
} else RETVAL_TRUE;
}
@@ -2413,18 +2549,18 @@ static void php_ldap_do_delete(INTERNAL_FUNCTION_PARAMETERS, int ext)
zval *link;
ldap_linkdata *ld;
LDAPControl **lserverctrls = NULL;
+ ldap_resultdata *result;
LDAPMessage *ldap_res;
char *dn;
int rc, msgid;
size_t dn_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|a!", &link, &dn, &dn_len, &serverctrls) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|a!", &link, ldap_link_ce, &dn, &dn_len, &serverctrls) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
if (serverctrls) {
lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 3);
@@ -2452,7 +2588,9 @@ static void php_ldap_do_delete(INTERNAL_FUNCTION_PARAMETERS, int ext)
}
/* return a PHP control object */
- RETVAL_RES(zend_register_resource(ldap_res, le_result));
+ object_init_ex(return_value, ldap_result_ce);
+ result = Z_LDAP_RESULT_P(return_value);
+ result->result = ldap_res;
} else {
RETVAL_TRUE;
}
@@ -2561,13 +2699,12 @@ PHP_FUNCTION(ldap_modify_batch)
);
*/
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsa/|a!", &link, &dn, &dn_len, &mods, &serverctrls) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osa/|a!", &link, ldap_link_ce, &dn, &dn_len, &mods, &serverctrls) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
/* perform validation */
{
@@ -2843,13 +2980,12 @@ PHP_FUNCTION(ldap_errno)
zval *link;
ldap_linkdata *ld;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &link) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &link, ldap_link_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
RETURN_LONG(_get_lderrno(ld->link));
}
@@ -2875,13 +3011,12 @@ PHP_FUNCTION(ldap_error)
ldap_linkdata *ld;
int ld_errno;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &link) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &link, ldap_link_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
ld_errno = _get_lderrno(ld->link);
@@ -2901,13 +3036,12 @@ PHP_FUNCTION(ldap_compare)
int errno;
struct berval lvalue;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsss|a!", &link, &dn, &dn_len, &attr, &attr_len, &value, &value_len, &serverctrls) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osss|a!", &link, ldap_link_ce, &dn, &dn_len, &attr, &attr_len, &value, &value_len, &serverctrls) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
if (serverctrls) {
lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 5);
@@ -2953,13 +3087,12 @@ PHP_FUNCTION(ldap_get_option)
ldap_linkdata *ld;
zend_long option;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz", &link, &option, &retval) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olz", &link, ldap_link_ce, &option, &retval) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
switch (option) {
/* options with int value */
@@ -3116,21 +3249,20 @@ PHP_FUNCTION(ldap_get_option)
/* {{{ Set the value of various session-wide parameters */
PHP_FUNCTION(ldap_set_option)
{
- zval *link, *newval;
+ zval *link = NULL, *newval;
ldap_linkdata *ld;
LDAP *ldap;
zend_long option;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "zlz", &link, &option, &newval) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O!lz", &link, ldap_link_ce, &option, &newval) != SUCCESS) {
RETURN_THROWS();
}
- if (Z_TYPE_P(link) == IS_NULL) {
+ if (!link) {
ldap = NULL;
} else {
- if ((ld = (ldap_linkdata *)zend_fetch_resource_ex(link, "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
ldap = ld->link;
}
@@ -3161,7 +3293,7 @@ PHP_FUNCTION(ldap_set_option)
{
int val;
- convert_to_long_ex(newval);
+ convert_to_long(newval);
if (ZEND_LONG_EXCEEDS_INT(Z_LVAL_P(newval))) {
zend_argument_value_error(3, "is too large");
RETURN_THROWS();
@@ -3176,7 +3308,7 @@ PHP_FUNCTION(ldap_set_option)
{
struct timeval timeout;
- convert_to_long_ex(newval);
+ convert_to_long(newval);
timeout.tv_sec = Z_LVAL_P(newval);
timeout.tv_usec = 0;
if (ldap_set_option(ldap, LDAP_OPT_NETWORK_TIMEOUT, (void *) &timeout)) {
@@ -3188,7 +3320,7 @@ PHP_FUNCTION(ldap_set_option)
{
int timeout;
- convert_to_long_ex(newval);
+ convert_to_long(newval);
timeout = 1000 * Z_LVAL_P(newval); /* Convert to milliseconds */
if (ldap_set_option(ldap, LDAP_X_OPT_CONNECT_TIMEOUT, &timeout)) {
RETURN_FALSE;
@@ -3200,7 +3332,7 @@ PHP_FUNCTION(ldap_set_option)
{
struct timeval timeout;
- convert_to_long_ex(newval);
+ convert_to_long(newval);
timeout.tv_sec = Z_LVAL_P(newval);
timeout.tv_usec = 0;
if (ldap_set_option(ldap, LDAP_OPT_TIMEOUT, (void *) &timeout)) {
@@ -3300,25 +3432,23 @@ PHP_FUNCTION(ldap_parse_result)
{
zval *link, *result, *errcode, *matcheddn, *errmsg, *referrals, *serverctrls;
ldap_linkdata *ld;
- LDAPMessage *ldap_result;
+ ldap_resultdata *ldap_result;
LDAPControl **lserverctrls = NULL;
char **lreferrals, **refp;
char *lmatcheddn, *lerrmsg;
int rc, lerrcode, myargcount = ZEND_NUM_ARGS();
- if (zend_parse_parameters(myargcount, "rrz|zzzz", &link, &result, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) {
+ if (zend_parse_parameters(myargcount, "OOz|zzzz", &link, ldap_link_ce, &result, ldap_result_ce, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((ldap_result = (LDAPMessage *)zend_fetch_resource(Z_RES_P(result), "ldap result", le_result)) == NULL) {
- RETURN_THROWS();
- }
+ ldap_result = Z_LDAP_RESULT_P(result);
+ VERIFY_LDAP_RESULT_OPEN(ldap_result);
- rc = ldap_parse_result(ld->link, ldap_result, &lerrcode,
+ rc = ldap_parse_result(ld->link, ldap_result->result, &lerrcode,
myargcount > 3 ? &lmatcheddn : NULL,
myargcount > 4 ? &lerrmsg : NULL,
myargcount > 5 ? &lreferrals : NULL,
@@ -3375,24 +3505,22 @@ PHP_FUNCTION(ldap_parse_exop)
{
zval *link, *result, *retdata, *retoid;
ldap_linkdata *ld;
- LDAPMessage *ldap_result;
+ ldap_resultdata *ldap_result;
char *lretoid;
struct berval *lretdata;
int rc, myargcount = ZEND_NUM_ARGS();
- if (zend_parse_parameters(myargcount, "rr|zz", &link, &result, &retdata, &retoid) != SUCCESS) {
+ if (zend_parse_parameters(myargcount, "OO|zz", &link, ldap_link_ce, &result, ldap_result_ce, &retdata, &retoid) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((ldap_result = (LDAPMessage *)zend_fetch_resource(Z_RES_P(result), "ldap result", le_result)) == NULL) {
- RETURN_THROWS();
- }
+ ldap_result = Z_LDAP_RESULT_P(result);
+ VERIFY_LDAP_RESULT_OPEN(ldap_result);
- rc = ldap_parse_extended_result(ld->link, ldap_result,
+ rc = ldap_parse_extended_result(ld->link, ldap_result->result,
myargcount > 3 ? &lretoid: NULL,
myargcount > 2 ? &lretdata: NULL,
0);
@@ -3431,21 +3559,19 @@ PHP_FUNCTION(ldap_count_references)
{
zval *link, *result;
ldap_linkdata *ld;
- LDAPMessage *ldap_result;
+ ldap_resultdata *ldap_result;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &link, ldap_link_ce, &result, ldap_result_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((ldap_result = (LDAPMessage *)zend_fetch_resource(Z_RES_P(result), "ldap result", le_result)) == NULL) {
- RETURN_THROWS();
- }
+ ldap_result = Z_LDAP_RESULT_P(result);
+ VERIFY_LDAP_RESULT_OPEN(ldap_result);
- RETURN_LONG(ldap_count_references(ld->link, ldap_result));
+ RETURN_LONG(ldap_count_references(ld->link, ldap_result->result));
}
/* }}} */
@@ -3454,26 +3580,25 @@ PHP_FUNCTION(ldap_first_reference)
{
zval *link, *result;
ldap_linkdata *ld;
- ldap_resultentry *resultentry;
- LDAPMessage *ldap_result, *entry;
+ ldap_result_entry *resultentry;
+ ldap_resultdata *ldap_result;
+ LDAPMessage *entry;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &link, ldap_link_ce, &result, ldap_result_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((ldap_result = (LDAPMessage *)zend_fetch_resource(Z_RES_P(result), "ldap result", le_result)) == NULL) {
- RETURN_THROWS();
- }
+ ldap_result = Z_LDAP_RESULT_P(result);
+ VERIFY_LDAP_RESULT_OPEN(ldap_result);
- if ((entry = ldap_first_reference(ld->link, ldap_result)) == NULL) {
+ if ((entry = ldap_first_reference(ld->link, ldap_result->result)) == NULL) {
RETVAL_FALSE;
} else {
- resultentry = emalloc(sizeof(ldap_resultentry));
- RETVAL_RES(zend_register_resource(resultentry, le_result_entry));
+ object_init_ex(return_value, ldap_result_entry_ce);
+ resultentry = Z_LDAP_RESULT_ENTRY_P(return_value);
ZVAL_COPY(&resultentry->res, result);
resultentry->data = entry;
resultentry->ber = NULL;
@@ -3486,26 +3611,23 @@ PHP_FUNCTION(ldap_next_reference)
{
zval *link, *result_entry;
ldap_linkdata *ld;
- ldap_resultentry *resultentry, *resultentry_next;
+ ldap_result_entry *resultentry, *resultentry_next;
LDAPMessage *entry_next;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result_entry) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO", &link, ldap_link_ce, &result_entry, ldap_result_entry_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((resultentry = (ldap_resultentry *)zend_fetch_resource(Z_RES_P(result_entry), "ldap result entry", le_result_entry)) == NULL) {
- RETURN_THROWS();
- }
+ resultentry = Z_LDAP_RESULT_ENTRY_P(result_entry);
if ((entry_next = ldap_next_reference(ld->link, resultentry->data)) == NULL) {
RETVAL_FALSE;
} else {
- resultentry_next = emalloc(sizeof(ldap_resultentry));
- RETVAL_RES(zend_register_resource(resultentry_next, le_result_entry));
+ object_init_ex(return_value, ldap_result_entry_ce);
+ resultentry_next = Z_LDAP_RESULT_ENTRY_P(return_value);
ZVAL_COPY(&resultentry_next->res, &resultentry->res);
resultentry_next->data = entry_next;
resultentry_next->ber = NULL;
@@ -3519,20 +3641,17 @@ PHP_FUNCTION(ldap_parse_reference)
{
zval *link, *result_entry, *referrals;
ldap_linkdata *ld;
- ldap_resultentry *resultentry;
+ ldap_result_entry *resultentry;
char **lreferrals, **refp;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz", &link, &result_entry, &referrals) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOz", &link, ldap_link_ce, &result_entry, ldap_result_entry_ce, &referrals) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
- if ((resultentry = (ldap_resultentry *)zend_fetch_resource(Z_RES_P(result_entry), "ldap result entry", le_result_entry)) == NULL) {
- RETURN_THROWS();
- }
+ resultentry = Z_LDAP_RESULT_ENTRY_P(result_entry);
if (ldap_parse_reference(ld->link, resultentry->data, &lreferrals, NULL /* &serverctrls */, 0) != LDAP_SUCCESS) {
RETURN_FALSE;
@@ -3563,19 +3682,19 @@ static void php_ldap_do_rename(INTERNAL_FUNCTION_PARAMETERS, int ext)
zval *link;
ldap_linkdata *ld;
LDAPControl **lserverctrls = NULL;
+ ldap_resultdata *result;
LDAPMessage *ldap_res;
int rc, msgid;
char *dn, *newrdn, *newparent;
size_t dn_len, newrdn_len, newparent_len;
- zend_bool deleteoldrdn;
+ bool deleteoldrdn;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsssb|a!", &link, &dn, &dn_len, &newrdn, &newrdn_len, &newparent, &newparent_len, &deleteoldrdn, &serverctrls) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osssb|a!", &link, ldap_link_ce, &dn, &dn_len, &newrdn, &newrdn_len, &newparent, &newparent_len, &deleteoldrdn, &serverctrls) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
if (newparent_len == 0) {
newparent = NULL;
@@ -3623,7 +3742,9 @@ static void php_ldap_do_rename(INTERNAL_FUNCTION_PARAMETERS, int ext)
}
/* return a PHP control object */
- RETVAL_RES(zend_register_resource(ldap_res, le_result));
+ object_init_ex(return_value, ldap_result_ce);
+ result = Z_LDAP_RESULT_P(return_value);
+ result->result = ldap_res;
} else {
RETVAL_TRUE;
}
@@ -3659,13 +3780,12 @@ PHP_FUNCTION(ldap_start_tls)
ldap_linkdata *ld;
int rc, protocol = LDAP_VERSION3;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &link) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &link, ldap_link_ce) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
if (((rc = ldap_set_option(ld->link, LDAP_OPT_PROTOCOL_VERSION, &protocol)) != LDAP_SUCCESS) ||
((rc = ldap_start_tls_s(ld->link, NULL, NULL)) != LDAP_SUCCESS)
@@ -3684,17 +3804,21 @@ PHP_FUNCTION(ldap_start_tls)
/* {{{ _ldap_rebind_proc() */
int _ldap_rebind_proc(LDAP *ldap, const char *url, ber_tag_t req, ber_int_t msgid, void *params)
{
- ldap_linkdata *ld;
+ ldap_linkdata *ld = NULL;
int retval;
zval cb_args[2];
zval cb_retval;
zval *cb_link = (zval *) params;
- ld = (ldap_linkdata *) zend_fetch_resource_ex(cb_link, "ldap link", le_link);
+ ld = Z_LDAP_LINK_P(cb_link);
+ if (!ld->link) {
+ zend_throw_error(NULL, "LDAP connection has already been closed");
+ return LDAP_OTHER;
+ }
/* link exists and callback set? */
- if (ld == NULL || Z_ISUNDEF(ld->rebindproc)) {
- php_error_docref(NULL, E_WARNING, "Link not found or no callback set");
+ if (Z_ISUNDEF(ld->rebindproc)) {
+ php_error_docref(NULL, E_WARNING, "No callback set");
return LDAP_OTHER;
}
@@ -3721,13 +3845,12 @@ PHP_FUNCTION(ldap_set_rebind_proc)
zend_fcall_info_cache fcc;
ldap_linkdata *ld;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rf!", &link, &fci, &fcc) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Of!", &link, ldap_link_ce, &fci, &fcc) == FAILURE) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
if (!ZEND_FCI_INITIALIZED(fci)) {
/* unregister rebind procedure */
@@ -3752,7 +3875,7 @@ PHP_FUNCTION(ldap_set_rebind_proc)
/* }}} */
#endif
-static zend_string* php_ldap_do_escape(const zend_bool *map, const char *value, size_t valuelen, zend_long flags)
+static zend_string* php_ldap_do_escape(const bool *map, const char *value, size_t valuelen, zend_long flags)
{
char hex[] = "0123456789abcdef";
size_t i, p = 0;
@@ -3789,7 +3912,7 @@ static zend_string* php_ldap_do_escape(const zend_bool *map, const char *value,
return ret;
}
-static void php_ldap_escape_map_set_chars(zend_bool *map, const char *chars, const size_t charslen, char escape)
+static void php_ldap_escape_map_set_chars(bool *map, const char *chars, const size_t charslen, char escape)
{
size_t i = 0;
while (i < charslen) {
@@ -3803,7 +3926,7 @@ PHP_FUNCTION(ldap_escape)
size_t valuelen = 0, ignoreslen = 0;
int i;
zend_long flags = 0;
- zend_bool map[256] = {0}, havecharlist = 0;
+ bool map[256] = {0}, havecharlist = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|sl", &value, &valuelen, &ignores, &ignoreslen, &flags) != SUCCESS) {
RETURN_THROWS();
@@ -3894,17 +4017,17 @@ PHP_FUNCTION(ldap_exop)
zend_string *reqoid, *reqdata = NULL;
struct berval lreqdata, *lretdata = NULL;
ldap_linkdata *ld;
+ ldap_resultdata *result;
LDAPMessage *ldap_res;
LDAPControl **lserverctrls = NULL;
int rc, msgid;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS|S!a!zz", &link, &reqoid, &reqdata, &serverctrls, &retdata, &retoid) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS|S!a!zz", &link, ldap_link_ce, &reqoid, &reqdata, &serverctrls, &retdata, &retoid) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
if (reqdata) {
lreqdata.bv_val = ZSTR_VAL(reqdata);
@@ -3976,7 +4099,9 @@ PHP_FUNCTION(ldap_exop)
}
/* return a PHP control object */
- RETVAL_RES(zend_register_resource(ldap_res, le_result));
+ object_init_ex(return_value, ldap_result_ce);
+ result = Z_LDAP_RESULT_P(return_value);
+ result->result = ldap_res;
cleanup:
if (lserverctrls) {
@@ -4001,13 +4126,12 @@ PHP_FUNCTION(ldap_exop_passwd)
int rc, myargcount = ZEND_NUM_ARGS(), msgid, err;
char* errmsg = NULL;
- if (zend_parse_parameters(myargcount, "r|sssz/", &link, &luser.bv_val, &luser.bv_len, &loldpw.bv_val, &loldpw.bv_len, &lnewpw.bv_val, &lnewpw.bv_len, &serverctrls) == FAILURE) {
+ if (zend_parse_parameters(myargcount, "O|sssz/", &link, ldap_link_ce, &luser.bv_val, &luser.bv_len, &loldpw.bv_val, &loldpw.bv_len, &lnewpw.bv_val, &lnewpw.bv_len, &serverctrls) == FAILURE) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
switch (myargcount) {
case 5:
@@ -4097,13 +4221,12 @@ PHP_FUNCTION(ldap_exop_whoami)
ldap_linkdata *ld;
int rc;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &link) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &link, ldap_link_ce) == FAILURE) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
/* synchronous call */
rc = ldap_whoami_s(ld->link, &lauthzid, NULL, NULL);
@@ -4135,13 +4258,12 @@ PHP_FUNCTION(ldap_exop_refresh)
ldap_linkdata *ld;
int rc;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsl", &link, &ldn.bv_val, &ldn.bv_len, &ttl) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osl", &link, ldap_link_ce, &ldn.bv_val, &ldn.bv_len, &ttl) != SUCCESS) {
RETURN_THROWS();
}
- if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
- RETURN_THROWS();
- }
+ ld = Z_LDAP_LINK_P(link);
+ VERIFY_LDAP_LINK_CONNECTED(ld);
lttl = (ber_int_t) ttl;
diff --git a/ext/ldap/ldap.stub.php b/ext/ldap/ldap.stub.php
index 255eeca2e3..981f9e1bbb 100644
--- a/ext/ldap/ldap.stub.php
+++ b/ext/ldap/ldap.stub.php
@@ -1,266 +1,152 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+
+/** @strict-properties */
+final class LDAP
+{
+}
+
+/** @strict-properties */
+final class LDAPResult
+{
+}
+
+/** @strict-properties */
+final class LDAPResultEntry
+{
+}
#ifdef HAVE_ORALDAP
-/** @return resource|false */
-function ldap_connect(?string $uri = null, int $port = 389, string $wallet = UNKNOWN, string $password = UNKNOWN, int $auth_mode = GSLC_SSL_NO_AUTH) {}
+function ldap_connect(?string $uri = null, int $port = 389, string $wallet = UNKNOWN, string $password = UNKNOWN, int $auth_mode = GSLC_SSL_NO_AUTH): LDAP|false {}
#else
-/** @return resource|false */
-function ldap_connect(?string $uri = null, int $port = 389) {}
+function ldap_connect(?string $uri = null, int $port = 389): LDAP|false {}
#endif
-/** @param resource $ldap */
-function ldap_unbind($ldap): bool {}
+function ldap_unbind(LDAP $ldap): bool {}
-/**
- * @param resource $ldap
- * @alias ldap_unbind
- */
-function ldap_close($ldap): bool {}
+/** @alias ldap_unbind */
+function ldap_close(LDAP $ldap): bool {}
-/** @param resource $ldap */
-function ldap_bind($ldap, ?string $dn = null, ?string $password = null): bool {}
+function ldap_bind(LDAP $ldap, ?string $dn = null, ?string $password = null): bool {}
-/**
- * @param resource $ldap
- * @return resource|false
- */
-function ldap_bind_ext($ldap, ?string $dn = null, ?string $password = null, ?array $controls = null) {}
+function ldap_bind_ext(LDAP $ldap, ?string $dn = null, ?string $password = null, ?array $controls = null): LDAPResult|false {}
#ifdef HAVE_LDAP_SASL
-/** @param resource $ldap */
-function ldap_sasl_bind($ldap, ?string $dn = null, ?string $password = null, ?string $mech = null, ?string $realm = null, ?string $authc_id = null, ?string $authz_id = null, ?string $props = null): bool {}
+function ldap_sasl_bind(LDAP $ldap, ?string $dn = null, ?string $password = null, ?string $mech = null, ?string $realm = null, ?string $authc_id = null, ?string $authz_id = null, ?string $props = null): bool {}
#endif
-/**
- * @param resource|array $ldap
- * @return resource|array|false
- */
-function ldap_read($ldap, array|string $base, array|string $filter, array $attributes = [], int $attributes_only = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, ?array $controls = null) {}
+/** @param LDAP|array $ldap */
+function ldap_read($ldap, array|string $base, array|string $filter, array $attributes = [], int $attributes_only = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, ?array $controls = null): LDAPResult|array|false {}
-/**
- * @param resource|array $ldap
- * @return resource|array|false
- */
-function ldap_list($ldap, array|string $base, array|string $filter, array $attributes = [], int $attributes_only = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, ?array $controls = null) {}
+/** @param LDAP|array $ldap */
+function ldap_list($ldap, array|string $base, array|string $filter, array $attributes = [], int $attributes_only = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, ?array $controls = null): LDAPResult|array|false {}
-/**
- * @param resource|array $ldap
- * @return resource|array|false
- */
-function ldap_search($ldap, array|string $base, array|string $filter, array $attributes = [], int $attributes_only = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, ?array $controls = null) {}
-
-/** @param resource $ldap */
-function ldap_free_result($ldap): bool {}
+/** @param LDAP|array $ldap */
+function ldap_search($ldap, array|string $base, array|string $filter, array $attributes = [], int $attributes_only = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, ?array $controls = null): LDAPResult|array|false {}
+function ldap_free_result(LDAPResult $result): bool {}
-/**
- * @param resource $ldap
- * @param resource $result
- */
-function ldap_count_entries($ldap, $result): int {}
+function ldap_count_entries(LDAP $ldap, LDAPResult $result): int {}
-/**
- * @param resource $ldap
- * @param resource $result
- * @return resource|false
- */
-function ldap_first_entry($ldap, $result) {}
+function ldap_first_entry(LDAP $ldap, LDAPResult $result): LDAPResultEntry|false {}
-/**
- * @param resource $ldap
- * @param resource $entry
- * @return resource|false
- */
-function ldap_next_entry($ldap, $entry) {}
+function ldap_next_entry(LDAP $ldap, LDAPResultEntry $entry): LDAPResultEntry|false {}
-/**
- * @param resource $ldap
- * @param resource $result
- */
-function ldap_get_entries($ldap, $result): array|false {}
+function ldap_get_entries(LDAP $ldap, LDAPResult $result): array|false {}
-/**
- * @param resource $ldap
- * @param resource $entry
- */
-function ldap_first_attribute($ldap, $entry): string|false {}
+function ldap_first_attribute(LDAP $ldap, LDAPResultEntry $entry): string|false {}
-/**
- * @param resource $ldap
- * @param resource $entry
- */
-function ldap_next_attribute($ldap, $entry): string|false {}
+function ldap_next_attribute(LDAP $ldap, LDAPResultEntry $entry): string|false {}
-/**
- * @param resource $ldap
- * @param resource $entry
- */
-function ldap_get_attributes($ldap, $entry): array {}
+function ldap_get_attributes(LDAP $ldap, LDAPResultEntry $entry): array {}
-/**
- * @param resource $ldap
- * @param resource $entry
- */
-function ldap_get_values_len($ldap, $entry, string $attribute): array|false {}
+function ldap_get_values_len(LDAP $ldap, LDAPResultEntry $entry, string $attribute): array|false {}
-/**
- * @param resource $ldap
- * @param resource $entry
- * @alias ldap_get_values_len
- */
-function ldap_get_values($ldap, $entry, string $attribute): array|false {}
+/** @alias ldap_get_values_len */
+function ldap_get_values(LDAP $ldap, LDAPResultEntry $entry, string $attribute): array|false {}
-/**
- * @param resource $ldap
- * @param resource $entry
- */
-function ldap_get_dn($ldap, $entry): string|false {}
+function ldap_get_dn(LDAP $ldap, LDAPResultEntry $entry): string|false {}
function ldap_explode_dn(string $dn, int $with_attrib): array|false {}
function ldap_dn2ufn(string $dn): string|false {}
-/** @param resource $ldap */
-function ldap_add($ldap, string $dn, array $entry, ?array $controls = null): bool {}
+function ldap_add(LDAP $ldap, string $dn, array $entry, ?array $controls = null): bool {}
-/**
- * @param resource $ldap
- * @return resource|false
- */
-function ldap_add_ext($ldap, string $dn, array $entry, ?array $controls = null) {}
+function ldap_add_ext(LDAP $ldap, string $dn, array $entry, ?array $controls = null): LDAPResult|false {}
-/** @param resource $ldap */
-function ldap_delete($ldap, string $dn, ?array $controls = null): bool {}
+function ldap_delete(LDAP $ldap, string $dn, ?array $controls = null): bool {}
-/**
- * @param resource $ldap
- * @return resource|false
- */
-function ldap_delete_ext($ldap, string $dn, ?array $controls = null) {}
+function ldap_delete_ext(LDAP $ldap, string $dn, ?array $controls = null): LDAPResult|false {}
-/** @param resource $ldap */
-function ldap_modify_batch($ldap, string $dn, array $modifications_info, ?array $controls = null): bool {}
+function ldap_modify_batch(LDAP $ldap, string $dn, array $modifications_info, ?array $controls = null): bool {}
-/** @param resource $ldap */
-function ldap_mod_add($ldap, string $dn, array $entry, ?array $controls = null): bool {}
+function ldap_mod_add(LDAP $ldap, string $dn, array $entry, ?array $controls = null): bool {}
-/**
- * @param resource $ldap
- * @return resource|false
- */
-function ldap_mod_add_ext($ldap, string $dn, array $entry, ?array $controls = null) {}
+function ldap_mod_add_ext(LDAP $ldap, string $dn, array $entry, ?array $controls = null): LDAPResult|false {}
-/** @param resource $ldap */
-function ldap_mod_replace($ldap, string $dn, array $entry, ?array $controls = null): bool {}
+function ldap_mod_replace(LDAP $ldap, string $dn, array $entry, ?array $controls = null): bool {}
-/**
- * @param resource $ldap
- * @alias ldap_mod_replace
- */
-function ldap_modify($ldap, string $dn, array $entry, ?array $controls = null): bool {}
+/** @alias ldap_mod_replace */
+function ldap_modify(LDAP $ldap, string $dn, array $entry, ?array $controls = null): bool {}
-/**
- * @param resource $ldap
- * @return resource|false
- */
-function ldap_mod_replace_ext($ldap, string $dn, array $entry, ?array $controls = null) {}
+function ldap_mod_replace_ext(LDAP $ldap, string $dn, array $entry, ?array $controls = null): LDAPResult|false {}
-/** @param resource $ldap */
-function ldap_mod_del($ldap, string $dn, array $entry, ?array $controls = null): bool {}
+function ldap_mod_del(LDAP $ldap, string $dn, array $entry, ?array $controls = null): bool {}
-/**
- * @param resource $ldap
- * @return resource|false
- */
-function ldap_mod_del_ext($ldap, string $dn, array $entry, ?array $controls = null) {}
+function ldap_mod_del_ext(LDAP $ldap, string $dn, array $entry, ?array $controls = null): LDAPResult|false {}
-/** @param resource $ldap */
-function ldap_errno($ldap): int {}
+function ldap_errno(LDAP $ldap): int {}
-/** @param resource $ldap */
-function ldap_error($ldap): string {}
+function ldap_error(LDAP $ldap): string {}
function ldap_err2str(int $errno): string {}
-/** @param resource $ldap */
-function ldap_compare($ldap, string $dn, string $attribute, string $value, ?array $controls = null): bool|int {}
+function ldap_compare(LDAP $ldap, string $dn, string $attribute, string $value, ?array $controls = null): bool|int {}
#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
-/** @param resource $ldap */
-function ldap_rename($ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls = null): bool {}
-
-/**
- * @param resource $ldap
- * @return resource|false
- */
-function ldap_rename_ext($ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls = null) {}
+function ldap_rename(LDAP $ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls = null): bool {}
+function ldap_rename_ext(LDAP $ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls = null): LDAPResult|false {}
/**
- * @param resource $ldap
* @param array|string|int $value
*/
-function ldap_get_option($ldap, int $option, &$value = null): bool {}
+function ldap_get_option(LDAP $ldap, int $option, &$value = null): bool {}
-/**
- * @param resource|null $ldap
- * @param array|string|int|bool $value
- */
-function ldap_set_option($ldap, int $option, $value): bool {}
+/** @param array|string|int|bool $value */
+function ldap_set_option(?LDAP $ldap, int $option, $value): bool {}
-/**
- * @param resource $ldap
- * @param resource $result
- */
-function ldap_count_references($ldap, $result): int {}
+function ldap_count_references(LDAP $ldap, LDAPResult $result): int {}
-/**
- * @param resource $ldap
- * @param resource $result
- * @return resource|false
- */
-function ldap_first_reference($ldap, $result) {}
+function ldap_first_reference(LDAP $ldap, LDAPResult $result): LDAPResultEntry|false {}
-/**
- * @param resource $ldap
- * @param resource $entry
- * @return resource|false
- */
-function ldap_next_reference($ldap, $entry) {}
+function ldap_next_reference(LDAP $ldap, LDAPResultEntry $entry): LDAPResultEntry|false {}
#ifdef HAVE_LDAP_PARSE_REFERENCE
-/**
- * @param resource $ldap
- * @param resource $entry
- * @param array $referrals
- */
-function ldap_parse_reference($ldap, $entry, &$referrals): bool {}
+/** @param array $referrals */
+function ldap_parse_reference(LDAP $ldap, LDAPResultEntry $entry, &$referrals): bool {}
#endif
#ifdef HAVE_LDAP_PARSE_RESULT
/**
- * @param resource $ldap
- * @param resource $result
* @param int $error_code
* @param string $matched_dn
* @param string $error_message
* @param array $referrals
* @param array $controls
*/
-function ldap_parse_result($ldap, $result, &$error_code, &$matched_dn = null, &$error_message = null, &$referrals = null, &$controls = null): bool {}
+function ldap_parse_result(LDAP $ldap, LDAPResult $result, &$error_code, &$matched_dn = null, &$error_message = null, &$referrals = null, &$controls = null): bool {}
#endif
#endif
#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
-/** @param resource $ldap */
-function ldap_set_rebind_proc($ldap, ?callable $callback): bool {}
+function ldap_set_rebind_proc(LDAP $ldap, ?callable $callback): bool {}
#endif
#ifdef HAVE_LDAP_START_TLS_S
-/** @param resource $ldap */
-function ldap_start_tls($ldap): bool {}
+function ldap_start_tls(LDAP $ldap): bool {}
#endif
function ldap_escape(string $value, string $ignore = "", int $flags = 0): string {}
@@ -274,39 +160,32 @@ function ldap_8859_to_t61(string $value): string|false {}
#ifdef HAVE_LDAP_EXTENDED_OPERATION_S
/**
- * @param resource $ldap
* @param string $response_data
* @param string $response_oid
- * @return resource|bool
*/
-function ldap_exop($ldap, string $request_oid, ?string $request_data = null, ?array $controls = NULL, &$response_data = UNKNOWN, &$response_oid = null) {}
+function ldap_exop(LDAP $ldap, string $request_oid, ?string $request_data = null, ?array $controls = NULL, &$response_data = UNKNOWN, &$response_oid = null): LDAPResult|bool {}
#endif
#ifdef HAVE_LDAP_PASSWD
/**
- * @param resource $ldap
* @param array $controls
*/
-function ldap_exop_passwd($ldap, string $user = "", string $old_password = "", string $new_password = "", &$controls = null): string|bool {}
+function ldap_exop_passwd(LDAP $ldap, string $user = "", string $old_password = "", string $new_password = "", &$controls = null): string|bool {}
#endif
#ifdef HAVE_LDAP_WHOAMI_S
-/** @param resource $ldap */
-function ldap_exop_whoami($ldap): string|false {}
+function ldap_exop_whoami(LDAP $ldap): string|false {}
#endif
#ifdef HAVE_LDAP_REFRESH_S
-/** @param resource $ldap */
-function ldap_exop_refresh($ldap, string $dn, int $ttl): int|false {}
+function ldap_exop_refresh(LDAP $ldap, string $dn, int $ttl): int|false {}
#endif
#ifdef HAVE_LDAP_PARSE_EXTENDED_RESULT
/**
- * @param resource $ldap
- * @param resource $result
* @param string $response_data
* @param string $response_oid
*/
-function ldap_parse_exop($ldap, $result, &$response_data = null, &$response_oid = null): bool {}
+function ldap_parse_exop(LDAP $ldap, LDAPResult $result, &$response_data = null, &$response_oid = null): bool {}
#endif
diff --git a/ext/ldap/ldap_arginfo.h b/ext/ldap/ldap_arginfo.h
index cb0da660ea..bcefcac8c0 100644
--- a/ext/ldap/ldap_arginfo.h
+++ b/ext/ldap/ldap_arginfo.h
@@ -1,8 +1,8 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 9e097927708f5f1d0a2ed8267422e6095e8583b0 */
+ * Stub hash: 9829bfa03164e646ed81aa6601589409002db960 */
#if defined(HAVE_ORALDAP)
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_connect, 0, 0, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_connect, 0, 0, LDAP, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, uri, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, port, IS_LONG, 0, "389")
ZEND_ARG_TYPE_INFO(0, wallet, IS_STRING, 0)
@@ -12,26 +12,26 @@ ZEND_END_ARG_INFO()
#endif
#if !(defined(HAVE_ORALDAP))
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_connect, 0, 0, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_connect, 0, 0, LDAP, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, uri, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, port, IS_LONG, 0, "389")
ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_unbind, 0, 1, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_END_ARG_INFO()
#define arginfo_ldap_close arginfo_ldap_unbind
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_bind, 0, 1, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, dn, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, password, IS_STRING, 1, "null")
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_bind_ext, 0, 0, 1)
- ZEND_ARG_INFO(0, ldap)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_bind_ext, 0, 1, LDAPResult, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, dn, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, password, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, controls, IS_ARRAY, 1, "null")
@@ -39,7 +39,7 @@ ZEND_END_ARG_INFO()
#if defined(HAVE_LDAP_SASL)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_sasl_bind, 0, 1, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, dn, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, password, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mech, IS_STRING, 1, "null")
@@ -50,7 +50,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_sasl_bind, 0, 1, _IS_BOOL,
ZEND_END_ARG_INFO()
#endif
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_read, 0, 0, 3)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_read, 0, 3, LDAPResult, MAY_BE_ARRAY|MAY_BE_FALSE)
ZEND_ARG_INFO(0, ldap)
ZEND_ARG_TYPE_MASK(0, base, MAY_BE_ARRAY|MAY_BE_STRING, NULL)
ZEND_ARG_TYPE_MASK(0, filter, MAY_BE_ARRAY|MAY_BE_STRING, NULL)
@@ -66,43 +66,45 @@ ZEND_END_ARG_INFO()
#define arginfo_ldap_search arginfo_ldap_read
-#define arginfo_ldap_free_result arginfo_ldap_unbind
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_free_result, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_OBJ_INFO(0, result, LDAPResult, 0)
+ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_count_entries, 0, 2, IS_LONG, 0)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, result)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, result, LDAPResult, 0)
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_first_entry, 0, 0, 2)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, result)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_first_entry, 0, 2, LDAPResultEntry, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, result, LDAPResult, 0)
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_next_entry, 0, 0, 2)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, entry)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_next_entry, 0, 2, LDAPResultEntry, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, entry, LDAPResultEntry, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ldap_get_entries, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, result)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, result, LDAPResult, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ldap_first_attribute, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, entry)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, entry, LDAPResultEntry, 0)
ZEND_END_ARG_INFO()
#define arginfo_ldap_next_attribute arginfo_ldap_first_attribute
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_get_attributes, 0, 2, IS_ARRAY, 0)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, entry)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, entry, LDAPResultEntry, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ldap_get_values_len, 0, 3, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, entry)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, entry, LDAPResultEntry, 0)
ZEND_ARG_TYPE_INFO(0, attribute, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -120,33 +122,33 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ldap_dn2ufn, 0, 1, MAY_BE_STRING
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_add, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, dn, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, entry, IS_ARRAY, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, controls, IS_ARRAY, 1, "null")
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_add_ext, 0, 0, 3)
- ZEND_ARG_INFO(0, ldap)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_add_ext, 0, 3, LDAPResult, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, dn, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, entry, IS_ARRAY, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, controls, IS_ARRAY, 1, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_delete, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, dn, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, controls, IS_ARRAY, 1, "null")
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_delete_ext, 0, 0, 2)
- ZEND_ARG_INFO(0, ldap)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_delete_ext, 0, 2, LDAPResult, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, dn, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, controls, IS_ARRAY, 1, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_modify_batch, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, dn, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, modifications_info, IS_ARRAY, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, controls, IS_ARRAY, 1, "null")
@@ -167,11 +169,11 @@ ZEND_END_ARG_INFO()
#define arginfo_ldap_mod_del_ext arginfo_ldap_add_ext
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_errno, 0, 1, IS_LONG, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_error, 0, 1, IS_STRING, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_err2str, 0, 1, IS_STRING, 0)
@@ -179,7 +181,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_err2str, 0, 1, IS_STRING, 0
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ldap_compare, 0, 4, MAY_BE_BOOL|MAY_BE_LONG)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, dn, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, attribute, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0)
@@ -188,7 +190,7 @@ ZEND_END_ARG_INFO()
#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_rename, 0, 5, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, dn, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, new_rdn, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, new_parent, IS_STRING, 0)
@@ -198,8 +200,8 @@ ZEND_END_ARG_INFO()
#endif
#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_rename_ext, 0, 0, 5)
- ZEND_ARG_INFO(0, ldap)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_rename_ext, 0, 5, LDAPResult, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, dn, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, new_rdn, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, new_parent, IS_STRING, 0)
@@ -210,7 +212,7 @@ ZEND_END_ARG_INFO()
#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_get_option, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, value, "null")
ZEND_END_ARG_INFO()
@@ -218,7 +220,7 @@ ZEND_END_ARG_INFO()
#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_set_option, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 1)
ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0)
ZEND_ARG_INFO(0, value)
ZEND_END_ARG_INFO()
@@ -226,37 +228,37 @@ ZEND_END_ARG_INFO()
#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_count_references, 0, 2, IS_LONG, 0)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, result)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, result, LDAPResult, 0)
ZEND_END_ARG_INFO()
#endif
#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_first_reference, 0, 0, 2)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, result)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_first_reference, 0, 2, LDAPResultEntry, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, result, LDAPResult, 0)
ZEND_END_ARG_INFO()
#endif
#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_next_reference, 0, 0, 2)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, entry)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_next_reference, 0, 2, LDAPResultEntry, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, entry, LDAPResultEntry, 0)
ZEND_END_ARG_INFO()
#endif
#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) && defined(HAVE_LDAP_PARSE_REFERENCE)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_parse_reference, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, entry)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, entry, LDAPResultEntry, 0)
ZEND_ARG_INFO(1, referrals)
ZEND_END_ARG_INFO()
#endif
#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) && defined(HAVE_LDAP_PARSE_RESULT)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_parse_result, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, result)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, result, LDAPResult, 0)
ZEND_ARG_INFO(1, error_code)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, matched_dn, "null")
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, error_message, "null")
@@ -267,14 +269,14 @@ ZEND_END_ARG_INFO()
#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_set_rebind_proc, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 1)
ZEND_END_ARG_INFO()
#endif
#if defined(HAVE_LDAP_START_TLS_S)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_start_tls, 0, 1, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_END_ARG_INFO()
#endif
@@ -295,8 +297,8 @@ ZEND_END_ARG_INFO()
#endif
#if defined(HAVE_LDAP_EXTENDED_OPERATION_S)
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_exop, 0, 0, 2)
- ZEND_ARG_INFO(0, ldap)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_exop, 0, 2, LDAPResult, MAY_BE_BOOL)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, request_oid, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, request_data, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, controls, IS_ARRAY, 1, "NULL")
@@ -307,7 +309,7 @@ ZEND_END_ARG_INFO()
#if defined(HAVE_LDAP_PASSWD)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ldap_exop_passwd, 0, 1, MAY_BE_STRING|MAY_BE_BOOL)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, user, IS_STRING, 0, "\"\"")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, old_password, IS_STRING, 0, "\"\"")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, new_password, IS_STRING, 0, "\"\"")
@@ -317,13 +319,13 @@ ZEND_END_ARG_INFO()
#if defined(HAVE_LDAP_WHOAMI_S)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ldap_exop_whoami, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_END_ARG_INFO()
#endif
#if defined(HAVE_LDAP_REFRESH_S)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ldap_exop_refresh, 0, 3, MAY_BE_LONG|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ldap)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
ZEND_ARG_TYPE_INFO(0, dn, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, ttl, IS_LONG, 0)
ZEND_END_ARG_INFO()
@@ -331,8 +333,8 @@ ZEND_END_ARG_INFO()
#if defined(HAVE_LDAP_PARSE_EXTENDED_RESULT)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_parse_exop, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ldap)
- ZEND_ARG_INFO(0, result)
+ ZEND_ARG_OBJ_INFO(0, ldap, LDAP, 0)
+ ZEND_ARG_OBJ_INFO(0, result, LDAPResult, 0)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, response_data, "null")
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, response_oid, "null")
ZEND_END_ARG_INFO()
@@ -541,3 +543,51 @@ static const zend_function_entry ext_functions[] = {
#endif
ZEND_FE_END
};
+
+
+static const zend_function_entry class_LDAP_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_LDAPResult_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_LDAPResultEntry_methods[] = {
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class_LDAP(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "LDAP", class_LDAP_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_LDAPResult(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "LDAPResult", class_LDAPResult_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_LDAPResultEntry(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "LDAPResultEntry", class_LDAPResultEntry_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/ldap/tests/bug48441.phpt b/ext/ldap/tests/bug48441.phpt
index c4b224c7a7..fc24816211 100644
--- a/ext/ldap/tests/bug48441.phpt
+++ b/ext/ldap/tests/bug48441.phpt
@@ -38,7 +38,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(4) {
["count"]=>
int(3)
@@ -93,7 +94,8 @@ array(4) {
}
Warning: ldap_search(): Partial search results returned: Sizelimit exceeded in %s on line %d
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
@@ -112,7 +114,8 @@ array(2) {
string(%d) "cn=userA,%s"
}
}
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(4) {
["count"]=>
int(3)
diff --git a/ext/ldap/tests/bug72021.phpt b/ext/ldap/tests/bug72021.phpt
index 6dfcf44680..f5e46eb615 100644
--- a/ext/ldap/tests/bug72021.phpt
+++ b/ext/ldap/tests/bug72021.phpt
@@ -8,7 +8,7 @@ Chad Sikorra <Chad.Sikorra@gmail.com>
<?php
$subject = " Joe,= \rSmith ";
-var_dump(ldap_escape($subject, null, LDAP_ESCAPE_DN));
+var_dump(ldap_escape($subject, '', LDAP_ESCAPE_DN));
?>
--EXPECT--
string(24) "\20Joe\2c\3d \0dSmith\20"
diff --git a/ext/ldap/tests/bug73933.phpt b/ext/ldap/tests/bug73933.phpt
index 8e50a750e2..3dd093223a 100644
--- a/ext/ldap/tests/bug73933.phpt
+++ b/ext/ldap/tests/bug73933.phpt
@@ -9,18 +9,17 @@ require_once('skipif.inc');
/* We are assuming 3333 is not connectable */
$ldap = ldap_connect('127.0.0.1', 3333);
-ldap_mod_replace($ldap, null, array(
+ldap_mod_replace($ldap, '', array(
'lockoutTime' => array(0),
));
-ldap_modify_batch($ldap, null, array( [
+ldap_modify_batch($ldap, '', array( [
"attrib" => "mail",
"modtype" => LDAP_MODIFY_BATCH_ADD,
"values" => [
"test@example.com",
"test-2@example.com", ]]));
-
ldap_close($ldap);
?>
diff --git a/ext/ldap/tests/bug77958.phpt b/ext/ldap/tests/bug77958.phpt
index b370b40eda..318ebf0e9b 100644
--- a/ext/ldap/tests/bug77958.phpt
+++ b/ext/ldap/tests/bug77958.phpt
@@ -42,7 +42,8 @@ remove_dummy_data($link, $base);
?>
--EXPECTF--
bool(true)
-resource(%d) of type (ldap result entry)
+object(LDAPResultEntry)#%d (0) {
+}
array(3) {
[0]=>
string(14) "xx-xx-xx-xx-xx"
diff --git a/ext/ldap/tests/ldap_add_ext.phpt b/ext/ldap/tests/ldap_add_ext.phpt
index fbcaff523b..8fb2d3db5b 100644
--- a/ext/ldap/tests/ldap_add_ext.phpt
+++ b/ext/ldap/tests/ldap_add_ext.phpt
@@ -41,7 +41,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
ldap_delete($link, "o=test_ldap_add_ext,$base");
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
int(0)
string(0) ""
diff --git a/ext/ldap/tests/ldap_bind_ext.phpt b/ext/ldap/tests/ldap_bind_ext.phpt
index 685b0588ce..f43edf76c3 100644
--- a/ext/ldap/tests/ldap_bind_ext.phpt
+++ b/ext/ldap/tests/ldap_bind_ext.phpt
@@ -44,25 +44,29 @@ var_dump(
);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
int(0)
string(0) ""
array(0) {
}
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
int(0)
string(0) ""
array(0) {
}
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
int(49)
string(0) ""
array(0) {
}
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
int(34)
string(10) "invalid DN"
diff --git a/ext/ldap/tests/ldap_connect_basic.phpt b/ext/ldap/tests/ldap_connect_basic.phpt
index 0d03c99d59..3be030b4fa 100644
--- a/ext/ldap/tests/ldap_connect_basic.phpt
+++ b/ext/ldap/tests/ldap_connect_basic.phpt
@@ -13,4 +13,5 @@ $link = ldap_connect($host, $port);
var_dump($link);
?>
--EXPECTF--
-resource(%d) of type (ldap link)
+object(LDAP)#%d (0) {
+}
diff --git a/ext/ldap/tests/ldap_connect_variation.phpt b/ext/ldap/tests/ldap_connect_variation.phpt
index 1405e0706f..36c72e0202 100644
--- a/ext/ldap/tests/ldap_connect_variation.phpt
+++ b/ext/ldap/tests/ldap_connect_variation.phpt
@@ -30,8 +30,13 @@ $link = ldap_connect("nonexistent" . $host);
var_dump($link);
?>
--EXPECTF--
-resource(%d) of type (ldap link)
-resource(%d) of type (ldap link)
-resource(%d) of type (ldap link)
-resource(%d) of type (ldap link)
-resource(%d) of type (ldap link)
+object(LDAP)#%d (0) {
+}
+object(LDAP)#%d (0) {
+}
+object(LDAP)#%d (0) {
+}
+object(LDAP)#%d (0) {
+}
+object(LDAP)#%d (0) {
+}
diff --git a/ext/ldap/tests/ldap_controls.phpt b/ext/ldap/tests/ldap_controls.phpt
index e6e0ab6164..396202f3cb 100644
--- a/ext/ldap/tests/ldap_controls.phpt
+++ b/ext/ldap/tests/ldap_controls.phpt
@@ -65,7 +65,8 @@ Warning: ldap_modify(): Modify: Assertion Failed in %s on line %d
Warning: ldap_delete(): Delete: Assertion Failed in %s on line %d
Warning: ldap_compare(): Compare: Assertion Failed in %s on line %d
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
@@ -88,7 +89,8 @@ array(2) {
}
bool(false)
bool(true)
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
@@ -110,7 +112,8 @@ array(2) {
}
}
bool(false)
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
@@ -138,7 +141,8 @@ bool(false)
bool(true)
int(-1)
bool(true)
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(4) {
["count"]=>
int(3)
@@ -149,7 +153,8 @@ array(4) {
[2]=>
string(10) "Antarctica"
}
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(3) {
["count"]=>
int(2)
diff --git a/ext/ldap/tests/ldap_delete_ext.phpt b/ext/ldap/tests/ldap_delete_ext.phpt
index bcdc15ba51..5e7eeafecf 100644
--- a/ext/ldap/tests/ldap_delete_ext.phpt
+++ b/ext/ldap/tests/ldap_delete_ext.phpt
@@ -43,7 +43,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
ldap_delete($link, "dc=my-domain,$base");
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
int(0)
string(0) ""
diff --git a/ext/ldap/tests/ldap_escape_both.phpt b/ext/ldap/tests/ldap_escape_both.phpt
index 424a4575af..6c8c970b98 100644
--- a/ext/ldap/tests/ldap_escape_both.phpt
+++ b/ext/ldap/tests/ldap_escape_both.phpt
@@ -7,7 +7,7 @@ ldap_escape() test filter and DN
$subject = 'foo=bar(baz)*';
-var_dump(ldap_escape($subject, null, LDAP_ESCAPE_DN | LDAP_ESCAPE_FILTER));
+var_dump(ldap_escape($subject, '', LDAP_ESCAPE_DN | LDAP_ESCAPE_FILTER));
?>
--EXPECT--
diff --git a/ext/ldap/tests/ldap_escape_dn.phpt b/ext/ldap/tests/ldap_escape_dn.phpt
index d80e02dee7..fd2ffb2567 100644
--- a/ext/ldap/tests/ldap_escape_dn.phpt
+++ b/ext/ldap/tests/ldap_escape_dn.phpt
@@ -7,7 +7,7 @@ ldap_escape() test DN
$subject = 'foo=bar(baz)*';
-var_dump(ldap_escape($subject, null, LDAP_ESCAPE_DN));
+var_dump(ldap_escape($subject, '', LDAP_ESCAPE_DN));
?>
--EXPECT--
diff --git a/ext/ldap/tests/ldap_escape_filter.phpt b/ext/ldap/tests/ldap_escape_filter.phpt
index d156f56c87..5f0be7f40a 100644
--- a/ext/ldap/tests/ldap_escape_filter.phpt
+++ b/ext/ldap/tests/ldap_escape_filter.phpt
@@ -7,7 +7,7 @@ ldap_escape() test filter
$subject = 'foo=bar(baz)*';
-var_dump(ldap_escape($subject, null, LDAP_ESCAPE_FILTER));
+var_dump(ldap_escape($subject, '', LDAP_ESCAPE_FILTER));
?>
--EXPECT--
diff --git a/ext/ldap/tests/ldap_exop.phpt b/ext/ldap/tests/ldap_exop.phpt
index abb63e877f..dc443c2c5f 100644
--- a/ext/ldap/tests/ldap_exop.phpt
+++ b/ext/ldap/tests/ldap_exop.phpt
@@ -36,8 +36,6 @@ function extract_genpw($retdata)
$userAPassword = "oops";
-// ldap_exop(resource link, string reqoid [, string reqdata [, array servercontrols [, string &retdata [, string &retoid]]]])
-// bool ldap_parse_exop(resource link, resource result [, string &retdata [, string &retoid]])
var_dump(
ldap_exop($link, LDAP_EXOP_WHO_AM_I, NULL, NULL, $retdata, $retoid),
$retdata,
@@ -69,11 +67,13 @@ string(%d) "dn:%s"
string(0) ""
bool(true)
string(%d) "dn:cn=user%s"
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
string(%d) "dn:%s"
bool(true)
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
string(%d) "%s"
string(0) ""
diff --git a/ext/ldap/tests/ldap_exop_passwd.phpt b/ext/ldap/tests/ldap_exop_passwd.phpt
index 1b0a1e7397..f04d258aee 100644
--- a/ext/ldap/tests/ldap_exop_passwd.phpt
+++ b/ext/ldap/tests/ldap_exop_passwd.phpt
@@ -14,7 +14,6 @@ insert_dummy_data($link, $base);
// ldap_exop_passwd() allows to pass the DN, OLD and NEW passwords,
// and optionally returns the NEW password if none was passed.
-// ldap_exop_passwd(resource link [, string user [, string oldpw [, string newpw [, string newpasswd ]]]])
var_dump(
$genpw = ldap_exop_passwd($link, "cn=userA,$base", "oops", "", $ctrls),
$ctrls,
diff --git a/ext/ldap/tests/ldap_exop_whoami.phpt b/ext/ldap/tests/ldap_exop_whoami.phpt
index 2c71848b00..35c86ca155 100644
--- a/ext/ldap/tests/ldap_exop_whoami.phpt
+++ b/ext/ldap/tests/ldap_exop_whoami.phpt
@@ -12,7 +12,6 @@ require "connect.inc";
$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
insert_dummy_data($link, $base);
-// ldap_exop_whoami(resource link [, string authzid])
var_dump(
ldap_exop_whoami($link)
);
diff --git a/ext/ldap/tests/ldap_first_attribute_error.phpt b/ext/ldap/tests/ldap_first_attribute_error.phpt
index 79138669bc..d5c11ca800 100644
--- a/ext/ldap/tests/ldap_first_attribute_error.phpt
+++ b/ext/ldap/tests/ldap_first_attribute_error.phpt
@@ -17,4 +17,4 @@ try {
}
?>
--EXPECT--
-ldap_first_attribute(): supplied resource is not a valid ldap result entry resource
+ldap_first_attribute(): Argument #2 ($entry) must be of type LDAPResultEntry, LDAP given
diff --git a/ext/ldap/tests/ldap_first_entry_basic.phpt b/ext/ldap/tests/ldap_first_entry_basic.phpt
index 94d46d6d87..56a4943b6a 100644
--- a/ext/ldap/tests/ldap_first_entry_basic.phpt
+++ b/ext/ldap/tests/ldap_first_entry_basic.phpt
@@ -26,7 +26,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result entry)
+object(LDAPResultEntry)#%d (0) {
+}
array(2) {
[0]=>
string(7) "testSN%d"
diff --git a/ext/ldap/tests/ldap_first_reference_basic.phpt b/ext/ldap/tests/ldap_first_reference_basic.phpt
index 0e41ee2458..9d00d08f43 100644
--- a/ext/ldap/tests/ldap_first_reference_basic.phpt
+++ b/ext/ldap/tests/ldap_first_reference_basic.phpt
@@ -33,7 +33,8 @@ ldap_delete($link, "cn=userref,$base", [['oid' => LDAP_CONTROL_MANAGEDSAIT, 'isc
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result entry)
+object(LDAPResultEntry)#%d (0) {
+}
array(1) {
[0]=>
string(%d) "cn=userA,%s"
diff --git a/ext/ldap/tests/ldap_get_option_controls.phpt b/ext/ldap/tests/ldap_get_option_controls.phpt
index 813f33e069..6cb61084b9 100644
--- a/ext/ldap/tests/ldap_get_option_controls.phpt
+++ b/ext/ldap/tests/ldap_get_option_controls.phpt
@@ -104,7 +104,8 @@ array(1) {
}
}
}
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
int(1)
bool(true)
bool(false)
diff --git a/ext/ldap/tests/ldap_list_basic.phpt b/ext/ldap/tests/ldap_list_basic.phpt
index f4d8bda31b..5a10166b88 100644
--- a/ext/ldap/tests/ldap_list_basic.phpt
+++ b/ext/ldap/tests/ldap_list_basic.phpt
@@ -28,7 +28,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(3) {
["count"]=>
int(2)
diff --git a/ext/ldap/tests/ldap_mod_ext.phpt b/ext/ldap/tests/ldap_mod_ext.phpt
index 0ca091fed8..9b4b32eef3 100644
--- a/ext/ldap/tests/ldap_mod_ext.phpt
+++ b/ext/ldap/tests/ldap_mod_ext.phpt
@@ -62,7 +62,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
int(0)
string(0) ""
@@ -133,7 +134,8 @@ array(2) {
string(%d) "o=test,%s"
}
}
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
int(0)
string(0) ""
diff --git a/ext/ldap/tests/ldap_next_entry_basic.phpt b/ext/ldap/tests/ldap_next_entry_basic.phpt
index d8f03ce291..b640b83836 100644
--- a/ext/ldap/tests/ldap_next_entry_basic.phpt
+++ b/ext/ldap/tests/ldap_next_entry_basic.phpt
@@ -28,7 +28,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result entry)
+object(LDAPResultEntry)#%d (0) {
+}
array(2) {
[0]=>
string(7) "testSN%d"
diff --git a/ext/ldap/tests/ldap_next_reference_basic.phpt b/ext/ldap/tests/ldap_next_reference_basic.phpt
index 7af26ff91c..1cc03b4dcf 100644
--- a/ext/ldap/tests/ldap_next_reference_basic.phpt
+++ b/ext/ldap/tests/ldap_next_reference_basic.phpt
@@ -39,7 +39,8 @@ ldap_delete($link, "cn=userref2,$base", [['oid' => LDAP_CONTROL_MANAGEDSAIT, 'is
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result entry)
+object(LDAPResultEntry)#%d (0) {
+}
array(1) {
[0]=>
string(%d) "cn=userB,%s"
diff --git a/ext/ldap/tests/ldap_parse_result_controls.phpt b/ext/ldap/tests/ldap_parse_result_controls.phpt
index 2a5f7e1d3b..1abb9887c1 100644
--- a/ext/ldap/tests/ldap_parse_result_controls.phpt
+++ b/ext/ldap/tests/ldap_parse_result_controls.phpt
@@ -36,7 +36,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
string(22) "1.2.840.113556.1.4.319"
int(%d)
diff --git a/ext/ldap/tests/ldap_read_basic.phpt b/ext/ldap/tests/ldap_read_basic.phpt
index 596c02a71e..2597395d6b 100644
--- a/ext/ldap/tests/ldap_read_basic.phpt
+++ b/ext/ldap/tests/ldap_read_basic.phpt
@@ -28,7 +28,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
diff --git a/ext/ldap/tests/ldap_read_variation1.phpt b/ext/ldap/tests/ldap_read_variation1.phpt
index d5c731870c..f0865dee62 100644
--- a/ext/ldap/tests/ldap_read_variation1.phpt
+++ b/ext/ldap/tests/ldap_read_variation1.phpt
@@ -8,7 +8,7 @@ if (!extension_loaded('ldap')) die('skip ldap extension not available');
<?php
$array = [123, 456, 789];
try {
- ldap_read(null, null, null, $array);
+ ldap_read(null, '', '', $array);
} catch (TypeError $err) {}
var_dump($array);
?>
diff --git a/ext/ldap/tests/ldap_rename_ext.phpt b/ext/ldap/tests/ldap_rename_ext.phpt
index e4f7d8364e..9d249c71ec 100644
--- a/ext/ldap/tests/ldap_rename_ext.phpt
+++ b/ext/ldap/tests/ldap_rename_ext.phpt
@@ -42,7 +42,8 @@ ldap_rename($link, "cn=userZ,$base", "cn=userA", "$base", true);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
bool(true)
int(0)
string(0) ""
diff --git a/ext/ldap/tests/ldap_search_basic.phpt b/ext/ldap/tests/ldap_search_basic.phpt
index f7ed449c16..b10a1d7b11 100644
--- a/ext/ldap/tests/ldap_search_basic.phpt
+++ b/ext/ldap/tests/ldap_search_basic.phpt
@@ -29,7 +29,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(4) {
["count"]=>
int(3)
diff --git a/ext/ldap/tests/ldap_search_error.phpt b/ext/ldap/tests/ldap_search_error.phpt
index 3e8167bf2c..1b02e549b3 100644
--- a/ext/ldap/tests/ldap_search_error.phpt
+++ b/ext/ldap/tests/ldap_search_error.phpt
@@ -61,5 +61,5 @@ bool(false)
ldap_search(): Argument #1 ($ldap) cannot be empty
ldap_search(): Argument #2 ($base) must have the same number of elements as the links array
ldap_search(): Argument #3 ($filter) must have the same number of elements as the links array
-ldap_search(): Argument #2 ($base) must be of type string when argument #1 ($ldap) is a resource
-ldap_search(): Argument #3 ($filter) must be of type string when argument #1 ($ldap) is a resource
+ldap_search(): Argument #2 ($base) must be of type string when argument #1 ($ldap) is an LDAP instance
+ldap_search(): Argument #3 ($filter) must be of type string when argument #1 ($ldap) is an LDAP instance
diff --git a/ext/ldap/tests/ldap_search_overrides.phpt b/ext/ldap/tests/ldap_search_overrides.phpt
index 5bd351a741..eaf042c6d2 100644
--- a/ext/ldap/tests/ldap_search_overrides.phpt
+++ b/ext/ldap/tests/ldap_search_overrides.phpt
@@ -20,7 +20,7 @@ ldap_set_option($link, LDAP_OPT_NETWORK_TIMEOUT, 44);
insert_dummy_data($link, $base);
var_dump(
- $result = ldap_search($link, "$base", "(objectClass=person)", array(), null, 111, 22, LDAP_DEREF_NEVER),
+ $result = ldap_search($link, "$base", "(objectClass=person)", array(), 0, 111, 22, LDAP_DEREF_NEVER),
ldap_get_entries($link, $result)
);
var_dump(
@@ -42,7 +42,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(4) {
["count"]=>
int(3)
diff --git a/ext/ldap/tests/ldap_search_paged_result_controls.phpt b/ext/ldap/tests/ldap_search_paged_result_controls.phpt
index f60acd3e0c..7e55fb359f 100644
--- a/ext/ldap/tests/ldap_search_paged_result_controls.phpt
+++ b/ext/ldap/tests/ldap_search_paged_result_controls.phpt
@@ -36,7 +36,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(3) {
["count"]=>
int(2)
@@ -74,7 +75,8 @@ array(3) {
}
}
bool(true)
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
diff --git a/ext/ldap/tests/ldap_search_sort_controls.phpt b/ext/ldap/tests/ldap_search_sort_controls.phpt
index f55faf4930..886064a72c 100644
--- a/ext/ldap/tests/ldap_search_sort_controls.phpt
+++ b/ext/ldap/tests/ldap_search_sort_controls.phpt
@@ -78,7 +78,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(4) {
["count"]=>
int(3)
@@ -146,7 +147,8 @@ array(1) {
}
}
}
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(3) {
["count"]=>
int(2)
diff --git a/ext/ldap/tests/ldap_search_variation1.phpt b/ext/ldap/tests/ldap_search_variation1.phpt
index 88eb79aa77..60d2ea21b6 100644
--- a/ext/ldap/tests/ldap_search_variation1.phpt
+++ b/ext/ldap/tests/ldap_search_variation1.phpt
@@ -31,7 +31,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
diff --git a/ext/ldap/tests/ldap_search_variation2.phpt b/ext/ldap/tests/ldap_search_variation2.phpt
index 8b130aaa08..5f0f284dc5 100644
--- a/ext/ldap/tests/ldap_search_variation2.phpt
+++ b/ext/ldap/tests/ldap_search_variation2.phpt
@@ -29,7 +29,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(4) {
["count"]=>
int(3)
diff --git a/ext/ldap/tests/ldap_search_variation3.phpt b/ext/ldap/tests/ldap_search_variation3.phpt
index d0b6ec5cad..17b0da4574 100644
--- a/ext/ldap/tests/ldap_search_variation3.phpt
+++ b/ext/ldap/tests/ldap_search_variation3.phpt
@@ -36,7 +36,8 @@ $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link, $base);
?>
--EXPECTF--
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(4) {
["count"]=>
int(3)
@@ -85,7 +86,8 @@ array(4) {
}
Warning: ldap_search(): Partial search results returned: Sizelimit exceeded in %s on line %d
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
diff --git a/ext/ldap/tests/ldap_search_variation4.phpt b/ext/ldap/tests/ldap_search_variation4.phpt
index 694840b397..981f110627 100644
--- a/ext/ldap/tests/ldap_search_variation4.phpt
+++ b/ext/ldap/tests/ldap_search_variation4.phpt
@@ -32,7 +32,8 @@ remove_dummy_data($link, $base);
?>
--EXPECTF--
Warning: ldap_search(): Partial search results returned: Sizelimit exceeded in %s on line %d
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
diff --git a/ext/ldap/tests/ldap_search_variation5.phpt b/ext/ldap/tests/ldap_search_variation5.phpt
index 211df9a128..7f3674edc0 100644
--- a/ext/ldap/tests/ldap_search_variation5.phpt
+++ b/ext/ldap/tests/ldap_search_variation5.phpt
@@ -40,7 +40,8 @@ remove_dummy_data($link, $base);
?>
--EXPECTF--
Warning: ldap_search(): Partial search results returned: Sizelimit exceeded in %s on line %d
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
@@ -61,7 +62,8 @@ array(2) {
}
Warning: ldap_search(): Partial search results returned: Sizelimit exceeded in %s on line %d
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
@@ -82,7 +84,8 @@ array(2) {
}
Warning: ldap_search(): Partial search results returned: Sizelimit exceeded in %s on line %d
-resource(%d) of type (ldap result)
+object(LDAPResult)#%d (0) {
+}
array(2) {
["count"]=>
int(1)
diff --git a/ext/ldap/tests/ldap_search_variation6.phpt b/ext/ldap/tests/ldap_search_variation6.phpt
index 6451c2930b..e0b5ba9825 100644
--- a/ext/ldap/tests/ldap_search_variation6.phpt
+++ b/ext/ldap/tests/ldap_search_variation6.phpt
@@ -45,9 +45,11 @@ remove_dummy_data($link, $base);
--EXPECTF--
array(2) {
[0]=>
- resource(%d) of type (ldap result)
+ object(LDAPResult)#%d (0) {
+ }
[1]=>
- resource(%d) of type (ldap result)
+ object(LDAPResult)#%d (0) {
+ }
}
array(4) {
["count"]=>
@@ -212,9 +214,11 @@ array(4) {
bool(true)
array(2) {
[0]=>
- resource(%d) of type (ldap result)
+ object(LDAPResult)#%d (0) {
+ }
[1]=>
- resource(%d) of type (ldap result)
+ object(LDAPResult)#%d (0) {
+ }
}
array(1) {
["count"]=>
@@ -226,9 +230,11 @@ array(1) {
}
array(2) {
[0]=>
- resource(%d) of type (ldap result)
+ object(LDAPResult)#%d (0) {
+ }
[1]=>
- resource(%d) of type (ldap result)
+ object(LDAPResult)#%d (0) {
+ }
}
array(1) {
["count"]=>
diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c
index fab8c3cf07..0b4d3568f5 100644
--- a/ext/libxml/libxml.c
+++ b/ext/libxml/libxml.c
@@ -786,8 +786,6 @@ PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext)
static PHP_MINIT_FUNCTION(libxml)
{
- zend_class_entry ce;
-
php_libxml_initialize();
REGISTER_LONG_CONSTANT("LIBXML_VERSION", LIBXML_VERSION, CONST_CS | CONST_PERSISTENT);
@@ -835,35 +833,7 @@ static PHP_MINIT_FUNCTION(libxml)
REGISTER_LONG_CONSTANT("LIBXML_ERR_ERROR", XML_ERR_ERROR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("LIBXML_ERR_FATAL", XML_ERR_FATAL, CONST_CS | CONST_PERSISTENT);
- INIT_CLASS_ENTRY(ce, "LibXMLError", NULL);
- libxmlerror_class_entry = zend_register_internal_class(&ce);
-
- zval default_val;
- zend_string *name;
- ZVAL_UNDEF(&default_val);
-
- name = zend_string_init("level", sizeof("level")-1, 1);
- zend_declare_typed_property(
- libxmlerror_class_entry, name, &default_val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
- zend_string_release(name);
- zend_declare_typed_property(
- libxmlerror_class_entry, ZSTR_KNOWN(ZEND_STR_CODE), &default_val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
- name = zend_string_init("column", sizeof("column")-1, 1);
- zend_declare_typed_property(
- libxmlerror_class_entry, name, &default_val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
- zend_string_release(name);
- zend_declare_typed_property(
- libxmlerror_class_entry, ZSTR_KNOWN(ZEND_STR_MESSAGE), &default_val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
- zend_declare_typed_property(
- libxmlerror_class_entry, ZSTR_KNOWN(ZEND_STR_FILE), &default_val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
- zend_declare_typed_property(
- libxmlerror_class_entry, ZSTR_KNOWN(ZEND_STR_LINE), &default_val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ libxmlerror_class_entry = register_class_LibXMLError();
if (sapi_module.name) {
static const char * const supported_sapis[] = {
@@ -987,7 +957,7 @@ PHP_FUNCTION(libxml_set_streams_context)
PHP_FUNCTION(libxml_use_internal_errors)
{
xmlStructuredErrorFunc current_handler;
- zend_bool use_errors, use_errors_is_null = 1, retval;
+ bool use_errors, use_errors_is_null = 1, retval;
ZEND_PARSE_PARAMETERS_START(0, 1)
Z_PARAM_OPTIONAL
@@ -1107,9 +1077,9 @@ PHP_FUNCTION(libxml_clear_errors)
}
/* }}} */
-PHP_LIBXML_API zend_bool php_libxml_disable_entity_loader(zend_bool disable) /* {{{ */
+PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable) /* {{{ */
{
- zend_bool old = LIBXML(entity_loader_disabled);
+ bool old = LIBXML(entity_loader_disabled);
LIBXML(entity_loader_disabled) = disable;
return old;
@@ -1118,7 +1088,7 @@ PHP_LIBXML_API zend_bool php_libxml_disable_entity_loader(zend_bool disable) /*
/* {{{ Disable/Enable ability to load external entities */
PHP_FUNCTION(libxml_disable_entity_loader)
{
- zend_bool disable = 1;
+ bool disable = 1;
ZEND_PARSE_PARAMETERS_START(0, 1)
Z_PARAM_OPTIONAL
diff --git a/ext/libxml/libxml.stub.php b/ext/libxml/libxml.stub.php
index c99b2254a2..dc55815e6c 100644
--- a/ext/libxml/libxml.stub.php
+++ b/ext/libxml/libxml.stub.php
@@ -1,9 +1,15 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class LibXMLError
{
+ public int $level;
+ public int $code;
+ public int $column;
+ public string $message;
+ public string $file;
+ public int $line;
}
/** @param resource $context */
diff --git a/ext/libxml/libxml_arginfo.h b/ext/libxml/libxml_arginfo.h
index ee0b4723d3..ff179c3028 100644
--- a/ext/libxml/libxml_arginfo.h
+++ b/ext/libxml/libxml_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 1cc89432b61dc1997afe96e02f82a8fd1a6fcfc4 */
+ * Stub hash: 252fdc1cd83d2d3322cc040baf2bf3c7fde29254 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_libxml_set_streams_context, 0, 1, IS_VOID, 0)
ZEND_ARG_INFO(0, context)
@@ -51,3 +51,49 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_LibXMLError_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_LibXMLError(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "LibXMLError", class_LibXMLError_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ zval property_level_default_value;
+ ZVAL_UNDEF(&property_level_default_value);
+ zend_string *property_level_name = zend_string_init("level", sizeof("level") - 1, 1);
+ zend_declare_typed_property(class_entry, property_level_name, &property_level_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_level_name);
+
+ zval property_code_default_value;
+ ZVAL_UNDEF(&property_code_default_value);
+ zend_string *property_code_name = zend_string_init("code", sizeof("code") - 1, 1);
+ zend_declare_typed_property(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_code_name);
+
+ zval property_column_default_value;
+ ZVAL_UNDEF(&property_column_default_value);
+ zend_string *property_column_name = zend_string_init("column", sizeof("column") - 1, 1);
+ zend_declare_typed_property(class_entry, property_column_name, &property_column_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_column_name);
+
+ zval property_message_default_value;
+ ZVAL_UNDEF(&property_message_default_value);
+ zend_string *property_message_name = zend_string_init("message", sizeof("message") - 1, 1);
+ zend_declare_typed_property(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_message_name);
+
+ zval property_file_default_value;
+ ZVAL_UNDEF(&property_file_default_value);
+ zend_string *property_file_name = zend_string_init("file", sizeof("file") - 1, 1);
+ zend_declare_typed_property(class_entry, property_file_name, &property_file_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_file_name);
+
+ zval property_line_default_value;
+ ZVAL_UNDEF(&property_line_default_value);
+ zend_string *property_line_name = zend_string_init("line", sizeof("line") - 1, 1);
+ zend_declare_typed_property(class_entry, property_line_name, &property_line_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_line_name);
+
+ return class_entry;
+}
diff --git a/ext/libxml/php_libxml.h b/ext/libxml/php_libxml.h
index 85ffcd3969..784bc457ae 100644
--- a/ext/libxml/php_libxml.h
+++ b/ext/libxml/php_libxml.h
@@ -47,7 +47,7 @@ ZEND_BEGIN_MODULE_GLOBALS(libxml)
zend_fcall_info fci;
zend_fcall_info_cache fcc;
} entity_loader;
- zend_bool entity_loader_disabled;
+ bool entity_loader_disabled;
ZEND_END_MODULE_GLOBALS(libxml)
typedef struct _libxml_doc_props {
@@ -106,7 +106,7 @@ PHP_LIBXML_API void php_libxml_ctx_error(void *ctx, const char *msg, ...);
PHP_LIBXML_API int php_libxml_xmlCheckUTF8(const unsigned char *s);
PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext);
PHP_LIBXML_API void php_libxml_issue_error(int level, const char *msg);
-PHP_LIBXML_API zend_bool php_libxml_disable_entity_loader(zend_bool disable);
+PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable);
/* Init/shutdown functions*/
PHP_LIBXML_API void php_libxml_initialize(void);
diff --git a/ext/mbstring/config.m4 b/ext/mbstring/config.m4
index 74266e4166..9547130fba 100644
--- a/ext/mbstring/config.m4
+++ b/ext/mbstring/config.m4
@@ -94,18 +94,10 @@ AC_DEFUN([PHP_MBSTRING_SETUP_LIBMBFL], [
PHP_MBSTRING_ADD_SOURCES([
libmbfl/filters/html_entities.c
libmbfl/filters/mbfilter_7bit.c
- libmbfl/filters/mbfilter_ascii.c
libmbfl/filters/mbfilter_base64.c
libmbfl/filters/mbfilter_big5.c
- libmbfl/filters/mbfilter_byte2.c
- libmbfl/filters/mbfilter_byte4.c
- libmbfl/filters/mbfilter_cp1251.c
- libmbfl/filters/mbfilter_cp1252.c
- libmbfl/filters/mbfilter_cp1254.c
libmbfl/filters/mbfilter_cp5022x.c
libmbfl/filters/mbfilter_cp51932.c
- libmbfl/filters/mbfilter_cp850.c
- libmbfl/filters/mbfilter_cp866.c
libmbfl/filters/mbfilter_cp932.c
libmbfl/filters/mbfilter_cp936.c
libmbfl/filters/mbfilter_gb18030.c
@@ -121,24 +113,9 @@ AC_DEFUN([PHP_MBSTRING_SETUP_LIBMBFL], [
libmbfl/filters/mbfilter_iso2022jp_2004.c
libmbfl/filters/mbfilter_iso2022jp_mobile.c
libmbfl/filters/mbfilter_iso2022_kr.c
- libmbfl/filters/mbfilter_iso8859_1.c
- libmbfl/filters/mbfilter_iso8859_10.c
- libmbfl/filters/mbfilter_iso8859_13.c
- libmbfl/filters/mbfilter_iso8859_14.c
- libmbfl/filters/mbfilter_iso8859_15.c
- libmbfl/filters/mbfilter_iso8859_16.c
- libmbfl/filters/mbfilter_iso8859_2.c
- libmbfl/filters/mbfilter_iso8859_3.c
- libmbfl/filters/mbfilter_iso8859_4.c
- libmbfl/filters/mbfilter_iso8859_5.c
- libmbfl/filters/mbfilter_iso8859_6.c
- libmbfl/filters/mbfilter_iso8859_7.c
- libmbfl/filters/mbfilter_iso8859_8.c
- libmbfl/filters/mbfilter_iso8859_9.c
libmbfl/filters/mbfilter_jis.c
- libmbfl/filters/mbfilter_koi8r.c
- libmbfl/filters/mbfilter_armscii8.c
libmbfl/filters/mbfilter_qprint.c
+ libmbfl/filters/mbfilter_singlebyte.c
libmbfl/filters/mbfilter_sjis.c
libmbfl/filters/mbfilter_sjis_open.c
libmbfl/filters/mbfilter_sjis_mobile.c
@@ -155,7 +132,6 @@ AC_DEFUN([PHP_MBSTRING_SETUP_LIBMBFL], [
libmbfl/filters/mbfilter_utf8.c
libmbfl/filters/mbfilter_utf8_mobile.c
libmbfl/filters/mbfilter_uuencode.c
- libmbfl/filters/mbfilter_koi8u.c
libmbfl/mbfl/mbfilter.c
libmbfl/mbfl/mbfilter_8bit.c
libmbfl/mbfl/mbfilter_pass.c
@@ -163,7 +139,6 @@ AC_DEFUN([PHP_MBSTRING_SETUP_LIBMBFL], [
libmbfl/mbfl/mbfl_convert.c
libmbfl/mbfl/mbfl_encoding.c
libmbfl/mbfl/mbfl_filter_output.c
- libmbfl/mbfl/mbfl_ident.c
libmbfl/mbfl/mbfl_language.c
libmbfl/mbfl/mbfl_memory_device.c
libmbfl/mbfl/mbfl_string.c
@@ -179,7 +154,7 @@ AC_DEFUN([PHP_MBSTRING_SETUP_LIBMBFL], [
libmbfl/nls/nls_tr.c
libmbfl/nls/nls_ua.c
])
- PHP_MBSTRING_ADD_INSTALL_HEADERS([libmbfl/config.h libmbfl/mbfl/eaw_table.h libmbfl/mbfl/mbfilter.h libmbfl/mbfl/mbfilter_8bit.h libmbfl/mbfl/mbfilter_pass.h libmbfl/mbfl/mbfilter_wchar.h libmbfl/mbfl/mbfl_consts.h libmbfl/mbfl/mbfl_convert.h libmbfl/mbfl/mbfl_defs.h libmbfl/mbfl/mbfl_encoding.h libmbfl/mbfl/mbfl_filter_output.h libmbfl/mbfl/mbfl_ident.h libmbfl/mbfl/mbfl_language.h libmbfl/mbfl/mbfl_memory_device.h libmbfl/mbfl/mbfl_string.h])
+ PHP_MBSTRING_ADD_INSTALL_HEADERS([libmbfl/config.h libmbfl/mbfl/eaw_table.h libmbfl/mbfl/mbfilter.h libmbfl/mbfl/mbfilter_8bit.h libmbfl/mbfl/mbfilter_pass.h libmbfl/mbfl/mbfilter_wchar.h libmbfl/mbfl/mbfl_consts.h libmbfl/mbfl/mbfl_convert.h libmbfl/mbfl/mbfl_defs.h libmbfl/mbfl/mbfl_encoding.h libmbfl/mbfl/mbfl_filter_output.h libmbfl/mbfl/mbfl_language.h libmbfl/mbfl/mbfl_memory_device.h libmbfl/mbfl/mbfl_string.h])
])
dnl
diff --git a/ext/mbstring/config.w32 b/ext/mbstring/config.w32
index 667fdb9222..8a9eadf41b 100644
--- a/ext/mbstring/config.w32
+++ b/ext/mbstring/config.w32
@@ -17,37 +17,30 @@ if (PHP_MBSTRING != "no") {
"ext\\mbstring\\libmbfl\\config.h", true);
ADD_SOURCES("ext/mbstring/libmbfl/filters", "html_entities.c \
- mbfilter_7bit.c mbfilter_ascii.c mbfilter_base64.c mbfilter_big5.c \
- mbfilter_byte2.c mbfilter_byte4.c mbfilter_cp1251.c mbfilter_cp1252.c \
- mbfilter_cp866.c mbfilter_cp932.c mbfilter_cp936.c mbfilter_cp51932.c \
- mbfilter_euc_cn.c mbfilter_euc_jp.c mbfilter_euc_jp_win.c mbfilter_euc_kr.c \
+ mbfilter_7bit.c mbfilter_base64.c mbfilter_big5.c mbfilter_cp932.c \
+ mbfilter_cp936.c mbfilter_cp51932.c mbfilter_euc_cn.c \
+ mbfilter_euc_jp.c mbfilter_euc_jp_win.c mbfilter_euc_kr.c \
mbfilter_euc_tw.c mbfilter_htmlent.c mbfilter_hz.c mbfilter_iso2022_kr.c \
- mbfilter_iso8859_1.c mbfilter_iso8859_10.c mbfilter_iso8859_13.c \
- mbfilter_iso8859_14.c mbfilter_iso8859_15.c mbfilter_iso8859_16.c \
- mbfilter_iso8859_2.c mbfilter_iso8859_3.c mbfilter_iso8859_4.c \
- mbfilter_iso8859_5.c mbfilter_iso8859_6.c mbfilter_iso8859_7.c \
- mbfilter_iso8859_8.c mbfilter_iso8859_9.c mbfilter_jis.c \
- mbfilter_iso2022_jp_ms.c mbfilter_gb18030.c mbfilter_sjis_2004.c \
- mbfilter_koi8r.c mbfilter_qprint.c mbfilter_sjis.c mbfilter_ucs2.c \
+ mbfilter_jis.c mbfilter_iso2022_jp_ms.c mbfilter_gb18030.c \
+ mbfilter_sjis_2004.c mbfilter_qprint.c mbfilter_sjis.c mbfilter_ucs2.c \
mbfilter_ucs4.c mbfilter_uhc.c mbfilter_utf16.c mbfilter_utf32.c \
- mbfilter_utf7.c mbfilter_utf7imap.c mbfilter_utf8.c mbfilter_utf8_mobile.c \
- mbfilter_koi8u.c mbfilter_cp1254.c mbfilter_euc_jp_2004.c \
- mbfilter_uuencode.c mbfilter_armscii8.c mbfilter_cp850.c \
+ mbfilter_utf7.c mbfilter_utf7imap.c mbfilter_utf8.c \
+ mbfilter_utf8_mobile.c mbfilter_euc_jp_2004.c mbfilter_uuencode.c \
mbfilter_cp5022x.c mbfilter_sjis_open.c mbfilter_sjis_mobile.c \
- mbfilter_sjis_mac.c \
- mbfilter_iso2022jp_2004.c mbfilter_iso2022jp_mobile.c \
+ mbfilter_sjis_mac.c mbfilter_iso2022jp_2004.c \
+ mbfilter_iso2022jp_mobile.c mbfilter_singlebyte.c \
mbfilter_tl_jisx0201_jisx0208.c", "mbstring");
ADD_SOURCES("ext/mbstring/libmbfl/mbfl", "mbfilter.c mbfilter_8bit.c \
mbfilter_pass.c mbfilter_wchar.c mbfl_convert.c mbfl_encoding.c \
- mbfl_filter_output.c mbfl_ident.c mbfl_language.c mbfl_memory_device.c \
+ mbfl_filter_output.c mbfl_language.c mbfl_memory_device.c \
mbfl_string.c", "mbstring");
ADD_SOURCES("ext/mbstring/libmbfl/nls", "nls_de.c nls_en.c nls_ja.c \
nls_kr.c nls_neutral.c nls_ru.c nls_uni.c nls_zh.c nls_hy.c \
nls_ua.c nls_tr.c", "mbstring");
- PHP_INSTALL_HEADERS("ext/mbstring", "mbstring.h libmbfl/config.h libmbfl/mbfl/eaw_table.h libmbfl/mbfl/mbfilter.h libmbfl/mbfl/mbfilter_8bit.h libmbfl/mbfl/mbfilter_pass.h libmbfl/mbfl/mbfilter_wchar.h libmbfl/mbfl/mbfl_consts.h libmbfl/mbfl/mbfl_convert.h libmbfl/mbfl/mbfl_defs.h libmbfl/mbfl/mbfl_encoding.h libmbfl/mbfl/mbfl_filter_output.h libmbfl/mbfl/mbfl_ident.h libmbfl/mbfl/mbfl_language.h libmbfl/mbfl/mbfl_memory_device.h libmbfl/mbfl/mbfl_string.h");
+ PHP_INSTALL_HEADERS("ext/mbstring", "mbstring.h libmbfl/config.h libmbfl/mbfl/eaw_table.h libmbfl/mbfl/mbfilter.h libmbfl/mbfl/mbfilter_8bit.h libmbfl/mbfl/mbfilter_pass.h libmbfl/mbfl/mbfilter_wchar.h libmbfl/mbfl/mbfl_consts.h libmbfl/mbfl/mbfl_convert.h libmbfl/mbfl/mbfl_defs.h libmbfl/mbfl/mbfl_encoding.h libmbfl/mbfl/mbfl_filter_output.h libmbfl/mbfl/mbfl_language.h libmbfl/mbfl/mbfl_memory_device.h libmbfl/mbfl/mbfl_string.h");
AC_DEFINE('HAVE_MBSTRING', 1, 'Have mbstring support');
diff --git a/ext/mbstring/libmbfl/filters/emoji2uni.h b/ext/mbstring/libmbfl/filters/emoji2uni.h
index 198b2354d3..644244bdb2 100644
--- a/ext/mbstring/libmbfl/filters/emoji2uni.h
+++ b/ext/mbstring/libmbfl/filters/emoji2uni.h
@@ -34,9 +34,9 @@ static const unsigned short mb_tbl_code2uni_docomo1[] = { // 0x28c2 - 0x29db
0xf4ba, 0xf303, 0xEE1E, 0xEE1F,
0xEE20, 0xf51c, 0xf51b, 0xf51a,
0x23f0, 0xEE21, 0xEE22, 0xEE23,
- 0xEE24, 0xEE25, 0xEE26, 0xEE27,
- 0xEE28, 0xEE29, 0xEE2A, 0xEE2B,
- 0xEE2C, 0xEE2D, 0xEE2E, 0xEE2F,
+ 0xEE24, 0xEE25, 0x25EA, 0x25A0,
+ 0x25BF, 0xEE29, 0xEE2A, 0xEE2B,
+ 0x2020, 0xEE2D, 0xEE2E, 0xEE2F,
0xEE30, 0xEE31, 0xEE32, 0xEE33,
0xf4f2, 0xf4e9, 0xf4e0, 0xEE10,
0xEE11, 0x2709, 0xEE12, 0xEE13,
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_7bit.c b/ext/mbstring/libmbfl/filters/mbfilter_7bit.c
index 42ed23326d..bdf0cc78d9 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_7bit.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_7bit.c
@@ -75,6 +75,8 @@ int mbfl_filt_conv_any_7bit(int c, mbfl_convert_filter *filter)
{
if (c >= 0 && c < 0x80) {
CK((*filter->output_function)(c, filter->data));
+ } else {
+ mbfl_filt_conv_illegal_output(c, filter);
}
return c;
}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_armscii8.c b/ext/mbstring/libmbfl/filters/mbfilter_armscii8.c
deleted file mode 100644
index 38c8f98bd1..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_armscii8.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file: Hayk Chamyan <hamshen@gmail.com>
- *
- */
-
-/*
- * "armenian code filter and converter"
- */
-
-#include "mbfilter.h"
-#include "mbfilter_armscii8.h"
-#include "unicode_table_armscii8.h"
-
-static int mbfl_filt_ident_armscii8(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_armscii8_aliases[] = {"ArmSCII-8", "ArmSCII8", "ARMSCII-8", "ARMSCII8", NULL};
-
-const mbfl_encoding mbfl_encoding_armscii8 = {
- mbfl_no_encoding_armscii8,
- "ArmSCII-8",
- "ArmSCII-8",
- (const char *(*)[])&mbfl_encoding_armscii8_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_armscii8_wchar,
- &vtbl_wchar_armscii8
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_armscii8 = {
- mbfl_no_encoding_armscii8,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_armscii8
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_armscii8 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_armscii8,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_armscii8,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_armscii8_wchar = {
- mbfl_no_encoding_armscii8,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_armscii8_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * armscii8 => wchar
- */
-int mbfl_filt_conv_armscii8_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < armscii8_ucs_table_min) {
- s = c;
- } else if (c >= armscii8_ucs_table_min && c < 0x100) {
- s = armscii8_ucs_table[c - armscii8_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_ARMSCII8;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => armscii8
- */
-int mbfl_filt_conv_wchar_armscii8(int c, mbfl_convert_filter *filter)
-{
-
- int s, n;
-
- if (c >= 0x28 && c < 0x30) {
- s = ucs_armscii8_table[c-0x28];
- } else if (c < armscii8_ucs_table_min) {
- s = c;
- } else {
- s = -1;
- n = armscii8_ucs_table_len-1;
- while (n >= 0) {
- if (c == armscii8_ucs_table[n]) {
- s = armscii8_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_ARMSCII8) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_armscii8(int c, mbfl_identify_filter *filter)
-{
- if (c >= armscii8_ucs_table_min && c <= 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_armscii8.h b/ext/mbstring/libmbfl/filters/mbfilter_armscii8.h
deleted file mode 100644
index 0b14934995..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_armscii8.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file: Hayk Chamyan <hamshen@gmail.com>
- *
- */
-
-#ifndef MBFL_MBFILTER_ARMSCII8_H
-#define MBFL_MBFILTER_ARMSCII8_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_armscii8;
-extern const struct mbfl_identify_vtbl vtbl_identify_armscii8;
-extern const struct mbfl_convert_vtbl vtbl_wchar_armscii8;
-extern const struct mbfl_convert_vtbl vtbl_armscii8_wchar;
-
-int mbfl_filt_conv_armscii8_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_armscii8(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ARMSCII8_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ascii.c b/ext/mbstring/libmbfl/filters/mbfilter_ascii.c
deleted file mode 100644
index 43d659a46c..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_ascii.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_ascii.h"
-
-static int mbfl_filt_ident_ascii(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_ascii_aliases[] = {"ANSI_X3.4-1968", "iso-ir-6", "ANSI_X3.4-1986", "ISO_646.irv:1991", "US-ASCII", "ISO646-US", "us", "IBM367", "IBM-367", "cp367", "csASCII", NULL};
-
-const mbfl_encoding mbfl_encoding_ascii = {
- mbfl_no_encoding_ascii,
- "ASCII",
- "US-ASCII", /* preferred MIME name */
- (const char *(*)[])&mbfl_encoding_ascii_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_ascii_wchar,
- &vtbl_wchar_ascii
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_ascii = {
- mbfl_no_encoding_ascii,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_ascii
-};
-
-const struct mbfl_convert_vtbl vtbl_ascii_wchar = {
- mbfl_no_encoding_ascii,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_ascii_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_ascii = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_ascii,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_ascii,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ASCII => wchar
- */
-int mbfl_filt_conv_ascii_wchar(int c, mbfl_convert_filter *filter)
-{
- return (*filter->output_function)(c, filter->data);
-}
-
-
-/*
- * wchar => ASCII
- */
-int mbfl_filt_conv_wchar_ascii(int c, mbfl_convert_filter *filter)
-{
- if (c >= 0 && c < 0x80) {
- CK((*filter->output_function)(c, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_ascii(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x20 && c < 0x80) {
- ;
- } else if (c == 0x0d || c == 0x0a || c == 0x09 || c == 0) { /* CR or LF or HTAB or null */
- ;
- } else {
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ascii.h b/ext/mbstring/libmbfl/filters/mbfilter_ascii.h
deleted file mode 100644
index 3c8aead9ef..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_ascii.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#ifndef MBFL_MBFILTER_ASCII_H
-#define MBFL_MBFILTER_ASCII_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_ascii;
-extern const struct mbfl_identify_vtbl vtbl_identify_ascii;
-extern const struct mbfl_convert_vtbl vtbl_ascii_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_ascii;
-
-int mbfl_filt_conv_ascii_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_ascii(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ASCII_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_big5.c b/ext/mbstring/libmbfl/filters/mbfilter_big5.c
index 1e59924092..0a0d6646ed 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_big5.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_big5.c
@@ -32,8 +32,6 @@
#include "unicode_table_big5.h"
-static int mbfl_filt_ident_big5(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_big5[] = { /* 0x81-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -59,9 +57,9 @@ const mbfl_encoding mbfl_encoding_big5 = {
mbfl_no_encoding_big5,
"BIG-5",
"BIG5",
- (const char *(*)[])&mbfl_encoding_big5_aliases,
+ mbfl_encoding_big5_aliases,
mblen_table_big5,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_big5_wchar,
&vtbl_wchar_big5
};
@@ -72,23 +70,11 @@ const mbfl_encoding mbfl_encoding_cp950 = {
"BIG5",
NULL,
mblen_table_big5,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_cp950_wchar,
&vtbl_wchar_cp950
};
-const struct mbfl_identify_vtbl vtbl_identify_big5 = {
- mbfl_no_encoding_big5,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_big5
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp950 = {
- mbfl_no_encoding_cp950,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_big5
-};
-
const struct mbfl_convert_vtbl vtbl_big5_wchar = {
mbfl_no_encoding_big5,
mbfl_no_encoding_wchar,
@@ -322,28 +308,3 @@ mbfl_filt_conv_wchar_big5(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_big5(int c, mbfl_identify_filter *filter)
-{
- int c1;
- if (filter->encoding->no_encoding == mbfl_no_encoding_cp950) {
- c1 = 0x80;
- } else {
- c1 = 0xa0;
- }
-
- if (filter->status) { /* kanji second char */
- if (c < 0x40 || (c > 0x7e && c < 0xa1) ||c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- } else if (c >= 0 && c < 0x80) { /* latin ok */
- ;
- } else if (c > c1 && c < 0xff) { /* DBCS lead byte */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_big5.h b/ext/mbstring/libmbfl/filters/mbfilter_big5.h
index c5a0955f8d..e475b6bd0c 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_big5.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_big5.h
@@ -33,12 +33,10 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_big5;
-extern const struct mbfl_identify_vtbl vtbl_identify_big5;
extern const struct mbfl_convert_vtbl vtbl_big5_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_big5;
extern const mbfl_encoding mbfl_encoding_cp950;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp950;
extern const struct mbfl_convert_vtbl vtbl_cp950_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_cp950;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_byte2.c b/ext/mbstring/libmbfl/filters/mbfilter_byte2.c
deleted file mode 100644
index 72b5b2b7b2..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_byte2.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_byte2.h"
-
-const mbfl_encoding mbfl_encoding_byte2be = {
- mbfl_no_encoding_byte2be,
- "byte2be",
- NULL,
- NULL,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_byte2be_wchar,
- &vtbl_wchar_byte2be
-};
-
-const mbfl_encoding mbfl_encoding_byte2le = {
- mbfl_no_encoding_byte2le,
- "byte2le",
- NULL,
- NULL,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_byte2le_wchar,
- &vtbl_wchar_byte2le
-};
-
-const struct mbfl_convert_vtbl vtbl_byte2be_wchar = {
- mbfl_no_encoding_byte2be,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_byte2be_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_byte2be = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_byte2be,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_byte2be,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_byte2le_wchar = {
- mbfl_no_encoding_byte2le,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_byte2le_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_byte2le = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_byte2le,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_byte2le,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-int mbfl_filt_conv_byte2be_wchar(int c, mbfl_convert_filter *filter)
-{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = (c & 0xff) << 8;
- filter->cache = n;
- } else {
- filter->status = 0;
- n = (c & 0xff) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
- }
- return c;
-}
-
-int mbfl_filt_conv_wchar_byte2be(int c, mbfl_convert_filter *filter)
-{
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- CK((*filter->output_function)(c & 0xff, filter->data));
- return c;
-}
-
-int mbfl_filt_conv_byte2le_wchar(int c, mbfl_convert_filter *filter)
-{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = c & 0xff;
- filter->cache = n;
- } else {
- filter->status = 0;
- n = ((c & 0xff) << 8) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
- }
- return c;
-}
-
-int mbfl_filt_conv_wchar_byte2le(int c, mbfl_convert_filter *filter)
-{
- CK((*filter->output_function)(c & 0xff, filter->data));
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_byte2.h b/ext/mbstring/libmbfl/filters/mbfilter_byte2.h
deleted file mode 100644
index 8b1d991810..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_byte2.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#ifndef MBFL_MBFILTER_BYTE2_H
-#define MBFL_MBFILTER_BYTE2_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_byte2be;
-extern const mbfl_encoding mbfl_encoding_byte2le;
-extern const struct mbfl_convert_vtbl vtbl_byte2be_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_byte2be;
-extern const struct mbfl_convert_vtbl vtbl_byte2le_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_byte2le;
-
-int mbfl_filt_conv_wchar_byte2be(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_byte2be_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_byte2le(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_byte2le_wchar(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_BYTE2_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_byte4.c b/ext/mbstring/libmbfl/filters/mbfilter_byte4.c
deleted file mode 100644
index b566e54772..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_byte4.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_byte4.h"
-
-const mbfl_encoding mbfl_encoding_byte4be = {
- mbfl_no_encoding_byte4be,
- "byte4be",
- NULL,
- NULL,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_byte4be_wchar,
- &vtbl_wchar_byte4be
-};
-
-const mbfl_encoding mbfl_encoding_byte4le = {
- mbfl_no_encoding_byte4le,
- "byte4le",
- NULL,
- NULL,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_byte4le_wchar,
- &vtbl_wchar_byte4le
-};
-
-const struct mbfl_convert_vtbl vtbl_byte4be_wchar = {
- mbfl_no_encoding_byte4be,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_byte4be_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_byte4be = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_byte4be,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_byte4be,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_byte4le_wchar = {
- mbfl_no_encoding_byte4le,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_byte4le_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_byte4le = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_byte4le,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_byte4le,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-int mbfl_filt_conv_byte4be_wchar(int c, mbfl_convert_filter *filter)
-{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = (c & 0xff) << 24;
- filter->cache = n;
- } else if (filter->status == 1) {
- filter->status = 2;
- n = (c & 0xff) << 16;
- filter->cache |= n;
- } else if (filter->status == 2) {
- filter->status = 3;
- n = (c & 0xff) << 8;
- filter->cache |= n;
- } else {
- filter->status = 0;
- n = (c & 0xff) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
- }
- return c;
-}
-
-int mbfl_filt_conv_wchar_byte4be(int c, mbfl_convert_filter *filter)
-{
- CK((*filter->output_function)((c >> 24) & 0xff, filter->data));
- CK((*filter->output_function)((c >> 16) & 0xff, filter->data));
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- CK((*filter->output_function)(c & 0xff, filter->data));
- return c;
-}
-
-int mbfl_filt_conv_byte4le_wchar(int c, mbfl_convert_filter *filter)
-{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = (c & 0xff);
- filter->cache = n;
- } else if (filter->status == 1) {
- filter->status = 2;
- n = (c & 0xff) << 8;
- filter->cache |= n;
- } else if (filter->status == 2) {
- filter->status = 3;
- n = (c & 0xff) << 16;
- filter->cache |= n;
- } else {
- filter->status = 0;
- n = ((c & 0xff) << 24) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
- }
- return c;
-}
-
-int mbfl_filt_conv_wchar_byte4le(int c, mbfl_convert_filter *filter)
-{
- CK((*filter->output_function)(c & 0xff, filter->data));
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- CK((*filter->output_function)((c >> 16) & 0xff, filter->data));
- CK((*filter->output_function)((c >> 24) & 0xff, filter->data));
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_byte4.h b/ext/mbstring/libmbfl/filters/mbfilter_byte4.h
deleted file mode 100644
index 572a2cf477..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_byte4.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#ifndef MBFL_MBFILTER_BYTE4_H
-#define MBFL_MBFILTER_BYTE4_H
-
-extern const mbfl_encoding mbfl_encoding_byte4be;
-extern const mbfl_encoding mbfl_encoding_byte4le;
-extern const struct mbfl_convert_vtbl vtbl_byte4be_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_byte4be;
-extern const struct mbfl_convert_vtbl vtbl_byte4le_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_byte4le;
-
-int mbfl_filt_conv_wchar_byte4be(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_byte4be_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_byte4le(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_byte4le_wchar(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_BYTE4_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1251.c b/ext/mbstring/libmbfl/filters/mbfilter_cp1251.c
deleted file mode 100644
index 470adf1a08..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1251.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_cp1251.h"
-#include "unicode_table_cp1251.h"
-
-static int mbfl_filt_ident_cp1251(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_cp1251_aliases[] = {"CP1251", "CP-1251", "WINDOWS-1251", NULL};
-
-const mbfl_encoding mbfl_encoding_cp1251 = {
- mbfl_no_encoding_cp1251,
- "Windows-1251",
- "Windows-1251",
- (const char *(*)[])&mbfl_encoding_cp1251_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_cp1251_wchar,
- &vtbl_wchar_cp1251
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp1251 = {
- mbfl_no_encoding_cp1251,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp1251
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_cp1251 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_cp1251,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_cp1251,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_cp1251_wchar = {
- mbfl_no_encoding_cp1251,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_cp1251_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * cp1251 => wchar
- */
-int
-mbfl_filt_conv_cp1251_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < cp1251_ucs_table_min) {
- s = c;
- } else if (c >= cp1251_ucs_table_min && c < 0x100) {
- s = cp1251_ucs_table[c - cp1251_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_CP1251;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => cp1251
- */
-int
-mbfl_filt_conv_wchar_cp1251(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = cp1251_ucs_table_len-1;
- while (n >= 0) {
- if (c == cp1251_ucs_table[n]) {
- s = cp1251_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_CP1251) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-/* all of this is so ugly now! */
-static int mbfl_filt_ident_cp1251(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c <= 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1251.h b/ext/mbstring/libmbfl/filters/mbfilter_cp1251.h
deleted file mode 100644
index b76cc9f680..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1251.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * the source code included in this files was separated from mbfilter_ru.h
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_CP1251_H
-#define MBFL_MBFILTER_CP1251_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_cp1251;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp1251;
-extern const struct mbfl_convert_vtbl vtbl_wchar_cp1251;
-extern const struct mbfl_convert_vtbl vtbl_cp1251_wchar;
-
-int mbfl_filt_conv_wchar_cp1251(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_cp1251_wchar(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_CP1251_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1252.c b/ext/mbstring/libmbfl/filters/mbfilter_cp1252.c
deleted file mode 100644
index a274e4b796..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1252.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Wez Furlong <wez@thebrainroom.com>
- *
- */
-/*
- * the source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_cp1252.h"
-#include "unicode_table_cp1252.h"
-
-static int mbfl_filt_ident_cp1252(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_cp1252_aliases[] = {"cp1252", NULL};
-
-const mbfl_encoding mbfl_encoding_cp1252 = {
- mbfl_no_encoding_cp1252,
- "Windows-1252",
- "Windows-1252",
- (const char *(*)[])&mbfl_encoding_cp1252_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_cp1252_wchar,
- &vtbl_wchar_cp1252
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp1252 = {
- mbfl_no_encoding_cp1252,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp1252
-};
-
-const struct mbfl_convert_vtbl vtbl_cp1252_wchar = {
- mbfl_no_encoding_cp1252,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_cp1252_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_cp1252 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_cp1252,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_cp1252,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * wchar => cp1252
- */
-int mbfl_filt_conv_wchar_cp1252(int c, mbfl_convert_filter *filter)
-{
- int s=-1, n;
-
- if (c >= 0x100) {
- /* look it up from the cp1252 table */
- s = -1;
- n = 31;
- while (n >= 0) {
- if (c == cp1252_ucs_table[n] && c != 0xfffe) {
- s = 0x80 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_1)
- {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
- else if (c >= 0 && c < 0x100) {
- s = c;
- }
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
- return c;
-}
-
-/*
- * cp1252 => wchar
- */
-int mbfl_filt_conv_cp1252_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0x80 && c < 0xa0) {
- s = cp1252_ucs_table[c - 0x80];
- } else {
- s = c;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/* We only distinguish the MS extensions to ISO-8859-1.
- * Actually, this is pretty much a NO-OP, since the identification
- * system doesn't allow us to discriminate between a positive match,
- * a possible match and a definite non-match.
- * The problem here is that cp1252 looks like SJIS for certain chars.
- * */
-static int mbfl_filt_ident_cp1252(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xa0)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1252.h b/ext/mbstring/libmbfl/filters/mbfilter_cp1252.h
deleted file mode 100644
index afb2fffa9b..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1252.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Wez Furlong <wez@thebrainroom.com>
- *
- */
-/*
- * the source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_CP1252_H
-#define MBFL_MBFILTER_CP1252_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_cp1252;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp1252;
-extern const struct mbfl_convert_vtbl vtbl_cp1252_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_cp1252;
-
-int mbfl_filt_conv_wchar_cp1252(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_cp1252_wchar(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_CP1252_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1254.c b/ext/mbstring/libmbfl/filters/mbfilter_cp1254.c
deleted file mode 100644
index 7e4bb4b148..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1254.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Haluk AKIN <halukakin@gmail.com>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_cp1254.h"
-#include "unicode_table_cp1254.h"
-
-static int mbfl_filt_ident_cp1254(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_cp1254_aliases[] = {"CP1254", "CP-1254", "WINDOWS-1254", NULL};
-
-const mbfl_encoding mbfl_encoding_cp1254 = {
- mbfl_no_encoding_cp1254,
- "Windows-1254",
- "Windows-1254",
- (const char *(*)[])&mbfl_encoding_cp1254_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_cp1254_wchar,
- &vtbl_wchar_cp1254
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp1254 = {
- mbfl_no_encoding_cp1254,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp1254
-};
-
-const struct mbfl_convert_vtbl vtbl_cp1254_wchar = {
- mbfl_no_encoding_cp1254,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_cp1254_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_cp1254 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_cp1254,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_cp1254,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * wchar => cp1254
- */
-int
-mbfl_filt_conv_wchar_cp1254(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = cp1254_ucs_table_len-1;
- while (n >= 0) {
- if (c == cp1254_ucs_table[n] && c != 0xfffe) {
- s = cp1254_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_CP1254) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-/*
- * cp1254 => wchar
- */
-int
-mbfl_filt_conv_cp1254_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < cp1254_ucs_table_min) {
- s = c;
- } else if (c >= cp1254_ucs_table_min && c < 0x100) {
- s = cp1254_ucs_table[c - cp1254_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_CP1254;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/* We only distinguish the MS extensions to ISO-8859-1.
- * Actually, this is pretty much a NO-OP, since the identification
- * system doesn't allow us to discriminate between a positive match,
- * a possible match and a definite non-match.
- * The problem here is that cp1254 looks like SJIS for certain chars.
- * */
-static int mbfl_filt_ident_cp1254(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1254.h b/ext/mbstring/libmbfl/filters/mbfilter_cp1254.h
deleted file mode 100644
index 15a63eae30..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1254.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Haluk AKIN <halukakin@gmail.com>
- *
- */
-/*
- * the source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_CP1254_H
-#define MBFL_MBFILTER_CP1254_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_cp1254;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp1254;
-extern const struct mbfl_convert_vtbl vtbl_cp1254_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_cp1254;
-
-int mbfl_filt_conv_wchar_cp1254(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_cp1254_wchar(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_CP1254_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c
index 3879f9eb5b..01cec63236 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c
@@ -36,54 +36,40 @@ typedef struct _mbfl_filt_conv_wchar_cp50220_ctx {
mbfl_convert_filter last;
} mbfl_filt_conv_wchar_cp50220_ctx;
-static int mbfl_filt_ident_jis_ms(int c, mbfl_identify_filter *filter);
-static int mbfl_filt_ident_cp50220(int c, mbfl_identify_filter *filter);
-static int mbfl_filt_ident_cp50221(int c, mbfl_identify_filter *filter);
-static int mbfl_filt_ident_cp50222(int c, mbfl_identify_filter *filter);
static void mbfl_filt_conv_wchar_cp50220_ctor(mbfl_convert_filter *filt);
static void mbfl_filt_conv_wchar_cp50220_dtor(mbfl_convert_filter *filt);
static void mbfl_filt_conv_wchar_cp50220_copy(mbfl_convert_filter *src, mbfl_convert_filter *dest);
+static int mbfl_filt_conv_cp5022x_wchar_flush(mbfl_convert_filter *filter);
-const mbfl_encoding mbfl_encoding_jis_ms = {
- mbfl_no_encoding_jis_ms,
- "JIS-ms",
- "ISO-2022-JP",
- NULL,
- NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
- &vtbl_jis_ms_wchar,
- &vtbl_wchar_jis_ms
-};
+/* Previously, a dubious 'encoding' called 'cp50220raw' was supported
+ * This was just CP50220, but the implementation was less strict regarding
+ * invalid characters; it would silently pass some through
+ * This 'encoding' only existed in mbstring. In case some poor, lost soul is
+ * still using it, retain minimal support by aliasing it to CP50220
+ *
+ * Further, mbstring also had a made-up encoding called "JIS-ms"
+ * This was the same as CP5022{0,1,2}, but without their special ways of
+ * handling conversion of Unicode half-width katakana */
+static const char *cp50220_aliases[] = {"cp50220raw", "cp50220-raw", "JIS-ms", NULL};
const mbfl_encoding mbfl_encoding_cp50220 = {
mbfl_no_encoding_cp50220,
"CP50220",
"ISO-2022-JP",
- (const char *(*)[])NULL,
+ cp50220_aliases,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_cp50220_wchar,
&vtbl_wchar_cp50220
};
-const mbfl_encoding mbfl_encoding_cp50220raw = {
- mbfl_no_encoding_cp50220raw,
- "CP50220raw",
- "ISO-2022-JP",
- (const char *(*)[])NULL,
- NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
- &vtbl_cp50220raw_wchar,
- &vtbl_wchar_cp50220raw
-};
-
const mbfl_encoding mbfl_encoding_cp50221 = {
mbfl_no_encoding_cp50221,
"CP50221",
"ISO-2022-JP",
NULL,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_cp50221_wchar,
&vtbl_wchar_cp50221
};
@@ -94,68 +80,18 @@ const mbfl_encoding mbfl_encoding_cp50222 = {
"ISO-2022-JP",
NULL,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_cp50222_wchar,
&vtbl_wchar_cp50222
};
-const struct mbfl_identify_vtbl vtbl_identify_jis_ms = {
- mbfl_no_encoding_jis_ms,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_jis_ms
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp50220 = {
- mbfl_no_encoding_cp50220,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp50220
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp50220raw = {
- mbfl_no_encoding_cp50220raw,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp50220
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp50221 = {
- mbfl_no_encoding_cp50221,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp50221
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp50222 = {
- mbfl_no_encoding_cp50222,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp50222
-};
-
-const struct mbfl_convert_vtbl vtbl_jis_ms_wchar = {
- mbfl_no_encoding_jis_ms,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_jis_ms_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_jis_ms = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_jis_ms,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_jis_ms,
- mbfl_filt_conv_any_jis_flush,
- NULL,
-};
-
const struct mbfl_convert_vtbl vtbl_cp50220_wchar = {
mbfl_no_encoding_cp50220,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
- mbfl_filt_conv_jis_ms_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_cp5022x_wchar,
+ mbfl_filt_conv_cp5022x_wchar_flush,
NULL,
};
@@ -169,33 +105,13 @@ const struct mbfl_convert_vtbl vtbl_wchar_cp50220 = {
mbfl_filt_conv_wchar_cp50220_copy
};
-const struct mbfl_convert_vtbl vtbl_cp50220raw_wchar = {
- mbfl_no_encoding_cp50220raw,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_jis_ms_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_cp50220raw = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_cp50220raw,
- mbfl_filt_conv_wchar_cp50220_ctor,
- mbfl_filt_conv_wchar_cp50220_dtor,
- mbfl_filt_conv_wchar_cp50220raw,
- mbfl_filt_conv_any_jis_flush,
- mbfl_filt_conv_wchar_cp50220_copy
-};
-
const struct mbfl_convert_vtbl vtbl_cp50221_wchar = {
mbfl_no_encoding_cp50221,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
- mbfl_filt_conv_jis_ms_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_cp5022x_wchar,
+ mbfl_filt_conv_cp5022x_wchar_flush,
NULL,
};
@@ -214,8 +130,8 @@ const struct mbfl_convert_vtbl vtbl_cp50222_wchar = {
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
- mbfl_filt_conv_jis_ms_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_cp5022x_wchar,
+ mbfl_filt_conv_cp5022x_wchar_flush,
NULL,
};
@@ -231,11 +147,7 @@ const struct mbfl_convert_vtbl vtbl_wchar_cp50222 = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-/*
- * JIS-ms => wchar
- */
-int
-mbfl_filt_conv_jis_ms_wchar(int c, mbfl_convert_filter *filter)
+int mbfl_filt_conv_cp5022x_wchar(int c, mbfl_convert_filter *filter)
{
int c1, s, w;
@@ -281,10 +193,10 @@ retry:
if (c > 0x20 && c < 0x7f) {
s = (c1 - 0x21)*94 + c - 0x21;
if (filter->status == 0x80) {
- if (s >= 0 && s < jisx0208_ucs_table_size) {
- w = jisx0208_ucs_table[s];
- } else if (s >= cp932ext1_ucs_table_min && s < cp932ext1_ucs_table_max) {
+ if (s >= cp932ext1_ucs_table_min && s < cp932ext1_ucs_table_max) {
w = cp932ext1_ucs_table[s - cp932ext1_ucs_table_min];
+ } else if (s >= 0 && s < jisx0208_ucs_table_size) {
+ w = jisx0208_ucs_table[s];
} else if (s >= cp932ext2_ucs_table_min && s < cp932ext2_ucs_table_max) {
w = cp932ext2_ucs_table[s - cp932ext2_ucs_table_min];
} else if (s >= cp932ext3_ucs_table_min && s < cp932ext3_ucs_table_max) {
@@ -307,20 +219,12 @@ retry:
w = 0;
}
if (w <= 0) {
- w = (c1 << 8) | c;
- w &= MBFL_WCSPLANE_MASK;
- w |= MBFL_WCSPLANE_JIS0212;
+ w = (c1 << 8) | c | MBFL_WCSPLANE_JIS0212;
}
}
CK((*filter->output_function)(w, filter->data));
- } else if (c == 0x1b) {
- filter->status += 2;
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = (c1 << 8) | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = (c1 << 8) | c | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
break;
@@ -338,7 +242,7 @@ retry:
filter->status += 3;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
goto retry;
}
break;
@@ -356,7 +260,7 @@ retry:
filter->status++;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
CK((*filter->output_function)(0x24, filter->data));
goto retry;
}
@@ -375,7 +279,7 @@ retry:
filter->status = 0x90;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
CK((*filter->output_function)(0x24, filter->data));
CK((*filter->output_function)(0x28, filter->data));
goto retry;
@@ -397,7 +301,7 @@ retry:
filter->status = 0x20;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
CK((*filter->output_function)(0x28, filter->data));
goto retry;
}
@@ -411,161 +315,13 @@ retry:
return c;
}
-/*
- * wchar => JIS
- */
-int
-mbfl_filt_conv_wchar_jis_ms(int c, mbfl_convert_filter *filter)
+static int mbfl_filt_conv_cp5022x_wchar_flush(mbfl_convert_filter *filter)
{
- int c1, s;
-
- s = 0;
- if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
- s = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
- } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
- s = ucs_a2_jis_table[c - ucs_a2_jis_table_min];
- } else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) {
- s = ucs_i_jis_table[c - ucs_i_jis_table_min];
- } else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) {
- s = ucs_r_jis_table[c - ucs_r_jis_table_min];
- } else if (c >= 0xe000 && c < (0xe000 + 10 * 94)) {
- /* PUE => Microsoft extended (pseudo 95ku - 114ku) */
- /* See http://www.opengroup.or.jp/jvc/cde/ucs-conv.html#ch4_2 */
- s = c - 0xe000;
- s = (s / 94 + 0x75) << 8 | (s % 94 + 0x21);
- } else if (c >= (0xe000 + 10 * 94) && c <= (0xe000 + 20 * 94)) {
- /* PUE => JISX0212 user-defined (G3 85ku - 94ku) */
- /* See http://www.opengroup.or.jp/jvc/cde/ucs-conv.html#ch4_2 */
- s = c - (0xe000 + 10 * 94);
- s = (s / 94 + 0xf5) << 8 | (s % 94 + 0xa1);
- }
-
- /* do some transliteration */
- if (s <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_JIS0208) {
- s = c & MBFL_WCSPLANE_MASK;
- } else if (c1 == MBFL_WCSPLANE_JIS0212) {
- s = c & MBFL_WCSPLANE_MASK;
- s |= 0x8080;
- } else if (c == 0xa5) { /* YEN SIGN */
- s = 0x1005c;
- } else if (c == 0x203e) { /* OVER LINE */
- s = 0x1007e;
- } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
- s = 0x2140;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
- s = 0x2141;
- } else if (c == 0x2225) { /* PARALLEL TO */
- s = 0x2142;
- } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
- s = 0x215d;
- } else if (c == 0xffe0) { /* FULLWIDTH CENT SIGN */
- s = 0x2171;
- } else if (c == 0xffe1) { /* FULLWIDTH POUND SIGN */
- s = 0x2172;
- } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */
- s = 0x224c;
- }
- }
- if (s <= 0 || (s >= 0x8080 && s < 0x10000)) {
- int i;
- s = -1;
-
- for (i = 0;
- i < cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; i++) {
- const int oh = cp932ext1_ucs_table_min / 94;
-
- if (c == cp932ext1_ucs_table[i]) {
- s = ((i / 94 + oh + 0x21) << 8) + (i % 94 + 0x21);
- break;
- }
- }
-
- if (s < 0) {
- const int oh = cp932ext2_ucs_table_min / 94;
- const int cp932ext2_ucs_table_size =
- cp932ext2_ucs_table_max - cp932ext2_ucs_table_min;
- for (i = 0; i < cp932ext2_ucs_table_size; i++) {
- if (c == cp932ext2_ucs_table[i]) {
- s = ((i / 94 + oh + 0x21) << 8) + (i % 94 + 0x21);
- break;
- }
- }
- }
-
- if (s < 0) {
- const int cp932ext3_ucs_table_size =
- cp932ext3_ucs_table_max - cp932ext3_ucs_table_min;
- const int limit = cp932ext3_ucs_table_size >
- cp932ext3_eucjp_table_size ?
- cp932ext3_eucjp_table_size:
- cp932ext3_ucs_table_size;
- for (i = 0; i < limit; i++) {
- if (c == cp932ext3_ucs_table[i]) {
- s = cp932ext3_eucjp_table[i];
- break;
- }
- }
- }
-
- if (c == 0) {
- s = 0;
- } else if (s <= 0) {
- s = -1;
- }
+ if ((filter->status & 0xF) == 1) {
+ /* 2-byte (JIS X 0208 or 0212) character was truncated */
+ CK((*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data));
}
-
- if (s >= 0) {
- if (s < 0x80) { /* ASCII */
- if ((filter->status & 0xff00) != 0) {
- CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
- CK((*filter->output_function)(0x28, filter->data)); /* '(' */
- CK((*filter->output_function)(0x42, filter->data)); /* 'B' */
- }
- filter->status = 0;
- CK((*filter->output_function)(s, filter->data));
- } else if (s < 0x100) { /* kana */
- if ((filter->status & 0xff00) != 0x100) {
- CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
- CK((*filter->output_function)(0x28, filter->data)); /* '(' */
- CK((*filter->output_function)(0x49, filter->data)); /* 'I' */
- }
- filter->status = 0x100;
- CK((*filter->output_function)(s & 0x7f, filter->data));
- } else if (s < 0x8080) { /* X 0208 */
- if ((filter->status & 0xff00) != 0x200) {
- CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
- CK((*filter->output_function)(0x24, filter->data)); /* '$' */
- CK((*filter->output_function)(0x42, filter->data)); /* 'B' */
- }
- filter->status = 0x200;
- CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
- CK((*filter->output_function)(s & 0x7f, filter->data));
- } else if (s < 0x10000) { /* X 0212 */
- if ((filter->status & 0xff00) != 0x300) {
- CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
- CK((*filter->output_function)(0x24, filter->data)); /* '$' */
- CK((*filter->output_function)(0x28, filter->data)); /* '(' */
- CK((*filter->output_function)(0x44, filter->data)); /* 'D' */
- }
- filter->status = 0x300;
- CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
- CK((*filter->output_function)(s & 0x7f, filter->data));
- } else { /* X 0201 latin */
- if ((filter->status & 0xff00) != 0x400) {
- CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
- CK((*filter->output_function)(0x28, filter->data)); /* '(' */
- CK((*filter->output_function)(0x4a, filter->data)); /* 'J' */
- }
- filter->status = 0x400;
- CK((*filter->output_function)(s & 0x7f, filter->data));
- }
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
+ return 0;
}
/*
@@ -585,7 +341,7 @@ mbfl_filt_conv_wchar_cp50220_ctor(mbfl_convert_filter *filt)
ctx->last.opaque = ctx;
ctx->last.data = filt->data;
filt->filter_function = vtbl_tl_jisx0201_jisx0208.filter_function;
- filt->filter_flush = vtbl_tl_jisx0201_jisx0208.filter_flush;
+ filt->filter_flush = (filter_flush_t)vtbl_tl_jisx0201_jisx0208.filter_flush;
filt->output_function = (output_function_t)ctx->last.filter_function;
filt->flush_function = (flush_function_t)ctx->last.filter_flush;
filt->data = &ctx->last;
@@ -613,65 +369,33 @@ mbfl_filt_conv_wchar_cp50220_dtor(mbfl_convert_filter *filt)
}
/*
- * wchar => cp50220raw
- */
-int
-mbfl_filt_conv_wchar_cp50220raw(int c, mbfl_convert_filter *filter)
-{
- if (c & MBFL_WCSPLANE_JIS0208) {
- const int s = c & MBFL_WCSPLANE_MASK;
-
- if ((filter->status & 0xff00) != 0x200) {
- CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
- CK((*filter->output_function)(0x24, filter->data)); /* '$' */
- CK((*filter->output_function)(0x42, filter->data)); /* 'B' */
- filter->status = 0x200;
- }
- CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
- CK((*filter->output_function)(s & 0x7f, filter->data));
- return c;
- } else {
- return mbfl_filt_conv_wchar_cp50221(c, filter);
- }
-}
-
-/*
* wchar => CP50221
*/
-int
-mbfl_filt_conv_wchar_cp50221(int c, mbfl_convert_filter *filter)
+int mbfl_filt_conv_wchar_cp50221(int c, mbfl_convert_filter *filter)
{
int s = 0;
if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
s = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
+ } else if (c == 0x203E) { /* OVERLINE */
+ s = 0x1007E; /* Convert to JISX 0201 OVERLINE */
} else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
s = ucs_a2_jis_table[c - ucs_a2_jis_table_min];
} else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) {
s = ucs_i_jis_table[c - ucs_i_jis_table_min];
} else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) {
s = ucs_r_jis_table[c - ucs_r_jis_table_min];
- } else if (c >= 0xe000 && c < (0xe000 + 10 * 94)) {
- /* PUE => Microsoft extended */
- /* See http://www.opengroup.or.jp/jvc/cde/ucs-conv.html#ch4_2 */
- s = c - 0xe000;
- s = (s / 94 + 0x75) << 8 | (s % 94 + 0x21);
- } else if (c >= (0xe000 + 10 * 94) && c <= (0xe000 + 20 * 94)) {
- /* PUE => JISX0212 user-defined (G3 85ku - 94ku) */
- /* See http://www.opengroup.or.jp/jvc/cde/ucs-conv.html#ch4_2 */
- s = c - (0xe000 + 10 * 94);
- s = (s / 94 + 0xf5) << 8 | (s % 94 + 0xa1);
+ } else if (c >= 0xE000 && c <= 0xE757) {
+ /* 'private'/'user' codepoints */
+ s = c - 0xE000;
+ s = ((s / 94) + 0x7F) << 8 | ((s % 94) + 0x21);
}
if (s <= 0) {
if (c == 0xa5) { /* YEN SIGN */
s = 0x1005c;
- } else if (c == 0x203e) { /* OVER LINE */
- s = 0x1007e;
} else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
s = 0x2140;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
- s = 0x2141;
} else if (c == 0x2225) { /* PARALLEL TO */
s = 0x2142;
} else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
@@ -684,7 +408,16 @@ mbfl_filt_conv_wchar_cp50221(int c, mbfl_convert_filter *filter)
s = 0x224c;
}
}
- if (s <= 0 || (s >= 0x8080 && s < 0x10000)) {
+
+ /* Above, we do a series of lookups in `ucs_*_jis_table` to find a
+ * corresponding kuten code for this Unicode codepoint
+ * If we get zero, that means the codepoint is not in JIS X 0208
+ * On the other hand, if we get a result with the high bits set on both
+ * upper and lower bytes, that is not a code in JIS X 0208 but rather
+ * in JIS X 0213
+ * In either case, check if this codepoint is one of the extensions added
+ * to JIS X 0208 by MicroSoft (to make CP932) */
+ if (s == 0 || ((s & 0x8000) && (s & 0x80))) {
int i;
s = -1;
@@ -750,15 +483,15 @@ mbfl_filt_conv_wchar_cp50221(int c, mbfl_convert_filter *filter)
filter->status = 0x500;
}
CK((*filter->output_function)(s - 0x80, filter->data));
- } else if (s < 0x8080) { /* X 0208 */
+ } else if (s <= 0x927E) { /* X 0208 + extensions */
if ((filter->status & 0xff00) != 0x200) {
CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
CK((*filter->output_function)(0x24, filter->data)); /* '$' */
CK((*filter->output_function)(0x42, filter->data)); /* 'B' */
filter->status = 0x200;
}
- CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
- CK((*filter->output_function)(s & 0x7f, filter->data));
+ CK((*filter->output_function)((s >> 8) & 0xff, filter->data));
+ CK((*filter->output_function)(s & 0xff, filter->data));
} else if (s < 0x10000) { /* X0212 */
CK(mbfl_filt_conv_illegal_output(c, filter));
} else { /* X 0201 latin */
@@ -780,42 +513,31 @@ mbfl_filt_conv_wchar_cp50221(int c, mbfl_convert_filter *filter)
/*
* wchar => CP50222
*/
-int
-mbfl_filt_conv_wchar_cp50222(int c, mbfl_convert_filter *filter)
+int mbfl_filt_conv_wchar_cp50222(int c, mbfl_convert_filter *filter)
{
- int s;
-
- s = 0;
+ int s = 0;
if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
s = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
+ } else if (c == 0x203E) { /* OVERLINE */
+ s = 0x1007E; /* Convert to JISX 0201 OVERLINE */
} else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
s = ucs_a2_jis_table[c - ucs_a2_jis_table_min];
} else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) {
s = ucs_i_jis_table[c - ucs_i_jis_table_min];
} else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) {
s = ucs_r_jis_table[c - ucs_r_jis_table_min];
- } else if (c >= 0xe000 && c < (0xe000 + 10 * 94)) {
- /* PUE => Microsoft extended */
- /* See http://www.opengroup.or.jp/jvc/cde/ucs-conv.html#ch4_2 */
- s = c - 0xe000;
- s = (s / 94 + 0x75) << 8 | (s % 94 + 0x21);
- } else if (c >= (0xe000 + 10 * 94) && c <= (0xe000 + 20 * 94)) {
- /* PUE => JISX0212 user-defined (G3 85ku - 94ku) */
- /* See http://www.opengroup.or.jp/jvc/cde/ucs-conv.html#ch4_2 */
- s = c - (0xe000 + 10 * 94);
- s = (s / 94 + 0xf5) << 8 | (s % 94 + 0xa1);
+ } else if (c >= 0xE000 && c <= 0xE757) {
+ /* 'private'/'user' codepoints */
+ s = c - 0xE000;
+ s = ((s / 94) + 0x7F) << 8 | ((s % 94) + 0x21);
}
if (s <= 0) {
if (c == 0xa5) { /* YEN SIGN */
s = 0x1005c;
- } else if (c == 0x203e) { /* OVER LINE */
- s = 0x1007e;
} else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
s = 0x2140;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
- s = 0x2141;
} else if (c == 0x2225) { /* PARALLEL TO */
s = 0x2142;
} else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
@@ -828,7 +550,7 @@ mbfl_filt_conv_wchar_cp50222(int c, mbfl_convert_filter *filter)
s = 0x224c;
}
}
- if (s <= 0 || (s >= 0x8080 && s < 0x10000)) {
+ if (s == 0 || ((s & 0x8000) && (s & 0x80))) {
int i;
s = -1;
@@ -894,7 +616,7 @@ mbfl_filt_conv_wchar_cp50222(int c, mbfl_convert_filter *filter)
filter->status = 0x500;
}
CK((*filter->output_function)(s - 0x80, filter->data));
- } else if (s < 0x8080) { /* X 0208 */
+ } else if (s <= 0x927E) { /* X 0208 */
if ((filter->status & 0xff00) == 0x500) {
CK((*filter->output_function)(0x0f, filter->data)); /* SO */
filter->status = 0;
@@ -905,8 +627,8 @@ mbfl_filt_conv_wchar_cp50222(int c, mbfl_convert_filter *filter)
CK((*filter->output_function)(0x42, filter->data)); /* 'B' */
filter->status = 0x200;
}
- CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
- CK((*filter->output_function)(s & 0x7f, filter->data));
+ CK((*filter->output_function)((s >> 8) & 0xff, filter->data));
+ CK((*filter->output_function)(s & 0xff, filter->data));
} else if (s < 0x10000) { /* X0212 */
CK(mbfl_filt_conv_illegal_output(c, filter));
} else { /* X 0201 latin */
@@ -942,338 +664,9 @@ mbfl_filt_conv_wchar_cp50222_flush(mbfl_convert_filter *filter)
}
filter->status &= 0xff;
- if (filter->flush_function != NULL) {
- return (*filter->flush_function)(filter->data);
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
}
return 0;
}
-
-
-static int mbfl_filt_ident_jis_ms(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x20: X 0201 kana */
-/* case 0x80: X 0208 */
-/* case 0x90: X 0212 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (c == 0x0e) { /* "kana in" */
- filter->status = 0x20;
- } else if (c == 0x0f) { /* "kana out" */
- filter->status = 0;
- } else if ((filter->status == 0x80 || filter->status == 0x90) && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
-/* case 0x91: X 0212 second char */
- case 1:
- filter->status &= ~0xf;
- if (c == 0x1b) {
- goto retry;
- } else if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x28) { /* '(' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ ( */
- case 4:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x44) { /* 'D' */
- filter->status = 0x90;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42 || c == 0x48) { /* 'B' or 'H' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else if (c == 0x49) { /* 'I' */
- filter->status = 0x20;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_cp50220(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x80: X 0208 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
- case 1:
- if (c == 0x1b) {
- filter->status++;
- } else {
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_cp50221(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x80: X 0208 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
- case 1:
- if (c == 0x1b) {
- filter->status++;
- } else {
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else if (c == 0x49) { /* 'I' */
- filter->status = 0x20;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_cp50222(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x80: X 0208 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
- case 1:
- if (c == 0x1b) {
- filter->status++;
- } else {
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h
index e7cde7dff8..fdbaad6775 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h
@@ -32,31 +32,19 @@
#include "mbfilter.h"
-extern const mbfl_encoding mbfl_encoding_jis_ms;
extern const mbfl_encoding mbfl_encoding_cp50220;
-extern const mbfl_encoding mbfl_encoding_cp50220raw;
extern const mbfl_encoding mbfl_encoding_cp50221;
extern const mbfl_encoding mbfl_encoding_cp50222;
-extern const struct mbfl_identify_vtbl vtbl_identify_jis_ms;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp50220;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp50220raw;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp50221;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp50222;
-extern const struct mbfl_convert_vtbl vtbl_jis_ms_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_jis_ms;
+
extern const struct mbfl_convert_vtbl vtbl_cp50220_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_cp50220;
-extern const struct mbfl_convert_vtbl vtbl_cp50220raw_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_cp50220raw;
extern const struct mbfl_convert_vtbl vtbl_cp50221_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_cp50221;
extern const struct mbfl_convert_vtbl vtbl_cp50222_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_cp50222;
-int mbfl_filt_conv_jis_ms_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_jis_ms(int c, mbfl_convert_filter *filter);
+int mbfl_filt_conv_cp5022x_wchar(int c, mbfl_convert_filter *filter);
int mbfl_filt_conv_wchar_cp50220(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_cp50220raw(int c, mbfl_convert_filter *filter);
int mbfl_filt_conv_wchar_cp50221(int c, mbfl_convert_filter *filter);
int mbfl_filt_conv_wchar_cp50222(int c, mbfl_convert_filter *filter);
int mbfl_filt_conv_wchar_cp50222_flush(mbfl_convert_filter *filter);
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c
index da046c86b7..5d1d08998c 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c
@@ -34,7 +34,7 @@
#include "unicode_table_jis.h"
#include "cp932_table.h"
-static int mbfl_filt_ident_cp51932(int c, mbfl_identify_filter *filter);
+static int mbfl_filt_conv_cp51932_wchar_flush(mbfl_convert_filter *filter);
static const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -55,22 +55,15 @@ static const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1
};
-
static const char *mbfl_encoding_cp51932_aliases[] = {"cp51932", NULL};
-const struct mbfl_identify_vtbl vtbl_identify_cp51932 = {
- mbfl_no_encoding_cp51932,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp51932
-};
-
const mbfl_encoding mbfl_encoding_cp51932 = {
mbfl_no_encoding_cp51932,
"CP51932",
"CP51932",
- (const char *(*)[])&mbfl_encoding_cp51932_aliases,
+ mbfl_encoding_cp51932_aliases,
mblen_table_eucjp,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_cp51932_wchar,
&vtbl_wchar_cp51932
};
@@ -81,7 +74,7 @@ const struct mbfl_convert_vtbl vtbl_cp51932_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_cp51932_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_cp51932_wchar_flush,
NULL,
};
@@ -97,13 +90,6 @@ const struct mbfl_convert_vtbl vtbl_wchar_cp51932 = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-#define sjistoidx(c1, c2) \
- (((c1) > 0x9f) \
- ? (((c1) - 0xc1) * 188 + (c2) - (((c2) > 0x7e) ? 0x41 : 0x40)) \
- : (((c1) - 0x81) * 188 + (c2) - (((c2) > 0x7e) ? 0x41 : 0x40)))
-#define idxtoeuc1(c) (((c) / 94) + 0xa1)
-#define idxtoeuc2(c) (((c) % 94) + 0xa1)
-
/*
* cp51932 => wchar
*/
@@ -114,17 +100,15 @@ mbfl_filt_conv_cp51932_wchar(int c, mbfl_convert_filter *filter)
switch (filter->status) {
case 0:
- if (c >= 0 && c < 0x80) { /* latin */
+ if (c >= 0 && c < 0x80) { /* latin */
CK((*filter->output_function)(c, filter->data));
- } else if (c > 0xa0 && c < 0xff) { /* CP932 first char */
+ } else if (c >= 0xA1 && c <= 0xFE) { /* CP932, first byte */
filter->status = 1;
filter->cache = c;
- } else if (c == 0x8e) { /* kana first char */
+ } else if (c == 0x8e) { /* kana first char */
filter->status = 2;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(w, filter->data));
+ CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data));
}
break;
@@ -161,17 +145,11 @@ mbfl_filt_conv_cp51932_wchar(int c, mbfl_convert_filter *filter)
}
}
if (w <= 0) {
- w = ((c1 & 0x7f) << 8) | (c & 0x7f);
- w &= MBFL_WCSPLANE_MASK;
- w |= MBFL_WCSPLANE_WINCP932;
+ w = ((c1 & 0x7f) << 8) | (c & 0x7f) | MBFL_WCSPLANE_WINCP932;
}
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = (c1 << 8) | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = (c1 << 8) | c | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
break;
@@ -181,12 +159,8 @@ mbfl_filt_conv_cp51932_wchar(int c, mbfl_convert_filter *filter)
if (c > 0xa0 && c < 0xe0) {
w = 0xfec0 + c;
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = 0x8e00 | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = 0x8e00 | c | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
break;
@@ -199,6 +173,20 @@ mbfl_filt_conv_cp51932_wchar(int c, mbfl_convert_filter *filter)
return c;
}
+static int mbfl_filt_conv_cp51932_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status) {
+ /* Input string was truncated */
+ (*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data);
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
+
/*
* wchar => cp51932
*/
@@ -219,28 +207,10 @@ mbfl_filt_conv_wchar_cp51932(int c, mbfl_convert_filter *filter)
}
if (s1 >= 0x8080) s1 = -1; /* we don't support JIS X0213 */
if (s1 <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_WINCP932) {
- s1 = c & MBFL_WCSPLANE_MASK;
- if (s1 >= ((85 + 0x20) << 8)) { /* 85ku - 120ku */
- s1 = -1;
- }
- } else if (c1 == MBFL_WCSPLANE_JIS0208) {
- s1 = c & MBFL_WCSPLANE_MASK;
- if ((s1 >= ((85 + 0x20) << 8) && /* 85ku - 94ku */
- s1 <= ((88 + 0x20) << 8)) ||/* IBM extension */
- (s1 >= ((93 + 0x20) << 8) && /* 89ku - 92ku */
- s1 <= ((94 + 0x20) << 8))) {
- s1 = -1;
- }
- } else if (c == 0xa5) { /* YEN SIGN */
- s1 = 0x005c; /* YEN SIGN */
- } else if (c == 0x203e) { /* OVER LINE */
- s1 = 0x007e; /* FULLWIDTH MACRON */
+ if (c == 0xa5) { /* YEN SIGN */
+ s1 = 0x216F; /* FULLWIDTH YEN SIGN */
} else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
s1 = 0x2140;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
- s1 = 0x2141;
} else if (c == 0x2225) { /* PARALLEL TO */
s1 = 0x2142;
} else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
@@ -299,40 +269,3 @@ mbfl_filt_conv_wchar_cp51932(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_cp51932(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* kanji first char */
- filter->status = 1;
- } else if (c == 0x8e) { /* kana first char */
- filter->status = 2;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got first half */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 2: /* got 0x8e */
- if (c < 0xa1 || c > 0xdf) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.h b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.h
index bbf56f48ca..f48ec7cb3d 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_cp51932;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp51932;
extern const struct mbfl_convert_vtbl vtbl_cp51932_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_cp51932;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp850.c b/ext/mbstring/libmbfl/filters/mbfilter_cp850.c
deleted file mode 100644
index 5d6b265fc1..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp850.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- * Adaption for CP850: D. Giffeler <dg@artegic.de>
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_cp850.h"
-#include "unicode_table_cp850.h"
-
-static int mbfl_filt_ident_cp850(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_cp850_aliases[] = {"CP850", "CP-850", "IBM850", "IBM-850", NULL};
-
-const mbfl_encoding mbfl_encoding_cp850 = {
- mbfl_no_encoding_cp850,
- "CP850",
- "CP850",
- (const char *(*)[])&mbfl_encoding_cp850_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_cp850_wchar,
- &vtbl_wchar_cp850
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp850 = {
- mbfl_no_encoding_cp850,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp850
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_cp850 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_cp850,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_cp850,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_cp850_wchar = {
- mbfl_no_encoding_cp850,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_cp850_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * cp850 => wchar
- */
-int
-mbfl_filt_conv_cp850_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < cp850_ucs_table_min) {
- s = c;
- } else if (c >= cp850_ucs_table_min && c < 0x100) {
- s = cp850_ucs_table[c - cp850_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_CP850;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => cp850
- */
-int
-mbfl_filt_conv_wchar_cp850(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = cp850_ucs_table_len-1;
- while (n >= 0) {
- if (c == cp850_ucs_table[n]) {
- s = cp850_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_CP850) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_cp850(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp850.h b/ext/mbstring/libmbfl/filters/mbfilter_cp850.h
deleted file mode 100644
index 2a0e8e9e65..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp850.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- * Adaption for CP850: D. Giffeler <dg@artegic.de>
- *
- */
-
-#ifndef MBFL_MBFILTER_CP850_H
-#define MBFL_MBFILTER_CP850_H
-
-extern const mbfl_encoding mbfl_encoding_cp850;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp850;
-extern const struct mbfl_convert_vtbl vtbl_wchar_cp850;
-extern const struct mbfl_convert_vtbl vtbl_cp850_wchar;
-
-int mbfl_filt_conv_cp850_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_cp850(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_CP850_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp866.c b/ext/mbstring/libmbfl/filters/mbfilter_cp866.c
deleted file mode 100644
index 504903bef0..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp866.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_cp866.h"
-#include "unicode_table_cp866.h"
-
-static int mbfl_filt_ident_cp866(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_cp866_aliases[] = {"CP866", "CP-866", "IBM866", "IBM-866", NULL};
-
-const mbfl_encoding mbfl_encoding_cp866 = {
- mbfl_no_encoding_cp866,
- "CP866",
- "CP866",
- (const char *(*)[])&mbfl_encoding_cp866_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_cp866_wchar,
- &vtbl_wchar_cp866
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp866 = {
- mbfl_no_encoding_cp866,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp866
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_cp866 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_cp866,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_cp866,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_cp866_wchar = {
- mbfl_no_encoding_cp866,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_cp866_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * cp866 => wchar
- */
-int
-mbfl_filt_conv_cp866_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < cp866_ucs_table_min) {
- s = c;
- } else if (c >= cp866_ucs_table_min && c < 0x100) {
- s = cp866_ucs_table[c - cp866_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_CP866;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => cp866
- */
-int
-mbfl_filt_conv_wchar_cp866(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = cp866_ucs_table_len-1;
- while (n >= 0) {
- if (c == cp866_ucs_table[n]) {
- s = cp866_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_CP866) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_cp866(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp866.h b/ext/mbstring/libmbfl/filters/mbfilter_cp866.h
deleted file mode 100644
index e9eb25a541..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp866.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.h
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_CP866_H
-#define MBFL_MBFILTER_CP866_H
-
-extern const mbfl_encoding mbfl_encoding_cp866;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp866;
-extern const struct mbfl_convert_vtbl vtbl_wchar_cp866;
-extern const struct mbfl_convert_vtbl vtbl_cp866_wchar;
-
-int mbfl_filt_conv_cp866_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_cp866(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_CP866_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c
index 3cbca1cb64..e6f34dd31b 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c
@@ -33,7 +33,7 @@
#include "unicode_table_cp932_ext.h"
#include "unicode_table_jis.h"
-static int mbfl_filt_ident_cp932(int c, mbfl_identify_filter *filter);
+static int mbfl_filt_conv_cp932_wchar_flush(mbfl_convert_filter *filter);
static const unsigned char mblen_table_sjis[] = { /* 0x80-0x9f,0xE0-0xFF */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -60,26 +60,20 @@ const mbfl_encoding mbfl_encoding_cp932 = {
mbfl_no_encoding_cp932,
"CP932",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_cp932_aliases,
+ mbfl_encoding_cp932_aliases,
mblen_table_sjis,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_cp932_wchar,
&vtbl_wchar_cp932
};
-const struct mbfl_identify_vtbl vtbl_identify_cp932 = {
- mbfl_no_encoding_cp932,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp932
-};
-
const struct mbfl_convert_vtbl vtbl_cp932_wchar = {
mbfl_no_encoding_cp932,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_cp932_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_cp932_wchar_flush,
NULL,
};
@@ -201,17 +195,11 @@ mbfl_filt_conv_cp932_wchar(int c, mbfl_convert_filter *filter)
}
}
if (w <= 0) {
- w = (s1 << 8) | s2;
- w &= MBFL_WCSPLANE_MASK;
- w |= MBFL_WCSPLANE_WINCP932;
+ w = (s1 << 8) | s2 | MBFL_WCSPLANE_WINCP932;
}
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = (c1 << 8) | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = (c1 << 8) | c | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
break;
@@ -224,6 +212,19 @@ mbfl_filt_conv_cp932_wchar(int c, mbfl_convert_filter *filter)
return c;
}
+static int mbfl_filt_conv_cp932_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status) {
+ (*filter->filter_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter);
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
+
/*
* wchar => SJIS-win
*/
@@ -250,23 +251,10 @@ mbfl_filt_conv_wchar_cp932(int c, mbfl_convert_filter *filter)
s2 = 1;
}
if (s1 <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_WINCP932) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s2 = 1;
- } else if (c1 == MBFL_WCSPLANE_JIS0208) {
- s1 = c & MBFL_WCSPLANE_MASK;
- } else if (c1 == MBFL_WCSPLANE_JIS0212) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s1 |= 0x8080;
- } else if (c == 0xa5) { /* YEN SIGN */
- s1 = 0x005c; /* YEN SIGN */
- } else if (c == 0x203e) { /* OVER LINE */
- s1 = 0x007e; /* FULLWIDTH MACRON */
+ if (c == 0xa5) { /* YEN SIGN */
+ s1 = 0x216F; /* FULLWIDTH YEN SIGN */
} else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
s1 = 0x2140;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
- s1 = 0x2141;
} else if (c == 0x2225) { /* PARALLEL TO */
s1 = 0x2142;
} else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
@@ -323,23 +311,3 @@ mbfl_filt_conv_wchar_cp932(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_cp932(int c, mbfl_identify_filter *filter)
-{
- if (filter->status) { /* kanji second char */
- if (c < 0x40 || c > 0xfc || c == 0x7f) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- } else if (c >= 0 && c < 0x80) { /* latin ok */
- ;
- } else if (c > 0xa0 && c < 0xe0) { /* kana ok */
- ;
- } else if (c > 0x80 && c < 0xfd && c != 0xa0) { /* kanji first char */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp932.h b/ext/mbstring/libmbfl/filters/mbfilter_cp932.h
index f0b6daeac7..031276ddf1 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp932.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp932.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_cp932;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp932;
extern const struct mbfl_convert_vtbl vtbl_cp932_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_cp932;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c
index df6d77907f..0559e0ce78 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c
@@ -32,8 +32,6 @@
#define UNICODE_TABLE_CP936_DEF
#include "unicode_table_cp936.h"
-static int mbfl_filt_ident_cp936(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_cp936[] = { /* 0x81-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -59,19 +57,13 @@ const mbfl_encoding mbfl_encoding_cp936 = {
mbfl_no_encoding_cp936,
"CP936",
"CP936",
- (const char *(*)[])&mbfl_encoding_cp936_aliases,
+ mbfl_encoding_cp936_aliases,
mblen_table_cp936,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_cp936_wchar,
&vtbl_wchar_cp936
};
-const struct mbfl_identify_vtbl vtbl_identify_cp936 = {
- mbfl_no_encoding_cp936,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp936
-};
-
const struct mbfl_convert_vtbl vtbl_cp936_wchar = {
mbfl_no_encoding_cp936,
mbfl_no_encoding_wchar,
@@ -283,21 +275,3 @@ mbfl_filt_conv_wchar_cp936(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_cp936(int c, mbfl_identify_filter *filter)
-{
- if (filter->status) { /* kanji second char */
- if (c < 0x40 || c > 0xfe || c == 0x7f) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- } else if (c >= 0 && c < 0x80) { /* latin ok */
- ;
- } else if (c > 0x80 && c < 0xff) { /* DBCS lead byte */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp936.h b/ext/mbstring/libmbfl/filters/mbfilter_cp936.h
index cc5e9bd333..d10391f5d2 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp936.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp936.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_cp936;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp936;
extern const struct mbfl_convert_vtbl vtbl_cp936_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_cp936;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c
index 53a8aac2a6..c95e4f5448 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c
@@ -32,8 +32,6 @@
#include "unicode_table_cp936.h"
-static int mbfl_filt_ident_euccn(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_euccn[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -59,19 +57,13 @@ const mbfl_encoding mbfl_encoding_euc_cn = {
mbfl_no_encoding_euc_cn,
"EUC-CN",
"CN-GB",
- (const char *(*)[])&mbfl_encoding_euc_cn_aliases,
+ mbfl_encoding_euc_cn_aliases,
mblen_table_euccn,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_euccn_wchar,
&vtbl_wchar_euccn
};
-const struct mbfl_identify_vtbl vtbl_identify_euccn = {
- mbfl_no_encoding_euc_cn,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_euccn
-};
-
const struct mbfl_convert_vtbl vtbl_euccn_wchar = {
mbfl_no_encoding_euc_cn,
mbfl_no_encoding_wchar,
@@ -209,31 +201,3 @@ mbfl_filt_conv_wchar_euccn(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_euccn(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* DBCS lead byte */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got lead byte */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.h
index 31251fcf6d..7ef92d8b4b 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_euc_cn;
-extern const struct mbfl_identify_vtbl vtbl_identify_euccn;
extern const struct mbfl_convert_vtbl vtbl_euccn_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_euccn;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c
index 252a10a58d..e3e7dfc931 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c
@@ -33,7 +33,7 @@
#include "unicode_table_cp932_ext.h"
#include "unicode_table_jis.h"
-int mbfl_filt_ident_eucjp(int c, mbfl_identify_filter *filter);
+static int mbfl_filt_conv_eucjp_wchar_flush(mbfl_convert_filter *filter);
const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -60,26 +60,20 @@ const mbfl_encoding mbfl_encoding_euc_jp = {
mbfl_no_encoding_euc_jp,
"EUC-JP",
"EUC-JP",
- (const char *(*)[])&mbfl_encoding_euc_jp_aliases,
+ mbfl_encoding_euc_jp_aliases,
mblen_table_eucjp,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_eucjp_wchar,
&vtbl_wchar_eucjp
};
-const struct mbfl_identify_vtbl vtbl_identify_eucjp = {
- mbfl_no_encoding_euc_jp,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_eucjp
-};
-
const struct mbfl_convert_vtbl vtbl_eucjp_wchar = {
mbfl_no_encoding_euc_jp,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_eucjp_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_eucjp_wchar_flush,
NULL,
};
@@ -101,7 +95,7 @@ const struct mbfl_convert_vtbl vtbl_wchar_eucjp = {
int
mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter)
{
- int c1, s, w;
+ int c1, s, w = 0;
switch (filter->status) {
case 0:
@@ -115,9 +109,7 @@ mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter)
} else if (c == 0x8f) { /* X 0212 first char */
filter->status = 3;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(w, filter->data));
+ CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data));
}
break;
@@ -128,21 +120,13 @@ mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter)
s = (c1 - 0xa1)*94 + c - 0xa1;
if (s >= 0 && s < jisx0208_ucs_table_size) {
w = jisx0208_ucs_table[s];
- } else {
- w = 0;
}
if (w <= 0) {
- w = ((c1 & 0x7f) << 8) | (c & 0x7f);
- w &= MBFL_WCSPLANE_MASK;
- w |= MBFL_WCSPLANE_JIS0208;
+ w = ((c1 & 0x7f) << 8) | (c & 0x7f) | MBFL_WCSPLANE_JIS0208;
}
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = (c1 << 8) | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = (c1 << 8) | c | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
break;
@@ -152,47 +136,31 @@ mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter)
if (c > 0xa0 && c < 0xe0) {
w = 0xfec0 + c;
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = 0x8e00 | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = 0x8e00 | c | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
break;
- case 3: /* got 0x8f, X 0212 first char */
- if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
- filter->status = 0;
- } else {
- filter->status++;
- filter->cache = c;
- }
+ case 3: /* got 0x8f, JIS X 0212 first byte */
+ filter->status++;
+ filter->cache = c;
break;
- case 4: /* got 0x8f, X 0212 second char */
+
+ case 4: /* got 0x8f, JIS X 0212 second byte */
filter->status = 0;
c1 = filter->cache;
- if (c1 > 0xa0 && c1 < 0xff && c > 0xa0 && c < 0xff) {
+ if (c > 0xA0 && c < 0xFF && c1 > 0xA0 && c1 < 0xFF) {
s = (c1 - 0xa1)*94 + c - 0xa1;
if (s >= 0 && s < jisx0212_ucs_table_size) {
w = jisx0212_ucs_table[s];
- } else {
- w = 0;
}
if (w <= 0) {
- w = ((c1 & 0x7f) << 8) | (c & 0x7f);
- w &= MBFL_WCSPLANE_MASK;
- w |= MBFL_WCSPLANE_JIS0212;
+ w = ((c1 & 0x7f) << 8) | (c & 0x7f) | MBFL_WCSPLANE_JIS0212;
}
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = (c1 << 8) | c | 0x8f0000;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = (c1 << 8) | c | 0x8f0000 | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
break;
@@ -205,16 +173,30 @@ mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter)
return c;
}
+static int mbfl_filt_conv_eucjp_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status) {
+ (*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data);
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
+
/*
* wchar => EUC-JP
*/
int
mbfl_filt_conv_wchar_eucjp(int c, mbfl_convert_filter *filter)
{
- int c1, s;
+ int s = 0;
- s = 0;
- if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
+ if (c == 0xAF) { /* U+00AF is MACRON */
+ s = 0xA2B4; /* Use JIS X 0212 overline */
+ } else if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
s = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
} else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
s = ucs_a2_jis_table[c - ucs_a2_jis_table_min];
@@ -224,13 +206,7 @@ mbfl_filt_conv_wchar_eucjp(int c, mbfl_convert_filter *filter)
s = ucs_r_jis_table[c - ucs_r_jis_table_min];
}
if (s <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_JIS0208) {
- s = c & MBFL_WCSPLANE_MASK;
- } else if (c1 == MBFL_WCSPLANE_JIS0212) {
- s = c & MBFL_WCSPLANE_MASK;
- s |= 0x8080;
- } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
+ if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
s = 0x2140;
} else if (c == 0xff5e) { /* FULLWIDTH TILDE */
s = 0x2141;
@@ -244,10 +220,9 @@ mbfl_filt_conv_wchar_eucjp(int c, mbfl_convert_filter *filter)
s = 0x2172;
} else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */
s = 0x224c;
- }
- if (c == 0) {
+ } else if (c == 0) {
s = 0;
- } else if (s <= 0) {
+ } else {
s = -1;
}
}
@@ -271,55 +246,3 @@ mbfl_filt_conv_wchar_eucjp(int c, mbfl_convert_filter *filter)
return c;
}
-
-int mbfl_filt_ident_eucjp(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* kanji first char */
- filter->status = 1;
- } else if (c == 0x8e) { /* kana first char */
- filter->status = 2;
- } else if (c == 0x8f) { /* X 0212 first char */
- filter->status = 3;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got first half */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 2: /* got 0x8e */
- if (c < 0xa1 || c > 0xdf) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 3: /* got 0x8f */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status++;
- break;
- case 4: /* got 0x8f */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.h
index e1bd565343..cc7aa3a6bf 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_euc_jp;
-extern const struct mbfl_identify_vtbl vtbl_identify_eucjp;
extern const struct mbfl_convert_vtbl vtbl_eucjp_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_eucjp;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c
index 30d869cea5..abfc4cc4ae 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c
@@ -31,7 +31,6 @@
#include "mbfilter_euc_jp_2004.h"
#include "mbfilter_sjis_2004.h"
-extern int mbfl_filt_ident_eucjp(int c, mbfl_identify_filter *filter);
extern const unsigned char mblen_table_eucjp[];
static const char *mbfl_encoding_eucjp2004_aliases[] = {"EUC_JP-2004", NULL};
@@ -40,19 +39,13 @@ const mbfl_encoding mbfl_encoding_eucjp2004 = {
mbfl_no_encoding_eucjp2004,
"EUC-JP-2004",
"EUC-JP",
- (const char *(*)[])&mbfl_encoding_eucjp2004_aliases,
+ mbfl_encoding_eucjp2004_aliases,
mblen_table_eucjp,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_eucjp2004_wchar,
&vtbl_wchar_eucjp2004
};
-const struct mbfl_identify_vtbl vtbl_identify_eucjp2004 = {
- mbfl_no_encoding_eucjp2004,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_eucjp
-};
-
const struct mbfl_convert_vtbl vtbl_eucjp2004_wchar = {
mbfl_no_encoding_eucjp2004,
mbfl_no_encoding_wchar,
@@ -69,6 +62,6 @@ const struct mbfl_convert_vtbl vtbl_wchar_eucjp2004 = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_wchar_jis2004,
- mbfl_filt_conv_jis2004_flush,
+ mbfl_filt_conv_wchar_jis2004_flush,
NULL,
};
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.h
index 55c06aef98..affdd447f5 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_eucjp2004;
-extern const struct mbfl_identify_vtbl vtbl_identify_eucjp2004;
extern const struct mbfl_convert_vtbl vtbl_eucjp2004_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_eucjp2004;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c
index 5798bff0fc..d55e5c54e6 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c
@@ -34,8 +34,6 @@
#include "unicode_table_jis.h"
#include "cp932_table.h"
-static int mbfl_filt_ident_eucjp_win(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -55,23 +53,15 @@ static const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1
};
-
-static const char *mbfl_encoding_eucjp_win_aliases[] = {"eucJP-open",
- "eucJP-ms", NULL};
-
-const struct mbfl_identify_vtbl vtbl_identify_eucjpwin = {
- mbfl_no_encoding_eucjp_win,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_eucjp_win
-};
+static const char *mbfl_encoding_eucjp_win_aliases[] = {"eucJP-open", "eucJP-ms", NULL};
const mbfl_encoding mbfl_encoding_eucjp_win = {
mbfl_no_encoding_eucjp_win,
"eucJP-win",
"EUC-JP",
- (const char *(*)[])&mbfl_encoding_eucjp_win_aliases,
+ mbfl_encoding_eucjp_win_aliases,
mblen_table_eucjp,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_eucjpwin_wchar,
&vtbl_wchar_eucjpwin
};
@@ -283,25 +273,7 @@ mbfl_filt_conv_wchar_eucjpwin(int c, mbfl_convert_filter *filter)
s1 = 0x2d62; /* NUMERO SIGN */
}
if (s1 <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_WINCP932) {
- s1 = c & MBFL_WCSPLANE_MASK;
- if (s1 >= ((85 + 0x20) << 8)) { /* 85ku - 120ku */
- s1 = -1;
- }
- } else if (c1 == MBFL_WCSPLANE_JIS0208) {
- s1 = c & MBFL_WCSPLANE_MASK;
- if (s1 >= ((85 + 0x20) << 8)) { /* 85ku - 94ku */
- s1 = -1;
- }
- } else if (c1 == MBFL_WCSPLANE_JIS0212) {
- s1 = c & MBFL_WCSPLANE_MASK;
- if (s1 >= ((83 + 0x20) << 8)) { /* 83ku - 94ku */
- s1 = -1;
- } else {
- s1 |= 0x8080;
- }
- } else if (c == 0xa5) { /* YEN SIGN */
+ if (c == 0xa5) { /* YEN SIGN */
s1 = 0x216f; /* FULLWIDTH YEN SIGN */
} else if (c == 0x203e) { /* OVER LINE */
s1 = 0x2131; /* FULLWIDTH MACRON */
@@ -319,8 +291,6 @@ mbfl_filt_conv_wchar_eucjpwin(int c, mbfl_convert_filter *filter)
s1 = 0x2172;
} else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */
s1 = 0x224c;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
- s1 = 0x2141;
} else {
s1 = -1;
c1 = 0;
@@ -375,55 +345,3 @@ mbfl_filt_conv_wchar_eucjpwin(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_eucjp_win(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* kanji first char */
- filter->status = 1;
- } else if (c == 0x8e) { /* kana first char */
- filter->status = 2;
- } else if (c == 0x8f) { /* X 0212 first char */
- filter->status = 3;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got first half */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 2: /* got 0x8e */
- if (c < 0xa1 || c > 0xdf) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 3: /* got 0x8f */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status++;
- break;
- case 4: /* got 0x8f */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.h
index f17058d523..bb1e4dc392 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_eucjp_win;
-extern const struct mbfl_identify_vtbl vtbl_identify_eucjpwin;
extern const struct mbfl_convert_vtbl vtbl_eucjpwin_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_eucjpwin;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c
index e9b08e08c1..87bf49cb22 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c
@@ -31,8 +31,6 @@
#include "mbfilter_euc_kr.h"
#include "unicode_table_uhc.h"
-static int mbfl_filt_ident_euckr(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_euckr[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -58,19 +56,13 @@ const mbfl_encoding mbfl_encoding_euc_kr = {
mbfl_no_encoding_euc_kr,
"EUC-KR",
"EUC-KR",
- (const char *(*)[])&mbfl_encoding_euc_kr_aliases,
+ mbfl_encoding_euc_kr_aliases,
mblen_table_euckr,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_euckr_wchar,
&vtbl_wchar_euckr
};
-const struct mbfl_identify_vtbl vtbl_identify_euckr = {
- mbfl_no_encoding_euc_kr,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_euckr
-};
-
const struct mbfl_convert_vtbl vtbl_euckr_wchar = {
mbfl_no_encoding_euc_kr,
mbfl_no_encoding_wchar,
@@ -223,31 +215,3 @@ mbfl_filt_conv_wchar_euckr(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_euckr(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* DBCS lead byte */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got lead byte */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.h
index 1534d2bedc..e0c13cf53a 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_euc_kr;
-extern const struct mbfl_identify_vtbl vtbl_identify_euckr;
extern const struct mbfl_convert_vtbl vtbl_euckr_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_euckr;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c
index c76eeb36bf..3803e2524a 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c
@@ -32,8 +32,6 @@
#include "unicode_table_cns11643.h"
-static int mbfl_filt_ident_euctw(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_euctw[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -60,19 +58,13 @@ const mbfl_encoding mbfl_encoding_euc_tw = {
mbfl_no_encoding_euc_tw,
"EUC-TW",
"EUC-TW",
- (const char *(*)[])&mbfl_encoding_euc_tw_aliases,
+ mbfl_encoding_euc_tw_aliases,
mblen_table_euctw,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_euctw_wchar,
&vtbl_wchar_euctw
};
-const struct mbfl_identify_vtbl vtbl_identify_euctw = {
- mbfl_no_encoding_euc_tw,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_euctw
-};
-
const struct mbfl_convert_vtbl vtbl_euctw_wchar = {
mbfl_no_encoding_euc_tw,
mbfl_no_encoding_wchar,
@@ -271,55 +263,3 @@ mbfl_filt_conv_wchar_euctw(int c, mbfl_convert_filter *filter)
}
return c;
}
-
-static int mbfl_filt_ident_euctw(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* DBCS lead byte */
- filter->status = 1;
- } else if (c == 0x8e) { /* DBCS lead byte */
- filter->status = 2;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got lead byte */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 2: /* got lead byte */
- if (c >= 0xa1 && c < 0xaf) { /* ok */
- filter->status = 3;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
- case 3: /* got lead byte */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 4;
- break;
-
- case 4: /* got lead byte */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.h
index ed1f091259..9c2ffa4802 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_euc_tw;
-extern const struct mbfl_identify_vtbl vtbl_identify_euctw;
extern const struct mbfl_convert_vtbl vtbl_euctw_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_euctw;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c
index b94d664f40..63be51e7af 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c
@@ -33,27 +33,19 @@
#include "unicode_table_cp936.h"
#include "unicode_table_gb18030.h"
-static int mbfl_filt_ident_gb18030(int c, mbfl_identify_filter *filter);
-
static const char *mbfl_encoding_gb18030_aliases[] = {"gb-18030", "gb-18030-2000", NULL};
const mbfl_encoding mbfl_encoding_gb18030 = {
mbfl_no_encoding_gb18030,
"GB18030",
"GB18030",
- (const char *(*)[])&mbfl_encoding_gb18030_aliases,
+ mbfl_encoding_gb18030_aliases,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_gb18030_wchar,
&vtbl_wchar_gb18030
};
-const struct mbfl_identify_vtbl vtbl_identify_gb18030 = {
- mbfl_no_encoding_gb18030,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_gb18030
-};
-
const struct mbfl_convert_vtbl vtbl_gb18030_wchar = {
mbfl_no_encoding_gb18030,
mbfl_no_encoding_wchar,
@@ -76,42 +68,37 @@ const struct mbfl_convert_vtbl vtbl_wchar_gb18030 = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-int
-mbfl_bisec_srch(int w, const unsigned short *tbl, int n)
+/* `tbl` contains inclusive ranges, each represented by a pair of unsigned shorts */
+int mbfl_bisec_srch(int w, const unsigned short *tbl, int n)
{
- int k, k1 = 0, k2 = n-1;
-
- while (k1 < k2) {
- k = (k1+k2) >> 1;
- if (w <= tbl[2*k+1]) {
- k2 = k;
- } else if (w >= tbl[2*k+2]) {
- k1 = k + 1;
+ int l = 0, r = n-1;
+ while (l <= r) {
+ int probe = (l + r) >> 1;
+ unsigned short lo = tbl[2 * probe], hi = tbl[(2 * probe) + 1];
+ if (w < lo) {
+ r = probe - 1;
+ } else if (w > hi) {
+ l = probe + 1;
} else {
- return -1;
+ return probe;
}
}
- return k1;
+ return -1;
}
-int
-mbfl_bisec_srch2(int w, const unsigned short tbl[], int n)
+/* `tbl` contains single values, not ranges */
+int mbfl_bisec_srch2(int w, const unsigned short tbl[], int n)
{
- int k, k1 = 0, k2 = n;
-
- if (w == tbl[0]) {
- return 0;
- }
-
- while (k2 - k1 > 1) {
- k = (k1 + k2) >> 1;
- if (w < tbl[k]) {
- k2 = k;
- } else if (w > tbl[k]) {
- k1 = k;
+ int l = 0, r = n-1;
+ while (l <= r) {
+ int probe = (l + r) >> 1;
+ unsigned short val = tbl[probe];
+ if (w < val) {
+ r = probe - 1;
+ } else if (w > val) {
+ l = probe + 1;
} else {
- return k;
+ return probe;
}
}
return -1;
@@ -414,55 +401,3 @@ mbfl_filt_conv_wchar_gb18030(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_gb18030(int c, mbfl_identify_filter *filter)
-{
- int c1;
-
- c1 = (filter->status >> 8) & 0xff;
- filter->status &= 0xff;
-
- if (filter->status == 0) {
- if (c <= 0x80 || c == 0xff) {
- filter->status = 0;
- } else {
- filter->status = 1;
- filter->status |= (c << 8);
- }
- } else if (filter->status == 1) { /* dbcs/qbcs 2nd byte */
- if (((c1 >= 0x81 && c1 <= 0x84) || (c1 >= 0x90 && c1 <= 0xe3)) && c >= 0x30 && c <= 0x39) { /* qbcs */
- filter->status = 2;
- } else if (((c1 >= 0xaa && c1 <= 0xaf) || (c1 >= 0xf8 && c1 <= 0xfe)) && (c >= 0xa1 && c <= 0xfe)) {
- filter->status = 0; /* UDA part 1,2 */
- } else if (c1 >= 0xa1 && c1 <= 0xa7 && c >= 0x40 && c < 0xa1 && c != 0x7f) {
- filter->status = 0; /* UDA part 3 */
- } else if ((c1 >= 0xa1 && c1 <= 0xa9 && c >= 0xa1 && c <= 0xfe) ||
- (c1 >= 0xb0 && c1 <= 0xf7 && c >= 0xa1 && c <= 0xfe) ||
- (c1 >= 0x81 && c1 <= 0xa0 && c >= 0x40 && c <= 0xfe && c != 0x7f) ||
- (c1 >= 0xaa && c1 <= 0xfe && c >= 0x40 && c <= 0xa0 && c != 0x7f) ||
- (c1 >= 0xa8 && c1 <= 0xa9 && c >= 0x40 && c <= 0xa0 && c != 0x7f)) {
- filter->status = 0; /* DBCS */
- } else {
- filter->flag = 1; /* bad */
- filter->status = 0;
- }
- } else if (filter->status == 2) { /* qbcs 3rd byte */
- if (c > 0x80 && c < 0xff) {
- filter->status = 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status = 0;
- }
- } else if (filter->status == 3) { /* qbcs 4th byte */
- if (c >= 0x30 && c < 0x40) {
- filter->status = 0;
- } else {
- filter->flag = 1; /* bad */
- filter->status = 0;
- }
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.h b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.h
index dc7d51b6e2..e7f0eae16b 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_gb18030;
-extern const struct mbfl_identify_vtbl vtbl_identify_gb18030;
extern const struct mbfl_convert_vtbl vtbl_gb18030_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_gb18030;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c b/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c
index 7176fd4717..95a0817103 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c
@@ -57,7 +57,7 @@ const mbfl_encoding mbfl_encoding_html_ent = {
mbfl_no_encoding_html_ent,
"HTML-ENTITIES",
"HTML-ENTITIES",
- (const char *(*)[])&mbfl_encoding_html_ent_aliases,
+ mbfl_encoding_html_ent_aliases,
NULL,
MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_html_wchar,
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_hz.c b/ext/mbstring/libmbfl/filters/mbfilter_hz.c
index ceac85816c..61766ab412 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_hz.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_hz.c
@@ -32,25 +32,17 @@
#include "unicode_table_cp936.h"
-static int mbfl_filt_ident_hz(int c, mbfl_identify_filter *filter);
-
const mbfl_encoding mbfl_encoding_hz = {
mbfl_no_encoding_hz,
"HZ",
"HZ-GB-2312",
NULL,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_hz_wchar,
&vtbl_wchar_hz
};
-const struct mbfl_identify_vtbl vtbl_identify_hz = {
- mbfl_no_encoding_hz,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_hz
-};
-
const struct mbfl_convert_vtbl vtbl_hz_wchar = {
mbfl_no_encoding_hz,
mbfl_no_encoding_wchar,
@@ -225,49 +217,3 @@ mbfl_filt_conv_any_hz_flush(mbfl_convert_filter *filter)
filter->status &= 0xff;
return 0;
}
-
-static int mbfl_filt_ident_hz(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: GB2312 */
- case 0:
- if (c == 0x7e) {
- filter->status += 2;
- } else if (filter->status == 0x10 && c > 0x20 && c < 0x7f) { /* DBCS first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x11: GB2312 second char */
- case 1:
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 2:
- if (c == 0x7d) { /* '}' */
- filter->status = 0;
- } else if (c == 0x7b) { /* '{' */
- filter->status = 0x10;
- } else if (c == 0x7e) { /* '~' */
- filter->status = 0;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_hz.h b/ext/mbstring/libmbfl/filters/mbfilter_hz.h
index e7e35cacc8..6b1dfb1564 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_hz.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_hz.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_hz;
-extern const struct mbfl_identify_vtbl vtbl_identify_hz;
extern const struct mbfl_convert_vtbl vtbl_hz_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_hz;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c
index 1e9757eae6..1127f8e629 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c
@@ -34,27 +34,19 @@
#include "unicode_table_jis.h"
#include "cp932_table.h"
-int mbfl_filt_ident_2022jpms(int c, mbfl_identify_filter *filter);
-
static const char *mbfl_encoding_2022jpms_aliases[] = {"ISO2022JPMS", NULL};
const mbfl_encoding mbfl_encoding_2022jpms = {
mbfl_no_encoding_2022jpms,
"ISO-2022-JP-MS",
"ISO-2022-JP",
- (const char *(*)[])&mbfl_encoding_2022jpms_aliases,
+ mbfl_encoding_2022jpms_aliases,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_2022jpms_wchar,
&vtbl_wchar_2022jpms
};
-const struct mbfl_identify_vtbl vtbl_identify_2022jpms = {
- mbfl_no_encoding_2022jpms,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_2022jpms
-};
-
const struct mbfl_convert_vtbl vtbl_2022jpms_wchar = {
mbfl_no_encoding_2022jpms,
mbfl_no_encoding_wchar,
@@ -310,16 +302,7 @@ mbfl_filt_conv_wchar_2022jpms(int c, mbfl_convert_filter *filter)
s1 = (c1 << 8) | c2;
}
if (s1 <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_WINCP932) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s2 = 1;
- } else if (c1 == MBFL_WCSPLANE_JIS0208) {
- s1 = c & MBFL_WCSPLANE_MASK;
- } else if (c1 == MBFL_WCSPLANE_JIS0212) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s1 |= 0x8080;
- } else if (c == 0xa5) { /* YEN SIGN */
+ if (c == 0xa5) { /* YEN SIGN */
s1 = 0x216f; /* FULLWIDTH YEN SIGN */
} else if (c == 0x203e) { /* OVER LINE */
s1 = 0x2131; /* FULLWIDTH MACRON */
@@ -429,97 +412,3 @@ mbfl_filt_conv_any_2022jpms_flush(mbfl_convert_filter *filter)
return 0;
}
-
-int mbfl_filt_ident_2022jpms(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x20: X 0201 kana */
-/* case 0x80: X 0208 */
-/* case 0xa0: X UDC */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if ((filter->status == 0x80 || filter->status == 0xa0) && c > 0x20 && c < 0x80) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
-/* case 0xa1: UDC second char */
- case 1:
- filter->status &= ~0xf;
- if (c == 0x1b) {
- goto retry;
- } else if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x28) { /* '(' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ ( */
- case 4:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x3f) { /* '?' */
- filter->status = 0xa0;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0;
- } else if (c == 0x49) { /* 'I' */
- filter->status = 0x20;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.h b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.h
index 7c40b19246..fdc85183d7 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_2022jpms;
-extern const struct mbfl_identify_vtbl vtbl_identify_2022jpms;
extern const struct mbfl_convert_vtbl vtbl_2022jpms_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_2022jpms;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c
index 8df1d6f9b5..a74b599ba6 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c
@@ -31,25 +31,17 @@
#include "mbfilter_iso2022_kr.h"
#include "unicode_table_uhc.h"
-static int mbfl_filt_ident_2022kr(int c, mbfl_identify_filter *filter);
-
const mbfl_encoding mbfl_encoding_2022kr = {
mbfl_no_encoding_2022kr,
"ISO-2022-KR",
"ISO-2022-KR",
NULL,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_2022kr_wchar,
&vtbl_wchar_2022kr
};
-const struct mbfl_identify_vtbl vtbl_identify_2022kr = {
- mbfl_no_encoding_2022kr,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_2022kr
-};
-
const struct mbfl_convert_vtbl vtbl_wchar_2022kr = {
mbfl_no_encoding_wchar,
mbfl_no_encoding_2022kr,
@@ -282,73 +274,3 @@ mbfl_filt_conv_any_2022kr_flush(mbfl_convert_filter *filter)
return 0;
}
-
-static int mbfl_filt_ident_2022kr(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: KSC5601 mode */
-/* case 0x20: KSC5601 DBCS */
-/* case 0x40: KSC5601 SBCS */
- case 0:
- if (!(filter->status & 0x10)) {
- if (c == 0x1b)
- filter->status += 2;
- } else if (filter->status == 0x20 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x21: KSC5601 second char */
- case 1:
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x29) { /* ')' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $) */
- case 5:
- if (c == 0x43) { /* 'C' */
- filter->status = 0x10;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.h b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.h
index 7277c5f11c..a00da5bbac 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_2022kr;
-extern const struct mbfl_identify_vtbl vtbl_identify_2022kr;
extern const struct mbfl_convert_vtbl vtbl_wchar_2022kr;
extern const struct mbfl_convert_vtbl vtbl_2022kr_wchar;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c
index b381f09bea..c54941f23d 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c
@@ -34,7 +34,6 @@
#include "unicode_table_jis.h"
extern int mbfl_filt_conv_any_jis_flush(mbfl_convert_filter *filter);
-static int mbfl_filt_ident_2022jp_2004(int c, mbfl_identify_filter *filter);
const mbfl_encoding mbfl_encoding_2022jp_2004 = {
mbfl_no_encoding_2022jp_2004,
@@ -42,24 +41,18 @@ const mbfl_encoding mbfl_encoding_2022jp_2004 = {
"ISO-2022-JP-2004",
NULL,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_2022jp_2004_wchar,
&vtbl_wchar_2022jp_2004
};
-const struct mbfl_identify_vtbl vtbl_identify_2022jp_2004 = {
- mbfl_no_encoding_2022jp_2004,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_2022jp_2004
-};
-
const struct mbfl_convert_vtbl vtbl_2022jp_2004_wchar = {
mbfl_no_encoding_2022jp_2004,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_jis2004_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_jis2004_wchar_flush,
NULL,
};
@@ -69,96 +62,6 @@ const struct mbfl_convert_vtbl vtbl_wchar_2022jp_2004 = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_wchar_jis2004,
- mbfl_filt_conv_jis2004_flush,
+ mbfl_filt_conv_wchar_jis2004_flush,
NULL,
};
-
-static int mbfl_filt_ident_2022jp_2004(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x80: X 0212 */
-/* case 0x90: X 0213 plane 1 */
-/* case 0xa0: X 0213 plane 2 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
- case 1:
- if (c == 0x1b) {
- filter->status++;
- } else {
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x42) { /* 'B' */
- filter->status = 0x80;
- } else if (c == 0x28) { /* '(' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ ( */
- case 4:
- if (c == 0x51) { /* JIS X 0213 plane 1 */
- filter->status = 0x90;
- } else if (c == 0x50) { /* JIS X 0213 plane 2 */
- filter->status = 0xa0;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.h b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.h
index 929559b87f..58b2dd31d8 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_2022jp_2004;
-extern const struct mbfl_identify_vtbl vtbl_identify_2022jp_2004;
extern const struct mbfl_convert_vtbl vtbl_2022jp_2004_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_2022jp_2004;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c
index 32ea47712e..4036d5949a 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c
@@ -36,7 +36,6 @@
#include "cp932_table.h"
extern int mbfl_filt_conv_any_jis_flush(mbfl_convert_filter *filter);
-extern int mbfl_filt_ident_2022jpms(int c, mbfl_identify_filter *filter);
static const char *mbfl_encoding_2022jp_kddi_aliases[] = {"ISO-2022-JP-KDDI", NULL};
@@ -44,19 +43,13 @@ const mbfl_encoding mbfl_encoding_2022jp_kddi = {
mbfl_no_encoding_2022jp_kddi,
"ISO-2022-JP-MOBILE#KDDI",
"ISO-2022-JP",
- (const char *(*)[])&mbfl_encoding_2022jp_kddi_aliases,
+ mbfl_encoding_2022jp_kddi_aliases,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_2022jp_kddi_wchar,
&vtbl_wchar_2022jp_kddi
};
-const struct mbfl_identify_vtbl vtbl_identify_2022jp_kddi = {
- mbfl_no_encoding_2022jp_kddi,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_2022jpms
-};
-
const struct mbfl_convert_vtbl vtbl_2022jp_kddi_wchar = {
mbfl_no_encoding_2022jp_kddi,
mbfl_no_encoding_wchar,
@@ -79,13 +72,6 @@ const struct mbfl_convert_vtbl vtbl_wchar_2022jp_kddi = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-#define sjistoidx(c1, c2) \
- (((c1) > 0x9f) \
- ? (((c1) - 0xc1) * 188 + (c2) - (((c2) > 0x7e) ? 0x41 : 0x40)) \
- : (((c1) - 0x81) * 188 + (c2) - (((c2) > 0x7e) ? 0x41 : 0x40)))
-#define idxtojis1(c) (((c) / 94) + 0x21)
-#define idxtojis2(c) (((c) % 94) + 0x21)
-
#define SJIS_ENCODE(c1,c2,s1,s2) \
do { \
s1 = c1; \
@@ -337,16 +323,7 @@ mbfl_filt_conv_wchar_2022jp_mobile(int c, mbfl_convert_filter *filter)
s1 = (c1 << 8) | c2;
}
if (s1 <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_WINCP932) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s2 = 1;
- } else if (c1 == MBFL_WCSPLANE_JIS0208) {
- s1 = c & MBFL_WCSPLANE_MASK;
- } else if (c1 == MBFL_WCSPLANE_JIS0212) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s1 |= 0x8080;
- } else if (c == 0xa5) { /* YEN SIGN */
+ if (c == 0xa5) { /* YEN SIGN */
s1 = 0x216f; /* FULLWIDTH YEN SIGN */
} else if (c == 0x203e) { /* OVER LINE */
s1 = 0x2131; /* FULLWIDTH MACRON */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.h b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.h
index a375e8df0e..a53ec2c36f 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_2022jp_kddi;
-extern const struct mbfl_identify_vtbl vtbl_identify_2022jp_kddi;
extern const struct mbfl_convert_vtbl vtbl_2022jp_kddi_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_2022jp_kddi;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c
deleted file mode 100644
index 1549ba81bf..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_1.h"
-
-static const char *mbfl_encoding_8859_1_aliases[] = {"ISO8859-1", "latin1", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_1 = {
- mbfl_no_encoding_8859_1,
- "ISO-8859-1",
- "ISO-8859-1",
- (const char *(*)[])&mbfl_encoding_8859_1_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_1_wchar,
- &vtbl_wchar_8859_1
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_1 = {
- mbfl_no_encoding_8859_1,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_1_wchar = {
- mbfl_no_encoding_8859_1,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_1_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_1 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_1,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_1,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-1 => wchar
- */
-int mbfl_filt_conv_8859_1_wchar(int c, mbfl_convert_filter *filter)
-{
- return (*filter->output_function)(c, filter->data);
-}
-
-/*
- * wchar => ISO-8859-1
- */
-int mbfl_filt_conv_wchar_8859_1(int c, mbfl_convert_filter *filter)
-{
- if (c >= 0 && c < 0x100) {
- CK((*filter->output_function)(c, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.h
deleted file mode 100644
index b593f10f54..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.h
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_1_H
-#define MBFL_MBFILTER_ISO8859_1_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_1;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_1;
-extern const struct mbfl_convert_vtbl vtbl_8859_1_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_1;
-
-int mbfl_filt_conv_8859_1_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_1(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_1_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c
deleted file mode 100644
index 12cd960a88..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_10.h"
-#include "unicode_table_iso8859_10.h"
-
-static const char *mbfl_encoding_8859_10_aliases[] = {"ISO8859-10", "latin6", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_10 = {
- mbfl_no_encoding_8859_10,
- "ISO-8859-10",
- "ISO-8859-10",
- (const char *(*)[])&mbfl_encoding_8859_10_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_10_wchar,
- &vtbl_wchar_8859_10
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_10 = {
- mbfl_no_encoding_8859_10,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_10_wchar = {
- mbfl_no_encoding_8859_10,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_10_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_10 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_10,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_10,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-10 => wchar
- */
-int mbfl_filt_conv_8859_10_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_10_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_10;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-10
- */
-int mbfl_filt_conv_wchar_8859_10(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_10_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_10) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.h
deleted file mode 100644
index f9133404de..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_10_H
-#define MBFL_MBFILTER_ISO8859_10_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_10;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_10;
-extern const struct mbfl_convert_vtbl vtbl_8859_10_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_10;
-
-int mbfl_filt_conv_8859_10_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_10(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_10_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c
deleted file mode 100644
index 25526263b8..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_13.h"
-#include "unicode_table_iso8859_13.h"
-
-static const char *mbfl_encoding_8859_13_aliases[] = {"ISO8859-13", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_13 = {
- mbfl_no_encoding_8859_13,
- "ISO-8859-13",
- "ISO-8859-13",
- (const char *(*)[])&mbfl_encoding_8859_13_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_13_wchar,
- &vtbl_wchar_8859_13
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_13 = {
- mbfl_no_encoding_8859_13,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_13_wchar = {
- mbfl_no_encoding_8859_13,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_13_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_13 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_13,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_13,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-13 => wchar
- */
-int mbfl_filt_conv_8859_13_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_13_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_13;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-13
- */
-int mbfl_filt_conv_wchar_8859_13(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_13_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_13) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.h
deleted file mode 100644
index dcd6075594..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_13_H
-#define MBFL_MBFILTER_ISO8859_13_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_13;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_13;
-extern const struct mbfl_convert_vtbl vtbl_8859_13_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_13;
-
-int mbfl_filt_conv_8859_13_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_13(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_13_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c
deleted file mode 100644
index 06a2e4cd98..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_14.h"
-#include "unicode_table_iso8859_14.h"
-
-static const char *mbfl_encoding_8859_14_aliases[] = {"ISO8859-14", "latin8", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_14 = {
- mbfl_no_encoding_8859_14,
- "ISO-8859-14",
- "ISO-8859-14",
- (const char *(*)[])&mbfl_encoding_8859_14_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_14_wchar,
- &vtbl_wchar_8859_14
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_14 = {
- mbfl_no_encoding_8859_14,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_14_wchar = {
- mbfl_no_encoding_8859_14,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_14_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_14 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_14,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_14,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-14 => wchar
- */
-int mbfl_filt_conv_8859_14_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_14_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_14;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-14
- */
-int mbfl_filt_conv_wchar_8859_14(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_14_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_14) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.h
deleted file mode 100644
index 90531e668a..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * COPYRIGHT NOTICE
- *
- * This file is a portion of "streamable kanji code filter and converter"
- * library, which is distributed under GNU Lesser General Public License
- * version 2.1.
- *
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_14_H
-#define MBFL_MBFILTER_ISO8859_14_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_14;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_14;
-extern const struct mbfl_convert_vtbl vtbl_8859_14_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_14;
-
-int mbfl_filt_conv_8859_14_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_14(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_14_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c
deleted file mode 100644
index 82b40796b8..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_15.h"
-#include "unicode_table_iso8859_15.h"
-
-static const char *mbfl_encoding_8859_15_aliases[] = {"ISO8859-15", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_15 = {
- mbfl_no_encoding_8859_15,
- "ISO-8859-15",
- "ISO-8859-15",
- (const char *(*)[])&mbfl_encoding_8859_15_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_15_wchar,
- &vtbl_wchar_8859_15
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_15 = {
- mbfl_no_encoding_8859_15,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_15_wchar = {
- mbfl_no_encoding_8859_15,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_15_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_15 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_15,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_15,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-15 => wchar
- */
-int mbfl_filt_conv_8859_15_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_15_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_15;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-15
- */
-int mbfl_filt_conv_wchar_8859_15(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_15_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_15) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.h
deleted file mode 100644
index a8fb339b0d..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * COPYRIGHT NOTICE
- *
- * This file is a portion of "streamable kanji code filter and converter"
- * library, which is distributed under GNU Lesser General Public License
- * version 2.1.
- *
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_15_H
-#define MBFL_MBFILTER_ISO8859_15_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_15;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_15;
-extern const struct mbfl_convert_vtbl vtbl_8859_15_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_15;
-
-int mbfl_filt_conv_8859_15_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_15(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_15_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c
deleted file mode 100644
index 80f1461364..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_16.h"
-#include "unicode_table_iso8859_16.h"
-
-static const char *mbfl_encoding_8859_16_aliases[] = {"ISO8859-16", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_16 = {
- mbfl_no_encoding_8859_16,
- "ISO-8859-16",
- "ISO-8859-16",
- (const char *(*)[])&mbfl_encoding_8859_16_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_16_wchar,
- &vtbl_wchar_8859_16
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_16 = {
- mbfl_no_encoding_8859_16,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_16_wchar = {
- mbfl_no_encoding_8859_16,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_16_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_16 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_16,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_16,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-16 => wchar
- */
-int mbfl_filt_conv_8859_16_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_16_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_16;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-16
- */
-int mbfl_filt_conv_wchar_8859_16(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_16_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_16) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.h
deleted file mode 100644
index a1a53d7909..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * COPYRIGHT NOTICE
- *
- * This file is a portion of "streamable kanji code filter and converter"
- * library, which is distributed under GNU Lesser General Public License
- * version 2.1.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_16_H
-#define MBFL_MBFILTER_ISO8859_16_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_16;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_16;
-extern const struct mbfl_convert_vtbl vtbl_8859_16_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_16;
-
-int mbfl_filt_conv_8859_16_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_16(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_16_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c
deleted file mode 100644
index 86044e15d3..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_2.h"
-#include "unicode_table_iso8859_2.h"
-
-static const char *mbfl_encoding_8859_2_aliases[] = {"ISO8859-2", "latin2", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_2 = {
- mbfl_no_encoding_8859_2,
- "ISO-8859-2",
- "ISO-8859-2",
- (const char *(*)[])&mbfl_encoding_8859_2_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_2_wchar,
- &vtbl_wchar_8859_2
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_2 = {
- mbfl_no_encoding_8859_2,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_2_wchar = {
- mbfl_no_encoding_8859_2,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_2_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_2 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_2,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_2,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-2 => wchar
- */
-int mbfl_filt_conv_8859_2_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_2_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_2;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-2
- */
-int mbfl_filt_conv_wchar_8859_2(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_2_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_2) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.h
deleted file mode 100644
index f344168a18..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_2_H
-#define MBFL_MBFILTER_ISO8859_2_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_2;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_2;
-extern const struct mbfl_convert_vtbl vtbl_8859_2_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_2;
-
-int mbfl_filt_conv_8859_2_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_2(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_2_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c
deleted file mode 100644
index 64eb9b5cf9..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_3.h"
-#include "unicode_table_iso8859_3.h"
-
-static const char *mbfl_encoding_8859_3_aliases[] = {"ISO8859-3", "latin3", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_3 = {
- mbfl_no_encoding_8859_3,
- "ISO-8859-3",
- "ISO-8859-3",
- (const char *(*)[])&mbfl_encoding_8859_3_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_3_wchar,
- &vtbl_wchar_8859_3
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_3 = {
- mbfl_no_encoding_8859_3,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_3_wchar = {
- mbfl_no_encoding_8859_3,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_3_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_3 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_3,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_3,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-3 => wchar
- */
-int mbfl_filt_conv_8859_3_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_3_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_3;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-3
- */
-int mbfl_filt_conv_wchar_8859_3(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_3_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_3) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.h
deleted file mode 100644
index 746085373a..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_3_H
-#define MBFL_MBFILTER_ISO8859_3_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_3;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_3;
-extern const struct mbfl_convert_vtbl vtbl_8859_3_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_3;
-
-int mbfl_filt_conv_8859_3_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_3(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_3_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c
deleted file mode 100644
index 12a9f7cb10..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_4.h"
-#include "unicode_table_iso8859_4.h"
-
-static const char *mbfl_encoding_8859_4_aliases[] = {"ISO8859-4", "latin4", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_4 = {
- mbfl_no_encoding_8859_4,
- "ISO-8859-4",
- "ISO-8859-4",
- (const char *(*)[])&mbfl_encoding_8859_4_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_4_wchar,
- &vtbl_wchar_8859_4
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_4 = {
- mbfl_no_encoding_8859_4,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_4_wchar = {
- mbfl_no_encoding_8859_4,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_4_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_4 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_4,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_4,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-4 => wchar
- */
-int mbfl_filt_conv_8859_4_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_4_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_4;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-4
- */
-int mbfl_filt_conv_wchar_8859_4(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_4_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_4) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.h
deleted file mode 100644
index fe4dcdc696..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_4_H
-#define MBFL_MBFILTER_ISO8859_4_H
-
-extern const mbfl_encoding mbfl_encoding_8859_4;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_4;
-extern const struct mbfl_convert_vtbl vtbl_8859_4_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_4;
-
-int mbfl_filt_conv_8859_4_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_4(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_4_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c
deleted file mode 100644
index 70496d07e7..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_5.h"
-#include "unicode_table_iso8859_5.h"
-
-static const char *mbfl_encoding_8859_5_aliases[] = {"ISO8859-5", "cyrillic", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_5 = {
- mbfl_no_encoding_8859_5,
- "ISO-8859-5",
- "ISO-8859-5",
- (const char *(*)[])&mbfl_encoding_8859_5_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_5_wchar,
- &vtbl_wchar_8859_5
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_5 = {
- mbfl_no_encoding_8859_5,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_5_wchar = {
- mbfl_no_encoding_8859_5,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_5_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_5 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_5,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_5,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-5 => wchar
- */
-int mbfl_filt_conv_8859_5_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_5_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_5;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-5
- */
-int mbfl_filt_conv_wchar_8859_5(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_5_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_5) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.h
deleted file mode 100644
index 8b09844141..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_5_H
-#define MBFL_MBFILTER_ISO8859_5_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_5;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_5;
-extern const struct mbfl_convert_vtbl vtbl_8859_5_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_5;
-
-int mbfl_filt_conv_8859_5_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_5(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_5_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c
deleted file mode 100644
index 59d981e9c2..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_6.h"
-#include "unicode_table_iso8859_6.h"
-
-static const char *mbfl_encoding_8859_6_aliases[] = {"ISO8859-6", "arabic", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_6 = {
- mbfl_no_encoding_8859_6,
- "ISO-8859-6",
- "ISO-8859-6",
- (const char *(*)[])&mbfl_encoding_8859_6_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_6_wchar,
- &vtbl_wchar_8859_6
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_6 = {
- mbfl_no_encoding_8859_6,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_6_wchar = {
- mbfl_no_encoding_8859_6,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_6_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_6 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_6,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_6,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-6 => wchar
- */
-int mbfl_filt_conv_8859_6_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_6_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_6;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-6
- */
-int mbfl_filt_conv_wchar_8859_6(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_6_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_6) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.h
deleted file mode 100644
index c7e16c7e0b..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_6_H
-#define MBFL_MBFILTER_ISO8859_6_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_6;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_6;
-extern const struct mbfl_convert_vtbl vtbl_8859_6_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_6;
-
-int mbfl_filt_conv_8859_6_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_6(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_6_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c
deleted file mode 100644
index 73ead533ea..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_7.h"
-#include "unicode_table_iso8859_7.h"
-
-static const char *mbfl_encoding_8859_7_aliases[] = {"ISO8859-7", "greek", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_7 = {
- mbfl_no_encoding_8859_7,
- "ISO-8859-7",
- "ISO-8859-7",
- (const char *(*)[])&mbfl_encoding_8859_7_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_7_wchar,
- &vtbl_wchar_8859_7
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_7 = {
- mbfl_no_encoding_8859_7,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_7_wchar = {
- mbfl_no_encoding_8859_7,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_7_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_7 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_7,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_7,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-7 => wchar
- */
-int mbfl_filt_conv_8859_7_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_7_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_7;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-7
- */
-int mbfl_filt_conv_wchar_8859_7(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_7_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_7) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.h
deleted file mode 100644
index 8421edb929..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_7_H
-#define MBFL_MBFILTER_ISO8859_7_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_7;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_7;
-extern const struct mbfl_convert_vtbl vtbl_8859_7_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_7;
-
-int mbfl_filt_conv_8859_7_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_7(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_7_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c
deleted file mode 100644
index 05ca13f330..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_8.h"
-#include "unicode_table_iso8859_8.h"
-
-static const char *mbfl_encoding_8859_8_aliases[] = {"ISO8859-8", "hebrew", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_8 = {
- mbfl_no_encoding_8859_8,
- "ISO-8859-8",
- "ISO-8859-8",
- (const char *(*)[])&mbfl_encoding_8859_8_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_8_wchar,
- &vtbl_wchar_8859_8
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_8 = {
- mbfl_no_encoding_8859_8,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_8_wchar = {
- mbfl_no_encoding_8859_8,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_8_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_8 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_8,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_8,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-8 => wchar
- */
-int mbfl_filt_conv_8859_8_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_8_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_8;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-8
- */
-int mbfl_filt_conv_wchar_8859_8(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_8_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_8) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.h
deleted file mode 100644
index ee679814f1..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_8_H
-#define MBFL_MBFILTER_ISO8859_8_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_8;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_8;
-extern const struct mbfl_convert_vtbl vtbl_8859_8_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_8;
-
-int mbfl_filt_conv_8859_8_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_8(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_8_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c
deleted file mode 100644
index 074f90bef2..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_9.h"
-#include "unicode_table_iso8859_9.h"
-
-static const char *mbfl_encoding_8859_9_aliases[] = {"ISO8859-9", "latin5", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_9 = {
- mbfl_no_encoding_8859_9,
- "ISO-8859-9",
- "ISO-8859-9",
- (const char *(*)[])&mbfl_encoding_8859_9_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_9_wchar,
- &vtbl_wchar_8859_9
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_9 = {
- mbfl_no_encoding_8859_9,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_9_wchar = {
- mbfl_no_encoding_8859_9,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_9_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_9 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_9,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_9,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-9 => wchar
- */
-int mbfl_filt_conv_8859_9_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_9_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_9;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-9
- */
-int mbfl_filt_conv_wchar_8859_9(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_9_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_9) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.h
deleted file mode 100644
index 5a61237113..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_9_H
-#define MBFL_MBFILTER_ISO8859_9_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_9;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_9;
-extern const struct mbfl_convert_vtbl vtbl_8859_9_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_9;
-
-int mbfl_filt_conv_8859_9_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_9(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_9_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_jis.c b/ext/mbstring/libmbfl/filters/mbfilter_jis.c
index b08eec38b0..b62956e617 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_jis.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_jis.c
@@ -33,8 +33,7 @@
#include "unicode_table_cp932_ext.h"
#include "unicode_table_jis.h"
-static int mbfl_filt_ident_jis(int c, mbfl_identify_filter *filter);
-static int mbfl_filt_ident_2022jp(int c, mbfl_identify_filter *filter);
+static int mbfl_filt_conv_jis_wchar_flush(mbfl_convert_filter *filter);
const mbfl_encoding mbfl_encoding_jis = {
mbfl_no_encoding_jis,
@@ -42,7 +41,7 @@ const mbfl_encoding mbfl_encoding_jis = {
"ISO-2022-JP",
NULL,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_jis_wchar,
&vtbl_wchar_jis
};
@@ -53,30 +52,18 @@ const mbfl_encoding mbfl_encoding_2022jp = {
"ISO-2022-JP",
NULL,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_2022jp_wchar,
&vtbl_wchar_2022jp
};
-const struct mbfl_identify_vtbl vtbl_identify_jis = {
- mbfl_no_encoding_jis,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_jis
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_2022jp = {
- mbfl_no_encoding_2022jp,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_2022jp
-};
-
const struct mbfl_convert_vtbl vtbl_jis_wchar = {
mbfl_no_encoding_jis,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_jis_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_jis_wchar_flush,
NULL,
};
@@ -96,7 +83,7 @@ const struct mbfl_convert_vtbl vtbl_2022jp_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_jis_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_jis_wchar_flush,
NULL,
};
@@ -185,10 +172,6 @@ retry:
}
}
CK((*filter->output_function)(w, filter->data));
- } else if (c == 0x1b) {
- filter->status += 2;
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
w = (c1 << 8) | c;
w &= MBFL_WCSGROUP_MASK;
@@ -210,7 +193,7 @@ retry:
filter->status += 3;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
goto retry;
}
break;
@@ -228,7 +211,7 @@ retry:
filter->status++;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
CK((*filter->output_function)(0x24, filter->data));
goto retry;
}
@@ -247,7 +230,7 @@ retry:
filter->status = 0x90;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
CK((*filter->output_function)(0x24, filter->data));
CK((*filter->output_function)(0x28, filter->data));
goto retry;
@@ -269,7 +252,7 @@ retry:
filter->status = 0x20;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
CK((*filter->output_function)(0x28, filter->data));
goto retry;
}
@@ -283,17 +266,27 @@ retry:
return c;
}
+static int mbfl_filt_conv_jis_wchar_flush(mbfl_convert_filter *filter)
+{
+ if ((filter->status & 0xF) == 1) {
+ /* 2-byte (JIS X 0208 or 0212) character was truncated */
+ CK((*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data));
+ }
+ return 0;
+}
+
/*
* wchar => JIS
*/
int
mbfl_filt_conv_wchar_jis(int c, mbfl_convert_filter *filter)
{
- int c1, s;
+ int s = 0;
- s = 0;
if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
s = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
+ } else if (c == 0x203E) { /* OVERLINE */
+ s = 0x1007E; /* Convert to JISX 0201 OVERLINE */
} else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
s = ucs_a2_jis_table[c - ucs_a2_jis_table_min];
} else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) {
@@ -302,20 +295,10 @@ mbfl_filt_conv_wchar_jis(int c, mbfl_convert_filter *filter)
s = ucs_r_jis_table[c - ucs_r_jis_table_min];
}
if (s <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_JIS0208) {
- s = c & MBFL_WCSPLANE_MASK;
- } else if (c1 == MBFL_WCSPLANE_JIS0212) {
- s = c & MBFL_WCSPLANE_MASK;
- s |= 0x8080;
- } else if (c == 0xa5) { /* YEN SIGN */
+ if (c == 0xa5) { /* YEN SIGN */
s = 0x1005c;
- } else if (c == 0x203e) { /* OVER LINE */
- s = 0x1007e;
} else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
s = 0x2140;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
- s = 0x2141;
} else if (c == 0x2225) { /* PARALLEL TO */
s = 0x2142;
} else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
@@ -411,8 +394,6 @@ mbfl_filt_conv_wchar_2022jp(int c, mbfl_convert_filter *filter)
s = 0x1007e;
} else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
s = 0x2140;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
- s = 0x2141;
} else if (c == 0x2225) { /* PARALLEL TO */
s = 0x2142;
} else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
@@ -483,177 +464,3 @@ mbfl_filt_conv_any_jis_flush(mbfl_convert_filter *filter)
return 0;
}
-
-static int mbfl_filt_ident_jis(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x20: X 0201 kana */
-/* case 0x80: X 0208 */
-/* case 0x90: X 0212 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (c == 0x0e) { /* "kana in" */
- filter->status = 0x20;
- } else if (c == 0x0f) { /* "kana out" */
- filter->status = 0;
- } else if ((filter->status == 0x80 || filter->status == 0x90) && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
-/* case 0x91: X 0212 second char */
- case 1:
- filter->status &= ~0xf;
- if (c == 0x1b) {
- goto retry;
- } else if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x28) { /* '(' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ ( */
- case 4:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x44) { /* 'D' */
- filter->status = 0x90;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42 || c == 0x48) { /* 'B' or 'H' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else if (c == 0x49) { /* 'I' */
- filter->status = 0x20;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_2022jp(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x80: X 0208 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
- case 1:
- if (c == 0x1b) {
- filter->status++;
- } else {
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_jis.h b/ext/mbstring/libmbfl/filters/mbfilter_jis.h
index e7a164167e..55787c9acb 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_jis.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_jis.h
@@ -34,8 +34,6 @@
extern const mbfl_encoding mbfl_encoding_jis;
extern const mbfl_encoding mbfl_encoding_2022jp;
-extern const struct mbfl_identify_vtbl vtbl_identify_2022jp;
-extern const struct mbfl_identify_vtbl vtbl_identify_jis;
extern const struct mbfl_convert_vtbl vtbl_jis_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_jis;
extern const struct mbfl_convert_vtbl vtbl_2022jp_wchar;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_koi8r.c b/ext/mbstring/libmbfl/filters/mbfilter_koi8r.c
deleted file mode 100644
index 7790be65bb..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_koi8r.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_koi8r.h"
-#include "unicode_table_koi8r.h"
-
-static int mbfl_filt_ident_koi8r(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_koi8r_aliases[] = {"KOI8-R", "KOI8R", NULL};
-
-const mbfl_encoding mbfl_encoding_koi8r = {
- mbfl_no_encoding_koi8r,
- "KOI8-R",
- "KOI8-R",
- (const char *(*)[])&mbfl_encoding_koi8r_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_koi8r_wchar,
- &vtbl_wchar_koi8r
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_koi8r = {
- mbfl_no_encoding_koi8r,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_koi8r
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_koi8r = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_koi8r,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_koi8r,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_koi8r_wchar = {
- mbfl_no_encoding_koi8r,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_koi8r_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * koi8r => wchar
- */
-int
-mbfl_filt_conv_koi8r_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < koi8r_ucs_table_min) {
- s = c;
- } else if (c >= koi8r_ucs_table_min && c < 0x100) {
- s = koi8r_ucs_table[c - koi8r_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_KOI8R;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => koi8r
- */
-int
-mbfl_filt_conv_wchar_koi8r(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = koi8r_ucs_table_len-1;
- while (n >= 0) {
- if (c == koi8r_ucs_table[n]) {
- s = koi8r_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8R) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_koi8r(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_koi8r.h b/ext/mbstring/libmbfl/filters/mbfilter_koi8r.h
deleted file mode 100644
index 6073d140ae..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_koi8r.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.h
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_KOI8R_H
-#define MBFL_MBFILTER_KOI8R_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_koi8r;
-extern const struct mbfl_identify_vtbl vtbl_identify_koi8r;
-extern const struct mbfl_convert_vtbl vtbl_wchar_koi8r;
-extern const struct mbfl_convert_vtbl vtbl_koi8r_wchar;
-
-int mbfl_filt_conv_koi8r_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_koi8r(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_KOI8R_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_koi8u.c b/ext/mbstring/libmbfl/filters/mbfilter_koi8u.c
deleted file mode 100644
index a62a1c596b..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_koi8u.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Maksym Veremeyenko <verem@m1.tv>
- *
- * Based on mbfilter_koi8r.c code
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_koi8u.h"
-#include "unicode_table_koi8u.h"
-
-static int mbfl_filt_ident_koi8u(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_koi8u_aliases[] = {"KOI8-U", "KOI8U", NULL};
-
-const mbfl_encoding mbfl_encoding_koi8u = {
- mbfl_no_encoding_koi8u,
- "KOI8-U",
- "KOI8-U",
- (const char *(*)[])&mbfl_encoding_koi8u_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_koi8u_wchar,
- &vtbl_wchar_koi8u
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_koi8u = {
- mbfl_no_encoding_koi8u,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_koi8u
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_koi8u = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_koi8u,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_koi8u,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_koi8u_wchar = {
- mbfl_no_encoding_koi8u,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_koi8u_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * koi8u => wchar
- */
-int
-mbfl_filt_conv_koi8u_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < koi8u_ucs_table_min) {
- s = c;
- } else if (c >= koi8u_ucs_table_min && c < 0x100) {
- s = koi8u_ucs_table[c - koi8u_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_KOI8U;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => koi8u
- */
-int
-mbfl_filt_conv_wchar_koi8u(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = koi8u_ucs_table_len-1;
- while (n >= 0) {
- if (c == koi8u_ucs_table[n]) {
- s = koi8u_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8U) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_koi8u(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_koi8u.h b/ext/mbstring/libmbfl/filters/mbfilter_koi8u.h
deleted file mode 100644
index 16b95c1fc4..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_koi8u.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Maksym Veremeyenko <verem@m1.tv>
- *
- * Based on mbfilter_koi8r.h code
- *
- */
-
-#ifndef MBFL_MBFILTER_KOI8U_H
-#define MBFL_MBFILTER_KOI8U_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_koi8u;
-extern const struct mbfl_identify_vtbl vtbl_identify_koi8u;
-extern const struct mbfl_convert_vtbl vtbl_wchar_koi8u;
-extern const struct mbfl_convert_vtbl vtbl_koi8u_wchar;
-
-int mbfl_filt_conv_koi8u_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_koi8u(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_KOI8U_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_qprint.c b/ext/mbstring/libmbfl/filters/mbfilter_qprint.c
index d42cdca883..8f806def25 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_qprint.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_qprint.c
@@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_qprint = {
mbfl_no_encoding_qprint,
"Quoted-Printable",
"Quoted-Printable",
- (const char *(*)[])&mbfl_encoding_qprint_aliases,
+ mbfl_encoding_qprint_aliases,
NULL,
MBFL_ENCTYPE_GL_UNSAFE,
NULL,
@@ -110,8 +110,7 @@ int mbfl_filt_conv_qprintenc(int c, mbfl_convert_filter *filter)
}
if (s <= 0 || s >= 0x80 || s == 0x3d /* not ASCII or '=' */
- || ((filter->status & MBFL_QPRINT_STS_MIME_HEADER) != 0 &&
- (mbfl_charprop_table[s] & MBFL_CHP_MMHQENC) != 0)) {
+ || ((filter->status & MBFL_QPRINT_STS_MIME_HEADER) && mime_char_needs_qencode[s])) {
/* hex-octet */
CK((*filter->output_function)(0x3d, filter->data)); /* '=' */
n = (s >> 4) & 0xf;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c
new file mode 100644
index 0000000000..7e7bdfbfaa
--- /dev/null
+++ b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c
@@ -0,0 +1,581 @@
+/*
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+*/
+
+#include "mbfilter_singlebyte.h"
+
+#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
+
+/* Helper for single-byte encodings which use a conversion table */
+static int mbfl_conv_singlebyte_table(int c, mbfl_convert_filter *filter, int tbl_min, const unsigned short tbl[])
+{
+ if (c < tbl_min) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ int s = tbl[c - tbl_min];
+ if (!s) {
+ s = c | MBFL_WCSGROUP_THROUGH;
+ }
+ CK((*filter->output_function)(s, filter->data));
+ }
+ return c;
+}
+
+static int mbfl_conv_reverselookup_table(int c, mbfl_convert_filter *filter, int tbl_min, const unsigned short tbl[])
+{
+ if (c < tbl_min) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ for (int i = 0; i < 256 - tbl_min; i++) {
+ if (c == tbl[i]) {
+ CK((*filter->output_function)(i + tbl_min, filter->data));
+ return c;
+ }
+ }
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
+
+/* Initialize data structures for a single-byte encoding */
+#define DEF_SB(id, name, mime_name, aliases) \
+ static int mbfl_filt_conv_##id##_wchar(int c, mbfl_convert_filter *filter); \
+ static int mbfl_filt_conv_wchar_##id(int c, mbfl_convert_filter *filter); \
+ static const struct mbfl_convert_vtbl vtbl_##id##_wchar = { \
+ mbfl_no_encoding_##id, \
+ mbfl_no_encoding_wchar, \
+ mbfl_filt_conv_common_ctor, \
+ NULL, \
+ mbfl_filt_conv_##id##_wchar, \
+ mbfl_filt_conv_common_flush, \
+ NULL \
+ }; \
+ static const struct mbfl_convert_vtbl vtbl_wchar_##id = { \
+ mbfl_no_encoding_wchar, \
+ mbfl_no_encoding_##id, \
+ mbfl_filt_conv_common_ctor, \
+ NULL, \
+ mbfl_filt_conv_wchar_##id, \
+ mbfl_filt_conv_common_flush, \
+ NULL \
+ }; \
+ const mbfl_encoding mbfl_encoding_##id = { \
+ mbfl_no_encoding_##id, \
+ name, \
+ mime_name, \
+ aliases, \
+ NULL, \
+ MBFL_ENCTYPE_SBCS, \
+ &vtbl_##id##_wchar, \
+ &vtbl_wchar_##id \
+ }
+
+/* For single-byte encodings which use a conversion table */
+#define DEF_SB_TBL(id, name, mime_name, aliases, tbl_min, tbl) \
+ static int mbfl_filt_conv_##id##_wchar(int c, mbfl_convert_filter *filter) { \
+ return mbfl_conv_singlebyte_table(c, filter, tbl_min, tbl); \
+ } \
+ static int mbfl_filt_conv_wchar_##id(int c, mbfl_convert_filter *filter) { \
+ return mbfl_conv_reverselookup_table(c, filter, tbl_min, tbl); \
+ } \
+ DEF_SB(id, name, mime_name, aliases)
+
+/* The grand-daddy of them all: ASCII */
+static const char *ascii_aliases[] = {"ANSI_X3.4-1968", "iso-ir-6", "ANSI_X3.4-1986", "ISO_646.irv:1991", "US-ASCII", "ISO646-US", "us", "IBM367", "IBM-367", "cp367", "csASCII", NULL};
+DEF_SB(ascii, "ASCII", "US-ASCII", ascii_aliases);
+
+static int mbfl_filt_conv_ascii_wchar(int c, mbfl_convert_filter *filter)
+{
+ if (c < 0x80) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
+
+static int mbfl_filt_conv_wchar_ascii(int c, mbfl_convert_filter *filter)
+{
+ if (c < 0x80) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
+
+/* ISO-8859-X */
+
+static const char *iso8859_1_aliases[] = {"ISO8859-1", "latin1", NULL};
+DEF_SB(8859_1, "ISO-8859-1", "ISO-8859-1", iso8859_1_aliases);
+
+static int mbfl_filt_conv_8859_1_wchar(int c, mbfl_convert_filter *filter)
+{
+ return (*filter->output_function)(c, filter->data);
+}
+
+static int mbfl_filt_conv_wchar_8859_1(int c, mbfl_convert_filter *filter)
+{
+ if (c < 0x100) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
+
+static const char *iso8859_2_aliases[] = {"ISO8859-2", "latin2", NULL};
+static const unsigned short iso8859_2_ucs_table[] = {
+ 0X00A0, 0X0104, 0X02D8, 0X0141, 0X00A4, 0X013D, 0X015A, 0X00A7,
+ 0X00A8, 0X0160, 0X015E, 0X0164, 0X0179, 0X00AD, 0X017D, 0X017B,
+ 0X00B0, 0X0105, 0X02DB, 0X0142, 0X00B4, 0X013E, 0X015B, 0X02C7,
+ 0X00B8, 0X0161, 0X015F, 0X0165, 0X017A, 0X02DD, 0X017E, 0X017C,
+ 0X0154, 0X00C1, 0X00C2, 0X0102, 0X00C4, 0X0139, 0X0106, 0X00C7,
+ 0X010C, 0X00C9, 0X0118, 0X00CB, 0X011A, 0X00CD, 0X00CE, 0X010E,
+ 0X0110, 0X0143, 0X0147, 0X00D3, 0X00D4, 0X0150, 0X00D6, 0X00D7,
+ 0X0158, 0X016E, 0X00DA, 0X0170, 0X00DC, 0X00DD, 0X0162, 0X00DF,
+ 0X0155, 0X00E1, 0X00E2, 0X0103, 0X00E4, 0X013A, 0X0107, 0X00E7,
+ 0X010D, 0X00E9, 0X0119, 0X00EB, 0X011B, 0X00ED, 0X00EE, 0X010F,
+ 0X0111, 0X0144, 0X0148, 0X00F3, 0X00F4, 0X0151, 0X00F6, 0X00F7,
+ 0X0159, 0X016F, 0X00FA, 0X0171, 0X00FC, 0X00FD, 0X0163, 0X02D9
+};
+DEF_SB_TBL(8859_2, "ISO-8859-2", "ISO-8859-2", iso8859_2_aliases, 0xA0, iso8859_2_ucs_table);
+
+static const char *iso8859_3_aliases[] = {"ISO8859-3", "latin3", NULL};
+static const unsigned short iso8859_3_ucs_table[] = {
+ 0X00A0, 0X0126, 0X02D8, 0X00A3, 0X00A4, 0X0000, 0X0124, 0X00A7,
+ 0X00A8, 0X0130, 0X015E, 0X011E, 0X0134, 0X00AD, 0X0000, 0X017B,
+ 0X00B0, 0X0127, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X0125, 0X00B7,
+ 0X00B8, 0X0131, 0X015F, 0X011F, 0X0135, 0X00BD, 0X0000, 0X017C,
+ 0X00C0, 0X00C1, 0X00C2, 0X0000, 0X00C4, 0X010A, 0X0108, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X0000, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X0120, 0X00D6, 0X00D7,
+ 0X011C, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X016C, 0X015C, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X0000, 0X00E4, 0X010B, 0X0109, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X0000, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X0121, 0X00F6, 0X00F7,
+ 0X011D, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X016D, 0X015D, 0X02D9
+};
+DEF_SB_TBL(8859_3, "ISO-8859-3", "ISO-8859-3", iso8859_3_aliases, 0xA0, iso8859_3_ucs_table);
+
+static const char *iso8859_4_aliases[] = {"ISO8859-4", "latin4", NULL};
+static const unsigned short iso8859_4_ucs_table[] = {
+ 0X00A0, 0X0104, 0X0138, 0X0156, 0X00A4, 0X0128, 0X013B, 0X00A7,
+ 0X00A8, 0X0160, 0X0112, 0X0122, 0X0166, 0X00AD, 0X017D, 0X00AF,
+ 0X00B0, 0X0105, 0X02DB, 0X0157, 0X00B4, 0X0129, 0X013C, 0X02C7,
+ 0X00B8, 0X0161, 0X0113, 0X0123, 0X0167, 0X014A, 0X017E, 0X014B,
+ 0X0100, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X012E,
+ 0X010C, 0X00C9, 0X0118, 0X00CB, 0X0116, 0X00CD, 0X00CE, 0X012A,
+ 0X0110, 0X0145, 0X014C, 0X0136, 0X00D4, 0X00D5, 0X00D6, 0X00D7,
+ 0X00D8, 0X0172, 0X00DA, 0X00DB, 0X00DC, 0X0168, 0X016A, 0X00DF,
+ 0X0101, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X012F,
+ 0X010D, 0X00E9, 0X0119, 0X00EB, 0X0117, 0X00ED, 0X00EE, 0X012B,
+ 0X0111, 0X0146, 0X014D, 0X0137, 0X00F4, 0X00F5, 0X00F6, 0X00F7,
+ 0X00F8, 0X0173, 0X00FA, 0X00FB, 0X00FC, 0X0169, 0X016B, 0X02D9
+};
+DEF_SB_TBL(8859_4, "ISO-8859-4", "ISO-8859-4", iso8859_4_aliases, 0xA0, iso8859_4_ucs_table);
+
+static const char *iso8859_5_aliases[] = {"ISO8859-5", "cyrillic", NULL};
+static const unsigned short iso8859_5_ucs_table[] = {
+ 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
+ 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
+ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
+ 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f
+};
+DEF_SB_TBL(8859_5, "ISO-8859-5", "ISO-8859-5", iso8859_5_aliases, 0xA0, iso8859_5_ucs_table);
+
+static const char *iso8859_6_aliases[] = {"ISO8859-6", "arabic", NULL};
+static const unsigned short iso8859_6_ucs_table[] = {
+ 0X00A0, 0X0000, 0X0000, 0X0000, 0X00A4, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X060C, 0X00AD, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X061B, 0X0000, 0X0000, 0X0000, 0X061F,
+ 0X0000, 0X0621, 0X0622, 0X0623, 0X0624, 0X0625, 0X0626, 0X0627,
+ 0X0628, 0X0629, 0X062A, 0X062B, 0X062C, 0X062D, 0X062E, 0X062F,
+ 0X0630, 0X0631, 0X0632, 0X0633, 0X0634, 0X0635, 0X0636, 0X0637,
+ 0X0638, 0X0639, 0X063A, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0640, 0X0641, 0X0642, 0X0643, 0X0644, 0X0645, 0X0646, 0X0647,
+ 0X0648, 0X0649, 0X064A, 0X064B, 0X064C, 0X064D, 0X064E, 0X064F,
+ 0X0650, 0X0651, 0X0652, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000
+};
+DEF_SB_TBL(8859_6, "ISO-8859-6", "ISO-8859-6", iso8859_6_aliases, 0xA0, iso8859_6_ucs_table);
+
+static const char *iso8859_7_aliases[] = {"ISO8859-7", "greek", NULL};
+static const unsigned short iso8859_7_ucs_table[] = {
+ 0X00A0, 0X2018, 0X2019, 0X00A3, 0X20AC, 0X20AF, 0X00A6, 0X00A7,
+ 0X00A8, 0X00A9, 0X037A, 0X00AB, 0X00AC, 0X00AD, 0X0000, 0X2015,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X0384, 0X0385, 0X0386, 0X00B7,
+ 0X0388, 0X0389, 0X038A, 0X00BB, 0X038C, 0X00BD, 0X038E, 0X038F,
+ 0X0390, 0X0391, 0X0392, 0X0393, 0X0394, 0X0395, 0X0396, 0X0397,
+ 0X0398, 0X0399, 0X039A, 0X039B, 0X039C, 0X039D, 0X039E, 0X039F,
+ 0X03A0, 0X03A1, 0X0000, 0X03A3, 0X03A4, 0X03A5, 0X03A6, 0X03A7,
+ 0X03A8, 0X03A9, 0X03AA, 0X03AB, 0X03AC, 0X03AD, 0X03AE, 0X03AF,
+ 0X03B0, 0X03B1, 0X03B2, 0X03B3, 0X03B4, 0X03B5, 0X03B6, 0X03B7,
+ 0X03B8, 0X03B9, 0X03BA, 0X03BB, 0X03BC, 0X03BD, 0X03BE, 0X03BF,
+ 0X03C0, 0X03C1, 0X03C2, 0X03C3, 0X03C4, 0X03C5, 0X03C6, 0X03C7,
+ 0X03C8, 0X03C9, 0X03CA, 0X03CB, 0X03CC, 0X03CD, 0X03CE, 0X0000
+};
+DEF_SB_TBL(8859_7, "ISO-8859-7", "ISO-8859-7", iso8859_7_aliases, 0xA0, iso8859_7_ucs_table);
+
+static const char *iso8859_8_aliases[] = {"ISO8859-8", "hebrew", NULL};
+static const unsigned short iso8859_8_ucs_table[] = {
+ 0X00A0, 0X0000, 0X00A2, 0X00A3, 0X00A4, 0X00A5, 0X00A6, 0X00A7,
+ 0X00A8, 0X00A9, 0X00D7, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X00B6, 0X00B7,
+ 0X00B8, 0X00B9, 0X00F7, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X2017,
+ 0X05D0, 0X05D1, 0X05D2, 0X05D3, 0X05D4, 0X05D5, 0X05D6, 0X05D7,
+ 0X05D8, 0X05D9, 0X05DA, 0X05DB, 0X05DC, 0X05DD, 0X05DE, 0X05DF,
+ 0X05E0, 0X05E1, 0X05E2, 0X05E3, 0X05E4, 0X05E5, 0X05E6, 0X05E7,
+ 0X05E8, 0X05E9, 0X05EA, 0X0000, 0X0000, 0X200E, 0X200F, 0X0000
+};
+DEF_SB_TBL(8859_8, "ISO-8859-8", "ISO-8859-8", iso8859_8_aliases, 0xA0, iso8859_8_ucs_table);
+
+static const char *iso8859_9_aliases[] = {"ISO8859-9", "latin5", NULL};
+static const unsigned short iso8859_9_ucs_table[] = {
+ 0X00A0, 0X00A1, 0X00A2, 0X00A3, 0X00A4, 0X00A5, 0X00A6, 0X00A7,
+ 0X00A8, 0X00A9, 0X00AA, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X00B6, 0X00B7,
+ 0X00B8, 0X00B9, 0X00BA, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X00BF,
+ 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X011E, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X00D7,
+ 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X0130, 0X015E, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X011F, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X00F7,
+ 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X0131, 0X015F, 0X00FF
+};
+DEF_SB_TBL(8859_9, "ISO-8859-9", "ISO-8859-9", iso8859_9_aliases, 0xA0, iso8859_9_ucs_table);
+
+static const char *iso8859_10_aliases[] = {"ISO8859-10", "latin6", NULL};
+static const unsigned short iso8859_10_ucs_table[] = {
+ 0X00A0, 0X0104, 0X0112, 0X0122, 0X012A, 0X0128, 0X0136, 0X00A7,
+ 0X013B, 0X0110, 0X0160, 0X0166, 0X017D, 0X00AD, 0X016A, 0X014A,
+ 0X00B0, 0X0105, 0X0113, 0X0123, 0X012B, 0X0129, 0X0137, 0X00B7,
+ 0X013C, 0X0111, 0X0161, 0X0167, 0X017E, 0X2015, 0X016B, 0X014B,
+ 0X0100, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X012E,
+ 0X010C, 0X00C9, 0X0118, 0X00CB, 0X0116, 0X00CD, 0X00CE, 0X00CF,
+ 0X00D0, 0X0145, 0X014C, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X0168,
+ 0X00D8, 0X0172, 0X00DA, 0X00DB, 0X00DC, 0X00DD, 0X00DE, 0X00DF,
+ 0X0101, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X012F,
+ 0X010D, 0X00E9, 0X0119, 0X00EB, 0X0117, 0X00ED, 0X00EE, 0X00EF,
+ 0X00F0, 0X0146, 0X014D, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X0169,
+ 0X00F8, 0X0173, 0X00FA, 0X00FB, 0X00FC, 0X00FD, 0X00FE, 0X0138
+};
+DEF_SB_TBL(8859_10, "ISO-8859-10", "ISO-8859-10", iso8859_10_aliases, 0xA0, iso8859_10_ucs_table);
+
+static const char *iso8859_13_aliases[] = {"ISO8859-13", NULL};
+static const unsigned short iso8859_13_ucs_table[] = {
+ 0X00A0, 0X201D, 0X00A2, 0X00A3, 0X00A4, 0X201E, 0X00A6, 0X00A7,
+ 0X00D8, 0X00A9, 0X0156, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00C6,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X201C, 0X00B5, 0X00B6, 0X00B7,
+ 0X00F8, 0X00B9, 0X0157, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X00E6,
+ 0X0104, 0X012E, 0X0100, 0X0106, 0X00C4, 0X00C5, 0X0118, 0X0112,
+ 0X010C, 0X00C9, 0X0179, 0X0116, 0X0122, 0X0136, 0X012A, 0X013B,
+ 0X0160, 0X0143, 0X0145, 0X00D3, 0X014C, 0X00D5, 0X00D6, 0X00D7,
+ 0X0172, 0X0141, 0X015A, 0X016A, 0X00DC, 0X017B, 0X017D, 0X00DF,
+ 0X0105, 0X012F, 0X0101, 0X0107, 0X00E4, 0X00E5, 0X0119, 0X0113,
+ 0X010D, 0X00E9, 0X017A, 0X0117, 0X0123, 0X0137, 0X012B, 0X013C,
+ 0X0161, 0X0144, 0X0146, 0X00F3, 0X014D, 0X00F5, 0X00F6, 0X00F7,
+ 0X0173, 0X0142, 0X015B, 0X016B, 0X00FC, 0X017C, 0X017E, 0X2019
+};
+DEF_SB_TBL(8859_13, "ISO-8859-13", "ISO-8859-13", iso8859_13_aliases, 0xA0, iso8859_13_ucs_table);
+
+static const char *iso8859_14_aliases[] = {"ISO8859-14", "latin8", NULL};
+static const unsigned short iso8859_14_ucs_table[] = {
+ 0X00A0, 0X1E02, 0X1E03, 0X00A3, 0X010A, 0X010B, 0X1E0A, 0X00A7,
+ 0X1E80, 0X00A9, 0X1E82, 0X1E0B, 0X1EF2, 0X00AD, 0X00AE, 0X0178,
+ 0X1E1E, 0X1E1F, 0X0120, 0X0121, 0X1E40, 0X1E41, 0X00B6, 0X1E56,
+ 0X1E81, 0X1E57, 0X1E83, 0X1E60, 0X1EF3, 0X1E84, 0X1E85, 0X1E61,
+ 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X0174, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X1E6A,
+ 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X00DD, 0X0176, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X0175, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X1E6B,
+ 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X00FD, 0X0177, 0X00FF
+};
+DEF_SB_TBL(8859_14, "ISO-8859-14", "ISO-8859-14", iso8859_14_aliases, 0xA0, iso8859_14_ucs_table);
+
+static const char *iso8859_15_aliases[] = {"ISO8859-15", NULL};
+static const unsigned short iso8859_15_ucs_table[] = {
+ 0X00A0, 0X00A1, 0X00A2, 0X00A3, 0X20AC, 0X00A5, 0X0160, 0X00A7,
+ 0X0161, 0X00A9, 0X00AA, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X017D, 0X00B5, 0X00B6, 0X00B7,
+ 0X017E, 0X00B9, 0X00BA, 0X00BB, 0X0152, 0X0153, 0X0178, 0X00BF,
+ 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X00D0, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X00D7,
+ 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X00DD, 0X00DE, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X00F0, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X00F7,
+ 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X00FD, 0X00FE, 0X00FF
+};
+DEF_SB_TBL(8859_15, "ISO-8859-15", "ISO-8859-15", iso8859_15_aliases, 0xA0, iso8859_15_ucs_table);
+
+static const char *iso8859_16_aliases[] = {"ISO8859-16", NULL};
+static const unsigned short iso8859_16_ucs_table[] = {
+ 0X00A0, 0X0104, 0X0105, 0X0141, 0X20AC, 0X201E, 0X0160, 0X00A7,
+ 0X0161, 0X00A9, 0X0218, 0X00AB, 0X0179, 0X00AD, 0X017A, 0X017B,
+ 0X00B0, 0X00B1, 0X010C, 0X0142, 0X017D, 0X201D, 0X00B6, 0X00B7,
+ 0X017E, 0X010D, 0X0219, 0X00BB, 0X0152, 0X0153, 0X0178, 0X017C,
+ 0X00C0, 0X00C1, 0X00C2, 0X0102, 0X00C4, 0X0106, 0X00C6, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X0110, 0X0143, 0X00D2, 0X00D3, 0X00D4, 0X0150, 0X00D6, 0X015A,
+ 0X0170, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X0118, 0X021A, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X0103, 0X00E4, 0X0107, 0X00E6, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X0111, 0X0144, 0X00F2, 0X00F3, 0X00F4, 0X0151, 0X00F6, 0X015B,
+ 0X0171, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X0119, 0X021B, 0X00FF
+};
+DEF_SB_TBL(8859_16, "ISO-8859-16", "ISO-8859-16", iso8859_16_aliases, 0xA0, iso8859_16_ucs_table);
+
+static const char *cp1251_aliases[] = {"CP1251", "CP-1251", "WINDOWS-1251", NULL};
+static const unsigned short cp1251_ucs_table[] = {
+ 0X0402, 0X0403, 0X201A, 0X0453, 0X201E, 0X2026, 0X2020, 0X2021,
+ 0X20AC, 0X2030, 0X0409, 0X2039, 0X040A, 0X040C, 0X040B, 0X040F,
+ 0X0452, 0X2018, 0X2019, 0X201C, 0X201D, 0X2022, 0X2013, 0X2014,
+ 0X0000, 0X2122, 0X0459, 0X203A, 0X045A, 0X045C, 0X045B, 0X045F,
+ 0X00A0, 0X040E, 0X045E, 0X0408, 0X00A4, 0X0490, 0X00A6, 0X00A7,
+ 0X0401, 0X00A9, 0X0404, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X0407,
+ 0X00B0, 0X00B1, 0X0406, 0X0456, 0X0491, 0X00B5, 0X00B6, 0X00B7,
+ 0X0451, 0X2116, 0X0454, 0X00BB, 0X0458, 0X0405, 0X0455, 0X0457,
+ 0X0410, 0X0411, 0X0412, 0X0413, 0X0414, 0X0415, 0X0416, 0X0417,
+ 0X0418, 0X0419, 0X041A, 0X041B, 0X041C, 0X041D, 0X041E, 0X041F,
+ 0X0420, 0X0421, 0X0422, 0X0423, 0X0424, 0X0425, 0X0426, 0X0427,
+ 0X0428, 0X0429, 0X042A, 0X042B, 0X042C, 0X042D, 0X042E, 0X042F,
+ 0X0430, 0X0431, 0X0432, 0X0433, 0X0434, 0X0435, 0X0436, 0X0437,
+ 0X0438, 0X0439, 0X043A, 0X043B, 0X043C, 0X043D, 0X043E, 0X043F,
+ 0X0440, 0X0441, 0X0442, 0X0443, 0X0444, 0X0445, 0X0446, 0X0447,
+ 0X0448, 0X0449, 0X044A, 0X044B, 0X044C, 0X044D, 0X044E, 0X044F
+};
+DEF_SB_TBL(cp1251, "Windows-1251", "Windows-1251", cp1251_aliases, 0x80, cp1251_ucs_table);
+
+static const char *cp1252_aliases[] = {"cp1252", NULL};
+static const unsigned short cp1252_ucs_table[] = {
+ 0X20AC,0X0000,0X201A,0X0192,0X201E,0X2026,0X2020,0X2021,
+ 0X02C6,0X2030,0X0160,0X2039,0X0152,0X0000,0X017D,0X0000,
+ 0X0000,0X2018,0X2019,0X201C,0X201D,0X2022,0X2013,0X2014,
+ 0X02DC,0X2122,0X0161,0X203A,0X0153,0X0000,0X017E,0X0178
+};
+DEF_SB(cp1252, "Windows-1252", "Windows-1252", cp1252_aliases);
+
+static int mbfl_filt_conv_wchar_cp1252(int c, mbfl_convert_filter *filter)
+{
+ if (c >= 0x100) {
+ for (int n = 0; n < 32; n++) {
+ if (c == cp1252_ucs_table[n]) {
+ CK((*filter->output_function)(0x80 + n, filter->data));
+ return c;
+ }
+ }
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ } else if (c <= 0x7F || c >= 0xA0) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
+
+static int mbfl_filt_conv_cp1252_wchar(int c, mbfl_convert_filter *filter)
+{
+ int s;
+
+ if (c >= 0x80 && c < 0xA0) {
+ s = cp1252_ucs_table[c - 0x80];
+ if (!s) {
+ s = c | MBFL_WCSGROUP_THROUGH;
+ }
+ } else {
+ s = c;
+ }
+
+ CK((*filter->output_function)(s, filter->data));
+ return c;
+}
+
+static const char *cp1254_aliases[] = {"CP1254", "CP-1254", "WINDOWS-1254", NULL};
+static const unsigned short cp1254_ucs_table[] = {
+ 0X20AC, 0X0000, 0X201A, 0X0192, 0X201E, 0X2026, 0X2020, 0X2021,
+ 0X02C6, 0X2030, 0X0160, 0X2039, 0X0152, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X2018, 0X2019, 0X201C, 0X201D, 0X2022, 0X2013, 0X2014,
+ 0X02DC, 0X2122, 0X0161, 0X203A, 0X0153, 0X0000, 0X0000, 0X0178,
+ 0X00A0, 0X00A1, 0X00A2, 0X00A3, 0X00A4, 0X00A5, 0X00A6, 0X00A7,
+ 0X00A8, 0X00A9, 0X00AA, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X00B6, 0X00B7,
+ 0X00B8, 0X00B9, 0X00BA, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X00BF,
+ 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X011E, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X00D7,
+ 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X0130, 0X015E, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X011F, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X00F7,
+ 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X0131, 0X015F, 0X00FF
+};
+DEF_SB_TBL(cp1254, "Windows-1254", "Windows-1254", cp1254_aliases, 0x80, cp1254_ucs_table);
+
+static const char *cp866_aliases[] = {"CP-866", "IBM866", "IBM-866", NULL};
+static const unsigned short cp866_ucs_table[] = {
+ 0X0410, 0X0411, 0X0412, 0X0413, 0X0414, 0X0415, 0X0416, 0X0417,
+ 0X0418, 0X0419, 0X041A, 0X041B, 0X041C, 0X041D, 0X041E, 0X041F,
+ 0X0420, 0X0421, 0X0422, 0X0423, 0X0424, 0X0425, 0X0426, 0X0427,
+ 0X0428, 0X0429, 0X042A, 0X042B, 0X042C, 0X042D, 0X042E, 0X042F,
+ 0X0430, 0X0431, 0X0432, 0X0433, 0X0434, 0X0435, 0X0436, 0X0437,
+ 0X0438, 0X0439, 0X043A, 0X043B, 0X043C, 0X043D, 0X043E, 0X043F,
+ 0X2591, 0X2592, 0X2593, 0X2502, 0X2524, 0X2561, 0X2562, 0X2556,
+ 0X2555, 0X2563, 0X2551, 0X2557, 0X255D, 0X255C, 0X255B, 0X2510,
+ 0X2514, 0X2534, 0X252C, 0X251C, 0X2500, 0X253C, 0X255E, 0X255F,
+ 0X255A, 0X2554, 0X2569, 0X2566, 0X2560, 0X2550, 0X256C, 0X2567,
+ 0X2568, 0X2564, 0X2565, 0X2559, 0X2558, 0X2552, 0X2553, 0X256B,
+ 0X256A, 0X2518, 0X250C, 0X2588, 0X2584, 0X258C, 0X2590, 0X2580,
+ 0X0440, 0X0441, 0X0442, 0X0443, 0X0444, 0X0445, 0X0446, 0X0447,
+ 0X0448, 0X0449, 0X044A, 0X044B, 0X044C, 0X044D, 0X044E, 0X044F,
+ 0X0401, 0X0451, 0X0404, 0X0454, 0X0407, 0X0457, 0X040E, 0X045E,
+ 0X00B0, 0X2219, 0X00B7, 0X221A, 0X2116, 0X00A4, 0X25A0, 0X00A0
+};
+DEF_SB_TBL(cp866, "CP866", "CP866", cp866_aliases, 0x80, cp866_ucs_table);
+
+static const char *cp850_aliases[] = {"CP-850", "IBM850", "IBM-850", NULL};
+static const unsigned short cp850_ucs_table[] = {
+ 0X00C7, 0X00FC, 0X00E9, 0X00E2, 0X00E4, 0X00E0, 0X00E5, 0X00E7,
+ 0X00EA, 0X00EB, 0X00E8, 0X00EF, 0X00EE, 0X00EC, 0X00C4, 0X00C5,
+ 0X00C9, 0X00E6, 0X00C6, 0X00F4, 0X00F6, 0X00F2, 0X00FB, 0X00F9,
+ 0X00FF, 0X00D6, 0X00DC, 0X00F8, 0X00A3, 0X00D8, 0X00D7, 0X0192,
+ 0X00E1, 0X00ED, 0X00F3, 0X00FA, 0X00F1, 0X00D1, 0X00AA, 0X00BA,
+ 0X00BF, 0X00AE, 0X00AC, 0X00BD, 0X00BC, 0X00A1, 0X00AB, 0X00BB,
+ 0X2591, 0X2592, 0X2593, 0X2502, 0X2524, 0X00C1, 0X00C2, 0X00C0,
+ 0X00A9, 0X2563, 0X2551, 0X2557, 0X255D, 0X00A2, 0X00A5, 0X2510,
+ 0X2514, 0X2534, 0X252C, 0X251C, 0X2500, 0X253C, 0X00E3, 0X00C3,
+ 0X255A, 0X2554, 0X2569, 0X2566, 0X2560, 0X2550, 0X256C, 0X00A4,
+ 0X00F0, 0X00D0, 0X00CA, 0X00CB, 0X00C8, 0X0131, 0X00CD, 0X00CE,
+ 0X00CF, 0X2518, 0X250C, 0X2588, 0X2584, 0X00A6, 0X00CC, 0X2580,
+ 0X00D3, 0X00DF, 0X00D4, 0X00D2, 0X00F5, 0X00D5, 0X00B5, 0X00FE,
+ 0X00DE, 0X00DA, 0X00DB, 0X00D9, 0X00FD, 0X00DD, 0X00AF, 0X00B4,
+ 0X00AD, 0X00B1, 0X2017, 0X00BE, 0X00B6, 0X00A7, 0X00F7, 0X00B8,
+ 0X00B0, 0X00A8, 0X00B7, 0X00B9, 0X00B3, 0X00B2, 0X25A0, 0X00A0
+};
+DEF_SB_TBL(cp850, "CP850", "CP850", cp850_aliases, 0x80, cp850_ucs_table);
+
+static const char *koi8r_aliases[] = {"KOI8R", NULL};
+static const unsigned short koi8r_ucs_table[] = {
+ 0X2500, 0X2502, 0X250C, 0X2510, 0X2514, 0X2518, 0X251C, 0X2524,
+ 0X252C, 0X2534, 0X253C, 0X2580, 0X2584, 0X2588, 0X258C, 0X2590,
+ 0X2591, 0X2592, 0X2593, 0X2320, 0X25A0, 0X2219, 0X221A, 0X2248,
+ 0X2264, 0X2265, 0X00A0, 0X2321, 0X00B0, 0X00B2, 0X00B7, 0X00F7,
+ 0X2550, 0X2551, 0X2552, 0X0451, 0X2553, 0X2554, 0X2555, 0X2556,
+ 0X2557, 0X2558, 0X2559, 0X255A, 0X255B, 0X255C, 0X255D, 0X255E,
+ 0X255F, 0X2560, 0X2561, 0X0401, 0X2562, 0X2563, 0X2564, 0X2565,
+ 0X2566, 0X2567, 0X2568, 0X2569, 0X256A, 0X256B, 0X256C, 0X00A9,
+ 0X044E, 0X0430, 0X0431, 0X0446, 0X0434, 0X0435, 0X0444, 0X0433,
+ 0X0445, 0X0438, 0X0439, 0X043A, 0X043B, 0X043C, 0X043D, 0X043E,
+ 0X043F, 0X044F, 0X0440, 0X0441, 0X0442, 0X0443, 0X0436, 0X0432,
+ 0X044C, 0X044B, 0X0437, 0X0448, 0X044D, 0X0449, 0X0447, 0X044A,
+ 0X042E, 0X0410, 0X0411, 0X0426, 0X0414, 0X0415, 0X0424, 0X0413,
+ 0X0425, 0X0418, 0X0419, 0X041A, 0X041B, 0X041C, 0X041D, 0X041E,
+ 0X041F, 0X042F, 0X0420, 0X0421, 0X0422, 0X0423, 0X0416, 0X0412,
+ 0X042C, 0X042B, 0X0417, 0X0428, 0X042D, 0X0429, 0X0427, 0X042A
+};
+DEF_SB_TBL(koi8r, "KOI8-R", "KOI8-R", koi8r_aliases, 0x80, koi8r_ucs_table);
+
+static const char *koi8u_aliases[] = {"KOI8U", NULL};
+static const unsigned short koi8u_ucs_table[] = {
+ 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
+ 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
+ 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,
+ 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7,
+ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457,
+ 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x0491, 0x255D, 0x255E,
+ 0x255F, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407,
+ 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x0490, 0x256C, 0x00A9,
+ 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+ 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
+ 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+ 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
+ 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+ 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E,
+ 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+ 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A
+};
+DEF_SB_TBL(koi8u, "KOI8-U", "KOI8-U", koi8u_aliases, 0x80, koi8u_ucs_table);
+
+static const char *armscii8_aliases[] = {"ArmSCII8", "ARMSCII-8", "ARMSCII8", NULL};
+static const unsigned short armscii8_ucs_table[] = {
+ 0X00A0, 0X0000, 0X0587, 0X0589, 0X0029, 0X0028, 0X00BB, 0X00AB,
+ 0X2014, 0X002E, 0X055D, 0X002C, 0X002D, 0X058A, 0X2026, 0X055C,
+ 0X055B, 0X055E, 0X0531, 0X0561, 0X0532, 0X0562, 0X0533, 0X0563,
+ 0X0534, 0X0564, 0X0535, 0X0565, 0X0536, 0X0566, 0X0537, 0X0567,
+ 0X0538, 0X0568, 0X0539, 0X0569, 0X053A, 0X056A, 0X053B, 0X056B,
+ 0X053C, 0X056C, 0X053D, 0X056D, 0X053E, 0X056E, 0X053F, 0X056F,
+ 0X0540, 0X0570, 0X0541, 0X0571, 0X0542, 0X0572, 0X0543, 0X0573,
+ 0X0544, 0X0574, 0X0545, 0X0575, 0X0546, 0X0576, 0X0547, 0X0577,
+ 0X0548, 0X0578, 0X0549, 0X0579, 0X054A, 0X057A, 0X054B, 0X057B,
+ 0X054C, 0X057C, 0X054D, 0X057D, 0X054E, 0X057E, 0X054F, 0X057F,
+ 0X0550, 0X0580, 0X0551, 0X0581, 0X0552, 0X0582, 0X0553, 0X0583,
+ 0X0554, 0X0584, 0X0555, 0X0585, 0X0556, 0X0586, 0X055A, 0X0000
+};
+static const unsigned char ucs_armscii8_table[] = {
+ 0XA5, 0XA4, 0X2A, 0X2B, 0XAB, 0XAC, 0XA9, 0X2F
+};
+DEF_SB(armscii8, "ArmSCII-8", "ArmSCII-8", armscii8_aliases);
+
+int mbfl_filt_conv_armscii8_wchar(int c, mbfl_convert_filter *filter)
+{
+ int s;
+
+ if (c < 0xA0) {
+ s = c;
+ } else {
+ s = armscii8_ucs_table[c - 0xA0];
+ if (!s) {
+ s = c | MBFL_WCSGROUP_THROUGH;
+ }
+ }
+
+ CK((*filter->output_function)(s, filter->data));
+ return c;
+}
+
+int mbfl_filt_conv_wchar_armscii8(int c, mbfl_convert_filter *filter)
+{
+ if (c >= 0x28 && c <= 0x2F) {
+ CK((*filter->output_function)(ucs_armscii8_table[c - 0x28], filter->data));
+ } else if (c < 0xA0) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ for (int n = 0; n < 0x60; n++) {
+ if (c == armscii8_ucs_table[n]) {
+ CK((*filter->output_function)(0xA0 + n, filter->data));
+ return c;
+ }
+ }
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h
new file mode 100644
index 0000000000..ca7c6f806c
--- /dev/null
+++ b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h
@@ -0,0 +1,44 @@
+/*
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+*/
+
+#ifndef MBFL_SINGLEBYTE_H
+#define MBFL_SINGLEBYTE_H
+
+#include "mbfilter.h"
+
+extern const mbfl_encoding mbfl_encoding_ascii;
+extern const mbfl_encoding mbfl_encoding_8859_1;
+extern const mbfl_encoding mbfl_encoding_8859_2;
+extern const mbfl_encoding mbfl_encoding_8859_3;
+extern const mbfl_encoding mbfl_encoding_8859_4;
+extern const mbfl_encoding mbfl_encoding_8859_5;
+extern const mbfl_encoding mbfl_encoding_8859_6;
+extern const mbfl_encoding mbfl_encoding_8859_7;
+extern const mbfl_encoding mbfl_encoding_8859_8;
+extern const mbfl_encoding mbfl_encoding_8859_9;
+extern const mbfl_encoding mbfl_encoding_8859_10;
+extern const mbfl_encoding mbfl_encoding_8859_13;
+extern const mbfl_encoding mbfl_encoding_8859_14;
+extern const mbfl_encoding mbfl_encoding_8859_15;
+extern const mbfl_encoding mbfl_encoding_8859_16;
+extern const mbfl_encoding mbfl_encoding_cp1251;
+extern const mbfl_encoding mbfl_encoding_cp1252;
+extern const mbfl_encoding mbfl_encoding_cp1254;
+extern const mbfl_encoding mbfl_encoding_cp866;
+extern const mbfl_encoding mbfl_encoding_cp850;
+extern const mbfl_encoding mbfl_encoding_koi8r;
+extern const mbfl_encoding mbfl_encoding_koi8u;
+extern const mbfl_encoding mbfl_encoding_armscii8;
+
+#endif /* MBFL_SINGLEBYTE_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c
index dc5c2e4882..e175f8dbfb 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c
@@ -36,7 +36,7 @@
#include "unicode_table_cp932_ext.h"
#include "unicode_table_jis.h"
-int mbfl_filt_ident_sjis(int c, mbfl_identify_filter *filter);
+static int mbfl_filt_conv_sjis_wchar_flush(mbfl_convert_filter *filter);
const unsigned char mblen_table_sjis[] = { /* 0x80-0x9f,0xE0-0xFF */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -63,27 +63,21 @@ const mbfl_encoding mbfl_encoding_sjis = {
mbfl_no_encoding_sjis,
"SJIS",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_aliases,
+ mbfl_encoding_sjis_aliases,
mblen_table_sjis,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_wchar,
&vtbl_wchar_sjis
};
-const struct mbfl_identify_vtbl vtbl_identify_sjis = {
- mbfl_no_encoding_sjis,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
const struct mbfl_convert_vtbl vtbl_sjis_wchar = {
mbfl_no_encoding_sjis,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_sjis_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
+ mbfl_filt_conv_sjis_wchar_flush,
+ NULL
};
const struct mbfl_convert_vtbl vtbl_wchar_sjis = {
@@ -93,7 +87,7 @@ const struct mbfl_convert_vtbl vtbl_wchar_sjis = {
NULL,
mbfl_filt_conv_wchar_sjis,
mbfl_filt_conv_common_flush,
- NULL,
+ NULL
};
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
@@ -141,35 +135,32 @@ const struct mbfl_convert_vtbl vtbl_wchar_sjis = {
} \
} while (0)
-
-/*
- * SJIS => wchar
- */
-int
-mbfl_filt_conv_sjis_wchar(int c, mbfl_convert_filter *filter)
+int mbfl_filt_conv_sjis_wchar(int c, mbfl_convert_filter *filter)
{
- int c1, s1, s2, w;
+ int s1, s2, w;
switch (filter->status) {
case 0:
- if (c >= 0 && c < 0x80) { /* latin */
+ if (c == 0x5C) {
+ CK((*filter->output_function)(0xA5, filter->data));
+ } else if (c == 0x7E) {
+ CK((*filter->output_function)(0x203E, filter->data));
+ } else if (c >= 0 && c < 0x80) { /* ASCII */
CK((*filter->output_function)(c, filter->data));
- } else if (c > 0xa0 && c < 0xe0) { /* kana */
- CK((*filter->output_function)(0xfec0 + c, filter->data));
- } else if (c > 0x80 && c < 0xfd && c != 0xa0) { /* kanji first char */
+ } else if (c > 0xA0 && c < 0xE0) { /* Kana */
+ CK((*filter->output_function)(0xFEC0 + c, filter->data));
+ } else if (c > 0x80 && c < 0xF0 && c != 0xA0) { /* Kanji, first byte */
filter->status = 1;
filter->cache = c;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(w, filter->data));
+ CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data));
}
break;
- case 1: /* kanji second char */
+ case 1: /* Kanji, second byte */
filter->status = 0;
- c1 = filter->cache;
- if (c >= 0x40 && c <= 0xfc && c != 0x7f) {
+ int c1 = filter->cache;
+ if (c >= 0x40 && c <= 0xFC && c != 0x7F) {
SJIS_DECODE(c1, c, s1, s2);
w = (s1 - 0x21)*94 + s2 - 0x21;
if (w >= 0 && w < jisx0208_ucs_table_size) {
@@ -178,45 +169,51 @@ mbfl_filt_conv_sjis_wchar(int c, mbfl_convert_filter *filter)
w = 0;
}
if (w <= 0) {
- if (s1 < 0x7f && s2 < 0x7f) {
- w = (s1 << 8) | s2;
- w &= MBFL_WCSPLANE_MASK;
- w |= MBFL_WCSPLANE_JIS0208;
+ if (s1 < 0x7F && s2 < 0x7F) {
+ w = (s1 << 8) | s2 | MBFL_WCSPLANE_JIS0208;
} else {
- w = (c1 << 8) | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = (c1 << 8) | c | MBFL_WCSGROUP_THROUGH;
}
}
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = (c1 << 8) | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = (c1 << 8) | c | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
- break;
-
- default:
- filter->status = 0;
- break;
}
return c;
}
-/*
- * wchar => SJIS
- */
-int
-mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter)
+static int mbfl_filt_conv_sjis_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status) {
+ mbfl_filt_conv_illegal_output(filter->cache, filter);
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
+
+int mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter)
{
int c1, c2, s1, s2;
s1 = 0;
- if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
+ if (c == 0x5C) {
+ /* Unicode 0x5C is a backslash; but Shift-JIS uses 0x5C for the
+ * Yen sign. JIS X 0208 kuten 0x2140 is a backslash. */
+ s1 = 0x2140;
+ } else if (c == 0x7E) {
+ /* Unicode 0x7E is a tilde, but Shift-JIS uses 0x7E for overline (or
+ * macron). JIS X 0208 kuten 0x2141 is 'WAVE DASH' */
+ s1 = 0x2141;
+ } else if (c == 0xAF || c == 0x203E) { /* U+00AF is MACRON, U+203E is OVERLINE */
+ s1 = 0x7E; /* Halfwidth overline/macron */
+ } else if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
s1 = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
} else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
s1 = ucs_a2_jis_table[c - ucs_a2_jis_table_min];
@@ -226,42 +223,37 @@ mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter)
s1 = ucs_r_jis_table[c - ucs_r_jis_table_min];
}
if (s1 <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_JIS0208) {
- s1 = c & MBFL_WCSPLANE_MASK;
- } else if (c == 0xa5) { /* YEN SIGN */
- s1 = 0x216f; /* FULLWIDTH YEN SIGN */
- } else if (c == 0x203e) { /* OVER LINE */
- s1 = 0x2131; /* FULLWIDTH MACRON */
- } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
+ if (c == 0xA5) { /* YEN SIGN */
+ s1 = 0x5C;
+ } else if (c == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */
s1 = 0x2140;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
+ } else if (c == 0xFF5E) { /* FULLWIDTH TILDE */
s1 = 0x2141;
- } else if (c == 0x2225) { /* PARALLEL TO */
+ } else if (c == 0x2225) { /* PARALLEL TO */
s1 = 0x2142;
- } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
- s1 = 0x215d;
- } else if (c == 0xffe0) { /* FULLWIDTH CENT SIGN */
+ } else if (c == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */
+ s1 = 0x215D;
+ } else if (c == 0xFFE0) { /* FULLWIDTH CENT SIGN */
s1 = 0x2171;
- } else if (c == 0xffe1) { /* FULLWIDTH POUND SIGN */
+ } else if (c == 0xFFE1) { /* FULLWIDTH POUND SIGN */
s1 = 0x2172;
- } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */
- s1 = 0x224c;
- }
- if (c == 0) {
+ } else if (c == 0xFFE2) { /* FULLWIDTH NOT SIGN */
+ s1 = 0x224C;
+ } else if (c == 0) {
s1 = 0;
- } else if (s1 <= 0) {
+ } else {
s1 = -1;
}
- } else if (s1 >= 0x8080) {
+ } else if (s1 >= 0x8080) { /* JIS X 0212; not supported */
s1 = -1;
}
+
if (s1 >= 0) {
- if (s1 < 0x100) { /* latin or kana */
+ if (s1 < 0x100) { /* Latin/Kana */
CK((*filter->output_function)(s1, filter->data));
- } else { /* kanji */
- c1 = (s1 >> 8) & 0xff;
- c2 = s1 & 0xff;
+ } else { /* Kanji */
+ c1 = (s1 >> 8) & 0xFF;
+ c2 = s1 & 0xFF;
SJIS_ENCODE(c1, c2, s1, s2);
CK((*filter->output_function)(s1, filter->data));
CK((*filter->output_function)(s2, filter->data));
@@ -272,23 +264,3 @@ mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter)
return c;
}
-
-int mbfl_filt_ident_sjis(int c, mbfl_identify_filter *filter)
-{
- if (filter->status) { /* kanji second char */
- if (c < 0x40 || c > 0xfc || c == 0x7f) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- } else if (c >= 0 && c < 0x80) { /* latin ok */
- ;
- } else if (c > 0xa0 && c < 0xe0) { /* kana ok */
- ;
- } else if (c > 0x80 && c < 0xf0 && c != 0xa0) { /* kanji first char */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis.h b/ext/mbstring/libmbfl/filters/mbfilter_sjis.h
index f271f399c9..b0689fce64 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_sjis;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis;
extern const struct mbfl_convert_vtbl vtbl_sjis_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_sjis;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c
index 04e1d3af17..8d4d3e9d84 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c
@@ -35,7 +35,6 @@
extern const unsigned char mblen_table_sjis[];
-extern int mbfl_filt_ident_sjis(int c, mbfl_identify_filter *filter);
extern int mbfl_bisec_srch(int w, const unsigned short *tbl, int n);
extern int mbfl_bisec_srch2(int w, const unsigned short tbl[], int n);
@@ -45,26 +44,20 @@ const mbfl_encoding mbfl_encoding_sjis2004 = {
mbfl_no_encoding_sjis2004,
"SJIS-2004",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis2004_aliases,
+ mbfl_encoding_sjis2004_aliases,
mblen_table_sjis,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis2004_wchar,
&vtbl_wchar_sjis2004
};
-const struct mbfl_identify_vtbl vtbl_identify_sjis2004 = {
- mbfl_no_encoding_sjis2004,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
const struct mbfl_convert_vtbl vtbl_sjis2004_wchar = {
mbfl_no_encoding_sjis2004,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_jis2004_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_jis2004_wchar_flush,
NULL,
};
@@ -74,7 +67,7 @@ const struct mbfl_convert_vtbl vtbl_wchar_sjis2004 = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_wchar_jis2004,
- mbfl_filt_conv_jis2004_flush,
+ mbfl_filt_conv_wchar_jis2004_flush,
NULL,
};
@@ -209,10 +202,18 @@ retry:
} else if (filter->from->no_encoding == mbfl_no_encoding_sjis2004) {
if (c >= 0x40 && c <= 0xfc && c != 0x7f) {
SJIS_DECODE(c1, c, s1, s2);
+ } else {
+ CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data));
+ break;
+ }
+ } else { /* ISO-2022-JP-2004 */
+ if (c >= 0x21 && c <= 0x7E) {
+ s1 = c1;
+ s2 = c;
+ } else {
+ CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data));
+ break;
}
- } else {
- s1 = c1;
- s2 = c;
}
w1 = (s1 << 8) | s2;
@@ -320,6 +321,13 @@ retry:
} else {
c2 = c;
}
+
+ if (c2 < 0x21 || c2 > 0x7E) {
+ w = (c1 << 8) | c2 | MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(w, filter->data));
+ break;
+ }
+
s1 = c1 - 0x21;
s2 = c2 - 0x21;
@@ -405,7 +413,7 @@ retry:
filter->status += 3;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
goto retry;
}
break;
@@ -424,7 +432,7 @@ retry:
filter->status++;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
CK((*filter->output_function)(0x24, filter->data));
goto retry;
}
@@ -446,7 +454,7 @@ retry:
filter->status = 0xa0;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
CK((*filter->output_function)(0x24, filter->data));
CK((*filter->output_function)(0x28, filter->data));
goto retry;
@@ -464,7 +472,7 @@ retry:
filter->status = 0;
} else {
filter->status &= ~0xf;
- CK((*filter->output_function)(0x1b, filter->data));
+ CK((*filter->output_function)(0x1b | MBFL_WCSGROUP_THROUGH, filter->data));
CK((*filter->output_function)(0x28, filter->data));
goto retry;
}
@@ -478,13 +486,21 @@ retry:
return c;
}
-int
-mbfl_filt_conv_wchar_jis2004(int c, mbfl_convert_filter *filter) {
+int mbfl_filt_conv_jis2004_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status & 0xF) {
+ CK((*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data));
+ }
+ return 0;
+}
+
+int mbfl_filt_conv_wchar_jis2004(int c, mbfl_convert_filter *filter)
+{
int k;
- int c1, c2, s1 = 0, s2;
+ int c1, c2, s1, s2;
retry:
-
+ s1 = 0;
/* check for 1st char of combining characters */
if ((filter->status & 0xf)== 0 && (
c == 0x00E6 ||
@@ -544,6 +560,12 @@ retry:
}
}
+ if (s1 <= 0 && filter->to->no_encoding == mbfl_no_encoding_2022jp_2004 && (c == 0x5C || c == 0x7E)) {
+ /* ISO-2022-JP-2004 can represent ASCII characters directly, so there is no need
+ * to use the JIS X 0208 REVERSE SOLIDUS for ASCII backslash, or WAVE DASH for tilde */
+ s1 = c;
+ }
+
/* check for major japanese chars: U+4E00 - U+9FFF */
if (s1 <= 0) {
for (k=0; k < uni2jis_tbl_len ;k++) {
@@ -586,10 +608,6 @@ retry:
}
if (s1 <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_JIS0213) {
- s1 = c & MBFL_WCSPLANE_MASK;
- }
if (c == 0) {
s1 = 0;
} else if (s1 <= 0) {
@@ -672,7 +690,7 @@ retry:
}
int
-mbfl_filt_conv_jis2004_flush(mbfl_convert_filter *filter)
+mbfl_filt_conv_wchar_jis2004_flush(mbfl_convert_filter *filter)
{
int k, c1, c2, s1, s2;
@@ -705,7 +723,9 @@ mbfl_filt_conv_jis2004_flush(mbfl_convert_filter *filter)
CK((*filter->output_function)(s2, filter->data));
}
- /* back to latin */
+ /* If we had switched to a different charset, go back to ASCII mode
+ * This makes it possible to concatenate arbitrary valid strings
+ * together and get a valid string */
if ((filter->status & 0xff00) != 0) {
CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
CK((*filter->output_function)(0x28, filter->data)); /* '(' */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.h b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.h
index c75e3a910b..869fd145c1 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.h
@@ -33,14 +33,14 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_sjis2004;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis2004;
extern const struct mbfl_convert_vtbl vtbl_sjis2004_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_sjis2004;
int mbfl_filt_conv_jis2004_wchar(int c, mbfl_convert_filter *filter);
int mbfl_filt_conv_wchar_jis2004(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_jis2004_flush(mbfl_convert_filter *filter);
+int mbfl_filt_conv_wchar_jis2004_flush(mbfl_convert_filter *filter);
+int mbfl_filt_conv_jis2004_wchar_flush(mbfl_convert_filter *filter);
#endif /* MBFL_MBFILTER_SJIS_2004_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c
index dc3d3692f4..12e5cdca8f 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c
@@ -35,10 +35,10 @@
#include "sjis_mac2uni.h"
-extern int mbfl_filt_ident_sjis(int c, mbfl_identify_filter *filter);
extern const unsigned char mblen_table_sjis[];
-static int mbfl_filt_conv_sjis_mac_flush(mbfl_convert_filter *filter);
+static int mbfl_filt_conv_wchar_sjis_mac_flush(mbfl_convert_filter *filter);
+static int mbfl_filt_conv_sjis_mac_wchar_flush(mbfl_convert_filter *filter);
static const char *mbfl_encoding_sjis_mac_aliases[] = {"MacJapanese", "x-Mac-Japanese", NULL};
@@ -46,26 +46,20 @@ const mbfl_encoding mbfl_encoding_sjis_mac = {
mbfl_no_encoding_sjis_mac,
"SJIS-mac",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_mac_aliases,
+ mbfl_encoding_sjis_mac_aliases,
mblen_table_sjis,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_mac_wchar,
&vtbl_wchar_sjis_mac
};
-const struct mbfl_identify_vtbl vtbl_identify_sjis_mac = {
- mbfl_no_encoding_sjis_mac,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
const struct mbfl_convert_vtbl vtbl_sjis_mac_wchar = {
mbfl_no_encoding_sjis_mac,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_sjis_mac_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_sjis_mac_wchar_flush,
NULL,
};
@@ -75,7 +69,7 @@ const struct mbfl_convert_vtbl vtbl_wchar_sjis_mac = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_wchar_sjis_mac,
- mbfl_filt_conv_sjis_mac_flush,
+ mbfl_filt_conv_wchar_sjis_mac_flush,
NULL,
};
@@ -139,7 +133,7 @@ mbfl_filt_conv_sjis_mac_wchar(int c, mbfl_convert_filter *filter)
CK((*filter->output_function)(c, filter->data));
} else if (c > 0xa0 && c < 0xe0) { /* kana */
CK((*filter->output_function)(0xfec0 + c, filter->data));
- } else if (c > 0x80 && c < 0xfd && c != 0xa0) { /* kanji first char */
+ } else if (c > 0x80 && c <= 0xed && c != 0xa0) { /* kanji first char */
filter->status = 1;
filter->cache = c;
} else if (c == 0x5c) {
@@ -223,6 +217,10 @@ mbfl_filt_conv_sjis_mac_wchar(int c, mbfl_convert_filter *filter)
for (i=0; i<8; i++) {
if (s >= code_ofst_tbl[i][0] && s <= code_ofst_tbl[i][1]) {
w = code_map[i][s - code_ofst_tbl[i][0]];
+ if (w == 0) {
+ CK((*filter->output_function)((c1 << 8) | c | MBFL_WCSGROUP_THROUGH, filter->data));
+ return c;
+ }
s2 = 0;
if (s >= 0x043e && s <= 0x0441) {
s2 = 0xf87a;
@@ -254,8 +252,6 @@ mbfl_filt_conv_sjis_mac_wchar(int c, mbfl_convert_filter *filter)
w |= MBFL_WCSPLANE_WINCP932;
}
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
w = (c1 << 8) | c;
w &= MBFL_WCSGROUP_MASK;
@@ -272,6 +268,15 @@ mbfl_filt_conv_sjis_mac_wchar(int c, mbfl_convert_filter *filter)
return c;
}
+static int mbfl_filt_conv_sjis_mac_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status == 1) {
+ int w = (filter->cache & MBFL_WCSGROUP_MASK) | MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(w, filter->data));
+ }
+ return 0;
+}
+
/*
* wchar => SJIS-mac
*/
@@ -367,6 +372,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter)
if (s2 <= 0 || s1 == -1) {
break;
}
+ s1 = s2 = 0;
case 0:
@@ -402,6 +408,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter)
}
if (c == 0xf860 || c == 0xf861 || c == 0xf862) {
+ /* Apple 'transcoding hint' codepoints (from private use area) */
filter->status = 2;
filter->cache = c;
return c;
@@ -409,19 +416,12 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter)
}
if (s1 <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_WINCP932) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s2 = 1;
- } else if (c1 == MBFL_WCSPLANE_JIS0208) {
- s1 = c & MBFL_WCSPLANE_MASK;
- } else if (c1 == MBFL_WCSPLANE_JIS0212) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s1 |= 0x8080;
- } else if (c == 0xa0) {
+ if (c == 0xa0) {
s1 = 0x00a0;
- } else if (c == 0xa5) { /* YEN SIGN */
- s1 = 0x216f; /* FULLWIDTH YEN SIGN */
+ } else if (c == 0xa5) { /* YEN SIGN */
+ /* Unicode has codepoint 0xFFE5 for a fullwidth Yen sign;
+ * convert codepoint 0xA5 to halfwidth Yen sign */
+ s1 = 0x5c; /* HALFWIDTH YEN SIGN */
} else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
s1 = 0x2140;
}
@@ -519,8 +519,9 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter)
}
if (filter->status == 0) {
+ /* Didn't find any of expected codepoints after Apple transcoding hint */
CK(mbfl_filt_conv_illegal_output(c1, filter));
- CK(mbfl_filt_conv_illegal_output(c, filter));
+ return mbfl_filt_conv_wchar_sjis_mac(c, filter);
}
break;
@@ -667,7 +668,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter)
}
static int
-mbfl_filt_conv_sjis_mac_flush(mbfl_convert_filter *filter)
+mbfl_filt_conv_wchar_sjis_mac_flush(mbfl_convert_filter *filter)
{
int i, c1, s1 = 0;
if (filter->status == 1 && filter->cache > 0) {
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.h b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.h
index f4b2adfeac..970d14a4c9 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.h
@@ -33,8 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_sjis_mac;
-
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis_mac;
extern const struct mbfl_convert_vtbl vtbl_sjis_mac_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_sjis_mac;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c
index 68084a0e0a..34acccbc2d 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c
@@ -36,120 +36,103 @@
#include "emoji2uni.h"
extern int mbfl_bisec_srch2(int w, const unsigned short tbl[], int n);
-extern int mbfl_filt_ident_sjis(int c, mbfl_identify_filter *filter);
extern const unsigned char mblen_table_sjis[];
+static int mbfl_filt_conv_sjis_wchar_flush(mbfl_convert_filter *filter);
+
static const char *mbfl_encoding_sjis_docomo_aliases[] = {"SJIS-DOCOMO", "shift_jis-imode", "x-sjis-emoji-docomo", NULL};
static const char *mbfl_encoding_sjis_kddi_aliases[] = {"SJIS-KDDI", "shift_jis-kddi", "x-sjis-emoji-kddi", NULL};
static const char *mbfl_encoding_sjis_sb_aliases[] = {"SJIS-SOFTBANK", "shift_jis-softbank", "x-sjis-emoji-softbank", NULL};
const mbfl_encoding mbfl_encoding_sjis_docomo = {
- mbfl_no_encoding_sjis_docomo,
- "SJIS-Mobile#DOCOMO",
- "Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_docomo_aliases,
+ mbfl_no_encoding_sjis_docomo,
+ "SJIS-Mobile#DOCOMO",
+ "Shift_JIS",
+ mbfl_encoding_sjis_docomo_aliases,
mblen_table_sjis,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_docomo_wchar,
&vtbl_wchar_sjis_docomo
};
const mbfl_encoding mbfl_encoding_sjis_kddi = {
- mbfl_no_encoding_sjis_kddi,
- "SJIS-Mobile#KDDI",
- "Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_kddi_aliases,
+ mbfl_no_encoding_sjis_kddi,
+ "SJIS-Mobile#KDDI",
+ "Shift_JIS",
+ mbfl_encoding_sjis_kddi_aliases,
mblen_table_sjis,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_kddi_wchar,
&vtbl_wchar_sjis_kddi
};
const mbfl_encoding mbfl_encoding_sjis_sb = {
- mbfl_no_encoding_sjis_sb,
- "SJIS-Mobile#SOFTBANK",
- "Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_sb_aliases,
+ mbfl_no_encoding_sjis_sb,
+ "SJIS-Mobile#SOFTBANK",
+ "Shift_JIS",
+ mbfl_encoding_sjis_sb_aliases,
mblen_table_sjis,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_sb_wchar,
&vtbl_wchar_sjis_sb
};
-const struct mbfl_identify_vtbl vtbl_identify_sjis_docomo = {
- mbfl_no_encoding_sjis_docomo,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_sjis_kddi = {
- mbfl_no_encoding_sjis_kddi,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_sjis_sb = {
- mbfl_no_encoding_sjis_sb,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
const struct mbfl_convert_vtbl vtbl_sjis_docomo_wchar = {
- mbfl_no_encoding_sjis_docomo,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
+ mbfl_no_encoding_sjis_docomo,
+ mbfl_no_encoding_wchar,
+ mbfl_filt_conv_common_ctor,
+ NULL,
+ mbfl_filt_conv_sjis_mobile_wchar,
+ mbfl_filt_conv_sjis_wchar_flush,
NULL,
- mbfl_filt_conv_sjis_mobile_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
};
const struct mbfl_convert_vtbl vtbl_wchar_sjis_docomo = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_sjis_docomo,
- mbfl_filt_conv_common_ctor,
+ mbfl_no_encoding_wchar,
+ mbfl_no_encoding_sjis_docomo,
+ mbfl_filt_conv_common_ctor,
+ NULL,
+ mbfl_filt_conv_wchar_sjis_mobile,
+ mbfl_filt_conv_sjis_mobile_flush,
NULL,
- mbfl_filt_conv_wchar_sjis_mobile,
- mbfl_filt_conv_sjis_mobile_flush,
- NULL,
};
const struct mbfl_convert_vtbl vtbl_sjis_kddi_wchar = {
- mbfl_no_encoding_sjis_kddi,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
+ mbfl_no_encoding_sjis_kddi,
+ mbfl_no_encoding_wchar,
+ mbfl_filt_conv_common_ctor,
+ NULL,
+ mbfl_filt_conv_sjis_mobile_wchar,
+ mbfl_filt_conv_sjis_wchar_flush,
NULL,
- mbfl_filt_conv_sjis_mobile_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
};
const struct mbfl_convert_vtbl vtbl_wchar_sjis_kddi = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_sjis_kddi,
- mbfl_filt_conv_common_ctor,
+ mbfl_no_encoding_wchar,
+ mbfl_no_encoding_sjis_kddi,
+ mbfl_filt_conv_common_ctor,
NULL,
- mbfl_filt_conv_wchar_sjis_mobile,
+ mbfl_filt_conv_wchar_sjis_mobile,
mbfl_filt_conv_sjis_mobile_flush,
NULL,
};
const struct mbfl_convert_vtbl vtbl_sjis_sb_wchar = {
- mbfl_no_encoding_sjis_sb,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
+ mbfl_no_encoding_sjis_sb,
+ mbfl_no_encoding_wchar,
+ mbfl_filt_conv_common_ctor,
+ NULL,
+ mbfl_filt_conv_sjis_mobile_wchar,
+ mbfl_filt_conv_sjis_wchar_flush,
NULL,
- mbfl_filt_conv_sjis_mobile_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
};
const struct mbfl_convert_vtbl vtbl_wchar_sjis_sb = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_sjis_sb,
- mbfl_filt_conv_common_ctor,
+ mbfl_no_encoding_wchar,
+ mbfl_no_encoding_sjis_sb,
+ mbfl_filt_conv_common_ctor,
NULL,
- mbfl_filt_conv_wchar_sjis_mobile,
+ mbfl_filt_conv_wchar_sjis_mobile,
mbfl_filt_conv_sjis_mobile_flush,
NULL,
};
@@ -195,467 +178,431 @@ const unsigned short mbfl_kddi2uni_pua_b[8][3] = {
{0x27e7, 0x2863, 0xf080},
};
+/* Regional Indicator Unicode codepoints are from 0x1F1E6-0x1F1FF
+ * These correspond to the letters A-Z
+ * To display the flag emoji for a country, two unicode codepoints are combined,
+ * which correspond to the two-letter code for that country
+ * This macro converts uppercase ASCII values to Regional Indicator codepoints */
#define NFLAGS(c) (0x1F1A5+(int)(c))
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-#define SJIS_ENCODE(c1,c2,s1,s2) \
- do { \
- s1 = c1; \
- s1--; \
- s1 >>= 1; \
- if ((c1) < 0x5f) { \
- s1 += 0x71; \
- } else { \
- s1 += 0xb1; \
- } \
- s2 = c2; \
- if ((c1) & 1) { \
- if ((c2) < 0x60) { \
- s2--; \
- } \
- s2 += 0x20; \
- } else { \
- s2 += 0x7e; \
- } \
+#define SJIS_ENCODE(c1,c2,s1,s2) \
+ do { \
+ s1 = ((c1 - 1) >> 1) + ((c1) < 0x5F ? 0x71 : 0xB1); \
+ s2 = c2; \
+ if ((c1) & 1) { \
+ if ((c2) < 0x60) { \
+ s2--; \
+ } \
+ s2 += 0x20; \
+ } else { \
+ s2 += 0x7e; \
+ } \
} while (0)
-#define SJIS_DECODE(c1,c2,s1,s2) \
- do { \
- s1 = c1; \
- if (s1 < 0xa0) { \
- s1 -= 0x81; \
- } else { \
- s1 -= 0xc1; \
- } \
- s1 <<= 1; \
- s1 += 0x21; \
- s2 = c2; \
- if (s2 < 0x9f) { \
- if (s2 < 0x7f) { \
- s2++; \
- } \
- s2 -= 0x20; \
- } else { \
- s1++; \
- s2 -= 0x7e; \
- } \
+#define SJIS_DECODE(c1,c2,s1,s2) \
+ do { \
+ if (c1 < 0xa0) { \
+ s1 = ((c1 - 0x81) << 1) + 0x21; \
+ } else { \
+ s1 = ((c1 - 0xc1) << 1) + 0x21; \
+ } \
+ s2 = c2; \
+ if (c2 < 0x9f) { \
+ if (c2 < 0x7f) { \
+ s2++; \
+ } \
+ s2 -= 0x20; \
+ } else { \
+ s1++; \
+ s2 -= 0x7e; \
+ } \
} while (0)
-#define CODE2JIS(c1,c2,s1,s2) \
- c1 = (s1)/94+0x21; \
- c2 = (s1)-94*((c1)-0x21)+0x21; \
- s1 = ((c1) << 8) | (c2); \
+/* (ku*94)+ten value -> Shift-JIS byte sequence */
+#define CODE2JIS(c1,c2,s1,s2) \
+ c1 = (s1)/94+0x21; \
+ c2 = (s1)-94*((c1)-0x21)+0x21; \
+ s1 = ((c1) << 8) | (c2); \
s2 = 1
-int
-mbfilter_conv_map_tbl(int c, int *w, const unsigned short map[][3], int n)
+int mbfilter_conv_map_tbl(int c, int *w, const unsigned short map[][3], int n)
{
- int i, match = 0;
-
- for (i = 0; i < n; i++) {
+ for (int i = 0; i < n; i++) {
if (map[i][0] <= c && c <= map[i][1]) {
*w = c - map[i][0] + map[i][2];
- match = 1;
- break;
+ return 1;
}
}
- return match;
+ return 0;
}
-int
-mbfilter_conv_r_map_tbl(int c, int *w, const unsigned short map[][3], int n)
+int mbfilter_conv_r_map_tbl(int c, int *w, const unsigned short map[][3], int n)
{
- int i, match = 0;
-
- for (i = 0; i < n; i++) {
+ /* Convert in reverse direction */
+ for (int i = 0; i < n; i++) {
if (map[i][2] <= c && c <= map[i][2] - map[i][0] + map[i][1]) {
*w = c + map[i][0] - map[i][2];
- match = 1;
- break;
+ return 1;
}
}
- return match;
+ return 0;
}
-int
-mbfilter_sjis_emoji_docomo2unicode(int s, int *snd)
+/* number -> (ku*94)+ten value for telephone keypad character */
+#define DOCOMO_KEYPAD(n) ((n) == 0 ? 0x296F : (0x2965 + (n)))
+#define DOCOMO_KEYPAD_HASH 0x2964
+
+#define EMIT_KEYPAD_EMOJI(c) do { *snd = (c); return 0x20E3; } while(0)
+
+/* Unicode codepoints for emoji are above 0x1F000, but we only store 16-bits
+ * in our tables. Therefore, add 0x10000 to recover the true values.
+ *
+ * Again, for some emoji which are not supported by Unicode, we use codepoints
+ * in the Private Use Area above 0xFE000. Again, add 0xF0000 to recover the
+ * true value. */
+static inline int convert_emoji_cp(int cp)
{
- int w = s;
+ if (cp > 0xF000)
+ return cp + 0x10000;
+ else if (cp > 0xE000)
+ return cp + 0xF0000;
+ return cp;
+}
+
+int mbfilter_sjis_emoji_docomo2unicode(int s, int *snd)
+{
+ /* All three mobile vendors had emoji for numbers on a telephone keypad
+ * Unicode doesn't have those, but it has a combining character which puts
+ * a 'keypad button' around the following character, making it look like
+ * a key on a telephone or keyboard. That combining char is codepoint 0x20E3. */
if (s >= mb_tbl_code2uni_docomo1_min && s <= mb_tbl_code2uni_docomo1_max) {
- if (s >= mb_tbl_code2uni_docomo1_min + 0x00a2 &&
- s <= mb_tbl_code2uni_docomo1_min + 0x00ad &&
- s != mb_tbl_code2uni_docomo1_min + 0x00a3) {
- w = 0x20E3;
- *snd = mb_tbl_code2uni_docomo1[s - mb_tbl_code2uni_docomo1_min];
- if (*snd > 0xf000) {
- *snd += 0x10000;
- }
+ if ((s >= DOCOMO_KEYPAD(1) && s <= DOCOMO_KEYPAD(9)) || s == DOCOMO_KEYPAD(0) || s == DOCOMO_KEYPAD_HASH) {
+ EMIT_KEYPAD_EMOJI(convert_emoji_cp(mb_tbl_code2uni_docomo1[s - mb_tbl_code2uni_docomo1_min]));
} else {
- w = mb_tbl_code2uni_docomo1[s - mb_tbl_code2uni_docomo1_min];
- if (w > 0xf000) {
- w += 0x10000;
- } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */
- w += 0xf0000;
- }
*snd = 0;
- if (!w) {
- w = s;
- }
+ return convert_emoji_cp(mb_tbl_code2uni_docomo1[s - mb_tbl_code2uni_docomo1_min]);
}
}
-
- return w;
+ return 0;
}
-int
-mbfilter_sjis_emoji_kddi2unicode(int s, int *snd)
-{
- int w = s, si, c;
- const int nflags_order_kddi[] = {3, 1, 5, 4, 0, 7};
+#define EMIT_FLAG_EMOJI(country) do { *snd = NFLAGS((country)[0]); return NFLAGS((country)[1]); } while(0)
+
+static const char nflags_kddi[6][2] = {"FR", "DE", "IT", "GB", "CN", "KR"};
- *snd = 0;
+int mbfilter_sjis_emoji_kddi2unicode(int s, int *snd)
+{
if (s >= mb_tbl_code2uni_kddi1_min && s <= mb_tbl_code2uni_kddi1_max) {
- si = s - mb_tbl_code2uni_kddi1_min;
- if (si == 0x0008) { /* ES */
- *snd = NFLAGS(nflags_s[2][0]); w = NFLAGS(nflags_s[2][1]);
- } else if (si == 0x0009) { /* RU */
- *snd = NFLAGS(nflags_s[8][0]); w = NFLAGS(nflags_s[8][1]);
- } else if (si >= 0x008d && si <= 0x0092) {
- c = nflags_order_kddi[si-0x008d];
- *snd = NFLAGS(nflags_s[c][0]); w = NFLAGS(nflags_s[c][1]);
- } else if (si == 0x0104) {
- *snd = 0x0023; w = 0x20E3;
+ if (s == 0x24C0) { /* Spain */
+ EMIT_FLAG_EMOJI("ES");
+ } else if (s == 0x24C1) { /* Russia */
+ EMIT_FLAG_EMOJI("RU");
+ } else if (s >= 0x2545 && s <= 0x254A) {
+ EMIT_FLAG_EMOJI(nflags_kddi[s - 0x2545]);
+ } else if (s == 0x25BC) {
+ EMIT_KEYPAD_EMOJI('#');
} else {
- w = mb_tbl_code2uni_kddi1[si];
- if (w > 0xf000) {
- w += 0x10000;
- } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */
- w += 0xf0000;
- }
+ *snd = 0;
+ return convert_emoji_cp(mb_tbl_code2uni_kddi1[s - mb_tbl_code2uni_kddi1_min]);
}
} else if (s >= mb_tbl_code2uni_kddi2_min && s <= mb_tbl_code2uni_kddi2_max) {
- si = s - mb_tbl_code2uni_kddi2_min;
- if (si == 100) { /* JP */
- *snd = NFLAGS(nflags_s[6][0]); w = NFLAGS(nflags_s[6][1]);
- } else if (si >= 0x00ba && si <= 0x00c2) {
- *snd = si-0x00ba+0x0031; w = 0x20E3;
- } else if (si == 0x010b) { /* US */
- *snd = NFLAGS(nflags_s[9][0]); w = NFLAGS(nflags_s[9][1]);
- } else if (si == 0x0144) {
- *snd = 0x0030; w = 0x20E3;
+ if (s == 0x2750) { /* Japan */
+ EMIT_FLAG_EMOJI("JP");
+ } else if (s >= 0x27A6 && s <= 0x27AE) {
+ EMIT_KEYPAD_EMOJI(s - 0x27A6 + '1');
+ } else if (s == 0x27F7) { /* United States */
+ EMIT_FLAG_EMOJI("US");
+ } else if (s == 0x2830) {
+ EMIT_KEYPAD_EMOJI('0');
} else {
- w = mb_tbl_code2uni_kddi2[si];
- if (w > 0xf000) {
- w += 0x10000;
- } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */
- w += 0xf0000;
- }
+ *snd = 0;
+ return convert_emoji_cp(mb_tbl_code2uni_kddi2[s - mb_tbl_code2uni_kddi2_min]);
}
}
- return w;
+ return 0;
}
-int
-mbfilter_sjis_emoji_sb2unicode(int s, int *snd)
+static const char nflags_sb[10][2] = {"JP", "US", "FR", "DE", "IT", "GB", "ES", "RU", "CN", "KR"};
+
+int mbfilter_sjis_emoji_sb2unicode(int s, int *snd)
{
- int w = s, si, c;
- const int nflags_order_sb[10] = {6, 9, 3, 1, 5, 4, 2, 8, 0, 7};
-
- *snd = 0;
- if (s >= mb_tbl_code2uni_sb1_min && s <= mb_tbl_code2uni_sb1_max) {
- si = s - mb_tbl_code2uni_sb1_min;
- if (si == 0x006e || (si >= 0x007a && si <= 0x0083)) {
- *snd = mb_tbl_code2uni_sb1[si];
- if (*snd > 0xf000) {
- *snd += 0x10000;
- }
- w = 0x20E3;
+ if (s >= mb_tbl_code2uni_sb1_min && s <= mb_tbl_code2uni_sb1_max) {
+ if (s == 0x2817 || (s >= 0x2823 && s <= 0x282C)) {
+ EMIT_KEYPAD_EMOJI(mb_tbl_code2uni_sb1[s - mb_tbl_code2uni_sb1_min]);
} else {
- w = mb_tbl_code2uni_sb1[si];
- if (w > 0xf000) {
- w += 0x10000;
- } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */
- w += 0xf0000;
- }
+ *snd = 0;
+ return convert_emoji_cp(mb_tbl_code2uni_sb1[s - mb_tbl_code2uni_sb1_min]);
}
} else if (s >= mb_tbl_code2uni_sb2_min && s <= mb_tbl_code2uni_sb2_max) {
- si = s - mb_tbl_code2uni_sb2_min;
- w = mb_tbl_code2uni_sb2[si];
- if (w > 0xf000) {
- w += 0x10000;
- } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */
- w += 0xf0000;
- }
+ *snd = 0;
+ return convert_emoji_cp(mb_tbl_code2uni_sb2[s - mb_tbl_code2uni_sb2_min]);
} else if (s >= mb_tbl_code2uni_sb3_min && s <= mb_tbl_code2uni_sb3_max) {
- si = s - mb_tbl_code2uni_sb3_min;
- if (si >= 0x0069 && si <= 0x0072) {
- c = nflags_order_sb[si-0x0069];
- *snd = NFLAGS(nflags_s[c][0]); w = NFLAGS(nflags_s[c][1]);
+ if (s >= 0x2B02 && s <= 0x2B0B) {
+ EMIT_FLAG_EMOJI(nflags_sb[s - 0x2B02]);
} else {
- w = mb_tbl_code2uni_sb3[si];
- if (w > 0xf000) {
- w += 0x10000;
- } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */
- w += 0xf0000;
- }
+ *snd = 0;
+ return convert_emoji_cp(mb_tbl_code2uni_sb3[s - mb_tbl_code2uni_sb3_min]);
}
}
- return w;
+ return 0;
}
int
mbfilter_unicode2sjis_emoji_docomo(int c, int *s1, mbfl_convert_filter *filter)
{
- int i, match = 0, c1s;
-
+ /* When converting SJIS-Mobile to Unicode, we convert keypad symbol emoji
+ * to a sequence of 2 codepoints, one of which is a combining character which
+ * adds the 'key' image around the other
+ *
+ * In the other direction, look for such sequences and convert them to a
+ * single emoji */
if (filter->status == 1) {
- c1s = filter->cache;
- filter->cache = 0;
- filter->status = 0;
+ int c1 = filter->cache;
+ filter->cache = filter->status = 0;
if (c == 0x20E3) {
- if (c1s == 0x0023) {
+ if (c1 == '#') {
*s1 = 0x2964;
- match = 1;
- } else if (c1s == 0x0030) {
- *s1 = 0x296f;
- match = 1;
- } else if (c1s >= 0x0031 && c1s <= 0x0039) {
- *s1 = 0x2966 + (c1s - 0x0031);
- match = 1;
+ } else if (c1 == '0') {
+ *s1 = 0x296F;
+ } else { /* Previous character was '1'-'9' */
+ *s1 = 0x2966 + (c1 - '1');
}
+ return 1;
} else {
- CK((*filter->output_function)(c1s, filter->data));
- }
- } else {
- if (c == 0x0023 || (c >= 0x0030 && c<=0x0039)) {
- filter->status = 1;
- filter->cache = c;
- *s1 = -1;
- return match;
- }
-
- if (c == 0x00A9) {
- *s1 = 0x29b5; match = 1;
- } else if (c == 0x00AE) {
- *s1 = 0x29ba; match = 1;
- } else if (c >= mb_tbl_uni_docomo2code2_min && c <= mb_tbl_uni_docomo2code2_max) {
- i = mbfl_bisec_srch2(c, mb_tbl_uni_docomo2code2_key, mb_tbl_uni_docomo2code2_len);
- if (i >= 0) {
- *s1 = mb_tbl_uni_docomo2code2_value[i];
- match = 1;
- }
- } else if (c >= mb_tbl_uni_docomo2code3_min && c <= mb_tbl_uni_docomo2code3_max) {
- i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_docomo2code3_key, mb_tbl_uni_docomo2code3_len);
- if (i >= 0) {
- *s1 = mb_tbl_uni_docomo2code3_value[i];
- match = 1;
- }
- } else if (c >= mb_tbl_uni_docomo2code5_min && c <= mb_tbl_uni_docomo2code5_max) {
- i = mbfl_bisec_srch2(c - 0xf0000, mb_tbl_uni_docomo2code5_key, mb_tbl_uni_docomo2code5_len);
- if (i >= 0) {
- *s1 = mb_tbl_uni_docomo2code5_val[i];
- match = 1;
- }
+ /* This character wasn't combining character to make keypad symbol,
+ * so pass the previous character through... and proceed to process the
+ * current character as usual
+ * (Single-byte ASCII characters are valid in Shift-JIS...) */
+ CK((*filter->output_function)(c1, filter->data));
}
}
- return match;
+ if (c == '#' || (c >= '0' && c <= '9')) {
+ filter->status = 1;
+ filter->cache = c;
+ return 0;
+ }
+
+ if (c == 0xA9) { /* Copyright sign */
+ *s1 = 0x29B5;
+ return 1;
+ } else if (c == 0x00AE) { /* Registered sign */
+ *s1 = 0x29BA;
+ return 1;
+ } else if (c >= mb_tbl_uni_docomo2code2_min && c <= mb_tbl_uni_docomo2code2_max) {
+ int i = mbfl_bisec_srch2(c, mb_tbl_uni_docomo2code2_key, mb_tbl_uni_docomo2code2_len);
+ if (i >= 0) {
+ *s1 = mb_tbl_uni_docomo2code2_value[i];
+ return 1;
+ }
+ } else if (c >= mb_tbl_uni_docomo2code3_min && c <= mb_tbl_uni_docomo2code3_max) {
+ int i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_docomo2code3_key, mb_tbl_uni_docomo2code3_len);
+ if (i >= 0) {
+ *s1 = mb_tbl_uni_docomo2code3_value[i];
+ return 1;
+ }
+ } else if (c >= mb_tbl_uni_docomo2code5_min && c <= mb_tbl_uni_docomo2code5_max) {
+ int i = mbfl_bisec_srch2(c - 0xF0000, mb_tbl_uni_docomo2code5_key, mb_tbl_uni_docomo2code5_len);
+ if (i >= 0) {
+ *s1 = mb_tbl_uni_docomo2code5_val[i];
+ return 1;
+ }
+ }
+ return 0;
}
-int
-mbfilter_unicode2sjis_emoji_kddi(int c, int *s1, mbfl_convert_filter *filter)
+int mbfilter_unicode2sjis_emoji_kddi(int c, int *s1, mbfl_convert_filter *filter)
{
- int i, match = 0, c1s;
-
if (filter->status == 1) {
- c1s = filter->cache;
- filter->cache = 0;
- filter->status = 0;
+ int c1 = filter->cache;
+ filter->cache = filter->status = 0;
if (c == 0x20E3) {
- if (c1s == 0x0023) {
- *s1 = 0x25bc;
- match = 1;
- } else if (c1s == 0x0030) {
+ if (c1 == '#') {
+ *s1 = 0x25BC;
+ } else if (c1 == '0') {
*s1 = 0x2830;
- match = 1;
- } else if (c1s >= 0x0031 && c1s <= 0x0039) {
- *s1 = 0x27a6 + (c1s - 0x0031);
- match = 1;
- }
- } else if ((c >= NFLAGS(0x41) && c <= NFLAGS(0x5A)) && (c1s >= NFLAGS(0x41) && c1s <= NFLAGS(0x5A))) {
- for (i=0; i<10; i++) {
- if (c1s == NFLAGS(nflags_s[i][0]) && c == NFLAGS(nflags_s[i][1])) {
- *s1 = nflags_code_kddi[i];
- match = 1;
- break;
- }
+ } else { /* Previous character was '1'-'9' */
+ *s1 = 0x27a6 + (c1 - '1');
}
+ return 1;
} else {
- if (c1s >= ucs_a1_jis_table_min && c1s < ucs_a1_jis_table_max) {
- c1s = ucs_a1_jis_table[c1s - ucs_a1_jis_table_min];
- CK((*filter->output_function)(c1s, filter->data));
- }
+ CK((*filter->output_function)(c1, filter->data));
}
- } else {
- if (c == 0x0023 || ( c >= 0x0030 && c<=0x0039) ||
- (c >= NFLAGS(0x41) && c<= NFLAGS(0x5A))) {
- filter->status = 1;
- filter->cache = c;
- *s1 = -1;
- return match;
- }
-
- if (c == 0x00A9) {
- *s1 = 0x27dc; match = 1;
- } else if (c == 0x00AE) {
- *s1 = 0x27dd; match = 1;
- } else if (c >= mb_tbl_uni_kddi2code2_min && c <= mb_tbl_uni_kddi2code2_max) {
- i = mbfl_bisec_srch2(c, mb_tbl_uni_kddi2code2_key, mb_tbl_uni_kddi2code2_len);
- if (i >= 0) {
- *s1 = mb_tbl_uni_kddi2code2_value[i];
- match = 1;
- }
- } else if (c >= mb_tbl_uni_kddi2code3_min && c <= mb_tbl_uni_kddi2code3_max) {
- i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_kddi2code3_key, mb_tbl_uni_kddi2code3_len);
- if (i >= 0) {
- *s1 = mb_tbl_uni_kddi2code3_value[i];
- match = 1;
- }
- } else if (c >= mb_tbl_uni_kddi2code5_min && c <= mb_tbl_uni_kddi2code5_max) {
- i = mbfl_bisec_srch2(c - 0xf0000, mb_tbl_uni_kddi2code5_key, mb_tbl_uni_kddi2code5_len);
- if (i >= 0) {
- *s1 = mb_tbl_uni_kddi2code5_val[i];
- match = 1;
+ } else if (filter->status == 2) {
+ int c1 = filter->cache;
+ filter->cache = filter->status = 0;
+ if (c >= NFLAGS('B') && c <= NFLAGS('U')) { /* B for GB, U for RU */
+ for (int i = 0; i < 10; i++) {
+ if (c1 == NFLAGS(nflags_s[i][0]) && c == NFLAGS(nflags_s[i][1])) {
+ *s1 = nflags_code_kddi[i];
+ return 1;
+ }
}
}
+
+ /* If none of the KDDI national flag emoji matched, then we have no way
+ * to convert the previous codepoint... */
+ mbfl_filt_conv_illegal_output(c1, filter);
+ }
+
+ if (c == '#' || (c >= '0' && c <= '9')) {
+ filter->status = 1;
+ filter->cache = c;
+ return 0;
+ } else if (c >= NFLAGS('C') && c <= NFLAGS('U')) { /* C for CN, U for US */
+ filter->status = 2;
+ filter->cache = c;
+ return 0;
}
- return match;
+ if (c == 0xA9) { /* Copyright sign */
+ *s1 = 0x27DC;
+ return 1;
+ } else if (c == 0xAE) { /* Registered sign */
+ *s1 = 0x27DD;
+ return 1;
+ } else if (c >= mb_tbl_uni_kddi2code2_min && c <= mb_tbl_uni_kddi2code2_max) {
+ int i = mbfl_bisec_srch2(c, mb_tbl_uni_kddi2code2_key, mb_tbl_uni_kddi2code2_len);
+ if (i >= 0) {
+ *s1 = mb_tbl_uni_kddi2code2_value[i];
+ return 1;
+ }
+ } else if (c >= mb_tbl_uni_kddi2code3_min && c <= mb_tbl_uni_kddi2code3_max) {
+ int i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_kddi2code3_key, mb_tbl_uni_kddi2code3_len);
+ if (i >= 0) {
+ *s1 = mb_tbl_uni_kddi2code3_value[i];
+ return 1;
+ }
+ } else if (c >= mb_tbl_uni_kddi2code5_min && c <= mb_tbl_uni_kddi2code5_max) {
+ int i = mbfl_bisec_srch2(c - 0xF0000, mb_tbl_uni_kddi2code5_key, mb_tbl_uni_kddi2code5_len);
+ if (i >= 0) {
+ *s1 = mb_tbl_uni_kddi2code5_val[i];
+ return 1;
+ }
+ }
+ return 0;
}
-int
-mbfilter_unicode2sjis_emoji_sb(int c, int *s1, mbfl_convert_filter *filter)
+int mbfilter_unicode2sjis_emoji_sb(int c, int *s1, mbfl_convert_filter *filter)
{
- int i, match = 0, c1s;
-
if (filter->status == 1) {
- filter->status = 0;
- c1s = filter->cache;
- filter->cache = 0;
+ int c1 = filter->cache;
+ filter->cache = filter->status = 0;
if (c == 0x20E3) {
- if (c1s == 0x0023) {
+ if (c1 == '#') {
*s1 = 0x2817;
- match = 1;
- } else if (c1s == 0x0030) {
+ } else if (c1 == '0') {
*s1 = 0x282c;
- match = 1;
- } else if (c1s >= 0x0031 && c1s <= 0x0039) {
- *s1 = 0x2823 + (c1s - 0x0031);
- match = 1;
+ } else { /* Previous character was '1'-'9' */
+ *s1 = 0x2823 + (c1 - '1');
}
- } else if ((c >= NFLAGS(0x41) && c <= NFLAGS(0x5A)) && (c1s >= NFLAGS(0x41) && c1s <= NFLAGS(0x5A))) {
- for (i=0; i<10; i++) {
- if (c1s == NFLAGS(nflags_s[i][0]) && c == NFLAGS(nflags_s[i][1])) {
+ return 1;
+ } else {
+ (*filter->output_function)(c1, filter->data);
+ }
+ } else if (filter->status == 2) {
+ int c1 = filter->cache;
+ filter->cache = filter->status = 0;
+ if (c >= NFLAGS('B') && c <= NFLAGS('U')) { /* B for GB, U for RU */
+ for (int i = 0; i < 10; i++) {
+ if (c1 == NFLAGS(nflags_s[i][0]) && c == NFLAGS(nflags_s[i][1])) {
*s1 = nflags_code_sb[i];
- match = 1;
- break;
+ return 1;
}
}
- } else {
- if (c1s >= ucs_a1_jis_table_min && c1s < ucs_a1_jis_table_max) {
- c1s = ucs_a1_jis_table[c1s - ucs_a1_jis_table_min];
- CK((*filter->output_function)(c1s, filter->data));
- }
}
- } else {
- if (c == 0x0023 || ( c >= 0x0030 && c<=0x0039) || (c >= NFLAGS(0x41) && c<= NFLAGS(0x5A))) {
- filter->status = 1;
- filter->cache = c;
- *s1 = -1;
- return match;
- }
-
- if (c == 0x00A9) {
- *s1 = 0x2855; match = 1;
- } else if (c == 0x00AE) {
- *s1 = 0x2856; match = 1;
- } else if (c >= mb_tbl_uni_sb2code2_min && c <= mb_tbl_uni_sb2code2_max) {
- i = mbfl_bisec_srch2(c, mb_tbl_uni_sb2code2_key, mb_tbl_uni_sb2code2_len);
- if (i >= 0) {
- *s1 = mb_tbl_uni_sb2code2_value[i];
- match = 1;
- }
- } else if (c >= mb_tbl_uni_sb2code3_min && c <= mb_tbl_uni_sb2code3_max) {
- i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_sb2code3_key, mb_tbl_uni_sb2code3_len);
- if (i >= 0) {
- *s1 = mb_tbl_uni_sb2code3_value[i];
- match = 1;
- }
- } else if (c >= mb_tbl_uni_sb2code5_min && c <= mb_tbl_uni_sb2code5_max) {
- i = mbfl_bisec_srch2(c - 0xf0000, mb_tbl_uni_sb2code5_key, mb_tbl_uni_sb2code5_len);
- if (i >= 0) {
- *s1 = mb_tbl_uni_sb2code5_val[i];
- match = 1;
- }
+
+ /* If none of the SoftBank national flag emoji matched, then we have no way
+ * to convert the previous codepoint... */
+ mbfl_filt_conv_illegal_output(c1, filter);
+ }
+
+ if (c == '#' || (c >= '0' && c <= '9')) {
+ filter->status = 1;
+ filter->cache = c;
+ return 0;
+ } else if (c >= NFLAGS('C') && c <= NFLAGS('U')) { /* C for CN, U for US */
+ filter->status = 2;
+ filter->cache = c;
+ return 0;
+ }
+
+ if (c == 0xA9) { /* Copyright sign */
+ *s1 = 0x2855;
+ return 1;
+ } else if (c == 0xAE) { /* Registered sign */
+ *s1 = 0x2856;
+ return 1;
+ } else if (c >= mb_tbl_uni_sb2code2_min && c <= mb_tbl_uni_sb2code2_max) {
+ int i = mbfl_bisec_srch2(c, mb_tbl_uni_sb2code2_key, mb_tbl_uni_sb2code2_len);
+ if (i >= 0) {
+ *s1 = mb_tbl_uni_sb2code2_value[i];
+ return 1;
+ }
+ } else if (c >= mb_tbl_uni_sb2code3_min && c <= mb_tbl_uni_sb2code3_max) {
+ int i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_sb2code3_key, mb_tbl_uni_sb2code3_len);
+ if (i >= 0) {
+ *s1 = mb_tbl_uni_sb2code3_value[i];
+ return 1;
+ }
+ } else if (c >= mb_tbl_uni_sb2code5_min && c <= mb_tbl_uni_sb2code5_max) {
+ int i = mbfl_bisec_srch2(c - 0xF0000, mb_tbl_uni_sb2code5_key, mb_tbl_uni_sb2code5_len);
+ if (i >= 0) {
+ *s1 = mb_tbl_uni_sb2code5_val[i];
+ return 1;
}
}
- return match;
+ return 0;
}
-/*
- * SJIS-win => wchar
- */
-int
-mbfl_filt_conv_sjis_mobile_wchar(int c, mbfl_convert_filter *filter)
+int mbfl_filt_conv_sjis_mobile_wchar(int c, mbfl_convert_filter *filter)
{
- int c1, s, s1 = 0, s2 = 0, w;
- int snd = 0;
+ int c1, s, s1, s2, w, snd = 0;
-retry:
switch (filter->status) {
case 0:
- if (c >= 0 && c < 0x80) { /* latin */
- if (filter->from->no_encoding == mbfl_no_encoding_sjis_sb && c == 0x1b) {
+ if (c >= 0 && c < 0x80) { /* ASCII */
+ if (filter->from == &mbfl_encoding_sjis_sb && c == 0x1B) {
+ /* ESC; escape sequences were used on older SoftBank phones for emoji */
filter->cache = c;
filter->status = 2;
} else {
CK((*filter->output_function)(c, filter->data));
}
- } else if (c > 0xa0 && c < 0xe0) { /* kana */
- CK((*filter->output_function)(0xfec0 + c, filter->data));
- } else if (c > 0x80 && c < 0xfd && c != 0xa0) { /* kanji first char */
+ } else if (c > 0xA0 && c < 0xE0) { /* Kana */
+ CK((*filter->output_function)(0xFEC0 + c, filter->data));
+ } else if (c > 0x80 && c < 0xFD && c != 0xA0) { /* Kanji, first byte */
filter->status = 1;
filter->cache = c;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(w, filter->data));
+ CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data));
}
break;
- case 1: /* kanji second char */
+ case 1: /* Kanji, second byte */
filter->status = 0;
c1 = filter->cache;
- if (c >= 0x40 && c <= 0xfc && c != 0x7f) {
+ if (c >= 0x40 && c <= 0xFC && c != 0x7F) {
w = 0;
SJIS_DECODE(c1, c, s1, s2);
- s = (s1 - 0x21)*94 + s2 - 0x21;
+ s = ((s1 - 0x21) * 94) + s2 - 0x21;
if (s <= 137) {
if (s == 31) {
- w = 0xff3c; /* FULLWIDTH REVERSE SOLIDUS */
+ w = 0xFF3C; /* FULLWIDTH REVERSE SOLIDUS */
} else if (s == 32) {
- w = 0xff5e; /* FULLWIDTH TILDE */
+ w = 0xFF5E; /* FULLWIDTH TILDE */
} else if (s == 33) {
- w = 0x2225; /* PARALLEL TO */
+ w = 0x2225; /* PARALLEL TO */
} else if (s == 60) {
- w = 0xff0d; /* FULLWIDTH HYPHEN-MINUS */
+ w = 0xFF0D; /* FULLWIDTH HYPHEN-MINUS */
} else if (s == 80) {
- w = 0xffe0; /* FULLWIDTH CENT SIGN */
+ w = 0xFFE0; /* FULLWIDTH CENT SIGN */
} else if (s == 81) {
- w = 0xffe1; /* FULLWIDTH POUND SIGN */
+ w = 0xFFE1; /* FULLWIDTH POUND SIGN */
} else if (s == 137) {
- w = 0xffe2; /* FULLWIDTH NOT SIGN */
+ w = 0xFFE2; /* FULLWIDTH NOT SIGN */
}
}
if (w == 0) {
@@ -665,134 +612,123 @@ retry:
w = jisx0208_ucs_table[s];
} else if (s >= cp932ext2_ucs_table_min && s < cp932ext2_ucs_table_max) { /* vendor ext2 (89ku - 92ku) */
w = cp932ext2_ucs_table[s - cp932ext2_ucs_table_min];
- } else if (s >= cp932ext3_ucs_table_min && s < cp932ext3_ucs_table_max) { /* vendor ext3 (115ku - 119ku) */
- w = cp932ext3_ucs_table[s - cp932ext3_ucs_table_min];
- } else if (s >= (94*94) && s < (114*94)) { /* user (95ku - 114ku) */
- w = s - (94*94) + 0xe000;
}
- if (s >= (94*94) && s < 119*94) {
- if (filter->from->no_encoding == mbfl_no_encoding_sjis_docomo) {
- w = mbfilter_sjis_emoji_docomo2unicode(s, &snd);
- } else if (filter->from->no_encoding == mbfl_no_encoding_sjis_kddi) {
- w = mbfilter_sjis_emoji_kddi2unicode(s, &snd);
- } else if (filter->from->no_encoding == mbfl_no_encoding_sjis_sb) {
- w = mbfilter_sjis_emoji_sb2unicode(s, &snd);
+ /* Emoji */
+ if (filter->from == &mbfl_encoding_sjis_docomo && s >= mb_tbl_code2uni_docomo1_min && s <= mb_tbl_code2uni_docomo1_max) {
+ w = mbfilter_sjis_emoji_docomo2unicode(s, &snd);
+ if (snd > 0) {
+ CK((*filter->output_function)(snd, filter->data));
}
-
- if (w > 0 && snd > 0) {
+ } else if (filter->from == &mbfl_encoding_sjis_kddi && s >= mb_tbl_code2uni_kddi1_min && s <= mb_tbl_code2uni_kddi2_max) {
+ w = mbfilter_sjis_emoji_kddi2unicode(s, &snd);
+ if (snd > 0) {
+ CK((*filter->output_function)(snd, filter->data));
+ }
+ } else if (filter->from == &mbfl_encoding_sjis_sb && s >= mb_tbl_code2uni_sb1_min && s <= mb_tbl_code2uni_sb3_max) {
+ w = mbfilter_sjis_emoji_sb2unicode(s, &snd);
+ if (snd > 0) {
CK((*filter->output_function)(snd, filter->data));
}
}
+
+ if (w == 0) {
+ if (s >= cp932ext3_ucs_table_min && s < cp932ext3_ucs_table_max) { /* vendor ext3 (115ku - 119ku) */
+ w = cp932ext3_ucs_table[s - cp932ext3_ucs_table_min];
+ } else if (s >= (94*94) && s < (114*94)) { /* user (95ku - 114ku) */
+ w = s - (94*94) + 0xe000;
+ }
+ }
}
if (w <= 0) {
- w = (s1 << 8) | s2;
- w &= MBFL_WCSPLANE_MASK;
- w |= MBFL_WCSPLANE_WINCP932;
+ w = (s1 << 8) | s2 | MBFL_WCSPLANE_WINCP932;
}
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = (c1 << 8) | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(w, filter->data));
+ CK((*filter->output_function)((c1 << 8) | c | MBFL_WCSGROUP_THROUGH, filter->data));
}
break;
- /* ESC : Softbank Emoji */
+
+ /* ESC: Softbank Emoji */
case 2:
- if (filter->from->no_encoding == mbfl_no_encoding_sjis_sb &&
- c == 0x24) {
- filter->cache = c;
- filter->status++;
+ if (c == '$') {
+ filter->cache = c;
+ filter->status++;
} else {
- filter->cache = 0;
- filter->status = 0;
- CK((*filter->output_function)(0x1b, filter->data));
- goto retry;
+ CK((*filter->output_function)((filter->cache << 8) | c | MBFL_WCSGROUP_THROUGH, filter->data));
+ filter->status = filter->cache = 0;
}
break;
- /* ESC $ : Softbank Emoji */
+ /* ESC $: Softbank Emoji */
case 3:
- if (filter->from->no_encoding == mbfl_no_encoding_sjis_sb &&
- ((c >= 0x45 && c <= 0x47) || (c >= 0x4f && c <= 0x51))) {
- filter->cache = c;
- filter->status++;
+ if ((c >= 'E' && c <= 'G') || (c >= 'O' && c <= 'Q')) {
+ filter->cache = c;
+ filter->status++;
} else {
- filter->cache = 0;
- filter->status = 0;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- goto retry;
+ CK((*filter->output_function)(0x1B2400 | c | MBFL_WCSGROUP_THROUGH, filter->data));
+ filter->status = filter->cache = 0;
}
break;
- /* ESC [GEFOPQ] : Softbank Emoji */
+ /* ESC $ [GEFOPQ]: Softbank Emoji */
case 4:
- w = 0;
- if (filter->from->no_encoding == mbfl_no_encoding_sjis_sb) {
- c1 = filter->cache;
-
- if (c == 0x0f) {
- w = c;
- filter->cache = 0;
- filter->status = 0;
+ c1 = filter->cache;
+ if (c == 0xF) { /* Terminate sequence of emoji */
+ filter->status = filter->cache = 0;
+ return c;
+ } else {
+ if (c1 == 'G' && c >= 0x21 && c <= 0x7a) {
+ s1 = (0x91 - 0x21) * 94;
+ } else if (c1 == 'E' && c >= 0x21 && c <= 0x7A) {
+ s1 = (0x8D - 0x21) * 94;
+ } else if (c1 == 'F' && c >= 0x21 && c <= 0x7A) {
+ s1 = (0x8E - 0x21) * 94;
+ } else if (c1 == 'O' && c >= 0x21 && c <= 0x6D) {
+ s1 = (0x92 - 0x21) * 94;
+ } else if (c1 == 'P' && c >= 0x21 && c <= 0x6C) {
+ s1 = (0x95 - 0x21) * 94;
+ } else if (c1 == 'Q' && c >= 0x21 && c <= 0x5E) {
+ s1 = (0x96 - 0x21) * 94;
} else {
- if (c1 == 0x47 && c >= 0x21 && c <= 0x7a) {
- s1 = 0x91; s2 = c;
- } else if (c1 == 0x45 && c >= 0x21 && c <= 0x7a) {
- s1 = 0x8d; s2 = c;
- } else if (c1 == 0x46 && c >= 0x21 && c <= 0x7a) {
- s1 = 0x8e; s2 = c;
- } else if (c1 == 0x4f && c >= 0x21 && c <= 0x6d) {
- s1 = 0x92; s2 = c;
- } else if (c1 == 0x50 && c >= 0x21 && c <= 0x6c) {
- s1 = 0x95; s2 = c;
- } else if (c1 == 0x51 && c >= 0x21 && c <= 0x5e) {
- s1 = 0x96; s2 = c;
- }
- s = (s1 - 0x21)*94 + s2 - 0x21;
- w = mbfilter_sjis_emoji_sb2unicode(s, &snd);
- if (w > 0) {
- if (snd > 0) {
- CK((*filter->output_function)(snd, filter->data));
- }
- CK((*filter->output_function)(w, filter->data));
+ CK((*filter->output_function)((c1 << 8) | c | MBFL_WCSGROUP_THROUGH, filter->data));
+ filter->status = filter->cache = 0;
+ return c;
+ }
+
+ w = mbfilter_sjis_emoji_sb2unicode(s1 + c - 0x21, &snd);
+ if (w > 0) {
+ if (snd > 0) {
+ CK((*filter->output_function)(snd, filter->data));
}
+ CK((*filter->output_function)(w, filter->data));
+ } else {
+ CK((*filter->output_function)((c1 << 8) | c | MBFL_WCSGROUP_THROUGH, filter->data));
+ filter->status = filter->cache = 0;
}
}
+ }
- if (w <= 0) {
- c1 = filter->cache;
- filter->cache = 0;
- filter->status = 0;
- CK((*filter->output_function)(0x1b, filter->data));
- CK((*filter->output_function)(0x24, filter->data));
- CK((*filter->output_function)(c1 & 0xff, filter->data));
- goto retry;
- }
- break;
+ return c;
+}
- default:
- filter->status = 0;
- break;
+static int mbfl_filt_conv_sjis_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status && filter->status != 4) {
+ mbfl_filt_conv_illegal_output(filter->cache, filter);
}
- return c;
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
}
-/*
- * wchar => SJIS-win
- */
-int
-mbfl_filt_conv_wchar_sjis_mobile(int c, mbfl_convert_filter *filter)
+int mbfl_filt_conv_wchar_sjis_mobile(int c, mbfl_convert_filter *filter)
{
- int c1, c2, s1, s2;
+ int c1, c2, s1 = 0, s2 = 0;
- s1 = 0;
- s2 = 0;
if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
s1 = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
} else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
@@ -801,102 +737,83 @@ mbfl_filt_conv_wchar_sjis_mobile(int c, mbfl_convert_filter *filter)
s1 = ucs_i_jis_table[c - ucs_i_jis_table_min];
} else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) {
s1 = ucs_r_jis_table[c - ucs_r_jis_table_min];
- } else if (c >= 0xe000 && c < (0xe000 + 20*94)) { /* user (95ku - 114ku) */
- s1 = c - 0xe000;
- c1 = s1/94 + 0x7f;
- c2 = s1%94 + 0x21;
+ } else if (c >= 0xE000 && c < (0xE000 + 20*94)) {
+ /* Private User Area (95ku - 114ku) */
+ s1 = c - 0xE000;
+ c1 = (s1 / 94) + 0x7F;
+ c2 = (s1 % 94) + 0x21;
s1 = (c1 << 8) | c2;
s2 = 1;
}
+
if (s1 <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_WINCP932) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s2 = 1;
- } else if (c1 == MBFL_WCSPLANE_JIS0208) {
- s1 = c & MBFL_WCSPLANE_MASK;
- } else if (c1 == MBFL_WCSPLANE_JIS0212) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s1 |= 0x8080;
- } else if (c == 0xa5) { /* YEN SIGN */
- s1 = 0x216f; /* FULLWIDTH YEN SIGN */
- } else if (c == 0x203e) { /* OVER LINE */
- s1 = 0x2131; /* FULLWIDTH MACRON */
- } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
+ if (c == 0xA5) { /* YEN SIGN */
+ s1 = 0x216F; /* FULLWIDTH YEN SIGN */
+ } else if (c == 0xFF3c) { /* FULLWIDTH REVERSE SOLIDUS */
s1 = 0x2140;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
- s1 = 0x2141;
- } else if (c == 0x2225) { /* PARALLEL TO */
+ } else if (c == 0x2225) { /* PARALLEL TO */
s1 = 0x2142;
- } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
- s1 = 0x215d;
- } else if (c == 0xffe0) { /* FULLWIDTH CENT SIGN */
+ } else if (c == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */
+ s1 = 0x215D;
+ } else if (c == 0xFFE0) { /* FULLWIDTH CENT SIGN */
s1 = 0x2171;
- } else if (c == 0xffe1) { /* FULLWIDTH POUND SIGN */
+ } else if (c == 0xFFE1) { /* FULLWIDTH POUND SIGN */
s1 = 0x2172;
- } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */
- s1 = 0x224c;
+ } else if (c == 0xFFE2) { /* FULLWIDTH NOT SIGN */
+ s1 = 0x224C;
}
}
if ((s1 <= 0) || (s1 >= 0x8080 && s2 == 0)) { /* not found or X 0212 */
s1 = -1;
- c1 = 0;
- c2 = cp932ext1_ucs_table_max - cp932ext1_ucs_table_min;
- while (c1 < c2) { /* CP932 vendor ext1 (13ku) */
+
+ /* CP932 vendor ext1 (13ku) */
+ for (c1 = 0; c1 < cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; c1++) {
if (c == cp932ext1_ucs_table[c1]) {
- s1 = ((c1/94 + 0x2d) << 8) + (c1%94 + 0x21);
+ s1 = (((c1 / 94) + 0x2D) << 8) + (c1 % 94) + 0x21;
break;
}
- c1++;
}
+
if (s1 <= 0) {
- c1 = 0;
- c2 = cp932ext2_ucs_table_max - cp932ext2_ucs_table_min;
- while (c1 < c2) { /* CP932 vendor ext2 (115ku - 119ku) */
+ /* CP932 vendor ext2 (115ku - 119ku) */
+ for (c1 = 0; c1 < cp932ext2_ucs_table_max - cp932ext2_ucs_table_min; c1++) {
if (c == cp932ext2_ucs_table[c1]) {
- s1 = ((c1/94 + 0x93) << 8) + (c1%94 + 0x21);
+ s1 = (((c1 / 94) + 0x79) << 8) + (c1 % 94) + 0x21;
break;
}
- c1++;
}
}
if (s1 <= 0) {
- c1 = 0;
- c2 = cp932ext3_ucs_table_max - cp932ext3_ucs_table_min;
- while (c1 < c2) { /* CP932 vendor ext3 (115ku - 119ku) */
+ /* CP932 vendor ext3 (115ku - 119ku) */
+ for (c1 = 0; c1 < cp932ext3_ucs_table_max - cp932ext3_ucs_table_min; c1++) {
if (c == cp932ext3_ucs_table[c1]) {
- s1 = ((c1/94 + 0x93) << 8) + (c1%94 + 0x21);
+ s1 = (((c1 / 94) + 0x93) << 8) + (c1 % 94) + 0x21;
break;
}
- c1++;
}
}
+
if (c == 0) {
s1 = 0;
- } else if (s1 <= 0) {
- s1 = -1;
}
}
- if ((filter->to->no_encoding == mbfl_no_encoding_sjis_docomo &&
- mbfilter_unicode2sjis_emoji_docomo(c, &s1, filter) > 0) ||
- (filter->to->no_encoding == mbfl_no_encoding_sjis_kddi &&
- mbfilter_unicode2sjis_emoji_kddi(c, &s1, filter) > 0) ||
- (filter->to->no_encoding == mbfl_no_encoding_sjis_sb &&
- mbfilter_unicode2sjis_emoji_sb(c, &s1, filter) > 0 )) {
+ if ((filter->to == &mbfl_encoding_sjis_docomo && mbfilter_unicode2sjis_emoji_docomo(c, &s1, filter)) ||
+ (filter->to == &mbfl_encoding_sjis_kddi && mbfilter_unicode2sjis_emoji_kddi(c, &s1, filter)) ||
+ (filter->to == &mbfl_encoding_sjis_sb && mbfilter_unicode2sjis_emoji_sb(c, &s1, filter))) {
CODE2JIS(c1,c2,s1,s2);
}
- if (filter->status == 1 && filter->cache > 0) {
+ if (filter->status) {
return c;
}
if (s1 >= 0) {
- if (s1 < 0x100) { /* latin or kana */
+ if (s1 < 0x100) { /* Latin/Kana */
CK((*filter->output_function)(s1, filter->data));
- } else { /* kanji */
+ } else { /* Kanji */
c1 = (s1 >> 8) & 0xff;
c2 = s1 & 0xff;
SJIS_ENCODE(c1, c2, s1, s2);
@@ -910,18 +827,15 @@ mbfl_filt_conv_wchar_sjis_mobile(int c, mbfl_convert_filter *filter)
return c;
}
-int
-mbfl_filt_conv_sjis_mobile_flush(mbfl_convert_filter *filter)
+int mbfl_filt_conv_sjis_mobile_flush(mbfl_convert_filter *filter)
{
int c1 = filter->cache;
- if (filter->status == 1 && (c1 == 0x0023 || (c1 >= 0x0030 && c1<=0x0039))) {
+ if (filter->status == 1 && (c1 == '#' || (c1 >= '0' && c1 <= '9'))) {
CK((*filter->output_function)(c1, filter->data));
}
- filter->status = 0;
- filter->cache = 0;
- if (filter->flush_function != NULL) {
- return (*filter->flush_function)(filter->data);
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
}
return 0;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.h b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.h
index 51b703da72..19e1920c6e 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.h
@@ -36,10 +36,6 @@ extern const mbfl_encoding mbfl_encoding_sjis_docomo;
extern const mbfl_encoding mbfl_encoding_sjis_kddi;
extern const mbfl_encoding mbfl_encoding_sjis_sb;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis_docomo;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis_kddi;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis_sb;
-
extern const struct mbfl_convert_vtbl vtbl_sjis_docomo_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_sjis_docomo;
extern const struct mbfl_convert_vtbl vtbl_sjis_kddi_wchar;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c
index 2535036e23..df7ba62e77 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c
@@ -33,8 +33,6 @@
#include "unicode_table_cp932_ext.h"
#include "unicode_table_jis.h"
-static int mbfl_filt_ident_sjis_open(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_sjis[] = { /* 0x80-0x9f,0xE0-0xFF */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -60,19 +58,13 @@ const mbfl_encoding mbfl_encoding_sjis_open = {
mbfl_no_encoding_sjis_open,
"SJIS-win",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_open_aliases,
+ mbfl_encoding_sjis_open_aliases,
mblen_table_sjis,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_open_wchar,
&vtbl_wchar_sjis_open
};
-const struct mbfl_identify_vtbl vtbl_identify_sjis_open = {
- mbfl_no_encoding_sjis_open,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis_open
-};
-
const struct mbfl_convert_vtbl vtbl_sjis_open_wchar = {
mbfl_no_encoding_sjis_open,
mbfl_no_encoding_wchar,
@@ -249,16 +241,7 @@ mbfl_filt_conv_wchar_sjis_open(int c, mbfl_convert_filter *filter)
s2 = 1;
}
if (s1 <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_WINCP932) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s2 = 1;
- } else if (c1 == MBFL_WCSPLANE_JIS0208) {
- s1 = c & MBFL_WCSPLANE_MASK;
- } else if (c1 == MBFL_WCSPLANE_JIS0212) {
- s1 = c & MBFL_WCSPLANE_MASK;
- s1 |= 0x8080;
- } else if (c == 0xa5) { /* YEN SIGN */
+ if (c == 0xa5) { /* YEN SIGN */
s1 = 0x216f; /* FULLWIDTH YEN SIGN */
} else if (c == 0x203e) { /* OVER LINE */
s1 = 0x2131; /* FULLWIDTH MACRON */
@@ -323,23 +306,3 @@ mbfl_filt_conv_wchar_sjis_open(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_sjis_open(int c, mbfl_identify_filter *filter)
-{
- if (filter->status) { /* kanji second char */
- if (c < 0x40 || c > 0xfc || c == 0x7f) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- } else if (c >= 0 && c < 0x80) { /* latin ok */
- ;
- } else if (c > 0xa0 && c < 0xe0) { /* kana ok */
- ;
- } else if (c > 0x80 && c < 0xfd && c != 0xa0) { /* kanji first char */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.h b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.h
index 2c6c70373a..764fad7e17 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.h
@@ -34,7 +34,6 @@
extern const mbfl_encoding mbfl_encoding_sjis_open;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis_open;
extern const struct mbfl_convert_vtbl vtbl_sjis_open_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_sjis_open;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c
index 68172efbe6..efe8cc2d4a 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c
@@ -30,15 +30,24 @@
#include "mbfilter.h"
#include "mbfilter_ucs2.h"
+static int mbfl_filt_conv_ucs2_wchar_flush(mbfl_convert_filter *filter);
+
static const char *mbfl_encoding_ucs2_aliases[] = {"ISO-10646-UCS-2", "UCS2" , "UNICODE", NULL};
+/* This library historically had encodings called 'byte2be' and 'byte2le'
+ * which were almost identical to UCS-2, except that they would truncate
+ * Unicode codepoints higher than 0xFFFF quietly
+ * Maintain minimal support by aliasing to UCS-2 */
+static const char *mbfl_encoding_ucs2be_aliases[] = {"byte2be", NULL};
+static const char *mbfl_encoding_ucs2le_aliases[] = {"byte2le", NULL};
+
const mbfl_encoding mbfl_encoding_ucs2 = {
mbfl_no_encoding_ucs2,
"UCS-2",
"UCS-2",
- (const char *(*)[])&mbfl_encoding_ucs2_aliases,
+ mbfl_encoding_ucs2_aliases,
NULL,
- MBFL_ENCTYPE_WCS2BE,
+ MBFL_ENCTYPE_WCS2,
&vtbl_ucs2_wchar,
&vtbl_wchar_ucs2
};
@@ -47,9 +56,9 @@ const mbfl_encoding mbfl_encoding_ucs2be = {
mbfl_no_encoding_ucs2be,
"UCS-2BE",
"UCS-2BE",
+ mbfl_encoding_ucs2be_aliases,
NULL,
- NULL,
- MBFL_ENCTYPE_WCS2BE,
+ MBFL_ENCTYPE_WCS2,
&vtbl_ucs2be_wchar,
&vtbl_wchar_ucs2be
};
@@ -58,9 +67,9 @@ const mbfl_encoding mbfl_encoding_ucs2le = {
mbfl_no_encoding_ucs2le,
"UCS-2LE",
"UCS-2LE",
+ mbfl_encoding_ucs2le_aliases,
NULL,
- NULL,
- MBFL_ENCTYPE_WCS2LE,
+ MBFL_ENCTYPE_WCS2,
&vtbl_ucs2le_wchar,
&vtbl_wchar_ucs2le
};
@@ -71,7 +80,7 @@ const struct mbfl_convert_vtbl vtbl_ucs2_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_ucs2_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_ucs2_wchar_flush,
NULL,
};
@@ -91,7 +100,7 @@ const struct mbfl_convert_vtbl vtbl_ucs2be_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_ucs2be_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_ucs2_wchar_flush,
NULL,
};
@@ -111,7 +120,7 @@ const struct mbfl_convert_vtbl vtbl_ucs2le_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_ucs2le_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_ucs2_wchar_flush,
NULL,
};
@@ -127,113 +136,83 @@ const struct mbfl_convert_vtbl vtbl_wchar_ucs2le = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-/*
- * UCS-2 => wchar
- */
int mbfl_filt_conv_ucs2_wchar(int c, mbfl_convert_filter *filter)
{
- int n, endian;
-
- endian = filter->status & 0xff00;
- switch (filter->status & 0xff) {
- case 0:
- if (endian) {
- n = c & 0xff;
- } else {
- n = (c & 0xff) << 8;
- }
- filter->cache = n;
- filter->status++;
- break;
- default:
- if (endian) {
- n = (c & 0xff) << 8;
+ if (filter->status == 0) {
+ filter->status = 1;
+ filter->cache = c & 0xFF;
+ } else {
+ filter->status = 0;
+ int n = (filter->cache << 8) | (c & 0xFF);
+ if (n == 0xFFFE) {
+ /* Found little-endian byte order mark */
+ filter->filter_function = mbfl_filt_conv_ucs2le_wchar;
} else {
- n = c & 0xff;
- }
- n |= filter->cache;
- if (n == 0xfffe) {
- if (endian) {
- filter->status = 0; /* big-endian */
- } else {
- filter->status = 0x100; /* little-endian */
+ filter->filter_function = mbfl_filt_conv_ucs2be_wchar;
+ if (n != 0xFEFF) {
+ CK((*filter->output_function)(n, filter->data));
}
- CK((*filter->output_function)(0xfeff, filter->data));
- } else {
- filter->status &= ~0xff;
- CK((*filter->output_function)(n, filter->data));
}
- break;
}
-
return c;
}
-/*
- * UCS-2BE => wchar
- */
int mbfl_filt_conv_ucs2be_wchar(int c, mbfl_convert_filter *filter)
{
- int n;
-
if (filter->status == 0) {
filter->status = 1;
- n = (c & 0xff) << 8;
- filter->cache = n;
+ filter->cache = (c & 0xFF) << 8;
} else {
filter->status = 0;
- n = (c & 0xff) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
+ CK((*filter->output_function)((c & 0xFF) | filter->cache, filter->data));
}
return c;
}
-/*
- * wchar => UCS-2BE
- */
int mbfl_filt_conv_wchar_ucs2be(int c, mbfl_convert_filter *filter)
{
if (c >= 0 && c < MBFL_WCSPLANE_UCS2MAX) {
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- CK((*filter->output_function)(c & 0xff, filter->data));
+ CK((*filter->output_function)((c >> 8) & 0xFF, filter->data));
+ CK((*filter->output_function)(c & 0xFF, filter->data));
} else {
CK(mbfl_filt_conv_illegal_output(c, filter));
}
-
return c;
}
-/*
- * UCS-2LE => wchar
- */
int mbfl_filt_conv_ucs2le_wchar(int c, mbfl_convert_filter *filter)
{
- int n;
-
if (filter->status == 0) {
filter->status = 1;
- n = c & 0xff;
- filter->cache = n;
+ filter->cache = c & 0xFF;
} else {
filter->status = 0;
- n = ((c & 0xff) << 8) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
+ CK((*filter->output_function)(((c & 0xFF) << 8) | filter->cache, filter->data));
}
return c;
}
-
-/*
- * wchar => UCS-2LE
- */
int mbfl_filt_conv_wchar_ucs2le(int c, mbfl_convert_filter *filter)
{
if (c >= 0 && c < MBFL_WCSPLANE_UCS2MAX) {
- CK((*filter->output_function)(c & 0xff, filter->data));
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
+ CK((*filter->output_function)(c & 0xFF, filter->data));
+ CK((*filter->output_function)((c >> 8) & 0xFF, filter->data));
} else {
CK(mbfl_filt_conv_illegal_output(c, filter));
}
-
return c;
}
+
+static int mbfl_filt_conv_ucs2_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status) {
+ /* Input string was truncated */
+ CK((*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data));
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c
index fcdd20d615..7cc432750e 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c
@@ -32,13 +32,19 @@
static const char *mbfl_encoding_ucs4_aliases[] = {"ISO-10646-UCS-4", "UCS4", NULL};
+/* This library historically had encodings called 'byte4be' and 'byte4le'
+ * which were almost identical to UCS-4
+ * Maintain minimal support by aliasing to UCS-2 */
+static const char *mbfl_encoding_ucs4be_aliases[] = {"byte4be", NULL};
+static const char *mbfl_encoding_ucs4le_aliases[] = {"byte4le", NULL};
+
const mbfl_encoding mbfl_encoding_ucs4 = {
mbfl_no_encoding_ucs4,
"UCS-4",
"UCS-4",
- (const char *(*)[])&mbfl_encoding_ucs4_aliases,
+ mbfl_encoding_ucs4_aliases,
NULL,
- MBFL_ENCTYPE_WCS4BE,
+ MBFL_ENCTYPE_WCS4,
&vtbl_ucs4_wchar,
&vtbl_wchar_ucs4
};
@@ -47,9 +53,9 @@ const mbfl_encoding mbfl_encoding_ucs4be = {
mbfl_no_encoding_ucs4be,
"UCS-4BE",
"UCS-4BE",
+ mbfl_encoding_ucs4be_aliases,
NULL,
- NULL,
- MBFL_ENCTYPE_WCS4BE,
+ MBFL_ENCTYPE_WCS4,
&vtbl_ucs4be_wchar,
&vtbl_wchar_ucs4be
};
@@ -58,9 +64,9 @@ const mbfl_encoding mbfl_encoding_ucs4le = {
mbfl_no_encoding_ucs4le,
"UCS-4LE",
"UCS-4LE",
+ mbfl_encoding_ucs4le_aliases,
NULL,
- NULL,
- MBFL_ENCTYPE_WCS4LE,
+ MBFL_ENCTYPE_WCS4,
&vtbl_ucs4le_wchar,
&vtbl_wchar_ucs4le
};
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c
index 5dc4aa81a9..447ec7c5e1 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c
@@ -32,8 +32,6 @@
#define UNICODE_TABLE_UHC_DEF
#include "unicode_table_uhc.h"
-static int mbfl_filt_ident_uhc(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_uhc[] = { /* 0x81-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -59,19 +57,13 @@ const mbfl_encoding mbfl_encoding_uhc = {
mbfl_no_encoding_uhc,
"UHC",
"UHC",
- (const char *(*)[])&mbfl_encoding_uhc_aliases,
+ mbfl_encoding_uhc_aliases,
mblen_table_uhc,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_uhc_wchar,
&vtbl_wchar_uhc
};
-const struct mbfl_identify_vtbl vtbl_identify_uhc = {
- mbfl_no_encoding_uhc,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_uhc
-};
-
const struct mbfl_convert_vtbl vtbl_uhc_wchar = {
mbfl_no_encoding_uhc,
mbfl_no_encoding_wchar,
@@ -220,43 +212,3 @@ mbfl_filt_conv_wchar_uhc(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_uhc(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c >= 0x81 && c <= 0xa0) { /* dbcs first char */
- filter->status= 1;
- } else if (c >= 0xa1 && c <= 0xc6) { /* dbcs first char */
- filter->status= 2;
- } else if (c >= 0xc7 && c <= 0xfe) { /* dbcs first char */
- filter->status= 3;
- } else { /* bad */
- filter->flag = 1;
- }
-
- case 1:
- case 2:
- if (c < 0x41 || (c > 0x5a && c < 0x61)
- || (c > 0x7a && c < 0x81) || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 3:
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_uhc.h b/ext/mbstring/libmbfl/filters/mbfilter_uhc.h
index 6ed5486767..860d45eb86 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_uhc.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_uhc.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_uhc;
-extern const struct mbfl_identify_vtbl vtbl_identify_uhc;
extern const struct mbfl_convert_vtbl vtbl_uhc_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_uhc;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c
index 620e8a76f7..c2c30973db 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c
@@ -30,15 +30,17 @@
#include "mbfilter.h"
#include "mbfilter_utf16.h"
+static int mbfl_filt_conv_utf16_wchar_flush(mbfl_convert_filter *filter);
+
static const char *mbfl_encoding_utf16_aliases[] = {"utf16", NULL};
const mbfl_encoding mbfl_encoding_utf16 = {
mbfl_no_encoding_utf16,
"UTF-16",
"UTF-16",
- (const char *(*)[])&mbfl_encoding_utf16_aliases,
+ mbfl_encoding_utf16_aliases,
NULL,
- MBFL_ENCTYPE_MWC2BE,
+ MBFL_ENCTYPE_MWC2,
&vtbl_utf16_wchar,
&vtbl_wchar_utf16
};
@@ -49,7 +51,7 @@ const mbfl_encoding mbfl_encoding_utf16be = {
"UTF-16BE",
NULL,
NULL,
- MBFL_ENCTYPE_MWC2BE,
+ MBFL_ENCTYPE_MWC2,
&vtbl_utf16be_wchar,
&vtbl_wchar_utf16be
};
@@ -60,7 +62,7 @@ const mbfl_encoding mbfl_encoding_utf16le = {
"UTF-16LE",
NULL,
NULL,
- MBFL_ENCTYPE_MWC2LE,
+ MBFL_ENCTYPE_MWC2,
&vtbl_utf16le_wchar,
&vtbl_wchar_utf16le
};
@@ -71,7 +73,7 @@ const struct mbfl_convert_vtbl vtbl_utf16_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf16_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf16_wchar_flush,
NULL,
};
@@ -91,7 +93,7 @@ const struct mbfl_convert_vtbl vtbl_utf16be_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf16be_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf16_wchar_flush,
NULL,
};
@@ -111,7 +113,7 @@ const struct mbfl_convert_vtbl vtbl_utf16le_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf16le_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf16_wchar_flush,
NULL,
};
@@ -127,111 +129,89 @@ const struct mbfl_convert_vtbl vtbl_wchar_utf16le = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-/*
- * UTF-16 => wchar
- */
int mbfl_filt_conv_utf16_wchar(int c, mbfl_convert_filter *filter)
{
- int n, endian;
-
- endian = filter->status & 0xff00;
- switch (filter->status & 0x0f) {
- case 0:
- if (endian) {
- n = c & 0xff;
- } else {
- n = (c & 0xff) << 8;
- }
- filter->cache |= n;
- filter->status++;
- break;
- default:
- if (endian) {
- n = (c & 0xff) << 8;
+ /* Start with the assumption that the string is big-endian;
+ * If we find a little-endian BOM, then we will change that assumption */
+ if (filter->status == 0) {
+ filter->cache = c & 0xFF;
+ filter->status = 1;
+ } else {
+ int n = (filter->cache << 8) | (c & 0xFF);
+ if (n == 0xFFFE) {
+ /* Switch to little-endian mode */
+ filter->filter_function = mbfl_filt_conv_utf16le_wchar;
+ filter->cache = filter->status = 0;
} else {
- n = c & 0xff;
- }
- n |= filter->cache & 0xffff;
- filter->status &= ~0x0f;
- if (n >= 0xd800 && n < 0xdc00) {
- filter->cache = ((n & 0x3ff) << 16) + 0x400000;
- } else if (n >= 0xdc00 && n < 0xe000) {
- n &= 0x3ff;
- n |= (filter->cache & 0xfff0000) >> 6;
- filter->cache = 0;
- if (n >= MBFL_WCSPLANE_SUPMIN && n < MBFL_WCSPLANE_SUPMAX) {
- CK((*filter->output_function)(n, filter->data));
- } else { /* illegal character */
- n &= MBFL_WCSGROUP_MASK;
- n |= MBFL_WCSGROUP_THROUGH;
+ filter->filter_function = mbfl_filt_conv_utf16be_wchar;
+ if (n >= 0xD800 && n <= 0xDBFF) {
+ filter->cache = n & 0x3FF; /* Pick out 10 data bits */
+ filter->status = 2;
+ return c;
+ } else if (n >= 0xDC00 && n <= 0xDFFF) {
+ /* This is wrong; second part of surrogate pair has come first */
+ CK((*filter->output_function)(n | MBFL_WCSGROUP_THROUGH, filter->data));
+ } else if (n != 0xFEFF) {
CK((*filter->output_function)(n, filter->data));
}
- } else {
- int is_first = filter->status & 0x10;
- filter->cache = 0;
- filter->status |= 0x10;
- if (!is_first) {
- if (n == 0xfffe) {
- if (endian) {
- filter->status &= ~0x100; /* big-endian */
- } else {
- filter->status |= 0x100; /* little-endian */
- }
- break;
- } else if (n == 0xfeff) {
- break;
- }
- }
- CK((*filter->output_function)(n, filter->data));
+ filter->cache = filter->status = 0;
}
- break;
}
return c;
}
-/*
- * UTF-16BE => wchar
- */
int mbfl_filt_conv_utf16be_wchar(int c, mbfl_convert_filter *filter)
{
int n;
switch (filter->status) {
- case 0:
+ case 0: /* First byte */
+ filter->cache = c & 0xFF;
filter->status = 1;
- n = (c & 0xff) << 8;
- filter->cache |= n;
break;
- default:
- filter->status = 0;
- n = (filter->cache & 0xff00) | (c & 0xff);
- if (n >= 0xd800 && n < 0xdc00) {
- filter->cache = ((n & 0x3ff) << 16) + 0x400000;
- } else if (n >= 0xdc00 && n < 0xe000) {
- n &= 0x3ff;
- n |= (filter->cache & 0xfff0000) >> 6;
- filter->cache = 0;
- if (n >= MBFL_WCSPLANE_SUPMIN && n < MBFL_WCSPLANE_SUPMAX) {
- CK((*filter->output_function)(n, filter->data));
- } else { /* illegal character */
- n &= MBFL_WCSGROUP_MASK;
- n |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(n, filter->data));
- }
+
+ case 1: /* Second byte */
+ n = (filter->cache << 8) | (c & 0xFF);
+ if (n >= 0xD800 && n <= 0xDBFF) {
+ filter->cache = n & 0x3FF; /* Pick out 10 data bits */
+ filter->status = 2;
+ } else if (n >= 0xDC00 && n <= 0xDFFF) {
+ /* This is wrong; second part of surrogate pair has come first */
+ CK((*filter->output_function)(n | MBFL_WCSGROUP_THROUGH, filter->data));
+ filter->status = 0;
} else {
- filter->cache = 0;
CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
}
break;
+
+ case 2: /* Second part of surrogate, first byte */
+ filter->cache = (filter->cache << 8) | (c & 0xFF);
+ filter->status = 3;
+ break;
+
+ case 3: /* Second part of surrogate, second byte */
+ n = ((filter->cache & 0xFF) << 8) | (c & 0xFF);
+ if (n >= 0xD800 && n <= 0xDBFF) {
+ /* Wrong; that's the first half of a surrogate pair, not the second */
+ CK((*filter->output_function)((0xD8 << 10) | (filter->cache >> 8) | MBFL_WCSGROUP_THROUGH, filter->data));
+ filter->cache = n & 0x3FF;
+ filter->status = 2;
+ } else if (n >= 0xDC00 && n <= 0xDFFF) {
+ n = ((filter->cache & 0x3FF00) << 2) + (n & 0x3FF) + 0x10000;
+ CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
+ } else {
+ CK((*filter->output_function)((0xD8 << 10) | (filter->cache >> 8) | MBFL_WCSGROUP_THROUGH, filter->data));
+ CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
+ }
}
return c;
}
-/*
- * wchar => UTF-16BE
- */
int mbfl_filt_conv_wchar_utf16be(int c, mbfl_convert_filter *filter)
{
int n;
@@ -253,38 +233,53 @@ int mbfl_filt_conv_wchar_utf16be(int c, mbfl_convert_filter *filter)
return c;
}
-/*
- * UTF-16LE => wchar
- */
int mbfl_filt_conv_utf16le_wchar(int c, mbfl_convert_filter *filter)
{
int n;
switch (filter->status) {
case 0:
+ filter->cache = c & 0xff;
filter->status = 1;
- n = c & 0xff;
- filter->cache |= n;
break;
- default:
- filter->status = 0;
- n = (filter->cache & 0xff) | ((c & 0xff) << 8);
- if (n >= 0xd800 && n < 0xdc00) {
- filter->cache = ((n & 0x3ff) << 16) + 0x400000;
- } else if (n >= 0xdc00 && n < 0xe000) {
- n &= 0x3ff;
- n |= (filter->cache & 0xfff0000) >> 6;
- filter->cache = 0;
- if (n >= MBFL_WCSPLANE_SUPMIN && n < MBFL_WCSPLANE_SUPMAX) {
- CK((*filter->output_function)(n, filter->data));
- } else { /* illegal character */
- n &= MBFL_WCSGROUP_MASK;
- n |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(n, filter->data));
- }
+
+ case 1:
+ if ((c & 0xfc) == 0xd8) {
+ /* Looks like we have a surrogate pair here */
+ filter->cache += ((c & 0x3) << 8);
+ filter->status = 2;
+ } else if ((c & 0xfc) == 0xdc) {
+ /* This is wrong; the second part of the surrogate pair has come first
+ * Flag it with `MBFL_WCSGROUP_THROUGH`; the following filter will handle
+ * the error */
+ n = (filter->cache + ((c & 0xff) << 8)) | MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
} else {
- filter->cache = 0;
+ CK((*filter->output_function)(filter->cache + ((c & 0xff) << 8), filter->data));
+ filter->status = 0;
+ }
+ break;
+
+ case 2:
+ filter->cache = (filter->cache << 10) + (c & 0xff);
+ filter->status = 3;
+ break;
+
+ case 3:
+ n = (filter->cache & 0xFF) | ((c & 0xFF) << 8);
+ if (n >= 0xD800 && n <= 0xDBFF) {
+ CK((*filter->output_function)((0xD8 << 10) | (filter->cache >> 10) | MBFL_WCSGROUP_THROUGH, filter->data));
+ filter->cache = n & 0x3FF;
+ filter->status = 2;
+ } else if (n >= 0xDC00 && n <= 0xDFFF) {
+ n = filter->cache + ((c & 0x3) << 8) + 0x10000;
+ CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
+ } else {
+ CK((*filter->output_function)((0xD8 << 10) | (filter->cache >> 10) | MBFL_WCSGROUP_THROUGH, filter->data));
CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
}
break;
}
@@ -292,9 +287,6 @@ int mbfl_filt_conv_utf16le_wchar(int c, mbfl_convert_filter *filter)
return c;
}
-/*
- * wchar => UTF-16LE
- */
int mbfl_filt_conv_wchar_utf16le(int c, mbfl_convert_filter *filter)
{
int n;
@@ -315,3 +307,21 @@ int mbfl_filt_conv_wchar_utf16le(int c, mbfl_convert_filter *filter)
return c;
}
+
+static int mbfl_filt_conv_utf16_wchar_flush(mbfl_convert_filter *filter)
+{
+ int status = filter->status;
+ int cache = filter->cache;
+ filter->status = filter->cache = 0;
+
+ if (status) {
+ /* Input string was truncated */
+ CK((*filter->output_function)(cache | MBFL_WCSGROUP_THROUGH, filter->data));
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf16.h b/ext/mbstring/libmbfl/filters/mbfilter_utf16.h
index 4aa88619c7..727c231b34 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf16.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf16.h
@@ -33,6 +33,7 @@
extern const mbfl_encoding mbfl_encoding_utf16;
extern const mbfl_encoding mbfl_encoding_utf16be;
extern const mbfl_encoding mbfl_encoding_utf16le;
+
extern const struct mbfl_convert_vtbl vtbl_utf16_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_utf16;
extern const struct mbfl_convert_vtbl vtbl_utf16be_wchar;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c
index b936ab4102..e56a728ddc 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c
@@ -30,15 +30,17 @@
#include "mbfilter.h"
#include "mbfilter_utf32.h"
+static int mbfl_filt_conv_utf32_wchar_flush(mbfl_convert_filter *filter);
+
static const char *mbfl_encoding_utf32_aliases[] = {"utf32", NULL};
const mbfl_encoding mbfl_encoding_utf32 = {
mbfl_no_encoding_utf32,
"UTF-32",
"UTF-32",
- (const char *(*)[])&mbfl_encoding_utf32_aliases,
+ mbfl_encoding_utf32_aliases,
NULL,
- MBFL_ENCTYPE_WCS4BE,
+ MBFL_ENCTYPE_WCS4,
&vtbl_utf32_wchar,
&vtbl_wchar_utf32
};
@@ -49,7 +51,7 @@ const mbfl_encoding mbfl_encoding_utf32be = {
"UTF-32BE",
NULL,
NULL,
- MBFL_ENCTYPE_WCS4BE,
+ MBFL_ENCTYPE_WCS4,
&vtbl_utf32be_wchar,
&vtbl_wchar_utf32be
};
@@ -60,7 +62,7 @@ const mbfl_encoding mbfl_encoding_utf32le = {
"UTF-32LE",
NULL,
NULL,
- MBFL_ENCTYPE_WCS4LE,
+ MBFL_ENCTYPE_WCS4,
&vtbl_utf32le_wchar,
&vtbl_wchar_utf32le
};
@@ -71,7 +73,7 @@ const struct mbfl_convert_vtbl vtbl_utf32_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf32_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf32_wchar_flush,
NULL,
};
@@ -91,7 +93,7 @@ const struct mbfl_convert_vtbl vtbl_utf32be_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf32be_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf32_wchar_flush,
NULL,
};
@@ -111,7 +113,7 @@ const struct mbfl_convert_vtbl vtbl_utf32le_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf32le_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf32_wchar_flush,
NULL,
};
@@ -127,106 +129,53 @@ const struct mbfl_convert_vtbl vtbl_wchar_utf32le = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-/*
- * UTF-32 => wchar
- */
-int mbfl_filt_conv_utf32_wchar(int c, mbfl_convert_filter *filter)
+static int emit_char_if_valid(int n, mbfl_convert_filter *filter)
{
- int n, endian;
+ if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xD800 || n > 0xDFFF)) {
+ CK((*filter->output_function)(n, filter->data));
+ } else {
+ n = (n & MBFL_WCSGROUP_MASK) | MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(n, filter->data));
+ }
+ return 0;
+}
- endian = filter->status & 0xff00;
- switch (filter->status & 0xff) {
- case 0:
- if (endian) {
- n = c & 0xff;
- } else {
- n = (c & 0xffu) << 24;
- }
- filter->cache = n;
- filter->status++;
- break;
- case 1:
- if (endian) {
- n = (c & 0xff) << 8;
- } else {
- n = (c & 0xff) << 16;
- }
- filter->cache |= n;
- filter->status++;
- break;
- case 2:
- if (endian) {
- n = (c & 0xff) << 16;
- } else {
- n = (c & 0xff) << 8;
- }
- filter->cache |= n;
+int mbfl_filt_conv_utf32_wchar(int c, mbfl_convert_filter *filter)
+{
+ if (filter->status < 3) {
+ filter->cache = (filter->cache << 8) | (c & 0xFF);
filter->status++;
- break;
- default:
- if (endian) {
- n = (c & 0xffu) << 24;
- } else {
- n = c & 0xff;
- }
- n |= filter->cache;
- if ((n & 0xffff) == 0 && ((n >> 16) & 0xffff) == 0xfffe) {
- if (endian) {
- filter->status = 0; /* big-endian */
- } else {
- filter->status = 0x100; /* little-endian */
- }
- CK((*filter->output_function)(0xfeff, filter->data));
+ } else {
+ int n = ((unsigned int)filter->cache << 8) | (c & 0xFF);
+ filter->cache = filter->status = 0;
+
+ if (n == 0xFFFE0000) {
+ /* Found a little-endian byte order mark */
+ filter->filter_function = mbfl_filt_conv_utf32le_wchar;
} else {
- filter->status &= ~0xff;
- if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xd800 || n > 0xdfff)) {
- CK((*filter->output_function)(n, filter->data));
- } else {
- n = (n & MBFL_WCSGROUP_MASK) | MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(n, filter->data));
+ filter->filter_function = mbfl_filt_conv_utf32be_wchar;
+ if (n != 0xFEFF) {
+ CK(emit_char_if_valid(n, filter));
}
}
- break;
}
return c;
}
-/*
- * UTF-32BE => wchar
- */
int mbfl_filt_conv_utf32be_wchar(int c, mbfl_convert_filter *filter)
{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = (c & 0xffu) << 24;
- filter->cache = n;
- } else if (filter->status == 1) {
- filter->status = 2;
- n = (c & 0xff) << 16;
- filter->cache |= n;
- } else if (filter->status == 2) {
- filter->status = 3;
- n = (c & 0xff) << 8;
- filter->cache |= n;
+ if (filter->status < 3) {
+ filter->cache = (filter->cache << 8) | (c & 0xFF);
+ filter->status++;
} else {
- filter->status = 0;
- n = (c & 0xff) | filter->cache;
- if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xd800 || n > 0xdfff)) {
- CK((*filter->output_function)(n, filter->data));
- } else {
- n = (n & MBFL_WCSGROUP_MASK) | MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(n, filter->data));
- }
+ int n = ((unsigned int)filter->cache << 8) | (c & 0xFF);
+ filter->cache = filter->status = 0;
+ CK(emit_char_if_valid(n, filter));
}
return c;
}
-/*
- * wchar => UTF-32BE
- */
int mbfl_filt_conv_wchar_utf32be(int c, mbfl_convert_filter *filter)
{
if (c >= 0 && c < MBFL_WCSPLANE_UTF32MAX) {
@@ -241,41 +190,19 @@ int mbfl_filt_conv_wchar_utf32be(int c, mbfl_convert_filter *filter)
return c;
}
-/*
- * UTF-32LE => wchar
- */
int mbfl_filt_conv_utf32le_wchar(int c, mbfl_convert_filter *filter)
{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = (c & 0xff);
- filter->cache = n;
- } else if (filter->status == 1) {
- filter->status = 2;
- n = (c & 0xff) << 8;
- filter->cache |= n;
- } else if (filter->status == 2) {
- filter->status = 3;
- n = (c & 0xff) << 16;
- filter->cache |= n;
+ if (filter->status < 3) {
+ filter->cache |= ((c & 0xFFU) << (8 * filter->status));
+ filter->status++;
} else {
- filter->status = 0;
- n = ((c & 0xffu) << 24) | filter->cache;
- if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xd800 || n > 0xdfff)) {
- CK((*filter->output_function)(n, filter->data));
- } else {
- n = (n & MBFL_WCSGROUP_MASK) | MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(n, filter->data));
- }
+ int n = ((c & 0xFFU) << 24) | filter->cache;
+ filter->cache = filter->status = 0;
+ CK(emit_char_if_valid(n, filter));
}
return c;
}
-/*
- * wchar => UTF-32LE
- */
int mbfl_filt_conv_wchar_utf32le(int c, mbfl_convert_filter *filter)
{
if (c >= 0 && c < MBFL_WCSPLANE_UTF32MAX) {
@@ -289,3 +216,17 @@ int mbfl_filt_conv_wchar_utf32le(int c, mbfl_convert_filter *filter)
return c;
}
+
+static int mbfl_filt_conv_utf32_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status) {
+ /* Input string was truncated */
+ CK((*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data));
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf32.h b/ext/mbstring/libmbfl/filters/mbfilter_utf32.h
index 14b9fa4823..58c69d72f1 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf32.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf32.h
@@ -33,6 +33,7 @@
extern const mbfl_encoding mbfl_encoding_utf32;
extern const mbfl_encoding mbfl_encoding_utf32be;
extern const mbfl_encoding mbfl_encoding_utf32le;
+
extern const struct mbfl_convert_vtbl vtbl_utf32_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_utf32;
extern const struct mbfl_convert_vtbl vtbl_utf32be_wchar;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c
index b54bcf2b9c..ee12d13142 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c
@@ -30,8 +30,6 @@
#include "mbfilter.h"
#include "mbfilter_utf7.h"
-static int mbfl_filt_ident_utf7(int c, mbfl_identify_filter *filter);
-
static const unsigned char mbfl_base64_table[] = {
/* 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', */
0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,
@@ -51,19 +49,13 @@ const mbfl_encoding mbfl_encoding_utf7 = {
mbfl_no_encoding_utf7,
"UTF-7",
"UTF-7",
- (const char *(*)[])&mbfl_encoding_utf7_aliases,
+ mbfl_encoding_utf7_aliases,
NULL,
- MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
+ MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_utf7_wchar,
&vtbl_wchar_utf7
};
-const struct mbfl_identify_vtbl vtbl_identify_utf7 = {
- mbfl_no_encoding_utf7,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf7
-};
-
const struct mbfl_convert_vtbl vtbl_utf7_wchar = {
mbfl_no_encoding_utf7,
mbfl_no_encoding_wchar,
@@ -409,52 +401,3 @@ int mbfl_filt_conv_wchar_utf7_flush(mbfl_convert_filter *filter)
return 0;
}
-
-static int mbfl_filt_ident_utf7(int c, mbfl_identify_filter *filter)
-{
- int n;
-
- switch (filter->status) {
- /* directly encoded characters */
- case 0:
- if (c == 0x2b) { /* '+' shift character */
- filter->status++;
- } else if (c == 0x5c || c == 0x7e || c < 0 || c > 0x7f) { /* illegal character */
- filter->flag = 1; /* bad */
- }
- break;
-
- /* Modified Base64 */
- case 1:
- case 2:
- n = 0;
- if (c >= 0x41 && c <= 0x5a) { /* A - Z */
- n = 1;
- } else if (c >= 0x61 && c <= 0x7a) { /* a - z */
- n = 1;
- } else if (c >= 0x30 && c <= 0x39) { /* 0 - 9 */
- n = 1;
- } else if (c == 0x2b) { /* '+' */
- n = 1;
- } else if (c == 0x2f) { /* '/' */
- n = 1;
- }
- if (n <= 0) {
- if (filter->status == 1 && c != 0x2d) {
- filter->flag = 1; /* bad */
- } else if (c < 0 || c > 0x7f) {
- filter->flag = 1; /* bad */
- }
- filter->status = 0;
- } else {
- filter->status = 2;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7.h b/ext/mbstring/libmbfl/filters/mbfilter_utf7.h
index 6223bdba97..119937eb41 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf7.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_utf7;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf7;
extern const struct mbfl_convert_vtbl vtbl_utf7_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_utf7;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c
index c8fe70fc7f..3ec7cbeabb 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c
@@ -27,16 +27,66 @@
*
*/
+/* Modified UTF-7 used for 'international mailbox names' in the IMAP protocol
+ * Also known as mUTF-7
+ * Defined in RFC 3501 5.1.3 (https://tools.ietf.org/html/rfc3501)
+ *
+ * Quoting from the RFC:
+ *
+ ***********************************************************************
+ * In modified UTF-7, printable US-ASCII characters, except for "&",
+ * represent themselves; that is, characters with octet values 0x20-0x25
+ * and 0x27-0x7e. The character "&" (0x26) is represented by the
+ * two-octet sequence "&-".
+ *
+ * All other characters (octet values 0x00-0x1f and 0x7f-0xff) are
+ * represented in modified BASE64, with a further modification from
+ * UTF-7 that "," is used instead of "/". Modified BASE64 MUST NOT be
+ * used to represent any printing US-ASCII character which can represent
+ * itself.
+ *
+ * "&" is used to shift to modified BASE64 and "-" to shift back to
+ * US-ASCII. There is no implicit shift from BASE64 to US-ASCII, and
+ * null shifts ("-&" while in BASE64; note that "&-" while in US-ASCII
+ * means "&") are not permitted. However, all names start in US-ASCII,
+ * and MUST end in US-ASCII; that is, a name that ends with a non-ASCII
+ * ISO-10646 character MUST end with a "-").
+ ***********************************************************************
+ *
+ * The purpose of all this is: 1) to keep all parts of IMAP messages 7-bit clean,
+ * 2) to avoid giving special treatment to +, /, \, and ~, since these are
+ * commonly used in mailbox names, and 3) to ensure there is only one
+ * representation of any mailbox name (vanilla UTF-7 does allow multiple
+ * representations of the same string, by Base64-encoding characters which
+ * could have been included as ASCII literals.)
+ *
+ * RFC 2152 also applies, since it defines vanilla UTF-7 (minus IMAP modifications)
+ * The following paragraph is notable:
+ *
+ ***********************************************************************
+ * Unicode is encoded using Modified Base64 by first converting Unicode
+ * 16-bit quantities to an octet stream (with the most significant octet first).
+ * Surrogate pairs (UTF-16) are converted by treating each half of the pair as
+ * a separate 16 bit quantity (i.e., no special treatment). Text with an odd
+ * number of octets is ill-formed. ISO 10646 characters outside the range
+ * addressable via surrogate pairs cannot be encoded.
+ ***********************************************************************
+ *
+ * So after reversing the modified Base64 encoding on an encoded section,
+ * the contents are interpreted as UTF-16BE. */
+
#include "mbfilter.h"
#include "mbfilter_utf7imap.h"
+static const char *mbfl_encoding_utf7imap_aliases[] = {"mUTF-7", NULL};
+
const mbfl_encoding mbfl_encoding_utf7imap = {
mbfl_no_encoding_utf7imap,
"UTF7-IMAP",
NULL,
+ mbfl_encoding_utf7imap_aliases,
NULL,
- NULL,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_utf7imap_wchar,
&vtbl_wchar_utf7imap
};
@@ -106,7 +156,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
case 0:
if (c == 0x26) { /* '&' shift character */
filter->status++;
- } else if (c >= 0 && c < 0x80) { /* ASCII */
+ } else if (c >= 0x20 && c <= 0x7E) { /* ASCII */
CK((*filter->output_function)(c, filter->data));
} else { /* illegal character */
s = c & MBFL_WCSGROUP_MASK;
@@ -145,7 +195,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
}
} else {
filter->cache = n;
- CK((*filter->output_function)(s, filter->data));
+ /* Characters which can be expressed as literal, ASCII characters
+ * should not be Base64-encoded */
+ if (s < 0x20 || s > 0x7E || s == '&') {
+ CK((*filter->output_function)(s, filter->data));
+ } else {
+ s &= MBFL_WCSGROUP_MASK;
+ s |= MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(s, filter->data));
+ }
}
break;
@@ -177,7 +235,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
}
} else {
filter->cache = n;
- CK((*filter->output_function)(s, filter->data));
+ /* Characters which can be expressed as literal, ASCII characters
+ * should not be Base64-encoded */
+ if (s < 0x20 || s > 0x7E || s == '&') {
+ CK((*filter->output_function)(s, filter->data));
+ } else {
+ s &= MBFL_WCSGROUP_MASK;
+ s |= MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(s, filter->data));
+ }
}
break;
@@ -204,7 +270,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
}
} else {
filter->cache = 0;
- CK((*filter->output_function)(s, filter->data));
+ /* Characters which can be expressed as literal, ASCII characters
+ * should not be Base64-encoded */
+ if (s < 0x20 || s > 0x7E || s == '&') {
+ CK((*filter->output_function)(s, filter->data));
+ } else {
+ s &= MBFL_WCSGROUP_MASK;
+ s |= MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(s, filter->data));
+ }
}
break;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c
index 9e97d5b069..9da9f05315 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c
@@ -30,8 +30,6 @@
#include "mbfilter.h"
#include "mbfilter_utf8.h"
-int mbfl_filt_ident_utf8(int c, mbfl_identify_filter *filter);
-
const unsigned char mblen_table_utf8[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -57,19 +55,13 @@ const mbfl_encoding mbfl_encoding_utf8 = {
mbfl_no_encoding_utf8,
"UTF-8",
"UTF-8",
- (const char *(*)[])&mbfl_encoding_utf8_aliases,
+ mbfl_encoding_utf8_aliases,
mblen_table_utf8,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_utf8_wchar,
&vtbl_wchar_utf8
};
-const struct mbfl_identify_vtbl vtbl_identify_utf8 = {
- mbfl_no_encoding_utf8,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf8
-};
-
const struct mbfl_convert_vtbl vtbl_utf8_wchar = {
mbfl_no_encoding_utf8,
mbfl_no_encoding_wchar,
@@ -236,76 +228,3 @@ int mbfl_filt_conv_wchar_utf8(int c, mbfl_convert_filter *filter)
return c;
}
-
-int mbfl_filt_ident_utf8(int c, mbfl_identify_filter *filter)
-{
- int c1;
-
- c1 = (filter->status >> 8) & 0xff;
- filter->status &= 0xff;
-
- if (c < 0x80) {
- if (c < 0) {
- filter->flag = 1; /* bad */
- } else if (filter->status) {
- filter->flag = 1; /* bad */
- }
- filter->status = 0;
- } else if (c < 0xc0) {
- switch (filter->status) {
- case 0x20: /* 3 byte code 2nd char */
- if ((c1 == 0x0 && c >= 0xa0) ||
- (c1 == 0xd && c < 0xa0) ||
- (c1 > 0x0 && c1 != 0xd)) {
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status = 0;
- }
- break;
- case 0x30: /* 4 byte code 2nd char */
- if ((c1 == 0x0 && c >= 0x90) ||
- (c1 > 0x0 && c1 < 0x4) ||
- (c1 == 0x4 && c < 0x90)) {
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status = 0;
- }
- break;
- case 0x31: /* 4 byte code 3rd char */
- filter->status++;
- break;
- case 0x10: /* 2 byte code 2nd char */
- case 0x21: /* 3 byte code 3rd char */
- case 0x32: /* 4 byte code 4th char */
- filter->status = 0;
- break;
- default:
- filter->flag = 1; /* bad */
- filter->status = 0;
- break;
- }
- } else if (c < 0xc2) { /* 0xc0,0xc1 */
- filter->flag = 1; /* bad */
- filter->status = 0;
- } else {
- if (filter->status) {
- filter->flag = 1; /* bad */
- }
- filter->status = 0;
- if (c < 0xe0) { /* 2 byte code first char */
- filter->status = 0x10;
- } else if (c < 0xf0) { /* 3 byte code 1st char */
- filter->status = 0x20;
- filter->status |= (c & 0xf) << 8;
- } else if (c < 0xf5) { /* 4 byte code 1st char */
- filter->status = 0x30;
- filter->status |= (c & 0x7) << 8;
- } else {
- filter->flag = 1; /* bad */
- }
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8.h b/ext/mbstring/libmbfl/filters/mbfilter_utf8.h
index b0c93ccd3d..24cb91ea5a 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf8.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8.h
@@ -31,7 +31,6 @@
#define MBFL_MBFILTER_UTF8_H
extern const mbfl_encoding mbfl_encoding_utf8;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf8;
extern const struct mbfl_convert_vtbl vtbl_utf8_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_utf8;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c
index ef8d4cc075..390a7eddc8 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c
@@ -32,7 +32,6 @@
#include "mbfilter_utf8_mobile.h"
#include "mbfilter_sjis_mobile.h"
-extern int mbfl_filt_ident_utf8(int c, mbfl_identify_filter *filter);
extern int mbfl_filt_conv_utf8_wchar_flush(mbfl_convert_filter *filter);
extern const unsigned char mblen_table_utf8[];
@@ -46,9 +45,9 @@ const mbfl_encoding mbfl_encoding_utf8_docomo = {
mbfl_no_encoding_utf8_docomo,
"UTF-8-Mobile#DOCOMO",
"UTF-8",
- (const char *(*)[])&mbfl_encoding_utf8_docomo_aliases,
+ mbfl_encoding_utf8_docomo_aliases,
mblen_table_utf8,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_utf8_docomo_wchar,
&vtbl_wchar_utf8_docomo
};
@@ -57,9 +56,9 @@ const mbfl_encoding mbfl_encoding_utf8_kddi_a = {
mbfl_no_encoding_utf8_kddi_a,
"UTF-8-Mobile#KDDI-A",
"UTF-8",
- (const char *(*)[])&mbfl_encoding_utf8_kddi_a_aliases,
+ mbfl_encoding_utf8_kddi_a_aliases,
mblen_table_utf8,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_utf8_kddi_a_wchar,
&vtbl_wchar_utf8_kddi_a
};
@@ -68,9 +67,9 @@ const mbfl_encoding mbfl_encoding_utf8_kddi_b = {
mbfl_no_encoding_utf8_kddi_b,
"UTF-8-Mobile#KDDI-B",
"UTF-8",
- (const char *(*)[])&mbfl_encoding_utf8_kddi_b_aliases,
+ mbfl_encoding_utf8_kddi_b_aliases,
mblen_table_utf8,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_utf8_kddi_b_wchar,
&vtbl_wchar_utf8_kddi_b
};
@@ -79,37 +78,13 @@ const mbfl_encoding mbfl_encoding_utf8_sb = {
mbfl_no_encoding_utf8_sb,
"UTF-8-Mobile#SOFTBANK",
"UTF-8",
- (const char *(*)[])&mbfl_encoding_utf8_sb_aliases,
+ mbfl_encoding_utf8_sb_aliases,
mblen_table_utf8,
- MBFL_ENCTYPE_MBCS,
+ 0,
&vtbl_utf8_sb_wchar,
&vtbl_wchar_utf8_sb
};
-const struct mbfl_identify_vtbl vtbl_identify_utf8_docomo = {
- mbfl_no_encoding_utf8_docomo,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf8
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_utf8_kddi_a = {
- mbfl_no_encoding_utf8_kddi_a,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf8
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_utf8_kddi_b = {
- mbfl_no_encoding_utf8_kddi_b,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf8
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_utf8_sb = {
- mbfl_no_encoding_utf8_sb,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf8
-};
-
const struct mbfl_convert_vtbl vtbl_utf8_docomo_wchar = {
mbfl_no_encoding_utf8_docomo,
mbfl_no_encoding_wchar,
@@ -319,7 +294,7 @@ int mbfl_filt_conv_wchar_utf8_mobile(int c, mbfl_convert_filter *filter)
c = c1;
}
- if (filter->status == 1 && filter->cache > 0) {
+ if (filter->status) {
return c;
}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.h b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.h
index 74ac6e195e..116bc16299 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.h
@@ -35,11 +35,6 @@ extern const mbfl_encoding mbfl_encoding_utf8_kddi_a;
extern const mbfl_encoding mbfl_encoding_utf8_kddi_b;
extern const mbfl_encoding mbfl_encoding_utf8_sb;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf8_docomo;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf8_kddi_a;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf8_kddi_b;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf8_sb;
-
extern const struct mbfl_convert_vtbl vtbl_utf8_docomo_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_utf8_docomo;
extern const struct mbfl_convert_vtbl vtbl_utf8_kddi_a_wchar;
diff --git a/ext/mbstring/libmbfl/filters/unicode_prop.h b/ext/mbstring/libmbfl/filters/unicode_prop.h
index 6eaefbc2e3..1ecf42c556 100644
--- a/ext/mbstring/libmbfl/filters/unicode_prop.h
+++ b/ext/mbstring/libmbfl/filters/unicode_prop.h
@@ -19,148 +19,136 @@
* Suite 330, Boston, MA 02111-1307 USA
*
* The authors of this file: PHP3 Internationalization team
- *
- */
-
-/* character property table */
-#define MBFL_CHP_CTL 0x01
-#define MBFL_CHP_DIGIT 0x02
-#define MBFL_CHP_UALPHA 0x04
-#define MBFL_CHP_LALPHA 0x08
-#define MBFL_CHP_MMHQENC 0x10 /* must Q-encoding in MIME Header encoded-word */
-#define MBFL_CHP_MSPECIAL 0x20 /* RFC822 Special characters */
-
-/*
- * Unicode table
*/
-static const unsigned char mbfl_charprop_table[] = {
-/* NUL 0 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC,
-/* SCH 1 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SIX 2 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* EIX 3 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* EOT 4 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* ENQ 5 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* ACK 6 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* BEL 7 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* BS 8 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* HI 9 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* LF 10 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* VI 11 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* FF 12 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* CR 13 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SO 14 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SI 15 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SLE 16 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* CSI 17 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* DC2 18 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* DC3 19 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* DC4 20 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* NAK 21 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SYN 22 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* EIB 23 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* CAN 24 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* EM 25 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SLB 26 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* ESC 27 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* FS 28 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* GS 29 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* RS 30 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* US 31 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SP 32 */ MBFL_CHP_MMHQENC ,
-/* ! 33 */ 0 ,
-/* " 34 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* # 35 */ MBFL_CHP_MMHQENC ,
-/* $ 36 */ MBFL_CHP_MMHQENC ,
-/* % 37 */ MBFL_CHP_MMHQENC ,
-/* & 38 */ MBFL_CHP_MMHQENC ,
-/* ' 39 */ MBFL_CHP_MMHQENC ,
-/* ( 40 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* ) 41 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* * 42 */ 0 ,
-/* + 43 */ 0 ,
-/* , 44 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* - 45 */ 0 ,
-/* . 46 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* / 47 */ 0 ,
-/* 0 48 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 1 49 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 2 50 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 3 51 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 4 52 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 5 53 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 6 54 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 7 55 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 8 56 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 9 57 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* : 58 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* ; 59 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* < 60 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* = 61 */ 0 ,
-/* > 62 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* ? 63 */ MBFL_CHP_MMHQENC ,
-/* @ 64 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* A 65 */ MBFL_CHP_UALPHA ,
-/* B 66 */ MBFL_CHP_UALPHA ,
-/* C 67 */ MBFL_CHP_UALPHA ,
-/* D 68 */ MBFL_CHP_UALPHA ,
-/* E 69 */ MBFL_CHP_UALPHA ,
-/* F 70 */ MBFL_CHP_UALPHA ,
-/* G 71 */ MBFL_CHP_UALPHA ,
-/* H 72 */ MBFL_CHP_UALPHA ,
-/* I 73 */ MBFL_CHP_UALPHA ,
-/* J 74 */ MBFL_CHP_UALPHA ,
-/* K 75 */ MBFL_CHP_UALPHA ,
-/* L 76 */ MBFL_CHP_UALPHA ,
-/* M 77 */ MBFL_CHP_UALPHA ,
-/* N 78 */ MBFL_CHP_UALPHA ,
-/* O 79 */ MBFL_CHP_UALPHA ,
-/* P 80 */ MBFL_CHP_UALPHA ,
-/* Q 81 */ MBFL_CHP_UALPHA ,
-/* R 82 */ MBFL_CHP_UALPHA ,
-/* S 83 */ MBFL_CHP_UALPHA ,
-/* T 84 */ MBFL_CHP_UALPHA ,
-/* U 85 */ MBFL_CHP_UALPHA ,
-/* V 86 */ MBFL_CHP_UALPHA ,
-/* W 87 */ MBFL_CHP_UALPHA ,
-/* X 88 */ MBFL_CHP_UALPHA ,
-/* Y 89 */ MBFL_CHP_UALPHA ,
-/* Z 90 */ MBFL_CHP_UALPHA ,
-/* [ 91 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* \ 92 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* ] 93 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* ^ 94 */ MBFL_CHP_MMHQENC ,
-/* _ 95 */ MBFL_CHP_MMHQENC ,
-/* ` 96 */ MBFL_CHP_MMHQENC ,
-/* a 97 */ MBFL_CHP_LALPHA ,
-/* b 98 */ MBFL_CHP_LALPHA ,
-/* c 99 */ MBFL_CHP_LALPHA ,
-/* d 100 */ MBFL_CHP_LALPHA ,
-/* e 101 */ MBFL_CHP_LALPHA ,
-/* f 102 */ MBFL_CHP_LALPHA ,
-/* g 103 */ MBFL_CHP_LALPHA ,
-/* h 104 */ MBFL_CHP_LALPHA ,
-/* i 105 */ MBFL_CHP_LALPHA ,
-/* j 106 */ MBFL_CHP_LALPHA ,
-/* k 107 */ MBFL_CHP_LALPHA ,
-/* l 108 */ MBFL_CHP_LALPHA ,
-/* m 109 */ MBFL_CHP_LALPHA ,
-/* n 110 */ MBFL_CHP_LALPHA ,
-/* o 111 */ MBFL_CHP_LALPHA ,
-/* p 112 */ MBFL_CHP_LALPHA ,
-/* q 113 */ MBFL_CHP_LALPHA ,
-/* r 114 */ MBFL_CHP_LALPHA ,
-/* s 115 */ MBFL_CHP_LALPHA ,
-/* t 116 */ MBFL_CHP_LALPHA ,
-/* u 117 */ MBFL_CHP_LALPHA ,
-/* v 118 */ MBFL_CHP_LALPHA ,
-/* w 119 */ MBFL_CHP_LALPHA ,
-/* x 120 */ MBFL_CHP_LALPHA ,
-/* y 121 */ MBFL_CHP_LALPHA ,
-/* z 122 */ MBFL_CHP_LALPHA ,
-/* { 123 */ MBFL_CHP_MMHQENC ,
-/* | 124 */ MBFL_CHP_MMHQENC ,
-/* } 125 */ MBFL_CHP_MMHQENC ,
-/* ~ 126 */ MBFL_CHP_MMHQENC ,
-/* DEL 127 */ MBFL_CHP_MMHQENC
+/* Should we use QPrint-encoding in MIME Header encoded-word? */
+static const unsigned char mime_char_needs_qencode[] = {
+/* NUL 0 */ 1,
+/* SCH 1 */ 1,
+/* SIX 2 */ 1,
+/* EIX 3 */ 1,
+/* EOT 4 */ 1,
+/* ENQ 5 */ 1,
+/* ACK 6 */ 1,
+/* BEL 7 */ 1,
+/* BS 8 */ 1,
+/* HI 9 */ 1,
+/* LF 10 */ 1,
+/* VI 11 */ 1,
+/* FF 12 */ 1,
+/* CR 13 */ 1,
+/* SO 14 */ 1,
+/* SI 15 */ 1,
+/* SLE 16 */ 1,
+/* CSI 17 */ 1,
+/* DC2 18 */ 1,
+/* DC3 19 */ 1,
+/* DC4 20 */ 1,
+/* NAK 21 */ 1,
+/* SYN 22 */ 1,
+/* EIB 23 */ 1,
+/* CAN 24 */ 1,
+/* EM 25 */ 1,
+/* SLB 26 */ 1,
+/* ESC 27 */ 1,
+/* FS 28 */ 1,
+/* GS 29 */ 1,
+/* RS 30 */ 1,
+/* US 31 */ 1,
+/* SP 32 */ 1,
+/* ! 33 */ 0,
+/* " 34 */ 1,
+/* # 35 */ 1,
+/* $ 36 */ 1,
+/* % 37 */ 1,
+/* & 38 */ 1,
+/* ' 39 */ 1,
+/* ( 40 */ 1,
+/* ) 41 */ 1,
+/* * 42 */ 0,
+/* + 43 */ 0,
+/* , 44 */ 1,
+/* - 45 */ 0,
+/* . 46 */ 1,
+/* / 47 */ 0,
+/* 0 48 */ 1,
+/* 1 49 */ 1,
+/* 2 50 */ 1,
+/* 3 51 */ 1,
+/* 4 52 */ 1,
+/* 5 53 */ 1,
+/* 6 54 */ 1,
+/* 7 55 */ 1,
+/* 8 56 */ 1,
+/* 9 57 */ 1,
+/* : 58 */ 1,
+/* ; 59 */ 1,
+/* < 60 */ 1,
+/* = 61 */ 0,
+/* > 62 */ 1,
+/* ? 63 */ 1,
+/* @ 64 */ 1,
+/* A 65 */ 0,
+/* B 66 */ 0,
+/* C 67 */ 0,
+/* D 68 */ 0,
+/* E 69 */ 0,
+/* F 70 */ 0,
+/* G 71 */ 0,
+/* H 72 */ 0,
+/* I 73 */ 0,
+/* J 74 */ 0,
+/* K 75 */ 0,
+/* L 76 */ 0,
+/* M 77 */ 0,
+/* N 78 */ 0,
+/* O 79 */ 0,
+/* P 80 */ 0,
+/* Q 81 */ 0,
+/* R 82 */ 0,
+/* S 83 */ 0,
+/* T 84 */ 0,
+/* U 85 */ 0,
+/* V 86 */ 0,
+/* W 87 */ 0,
+/* X 88 */ 0,
+/* Y 89 */ 0,
+/* Z 90 */ 0,
+/* [ 91 */ 1,
+/* \ 92 */ 1,
+/* ] 93 */ 1,
+/* ^ 94 */ 1,
+/* _ 95 */ 1,
+/* ` 96 */ 1,
+/* a 97 */ 0,
+/* b 98 */ 0,
+/* c 99 */ 0,
+/* d 100 */ 0,
+/* e 101 */ 0,
+/* f 102 */ 0,
+/* g 103 */ 0,
+/* h 104 */ 0,
+/* i 105 */ 0,
+/* j 106 */ 0,
+/* k 107 */ 0,
+/* l 108 */ 0,
+/* m 109 */ 0,
+/* n 110 */ 0,
+/* o 111 */ 0,
+/* p 112 */ 0,
+/* q 113 */ 0,
+/* r 114 */ 0,
+/* s 115 */ 0,
+/* t 116 */ 0,
+/* u 117 */ 0,
+/* v 118 */ 0,
+/* w 119 */ 0,
+/* x 120 */ 0,
+/* y 121 */ 0,
+/* z 122 */ 0,
+/* { 123 */ 1,
+/* | 124 */ 1,
+/* } 125 */ 1,
+/* ~ 126 */ 1,
+/* DEL 127 */ 1
};
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_armscii8.h b/ext/mbstring/libmbfl/filters/unicode_table_armscii8.h
deleted file mode 100644
index abf89867ea..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_armscii8.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file: Hayk Chamyan <hamshen@gmail.com>
- *
- */
-
-#ifndef UNICODE_TABLE_ARMSCII8_H
-#define UNICODE_TABLE_ARMSCII8_H
-
-/* ArmSCII-8 to Unicode table */
-static const unsigned short armscii8_ucs_table[] = {
-/*0x00a0, 0x00a1, 0x0587, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab,*/
-0x00a0, 0xfffd, 0x0587, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab,
-0x2014, 0x002e, 0x055d, 0x002c, 0x002d, 0x058a, 0x2026, 0x055c,
-0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563,
-0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567,
-0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b,
-0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f,
-0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573,
-0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577,
-0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b,
-0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f,
-0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583,
-/*0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x055a, 0x00ff*/
-0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x055a, 0xfffd
-};
-
-static const unsigned char ucs_armscii8_table[] = {
-0xa5, 0xa4, 0x2a, 0x2b, 0xab, 0xac, 0xa9, 0x2f
-};
-
-static const int armscii8_ucs_table_min = 0xa0;
-static const int armscii8_ucs_table_len = (sizeof (armscii8_ucs_table) / sizeof (unsigned short));
-static const int armscii8_ucs_table_max = 0xa0 + (sizeof (armscii8_ucs_table) / sizeof (unsigned short));
-
-#endif /* UNICODE_TABLE_ARMSCII8_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_cp1251.h b/ext/mbstring/libmbfl/filters/unicode_table_cp1251.h
deleted file mode 100644
index f504713805..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_cp1251.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The authors of this file: PHP3 internationalization team
- * You can contact the primary author 金本 茂 <sgk@happysize.co.jp>.
- *
- */
-
-#ifndef UNICODE_TABLE_CP1251_H
-
-/* cp1251 to Unicode table */
-static const unsigned short cp1251_ucs_table[] = {
- 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021,
- 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f,
- 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
- 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f,
- 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7,
- 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407,
- 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7,
- 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457,
- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
- 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
- 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
- 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
- 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f
-};
-static const int cp1251_ucs_table_min = 0x80;
-static const int cp1251_ucs_table_len = (sizeof (cp1251_ucs_table) / sizeof (unsigned short));
-static const int cp1251_ucs_table_max = 0x80 + (sizeof (cp1251_ucs_table) / sizeof (unsigned short));
-
-#endif /* UNICODE_TABLE_CP1251_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_cp1252.h b/ext/mbstring/libmbfl/filters/unicode_table_cp1252.h
index 92d20893cd..9eb813885b 100644
--- a/ext/mbstring/libmbfl/filters/unicode_table_cp1252.h
+++ b/ext/mbstring/libmbfl/filters/unicode_table_cp1252.h
@@ -32,9 +32,9 @@
* as it only covers this range, while the rest cover 0xa0 onwards */
static const unsigned short cp1252_ucs_table[] = {
- 0x20ac,0xfffd,0x201a,0x0192,0x201e,0x2026,0x2020,0x2021,
- 0x02c6,0x2030,0x0160,0x2039,0x0152,0xfffd,0x017d,0xfffd,
- 0xfffd,0x2018,0x2019,0x201c,0x201d,0x2022,0x2013,0x2014,
- 0x02dc,0x2122,0x0161,0x203a,0x0153,0xfffd,0x017e,0x0178
+ 0x20ac,0x0000,0x201a,0x0192,0x201e,0x2026,0x2020,0x2021,
+ 0x02c6,0x2030,0x0160,0x2039,0x0152,0x0000,0x017d,0x0000,
+ 0x0000,0x2018,0x2019,0x201c,0x201d,0x2022,0x2013,0x2014,
+ 0x02dc,0x2122,0x0161,0x203a,0x0153,0x0000,0x017e,0x0178
};
#endif /* UNICODE_TABLE_CP1252_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_cp1254.h b/ext/mbstring/libmbfl/filters/unicode_table_cp1254.h
deleted file mode 100644
index 7a9c4424ad..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_cp1254.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The authors of this file: PHP3 internationalization team
- * You can contact the primary author 金本 茂 <sgk@happysize.co.jp>.
- *
- */
-
-#ifndef UNICODE_TABLE_CP1254_H
-
-/* cp1254 to Unicode table */
-static const unsigned short cp1254_ucs_table[] = {
- 0x20ac, 0xfffe, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
- 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffe, 0xfffe, 0xfffe,
- 0xfffe, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
- 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffe, 0xfffe, 0x0178,
- 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
- 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
- 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
- 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff
-};
-static const int cp1254_ucs_table_min = 0x80;
-static const int cp1254_ucs_table_len = (sizeof (cp1254_ucs_table) / sizeof (unsigned short));
-static const int cp1254_ucs_table_max = 0x80 + (sizeof (cp1254_ucs_table) / sizeof (unsigned short));
-
-#endif /* UNICODE_TABLE_CP1254_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_cp850.h b/ext/mbstring/libmbfl/filters/unicode_table_cp850.h
deleted file mode 100644
index 57fb61dbc9..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_cp850.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- * Adaption for CP850: D. Giffeler <dg@artegic.de>
- *
- */
-
-#ifndef UNICODE_TABLE_CP850_H
-#define UNICODE_TABLE_CP850_H
-
-/* cp850_DOS to Unicode table */
-static const unsigned short cp850_ucs_table[] = {
- 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7
-, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5
-, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9
-, 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192
-, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba
-, 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb
-, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0
-, 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510
-, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3
-, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4
-, 0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce
-, 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580
-, 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe
-, 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4
-, 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8
-, 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0
-};
-static const int cp850_ucs_table_min = 0x80;
-static const int cp850_ucs_table_len = (sizeof (cp850_ucs_table) / sizeof (unsigned short));
-static const int cp850_ucs_table_max = 0x80 + (sizeof (cp850_ucs_table) / sizeof (unsigned short));
-
-#endif /* UNICODE_TABLE_CP850_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_cp866.h b/ext/mbstring/libmbfl/filters/unicode_table_cp866.h
deleted file mode 100644
index 468e1a77c2..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_cp866.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The original author of this file: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-
-#ifndef UNICODE_TABLE_CP866_H
-#define UNICODE_TABLE_CP866_H
-
-/* cp866_DOSCyrillicRussian to Unicode table */
-static const unsigned short cp866_ucs_table[] = {
- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
- 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
- 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
- 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
- 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
- 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
- 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
- 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
- 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
- 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
- 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
- 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e,
- 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0
-};
-static const int cp866_ucs_table_min = 0x80;
-static const int cp866_ucs_table_len = (sizeof (cp866_ucs_table) / sizeof (unsigned short));
-static const int cp866_ucs_table_max = 0x80 + (sizeof (cp866_ucs_table) / sizeof (unsigned short));
-
-#endif /* UNICODE_TABLE_CP866_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_10.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_10.h
deleted file mode 100644
index 2b6b78f32b..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_10.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_10_H
-static const int iso8859_10_ucs_table[] = {
- 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7,
- 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a,
- 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7,
- 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b,
- 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
- 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf,
- 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168,
- 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
- 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
- 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef,
- 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169,
- 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138
-};
-#endif /* UNICODE_TABLE_ISO8859_10_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_13.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_13.h
deleted file mode 100644
index 5822396525..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_13.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_13_H
-static const int iso8859_13_ucs_table[] = {
- 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7,
- 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7,
- 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6,
- 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112,
- 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b,
- 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7,
- 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df,
- 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113,
- 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c,
- 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7,
- 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019
-};
-#endif /* UNICODE_TABLE_ISO8859_13_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_14.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_14.h
deleted file mode 100644
index 6bd03b367a..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_14.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_14_H
-static const int iso8859_14_ucs_table[] = {
- 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7,
- 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178,
- 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56,
- 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61,
- 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a,
- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b,
- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff
-};
-#endif /* UNICODE_TABLE_ISO8859_14_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_15.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_15.h
deleted file mode 100644
index 029a2bcfc4..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_15.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_15_H
-static const int iso8859_15_ucs_table[] = {
- 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7,
- 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7,
- 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
- 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
-};
-#endif /* UNICODE_TABLE_ISO8859_15_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_16.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_16.h
deleted file mode 100644
index 555472d0dc..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_16.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLEISO8859_16_H
-static const int iso8859_16_ucs_table[] = {
- 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7,
- 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b,
- 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7,
- 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c,
- 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a,
- 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b,
- 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff
-};
-#endif /* UNICODE_TABLEISO8859_16_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_2.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_2.h
deleted file mode 100644
index 12bb3cb2dc..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_2.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_2_H
-static const int iso8859_2_ucs_table[] = {
- 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7,
- 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b,
- 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7,
- 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c,
- 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
- 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
- 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
- 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
- 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
- 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
- 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
- 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9
-};
-#endif /* UNICODE_TABLE_ISO8859_2_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_3.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_3.h
deleted file mode 100644
index f50c348aff..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_3.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_3_H
-static const int iso8859_3_ucs_table[] = {
- 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7,
- 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b,
- 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7,
- 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c,
- 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7,
- 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7,
- 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9
-};
-#endif /* UNICODE_TABLE_ISO8859_3_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_4.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_4.h
deleted file mode 100644
index ff7ecdb4c0..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_4.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_4_H
-static const int iso8859_4_ucs_table[] = {
- 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7,
- 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af,
- 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7,
- 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b,
- 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
- 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a,
- 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
- 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df,
- 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
- 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b,
- 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
- 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9
-};
-#endif /* UNICODE_TABLE_ISO8859_4_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_5.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_5.h
deleted file mode 100644
index 411ab84b60..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_5.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_5_H
-static const int iso8859_5_ucs_table[] = {
- 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
- 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f,
- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
- 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
- 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
- 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
- 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
- 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
- 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f
-};
-#endif /* UNICODE_TABLE_ISO8859_5_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_6.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_6.h
deleted file mode 100644
index 0b3952e3a0..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_6.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_6_H
-static const int iso8859_6_ucs_table[] = {
- 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f,
- 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
- 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
- 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
- 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
- 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f,
- 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-#endif /* UNICODE_TABLE_ISO8859_6_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_7.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_7.h
deleted file mode 100644
index 687f4cbc74..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_7.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_7_H
-static const int iso8859_7_ucs_table[] = {
- 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7,
- 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7,
- 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f,
- 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
- 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
- 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
- 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
- 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
- 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
- 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
- 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000
-};
-#endif /* UNICODE_TABLE_ISO8859_7_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_8.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_8.h
deleted file mode 100644
index 4ec6490bae..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_8.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_8_H
-static const int iso8859_8_ucs_table[] = {
- 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
- 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
- 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
- 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7,
- 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
- 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7,
- 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000
-};
-#endif /* UNICODE_TABLE_ISO8859_8_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_9.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_9.h
deleted file mode 100644
index 12f988ad7a..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_9.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_9_H
-static const int iso8859_9_ucs_table[] = {
- 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
- 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
- 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
- 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff
-};
-#endif /* UNICODE_TABLE_ISO8859_9_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_jis.h b/ext/mbstring/libmbfl/filters/unicode_table_jis.h
index 3236578f9b..04e6a63b9e 100644
--- a/ext/mbstring/libmbfl/filters/unicode_table_jis.h
+++ b/ext/mbstring/libmbfl/filters/unicode_table_jis.h
@@ -2303,7 +2303,7 @@ const unsigned short ucs_a1_jis_table[] = {
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0xA2C2,0x2171,0x2172,0xA2F0,0x0000,0xA2C3,0x2178,
- 0x212F,0xA2ED,0xA2EC,0x0000,0x224C,0x0000,0xA2EE,0xA2B4,
+ 0x212F,0xA2ED,0xA2EC,0x0000,0x224C,0x0000,0xA2EE,0x2131,
0x216B,0x215E,0x0000,0x0000,0x212D,0x0000,0x2279,0x0000,
0xA2B1,0x0000,0xA2EB,0x0000,0x0000,0x0000,0x0000,0xA2C4,
0xAAA2,0xAAA1,0xAAA4,0xAAAA,0xAAA3,0xAAA9,0xA9A1,0xAAAE,
@@ -2444,7 +2444,7 @@ const unsigned short ucs_a2_jis_table[] = {
0x2277,0x2278,0x0000,0x0000,0x0000,0x2145,0x2144,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x2273,0x0000,0x216C,0x216D,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x2228,0x0000,0x0000,0x0000,0x0000,
+ 0x0000,0x0000,0x0000,0x2228,0x0000,0x0000,0x2131,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
@@ -5824,7 +5824,7 @@ const unsigned short ucs_r_jis_table[] = {
0x212E,0x2361,0x2362,0x2363,0x2364,0x2365,0x2366,0x2367,
0x2368,0x2369,0x236A,0x236B,0x236C,0x236D,0x236E,0x236F,
0x2370,0x2371,0x2372,0x2373,0x2374,0x2375,0x2376,0x2377,
- 0x2378,0x2379,0x237A,0x2150,0x2143,0x2151,0x0000,0x0000,
+ 0x2378,0x2379,0x237A,0x2150,0x2143,0x2151,0x2141,0x0000,
0x0000,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,
0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_jis2004.h b/ext/mbstring/libmbfl/filters/unicode_table_jis2004.h
index 01afcc1f2d..09f7c43726 100644
--- a/ext/mbstring/libmbfl/filters/unicode_table_jis2004.h
+++ b/ext/mbstring/libmbfl/filters/unicode_table_jis2004.h
@@ -1608,11 +1608,11 @@ static const unsigned short ucs_a1_jisx0213_table[] = { // 0x0000 - 0x045f
0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
-0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+0x0058,0x0059,0x005A,0x005B,0x2140,0x005D,0x005E,0x005F,
0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
-0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x2141,0x007F,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_koi8r.h b/ext/mbstring/libmbfl/filters/unicode_table_koi8r.h
deleted file mode 100644
index fc850e5685..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_koi8r.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The original author of this file: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-
-#ifndef UNICODE_TABLE_KOI8R_H
-#define UNICODE_TABLE_KOI8R_H
-
-/* KOI8-R (RFC1489) to Unicode */
-static const unsigned short koi8r_ucs_table[] = {
- 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524,
- 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590,
- 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248,
- 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7,
- 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556,
- 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e,
- 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565,
- 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9,
- 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
- 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
- 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
- 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a,
- 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
- 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
- 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
- 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a
-};
-static const int koi8r_ucs_table_min = 0x80;
-static const int koi8r_ucs_table_len = (sizeof (koi8r_ucs_table) / sizeof (unsigned short));
-static const int koi8r_ucs_table_max = 0x80 + (sizeof (koi8r_ucs_table) / sizeof (unsigned short));
-
-
-
-#endif /* UNNICODE_TABLE_KOI8R_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_koi8u.h b/ext/mbstring/libmbfl/filters/unicode_table_koi8u.h
deleted file mode 100644
index e59c685fe8..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_koi8u.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Maksym Veremeyenko <verem@m1.tv>
- *
- */
-
-#ifndef UNICODE_TABLE_KOI8U_H
-#define UNICODE_TABLE_KOI8U_H
-
-/* KOI8-U (RFC2319) to Unicode */
-static const unsigned short koi8u_ucs_table[] = {
- 0x2500, /* BOX DRAWINGS LIGHT HORIZONTAL */
- 0x2502, /* BOX DRAWINGS LIGHT VERTICAL */
- 0x250C, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
- 0x2510, /* BOX DRAWINGS LIGHT DOWN AND LEFT */
- 0x2514, /* BOX DRAWINGS LIGHT UP AND RIGHT */
- 0x2518, /* BOX DRAWINGS LIGHT UP AND LEFT */
- 0x251C, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
- 0x2524, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
- 0x252C, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
- 0x2534, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
- 0x253C, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
- 0x2580, /* UPPER HALF BLOCK */
- 0x2584, /* LOWER HALF BLOCK */
- 0x2588, /* FULL BLOCK */
- 0x258C, /* LEFT HALF BLOCK */
- 0x2590, /* RIGHT HALF BLOCK */
- 0x2591, /* LIGHT SHADE */
- 0x2592, /* MEDIUM SHADE */
- 0x2593, /* DARK SHADE */
- 0x2320, /* TOP HALF INTEGRAL */
- 0x25A0, /* BLACK SQUARE */
- 0x2219, /* BULLET OPERATOR */
- 0x221A, /* SQUARE ROOT */
- 0x2248, /* ALMOST EQUAL TO */
- 0x2264, /* LESS THAN OR EQUAL TO */
- 0x2265, /* GREATER THAN OR EQUAL TO */
- 0x00A0, /* NO-BREAK SPACE */
- 0x2321, /* BOTTOM HALF INTEGRAL */
- 0x00B0, /* DEGREE SIGN */
- 0x00B2, /* SUPERSCRIPT TWO */
- 0x00B7, /* MIDDLE DOT */
- 0x00F7, /* DIVISION SIGN */
- 0x2550, /* BOX DRAWINGS DOUBLE HORIZONTAL */
- 0x2551, /* BOX DRAWINGS DOUBLE VERTICAL */
- 0x2552, /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE */
- 0x0451, /* CYRILLIC SMALL LETTER IO */
- 0x0454, /* CYRILLIC SMALL LETTER UKRAINIAN IE */
- 0x2554, /* BOX DRAWINGS DOUBLE DOWN AND RIGHT */
- 0x0456, /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
- 0x0457, /* CYRILLIC SMALL LETTER YI (UKRAINIAN) */
- 0x2557, /* BOX DRAWINGS DOUBLE DOWN AND LEFT */
- 0x2558, /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE */
- 0x2559, /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE */
- 0x255A, /* BOX DRAWINGS DOUBLE UP AND RIGHT */
- 0x255B, /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE */
- 0x0491, /* CYRILLIC SMALL LETTER GHE WITH UPTURN */
- 0x255D, /* BOX DRAWINGS DOUBLE UP AND LEFT */
- 0x255E, /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE */
- 0x255F, /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE */
- 0x2560, /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT */
- 0x2561, /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE */
- 0x0401, /* CYRILLIC CAPITAL LETTER IO */
- 0x0404, /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */
- 0x2563, /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT */
- 0x0406, /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
- 0x0407, /* CYRILLIC CAPITAL LETTER YI (UKRAINIAN) */
- 0x2566, /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL */
- 0x2567, /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE */
- 0x2568, /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE */
- 0x2569, /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL */
- 0x256A, /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE */
- 0x0490, /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN */
- 0x256C, /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL */
- 0x00A9, /* COPYRIGHT SIGN */
- 0x044E, /* CYRILLIC SMALL LETTER YU */
- 0x0430, /* CYRILLIC SMALL LETTER A */
- 0x0431, /* CYRILLIC SMALL LETTER BE */
- 0x0446, /* CYRILLIC SMALL LETTER TSE */
- 0x0434, /* CYRILLIC SMALL LETTER DE */
- 0x0435, /* CYRILLIC SMALL LETTER IE */
- 0x0444, /* CYRILLIC SMALL LETTER EF */
- 0x0433, /* CYRILLIC SMALL LETTER GHE */
- 0x0445, /* CYRILLIC SMALL LETTER KHA */
- 0x0438, /* CYRILLIC SMALL LETTER I */
- 0x0439, /* CYRILLIC SMALL LETTER SHORT I */
- 0x043A, /* CYRILLIC SMALL LETTER KA */
- 0x043B, /* CYRILLIC SMALL LETTER EL */
- 0x043C, /* CYRILLIC SMALL LETTER EM */
- 0x043D, /* CYRILLIC SMALL LETTER EN */
- 0x043E, /* CYRILLIC SMALL LETTER O */
- 0x043F, /* CYRILLIC SMALL LETTER PE */
- 0x044F, /* CYRILLIC SMALL LETTER YA */
- 0x0440, /* CYRILLIC SMALL LETTER ER */
- 0x0441, /* CYRILLIC SMALL LETTER ES */
- 0x0442, /* CYRILLIC SMALL LETTER TE */
- 0x0443, /* CYRILLIC SMALL LETTER U */
- 0x0436, /* CYRILLIC SMALL LETTER ZHE */
- 0x0432, /* CYRILLIC SMALL LETTER VE */
- 0x044C, /* CYRILLIC SMALL LETTER SOFT SIGN */
- 0x044B, /* CYRILLIC SMALL LETTER YERU */
- 0x0437, /* CYRILLIC SMALL LETTER ZE */
- 0x0448, /* CYRILLIC SMALL LETTER SHA */
- 0x044D, /* CYRILLIC SMALL LETTER E */
- 0x0449, /* CYRILLIC SMALL LETTER SHCHA */
- 0x0447, /* CYRILLIC SMALL LETTER CHE */
- 0x044A, /* CYRILLIC SMALL LETTER HARD SIGN */
- 0x042E, /* CYRILLIC CAPITAL LETTER YU */
- 0x0410, /* CYRILLIC CAPITAL LETTER A */
- 0x0411, /* CYRILLIC CAPITAL LETTER BE */
- 0x0426, /* CYRILLIC CAPITAL LETTER TSE */
- 0x0414, /* CYRILLIC CAPITAL LETTER DE */
- 0x0415, /* CYRILLIC CAPITAL LETTER IE */
- 0x0424, /* CYRILLIC CAPITAL LETTER EF */
- 0x0413, /* CYRILLIC CAPITAL LETTER GHE */
- 0x0425, /* CYRILLIC CAPITAL LETTER KHA */
- 0x0418, /* CYRILLIC CAPITAL LETTER I */
- 0x0419, /* CYRILLIC CAPITAL LETTER SHORT I */
- 0x041A, /* CYRILLIC CAPITAL LETTER KA */
- 0x041B, /* CYRILLIC CAPITAL LETTER EL */
- 0x041C, /* CYRILLIC CAPITAL LETTER EM */
- 0x041D, /* CYRILLIC CAPITAL LETTER EN */
- 0x041E, /* CYRILLIC CAPITAL LETTER O */
- 0x041F, /* CYRILLIC CAPITAL LETTER PE */
- 0x042F, /* CYRILLIC CAPITAL LETTER YA */
- 0x0420, /* CYRILLIC CAPITAL LETTER ER */
- 0x0421, /* CYRILLIC CAPITAL LETTER ES */
- 0x0422, /* CYRILLIC CAPITAL LETTER TE */
- 0x0423, /* CYRILLIC CAPITAL LETTER U */
- 0x0416, /* CYRILLIC CAPITAL LETTER ZHE */
- 0x0412, /* CYRILLIC CAPITAL LETTER VE */
- 0x042C, /* CYRILLIC CAPITAL LETTER SOFT SIGN */
- 0x042B, /* CYRILLIC CAPITAL LETTER YERU */
- 0x0417, /* CYRILLIC CAPITAL LETTER ZE */
- 0x0428, /* CYRILLIC CAPITAL LETTER SHA */
- 0x042D, /* CYRILLIC CAPITAL LETTER E */
- 0x0429, /* CYRILLIC CAPITAL LETTER SHCHA */
- 0x0427, /* CYRILLIC CAPITAL LETTER CHE */
- 0x042A /* CYRILLIC CAPITAL LETTER HARD SIGN */
-};
-static const int koi8u_ucs_table_min = 0x80;
-static const int koi8u_ucs_table_len = (sizeof (koi8u_ucs_table) / sizeof (unsigned short));
-static const int koi8u_ucs_table_max = 0x80 + (sizeof (koi8u_ucs_table) / sizeof (unsigned short));
-
-
-
-#endif /* UNNICODE_TABLE_KOI8U_H */
diff --git a/ext/mbstring/libmbfl/mbfl/eaw_table.h b/ext/mbstring/libmbfl/mbfl/eaw_table.h
index 4959454451..b7ec454d00 100644
--- a/ext/mbstring/libmbfl/mbfl/eaw_table.h
+++ b/ext/mbstring/libmbfl/mbfl/eaw_table.h
@@ -1,4 +1,8 @@
-/* East Asian Width table
+/* This file was generated by ext/mbstring/ucgendat/ucgendat.php.
+ *
+ * DO NOT EDIT THIS FILE!
+ *
+ * East Asian Width table
*
* Some characters in East Asian languages are intended to be displayed in a space
* which is roughly square. (This contrasts with others such as the Latin alphabet,
@@ -7,16 +11,48 @@
* when doing things like wrapping text to a specific width.
*
* Each pair of numbers in the below table is a range of Unicode codepoints
- * which should be displayed as double-width. */
+ * which should be displayed as double-width.
+ */
static const struct {
int begin;
int end;
} mbfl_eaw_table[] = {
{ 0x1100, 0x115f },
- { 0x11a3, 0x11a7 },
- { 0x11fa, 0x11ff },
+ { 0x231a, 0x231b },
{ 0x2329, 0x232a },
+ { 0x23e9, 0x23ec },
+ { 0x23f0, 0x23f0 },
+ { 0x23f3, 0x23f3 },
+ { 0x25fd, 0x25fe },
+ { 0x2614, 0x2615 },
+ { 0x2648, 0x2653 },
+ { 0x267f, 0x267f },
+ { 0x2693, 0x2693 },
+ { 0x26a1, 0x26a1 },
+ { 0x26aa, 0x26ab },
+ { 0x26bd, 0x26be },
+ { 0x26c4, 0x26c5 },
+ { 0x26ce, 0x26ce },
+ { 0x26d4, 0x26d4 },
+ { 0x26ea, 0x26ea },
+ { 0x26f2, 0x26f3 },
+ { 0x26f5, 0x26f5 },
+ { 0x26fa, 0x26fa },
+ { 0x26fd, 0x26fd },
+ { 0x2705, 0x2705 },
+ { 0x270a, 0x270b },
+ { 0x2728, 0x2728 },
+ { 0x274c, 0x274c },
+ { 0x274e, 0x274e },
+ { 0x2753, 0x2755 },
+ { 0x2757, 0x2757 },
+ { 0x2795, 0x2797 },
+ { 0x27b0, 0x27b0 },
+ { 0x27bf, 0x27bf },
+ { 0x2b1b, 0x2b1c },
+ { 0x2b50, 0x2b50 },
+ { 0x2b55, 0x2b55 },
{ 0x2e80, 0x2e99 },
{ 0x2e9b, 0x2ef3 },
{ 0x2f00, 0x2fd5 },
@@ -24,20 +60,16 @@ static const struct {
{ 0x3000, 0x303e },
{ 0x3041, 0x3096 },
{ 0x3099, 0x30ff },
- { 0x3105, 0x312d },
+ { 0x3105, 0x312f },
{ 0x3131, 0x318e },
- { 0x3190, 0x31ba },
- { 0x31c0, 0x31e3 },
+ { 0x3190, 0x31e3 },
{ 0x31f0, 0x321e },
{ 0x3220, 0x3247 },
- { 0x3250, 0x32fe },
- { 0x3300, 0x4dbf },
+ { 0x3250, 0x4dbf },
{ 0x4e00, 0xa48c },
{ 0xa490, 0xa4c6 },
{ 0xa960, 0xa97c },
{ 0xac00, 0xd7a3 },
- { 0xd7b0, 0xd7c6 },
- { 0xd7cb, 0xd7fb },
{ 0xf900, 0xfaff },
{ 0xfe10, 0xfe19 },
{ 0xfe30, 0xfe52 },
@@ -45,11 +77,61 @@ static const struct {
{ 0xfe68, 0xfe6b },
{ 0xff01, 0xff60 },
{ 0xffe0, 0xffe6 },
- { 0x1b000, 0x1b001 },
+ { 0x16fe0, 0x16fe4 },
+ { 0x16ff0, 0x16ff1 },
+ { 0x17000, 0x187f7 },
+ { 0x18800, 0x18cd5 },
+ { 0x18d00, 0x18d08 },
+ { 0x1b000, 0x1b11e },
+ { 0x1b150, 0x1b152 },
+ { 0x1b164, 0x1b167 },
+ { 0x1b170, 0x1b2fb },
+ { 0x1f004, 0x1f004 },
+ { 0x1f0cf, 0x1f0cf },
+ { 0x1f18e, 0x1f18e },
+ { 0x1f191, 0x1f19a },
{ 0x1f200, 0x1f202 },
- { 0x1f210, 0x1f23a },
+ { 0x1f210, 0x1f23b },
{ 0x1f240, 0x1f248 },
{ 0x1f250, 0x1f251 },
+ { 0x1f260, 0x1f265 },
+ { 0x1f300, 0x1f320 },
+ { 0x1f32d, 0x1f335 },
+ { 0x1f337, 0x1f37c },
+ { 0x1f37e, 0x1f393 },
+ { 0x1f3a0, 0x1f3ca },
+ { 0x1f3cf, 0x1f3d3 },
+ { 0x1f3e0, 0x1f3f0 },
+ { 0x1f3f4, 0x1f3f4 },
+ { 0x1f3f8, 0x1f43e },
+ { 0x1f440, 0x1f440 },
+ { 0x1f442, 0x1f4fc },
+ { 0x1f4ff, 0x1f53d },
+ { 0x1f54b, 0x1f54e },
+ { 0x1f550, 0x1f567 },
+ { 0x1f57a, 0x1f57a },
+ { 0x1f595, 0x1f596 },
+ { 0x1f5a4, 0x1f5a4 },
+ { 0x1f5fb, 0x1f64f },
+ { 0x1f680, 0x1f6c5 },
+ { 0x1f6cc, 0x1f6cc },
+ { 0x1f6d0, 0x1f6d2 },
+ { 0x1f6d5, 0x1f6d7 },
+ { 0x1f6eb, 0x1f6ec },
+ { 0x1f6f4, 0x1f6fc },
+ { 0x1f7e0, 0x1f7eb },
+ { 0x1f90c, 0x1f93a },
+ { 0x1f93c, 0x1f945 },
+ { 0x1f947, 0x1f978 },
+ { 0x1f97a, 0x1f9cb },
+ { 0x1f9cd, 0x1f9ff },
+ { 0x1fa70, 0x1fa74 },
+ { 0x1fa78, 0x1fa7a },
+ { 0x1fa80, 0x1fa86 },
+ { 0x1fa90, 0x1faa8 },
+ { 0x1fab0, 0x1fab6 },
+ { 0x1fac0, 0x1fac2 },
+ { 0x1fad0, 0x1fad6 },
{ 0x20000, 0x2fffd },
- { 0x30000, 0x3fffd }
+ { 0x30000, 0x3fffd },
};
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c
index 793dd8e078..1904786576 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfilter.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c
@@ -86,9 +86,11 @@
#include "mbfl_filter_output.h"
#include "mbfilter_8bit.h"
#include "mbfilter_wchar.h"
-#include "filters/mbfilter_ascii.h"
+#include "mbstring.h"
+#include "php_unicode.h"
#include "filters/mbfilter_base64.h"
#include "filters/mbfilter_qprint.h"
+#include "filters/mbfilter_singlebyte.h"
#include "filters/mbfilter_tl_jisx0201_jisx0208.h"
#include "filters/mbfilter_utf8.h"
@@ -200,7 +202,6 @@ size_t mbfl_buffer_converter_feed(mbfl_buffer_converter *convd, mbfl_string *str
size_t n;
unsigned char *p;
mbfl_convert_filter *filter;
- int (*filter_function)(int c, mbfl_convert_filter *filter);
ZEND_ASSERT(convd);
ZEND_ASSERT(string);
@@ -212,9 +213,8 @@ size_t mbfl_buffer_converter_feed(mbfl_buffer_converter *convd, mbfl_string *str
filter = convd->filter1;
if (filter != NULL) {
- filter_function = filter->filter_function;
while (n > 0) {
- if ((*filter_function)(*p++, filter) < 0) {
+ if ((*filter->filter_function)(*p++, filter) < 0) {
return p - string->val;
}
n--;
@@ -234,9 +234,6 @@ mbfl_buffer_converter_flush(mbfl_buffer_converter *convd)
if (convd->filter1 != NULL) {
mbfl_convert_filter_flush(convd->filter1);
}
- if (convd->filter2 != NULL) {
- mbfl_convert_filter_flush(convd->filter2);
- }
return 0;
}
@@ -262,9 +259,6 @@ mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *str
if (convd->filter1 != NULL) {
mbfl_convert_filter_flush(convd->filter1);
}
- if (convd->filter2 != NULL) {
- mbfl_convert_filter_flush(convd->filter2);
- }
result->encoding = convd->to;
return mbfl_memory_device_result(&convd->device, result);
}
@@ -291,126 +285,102 @@ size_t mbfl_buffer_illegalchars(mbfl_buffer_converter *convd)
/*
* encoding detector
*/
-mbfl_encoding_detector *
-mbfl_encoding_detector_new(const mbfl_encoding **elist, int elistsz, int strict)
+static int mbfl_estimate_encoding_likelihood(int c, void* data)
{
- mbfl_encoding_detector *identd;
-
- int i, num;
- mbfl_identify_filter *filter;
+ mbfl_convert_filter *filter = *((mbfl_convert_filter**)data);
+ uintptr_t *score = (uintptr_t*)(&filter->opaque);
+
+ /* Receive wchars decoded from test string using candidate encoding
+ * If the test string was invalid in the candidate encoding, we assume
+ * it's the wrong one. */
+ if (c & MBFL_WCSGROUP_THROUGH) {
+ filter->num_illegalchar++;
+ } else if (php_unicode_is_cntrl(c) || php_unicode_is_private(c)) {
+ /* Otherwise, count how many control characters and 'private use'
+ * codepoints we see. Those are rarely used and may indicate that
+ * the candidate encoding is not the right one. */
+ *score += 10;
+ } else if (php_unicode_is_punct(c)) {
+ /* Punctuation is also less common than letters/digits */
+ (*score)++;
+ }
+ return c;
+}
- if (elist == NULL || elistsz <= 0) {
+mbfl_encoding_detector *mbfl_encoding_detector_new(const mbfl_encoding **elist, int elistsz, int strict)
+{
+ if (!elistsz) {
return NULL;
}
- /* allocate */
- identd = emalloc(sizeof(mbfl_encoding_detector));
- identd->filter_list = ecalloc(elistsz, sizeof(mbfl_identify_filter *));
-
- /* create filters */
- i = 0;
- num = 0;
- while (i < elistsz) {
- filter = mbfl_identify_filter_new2(elist[i]);
- if (filter != NULL) {
- identd->filter_list[num] = filter;
- num++;
- }
- i++;
+ mbfl_encoding_detector *identd = emalloc(sizeof(mbfl_encoding_detector));
+ identd->filter_list = ecalloc(elistsz, sizeof(mbfl_convert_filter*));
+ for (int i = 0; i < elistsz; i++) {
+ identd->filter_list[i] = mbfl_convert_filter_new(elist[i], &mbfl_encoding_wchar,
+ mbfl_estimate_encoding_likelihood, NULL, &identd->filter_list[i]);
+ identd->filter_list[i]->opaque = (void*)0;
}
- identd->filter_list_size = num;
-
- /* set strict flag */
+ identd->filter_list_size = elistsz;
identd->strict = strict;
-
return identd;
}
-
-void
-mbfl_encoding_detector_delete(mbfl_encoding_detector *identd)
+void mbfl_encoding_detector_delete(mbfl_encoding_detector *identd)
{
- int i;
-
- if (identd != NULL) {
- if (identd->filter_list != NULL) {
- i = identd->filter_list_size;
- while (i > 0) {
- i--;
- mbfl_identify_filter_delete(identd->filter_list[i]);
- }
- efree((void *)identd->filter_list);
- }
- efree((void *)identd);
+ for (int i = 0; i < identd->filter_list_size; i++) {
+ mbfl_convert_filter_delete(identd->filter_list[i]);
}
+ efree(identd->filter_list);
+ efree(identd);
}
-int
-mbfl_encoding_detector_feed(mbfl_encoding_detector *identd, mbfl_string *string)
+int mbfl_encoding_detector_feed(mbfl_encoding_detector *identd, mbfl_string *string)
{
- int res = 0;
- /* feed data */
- if (identd != NULL && string != NULL && string->val != NULL) {
- int num = identd->filter_list_size;
- size_t n = string->len;
- unsigned char *p = string->val;
- int bad = 0;
- while (n > 0) {
- int i;
- for (i = 0; i < num; i++) {
- mbfl_identify_filter *filter = identd->filter_list[i];
- if (!filter->flag) {
- (*filter->filter_function)(*p, filter);
- if (filter->flag) {
- bad++;
- }
+ int num = identd->filter_list_size;
+ size_t n = string->len;
+ unsigned char *p = string->val;
+ int bad = 0;
+
+ while (n--) {
+ for (int i = 0; i < num; i++) {
+ mbfl_convert_filter *filter = identd->filter_list[i];
+ if (!filter->num_illegalchar) {
+ (*filter->filter_function)(*p, filter);
+ if (filter->num_illegalchar) {
+ bad++;
}
}
- if ((num - 1) <= bad) {
- res = 1;
- break;
- }
- p++;
- n--;
}
+ if ((num - 1) <= bad && !identd->strict) {
+ return 1;
+ }
+ p++;
}
- return res;
+ if (identd->strict) {
+ for (int i = 0; i < num; i++) {
+ mbfl_convert_filter *filter = identd->filter_list[i];
+ (filter->filter_flush)(filter);
+ }
+ }
+
+ return 0;
}
const mbfl_encoding *mbfl_encoding_detector_judge(mbfl_encoding_detector *identd)
{
- mbfl_identify_filter *filter;
- const mbfl_encoding *encoding = NULL;
- int n;
-
- /* judge */
- if (identd != NULL) {
- n = identd->filter_list_size - 1;
- while (n >= 0) {
- filter = identd->filter_list[n];
- if (!filter->flag) {
- if (!identd->strict || !filter->status) {
- encoding = filter->encoding;
- }
- }
- n--;
- }
+ uintptr_t best_score = UINT_MAX; /* Low score is 'better' */
+ const mbfl_encoding *enc = NULL;
- /* fallback judge */
- if (!encoding) {
- n = identd->filter_list_size - 1;
- while (n >= 0) {
- filter = identd->filter_list[n];
- if (!filter->flag) {
- encoding = filter->encoding;
- }
- n--;
- }
+ for (int i = 0; i < identd->filter_list_size; i++) {
+ mbfl_convert_filter *filter = identd->filter_list[i];
+ if (!filter->num_illegalchar && (uintptr_t)filter->opaque < best_score) {
+ enc = filter->from;
+ best_score = (uintptr_t)filter->opaque;
}
}
- return encoding;
+ return enc;
}
/*
@@ -479,83 +449,19 @@ mbfl_convert_encoding(
return mbfl_memory_device_result(&device, result);
}
-
/*
* identify encoding
*/
-const mbfl_encoding *
-mbfl_identify_encoding(mbfl_string *string, const mbfl_encoding **elist, int elistsz, int strict)
+const mbfl_encoding *mbfl_identify_encoding(mbfl_string *string, const mbfl_encoding **elist, int elistsz, int strict)
{
- int i, num, bad;
- size_t n;
- unsigned char *p;
- mbfl_identify_filter *flist, *filter;
- const mbfl_encoding *encoding;
-
- /* flist is an array of mbfl_identify_filter instances */
- flist = ecalloc(elistsz, sizeof(mbfl_identify_filter));
-
- num = 0;
- if (elist != NULL) {
- for (i = 0; i < elistsz; i++) {
- if (!mbfl_identify_filter_init2(&flist[num], elist[i])) {
- num++;
- }
- }
- }
-
- /* feed data */
- n = string->len;
- p = string->val;
-
- if (p != NULL) {
- bad = 0;
- while (n > 0) {
- for (i = 0; i < num; i++) {
- filter = &flist[i];
- if (!filter->flag) {
- (*filter->filter_function)(*p, filter);
- if (filter->flag) {
- bad++;
- }
- }
- }
- if ((num - 1) <= bad && !strict) {
- break;
- }
- p++;
- n--;
- }
- }
-
- /* judge */
- encoding = NULL;
-
- for (i = 0; i < num; i++) {
- filter = &flist[i];
- if (!filter->flag) {
- if (strict && filter->status) {
- continue;
- }
- encoding = filter->encoding;
- break;
- }
- }
-
- /* fall-back judge */
- if (!encoding) {
- for (i = 0; i < num; i++) {
- filter = &flist[i];
- if (!filter->flag && (!strict || !filter->status)) {
- encoding = filter->encoding;
- break;
- }
- }
+ if (!elistsz) {
+ return NULL;
}
-
- efree((void *)flist);
-
- return encoding;
+ mbfl_encoding_detector *identd = mbfl_encoding_detector_new(elist, elistsz, strict);
+ mbfl_encoding_detector_feed(identd, string);
+ const mbfl_encoding *enc = mbfl_encoding_detector_judge(identd);
+ mbfl_encoding_detector_delete(identd);
+ return enc;
}
/*
@@ -578,9 +484,9 @@ mbfl_strlen(const mbfl_string *string)
len = 0;
if (encoding->flag & MBFL_ENCTYPE_SBCS) {
len = string->len;
- } else if (encoding->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) {
+ } else if (encoding->flag & MBFL_ENCTYPE_WCS2) {
len = string->len/2;
- } else if (encoding->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) {
+ } else if (encoding->flag & MBFL_ENCTYPE_WCS4) {
len = string->len/4;
} else if (encoding->mblen_table != NULL) {
const unsigned char *mbtab = encoding->mblen_table;
@@ -931,14 +837,14 @@ mbfl_substr(
mbfl_string_init(result);
result->encoding = string->encoding;
- if ((encoding->flag & (MBFL_ENCTYPE_SBCS | MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE | MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) ||
+ if ((encoding->flag & (MBFL_ENCTYPE_SBCS | MBFL_ENCTYPE_WCS2 | MBFL_ENCTYPE_WCS4)) ||
encoding->mblen_table != NULL) {
len = string->len;
if (encoding->flag & MBFL_ENCTYPE_SBCS) {
start = from;
- } else if (encoding->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) {
+ } else if (encoding->flag & MBFL_ENCTYPE_WCS2) {
start = from*2;
- } else if (encoding->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) {
+ } else if (encoding->flag & MBFL_ENCTYPE_WCS4) {
start = from*4;
} else {
const unsigned char *mbtab = encoding->mblen_table;
@@ -963,9 +869,9 @@ mbfl_substr(
end = len;
} else if (encoding->flag & MBFL_ENCTYPE_SBCS) {
end = start + length;
- } else if (encoding->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) {
+ } else if (encoding->flag & MBFL_ENCTYPE_WCS2) {
end = start + length*2;
- } else if (encoding->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) {
+ } else if (encoding->flag & MBFL_ENCTYPE_WCS4) {
end = start + length*4;
} else {
const unsigned char *mbtab = encoding->mblen_table;
@@ -1078,18 +984,13 @@ mbfl_strcut(
mbfl_string_init(result);
result->encoding = string->encoding;
- if ((encoding->flag & (MBFL_ENCTYPE_SBCS
- | MBFL_ENCTYPE_WCS2BE
- | MBFL_ENCTYPE_WCS2LE
- | MBFL_ENCTYPE_WCS4BE
- | MBFL_ENCTYPE_WCS4LE))
- || encoding->mblen_table != NULL) {
+ if ((encoding->flag & (MBFL_ENCTYPE_SBCS | MBFL_ENCTYPE_WCS2 | MBFL_ENCTYPE_WCS4)) || encoding->mblen_table != NULL) {
const unsigned char *start = NULL;
const unsigned char *end = NULL;
unsigned char *w;
size_t sz;
- if (encoding->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) {
+ if (encoding->flag & MBFL_ENCTYPE_WCS2) {
from &= -2;
if (length >= string->len - from) {
@@ -1098,7 +999,7 @@ mbfl_strcut(
start = string->val + from;
end = start + (length & -2);
- } else if (encoding->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) {
+ } else if (encoding->flag & MBFL_ENCTYPE_WCS4) {
from &= -4;
if (length >= string->len - from) {
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.h b/ext/mbstring/libmbfl/mbfl/mbfilter.h
index 16742be96c..b914a36c9e 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfilter.h
+++ b/ext/mbstring/libmbfl/mbfl/mbfilter.h
@@ -93,7 +93,6 @@
#include "mbfl_language.h"
#include "mbfl_string.h"
#include "mbfl_convert.h"
-#include "mbfl_ident.h"
/* Prefer local fix, otherwise need to include too much. */
#ifndef ssize_t
@@ -156,7 +155,7 @@ MBFLAPI extern size_t mbfl_buffer_illegalchars(mbfl_buffer_converter *convd);
typedef struct _mbfl_encoding_detector mbfl_encoding_detector;
struct _mbfl_encoding_detector {
- mbfl_identify_filter **filter_list;
+ mbfl_convert_filter **filter_list;
int filter_list_size;
int strict;
};
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c
index f4c74946c1..4017829cf8 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c
@@ -43,7 +43,7 @@ const mbfl_encoding mbfl_encoding_8bit = {
mbfl_no_encoding_8bit,
"8bit",
"8bit",
- (const char *(*)[])&mbfl_encoding_8bit_aliases,
+ mbfl_encoding_8bit_aliases,
NULL,
MBFL_ENCTYPE_SBCS,
&vtbl_8bit_wchar,
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c b/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c
index 3d7cffe9c1..e43f746ecc 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c
@@ -38,7 +38,7 @@ const mbfl_encoding mbfl_encoding_pass = {
mbfl_no_encoding_pass,
"pass",
NULL,
- (const char *(*)[])&mbfl_encoding_pass_aliases,
+ mbfl_encoding_pass_aliases,
NULL,
0,
NULL,
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c b/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c
index f69e70a64a..a2b22c9105 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c
@@ -38,7 +38,7 @@ const mbfl_encoding mbfl_encoding_wchar = {
NULL,
NULL,
NULL,
- MBFL_ENCTYPE_WCS4BE,
+ MBFL_ENCTYPE_WCS4,
NULL,
NULL
};
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_consts.h b/ext/mbstring/libmbfl/mbfl/mbfl_consts.h
index 3e15400879..bc645ab761 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_consts.h
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_consts.h
@@ -32,13 +32,9 @@
#define MBFL_CONSTS_H
#define MBFL_ENCTYPE_SBCS 0x00000001 /* single-byte encoding */
-#define MBFL_ENCTYPE_MBCS 0x00000002 /* multi-byte encoding */
-#define MBFL_ENCTYPE_WCS2BE 0x00000010 /* 2 bytes/char, big endian */
-#define MBFL_ENCTYPE_WCS2LE 0x00000020 /* 2 bytes/char, little endian */
-#define MBFL_ENCTYPE_MWC2BE 0x00000040 /* 2+ bytes/char, big endian */
-#define MBFL_ENCTYPE_MWC2LE 0x00000080 /* 2+ bytes/char, little endian */
-#define MBFL_ENCTYPE_WCS4BE 0x00000100 /* 4 bytes/char, big endian */
-#define MBFL_ENCTYPE_WCS4LE 0x00000200 /* 4 bytes/char, little endian */
+#define MBFL_ENCTYPE_WCS2 0x00000010 /* 2 bytes/char */
+#define MBFL_ENCTYPE_MWC2 0x00000040 /* 2+ bytes/char */
+#define MBFL_ENCTYPE_WCS4 0x00000100 /* 4 bytes/char */
#define MBFL_ENCTYPE_GL_UNSAFE 0x00004000
/* wchar plane, special character */
@@ -51,33 +47,12 @@
#define MBFL_WCSPLANE_JIS0208 0x70e10000 /* JIS HEX : 2121h - 7E7Eh */
#define MBFL_WCSPLANE_JIS0212 0x70e20000 /* JIS HEX : 2121h - 7E7Eh */
#define MBFL_WCSPLANE_WINCP932 0x70e30000 /* JIS HEX : 2121h - 9898h */
-#define MBFL_WCSPLANE_8859_1 0x70e40000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_2 0x70e50000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_3 0x70e60000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_4 0x70e70000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_5 0x70e80000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_6 0x70e90000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_7 0x70ea0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_8 0x70eb0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_9 0x70ec0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_10 0x70ed0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_13 0x70ee0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_14 0x70ef0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_15 0x70f00000 /* 00h - FFh */
#define MBFL_WCSPLANE_KSC5601 0x70f10000 /* 2121h - 7E7Eh */
#define MBFL_WCSPLANE_GB2312 0x70f20000 /* 2121h - 7E7Eh */
#define MBFL_WCSPLANE_WINCP936 0x70f30000 /* 2121h - 9898h */
#define MBFL_WCSPLANE_BIG5 0x70f40000 /* 2121h - 9898h */
#define MBFL_WCSPLANE_CNS11643 0x70f50000 /* 2121h - 9898h */
#define MBFL_WCSPLANE_UHC 0x70f60000 /* 8141h - fefeh */
-#define MBFL_WCSPLANE_CP1251 0x70f70000
-#define MBFL_WCSPLANE_CP866 0x70f80000
-#define MBFL_WCSPLANE_KOI8R 0x70f90000
-#define MBFL_WCSPLANE_8859_16 0x70fa0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_ARMSCII8 0x70fb0000
-#define MBFL_WCSPLANE_KOI8U 0x70fc0000
-#define MBFL_WCSPLANE_CP1254 0x70fd0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_CP850 0x70fe0000 /* 00h - FFh */
#define MBFL_WCSPLANE_GB18030 0x70ff0000 /* a1a1h-e3329a35h */
#define MBFL_WCSGROUP_MASK 0xffffff
#define MBFL_WCSGROUP_UCS4MAX 0x70000000
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
index 6a46c2b541..cf35a4f4e4 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
@@ -57,29 +57,9 @@
#include "filters/mbfilter_euc_jp_2004.h"
#include "filters/mbfilter_euc_jp_win.h"
#include "filters/mbfilter_gb18030.h"
-#include "filters/mbfilter_ascii.h"
-#include "filters/mbfilter_koi8r.h"
-#include "filters/mbfilter_koi8u.h"
-#include "filters/mbfilter_cp866.h"
#include "filters/mbfilter_cp932.h"
#include "filters/mbfilter_cp936.h"
-#include "filters/mbfilter_cp1251.h"
-#include "filters/mbfilter_cp1252.h"
-#include "filters/mbfilter_cp1254.h"
#include "filters/mbfilter_cp5022x.h"
-#include "filters/mbfilter_iso8859_1.h"
-#include "filters/mbfilter_iso8859_2.h"
-#include "filters/mbfilter_iso8859_3.h"
-#include "filters/mbfilter_iso8859_4.h"
-#include "filters/mbfilter_iso8859_5.h"
-#include "filters/mbfilter_iso8859_6.h"
-#include "filters/mbfilter_iso8859_7.h"
-#include "filters/mbfilter_iso8859_8.h"
-#include "filters/mbfilter_iso8859_9.h"
-#include "filters/mbfilter_iso8859_10.h"
-#include "filters/mbfilter_iso8859_13.h"
-#include "filters/mbfilter_iso8859_14.h"
-#include "filters/mbfilter_iso8859_15.h"
#include "filters/mbfilter_base64.h"
#include "filters/mbfilter_qprint.h"
#include "filters/mbfilter_uuencode.h"
@@ -90,13 +70,10 @@
#include "filters/mbfilter_utf8_mobile.h"
#include "filters/mbfilter_utf16.h"
#include "filters/mbfilter_utf32.h"
-#include "filters/mbfilter_byte2.h"
-#include "filters/mbfilter_byte4.h"
#include "filters/mbfilter_ucs4.h"
#include "filters/mbfilter_ucs2.h"
#include "filters/mbfilter_htmlent.h"
-#include "filters/mbfilter_armscii8.h"
-#include "filters/mbfilter_cp850.h"
+#include "filters/mbfilter_singlebyte.h"
/* hex character table "0123456789ABCDEF" */
static char mbfl_hexchar_table[] = {
@@ -115,7 +92,7 @@ static const struct mbfl_convert_vtbl *mbfl_special_filter_list[] = {
NULL
};
-static void mbfl_convert_filter_common_init(mbfl_convert_filter *filter, const mbfl_encoding *from, const mbfl_encoding *to,
+static void mbfl_convert_filter_init(mbfl_convert_filter *filter, const mbfl_encoding *from, const mbfl_encoding *to,
const struct mbfl_convert_vtbl *vtbl, output_function_t output_function, flush_function_t flush_function, void* data)
{
/* encoding structure */
@@ -136,13 +113,12 @@ static void mbfl_convert_filter_common_init(mbfl_convert_filter *filter, const m
filter->filter_ctor = vtbl->filter_ctor;
filter->filter_dtor = vtbl->filter_dtor;
filter->filter_function = vtbl->filter_function;
- filter->filter_flush = vtbl->filter_flush;
+ filter->filter_flush = (filter_flush_t)vtbl->filter_flush;
filter->filter_copy = vtbl->filter_copy;
(*filter->filter_ctor)(filter);
}
-
mbfl_convert_filter* mbfl_convert_filter_new(const mbfl_encoding *from, const mbfl_encoding *to, output_function_t output_function,
flush_function_t flush_function, void* data)
{
@@ -152,7 +128,7 @@ mbfl_convert_filter* mbfl_convert_filter_new(const mbfl_encoding *from, const mb
}
mbfl_convert_filter *filter = emalloc(sizeof(mbfl_convert_filter));
- mbfl_convert_filter_common_init(filter, from, to, vtbl, output_function, flush_function, data);
+ mbfl_convert_filter_init(filter, from, to, vtbl, output_function, flush_function, data);
return filter;
}
@@ -163,7 +139,7 @@ mbfl_convert_filter* mbfl_convert_filter_new2(const struct mbfl_convert_vtbl *vt
const mbfl_encoding *to_encoding = mbfl_no2encoding(vtbl->to);
mbfl_convert_filter *filter = emalloc(sizeof(mbfl_convert_filter));
- mbfl_convert_filter_common_init(filter, from_encoding, to_encoding, vtbl, output_function, flush_function, data);
+ mbfl_convert_filter_init(filter, from_encoding, to_encoding, vtbl, output_function, flush_function, data);
return filter;
}
@@ -195,7 +171,7 @@ unsigned char* mbfl_convert_filter_feed_string(mbfl_convert_filter *filter, unsi
int mbfl_convert_filter_flush(mbfl_convert_filter *filter)
{
(*filter->filter_flush)(filter);
- return filter->flush_function ? (*filter->flush_function)(filter->data) : 0;
+ return 0;
}
void mbfl_convert_filter_reset(mbfl_convert_filter *filter, const mbfl_encoding *from, const mbfl_encoding *to)
@@ -210,8 +186,7 @@ void mbfl_convert_filter_reset(mbfl_convert_filter *filter, const mbfl_encoding
vtbl = &vtbl_pass;
}
- mbfl_convert_filter_common_init(filter, from, to, vtbl,
- filter->output_function, filter->flush_function, filter->data);
+ mbfl_convert_filter_init(filter, from, to, vtbl, filter->output_function, filter->flush_function, filter->data);
}
void mbfl_convert_filter_copy(mbfl_convert_filter *src, mbfl_convert_filter *dest)
@@ -287,9 +262,6 @@ int mbfl_filt_conv_illegal_output(int c, mbfl_convert_filter *filter)
case MBFL_WCSPLANE_GB18030:
ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"GB+");
break;
- case MBFL_WCSPLANE_8859_1:
- ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"I8859_1+");
- break;
default:
ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"?+");
break;
@@ -399,16 +371,12 @@ const struct mbfl_convert_vtbl* mbfl_convert_filter_get_vtbl(const mbfl_encoding
*/
void mbfl_filt_conv_common_ctor(mbfl_convert_filter *filter)
{
- filter->status = 0;
- filter->cache = 0;
+ filter->status = filter->cache = 0;
}
int mbfl_filt_conv_common_flush(mbfl_convert_filter *filter)
{
- filter->status = 0;
- filter->cache = 0;
-
- if (filter->flush_function != NULL) {
+ if (filter->flush_function) {
(*filter->flush_function)(filter->data);
}
return 0;
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
index 3ecb06553d..1a0e65d95d 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
@@ -61,30 +61,9 @@
#include "filters/mbfilter_euc_jp_win.h"
#include "filters/mbfilter_euc_jp_2004.h"
#include "filters/mbfilter_gb18030.h"
-#include "filters/mbfilter_ascii.h"
-#include "filters/mbfilter_koi8r.h"
-#include "filters/mbfilter_koi8u.h"
-#include "filters/mbfilter_cp866.h"
#include "filters/mbfilter_cp932.h"
#include "filters/mbfilter_cp936.h"
-#include "filters/mbfilter_cp1251.h"
-#include "filters/mbfilter_cp1252.h"
-#include "filters/mbfilter_cp1254.h"
#include "filters/mbfilter_cp5022x.h"
-#include "filters/mbfilter_iso8859_1.h"
-#include "filters/mbfilter_iso8859_2.h"
-#include "filters/mbfilter_iso8859_3.h"
-#include "filters/mbfilter_iso8859_4.h"
-#include "filters/mbfilter_iso8859_5.h"
-#include "filters/mbfilter_iso8859_6.h"
-#include "filters/mbfilter_iso8859_7.h"
-#include "filters/mbfilter_iso8859_8.h"
-#include "filters/mbfilter_iso8859_9.h"
-#include "filters/mbfilter_iso8859_10.h"
-#include "filters/mbfilter_iso8859_13.h"
-#include "filters/mbfilter_iso8859_14.h"
-#include "filters/mbfilter_iso8859_15.h"
-#include "filters/mbfilter_iso8859_16.h"
#include "filters/mbfilter_base64.h"
#include "filters/mbfilter_qprint.h"
#include "filters/mbfilter_uuencode.h"
@@ -95,13 +74,10 @@
#include "filters/mbfilter_utf8_mobile.h"
#include "filters/mbfilter_utf16.h"
#include "filters/mbfilter_utf32.h"
-#include "filters/mbfilter_byte2.h"
-#include "filters/mbfilter_byte4.h"
#include "filters/mbfilter_ucs4.h"
#include "filters/mbfilter_ucs2.h"
#include "filters/mbfilter_htmlent.h"
-#include "filters/mbfilter_armscii8.h"
-#include "filters/mbfilter_cp850.h"
+#include "filters/mbfilter_singlebyte.h"
#ifndef HAVE_STRCASECMP
#ifdef HAVE_STRICMP
@@ -112,10 +88,6 @@
static const mbfl_encoding *mbfl_encoding_ptr_list[] = {
&mbfl_encoding_wchar,
- &mbfl_encoding_byte2be,
- &mbfl_encoding_byte2le,
- &mbfl_encoding_byte4be,
- &mbfl_encoding_byte4le,
&mbfl_encoding_base64,
&mbfl_encoding_uuencode,
&mbfl_encoding_html_ent,
@@ -189,54 +161,40 @@ static const mbfl_encoding *mbfl_encoding_ptr_list[] = {
&mbfl_encoding_koi8u,
&mbfl_encoding_armscii8,
&mbfl_encoding_cp850,
- &mbfl_encoding_jis_ms,
&mbfl_encoding_2022jp_2004,
&mbfl_encoding_2022jp_kddi,
&mbfl_encoding_cp50220,
- &mbfl_encoding_cp50220raw,
&mbfl_encoding_cp50221,
&mbfl_encoding_cp50222,
NULL
};
-/* encoding resolver */
-const mbfl_encoding *
-mbfl_name2encoding(const char *name)
+const mbfl_encoding *mbfl_name2encoding(const char *name)
{
- const mbfl_encoding *encoding;
- int i, j;
+ const mbfl_encoding **encoding;
- if (name == NULL) {
- return NULL;
- }
-
- i = 0;
- while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL){
- if (strcasecmp(encoding->name, name) == 0) {
- return encoding;
+ for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
+ if (strcasecmp((*encoding)->name, name) == 0) {
+ return *encoding;
}
}
- /* serch MIME charset name */
- i = 0;
- while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL) {
- if (encoding->mime_name != NULL) {
- if (strcasecmp(encoding->mime_name, name) == 0) {
- return encoding;
+ /* search MIME charset name */
+ for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
+ if ((*encoding)->mime_name) {
+ if (strcasecmp((*encoding)->mime_name, name) == 0) {
+ return *encoding;
}
}
}
- /* serch aliases */
- i = 0;
- while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL) {
- if (encoding->aliases != NULL) {
- j = 0;
- while ((*encoding->aliases)[j] != NULL) {
- if (strcasecmp((*encoding->aliases)[j], name) == 0) {
- return encoding;
+ /* search aliases */
+ for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
+ if ((*encoding)->aliases) {
+ for (const char **alias = (*encoding)->aliases; *alias; alias++) {
+ if (strcasecmp(*alias, name) == 0) {
+ return *encoding;
}
- j++;
}
}
}
@@ -244,63 +202,45 @@ mbfl_name2encoding(const char *name)
return NULL;
}
-const mbfl_encoding *
-mbfl_no2encoding(enum mbfl_no_encoding no_encoding)
+const mbfl_encoding *mbfl_no2encoding(enum mbfl_no_encoding no_encoding)
{
- const mbfl_encoding *encoding;
- int i;
+ const mbfl_encoding **encoding;
- i = 0;
- while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL){
- if (encoding->no_encoding == no_encoding) {
- return encoding;
+ for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
+ if ((*encoding)->no_encoding == no_encoding) {
+ return *encoding;
}
}
return NULL;
}
-enum mbfl_no_encoding
-mbfl_name2no_encoding(const char *name)
+enum mbfl_no_encoding mbfl_name2no_encoding(const char *name)
{
- const mbfl_encoding *encoding;
-
- encoding = mbfl_name2encoding(name);
- if (encoding == NULL) {
- return mbfl_no_encoding_invalid;
- } else {
- return encoding->no_encoding;
- }
+ const mbfl_encoding *encoding = mbfl_name2encoding(name);
+ return encoding ? encoding->no_encoding : mbfl_no_encoding_invalid;
}
-const char *
-mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding)
+const char *mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding)
{
- const mbfl_encoding *encoding;
-
- encoding = mbfl_no2encoding(no_encoding);
- if (encoding == NULL) {
- return "";
- } else {
- return encoding->name;
- }
+ const mbfl_encoding *encoding = mbfl_no2encoding(no_encoding);
+ return encoding ? encoding->name : "";
}
-const mbfl_encoding **
-mbfl_get_supported_encodings(void)
+const mbfl_encoding **mbfl_get_supported_encodings(void)
{
return mbfl_encoding_ptr_list;
}
-const char *
-mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding)
+const char *mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding)
{
- const mbfl_encoding *encoding;
+ return mbfl_encoding_preferred_mime_name(mbfl_no2encoding(no_encoding));
+}
- encoding = mbfl_no2encoding(no_encoding);
- if (encoding != NULL && encoding->mime_name != NULL && encoding->mime_name[0] != '\0') {
+const char *mbfl_encoding_preferred_mime_name(const mbfl_encoding *encoding)
+{
+ if (encoding->mime_name && encoding->mime_name[0] != '\0') {
return encoding->mime_name;
- } else {
- return NULL;
}
+ return NULL;
}
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h
index 0b39153c9d..dc8ae1d5e1 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h
@@ -37,10 +37,6 @@ enum mbfl_no_encoding {
mbfl_no_encoding_invalid = -1,
mbfl_no_encoding_pass,
mbfl_no_encoding_wchar,
- mbfl_no_encoding_byte2be,
- mbfl_no_encoding_byte2le,
- mbfl_no_encoding_byte4be,
- mbfl_no_encoding_byte4le,
mbfl_no_encoding_base64,
mbfl_no_encoding_uuencode,
mbfl_no_encoding_html_ent,
@@ -117,9 +113,7 @@ enum mbfl_no_encoding {
mbfl_no_encoding_8859_16,
mbfl_no_encoding_armscii8,
mbfl_no_encoding_cp850,
- mbfl_no_encoding_jis_ms,
mbfl_no_encoding_cp50220,
- mbfl_no_encoding_cp50220raw,
mbfl_no_encoding_cp50221,
mbfl_no_encoding_cp50222,
mbfl_no_encoding_charset_max
@@ -145,19 +139,19 @@ typedef struct _mbfl_encoding {
enum mbfl_no_encoding no_encoding;
const char *name;
const char *mime_name;
- const char *(*aliases)[];
+ const char **aliases;
const unsigned char *mblen_table;
unsigned int flag;
const struct mbfl_convert_vtbl *input_filter;
const struct mbfl_convert_vtbl *output_filter;
} mbfl_encoding;
-MBFLAPI extern const mbfl_encoding * mbfl_name2encoding(const char *name);
-MBFLAPI extern const mbfl_encoding * mbfl_no2encoding(enum mbfl_no_encoding no_encoding);
+MBFLAPI extern const mbfl_encoding *mbfl_name2encoding(const char *name);
+MBFLAPI extern const mbfl_encoding *mbfl_no2encoding(enum mbfl_no_encoding no_encoding);
MBFLAPI extern enum mbfl_no_encoding mbfl_name2no_encoding(const char *name);
-MBFLAPI extern const mbfl_encoding ** mbfl_get_supported_encodings();
-MBFLAPI extern const char * mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding);
-MBFLAPI extern const char * mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding);
-
+MBFLAPI extern const mbfl_encoding **mbfl_get_supported_encodings();
+MBFLAPI extern const char *mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding);
+MBFLAPI extern const char *mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding);
+MBFLAPI extern const char *mbfl_encoding_preferred_mime_name(const mbfl_encoding *encoding);
#endif /* MBFL_ENCODING_H */
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_ident.c b/ext/mbstring/libmbfl/mbfl/mbfl_ident.c
deleted file mode 100644
index 18144eb030..0000000000
--- a/ext/mbstring/libmbfl/mbfl/mbfl_ident.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 20 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#include <stddef.h>
-
-#include "mbfl_ident.h"
-#include "mbfilter_pass.h"
-#include "mbfilter_8bit.h"
-#include "mbfilter_wchar.h"
-
-#include "filters/mbfilter_euc_cn.h"
-#include "filters/mbfilter_hz.h"
-#include "filters/mbfilter_euc_tw.h"
-#include "filters/mbfilter_big5.h"
-#include "filters/mbfilter_uhc.h"
-#include "filters/mbfilter_euc_kr.h"
-#include "filters/mbfilter_iso2022_kr.h"
-#include "filters/mbfilter_sjis.h"
-#include "filters/mbfilter_sjis_open.h"
-#include "filters/mbfilter_sjis_mobile.h"
-#include "filters/mbfilter_jis.h"
-#include "filters/mbfilter_iso2022_jp_ms.h"
-#include "filters/mbfilter_iso2022jp_2004.h"
-#include "filters/mbfilter_iso2022jp_mobile.h"
-#include "filters/mbfilter_euc_jp.h"
-#include "filters/mbfilter_euc_jp_win.h"
-#include "filters/mbfilter_euc_jp_2004.h"
-#include "filters/mbfilter_utf8_mobile.h"
-#include "filters/mbfilter_ascii.h"
-#include "filters/mbfilter_koi8r.h"
-#include "filters/mbfilter_koi8u.h"
-#include "filters/mbfilter_cp866.h"
-#include "filters/mbfilter_cp932.h"
-#include "filters/mbfilter_cp936.h"
-#include "filters/mbfilter_cp1251.h"
-#include "filters/mbfilter_cp1252.h"
-#include "filters/mbfilter_cp1254.h"
-#include "filters/mbfilter_cp51932.h"
-#include "filters/mbfilter_cp5022x.h"
-#include "filters/mbfilter_gb18030.h"
-#include "filters/mbfilter_iso8859_1.h"
-#include "filters/mbfilter_iso8859_2.h"
-#include "filters/mbfilter_iso8859_3.h"
-#include "filters/mbfilter_iso8859_4.h"
-#include "filters/mbfilter_iso8859_5.h"
-#include "filters/mbfilter_iso8859_6.h"
-#include "filters/mbfilter_iso8859_7.h"
-#include "filters/mbfilter_iso8859_8.h"
-#include "filters/mbfilter_iso8859_9.h"
-#include "filters/mbfilter_iso8859_10.h"
-#include "filters/mbfilter_iso8859_13.h"
-#include "filters/mbfilter_iso8859_14.h"
-#include "filters/mbfilter_iso8859_15.h"
-#include "filters/mbfilter_base64.h"
-#include "filters/mbfilter_qprint.h"
-#include "filters/mbfilter_uuencode.h"
-#include "filters/mbfilter_7bit.h"
-#include "filters/mbfilter_utf7.h"
-#include "filters/mbfilter_utf7imap.h"
-#include "filters/mbfilter_utf8.h"
-#include "filters/mbfilter_utf16.h"
-#include "filters/mbfilter_utf32.h"
-#include "filters/mbfilter_byte2.h"
-#include "filters/mbfilter_byte4.h"
-#include "filters/mbfilter_ucs4.h"
-#include "filters/mbfilter_ucs2.h"
-#include "filters/mbfilter_htmlent.h"
-#include "filters/mbfilter_armscii8.h"
-#include "filters/mbfilter_cp850.h"
-
-static const struct mbfl_identify_vtbl vtbl_identify_false = {
- mbfl_no_encoding_pass,
- mbfl_filt_ident_false_ctor,
- mbfl_filt_ident_false
-};
-
-static const struct mbfl_identify_vtbl *mbfl_identify_filter_list[] = {
- &vtbl_identify_utf8,
- &vtbl_identify_utf7,
- &vtbl_identify_ascii,
- &vtbl_identify_eucjp,
- &vtbl_identify_sjis,
- &vtbl_identify_sjis_open,
- &vtbl_identify_eucjpwin,
- &vtbl_identify_eucjp2004,
- &vtbl_identify_cp932,
- &vtbl_identify_jis,
- &vtbl_identify_2022jp,
- &vtbl_identify_2022jpms,
- &vtbl_identify_2022jp_2004,
- &vtbl_identify_2022jp_kddi,
- &vtbl_identify_cp51932,
- &vtbl_identify_sjis_docomo,
- &vtbl_identify_sjis_kddi,
- &vtbl_identify_sjis_sb,
- &vtbl_identify_utf8_docomo,
- &vtbl_identify_utf8_kddi_a,
- &vtbl_identify_utf8_kddi_b,
- &vtbl_identify_utf8_sb,
- &vtbl_identify_euccn,
- &vtbl_identify_cp936,
- &vtbl_identify_hz,
- &vtbl_identify_euctw,
- &vtbl_identify_big5,
- &vtbl_identify_cp950,
- &vtbl_identify_euckr,
- &vtbl_identify_uhc,
- &vtbl_identify_2022kr,
- &vtbl_identify_cp1251,
- &vtbl_identify_cp866,
- &vtbl_identify_koi8r,
- &vtbl_identify_koi8u,
- &vtbl_identify_cp1252,
- &vtbl_identify_cp1254,
- &vtbl_identify_8859_1,
- &vtbl_identify_8859_2,
- &vtbl_identify_8859_3,
- &vtbl_identify_8859_4,
- &vtbl_identify_8859_5,
- &vtbl_identify_8859_6,
- &vtbl_identify_8859_7,
- &vtbl_identify_8859_8,
- &vtbl_identify_8859_9,
- &vtbl_identify_8859_10,
- &vtbl_identify_8859_13,
- &vtbl_identify_8859_14,
- &vtbl_identify_8859_15,
- &vtbl_identify_armscii8,
- &vtbl_identify_cp850,
- &vtbl_identify_jis_ms,
- &vtbl_identify_cp50220,
- &vtbl_identify_cp50221,
- &vtbl_identify_cp50222,
- &vtbl_identify_gb18030,
- &vtbl_identify_false,
- NULL
-};
-
-/*
- * identify filter
- */
-const struct mbfl_identify_vtbl * mbfl_identify_filter_get_vtbl(enum mbfl_no_encoding encoding)
-{
- const struct mbfl_identify_vtbl * vtbl;
- int i;
-
- i = 0;
- while ((vtbl = mbfl_identify_filter_list[i++]) != NULL) {
- if (vtbl->encoding == encoding) {
- break;
- }
- }
-
- return vtbl;
-}
-
-mbfl_identify_filter *mbfl_identify_filter_new(enum mbfl_no_encoding encoding)
-{
- mbfl_identify_filter *filter = emalloc(sizeof(mbfl_identify_filter));
- if (mbfl_identify_filter_init(filter, encoding)) {
- efree(filter);
- return NULL;
- }
-
- return filter;
-}
-
-mbfl_identify_filter *mbfl_identify_filter_new2(const mbfl_encoding *encoding)
-{
- mbfl_identify_filter *filter = emalloc(sizeof(mbfl_identify_filter));
- if (mbfl_identify_filter_init2(filter, encoding)) {
- efree(filter);
- return NULL;
- }
-
- return filter;
-}
-
-
-int mbfl_identify_filter_init(mbfl_identify_filter *filter, enum mbfl_no_encoding encoding)
-{
- const mbfl_encoding *enc = mbfl_no2encoding(encoding);
- return mbfl_identify_filter_init2(filter, enc ? enc: &mbfl_encoding_pass);
-}
-
-int mbfl_identify_filter_init2(mbfl_identify_filter *filter, const mbfl_encoding *encoding)
-{
- const struct mbfl_identify_vtbl *vtbl;
-
- /* encoding structure */
- filter->encoding = encoding;
-
- filter->status = 0;
- filter->flag = 0;
- filter->score = 0;
-
- /* setup the function table */
- vtbl = mbfl_identify_filter_get_vtbl(filter->encoding->no_encoding);
- if (vtbl == NULL) {
- vtbl = &vtbl_identify_false;
- }
- filter->filter_ctor = vtbl->filter_ctor;
- filter->filter_function = vtbl->filter_function;
-
- /* constructor */
- (*filter->filter_ctor)(filter);
-
- return 0;
-}
-
-void mbfl_identify_filter_delete(mbfl_identify_filter *filter)
-{
- if (filter == NULL) {
- return;
- }
-
- efree((void*)filter);
-}
-
-void mbfl_filt_ident_common_ctor(mbfl_identify_filter *filter)
-{
- filter->status = 0;
- filter->flag = 0;
-}
-
-int mbfl_filt_ident_false(int c, mbfl_identify_filter *filter)
-{
- filter->flag = 1; /* bad */
- return c;
-}
-
-void mbfl_filt_ident_false_ctor(mbfl_identify_filter *filter)
-{
- filter->status = 0;
- filter->flag = 1;
-}
-
-int mbfl_filt_ident_true(int c, mbfl_identify_filter *filter)
-{
- return c;
-}
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_ident.h b/ext/mbstring/libmbfl/mbfl/mbfl_ident.h
deleted file mode 100644
index c9afd03fb4..0000000000
--- a/ext/mbstring/libmbfl/mbfl/mbfl_ident.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software 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 "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.h
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 20 Dec 2002. The file
- * mbfilter.h is included in this package .
- *
- */
-
-#ifndef MBFL_IDENT_H
-#define MBFL_IDENT_H
-
-#include "mbfl_defs.h"
-#include "mbfl_encoding.h"
-
-/*
- * identify filter
- */
-typedef struct _mbfl_identify_filter mbfl_identify_filter;
-
-struct _mbfl_identify_filter {
- void (*filter_ctor)(mbfl_identify_filter *filter);
- int (*filter_function)(int c, mbfl_identify_filter *filter);
- int status;
- int flag;
- int score;
- const mbfl_encoding *encoding;
-};
-
-struct mbfl_identify_vtbl {
- enum mbfl_no_encoding encoding;
- void (*filter_ctor)(mbfl_identify_filter *filter);
- int (*filter_function)(int c, mbfl_identify_filter *filter);
-};
-
-MBFLAPI extern const struct mbfl_identify_vtbl * mbfl_identify_filter_get_vtbl(enum mbfl_no_encoding encoding);
-MBFLAPI extern mbfl_identify_filter * mbfl_identify_filter_new(enum mbfl_no_encoding encoding);
-MBFLAPI extern mbfl_identify_filter * mbfl_identify_filter_new2(const mbfl_encoding *encoding);
-MBFLAPI extern void mbfl_identify_filter_delete(mbfl_identify_filter *filter);
-MBFLAPI extern int mbfl_identify_filter_init(mbfl_identify_filter *filter, enum mbfl_no_encoding encoding);
-MBFLAPI extern int mbfl_identify_filter_init2(mbfl_identify_filter *filter, const mbfl_encoding *encoding);
-
-MBFLAPI extern void mbfl_filt_ident_common_ctor(mbfl_identify_filter *filter);
-MBFLAPI extern void mbfl_filt_ident_false_ctor(mbfl_identify_filter *filter);
-
-MBFLAPI extern int mbfl_filt_ident_false(int c, mbfl_identify_filter *filter);
-MBFLAPI extern int mbfl_filt_ident_true(int c, mbfl_identify_filter *filter);
-
-#endif /* MBFL_IDENT_H */
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c
index 09746efcd0..cd064e5ee8 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c
@@ -37,106 +37,67 @@
/*
* memory device output functions
*/
-void
-mbfl_memory_device_init(mbfl_memory_device *device, size_t initsz, size_t allocsz)
+void mbfl_memory_device_init(mbfl_memory_device *device, size_t initsz, size_t allocsz)
{
- if (device) {
- device->length = 0;
- device->buffer = NULL;
- if (initsz > 0) {
- device->buffer = emalloc(initsz);
- device->length = initsz;
- }
- device->pos = 0;
- if (allocsz > MBFL_MEMORY_DEVICE_ALLOC_SIZE) {
- device->allocsz = allocsz;
- } else {
- device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
- }
- }
+ device->buffer = (initsz > 0) ? emalloc(initsz) : NULL;
+ device->length = initsz;
+ device->pos = 0;
+ device->allocsz = MAX(allocsz, MBFL_MEMORY_DEVICE_ALLOC_SIZE);
}
-void
-mbfl_memory_device_realloc(mbfl_memory_device *device, size_t initsz, size_t allocsz)
+void mbfl_memory_device_realloc(mbfl_memory_device *device, size_t initsz, size_t allocsz)
{
- if (device) {
- if (initsz > device->length) {
- device->buffer = erealloc(device->buffer, initsz);
- device->length = initsz;
- }
- if (allocsz > MBFL_MEMORY_DEVICE_ALLOC_SIZE) {
- device->allocsz = allocsz;
- } else {
- device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
- }
+ if (initsz > device->length) {
+ device->buffer = erealloc(device->buffer, initsz);
+ device->length = initsz;
}
+ device->allocsz = MAX(allocsz, MBFL_MEMORY_DEVICE_ALLOC_SIZE);
}
-void
-mbfl_memory_device_clear(mbfl_memory_device *device)
+void mbfl_memory_device_clear(mbfl_memory_device *device)
{
- if (device) {
- if (device->buffer) {
- efree(device->buffer);
- }
- device->buffer = NULL;
- device->length = 0;
- device->pos = 0;
+ if (device->buffer) {
+ efree(device->buffer);
}
+ device->buffer = NULL;
+ device->length = device->pos = 0;
}
-void
-mbfl_memory_device_reset(mbfl_memory_device *device)
+void mbfl_memory_device_reset(mbfl_memory_device *device)
{
- if (device) {
- device->pos = 0;
- }
+ device->pos = 0;
}
-void
-mbfl_memory_device_unput(mbfl_memory_device *device)
+void mbfl_memory_device_unput(mbfl_memory_device *device)
{
if (device->pos > 0) {
device->pos--;
}
}
-mbfl_string *
-mbfl_memory_device_result(mbfl_memory_device *device, mbfl_string *result)
+mbfl_string* mbfl_memory_device_result(mbfl_memory_device *device, mbfl_string *result)
{
- if (device && result) {
- result->len = device->pos;
- mbfl_memory_device_output('\0', device);
- result->val = device->buffer;
- device->buffer = NULL;
- device->length = 0;
- device->pos= 0;
- if (result->val == NULL) {
- result->len = 0;
- result = NULL;
- }
- } else {
- result = NULL;
- }
-
+ result->len = device->pos;
+ mbfl_memory_device_output('\0', device);
+ result->val = device->buffer;
+ device->buffer = NULL;
+ device->length = device->pos = 0;
return result;
}
-int
-mbfl_memory_device_output(int c, void *data)
+int mbfl_memory_device_output(int c, void *data)
{
mbfl_memory_device *device = (mbfl_memory_device *)data;
if (device->pos >= device->length) {
/* reallocate buffer */
- size_t newlen;
if (device->length > SIZE_MAX - device->allocsz) {
/* overflow */
return -1;
}
- newlen = device->length + device->allocsz;
+ size_t newlen = device->length + device->allocsz;
device->buffer = erealloc(device->buffer, newlen);
device->length = newlen;
}
@@ -145,20 +106,15 @@ mbfl_memory_device_output(int c, void *data)
return c;
}
-int
-mbfl_memory_device_strcat(mbfl_memory_device *device, const char *psrc)
+int mbfl_memory_device_strcat(mbfl_memory_device *device, const char *psrc)
{
return mbfl_memory_device_strncat(device, psrc, strlen(psrc));
}
-int
-mbfl_memory_device_strncat(mbfl_memory_device *device, const char *psrc, size_t len)
+int mbfl_memory_device_strncat(mbfl_memory_device *device, const char *psrc, size_t len)
{
- unsigned char *w;
-
if (len > device->length - device->pos) {
/* reallocate buffer */
- size_t newlen;
if (len > SIZE_MAX - MBFL_MEMORY_DEVICE_ALLOC_SIZE
|| device->length > SIZE_MAX - (len + MBFL_MEMORY_DEVICE_ALLOC_SIZE)) {
@@ -166,50 +122,41 @@ mbfl_memory_device_strncat(mbfl_memory_device *device, const char *psrc, size_t
return -1;
}
- newlen = device->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
+ size_t newlen = device->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
device->buffer = erealloc(device->buffer, newlen);
device->length = newlen;
}
- w = &device->buffer[device->pos];
+ unsigned char *w = &device->buffer[device->pos];
memcpy(w, psrc, len);
device->pos += len;
return 0;
}
-int
-mbfl_memory_device_devcat(mbfl_memory_device *dest, mbfl_memory_device *src)
+int mbfl_memory_device_devcat(mbfl_memory_device *dest, mbfl_memory_device *src)
{
- return mbfl_memory_device_strncat(dest, (const char *) src->buffer, src->pos);
+ return mbfl_memory_device_strncat(dest, (const char*)src->buffer, src->pos);
}
-void
-mbfl_wchar_device_init(mbfl_wchar_device *device)
+void mbfl_wchar_device_init(mbfl_wchar_device *device)
{
- if (device) {
- device->buffer = NULL;
- device->length = 0;
- device->pos= 0;
- device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
- }
+ device->buffer = NULL;
+ device->length = 0;
+ device->pos = 0;
+ device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
}
-void
-mbfl_wchar_device_clear(mbfl_wchar_device *device)
+void mbfl_wchar_device_clear(mbfl_wchar_device *device)
{
- if (device) {
- if (device->buffer) {
- efree(device->buffer);
- }
- device->buffer = NULL;
- device->length = 0;
- device->pos = 0;
+ if (device->buffer) {
+ efree(device->buffer);
}
+ device->buffer = NULL;
+ device->length = device->pos = 0;
}
-int
-mbfl_wchar_device_output(int c, void *data)
+int mbfl_wchar_device_output(int c, void *data)
{
mbfl_wchar_device *device = (mbfl_wchar_device *)data;
@@ -228,11 +175,10 @@ mbfl_wchar_device_output(int c, void *data)
return -1;
}
- device->buffer = erealloc(device->buffer, newlen*sizeof(int));
+ device->buffer = erealloc(device->buffer, newlen * sizeof(int));
device->length = newlen;
}
device->buffer[device->pos++] = c;
-
return c;
}
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h
index 7e86db3e06..b8a188ec84 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h
@@ -69,6 +69,4 @@ MBFLAPI extern void mbfl_wchar_device_init(mbfl_wchar_device *device);
MBFLAPI extern int mbfl_wchar_device_output(int c, void *data);
MBFLAPI extern void mbfl_wchar_device_clear(mbfl_wchar_device *device);
-
-
#endif /* MBFL_MEMORY_DEVICE_H */
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_string.c b/ext/mbstring/libmbfl/mbfl/mbfl_string.c
index a036356dd2..760634e65d 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_string.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_string.c
@@ -31,31 +31,22 @@
#include "mbfl_string.h"
#include "mbfilter_pass.h"
-/*
- * string object
- */
-void
-mbfl_string_init(mbfl_string *string)
+void mbfl_string_init_set(mbfl_string *string, const mbfl_encoding *encoding)
{
- string->encoding = &mbfl_encoding_pass;
- string->val = (unsigned char*)NULL;
+ string->encoding = encoding;
+ string->val = NULL;
string->len = 0;
}
-void
-mbfl_string_init_set(mbfl_string *string, const mbfl_encoding *encoding)
+void mbfl_string_init(mbfl_string *string)
{
- string->encoding = encoding;
- string->val = (unsigned char*)NULL;
- string->len = 0;
+ mbfl_string_init_set(string, &mbfl_encoding_pass);
}
-void
-mbfl_string_clear(mbfl_string *string)
+void mbfl_string_clear(mbfl_string *string)
{
- if (string->val != (unsigned char*)NULL) {
+ if (string->val) {
efree(string->val);
}
- string->val = (unsigned char*)NULL;
- string->len = 0;
+ mbfl_string_init_set(string, NULL); /* Poison it so any attempt to reuse will fail hard */
}
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index b6395aecdd..416dc9a6af 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -34,12 +34,12 @@
#include "libmbfl/mbfl/mbfilter_8bit.h"
#include "libmbfl/mbfl/mbfilter_pass.h"
#include "libmbfl/mbfl/mbfilter_wchar.h"
-#include "libmbfl/filters/mbfilter_ascii.h"
#include "libmbfl/filters/mbfilter_base64.h"
#include "libmbfl/filters/mbfilter_qprint.h"
#include "libmbfl/filters/mbfilter_ucs4.h"
#include "libmbfl/filters/mbfilter_utf8.h"
#include "libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h"
+#include "libmbfl/filters/mbfilter_singlebyte.h"
#include "php_variables.h"
#include "php_globals.h"
@@ -73,9 +73,9 @@ static void php_mb_gpc_get_detect_order(const zend_encoding ***list, size_t *lis
static void php_mb_gpc_set_input_encoding(const zend_encoding *encoding);
-static inline zend_bool php_mb_is_unsupported_no_encoding(enum mbfl_no_encoding no_enc);
+static inline bool php_mb_is_unsupported_no_encoding(enum mbfl_no_encoding no_enc);
-static inline zend_bool php_mb_is_no_encoding_utf8(enum mbfl_no_encoding no_enc);
+static inline bool php_mb_is_no_encoding_utf8(enum mbfl_no_encoding no_enc);
/* }}} */
/* {{{ php_mb_default_identify_list */
@@ -252,14 +252,14 @@ static size_t count_commas(const char *p, const char *end) {
*/
static zend_result php_mb_parse_encoding_list(const char *value, size_t value_length,
const mbfl_encoding ***return_list, size_t *return_size, bool persistent, uint32_t arg_num,
- zend_bool allow_pass_encoding)
+ bool allow_pass_encoding)
{
if (value == NULL || value_length == 0) {
*return_list = NULL;
*return_size = 0;
return SUCCESS;
} else {
- zend_bool included_auto;
+ bool included_auto;
size_t n, size;
char *p1, *endp, *tmpstr;
const mbfl_encoding **entry, **list;
@@ -347,7 +347,7 @@ static int php_mb_parse_encoding_array(HashTable *target_hash, const mbfl_encodi
size_t size = zend_hash_num_elements(target_hash) + MBSTRG(default_detect_order_list_size);
const mbfl_encoding **list = ecalloc(size, sizeof(mbfl_encoding*));
const mbfl_encoding **entry = list;
- zend_bool included_auto = 0;
+ bool included_auto = 0;
size_t n = 0;
zval *hash_entry;
ZEND_HASH_FOREACH_VAL(target_hash, hash_entry) {
@@ -403,13 +403,7 @@ static const char *php_mb_zend_encoding_name_getter(const zend_encoding *encodin
static bool php_mb_zend_encoding_lexer_compatibility_checker(const zend_encoding *_encoding)
{
const mbfl_encoding *encoding = (const mbfl_encoding*)_encoding;
- if (encoding->flag & MBFL_ENCTYPE_SBCS) {
- return 1;
- }
- if ((encoding->flag & (MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE)) == MBFL_ENCTYPE_MBCS) {
- return 1;
- }
- return 0;
+ return !(encoding->flag & MBFL_ENCTYPE_GL_UNSAFE);
}
static const zend_encoding *php_mb_zend_encoding_detector(const unsigned char *arg_string, size_t arg_length, const zend_encoding **list, size_t list_size)
@@ -1421,7 +1415,7 @@ PHP_FUNCTION(mb_substitute_character)
{
zend_string *substitute_character = NULL;
zend_long substitute_codepoint;
- zend_bool substitute_is_null = 1;
+ bool substitute_is_null = 1;
ZEND_PARSE_PARAMETERS_START(0, 1)
Z_PARAM_OPTIONAL
@@ -1497,9 +1491,6 @@ PHP_FUNCTION(mb_preferred_mime_name)
}
/* }}} */
-#define IS_SJIS1(c) ((((c)>=0x81 && (c)<=0x9f) || ((c)>=0xe0 && (c)<=0xf5)) ? 1 : 0)
-#define IS_SJIS2(c) ((((c)>=0x40 && (c)<=0x7e) || ((c)>=0x80 && (c)<=0xfc)) ? 1 : 0)
-
/* {{{ Parses GET/POST/COOKIE data and sets global variables */
PHP_FUNCTION(mb_parse_str)
{
@@ -1717,10 +1708,10 @@ PHP_FUNCTION(mb_str_split)
if (mbfl_encoding->flag & MBFL_ENCTYPE_SBCS) { /* 1 byte */
mb_len = string.len;
chunk_len = (size_t)split_length; /* chunk length in bytes */
- } else if (mbfl_encoding->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) { /* 2 bytes */
+ } else if (mbfl_encoding->flag & MBFL_ENCTYPE_WCS2) { /* 2 bytes */
mb_len = string.len / 2;
chunk_len = split_length * 2;
- } else if (mbfl_encoding->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) { /* 4 bytes */
+ } else if (mbfl_encoding->flag & MBFL_ENCTYPE_WCS4) { /* 4 bytes */
mb_len = string.len / 4;
chunk_len = split_length * 4;
} else if (mbfl_encoding->mblen_table != NULL) {
@@ -2003,7 +1994,7 @@ static void php_mb_strstr_variants(INTERNAL_FUNCTION_PARAMETERS, unsigned int va
char *haystack_val, *needle_val;
mbfl_string haystack, needle, result, *ret = NULL;
zend_string *encoding_name = NULL;
- zend_bool part = 0;
+ bool part = 0;
ZEND_PARSE_PARAMETERS_START(2, 4)
Z_PARAM_STRING(haystack_val, haystack.len)
@@ -2127,7 +2118,7 @@ PHP_FUNCTION(mb_substr)
zend_long from, len;
size_t real_from, real_len;
size_t str_len;
- zend_bool len_is_null = 1;
+ bool len_is_null = 1;
mbfl_string string, result, *ret;
ZEND_PARSE_PARAMETERS_START(2, 4)
@@ -2191,7 +2182,7 @@ PHP_FUNCTION(mb_strcut)
zend_string *encoding = NULL;
char *string_val;
zend_long from, len;
- zend_bool len_is_null = 1;
+ bool len_is_null = 1;
mbfl_string string, result, *ret;
ZEND_PARSE_PARAMETERS_START(2, 4)
@@ -2335,7 +2326,7 @@ PHP_FUNCTION(mb_strimwidth)
/* See mbfl_no_encoding definition for list of unsupported encodings */
-static inline zend_bool php_mb_is_unsupported_no_encoding(enum mbfl_no_encoding no_enc)
+static inline bool php_mb_is_unsupported_no_encoding(enum mbfl_no_encoding no_enc)
{
return ((no_enc >= mbfl_no_encoding_invalid && no_enc <= mbfl_no_encoding_qprint)
|| (no_enc >= mbfl_no_encoding_utf7 && no_enc <= mbfl_no_encoding_utf7imap)
@@ -2345,7 +2336,7 @@ static inline zend_bool php_mb_is_unsupported_no_encoding(enum mbfl_no_encoding
/* See mbfl_no_encoding definition for list of UTF-8 encodings */
-static inline zend_bool php_mb_is_no_encoding_utf8(enum mbfl_no_encoding no_enc)
+static inline bool php_mb_is_no_encoding_utf8(enum mbfl_no_encoding no_enc)
{
return (no_enc >= mbfl_no_encoding_utf8 && no_enc <= mbfl_no_encoding_utf8_sb);
}
@@ -2504,7 +2495,7 @@ PHP_FUNCTION(mb_convert_encoding)
HashTable *input_ht, *from_encodings_ht = NULL;
const mbfl_encoding **from_encodings;
size_t num_from_encodings;
- zend_bool free_from_encodings;
+ bool free_from_encodings;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ARRAY_HT_OR_STR(input_ht, input_str)
@@ -2676,13 +2667,13 @@ PHP_FUNCTION(mb_detect_encoding)
size_t str_len;
zend_string *encoding_str = NULL;
HashTable *encoding_ht = NULL;
- zend_bool strict = 0;
+ bool strict = 0;
mbfl_string string;
const mbfl_encoding *ret;
const mbfl_encoding **elist;
size_t size;
- zend_bool free_elist;
+ bool free_elist;
ZEND_PARSE_PARAMETERS_START(1, 3)
Z_PARAM_STRING(str, str_len)
@@ -2764,8 +2755,7 @@ PHP_FUNCTION(mb_encoding_aliases)
array_init(return_value);
if (encoding->aliases != NULL) {
- const char **alias;
- for (alias = *encoding->aliases; *alias; ++alias) {
+ for (const char **alias = encoding->aliases; *alias; ++alias) {
add_next_index_string(return_value, (char *)*alias);
}
}
@@ -3188,7 +3178,7 @@ PHP_FUNCTION(mb_encode_numericentity)
zend_string *encoding = NULL;
int mapsize;
HashTable *target_hash;
- zend_bool is_hex = 0;
+ bool is_hex = 0;
mbfl_string string, result, *ret;
ZEND_PARSE_PARAMETERS_START(2, 4)
@@ -3649,7 +3639,7 @@ PHP_FUNCTION(mb_send_mail)
if (!suppressed_hdrs.cnt_type) {
mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER2, sizeof(PHP_MBSTR_MAIL_MIME_HEADER2) - 1);
- p = (char *)mbfl_no2preferred_mime_name(tran_cs->no_encoding);
+ p = (char *)mbfl_encoding_preferred_mime_name(tran_cs);
if (p != NULL) {
mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER3, sizeof(PHP_MBSTR_MAIL_MIME_HEADER3) - 1);
mbfl_memory_device_strcat(&device, p);
@@ -3658,7 +3648,7 @@ PHP_FUNCTION(mb_send_mail)
}
if (!suppressed_hdrs.cnt_trans_enc) {
mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER4, sizeof(PHP_MBSTR_MAIL_MIME_HEADER4) - 1);
- p = (char *)mbfl_no2preferred_mime_name(body_enc->no_encoding);
+ p = (char *)mbfl_encoding_preferred_mime_name(body_enc);
if (p == NULL) {
p = "7bit";
}
@@ -3859,70 +3849,43 @@ PHP_FUNCTION(mb_get_info)
}
/* }}} */
-
-static inline mbfl_buffer_converter *php_mb_init_convd(const mbfl_encoding *encoding)
+static int mbfl_filt_check_errors(int c, void* data)
{
- mbfl_buffer_converter *convd;
-
- convd = mbfl_buffer_converter_new(encoding, encoding, 0);
- if (convd == NULL) {
- return NULL;
+ if (c & MBFL_WCSGROUP_THROUGH) {
+ (*((mbfl_convert_filter**)data))->num_illegalchar++;
}
- mbfl_buffer_converter_illegal_mode(convd, MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE);
- mbfl_buffer_converter_illegal_substchar(convd, 0);
- return convd;
+ return c;
}
+MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const mbfl_encoding *encoding)
+{
+ mbfl_convert_filter *filter = mbfl_convert_filter_new(encoding, &mbfl_encoding_wchar, mbfl_filt_check_errors, NULL, &filter);
-static inline int php_mb_check_encoding_impl(mbfl_buffer_converter *convd, const char *input, size_t length, const mbfl_encoding *encoding) {
- mbfl_string string, result;
-
- mbfl_string_init_set(&string, encoding);
- mbfl_string_init(&result);
-
- string.val = (unsigned char *) input;
- string.len = length;
-
- mbfl_string *ret = mbfl_buffer_converter_feed_result(convd, &string, &result);
- size_t illegalchars = mbfl_buffer_illegalchars(convd);
-
- if (ret != NULL) {
- if (illegalchars == 0 && string.len == result.len && memcmp(string.val, result.val, string.len) == 0) {
- mbfl_string_clear(&result);
- return 1;
+ while (length--) {
+ unsigned char c = *input++;
+ (filter->filter_function)(c, filter);
+ if (filter->num_illegalchar) {
+ mbfl_convert_filter_delete(filter);
+ return 0;
}
- mbfl_string_clear(&result);
}
- return 0;
-}
-
-MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const mbfl_encoding *encoding)
-{
- mbfl_buffer_converter *convd = php_mb_init_convd(encoding);
- /* If this assertion fails this means some memory allocation failure which is a bug */
- ZEND_ASSERT(convd != NULL);
- int result = php_mb_check_encoding_impl(convd, input, length, encoding);
- mbfl_buffer_converter_delete(convd);
+ (filter->filter_flush)(filter);
+ int result = !filter->num_illegalchar;
+ mbfl_convert_filter_delete(filter);
return result;
}
static int php_mb_check_encoding_recursive(HashTable *vars, const mbfl_encoding *encoding)
{
- mbfl_buffer_converter *convd;
zend_long idx;
zend_string *key;
zval *entry;
int valid = 1;
- (void)(idx);
-
- convd = php_mb_init_convd(encoding);
- /* If this assertion fails this means some memory allocation failure which is a bug */
- ZEND_ASSERT(convd != NULL);
+ (void)(idx); /* Suppress spurious compiler warning that `idx` is not used */
if (GC_IS_RECURSIVE(vars)) {
- mbfl_buffer_converter_delete(convd);
php_error_docref(NULL, E_WARNING, "Cannot not handle circular references");
return 0;
}
@@ -3930,14 +3893,14 @@ static int php_mb_check_encoding_recursive(HashTable *vars, const mbfl_encoding
ZEND_HASH_FOREACH_KEY_VAL(vars, idx, key, entry) {
ZVAL_DEREF(entry);
if (key) {
- if (!php_mb_check_encoding_impl(convd, ZSTR_VAL(key), ZSTR_LEN(key), encoding)) {
+ if (!php_mb_check_encoding(ZSTR_VAL(key), ZSTR_LEN(key), encoding)) {
valid = 0;
break;
}
}
switch (Z_TYPE_P(entry)) {
case IS_STRING:
- if (!php_mb_check_encoding_impl(convd, Z_STRVAL_P(entry), Z_STRLEN_P(entry), encoding)) {
+ if (!php_mb_check_encoding(Z_STRVAL_P(entry), Z_STRLEN_P(entry), encoding)) {
valid = 0;
break;
}
@@ -3961,11 +3924,9 @@ static int php_mb_check_encoding_recursive(HashTable *vars, const mbfl_encoding
}
} ZEND_HASH_FOREACH_END();
GC_TRY_UNPROTECT_RECURSION(vars);
- mbfl_buffer_converter_delete(convd);
return valid;
}
-
/* {{{ Check if the string is valid for the specified encoding */
PHP_FUNCTION(mb_check_encoding)
{
@@ -4243,14 +4204,14 @@ static int php_mb_encoding_translation(void)
/* {{{ MBSTRING_API size_t php_mb_mbchar_bytes_ex() */
MBSTRING_API size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *enc)
{
- if (enc != NULL) {
- if (enc->flag & MBFL_ENCTYPE_MBCS) {
- if (enc->mblen_table != NULL) {
- if (s != NULL) return enc->mblen_table[*(unsigned char *)s];
+ if (enc) {
+ if (enc->mblen_table) {
+ if (s) {
+ return enc->mblen_table[*(unsigned char *)s];
}
- } else if (enc->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) {
+ } else if (enc->flag & MBFL_ENCTYPE_WCS2) {
return 2;
- } else if (enc->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) {
+ } else if (enc->flag & MBFL_ENCTYPE_WCS4) {
return 4;
}
}
diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h
index 561efeb422..eaef0bf63d 100644
--- a/ext/mbstring/mbstring.h
+++ b/ext/mbstring/mbstring.h
@@ -95,8 +95,8 @@ ZEND_BEGIN_MODULE_GLOBALS(mbstring)
int current_filter_illegal_mode;
int current_filter_illegal_substchar;
enum mbfl_no_language language;
- zend_bool encoding_translation;
- zend_bool strict_detection;
+ bool encoding_translation;
+ bool strict_detection;
size_t illegalchars;
mbfl_buffer_converter *outconv;
void *http_output_conv_mimetypes;
@@ -107,9 +107,9 @@ ZEND_BEGIN_MODULE_GLOBALS(mbstring)
zend_string *last_used_encoding_name;
const mbfl_encoding *last_used_encoding;
/* Whether an explicit internal_encoding / http_output / http_input encoding was set. */
- zend_bool internal_encoding_set;
- zend_bool http_output_set;
- zend_bool http_input_set;
+ bool internal_encoding_set;
+ bool http_output_set;
+ bool http_input_set;
#ifdef HAVE_MBREGEX
zend_long regex_retry_limit;
#endif
diff --git a/ext/mbstring/mbstring.stub.php b/ext/mbstring/mbstring.stub.php
index 46a4c59bd5..e355b5ba1e 100644
--- a/ext/mbstring/mbstring.stub.php
+++ b/ext/mbstring/mbstring.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function mb_language(?string $language = null): string|bool {}
diff --git a/ext/mbstring/mbstring_arginfo.h b/ext/mbstring/mbstring_arginfo.h
index 46cc3adf77..459bfe1317 100644
--- a/ext/mbstring/mbstring_arginfo.h
+++ b/ext/mbstring/mbstring_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 51f0769423c046d612adf81091192165ad265456 */
+ * Stub hash: eef196b29323ceb0a5d67703e62b11d0004c615b */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mb_language, 0, 0, MAY_BE_STRING|MAY_BE_BOOL)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, language, IS_STRING, 1, "null")
diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c
index e87a7c6131..0b556d3263 100644
--- a/ext/mbstring/php_mbregex.c
+++ b/ext/mbstring/php_mbregex.c
@@ -1102,7 +1102,7 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp
arg_replace_fci.retval = &retval;
if (zend_call_function(&arg_replace_fci, &arg_replace_fci_cache) == SUCCESS &&
!Z_ISUNDEF(retval)) {
- convert_to_string_ex(&retval);
+ convert_to_string(&retval);
smart_str_appendl(&out_buf, Z_STRVAL(retval), Z_STRLEN(retval));
smart_str_free(&eval_buf);
zval_ptr_dtor(&retval);
diff --git a/ext/mbstring/tests/armscii8_encoding.phpt b/ext/mbstring/tests/armscii8_encoding.phpt
new file mode 100644
index 0000000000..b5bea077d0
--- /dev/null
+++ b/ext/mbstring/tests/armscii8_encoding.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Exhaustive test of verification and conversion of ARMSCII-8 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+srand(111); // Make results consistent
+mb_substitute_character(0x25); // '%'
+
+readConversionTable(__DIR__ . '/data/ARMSCII-8.txt', $toUnicode, $fromUnicode);
+$irreversible = ["\x28", "\x29", "\x2C", "\x2D", "\x2E"];
+
+findInvalidChars($toUnicode, $invalid, $truncated);
+testAllValidChars($toUnicode, 'ARMSCII-8', 'UTF-16BE', false);
+foreach ($irreversible as $char)
+ unset($toUnicode[$char]);
+testAllValidChars($toUnicode, 'ARMSCII-8', 'UTF-16BE');
+testAllInvalidChars($invalid, $toUnicode, 'ARMSCII-8', 'UTF-16BE', "\x00%");
+testTruncatedChars($truncated, 'ARMSCII-8', 'UTF-16BE', "\x00%");
+echo "Tested ARMSCII-8 -> UTF-16BE\n";
+
+findInvalidChars($fromUnicode, $invalid, $unused, array_fill_keys(range(0,0xFF), 2));
+convertAllInvalidChars($invalid, $fromUnicode, 'UTF-16BE', 'ARMSCII-8', '%');
+echo "Tested UTF-16BE -> ARMSCII-8\n";
+?>
+--EXPECT--
+Tested ARMSCII-8 -> UTF-16BE
+Tested UTF-16BE -> ARMSCII-8
diff --git a/ext/mbstring/tests/bug26639.phpt b/ext/mbstring/tests/bug26639.phpt
index 3f5b8e5acd..f50d807482 100644
--- a/ext/mbstring/tests/bug26639.phpt
+++ b/ext/mbstring/tests/bug26639.phpt
@@ -7,16 +7,16 @@ Bug #26639 (mb_convert_variables() clutters variables beyond the references)
$a = "‚ ‚¢‚¤‚¦‚¨";
$b = $a;
mb_convert_variables("EUC-JP", "Shift_JIS", $b);
-debug_zval_dump($a);
-debug_zval_dump($b);
+var_dump($a);
+var_dump($b);
unset($a);
unset($b);
$a = "‚ ‚¢‚¤‚¦‚¨";
$b = &$a;
mb_convert_variables("EUC-JP", "Shift_JIS", $b);
-debug_zval_dump($a);
-debug_zval_dump($b);
+var_dump($a);
+var_dump($b);
unset($a);
unset($b);
@@ -24,8 +24,8 @@ $a = "‚ ‚¢‚¤‚¦‚¨";
$b = array($a);
$c = $b;
mb_convert_variables("EUC-JP", "Shift_JIS", $c);
-debug_zval_dump($b);
-debug_zval_dump($c);
+var_dump($b);
+var_dump($c);
unset($a);
unset($b);
unset($c);
@@ -34,8 +34,8 @@ $a = "‚ ‚¢‚¤‚¦‚¨";
$b = array(&$a);
$c = $b;
mb_convert_variables("EUC-JP", "Shift_JIS", $c);
-debug_zval_dump($b);
-debug_zval_dump($c);
+var_dump($b);
+var_dump($c);
unset($a);
unset($b);
unset($c);
@@ -44,8 +44,8 @@ $a = "‚ ‚¢‚¤‚¦‚¨";
$b = array($a);
$c = &$b;
mb_convert_variables("EUC-JP", "Shift_JIS", $c);
-debug_zval_dump($b);
-debug_zval_dump($c);
+var_dump($b);
+var_dump($c);
unset($a);
unset($b);
unset($c);
@@ -54,8 +54,8 @@ $a = "‚ ‚¢‚¤‚¦‚¨";
$b = array(&$a);
$c = &$b;
mb_convert_variables("EUC-JP", "Shift_JIS", $c);
-debug_zval_dump($b);
-debug_zval_dump($c);
+var_dump($b);
+var_dump($c);
unset($a);
unset($b);
unset($c);
@@ -64,60 +64,60 @@ $a = array(array("‚ ‚¢‚¤‚¦‚¨"));
$b = $a;
$c = $b;
mb_convert_variables("EUC-JP", "Shift_JIS", $c);
-debug_zval_dump($b);
-debug_zval_dump($c);
+var_dump($b);
+var_dump($c);
unset($a);
unset($b);
unset($c);
?>
---EXPECTF--
-string(10) "‚ ‚¢‚¤‚¦‚¨" refcount(%d)
-string(10) "¤¢¤¤¤¦¤¨¤ª" refcount(%d)
-string(10) "¤¢¤¤¤¦¤¨¤ª" refcount(%d)
-string(10) "¤¢¤¤¤¦¤¨¤ª" refcount(%d)
-array(1) refcount(%d){
+--EXPECT--
+string(10) "‚ ‚¢‚¤‚¦‚¨"
+string(10) "¤¢¤¤¤¦¤¨¤ª"
+string(10) "¤¢¤¤¤¦¤¨¤ª"
+string(10) "¤¢¤¤¤¦¤¨¤ª"
+array(1) {
[0]=>
- string(10) "‚ ‚¢‚¤‚¦‚¨" refcount(%d)
+ string(10) "‚ ‚¢‚¤‚¦‚¨"
}
-array(1) refcount(%d){
+array(1) {
[0]=>
- string(10) "¤¢¤¤¤¦¤¨¤ª" refcount(%d)
+ string(10) "¤¢¤¤¤¦¤¨¤ª"
}
-array(1) refcount(%d){
+array(1) {
[0]=>
- &string(10) "‚ ‚¢‚¤‚¦‚¨" refcount(%d)
+ &string(10) "‚ ‚¢‚¤‚¦‚¨"
}
-array(1) refcount(%d){
+array(1) {
[0]=>
- string(10) "¤¢¤¤¤¦¤¨¤ª" refcount(%d)
+ string(10) "¤¢¤¤¤¦¤¨¤ª"
}
-array(1) refcount(%d){
+array(1) {
[0]=>
- string(10) "¤¢¤¤¤¦¤¨¤ª" refcount(%d)
+ string(10) "¤¢¤¤¤¦¤¨¤ª"
}
-array(1) refcount(%d){
+array(1) {
[0]=>
- string(10) "¤¢¤¤¤¦¤¨¤ª" refcount(%d)
+ string(10) "¤¢¤¤¤¦¤¨¤ª"
}
-array(1) refcount(%d){
+array(1) {
[0]=>
- string(10) "¤¢¤¤¤¦¤¨¤ª" refcount(%d)
+ string(10) "¤¢¤¤¤¦¤¨¤ª"
}
-array(1) refcount(%d){
+array(1) {
[0]=>
- string(10) "¤¢¤¤¤¦¤¨¤ª" refcount(%d)
+ string(10) "¤¢¤¤¤¦¤¨¤ª"
}
-array(1) refcount(%d){
+array(1) {
[0]=>
- array(1) refcount(%d){
+ array(1) {
[0]=>
- string(10) "‚ ‚¢‚¤‚¦‚¨" refcount(%d)
+ string(10) "‚ ‚¢‚¤‚¦‚¨"
}
}
-array(1) refcount(%d){
+array(1) {
[0]=>
- array(1) refcount(%d){
+ array(1) {
[0]=>
- string(10) "¤¢¤¤¤¦¤¨¤ª" refcount(%d)
+ string(10) "¤¢¤¤¤¦¤¨¤ª"
}
}
diff --git a/ext/mbstring/tests/bug28220.phpt b/ext/mbstring/tests/bug28220.phpt
deleted file mode 100644
index 6845dc3ed9..0000000000
--- a/ext/mbstring/tests/bug28220.phpt
+++ /dev/null
@@ -1,25 +0,0 @@
---TEST--
-Bug #28220 (mb_strwidth() returns wrong width values for some Hangul characters)
---SKIPIF--
-<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
---FILE--
-<?php
-$coderange = array(
- range(0x0000, 0x1fff),
- range(0xff60, 0xff9f)
-);
-
-
-foreach ($coderange as $r) {
- $ng = 0;
- foreach ($r as $c) {
- if (mb_strwidth(pack('N1', $c), 'UCS-4BE') != 2) {
- $ng++;
- }
- }
- echo "$ng\n";
-}
-?>
---EXPECT--
-8085
-63
diff --git a/ext/mbstring/tests/bug43994.phpt b/ext/mbstring/tests/bug43994.phpt
index d41bf90a9f..9c84a7464a 100644
--- a/ext/mbstring/tests/bug43994.phpt
+++ b/ext/mbstring/tests/bug43994.phpt
@@ -13,10 +13,7 @@ function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build
* pattern is supplied to mb_ereg. Similar error message to ereg().
*/
-$unset_var = 10;
-unset ($unset_var);
-$inputs = array(NULL, null, false, FALSE, "", '', @$undefined_var,
-@$unset_var);
+$inputs = array(false, FALSE, "", '');
$iterator = 1;
foreach($inputs as $input) {
@@ -70,31 +67,3 @@ mb_ereg(): Argument #1 ($pattern) must not be empty
With $regs arg:
mb_ereg(): Argument #1 ($pattern) must not be empty
NULL
-
--- Iteration 5 --
-Without $regs arg:
-mb_ereg(): Argument #1 ($pattern) must not be empty
-With $regs arg:
-mb_ereg(): Argument #1 ($pattern) must not be empty
-NULL
-
--- Iteration 6 --
-Without $regs arg:
-mb_ereg(): Argument #1 ($pattern) must not be empty
-With $regs arg:
-mb_ereg(): Argument #1 ($pattern) must not be empty
-NULL
-
--- Iteration 7 --
-Without $regs arg:
-mb_ereg(): Argument #1 ($pattern) must not be empty
-With $regs arg:
-mb_ereg(): Argument #1 ($pattern) must not be empty
-NULL
-
--- Iteration 8 --
-Without $regs arg:
-mb_ereg(): Argument #1 ($pattern) must not be empty
-With $regs arg:
-mb_ereg(): Argument #1 ($pattern) must not be empty
-NULL
diff --git a/ext/mbstring/tests/bug45722.phpt b/ext/mbstring/tests/bug45722.phpt
index 97f6fe5d97..f0649cbb2a 100644
--- a/ext/mbstring/tests/bug45722.phpt
+++ b/ext/mbstring/tests/bug45722.phpt
@@ -7,4 +7,4 @@ Bug #45722 (mb_check_encoding() crashes)
var_dump(mb_check_encoding("&\xc2\xb7 TEST TEST TEST TEST TEST TEST", "HTML-ENTITIES"));
?>
--EXPECT--
-bool(false)
+bool(true)
diff --git a/ext/mbstring/tests/bug47399.phpt b/ext/mbstring/tests/bug47399.phpt
deleted file mode 100644
index 3586e5cc72..0000000000
--- a/ext/mbstring/tests/bug47399.phpt
+++ /dev/null
@@ -1,525 +0,0 @@
---TEST--
-Bug #47399 (mb_check_encoding() returns true for some illegal SJIS characters)
---SKIPIF--
-<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
---FILE--
-<?php
-foreach (array("Shift_JIS", "CP932") as $enc) {
- for ($a = 0; $a < 256; $a++) {
- var_dump(mb_check_encoding("\x81".pack("c", $a), $enc));
- }
-}
-?>
---EXPECT--
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(false)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(false)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(false)
-bool(false)
-bool(false)
diff --git a/ext/mbstring/tests/bug62545.phpt b/ext/mbstring/tests/bug62545.phpt
deleted file mode 100644
index 49ecc559d8..0000000000
--- a/ext/mbstring/tests/bug62545.phpt
+++ /dev/null
@@ -1,16 +0,0 @@
---TEST--
-Bug #62545 (wrong unicode mapping in some charsets)
---SKIPIF--
-<?php
-if (!extension_loaded('mbstring')) die('skip mbstring extension not available');
-?>
---FILE--
-<?php
-var_dump(
- bin2hex(mb_convert_encoding("\x98", 'UTF-8', 'Windows-1251')),
- bin2hex(mb_convert_encoding("\x81\x8d\x8f\x90\x9d", 'UTF-8', 'Windows-1252'))
-);
-?>
---EXPECT--
-string(6) "efbfbd"
-string(30) "efbfbdefbfbdefbfbdefbfbdefbfbd"
diff --git a/ext/mbstring/tests/bug72164.phpt b/ext/mbstring/tests/bug72164.phpt
index eff18982d5..3e04f0f0f7 100644
--- a/ext/mbstring/tests/bug72164.phpt
+++ b/ext/mbstring/tests/bug72164.phpt
@@ -9,7 +9,7 @@ if (!function_exists('mb_ereg')) die('skip mbregex support not available');
<?php
$var0 = "e";
$var2 = "";
-$var3 = NULL;
+$var3 = "";
try {
$var8 = mb_ereg_replace($var2,$var3,$var3,$var0);
var_dump($var8);
diff --git a/ext/mbstring/tests/bug73646.phpt b/ext/mbstring/tests/bug73646.phpt
index ea57017f11..83befc1071 100644
--- a/ext/mbstring/tests/bug73646.phpt
+++ b/ext/mbstring/tests/bug73646.phpt
@@ -9,5 +9,6 @@ if (!function_exists('mb_ereg')) die('skip mbregex support not available');
<?php
var_dump(mb_ereg_search_init(NULL));
?>
---EXPECT--
+--EXPECTF--
+Deprecated: mb_ereg_search_init(): Passing null to parameter #1 ($string) of type string is deprecated in %s on line %d
bool(true)
diff --git a/ext/mbstring/tests/cp1251_encoding.phpt b/ext/mbstring/tests/cp1251_encoding.phpt
new file mode 100644
index 0000000000..c2fa370cf4
--- /dev/null
+++ b/ext/mbstring/tests/cp1251_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of CP1251 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP1251.txt', 'CP1251');
+?>
+--EXPECT--
+Tested CP1251 -> UTF-16BE
+Tested UTF-16BE -> CP1251
diff --git a/ext/mbstring/tests/cp1252_encoding.phpt b/ext/mbstring/tests/cp1252_encoding.phpt
new file mode 100644
index 0000000000..cc2d81fdcd
--- /dev/null
+++ b/ext/mbstring/tests/cp1252_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of CP1252 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP1252.txt', 'CP1252');
+?>
+--EXPECT--
+Tested CP1252 -> UTF-16BE
+Tested UTF-16BE -> CP1252
diff --git a/ext/mbstring/tests/cp1254_encoding.phpt b/ext/mbstring/tests/cp1254_encoding.phpt
new file mode 100644
index 0000000000..4d5bbf81ab
--- /dev/null
+++ b/ext/mbstring/tests/cp1254_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of CP1254 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP1254.txt', 'CP1254');
+?>
+--EXPECT--
+Tested CP1254 -> UTF-16BE
+Tested UTF-16BE -> CP1254
diff --git a/ext/mbstring/tests/cp5022x_encoding.phpt b/ext/mbstring/tests/cp5022x_encoding.phpt
new file mode 100644
index 0000000000..33a73a5e2e
--- /dev/null
+++ b/ext/mbstring/tests/cp5022x_encoding.phpt
@@ -0,0 +1,293 @@
+--TEST--
+Exhaustive test of CP50220, CP50221, and CP50222 encodings
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+function shiftJISDecode($bytes) {
+ /* Convert CP932's default Shift-JIS representation to kuten code
+ *
+ * Shift-JIS is fun! The first byte only represents the top 7 bits of
+ * the ku number, because 94 first bytes were not available. There are
+ * two different ranges of 94 which the second byte can fall in, and
+ * we get the low bit of the ku number by seeing which one it is. */
+ $first = ($bytes >> 8) & 0xFF;
+ $second = $bytes & 0xFF;
+ $hi_bits = $first - (($first > 0x9F) ? 0xE0 - 31 : 0x81);
+ if ($second > 0x9E) {
+ $kuten = ((($hi_bits << 1) + 0x22) << 8) + ($second - 0x9F + 0x21);
+ } else if ($second > 0x7F) {
+ $kuten = ((($hi_bits << 1) + 0x21) << 8) + ($second - 0x80 + 63 + 0x21);
+ } else {
+ $kuten = ((($hi_bits << 1) + 0x21) << 8) + ($second - 0x40 + 0x21);
+ }
+ return $kuten;
+}
+
+/* Read in table of all characters in CP932 charset */
+$cp932Chars = array(); /* CP932 -> UTF-16BE */
+$fp = fopen(__DIR__ . '/data/CP932.txt', 'r+');
+while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+
+ if (sscanf($line, "0x%x\t0x%x", $bytes, $codepoint) == 2) {
+ if ($bytes < 256)
+ continue;
+ if ($bytes > 0xFA00) // We don't handle these extra characters from ku 114 and above
+ continue;
+ $cp932Chars[pack('n', shiftJISDecode($bytes))] = pack('n', $codepoint);
+ }
+}
+
+/* Aside from the characters in that table, we also support a 'user' area,
+ * which maps to Unicode 'private' codepoints 0xE000-E757 */
+$codepoint = 0xE000;
+for ($i = 0xF0; $i <= 0xF9; $i++) {
+ for ($j = 0x40; $j <= 0xFC; $j++) {
+ if ($j == 0x7F)
+ continue;
+ $cp932Chars[pack('n', shiftJISDecode(($i << 8) + $j))] = pack('n', $codepoint);
+ $codepoint++;
+ }
+}
+
+/* There are 396 Unicode codepoints which are non-invertible in CP932
+ * (multiple CP932 byte sequences map to the same codepoint) */
+$nonInvertible = array();
+for ($i = 0xED00; $i <= 0xEEFF; $i++) {
+ $bytes = pack('n', shiftJISDecode($i));
+ if (isset($cp932Chars[$bytes])) {
+ $nonInvertible[$bytes] = $cp932Chars[$bytes];
+ unset($cp932Chars[$bytes]); // will test these separately
+ }
+}
+foreach ([0x8790, 0x8791, 0x8792, 0x8795, 0x8796, 0x8797, 0x879A, 0x879B, 0x879C] as $i) {
+ $bytes = pack('n', shiftJISDecode($i));
+ $nonInvertible[$bytes] = $cp932Chars[$bytes];
+ unset($cp932Chars[$bytes]); // will test these separately
+}
+
+/* Read in table of all characters in JISX-0201 charset */
+$jisx0201Chars = array(); /* JISX0201 -> UTF-16BE */
+$fp = fopen(__DIR__ . '/data/JISX0201.txt', 'r+');
+while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+
+ if (sscanf($line, "0x%x\t0x%x", $byte, $codepoint) == 2)
+ $jisx0201Chars[chr($byte)] = pack('n', $codepoint);
+}
+
+/* Our conversions between CP5022x (when CP932 charset is selected) and Unicode
+ * differ in a number of places from the table provided by the Unicode Consortium */
+$cp932Chars["\x21\x41"] = "\x30\x1C"; /* WAVE DASH instead of FULLWIDTH TILDE */
+$cp932Chars["\x21\x42"] = "\x20\x16"; /* DOUBLE VERTICAL LINE instead of PARALLEL TO */
+$cp932Chars["\x21\x5D"] = "\x22\x12"; /* MINUS SIGN instead of FULLWIDTH HYPHEN-MINUS */
+$cp932Chars["\x21\x71"] = "\x00\xA2"; /* CENT SIGN instead of FULLWIDTH CENT SIGN */
+$cp932Chars["\x21\x72"] = "\x00\xA3"; /* POUND SIGN instead of FULLWIDTH POUND SIGN */
+$cp932Chars["\x22\x4C"] = "\x00\xAC"; /* NOT SIGN instead of FULLWIDTH NOT SIGN */
+
+function testValid($from, $to, $encoding, $bothWays = true) {
+ identifyValidString($from, $encoding);
+ convertValidString($from, $to, $encoding, 'UTF-16BE', false);
+
+ if ($bothWays) {
+ /* An 0xF at the beginning is redundant; it switches to ASCII mode, but
+ * ASCII mode is default */
+ if ($from[0] == "\x0F")
+ $from = substr($from, 1, strlen($from) - 1);
+ /* ESC ( B at the beginning is redundant, since ASCII mode is the default */
+ if (substr($from, 0, 3) == "\x1B(B")
+ $from = substr($from, 3, strlen($from) - 3);
+ /* If the string switches to a different charset, it should switch back to
+ * ASCII at the end */
+ if (strpos($from, "\x1B\$B") !== false || strpos($from, "\x1B(J") !== false || strpos($from, "\x1B(I") !== false)
+ $from .= "\x1B(B";
+ if ($encoding == 'CP50222' && $from[0] == "\x0E")
+ $from .= "\x0F";
+
+ convertValidString($to, $from, 'UTF-16BE', $encoding, false);
+ }
+}
+
+function testInvalid($from, $to, $encoding) {
+ testInvalidString($from, $to, $encoding, 'UTF-16BE');
+}
+
+for ($i = 0; $i < 0x80; $i++) {
+ if ($i == 0xE || $i == 0xF || $i == 0x1B)
+ continue;
+ testValid(chr($i), "\x00" . chr($i), 'CP50220');
+ testValid(chr($i), "\x00" . chr($i), 'CP50221');
+ testValid(chr($i), "\x00" . chr($i), 'CP50222');
+ testValid("\x1B(B" . chr($i), "\x00" . chr($i), 'CP50220');
+ testValid("\x1B(B" . chr($i), "\x00" . chr($i), 'CP50221');
+ testValid("\x1B(B" . chr($i), "\x00" . chr($i), 'CP50222');
+ testValid("\x0F" . chr($i), "\x00" . chr($i), 'CP50222', false); /* 0xF is 'Shift Out' code */
+}
+
+for ($i = 0x80; $i < 256; $i++) {
+ if ($i >= 0xA1 && $i <= 0xDF) // We convert single bytes from 0xA1-0xDF as JIS X 0201 kana
+ continue;
+ testInvalid(chr($i), "\x00%", 'CP50220');
+ testInvalid(chr($i), "\x00%", 'CP50221');
+ testInvalid(chr($i), "\x00%", 'CP50222');
+ testInvalid("\x1B(B" . chr($i), "\x00%", 'CP50220');
+ testInvalid("\x1B(B" . chr($i), "\x00%", 'CP50221');
+ testInvalid("\x1B(B" . chr($i), "\x00%", 'CP50222');
+ testInvalid("\x0F" . chr($i), "\x00%", 'CP50220');
+ testInvalid("\x0F" . chr($i), "\x00%", 'CP50221');
+ testInvalid("\x0F" . chr($i), "\x00%", 'CP50222');
+}
+
+echo "ASCII support OK\n";
+
+/* All valid JIS X 0201 characters
+ * Those with a 1 in the high bit are JIS X 0201 kana */
+foreach ($jisx0201Chars as $jisx0201 => $utf16BE) {
+ if (ord($jisx0201) >= 128) { /* Kana */
+ $kana = chr(ord($jisx0201) - 128);
+ testValid("\x1B(I" . $kana, $utf16BE, 'CP50221');
+ testValid("\x1B(J\x0E" . $kana, $utf16BE, 'CP50222', false); /* 0xE is 'Shift In' code */
+ testValid("\x0E" . $kana, $utf16BE, 'CP50222', false);
+ testValid($jisx0201, $utf16BE, 'CP50220', false);
+ testValid($jisx0201, $utf16BE, 'CP50221', false);
+ testValid($jisx0201, $utf16BE, 'CP50222', false);
+ } else { /* Latin */
+ testValid("\x1B(J" . $jisx0201, $utf16BE, 'CP50220', $utf16BE > "\x00\x80");
+ testValid("\x1B(J" . $jisx0201, $utf16BE, 'CP50221', $utf16BE > "\x00\x80");
+ testValid("\x1B(J" . $jisx0201, $utf16BE, 'CP50222', $utf16BE > "\x00\x80");
+ }
+}
+
+for ($i = 0x80; $i < 256; $i++) {
+ if ($i >= 0xA1 && $i <= 0xDF)
+ continue;
+ testInvalid("\x1B(I" . chr($i), "\x00%", 'CP50220');
+ testInvalid("\x1B(I" . chr($i), "\x00%", 'CP50221');
+ testInvalid("\x1B(I" . chr($i), "\x00%", 'CP50222');
+ testInvalid("\x1B(J" . chr($i), "\x00%", 'CP50220');
+ testInvalid("\x1B(J" . chr($i), "\x00%", 'CP50221');
+ testInvalid("\x1B(J" . chr($i), "\x00%", 'CP50222');
+}
+
+echo "JIS X 0201 support OK\n";
+
+/* All valid CP932 characters */
+foreach ($cp932Chars as $cp932 => $utf16BE) {
+ testValid("\x1B\$B" . $cp932, $utf16BE, 'CP50220');
+ testValid("\x1B\$B" . $cp932, $utf16BE, 'CP50221');
+ testValid("\x1B\$B" . $cp932, $utf16BE, 'CP50222');
+}
+foreach ($nonInvertible as $cp932 => $utf16BE) {
+ testValid("\x1B\$B" . $cp932, $utf16BE, 'CP50220', false);
+ testValid("\x1B\$B" . $cp932, $utf16BE, 'CP50221', false);
+ testValid("\x1B\$B" . $cp932, $utf16BE, 'CP50222', false);
+}
+
+/* All invalid 2-byte CP932 characters */
+for ($i = 0x21; $i <= 0x7E; $i++) {
+ for ($j = 0; $j < 256; $j++) {
+ $testString = chr($i) . chr($j);
+ if (!isset($cp932Chars[$testString]) && !isset($nonInvertible[$testString])) {
+ testInvalid("\x1B\$B" . $testString, "\x00%", 'CP50220');
+ testInvalid("\x1B\$B" . $testString, "\x00%", 'CP50221');
+ testInvalid("\x1B\$B" . $testString, "\x00%", 'CP50222');
+ }
+ }
+}
+
+/* Try truncated 2-byte characters */
+for ($i = 0x21; $i <= 0x7E; $i++) {
+ testInvalid("\x1B\$B" . chr($i), "\x00%", 'CP50220');
+ testInvalid("\x1B\$B" . chr($i), "\x00%", 'CP50221');
+ testInvalid("\x1B\$B" . chr($i), "\x00%", 'CP50222');
+}
+
+echo "CP932 support OK\n";
+
+/* Unicode codepoint for halfwidth katakana -> kuten code for ordinary katakana */
+$fullwidthKatakana = array(
+ 0xFF61 => 0x2123, /* Ideographic full stop */
+ 0xFF62 => 0x2156, /* Left corner bracket */
+ 0xFF63 => 0x2157, /* Right corner bracket */
+ 0xFF64 => 0x2122, /* Ideographic comma */
+ 0xFF65 => 0x2126, /* Katakana middle dot */
+ 0xFF66 => 0x2572, /* Wo */
+ 0xFF67 => 0x2521, /* Small A */
+ 0xFF68 => 0x2523, /* Small I */
+ 0xFF69 => 0x2525, /* Small U */
+ 0xFF6A => 0x2527, /* Small E */
+ 0xFF6B => 0x2529, /* Small O */
+ 0xFF6C => 0x2563, /* Small Ya */
+ 0xFF6D => 0x2565, /* Small Yu */
+ 0xFF6E => 0x2567, /* Small Yo */
+ 0xFF6F => 0x2543, /* Small Tsu */
+ 0xFF70 => 0x213C, /* Prolonged Sound Marker */
+ 0xFF71 => 0x2522, /* A */
+ 0xFF72 => 0x2524, /* I */
+ 0xFF73 => 0x2526, /* U */
+ 0xFF74 => 0x2528, /* E */
+ 0xFF75 => 0x252A, /* O */
+ 0xFF76 => 0x252B, /* Ka */
+ 0xFF77 => 0x252D, /* Ki */
+ 0xFF78 => 0x252F, /* Ku */
+ 0xFF79 => 0x2531, /* Ke */
+ 0xFF7A => 0x2533, /* Ko */
+ 0xFF7B => 0x2535, /* Sa */
+ 0xFF7C => 0x2537, /* Shi */
+ 0xFF7D => 0x2539, /* Su */
+ 0xFF7E => 0x253B, /* Se */
+ 0xFF7F => 0x253D, /* So */
+ 0xFF80 => 0x253F, /* Ta */
+ 0xFF81 => 0x2541, /* Chi */
+ 0xFF82 => 0x2544, /* Tsu */
+ 0xFF83 => 0x2546, /* Te */
+ 0xFF84 => 0x2548, /* To */
+ 0xFF85 => 0x254A, /* Na */
+ 0xFF86 => 0x254B, /* Ni */
+ 0xFF87 => 0x254C, /* Nu */
+ 0xFF88 => 0x254D, /* Ne */
+ 0xFF89 => 0x254E, /* No */
+ 0xFF8A => 0x254F, /* Ha */
+ 0xFF8B => 0x2552, /* Hi */
+ 0xFF8C => 0x2555, /* Fu */
+ 0xFF8D => 0x2558, /* He */
+ 0xFF8E => 0x255B, /* Ho */
+ 0xFF8F => 0x255E, /* Ma */
+ 0xFF90 => 0x255F, /* Mi */
+ 0xFF91 => 0x2560, /* Mu */
+ 0xFF92 => 0x2561, /* Me */
+ 0xFF93 => 0x2562, /* Mo */
+ 0xFF94 => 0x2564, /* Ya */
+ 0xFF95 => 0x2566, /* Yu */
+ 0xFF96 => 0x2568, /* Yo */
+ 0xFF97 => 0x2569, /* Ra */
+ 0xFF98 => 0x256A, /* Ri */
+ 0xFF99 => 0x256B, /* Ru */
+ 0xFF9A => 0x256C, /* Re */
+ 0xFF9B => 0x256D, /* Ro */
+ 0xFF9C => 0x256F, /* Wa */
+ 0xFF9D => 0x2573, /* N */
+ 0xFF9E => 0x212B, /* Voice Mark */
+ 0xFF9F => 0x212C /* Semi-voice Mark */
+);
+foreach ($fullwidthKatakana as $cp => $kuten) {
+ convertValidString(pack('n', $cp), "\x1B\$B" . pack('n', $kuten) . "\x1B(B", 'UTF-16BE', 'CP50220', false);
+}
+
+echo "Folding of fullwidth katakana for CP50220 OK\n";
+
+?>
+--EXPECT--
+ASCII support OK
+JIS X 0201 support OK
+CP932 support OK
+Folding of fullwidth katakana for CP50220 OK
diff --git a/ext/mbstring/tests/cp51932_encoding.phpt b/ext/mbstring/tests/cp51932_encoding.phpt
new file mode 100644
index 0000000000..bf7b60bcc3
--- /dev/null
+++ b/ext/mbstring/tests/cp51932_encoding.phpt
@@ -0,0 +1,111 @@
+--TEST--
+Exhaustive test of CP51932 encoding verification and conversion
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+srand(2020); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in the table of all characters in CP51932 */
+$validChars = array(); /* CP51932 string -> UTF-16BE string */
+$fromUnicode = array();
+
+$fp = fopen(realpath(__DIR__ . '/data/CP51932.txt'), 'r+');
+while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+
+ $byte2 = null;
+ if (sscanf($line, '<U%x> \x%x\x%x', $codepoint, $byte1, $byte2) >= 2) {
+ /* The table we are using tries to map as many Unicode codepoints into
+ * CP51932 as possible, including by mapping latin characters with accents
+ * to the equivalent without accents; but since CP51932 is based on the
+ * CP932 character set, we don't need to handle codepoints which are not
+ * mapped from any character in CP932 */
+ if (($codepoint >= 0xC0 && $codepoint <= 0xD6) ||
+ ($codepoint >= 0xD8 && $codepoint <= 0xF6) ||
+ ($codepoint >= 0xF8 && $codepoint <= 0xFF))
+ continue;
+ $cp51932 = ($byte2 ? (chr($byte1) . chr($byte2)) : chr($byte1));
+ $utf16 = pack('n', $codepoint);
+ $validChars[$cp51932] = $utf16;
+ $fromUnicode[$utf16] = $cp51932;
+ }
+}
+
+/* We map the JIS X 0208 FULLWIDTH TILDE to U+FF5E (FULLWIDTH TILDE)
+ * But when converting Unicode to CP51932, we also accept U+301C (WAVE DASH) */
+$fromUnicode["\x30\x1C"] = "\xA1\xC1";
+/* We map the JIS X 0208 MINUS SIGN to U+FF0D (FULLWIDTH HYPHEN-MINUS SIGN),
+ * but when converting Unicode to CP51932, we also accept U+2212 (MINUS SIGN) */
+$fromUnicode["\x22\x12"] = "\xA1\xDD";
+/* We map the JIS X 0208 PARALLEL TO symbol to U+2225 (PARALLEL TO),
+ * but when converting Unicode to CP51932, we also accept U+2016
+ * (DOUBLE VERTICAL LINE) */
+$fromUnicode["\x20\x16"] = "\xA1\xC2";
+
+/* There are a number of duplicate, irreversible mappings in the CP51932 table
+ * In most cases, the one which we primarily use appears last in the table,
+ * but in some cases, it is first and will be overwritten in the above loop
+ *
+ * Interestingly, the "collisions" happen in both directions! Part of this is
+ * because the table we are using attempts to map as many Unicode codepoints
+ * as possible to CP932 characters */
+$fromUnicode["\x22\x20"] = "\xA2\xDC";
+$fromUnicode["\x22\x29"] = "\xA2\xC1";
+$fromUnicode["\x22\x2B"] = "\xA2\xE9";
+$fromUnicode["\x22\x35"] = "\xA2\xE8";
+$fromUnicode["\x22\x1A"] = "\xA2\xE5";
+$fromUnicode["\x22\x2A"] = "\xA2\xC0";
+$fromUnicode["\x22\x61"] = "\xA2\xE1";
+$fromUnicode["\x22\xA5"] = "\xA2\xDD";
+$fromUnicode["\x22\x52"] = "\xA2\xE2";
+$fromUnicode["\xFF\xE2"] = "\xA2\xCC";
+unset($fromUnicode["\x00\xA1"]); // Don't map upside-down ! to ordinary !
+unset($fromUnicode["\x00\xA6"]); // Don't map broken bar to ordinary pipe character
+unset($fromUnicode["\x00\xA9"]); // Don't map © to c
+unset($fromUnicode["\x00\xAA"]); // Don't map feminine ordinal indicator
+unset($fromUnicode["\x00\xAB"]); // Don't map left double angled quote mark to "much less than"
+unset($fromUnicode["\x00\xAD"]); // Don't map soft hyphen to ordinary hyphen
+unset($fromUnicode["\x00\xAE"]); // Don't map ® to R
+unset($fromUnicode["\x00\xAF"]); // Don't map Unicode halfwidth macron to CP932 fullwidth macron
+unset($fromUnicode["\x00\xB2"]); // Don't map ² to ordinary 2
+unset($fromUnicode["\x00\xB3"]); // Don't map ³ to ordinary 3
+unset($fromUnicode["\x00\xB5"]); // Don't map micro sign to Greek mu
+unset($fromUnicode["\x00\xB7"]); // Don't map middle dot to katakana middle dot
+unset($fromUnicode["\x00\xB8"]); // Don't map cedilla to fullwidth comma
+unset($fromUnicode["\x00\xB9"]); // Don't map ¹ to ordinary 1
+unset($fromUnicode["\x00\xBA"]); // Don't map "masculine ordinal indicator"
+unset($fromUnicode["\x00\xBB"]); // Don't map right double angled quote mark to "much greater than"
+unset($fromUnicode["\x30\x94"]); // Don't map hiragana vu to katakana vu
+
+for ($i = 0; $i <= 0x7F; $i++)
+ $validChars[chr($i)] = "\x00" . chr($i);
+
+/* U+00A5 is YEN SIGN; convert to FULLWIDTH YEN SIGN */
+$fromUnicode["\x00\xA5"] = "\xA1\xEF";
+/* U+203E is OVERLINE; convert to FULLWIDTH MACRON */
+$fromUnicode["\x20\x3E"] = "\xA1\xB1";
+/* U+00AF is MACRON; convert to FULLWIDTH MACRON */
+$fromUnicode["\x00\xAF"] = "\xA1\xB1";
+
+testAllValidChars($validChars, 'CP51932', 'UTF-16BE', false);
+testAllValidChars($fromUnicode, 'UTF-16BE', 'CP51932', false);
+echo "CP51932 verification and conversion works on all valid characters\n";
+
+findInvalidChars($validChars, $invalidChars, $truncated, array_fill_keys(range(0xA9, 0xAF), 2) + array_fill_keys(range(0xF5, 0xF8), 2) + array(0xFD => 2, 0xFE => 2));
+
+testAllInvalidChars($invalidChars, $validChars, 'CP51932', 'UTF-16BE', "\x00%");
+testTruncatedChars($truncated, 'CP51932', 'UTF-16BE', "\x00%");
+echo "CP51932 verification and conversion works on all invalid characters\n";
+
+findInvalidChars($fromUnicode, $invalidCodepoints, $unused, array_fill_keys(range(0, 0xFF), 2));
+convertAllInvalidChars($invalidCodepoints, $fromUnicode, 'UTF-16BE', 'CP51932', '%');
+echo "Unicode -> CP51932 conversion works on all invalid codepoints\n";
+?>
+--EXPECT--
+CP51932 verification and conversion works on all valid characters
+CP51932 verification and conversion works on all invalid characters
+Unicode -> CP51932 conversion works on all invalid codepoints
diff --git a/ext/mbstring/tests/cp850_encoding.phpt b/ext/mbstring/tests/cp850_encoding.phpt
new file mode 100644
index 0000000000..c736da1e14
--- /dev/null
+++ b/ext/mbstring/tests/cp850_encoding.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Exhaustive test of verification and conversion of CP850 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP850.txt', 'CP850');?>
+--EXPECT--
+Tested CP850 -> UTF-16BE
+Tested UTF-16BE -> CP850
diff --git a/ext/mbstring/tests/cp866_encoding.phpt b/ext/mbstring/tests/cp866_encoding.phpt
new file mode 100644
index 0000000000..774d9e4488
--- /dev/null
+++ b/ext/mbstring/tests/cp866_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of CP866 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP866.txt', 'CP866');
+?>
+--EXPECT--
+Tested CP866 -> UTF-16BE
+Tested UTF-16BE -> CP866
diff --git a/ext/mbstring/tests/cp932_encoding.phpt b/ext/mbstring/tests/cp932_encoding.phpt
new file mode 100644
index 0000000000..b426281f24
--- /dev/null
+++ b/ext/mbstring/tests/cp932_encoding.phpt
@@ -0,0 +1,108 @@
+--TEST--
+Exhaustive test of CP932 encoding verification and conversion
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+srand(4321); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in the table of all characters in CP932 */
+readConversionTable(__DIR__ . '/data/CP932.txt', $validChars, $fromUnicode);
+
+/* Aside from the characters in that table, we also support a 'user' area
+ * from 0xF040-0xF9FC, which map to Unicode 'private' codepoints 0xE000-E757 */
+$codepoint = 0xE000;
+for ($i = 0xF0; $i <= 0xF9; $i++) {
+ for ($j = 0x40; $j <= 0xFC; $j++) {
+ if ($j == 0x7F)
+ continue;
+ $utf16 = pack('n', $codepoint);
+ $cp932 = chr($i) . chr($j);
+ $validChars[$cp932] = $utf16;
+ $fromUnicode[$utf16] = $cp932;
+ $codepoint++;
+ }
+}
+
+/* U+00A2 is CENT SIGN; convert to FULLWIDTH CENT SIGN */
+$fromUnicode["\x00\xA2"] = "\x81\x91";
+/* U+00A3 is POUND SIGN; convert to FULLWIDTH POUND SIGN */
+$fromUnicode["\x00\xA3"] = "\x81\x92";
+/* U+00A5 is YEN SIGN; convert to FULLWIDTH YEN SIGN */
+$fromUnicode["\x00\xA5"] = "\x81\x8F";
+
+/* We map the JIS X 0208 FULLWIDTH TILDE to U+FF5E (FULLWIDTH TILDE)
+ * But when converting Unicode to CP932, we also accept U+301C (WAVE DASH) */
+$fromUnicode["\x30\x1C"] = "\x81\x60";
+/* We map the JIS X 0208 MINUS SIGN to U+FF0D (FULLWIDTH HYPHEN-MINUS SIGN),
+ * but when converting Unicode to CP932, we also accept U+2212 (MINUS SIGN) */
+$fromUnicode["\x22\x12"] = "\x81\x7C";
+/* We map the JIS X 0208 PARALLEL TO symbol to U+2225 (PARALLEL TO),
+ * but when converting Unicode to CP932, we also accept U+2016
+ * (DOUBLE VERTICAL LINE) */
+$fromUnicode["\x20\x16"] = "\x81\x61";
+/* We map the JIS X 0208 NOT SIGN to U+FFE2 (FULLWIDTH NOT SIGN),
+ * but when converting Unicode to CP932, we also accept U+00AC (NOT SIGN) */
+$fromUnicode["\x00\xAC"] = "\x81\xCA";
+
+/* U+203E is OVERLINE; convert to JIS X 0208 FULLWIDTH MACRON */
+$fromUnicode["\x20\x3E"] = "\x81\x50";
+
+/* U+00AF is MACRON; it can also go to FULLWIDTH MACRON */
+$fromUnicode["\x00\xAF"] = "\x81\x50";
+
+findInvalidChars($validChars, $invalidChars, $truncated, array_fill_keys(range(0x81, 0x9F), 2) + array_fill_keys(range(0xE0, 0xFC), 2));
+
+findInvalidChars($fromUnicode, $invalidCodepoints, $unused, array_fill_keys(range(0, 0xFF), 2));
+
+/* There are 396 Unicode codepoints which are non-invertible in CP932
+ * (multiple CP932 byte sequences map to the same codepoint)
+ * Some of these are 3-way pile-ups. I wonder what the fine folks at MS
+ * were thinking when they designed this text encoding. */
+
+/* Everything from 0xED00-0xEEFF falls in this unfortunate category
+ * (Other sequences in 0xFA00-0xFBFF map to the same codepoints, and when
+ * converting from Unicode back to CP932, we favor the F's rather than the E's) */
+$nonInvertible = array();
+for ($i = 0xED00; $i <= 0xEEFF; $i++) {
+ $bytes = pack('n', $i);
+ if (isset($validChars[$bytes])) {
+ unset($fromUnicode[$validChars[$bytes]]);
+ $nonInvertible[$bytes] = $validChars[$bytes];
+ unset($validChars[$bytes]); // will test these separately
+ }
+}
+
+/* There are 23 other collisions between 2-byte sequences which variously
+ * start with 0x81, 0x87, or 0xFA
+ * We _love_ 0x81 and use it when possible. 0x87 is a second favorite */
+for ($i = 0xFA4A; $i <= 0xFA53; $i++) {
+ $bytes = pack('n', $i);
+ unset($fromUnicode[$validChars[$bytes]]);
+ $nonInvertible[$bytes] = $validChars[$bytes];
+ unset($validChars[$bytes]); // will test these separately
+}
+foreach ([0x8790, 0x8791, 0x8792, 0x8795, 0x8796, 0x8797, 0x879A, 0x879B, 0x879C, 0xFA54, 0xFA58, 0xFA59, 0xFA5A, 0xFA5B] as $i) {
+ $bytes = pack('n', $i);
+ unset($fromUnicode[$validChars[$bytes]]);
+ $nonInvertible[$bytes] = $validChars[$bytes];
+ unset($validChars[$bytes]); // will test these separately
+}
+
+testAllValidChars($validChars, 'CP932', 'UTF-16BE');
+foreach ($nonInvertible as $cp932 => $unicode)
+ testValidString($cp932, $unicode, 'CP932', 'UTF-16BE', false);
+echo "CP932 verification and conversion works on all valid characters\n";
+
+testAllInvalidChars($invalidChars, $validChars, 'CP932', 'UTF-16BE', "\x00%");
+echo "CP932 verification and conversion works on all invalid characters\n";
+
+convertAllInvalidChars($invalidCodepoints, $fromUnicode, 'UTF-16BE', 'CP932', '%');
+echo "Unicode -> CP932 conversion works on all invalid codepoints\n";
+?>
+--EXPECT--
+CP932 verification and conversion works on all valid characters
+CP932 verification and conversion works on all invalid characters
+Unicode -> CP932 conversion works on all invalid codepoints
diff --git a/ext/mbstring/tests/data/8859-1.txt b/ext/mbstring/tests/data/8859-1.txt
new file mode 100644
index 0000000000..3a55afefc4
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-1.txt
@@ -0,0 +1,292 @@
+# 8859-1.TXT
+# Date: 2015-12-02 20:19:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-1:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-1:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-1 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-1 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x00A1 # INVERTED EXCLAMATION MARK
+0xA2 0x00A2 # CENT SIGN
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x00A5 # YEN SIGN
+0xA6 0x00A6 # BROKEN BAR
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x00AA # FEMININE ORDINAL INDICATOR
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x00AF # MACRON
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x00B8 # CEDILLA
+0xB9 0x00B9 # SUPERSCRIPT ONE
+0xBA 0x00BA # MASCULINE ORDINAL INDICATOR
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC # VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS
+0xBF 0x00BF # INVERTED QUESTION MARK
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic)
+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic)
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German)
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic)
+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic)
+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/8859-10.txt b/ext/mbstring/tests/data/8859-10.txt
new file mode 100644
index 0000000000..0ec67d72ee
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-10.txt
@@ -0,0 +1,292 @@
+# 8859-10.TXT
+# Date: 2015-12-02 21:53:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-10:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 October 11 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-10:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-10 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-10 order.
+#
+# Version history
+# 1.0 version new.
+# 1.1 corrected mistake in mapping of 0xA4
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 0x0112 # LATIN CAPITAL LETTER E WITH MACRON
+0xA3 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+0xA4 0x012A # LATIN CAPITAL LETTER I WITH MACRON
+0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE
+0xA6 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA
+0xA9 0x0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xAA 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xAB 0x0166 # LATIN CAPITAL LETTER T WITH STROKE
+0xAC 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x016A # LATIN CAPITAL LETTER U WITH MACRON
+0xAF 0x014A # LATIN CAPITAL LETTER ENG
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0xB2 0x0113 # LATIN SMALL LETTER E WITH MACRON
+0xB3 0x0123 # LATIN SMALL LETTER G WITH CEDILLA
+0xB4 0x012B # LATIN SMALL LETTER I WITH MACRON
+0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE
+0xB6 0x0137 # LATIN SMALL LETTER K WITH CEDILLA
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x013C # LATIN SMALL LETTER L WITH CEDILLA
+0xB9 0x0111 # LATIN SMALL LETTER D WITH STROKE
+0xBA 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xBB 0x0167 # LATIN SMALL LETTER T WITH STROKE
+0xBC 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xBD 0x2015 # HORIZONTAL BAR
+0xBE 0x016B # LATIN SMALL LETTER U WITH MACRON
+0xBF 0x014B # LATIN SMALL LETTER ENG
+0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK
+0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic)
+0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x0168 # LATIN CAPITAL LETTER U WITH TILDE
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic)
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German)
+0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK
+0xE8 0x010D # LATIN SMALL LETTER C WITH CARON
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic)
+0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA
+0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x0169 # LATIN SMALL LETTER U WITH TILDE
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic)
+0xFF 0x0138 # LATIN SMALL LETTER KRA
diff --git a/ext/mbstring/tests/data/8859-11.txt b/ext/mbstring/tests/data/8859-11.txt
new file mode 100644
index 0000000000..5334e3c276
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-11.txt
@@ -0,0 +1,286 @@
+# 8859-11.TXT
+# Date: 2015-12-02 21:55:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-11:2001 to Unicode
+# Unicode version: 3.2
+# Table version: 2.0
+# Table format: Format A
+# Date: 2002 October 7 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-11:2001 characters map into Unicode.
+#
+# ISO/IEC 8859-11:2001 is equivalent to TIS 620-2533 (1990) with
+# the addition of 0xA0 NO-BREAK SPACE.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-11 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-11 order.
+#
+# Version history:
+# 2002 October 7 Created
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0E01 # THAI CHARACTER KO KAI
+0xA2 0x0E02 # THAI CHARACTER KHO KHAI
+0xA3 0x0E03 # THAI CHARACTER KHO KHUAT
+0xA4 0x0E04 # THAI CHARACTER KHO KHWAI
+0xA5 0x0E05 # THAI CHARACTER KHO KHON
+0xA6 0x0E06 # THAI CHARACTER KHO RAKHANG
+0xA7 0x0E07 # THAI CHARACTER NGO NGU
+0xA8 0x0E08 # THAI CHARACTER CHO CHAN
+0xA9 0x0E09 # THAI CHARACTER CHO CHING
+0xAA 0x0E0A # THAI CHARACTER CHO CHANG
+0xAB 0x0E0B # THAI CHARACTER SO SO
+0xAC 0x0E0C # THAI CHARACTER CHO CHOE
+0xAD 0x0E0D # THAI CHARACTER YO YING
+0xAE 0x0E0E # THAI CHARACTER DO CHADA
+0xAF 0x0E0F # THAI CHARACTER TO PATAK
+0xB0 0x0E10 # THAI CHARACTER THO THAN
+0xB1 0x0E11 # THAI CHARACTER THO NANGMONTHO
+0xB2 0x0E12 # THAI CHARACTER THO PHUTHAO
+0xB3 0x0E13 # THAI CHARACTER NO NEN
+0xB4 0x0E14 # THAI CHARACTER DO DEK
+0xB5 0x0E15 # THAI CHARACTER TO TAO
+0xB6 0x0E16 # THAI CHARACTER THO THUNG
+0xB7 0x0E17 # THAI CHARACTER THO THAHAN
+0xB8 0x0E18 # THAI CHARACTER THO THONG
+0xB9 0x0E19 # THAI CHARACTER NO NU
+0xBA 0x0E1A # THAI CHARACTER BO BAIMAI
+0xBB 0x0E1B # THAI CHARACTER PO PLA
+0xBC 0x0E1C # THAI CHARACTER PHO PHUNG
+0xBD 0x0E1D # THAI CHARACTER FO FA
+0xBE 0x0E1E # THAI CHARACTER PHO PHAN
+0xBF 0x0E1F # THAI CHARACTER FO FAN
+0xC0 0x0E20 # THAI CHARACTER PHO SAMPHAO
+0xC1 0x0E21 # THAI CHARACTER MO MA
+0xC2 0x0E22 # THAI CHARACTER YO YAK
+0xC3 0x0E23 # THAI CHARACTER RO RUA
+0xC4 0x0E24 # THAI CHARACTER RU
+0xC5 0x0E25 # THAI CHARACTER LO LING
+0xC6 0x0E26 # THAI CHARACTER LU
+0xC7 0x0E27 # THAI CHARACTER WO WAEN
+0xC8 0x0E28 # THAI CHARACTER SO SALA
+0xC9 0x0E29 # THAI CHARACTER SO RUSI
+0xCA 0x0E2A # THAI CHARACTER SO SUA
+0xCB 0x0E2B # THAI CHARACTER HO HIP
+0xCC 0x0E2C # THAI CHARACTER LO CHULA
+0xCD 0x0E2D # THAI CHARACTER O ANG
+0xCE 0x0E2E # THAI CHARACTER HO NOKHUK
+0xCF 0x0E2F # THAI CHARACTER PAIYANNOI
+0xD0 0x0E30 # THAI CHARACTER SARA A
+0xD1 0x0E31 # THAI CHARACTER MAI HAN-AKAT
+0xD2 0x0E32 # THAI CHARACTER SARA AA
+0xD3 0x0E33 # THAI CHARACTER SARA AM
+0xD4 0x0E34 # THAI CHARACTER SARA I
+0xD5 0x0E35 # THAI CHARACTER SARA II
+0xD6 0x0E36 # THAI CHARACTER SARA UE
+0xD7 0x0E37 # THAI CHARACTER SARA UEE
+0xD8 0x0E38 # THAI CHARACTER SARA U
+0xD9 0x0E39 # THAI CHARACTER SARA UU
+0xDA 0x0E3A # THAI CHARACTER PHINTHU
+0xDF 0x0E3F # THAI CURRENCY SYMBOL BAHT
+0xE0 0x0E40 # THAI CHARACTER SARA E
+0xE1 0x0E41 # THAI CHARACTER SARA AE
+0xE2 0x0E42 # THAI CHARACTER SARA O
+0xE3 0x0E43 # THAI CHARACTER SARA AI MAIMUAN
+0xE4 0x0E44 # THAI CHARACTER SARA AI MAIMALAI
+0xE5 0x0E45 # THAI CHARACTER LAKKHANGYAO
+0xE6 0x0E46 # THAI CHARACTER MAIYAMOK
+0xE7 0x0E47 # THAI CHARACTER MAITAIKHU
+0xE8 0x0E48 # THAI CHARACTER MAI EK
+0xE9 0x0E49 # THAI CHARACTER MAI THO
+0xEA 0x0E4A # THAI CHARACTER MAI TRI
+0xEB 0x0E4B # THAI CHARACTER MAI CHATTAWA
+0xEC 0x0E4C # THAI CHARACTER THANTHAKHAT
+0xED 0x0E4D # THAI CHARACTER NIKHAHIT
+0xEE 0x0E4E # THAI CHARACTER YAMAKKAN
+0xEF 0x0E4F # THAI CHARACTER FONGMAN
+0xF0 0x0E50 # THAI DIGIT ZERO
+0xF1 0x0E51 # THAI DIGIT ONE
+0xF2 0x0E52 # THAI DIGIT TWO
+0xF3 0x0E53 # THAI DIGIT THREE
+0xF4 0x0E54 # THAI DIGIT FOUR
+0xF5 0x0E55 # THAI DIGIT FIVE
+0xF6 0x0E56 # THAI DIGIT SIX
+0xF7 0x0E57 # THAI DIGIT SEVEN
+0xF8 0x0E58 # THAI DIGIT EIGHT
+0xF9 0x0E59 # THAI DIGIT NINE
+0xFA 0x0E5A # THAI CHARACTER ANGKHANKHU
+0xFB 0x0E5B # THAI CHARACTER KHOMUT
diff --git a/ext/mbstring/tests/data/8859-13.txt b/ext/mbstring/tests/data/8859-13.txt
new file mode 100644
index 0000000000..b613dc00e1
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-13.txt
@@ -0,0 +1,291 @@
+# 8859-13.TXT
+# Date: 2015-12-02 22:03:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-13:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-13:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-13 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-13 order.
+#
+# Version history
+# 1.0 version: created
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x201D # RIGHT DOUBLE QUOTATION MARK
+0xA2 0x00A2 # CENT SIGN
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x201E # DOUBLE LOW-9 QUOTATION MARK
+0xA6 0x00A6 # BROKEN BAR
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x00C6 # LATIN CAPITAL LETTER AE
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x201C # LEFT DOUBLE QUOTATION MARK
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xB9 0x00B9 # SUPERSCRIPT ONE
+0xBA 0x0157 # LATIN SMALL LETTER R WITH CEDILLA
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC # VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS
+0xBF 0x00E6 # LATIN SMALL LETTER AE
+0xC0 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xC1 0x012E # LATIN CAPITAL LETTER I WITH OGONEK
+0xC2 0x0100 # LATIN CAPITAL LETTER A WITH MACRON
+0xC3 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xC7 0x0112 # LATIN CAPITAL LETTER E WITH MACRON
+0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+0xCB 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCC 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+0xCD 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+0xCE 0x012A # LATIN CAPITAL LETTER I WITH MACRON
+0xCF 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA
+0xD0 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x014C # LATIN CAPITAL LETTER O WITH MACRON
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK
+0xD9 0x0141 # LATIN CAPITAL LETTER L WITH STROKE
+0xDA 0x015A # LATIN CAPITAL LETTER S WITH ACUTE
+0xDB 0x016A # LATIN CAPITAL LETTER U WITH MACRON
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xDE 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German)
+0xE0 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0xE1 0x012F # LATIN SMALL LETTER I WITH OGONEK
+0xE2 0x0101 # LATIN SMALL LETTER A WITH MACRON
+0xE3 0x0107 # LATIN SMALL LETTER C WITH ACUTE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0xE7 0x0113 # LATIN SMALL LETTER E WITH MACRON
+0xE8 0x010D # LATIN SMALL LETTER C WITH CARON
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x017A # LATIN SMALL LETTER Z WITH ACUTE
+0xEB 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+0xEC 0x0123 # LATIN SMALL LETTER G WITH CEDILLA
+0xED 0x0137 # LATIN SMALL LETTER K WITH CEDILLA
+0xEE 0x012B # LATIN SMALL LETTER I WITH MACRON
+0xEF 0x013C # LATIN SMALL LETTER L WITH CEDILLA
+0xF0 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE
+0xF2 0x0146 # LATIN SMALL LETTER N WITH CEDILLA
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x014D # LATIN SMALL LETTER O WITH MACRON
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x0173 # LATIN SMALL LETTER U WITH OGONEK
+0xF9 0x0142 # LATIN SMALL LETTER L WITH STROKE
+0xFA 0x015B # LATIN SMALL LETTER S WITH ACUTE
+0xFB 0x016B # LATIN SMALL LETTER U WITH MACRON
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xFE 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xFF 0x2019 # RIGHT SINGLE QUOTATION MARK
diff --git a/ext/mbstring/tests/data/8859-14.txt b/ext/mbstring/tests/data/8859-14.txt
new file mode 100644
index 0000000000..3c3a02466b
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-14.txt
@@ -0,0 +1,292 @@
+# 8859-14.TXT
+# Date: 2015-12-02 22:05:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-14:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
+# Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-14:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-14 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-14 order.
+#
+# Version history
+# 1.0 version: created
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE
+0xA2 0x1E03 # LATIN SMALL LETTER B WITH DOT ABOVE
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+0xA5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE
+0xA6 0x1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x1E80 # LATIN CAPITAL LETTER W WITH GRAVE
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x1E82 # LATIN CAPITAL LETTER W WITH ACUTE
+0xAB 0x1E0B # LATIN SMALL LETTER D WITH DOT ABOVE
+0xAC 0x1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xB0 0x1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE
+0xB1 0x1E1F # LATIN SMALL LETTER F WITH DOT ABOVE
+0xB2 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0xB3 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+0xB4 0x1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE
+0xB5 0x1E41 # LATIN SMALL LETTER M WITH DOT ABOVE
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE
+0xB8 0x1E81 # LATIN SMALL LETTER W WITH GRAVE
+0xB9 0x1E57 # LATIN SMALL LETTER P WITH DOT ABOVE
+0xBA 0x1E83 # LATIN SMALL LETTER W WITH ACUTE
+0xBB 0x1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE
+0xBC 0x1EF3 # LATIN SMALL LETTER Y WITH GRAVE
+0xBD 0x1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS
+0xBE 0x1E85 # LATIN SMALL LETTER W WITH DIAERESIS
+0xBF 0x1E61 # LATIN SMALL LETTER S WITH DOT ABOVE
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX
+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x1E6B # LATIN SMALL LETTER T WITH DOT ABOVE
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/8859-15.txt b/ext/mbstring/tests/data/8859-15.txt
new file mode 100644
index 0000000000..f21a763600
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-15.txt
@@ -0,0 +1,294 @@
+# 8859-15.TXT
+# Date: 2015-12-02 22:06:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-15:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
+# Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-15:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-15 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-15 order.
+#
+# Version history
+#
+# Version history
+# 1.0 version: created
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x00A1 # INVERTED EXCLAMATION MARK
+0xA2 0x00A2 # CENT SIGN
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x20AC # EURO SIGN
+0xA5 0x00A5 # YEN SIGN
+0xA6 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x00AA # FEMININE ORDINAL INDICATOR
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x00AF # MACRON
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xB9 0x00B9 # SUPERSCRIPT ONE
+0xBA 0x00BA # MASCULINE ORDINAL INDICATOR
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x0152 # LATIN CAPITAL LIGATURE OE
+0xBD 0x0153 # LATIN SMALL LIGATURE OE
+0xBE 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xBF 0x00BF # INVERTED QUESTION MARK
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x00D0 # LATIN CAPITAL LETTER ETH
+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x00DE # LATIN CAPITAL LETTER THORN
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x00F0 # LATIN SMALL LETTER ETH
+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x00FE # LATIN SMALL LETTER THORN
+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/8859-16.txt b/ext/mbstring/tests/data/8859-16.txt
new file mode 100644
index 0000000000..4a05225a78
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-16.txt
@@ -0,0 +1,293 @@
+# 8859-16.TXT
+# Date: 2015-12-02 22:08:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-16:2001 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 2001 July 26 (header updated: 2015 December 02)
+# Authors: Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
+#
+# Copyright (c) 1999-2001 Unicode, Inc. All Rights reserved.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-16:2001 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-16 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-16 order.
+#
+# Version history
+# 1.0 version: created
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE
+0xA4 0x20AC # EURO SIGN
+0xA5 0x201E # DOUBLE LOW-9 QUOTATION MARK
+0xA6 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x0218 # LATIN CAPITAL LETTER S WITH COMMA BELOW
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x017A # LATIN SMALL LETTER Z WITH ACUTE
+0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE
+0xB4 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xB5 0x201D # RIGHT DOUBLE QUOTATION MARK
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xB9 0x010D # LATIN SMALL LETTER C WITH CARON
+0xBA 0x0219 # LATIN SMALL LETTER S WITH COMMA BELOW
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x0152 # LATIN CAPITAL LIGATURE OE
+0xBD 0x0153 # LATIN SMALL LIGATURE OE
+0xBE 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x015A # LATIN CAPITAL LETTER S WITH ACUTE
+0xD8 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xDE 0x021A # LATIN CAPITAL LETTER T WITH COMMA BELOW
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x0107 # LATIN SMALL LETTER C WITH ACUTE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE
+0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x015B # LATIN SMALL LETTER S WITH ACUTE
+0xF8 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0xFE 0x021B # LATIN SMALL LETTER T WITH COMMA BELOW
+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/8859-2.txt b/ext/mbstring/tests/data/8859-2.txt
new file mode 100644
index 0000000000..20da9ba993
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-2.txt
@@ -0,0 +1,292 @@
+# 8859-2.TXT
+# Date: 2015-12-02 21:34:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO 8859-2:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-2:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-2 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 0x02D8 # BREVE
+0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x013D # LATIN CAPITAL LETTER L WITH CARON
+0xA6 0x015A # LATIN CAPITAL LETTER S WITH ACUTE
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA
+0xAB 0x0164 # LATIN CAPITAL LETTER T WITH CARON
+0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0xB2 0x02DB # OGONEK
+0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x013E # LATIN SMALL LETTER L WITH CARON
+0xB6 0x015B # LATIN SMALL LETTER S WITH ACUTE
+0xB7 0x02C7 # CARON
+0xB8 0x00B8 # CEDILLA
+0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA
+0xBB 0x0165 # LATIN SMALL LETTER T WITH CARON
+0xBC 0x017A # LATIN SMALL LETTER Z WITH ACUTE
+0xBD 0x02DD # DOUBLE ACUTE ACCENT
+0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0 0x0154 # LATIN CAPITAL LETTER R WITH ACUTE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x0139 # LATIN CAPITAL LETTER L WITH ACUTE
+0xC6 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x011A # LATIN CAPITAL LETTER E WITH CARON
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x010E # LATIN CAPITAL LETTER D WITH CARON
+0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 0x0147 # LATIN CAPITAL LETTER N WITH CARON
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x0158 # LATIN CAPITAL LETTER R WITH CARON
+0xD9 0x016E # LATIN CAPITAL LETTER U WITH RING ABOVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x0155 # LATIN SMALL LETTER R WITH ACUTE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x013A # LATIN SMALL LETTER L WITH ACUTE
+0xE6 0x0107 # LATIN SMALL LETTER C WITH ACUTE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x010D # LATIN SMALL LETTER C WITH CARON
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x011B # LATIN SMALL LETTER E WITH CARON
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x010F # LATIN SMALL LETTER D WITH CARON
+0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE
+0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE
+0xF2 0x0148 # LATIN SMALL LETTER N WITH CARON
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x0159 # LATIN SMALL LETTER R WITH CARON
+0xF9 0x016F # LATIN SMALL LETTER U WITH RING ABOVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x0163 # LATIN SMALL LETTER T WITH CEDILLA
+0xFF 0x02D9 # DOT ABOVE
diff --git a/ext/mbstring/tests/data/8859-3.txt b/ext/mbstring/tests/data/8859-3.txt
new file mode 100644
index 0000000000..5a6c5de547
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-3.txt
@@ -0,0 +1,285 @@
+# 8859-3.TXT
+# Date: 2015-12-02 21:39:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-3:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-3:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-3 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-3 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0126 # LATIN CAPITAL LETTER H WITH STROKE
+0xA2 0x02D8 # BREVE
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x00A4 # CURRENCY SIGN
+0xA6 0x0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA
+0xAB 0x011E # LATIN CAPITAL LETTER G WITH BREVE
+0xAC 0x0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0xAD 0x00AD # SOFT HYPHEN
+0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x0127 # LATIN SMALL LETTER H WITH STROKE
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x00B8 # CEDILLA
+0xB9 0x0131 # LATIN SMALL LETTER DOTLESS I
+0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA
+0xBB 0x011F # LATIN SMALL LETTER G WITH BREVE
+0xBC 0x0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+0xC6 0x0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x016C # LATIN CAPITAL LETTER U WITH BREVE
+0xDE 0x015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE
+0xE6 0x0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x011D # LATIN SMALL LETTER G WITH CIRCUMFLEX
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x016D # LATIN SMALL LETTER U WITH BREVE
+0xFE 0x015D # LATIN SMALL LETTER S WITH CIRCUMFLEX
+0xFF 0x02D9 # DOT ABOVE
diff --git a/ext/mbstring/tests/data/8859-4.txt b/ext/mbstring/tests/data/8859-4.txt
new file mode 100644
index 0000000000..e2f5e725fd
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-4.txt
@@ -0,0 +1,292 @@
+# 8859-4.TXT
+# Date: 2015-12-02 21:41:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-4:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-4:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-4 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-4 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 0x0138 # LATIN SMALL LETTER KRA
+0xA3 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE
+0xA6 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xAA 0x0112 # LATIN CAPITAL LETTER E WITH MACRON
+0xAB 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+0xAC 0x0166 # LATIN CAPITAL LETTER T WITH STROKE
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xAF 0x00AF # MACRON
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0xB2 0x02DB # OGONEK
+0xB3 0x0157 # LATIN SMALL LETTER R WITH CEDILLA
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE
+0xB6 0x013C # LATIN SMALL LETTER L WITH CEDILLA
+0xB7 0x02C7 # CARON
+0xB8 0x00B8 # CEDILLA
+0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xBA 0x0113 # LATIN SMALL LETTER E WITH MACRON
+0xBB 0x0123 # LATIN SMALL LETTER G WITH CEDILLA
+0xBC 0x0167 # LATIN SMALL LETTER T WITH STROKE
+0xBD 0x014A # LATIN CAPITAL LETTER ENG
+0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xBF 0x014B # LATIN SMALL LETTER ENG
+0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK
+0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x012A # LATIN CAPITAL LETTER I WITH MACRON
+0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON
+0xD3 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x0168 # LATIN CAPITAL LETTER U WITH TILDE
+0xDE 0x016A # LATIN CAPITAL LETTER U WITH MACRON
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK
+0xE8 0x010D # LATIN SMALL LETTER C WITH CARON
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x012B # LATIN SMALL LETTER I WITH MACRON
+0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE
+0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA
+0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON
+0xF3 0x0137 # LATIN SMALL LETTER K WITH CEDILLA
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x0169 # LATIN SMALL LETTER U WITH TILDE
+0xFE 0x016B # LATIN SMALL LETTER U WITH MACRON
+0xFF 0x02D9 # DOT ABOVE
diff --git a/ext/mbstring/tests/data/8859-5.txt b/ext/mbstring/tests/data/8859-5.txt
new file mode 100644
index 0000000000..a574c3feaf
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-5.txt
@@ -0,0 +1,292 @@
+# 8859-5.TXT
+# Date: 2015-12-02 21:43:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO 8859-5:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-5:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-5 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-5 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0401 # CYRILLIC CAPITAL LETTER IO
+0xA2 0x0402 # CYRILLIC CAPITAL LETTER DJE
+0xA3 0x0403 # CYRILLIC CAPITAL LETTER GJE
+0xA4 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xA5 0x0405 # CYRILLIC CAPITAL LETTER DZE
+0xA6 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xA7 0x0407 # CYRILLIC CAPITAL LETTER YI
+0xA8 0x0408 # CYRILLIC CAPITAL LETTER JE
+0xA9 0x0409 # CYRILLIC CAPITAL LETTER LJE
+0xAA 0x040A # CYRILLIC CAPITAL LETTER NJE
+0xAB 0x040B # CYRILLIC CAPITAL LETTER TSHE
+0xAC 0x040C # CYRILLIC CAPITAL LETTER KJE
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x040E # CYRILLIC CAPITAL LETTER SHORT U
+0xAF 0x040F # CYRILLIC CAPITAL LETTER DZHE
+0xB0 0x0410 # CYRILLIC CAPITAL LETTER A
+0xB1 0x0411 # CYRILLIC CAPITAL LETTER BE
+0xB2 0x0412 # CYRILLIC CAPITAL LETTER VE
+0xB3 0x0413 # CYRILLIC CAPITAL LETTER GHE
+0xB4 0x0414 # CYRILLIC CAPITAL LETTER DE
+0xB5 0x0415 # CYRILLIC CAPITAL LETTER IE
+0xB6 0x0416 # CYRILLIC CAPITAL LETTER ZHE
+0xB7 0x0417 # CYRILLIC CAPITAL LETTER ZE
+0xB8 0x0418 # CYRILLIC CAPITAL LETTER I
+0xB9 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
+0xBA 0x041A # CYRILLIC CAPITAL LETTER KA
+0xBB 0x041B # CYRILLIC CAPITAL LETTER EL
+0xBC 0x041C # CYRILLIC CAPITAL LETTER EM
+0xBD 0x041D # CYRILLIC CAPITAL LETTER EN
+0xBE 0x041E # CYRILLIC CAPITAL LETTER O
+0xBF 0x041F # CYRILLIC CAPITAL LETTER PE
+0xC0 0x0420 # CYRILLIC CAPITAL LETTER ER
+0xC1 0x0421 # CYRILLIC CAPITAL LETTER ES
+0xC2 0x0422 # CYRILLIC CAPITAL LETTER TE
+0xC3 0x0423 # CYRILLIC CAPITAL LETTER U
+0xC4 0x0424 # CYRILLIC CAPITAL LETTER EF
+0xC5 0x0425 # CYRILLIC CAPITAL LETTER HA
+0xC6 0x0426 # CYRILLIC CAPITAL LETTER TSE
+0xC7 0x0427 # CYRILLIC CAPITAL LETTER CHE
+0xC8 0x0428 # CYRILLIC CAPITAL LETTER SHA
+0xC9 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
+0xCA 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0xCB 0x042B # CYRILLIC CAPITAL LETTER YERU
+0xCC 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0xCD 0x042D # CYRILLIC CAPITAL LETTER E
+0xCE 0x042E # CYRILLIC CAPITAL LETTER YU
+0xCF 0x042F # CYRILLIC CAPITAL LETTER YA
+0xD0 0x0430 # CYRILLIC SMALL LETTER A
+0xD1 0x0431 # CYRILLIC SMALL LETTER BE
+0xD2 0x0432 # CYRILLIC SMALL LETTER VE
+0xD3 0x0433 # CYRILLIC SMALL LETTER GHE
+0xD4 0x0434 # CYRILLIC SMALL LETTER DE
+0xD5 0x0435 # CYRILLIC SMALL LETTER IE
+0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE
+0xD7 0x0437 # CYRILLIC SMALL LETTER ZE
+0xD8 0x0438 # CYRILLIC SMALL LETTER I
+0xD9 0x0439 # CYRILLIC SMALL LETTER SHORT I
+0xDA 0x043A # CYRILLIC SMALL LETTER KA
+0xDB 0x043B # CYRILLIC SMALL LETTER EL
+0xDC 0x043C # CYRILLIC SMALL LETTER EM
+0xDD 0x043D # CYRILLIC SMALL LETTER EN
+0xDE 0x043E # CYRILLIC SMALL LETTER O
+0xDF 0x043F # CYRILLIC SMALL LETTER PE
+0xE0 0x0440 # CYRILLIC SMALL LETTER ER
+0xE1 0x0441 # CYRILLIC SMALL LETTER ES
+0xE2 0x0442 # CYRILLIC SMALL LETTER TE
+0xE3 0x0443 # CYRILLIC SMALL LETTER U
+0xE4 0x0444 # CYRILLIC SMALL LETTER EF
+0xE5 0x0445 # CYRILLIC SMALL LETTER HA
+0xE6 0x0446 # CYRILLIC SMALL LETTER TSE
+0xE7 0x0447 # CYRILLIC SMALL LETTER CHE
+0xE8 0x0448 # CYRILLIC SMALL LETTER SHA
+0xE9 0x0449 # CYRILLIC SMALL LETTER SHCHA
+0xEA 0x044A # CYRILLIC SMALL LETTER HARD SIGN
+0xEB 0x044B # CYRILLIC SMALL LETTER YERU
+0xEC 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
+0xED 0x044D # CYRILLIC SMALL LETTER E
+0xEE 0x044E # CYRILLIC SMALL LETTER YU
+0xEF 0x044F # CYRILLIC SMALL LETTER YA
+0xF0 0x2116 # NUMERO SIGN
+0xF1 0x0451 # CYRILLIC SMALL LETTER IO
+0xF2 0x0452 # CYRILLIC SMALL LETTER DJE
+0xF3 0x0453 # CYRILLIC SMALL LETTER GJE
+0xF4 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE
+0xF5 0x0455 # CYRILLIC SMALL LETTER DZE
+0xF6 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xF7 0x0457 # CYRILLIC SMALL LETTER YI
+0xF8 0x0458 # CYRILLIC SMALL LETTER JE
+0xF9 0x0459 # CYRILLIC SMALL LETTER LJE
+0xFA 0x045A # CYRILLIC SMALL LETTER NJE
+0xFB 0x045B # CYRILLIC SMALL LETTER TSHE
+0xFC 0x045C # CYRILLIC SMALL LETTER KJE
+0xFD 0x00A7 # SECTION SIGN
+0xFE 0x045E # CYRILLIC SMALL LETTER SHORT U
+0xFF 0x045F # CYRILLIC SMALL LETTER DZHE
diff --git a/ext/mbstring/tests/data/8859-6.txt b/ext/mbstring/tests/data/8859-6.txt
new file mode 100644
index 0000000000..fed0af3631
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-6.txt
@@ -0,0 +1,249 @@
+# 8859-6.TXT
+# Date: 2015-12-02 21:44:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO 8859-6:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-6:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-6 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-6 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 0x30..0x39 remapped to the ASCII digits (U+0030..U+0039) instead
+# of the Arabic digits (U+0660..U+0669).
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA4 0x00A4 # CURRENCY SIGN
+0xAC 0x060C # ARABIC COMMA
+0xAD 0x00AD # SOFT HYPHEN
+0xBB 0x061B # ARABIC SEMICOLON
+0xBF 0x061F # ARABIC QUESTION MARK
+0xC1 0x0621 # ARABIC LETTER HAMZA
+0xC2 0x0622 # ARABIC LETTER ALEF WITH MADDA ABOVE
+0xC3 0x0623 # ARABIC LETTER ALEF WITH HAMZA ABOVE
+0xC4 0x0624 # ARABIC LETTER WAW WITH HAMZA ABOVE
+0xC5 0x0625 # ARABIC LETTER ALEF WITH HAMZA BELOW
+0xC6 0x0626 # ARABIC LETTER YEH WITH HAMZA ABOVE
+0xC7 0x0627 # ARABIC LETTER ALEF
+0xC8 0x0628 # ARABIC LETTER BEH
+0xC9 0x0629 # ARABIC LETTER TEH MARBUTA
+0xCA 0x062A # ARABIC LETTER TEH
+0xCB 0x062B # ARABIC LETTER THEH
+0xCC 0x062C # ARABIC LETTER JEEM
+0xCD 0x062D # ARABIC LETTER HAH
+0xCE 0x062E # ARABIC LETTER KHAH
+0xCF 0x062F # ARABIC LETTER DAL
+0xD0 0x0630 # ARABIC LETTER THAL
+0xD1 0x0631 # ARABIC LETTER REH
+0xD2 0x0632 # ARABIC LETTER ZAIN
+0xD3 0x0633 # ARABIC LETTER SEEN
+0xD4 0x0634 # ARABIC LETTER SHEEN
+0xD5 0x0635 # ARABIC LETTER SAD
+0xD6 0x0636 # ARABIC LETTER DAD
+0xD7 0x0637 # ARABIC LETTER TAH
+0xD8 0x0638 # ARABIC LETTER ZAH
+0xD9 0x0639 # ARABIC LETTER AIN
+0xDA 0x063A # ARABIC LETTER GHAIN
+0xE0 0x0640 # ARABIC TATWEEL
+0xE1 0x0641 # ARABIC LETTER FEH
+0xE2 0x0642 # ARABIC LETTER QAF
+0xE3 0x0643 # ARABIC LETTER KAF
+0xE4 0x0644 # ARABIC LETTER LAM
+0xE5 0x0645 # ARABIC LETTER MEEM
+0xE6 0x0646 # ARABIC LETTER NOON
+0xE7 0x0647 # ARABIC LETTER HEH
+0xE8 0x0648 # ARABIC LETTER WAW
+0xE9 0x0649 # ARABIC LETTER ALEF MAKSURA
+0xEA 0x064A # ARABIC LETTER YEH
+0xEB 0x064B # ARABIC FATHATAN
+0xEC 0x064C # ARABIC DAMMATAN
+0xED 0x064D # ARABIC KASRATAN
+0xEE 0x064E # ARABIC FATHA
+0xEF 0x064F # ARABIC DAMMA
+0xF0 0x0650 # ARABIC KASRA
+0xF1 0x0651 # ARABIC SHADDA
+0xF2 0x0652 # ARABIC SUKUN
diff --git a/ext/mbstring/tests/data/8859-7.txt b/ext/mbstring/tests/data/8859-7.txt
new file mode 100644
index 0000000000..49131a4d94
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-7.txt
@@ -0,0 +1,299 @@
+# 8859-7.TXT
+# Date: 2015-12-02 21:47:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO 8859-7:2003 to Unicode
+# Unicode version: 4.0
+# Table version: 3.0
+# Table format: Format A
+# Date: 2003-Nov-12 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO 8859-7:2003 characters map into Unicode.
+#
+# ISO 8859-7:1987 is equivalent to ISO-IR-126, ELOT 928,
+# and ECMA 118. ISO 8859-7:2003 adds two currency signs
+# and one other character not in the earlier standard.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO 8859-7 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO 8859-7 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+# Remap 0xA1 to U+2018 (instead of 0x02BD) to match text of 8859-7
+# Remap 0xA2 to U+2019 (instead of 0x02BC) to match text of 8859-7
+#
+# 2.0 version updates 1.0 version by adding mappings for the
+# three newly added characters 0xA4, 0xA5, 0xAA.
+#
+# 3.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x2018 # LEFT SINGLE QUOTATION MARK
+0xA2 0x2019 # RIGHT SINGLE QUOTATION MARK
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x20AC # EURO SIGN
+0xA5 0x20AF # DRACHMA SIGN
+0xA6 0x00A6 # BROKEN BAR
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x037A # GREEK YPOGEGRAMMENI
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAF 0x2015 # HORIZONTAL BAR
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x0384 # GREEK TONOS
+0xB5 0x0385 # GREEK DIALYTIKA TONOS
+0xB6 0x0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0xB9 0x0389 # GREEK CAPITAL LETTER ETA WITH TONOS
+0xBA 0x038A # GREEK CAPITAL LETTER IOTA WITH TONOS
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x038C # GREEK CAPITAL LETTER OMICRON WITH TONOS
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBE 0x038E # GREEK CAPITAL LETTER UPSILON WITH TONOS
+0xBF 0x038F # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0xC0 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0xC1 0x0391 # GREEK CAPITAL LETTER ALPHA
+0xC2 0x0392 # GREEK CAPITAL LETTER BETA
+0xC3 0x0393 # GREEK CAPITAL LETTER GAMMA
+0xC4 0x0394 # GREEK CAPITAL LETTER DELTA
+0xC5 0x0395 # GREEK CAPITAL LETTER EPSILON
+0xC6 0x0396 # GREEK CAPITAL LETTER ZETA
+0xC7 0x0397 # GREEK CAPITAL LETTER ETA
+0xC8 0x0398 # GREEK CAPITAL LETTER THETA
+0xC9 0x0399 # GREEK CAPITAL LETTER IOTA
+0xCA 0x039A # GREEK CAPITAL LETTER KAPPA
+0xCB 0x039B # GREEK CAPITAL LETTER LAMDA
+0xCC 0x039C # GREEK CAPITAL LETTER MU
+0xCD 0x039D # GREEK CAPITAL LETTER NU
+0xCE 0x039E # GREEK CAPITAL LETTER XI
+0xCF 0x039F # GREEK CAPITAL LETTER OMICRON
+0xD0 0x03A0 # GREEK CAPITAL LETTER PI
+0xD1 0x03A1 # GREEK CAPITAL LETTER RHO
+0xD3 0x03A3 # GREEK CAPITAL LETTER SIGMA
+0xD4 0x03A4 # GREEK CAPITAL LETTER TAU
+0xD5 0x03A5 # GREEK CAPITAL LETTER UPSILON
+0xD6 0x03A6 # GREEK CAPITAL LETTER PHI
+0xD7 0x03A7 # GREEK CAPITAL LETTER CHI
+0xD8 0x03A8 # GREEK CAPITAL LETTER PSI
+0xD9 0x03A9 # GREEK CAPITAL LETTER OMEGA
+0xDA 0x03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0xDB 0x03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0xDC 0x03AC # GREEK SMALL LETTER ALPHA WITH TONOS
+0xDD 0x03AD # GREEK SMALL LETTER EPSILON WITH TONOS
+0xDE 0x03AE # GREEK SMALL LETTER ETA WITH TONOS
+0xDF 0x03AF # GREEK SMALL LETTER IOTA WITH TONOS
+0xE0 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+0xE1 0x03B1 # GREEK SMALL LETTER ALPHA
+0xE2 0x03B2 # GREEK SMALL LETTER BETA
+0xE3 0x03B3 # GREEK SMALL LETTER GAMMA
+0xE4 0x03B4 # GREEK SMALL LETTER DELTA
+0xE5 0x03B5 # GREEK SMALL LETTER EPSILON
+0xE6 0x03B6 # GREEK SMALL LETTER ZETA
+0xE7 0x03B7 # GREEK SMALL LETTER ETA
+0xE8 0x03B8 # GREEK SMALL LETTER THETA
+0xE9 0x03B9 # GREEK SMALL LETTER IOTA
+0xEA 0x03BA # GREEK SMALL LETTER KAPPA
+0xEB 0x03BB # GREEK SMALL LETTER LAMDA
+0xEC 0x03BC # GREEK SMALL LETTER MU
+0xED 0x03BD # GREEK SMALL LETTER NU
+0xEE 0x03BE # GREEK SMALL LETTER XI
+0xEF 0x03BF # GREEK SMALL LETTER OMICRON
+0xF0 0x03C0 # GREEK SMALL LETTER PI
+0xF1 0x03C1 # GREEK SMALL LETTER RHO
+0xF2 0x03C2 # GREEK SMALL LETTER FINAL SIGMA
+0xF3 0x03C3 # GREEK SMALL LETTER SIGMA
+0xF4 0x03C4 # GREEK SMALL LETTER TAU
+0xF5 0x03C5 # GREEK SMALL LETTER UPSILON
+0xF6 0x03C6 # GREEK SMALL LETTER PHI
+0xF7 0x03C7 # GREEK SMALL LETTER CHI
+0xF8 0x03C8 # GREEK SMALL LETTER PSI
+0xF9 0x03C9 # GREEK SMALL LETTER OMEGA
+0xFA 0x03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0xFB 0x03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0xFC 0x03CC # GREEK SMALL LETTER OMICRON WITH TONOS
+0xFD 0x03CD # GREEK SMALL LETTER UPSILON WITH TONOS
+0xFE 0x03CE # GREEK SMALL LETTER OMEGA WITH TONOS
diff --git a/ext/mbstring/tests/data/8859-8.txt b/ext/mbstring/tests/data/8859-8.txt
new file mode 100644
index 0000000000..ff068f7083
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-8.txt
@@ -0,0 +1,258 @@
+# 8859-8.TXT
+# Date: 2015-12-02 21:50:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-8:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 2000-Jan-03 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-8:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-8 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-8 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+# 1.1 version updates to the published 8859-8:1999, correcting
+# the mapping of 0xAF and adding mappings for LRM and RLM.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA2 0x00A2 # CENT SIGN
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x00A5 # YEN SIGN
+0xA6 0x00A6 # BROKEN BAR
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x00D7 # MULTIPLICATION SIGN
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x00AF # MACRON
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x00B8 # CEDILLA
+0xB9 0x00B9 # SUPERSCRIPT ONE
+0xBA 0x00F7 # DIVISION SIGN
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC # VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS
+0xDF 0x2017 # DOUBLE LOW LINE
+0xE0 0x05D0 # HEBREW LETTER ALEF
+0xE1 0x05D1 # HEBREW LETTER BET
+0xE2 0x05D2 # HEBREW LETTER GIMEL
+0xE3 0x05D3 # HEBREW LETTER DALET
+0xE4 0x05D4 # HEBREW LETTER HE
+0xE5 0x05D5 # HEBREW LETTER VAV
+0xE6 0x05D6 # HEBREW LETTER ZAYIN
+0xE7 0x05D7 # HEBREW LETTER HET
+0xE8 0x05D8 # HEBREW LETTER TET
+0xE9 0x05D9 # HEBREW LETTER YOD
+0xEA 0x05DA # HEBREW LETTER FINAL KAF
+0xEB 0x05DB # HEBREW LETTER KAF
+0xEC 0x05DC # HEBREW LETTER LAMED
+0xED 0x05DD # HEBREW LETTER FINAL MEM
+0xEE 0x05DE # HEBREW LETTER MEM
+0xEF 0x05DF # HEBREW LETTER FINAL NUN
+0xF0 0x05E0 # HEBREW LETTER NUN
+0xF1 0x05E1 # HEBREW LETTER SAMEKH
+0xF2 0x05E2 # HEBREW LETTER AYIN
+0xF3 0x05E3 # HEBREW LETTER FINAL PE
+0xF4 0x05E4 # HEBREW LETTER PE
+0xF5 0x05E5 # HEBREW LETTER FINAL TSADI
+0xF6 0x05E6 # HEBREW LETTER TSADI
+0xF7 0x05E7 # HEBREW LETTER QOF
+0xF8 0x05E8 # HEBREW LETTER RESH
+0xF9 0x05E9 # HEBREW LETTER SHIN
+0xFA 0x05EA # HEBREW LETTER TAV
+0xFD 0x200E # LEFT-TO-RIGHT MARK
+0xFE 0x200F # RIGHT-TO-LEFT MARK
diff --git a/ext/mbstring/tests/data/8859-9.txt b/ext/mbstring/tests/data/8859-9.txt
new file mode 100644
index 0000000000..d0c9ff94e4
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-9.txt
@@ -0,0 +1,294 @@
+# 8859-9.TXT
+# Date: 2015-12-02 21:51:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-9:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-9:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-9 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-9 order.
+#
+# ISO/IEC 8859-9 is also equivalent to ISO-IR-148.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x00A1 # INVERTED EXCLAMATION MARK
+0xA2 0x00A2 # CENT SIGN
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x00A5 # YEN SIGN
+0xA6 0x00A6 # BROKEN BAR
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x00AA # FEMININE ORDINAL INDICATOR
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x00AF # MACRON
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x00B8 # CEDILLA
+0xB9 0x00B9 # SUPERSCRIPT ONE
+0xBA 0x00BA # MASCULINE ORDINAL INDICATOR
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC # VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS
+0xBF 0x00BF # INVERTED QUESTION MARK
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x011E # LATIN CAPITAL LETTER G WITH BREVE
+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0xDE 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x011F # LATIN SMALL LETTER G WITH BREVE
+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x0131 # LATIN SMALL LETTER DOTLESS I
+0xFE 0x015F # LATIN SMALL LETTER S WITH CEDILLA
+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/ARMSCII-8.txt b/ext/mbstring/tests/data/ARMSCII-8.txt
new file mode 100644
index 0000000000..1854fddc13
--- /dev/null
+++ b/ext/mbstring/tests/data/ARMSCII-8.txt
@@ -0,0 +1,255 @@
+# Derived from armscii-8(7) man page
+0x0 0x0
+0x1 0x1
+0x2 0x2
+0x3 0x3
+0x4 0x4
+0x5 0x5
+0x6 0x6
+0x7 0x7
+0x8 0x8
+0x9 0x9
+0xA 0xA
+0xB 0xB
+0xC 0xC
+0xD 0xD
+0xE 0xE
+0xF 0xF
+0x10 0x10
+0x11 0x11
+0x12 0x12
+0x13 0x13
+0x14 0x14
+0x15 0x15
+0x16 0x16
+0x17 0x17
+0x18 0x18
+0x19 0x19
+0x1A 0x1A
+0x1B 0x1B
+0x1C 0x1C
+0x1D 0x1D
+0x1E 0x1E
+0x1F 0x1F
+0x20 0x20
+0x21 0x21
+0x22 0x22
+0x23 0x23
+0x24 0x24
+0x25 0x25
+0x26 0x26
+0x27 0x27
+0x28 0x28
+0x29 0x29
+0x2A 0x2A
+0x2B 0x2B
+0x2C 0x2C
+0x2D 0x2D
+0x2E 0x2E
+0x2F 0x2F
+0x30 0x30
+0x31 0x31
+0x32 0x32
+0x33 0x33
+0x34 0x34
+0x35 0x35
+0x36 0x36
+0x37 0x37
+0x38 0x38
+0x39 0x39
+0x3A 0x3A
+0x3B 0x3B
+0x3C 0x3C
+0x3D 0x3D
+0x3E 0x3E
+0x3F 0x3F
+0x40 0x40
+0x41 0x41
+0x42 0x42
+0x43 0x43
+0x44 0x44
+0x45 0x45
+0x46 0x46
+0x47 0x47
+0x48 0x48
+0x49 0x49
+0x4A 0x4A
+0x4B 0x4B
+0x4C 0x4C
+0x4D 0x4D
+0x4E 0x4E
+0x4F 0x4F
+0x50 0x50
+0x51 0x51
+0x52 0x52
+0x53 0x53
+0x54 0x54
+0x55 0x55
+0x56 0x56
+0x57 0x57
+0x58 0x58
+0x59 0x59
+0x5A 0x5A
+0x5B 0x5B
+0x5C 0x5C
+0x5D 0x5D
+0x5E 0x5E
+0x5F 0x5F
+0x60 0x60
+0x61 0x61
+0x62 0x62
+0x63 0x63
+0x64 0x64
+0x65 0x65
+0x66 0x66
+0x67 0x67
+0x68 0x68
+0x69 0x69
+0x6A 0x6A
+0x6B 0x6B
+0x6C 0x6C
+0x6D 0x6D
+0x6E 0x6E
+0x6F 0x6F
+0x70 0x70
+0x71 0x71
+0x72 0x72
+0x73 0x73
+0x74 0x74
+0x75 0x75
+0x76 0x76
+0x77 0x77
+0x78 0x78
+0x79 0x79
+0x7A 0x7A
+0x7B 0x7B
+0x7C 0x7C
+0x7D 0x7D
+0x7E 0x7E
+0x7F 0x7F
+0x80 0x80
+0x81 0x81
+0x82 0x82
+0x83 0x83
+0x84 0x84
+0x85 0x85
+0x86 0x86
+0x87 0x87
+0x88 0x88
+0x89 0x89
+0x8A 0x8A
+0x8B 0x8B
+0x8C 0x8C
+0x8D 0x8D
+0x8E 0x8E
+0x8F 0x8F
+0x90 0x90
+0x91 0x91
+0x92 0x92
+0x93 0x93
+0x94 0x94
+0x95 0x95
+0x96 0x96
+0x97 0x97
+0x98 0x98
+0x99 0x99
+0x9A 0x9A
+0x9B 0x9B
+0x9C 0x9C
+0x9D 0x9D
+0x9E 0x9E
+0x9F 0x9F
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA2 0x0587 # SMALL LIGATURE ECH YIWN
+0xA3 0x0589 # ARMENIAN FULL STOP
+0xA4 0x0029 # RIGHT PARENTHESIS
+0xA5 0x0028 # LEFT PARENTHESIS
+0xA6 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xA7 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xA8 0x2014 # EM DASH
+0xA9 0x002E # FULL STOP
+0xAA 0x055D # ARMENIAN COMMA
+0xAB 0x002C # COMMA
+0xAC 0x002D # HYPHEN-MINUS
+0xAD 0x058A # ARMENIAN HYPHEN
+0xAE 0x2026 # HORIZONTAL ELLIPSIS
+0xAF 0x055C # ARMENIAN EXCLAMATION MARK
+0xB0 0x055B # ARMENIAN EMPHASIS MARK
+0xB1 0x055E # ARMENIAN QUESTION MARK
+0xB2 0x0531
+0xB3 0x0561
+0xB4 0x0532
+0xB5 0x0562
+0xB6 0x0533
+0xB7 0x0563
+0xB8 0x0534
+0xB9 0x0564
+0xBA 0x0535
+0xBB 0x0565
+0xBC 0x0536
+0xBD 0x0566
+0xBE 0x0537
+0xBF 0x0567
+0xC0 0x0538
+0xC1 0x0568
+0xC2 0x0539
+0xC3 0x0569
+0xC4 0x053A
+0xC5 0x056A
+0xC6 0x053B
+0xC7 0x056B
+0xC8 0x053C
+0xC9 0x056C
+0xCA 0x053D
+0xCB 0x056D
+0xCC 0x053E
+0xCD 0x056E
+0xCE 0x053F
+0xCF 0x056F
+0xD0 0x0540
+0xD1 0x0570
+0xD2 0x0541
+0xD3 0x0571
+0xD4 0x0542
+0xD5 0x0572
+0xD6 0x0543
+0xD7 0x0573
+0xD8 0x0544
+0xD9 0x0574
+0xDA 0x0545
+0xDB 0x0575
+0xDC 0x0546
+0xDD 0x0576
+0xDE 0x0547
+0xDF 0x0577
+0xE0 0x0548
+0xE1 0x0578
+0xE2 0x0549
+0xE3 0x0579
+0xE4 0x054A
+0xE5 0x057A
+0xE6 0x054B
+0xE7 0x057B
+0xE8 0x054C
+0xE9 0x057C
+0xEA 0x054D
+0xEB 0x057D
+0xEC 0x054E
+0xED 0x057E
+0xEE 0x054F
+0xEF 0x057F
+0xF0 0x0550
+0xF1 0x0580
+0xF2 0x0551
+0xF3 0x0581
+0xF4 0x0552
+0xF5 0x0582
+0xF6 0x0553
+0xF7 0x0583
+0xF8 0x0554
+0xF9 0x0584
+0xFA 0x0555
+0xFB 0x0585
+0xFC 0x0556
+0xFD 0x0586
+0xFE 0x055A
diff --git a/ext/mbstring/tests/data/CP1251.txt b/ext/mbstring/tests/data/CP1251.txt
new file mode 100644
index 0000000000..4d9b3558ac
--- /dev/null
+++ b/ext/mbstring/tests/data/CP1251.txt
@@ -0,0 +1,274 @@
+#
+# Name: cp1251 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: Shawn.Steele@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1251 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1251 order
+#
+0x00 0x0000 #NULL
+0x01 0x0001 #START OF HEADING
+0x02 0x0002 #START OF TEXT
+0x03 0x0003 #END OF TEXT
+0x04 0x0004 #END OF TRANSMISSION
+0x05 0x0005 #ENQUIRY
+0x06 0x0006 #ACKNOWLEDGE
+0x07 0x0007 #BELL
+0x08 0x0008 #BACKSPACE
+0x09 0x0009 #HORIZONTAL TABULATION
+0x0A 0x000A #LINE FEED
+0x0B 0x000B #VERTICAL TABULATION
+0x0C 0x000C #FORM FEED
+0x0D 0x000D #CARRIAGE RETURN
+0x0E 0x000E #SHIFT OUT
+0x0F 0x000F #SHIFT IN
+0x10 0x0010 #DATA LINK ESCAPE
+0x11 0x0011 #DEVICE CONTROL ONE
+0x12 0x0012 #DEVICE CONTROL TWO
+0x13 0x0013 #DEVICE CONTROL THREE
+0x14 0x0014 #DEVICE CONTROL FOUR
+0x15 0x0015 #NEGATIVE ACKNOWLEDGE
+0x16 0x0016 #SYNCHRONOUS IDLE
+0x17 0x0017 #END OF TRANSMISSION BLOCK
+0x18 0x0018 #CANCEL
+0x19 0x0019 #END OF MEDIUM
+0x1A 0x001A #SUBSTITUTE
+0x1B 0x001B #ESCAPE
+0x1C 0x001C #FILE SEPARATOR
+0x1D 0x001D #GROUP SEPARATOR
+0x1E 0x001E #RECORD SEPARATOR
+0x1F 0x001F #UNIT SEPARATOR
+0x20 0x0020 #SPACE
+0x21 0x0021 #EXCLAMATION MARK
+0x22 0x0022 #QUOTATION MARK
+0x23 0x0023 #NUMBER SIGN
+0x24 0x0024 #DOLLAR SIGN
+0x25 0x0025 #PERCENT SIGN
+0x26 0x0026 #AMPERSAND
+0x27 0x0027 #APOSTROPHE
+0x28 0x0028 #LEFT PARENTHESIS
+0x29 0x0029 #RIGHT PARENTHESIS
+0x2A 0x002A #ASTERISK
+0x2B 0x002B #PLUS SIGN
+0x2C 0x002C #COMMA
+0x2D 0x002D #HYPHEN-MINUS
+0x2E 0x002E #FULL STOP
+0x2F 0x002F #SOLIDUS
+0x30 0x0030 #DIGIT ZERO
+0x31 0x0031 #DIGIT ONE
+0x32 0x0032 #DIGIT TWO
+0x33 0x0033 #DIGIT THREE
+0x34 0x0034 #DIGIT FOUR
+0x35 0x0035 #DIGIT FIVE
+0x36 0x0036 #DIGIT SIX
+0x37 0x0037 #DIGIT SEVEN
+0x38 0x0038 #DIGIT EIGHT
+0x39 0x0039 #DIGIT NINE
+0x3A 0x003A #COLON
+0x3B 0x003B #SEMICOLON
+0x3C 0x003C #LESS-THAN SIGN
+0x3D 0x003D #EQUALS SIGN
+0x3E 0x003E #GREATER-THAN SIGN
+0x3F 0x003F #QUESTION MARK
+0x40 0x0040 #COMMERCIAL AT
+0x41 0x0041 #LATIN CAPITAL LETTER A
+0x42 0x0042 #LATIN CAPITAL LETTER B
+0x43 0x0043 #LATIN CAPITAL LETTER C
+0x44 0x0044 #LATIN CAPITAL LETTER D
+0x45 0x0045 #LATIN CAPITAL LETTER E
+0x46 0x0046 #LATIN CAPITAL LETTER F
+0x47 0x0047 #LATIN CAPITAL LETTER G
+0x48 0x0048 #LATIN CAPITAL LETTER H
+0x49 0x0049 #LATIN CAPITAL LETTER I
+0x4A 0x004A #LATIN CAPITAL LETTER J
+0x4B 0x004B #LATIN CAPITAL LETTER K
+0x4C 0x004C #LATIN CAPITAL LETTER L
+0x4D 0x004D #LATIN CAPITAL LETTER M
+0x4E 0x004E #LATIN CAPITAL LETTER N
+0x4F 0x004F #LATIN CAPITAL LETTER O
+0x50 0x0050 #LATIN CAPITAL LETTER P
+0x51 0x0051 #LATIN CAPITAL LETTER Q
+0x52 0x0052 #LATIN CAPITAL LETTER R
+0x53 0x0053 #LATIN CAPITAL LETTER S
+0x54 0x0054 #LATIN CAPITAL LETTER T
+0x55 0x0055 #LATIN CAPITAL LETTER U
+0x56 0x0056 #LATIN CAPITAL LETTER V
+0x57 0x0057 #LATIN CAPITAL LETTER W
+0x58 0x0058 #LATIN CAPITAL LETTER X
+0x59 0x0059 #LATIN CAPITAL LETTER Y
+0x5A 0x005A #LATIN CAPITAL LETTER Z
+0x5B 0x005B #LEFT SQUARE BRACKET
+0x5C 0x005C #REVERSE SOLIDUS
+0x5D 0x005D #RIGHT SQUARE BRACKET
+0x5E 0x005E #CIRCUMFLEX ACCENT
+0x5F 0x005F #LOW LINE
+0x60 0x0060 #GRAVE ACCENT
+0x61 0x0061 #LATIN SMALL LETTER A
+0x62 0x0062 #LATIN SMALL LETTER B
+0x63 0x0063 #LATIN SMALL LETTER C
+0x64 0x0064 #LATIN SMALL LETTER D
+0x65 0x0065 #LATIN SMALL LETTER E
+0x66 0x0066 #LATIN SMALL LETTER F
+0x67 0x0067 #LATIN SMALL LETTER G
+0x68 0x0068 #LATIN SMALL LETTER H
+0x69 0x0069 #LATIN SMALL LETTER I
+0x6A 0x006A #LATIN SMALL LETTER J
+0x6B 0x006B #LATIN SMALL LETTER K
+0x6C 0x006C #LATIN SMALL LETTER L
+0x6D 0x006D #LATIN SMALL LETTER M
+0x6E 0x006E #LATIN SMALL LETTER N
+0x6F 0x006F #LATIN SMALL LETTER O
+0x70 0x0070 #LATIN SMALL LETTER P
+0x71 0x0071 #LATIN SMALL LETTER Q
+0x72 0x0072 #LATIN SMALL LETTER R
+0x73 0x0073 #LATIN SMALL LETTER S
+0x74 0x0074 #LATIN SMALL LETTER T
+0x75 0x0075 #LATIN SMALL LETTER U
+0x76 0x0076 #LATIN SMALL LETTER V
+0x77 0x0077 #LATIN SMALL LETTER W
+0x78 0x0078 #LATIN SMALL LETTER X
+0x79 0x0079 #LATIN SMALL LETTER Y
+0x7A 0x007A #LATIN SMALL LETTER Z
+0x7B 0x007B #LEFT CURLY BRACKET
+0x7C 0x007C #VERTICAL LINE
+0x7D 0x007D #RIGHT CURLY BRACKET
+0x7E 0x007E #TILDE
+0x7F 0x007F #DELETE
+0x80 0x0402 #CYRILLIC CAPITAL LETTER DJE
+0x81 0x0403 #CYRILLIC CAPITAL LETTER GJE
+0x82 0x201A #SINGLE LOW-9 QUOTATION MARK
+0x83 0x0453 #CYRILLIC SMALL LETTER GJE
+0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 0x2026 #HORIZONTAL ELLIPSIS
+0x86 0x2020 #DAGGER
+0x87 0x2021 #DOUBLE DAGGER
+0x88 0x20AC #EURO SIGN
+0x89 0x2030 #PER MILLE SIGN
+0x8A 0x0409 #CYRILLIC CAPITAL LETTER LJE
+0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C 0x040A #CYRILLIC CAPITAL LETTER NJE
+0x8D 0x040C #CYRILLIC CAPITAL LETTER KJE
+0x8E 0x040B #CYRILLIC CAPITAL LETTER TSHE
+0x8F 0x040F #CYRILLIC CAPITAL LETTER DZHE
+0x90 0x0452 #CYRILLIC SMALL LETTER DJE
+0x91 0x2018 #LEFT SINGLE QUOTATION MARK
+0x92 0x2019 #RIGHT SINGLE QUOTATION MARK
+0x93 0x201C #LEFT DOUBLE QUOTATION MARK
+0x94 0x201D #RIGHT DOUBLE QUOTATION MARK
+0x95 0x2022 #BULLET
+0x96 0x2013 #EN DASH
+0x97 0x2014 #EM DASH
+0x98 #UNDEFINED
+0x99 0x2122 #TRADE MARK SIGN
+0x9A 0x0459 #CYRILLIC SMALL LETTER LJE
+0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C 0x045A #CYRILLIC SMALL LETTER NJE
+0x9D 0x045C #CYRILLIC SMALL LETTER KJE
+0x9E 0x045B #CYRILLIC SMALL LETTER TSHE
+0x9F 0x045F #CYRILLIC SMALL LETTER DZHE
+0xA0 0x00A0 #NO-BREAK SPACE
+0xA1 0x040E #CYRILLIC CAPITAL LETTER SHORT U
+0xA2 0x045E #CYRILLIC SMALL LETTER SHORT U
+0xA3 0x0408 #CYRILLIC CAPITAL LETTER JE
+0xA4 0x00A4 #CURRENCY SIGN
+0xA5 0x0490 #CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0xA6 0x00A6 #BROKEN BAR
+0xA7 0x00A7 #SECTION SIGN
+0xA8 0x0401 #CYRILLIC CAPITAL LETTER IO
+0xA9 0x00A9 #COPYRIGHT SIGN
+0xAA 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC #NOT SIGN
+0xAD 0x00AD #SOFT HYPHEN
+0xAE 0x00AE #REGISTERED SIGN
+0xAF 0x0407 #CYRILLIC CAPITAL LETTER YI
+0xB0 0x00B0 #DEGREE SIGN
+0xB1 0x00B1 #PLUS-MINUS SIGN
+0xB2 0x0406 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xB3 0x0456 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xB4 0x0491 #CYRILLIC SMALL LETTER GHE WITH UPTURN
+0xB5 0x00B5 #MICRO SIGN
+0xB6 0x00B6 #PILCROW SIGN
+0xB7 0x00B7 #MIDDLE DOT
+0xB8 0x0451 #CYRILLIC SMALL LETTER IO
+0xB9 0x2116 #NUMERO SIGN
+0xBA 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE
+0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x0458 #CYRILLIC SMALL LETTER JE
+0xBD 0x0405 #CYRILLIC CAPITAL LETTER DZE
+0xBE 0x0455 #CYRILLIC SMALL LETTER DZE
+0xBF 0x0457 #CYRILLIC SMALL LETTER YI
+0xC0 0x0410 #CYRILLIC CAPITAL LETTER A
+0xC1 0x0411 #CYRILLIC CAPITAL LETTER BE
+0xC2 0x0412 #CYRILLIC CAPITAL LETTER VE
+0xC3 0x0413 #CYRILLIC CAPITAL LETTER GHE
+0xC4 0x0414 #CYRILLIC CAPITAL LETTER DE
+0xC5 0x0415 #CYRILLIC CAPITAL LETTER IE
+0xC6 0x0416 #CYRILLIC CAPITAL LETTER ZHE
+0xC7 0x0417 #CYRILLIC CAPITAL LETTER ZE
+0xC8 0x0418 #CYRILLIC CAPITAL LETTER I
+0xC9 0x0419 #CYRILLIC CAPITAL LETTER SHORT I
+0xCA 0x041A #CYRILLIC CAPITAL LETTER KA
+0xCB 0x041B #CYRILLIC CAPITAL LETTER EL
+0xCC 0x041C #CYRILLIC CAPITAL LETTER EM
+0xCD 0x041D #CYRILLIC CAPITAL LETTER EN
+0xCE 0x041E #CYRILLIC CAPITAL LETTER O
+0xCF 0x041F #CYRILLIC CAPITAL LETTER PE
+0xD0 0x0420 #CYRILLIC CAPITAL LETTER ER
+0xD1 0x0421 #CYRILLIC CAPITAL LETTER ES
+0xD2 0x0422 #CYRILLIC CAPITAL LETTER TE
+0xD3 0x0423 #CYRILLIC CAPITAL LETTER U
+0xD4 0x0424 #CYRILLIC CAPITAL LETTER EF
+0xD5 0x0425 #CYRILLIC CAPITAL LETTER HA
+0xD6 0x0426 #CYRILLIC CAPITAL LETTER TSE
+0xD7 0x0427 #CYRILLIC CAPITAL LETTER CHE
+0xD8 0x0428 #CYRILLIC CAPITAL LETTER SHA
+0xD9 0x0429 #CYRILLIC CAPITAL LETTER SHCHA
+0xDA 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN
+0xDB 0x042B #CYRILLIC CAPITAL LETTER YERU
+0xDC 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN
+0xDD 0x042D #CYRILLIC CAPITAL LETTER E
+0xDE 0x042E #CYRILLIC CAPITAL LETTER YU
+0xDF 0x042F #CYRILLIC CAPITAL LETTER YA
+0xE0 0x0430 #CYRILLIC SMALL LETTER A
+0xE1 0x0431 #CYRILLIC SMALL LETTER BE
+0xE2 0x0432 #CYRILLIC SMALL LETTER VE
+0xE3 0x0433 #CYRILLIC SMALL LETTER GHE
+0xE4 0x0434 #CYRILLIC SMALL LETTER DE
+0xE5 0x0435 #CYRILLIC SMALL LETTER IE
+0xE6 0x0436 #CYRILLIC SMALL LETTER ZHE
+0xE7 0x0437 #CYRILLIC SMALL LETTER ZE
+0xE8 0x0438 #CYRILLIC SMALL LETTER I
+0xE9 0x0439 #CYRILLIC SMALL LETTER SHORT I
+0xEA 0x043A #CYRILLIC SMALL LETTER KA
+0xEB 0x043B #CYRILLIC SMALL LETTER EL
+0xEC 0x043C #CYRILLIC SMALL LETTER EM
+0xED 0x043D #CYRILLIC SMALL LETTER EN
+0xEE 0x043E #CYRILLIC SMALL LETTER O
+0xEF 0x043F #CYRILLIC SMALL LETTER PE
+0xF0 0x0440 #CYRILLIC SMALL LETTER ER
+0xF1 0x0441 #CYRILLIC SMALL LETTER ES
+0xF2 0x0442 #CYRILLIC SMALL LETTER TE
+0xF3 0x0443 #CYRILLIC SMALL LETTER U
+0xF4 0x0444 #CYRILLIC SMALL LETTER EF
+0xF5 0x0445 #CYRILLIC SMALL LETTER HA
+0xF6 0x0446 #CYRILLIC SMALL LETTER TSE
+0xF7 0x0447 #CYRILLIC SMALL LETTER CHE
+0xF8 0x0448 #CYRILLIC SMALL LETTER SHA
+0xF9 0x0449 #CYRILLIC SMALL LETTER SHCHA
+0xFA 0x044A #CYRILLIC SMALL LETTER HARD SIGN
+0xFB 0x044B #CYRILLIC SMALL LETTER YERU
+0xFC 0x044C #CYRILLIC SMALL LETTER SOFT SIGN
+0xFD 0x044D #CYRILLIC SMALL LETTER E
+0xFE 0x044E #CYRILLIC SMALL LETTER YU
+0xFF 0x044F #CYRILLIC SMALL LETTER YA
diff --git a/ext/mbstring/tests/data/CP1252.txt b/ext/mbstring/tests/data/CP1252.txt
new file mode 100644
index 0000000000..8ff4b204b7
--- /dev/null
+++ b/ext/mbstring/tests/data/CP1252.txt
@@ -0,0 +1,274 @@
+#
+# Name: cp1252 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: Shawn.Steele@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1252 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1252 order
+#
+0x00 0x0000 #NULL
+0x01 0x0001 #START OF HEADING
+0x02 0x0002 #START OF TEXT
+0x03 0x0003 #END OF TEXT
+0x04 0x0004 #END OF TRANSMISSION
+0x05 0x0005 #ENQUIRY
+0x06 0x0006 #ACKNOWLEDGE
+0x07 0x0007 #BELL
+0x08 0x0008 #BACKSPACE
+0x09 0x0009 #HORIZONTAL TABULATION
+0x0A 0x000A #LINE FEED
+0x0B 0x000B #VERTICAL TABULATION
+0x0C 0x000C #FORM FEED
+0x0D 0x000D #CARRIAGE RETURN
+0x0E 0x000E #SHIFT OUT
+0x0F 0x000F #SHIFT IN
+0x10 0x0010 #DATA LINK ESCAPE
+0x11 0x0011 #DEVICE CONTROL ONE
+0x12 0x0012 #DEVICE CONTROL TWO
+0x13 0x0013 #DEVICE CONTROL THREE
+0x14 0x0014 #DEVICE CONTROL FOUR
+0x15 0x0015 #NEGATIVE ACKNOWLEDGE
+0x16 0x0016 #SYNCHRONOUS IDLE
+0x17 0x0017 #END OF TRANSMISSION BLOCK
+0x18 0x0018 #CANCEL
+0x19 0x0019 #END OF MEDIUM
+0x1A 0x001A #SUBSTITUTE
+0x1B 0x001B #ESCAPE
+0x1C 0x001C #FILE SEPARATOR
+0x1D 0x001D #GROUP SEPARATOR
+0x1E 0x001E #RECORD SEPARATOR
+0x1F 0x001F #UNIT SEPARATOR
+0x20 0x0020 #SPACE
+0x21 0x0021 #EXCLAMATION MARK
+0x22 0x0022 #QUOTATION MARK
+0x23 0x0023 #NUMBER SIGN
+0x24 0x0024 #DOLLAR SIGN
+0x25 0x0025 #PERCENT SIGN
+0x26 0x0026 #AMPERSAND
+0x27 0x0027 #APOSTROPHE
+0x28 0x0028 #LEFT PARENTHESIS
+0x29 0x0029 #RIGHT PARENTHESIS
+0x2A 0x002A #ASTERISK
+0x2B 0x002B #PLUS SIGN
+0x2C 0x002C #COMMA
+0x2D 0x002D #HYPHEN-MINUS
+0x2E 0x002E #FULL STOP
+0x2F 0x002F #SOLIDUS
+0x30 0x0030 #DIGIT ZERO
+0x31 0x0031 #DIGIT ONE
+0x32 0x0032 #DIGIT TWO
+0x33 0x0033 #DIGIT THREE
+0x34 0x0034 #DIGIT FOUR
+0x35 0x0035 #DIGIT FIVE
+0x36 0x0036 #DIGIT SIX
+0x37 0x0037 #DIGIT SEVEN
+0x38 0x0038 #DIGIT EIGHT
+0x39 0x0039 #DIGIT NINE
+0x3A 0x003A #COLON
+0x3B 0x003B #SEMICOLON
+0x3C 0x003C #LESS-THAN SIGN
+0x3D 0x003D #EQUALS SIGN
+0x3E 0x003E #GREATER-THAN SIGN
+0x3F 0x003F #QUESTION MARK
+0x40 0x0040 #COMMERCIAL AT
+0x41 0x0041 #LATIN CAPITAL LETTER A
+0x42 0x0042 #LATIN CAPITAL LETTER B
+0x43 0x0043 #LATIN CAPITAL LETTER C
+0x44 0x0044 #LATIN CAPITAL LETTER D
+0x45 0x0045 #LATIN CAPITAL LETTER E
+0x46 0x0046 #LATIN CAPITAL LETTER F
+0x47 0x0047 #LATIN CAPITAL LETTER G
+0x48 0x0048 #LATIN CAPITAL LETTER H
+0x49 0x0049 #LATIN CAPITAL LETTER I
+0x4A 0x004A #LATIN CAPITAL LETTER J
+0x4B 0x004B #LATIN CAPITAL LETTER K
+0x4C 0x004C #LATIN CAPITAL LETTER L
+0x4D 0x004D #LATIN CAPITAL LETTER M
+0x4E 0x004E #LATIN CAPITAL LETTER N
+0x4F 0x004F #LATIN CAPITAL LETTER O
+0x50 0x0050 #LATIN CAPITAL LETTER P
+0x51 0x0051 #LATIN CAPITAL LETTER Q
+0x52 0x0052 #LATIN CAPITAL LETTER R
+0x53 0x0053 #LATIN CAPITAL LETTER S
+0x54 0x0054 #LATIN CAPITAL LETTER T
+0x55 0x0055 #LATIN CAPITAL LETTER U
+0x56 0x0056 #LATIN CAPITAL LETTER V
+0x57 0x0057 #LATIN CAPITAL LETTER W
+0x58 0x0058 #LATIN CAPITAL LETTER X
+0x59 0x0059 #LATIN CAPITAL LETTER Y
+0x5A 0x005A #LATIN CAPITAL LETTER Z
+0x5B 0x005B #LEFT SQUARE BRACKET
+0x5C 0x005C #REVERSE SOLIDUS
+0x5D 0x005D #RIGHT SQUARE BRACKET
+0x5E 0x005E #CIRCUMFLEX ACCENT
+0x5F 0x005F #LOW LINE
+0x60 0x0060 #GRAVE ACCENT
+0x61 0x0061 #LATIN SMALL LETTER A
+0x62 0x0062 #LATIN SMALL LETTER B
+0x63 0x0063 #LATIN SMALL LETTER C
+0x64 0x0064 #LATIN SMALL LETTER D
+0x65 0x0065 #LATIN SMALL LETTER E
+0x66 0x0066 #LATIN SMALL LETTER F
+0x67 0x0067 #LATIN SMALL LETTER G
+0x68 0x0068 #LATIN SMALL LETTER H
+0x69 0x0069 #LATIN SMALL LETTER I
+0x6A 0x006A #LATIN SMALL LETTER J
+0x6B 0x006B #LATIN SMALL LETTER K
+0x6C 0x006C #LATIN SMALL LETTER L
+0x6D 0x006D #LATIN SMALL LETTER M
+0x6E 0x006E #LATIN SMALL LETTER N
+0x6F 0x006F #LATIN SMALL LETTER O
+0x70 0x0070 #LATIN SMALL LETTER P
+0x71 0x0071 #LATIN SMALL LETTER Q
+0x72 0x0072 #LATIN SMALL LETTER R
+0x73 0x0073 #LATIN SMALL LETTER S
+0x74 0x0074 #LATIN SMALL LETTER T
+0x75 0x0075 #LATIN SMALL LETTER U
+0x76 0x0076 #LATIN SMALL LETTER V
+0x77 0x0077 #LATIN SMALL LETTER W
+0x78 0x0078 #LATIN SMALL LETTER X
+0x79 0x0079 #LATIN SMALL LETTER Y
+0x7A 0x007A #LATIN SMALL LETTER Z
+0x7B 0x007B #LEFT CURLY BRACKET
+0x7C 0x007C #VERTICAL LINE
+0x7D 0x007D #RIGHT CURLY BRACKET
+0x7E 0x007E #TILDE
+0x7F 0x007F #DELETE
+0x80 0x20AC #EURO SIGN
+0x81 #UNDEFINED
+0x82 0x201A #SINGLE LOW-9 QUOTATION MARK
+0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK
+0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 0x2026 #HORIZONTAL ELLIPSIS
+0x86 0x2020 #DAGGER
+0x87 0x2021 #DOUBLE DAGGER
+0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89 0x2030 #PER MILLE SIGN
+0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON
+0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C 0x0152 #LATIN CAPITAL LIGATURE OE
+0x8D #UNDEFINED
+0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON
+0x8F #UNDEFINED
+0x90 #UNDEFINED
+0x91 0x2018 #LEFT SINGLE QUOTATION MARK
+0x92 0x2019 #RIGHT SINGLE QUOTATION MARK
+0x93 0x201C #LEFT DOUBLE QUOTATION MARK
+0x94 0x201D #RIGHT DOUBLE QUOTATION MARK
+0x95 0x2022 #BULLET
+0x96 0x2013 #EN DASH
+0x97 0x2014 #EM DASH
+0x98 0x02DC #SMALL TILDE
+0x99 0x2122 #TRADE MARK SIGN
+0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON
+0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C 0x0153 #LATIN SMALL LIGATURE OE
+0x9D #UNDEFINED
+0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON
+0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xA0 0x00A0 #NO-BREAK SPACE
+0xA1 0x00A1 #INVERTED EXCLAMATION MARK
+0xA2 0x00A2 #CENT SIGN
+0xA3 0x00A3 #POUND SIGN
+0xA4 0x00A4 #CURRENCY SIGN
+0xA5 0x00A5 #YEN SIGN
+0xA6 0x00A6 #BROKEN BAR
+0xA7 0x00A7 #SECTION SIGN
+0xA8 0x00A8 #DIAERESIS
+0xA9 0x00A9 #COPYRIGHT SIGN
+0xAA 0x00AA #FEMININE ORDINAL INDICATOR
+0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC #NOT SIGN
+0xAD 0x00AD #SOFT HYPHEN
+0xAE 0x00AE #REGISTERED SIGN
+0xAF 0x00AF #MACRON
+0xB0 0x00B0 #DEGREE SIGN
+0xB1 0x00B1 #PLUS-MINUS SIGN
+0xB2 0x00B2 #SUPERSCRIPT TWO
+0xB3 0x00B3 #SUPERSCRIPT THREE
+0xB4 0x00B4 #ACUTE ACCENT
+0xB5 0x00B5 #MICRO SIGN
+0xB6 0x00B6 #PILCROW SIGN
+0xB7 0x00B7 #MIDDLE DOT
+0xB8 0x00B8 #CEDILLA
+0xB9 0x00B9 #SUPERSCRIPT ONE
+0xBA 0x00BA #MASCULINE ORDINAL INDICATOR
+0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC #VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD #VULGAR FRACTION ONE HALF
+0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS
+0xBF 0x00BF #INVERTED QUESTION MARK
+0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 #LATIN CAPITAL LETTER AE
+0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x00D0 #LATIN CAPITAL LETTER ETH
+0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 #MULTIPLICATION SIGN
+0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x00DE #LATIN CAPITAL LETTER THORN
+0xDF 0x00DF #LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 #LATIN SMALL LETTER AE
+0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x00F0 #LATIN SMALL LETTER ETH
+0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 #DIVISION SIGN
+0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x00FE #LATIN SMALL LETTER THORN
+0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/CP1254.txt b/ext/mbstring/tests/data/CP1254.txt
new file mode 100644
index 0000000000..987ed98f75
--- /dev/null
+++ b/ext/mbstring/tests/data/CP1254.txt
@@ -0,0 +1,274 @@
+#
+# Name: cp1254 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: Shawn.Steele@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1254 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1254 order
+#
+0x00 0x0000 #NULL
+0x01 0x0001 #START OF HEADING
+0x02 0x0002 #START OF TEXT
+0x03 0x0003 #END OF TEXT
+0x04 0x0004 #END OF TRANSMISSION
+0x05 0x0005 #ENQUIRY
+0x06 0x0006 #ACKNOWLEDGE
+0x07 0x0007 #BELL
+0x08 0x0008 #BACKSPACE
+0x09 0x0009 #HORIZONTAL TABULATION
+0x0A 0x000A #LINE FEED
+0x0B 0x000B #VERTICAL TABULATION
+0x0C 0x000C #FORM FEED
+0x0D 0x000D #CARRIAGE RETURN
+0x0E 0x000E #SHIFT OUT
+0x0F 0x000F #SHIFT IN
+0x10 0x0010 #DATA LINK ESCAPE
+0x11 0x0011 #DEVICE CONTROL ONE
+0x12 0x0012 #DEVICE CONTROL TWO
+0x13 0x0013 #DEVICE CONTROL THREE
+0x14 0x0014 #DEVICE CONTROL FOUR
+0x15 0x0015 #NEGATIVE ACKNOWLEDGE
+0x16 0x0016 #SYNCHRONOUS IDLE
+0x17 0x0017 #END OF TRANSMISSION BLOCK
+0x18 0x0018 #CANCEL
+0x19 0x0019 #END OF MEDIUM
+0x1A 0x001A #SUBSTITUTE
+0x1B 0x001B #ESCAPE
+0x1C 0x001C #FILE SEPARATOR
+0x1D 0x001D #GROUP SEPARATOR
+0x1E 0x001E #RECORD SEPARATOR
+0x1F 0x001F #UNIT SEPARATOR
+0x20 0x0020 #SPACE
+0x21 0x0021 #EXCLAMATION MARK
+0x22 0x0022 #QUOTATION MARK
+0x23 0x0023 #NUMBER SIGN
+0x24 0x0024 #DOLLAR SIGN
+0x25 0x0025 #PERCENT SIGN
+0x26 0x0026 #AMPERSAND
+0x27 0x0027 #APOSTROPHE
+0x28 0x0028 #LEFT PARENTHESIS
+0x29 0x0029 #RIGHT PARENTHESIS
+0x2A 0x002A #ASTERISK
+0x2B 0x002B #PLUS SIGN
+0x2C 0x002C #COMMA
+0x2D 0x002D #HYPHEN-MINUS
+0x2E 0x002E #FULL STOP
+0x2F 0x002F #SOLIDUS
+0x30 0x0030 #DIGIT ZERO
+0x31 0x0031 #DIGIT ONE
+0x32 0x0032 #DIGIT TWO
+0x33 0x0033 #DIGIT THREE
+0x34 0x0034 #DIGIT FOUR
+0x35 0x0035 #DIGIT FIVE
+0x36 0x0036 #DIGIT SIX
+0x37 0x0037 #DIGIT SEVEN
+0x38 0x0038 #DIGIT EIGHT
+0x39 0x0039 #DIGIT NINE
+0x3A 0x003A #COLON
+0x3B 0x003B #SEMICOLON
+0x3C 0x003C #LESS-THAN SIGN
+0x3D 0x003D #EQUALS SIGN
+0x3E 0x003E #GREATER-THAN SIGN
+0x3F 0x003F #QUESTION MARK
+0x40 0x0040 #COMMERCIAL AT
+0x41 0x0041 #LATIN CAPITAL LETTER A
+0x42 0x0042 #LATIN CAPITAL LETTER B
+0x43 0x0043 #LATIN CAPITAL LETTER C
+0x44 0x0044 #LATIN CAPITAL LETTER D
+0x45 0x0045 #LATIN CAPITAL LETTER E
+0x46 0x0046 #LATIN CAPITAL LETTER F
+0x47 0x0047 #LATIN CAPITAL LETTER G
+0x48 0x0048 #LATIN CAPITAL LETTER H
+0x49 0x0049 #LATIN CAPITAL LETTER I
+0x4A 0x004A #LATIN CAPITAL LETTER J
+0x4B 0x004B #LATIN CAPITAL LETTER K
+0x4C 0x004C #LATIN CAPITAL LETTER L
+0x4D 0x004D #LATIN CAPITAL LETTER M
+0x4E 0x004E #LATIN CAPITAL LETTER N
+0x4F 0x004F #LATIN CAPITAL LETTER O
+0x50 0x0050 #LATIN CAPITAL LETTER P
+0x51 0x0051 #LATIN CAPITAL LETTER Q
+0x52 0x0052 #LATIN CAPITAL LETTER R
+0x53 0x0053 #LATIN CAPITAL LETTER S
+0x54 0x0054 #LATIN CAPITAL LETTER T
+0x55 0x0055 #LATIN CAPITAL LETTER U
+0x56 0x0056 #LATIN CAPITAL LETTER V
+0x57 0x0057 #LATIN CAPITAL LETTER W
+0x58 0x0058 #LATIN CAPITAL LETTER X
+0x59 0x0059 #LATIN CAPITAL LETTER Y
+0x5A 0x005A #LATIN CAPITAL LETTER Z
+0x5B 0x005B #LEFT SQUARE BRACKET
+0x5C 0x005C #REVERSE SOLIDUS
+0x5D 0x005D #RIGHT SQUARE BRACKET
+0x5E 0x005E #CIRCUMFLEX ACCENT
+0x5F 0x005F #LOW LINE
+0x60 0x0060 #GRAVE ACCENT
+0x61 0x0061 #LATIN SMALL LETTER A
+0x62 0x0062 #LATIN SMALL LETTER B
+0x63 0x0063 #LATIN SMALL LETTER C
+0x64 0x0064 #LATIN SMALL LETTER D
+0x65 0x0065 #LATIN SMALL LETTER E
+0x66 0x0066 #LATIN SMALL LETTER F
+0x67 0x0067 #LATIN SMALL LETTER G
+0x68 0x0068 #LATIN SMALL LETTER H
+0x69 0x0069 #LATIN SMALL LETTER I
+0x6A 0x006A #LATIN SMALL LETTER J
+0x6B 0x006B #LATIN SMALL LETTER K
+0x6C 0x006C #LATIN SMALL LETTER L
+0x6D 0x006D #LATIN SMALL LETTER M
+0x6E 0x006E #LATIN SMALL LETTER N
+0x6F 0x006F #LATIN SMALL LETTER O
+0x70 0x0070 #LATIN SMALL LETTER P
+0x71 0x0071 #LATIN SMALL LETTER Q
+0x72 0x0072 #LATIN SMALL LETTER R
+0x73 0x0073 #LATIN SMALL LETTER S
+0x74 0x0074 #LATIN SMALL LETTER T
+0x75 0x0075 #LATIN SMALL LETTER U
+0x76 0x0076 #LATIN SMALL LETTER V
+0x77 0x0077 #LATIN SMALL LETTER W
+0x78 0x0078 #LATIN SMALL LETTER X
+0x79 0x0079 #LATIN SMALL LETTER Y
+0x7A 0x007A #LATIN SMALL LETTER Z
+0x7B 0x007B #LEFT CURLY BRACKET
+0x7C 0x007C #VERTICAL LINE
+0x7D 0x007D #RIGHT CURLY BRACKET
+0x7E 0x007E #TILDE
+0x7F 0x007F #DELETE
+0x80 0x20AC #EURO SIGN
+0x81 #UNDEFINED
+0x82 0x201A #SINGLE LOW-9 QUOTATION MARK
+0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK
+0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 0x2026 #HORIZONTAL ELLIPSIS
+0x86 0x2020 #DAGGER
+0x87 0x2021 #DOUBLE DAGGER
+0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89 0x2030 #PER MILLE SIGN
+0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON
+0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C 0x0152 #LATIN CAPITAL LIGATURE OE
+0x8D #UNDEFINED
+0x8E #UNDEFINED
+0x8F #UNDEFINED
+0x90 #UNDEFINED
+0x91 0x2018 #LEFT SINGLE QUOTATION MARK
+0x92 0x2019 #RIGHT SINGLE QUOTATION MARK
+0x93 0x201C #LEFT DOUBLE QUOTATION MARK
+0x94 0x201D #RIGHT DOUBLE QUOTATION MARK
+0x95 0x2022 #BULLET
+0x96 0x2013 #EN DASH
+0x97 0x2014 #EM DASH
+0x98 0x02DC #SMALL TILDE
+0x99 0x2122 #TRADE MARK SIGN
+0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON
+0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C 0x0153 #LATIN SMALL LIGATURE OE
+0x9D #UNDEFINED
+0x9E #UNDEFINED
+0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xA0 0x00A0 #NO-BREAK SPACE
+0xA1 0x00A1 #INVERTED EXCLAMATION MARK
+0xA2 0x00A2 #CENT SIGN
+0xA3 0x00A3 #POUND SIGN
+0xA4 0x00A4 #CURRENCY SIGN
+0xA5 0x00A5 #YEN SIGN
+0xA6 0x00A6 #BROKEN BAR
+0xA7 0x00A7 #SECTION SIGN
+0xA8 0x00A8 #DIAERESIS
+0xA9 0x00A9 #COPYRIGHT SIGN
+0xAA 0x00AA #FEMININE ORDINAL INDICATOR
+0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC #NOT SIGN
+0xAD 0x00AD #SOFT HYPHEN
+0xAE 0x00AE #REGISTERED SIGN
+0xAF 0x00AF #MACRON
+0xB0 0x00B0 #DEGREE SIGN
+0xB1 0x00B1 #PLUS-MINUS SIGN
+0xB2 0x00B2 #SUPERSCRIPT TWO
+0xB3 0x00B3 #SUPERSCRIPT THREE
+0xB4 0x00B4 #ACUTE ACCENT
+0xB5 0x00B5 #MICRO SIGN
+0xB6 0x00B6 #PILCROW SIGN
+0xB7 0x00B7 #MIDDLE DOT
+0xB8 0x00B8 #CEDILLA
+0xB9 0x00B9 #SUPERSCRIPT ONE
+0xBA 0x00BA #MASCULINE ORDINAL INDICATOR
+0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC #VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD #VULGAR FRACTION ONE HALF
+0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS
+0xBF 0x00BF #INVERTED QUESTION MARK
+0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 #LATIN CAPITAL LETTER AE
+0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x011E #LATIN CAPITAL LETTER G WITH BREVE
+0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 #MULTIPLICATION SIGN
+0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x0130 #LATIN CAPITAL LETTER I WITH DOT ABOVE
+0xDE 0x015E #LATIN CAPITAL LETTER S WITH CEDILLA
+0xDF 0x00DF #LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 #LATIN SMALL LETTER AE
+0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x011F #LATIN SMALL LETTER G WITH BREVE
+0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 #DIVISION SIGN
+0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x0131 #LATIN SMALL LETTER DOTLESS I
+0xFE 0x015F #LATIN SMALL LETTER S WITH CEDILLA
+0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/CP51932.txt b/ext/mbstring/tests/data/CP51932.txt
new file mode 100644
index 0000000000..7dc3aad86c
--- /dev/null
+++ b/ext/mbstring/tests/data/CP51932.txt
@@ -0,0 +1,7613 @@
+#
+# cp51932 - Microsoft Windows Codepage 51932 (EUC - Japanese)
+<U0000> \x00 |0 # NULL
+<U0001> \x01 |0 # START OF HEADING
+<U0002> \x02 |0 # START OF TEXT
+<U0003> \x03 |0 # END OF TEXT
+<U0004> \x04 |0 # END OF TRANSMISSION
+<U0005> \x05 |0 # ENQUIRY
+<U0006> \x06 |0 # ACKNOWLEDGE
+<U0007> \x07 |0 # BELL
+<U0008> \x08 |0 # BACKSPACE
+<U0009> \x09 |0 # HORIZONTAL TABULATION
+<U000A> \x0A |0 # LINE FEED
+<U000B> \x0B |0 # VERTICAL TABULATION
+<U000C> \x0C |0 # FORM FEED
+<U000D> \x0D |0 # CARRIAGE RETURN
+<U000E> \x0E |0 # SHIFT OUT
+<U000F> \x0F |0 # SHIFT IN
+<U0010> \x10 |0 # DATA LINK ESCAPE
+<U0011> \x11 |0 # DEVICE CONTROL ONE
+<U0012> \x12 |0 # DEVICE CONTROL TWO
+<U0013> \x13 |0 # DEVICE CONTROL THREE
+<U0014> \x14 |0 # DEVICE CONTROL FOUR
+<U0015> \x15 |0 # NEGATIVE ACKNOWLEDGE
+<U0016> \x16 |0 # SYNCHRONOUS IDLE
+<U0017> \x17 |0 # END OF TRANSMISSION BLOCK
+<U0018> \x18 |0 # CANCEL
+<U0019> \x19 |0 # END OF MEDIUM
+<U001A> \x1A |0 # SUBSTITUTE
+<U001B> \x1B |0 # ESCAPE
+<U001C> \x1C |0 # FILE SEPARATOR
+<U001D> \x1D |0 # GROUP SEPARATOR
+<U001E> \x1E |0 # RECORD SEPARATOR
+<U001F> \x1F |0 # UNIT SEPARATOR
+<U0020> \x20 |0 # SPACE
+<U0021> \x21 |0 # EXCLAMATION MARK
+<U0022> \x22 |0 # QUOTATION MARK
+<U0023> \x23 |0 # NUMBER SIGN
+<U0024> \x24 |0 # DOLLAR SIGN
+<U0025> \x25 |0 # PERCENT SIGN
+<U0026> \x26 |0 # AMPERSAND
+<U0027> \x27 |0 # APOSTROPHE
+<U0028> \x28 |0 # LEFT PARENTHESIS
+<U0029> \x29 |0 # RIGHT PARENTHESIS
+<U002A> \x2A |0 # ASTERISK
+<U002B> \x2B |0 # PLUS SIGN
+<U002C> \x2C |0 # COMMA
+<U002D> \x2D |0 # HYPHEN-MINUS
+<U002E> \x2E |0 # FULL STOP
+<U002F> \x2F |0 # SOLIDUS
+<U0030> \x30 |0 # DIGIT ZERO
+<U0031> \x31 |0 # DIGIT ONE
+<U0032> \x32 |0 # DIGIT TWO
+<U0033> \x33 |0 # DIGIT THREE
+<U0034> \x34 |0 # DIGIT FOUR
+<U0035> \x35 |0 # DIGIT FIVE
+<U0036> \x36 |0 # DIGIT SIX
+<U0037> \x37 |0 # DIGIT SEVEN
+<U0038> \x38 |0 # DIGIT EIGHT
+<U0039> \x39 |0 # DIGIT NINE
+<U003A> \x3A |0 # COLON
+<U003B> \x3B |0 # SEMICOLON
+<U003C> \x3C |0 # LESS-THAN SIGN
+<U003D> \x3D |0 # EQUALS SIGN
+<U003E> \x3E |0 # GREATER-THAN SIGN
+<U003F> \x3F |0 # QUESTION MARK
+<U0040> \x40 |0 # COMMERCIAL AT
+<U0041> \x41 |0 # LATIN CAPITAL LETTER A
+<U0042> \x42 |0 # LATIN CAPITAL LETTER B
+<U0043> \x43 |0 # LATIN CAPITAL LETTER C
+<U0044> \x44 |0 # LATIN CAPITAL LETTER D
+<U0045> \x45 |0 # LATIN CAPITAL LETTER E
+<U0046> \x46 |0 # LATIN CAPITAL LETTER F
+<U0047> \x47 |0 # LATIN CAPITAL LETTER G
+<U0048> \x48 |0 # LATIN CAPITAL LETTER H
+<U0049> \x49 |0 # LATIN CAPITAL LETTER I
+<U004A> \x4A |0 # LATIN CAPITAL LETTER J
+<U004B> \x4B |0 # LATIN CAPITAL LETTER K
+<U004C> \x4C |0 # LATIN CAPITAL LETTER L
+<U004D> \x4D |0 # LATIN CAPITAL LETTER M
+<U004E> \x4E |0 # LATIN CAPITAL LETTER N
+<U004F> \x4F |0 # LATIN CAPITAL LETTER O
+<U0050> \x50 |0 # LATIN CAPITAL LETTER P
+<U0051> \x51 |0 # LATIN CAPITAL LETTER Q
+<U0052> \x52 |0 # LATIN CAPITAL LETTER R
+<U0053> \x53 |0 # LATIN CAPITAL LETTER S
+<U0054> \x54 |0 # LATIN CAPITAL LETTER T
+<U0055> \x55 |0 # LATIN CAPITAL LETTER U
+<U0056> \x56 |0 # LATIN CAPITAL LETTER V
+<U0057> \x57 |0 # LATIN CAPITAL LETTER W
+<U0058> \x58 |0 # LATIN CAPITAL LETTER X
+<U0059> \x59 |0 # LATIN CAPITAL LETTER Y
+<U005A> \x5A |0 # LATIN CAPITAL LETTER Z
+<U005B> \x5B |0 # LEFT SQUARE BRACKET
+<U005C> \x5C |0 # REVERSE SOLIDUS
+<U005D> \x5D |0 # RIGHT SQUARE BRACKET
+<U005E> \x5E |0 # CIRCUMFLEX ACCENT
+<U005F> \x5F |0 # LOW LINE
+<U0060> \x60 |0 # GRAVE ACCENT
+<U0061> \x61 |0 # LATIN SMALL LETTER A
+<U0062> \x62 |0 # LATIN SMALL LETTER B
+<U0063> \x63 |0 # LATIN SMALL LETTER C
+<U0064> \x64 |0 # LATIN SMALL LETTER D
+<U0065> \x65 |0 # LATIN SMALL LETTER E
+<U0066> \x66 |0 # LATIN SMALL LETTER F
+<U0067> \x67 |0 # LATIN SMALL LETTER G
+<U0068> \x68 |0 # LATIN SMALL LETTER H
+<U0069> \x69 |0 # LATIN SMALL LETTER I
+<U006A> \x6A |0 # LATIN SMALL LETTER J
+<U006B> \x6B |0 # LATIN SMALL LETTER K
+<U006C> \x6C |0 # LATIN SMALL LETTER L
+<U006D> \x6D |0 # LATIN SMALL LETTER M
+<U006E> \x6E |0 # LATIN SMALL LETTER N
+<U006F> \x6F |0 # LATIN SMALL LETTER O
+<U0070> \x70 |0 # LATIN SMALL LETTER P
+<U0071> \x71 |0 # LATIN SMALL LETTER Q
+<U0072> \x72 |0 # LATIN SMALL LETTER R
+<U0073> \x73 |0 # LATIN SMALL LETTER S
+<U0074> \x74 |0 # LATIN SMALL LETTER T
+<U0075> \x75 |0 # LATIN SMALL LETTER U
+<U0076> \x76 |0 # LATIN SMALL LETTER V
+<U0077> \x77 |0 # LATIN SMALL LETTER W
+<U0078> \x78 |0 # LATIN SMALL LETTER X
+<U0079> \x79 |0 # LATIN SMALL LETTER Y
+<U007A> \x7A |0 # LATIN SMALL LETTER Z
+<U007B> \x7B |0 # LEFT CURLY BRACKET
+<U007C> \x7C |0 # VERTICAL LINE
+<U007D> \x7D |0 # RIGHT CURLY BRACKET
+<U007E> \x7E |0 # TILDE
+<U007F> \x7F |0 # DELETE
+<U00A1> \x21 |1 # INVERTED EXCLAMATION MARK
+<U00A2> \xA1\xF1 |1 # CENT SIGN
+<U00A3> \xA1\xF2 |1 # POUND SIGN
+<U00A5> \x5C |1 # YEN SIGN
+<U00A6> \x7C |1 # BROKEN BAR
+<U00A7> \xA1\xF8 |0 # SECTION SIGN
+<U00A8> \xA1\xAF |0 # DIAERESIS
+<U00A9> \x63 |1 # COPYRIGHT SIGN
+<U00AA> \x61 |1 # FEMININE ORDINAL INDICATOR
+<U00AB> \xA2\xE3 |1 # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+<U00AC> \xA2\xCC |1 # NOT SIGN
+<U00AD> \x2D |1 # SOFT HYPHEN
+<U00AE> \x52 |1 # REGISTERED SIGN
+<U00AF> \xA1\xB1 |1 # MACRON
+<U00B0> \xA1\xEB |0 # DEGREE SIGN
+<U00B1> \xA1\xDE |0 # PLUS-MINUS SIGN
+<U00B2> \x32 |1 # SUPERSCRIPT TWO
+<U00B3> \x33 |1 # SUPERSCRIPT THREE
+<U00B4> \xA1\xAD |0 # ACUTE ACCENT
+<U00B5> \xA6\xCC |1 # MICRO SIGN
+<U00B6> \xA2\xF9 |0 # PILCROW SIGN
+<U00B7> \xA1\xA6 |1 # MIDDLE DOT
+<U00B8> \xA1\xA4 |1 # CEDILLA
+<U00B9> \x31 |1 # SUPERSCRIPT ONE
+<U00BA> \x6F |1 # MASCULINE ORDINAL INDICATOR
+<U00BB> \xA2\xE4 |1 # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+<U00C0> \x41 |1 # LATIN CAPITAL LETTER A WITH GRAVE
+<U00C1> \x41 |1 # LATIN CAPITAL LETTER A WITH ACUTE
+<U00C2> \x41 |1 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+<U00C3> \x41 |1 # LATIN CAPITAL LETTER A WITH TILDE
+<U00C4> \x41 |1 # LATIN CAPITAL LETTER A WITH DIAERESIS
+<U00C5> \x41 |1 # LATIN CAPITAL LETTER A WITH RING ABOVE
+<U00C6> \x41 |1 # LATIN CAPITAL LETTER AE
+<U00C7> \x43 |1 # LATIN CAPITAL LETTER C WITH CEDILLA
+<U00C8> \x45 |1 # LATIN CAPITAL LETTER E WITH GRAVE
+<U00C9> \x45 |1 # LATIN CAPITAL LETTER E WITH ACUTE
+<U00CA> \x45 |1 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+<U00CB> \x45 |1 # LATIN CAPITAL LETTER E WITH DIAERESIS
+<U00CC> \x49 |1 # LATIN CAPITAL LETTER I WITH GRAVE
+<U00CD> \x49 |1 # LATIN CAPITAL LETTER I WITH ACUTE
+<U00CE> \x49 |1 # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+<U00CF> \x49 |1 # LATIN CAPITAL LETTER I WITH DIAERESIS
+<U00D0> \x44 |1 # LATIN CAPITAL LETTER ETH
+<U00D1> \x4E |1 # LATIN CAPITAL LETTER N WITH TILDE
+<U00D2> \x4F |1 # LATIN CAPITAL LETTER O WITH GRAVE
+<U00D3> \x4F |1 # LATIN CAPITAL LETTER O WITH ACUTE
+<U00D4> \x4F |1 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+<U00D5> \x4F |1 # LATIN CAPITAL LETTER O WITH TILDE
+<U00D6> \x4F |1 # LATIN CAPITAL LETTER O WITH DIAERESIS
+<U00D7> \xA1\xDF |0 # MULTIPLICATION SIGN
+<U00D8> \x4F |1 # LATIN CAPITAL LETTER O WITH STROKE
+<U00D9> \x55 |1 # LATIN CAPITAL LETTER U WITH GRAVE
+<U00DA> \x55 |1 # LATIN CAPITAL LETTER U WITH ACUTE
+<U00DB> \x55 |1 # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+<U00DC> \x55 |1 # LATIN CAPITAL LETTER U WITH DIAERESIS
+<U00DD> \x59 |1 # LATIN CAPITAL LETTER Y WITH ACUTE
+<U00DE> \x54 |1 # LATIN CAPITAL LETTER THORN
+<U00DF> \x73 |1 # LATIN SMALL LETTER SHARP S
+<U00E0> \x61 |1 # LATIN SMALL LETTER A WITH GRAVE
+<U00E1> \x61 |1 # LATIN SMALL LETTER A WITH ACUTE
+<U00E2> \x61 |1 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+<U00E3> \x61 |1 # LATIN SMALL LETTER A WITH TILDE
+<U00E4> \x61 |1 # LATIN SMALL LETTER A WITH DIAERESIS
+<U00E5> \x61 |1 # LATIN SMALL LETTER A WITH RING ABOVE
+<U00E6> \x61 |1 # LATIN SMALL LETTER AE
+<U00E7> \x63 |1 # LATIN SMALL LETTER C WITH CEDILLA
+<U00E8> \x65 |1 # LATIN SMALL LETTER E WITH GRAVE
+<U00E9> \x65 |1 # LATIN SMALL LETTER E WITH ACUTE
+<U00EA> \x65 |1 # LATIN SMALL LETTER E WITH CIRCUMFLEX
+<U00EB> \x65 |1 # LATIN SMALL LETTER E WITH DIAERESIS
+<U00EC> \x69 |1 # LATIN SMALL LETTER I WITH GRAVE
+<U00ED> \x69 |1 # LATIN SMALL LETTER I WITH ACUTE
+<U00EE> \x69 |1 # LATIN SMALL LETTER I WITH CIRCUMFLEX
+<U00EF> \x69 |1 # LATIN SMALL LETTER I WITH DIAERESIS
+<U00F0> \x64 |1 # LATIN SMALL LETTER ETH
+<U00F1> \x6E |1 # LATIN SMALL LETTER N WITH TILDE
+<U00F2> \x6F |1 # LATIN SMALL LETTER O WITH GRAVE
+<U00F3> \x6F |1 # LATIN SMALL LETTER O WITH ACUTE
+<U00F4> \x6F |1 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+<U00F5> \x6F |1 # LATIN SMALL LETTER O WITH TILDE
+<U00F6> \x6F |1 # LATIN SMALL LETTER O WITH DIAERESIS
+<U00F7> \xA1\xE0 |0 # DIVISION SIGN
+<U00F8> \x6F |1 # LATIN SMALL LETTER O WITH STROKE
+<U00F9> \x75 |1 # LATIN SMALL LETTER U WITH GRAVE
+<U00FA> \x75 |1 # LATIN SMALL LETTER U WITH ACUTE
+<U00FB> \x75 |1 # LATIN SMALL LETTER U WITH CIRCUMFLEX
+<U00FC> \x75 |1 # LATIN SMALL LETTER U WITH DIAERESIS
+<U00FD> \x79 |1 # LATIN SMALL LETTER Y WITH ACUTE
+<U00FE> \x74 |1 # LATIN SMALL LETTER THORN
+<U00FF> \x79 |1 # LATIN SMALL LETTER Y WITH DIAERESIS
+<U0391> \xA6\xA1 |0 # GREEK CAPITAL LETTER ALPHA
+<U0392> \xA6\xA2 |0 # GREEK CAPITAL LETTER BETA
+<U0393> \xA6\xA3 |0 # GREEK CAPITAL LETTER GAMMA
+<U0394> \xA6\xA4 |0 # GREEK CAPITAL LETTER DELTA
+<U0395> \xA6\xA5 |0 # GREEK CAPITAL LETTER EPSILON
+<U0396> \xA6\xA6 |0 # GREEK CAPITAL LETTER ZETA
+<U0397> \xA6\xA7 |0 # GREEK CAPITAL LETTER ETA
+<U0398> \xA6\xA8 |0 # GREEK CAPITAL LETTER THETA
+<U0399> \xA6\xA9 |0 # GREEK CAPITAL LETTER IOTA
+<U039A> \xA6\xAA |0 # GREEK CAPITAL LETTER KAPPA
+<U039B> \xA6\xAB |0 # GREEK CAPITAL LETTER LAMDA
+<U039C> \xA6\xAC |0 # GREEK CAPITAL LETTER MU
+<U039D> \xA6\xAD |0 # GREEK CAPITAL LETTER NU
+<U039E> \xA6\xAE |0 # GREEK CAPITAL LETTER XI
+<U039F> \xA6\xAF |0 # GREEK CAPITAL LETTER OMICRON
+<U03A0> \xA6\xB0 |0 # GREEK CAPITAL LETTER PI
+<U03A1> \xA6\xB1 |0 # GREEK CAPITAL LETTER RHO
+<U03A3> \xA6\xB2 |0 # GREEK CAPITAL LETTER SIGMA
+<U03A4> \xA6\xB3 |0 # GREEK CAPITAL LETTER TAU
+<U03A5> \xA6\xB4 |0 # GREEK CAPITAL LETTER UPSILON
+<U03A6> \xA6\xB5 |0 # GREEK CAPITAL LETTER PHI
+<U03A7> \xA6\xB6 |0 # GREEK CAPITAL LETTER CHI
+<U03A8> \xA6\xB7 |0 # GREEK CAPITAL LETTER PSI
+<U03A9> \xA6\xB8 |0 # GREEK CAPITAL LETTER OMEGA
+<U03B1> \xA6\xC1 |0 # GREEK SMALL LETTER ALPHA
+<U03B2> \xA6\xC2 |0 # GREEK SMALL LETTER BETA
+<U03B3> \xA6\xC3 |0 # GREEK SMALL LETTER GAMMA
+<U03B4> \xA6\xC4 |0 # GREEK SMALL LETTER DELTA
+<U03B5> \xA6\xC5 |0 # GREEK SMALL LETTER EPSILON
+<U03B6> \xA6\xC6 |0 # GREEK SMALL LETTER ZETA
+<U03B7> \xA6\xC7 |0 # GREEK SMALL LETTER ETA
+<U03B8> \xA6\xC8 |0 # GREEK SMALL LETTER THETA
+<U03B9> \xA6\xC9 |0 # GREEK SMALL LETTER IOTA
+<U03BA> \xA6\xCA |0 # GREEK SMALL LETTER KAPPA
+<U03BB> \xA6\xCB |0 # GREEK SMALL LETTER LAMDA
+<U03BC> \xA6\xCC |0 # GREEK SMALL LETTER MU
+<U03BD> \xA6\xCD |0 # GREEK SMALL LETTER NU
+<U03BE> \xA6\xCE |0 # GREEK SMALL LETTER XI
+<U03BF> \xA6\xCF |0 # GREEK SMALL LETTER OMICRON
+<U03C0> \xA6\xD0 |0 # GREEK SMALL LETTER PI
+<U03C1> \xA6\xD1 |0 # GREEK SMALL LETTER RHO
+<U03C3> \xA6\xD2 |0 # GREEK SMALL LETTER SIGMA
+<U03C4> \xA6\xD3 |0 # GREEK SMALL LETTER TAU
+<U03C5> \xA6\xD4 |0 # GREEK SMALL LETTER UPSILON
+<U03C6> \xA6\xD5 |0 # GREEK SMALL LETTER PHI
+<U03C7> \xA6\xD6 |0 # GREEK SMALL LETTER CHI
+<U03C8> \xA6\xD7 |0 # GREEK SMALL LETTER PSI
+<U03C9> \xA6\xD8 |0 # GREEK SMALL LETTER OMEGA
+<U0401> \xA7\xA7 |0 # CYRILLIC CAPITAL LETTER IO
+<U0410> \xA7\xA1 |0 # CYRILLIC CAPITAL LETTER A
+<U0411> \xA7\xA2 |0 # CYRILLIC CAPITAL LETTER BE
+<U0412> \xA7\xA3 |0 # CYRILLIC CAPITAL LETTER VE
+<U0413> \xA7\xA4 |0 # CYRILLIC CAPITAL LETTER GHE
+<U0414> \xA7\xA5 |0 # CYRILLIC CAPITAL LETTER DE
+<U0415> \xA7\xA6 |0 # CYRILLIC CAPITAL LETTER IE
+<U0416> \xA7\xA8 |0 # CYRILLIC CAPITAL LETTER ZHE
+<U0417> \xA7\xA9 |0 # CYRILLIC CAPITAL LETTER ZE
+<U0418> \xA7\xAA |0 # CYRILLIC CAPITAL LETTER I
+<U0419> \xA7\xAB |0 # CYRILLIC CAPITAL LETTER SHORT I
+<U041A> \xA7\xAC |0 # CYRILLIC CAPITAL LETTER KA
+<U041B> \xA7\xAD |0 # CYRILLIC CAPITAL LETTER EL
+<U041C> \xA7\xAE |0 # CYRILLIC CAPITAL LETTER EM
+<U041D> \xA7\xAF |0 # CYRILLIC CAPITAL LETTER EN
+<U041E> \xA7\xB0 |0 # CYRILLIC CAPITAL LETTER O
+<U041F> \xA7\xB1 |0 # CYRILLIC CAPITAL LETTER PE
+<U0420> \xA7\xB2 |0 # CYRILLIC CAPITAL LETTER ER
+<U0421> \xA7\xB3 |0 # CYRILLIC CAPITAL LETTER ES
+<U0422> \xA7\xB4 |0 # CYRILLIC CAPITAL LETTER TE
+<U0423> \xA7\xB5 |0 # CYRILLIC CAPITAL LETTER U
+<U0424> \xA7\xB6 |0 # CYRILLIC CAPITAL LETTER EF
+<U0425> \xA7\xB7 |0 # CYRILLIC CAPITAL LETTER HA
+<U0426> \xA7\xB8 |0 # CYRILLIC CAPITAL LETTER TSE
+<U0427> \xA7\xB9 |0 # CYRILLIC CAPITAL LETTER CHE
+<U0428> \xA7\xBA |0 # CYRILLIC CAPITAL LETTER SHA
+<U0429> \xA7\xBB |0 # CYRILLIC CAPITAL LETTER SHCHA
+<U042A> \xA7\xBC |0 # CYRILLIC CAPITAL LETTER HARD SIGN
+<U042B> \xA7\xBD |0 # CYRILLIC CAPITAL LETTER YERU
+<U042C> \xA7\xBE |0 # CYRILLIC CAPITAL LETTER SOFT SIGN
+<U042D> \xA7\xBF |0 # CYRILLIC CAPITAL LETTER E
+<U042E> \xA7\xC0 |0 # CYRILLIC CAPITAL LETTER YU
+<U042F> \xA7\xC1 |0 # CYRILLIC CAPITAL LETTER YA
+<U0430> \xA7\xD1 |0 # CYRILLIC SMALL LETTER A
+<U0431> \xA7\xD2 |0 # CYRILLIC SMALL LETTER BE
+<U0432> \xA7\xD3 |0 # CYRILLIC SMALL LETTER VE
+<U0433> \xA7\xD4 |0 # CYRILLIC SMALL LETTER GHE
+<U0434> \xA7\xD5 |0 # CYRILLIC SMALL LETTER DE
+<U0435> \xA7\xD6 |0 # CYRILLIC SMALL LETTER IE
+<U0436> \xA7\xD8 |0 # CYRILLIC SMALL LETTER ZHE
+<U0437> \xA7\xD9 |0 # CYRILLIC SMALL LETTER ZE
+<U0438> \xA7\xDA |0 # CYRILLIC SMALL LETTER I
+<U0439> \xA7\xDB |0 # CYRILLIC SMALL LETTER SHORT I
+<U043A> \xA7\xDC |0 # CYRILLIC SMALL LETTER KA
+<U043B> \xA7\xDD |0 # CYRILLIC SMALL LETTER EL
+<U043C> \xA7\xDE |0 # CYRILLIC SMALL LETTER EM
+<U043D> \xA7\xDF |0 # CYRILLIC SMALL LETTER EN
+<U043E> \xA7\xE0 |0 # CYRILLIC SMALL LETTER O
+<U043F> \xA7\xE1 |0 # CYRILLIC SMALL LETTER PE
+<U0440> \xA7\xE2 |0 # CYRILLIC SMALL LETTER ER
+<U0441> \xA7\xE3 |0 # CYRILLIC SMALL LETTER ES
+<U0442> \xA7\xE4 |0 # CYRILLIC SMALL LETTER TE
+<U0443> \xA7\xE5 |0 # CYRILLIC SMALL LETTER U
+<U0444> \xA7\xE6 |0 # CYRILLIC SMALL LETTER EF
+<U0445> \xA7\xE7 |0 # CYRILLIC SMALL LETTER HA
+<U0446> \xA7\xE8 |0 # CYRILLIC SMALL LETTER TSE
+<U0447> \xA7\xE9 |0 # CYRILLIC SMALL LETTER CHE
+<U0448> \xA7\xEA |0 # CYRILLIC SMALL LETTER SHA
+<U0449> \xA7\xEB |0 # CYRILLIC SMALL LETTER SHCHA
+<U044A> \xA7\xEC |0 # CYRILLIC SMALL LETTER HARD SIGN
+<U044B> \xA7\xED |0 # CYRILLIC SMALL LETTER YERU
+<U044C> \xA7\xEE |0 # CYRILLIC SMALL LETTER SOFT SIGN
+<U044D> \xA7\xEF |0 # CYRILLIC SMALL LETTER E
+<U044E> \xA7\xF0 |0 # CYRILLIC SMALL LETTER YU
+<U044F> \xA7\xF1 |0 # CYRILLIC SMALL LETTER YA
+<U0451> \xA7\xD7 |0 # CYRILLIC SMALL LETTER IO
+<U2010> \xA1\xBE |0 # HYPHEN
+<U2015> \xA1\xBD |0 # HORIZONTAL BAR
+<U2018> \xA1\xC6 |0 # LEFT SINGLE QUOTATION MARK
+<U2019> \xA1\xC7 |0 # RIGHT SINGLE QUOTATION MARK
+<U201C> \xA1\xC8 |0 # LEFT DOUBLE QUOTATION MARK
+<U201D> \xA1\xC9 |0 # RIGHT DOUBLE QUOTATION MARK
+<U2020> \xA2\xF7 |0 # DAGGER
+<U2021> \xA2\xF8 |0 # DOUBLE DAGGER
+<U2025> \xA1\xC5 |0 # TWO DOT LEADER
+<U2026> \xA1\xC4 |0 # HORIZONTAL ELLIPSIS
+<U2030> \xA2\xF3 |0 # PER MILLE SIGN
+<U2032> \xA1\xEC |0 # PRIME
+<U2033> \xA1\xED |0 # DOUBLE PRIME
+<U203B> \xA2\xA8 |0 # REFERENCE MARK
+<U2103> \xA1\xEE |0 # DEGREE CELSIUS
+<U2116> \xAD\xE2 |0 # NUMERO SIGN
+<U2121> \xAD\xE4 |0 # TELEPHONE SIGN
+<U212B> \xA2\xF2 |0 # ANGSTROM SIGN
+<U2160> \xAD\xB5 |0 # ROMAN NUMERAL ONE
+<U2161> \xAD\xB6 |0 # ROMAN NUMERAL TWO
+<U2162> \xAD\xB7 |0 # ROMAN NUMERAL THREE
+<U2163> \xAD\xB8 |0 # ROMAN NUMERAL FOUR
+<U2164> \xAD\xB9 |0 # ROMAN NUMERAL FIVE
+<U2165> \xAD\xBA |0 # ROMAN NUMERAL SIX
+<U2166> \xAD\xBB |0 # ROMAN NUMERAL SEVEN
+<U2167> \xAD\xBC |0 # ROMAN NUMERAL EIGHT
+<U2168> \xAD\xBD |0 # ROMAN NUMERAL NINE
+<U2169> \xAD\xBE |0 # ROMAN NUMERAL TEN
+<U2170> \xFC\xF1 |0 # SMALL ROMAN NUMERAL ONE
+<U2171> \xFC\xF2 |0 # SMALL ROMAN NUMERAL TWO
+<U2172> \xFC\xF3 |0 # SMALL ROMAN NUMERAL THREE
+<U2173> \xFC\xF4 |0 # SMALL ROMAN NUMERAL FOUR
+<U2174> \xFC\xF5 |0 # SMALL ROMAN NUMERAL FIVE
+<U2175> \xFC\xF6 |0 # SMALL ROMAN NUMERAL SIX
+<U2176> \xFC\xF7 |0 # SMALL ROMAN NUMERAL SEVEN
+<U2177> \xFC\xF8 |0 # SMALL ROMAN NUMERAL EIGHT
+<U2178> \xFC\xF9 |0 # SMALL ROMAN NUMERAL NINE
+<U2179> \xFC\xFA |0 # SMALL ROMAN NUMERAL TEN
+<U2190> \xA2\xAB |0 # LEFTWARDS ARROW
+<U2191> \xA2\xAC |0 # UPWARDS ARROW
+<U2192> \xA2\xAA |0 # RIGHTWARDS ARROW
+<U2193> \xA2\xAD |0 # DOWNWARDS ARROW
+<U21D2> \xA2\xCD |0 # RIGHTWARDS DOUBLE ARROW
+<U21D4> \xA2\xCE |0 # LEFT RIGHT DOUBLE ARROW
+<U2200> \xA2\xCF |0 # FOR ALL
+<U2202> \xA2\xDF |0 # PARTIAL DIFFERENTIAL
+<U2203> \xA2\xD0 |0 # THERE EXISTS
+<U2207> \xA2\xE0 |0 # NABLA
+<U2208> \xA2\xBA |0 # ELEMENT OF
+<U220B> \xA2\xBB |0 # CONTAINS AS MEMBER
+<U2211> \xAD\xF4 |0 # N-ARY SUMMATION
+<U221A> \xA2\xE5 |0 # SQUARE ROOT
+<U221A> \xAD\xF5 |3 # SQUARE ROOT
+<U221D> \xA2\xE7 |0 # PROPORTIONAL TO
+<U221E> \xA1\xE7 |0 # INFINITY
+<U221F> \xAD\xF8 |0 # RIGHT ANGLE
+<U2220> \xA2\xDC |0 # ANGLE
+<U2220> \xAD\xF7 |3 # ANGLE
+<U2225> \xA1\xC2 |0 # PARALLEL TO
+<U2227> \xA2\xCA |0 # LOGICAL AND
+<U2228> \xA2\xCB |0 # LOGICAL OR
+<U2229> \xA2\xC1 |0 # INTERSECTION
+<U2229> \xAD\xFB |3 # INTERSECTION
+<U222A> \xA2\xC0 |0 # UNION
+<U222A> \xAD\xFC |3 # UNION
+<U222B> \xA2\xE9 |0 # INTEGRAL
+<U222B> \xAD\xF2 |3 # INTEGRAL
+<U222C> \xA2\xEA |0 # DOUBLE INTEGRAL
+<U222E> \xAD\xF3 |0 # CONTOUR INTEGRAL
+<U2234> \xA1\xE8 |0 # THEREFORE
+<U2235> \xA2\xE8 |0 # BECAUSE
+<U2235> \xAD\xFA |3 # BECAUSE
+<U223D> \xA2\xE6 |0 # REVERSED TILDE
+<U2252> \xA2\xE2 |0 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+<U2252> \xAD\xF0 |3 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+<U2260> \xA1\xE2 |0 # NOT EQUAL TO
+<U2261> \xA2\xE1 |0 # IDENTICAL TO
+<U2261> \xAD\xF1 |3 # IDENTICAL TO
+<U2266> \xA1\xE5 |0 # LESS-THAN OVER EQUAL TO
+<U2267> \xA1\xE6 |0 # GREATER-THAN OVER EQUAL TO
+<U226A> \xA2\xE3 |0 # MUCH LESS-THAN
+<U226B> \xA2\xE4 |0 # MUCH GREATER-THAN
+<U2282> \xA2\xBE |0 # SUBSET OF
+<U2283> \xA2\xBF |0 # SUPERSET OF
+<U2286> \xA2\xBC |0 # SUBSET OF OR EQUAL TO
+<U2287> \xA2\xBD |0 # SUPERSET OF OR EQUAL TO
+<U22A5> \xA2\xDD |0 # UP TACK
+<U22A5> \xAD\xF6 |3 # UP TACK
+<U22BF> \xAD\xF9 |0 # RIGHT TRIANGLE
+<U2312> \xA2\xDE |0 # ARC
+<U2460> \xAD\xA1 |0 # CIRCLED DIGIT ONE
+<U2461> \xAD\xA2 |0 # CIRCLED DIGIT TWO
+<U2462> \xAD\xA3 |0 # CIRCLED DIGIT THREE
+<U2463> \xAD\xA4 |0 # CIRCLED DIGIT FOUR
+<U2464> \xAD\xA5 |0 # CIRCLED DIGIT FIVE
+<U2465> \xAD\xA6 |0 # CIRCLED DIGIT SIX
+<U2466> \xAD\xA7 |0 # CIRCLED DIGIT SEVEN
+<U2467> \xAD\xA8 |0 # CIRCLED DIGIT EIGHT
+<U2468> \xAD\xA9 |0 # CIRCLED DIGIT NINE
+<U2469> \xAD\xAA |0 # CIRCLED NUMBER TEN
+<U246A> \xAD\xAB |0 # CIRCLED NUMBER ELEVEN
+<U246B> \xAD\xAC |0 # CIRCLED NUMBER TWELVE
+<U246C> \xAD\xAD |0 # CIRCLED NUMBER THIRTEEN
+<U246D> \xAD\xAE |0 # CIRCLED NUMBER FOURTEEN
+<U246E> \xAD\xAF |0 # CIRCLED NUMBER FIFTEEN
+<U246F> \xAD\xB0 |0 # CIRCLED NUMBER SIXTEEN
+<U2470> \xAD\xB1 |0 # CIRCLED NUMBER SEVENTEEN
+<U2471> \xAD\xB2 |0 # CIRCLED NUMBER EIGHTEEN
+<U2472> \xAD\xB3 |0 # CIRCLED NUMBER NINETEEN
+<U2473> \xAD\xB4 |0 # CIRCLED NUMBER TWENTY
+<U2500> \xA8\xA1 |0 # BOX DRAWINGS LIGHT HORIZONTAL
+<U2501> \xA8\xAC |0 # BOX DRAWINGS HEAVY HORIZONTAL
+<U2502> \xA8\xA2 |0 # BOX DRAWINGS LIGHT VERTICAL
+<U2503> \xA8\xAD |0 # BOX DRAWINGS HEAVY VERTICAL
+<U250C> \xA8\xA3 |0 # BOX DRAWINGS LIGHT DOWN AND RIGHT
+<U250F> \xA8\xAE |0 # BOX DRAWINGS HEAVY DOWN AND RIGHT
+<U2510> \xA8\xA4 |0 # BOX DRAWINGS LIGHT DOWN AND LEFT
+<U2513> \xA8\xAF |0 # BOX DRAWINGS HEAVY DOWN AND LEFT
+<U2514> \xA8\xA6 |0 # BOX DRAWINGS LIGHT UP AND RIGHT
+<U2517> \xA8\xB1 |0 # BOX DRAWINGS HEAVY UP AND RIGHT
+<U2518> \xA8\xA5 |0 # BOX DRAWINGS LIGHT UP AND LEFT
+<U251B> \xA8\xB0 |0 # BOX DRAWINGS HEAVY UP AND LEFT
+<U251C> \xA8\xA7 |0 # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+<U251D> \xA8\xBC |0 # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+<U2520> \xA8\xB7 |0 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+<U2523> \xA8\xB2 |0 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+<U2524> \xA8\xA9 |0 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+<U2525> \xA8\xBE |0 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+<U2528> \xA8\xB9 |0 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+<U252B> \xA8\xB4 |0 # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+<U252C> \xA8\xA8 |0 # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+<U252F> \xA8\xB8 |0 # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+<U2530> \xA8\xBD |0 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+<U2533> \xA8\xB3 |0 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+<U2534> \xA8\xAA |0 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+<U2537> \xA8\xBA |0 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+<U2538> \xA8\xBF |0 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+<U253B> \xA8\xB5 |0 # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+<U253C> \xA8\xAB |0 # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+<U253F> \xA8\xBB |0 # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+<U2542> \xA8\xC0 |0 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+<U254B> \xA8\xB6 |0 # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+<U25A0> \xA2\xA3 |0 # BLACK SQUARE
+<U25A1> \xA2\xA2 |0 # WHITE SQUARE
+<U25B2> \xA2\xA5 |0 # BLACK UP-POINTING TRIANGLE
+<U25B3> \xA2\xA4 |0 # WHITE UP-POINTING TRIANGLE
+<U25BC> \xA2\xA7 |0 # BLACK DOWN-POINTING TRIANGLE
+<U25BD> \xA2\xA6 |0 # WHITE DOWN-POINTING TRIANGLE
+<U25C6> \xA2\xA1 |0 # BLACK DIAMOND
+<U25C7> \xA1\xFE |0 # WHITE DIAMOND
+<U25CB> \xA1\xFB |0 # WHITE CIRCLE
+<U25CE> \xA1\xFD |0 # BULLSEYE
+<U25CF> \xA1\xFC |0 # BLACK CIRCLE
+<U25EF> \xA2\xFE |0 # LARGE CIRCLE
+<U2605> \xA1\xFA |0 # BLACK STAR
+<U2606> \xA1\xF9 |0 # WHITE STAR
+<U2640> \xA1\xEA |0 # FEMALE SIGN
+<U2642> \xA1\xE9 |0 # MALE SIGN
+<U266A> \xA2\xF6 |0 # EIGHTH NOTE
+<U266D> \xA2\xF5 |0 # MUSIC FLAT SIGN
+<U266F> \xA2\xF4 |0 # MUSIC SHARP SIGN
+<U3000> \xA1\xA1 |0 # IDEOGRAPHIC SPACE
+<U3001> \xA1\xA2 |0 # IDEOGRAPHIC COMMA
+<U3002> \xA1\xA3 |0 # IDEOGRAPHIC FULL STOP
+<U3003> \xA1\xB7 |0 # DITTO MARK
+<U3005> \xA1\xB9 |0 # IDEOGRAPHIC ITERATION MARK
+<U3006> \xA1\xBA |0 # IDEOGRAPHIC CLOSING MARK
+<U3007> \xA1\xBB |0 # IDEOGRAPHIC NUMBER ZERO
+<U3008> \xA1\xD2 |0 # LEFT ANGLE BRACKET
+<U3009> \xA1\xD3 |0 # RIGHT ANGLE BRACKET
+<U300A> \xA1\xD4 |0 # LEFT DOUBLE ANGLE BRACKET
+<U300B> \xA1\xD5 |0 # RIGHT DOUBLE ANGLE BRACKET
+<U300C> \xA1\xD6 |0 # LEFT CORNER BRACKET
+<U300D> \xA1\xD7 |0 # RIGHT CORNER BRACKET
+<U300E> \xA1\xD8 |0 # LEFT WHITE CORNER BRACKET
+<U300F> \xA1\xD9 |0 # RIGHT WHITE CORNER BRACKET
+<U3010> \xA1\xDA |0 # LEFT BLACK LENTICULAR BRACKET
+<U3011> \xA1\xDB |0 # RIGHT BLACK LENTICULAR BRACKET
+<U3012> \xA2\xA9 |0 # POSTAL MARK
+<U3013> \xA2\xAE |0 # GETA MARK
+<U3014> \xA1\xCC |0 # LEFT TORTOISE SHELL BRACKET
+<U3015> \xA1\xCD |0 # RIGHT TORTOISE SHELL BRACKET
+<U301D> \xAD\xE0 |0 # REVERSED DOUBLE PRIME QUOTATION MARK
+<U301F> \xAD\xE1 |0 # LOW DOUBLE PRIME QUOTATION MARK
+<U3041> \xA4\xA1 |0 # HIRAGANA LETTER SMALL A
+<U3042> \xA4\xA2 |0 # HIRAGANA LETTER A
+<U3043> \xA4\xA3 |0 # HIRAGANA LETTER SMALL I
+<U3044> \xA4\xA4 |0 # HIRAGANA LETTER I
+<U3045> \xA4\xA5 |0 # HIRAGANA LETTER SMALL U
+<U3046> \xA4\xA6 |0 # HIRAGANA LETTER U
+<U3047> \xA4\xA7 |0 # HIRAGANA LETTER SMALL E
+<U3048> \xA4\xA8 |0 # HIRAGANA LETTER E
+<U3049> \xA4\xA9 |0 # HIRAGANA LETTER SMALL O
+<U304A> \xA4\xAA |0 # HIRAGANA LETTER O
+<U304B> \xA4\xAB |0 # HIRAGANA LETTER KA
+<U304C> \xA4\xAC |0 # HIRAGANA LETTER GA
+<U304D> \xA4\xAD |0 # HIRAGANA LETTER KI
+<U304E> \xA4\xAE |0 # HIRAGANA LETTER GI
+<U304F> \xA4\xAF |0 # HIRAGANA LETTER KU
+<U3050> \xA4\xB0 |0 # HIRAGANA LETTER GU
+<U3051> \xA4\xB1 |0 # HIRAGANA LETTER KE
+<U3052> \xA4\xB2 |0 # HIRAGANA LETTER GE
+<U3053> \xA4\xB3 |0 # HIRAGANA LETTER KO
+<U3054> \xA4\xB4 |0 # HIRAGANA LETTER GO
+<U3055> \xA4\xB5 |0 # HIRAGANA LETTER SA
+<U3056> \xA4\xB6 |0 # HIRAGANA LETTER ZA
+<U3057> \xA4\xB7 |0 # HIRAGANA LETTER SI
+<U3058> \xA4\xB8 |0 # HIRAGANA LETTER ZI
+<U3059> \xA4\xB9 |0 # HIRAGANA LETTER SU
+<U305A> \xA4\xBA |0 # HIRAGANA LETTER ZU
+<U305B> \xA4\xBB |0 # HIRAGANA LETTER SE
+<U305C> \xA4\xBC |0 # HIRAGANA LETTER ZE
+<U305D> \xA4\xBD |0 # HIRAGANA LETTER SO
+<U305E> \xA4\xBE |0 # HIRAGANA LETTER ZO
+<U305F> \xA4\xBF |0 # HIRAGANA LETTER TA
+<U3060> \xA4\xC0 |0 # HIRAGANA LETTER DA
+<U3061> \xA4\xC1 |0 # HIRAGANA LETTER TI
+<U3062> \xA4\xC2 |0 # HIRAGANA LETTER DI
+<U3063> \xA4\xC3 |0 # HIRAGANA LETTER SMALL TU
+<U3064> \xA4\xC4 |0 # HIRAGANA LETTER TU
+<U3065> \xA4\xC5 |0 # HIRAGANA LETTER DU
+<U3066> \xA4\xC6 |0 # HIRAGANA LETTER TE
+<U3067> \xA4\xC7 |0 # HIRAGANA LETTER DE
+<U3068> \xA4\xC8 |0 # HIRAGANA LETTER TO
+<U3069> \xA4\xC9 |0 # HIRAGANA LETTER DO
+<U306A> \xA4\xCA |0 # HIRAGANA LETTER NA
+<U306B> \xA4\xCB |0 # HIRAGANA LETTER NI
+<U306C> \xA4\xCC |0 # HIRAGANA LETTER NU
+<U306D> \xA4\xCD |0 # HIRAGANA LETTER NE
+<U306E> \xA4\xCE |0 # HIRAGANA LETTER NO
+<U306F> \xA4\xCF |0 # HIRAGANA LETTER HA
+<U3070> \xA4\xD0 |0 # HIRAGANA LETTER BA
+<U3071> \xA4\xD1 |0 # HIRAGANA LETTER PA
+<U3072> \xA4\xD2 |0 # HIRAGANA LETTER HI
+<U3073> \xA4\xD3 |0 # HIRAGANA LETTER BI
+<U3074> \xA4\xD4 |0 # HIRAGANA LETTER PI
+<U3075> \xA4\xD5 |0 # HIRAGANA LETTER HU
+<U3076> \xA4\xD6 |0 # HIRAGANA LETTER BU
+<U3077> \xA4\xD7 |0 # HIRAGANA LETTER PU
+<U3078> \xA4\xD8 |0 # HIRAGANA LETTER HE
+<U3079> \xA4\xD9 |0 # HIRAGANA LETTER BE
+<U307A> \xA4\xDA |0 # HIRAGANA LETTER PE
+<U307B> \xA4\xDB |0 # HIRAGANA LETTER HO
+<U307C> \xA4\xDC |0 # HIRAGANA LETTER BO
+<U307D> \xA4\xDD |0 # HIRAGANA LETTER PO
+<U307E> \xA4\xDE |0 # HIRAGANA LETTER MA
+<U307F> \xA4\xDF |0 # HIRAGANA LETTER MI
+<U3080> \xA4\xE0 |0 # HIRAGANA LETTER MU
+<U3081> \xA4\xE1 |0 # HIRAGANA LETTER ME
+<U3082> \xA4\xE2 |0 # HIRAGANA LETTER MO
+<U3083> \xA4\xE3 |0 # HIRAGANA LETTER SMALL YA
+<U3084> \xA4\xE4 |0 # HIRAGANA LETTER YA
+<U3085> \xA4\xE5 |0 # HIRAGANA LETTER SMALL YU
+<U3086> \xA4\xE6 |0 # HIRAGANA LETTER YU
+<U3087> \xA4\xE7 |0 # HIRAGANA LETTER SMALL YO
+<U3088> \xA4\xE8 |0 # HIRAGANA LETTER YO
+<U3089> \xA4\xE9 |0 # HIRAGANA LETTER RA
+<U308A> \xA4\xEA |0 # HIRAGANA LETTER RI
+<U308B> \xA4\xEB |0 # HIRAGANA LETTER RU
+<U308C> \xA4\xEC |0 # HIRAGANA LETTER RE
+<U308D> \xA4\xED |0 # HIRAGANA LETTER RO
+<U308E> \xA4\xEE |0 # HIRAGANA LETTER SMALL WA
+<U308F> \xA4\xEF |0 # HIRAGANA LETTER WA
+<U3090> \xA4\xF0 |0 # HIRAGANA LETTER WI
+<U3091> \xA4\xF1 |0 # HIRAGANA LETTER WE
+<U3092> \xA4\xF2 |0 # HIRAGANA LETTER WO
+<U3093> \xA4\xF3 |0 # HIRAGANA LETTER N
+<U3094> \xA5\xF4 |1 # HIRAGANA LETTER VU
+<U309B> \xA1\xAB |0 # KATAKANA-HIRAGANA VOICED SOUND MARK
+<U309C> \xA1\xAC |0 # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+<U309D> \xA1\xB5 |0 # HIRAGANA ITERATION MARK
+<U309E> \xA1\xB6 |0 # HIRAGANA VOICED ITERATION MARK
+<U30A1> \xA5\xA1 |0 # KATAKANA LETTER SMALL A
+<U30A2> \xA5\xA2 |0 # KATAKANA LETTER A
+<U30A3> \xA5\xA3 |0 # KATAKANA LETTER SMALL I
+<U30A4> \xA5\xA4 |0 # KATAKANA LETTER I
+<U30A5> \xA5\xA5 |0 # KATAKANA LETTER SMALL U
+<U30A6> \xA5\xA6 |0 # KATAKANA LETTER U
+<U30A7> \xA5\xA7 |0 # KATAKANA LETTER SMALL E
+<U30A8> \xA5\xA8 |0 # KATAKANA LETTER E
+<U30A9> \xA5\xA9 |0 # KATAKANA LETTER SMALL O
+<U30AA> \xA5\xAA |0 # KATAKANA LETTER O
+<U30AB> \xA5\xAB |0 # KATAKANA LETTER KA
+<U30AC> \xA5\xAC |0 # KATAKANA LETTER GA
+<U30AD> \xA5\xAD |0 # KATAKANA LETTER KI
+<U30AE> \xA5\xAE |0 # KATAKANA LETTER GI
+<U30AF> \xA5\xAF |0 # KATAKANA LETTER KU
+<U30B0> \xA5\xB0 |0 # KATAKANA LETTER GU
+<U30B1> \xA5\xB1 |0 # KATAKANA LETTER KE
+<U30B2> \xA5\xB2 |0 # KATAKANA LETTER GE
+<U30B3> \xA5\xB3 |0 # KATAKANA LETTER KO
+<U30B4> \xA5\xB4 |0 # KATAKANA LETTER GO
+<U30B5> \xA5\xB5 |0 # KATAKANA LETTER SA
+<U30B6> \xA5\xB6 |0 # KATAKANA LETTER ZA
+<U30B7> \xA5\xB7 |0 # KATAKANA LETTER SI
+<U30B8> \xA5\xB8 |0 # KATAKANA LETTER ZI
+<U30B9> \xA5\xB9 |0 # KATAKANA LETTER SU
+<U30BA> \xA5\xBA |0 # KATAKANA LETTER ZU
+<U30BB> \xA5\xBB |0 # KATAKANA LETTER SE
+<U30BC> \xA5\xBC |0 # KATAKANA LETTER ZE
+<U30BD> \xA5\xBD |0 # KATAKANA LETTER SO
+<U30BE> \xA5\xBE |0 # KATAKANA LETTER ZO
+<U30BF> \xA5\xBF |0 # KATAKANA LETTER TA
+<U30C0> \xA5\xC0 |0 # KATAKANA LETTER DA
+<U30C1> \xA5\xC1 |0 # KATAKANA LETTER TI
+<U30C2> \xA5\xC2 |0 # KATAKANA LETTER DI
+<U30C3> \xA5\xC3 |0 # KATAKANA LETTER SMALL TU
+<U30C4> \xA5\xC4 |0 # KATAKANA LETTER TU
+<U30C5> \xA5\xC5 |0 # KATAKANA LETTER DU
+<U30C6> \xA5\xC6 |0 # KATAKANA LETTER TE
+<U30C7> \xA5\xC7 |0 # KATAKANA LETTER DE
+<U30C8> \xA5\xC8 |0 # KATAKANA LETTER TO
+<U30C9> \xA5\xC9 |0 # KATAKANA LETTER DO
+<U30CA> \xA5\xCA |0 # KATAKANA LETTER NA
+<U30CB> \xA5\xCB |0 # KATAKANA LETTER NI
+<U30CC> \xA5\xCC |0 # KATAKANA LETTER NU
+<U30CD> \xA5\xCD |0 # KATAKANA LETTER NE
+<U30CE> \xA5\xCE |0 # KATAKANA LETTER NO
+<U30CF> \xA5\xCF |0 # KATAKANA LETTER HA
+<U30D0> \xA5\xD0 |0 # KATAKANA LETTER BA
+<U30D1> \xA5\xD1 |0 # KATAKANA LETTER PA
+<U30D2> \xA5\xD2 |0 # KATAKANA LETTER HI
+<U30D3> \xA5\xD3 |0 # KATAKANA LETTER BI
+<U30D4> \xA5\xD4 |0 # KATAKANA LETTER PI
+<U30D5> \xA5\xD5 |0 # KATAKANA LETTER HU
+<U30D6> \xA5\xD6 |0 # KATAKANA LETTER BU
+<U30D7> \xA5\xD7 |0 # KATAKANA LETTER PU
+<U30D8> \xA5\xD8 |0 # KATAKANA LETTER HE
+<U30D9> \xA5\xD9 |0 # KATAKANA LETTER BE
+<U30DA> \xA5\xDA |0 # KATAKANA LETTER PE
+<U30DB> \xA5\xDB |0 # KATAKANA LETTER HO
+<U30DC> \xA5\xDC |0 # KATAKANA LETTER BO
+<U30DD> \xA5\xDD |0 # KATAKANA LETTER PO
+<U30DE> \xA5\xDE |0 # KATAKANA LETTER MA
+<U30DF> \xA5\xDF |0 # KATAKANA LETTER MI
+<U30E0> \xA5\xE0 |0 # KATAKANA LETTER MU
+<U30E1> \xA5\xE1 |0 # KATAKANA LETTER ME
+<U30E2> \xA5\xE2 |0 # KATAKANA LETTER MO
+<U30E3> \xA5\xE3 |0 # KATAKANA LETTER SMALL YA
+<U30E4> \xA5\xE4 |0 # KATAKANA LETTER YA
+<U30E5> \xA5\xE5 |0 # KATAKANA LETTER SMALL YU
+<U30E6> \xA5\xE6 |0 # KATAKANA LETTER YU
+<U30E7> \xA5\xE7 |0 # KATAKANA LETTER SMALL YO
+<U30E8> \xA5\xE8 |0 # KATAKANA LETTER YO
+<U30E9> \xA5\xE9 |0 # KATAKANA LETTER RA
+<U30EA> \xA5\xEA |0 # KATAKANA LETTER RI
+<U30EB> \xA5\xEB |0 # KATAKANA LETTER RU
+<U30EC> \xA5\xEC |0 # KATAKANA LETTER RE
+<U30ED> \xA5\xED |0 # KATAKANA LETTER RO
+<U30EE> \xA5\xEE |0 # KATAKANA LETTER SMALL WA
+<U30EF> \xA5\xEF |0 # KATAKANA LETTER WA
+<U30F0> \xA5\xF0 |0 # KATAKANA LETTER WI
+<U30F1> \xA5\xF1 |0 # KATAKANA LETTER WE
+<U30F2> \xA5\xF2 |0 # KATAKANA LETTER WO
+<U30F3> \xA5\xF3 |0 # KATAKANA LETTER N
+<U30F4> \xA5\xF4 |0 # KATAKANA LETTER VU
+<U30F5> \xA5\xF5 |0 # KATAKANA LETTER SMALL KA
+<U30F6> \xA5\xF6 |0 # KATAKANA LETTER SMALL KE
+<U30FB> \xA1\xA6 |0 # KATAKANA MIDDLE DOT
+<U30FC> \xA1\xBC |0 # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+<U30FD> \xA1\xB3 |0 # KATAKANA ITERATION MARK
+<U30FE> \xA1\xB4 |0 # KATAKANA VOICED ITERATION MARK
+<U3231> \xAD\xEA |0 # PARENTHESIZED IDEOGRAPH STOCK
+<U3232> \xAD\xEB |0 # PARENTHESIZED IDEOGRAPH HAVE
+<U3239> \xAD\xEC |0 # PARENTHESIZED IDEOGRAPH REPRESENT
+<U32A4> \xAD\xE5 |0 # CIRCLED IDEOGRAPH HIGH
+<U32A5> \xAD\xE6 |0 # CIRCLED IDEOGRAPH CENTRE
+<U32A6> \xAD\xE7 |0 # CIRCLED IDEOGRAPH LOW
+<U32A7> \xAD\xE8 |0 # CIRCLED IDEOGRAPH LEFT
+<U32A8> \xAD\xE9 |0 # CIRCLED IDEOGRAPH RIGHT
+<U3303> \xAD\xC6 |0 # SQUARE AARU
+<U330D> \xAD\xCA |0 # SQUARE KARORII
+<U3314> \xAD\xC1 |0 # SQUARE KIRO
+<U3318> \xAD\xC4 |0 # SQUARE GURAMU
+<U3322> \xAD\xC2 |0 # SQUARE SENTI
+<U3323> \xAD\xCC |0 # SQUARE SENTO
+<U3326> \xAD\xCB |0 # SQUARE DORU
+<U3327> \xAD\xC5 |0 # SQUARE TON
+<U332B> \xAD\xCD |0 # SQUARE PAASENTO
+<U3336> \xAD\xC7 |0 # SQUARE HEKUTAARU
+<U333B> \xAD\xCF |0 # SQUARE PEEZI
+<U3349> \xAD\xC0 |0 # SQUARE MIRI
+<U334A> \xAD\xCE |0 # SQUARE MIRIBAARU
+<U334D> \xAD\xC3 |0 # SQUARE MEETORU
+<U3351> \xAD\xC8 |0 # SQUARE RITTORU
+<U3357> \xAD\xC9 |0 # SQUARE WATTO
+<U337B> \xAD\xDF |0 # SQUARE ERA NAME HEISEI
+<U337C> \xAD\xEF |0 # SQUARE ERA NAME SYOUWA
+<U337D> \xAD\xEE |0 # SQUARE ERA NAME TAISYOU
+<U337E> \xAD\xED |0 # SQUARE ERA NAME MEIZI
+<U338E> \xAD\xD3 |0 # SQUARE MG
+<U338F> \xAD\xD4 |0 # SQUARE KG
+<U339C> \xAD\xD0 |0 # SQUARE MM
+<U339D> \xAD\xD1 |0 # SQUARE CM
+<U339E> \xAD\xD2 |0 # SQUARE KM
+<U33A1> \xAD\xD6 |0 # SQUARE M SQUARED
+<U33C4> \xAD\xD5 |0 # SQUARE CC
+<U33CD> \xAD\xE3 |0 # SQUARE KK
+<U4E00> \xB0\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U4E01> \xC3\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U4E03> \xBC\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U4E07> \xCB\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U4E08> \xBE\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U4E09> \xBB\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U4E0A> \xBE\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U4E0B> \xB2\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U4E0D> \xC9\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U4E0E> \xCD\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U4E10> \xD0\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U4E11> \xB1\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U4E14> \xB3\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U4E15> \xD0\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U4E16> \xC0\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U4E17> \xD2\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U4E18> \xB5\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U4E19> \xCA\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U4E1E> \xBE\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U4E21> \xCE\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U4E26> \xCA\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U4E28> \xF9\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U4E2A> \xD0\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U4E2D> \xC3\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U4E31> \xD0\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U4E32> \xB6\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U4E36> \xD0\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U4E38> \xB4\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U4E39> \xC3\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U4E3B> \xBC\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U4E3C> \xD0\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U4E3F> \xD0\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U4E42> \xD0\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U4E43> \xC7\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U4E45> \xB5\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U4E4B> \xC7\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U4E4D> \xC6\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U4E4E> \xB8\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U4E4F> \xCB\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U4E55> \xE9\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U4E56> \xD0\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U4E57> \xBE\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U4E58> \xD0\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U4E59> \xB2\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U4E5D> \xB6\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U4E5E> \xB8\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U4E5F> \xCC\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U4E62> \xD6\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U4E71> \xCD\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U4E73> \xC6\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U4E7E> \xB4\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U4E80> \xB5\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U4E82> \xD0\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U4E85> \xD0\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U4E86> \xCE\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U4E88> \xCD\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U4E89> \xC1\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U4E8A> \xD0\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U4E8B> \xBB\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U4E8C> \xC6\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U4E8E> \xD0\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U4E91> \xB1\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U4E92> \xB8\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U4E94> \xB8\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U4E95> \xB0\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U4E98> \xCF\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U4E99> \xCF\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U4E9B> \xBA\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U4E9C> \xB0\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U4E9E> \xD0\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U4E9F> \xD0\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U4EA0> \xD0\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U4EA1> \xCB\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U4EA2> \xD0\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U4EA4> \xB8\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U4EA5> \xB0\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U4EA6> \xCB\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U4EA8> \xB5\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U4EAB> \xB5\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U4EAC> \xB5\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U4EAD> \xC4\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U4EAE> \xCE\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U4EB0> \xD0\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U4EB3> \xD0\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U4EB6> \xD0\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U4EBA> \xBF\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U4EC0> \xBD\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U4EC1> \xBF\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U4EC2> \xD0\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U4EC4> \xD0\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U4EC6> \xD0\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U4EC7> \xB5\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U4ECA> \xBA\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U4ECB> \xB2\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U4ECD> \xD0\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U4ECE> \xD0\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U4ECF> \xCA\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U4ED4> \xBB\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U4ED5> \xBB\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U4ED6> \xC2\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U4ED7> \xD0\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U4ED8> \xC9\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U4ED9> \xC0\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U4EDD> \xA1\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U4EDE> \xD0\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U4EDF> \xD0\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U4EE1> \xF9\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U4EE3> \xC2\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U4EE4> \xCE\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U4EE5> \xB0\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U4EED> \xD0\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U4EEE> \xB2\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U4EF0> \xB6\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U4EF2> \xC3\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U4EF6> \xB7\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U4EF7> \xD0\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U4EFB> \xC7\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U4EFC> \xF9\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U4F00> \xF9\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U4F01> \xB4\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U4F03> \xF9\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U4F09> \xD0\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U4F0A> \xB0\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U4F0D> \xB8\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U4F0E> \xB4\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U4F0F> \xC9\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U4F10> \xC8\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U4F11> \xB5\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U4F1A> \xB2\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U4F1C> \xD0\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U4F1D> \xC5\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U4F2F> \xC7\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U4F30> \xD0\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U4F34> \xC8\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U4F36> \xCE\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U4F38> \xBF\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U4F39> \xF9\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U4F3A> \xBB\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U4F3C> \xBB\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U4F3D> \xB2\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U4F43> \xC4\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U4F46> \xC3\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U4F47> \xD0\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U4F4D> \xB0\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U4F4E> \xC4\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U4F4F> \xBD\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U4F50> \xBA\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U4F51> \xCD\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U4F53> \xC2\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U4F55> \xB2\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U4F56> \xF9\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U4F57> \xD0\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U4F59> \xCD\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U4F5A> \xD0\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U4F5B> \xD0\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U4F5C> \xBA\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U4F5D> \xD0\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U4F5E> \xD5\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U4F69> \xD0\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U4F6F> \xD0\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U4F70> \xD0\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U4F73> \xB2\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U4F75> \xCA\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U4F76> \xD0\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U4F7B> \xD0\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U4F7C> \xB8\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U4F7F> \xBB\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U4F83> \xB4\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U4F86> \xD0\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U4F88> \xD0\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U4F8A> \xF9\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U4F8B> \xCE\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U4F8D> \xBB\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U4F8F> \xD0\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U4F91> \xD0\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U4F92> \xF9\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U4F94> \xF9\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U4F96> \xD0\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U4F98> \xD0\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U4F9A> \xF9\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U4F9B> \xB6\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U4F9D> \xB0\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U4FA0> \xB6\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U4FA1> \xB2\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U4FAB> \xD5\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U4FAD> \xCB\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U4FAE> \xC9\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U4FAF> \xB8\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U4FB5> \xBF\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U4FB6> \xCE\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U4FBF> \xCA\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U4FC2> \xB7\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U4FC3> \xC2\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U4FC4> \xB2\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U4FC9> \xF9\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U4FCA> \xBD\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U4FCD> \xF9\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U4FCE> \xD0\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U4FD0> \xD0\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U4FD1> \xD0\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U4FD4> \xD0\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U4FD7> \xC2\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U4FD8> \xD0\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U4FDA> \xD0\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U4FDB> \xD0\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U4FDD> \xCA\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U4FDF> \xD0\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U4FE1> \xBF\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U4FE3> \xCB\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U4FE4> \xD0\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U4FE5> \xD0\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U4FEE> \xBD\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U4FEF> \xD0\xED |0 # CJK UNIFIED IDEOGRAPH
+<U4FF3> \xC7\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U4FF5> \xC9\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U4FF6> \xD0\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U4FF8> \xCA\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U4FFA> \xB2\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U4FFE> \xD0\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U4FFF> \xF9\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5005> \xD0\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5006> \xD0\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5009> \xC1\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U500B> \xB8\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U500D> \xC7\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U500F> \xE0\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U5011> \xD0\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5012> \xC5\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U5014> \xD0\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U5016> \xB8\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5019> \xB8\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U501A> \xD0\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U501E> \xF9\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U501F> \xBC\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U5021> \xD0\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U5022> \xF9\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5023> \xCA\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5024> \xC3\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U5025> \xD0\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U5026> \xB7\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5028> \xD0\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U5029> \xD0\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U502A> \xD0\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U502B> \xCE\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U502C> \xD0\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U502D> \xCF\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U5036> \xB6\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5039> \xB7\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U5040> \xF9\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5042> \xF9\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U5043> \xD0\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U5046> \xF9\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5047> \xD0\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5048> \xD0\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5049> \xB0\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U504F> \xCA\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U5050> \xD0\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U5055> \xD0\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U5056> \xD0\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U505A> \xD0\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U505C> \xC4\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5065> \xB7\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U506C> \xD0\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U5070> \xF9\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U5072> \xBC\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U5074> \xC2\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U5075> \xC4\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U5076> \xB6\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5078> \xD0\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U507D> \xB5\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U5080> \xD0\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5085> \xD0\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U508D> \xCB\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U5091> \xB7\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5094> \xF9\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U5098> \xBB\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U5099> \xC8\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U509A> \xD0\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U50AC> \xBA\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U50AD> \xCD\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U50B2> \xD0\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U50B3> \xD1\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U50B4> \xD0\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U50B5> \xBA\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U50B7> \xBD\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U50BE> \xB7\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U50C2> \xD1\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U50C5> \xB6\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U50C9> \xD1\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U50CA> \xD1\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U50CD> \xC6\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U50CF> \xC1\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U50D1> \xB6\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U50D5> \xCB\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U50D6> \xD1\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U50D8> \xF9\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U50DA> \xCE\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U50DE> \xD1\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U50E3> \xD1\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U50E5> \xD1\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U50E7> \xC1\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U50ED> \xD1\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U50EE> \xD1\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U50F4> \xF9\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U50F5> \xD1\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U50F9> \xD1\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U50FB> \xCA\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U5100> \xB5\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U5101> \xD1\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U5102> \xD1\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U5104> \xB2\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U5109> \xD1\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U5112> \xBC\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U5114> \xD1\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5115> \xD1\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U5116> \xD1\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5118> \xD0\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U511A> \xD1\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U511F> \xBD\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U5121> \xD1\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U512A> \xCD\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U5132> \xCC\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U5137> \xD1\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U513A> \xD1\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U513B> \xD1\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U513C> \xD1\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U513F> \xD1\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5140> \xD1\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5141> \xB0\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U5143> \xB8\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U5144> \xB7\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5145> \xBD\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U5146> \xC3\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U5147> \xB6\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U5148> \xC0\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U5149> \xB8\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U514A> \xF9\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U514B> \xB9\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U514C> \xD1\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U514D> \xCC\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U514E> \xC5\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5150> \xBB\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U5152> \xD1\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5154> \xD1\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U515A> \xC5\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U515C> \xB3\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5162> \xD1\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U5164> \xF9\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U5165> \xC6\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U5168> \xC1\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U5169> \xD1\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U516A> \xD1\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U516B> \xC8\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U516C> \xB8\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U516D> \xCF\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U516E> \xD1\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U5171> \xB6\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U5175> \xCA\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U5176> \xC2\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U5177> \xB6\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5178> \xC5\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U517C> \xB7\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U5180> \xD1\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U5182> \xD1\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U5185> \xC6\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U5186> \xB1\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U5189> \xD1\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U518A> \xBA\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U518C> \xD1\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U518D> \xBA\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U518F> \xD1\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U5190> \xE6\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5191> \xD1\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5192> \xCB\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U5193> \xD1\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U5195> \xD1\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U5196> \xD1\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U5197> \xBE\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U5199> \xBC\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U519D> \xF9\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U51A0> \xB4\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U51A2> \xD1\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U51A4> \xD1\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U51A5> \xCC\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U51A6> \xD1\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U51A8> \xC9\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U51A9> \xD1\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U51AA> \xD1\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U51AB> \xD1\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U51AC> \xC5\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U51B0> \xD1\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U51B1> \xD1\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U51B2> \xD1\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U51B3> \xD1\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U51B4> \xBA\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U51B5> \xD1\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U51B6> \xCC\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U51B7> \xCE\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U51BD> \xD1\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U51BE> \xF9\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U51C4> \xC0\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U51C5> \xD1\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U51C6> \xBD\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U51C9> \xD1\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U51CB> \xC3\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U51CC> \xCE\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U51CD> \xC5\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U51D6> \xD2\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U51DB> \xD1\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U51DC> \xF4\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U51DD> \xB6\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U51E0> \xD1\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U51E1> \xCB\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U51E6> \xBD\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U51E7> \xC2\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U51E9> \xD1\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U51EA> \xC6\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U51EC> \xF9\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U51ED> \xD1\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U51F0> \xD1\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U51F1> \xB3\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U51F5> \xD1\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U51F6> \xB6\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U51F8> \xC6\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U51F9> \xB1\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U51FA> \xBD\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U51FD> \xC8\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U51FE> \xD1\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U5200> \xC5\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U5203> \xBF\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U5204> \xD1\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U5206> \xCA\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5207> \xC0\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U5208> \xB4\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U520A> \xB4\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U520B> \xD1\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U520E> \xD1\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5211> \xB7\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5214> \xD1\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U5215> \xF9\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U5217> \xCE\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U521D> \xBD\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U5224> \xC8\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5225> \xCA\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U5227> \xD1\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U5229> \xCD\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U522A> \xD1\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U522E> \xD1\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U5230> \xC5\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U5233> \xD1\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U5236> \xC0\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U5237> \xBA\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U5238> \xB7\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U5239> \xD1\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U523A> \xBB\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U523B> \xB9\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5243> \xC4\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5244> \xD1\xED |0 # CJK UNIFIED IDEOGRAPH
+<U5247> \xC2\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U524A> \xBA\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U524B> \xD1\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U524C> \xD1\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U524D> \xC1\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U524F> \xD1\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U5254> \xD1\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5256> \xCB\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U525B> \xB9\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U525E> \xD1\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U5263> \xB7\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5264> \xBA\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U5265> \xC7\xED |0 # CJK UNIFIED IDEOGRAPH
+<U5269> \xD1\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U526A> \xD1\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U526F> \xC9\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U5270> \xBE\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U5271> \xD1\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U5272> \xB3\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5273> \xD1\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5274> \xD1\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U5275> \xC1\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U527D> \xD1\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U527F> \xD1\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5283> \xB3\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U5287> \xB7\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U5288> \xD1\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U5289> \xCE\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U528D> \xD1\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U5291> \xD1\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U5292> \xD1\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5294> \xD1\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U529B> \xCE\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U529C> \xF9\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U529F> \xB8\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U52A0> \xB2\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U52A3> \xCE\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U52A6> \xF9\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U52A9> \xBD\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U52AA> \xC5\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U52AB> \xB9\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U52AC> \xD2\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U52AD> \xD2\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U52AF> \xFB\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U52B1> \xCE\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U52B4> \xCF\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U52B5> \xD2\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U52B9> \xB8\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U52BC> \xD2\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U52BE> \xB3\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U52C0> \xF9\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U52C1> \xD2\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U52C3> \xCB\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U52C5> \xC4\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U52C7> \xCD\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U52C9> \xCA\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U52CD> \xD2\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U52D2> \xF0\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U52D5> \xC6\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U52D7> \xD2\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U52D8> \xB4\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U52D9> \xCC\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U52DB> \xF9\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U52DD> \xBE\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U52DE> \xD2\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U52DF> \xCA\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U52E0> \xD2\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U52E2> \xC0\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U52E3> \xD2\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U52E4> \xB6\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U52E6> \xD2\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U52E7> \xB4\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U52F2> \xB7\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U52F3> \xD2\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U52F5> \xD2\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U52F8> \xD2\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U52F9> \xD2\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U52FA> \xBC\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U52FE> \xB8\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U52FF> \xCC\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U5300> \xF9\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U5301> \xCC\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U5302> \xC6\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U5305> \xCA\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5306> \xD2\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5307> \xF9\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U5308> \xD2\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U530D> \xD2\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U530F> \xD2\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U5310> \xD2\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U5315> \xD2\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U5316> \xB2\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5317> \xCB\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U5319> \xBA\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U531A> \xD2\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U531D> \xC1\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U5320> \xBE\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U5321> \xB6\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U5323> \xD2\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5324> \xF9\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U532A> \xC8\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U532F> \xD2\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5331> \xD2\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U5333> \xD2\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5338> \xD2\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U5339> \xC9\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U533A> \xB6\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U533B> \xB0\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U533F> \xC6\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U5340> \xD2\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U5341> \xBD\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5343> \xC0\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U5345> \xD2\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U5346> \xD2\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U5347> \xBE\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U5348> \xB8\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U5349> \xD2\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U534A> \xC8\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U534D> \xD2\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U5351> \xC8\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U5352> \xC2\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U5353> \xC2\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5354> \xB6\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U5357> \xC6\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5358> \xC3\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U535A> \xC7\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U535C> \xCB\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U535E> \xD2\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5360> \xC0\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U5366> \xB7\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U5369> \xD2\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U536E> \xD2\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U536F> \xB1\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5370> \xB0\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5371> \xB4\xED |0 # CJK UNIFIED IDEOGRAPH
+<U5372> \xF9\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U5373> \xC2\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U5374> \xB5\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U5375> \xCD\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5377> \xD2\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U5378> \xB2\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U537B> \xD2\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U537F> \xB6\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U5382> \xD2\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U5384> \xCC\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5393> \xF9\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U5396> \xD2\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U5398> \xCE\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U539A> \xB8\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U539F> \xB8\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U53A0> \xD2\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U53A5> \xD2\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U53A6> \xD2\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U53A8> \xBF\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U53A9> \xB1\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U53AD> \xB1\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U53AE> \xD2\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U53B0> \xD2\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U53B2> \xF9\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U53B3> \xB8\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U53B6> \xD2\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U53BB> \xB5\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U53C2> \xBB\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U53C3> \xD2\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U53C8> \xCB\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U53C9> \xBA\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U53CA> \xB5\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U53CB> \xCD\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U53CC> \xC1\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U53CD> \xC8\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U53CE> \xBC\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U53D4> \xBD\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U53D6> \xBC\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U53D7> \xBC\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U53D9> \xBD\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U53DB> \xC8\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U53DD> \xF9\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U53DF> \xD2\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U53E1> \xB1\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U53E2> \xC1\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U53E3> \xB8\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U53E4> \xB8\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U53E5> \xB6\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U53E8> \xD2\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U53E9> \xC3\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U53EA> \xC2\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U53EB> \xB6\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U53EC> \xBE\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U53ED> \xD2\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U53EE> \xD2\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U53EF> \xB2\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U53F0> \xC2\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U53F1> \xBC\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U53F2> \xBB\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U53F3> \xB1\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U53F6> \xB3\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U53F7> \xB9\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U53F8> \xBB\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U53FA> \xD2\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U5401> \xD2\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U5403> \xB5\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5404> \xB3\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5408> \xB9\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U5409> \xB5\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U540A> \xC4\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U540B> \xB1\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U540C> \xC6\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U540D> \xCC\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U540E> \xB9\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U540F> \xCD\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U5410> \xC5\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U5411> \xB8\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U541B> \xB7\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U541D> \xD2\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U541F> \xB6\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U5420> \xCB\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U5426> \xC8\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U5429> \xD2\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U542B> \xB4\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U542C> \xD2\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U542D> \xD2\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U542E> \xD2\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5436> \xD2\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U5438> \xB5\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U5439> \xBF\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U543B> \xCA\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U543C> \xD2\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U543D> \xD2\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U543E> \xB8\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U5440> \xD2\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U5442> \xCF\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U5446> \xCA\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U5448> \xC4\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U5449> \xB8\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U544A> \xB9\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U544E> \xD2\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U5451> \xC6\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U545F> \xD2\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U5468> \xBC\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U546A> \xBC\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5470> \xD2\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5471> \xD2\xED |0 # CJK UNIFIED IDEOGRAPH
+<U5473> \xCC\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U5475> \xD2\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U5476> \xD2\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U5477> \xD2\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U547B> \xD2\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U547C> \xB8\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U547D> \xCC\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U5480> \xD2\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U5484> \xD2\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U5486> \xD2\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U548A> \xF9\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U548B> \xBA\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U548C> \xCF\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U548E> \xD2\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U548F> \xD2\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U5490> \xD2\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5492> \xD2\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U549C> \xF9\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U54A2> \xD2\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U54A4> \xD3\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U54A5> \xD2\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U54A8> \xD2\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U54A9> \xF9\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U54AB> \xD3\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U54AC> \xD2\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U54AF> \xD3\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U54B2> \xBA\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U54B3> \xB3\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U54B8> \xD2\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U54BC> \xD3\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U54BD> \xB0\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U54BE> \xD3\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U54C0> \xB0\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U54C1> \xC9\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U54C2> \xD3\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U54C4> \xD2\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U54C7> \xD2\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U54C8> \xD2\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U54C9> \xBA\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U54D8> \xD3\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U54E1> \xB0\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U54E2> \xD3\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U54E5> \xD3\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U54E6> \xD3\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U54E8> \xBE\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U54E9> \xCB\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U54ED> \xD3\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U54EE> \xD3\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U54F2> \xC5\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U54FA> \xD3\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U54FD> \xD3\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U54FF> \xF9\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U5504> \xB1\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U5506> \xBA\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U5507> \xBF\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U550F> \xD3\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U5510> \xC5\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U5514> \xD3\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U5516> \xB0\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U552E> \xD3\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U552F> \xCD\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U5531> \xBE\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U5533> \xD3\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5538> \xD3\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5539> \xD3\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U553E> \xC2\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U5540> \xD3\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U5544> \xC2\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5545> \xD3\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U5546> \xBE\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U554C> \xD3\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U554F> \xCC\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5553> \xB7\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U5556> \xD3\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U5557> \xD3\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U555C> \xD3\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U555D> \xD3\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5563> \xD3\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U557B> \xD3\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U557C> \xD3\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U557E> \xD3\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U5580> \xD3\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5583> \xD3\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U5584> \xC1\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U5586> \xF9\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U5587> \xD3\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5589> \xB9\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U558A> \xD3\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U558B> \xC3\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U5598> \xD3\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U5599> \xD3\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U559A> \xB4\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U559C> \xB4\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U559D> \xB3\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U559E> \xD3\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U559F> \xD3\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U55A7> \xB7\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U55A8> \xD3\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U55A9> \xD3\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U55AA> \xC1\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U55AB> \xB5\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U55AC> \xB6\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U55AE> \xD3\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U55B0> \xB6\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U55B6> \xB1\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U55C4> \xD3\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U55C5> \xD3\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U55C7> \xD4\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U55D4> \xD3\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U55DA> \xD3\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U55DC> \xD3\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U55DF> \xD3\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U55E3> \xBB\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U55E4> \xD3\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U55F7> \xD3\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U55F9> \xD3\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U55FD> \xD3\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U55FE> \xD3\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U5606> \xC3\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5609> \xB2\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U5614> \xD3\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5616> \xD3\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U5617> \xBE\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U5618> \xB1\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U561B> \xD3\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U5629> \xB2\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U562F> \xD3\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U5631> \xBE\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U5632> \xD3\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U5634> \xD3\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U5636> \xD3\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U5638> \xD3\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U5642> \xB1\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U564C> \xC1\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U564E> \xD3\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U5650> \xD3\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U565B> \xB3\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5664> \xD3\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U5668> \xB4\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U566A> \xD3\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U566B> \xD3\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U566C> \xD3\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U5674> \xCA\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U5678> \xC6\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U567A> \xC8\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U5680> \xD3\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5686> \xD3\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U5687> \xB3\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U568A> \xD3\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U568F> \xD3\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U5694> \xD3\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U56A0> \xD3\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U56A2> \xC7\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U56A5> \xD3\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U56AE> \xD3\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U56B4> \xD3\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U56B6> \xD3\xED |0 # CJK UNIFIED IDEOGRAPH
+<U56BC> \xD3\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U56C0> \xD3\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U56C1> \xD3\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U56C2> \xD3\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U56C3> \xD3\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U56C8> \xD3\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U56CE> \xD3\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U56D1> \xD3\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U56D3> \xD3\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U56D7> \xD3\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U56D8> \xD1\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U56DA> \xBC\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U56DB> \xBB\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U56DE> \xB2\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U56E0> \xB0\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U56E3> \xC3\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U56EE> \xD3\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U56F0> \xBA\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U56F2> \xB0\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U56F3> \xBF\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U56F9> \xD3\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U56FA> \xB8\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U56FD> \xB9\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U56FF> \xD3\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U5700> \xD3\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U5703> \xCA\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U5704> \xD3\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U5708> \xD4\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U5709> \xD3\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U570B> \xD4\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U570D> \xD4\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U570F> \xB7\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U5712> \xB1\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U5713> \xD4\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U5716> \xD4\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U5718> \xD4\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U571C> \xD4\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U571F> \xC5\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U5726> \xD4\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U5727> \xB0\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U5728> \xBA\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U572D> \xB7\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5730> \xC3\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U5737> \xD4\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U5738> \xD4\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U573B> \xD4\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U5740> \xD4\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U5742> \xBA\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5747> \xB6\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U574A> \xCB\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U574E> \xD4\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U574F> \xD4\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U5750> \xBA\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U5751> \xB9\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U5759> \xF9\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U5761> \xD4\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5764> \xBA\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U5765> \xF9\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U5766> \xC3\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5769> \xD4\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U576A> \xC4\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U577F> \xD4\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U5782> \xBF\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U5788> \xD4\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5789> \xD4\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U578B> \xB7\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U5793> \xD4\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U57A0> \xD4\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U57A2> \xB9\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U57A3> \xB3\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U57A4> \xD4\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U57AA> \xD4\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U57AC> \xF9\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U57B0> \xD4\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U57B3> \xD4\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U57C0> \xD4\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U57C3> \xD4\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U57C6> \xD4\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U57C7> \xF9\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U57C8> \xF9\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U57CB> \xCB\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U57CE> \xBE\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U57D2> \xD4\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U57D3> \xD4\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U57D4> \xD4\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U57D6> \xD4\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U57DC> \xC7\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U57DF> \xB0\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U57E0> \xC9\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U57E3> \xD4\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U57F4> \xBE\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U57F7> \xBC\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U57F9> \xC7\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U57FA> \xB4\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U57FC> \xBA\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U5800> \xCB\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U5802> \xC6\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5805> \xB7\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U5806> \xC2\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U580A> \xD4\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U580B> \xD4\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U5815> \xC2\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U5819> \xD4\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U581D> \xD4\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5821> \xD4\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U5824> \xC4\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U582A> \xB4\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U582F> \xF4\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U5830> \xB1\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U5831> \xCA\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U5834> \xBE\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U5835> \xC5\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U583A> \xBA\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U583D> \xD4\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U5840> \xCA\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5841> \xCE\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U584A> \xB2\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U584B> \xD4\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U5851> \xC1\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5852> \xD4\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U5854> \xC5\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U5857> \xC5\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5858> \xC5\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5859> \xC8\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U585A> \xC4\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U585E> \xBA\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5862> \xD4\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5869> \xB1\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U586B> \xC5\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U5870> \xD4\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U5872> \xD4\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U5875> \xBF\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U5879> \xD4\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U587E> \xBD\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U5883> \xB6\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U5885> \xD4\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U5893> \xCA\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U5897> \xC1\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U589C> \xC4\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U589E> \xF9\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U589F> \xD4\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U58A8> \xCB\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U58AB> \xD4\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U58AE> \xD4\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U58B2> \xF9\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U58B3> \xCA\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U58B8> \xD4\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U58B9> \xD4\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U58BA> \xD4\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U58BB> \xD4\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U58BE> \xBA\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U58C1> \xCA\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U58C5> \xD4\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U58C7> \xC3\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U58CA> \xB2\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U58CC> \xBE\xED |0 # CJK UNIFIED IDEOGRAPH
+<U58D1> \xD4\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U58D3> \xD4\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U58D5> \xB9\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U58D7> \xD4\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U58D8> \xD4\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U58D9> \xD4\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U58DC> \xD4\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U58DE> \xD4\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U58DF> \xD4\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U58E4> \xD4\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U58E5> \xD4\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U58EB> \xBB\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U58EC> \xBF\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U58EE> \xC1\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U58EF> \xD4\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U58F0> \xC0\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U58F1> \xB0\xED |0 # CJK UNIFIED IDEOGRAPH
+<U58F2> \xC7\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U58F7> \xC4\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U58F9> \xD4\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U58FA> \xD4\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U58FB> \xD4\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U58FC> \xD4\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U58FD> \xD4\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U5902> \xD4\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U5909> \xCA\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U590A> \xD4\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U590B> \xF9\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U590F> \xB2\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5910> \xD4\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U5915> \xCD\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U5916> \xB3\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5918> \xD2\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5919> \xBD\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U591A> \xC2\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U591B> \xD4\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U591C> \xCC\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U5922> \xCC\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U5925> \xD4\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5927> \xC2\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U5929> \xC5\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U592A> \xC2\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U592B> \xC9\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U592C> \xD4\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U592D> \xD4\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U592E> \xB1\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U5931> \xBC\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5932> \xD4\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5937> \xB0\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U5938> \xD4\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U593E> \xD4\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U5944> \xB1\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U5947> \xB4\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5948> \xC6\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U5949> \xCA\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U594E> \xD4\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U594F> \xC1\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U5950> \xD4\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5951> \xB7\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U5953> \xF9\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5954> \xCB\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U5955> \xD4\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5957> \xC5\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U5958> \xD4\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U595A> \xD4\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U595B> \xF9\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U595D> \xF9\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5960> \xD4\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U5962> \xD4\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5963> \xF9\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U5965> \xB1\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U5967> \xD4\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U5968> \xBE\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U5969> \xD4\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U596A> \xC3\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U596C> \xD4\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U596E> \xCA\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5973> \xBD\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U5974> \xC5\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U5978> \xD5\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U597D> \xB9\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U5981> \xD5\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U5982> \xC7\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U5983> \xC8\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U5984> \xCC\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U598A> \xC7\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U598D> \xD5\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U5993> \xB5\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U5996> \xCD\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U5999> \xCC\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U599B> \xD6\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U599D> \xD5\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U59A3> \xD5\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U59A4> \xF9\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U59A5> \xC2\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U59A8> \xCB\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U59AC> \xC5\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U59B2> \xD5\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U59B9> \xCB\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U59BA> \xF9\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U59BB> \xBA\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U59BE> \xBE\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U59C6> \xD5\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U59C9> \xBB\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U59CB> \xBB\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U59D0> \xB0\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U59D1> \xB8\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U59D3> \xC0\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U59D4> \xB0\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U59D9> \xD5\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U59DA> \xD5\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U59DC> \xD5\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U59E5> \xB1\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U59E6> \xB4\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U59E8> \xD5\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U59EA> \xCC\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U59EB> \xC9\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U59F6> \xB0\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U59FB> \xB0\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U59FF> \xBB\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U5A01> \xB0\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5A03> \xB0\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U5A09> \xD5\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5A11> \xD5\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5A18> \xCC\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U5A1A> \xD5\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5A1C> \xD5\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U5A1F> \xD5\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U5A20> \xBF\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U5A25> \xD5\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U5A29> \xCA\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U5A2F> \xB8\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5A35> \xD5\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U5A36> \xD5\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U5A3C> \xBE\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U5A40> \xD5\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U5A41> \xCF\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5A46> \xC7\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U5A49> \xD5\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U5A5A> \xBA\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U5A62> \xD5\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5A66> \xC9\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U5A6A> \xD5\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5A6C> \xD5\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U5A7F> \xCC\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5A92> \xC7\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U5A9A> \xD5\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5A9B> \xC9\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5ABC> \xD5\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U5ABD> \xD5\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U5ABE> \xD5\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5AC1> \xB2\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U5AC2> \xD5\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U5AC9> \xBC\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5ACB> \xD5\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U5ACC> \xB7\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U5AD0> \xD5\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U5AD6> \xD5\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U5AD7> \xD5\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U5AE1> \xC3\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5AE3> \xD5\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U5AE6> \xD5\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U5AE9> \xD5\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U5AFA> \xD5\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5AFB> \xD5\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U5B09> \xB4\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U5B0B> \xD5\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5B0C> \xD5\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U5B16> \xD5\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U5B22> \xBE\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5B2A> \xD5\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U5B2C> \xC4\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U5B30> \xB1\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U5B32> \xD5\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U5B36> \xD5\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U5B3E> \xD5\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U5B40> \xD5\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5B43> \xD5\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U5B45> \xD5\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U5B50> \xBB\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5B51> \xD5\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U5B54> \xB9\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U5B55> \xD5\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U5B56> \xF9\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U5B57> \xBB\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5B58> \xC2\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U5B5A> \xD5\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U5B5B> \xD5\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U5B5C> \xBB\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U5B5D> \xB9\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U5B5F> \xCC\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5B63> \xB5\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U5B64> \xB8\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5B65> \xD5\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U5B66> \xB3\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U5B69> \xD5\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U5B6B> \xC2\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5B70> \xD5\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U5B71> \xD6\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U5B73> \xD5\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U5B75> \xD5\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U5B78> \xD5\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U5B7A> \xD5\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U5B80> \xD5\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U5B83> \xD5\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U5B85> \xC2\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U5B87> \xB1\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U5B88> \xBC\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U5B89> \xB0\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U5B8B> \xC1\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U5B8C> \xB4\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5B8D> \xBC\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U5B8F> \xB9\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U5B95> \xC5\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5B97> \xBD\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U5B98> \xB4\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U5B99> \xC3\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U5B9A> \xC4\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U5B9B> \xB0\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U5B9C> \xB5\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5B9D> \xCA\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5B9F> \xBC\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U5BA2> \xB5\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5BA3> \xC0\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U5BA4> \xBC\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U5BA5> \xCD\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U5BA6> \xD5\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U5BAE> \xB5\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U5BB0> \xBA\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U5BB3> \xB3\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5BB4> \xB1\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U5BB5> \xBE\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5BB6> \xB2\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U5BB8> \xD5\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U5BB9> \xCD\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5BBF> \xBD\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5BC0> \xF9\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U5BC2> \xBC\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5BC3> \xD5\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U5BC4> \xB4\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U5BC5> \xC6\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5BC6> \xCC\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U5BC7> \xD5\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5BC9> \xD5\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U5BCC> \xC9\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U5BD0> \xD5\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U5BD2> \xB4\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U5BD3> \xB6\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U5BD4> \xD5\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5BD8> \xF9\xED |0 # CJK UNIFIED IDEOGRAPH
+<U5BDB> \xB4\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5BDD> \xBF\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5BDE> \xD5\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U5BDF> \xBB\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U5BE1> \xB2\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5BE2> \xD5\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U5BE4> \xD5\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U5BE5> \xD5\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U5BE6> \xD5\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U5BE7> \xC7\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U5BE8> \xDC\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U5BE9> \xBF\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5BEB> \xD5\xED |0 # CJK UNIFIED IDEOGRAPH
+<U5BEC> \xF9\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5BEE> \xCE\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U5BF0> \xD5\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5BF3> \xD5\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U5BF5> \xC3\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U5BF6> \xD5\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5BF8> \xC0\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U5BFA> \xBB\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U5BFE> \xC2\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U5BFF> \xBC\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U5C01> \xC9\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5C02> \xC0\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U5C04> \xBC\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U5C05> \xD5\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5C06> \xBE\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U5C07> \xD5\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U5C08> \xD5\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U5C09> \xB0\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U5C0A> \xC2\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5C0B> \xBF\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5C0D> \xD5\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U5C0E> \xC6\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5C0F> \xBE\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U5C11> \xBE\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U5C13> \xD5\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5C16> \xC0\xED |0 # CJK UNIFIED IDEOGRAPH
+<U5C1A> \xBE\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5C1E> \xF9\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5C20> \xD5\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5C22> \xD5\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U5C24> \xCC\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U5C28> \xD5\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U5C2D> \xB6\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5C31> \xBD\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U5C38> \xD5\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U5C39> \xD5\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5C3A> \xBC\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U5C3B> \xBF\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5C3C> \xC6\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U5C3D> \xBF\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U5C3E> \xC8\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U5C3F> \xC7\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U5C40> \xB6\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5C41> \xD5\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U5C45> \xB5\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5C46> \xD5\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U5C48> \xB6\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U5C4A> \xC6\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U5C4B> \xB2\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5C4D> \xBB\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U5C4E> \xD5\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U5C4F> \xD6\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U5C50> \xD6\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U5C51> \xB6\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U5C53> \xD5\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U5C55> \xC5\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U5C5E> \xC2\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5C60> \xC5\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U5C61> \xBC\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U5C64> \xC1\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U5C65> \xCD\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5C6C> \xD6\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U5C6E> \xD6\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U5C6F> \xC6\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U5C71> \xBB\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5C76> \xD6\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U5C79> \xD6\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U5C8C> \xD6\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U5C90> \xB4\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U5C91> \xD6\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U5C94> \xD6\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U5CA1> \xB2\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5CA6> \xF9\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U5CA8> \xC1\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5CA9> \xB4\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5CAB> \xD6\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U5CAC> \xCC\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U5CB1> \xC2\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5CB3> \xB3\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U5CB6> \xD6\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U5CB7> \xD6\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U5CB8> \xB4\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U5CBA> \xF9\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5CBB> \xD6\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U5CBC> \xD6\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5CBE> \xD6\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5CC5> \xD6\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5CC7> \xD6\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U5CD9> \xD6\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U5CE0> \xC6\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5CE1> \xB6\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U5CE8> \xB2\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U5CE9> \xD6\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U5CEA> \xD6\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5CED> \xD6\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5CEF> \xCA\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U5CF0> \xCA\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5CF5> \xF9\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U5CF6> \xC5\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U5CFA> \xD6\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U5CFB> \xBD\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U5CFD> \xD6\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U5D07> \xBF\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U5D0B> \xD6\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U5D0E> \xBA\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U5D11> \xD6\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U5D14> \xD6\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U5D15> \xD6\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5D16> \xB3\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5D17> \xD6\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U5D18> \xD6\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U5D19> \xD6\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5D1A> \xD6\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U5D1B> \xD6\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U5D1F> \xD6\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U5D22> \xD6\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U5D27> \xF9\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U5D29> \xCA\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U5D42> \xF9\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5D4B> \xD6\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U5D4C> \xD6\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U5D4E> \xD6\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U5D50> \xCD\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U5D52> \xD6\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5D53> \xF9\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U5D5C> \xD6\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U5D69> \xBF\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U5D6C> \xD6\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U5D6D> \xF9\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U5D6F> \xBA\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U5D73> \xD6\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U5D76> \xD6\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U5D82> \xD6\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U5D84> \xD6\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U5D87> \xD6\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U5D8B> \xC5\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U5D8C> \xD6\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5D90> \xD6\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U5D9D> \xD6\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U5DA2> \xD6\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5DAC> \xD6\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U5DAE> \xD6\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U5DB7> \xD6\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U5DB8> \xF9\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U5DB9> \xF9\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U5DBA> \xCE\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5DBC> \xD6\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U5DBD> \xD6\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U5DC9> \xD6\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U5DCC> \xB4\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U5DCD> \xD6\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U5DD0> \xF9\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5DD2> \xD6\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U5DD3> \xD6\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U5DD6> \xD6\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U5DDB> \xD6\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U5DDD> \xC0\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5DDE> \xBD\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U5DE1> \xBD\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5DE3> \xC1\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U5DE5> \xB9\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U5DE6> \xBA\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U5DE7> \xB9\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U5DE8> \xB5\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U5DEB> \xD6\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U5DEE> \xBA\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5DF1> \xB8\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U5DF2> \xD6\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U5DF3> \xCC\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U5DF4> \xC7\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U5DF5> \xD6\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U5DF7> \xB9\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U5DFB> \xB4\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5DFD> \xC3\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U5DFE> \xB6\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5E02> \xBB\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U5E03> \xC9\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U5E06> \xC8\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U5E0B> \xD6\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U5E0C> \xB4\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5E11> \xD6\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5E16> \xC4\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U5E19> \xD6\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U5E1A> \xD6\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5E1B> \xD6\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U5E1D> \xC4\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U5E25> \xBF\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U5E2B> \xBB\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U5E2D> \xC0\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U5E2F> \xC2\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U5E30> \xB5\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U5E33> \xC4\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U5E36> \xD6\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U5E37> \xD6\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U5E38> \xBE\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5E3D> \xCB\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5E40> \xD6\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U5E43> \xD6\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U5E44> \xD6\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U5E45> \xC9\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U5E47> \xD6\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U5E4C> \xCB\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U5E4E> \xD6\xED |0 # CJK UNIFIED IDEOGRAPH
+<U5E54> \xD6\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5E55> \xCB\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U5E57> \xD6\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5E5F> \xD6\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U5E61> \xC8\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U5E62> \xD6\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U5E63> \xCA\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U5E64> \xD6\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U5E72> \xB4\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5E73> \xCA\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U5E74> \xC7\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U5E75> \xD6\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U5E76> \xD6\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5E78> \xB9\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5E79> \xB4\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U5E7A> \xD6\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5E7B> \xB8\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U5E7C> \xCD\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U5E7D> \xCD\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U5E7E> \xB4\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5E7F> \xD6\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U5E81> \xC4\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U5E83> \xB9\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U5E84> \xBE\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U5E87> \xC8\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U5E8A> \xBE\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5E8F> \xBD\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U5E95> \xC4\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U5E96> \xCA\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U5E97> \xC5\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5E9A> \xB9\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U5E9C> \xC9\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U5EA0> \xD6\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U5EA6> \xC5\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U5EA7> \xBA\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U5EAB> \xB8\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U5EAD> \xC4\xED |0 # CJK UNIFIED IDEOGRAPH
+<U5EB5> \xB0\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U5EB6> \xBD\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5EB7> \xB9\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U5EB8> \xCD\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U5EC1> \xD6\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5EC2> \xD6\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U5EC3> \xC7\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U5EC8> \xD6\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U5EC9> \xCE\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U5ECA> \xCF\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U5ECF> \xD6\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U5ED0> \xD6\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U5ED3> \xB3\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U5ED6> \xD7\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U5EDA> \xD7\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U5EDB> \xD7\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U5EDD> \xD7\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U5EDF> \xC9\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U5EE0> \xBE\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5EE1> \xD7\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U5EE2> \xD7\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U5EE3> \xD7\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U5EE8> \xD7\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U5EE9> \xD7\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U5EEC> \xD7\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U5EF0> \xD7\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U5EF1> \xD7\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U5EF3> \xD7\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5EF4> \xD7\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U5EF6> \xB1\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U5EF7> \xC4\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U5EF8> \xD7\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U5EFA> \xB7\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5EFB> \xB2\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5EFC> \xC7\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U5EFE> \xD7\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5EFF> \xC6\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U5F01> \xCA\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U5F03> \xD7\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U5F04> \xCF\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U5F09> \xD7\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U5F0A> \xCA\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U5F0B> \xD7\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U5F0C> \xD0\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U5F0D> \xD0\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U5F0F> \xBC\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5F10> \xC6\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U5F11> \xD7\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U5F13> \xB5\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U5F14> \xC4\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U5F15> \xB0\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5F16> \xD7\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U5F17> \xCA\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U5F18> \xB9\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5F1B> \xC3\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U5F1F> \xC4\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5F21> \xF9\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U5F25> \xCC\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U5F26> \xB8\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5F27> \xB8\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U5F29> \xD7\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U5F2D> \xD7\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U5F2F> \xD7\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U5F31> \xBC\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U5F34> \xF9\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U5F35> \xC4\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U5F37> \xB6\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U5F38> \xD7\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5F3C> \xC9\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U5F3E> \xC3\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5F41> \xD7\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5F45> \xF9\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5F48> \xD7\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U5F4A> \xB6\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5F4C> \xD7\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U5F4E> \xD7\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U5F51> \xD7\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U5F53> \xC5\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U5F56> \xD7\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U5F57> \xD7\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U5F59> \xD7\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U5F5C> \xD7\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U5F5D> \xD7\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U5F61> \xD7\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U5F62> \xB7\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U5F66> \xC9\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U5F67> \xF9\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U5F69> \xBA\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U5F6A> \xC9\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U5F6B> \xC4\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U5F6C> \xC9\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U5F6D> \xD7\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U5F70> \xBE\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U5F71> \xB1\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5F73> \xD7\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U5F77> \xD7\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U5F79> \xCC\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U5F7C> \xC8\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U5F7F> \xD7\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U5F80> \xB1\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U5F81> \xC0\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5F82> \xD7\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U5F83> \xD7\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U5F84> \xB7\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U5F85> \xC2\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U5F87> \xD7\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U5F88> \xD7\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U5F8A> \xD7\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U5F8B> \xCE\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U5F8C> \xB8\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U5F90> \xBD\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U5F91> \xD7\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U5F92> \xC5\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U5F93> \xBD\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U5F97> \xC6\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U5F98> \xD7\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U5F99> \xD7\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U5F9E> \xD7\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U5FA0> \xD7\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U5FA1> \xB8\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U5FA8> \xD7\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U5FA9> \xC9\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U5FAA> \xBD\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U5FAD> \xD7\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U5FAE> \xC8\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U5FB3> \xC6\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U5FB4> \xC4\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U5FB7> \xF9\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U5FB9> \xC5\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5FBC> \xD7\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U5FBD> \xB5\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U5FC3> \xBF\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U5FC5> \xC9\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U5FCC> \xB4\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U5FCD> \xC7\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U5FD6> \xD7\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U5FD7> \xBB\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U5FD8> \xCB\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U5FD9> \xCB\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U5FDC> \xB1\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U5FDD> \xD7\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U5FDE> \xFA\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U5FE0> \xC3\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U5FE4> \xD7\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U5FEB> \xB2\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U5FF0> \xD8\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U5FF1> \xD7\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U5FF5> \xC7\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U5FF8> \xD7\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U5FFB> \xD7\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U5FFD> \xB9\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U5FFF> \xD7\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U600E> \xD7\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U600F> \xD7\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6010> \xD7\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6012> \xC5\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U6015> \xD7\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U6016> \xC9\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6019> \xD7\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U601B> \xD7\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U601C> \xCE\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U601D> \xBB\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U6020> \xC2\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U6021> \xD7\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6025> \xB5\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6026> \xD7\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U6027> \xC0\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U6028> \xB1\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U6029> \xD7\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U602A> \xB2\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U602B> \xD7\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U602F> \xB6\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U6031> \xD7\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U603A> \xD7\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6041> \xD7\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U6042> \xD7\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U6043> \xD7\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6046> \xD7\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U604A> \xD7\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U604B> \xCE\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U604D> \xD7\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6050> \xB6\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U6052> \xB9\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U6055> \xBD\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U6059> \xD7\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U605A> \xD7\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U605D> \xFA\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U605F> \xD7\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U6060> \xD7\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U6062> \xB2\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U6063> \xD7\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6064> \xD7\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U6065> \xC3\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U6068> \xBA\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U6069> \xB2\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U606A> \xD7\xED |0 # CJK UNIFIED IDEOGRAPH
+<U606B> \xD7\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U606C> \xD7\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U606D> \xB6\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U606F> \xC2\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U6070> \xB3\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U6075> \xB7\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U6077> \xD7\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U6081> \xD7\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U6083> \xD7\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U6084> \xD8\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U6085> \xFA\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U6089> \xBC\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U608A> \xFA\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U608B> \xD8\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U608C> \xC4\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U608D> \xD7\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U6092> \xD8\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U6094> \xB2\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U6096> \xD8\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U6097> \xD8\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U609A> \xD7\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U609B> \xD8\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U609F> \xB8\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U60A0> \xCD\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U60A3> \xB4\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U60A6> \xB1\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U60A7> \xD8\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U60A9> \xC7\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U60AA> \xB0\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U60B2> \xC8\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U60B3> \xD7\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U60B4> \xD8\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U60B5> \xD8\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U60B6> \xCC\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U60B8> \xD8\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U60BC> \xC5\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U60BD> \xD8\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U60C5> \xBE\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U60C6> \xD8\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U60C7> \xC6\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U60D1> \xCF\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U60D3> \xD8\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U60D5> \xFA\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U60D8> \xD8\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U60DA> \xB9\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U60DC> \xC0\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U60DE> \xFA\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U60DF> \xB0\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U60E0> \xD8\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U60E1> \xD8\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U60E3> \xC1\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U60E7> \xD7\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U60E8> \xBB\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U60F0> \xC2\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U60F1> \xD8\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U60F2> \xFA\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U60F3> \xC1\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U60F4> \xD8\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U60F6> \xD8\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U60F7> \xD8\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U60F9> \xBC\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U60FA> \xD8\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U60FB> \xD8\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U6100> \xD8\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6101> \xBD\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U6103> \xD8\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6106> \xD8\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U6108> \xCC\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U6109> \xCC\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U610D> \xD8\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U610E> \xD8\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U610F> \xB0\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U6111> \xFA\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U6115> \xD8\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U611A> \xB6\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U611B> \xB0\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U611F> \xB4\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U6120> \xFA\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U6121> \xD8\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U6127> \xD8\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U6128> \xD8\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U612C> \xD8\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U6130> \xFA\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U6134> \xD8\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U6137> \xFA\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U613C> \xD8\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U613D> \xD8\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U613E> \xD8\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U613F> \xD8\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U6142> \xD8\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U6144> \xD8\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6147> \xD8\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U6148> \xBB\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U614A> \xD8\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U614B> \xC2\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U614C> \xB9\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U614D> \xD8\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U614E> \xBF\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U6153> \xD8\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U6155> \xCA\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6158> \xD8\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U6159> \xD8\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U615A> \xD8\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U615D> \xD8\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U615F> \xD8\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U6162> \xCB\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U6163> \xB4\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6165> \xD8\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U6167> \xB7\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U6168> \xB3\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U616B> \xD8\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U616E> \xCE\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U616F> \xD8\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U6170> \xB0\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U6171> \xD8\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U6173> \xD8\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6174> \xD8\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U6175> \xD8\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U6176> \xB7\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U6177> \xD8\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U617E> \xCD\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6182> \xCD\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U6187> \xD8\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U618A> \xD8\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U618E> \xC1\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U6190> \xCE\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U6191> \xD8\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6194> \xD8\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6196> \xD8\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U6198> \xFA\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U6199> \xD8\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U619A> \xD8\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U61A4> \xCA\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U61A7> \xC6\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U61A9> \xB7\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U61AB> \xD8\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U61AC> \xD8\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U61AE> \xD8\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U61B2> \xB7\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U61B6> \xB2\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U61BA> \xD8\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U61BE> \xB4\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U61C3> \xD8\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U61C6> \xD8\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U61C7> \xBA\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U61C8> \xD8\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U61C9> \xD8\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U61CA> \xD8\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U61CB> \xD8\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U61CC> \xD8\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U61CD> \xD8\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U61D0> \xB2\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U61E3> \xD8\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U61E6> \xD8\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U61F2> \xC4\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U61F4> \xD8\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U61F6> \xD8\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U61F7> \xD8\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U61F8> \xB7\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U61FA> \xD8\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U61FC> \xD8\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U61FD> \xD8\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U61FE> \xD8\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U61FF> \xD8\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6200> \xD8\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U6208> \xD8\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U6209> \xD8\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U620A> \xCA\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U620C> \xD8\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U620D> \xD8\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U620E> \xBD\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6210> \xC0\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U6211> \xB2\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U6212> \xB2\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U6213> \xFA\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U6214> \xD8\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U6216> \xB0\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U621A> \xC0\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U621B> \xD8\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U621D> \xEC\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U621E> \xD9\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U621F> \xB7\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6221> \xD9\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U6226> \xC0\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U622A> \xD9\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U622E> \xD9\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U622F> \xB5\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6230> \xD9\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U6232> \xD9\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U6233> \xD9\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U6234> \xC2\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U6238> \xB8\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U623B> \xCC\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U623F> \xCB\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U6240> \xBD\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6241> \xD9\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U6247> \xC0\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U6248> \xEE\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U6249> \xC8\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U624B> \xBC\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U624D> \xBA\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U624E> \xD9\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U6253> \xC2\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U6255> \xCA\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U6258> \xC2\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U625B> \xD9\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U625E> \xD9\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U6260> \xD9\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U6263> \xD9\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U6268> \xD9\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U626E> \xCA\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U6271> \xB0\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6276> \xC9\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6279> \xC8\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U627C> \xD9\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U627E> \xD9\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U627F> \xBE\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U6280> \xB5\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U6282> \xD9\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U6283> \xD9\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6284> \xBE\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U6289> \xD9\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U628A> \xC7\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U6291> \xCD\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6292> \xD9\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U6293> \xD9\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U6294> \xD9\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U6295> \xC5\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6296> \xD9\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U6297> \xB9\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U6298> \xC0\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U629B> \xD9\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U629C> \xC8\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U629E> \xC2\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U62A6> \xFA\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U62AB> \xC8\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U62AC> \xDA\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U62B1> \xCA\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U62B5> \xC4\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U62B9> \xCB\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U62BB> \xD9\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U62BC> \xB2\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U62BD> \xC3\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U62C2> \xD9\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U62C5> \xC3\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U62C6> \xD9\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U62C7> \xD9\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U62C8> \xD9\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U62C9> \xD9\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U62CA> \xD9\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U62CC> \xD9\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U62CD> \xC7\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U62CF> \xD9\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U62D0> \xB2\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U62D1> \xD9\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U62D2> \xB5\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U62D3> \xC2\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U62D4> \xD9\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U62D7> \xD9\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U62D8> \xB9\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U62D9> \xC0\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U62DB> \xBE\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U62DC> \xD9\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U62DD> \xC7\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U62E0> \xB5\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U62E1> \xB3\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U62EC> \xB3\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U62ED> \xBF\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U62EE> \xD9\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U62EF> \xD9\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U62F1> \xD9\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U62F3> \xB7\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U62F5> \xD9\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U62F6> \xBB\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U62F7> \xB9\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U62FE> \xBD\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U62FF> \xD9\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U6301> \xBB\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U6302> \xD9\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6307> \xBB\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U6308> \xD9\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U6309> \xB0\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U630C> \xD9\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U6311> \xC4\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U6319> \xB5\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U631F> \xB6\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U6327> \xD9\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6328> \xB0\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U632B> \xBA\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U632F> \xBF\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U633A> \xC4\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U633D> \xC8\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U633E> \xD9\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U633F> \xC1\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6349> \xC2\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U634C> \xBB\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U634D> \xD9\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U634F> \xD9\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U6350> \xD9\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U6355> \xCA\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6357> \xC4\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U635C> \xC1\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U6367> \xCA\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U6368> \xBC\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U6369> \xD9\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U636B> \xD9\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U636E> \xBF\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U6372> \xB7\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U6376> \xD9\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U6377> \xBE\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U637A> \xC6\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U637B> \xC7\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U6380> \xD9\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U6383> \xC1\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6388> \xBC\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U6389> \xD9\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U638C> \xBE\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U638E> \xD9\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U638F> \xD9\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U6392> \xC7\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U6396> \xD9\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U6398> \xB7\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U639B> \xB3\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U639F> \xD9\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U63A0> \xCE\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U63A1> \xBA\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U63A2> \xC3\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U63A3> \xD9\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U63A5> \xC0\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U63A7> \xB9\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U63A8> \xBF\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U63A9> \xB1\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U63AA> \xC1\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U63AB> \xD9\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U63AC> \xB5\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U63B2> \xB7\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U63B4> \xC4\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U63B5> \xD9\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U63BB> \xC1\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U63BE> \xD9\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U63C0> \xD9\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U63C3> \xC2\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U63C4> \xD9\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U63C6> \xD9\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U63C9> \xD9\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U63CF> \xC9\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U63D0> \xC4\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U63D2> \xD9\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U63D6> \xCD\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U63DA> \xCD\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U63DB> \xB4\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U63E1> \xB0\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U63E3> \xD9\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U63E9> \xD9\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U63EE> \xB4\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U63F4> \xB1\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U63F5> \xFA\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U63F6> \xD9\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U63FA> \xCD\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U6406> \xD9\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U640D> \xC2\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U640F> \xD9\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6413> \xD9\xED |0 # CJK UNIFIED IDEOGRAPH
+<U6416> \xD9\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6417> \xD9\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U641C> \xD9\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U6426> \xD9\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U6428> \xD9\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U642C> \xC8\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U642D> \xC5\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U6434> \xD9\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U6436> \xD9\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U643A> \xB7\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U643E> \xBA\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U6442> \xC0\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U644E> \xD9\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U6458> \xC5\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U6460> \xFA\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U6467> \xD9\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6469> \xCB\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U646F> \xD9\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U6476> \xD9\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U6478> \xCC\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U647A> \xC0\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U6483> \xB7\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U6488> \xD9\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U6492> \xBB\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U6493> \xD9\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U6495> \xD9\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U649A> \xC7\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U649D> \xFA\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U649E> \xC6\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U64A4> \xC5\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U64A5> \xD9\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U64A9> \xD9\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U64AB> \xC9\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U64AD> \xC7\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U64AE> \xBB\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U64B0> \xC0\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U64B2> \xCB\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U64B9> \xB3\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U64BB> \xDA\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U64BC> \xD9\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U64C1> \xCD\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U64C2> \xDA\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U64C5> \xDA\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U64C7> \xDA\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U64CD> \xC1\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U64CE> \xFA\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U64D2> \xDA\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U64D4> \xD9\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U64D8> \xDA\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U64DA> \xDA\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U64E0> \xDA\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U64E1> \xDA\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U64E2> \xC5\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U64E3> \xDA\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U64E6> \xBB\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U64E7> \xDA\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U64EC> \xB5\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U64EF> \xDA\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U64F1> \xDA\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U64F2> \xDA\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U64F4> \xDA\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U64F6> \xDA\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U64FA> \xDA\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U64FD> \xDA\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U64FE> \xBE\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U6500> \xDA\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U6505> \xDA\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U6518> \xDA\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U651C> \xDA\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U651D> \xD9\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U6523> \xDA\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U6524> \xDA\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U652A> \xD9\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U652B> \xDA\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U652C> \xDA\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U652F> \xBB\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U6534> \xDA\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U6535> \xDA\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U6536> \xDA\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U6537> \xDA\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6538> \xDA\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U6539> \xB2\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U653B> \xB9\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U653E> \xCA\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U653F> \xC0\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U6545> \xB8\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U6548> \xDA\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U654D> \xDA\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U654E> \xFA\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U654F> \xC9\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U6551> \xB5\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U6555> \xDA\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U6556> \xDA\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U6557> \xC7\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U6558> \xDA\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U6559> \xB6\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U655D> \xDA\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U655E> \xDA\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U6562> \xB4\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6563> \xBB\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U6566> \xC6\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U656C> \xB7\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U6570> \xBF\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6572> \xDA\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U6574> \xC0\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U6575> \xC5\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U6577> \xC9\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U6578> \xDA\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6582> \xDA\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6583> \xDA\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U6587> \xCA\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U6588> \xD5\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6589> \xC0\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U658C> \xC9\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U658E> \xBA\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U6590> \xC8\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U6591> \xC8\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U6597> \xC5\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U6599> \xCE\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U659B> \xDA\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U659C> \xBC\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U659F> \xDA\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U65A1> \xB0\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U65A4> \xB6\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U65A5> \xC0\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U65A7> \xC9\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U65AB> \xDA\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U65AC> \xBB\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U65AD> \xC3\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U65AF> \xBB\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U65B0> \xBF\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U65B7> \xDA\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U65B9> \xCA\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U65BC> \xB1\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U65BD> \xBB\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U65C1> \xDA\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U65C3> \xDA\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U65C4> \xDA\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U65C5> \xCE\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U65C6> \xDA\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U65CB> \xC0\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U65CC> \xDA\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U65CF> \xC2\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U65D2> \xDA\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U65D7> \xB4\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U65D9> \xDA\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U65DB> \xDA\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U65E0> \xDA\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U65E1> \xDA\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U65E2> \xB4\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U65E5> \xC6\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U65E6> \xC3\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U65E7> \xB5\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U65E8> \xBB\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U65E9> \xC1\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U65EC> \xBD\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U65ED> \xB0\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U65F1> \xDA\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U65FA> \xB2\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U65FB> \xDA\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6600> \xFA\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U6602> \xB9\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6603> \xDA\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U6606> \xBA\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U6607> \xBE\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6609> \xFA\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U660A> \xDA\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U660C> \xBE\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U660E> \xCC\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U660F> \xBA\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U6613> \xB0\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U6614> \xC0\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U6615> \xFA\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U661C> \xDA\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U661E> \xFA\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U661F> \xC0\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U6620> \xB1\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U6624> \xFA\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6625> \xBD\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U6627> \xCB\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U6628> \xBA\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U662D> \xBE\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U662E> \xFA\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U662F> \xC0\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U6631> \xF9\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U6634> \xDA\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U6635> \xDA\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U6636> \xDA\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U663B> \xFA\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U663C> \xC3\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U663F> \xDB\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U6641> \xDA\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6642> \xBB\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U6643> \xB9\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U6644> \xDA\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U6649> \xDA\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U664B> \xBF\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U664F> \xDA\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U6652> \xBB\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U6657> \xFA\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U6659> \xFA\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U665D> \xDA\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U665E> \xDA\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U665F> \xDA\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U6662> \xDA\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U6664> \xDA\xED |0 # CJK UNIFIED IDEOGRAPH
+<U6665> \xFA\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U6666> \xB3\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U6667> \xDA\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U6668> \xDA\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U6669> \xC8\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U666E> \xC9\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U666F> \xB7\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U6670> \xDA\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6673> \xFA\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6674> \xC0\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U6676> \xBE\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U667A> \xC3\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U6681> \xB6\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U6683> \xDA\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6684> \xDA\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U6687> \xB2\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6688> \xDA\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6689> \xDA\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U668E> \xDA\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U6691> \xBD\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U6696> \xC3\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U6697> \xB0\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U6698> \xDA\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U6699> \xFA\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U669D> \xDA\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U66A0> \xFA\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U66A2> \xC4\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U66A6> \xCE\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U66AB> \xBB\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U66AE> \xCA\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U66B2> \xFA\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U66B4> \xCB\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U66B8> \xDB\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U66B9> \xDA\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U66BC> \xDA\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U66BE> \xDA\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U66BF> \xFA\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U66C1> \xDA\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U66C4> \xDB\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U66C7> \xC6\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U66C9> \xDA\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U66D6> \xDB\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U66D9> \xBD\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U66DA> \xDB\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U66DC> \xCD\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U66DD> \xC7\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U66E0> \xDB\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U66E6> \xDB\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U66E9> \xDB\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U66F0> \xDB\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U66F2> \xB6\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U66F3> \xB1\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U66F4> \xB9\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U66F5> \xDB\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U66F7> \xDB\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U66F8> \xBD\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U66F9> \xC1\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U66FA> \xFA\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U66FB> \xF9\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U66FC> \xD2\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U66FD> \xC1\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U66FE> \xC1\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U66FF> \xC2\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U6700> \xBA\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U6703> \xD0\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6708> \xB7\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U6709> \xCD\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U670B> \xCA\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U670D> \xC9\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U670E> \xFA\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U670F> \xDB\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U6714> \xBA\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6715> \xC4\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6716> \xDB\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U6717> \xCF\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U671B> \xCB\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U671D> \xC4\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U671E> \xDB\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U671F> \xB4\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U6726> \xDB\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U6727> \xDB\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U6728> \xCC\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U672A> \xCC\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U672B> \xCB\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U672C> \xCB\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U672D> \xBB\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U672E> \xDB\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U6731> \xBC\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U6734> \xCB\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U6736> \xDB\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U6737> \xDB\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6738> \xDB\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U673A> \xB4\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U673D> \xB5\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U673F> \xDB\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U6741> \xDB\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U6746> \xDB\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U6749> \xBF\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U674E> \xCD\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U674F> \xB0\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U6750> \xBA\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U6751> \xC2\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U6753> \xBC\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6756> \xBE\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6759> \xDB\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U675C> \xC5\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U675E> \xDB\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U675F> \xC2\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U6760> \xDB\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6761> \xBE\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6762> \xCC\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6763> \xDB\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U6764> \xDB\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U6765> \xCD\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U6766> \xFA\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U676A> \xDB\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U676D> \xB9\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U676F> \xC7\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U6770> \xDB\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6771> \xC5\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U6772> \xDA\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6773> \xDA\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U6775> \xB5\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U6777> \xC7\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U677C> \xDB\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U677E> \xBE\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U677F> \xC8\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U6785> \xDB\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U6787> \xC8\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U6789> \xDB\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U678B> \xDB\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U678C> \xDB\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U6790> \xC0\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U6795> \xCB\xED |0 # CJK UNIFIED IDEOGRAPH
+<U6797> \xCE\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U679A> \xCB\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U679C> \xB2\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U679D> \xBB\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U67A0> \xCF\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U67A1> \xDB\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U67A2> \xBF\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U67A6> \xDB\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U67A9> \xDB\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U67AF> \xB8\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U67B3> \xDB\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U67B4> \xDB\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U67B6> \xB2\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U67B7> \xDB\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U67B8> \xDB\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U67B9> \xDB\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U67BB> \xFA\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U67C0> \xFA\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U67C1> \xC2\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U67C4> \xCA\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U67C6> \xDB\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U67CA> \xC9\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U67CE> \xDB\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U67CF> \xC7\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U67D0> \xCB\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U67D1> \xB4\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U67D3> \xC0\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U67D4> \xBD\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U67D8> \xC4\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U67DA> \xCD\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U67DD> \xDB\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U67DE> \xDB\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U67E2> \xDB\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U67E4> \xDB\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U67E7> \xDB\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U67E9> \xDB\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U67EC> \xDB\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U67EE> \xDB\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U67EF> \xDB\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U67F1> \xC3\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U67F3> \xCC\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U67F4> \xBC\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U67F5> \xBA\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U67FB> \xBA\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U67FE> \xCB\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U67FF> \xB3\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U6801> \xFA\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6802> \xC4\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U6803> \xC6\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U6804> \xB1\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U6813> \xC0\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6816> \xC0\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U6817> \xB7\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U681E> \xDB\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U6821> \xB9\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U6822> \xB3\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U6829> \xDB\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U682A> \xB3\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U682B> \xDB\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6832> \xDB\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6834> \xC0\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6838> \xB3\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6839> \xBA\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U683C> \xB3\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U683D> \xBA\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U6840> \xDB\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U6841> \xB7\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U6842> \xB7\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6843> \xC5\xED |0 # CJK UNIFIED IDEOGRAPH
+<U6844> \xFA\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6846> \xDB\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U6848> \xB0\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U684D> \xDB\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U684E> \xDB\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U6850> \xB6\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U6851> \xB7\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U6852> \xFA\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U6853> \xB4\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U6854> \xB5\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6859> \xDB\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U685C> \xBA\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U685D> \xCB\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U685F> \xBB\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6863> \xDB\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U6867> \xC9\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U6874> \xDB\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U6876> \xB2\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U6877> \xDB\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U687E> \xDB\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U687F> \xDB\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U6881> \xCE\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U6883> \xDB\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U6885> \xC7\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U688D> \xDB\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U688F> \xDB\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U6893> \xB0\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U6894> \xDB\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6897> \xB9\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U689B> \xDB\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U689D> \xDB\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U689F> \xDB\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U68A0> \xDB\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U68A2> \xBE\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U68A6> \xD4\xED |0 # CJK UNIFIED IDEOGRAPH
+<U68A7> \xB8\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U68A8> \xCD\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U68AD> \xDB\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U68AF> \xC4\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U68B0> \xB3\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U68B1> \xBA\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U68B3> \xDB\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U68B5> \xDB\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U68B6> \xB3\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U68B9> \xDB\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U68BA> \xDB\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U68BC> \xC5\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U68C4> \xB4\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U68C6> \xDC\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U68C8> \xF9\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U68C9> \xCC\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U68CA> \xDB\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U68CB> \xB4\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U68CD> \xDB\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U68CF> \xFA\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U68D2> \xCB\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U68D4> \xDC\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U68D5> \xDC\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U68D7> \xDC\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U68D8> \xDB\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U68DA> \xC3\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U68DF> \xC5\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U68E0> \xDC\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U68E1> \xDB\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U68E3> \xDC\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U68E7> \xDC\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U68EE> \xBF\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U68EF> \xDC\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U68F2> \xC0\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U68F9> \xDC\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U68FA> \xB4\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U6900> \xCF\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U6901> \xDB\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U6904> \xDC\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U6905> \xB0\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U6908> \xDB\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U690B> \xCC\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U690C> \xDB\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U690D> \xBF\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U690E> \xC4\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U690F> \xDB\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6912> \xDC\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U6919> \xBF\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U691A> \xDC\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U691B> \xB3\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U691C> \xB8\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U6921> \xDC\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U6922> \xDB\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U6923> \xDC\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U6925> \xDC\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U6926> \xDB\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U6928> \xDC\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U692A> \xDC\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U6930> \xDC\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6934> \xC6\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U6936> \xDC\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U6939> \xDC\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U693D> \xDC\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U693F> \xC4\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U694A> \xCD\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6953> \xC9\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U6954> \xDC\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U6955> \xC2\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U6959> \xDC\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U695A> \xC1\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U695C> \xDC\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U695D> \xDC\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U695E> \xDC\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U6960> \xC6\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U6961> \xDC\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U6962> \xC6\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6968> \xFA\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U696A> \xDC\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U696B> \xDC\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U696D> \xB6\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U696E> \xDC\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U696F> \xBD\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6973> \xC7\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U6974> \xDC\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U6975> \xB6\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6977> \xDC\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U6978> \xDC\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U6979> \xDC\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U697C> \xCF\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U697D> \xB3\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U697E> \xDC\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U6981> \xDC\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U6982> \xB3\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U698A> \xBA\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U698E> \xB1\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6991> \xDC\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U6994> \xCF\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U6995> \xDC\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U6998> \xFA\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U699B> \xBF\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U699C> \xDC\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U69A0> \xDC\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U69A7> \xDC\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U69AE> \xDC\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U69B1> \xDC\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U69B2> \xDC\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U69B4> \xDC\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U69BB> \xDC\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U69BE> \xDC\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U69BF> \xDC\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U69C1> \xDC\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U69C3> \xDC\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U69C7> \xF4\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U69CA> \xDC\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U69CB> \xB9\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U69CC> \xC4\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U69CD> \xC1\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U69CE> \xDC\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U69D0> \xDC\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U69D3> \xDC\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U69D8> \xCD\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U69D9> \xCB\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U69DD> \xDC\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U69DE> \xDC\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U69E2> \xFA\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U69E7> \xDC\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U69E8> \xDC\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U69EB> \xDC\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U69ED> \xDC\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U69F2> \xDC\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U69F9> \xDC\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U69FB> \xC4\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U69FD> \xC1\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U69FF> \xDC\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6A02> \xDC\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U6A05> \xDC\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U6A0A> \xDC\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U6A0B> \xC8\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U6A0C> \xDC\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U6A12> \xDC\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6A13> \xDC\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U6A14> \xDC\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U6A17> \xC3\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6A19> \xC9\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U6A1B> \xDC\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U6A1E> \xDC\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U6A1F> \xBE\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U6A21> \xCC\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U6A22> \xDC\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U6A23> \xDC\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U6A29> \xB8\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U6A2A> \xB2\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U6A2B> \xB3\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U6A2E> \xDC\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U6A30> \xFA\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U6A35> \xBE\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U6A36> \xDC\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U6A38> \xDC\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U6A39> \xBC\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U6A3A> \xB3\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6A3D> \xC3\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U6A44> \xDC\xED |0 # CJK UNIFIED IDEOGRAPH
+<U6A46> \xFA\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U6A47> \xDC\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6A48> \xDC\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U6A4B> \xB6\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U6A58> \xB5\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6A59> \xDC\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6A5F> \xB5\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U6A61> \xC6\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6A62> \xDC\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6A66> \xDC\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U6A6B> \xFA\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U6A72> \xDC\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U6A73> \xFA\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U6A78> \xDC\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U6A7E> \xFA\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U6A7F> \xB3\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U6A80> \xC3\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U6A84> \xDC\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U6A8D> \xDC\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U6A8E> \xB8\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6A90> \xDC\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U6A97> \xDD\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U6A9C> \xDB\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U6AA0> \xDC\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U6AA2> \xDC\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U6AA3> \xDC\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U6AAA> \xDD\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U6AAC> \xDD\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U6AAE> \xDB\xED |0 # CJK UNIFIED IDEOGRAPH
+<U6AB3> \xDD\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U6AB8> \xDD\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U6ABB> \xDD\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U6AC1> \xDC\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6AC2> \xDD\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U6AC3> \xDD\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U6AD1> \xDD\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U6AD3> \xCF\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U6ADA> \xDD\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U6ADB> \xB6\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U6ADE> \xDD\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U6ADF> \xDD\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U6AE2> \xFA\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U6AE4> \xFA\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U6AE8> \xC8\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U6AEA> \xDD\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U6AFA> \xDD\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U6AFB> \xDD\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U6B04> \xCD\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6B05> \xDD\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U6B0A> \xDC\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6B12> \xDD\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U6B16> \xDD\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U6B1D> \xB1\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U6B1F> \xDD\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U6B20> \xB7\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U6B21> \xBC\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U6B23> \xB6\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U6B27> \xB2\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U6B32> \xCD\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U6B37> \xDD\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U6B38> \xDD\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6B39> \xDD\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6B3A> \xB5\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U6B3D> \xB6\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U6B3E> \xB4\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U6B43> \xDD\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U6B47> \xDD\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U6B49> \xDD\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U6B4C> \xB2\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U6B4E> \xC3\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6B50> \xDD\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6B53> \xB4\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6B54> \xDD\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U6B59> \xDD\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U6B5B> \xDD\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U6B5F> \xDD\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U6B61> \xDD\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U6B62> \xBB\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U6B63> \xC0\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U6B64> \xBA\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U6B66> \xC9\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U6B69> \xCA\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U6B6A> \xCF\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U6B6F> \xBB\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U6B73> \xBA\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U6B74> \xCE\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6B78> \xDD\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U6B79> \xDD\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U6B7B> \xBB\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U6B7F> \xDD\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U6B80> \xDD\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U6B83> \xDD\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U6B84> \xDD\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U6B86> \xCB\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U6B89> \xBD\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6B8A> \xBC\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U6B8B> \xBB\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U6B8D> \xDD\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6B95> \xDD\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U6B96> \xBF\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U6B98> \xDD\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6B9E> \xDD\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U6BA4> \xDD\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U6BAA> \xDD\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U6BAB> \xDD\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U6BAF> \xDD\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U6BB1> \xDD\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U6BB2> \xDD\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U6BB3> \xDD\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U6BB4> \xB2\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U6BB5> \xC3\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U6BB7> \xDD\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U6BBA> \xBB\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U6BBB> \xB3\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6BBC> \xDD\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U6BBF> \xC5\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U6BC0> \xD4\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6BC5> \xB5\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U6BC6> \xDD\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U6BCB> \xDD\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U6BCD> \xCA\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U6BCE> \xCB\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U6BD2> \xC6\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U6BD3> \xDD\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U6BD4> \xC8\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U6BD6> \xFA\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U6BD8> \xC8\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U6BDB> \xCC\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U6BDF> \xDD\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U6BEB> \xDD\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6BEC> \xDD\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U6BEF> \xDD\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U6BF3> \xDD\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6C08> \xDD\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6C0F> \xBB\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6C11> \xCC\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U6C13> \xDD\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U6C14> \xDD\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U6C17> \xB5\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U6C1B> \xDD\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U6C23> \xDD\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U6C24> \xDD\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U6C34> \xBF\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U6C37> \xC9\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U6C38> \xB1\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U6C3E> \xC8\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U6C3F> \xFA\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U6C40> \xC4\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U6C41> \xBD\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U6C42> \xB5\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6C4E> \xC8\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U6C50> \xBC\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U6C55> \xDD\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U6C57> \xB4\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U6C5A> \xB1\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U6C5C> \xFA\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U6C5D> \xC6\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6C5E> \xDD\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U6C5F> \xB9\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U6C60> \xC3\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U6C62> \xDD\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6C68> \xDD\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U6C6A> \xDD\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6C6F> \xFA\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6C70> \xC2\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U6C72> \xB5\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U6C73> \xDD\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6C7A> \xB7\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U6C7D> \xB5\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U6C7E> \xDD\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U6C81> \xDD\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U6C82> \xDD\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U6C83> \xCD\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U6C86> \xFA\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6C88> \xC4\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U6C8C> \xC6\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U6C8D> \xDD\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U6C90> \xDD\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6C92> \xDD\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6C93> \xB7\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U6C96> \xB2\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U6C99> \xBA\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U6C9A> \xDD\xED |0 # CJK UNIFIED IDEOGRAPH
+<U6C9B> \xDD\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U6CA1> \xCB\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U6CA2> \xC2\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6CAB> \xCB\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U6CAE> \xDD\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U6CB1> \xDD\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U6CB3> \xB2\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U6CB8> \xCA\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U6CB9> \xCC\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U6CBA> \xDE\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U6CBB> \xBC\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U6CBC> \xBE\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U6CBD> \xDD\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U6CBE> \xDD\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U6CBF> \xB1\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U6CC1> \xB6\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6CC4> \xDD\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U6CC5> \xDD\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U6CC9> \xC0\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6CCA> \xC7\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U6CCC> \xC8\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U6CD3> \xDD\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U6CD5> \xCB\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U6CD7> \xDD\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U6CD9> \xDE\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U6CDA> \xFA\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U6CDB> \xDE\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U6CDD> \xDD\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U6CE1> \xCB\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U6CE2> \xC7\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U6CE3> \xB5\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U6CE5> \xC5\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U6CE8> \xC3\xED |0 # CJK UNIFIED IDEOGRAPH
+<U6CEA> \xDE\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U6CEF> \xDE\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U6CF0> \xC2\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U6CF1> \xDD\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U6CF3> \xB1\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6D04> \xFA\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U6D0B> \xCD\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U6D0C> \xDE\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U6D12> \xDE\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U6D17> \xC0\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U6D19> \xDE\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U6D1B> \xCD\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U6D1E> \xC6\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U6D1F> \xDE\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U6D25> \xC4\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U6D29> \xB1\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6D2A> \xB9\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6D2B> \xDE\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U6D32> \xBD\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U6D33> \xDE\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U6D35> \xDE\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U6D36> \xDE\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U6D38> \xDE\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U6D3B> \xB3\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U6D3D> \xDE\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U6D3E> \xC7\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U6D41> \xCE\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U6D44> \xBE\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6D45> \xC0\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U6D59> \xDE\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U6D5A> \xDE\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U6D5C> \xC9\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U6D63> \xDE\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U6D64> \xDE\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U6D66> \xB1\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6D69> \xB9\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U6D6A> \xCF\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U6D6C> \xB3\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U6D6E> \xC9\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U6D6F> \xFA\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U6D74> \xCD\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6D77> \xB3\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U6D78> \xBF\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U6D79> \xDE\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U6D85> \xDE\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6D87> \xFA\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6D88> \xBE\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U6D8C> \xCD\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U6D8E> \xDE\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6D93> \xDE\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U6D95> \xDE\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U6D96> \xFA\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U6D99> \xCE\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6D9B> \xC5\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6D9C> \xC6\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U6DAC> \xFA\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U6DAF> \xB3\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U6DB2> \xB1\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U6DB5> \xDE\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U6DB8> \xDE\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U6DBC> \xCE\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U6DC0> \xCD\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U6DC5> \xDE\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U6DC6> \xDE\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U6DC7> \xDE\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6DCB> \xCE\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U6DCC> \xDE\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U6DCF> \xFA\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U6DD1> \xBD\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U6DD2> \xDE\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U6DD5> \xDE\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6DD8> \xC5\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U6DD9> \xDE\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U6DDE> \xDE\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U6DE1> \xC3\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U6DE4> \xDE\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U6DE6> \xDE\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U6DE8> \xDE\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U6DEA> \xDE\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U6DEB> \xB0\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U6DEC> \xDE\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U6DEE> \xDE\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U6DF1> \xBF\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U6DF2> \xFA\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U6DF3> \xBD\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U6DF5> \xCA\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U6DF7> \xBA\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U6DF8> \xFA\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U6DF9> \xDE\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U6DFA> \xDE\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U6DFB> \xC5\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6DFC> \xFA\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U6E05> \xC0\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U6E07> \xB3\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6E08> \xBA\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U6E09> \xBE\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U6E0A> \xDE\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U6E0B> \xBD\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U6E13> \xB7\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6E15> \xDE\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U6E19> \xDE\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U6E1A> \xBD\xED |0 # CJK UNIFIED IDEOGRAPH
+<U6E1B> \xB8\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6E1D> \xDE\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6E1F> \xDE\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U6E20> \xB5\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6E21> \xC5\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U6E23> \xDE\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U6E24> \xDE\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U6E25> \xB0\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U6E26> \xB1\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U6E27> \xFA\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U6E29> \xB2\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U6E2B> \xDE\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U6E2C> \xC2\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U6E2D> \xDE\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U6E2E> \xDE\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U6E2F> \xB9\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U6E38> \xDE\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U6E39> \xFA\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6E3A> \xDE\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U6E3C> \xFA\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U6E3E> \xDE\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U6E43> \xDE\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U6E4A> \xCC\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U6E4D> \xDE\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U6E4E> \xDE\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U6E56> \xB8\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U6E58> \xBE\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U6E5B> \xC3\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U6E5C> \xFA\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6E5F> \xDE\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U6E67> \xCD\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U6E6B> \xDE\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U6E6E> \xDE\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U6E6F> \xC5\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6E72> \xDE\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U6E76> \xDE\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U6E7E> \xCF\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U6E7F> \xBC\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U6E80> \xCB\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U6E82> \xDE\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U6E8C> \xC8\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U6E8F> \xDE\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U6E90> \xB8\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U6E96> \xBD\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U6E98> \xDE\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U6E9C> \xCE\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U6E9D> \xB9\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U6E9F> \xDE\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U6EA2> \xB0\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U6EA5> \xDE\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U6EAA> \xDE\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U6EAF> \xDE\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6EB2> \xDE\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U6EB6> \xCD\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U6EB7> \xDE\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U6EBA> \xC5\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U6EBD> \xDE\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6EBF> \xFA\xED |0 # CJK UNIFIED IDEOGRAPH
+<U6EC2> \xDE\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U6EC4> \xDE\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U6EC5> \xCC\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U6EC9> \xDE\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U6ECB> \xBC\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U6ECC> \xDE\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U6ED1> \xB3\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6ED3> \xDE\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U6ED4> \xDE\xED |0 # CJK UNIFIED IDEOGRAPH
+<U6ED5> \xDE\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U6EDD> \xC2\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U6EDE> \xC2\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U6EEC> \xDE\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U6EEF> \xDE\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U6EF2> \xDE\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U6EF4> \xC5\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U6EF7> \xDF\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U6EF8> \xDE\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U6EFE> \xDE\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U6EFF> \xDE\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U6F01> \xB5\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U6F02> \xC9\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6F06> \xBC\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6F09> \xB9\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U6F0F> \xCF\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U6F11> \xDE\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6F13> \xDF\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U6F14> \xB1\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6F15> \xC1\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U6F20> \xC7\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U6F22> \xB4\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U6F23> \xCE\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U6F2B> \xCC\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U6F2C> \xC4\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U6F31> \xDE\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U6F32> \xDE\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U6F38> \xC1\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U6F3E> \xDF\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U6F3F> \xDE\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U6F41> \xDE\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U6F45> \xB4\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U6F54> \xB7\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6F58> \xDF\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U6F5B> \xDF\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U6F5C> \xC0\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U6F5F> \xB3\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U6F64> \xBD\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U6F66> \xDF\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U6F6D> \xDF\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U6F6E> \xC4\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U6F6F> \xDF\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U6F70> \xC4\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U6F74> \xDF\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U6F78> \xDF\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U6F7A> \xDF\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U6F7C> \xDF\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U6F80> \xDF\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U6F81> \xDF\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U6F82> \xDF\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U6F84> \xC0\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U6F86> \xDF\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U6F88> \xFA\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U6F8E> \xDF\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U6F91> \xDF\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U6F97> \xB4\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U6FA1> \xDF\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U6FA3> \xDF\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U6FA4> \xDF\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U6FAA> \xDF\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U6FB1> \xC5\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U6FB3> \xDF\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U6FB5> \xFA\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U6FB9> \xDF\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U6FC0> \xB7\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U6FC1> \xC2\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U6FC2> \xDF\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U6FC3> \xC7\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U6FC6> \xDF\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U6FD4> \xDF\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U6FD5> \xDF\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U6FD8> \xDF\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U6FDB> \xDF\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U6FDF> \xDF\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U6FE0> \xB9\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U6FE1> \xC7\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U6FE4> \xDE\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U6FEB> \xCD\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U6FEC> \xDF\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U6FEE> \xDF\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U6FEF> \xC2\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U6FF1> \xDF\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U6FF3> \xDF\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U6FF5> \xFA\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U6FF6> \xEF\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U6FFA> \xDF\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U6FFE> \xDF\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U7001> \xDF\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7005> \xFA\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U7007> \xFA\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U7009> \xDF\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U700B> \xDF\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U700F> \xDF\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U7011> \xDF\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U7015> \xC9\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U7018> \xDF\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U701A> \xDF\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U701B> \xDF\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U701D> \xDF\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U701E> \xC6\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U701F> \xDF\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U7026> \xC3\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U7027> \xC2\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7028> \xFA\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U702C> \xC0\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U7030> \xDF\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U7032> \xDF\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U703E> \xDF\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U704C> \xDE\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U7051> \xDF\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7058> \xC6\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U7063> \xDF\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U706B> \xB2\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U706F> \xC5\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U7070> \xB3\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U7078> \xB5\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U707C> \xBC\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U707D> \xBA\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7085> \xFA\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U7089> \xCF\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U708A> \xBF\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U708E> \xB1\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U7092> \xDF\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U7099> \xDF\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U70AB> \xFA\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U70AC> \xDF\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U70AD> \xC3\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U70AE> \xDF\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U70AF> \xDF\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U70B3> \xDF\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U70B8> \xDF\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U70B9> \xC5\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U70BA> \xB0\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U70BB> \xF9\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U70C8> \xCE\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U70CB> \xDF\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U70CF> \xB1\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U70D9> \xDF\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U70DD> \xDF\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U70DF> \xDF\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U70F1> \xDF\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U70F9> \xCB\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U70FD> \xDF\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U7104> \xFA\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U7109> \xDF\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U710F> \xFA\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U7114> \xB1\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U7119> \xDF\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U711A> \xCA\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U711C> \xDF\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U7121> \xCC\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U7126> \xBE\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7136> \xC1\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U713C> \xBE\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U7146> \xFA\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U7147> \xFA\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U7149> \xCE\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U714C> \xDF\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U714E> \xC0\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U7155> \xDF\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U7156> \xDF\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U7159> \xB1\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U715C> \xFA\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U7162> \xDF\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U7164> \xC7\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U7165> \xDF\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U7166> \xDF\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U7167> \xBE\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U7169> \xC8\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U716C> \xDF\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U716E> \xBC\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U717D> \xC0\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U7184> \xDF\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U7188> \xDF\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U718A> \xB7\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U718F> \xDF\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7194> \xCD\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U7195> \xDF\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U7199> \xF4\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U719F> \xBD\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U71A8> \xDF\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U71AC> \xDF\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U71B1> \xC7\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U71B9> \xDF\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U71BE> \xDF\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U71C1> \xFA\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U71C3> \xC7\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U71C8> \xC5\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U71C9> \xDF\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U71CE> \xDF\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U71D0> \xCE\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U71D2> \xDF\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U71D4> \xDF\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U71D5> \xB1\xED |0 # CJK UNIFIED IDEOGRAPH
+<U71D7> \xDF\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U71DF> \xD3\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U71E0> \xDF\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U71E5> \xC1\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U71E6> \xBB\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U71E7> \xDF\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U71EC> \xDF\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U71ED> \xBF\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U71EE> \xD2\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U71F5> \xDF\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U71F9> \xE0\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U71FB> \xDF\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U71FC> \xDF\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U71FE> \xFA\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U71FF> \xE0\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U7206> \xC7\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U720D> \xE0\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U7210> \xE0\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U721B> \xE0\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U7228> \xE0\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U722A> \xC4\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U722C> \xE0\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U722D> \xE0\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U7230> \xE0\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7232> \xE0\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7235> \xBC\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U7236> \xC9\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U723A> \xCC\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U723B> \xE0\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U723C> \xE0\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U723D> \xC1\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U723E> \xBC\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U723F> \xE0\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U7240> \xE0\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U7246> \xE0\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U7247> \xCA\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7248> \xC8\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U724B> \xE0\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U724C> \xC7\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U7252> \xC4\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U7258> \xE0\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U7259> \xB2\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U725B> \xB5\xED |0 # CJK UNIFIED IDEOGRAPH
+<U725D> \xCC\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U725F> \xCC\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U7261> \xB2\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7262> \xCF\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7267> \xCB\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7269> \xCA\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7272> \xC0\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U7274> \xE0\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U7279> \xC6\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U727D> \xB8\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U727E> \xE0\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7280> \xBA\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U7281> \xE0\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U7282> \xE0\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7287> \xE0\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U7292> \xE0\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U7296> \xE0\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U72A0> \xB5\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U72A2> \xE0\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U72A7> \xE0\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U72AC> \xB8\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U72AF> \xC8\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U72B1> \xFA\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U72B2> \xE0\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U72B6> \xBE\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U72B9> \xE0\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U72BE> \xFB\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U72C2> \xB6\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U72C3> \xE0\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U72C4> \xE0\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U72C6> \xE0\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U72CE> \xE0\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U72D0> \xB8\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U72D2> \xE0\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U72D7> \xB6\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U72D9> \xC1\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U72DB> \xB9\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U72E0> \xE0\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U72E1> \xE0\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U72E2> \xE0\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U72E9> \xBC\xED |0 # CJK UNIFIED IDEOGRAPH
+<U72EC> \xC6\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U72ED> \xB6\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U72F7> \xE0\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U72F8> \xC3\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U72F9> \xE0\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U72FC> \xCF\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U72FD> \xC7\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U730A> \xE0\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U7316> \xE0\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7317> \xE0\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U731B> \xCC\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U731C> \xE0\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U731D> \xE0\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U731F> \xCE\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7324> \xFB\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U7325> \xE0\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U7329> \xE0\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U732A> \xC3\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U732B> \xC7\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U732E> \xB8\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U732F> \xE0\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U7334> \xE0\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7336> \xCD\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U7337> \xCD\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U733E> \xE0\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U733F> \xB1\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U7344> \xB9\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U7345> \xBB\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U734E> \xE0\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U734F> \xE0\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7357> \xE0\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U7363> \xBD\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U7368> \xE0\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U736A> \xE0\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U7370> \xE0\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U7372> \xB3\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7375> \xE0\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U7377> \xFB\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U7378> \xE0\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U737A> \xE0\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U737B> \xE0\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U7384> \xB8\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U7387> \xCE\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U7389> \xB6\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U738B> \xB2\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U7396> \xB6\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U73A9> \xB4\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U73B2> \xCE\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U73B3> \xE0\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U73BB> \xE0\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U73BD> \xFB\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U73C0> \xE0\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U73C2> \xB2\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U73C8> \xE0\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U73C9> \xFB\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U73CA> \xBB\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U73CD> \xC4\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U73CE> \xE0\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U73D2> \xFB\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U73D6> \xFB\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U73DE> \xE0\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U73E0> \xBC\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U73E3> \xFB\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U73E5> \xE0\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U73EA> \xB7\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U73ED> \xC8\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U73EE> \xE0\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U73F1> \xE0\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U73F5> \xFB\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U73F8> \xE0\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U73FE> \xB8\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U7403> \xB5\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U7405> \xE0\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U7406> \xCD\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U7407> \xFB\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7409> \xCE\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U7422> \xC2\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U7425> \xE0\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U7426> \xFB\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U7429> \xFB\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U742A> \xFB\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U742E> \xFB\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U7432> \xE0\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U7433> \xCE\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U7434> \xB6\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U7435> \xC8\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U7436> \xC7\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U743A> \xE0\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U743F> \xE0\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7441> \xE0\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U7455> \xE0\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U7459> \xE0\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U745A> \xB8\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U745B> \xB1\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U745C> \xE0\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U745E> \xBF\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U745F> \xE0\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U7460> \xCE\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U7462> \xFB\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U7463> \xE0\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U7464> \xF4\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U7469> \xE0\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U746A> \xE0\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U746F> \xE0\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U7470> \xE0\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U7473> \xBA\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U7476> \xE0\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U747E> \xE0\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U7483> \xCD\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U7489> \xFB\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U748B> \xE0\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U749E> \xE0\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U749F> \xFB\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U74A2> \xE0\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U74A7> \xE0\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U74B0> \xB4\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U74BD> \xBC\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U74CA> \xE0\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U74CF> \xE0\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U74D4> \xE0\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U74DC> \xB1\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U74E0> \xE1\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U74E2> \xC9\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U74E3> \xE1\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U74E6> \xB4\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U74E7> \xE1\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U74E9> \xE1\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U74EE> \xE1\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U74F0> \xE1\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U74F1> \xE1\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U74F2> \xE1\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U74F6> \xC9\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U74F7> \xE1\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U74F8> \xE1\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7501> \xFB\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7503> \xE1\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U7504> \xE1\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U7505> \xE1\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U750C> \xE1\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U750D> \xE1\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U750E> \xE1\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U7511> \xB9\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U7513> \xE1\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U7515> \xE1\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U7518> \xB4\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U751A> \xBF\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U751C> \xC5\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U751E> \xE1\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U751F> \xC0\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U7523> \xBB\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U7525> \xB1\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U7526> \xE1\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7528> \xCD\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U752B> \xCA\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U752C> \xE1\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U752F> \xF9\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U7530> \xC5\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7531> \xCD\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7532> \xB9\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U7533> \xBF\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U7537> \xC3\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7538> \xD2\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U753A> \xC4\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U753B> \xB2\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U753C> \xE1\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U7544> \xE1\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U7546> \xE1\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U7549> \xE1\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U754A> \xE1\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U754B> \xDA\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U754C> \xB3\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U754D> \xE1\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U754F> \xB0\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U7551> \xC8\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7554> \xC8\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7559> \xCE\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U755A> \xE1\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U755B> \xE1\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U755C> \xC3\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U755D> \xC0\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U7560> \xC8\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U7562> \xC9\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U7564> \xE1\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U7565> \xCE\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U7566> \xB7\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7567> \xE1\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U7569> \xE1\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U756A> \xC8\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U756B> \xE1\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U756D> \xE1\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U756F> \xFB\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7570> \xB0\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U7573> \xBE\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U7574> \xE1\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7576> \xE1\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7577> \xC6\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7578> \xE1\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U757F> \xB5\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U7582> \xE1\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7586> \xE1\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U7587> \xE1\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U7589> \xE1\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U758A> \xE1\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U758B> \xC9\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U758E> \xC1\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U758F> \xC1\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U7591> \xB5\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U7594> \xE1\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U759A> \xE1\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U759D> \xE1\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U75A3> \xE1\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U75A5> \xE1\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U75AB> \xB1\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U75B1> \xE1\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U75B2> \xC8\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U75B3> \xE1\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U75B5> \xE1\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U75B8> \xE1\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U75B9> \xBF\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U75BC> \xE1\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U75BD> \xE1\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U75BE> \xBC\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U75C2> \xE1\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U75C3> \xE1\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U75C5> \xC9\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U75C7> \xBE\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U75CA> \xE1\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U75CD> \xE1\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U75D2> \xE1\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U75D4> \xBC\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U75D5> \xBA\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U75D8> \xC5\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U75D9> \xE1\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U75DB> \xC4\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U75DE> \xE1\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U75E2> \xCE\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U75E3> \xE1\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U75E9> \xC1\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U75F0> \xE1\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U75F2> \xE1\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U75F3> \xE1\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U75F4> \xC3\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U75FA> \xE1\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U75FC> \xE1\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U75FE> \xE1\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U75FF> \xE1\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U7601> \xE1\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U7609> \xE1\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U760B> \xE1\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U760D> \xE1\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U761F> \xE1\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U7620> \xE1\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U7621> \xE1\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U7622> \xE1\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7624> \xE1\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U7627> \xE1\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U7630> \xE1\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U7634> \xE1\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U763B> \xE1\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U7642> \xCE\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U7646> \xE1\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U7647> \xE1\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U7648> \xE1\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U764C> \xB4\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U7652> \xCC\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U7656> \xCA\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7658> \xE1\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U765C> \xE1\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U7661> \xE1\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U7662> \xE1\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U7667> \xE1\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U7668> \xE1\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U7669> \xE1\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U766A> \xE1\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U766C> \xE1\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U7670> \xE1\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U7672> \xE2\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U7676> \xE2\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U7678> \xE2\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U767A> \xC8\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U767B> \xC5\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U767C> \xE2\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U767D> \xC7\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U767E> \xC9\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7680> \xE2\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U7682> \xFB\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U7683> \xE2\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U7684> \xC5\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7686> \xB3\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U7687> \xB9\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7688> \xE2\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U768B> \xE2\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U768E> \xE2\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7690> \xBB\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7693> \xE2\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U7696> \xE2\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7699> \xE2\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U769A> \xE2\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U769B> \xFB\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U769C> \xFB\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U769E> \xFB\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U76A6> \xFB\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U76AE> \xC8\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U76B0> \xE2\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U76B4> \xE2\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U76B7> \xF3\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U76B8> \xE2\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U76B9> \xE2\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U76BA> \xE2\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U76BF> \xBB\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U76C2> \xE2\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U76C3> \xC7\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U76C6> \xCB\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U76C8> \xB1\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U76CA> \xB1\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U76CD> \xE2\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U76D2> \xE2\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U76D6> \xE2\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U76D7> \xC5\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U76DB> \xC0\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U76DC> \xDD\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U76DE> \xE2\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U76DF> \xCC\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U76E1> \xE2\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U76E3> \xB4\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U76E4> \xC8\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U76E5> \xE2\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U76E7> \xE2\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U76EA> \xE2\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U76EE> \xCC\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U76F2> \xCC\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U76F4> \xC4\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U76F8> \xC1\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U76FB> \xE2\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U76FE> \xBD\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U7701> \xBE\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7704> \xE2\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U7707> \xE2\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U7708> \xE2\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U7709> \xC8\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U770B> \xB4\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U770C> \xB8\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U771B> \xE2\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U771E> \xE2\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U771F> \xBF\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U7720> \xCC\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U7724> \xE2\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U7725> \xE2\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7726> \xE2\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U7729> \xE2\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U7737> \xE2\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7738> \xE2\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U773A> \xC4\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U773C> \xB4\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U7740> \xC3\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U7746> \xFB\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U7747> \xE2\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U775A> \xE2\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U775B> \xE2\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7761> \xBF\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U7763> \xC6\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7765> \xE2\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U7766> \xCB\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7768> \xE2\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U776B> \xE2\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U7779> \xE2\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U777E> \xE2\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U777F> \xE2\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U778B> \xE2\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U778E> \xE2\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7791> \xE2\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U779E> \xE2\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U77A0> \xE2\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U77A5> \xCA\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U77AC> \xBD\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U77AD> \xCE\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U77B0> \xE2\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U77B3> \xC6\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U77B6> \xE2\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U77B9> \xE2\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U77BB> \xE2\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U77BC> \xE2\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U77BD> \xE2\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U77BF> \xE2\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U77C7> \xE2\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U77CD> \xE2\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U77D7> \xE2\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U77DA> \xE2\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U77DB> \xCC\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U77DC> \xE2\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U77E2> \xCC\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U77E3> \xE2\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U77E5> \xC3\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U77E7> \xC7\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U77E9> \xB6\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U77ED> \xC3\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U77EE> \xE2\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U77EF> \xB6\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U77F3> \xC0\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U77FC> \xE2\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U7802> \xBA\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U780C> \xE2\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U7812> \xE2\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U7814> \xB8\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U7815> \xBA\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U7820> \xE2\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U7821> \xFB\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U7825> \xC5\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U7826> \xBA\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U7827> \xB5\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U7832> \xCB\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U7834> \xC7\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U783A> \xC5\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U783F> \xB9\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U7845> \xE2\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U784E> \xFB\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U785D> \xBE\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7864> \xFB\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U786B> \xCE\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U786C> \xB9\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U786F> \xB8\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U7872> \xC8\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U7874> \xE2\xED |0 # CJK UNIFIED IDEOGRAPH
+<U787A> \xFB\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U787C> \xE2\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U7881> \xB8\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U7886> \xE2\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U7887> \xC4\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U788C> \xE2\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U788D> \xB3\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U788E> \xE2\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U7891> \xC8\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U7893> \xB1\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U7895> \xBA\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U7897> \xCF\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U789A> \xE2\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U78A3> \xE2\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U78A7> \xCA\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U78A9> \xC0\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U78AA> \xE2\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U78AF> \xE2\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U78B5> \xE2\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U78BA> \xB3\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U78BC> \xE2\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U78BE> \xE2\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U78C1> \xBC\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U78C5> \xE2\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U78C6> \xE2\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U78CA> \xE2\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U78CB> \xE2\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U78D0> \xC8\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U78D1> \xE2\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U78D4> \xE2\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U78DA> \xE3\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U78E7> \xE3\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U78E8> \xCB\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U78EC> \xE2\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U78EF> \xB0\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U78F4> \xE3\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U78FD> \xE3\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U7901> \xBE\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U7907> \xE3\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U790E> \xC1\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U7911> \xE3\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U7912> \xE3\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U7919> \xE3\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U7926> \xE2\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U792A> \xE2\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U792B> \xE3\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U792C> \xE3\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7930> \xFB\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U793A> \xBC\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U793C> \xCE\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U793E> \xBC\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7940> \xE3\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U7941> \xB7\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U7947> \xB5\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U7948> \xB5\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U7949> \xBB\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U7950> \xCD\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7953> \xE3\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U7955> \xE3\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U7956> \xC1\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7957> \xE3\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U795A> \xE3\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U795D> \xBD\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U795E> \xBF\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U795F> \xE3\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U7960> \xE3\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U7962> \xC7\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7965> \xBE\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7968> \xC9\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U796D> \xBA\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U7977> \xC5\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U797A> \xE3\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U797F> \xE3\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7980> \xE3\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U7981> \xB6\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U7984> \xCF\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U7985> \xC1\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U798A> \xE3\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U798D> \xB2\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U798E> \xC4\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U798F> \xCA\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U7994> \xFB\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U799B> \xFB\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U799D> \xE3\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U79A6> \xB5\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U79A7> \xE3\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U79AA> \xE3\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U79AE> \xE3\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U79B0> \xC7\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U79B3> \xE3\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U79B9> \xE3\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U79BA> \xE3\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U79BD> \xB6\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U79BE> \xB2\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U79BF> \xC6\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U79C0> \xBD\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U79C1> \xBB\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U79C9> \xE3\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U79CB> \xBD\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U79D1> \xB2\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U79D2> \xC9\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U79D5> \xE3\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U79D8> \xC8\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U79DF> \xC1\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U79E1> \xE3\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U79E3> \xE3\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U79E4> \xC7\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U79E6> \xBF\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U79E7> \xE3\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U79E9> \xC3\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U79EC> \xE3\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U79F0> \xBE\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U79FB> \xB0\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U7A00> \xB5\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7A08> \xE3\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U7A0B> \xC4\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U7A0D> \xE3\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7A0E> \xC0\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7A14> \xCC\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U7A17> \xC9\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U7A18> \xE3\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U7A19> \xE3\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U7A1A> \xC3\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U7A1C> \xCE\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7A1F> \xE3\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U7A20> \xE3\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7A2E> \xBC\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U7A31> \xE3\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7A32> \xB0\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U7A37> \xE3\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7A3B> \xE3\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7A3C> \xB2\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U7A3D> \xB7\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U7A3E> \xE3\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U7A3F> \xB9\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U7A40> \xB9\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U7A42> \xCA\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U7A43> \xE3\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U7A46> \xCB\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U7A49> \xE3\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U7A4D> \xC0\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U7A4E> \xB1\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U7A4F> \xB2\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U7A50> \xB0\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U7A57> \xE3\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U7A61> \xE3\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U7A62> \xE3\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7A63> \xBE\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U7A69> \xE3\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7A6B> \xB3\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U7A70> \xE3\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U7A74> \xB7\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U7A76> \xB5\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U7A79> \xE3\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U7A7A> \xB6\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U7A7D> \xE3\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U7A7F> \xC0\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U7A81> \xC6\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7A83> \xC0\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U7A84> \xBA\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U7A88> \xE3\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U7A92> \xC3\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U7A93> \xC1\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U7A95> \xE3\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U7A96> \xE3\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U7A97> \xE3\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U7A98> \xE3\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U7A9F> \xB7\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U7AA9> \xE3\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U7AAA> \xB7\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U7AAE> \xB5\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U7AAF> \xCD\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7AB0> \xE3\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U7AB6> \xE3\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U7ABA> \xB1\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U7ABF> \xE3\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U7AC3> \xB3\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U7AC4> \xE3\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U7AC5> \xE3\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U7AC7> \xE3\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U7AC8> \xE3\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U7ACA> \xE3\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U7ACB> \xCE\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7ACD> \xE3\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U7ACF> \xE3\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U7AD1> \xFB\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U7AD2> \xD4\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U7AD3> \xE3\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U7AD5> \xE3\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U7AD9> \xE3\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U7ADA> \xE3\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U7ADC> \xCE\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U7ADD> \xE3\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7ADF> \xF0\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U7AE0> \xBE\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U7AE1> \xE3\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U7AE2> \xE3\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U7AE3> \xBD\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U7AE5> \xC6\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U7AE6> \xE3\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U7AE7> \xFB\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U7AEA> \xC3\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U7AEB> \xFB\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7AED> \xE3\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U7AEF> \xC3\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U7AF0> \xE3\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U7AF6> \xB6\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U7AF8> \xD1\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U7AF9> \xC3\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U7AFA> \xBC\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7AFF> \xB4\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U7B02> \xE3\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U7B04> \xE4\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U7B06> \xE3\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U7B08> \xB5\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U7B0A> \xE3\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U7B0B> \xE4\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U7B0F> \xE3\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U7B11> \xBE\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U7B18> \xE3\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U7B19> \xE3\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U7B1B> \xC5\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U7B1E> \xE3\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U7B20> \xB3\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U7B25> \xBF\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U7B26> \xC9\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U7B28> \xE3\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U7B2C> \xC2\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U7B33> \xE3\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U7B35> \xE3\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U7B36> \xE3\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U7B39> \xBA\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U7B45> \xE4\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U7B46> \xC9\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U7B48> \xC8\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U7B49> \xC5\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U7B4B> \xB6\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U7B4C> \xE4\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U7B4D> \xE4\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U7B4F> \xC8\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U7B50> \xE3\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U7B51> \xC3\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U7B52> \xC5\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U7B54> \xC5\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U7B56> \xBA\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U7B5D> \xE4\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U7B65> \xE4\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U7B67> \xE4\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7B6C> \xE4\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U7B6E> \xE4\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U7B70> \xE4\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U7B71> \xE4\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U7B74> \xE4\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7B75> \xE4\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U7B7A> \xE4\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U7B86> \xCA\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U7B87> \xB2\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U7B8B> \xE4\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U7B8D> \xE4\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U7B8F> \xE4\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U7B92> \xE4\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U7B94> \xC7\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U7B95> \xCC\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U7B97> \xBB\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U7B98> \xE4\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U7B99> \xE4\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U7B9A> \xE4\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7B9C> \xE4\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7B9D> \xE4\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U7B9E> \xFB\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U7B9F> \xE4\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U7BA1> \xB4\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U7BAA> \xC3\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U7BAD> \xC0\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U7BB1> \xC8\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U7BB4> \xE4\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U7BB8> \xC8\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U7BC0> \xC0\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U7BC1> \xE4\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U7BC4> \xC8\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U7BC6> \xE4\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U7BC7> \xCA\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7BC9> \xC3\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U7BCB> \xE4\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U7BCC> \xE4\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U7BCF> \xE4\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U7BDD> \xE4\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U7BE0> \xBC\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7BE4> \xC6\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U7BE5> \xE4\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U7BE6> \xE4\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7BE9> \xE4\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U7BED> \xCF\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U7BF3> \xE4\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7BF6> \xE4\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U7BF7> \xE4\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7C00> \xE4\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7C07> \xE4\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U7C0D> \xE4\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7C11> \xE4\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U7C12> \xD2\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U7C13> \xE4\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U7C14> \xE4\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U7C17> \xE4\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U7C1F> \xE4\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7C21> \xB4\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7C23> \xE4\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U7C27> \xE4\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U7C2A> \xE4\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U7C2B> \xE4\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U7C37> \xE4\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7C38> \xC8\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U7C3D> \xE4\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U7C3E> \xCE\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U7C3F> \xCA\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7C40> \xE4\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U7C43> \xE4\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U7C4C> \xE4\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U7C4D> \xC0\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7C4F> \xE4\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U7C50> \xE4\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U7C54> \xE4\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U7C56> \xE4\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U7C58> \xE4\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U7C5F> \xE4\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U7C60> \xE4\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U7C64> \xE4\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U7C65> \xE4\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U7C6C> \xE4\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U7C73> \xCA\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U7C75> \xE4\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U7C7E> \xCC\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U7C81> \xB6\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U7C82> \xB7\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7C83> \xE4\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U7C89> \xCA\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7C8B> \xBF\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U7C8D> \xCC\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U7C90> \xE4\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U7C92> \xCE\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7C95> \xC7\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U7C97> \xC1\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U7C98> \xC7\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7C9B> \xBD\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7C9F> \xB0\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U7CA1> \xE4\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U7CA2> \xE4\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U7CA4> \xE4\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U7CA5> \xB4\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U7CA7> \xBE\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U7CA8> \xE4\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U7CAB> \xE4\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U7CAD> \xE4\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U7CAE> \xE4\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U7CB1> \xE4\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7CB2> \xE4\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U7CB3> \xE4\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U7CB9> \xE4\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U7CBD> \xE4\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U7CBE> \xC0\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U7CC0> \xE4\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U7CC2> \xE4\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U7CC5> \xE4\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U7CCA> \xB8\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7CCE> \xC1\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U7CD2> \xE4\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U7CD6> \xC5\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U7CD8> \xE4\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U7CDC> \xE4\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U7CDE> \xCA\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U7CDF> \xC1\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U7CE0> \xB9\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7CE2> \xE4\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U7CE7> \xCE\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U7CEF> \xE4\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U7CF2> \xE4\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U7CF4> \xE4\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U7CF6> \xE4\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U7CF8> \xBB\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U7CFA> \xE4\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U7CFB> \xB7\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U7CFE> \xB5\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U7D00> \xB5\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7D02> \xE5\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U7D04> \xCC\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U7D05> \xB9\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U7D06> \xE4\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U7D0A> \xE5\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U7D0B> \xCC\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U7D0D> \xC7\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U7D10> \xC9\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7D14> \xBD\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U7D15> \xE5\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U7D17> \xBC\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7D18> \xB9\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U7D19> \xBB\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U7D1A> \xB5\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U7D1B> \xCA\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U7D1C> \xE5\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U7D20> \xC1\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7D21> \xCB\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U7D22> \xBA\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U7D2B> \xBB\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U7D2C> \xC4\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U7D2E> \xE5\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U7D2F> \xCE\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U7D30> \xBA\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U7D32> \xE5\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U7D33> \xBF\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U7D35> \xE5\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7D39> \xBE\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7D3A> \xBA\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U7D3F> \xE5\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7D42> \xBD\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7D43> \xB8\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U7D44> \xC1\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U7D45> \xE5\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U7D46> \xE5\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U7D48> \xFB\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U7D4B> \xE5\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U7D4C> \xB7\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U7D4E> \xE5\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U7D4F> \xE5\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U7D50> \xB7\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U7D56> \xE5\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U7D5B> \xE5\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U7D5C> \xFB\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U7D5E> \xB9\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7D61> \xCD\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7D62> \xB0\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U7D63> \xE5\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7D66> \xB5\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U7D68> \xE5\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U7D6E> \xE5\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U7D71> \xC5\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U7D72> \xE5\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U7D73> \xE5\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U7D75> \xB3\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U7D76> \xC0\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U7D79> \xB8\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U7D7D> \xE5\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U7D89> \xE5\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U7D8F> \xE5\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U7D93> \xE5\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7D99> \xB7\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U7D9A> \xC2\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7D9B> \xE5\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U7D9C> \xC1\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U7D9F> \xE5\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U7DA0> \xFB\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U7DA2> \xE5\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U7DA3> \xE5\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U7DAB> \xE5\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U7DAC> \xBC\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U7DAD> \xB0\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U7DAE> \xE5\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U7DAF> \xE5\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U7DB0> \xE5\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7DB1> \xB9\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7DB2> \xCC\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U7DB4> \xC4\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U7DB5> \xE5\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U7DB7> \xFB\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U7DB8> \xE5\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U7DBA> \xE5\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U7DBB> \xC3\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U7DBD> \xE5\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U7DBE> \xB0\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U7DBF> \xCC\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7DC7> \xE5\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U7DCA> \xB6\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U7DCB> \xC8\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U7DCF> \xC1\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7DD1> \xCE\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U7DD2> \xBD\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U7DD5> \xE5\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U7DD6> \xFB\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7DD8> \xE5\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U7DDA> \xC0\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U7DDC> \xE5\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7DDD> \xE5\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U7DDE> \xE5\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7DE0> \xC4\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U7DE1> \xE5\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U7DE4> \xE5\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7DE8> \xCA\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U7DE9> \xB4\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7DEC> \xCC\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7DEF> \xB0\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U7DF2> \xE5\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7DF4> \xCE\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U7DFB> \xE5\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U7E01> \xB1\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U7E04> \xC6\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U7E05> \xE5\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U7E09> \xE5\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U7E0A> \xE5\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U7E0B> \xE5\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U7E12> \xE5\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7E1B> \xC7\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U7E1E> \xBC\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7E1F> \xE5\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U7E21> \xE5\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7E22> \xE5\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U7E23> \xE5\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U7E26> \xBD\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7E2B> \xCB\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U7E2E> \xBD\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U7E31> \xE5\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U7E32> \xE5\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U7E35> \xE5\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U7E37> \xE5\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U7E39> \xE5\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U7E3A> \xE5\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U7E3B> \xE5\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U7E3D> \xE5\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U7E3E> \xC0\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7E41> \xC8\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7E43> \xE5\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U7E46> \xE5\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U7E4A> \xC1\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U7E4B> \xB7\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U7E4D> \xBD\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U7E52> \xFB\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7E54> \xBF\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U7E55> \xC1\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U7E56> \xE5\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U7E59> \xE5\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U7E5A> \xE5\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U7E5D> \xE5\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U7E5E> \xE5\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U7E66> \xE5\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U7E67> \xE5\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U7E69> \xE5\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U7E6A> \xE5\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U7E6D> \xCB\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U7E70> \xB7\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U7E79> \xE5\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U7E7B> \xE5\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U7E7C> \xE5\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U7E7D> \xE5\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U7E7F> \xE5\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U7E82> \xBB\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U7E83> \xE5\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7E88> \xE5\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U7E89> \xE5\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U7E8A> \xF9\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U7E8C> \xE5\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U7E8E> \xE5\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U7E8F> \xC5\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U7E90> \xE5\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U7E92> \xE5\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U7E93> \xE5\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U7E94> \xE5\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U7E96> \xE5\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U7E9B> \xE5\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U7E9C> \xE5\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U7F36> \xB4\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U7F38> \xE5\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U7F3A> \xE5\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U7F45> \xE6\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U7F47> \xFB\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U7F4C> \xE6\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U7F4D> \xE6\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U7F4E> \xE6\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U7F50> \xE6\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U7F51> \xE6\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U7F54> \xE6\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U7F55> \xE6\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U7F58> \xE6\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7F5F> \xE6\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U7F60> \xE6\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U7F67> \xE6\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U7F68> \xE6\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U7F69> \xE6\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U7F6A> \xBA\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U7F6B> \xB7\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7F6E> \xC3\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U7F70> \xC8\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7F72> \xBD\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U7F75> \xC7\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7F77> \xC8\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7F78> \xE6\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U7F79> \xD8\xED |0 # CJK UNIFIED IDEOGRAPH
+<U7F82> \xE6\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U7F83> \xE6\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U7F85> \xCD\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U7F86> \xE6\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U7F87> \xE6\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U7F88> \xE6\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U7F8A> \xCD\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U7F8C> \xE6\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U7F8E> \xC8\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U7F94> \xE6\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U7F9A> \xE6\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U7F9D> \xE6\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U7F9E> \xE6\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U7FA1> \xFB\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U7FA3> \xE6\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U7FA4> \xB7\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U7FA8> \xC1\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U7FA9> \xB5\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U7FAE> \xE6\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U7FAF> \xE6\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U7FB2> \xE6\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U7FB6> \xE6\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U7FB8> \xE6\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U7FB9> \xE6\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U7FBD> \xB1\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U7FC1> \xB2\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U7FC5> \xE6\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U7FC6> \xE6\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U7FCA> \xE6\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U7FCC> \xCD\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U7FD2> \xBD\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U7FD4> \xE6\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U7FD5> \xE6\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U7FE0> \xBF\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U7FE1> \xE6\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U7FE6> \xE6\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U7FE9> \xE6\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U7FEB> \xB4\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U7FF0> \xB4\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U7FF3> \xE6\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U7FF9> \xE6\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U7FFB> \xCB\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U7FFC> \xCD\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U8000> \xCD\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U8001> \xCF\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U8003> \xB9\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U8004> \xE6\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U8005> \xBC\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U8006> \xE6\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U800B> \xE6\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U800C> \xBC\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U8010> \xC2\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U8012> \xE6\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U8015> \xB9\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U8017> \xCC\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8018> \xE6\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U8019> \xE6\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U801C> \xE6\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U8021> \xE6\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U8028> \xE6\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U8033> \xBC\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U8036> \xCC\xED |0 # CJK UNIFIED IDEOGRAPH
+<U803B> \xE6\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U803D> \xC3\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U803F> \xE6\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U8046> \xE6\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U804A> \xE6\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8052> \xE6\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U8056> \xC0\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U8058> \xE6\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U805A> \xE6\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U805E> \xCA\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U805F> \xE6\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U8061> \xC1\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U8062> \xE6\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U8068> \xE6\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U806F> \xCE\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U8070> \xE6\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U8072> \xE6\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U8073> \xE6\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U8074> \xC4\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U8076> \xE6\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U8077> \xBF\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U8079> \xE6\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U807D> \xE6\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U807E> \xCF\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U807F> \xE6\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U8084> \xE6\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U8085> \xE6\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U8086> \xE6\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U8087> \xC8\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U8089> \xC6\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U808B> \xCF\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U808C> \xC8\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U8093> \xE6\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U8096> \xBE\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U8098> \xC9\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U809A> \xE6\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U809B> \xE6\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U809D> \xB4\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U80A1> \xB8\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U80A2> \xBB\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U80A5> \xC8\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U80A9> \xB8\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U80AA> \xCB\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U80AC> \xE6\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U80AD> \xE6\xED |0 # CJK UNIFIED IDEOGRAPH
+<U80AF> \xB9\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U80B1> \xB9\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U80B2> \xB0\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U80B4> \xBA\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U80BA> \xC7\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U80C3> \xB0\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U80C4> \xE6\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U80C6> \xC3\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U80CC> \xC7\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U80CE> \xC2\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U80D6> \xE6\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U80D9> \xE6\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U80DA> \xE6\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U80DB> \xE6\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U80DD> \xE6\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U80DE> \xCB\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U80E1> \xB8\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U80E4> \xB0\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U80E5> \xE6\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U80EF> \xE6\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U80F1> \xE6\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U80F4> \xC6\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U80F8> \xB6\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U80FC> \xE7\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U80FD> \xC7\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U8102> \xBB\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U8105> \xB6\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U8106> \xC0\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U8107> \xCF\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U8108> \xCC\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U8109> \xE6\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U810A> \xC0\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U811A> \xB5\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U811B> \xE6\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U8123> \xE6\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U8129> \xE6\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U812F> \xE6\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U8131> \xC3\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U8133> \xC7\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U8139> \xC4\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U813E> \xE7\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U8146> \xE7\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U814B> \xE6\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U814E> \xBF\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U8150> \xC9\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U8151> \xE7\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U8153> \xE7\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U8154> \xB9\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U8155> \xCF\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U815F> \xE7\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U8165> \xE7\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U8166> \xE7\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U816B> \xBC\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U816E> \xE7\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U8170> \xB9\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U8171> \xE7\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U8174> \xE7\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U8178> \xC4\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U8179> \xCA\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U817A> \xC1\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U817F> \xC2\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U8180> \xE7\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U8182> \xE7\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U8183> \xE7\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U8188> \xE7\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U818A> \xE7\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U818F> \xB9\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U8193> \xE7\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U8195> \xE7\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U819A> \xC9\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U819C> \xCB\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U819D> \xC9\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U81A0> \xE7\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U81A3> \xE7\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U81A4> \xE7\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U81A8> \xCB\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U81A9> \xE7\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U81B0> \xE7\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U81B3> \xC1\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U81B5> \xE7\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U81B8> \xE7\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U81BA> \xE7\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U81BD> \xE7\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U81BE> \xE7\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U81BF> \xC7\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U81C0> \xE7\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U81C2> \xE7\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U81C6> \xB2\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U81C8> \xE7\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U81C9> \xE7\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U81CD> \xE7\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U81D1> \xE7\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U81D3> \xC2\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U81D8> \xE7\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U81D9> \xE7\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U81DA> \xE7\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U81DF> \xE7\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U81E0> \xE7\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U81E3> \xBF\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U81E5> \xB2\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U81E7> \xE7\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U81E8> \xCE\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U81EA> \xBC\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U81ED> \xBD\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U81F3> \xBB\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U81F4> \xC3\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U81FA> \xE7\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U81FB> \xE7\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U81FC> \xB1\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U81FE> \xE7\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U8201> \xE7\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U8202> \xE7\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U8205> \xE7\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U8207> \xE7\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U8208> \xB6\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U8209> \xDA\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U820A> \xE7\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U820C> \xC0\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U820D> \xE7\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U820E> \xBC\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U8210> \xE7\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U8212> \xD0\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U8216> \xE7\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U8217> \xCA\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U8218> \xB4\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U821B> \xC1\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U821C> \xBD\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U821E> \xC9\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U821F> \xBD\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U8229> \xE7\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U822A> \xB9\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U822B> \xE7\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U822C> \xC8\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U822E> \xE7\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U8233> \xE7\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8235> \xC2\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U8236> \xC7\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U8237> \xB8\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U8238> \xE7\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8239> \xC1\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U8240> \xE7\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U8247> \xC4\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U8258> \xE7\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U8259> \xE7\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U825A> \xE7\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U825D> \xE7\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U825F> \xE7\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U8262> \xE7\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U8264> \xE7\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U8266> \xB4\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U8268> \xE7\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U826A> \xE7\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U826B> \xE7\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U826E> \xBA\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U826F> \xCE\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U8271> \xE7\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U8272> \xBF\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U8276> \xB1\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U8277> \xE7\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U8278> \xE7\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U827E> \xE7\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U828B> \xB0\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U828D> \xE7\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U8292> \xE7\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U8299> \xC9\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U829D> \xBC\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U829F> \xE7\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U82A5> \xB3\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U82A6> \xB0\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U82AB> \xE7\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U82AC> \xE7\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U82AD> \xC7\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U82AF> \xBF\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U82B1> \xB2\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U82B3> \xCB\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U82B8> \xB7\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U82B9> \xB6\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U82BB> \xE7\xED |0 # CJK UNIFIED IDEOGRAPH
+<U82BD> \xB2\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U82C5> \xB4\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U82D1> \xB1\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U82D2> \xE7\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U82D3> \xCE\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U82D4> \xC2\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U82D7> \xC9\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U82D9> \xE7\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U82DB> \xB2\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U82DC> \xE7\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U82DE> \xE7\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U82DF> \xE7\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U82E1> \xE7\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U82E3> \xE7\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U82E5> \xBC\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U82E6> \xB6\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U82E7> \xC3\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U82EB> \xC6\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U82F1> \xB1\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U82F3> \xE7\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U82F4> \xE7\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U82F9> \xE7\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U82FA> \xE7\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U82FB> \xE7\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U8301> \xFB\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8302> \xCC\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U8303> \xE7\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U8304> \xB2\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8305> \xB3\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U8306> \xE7\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U8309> \xE7\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U830E> \xB7\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U8316> \xE8\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U8317> \xE8\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U8318> \xE8\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U831C> \xB0\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U8323> \xE8\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U8328> \xB0\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U832B> \xE8\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U832F> \xE8\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U8331> \xE8\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U8332> \xE8\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U8334> \xE8\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U8335> \xE8\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U8336> \xC3\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U8338> \xC2\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U8339> \xE8\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U8340> \xE8\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U8345> \xE8\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U8349> \xC1\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U834A> \xB7\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U834F> \xB1\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8350> \xE8\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U8352> \xB9\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U8358> \xC1\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U8362> \xFB\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8373> \xE8\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U8375> \xE8\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U8377> \xB2\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U837B> \xB2\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U837C> \xE8\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U837F> \xFB\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U8385> \xE8\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U8387> \xE8\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U8389> \xE8\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U838A> \xE8\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U838E> \xE8\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U8393> \xE7\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8396> \xE8\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U839A> \xE8\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U839E> \xB4\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U839F> \xE8\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U83A0> \xE8\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U83A2> \xE8\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U83A8> \xE8\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U83AA> \xE8\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U83AB> \xC7\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U83B1> \xCD\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U83B5> \xE8\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U83BD> \xE8\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U83C1> \xE8\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U83C5> \xBF\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U83C7> \xFB\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U83CA> \xB5\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U83CC> \xB6\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U83CE> \xE8\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U83D3> \xB2\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U83D6> \xBE\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U83D8> \xE8\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U83DC> \xBA\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U83DF> \xC5\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U83E0> \xE8\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U83E9> \xCA\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U83EB> \xE8\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U83EF> \xB2\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U83F0> \xB8\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U83F1> \xC9\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U83F2> \xE8\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U83F4> \xE8\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U83F6> \xFB\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U83F7> \xE8\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U83FB> \xE8\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U83FD> \xE8\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U8403> \xE8\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U8404> \xC6\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U8407> \xE8\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U840B> \xE8\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U840C> \xCB\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U840D> \xE8\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U840E> \xB0\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U8413> \xE8\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U8420> \xE8\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U8422> \xE8\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U8429> \xC7\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U842A> \xE8\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U842C> \xE8\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U8431> \xB3\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U8435> \xE8\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U8438> \xE8\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U843C> \xE8\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U843D> \xCD\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U8446> \xE8\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U8448> \xFB\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U8449> \xCD\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U844E> \xCE\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U8457> \xC3\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U845B> \xB3\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U8461> \xC9\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U8462> \xE8\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U8463> \xC6\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U8466> \xB0\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U8469> \xE8\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U846B> \xE8\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U846C> \xC1\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U846D> \xE8\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U846E> \xE8\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U846F> \xE8\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U8471> \xC7\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U8475> \xB0\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U8477> \xE8\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8479> \xE8\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U847A> \xC9\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U8482> \xE8\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U8484> \xE8\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U848B> \xBE\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U8490> \xBD\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U8494> \xBC\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U8499> \xCC\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U849C> \xC9\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U849F> \xE8\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U84A1> \xE8\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U84AD> \xE8\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U84B2> \xB3\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U84B4> \xFB\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U84B8> \xBE\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U84B9> \xE8\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U84BB> \xE8\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U84BC> \xC1\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U84BF> \xE8\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U84C1> \xE8\xED |0 # CJK UNIFIED IDEOGRAPH
+<U84C4> \xC3\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U84C6> \xE8\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U84C9> \xCD\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U84CA> \xE8\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U84CB> \xB3\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U84CD> \xE8\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U84D0> \xE8\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U84D1> \xCC\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U84D6> \xE8\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U84D9> \xE8\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U84DA> \xE8\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U84DC> \xF9\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U84EC> \xCB\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U84EE> \xCF\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U84F4> \xE8\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U84FC> \xE8\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U84FF> \xE8\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U8500> \xBC\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U8506> \xE8\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U8511> \xCA\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U8513> \xCC\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U8514> \xE8\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U8515> \xE8\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U8517> \xE8\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U8518> \xE8\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U851A> \xB1\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U851F> \xE8\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U8521> \xE8\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U8526> \xC4\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U852C> \xE8\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U852D> \xB0\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U8535> \xC2\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U853D> \xCA\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U8540> \xE8\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U8541> \xE9\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U8543> \xC8\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U8548> \xE8\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U8549> \xBE\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U854A> \xBC\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U854B> \xE9\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U854E> \xB6\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U8553> \xFB\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U8555> \xE9\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U8557> \xC9\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U8558> \xE8\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U8559> \xFB\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U855A> \xE8\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U8563> \xE8\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U8568> \xCF\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U8569> \xC6\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U856A> \xC9\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U856B> \xFB\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U856D> \xE9\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U8577> \xE9\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U857E> \xE9\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U8580> \xE9\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U8584> \xC7\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8587> \xE9\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U8588> \xE9\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U858A> \xE9\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U8590> \xE9\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U8591> \xE9\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U8594> \xE9\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U8597> \xB1\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U8599> \xC6\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U859B> \xE9\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U859C> \xE9\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U85A4> \xE9\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U85A6> \xC1\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U85A8> \xE9\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U85A9> \xBB\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U85AA> \xBF\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U85AB> \xB7\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U85AC> \xCC\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U85AE> \xCC\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U85AF> \xBD\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U85B0> \xFB\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U85B9> \xE9\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U85BA> \xE9\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U85C1> \xCF\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U85C9> \xE9\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U85CD> \xCD\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U85CF> \xE9\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U85D0> \xE9\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U85D5> \xE9\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U85DC> \xE9\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U85DD> \xE9\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U85E4> \xC6\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U85E5> \xE9\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U85E9> \xC8\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U85EA> \xE9\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U85F7> \xBD\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U85F9> \xE9\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U85FA> \xE9\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U85FB> \xC1\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U85FE> \xE9\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8602> \xE9\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U8606> \xE9\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U8607> \xC1\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U860A> \xE9\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U860B> \xE9\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U8613> \xE9\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U8616> \xDD\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U8617> \xDD\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U861A> \xE9\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U8622> \xE9\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U862D> \xCD\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U862F> \xE2\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U8630> \xE9\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U863F> \xE9\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U864D> \xE9\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U864E> \xB8\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8650> \xB5\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U8654> \xE9\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U8655> \xD1\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U865A> \xB5\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U865C> \xCE\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U865E> \xB6\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U865F> \xE9\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U8667> \xE9\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U866B> \xC3\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U8671> \xE9\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U8679> \xC6\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U867B> \xB0\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U868A> \xB2\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U868B> \xE9\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U868C> \xE9\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U8693> \xE9\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U8695> \xBB\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U86A3> \xE9\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U86A4> \xC7\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U86A9> \xE9\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U86AA> \xE9\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U86AB> \xE9\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U86AF> \xE9\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U86B0> \xE9\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U86B6> \xE9\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U86C4> \xE9\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U86C6> \xE9\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U86C7> \xBC\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U86C9> \xE9\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U86CB> \xC3\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U86CD> \xB7\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U86CE> \xB3\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U86D4> \xE9\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U86D9> \xB3\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U86DB> \xE9\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U86DE> \xE9\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U86DF> \xE9\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U86E4> \xC8\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U86E9> \xE9\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U86EC> \xE9\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U86ED> \xC9\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U86EE> \xC8\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U86EF> \xE9\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U86F8> \xC2\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U86F9> \xE9\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U86FB> \xE9\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U86FE> \xB2\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U8700> \xE9\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U8702> \xCB\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U8703> \xE9\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U8706> \xE9\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U8708> \xE9\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U8709> \xE9\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U870A> \xE9\xED |0 # CJK UNIFIED IDEOGRAPH
+<U870D> \xE9\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U8711> \xE9\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U8712> \xE9\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U8718> \xC3\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U871A> \xE9\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U871C> \xCC\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U8725> \xE9\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U8729> \xE9\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U8734> \xE9\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U8737> \xE9\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U873B> \xE9\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U873F> \xE9\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U8749> \xC0\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U874B> \xCF\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U874C> \xE9\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U874E> \xE9\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U8753> \xEA\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U8755> \xBF\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U8757> \xE9\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U8759> \xE9\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U875F> \xE9\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8760> \xE9\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U8763> \xEA\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U8766> \xB2\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U8768> \xE9\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U876A> \xEA\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U876E> \xE9\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U8774> \xE9\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U8776> \xC4\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U8778> \xE9\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U877F> \xC7\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U8782> \xEA\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U878D> \xCD\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U879F> \xEA\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U87A2> \xEA\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U87AB> \xEA\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U87AF> \xEA\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U87B3> \xEA\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U87BA> \xCD\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U87BB> \xEA\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U87BD> \xEA\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U87C0> \xEA\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U87C4> \xEA\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U87C6> \xEA\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U87C7> \xEA\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U87CB> \xEA\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U87D0> \xEA\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U87D2> \xEA\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U87E0> \xEA\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U87EF> \xEA\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U87F2> \xEA\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U87F6> \xEA\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U87F7> \xEA\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U87F9> \xB3\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U87FB> \xB5\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U87FE> \xEA\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U8805> \xEA\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U8807> \xFB\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U880D> \xEA\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U880E> \xEA\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U880F> \xEA\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U8811> \xEA\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U8815> \xEA\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U8816> \xEA\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U8821> \xEA\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U8822> \xEA\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8823> \xE9\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U8827> \xEA\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U8831> \xEA\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U8836> \xEA\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U8839> \xEA\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U883B> \xEA\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U8840> \xB7\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U8842> \xEA\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U8844> \xEA\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U8846> \xBD\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U884C> \xB9\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U884D> \xDE\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U8852> \xEA\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U8853> \xBD\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U8857> \xB3\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U8859> \xEA\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U885B> \xB1\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U885D> \xBE\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U885E> \xEA\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U8861> \xB9\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U8862> \xEA\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U8863> \xB0\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U8868> \xC9\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U886B> \xEA\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U8870> \xBF\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U8872> \xEA\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U8875> \xEA\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U8877> \xC3\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U887D> \xEA\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U887E> \xEA\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U887F> \xB6\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U8881> \xEA\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U8882> \xEA\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U8888> \xB7\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U888B> \xC2\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U888D> \xEA\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U8892> \xEA\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8896> \xC2\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U8897> \xEA\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8899> \xEA\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U889E> \xEA\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U88A2> \xEA\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U88A4> \xEA\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U88AB> \xC8\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U88AE> \xEA\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U88B0> \xEA\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U88B1> \xEA\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U88B4> \xB8\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U88B5> \xEA\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U88B7> \xB0\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U88BF> \xEA\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U88C1> \xBA\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U88C2> \xCE\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U88C3> \xEA\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U88C4> \xEA\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U88C5> \xC1\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U88CF> \xCE\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U88D4> \xEA\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U88D5> \xCD\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U88D8> \xEA\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U88D9> \xEA\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U88DC> \xCA\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U88DD> \xEA\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U88DF> \xBA\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U88E1> \xCE\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U88E8> \xEA\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U88F2> \xEA\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U88F3> \xBE\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U88F4> \xEA\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U88F5> \xFB\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U88F8> \xCD\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U88F9> \xEA\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U88FC> \xEA\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U88FD> \xC0\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U88FE> \xBF\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U8902> \xEA\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U8904> \xEA\xED |0 # CJK UNIFIED IDEOGRAPH
+<U8907> \xCA\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U890A> \xEA\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U890C> \xEA\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U8910> \xB3\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U8912> \xCB\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U8913> \xEA\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U891C> \xF9\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U891D> \xEA\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U891E> \xEA\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U8925> \xEA\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U892A> \xEA\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U892B> \xEA\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U8936> \xEA\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U8938> \xEA\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U893B> \xEA\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U8941> \xEA\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8943> \xEA\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U8944> \xEA\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U894C> \xEA\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U894D> \xF0\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U8956> \xB2\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U895E> \xEA\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U895F> \xB6\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U8960> \xEA\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U8964> \xEB\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U8966> \xEB\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U896A> \xEB\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U896D> \xEB\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U896F> \xEB\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U8972> \xBD\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U8974> \xEB\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U8977> \xEB\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U897E> \xEB\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U897F> \xC0\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U8981> \xCD\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8983> \xEB\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U8986> \xCA\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U8987> \xC7\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U8988> \xEB\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U898A> \xEB\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U898B> \xB8\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U898F> \xB5\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U8993> \xEB\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U8996> \xBB\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U8997> \xC7\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8998> \xEB\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U899A> \xB3\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U89A1> \xEB\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U89A6> \xEB\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U89A7> \xCD\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U89A9> \xEB\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U89AA> \xBF\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U89AC> \xEB\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U89AF> \xEB\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U89B2> \xEB\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U89B3> \xB4\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U89BA> \xEB\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U89BD> \xEB\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U89BF> \xEB\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U89C0> \xEB\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U89D2> \xB3\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U89DA> \xEB\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U89DC> \xEB\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U89DD> \xEB\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U89E3> \xB2\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U89E6> \xBF\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U89E7> \xEB\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U89F4> \xEB\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U89F8> \xEB\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U8A00> \xB8\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U8A02> \xC4\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U8A03> \xEB\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U8A08> \xB7\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8A0A> \xBF\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U8A0C> \xEB\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8A0E> \xC6\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U8A10> \xEB\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U8A12> \xFB\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U8A13> \xB7\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U8A16> \xEB\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U8A17> \xC2\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U8A18> \xB5\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U8A1B> \xEB\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U8A1D> \xEB\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U8A1F> \xBE\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U8A23> \xB7\xED |0 # CJK UNIFIED IDEOGRAPH
+<U8A25> \xEB\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U8A2A> \xCB\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U8A2D> \xC0\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U8A31> \xB5\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8A33> \xCC\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U8A34> \xC1\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U8A36> \xEB\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U8A37> \xFB\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U8A3A> \xBF\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U8A3B> \xC3\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U8A3C> \xBE\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U8A41> \xEB\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U8A46> \xEB\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U8A48> \xEB\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U8A50> \xBA\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U8A51> \xC2\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U8A52> \xEB\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U8A54> \xBE\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U8A55> \xC9\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U8A5B> \xEB\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U8A5E> \xBB\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U8A60> \xB1\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U8A62> \xEB\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U8A63> \xB7\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8A66> \xBB\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U8A69> \xBB\xED |0 # CJK UNIFIED IDEOGRAPH
+<U8A6B> \xCF\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U8A6C> \xEB\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U8A6D> \xEB\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U8A6E> \xC1\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U8A70> \xB5\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U8A71> \xCF\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U8A72> \xB3\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U8A73> \xBE\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U8A79> \xFB\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U8A7C> \xEB\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U8A82> \xEB\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U8A84> \xEB\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U8A85> \xEB\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U8A87> \xB8\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8A89> \xCD\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U8A8C> \xBB\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U8A8D> \xC7\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U8A91> \xEB\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U8A93> \xC0\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U8A95> \xC3\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U8A98> \xCD\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U8A9A> \xEB\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8A9E> \xB8\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U8AA0> \xC0\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U8AA1> \xEB\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U8AA3> \xEB\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8AA4> \xB8\xED |0 # CJK UNIFIED IDEOGRAPH
+<U8AA5> \xEB\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U8AA6> \xEB\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U8AA7> \xFB\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U8AA8> \xEB\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U8AAC> \xC0\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U8AAD> \xC6\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U8AB0> \xC3\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U8AB2> \xB2\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U8AB9> \xC8\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U8ABC> \xB5\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U8ABE> \xFB\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U8ABF> \xC4\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U8AC2> \xEB\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U8AC4> \xEB\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U8AC7> \xC3\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U8ACB> \xC0\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8ACC> \xB4\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U8ACD> \xEB\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U8ACF> \xBF\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U8AD2> \xCE\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U8AD6> \xCF\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U8ADA> \xEB\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U8ADB> \xEB\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U8ADC> \xC4\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U8ADE> \xEB\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U8ADF> \xFB\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U8AE0> \xEB\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U8AE1> \xEB\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U8AE2> \xEB\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U8AE4> \xEB\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U8AE6> \xC4\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U8AE7> \xEB\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U8AEB> \xEB\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U8AED> \xCD\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U8AEE> \xBB\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U8AF1> \xEB\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U8AF3> \xEB\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U8AF6> \xFB\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U8AF7> \xEB\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U8AF8> \xBD\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U8AFA> \xB8\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8AFE> \xC2\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U8B00> \xCB\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U8B01> \xB1\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U8B02> \xB0\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U8B04> \xC6\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U8B07> \xEB\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U8B0C> \xEB\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U8B0E> \xC6\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U8B10> \xEB\xED |0 # CJK UNIFIED IDEOGRAPH
+<U8B14> \xEB\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U8B16> \xEB\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U8B17> \xEB\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U8B19> \xB8\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U8B1A> \xEB\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U8B1B> \xB9\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U8B1D> \xBC\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U8B20> \xEB\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U8B21> \xCD\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8B26> \xEB\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U8B28> \xEB\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U8B2B> \xEB\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U8B2C> \xC9\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U8B33> \xEB\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U8B39> \xB6\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U8B3E> \xEB\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U8B41> \xEB\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8B49> \xEB\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U8B4C> \xEB\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U8B4E> \xEB\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U8B4F> \xEB\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U8B53> \xFB\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U8B56> \xEB\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U8B58> \xBC\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U8B5A> \xEB\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U8B5B> \xEB\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U8B5C> \xC9\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U8B5F> \xEC\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U8B66> \xB7\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U8B6B> \xEB\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U8B6C> \xEC\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U8B6F> \xEC\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U8B70> \xB5\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U8B71> \xE6\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8B72> \xBE\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U8B74> \xEC\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U8B77> \xB8\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U8B7D> \xEC\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U8B7F> \xFB\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U8B80> \xEC\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U8B83> \xBB\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U8B8A> \xDA\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U8B8C> \xEC\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U8B8E> \xEC\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U8B90> \xBD\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U8B92> \xEC\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U8B93> \xEC\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U8B96> \xEC\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U8B99> \xEC\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U8B9A> \xEC\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U8C37> \xC3\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U8C3A> \xEC\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U8C3F> \xEC\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U8C41> \xEC\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U8C46> \xC6\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U8C48> \xEC\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U8C4A> \xCB\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U8C4C> \xEC\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U8C4E> \xEC\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U8C50> \xEC\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U8C55> \xEC\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U8C5A> \xC6\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U8C61> \xBE\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U8C62> \xEC\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U8C6A> \xB9\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U8C6B> \xD0\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U8C6C> \xEC\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U8C78> \xEC\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U8C79> \xC9\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U8C7A> \xEC\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U8C7C> \xEC\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8C82> \xEC\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U8C85> \xEC\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U8C89> \xEC\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U8C8A> \xEC\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U8C8C> \xCB\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U8C8D> \xEC\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U8C8E> \xEC\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U8C94> \xEC\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U8C98> \xEC\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U8C9D> \xB3\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U8C9E> \xC4\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U8CA0> \xC9\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U8CA1> \xBA\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U8CA2> \xB9\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8CA7> \xC9\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U8CA8> \xB2\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U8CA9> \xC8\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U8CAA> \xEC\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U8CAB> \xB4\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U8CAC> \xC0\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U8CAD> \xEC\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U8CAE> \xEC\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U8CAF> \xC3\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U8CB0> \xCC\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U8CB2> \xEC\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U8CB3> \xEC\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U8CB4> \xB5\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U8CB6> \xEC\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U8CB7> \xC7\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U8CB8> \xC2\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U8CBB> \xC8\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U8CBC> \xC5\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U8CBD> \xEC\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U8CBF> \xCB\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U8CC0> \xB2\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U8CC1> \xEC\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U8CC2> \xCF\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U8CC3> \xC4\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U8CC4> \xCF\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U8CC7> \xBB\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U8CC8> \xEC\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U8CCA> \xC2\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U8CCD> \xEC\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U8CCE> \xC1\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U8CD1> \xC6\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U8CD3> \xC9\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U8CDA> \xEC\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U8CDB> \xBB\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U8CDC> \xBB\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U8CDE> \xBE\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U8CE0> \xC7\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U8CE2> \xB8\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U8CE3> \xEC\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U8CE4> \xEC\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U8CE6> \xC9\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U8CEA> \xBC\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8CED> \xC5\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U8CF0> \xFB\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U8CF4> \xFB\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U8CFA> \xEC\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U8CFB> \xEC\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U8CFC> \xB9\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8CFD> \xEC\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U8D04> \xEC\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U8D05> \xEC\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U8D07> \xEC\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U8D08> \xC2\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U8D0A> \xEC\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U8D0B> \xB4\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U8D0D> \xEC\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8D0F> \xEC\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8D10> \xEC\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U8D12> \xFB\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U8D13> \xEC\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U8D14> \xEC\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U8D16> \xEC\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U8D64> \xC0\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U8D66> \xBC\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U8D67> \xEC\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U8D6B> \xB3\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U8D6D> \xEC\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U8D70> \xC1\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8D71> \xEC\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U8D73> \xEC\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U8D74> \xC9\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U8D76> \xFB\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U8D77> \xB5\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U8D81> \xEC\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U8D85> \xC4\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U8D8A> \xB1\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U8D99> \xEC\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U8DA3> \xBC\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U8DA8> \xBF\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8DB3> \xC2\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U8DBA> \xEC\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U8DBE> \xEC\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U8DC2> \xEC\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U8DCB> \xEC\xED |0 # CJK UNIFIED IDEOGRAPH
+<U8DCC> \xEC\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U8DCF> \xEC\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U8DD6> \xEC\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U8DDA> \xEC\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U8DDB> \xEC\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U8DDD> \xB5\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U8DDF> \xEC\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U8DE1> \xC0\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8DE3> \xEC\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U8DE8> \xB8\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U8DEA> \xEC\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U8DEB> \xEC\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U8DEF> \xCF\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U8DF3> \xC4\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U8DF5> \xC1\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U8DFC> \xEC\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U8DFF> \xEC\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U8E08> \xEC\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U8E09> \xEC\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U8E0A> \xCD\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U8E0F> \xC6\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U8E10> \xEC\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U8E1D> \xEC\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8E1E> \xEC\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U8E1F> \xEC\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U8E2A> \xED\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U8E30> \xEC\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U8E34> \xEC\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U8E35> \xEC\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U8E42> \xEC\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U8E44> \xC4\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U8E47> \xED\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U8E48> \xED\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U8E49> \xED\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U8E4A> \xEC\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U8E4C> \xED\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U8E50> \xED\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U8E55> \xED\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U8E59> \xED\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U8E5F> \xC0\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8E60> \xED\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U8E63> \xED\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U8E64> \xED\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U8E72> \xED\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U8E74> \xBD\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U8E76> \xED\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U8E7C> \xED\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U8E81> \xED\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U8E84> \xED\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U8E85> \xED\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U8E87> \xED\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U8E8A> \xED\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U8E8B> \xED\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U8E8D> \xCC\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8E91> \xED\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U8E93> \xED\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U8E94> \xED\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U8E99> \xED\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U8EA1> \xED\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U8EAA> \xED\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U8EAB> \xBF\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U8EAC> \xED\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U8EAF> \xB6\xED |0 # CJK UNIFIED IDEOGRAPH
+<U8EB0> \xED\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U8EB1> \xED\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U8EBE> \xED\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U8EC5> \xED\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U8EC6> \xED\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U8EC8> \xED\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8ECA> \xBC\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U8ECB> \xED\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U8ECC> \xB5\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U8ECD> \xB7\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U8ECF> \xFB\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8ED2> \xB8\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U8EDB> \xED\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U8EDF> \xC6\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U8EE2> \xC5\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U8EE3> \xED\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U8EEB> \xED\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U8EF8> \xBC\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U8EFB> \xED\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U8EFC> \xED\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U8EFD> \xB7\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U8EFE> \xED\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U8F03> \xB3\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U8F05> \xED\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U8F09> \xBA\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U8F0A> \xED\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U8F0C> \xED\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U8F12> \xED\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U8F13> \xED\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U8F14> \xCA\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U8F15> \xED\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U8F19> \xED\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U8F1B> \xED\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U8F1C> \xED\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U8F1D> \xB5\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U8F1F> \xED\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U8F26> \xED\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U8F29> \xC7\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U8F2A> \xCE\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8F2F> \xBD\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U8F33> \xED\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U8F38> \xCD\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U8F39> \xED\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U8F3B> \xED\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U8F3E> \xED\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U8F3F> \xCD\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U8F42> \xED\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U8F44> \xB3\xED |0 # CJK UNIFIED IDEOGRAPH
+<U8F45> \xED\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8F46> \xED\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U8F49> \xED\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U8F4C> \xED\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U8F4D> \xC5\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U8F4E> \xED\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U8F57> \xED\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U8F5C> \xED\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U8F5F> \xB9\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U8F61> \xB7\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U8F62> \xED\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U8F63> \xED\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U8F64> \xED\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U8F9B> \xBF\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U8F9C> \xED\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U8F9E> \xBC\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U8F9F> \xED\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U8FA3> \xED\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U8FA7> \xD2\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U8FA8> \xD1\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U8FAD> \xED\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U8FAE> \xE5\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U8FAF> \xED\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U8FB0> \xC3\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U8FB1> \xBF\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U8FB2> \xC7\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U8FB7> \xED\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U8FBA> \xCA\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U8FBB> \xC4\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U8FBC> \xB9\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U8FBF> \xC3\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U8FC2> \xB1\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U8FC4> \xCB\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U8FC5> \xBF\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U8FCE> \xB7\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U8FD1> \xB6\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U8FD4> \xCA\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U8FDA> \xED\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U8FE2> \xED\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U8FE5> \xED\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U8FE6> \xB2\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U8FE9> \xC6\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U8FEA> \xED\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U8FEB> \xC7\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U8FED> \xC5\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U8FEF> \xED\xED |0 # CJK UNIFIED IDEOGRAPH
+<U8FF0> \xBD\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U8FF4> \xED\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U8FF7> \xCC\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U8FF8> \xED\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U8FF9> \xED\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U8FFA> \xED\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U8FFD> \xC4\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U9000> \xC2\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U9001> \xC1\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U9003> \xC6\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U9005> \xED\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U9006> \xB5\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U900B> \xED\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U900D> \xED\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U900E> \xEE\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U900F> \xC6\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U9010> \xC3\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U9011> \xED\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U9013> \xC4\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U9014> \xC5\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U9015> \xED\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U9016> \xED\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U9017> \xBF\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U9019> \xC7\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U901A> \xC4\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U901D> \xC0\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U901E> \xED\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U901F> \xC2\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U9020> \xC2\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U9021> \xED\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U9022> \xB0\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U9023> \xCF\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U9027> \xED\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U902E> \xC2\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U9031> \xBD\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U9032> \xBF\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U9035> \xED\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U9036> \xED\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U9038> \xB0\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U9039> \xED\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U903C> \xC9\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U903E> \xEE\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U9041> \xC6\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U9042> \xBF\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U9045> \xC3\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U9047> \xB6\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U9049> \xEE\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U904A> \xCD\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U904B> \xB1\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U904D> \xCA\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U904E> \xB2\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U904F> \xEE\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U9050> \xEE\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U9051> \xEE\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U9052> \xEE\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U9053> \xC6\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U9054> \xC3\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U9055> \xB0\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U9056> \xEE\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U9058> \xEE\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U9059> \xF4\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U905C> \xC2\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U905E> \xEE\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U9060> \xB1\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U9061> \xC1\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U9063> \xB8\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U9065> \xCD\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U9067> \xFB\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U9068> \xEE\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U9069> \xC5\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U906D> \xC1\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U906E> \xBC\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U906F> \xEE\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U9072> \xEE\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U9075> \xBD\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U9076> \xEE\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U9077> \xC1\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U9078> \xC1\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U907A> \xB0\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U907C> \xCE\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U907D> \xEE\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U907F> \xC8\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U9080> \xEE\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U9081> \xEE\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U9082> \xEE\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U9083> \xE3\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U9084> \xB4\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U9087> \xED\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U9089> \xEE\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U908A> \xEE\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U908F> \xEE\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U9091> \xCD\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U90A3> \xC6\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U90A6> \xCB\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U90A8> \xEE\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U90AA> \xBC\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U90AF> \xEE\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U90B1> \xEE\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U90B5> \xEE\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U90B8> \xC5\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U90C1> \xB0\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U90CA> \xB9\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U90CE> \xCF\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U90DB> \xEE\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U90DE> \xFB\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U90E1> \xB7\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U90E2> \xEE\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U90E4> \xEE\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U90E8> \xC9\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U90ED> \xB3\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U90F5> \xCD\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U90F7> \xB6\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U90FD> \xC5\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U9102> \xEE\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U9112> \xEE\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U9115> \xFB\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U9119> \xEE\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U9127> \xFB\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U912D> \xC5\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U9130> \xEE\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U9132> \xEE\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U9149> \xC6\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U914A> \xEE\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U914B> \xBD\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U914C> \xBC\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U914D> \xC7\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U914E> \xC3\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U9152> \xBC\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U9154> \xBF\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U9156> \xEE\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U9158> \xEE\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U9162> \xBF\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U9163> \xEE\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U9165> \xEE\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U9169> \xEE\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U916A> \xCD\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U916C> \xBD\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U9172> \xEE\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U9173> \xEE\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U9175> \xB9\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U9177> \xB9\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U9178> \xBB\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U9182> \xEE\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U9187> \xBD\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U9189> \xEE\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U918B> \xEE\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U918D> \xC2\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U9190> \xB8\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U9192> \xC0\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U9197> \xC8\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U919C> \xBD\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U91A2> \xEE\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U91A4> \xBE\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U91AA> \xEE\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U91AB> \xEE\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U91AF> \xEE\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U91B4> \xEE\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U91B5> \xEE\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U91B8> \xBE\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U91BA> \xEE\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U91C0> \xEE\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U91C1> \xEE\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U91C6> \xC8\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U91C7> \xBA\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U91C8> \xBC\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U91C9> \xEE\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U91CB> \xEE\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U91CC> \xCE\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U91CD> \xBD\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U91CE> \xCC\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U91CF> \xCE\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U91D0> \xEE\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U91D1> \xB6\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U91D6> \xEE\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U91D7> \xFC\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U91D8> \xC5\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U91DA> \xFB\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U91DB> \xEE\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U91DC> \xB3\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U91DD> \xBF\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U91DE> \xFC\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U91DF> \xEE\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U91E1> \xEE\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U91E3> \xC4\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U91E4> \xFC\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U91E5> \xFC\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U91E6> \xCB\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U91E7> \xB6\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U91ED> \xFC\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U91EE> \xFC\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U91F5> \xEE\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U91F6> \xEE\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U91FC> \xEE\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U91FF> \xEE\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U9206> \xFC\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U920A> \xFC\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U920D> \xC6\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U920E> \xB3\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U9210> \xFC\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U9211> \xEE\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U9214> \xEE\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U9215> \xEE\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U921E> \xEE\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U9229> \xEF\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U922C> \xEE\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U9234> \xCE\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U9237> \xB8\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U9239> \xFC\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U923A> \xFC\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U923C> \xFC\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U923F> \xEE\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U9240> \xFC\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U9244> \xC5\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U9245> \xEE\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U9248> \xEE\xED |0 # CJK UNIFIED IDEOGRAPH
+<U9249> \xEE\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U924B> \xEE\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U924E> \xFC\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U9250> \xEE\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U9251> \xFC\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U9257> \xEE\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U9259> \xFC\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U925A> \xEE\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U925B> \xB1\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U925E> \xEE\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U9262> \xC8\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U9264> \xEE\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U9266> \xBE\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U9267> \xFC\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U9271> \xB9\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U9277> \xFC\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U9278> \xFC\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U927E> \xCB\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U9280> \xB6\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U9283> \xBD\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U9285> \xC6\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U9288> \xF9\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U9291> \xC1\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U9293> \xEE\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U9295> \xEE\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U9296> \xEE\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U9298> \xCC\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U929A> \xC4\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U929B> \xEE\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U929C> \xEE\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U92A7> \xFC\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U92AD> \xC1\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U92B7> \xEE\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U92B9> \xEE\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U92CF> \xEE\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U92D0> \xFC\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U92D2> \xCB\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U92D3> \xFC\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U92D5> \xFC\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U92D7> \xFC\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U92D9> \xFC\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U92E0> \xFC\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U92E4> \xBD\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U92E7> \xFC\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U92E9> \xEE\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U92EA> \xCA\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U92ED> \xB1\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U92F2> \xC9\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U92F3> \xC3\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U92F8> \xB5\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U92F9> \xF9\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U92FA> \xEE\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U92FB> \xFC\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U92FC> \xB9\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U92FF> \xFC\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U9302> \xFC\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U9306> \xBB\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U930F> \xEE\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U9310> \xBF\xED |0 # CJK UNIFIED IDEOGRAPH
+<U9318> \xBF\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U9319> \xEF\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U931A> \xEF\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U931D> \xFC\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U931E> \xFC\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U9320> \xBE\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U9321> \xFC\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U9322> \xEF\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U9323> \xEF\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U9325> \xFC\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U9326> \xB6\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U9328> \xC9\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U932B> \xBC\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U932C> \xCF\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U932E> \xEE\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U932F> \xBA\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U9332> \xCF\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U9335> \xEF\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U933A> \xEF\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U933B> \xEF\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U9344> \xEE\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U9348> \xF9\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U934B> \xC6\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U934D> \xC5\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U9354> \xC4\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U9356> \xEF\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U9357> \xFC\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U935B> \xC3\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U935C> \xEF\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U9360> \xEF\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U936C> \xB7\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U936E> \xEF\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U9370> \xFC\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U9375> \xB8\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U937C> \xEF\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U937E> \xBE\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U938C> \xB3\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U9394> \xEF\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U9396> \xBA\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U9397> \xC1\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U939A> \xC4\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U93A4> \xFC\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U93A7> \xB3\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U93AC> \xEF\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U93AD> \xEF\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U93AE> \xC4\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U93B0> \xEF\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U93B9> \xEF\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U93C3> \xEF\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U93C6> \xFC\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U93C8> \xEF\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U93D0> \xEF\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U93D1> \xC5\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U93D6> \xEF\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U93D7> \xEF\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U93D8> \xEF\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U93DD> \xEF\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U93DE> \xFC\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U93E1> \xB6\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U93E4> \xEF\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U93E5> \xEF\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U93E8> \xEF\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U93F8> \xFC\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U9403> \xEF\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U9407> \xEF\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U9410> \xEF\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U9413> \xEF\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U9414> \xEF\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U9418> \xBE\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U9419> \xC6\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U941A> \xEF\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U9421> \xEF\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U942B> \xEF\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U9431> \xFC\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U9435> \xEF\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U9436> \xEF\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U9438> \xC2\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U943A> \xEF\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U9441> \xEF\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U9444> \xEF\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U9445> \xFC\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U9448> \xFC\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U9451> \xB4\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U9452> \xEF\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U9453> \xCC\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U945A> \xEF\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U945B> \xEF\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U945E> \xEF\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U9460> \xEF\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U9462> \xEF\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U946A> \xEF\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U9470> \xEF\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U9475> \xEF\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U9477> \xEF\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U947C> \xEF\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U947D> \xEF\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U947E> \xEF\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U947F> \xEF\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U9481> \xEF\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U9577> \xC4\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U9580> \xCC\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U9582> \xEF\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U9583> \xC1\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U9587> \xEF\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U9589> \xCA\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U958A> \xEF\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U958B> \xB3\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U958F> \xB1\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U9591> \xB4\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U9592> \xFC\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U9593> \xB4\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U9594> \xEF\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U9596> \xEF\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U9598> \xEF\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U9599> \xEF\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U95A0> \xEF\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U95A2> \xB4\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U95A3> \xB3\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U95A4> \xB9\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U95A5> \xC8\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U95A7> \xEF\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U95A8> \xEF\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U95AD> \xEF\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U95B2> \xB1\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U95B9> \xEF\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U95BB> \xEF\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U95BC> \xEF\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U95BE> \xEF\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U95C3> \xEF\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U95C7> \xB0\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U95CA> \xEF\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U95CC> \xEF\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U95CD> \xEF\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U95D4> \xEF\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U95D5> \xEF\xED |0 # CJK UNIFIED IDEOGRAPH
+<U95D6> \xEF\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U95D8> \xC6\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U95DC> \xEF\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U95E1> \xEF\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U95E2> \xEF\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U95E5> \xEF\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U961C> \xC9\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U9621> \xEF\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U9628> \xEF\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U962A> \xBA\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U962E> \xEF\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U962F> \xEF\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U9632> \xCB\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U963B> \xC1\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U963F> \xB0\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U9640> \xC2\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U9642> \xEF\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U9644> \xC9\xED |0 # CJK UNIFIED IDEOGRAPH
+<U964B> \xEF\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U964C> \xEF\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U964D> \xB9\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U964F> \xEF\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U9650> \xB8\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U965B> \xCA\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U965C> \xEF\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U965D> \xF0\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U965E> \xEF\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U965F> \xF0\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U9662> \xB1\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U9663> \xBF\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U9664> \xBD\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U9665> \xB4\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U9666> \xF0\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U966A> \xC7\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U966C> \xF0\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U9670> \xB1\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U9672> \xF0\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U9673> \xC4\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U9675> \xCE\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U9676> \xC6\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U9677> \xEF\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U9678> \xCE\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U967A> \xB8\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U967D> \xCD\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U9685> \xB6\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U9686> \xCE\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U9688> \xB7\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U968A> \xC2\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U968B> \xE7\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U968D> \xF0\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U968E> \xB3\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U968F> \xBF\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U9694> \xB3\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U9695> \xF0\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U9697> \xF0\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U9698> \xF0\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U9699> \xB7\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U969B> \xBA\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U969C> \xBE\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U969D> \xFC\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U96A0> \xB1\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U96A3> \xCE\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U96A7> \xF0\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U96A8> \xEE\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U96AA> \xF0\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U96AF> \xFC\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U96B0> \xF0\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U96B1> \xF0\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U96B2> \xF0\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U96B4> \xF0\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U96B6> \xF0\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U96B7> \xCE\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U96B8> \xF0\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U96B9> \xF0\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U96BB> \xC0\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U96BC> \xC8\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U96C0> \xBF\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U96C1> \xB4\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U96C4> \xCD\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U96C5> \xB2\xED |0 # CJK UNIFIED IDEOGRAPH
+<U96C6> \xBD\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U96C7> \xB8\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U96C9> \xF0\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U96CB> \xF0\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U96CC> \xBB\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U96CD> \xF0\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U96CE> \xF0\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U96D1> \xBB\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U96D5> \xF0\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U96D6> \xEA\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U96D9> \xD2\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U96DB> \xBF\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U96DC> \xF0\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U96E2> \xCE\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U96E3> \xC6\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U96E8> \xB1\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U96EA> \xC0\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U96EB> \xBC\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U96F0> \xCA\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U96F2> \xB1\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U96F6> \xCE\xED |0 # CJK UNIFIED IDEOGRAPH
+<U96F7> \xCD\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U96F9> \xF0\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U96FB> \xC5\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U9700> \xBC\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U9704> \xF0\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U9706> \xF0\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U9707> \xBF\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U9708> \xF0\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U970A> \xCE\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U970D> \xF0\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U970E> \xF0\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U970F> \xF0\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U9711> \xF0\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U9713> \xF0\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U9716> \xF0\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U9719> \xF0\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U971C> \xC1\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U971E> \xB2\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U9724> \xF0\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U9727> \xCC\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U972A> \xF0\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U9730> \xF0\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U9732> \xCF\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U9733> \xFC\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U9738> \xDB\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U9739> \xF0\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U973B> \xFC\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U973D> \xF0\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U973E> \xF0\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U9742> \xF0\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U9743> \xFC\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U9744> \xF0\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U9746> \xF0\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U9748> \xF0\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U9749> \xF0\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U974D> \xFC\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U974F> \xFC\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U9751> \xFC\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U9752> \xC0\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U9755> \xFC\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U9756> \xCC\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U9759> \xC0\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U975C> \xF0\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U975E> \xC8\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U9760> \xF0\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U9761> \xF3\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U9762> \xCC\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U9764> \xF0\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U9766> \xF0\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U9768> \xF0\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U9769> \xB3\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U976B> \xF0\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U976D> \xBF\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U9771> \xF0\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U9774> \xB7\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U9779> \xF0\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U977A> \xF0\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U977C> \xF0\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U9781> \xF0\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U9784> \xB3\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U9785> \xF0\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U9786> \xF0\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U978B> \xF0\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U978D> \xB0\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U978F> \xF0\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U9790> \xF0\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U9798> \xBE\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U979C> \xF0\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U97A0> \xB5\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U97A3> \xF0\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U97A6> \xF0\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U97A8> \xF0\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U97AB> \xEB\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U97AD> \xCA\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U97B3> \xF0\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U97B4> \xF0\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U97C3> \xF0\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U97C6> \xF0\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U97C8> \xF0\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U97CB> \xF0\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U97D3> \xB4\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U97DC> \xF0\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U97ED> \xF0\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U97EE> \xC7\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U97F2> \xF0\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U97F3> \xB2\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U97F5> \xF0\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U97F6> \xF0\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U97FB> \xB1\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U97FF> \xB6\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U9801> \xCA\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U9802> \xC4\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U9803> \xBA\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U9805> \xB9\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U9806> \xBD\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U9808> \xBF\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U980C> \xF0\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U980F> \xF0\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U9810> \xCD\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U9811> \xB4\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U9812> \xC8\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U9813> \xC6\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U9817> \xBF\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U9818> \xCE\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U981A> \xB7\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U9821> \xF0\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U9824> \xF0\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U982C> \xCB\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U982D> \xC6\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U9834> \xB1\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U9837> \xF0\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U9838> \xF0\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U983B> \xC9\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U983C> \xCD\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U983D> \xF0\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U9846> \xF0\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U984B> \xF0\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U984C> \xC2\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U984D> \xB3\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U984E> \xB3\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U984F> \xF0\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U9854> \xB4\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U9855> \xB8\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U9857> \xFC\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U9858> \xB4\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U985B> \xC5\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U985E> \xCE\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U9865> \xFC\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U9867> \xB8\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U986B> \xF0\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U986F> \xF0\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U9870> \xF0\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U9871> \xF1\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U9873> \xF1\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U9874> \xF1\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U98A8> \xC9\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U98AA> \xF1\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U98AF> \xF1\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U98B1> \xF1\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U98B6> \xF1\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U98C3> \xF1\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U98C4> \xF1\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U98C6> \xF1\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U98DB> \xC8\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U98DC> \xE6\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U98DF> \xBF\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U98E2> \xB5\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U98E9> \xF1\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U98EB> \xF1\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U98ED> \xD2\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U98EE> \xDD\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U98EF> \xC8\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U98F2> \xB0\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U98F4> \xB0\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U98FC> \xBB\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U98FD> \xCB\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U98FE> \xBE\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U9903> \xF1\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U9905> \xCC\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U9909> \xF1\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U990A> \xCD\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U990C> \xB1\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U9910> \xBB\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U9912> \xF1\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U9913> \xB2\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U9914> \xF1\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U9918> \xF1\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U991D> \xF1\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U991E> \xF1\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U9920> \xF1\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U9921> \xF1\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U9924> \xF1\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U9927> \xFC\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U9928> \xB4\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U992C> \xF1\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U992E> \xF1\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U993D> \xF1\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U993E> \xF1\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U9942> \xF1\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U9945> \xF1\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U9949> \xF1\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U994B> \xF1\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U994C> \xF1\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U9950> \xF1\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U9951> \xF1\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U9952> \xF1\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U9955> \xF1\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U9957> \xB6\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U9996> \xBC\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U9997> \xF1\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U9998> \xF1\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U9999> \xB9\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U999E> \xFC\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U99A5> \xF1\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U99A8> \xB3\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U99AC> \xC7\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U99AD> \xF1\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U99AE> \xF1\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U99B3> \xC3\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U99B4> \xC6\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U99BC> \xF1\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U99C1> \xC7\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U99C4> \xC2\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U99C5> \xB1\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U99C6> \xB6\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U99C8> \xB6\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U99D0> \xC3\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U99D1> \xF1\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U99D2> \xB6\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U99D5> \xB2\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U99D8> \xF1\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U99DB> \xF1\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U99DD> \xF1\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U99DF> \xF1\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U99E2> \xF1\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U99ED> \xF1\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U99EE> \xF1\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U99F1> \xF1\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U99F2> \xF1\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U99F8> \xF1\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U99FB> \xF1\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U99FF> \xBD\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U9A01> \xF1\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U9A05> \xF1\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U9A0E> \xB5\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U9A0F> \xF1\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U9A12> \xC1\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U9A13> \xB8\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U9A19> \xF1\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U9A28> \xC2\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U9A2B> \xF1\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U9A30> \xC6\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U9A37> \xF1\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U9A3E> \xF1\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U9A40> \xF1\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U9A42> \xF1\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U9A43> \xF1\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U9A45> \xF1\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U9A4D> \xF1\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U9A4E> \xFC\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U9A55> \xF1\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U9A57> \xF1\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U9A5A> \xB6\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U9A5B> \xF1\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U9A5F> \xF1\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U9A62> \xF1\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U9A64> \xF1\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U9A65> \xF1\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U9A69> \xF1\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U9A6A> \xF1\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U9A6B> \xF1\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U9AA8> \xB9\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U9AAD> \xF1\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U9AB0> \xF1\xED |0 # CJK UNIFIED IDEOGRAPH
+<U9AB8> \xB3\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U9ABC> \xF1\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U9AC0> \xF1\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U9AC4> \xBF\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U9ACF> \xF1\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U9AD1> \xF1\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U9AD3> \xF1\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U9AD4> \xF1\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U9AD8> \xB9\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U9AD9> \xFC\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U9ADC> \xFC\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U9ADE> \xF1\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U9ADF> \xF1\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U9AE2> \xF1\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U9AE3> \xF1\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U9AE6> \xF1\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U9AEA> \xC8\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U9AEB> \xF1\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U9AED> \xC9\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U9AEE> \xF1\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U9AEF> \xF1\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U9AF1> \xF1\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U9AF4> \xF1\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U9AF7> \xF1\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U9AFB> \xF2\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U9B06> \xF2\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U9B18> \xF2\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U9B1A> \xF2\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U9B1F> \xF2\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U9B22> \xF2\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U9B23> \xF2\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U9B25> \xF2\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U9B27> \xF2\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U9B28> \xF2\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U9B29> \xF2\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U9B2A> \xF2\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U9B2E> \xF2\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U9B2F> \xF2\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U9B31> \xDD\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U9B32> \xF2\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U9B3B> \xE4\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U9B3C> \xB5\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U9B41> \xB3\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U9B42> \xBA\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U9B43> \xF2\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U9B44> \xF2\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U9B45> \xCC\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U9B4D> \xF2\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U9B4E> \xF2\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U9B4F> \xF2\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U9B51> \xF2\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U9B54> \xCB\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U9B58> \xF2\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U9B5A> \xB5\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U9B6F> \xCF\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U9B72> \xFC\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U9B74> \xF2\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U9B75> \xFC\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U9B83> \xF2\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U9B8E> \xB0\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U9B8F> \xFC\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U9B91> \xF2\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U9B92> \xCA\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U9B93> \xF2\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U9B96> \xF2\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U9B97> \xF2\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U9B9F> \xF2\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U9BA0> \xF2\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U9BA8> \xF2\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U9BAA> \xCB\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U9BAB> \xBB\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U9BAD> \xBA\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U9BAE> \xC1\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U9BB1> \xFC\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U9BB4> \xF2\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U9BB9> \xF2\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U9BBB> \xFC\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U9BC0> \xF2\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U9BC6> \xF2\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U9BC9> \xB8\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U9BCA> \xF2\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U9BCF> \xF2\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U9BD1> \xF2\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U9BD2> \xF2\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U9BD4> \xF2\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U9BD6> \xBB\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U9BDB> \xC2\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U9BE1> \xF2\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U9BE2> \xF2\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U9BE3> \xF2\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U9BE4> \xF2\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U9BE8> \xB7\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U9BF0> \xF2\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U9BF1> \xF2\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U9BF2> \xF2\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U9BF5> \xB0\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U9C00> \xFC\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U9C04> \xF2\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U9C06> \xF2\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U9C08> \xF2\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U9C09> \xF2\xD3 |0 # CJK UNIFIED IDEOGRAPH
+<U9C0A> \xF2\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U9C0C> \xF2\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U9C0D> \xB3\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U9C10> \xCF\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U9C12> \xF2\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U9C13> \xF2\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U9C14> \xF2\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U9C15> \xF2\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U9C1B> \xF2\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U9C21> \xF2\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U9C24> \xF2\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U9C25> \xF2\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U9C2D> \xC9\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U9C2E> \xF2\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U9C2F> \xB0\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U9C30> \xF2\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U9C32> \xF2\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U9C39> \xB3\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U9C3A> \xF2\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U9C3B> \xB1\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U9C3E> \xF2\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U9C46> \xF2\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U9C47> \xF2\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U9C48> \xC3\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U9C52> \xCB\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U9C57> \xCE\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U9C5A> \xF2\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U9C60> \xF2\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U9C67> \xF2\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U9C76> \xF2\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U9C78> \xF2\xE9 |0 # CJK UNIFIED IDEOGRAPH
+<U9CE5> \xC4\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U9CE7> \xF2\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U9CE9> \xC8\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U9CEB> \xF2\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U9CEC> \xF2\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U9CF0> \xF2\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U9CF3> \xCB\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U9CF4> \xCC\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U9CF6> \xC6\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U9D03> \xF2\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U9D06> \xF2\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U9D07> \xC6\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U9D08> \xF2\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U9D09> \xF2\xED |0 # CJK UNIFIED IDEOGRAPH
+<U9D0E> \xB2\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U9D12> \xF2\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U9D15> \xF2\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U9D1B> \xB1\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U9D1F> \xF2\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U9D23> \xF2\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U9D26> \xF2\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U9D28> \xB3\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U9D2A> \xF2\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U9D2B> \xBC\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U9D2C> \xB2\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U9D3B> \xB9\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U9D3E> \xF2\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U9D3F> \xF2\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U9D41> \xF2\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U9D44> \xF2\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U9D46> \xF2\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U9D48> \xF2\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U9D50> \xF3\xA5 |0 # CJK UNIFIED IDEOGRAPH
+<U9D51> \xF3\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U9D59> \xF3\xA6 |0 # CJK UNIFIED IDEOGRAPH
+<U9D5C> \xB1\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U9D5D> \xF3\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U9D5E> \xF3\xA2 |0 # CJK UNIFIED IDEOGRAPH
+<U9D60> \xB9\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U9D61> \xCC\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U9D64> \xF3\xA3 |0 # CJK UNIFIED IDEOGRAPH
+<U9D6B> \xFC\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U9D6C> \xCB\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U9D6F> \xF3\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U9D70> \xFC\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U9D72> \xF3\xA7 |0 # CJK UNIFIED IDEOGRAPH
+<U9D7A> \xF3\xAC |0 # CJK UNIFIED IDEOGRAPH
+<U9D87> \xF3\xA9 |0 # CJK UNIFIED IDEOGRAPH
+<U9D89> \xF3\xA8 |0 # CJK UNIFIED IDEOGRAPH
+<U9D8F> \xB7\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U9D9A> \xF3\xAD |0 # CJK UNIFIED IDEOGRAPH
+<U9DA4> \xF3\xAE |0 # CJK UNIFIED IDEOGRAPH
+<U9DA9> \xF3\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U9DAB> \xF3\xAA |0 # CJK UNIFIED IDEOGRAPH
+<U9DAF> \xF2\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U9DB2> \xF3\xB0 |0 # CJK UNIFIED IDEOGRAPH
+<U9DB4> \xC4\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U9DB8> \xF3\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U9DBA> \xF3\xB5 |0 # CJK UNIFIED IDEOGRAPH
+<U9DBB> \xF3\xB3 |0 # CJK UNIFIED IDEOGRAPH
+<U9DC1> \xF3\xB2 |0 # CJK UNIFIED IDEOGRAPH
+<U9DC2> \xF3\xB8 |0 # CJK UNIFIED IDEOGRAPH
+<U9DC4> \xF3\xB1 |0 # CJK UNIFIED IDEOGRAPH
+<U9DC6> \xF3\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U9DCF> \xF3\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U9DD3> \xF3\xBA |0 # CJK UNIFIED IDEOGRAPH
+<U9DD9> \xF3\xB9 |0 # CJK UNIFIED IDEOGRAPH
+<U9DE6> \xF3\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U9DED> \xF3\xBD |0 # CJK UNIFIED IDEOGRAPH
+<U9DEF> \xF3\xBE |0 # CJK UNIFIED IDEOGRAPH
+<U9DF2> \xCF\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U9DF8> \xF3\xBB |0 # CJK UNIFIED IDEOGRAPH
+<U9DF9> \xC2\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U9DFA> \xBA\xED |0 # CJK UNIFIED IDEOGRAPH
+<U9DFD> \xF3\xBF |0 # CJK UNIFIED IDEOGRAPH
+<U9E19> \xFC\xED |0 # CJK UNIFIED IDEOGRAPH
+<U9E1A> \xF3\xC0 |0 # CJK UNIFIED IDEOGRAPH
+<U9E1B> \xF3\xC1 |0 # CJK UNIFIED IDEOGRAPH
+<U9E1E> \xF3\xC2 |0 # CJK UNIFIED IDEOGRAPH
+<U9E75> \xF3\xC3 |0 # CJK UNIFIED IDEOGRAPH
+<U9E78> \xB8\xB4 |0 # CJK UNIFIED IDEOGRAPH
+<U9E79> \xF3\xC4 |0 # CJK UNIFIED IDEOGRAPH
+<U9E7D> \xF3\xC5 |0 # CJK UNIFIED IDEOGRAPH
+<U9E7F> \xBC\xAF |0 # CJK UNIFIED IDEOGRAPH
+<U9E81> \xF3\xC6 |0 # CJK UNIFIED IDEOGRAPH
+<U9E88> \xF3\xC7 |0 # CJK UNIFIED IDEOGRAPH
+<U9E8B> \xF3\xC8 |0 # CJK UNIFIED IDEOGRAPH
+<U9E8C> \xF3\xC9 |0 # CJK UNIFIED IDEOGRAPH
+<U9E91> \xF3\xCC |0 # CJK UNIFIED IDEOGRAPH
+<U9E92> \xF3\xCA |0 # CJK UNIFIED IDEOGRAPH
+<U9E93> \xCF\xBC |0 # CJK UNIFIED IDEOGRAPH
+<U9E95> \xF3\xCB |0 # CJK UNIFIED IDEOGRAPH
+<U9E97> \xCE\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U9E9D> \xF3\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U9E9F> \xCE\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U9EA5> \xF3\xCE |0 # CJK UNIFIED IDEOGRAPH
+<U9EA6> \xC7\xFE |0 # CJK UNIFIED IDEOGRAPH
+<U9EA9> \xF3\xCF |0 # CJK UNIFIED IDEOGRAPH
+<U9EAA> \xF3\xD1 |0 # CJK UNIFIED IDEOGRAPH
+<U9EAD> \xF3\xD2 |0 # CJK UNIFIED IDEOGRAPH
+<U9EB8> \xF3\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U9EB9> \xB9\xED |0 # CJK UNIFIED IDEOGRAPH
+<U9EBA> \xCC\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U9EBB> \xCB\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U9EBC> \xD6\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U9EBE> \xDD\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U9EBF> \xCB\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U9EC4> \xB2\xAB |0 # CJK UNIFIED IDEOGRAPH
+<U9ECC> \xF3\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U9ECD> \xB5\xD0 |0 # CJK UNIFIED IDEOGRAPH
+<U9ECE> \xF3\xD5 |0 # CJK UNIFIED IDEOGRAPH
+<U9ECF> \xF3\xD6 |0 # CJK UNIFIED IDEOGRAPH
+<U9ED0> \xF3\xD7 |0 # CJK UNIFIED IDEOGRAPH
+<U9ED1> \xFC\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U9ED2> \xB9\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U9ED4> \xF3\xD8 |0 # CJK UNIFIED IDEOGRAPH
+<U9ED8> \xE0\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U9ED9> \xCC\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U9EDB> \xC2\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U9EDC> \xF3\xD9 |0 # CJK UNIFIED IDEOGRAPH
+<U9EDD> \xF3\xDB |0 # CJK UNIFIED IDEOGRAPH
+<U9EDE> \xF3\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U9EE0> \xF3\xDC |0 # CJK UNIFIED IDEOGRAPH
+<U9EE5> \xF3\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U9EE8> \xF3\xDE |0 # CJK UNIFIED IDEOGRAPH
+<U9EEF> \xF3\xDF |0 # CJK UNIFIED IDEOGRAPH
+<U9EF4> \xF3\xE0 |0 # CJK UNIFIED IDEOGRAPH
+<U9EF6> \xF3\xE1 |0 # CJK UNIFIED IDEOGRAPH
+<U9EF7> \xF3\xE2 |0 # CJK UNIFIED IDEOGRAPH
+<U9EF9> \xF3\xE3 |0 # CJK UNIFIED IDEOGRAPH
+<U9EFB> \xF3\xE4 |0 # CJK UNIFIED IDEOGRAPH
+<U9EFC> \xF3\xE5 |0 # CJK UNIFIED IDEOGRAPH
+<U9EFD> \xF3\xE6 |0 # CJK UNIFIED IDEOGRAPH
+<U9F07> \xF3\xE7 |0 # CJK UNIFIED IDEOGRAPH
+<U9F08> \xF3\xE8 |0 # CJK UNIFIED IDEOGRAPH
+<U9F0E> \xC5\xA4 |0 # CJK UNIFIED IDEOGRAPH
+<U9F13> \xB8\xDD |0 # CJK UNIFIED IDEOGRAPH
+<U9F15> \xF3\xEA |0 # CJK UNIFIED IDEOGRAPH
+<U9F20> \xC1\xCD |0 # CJK UNIFIED IDEOGRAPH
+<U9F21> \xF3\xEB |0 # CJK UNIFIED IDEOGRAPH
+<U9F2C> \xF3\xEC |0 # CJK UNIFIED IDEOGRAPH
+<U9F3B> \xC9\xA1 |0 # CJK UNIFIED IDEOGRAPH
+<U9F3E> \xF3\xED |0 # CJK UNIFIED IDEOGRAPH
+<U9F4A> \xF3\xEE |0 # CJK UNIFIED IDEOGRAPH
+<U9F4B> \xE3\xB7 |0 # CJK UNIFIED IDEOGRAPH
+<U9F4E> \xEC\xDA |0 # CJK UNIFIED IDEOGRAPH
+<U9F4F> \xF0\xED |0 # CJK UNIFIED IDEOGRAPH
+<U9F52> \xF3\xEF |0 # CJK UNIFIED IDEOGRAPH
+<U9F54> \xF3\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U9F5F> \xF3\xF2 |0 # CJK UNIFIED IDEOGRAPH
+<U9F60> \xF3\xF3 |0 # CJK UNIFIED IDEOGRAPH
+<U9F61> \xF3\xF4 |0 # CJK UNIFIED IDEOGRAPH
+<U9F62> \xCE\xF0 |0 # CJK UNIFIED IDEOGRAPH
+<U9F63> \xF3\xF1 |0 # CJK UNIFIED IDEOGRAPH
+<U9F66> \xF3\xF5 |0 # CJK UNIFIED IDEOGRAPH
+<U9F67> \xF3\xF6 |0 # CJK UNIFIED IDEOGRAPH
+<U9F6A> \xF3\xF8 |0 # CJK UNIFIED IDEOGRAPH
+<U9F6C> \xF3\xF7 |0 # CJK UNIFIED IDEOGRAPH
+<U9F72> \xF3\xFA |0 # CJK UNIFIED IDEOGRAPH
+<U9F76> \xF3\xFB |0 # CJK UNIFIED IDEOGRAPH
+<U9F77> \xF3\xF9 |0 # CJK UNIFIED IDEOGRAPH
+<U9F8D> \xCE\xB6 |0 # CJK UNIFIED IDEOGRAPH
+<U9F95> \xF3\xFC |0 # CJK UNIFIED IDEOGRAPH
+<U9F9C> \xF3\xFD |0 # CJK UNIFIED IDEOGRAPH
+<U9F9D> \xE3\xD4 |0 # CJK UNIFIED IDEOGRAPH
+<U9FA0> \xF3\xFE |0 # CJK UNIFIED IDEOGRAPH
+<UF929> \xFA\xC6 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UF9DC> \xFC\xCF |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA0E> \xF9\xD4 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA0F> \xF9\xDF |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA10> \xF9\xE0 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA11> \xF9\xF5 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA12> \xFA\xBE |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA13> \xFA\xCE |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA14> \xFA\xD0 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA15> \xFA\xFB |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA16> \xFB\xA3 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA17> \xFB\xBA |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA18> \xFB\xC2 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA19> \xFB\xC3 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA1A> \xFB\xC4 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA1B> \xFB\xC6 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA1C> \xFB\xCA |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA1D> \xFB\xCD |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA1E> \xFB\xD6 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA1F> \xFB\xE1 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA20> \xFB\xE3 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA21> \xFB\xE4 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA22> \xFB\xED |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA23> \xFB\xF5 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA24> \xFB\xF7 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA25> \xFB\xF8 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA26> \xFB\xFB |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA27> \xFC\xB9 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA28> \xFC\xC0 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA29> \xFC\xD0 |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA2A> \xFC\xDC |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA2B> \xFC\xDD |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA2C> \xFC\xDF |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFA2D> \xFC\xEC |0 # CJK COMPATIBILITY IDEOGRAPH
+<UFF01> \xA1\xAA |0 # FULLWIDTH EXCLAMATION MARK
+<UFF02> \xFC\xFE |0 # FULLWIDTH QUOTATION MARK
+<UFF03> \xA1\xF4 |0 # FULLWIDTH NUMBER SIGN
+<UFF04> \xA1\xF0 |0 # FULLWIDTH DOLLAR SIGN
+<UFF05> \xA1\xF3 |0 # FULLWIDTH PERCENT SIGN
+<UFF06> \xA1\xF5 |0 # FULLWIDTH AMPERSAND
+<UFF07> \xFC\xFD |0 # FULLWIDTH APOSTROPHE
+<UFF08> \xA1\xCA |0 # FULLWIDTH LEFT PARENTHESIS
+<UFF09> \xA1\xCB |0 # FULLWIDTH RIGHT PARENTHESIS
+<UFF0A> \xA1\xF6 |0 # FULLWIDTH ASTERISK
+<UFF0B> \xA1\xDC |0 # FULLWIDTH PLUS SIGN
+<UFF0C> \xA1\xA4 |0 # FULLWIDTH COMMA
+<UFF0D> \xA1\xDD |0 # FULLWIDTH HYPHEN-MINUS
+<UFF0E> \xA1\xA5 |0 # FULLWIDTH FULL STOP
+<UFF0F> \xA1\xBF |0 # FULLWIDTH SOLIDUS
+<UFF10> \xA3\xB0 |0 # FULLWIDTH DIGIT ZERO
+<UFF11> \xA3\xB1 |0 # FULLWIDTH DIGIT ONE
+<UFF12> \xA3\xB2 |0 # FULLWIDTH DIGIT TWO
+<UFF13> \xA3\xB3 |0 # FULLWIDTH DIGIT THREE
+<UFF14> \xA3\xB4 |0 # FULLWIDTH DIGIT FOUR
+<UFF15> \xA3\xB5 |0 # FULLWIDTH DIGIT FIVE
+<UFF16> \xA3\xB6 |0 # FULLWIDTH DIGIT SIX
+<UFF17> \xA3\xB7 |0 # FULLWIDTH DIGIT SEVEN
+<UFF18> \xA3\xB8 |0 # FULLWIDTH DIGIT EIGHT
+<UFF19> \xA3\xB9 |0 # FULLWIDTH DIGIT NINE
+<UFF1A> \xA1\xA7 |0 # FULLWIDTH COLON
+<UFF1B> \xA1\xA8 |0 # FULLWIDTH SEMICOLON
+<UFF1C> \xA1\xE3 |0 # FULLWIDTH LESS-THAN SIGN
+<UFF1D> \xA1\xE1 |0 # FULLWIDTH EQUALS SIGN
+<UFF1E> \xA1\xE4 |0 # FULLWIDTH GREATER-THAN SIGN
+<UFF1F> \xA1\xA9 |0 # FULLWIDTH QUESTION MARK
+<UFF20> \xA1\xF7 |0 # FULLWIDTH COMMERCIAL AT
+<UFF21> \xA3\xC1 |0 # FULLWIDTH LATIN CAPITAL LETTER A
+<UFF22> \xA3\xC2 |0 # FULLWIDTH LATIN CAPITAL LETTER B
+<UFF23> \xA3\xC3 |0 # FULLWIDTH LATIN CAPITAL LETTER C
+<UFF24> \xA3\xC4 |0 # FULLWIDTH LATIN CAPITAL LETTER D
+<UFF25> \xA3\xC5 |0 # FULLWIDTH LATIN CAPITAL LETTER E
+<UFF26> \xA3\xC6 |0 # FULLWIDTH LATIN CAPITAL LETTER F
+<UFF27> \xA3\xC7 |0 # FULLWIDTH LATIN CAPITAL LETTER G
+<UFF28> \xA3\xC8 |0 # FULLWIDTH LATIN CAPITAL LETTER H
+<UFF29> \xA3\xC9 |0 # FULLWIDTH LATIN CAPITAL LETTER I
+<UFF2A> \xA3\xCA |0 # FULLWIDTH LATIN CAPITAL LETTER J
+<UFF2B> \xA3\xCB |0 # FULLWIDTH LATIN CAPITAL LETTER K
+<UFF2C> \xA3\xCC |0 # FULLWIDTH LATIN CAPITAL LETTER L
+<UFF2D> \xA3\xCD |0 # FULLWIDTH LATIN CAPITAL LETTER M
+<UFF2E> \xA3\xCE |0 # FULLWIDTH LATIN CAPITAL LETTER N
+<UFF2F> \xA3\xCF |0 # FULLWIDTH LATIN CAPITAL LETTER O
+<UFF30> \xA3\xD0 |0 # FULLWIDTH LATIN CAPITAL LETTER P
+<UFF31> \xA3\xD1 |0 # FULLWIDTH LATIN CAPITAL LETTER Q
+<UFF32> \xA3\xD2 |0 # FULLWIDTH LATIN CAPITAL LETTER R
+<UFF33> \xA3\xD3 |0 # FULLWIDTH LATIN CAPITAL LETTER S
+<UFF34> \xA3\xD4 |0 # FULLWIDTH LATIN CAPITAL LETTER T
+<UFF35> \xA3\xD5 |0 # FULLWIDTH LATIN CAPITAL LETTER U
+<UFF36> \xA3\xD6 |0 # FULLWIDTH LATIN CAPITAL LETTER V
+<UFF37> \xA3\xD7 |0 # FULLWIDTH LATIN CAPITAL LETTER W
+<UFF38> \xA3\xD8 |0 # FULLWIDTH LATIN CAPITAL LETTER X
+<UFF39> \xA3\xD9 |0 # FULLWIDTH LATIN CAPITAL LETTER Y
+<UFF3A> \xA3\xDA |0 # FULLWIDTH LATIN CAPITAL LETTER Z
+<UFF3B> \xA1\xCE |0 # FULLWIDTH LEFT SQUARE BRACKET
+<UFF3C> \xA1\xC0 |0 # FULLWIDTH REVERSE SOLIDUS
+<UFF3D> \xA1\xCF |0 # FULLWIDTH RIGHT SQUARE BRACKET
+<UFF3E> \xA1\xB0 |0 # FULLWIDTH CIRCUMFLEX ACCENT
+<UFF3F> \xA1\xB2 |0 # FULLWIDTH LOW LINE
+<UFF40> \xA1\xAE |0 # FULLWIDTH GRAVE ACCENT
+<UFF41> \xA3\xE1 |0 # FULLWIDTH LATIN SMALL LETTER A
+<UFF42> \xA3\xE2 |0 # FULLWIDTH LATIN SMALL LETTER B
+<UFF43> \xA3\xE3 |0 # FULLWIDTH LATIN SMALL LETTER C
+<UFF44> \xA3\xE4 |0 # FULLWIDTH LATIN SMALL LETTER D
+<UFF45> \xA3\xE5 |0 # FULLWIDTH LATIN SMALL LETTER E
+<UFF46> \xA3\xE6 |0 # FULLWIDTH LATIN SMALL LETTER F
+<UFF47> \xA3\xE7 |0 # FULLWIDTH LATIN SMALL LETTER G
+<UFF48> \xA3\xE8 |0 # FULLWIDTH LATIN SMALL LETTER H
+<UFF49> \xA3\xE9 |0 # FULLWIDTH LATIN SMALL LETTER I
+<UFF4A> \xA3\xEA |0 # FULLWIDTH LATIN SMALL LETTER J
+<UFF4B> \xA3\xEB |0 # FULLWIDTH LATIN SMALL LETTER K
+<UFF4C> \xA3\xEC |0 # FULLWIDTH LATIN SMALL LETTER L
+<UFF4D> \xA3\xED |0 # FULLWIDTH LATIN SMALL LETTER M
+<UFF4E> \xA3\xEE |0 # FULLWIDTH LATIN SMALL LETTER N
+<UFF4F> \xA3\xEF |0 # FULLWIDTH LATIN SMALL LETTER O
+<UFF50> \xA3\xF0 |0 # FULLWIDTH LATIN SMALL LETTER P
+<UFF51> \xA3\xF1 |0 # FULLWIDTH LATIN SMALL LETTER Q
+<UFF52> \xA3\xF2 |0 # FULLWIDTH LATIN SMALL LETTER R
+<UFF53> \xA3\xF3 |0 # FULLWIDTH LATIN SMALL LETTER S
+<UFF54> \xA3\xF4 |0 # FULLWIDTH LATIN SMALL LETTER T
+<UFF55> \xA3\xF5 |0 # FULLWIDTH LATIN SMALL LETTER U
+<UFF56> \xA3\xF6 |0 # FULLWIDTH LATIN SMALL LETTER V
+<UFF57> \xA3\xF7 |0 # FULLWIDTH LATIN SMALL LETTER W
+<UFF58> \xA3\xF8 |0 # FULLWIDTH LATIN SMALL LETTER X
+<UFF59> \xA3\xF9 |0 # FULLWIDTH LATIN SMALL LETTER Y
+<UFF5A> \xA3\xFA |0 # FULLWIDTH LATIN SMALL LETTER Z
+<UFF5B> \xA1\xD0 |0 # FULLWIDTH LEFT CURLY BRACKET
+<UFF5C> \xA1\xC3 |0 # FULLWIDTH VERTICAL LINE
+<UFF5D> \xA1\xD1 |0 # FULLWIDTH RIGHT CURLY BRACKET
+<UFF5E> \xA1\xC1 |0 # FULLWIDTH TILDE
+<UFF61> \x8E\xA1 |0 # HALFWIDTH IDEOGRAPHIC FULL STOP
+<UFF62> \x8E\xA2 |0 # HALFWIDTH LEFT CORNER BRACKET
+<UFF63> \x8E\xA3 |0 # HALFWIDTH RIGHT CORNER BRACKET
+<UFF64> \x8E\xA4 |0 # HALFWIDTH IDEOGRAPHIC COMMA
+<UFF65> \x8E\xA5 |0 # HALFWIDTH KATAKANA MIDDLE DOT
+<UFF66> \x8E\xA6 |0 # HALFWIDTH KATAKANA LETTER WO
+<UFF67> \x8E\xA7 |0 # HALFWIDTH KATAKANA LETTER SMALL A
+<UFF68> \x8E\xA8 |0 # HALFWIDTH KATAKANA LETTER SMALL I
+<UFF69> \x8E\xA9 |0 # HALFWIDTH KATAKANA LETTER SMALL U
+<UFF6A> \x8E\xAA |0 # HALFWIDTH KATAKANA LETTER SMALL E
+<UFF6B> \x8E\xAB |0 # HALFWIDTH KATAKANA LETTER SMALL O
+<UFF6C> \x8E\xAC |0 # HALFWIDTH KATAKANA LETTER SMALL YA
+<UFF6D> \x8E\xAD |0 # HALFWIDTH KATAKANA LETTER SMALL YU
+<UFF6E> \x8E\xAE |0 # HALFWIDTH KATAKANA LETTER SMALL YO
+<UFF6F> \x8E\xAF |0 # HALFWIDTH KATAKANA LETTER SMALL TU
+<UFF70> \x8E\xB0 |0 # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+<UFF71> \x8E\xB1 |0 # HALFWIDTH KATAKANA LETTER A
+<UFF72> \x8E\xB2 |0 # HALFWIDTH KATAKANA LETTER I
+<UFF73> \x8E\xB3 |0 # HALFWIDTH KATAKANA LETTER U
+<UFF74> \x8E\xB4 |0 # HALFWIDTH KATAKANA LETTER E
+<UFF75> \x8E\xB5 |0 # HALFWIDTH KATAKANA LETTER O
+<UFF76> \x8E\xB6 |0 # HALFWIDTH KATAKANA LETTER KA
+<UFF77> \x8E\xB7 |0 # HALFWIDTH KATAKANA LETTER KI
+<UFF78> \x8E\xB8 |0 # HALFWIDTH KATAKANA LETTER KU
+<UFF79> \x8E\xB9 |0 # HALFWIDTH KATAKANA LETTER KE
+<UFF7A> \x8E\xBA |0 # HALFWIDTH KATAKANA LETTER KO
+<UFF7B> \x8E\xBB |0 # HALFWIDTH KATAKANA LETTER SA
+<UFF7C> \x8E\xBC |0 # HALFWIDTH KATAKANA LETTER SI
+<UFF7D> \x8E\xBD |0 # HALFWIDTH KATAKANA LETTER SU
+<UFF7E> \x8E\xBE |0 # HALFWIDTH KATAKANA LETTER SE
+<UFF7F> \x8E\xBF |0 # HALFWIDTH KATAKANA LETTER SO
+<UFF80> \x8E\xC0 |0 # HALFWIDTH KATAKANA LETTER TA
+<UFF81> \x8E\xC1 |0 # HALFWIDTH KATAKANA LETTER TI
+<UFF82> \x8E\xC2 |0 # HALFWIDTH KATAKANA LETTER TU
+<UFF83> \x8E\xC3 |0 # HALFWIDTH KATAKANA LETTER TE
+<UFF84> \x8E\xC4 |0 # HALFWIDTH KATAKANA LETTER TO
+<UFF85> \x8E\xC5 |0 # HALFWIDTH KATAKANA LETTER NA
+<UFF86> \x8E\xC6 |0 # HALFWIDTH KATAKANA LETTER NI
+<UFF87> \x8E\xC7 |0 # HALFWIDTH KATAKANA LETTER NU
+<UFF88> \x8E\xC8 |0 # HALFWIDTH KATAKANA LETTER NE
+<UFF89> \x8E\xC9 |0 # HALFWIDTH KATAKANA LETTER NO
+<UFF8A> \x8E\xCA |0 # HALFWIDTH KATAKANA LETTER HA
+<UFF8B> \x8E\xCB |0 # HALFWIDTH KATAKANA LETTER HI
+<UFF8C> \x8E\xCC |0 # HALFWIDTH KATAKANA LETTER HU
+<UFF8D> \x8E\xCD |0 # HALFWIDTH KATAKANA LETTER HE
+<UFF8E> \x8E\xCE |0 # HALFWIDTH KATAKANA LETTER HO
+<UFF8F> \x8E\xCF |0 # HALFWIDTH KATAKANA LETTER MA
+<UFF90> \x8E\xD0 |0 # HALFWIDTH KATAKANA LETTER MI
+<UFF91> \x8E\xD1 |0 # HALFWIDTH KATAKANA LETTER MU
+<UFF92> \x8E\xD2 |0 # HALFWIDTH KATAKANA LETTER ME
+<UFF93> \x8E\xD3 |0 # HALFWIDTH KATAKANA LETTER MO
+<UFF94> \x8E\xD4 |0 # HALFWIDTH KATAKANA LETTER YA
+<UFF95> \x8E\xD5 |0 # HALFWIDTH KATAKANA LETTER YU
+<UFF96> \x8E\xD6 |0 # HALFWIDTH KATAKANA LETTER YO
+<UFF97> \x8E\xD7 |0 # HALFWIDTH KATAKANA LETTER RA
+<UFF98> \x8E\xD8 |0 # HALFWIDTH KATAKANA LETTER RI
+<UFF99> \x8E\xD9 |0 # HALFWIDTH KATAKANA LETTER RU
+<UFF9A> \x8E\xDA |0 # HALFWIDTH KATAKANA LETTER RE
+<UFF9B> \x8E\xDB |0 # HALFWIDTH KATAKANA LETTER RO
+<UFF9C> \x8E\xDC |0 # HALFWIDTH KATAKANA LETTER WA
+<UFF9D> \x8E\xDD |0 # HALFWIDTH KATAKANA LETTER N
+<UFF9E> \x8E\xDE |0 # HALFWIDTH KATAKANA VOICED SOUND MARK
+<UFF9F> \x8E\xDF |0 # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+<UFFE0> \xA1\xF1 |0 # FULLWIDTH CENT SIGN
+<UFFE1> \xA1\xF2 |0 # FULLWIDTH POUND SIGN
+<UFFE2> \xA2\xCC |0 # FULLWIDTH NOT SIGN
+<UFFE2> \xFC\xFB |3 # FULLWIDTH NOT SIGN
+<UFFE3> \xA1\xB1 |0 # FULLWIDTH MACRON
+<UFFE4> \xFC\xFC |0 # FULLWIDTH BROKEN BAR
+<UFFE5> \xA1\xEF |0 # FULLWIDTH YEN SIGN
+END CHARMAP
diff --git a/ext/mbstring/tests/data/CP850.txt b/ext/mbstring/tests/data/CP850.txt
new file mode 100644
index 0000000000..7f662c49c9
--- /dev/null
+++ b/ext/mbstring/tests/data/CP850.txt
@@ -0,0 +1,273 @@
+#
+# Name: cp850_DOSLatin1 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Contact: Shawn.Steele@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp850_DOSLatin1 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp850_DOSLatin1 order
+#
+0x00 0x0000 #NULL
+0x01 0x0001 #START OF HEADING
+0x02 0x0002 #START OF TEXT
+0x03 0x0003 #END OF TEXT
+0x04 0x0004 #END OF TRANSMISSION
+0x05 0x0005 #ENQUIRY
+0x06 0x0006 #ACKNOWLEDGE
+0x07 0x0007 #BELL
+0x08 0x0008 #BACKSPACE
+0x09 0x0009 #HORIZONTAL TABULATION
+0x0a 0x000a #LINE FEED
+0x0b 0x000b #VERTICAL TABULATION
+0x0c 0x000c #FORM FEED
+0x0d 0x000d #CARRIAGE RETURN
+0x0e 0x000e #SHIFT OUT
+0x0f 0x000f #SHIFT IN
+0x10 0x0010 #DATA LINK ESCAPE
+0x11 0x0011 #DEVICE CONTROL ONE
+0x12 0x0012 #DEVICE CONTROL TWO
+0x13 0x0013 #DEVICE CONTROL THREE
+0x14 0x0014 #DEVICE CONTROL FOUR
+0x15 0x0015 #NEGATIVE ACKNOWLEDGE
+0x16 0x0016 #SYNCHRONOUS IDLE
+0x17 0x0017 #END OF TRANSMISSION BLOCK
+0x18 0x0018 #CANCEL
+0x19 0x0019 #END OF MEDIUM
+0x1a 0x001a #SUBSTITUTE
+0x1b 0x001b #ESCAPE
+0x1c 0x001c #FILE SEPARATOR
+0x1d 0x001d #GROUP SEPARATOR
+0x1e 0x001e #RECORD SEPARATOR
+0x1f 0x001f #UNIT SEPARATOR
+0x20 0x0020 #SPACE
+0x21 0x0021 #EXCLAMATION MARK
+0x22 0x0022 #QUOTATION MARK
+0x23 0x0023 #NUMBER SIGN
+0x24 0x0024 #DOLLAR SIGN
+0x25 0x0025 #PERCENT SIGN
+0x26 0x0026 #AMPERSAND
+0x27 0x0027 #APOSTROPHE
+0x28 0x0028 #LEFT PARENTHESIS
+0x29 0x0029 #RIGHT PARENTHESIS
+0x2a 0x002a #ASTERISK
+0x2b 0x002b #PLUS SIGN
+0x2c 0x002c #COMMA
+0x2d 0x002d #HYPHEN-MINUS
+0x2e 0x002e #FULL STOP
+0x2f 0x002f #SOLIDUS
+0x30 0x0030 #DIGIT ZERO
+0x31 0x0031 #DIGIT ONE
+0x32 0x0032 #DIGIT TWO
+0x33 0x0033 #DIGIT THREE
+0x34 0x0034 #DIGIT FOUR
+0x35 0x0035 #DIGIT FIVE
+0x36 0x0036 #DIGIT SIX
+0x37 0x0037 #DIGIT SEVEN
+0x38 0x0038 #DIGIT EIGHT
+0x39 0x0039 #DIGIT NINE
+0x3a 0x003a #COLON
+0x3b 0x003b #SEMICOLON
+0x3c 0x003c #LESS-THAN SIGN
+0x3d 0x003d #EQUALS SIGN
+0x3e 0x003e #GREATER-THAN SIGN
+0x3f 0x003f #QUESTION MARK
+0x40 0x0040 #COMMERCIAL AT
+0x41 0x0041 #LATIN CAPITAL LETTER A
+0x42 0x0042 #LATIN CAPITAL LETTER B
+0x43 0x0043 #LATIN CAPITAL LETTER C
+0x44 0x0044 #LATIN CAPITAL LETTER D
+0x45 0x0045 #LATIN CAPITAL LETTER E
+0x46 0x0046 #LATIN CAPITAL LETTER F
+0x47 0x0047 #LATIN CAPITAL LETTER G
+0x48 0x0048 #LATIN CAPITAL LETTER H
+0x49 0x0049 #LATIN CAPITAL LETTER I
+0x4a 0x004a #LATIN CAPITAL LETTER J
+0x4b 0x004b #LATIN CAPITAL LETTER K
+0x4c 0x004c #LATIN CAPITAL LETTER L
+0x4d 0x004d #LATIN CAPITAL LETTER M
+0x4e 0x004e #LATIN CAPITAL LETTER N
+0x4f 0x004f #LATIN CAPITAL LETTER O
+0x50 0x0050 #LATIN CAPITAL LETTER P
+0x51 0x0051 #LATIN CAPITAL LETTER Q
+0x52 0x0052 #LATIN CAPITAL LETTER R
+0x53 0x0053 #LATIN CAPITAL LETTER S
+0x54 0x0054 #LATIN CAPITAL LETTER T
+0x55 0x0055 #LATIN CAPITAL LETTER U
+0x56 0x0056 #LATIN CAPITAL LETTER V
+0x57 0x0057 #LATIN CAPITAL LETTER W
+0x58 0x0058 #LATIN CAPITAL LETTER X
+0x59 0x0059 #LATIN CAPITAL LETTER Y
+0x5a 0x005a #LATIN CAPITAL LETTER Z
+0x5b 0x005b #LEFT SQUARE BRACKET
+0x5c 0x005c #REVERSE SOLIDUS
+0x5d 0x005d #RIGHT SQUARE BRACKET
+0x5e 0x005e #CIRCUMFLEX ACCENT
+0x5f 0x005f #LOW LINE
+0x60 0x0060 #GRAVE ACCENT
+0x61 0x0061 #LATIN SMALL LETTER A
+0x62 0x0062 #LATIN SMALL LETTER B
+0x63 0x0063 #LATIN SMALL LETTER C
+0x64 0x0064 #LATIN SMALL LETTER D
+0x65 0x0065 #LATIN SMALL LETTER E
+0x66 0x0066 #LATIN SMALL LETTER F
+0x67 0x0067 #LATIN SMALL LETTER G
+0x68 0x0068 #LATIN SMALL LETTER H
+0x69 0x0069 #LATIN SMALL LETTER I
+0x6a 0x006a #LATIN SMALL LETTER J
+0x6b 0x006b #LATIN SMALL LETTER K
+0x6c 0x006c #LATIN SMALL LETTER L
+0x6d 0x006d #LATIN SMALL LETTER M
+0x6e 0x006e #LATIN SMALL LETTER N
+0x6f 0x006f #LATIN SMALL LETTER O
+0x70 0x0070 #LATIN SMALL LETTER P
+0x71 0x0071 #LATIN SMALL LETTER Q
+0x72 0x0072 #LATIN SMALL LETTER R
+0x73 0x0073 #LATIN SMALL LETTER S
+0x74 0x0074 #LATIN SMALL LETTER T
+0x75 0x0075 #LATIN SMALL LETTER U
+0x76 0x0076 #LATIN SMALL LETTER V
+0x77 0x0077 #LATIN SMALL LETTER W
+0x78 0x0078 #LATIN SMALL LETTER X
+0x79 0x0079 #LATIN SMALL LETTER Y
+0x7a 0x007a #LATIN SMALL LETTER Z
+0x7b 0x007b #LEFT CURLY BRACKET
+0x7c 0x007c #VERTICAL LINE
+0x7d 0x007d #RIGHT CURLY BRACKET
+0x7e 0x007e #TILDE
+0x7f 0x007f #DELETE
+0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS
+0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE
+0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS
+0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE
+0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE
+0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA
+0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS
+0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE
+0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS
+0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d 0x00ec #LATIN SMALL LETTER I WITH GRAVE
+0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE
+0x91 0x00e6 #LATIN SMALL LIGATURE AE
+0x92 0x00c6 #LATIN CAPITAL LIGATURE AE
+0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS
+0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE
+0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE
+0x98 0x00ff #LATIN SMALL LETTER Y WITH DIAERESIS
+0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE
+0x9c 0x00a3 #POUND SIGN
+0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE
+0x9e 0x00d7 #MULTIPLICATION SIGN
+0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK
+0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE
+0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE
+0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE
+0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE
+0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE
+0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE
+0xa6 0x00aa #FEMININE ORDINAL INDICATOR
+0xa7 0x00ba #MASCULINE ORDINAL INDICATOR
+0xa8 0x00bf #INVERTED QUESTION MARK
+0xa9 0x00ae #REGISTERED SIGN
+0xaa 0x00ac #NOT SIGN
+0xab 0x00bd #VULGAR FRACTION ONE HALF
+0xac 0x00bc #VULGAR FRACTION ONE QUARTER
+0xad 0x00a1 #INVERTED EXCLAMATION MARK
+0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0 0x2591 #LIGHT SHADE
+0xb1 0x2592 #MEDIUM SHADE
+0xb2 0x2593 #DARK SHADE
+0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE
+0xb6 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xb7 0x00c0 #LATIN CAPITAL LETTER A WITH GRAVE
+0xb8 0x00a9 #COPYRIGHT SIGN
+0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd 0x00a2 #CENT SIGN
+0xbe 0x00a5 #YEN SIGN
+0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 0x00e3 #LATIN SMALL LETTER A WITH TILDE
+0xc7 0x00c3 #LATIN CAPITAL LETTER A WITH TILDE
+0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf 0x00a4 #CURRENCY SIGN
+0xd0 0x00f0 #LATIN SMALL LETTER ETH
+0xd1 0x00d0 #LATIN CAPITAL LETTER ETH
+0xd2 0x00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xd3 0x00cb #LATIN CAPITAL LETTER E WITH DIAERESIS
+0xd4 0x00c8 #LATIN CAPITAL LETTER E WITH GRAVE
+0xd5 0x0131 #LATIN SMALL LETTER DOTLESS I
+0xd6 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE
+0xd7 0x00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xd8 0x00cf #LATIN CAPITAL LETTER I WITH DIAERESIS
+0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb 0x2588 #FULL BLOCK
+0xdc 0x2584 #LOWER HALF BLOCK
+0xdd 0x00a6 #BROKEN BAR
+0xde 0x00cc #LATIN CAPITAL LETTER I WITH GRAVE
+0xdf 0x2580 #UPPER HALF BLOCK
+0xe0 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE
+0xe1 0x00df #LATIN SMALL LETTER SHARP S
+0xe2 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xe3 0x00d2 #LATIN CAPITAL LETTER O WITH GRAVE
+0xe4 0x00f5 #LATIN SMALL LETTER O WITH TILDE
+0xe5 0x00d5 #LATIN CAPITAL LETTER O WITH TILDE
+0xe6 0x00b5 #MICRO SIGN
+0xe7 0x00fe #LATIN SMALL LETTER THORN
+0xe8 0x00de #LATIN CAPITAL LETTER THORN
+0xe9 0x00da #LATIN CAPITAL LETTER U WITH ACUTE
+0xea 0x00db #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xeb 0x00d9 #LATIN CAPITAL LETTER U WITH GRAVE
+0xec 0x00fd #LATIN SMALL LETTER Y WITH ACUTE
+0xed 0x00dd #LATIN CAPITAL LETTER Y WITH ACUTE
+0xee 0x00af #MACRON
+0xef 0x00b4 #ACUTE ACCENT
+0xf0 0x00ad #SOFT HYPHEN
+0xf1 0x00b1 #PLUS-MINUS SIGN
+0xf2 0x2017 #DOUBLE LOW LINE
+0xf3 0x00be #VULGAR FRACTION THREE QUARTERS
+0xf4 0x00b6 #PILCROW SIGN
+0xf5 0x00a7 #SECTION SIGN
+0xf6 0x00f7 #DIVISION SIGN
+0xf7 0x00b8 #CEDILLA
+0xf8 0x00b0 #DEGREE SIGN
+0xf9 0x00a8 #DIAERESIS
+0xfa 0x00b7 #MIDDLE DOT
+0xfb 0x00b9 #SUPERSCRIPT ONE
+0xfc 0x00b3 #SUPERSCRIPT THREE
+0xfd 0x00b2 #SUPERSCRIPT TWO
+0xfe 0x25a0 #BLACK SQUARE
+0xff 0x00a0 #NO-BREAK SPACE
diff --git a/ext/mbstring/tests/data/CP866.txt b/ext/mbstring/tests/data/CP866.txt
new file mode 100644
index 0000000000..64d29ef1fb
--- /dev/null
+++ b/ext/mbstring/tests/data/CP866.txt
@@ -0,0 +1,273 @@
+#
+# Name: cp866_DOSCyrillicRussian to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Contact: Shawn.Steele@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp866_DOSCyrillicRussian code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp866_DOSCyrillicRussian order
+#
+0x00 0x0000 #NULL
+0x01 0x0001 #START OF HEADING
+0x02 0x0002 #START OF TEXT
+0x03 0x0003 #END OF TEXT
+0x04 0x0004 #END OF TRANSMISSION
+0x05 0x0005 #ENQUIRY
+0x06 0x0006 #ACKNOWLEDGE
+0x07 0x0007 #BELL
+0x08 0x0008 #BACKSPACE
+0x09 0x0009 #HORIZONTAL TABULATION
+0x0a 0x000a #LINE FEED
+0x0b 0x000b #VERTICAL TABULATION
+0x0c 0x000c #FORM FEED
+0x0d 0x000d #CARRIAGE RETURN
+0x0e 0x000e #SHIFT OUT
+0x0f 0x000f #SHIFT IN
+0x10 0x0010 #DATA LINK ESCAPE
+0x11 0x0011 #DEVICE CONTROL ONE
+0x12 0x0012 #DEVICE CONTROL TWO
+0x13 0x0013 #DEVICE CONTROL THREE
+0x14 0x0014 #DEVICE CONTROL FOUR
+0x15 0x0015 #NEGATIVE ACKNOWLEDGE
+0x16 0x0016 #SYNCHRONOUS IDLE
+0x17 0x0017 #END OF TRANSMISSION BLOCK
+0x18 0x0018 #CANCEL
+0x19 0x0019 #END OF MEDIUM
+0x1a 0x001a #SUBSTITUTE
+0x1b 0x001b #ESCAPE
+0x1c 0x001c #FILE SEPARATOR
+0x1d 0x001d #GROUP SEPARATOR
+0x1e 0x001e #RECORD SEPARATOR
+0x1f 0x001f #UNIT SEPARATOR
+0x20 0x0020 #SPACE
+0x21 0x0021 #EXCLAMATION MARK
+0x22 0x0022 #QUOTATION MARK
+0x23 0x0023 #NUMBER SIGN
+0x24 0x0024 #DOLLAR SIGN
+0x25 0x0025 #PERCENT SIGN
+0x26 0x0026 #AMPERSAND
+0x27 0x0027 #APOSTROPHE
+0x28 0x0028 #LEFT PARENTHESIS
+0x29 0x0029 #RIGHT PARENTHESIS
+0x2a 0x002a #ASTERISK
+0x2b 0x002b #PLUS SIGN
+0x2c 0x002c #COMMA
+0x2d 0x002d #HYPHEN-MINUS
+0x2e 0x002e #FULL STOP
+0x2f 0x002f #SOLIDUS
+0x30 0x0030 #DIGIT ZERO
+0x31 0x0031 #DIGIT ONE
+0x32 0x0032 #DIGIT TWO
+0x33 0x0033 #DIGIT THREE
+0x34 0x0034 #DIGIT FOUR
+0x35 0x0035 #DIGIT FIVE
+0x36 0x0036 #DIGIT SIX
+0x37 0x0037 #DIGIT SEVEN
+0x38 0x0038 #DIGIT EIGHT
+0x39 0x0039 #DIGIT NINE
+0x3a 0x003a #COLON
+0x3b 0x003b #SEMICOLON
+0x3c 0x003c #LESS-THAN SIGN
+0x3d 0x003d #EQUALS SIGN
+0x3e 0x003e #GREATER-THAN SIGN
+0x3f 0x003f #QUESTION MARK
+0x40 0x0040 #COMMERCIAL AT
+0x41 0x0041 #LATIN CAPITAL LETTER A
+0x42 0x0042 #LATIN CAPITAL LETTER B
+0x43 0x0043 #LATIN CAPITAL LETTER C
+0x44 0x0044 #LATIN CAPITAL LETTER D
+0x45 0x0045 #LATIN CAPITAL LETTER E
+0x46 0x0046 #LATIN CAPITAL LETTER F
+0x47 0x0047 #LATIN CAPITAL LETTER G
+0x48 0x0048 #LATIN CAPITAL LETTER H
+0x49 0x0049 #LATIN CAPITAL LETTER I
+0x4a 0x004a #LATIN CAPITAL LETTER J
+0x4b 0x004b #LATIN CAPITAL LETTER K
+0x4c 0x004c #LATIN CAPITAL LETTER L
+0x4d 0x004d #LATIN CAPITAL LETTER M
+0x4e 0x004e #LATIN CAPITAL LETTER N
+0x4f 0x004f #LATIN CAPITAL LETTER O
+0x50 0x0050 #LATIN CAPITAL LETTER P
+0x51 0x0051 #LATIN CAPITAL LETTER Q
+0x52 0x0052 #LATIN CAPITAL LETTER R
+0x53 0x0053 #LATIN CAPITAL LETTER S
+0x54 0x0054 #LATIN CAPITAL LETTER T
+0x55 0x0055 #LATIN CAPITAL LETTER U
+0x56 0x0056 #LATIN CAPITAL LETTER V
+0x57 0x0057 #LATIN CAPITAL LETTER W
+0x58 0x0058 #LATIN CAPITAL LETTER X
+0x59 0x0059 #LATIN CAPITAL LETTER Y
+0x5a 0x005a #LATIN CAPITAL LETTER Z
+0x5b 0x005b #LEFT SQUARE BRACKET
+0x5c 0x005c #REVERSE SOLIDUS
+0x5d 0x005d #RIGHT SQUARE BRACKET
+0x5e 0x005e #CIRCUMFLEX ACCENT
+0x5f 0x005f #LOW LINE
+0x60 0x0060 #GRAVE ACCENT
+0x61 0x0061 #LATIN SMALL LETTER A
+0x62 0x0062 #LATIN SMALL LETTER B
+0x63 0x0063 #LATIN SMALL LETTER C
+0x64 0x0064 #LATIN SMALL LETTER D
+0x65 0x0065 #LATIN SMALL LETTER E
+0x66 0x0066 #LATIN SMALL LETTER F
+0x67 0x0067 #LATIN SMALL LETTER G
+0x68 0x0068 #LATIN SMALL LETTER H
+0x69 0x0069 #LATIN SMALL LETTER I
+0x6a 0x006a #LATIN SMALL LETTER J
+0x6b 0x006b #LATIN SMALL LETTER K
+0x6c 0x006c #LATIN SMALL LETTER L
+0x6d 0x006d #LATIN SMALL LETTER M
+0x6e 0x006e #LATIN SMALL LETTER N
+0x6f 0x006f #LATIN SMALL LETTER O
+0x70 0x0070 #LATIN SMALL LETTER P
+0x71 0x0071 #LATIN SMALL LETTER Q
+0x72 0x0072 #LATIN SMALL LETTER R
+0x73 0x0073 #LATIN SMALL LETTER S
+0x74 0x0074 #LATIN SMALL LETTER T
+0x75 0x0075 #LATIN SMALL LETTER U
+0x76 0x0076 #LATIN SMALL LETTER V
+0x77 0x0077 #LATIN SMALL LETTER W
+0x78 0x0078 #LATIN SMALL LETTER X
+0x79 0x0079 #LATIN SMALL LETTER Y
+0x7a 0x007a #LATIN SMALL LETTER Z
+0x7b 0x007b #LEFT CURLY BRACKET
+0x7c 0x007c #VERTICAL LINE
+0x7d 0x007d #RIGHT CURLY BRACKET
+0x7e 0x007e #TILDE
+0x7f 0x007f #DELETE
+0x80 0x0410 #CYRILLIC CAPITAL LETTER A
+0x81 0x0411 #CYRILLIC CAPITAL LETTER BE
+0x82 0x0412 #CYRILLIC CAPITAL LETTER VE
+0x83 0x0413 #CYRILLIC CAPITAL LETTER GHE
+0x84 0x0414 #CYRILLIC CAPITAL LETTER DE
+0x85 0x0415 #CYRILLIC CAPITAL LETTER IE
+0x86 0x0416 #CYRILLIC CAPITAL LETTER ZHE
+0x87 0x0417 #CYRILLIC CAPITAL LETTER ZE
+0x88 0x0418 #CYRILLIC CAPITAL LETTER I
+0x89 0x0419 #CYRILLIC CAPITAL LETTER SHORT I
+0x8a 0x041a #CYRILLIC CAPITAL LETTER KA
+0x8b 0x041b #CYRILLIC CAPITAL LETTER EL
+0x8c 0x041c #CYRILLIC CAPITAL LETTER EM
+0x8d 0x041d #CYRILLIC CAPITAL LETTER EN
+0x8e 0x041e #CYRILLIC CAPITAL LETTER O
+0x8f 0x041f #CYRILLIC CAPITAL LETTER PE
+0x90 0x0420 #CYRILLIC CAPITAL LETTER ER
+0x91 0x0421 #CYRILLIC CAPITAL LETTER ES
+0x92 0x0422 #CYRILLIC CAPITAL LETTER TE
+0x93 0x0423 #CYRILLIC CAPITAL LETTER U
+0x94 0x0424 #CYRILLIC CAPITAL LETTER EF
+0x95 0x0425 #CYRILLIC CAPITAL LETTER HA
+0x96 0x0426 #CYRILLIC CAPITAL LETTER TSE
+0x97 0x0427 #CYRILLIC CAPITAL LETTER CHE
+0x98 0x0428 #CYRILLIC CAPITAL LETTER SHA
+0x99 0x0429 #CYRILLIC CAPITAL LETTER SHCHA
+0x9a 0x042a #CYRILLIC CAPITAL LETTER HARD SIGN
+0x9b 0x042b #CYRILLIC CAPITAL LETTER YERU
+0x9c 0x042c #CYRILLIC CAPITAL LETTER SOFT SIGN
+0x9d 0x042d #CYRILLIC CAPITAL LETTER E
+0x9e 0x042e #CYRILLIC CAPITAL LETTER YU
+0x9f 0x042f #CYRILLIC CAPITAL LETTER YA
+0xa0 0x0430 #CYRILLIC SMALL LETTER A
+0xa1 0x0431 #CYRILLIC SMALL LETTER BE
+0xa2 0x0432 #CYRILLIC SMALL LETTER VE
+0xa3 0x0433 #CYRILLIC SMALL LETTER GHE
+0xa4 0x0434 #CYRILLIC SMALL LETTER DE
+0xa5 0x0435 #CYRILLIC SMALL LETTER IE
+0xa6 0x0436 #CYRILLIC SMALL LETTER ZHE
+0xa7 0x0437 #CYRILLIC SMALL LETTER ZE
+0xa8 0x0438 #CYRILLIC SMALL LETTER I
+0xa9 0x0439 #CYRILLIC SMALL LETTER SHORT I
+0xaa 0x043a #CYRILLIC SMALL LETTER KA
+0xab 0x043b #CYRILLIC SMALL LETTER EL
+0xac 0x043c #CYRILLIC SMALL LETTER EM
+0xad 0x043d #CYRILLIC SMALL LETTER EN
+0xae 0x043e #CYRILLIC SMALL LETTER O
+0xaf 0x043f #CYRILLIC SMALL LETTER PE
+0xb0 0x2591 #LIGHT SHADE
+0xb1 0x2592 #MEDIUM SHADE
+0xb2 0x2593 #DARK SHADE
+0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb 0x2588 #FULL BLOCK
+0xdc 0x2584 #LOWER HALF BLOCK
+0xdd 0x258c #LEFT HALF BLOCK
+0xde 0x2590 #RIGHT HALF BLOCK
+0xdf 0x2580 #UPPER HALF BLOCK
+0xe0 0x0440 #CYRILLIC SMALL LETTER ER
+0xe1 0x0441 #CYRILLIC SMALL LETTER ES
+0xe2 0x0442 #CYRILLIC SMALL LETTER TE
+0xe3 0x0443 #CYRILLIC SMALL LETTER U
+0xe4 0x0444 #CYRILLIC SMALL LETTER EF
+0xe5 0x0445 #CYRILLIC SMALL LETTER HA
+0xe6 0x0446 #CYRILLIC SMALL LETTER TSE
+0xe7 0x0447 #CYRILLIC SMALL LETTER CHE
+0xe8 0x0448 #CYRILLIC SMALL LETTER SHA
+0xe9 0x0449 #CYRILLIC SMALL LETTER SHCHA
+0xea 0x044a #CYRILLIC SMALL LETTER HARD SIGN
+0xeb 0x044b #CYRILLIC SMALL LETTER YERU
+0xec 0x044c #CYRILLIC SMALL LETTER SOFT SIGN
+0xed 0x044d #CYRILLIC SMALL LETTER E
+0xee 0x044e #CYRILLIC SMALL LETTER YU
+0xef 0x044f #CYRILLIC SMALL LETTER YA
+0xf0 0x0401 #CYRILLIC CAPITAL LETTER IO
+0xf1 0x0451 #CYRILLIC SMALL LETTER IO
+0xf2 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xf3 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE
+0xf4 0x0407 #CYRILLIC CAPITAL LETTER YI
+0xf5 0x0457 #CYRILLIC SMALL LETTER YI
+0xf6 0x040e #CYRILLIC CAPITAL LETTER SHORT U
+0xf7 0x045e #CYRILLIC SMALL LETTER SHORT U
+0xf8 0x00b0 #DEGREE SIGN
+0xf9 0x2219 #BULLET OPERATOR
+0xfa 0x00b7 #MIDDLE DOT
+0xfb 0x221a #SQUARE ROOT
+0xfc 0x2116 #NUMERO SIGN
+0xfd 0x00a4 #CURRENCY SIGN
+0xfe 0x25a0 #BLACK SQUARE
+0xff 0x00a0 #NO-BREAK SPACE
diff --git a/ext/mbstring/tests/data/CP932.txt b/ext/mbstring/tests/data/CP932.txt
new file mode 100644
index 0000000000..7ff471bcd1
--- /dev/null
+++ b/ext/mbstring/tests/data/CP932.txt
@@ -0,0 +1,7998 @@
+#
+# Name: cp932 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: Shawn.Steele@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp932 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp932 order
+#
+0x00 0x0000 #NULL
+0x01 0x0001 #START OF HEADING
+0x02 0x0002 #START OF TEXT
+0x03 0x0003 #END OF TEXT
+0x04 0x0004 #END OF TRANSMISSION
+0x05 0x0005 #ENQUIRY
+0x06 0x0006 #ACKNOWLEDGE
+0x07 0x0007 #BELL
+0x08 0x0008 #BACKSPACE
+0x09 0x0009 #HORIZONTAL TABULATION
+0x0A 0x000A #LINE FEED
+0x0B 0x000B #VERTICAL TABULATION
+0x0C 0x000C #FORM FEED
+0x0D 0x000D #CARRIAGE RETURN
+0x0E 0x000E #SHIFT OUT
+0x0F 0x000F #SHIFT IN
+0x10 0x0010 #DATA LINK ESCAPE
+0x11 0x0011 #DEVICE CONTROL ONE
+0x12 0x0012 #DEVICE CONTROL TWO
+0x13 0x0013 #DEVICE CONTROL THREE
+0x14 0x0014 #DEVICE CONTROL FOUR
+0x15 0x0015 #NEGATIVE ACKNOWLEDGE
+0x16 0x0016 #SYNCHRONOUS IDLE
+0x17 0x0017 #END OF TRANSMISSION BLOCK
+0x18 0x0018 #CANCEL
+0x19 0x0019 #END OF MEDIUM
+0x1A 0x001A #SUBSTITUTE
+0x1B 0x001B #ESCAPE
+0x1C 0x001C #FILE SEPARATOR
+0x1D 0x001D #GROUP SEPARATOR
+0x1E 0x001E #RECORD SEPARATOR
+0x1F 0x001F #UNIT SEPARATOR
+0x20 0x0020 #SPACE
+0x21 0x0021 #EXCLAMATION MARK
+0x22 0x0022 #QUOTATION MARK
+0x23 0x0023 #NUMBER SIGN
+0x24 0x0024 #DOLLAR SIGN
+0x25 0x0025 #PERCENT SIGN
+0x26 0x0026 #AMPERSAND
+0x27 0x0027 #APOSTROPHE
+0x28 0x0028 #LEFT PARENTHESIS
+0x29 0x0029 #RIGHT PARENTHESIS
+0x2A 0x002A #ASTERISK
+0x2B 0x002B #PLUS SIGN
+0x2C 0x002C #COMMA
+0x2D 0x002D #HYPHEN-MINUS
+0x2E 0x002E #FULL STOP
+0x2F 0x002F #SOLIDUS
+0x30 0x0030 #DIGIT ZERO
+0x31 0x0031 #DIGIT ONE
+0x32 0x0032 #DIGIT TWO
+0x33 0x0033 #DIGIT THREE
+0x34 0x0034 #DIGIT FOUR
+0x35 0x0035 #DIGIT FIVE
+0x36 0x0036 #DIGIT SIX
+0x37 0x0037 #DIGIT SEVEN
+0x38 0x0038 #DIGIT EIGHT
+0x39 0x0039 #DIGIT NINE
+0x3A 0x003A #COLON
+0x3B 0x003B #SEMICOLON
+0x3C 0x003C #LESS-THAN SIGN
+0x3D 0x003D #EQUALS SIGN
+0x3E 0x003E #GREATER-THAN SIGN
+0x3F 0x003F #QUESTION MARK
+0x40 0x0040 #COMMERCIAL AT
+0x41 0x0041 #LATIN CAPITAL LETTER A
+0x42 0x0042 #LATIN CAPITAL LETTER B
+0x43 0x0043 #LATIN CAPITAL LETTER C
+0x44 0x0044 #LATIN CAPITAL LETTER D
+0x45 0x0045 #LATIN CAPITAL LETTER E
+0x46 0x0046 #LATIN CAPITAL LETTER F
+0x47 0x0047 #LATIN CAPITAL LETTER G
+0x48 0x0048 #LATIN CAPITAL LETTER H
+0x49 0x0049 #LATIN CAPITAL LETTER I
+0x4A 0x004A #LATIN CAPITAL LETTER J
+0x4B 0x004B #LATIN CAPITAL LETTER K
+0x4C 0x004C #LATIN CAPITAL LETTER L
+0x4D 0x004D #LATIN CAPITAL LETTER M
+0x4E 0x004E #LATIN CAPITAL LETTER N
+0x4F 0x004F #LATIN CAPITAL LETTER O
+0x50 0x0050 #LATIN CAPITAL LETTER P
+0x51 0x0051 #LATIN CAPITAL LETTER Q
+0x52 0x0052 #LATIN CAPITAL LETTER R
+0x53 0x0053 #LATIN CAPITAL LETTER S
+0x54 0x0054 #LATIN CAPITAL LETTER T
+0x55 0x0055 #LATIN CAPITAL LETTER U
+0x56 0x0056 #LATIN CAPITAL LETTER V
+0x57 0x0057 #LATIN CAPITAL LETTER W
+0x58 0x0058 #LATIN CAPITAL LETTER X
+0x59 0x0059 #LATIN CAPITAL LETTER Y
+0x5A 0x005A #LATIN CAPITAL LETTER Z
+0x5B 0x005B #LEFT SQUARE BRACKET
+0x5C 0x005C #REVERSE SOLIDUS
+0x5D 0x005D #RIGHT SQUARE BRACKET
+0x5E 0x005E #CIRCUMFLEX ACCENT
+0x5F 0x005F #LOW LINE
+0x60 0x0060 #GRAVE ACCENT
+0x61 0x0061 #LATIN SMALL LETTER A
+0x62 0x0062 #LATIN SMALL LETTER B
+0x63 0x0063 #LATIN SMALL LETTER C
+0x64 0x0064 #LATIN SMALL LETTER D
+0x65 0x0065 #LATIN SMALL LETTER E
+0x66 0x0066 #LATIN SMALL LETTER F
+0x67 0x0067 #LATIN SMALL LETTER G
+0x68 0x0068 #LATIN SMALL LETTER H
+0x69 0x0069 #LATIN SMALL LETTER I
+0x6A 0x006A #LATIN SMALL LETTER J
+0x6B 0x006B #LATIN SMALL LETTER K
+0x6C 0x006C #LATIN SMALL LETTER L
+0x6D 0x006D #LATIN SMALL LETTER M
+0x6E 0x006E #LATIN SMALL LETTER N
+0x6F 0x006F #LATIN SMALL LETTER O
+0x70 0x0070 #LATIN SMALL LETTER P
+0x71 0x0071 #LATIN SMALL LETTER Q
+0x72 0x0072 #LATIN SMALL LETTER R
+0x73 0x0073 #LATIN SMALL LETTER S
+0x74 0x0074 #LATIN SMALL LETTER T
+0x75 0x0075 #LATIN SMALL LETTER U
+0x76 0x0076 #LATIN SMALL LETTER V
+0x77 0x0077 #LATIN SMALL LETTER W
+0x78 0x0078 #LATIN SMALL LETTER X
+0x79 0x0079 #LATIN SMALL LETTER Y
+0x7A 0x007A #LATIN SMALL LETTER Z
+0x7B 0x007B #LEFT CURLY BRACKET
+0x7C 0x007C #VERTICAL LINE
+0x7D 0x007D #RIGHT CURLY BRACKET
+0x7E 0x007E #TILDE
+0x7F 0x007F #DELETE
+0x80 #UNDEFINED
+0x81 #DBCS LEAD BYTE
+0x82 #DBCS LEAD BYTE
+0x83 #DBCS LEAD BYTE
+0x84 #DBCS LEAD BYTE
+0x85 #DBCS LEAD BYTE
+0x86 #DBCS LEAD BYTE
+0x87 #DBCS LEAD BYTE
+0x88 #DBCS LEAD BYTE
+0x89 #DBCS LEAD BYTE
+0x8A #DBCS LEAD BYTE
+0x8B #DBCS LEAD BYTE
+0x8C #DBCS LEAD BYTE
+0x8D #DBCS LEAD BYTE
+0x8E #DBCS LEAD BYTE
+0x8F #DBCS LEAD BYTE
+0x90 #DBCS LEAD BYTE
+0x91 #DBCS LEAD BYTE
+0x92 #DBCS LEAD BYTE
+0x93 #DBCS LEAD BYTE
+0x94 #DBCS LEAD BYTE
+0x95 #DBCS LEAD BYTE
+0x96 #DBCS LEAD BYTE
+0x97 #DBCS LEAD BYTE
+0x98 #DBCS LEAD BYTE
+0x99 #DBCS LEAD BYTE
+0x9A #DBCS LEAD BYTE
+0x9B #DBCS LEAD BYTE
+0x9C #DBCS LEAD BYTE
+0x9D #DBCS LEAD BYTE
+0x9E #DBCS LEAD BYTE
+0x9F #DBCS LEAD BYTE
+0xA0 #UNDEFINED
+0xA1 0xFF61 #HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2 0xFF62 #HALFWIDTH LEFT CORNER BRACKET
+0xA3 0xFF63 #HALFWIDTH RIGHT CORNER BRACKET
+0xA4 0xFF64 #HALFWIDTH IDEOGRAPHIC COMMA
+0xA5 0xFF65 #HALFWIDTH KATAKANA MIDDLE DOT
+0xA6 0xFF66 #HALFWIDTH KATAKANA LETTER WO
+0xA7 0xFF67 #HALFWIDTH KATAKANA LETTER SMALL A
+0xA8 0xFF68 #HALFWIDTH KATAKANA LETTER SMALL I
+0xA9 0xFF69 #HALFWIDTH KATAKANA LETTER SMALL U
+0xAA 0xFF6A #HALFWIDTH KATAKANA LETTER SMALL E
+0xAB 0xFF6B #HALFWIDTH KATAKANA LETTER SMALL O
+0xAC 0xFF6C #HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD 0xFF6D #HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE 0xFF6E #HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF 0xFF6F #HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0 0xFF70 #HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1 0xFF71 #HALFWIDTH KATAKANA LETTER A
+0xB2 0xFF72 #HALFWIDTH KATAKANA LETTER I
+0xB3 0xFF73 #HALFWIDTH KATAKANA LETTER U
+0xB4 0xFF74 #HALFWIDTH KATAKANA LETTER E
+0xB5 0xFF75 #HALFWIDTH KATAKANA LETTER O
+0xB6 0xFF76 #HALFWIDTH KATAKANA LETTER KA
+0xB7 0xFF77 #HALFWIDTH KATAKANA LETTER KI
+0xB8 0xFF78 #HALFWIDTH KATAKANA LETTER KU
+0xB9 0xFF79 #HALFWIDTH KATAKANA LETTER KE
+0xBA 0xFF7A #HALFWIDTH KATAKANA LETTER KO
+0xBB 0xFF7B #HALFWIDTH KATAKANA LETTER SA
+0xBC 0xFF7C #HALFWIDTH KATAKANA LETTER SI
+0xBD 0xFF7D #HALFWIDTH KATAKANA LETTER SU
+0xBE 0xFF7E #HALFWIDTH KATAKANA LETTER SE
+0xBF 0xFF7F #HALFWIDTH KATAKANA LETTER SO
+0xC0 0xFF80 #HALFWIDTH KATAKANA LETTER TA
+0xC1 0xFF81 #HALFWIDTH KATAKANA LETTER TI
+0xC2 0xFF82 #HALFWIDTH KATAKANA LETTER TU
+0xC3 0xFF83 #HALFWIDTH KATAKANA LETTER TE
+0xC4 0xFF84 #HALFWIDTH KATAKANA LETTER TO
+0xC5 0xFF85 #HALFWIDTH KATAKANA LETTER NA
+0xC6 0xFF86 #HALFWIDTH KATAKANA LETTER NI
+0xC7 0xFF87 #HALFWIDTH KATAKANA LETTER NU
+0xC8 0xFF88 #HALFWIDTH KATAKANA LETTER NE
+0xC9 0xFF89 #HALFWIDTH KATAKANA LETTER NO
+0xCA 0xFF8A #HALFWIDTH KATAKANA LETTER HA
+0xCB 0xFF8B #HALFWIDTH KATAKANA LETTER HI
+0xCC 0xFF8C #HALFWIDTH KATAKANA LETTER HU
+0xCD 0xFF8D #HALFWIDTH KATAKANA LETTER HE
+0xCE 0xFF8E #HALFWIDTH KATAKANA LETTER HO
+0xCF 0xFF8F #HALFWIDTH KATAKANA LETTER MA
+0xD0 0xFF90 #HALFWIDTH KATAKANA LETTER MI
+0xD1 0xFF91 #HALFWIDTH KATAKANA LETTER MU
+0xD2 0xFF92 #HALFWIDTH KATAKANA LETTER ME
+0xD3 0xFF93 #HALFWIDTH KATAKANA LETTER MO
+0xD4 0xFF94 #HALFWIDTH KATAKANA LETTER YA
+0xD5 0xFF95 #HALFWIDTH KATAKANA LETTER YU
+0xD6 0xFF96 #HALFWIDTH KATAKANA LETTER YO
+0xD7 0xFF97 #HALFWIDTH KATAKANA LETTER RA
+0xD8 0xFF98 #HALFWIDTH KATAKANA LETTER RI
+0xD9 0xFF99 #HALFWIDTH KATAKANA LETTER RU
+0xDA 0xFF9A #HALFWIDTH KATAKANA LETTER RE
+0xDB 0xFF9B #HALFWIDTH KATAKANA LETTER RO
+0xDC 0xFF9C #HALFWIDTH KATAKANA LETTER WA
+0xDD 0xFF9D #HALFWIDTH KATAKANA LETTER N
+0xDE 0xFF9E #HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF 0xFF9F #HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+0xE0 #DBCS LEAD BYTE
+0xE1 #DBCS LEAD BYTE
+0xE2 #DBCS LEAD BYTE
+0xE3 #DBCS LEAD BYTE
+0xE4 #DBCS LEAD BYTE
+0xE5 #DBCS LEAD BYTE
+0xE6 #DBCS LEAD BYTE
+0xE7 #DBCS LEAD BYTE
+0xE8 #DBCS LEAD BYTE
+0xE9 #DBCS LEAD BYTE
+0xEA #DBCS LEAD BYTE
+0xEB #DBCS LEAD BYTE
+0xEC #DBCS LEAD BYTE
+0xED #DBCS LEAD BYTE
+0xEE #DBCS LEAD BYTE
+0xEF #DBCS LEAD BYTE
+0xF0 #DBCS LEAD BYTE
+0xF1 #DBCS LEAD BYTE
+0xF2 #DBCS LEAD BYTE
+0xF3 #DBCS LEAD BYTE
+0xF4 #DBCS LEAD BYTE
+0xF5 #DBCS LEAD BYTE
+0xF6 #DBCS LEAD BYTE
+0xF7 #DBCS LEAD BYTE
+0xF8 #DBCS LEAD BYTE
+0xF9 #DBCS LEAD BYTE
+0xFA #DBCS LEAD BYTE
+0xFB #DBCS LEAD BYTE
+0xFC #DBCS LEAD BYTE
+0xFD #UNDEFINED
+0xFE #UNDEFINED
+0xFF #UNDEFINED
+0x8140 0x3000 #IDEOGRAPHIC SPACE
+0x8141 0x3001 #IDEOGRAPHIC COMMA
+0x8142 0x3002 #IDEOGRAPHIC FULL STOP
+0x8143 0xFF0C #FULLWIDTH COMMA
+0x8144 0xFF0E #FULLWIDTH FULL STOP
+0x8145 0x30FB #KATAKANA MIDDLE DOT
+0x8146 0xFF1A #FULLWIDTH COLON
+0x8147 0xFF1B #FULLWIDTH SEMICOLON
+0x8148 0xFF1F #FULLWIDTH QUESTION MARK
+0x8149 0xFF01 #FULLWIDTH EXCLAMATION MARK
+0x814A 0x309B #KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B 0x309C #KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C 0x00B4 #ACUTE ACCENT
+0x814D 0xFF40 #FULLWIDTH GRAVE ACCENT
+0x814E 0x00A8 #DIAERESIS
+0x814F 0xFF3E #FULLWIDTH CIRCUMFLEX ACCENT
+0x8150 0xFFE3 #FULLWIDTH MACRON
+0x8151 0xFF3F #FULLWIDTH LOW LINE
+0x8152 0x30FD #KATAKANA ITERATION MARK
+0x8153 0x30FE #KATAKANA VOICED ITERATION MARK
+0x8154 0x309D #HIRAGANA ITERATION MARK
+0x8155 0x309E #HIRAGANA VOICED ITERATION MARK
+0x8156 0x3003 #DITTO MARK
+0x8157 0x4EDD #CJK UNIFIED IDEOGRAPH
+0x8158 0x3005 #IDEOGRAPHIC ITERATION MARK
+0x8159 0x3006 #IDEOGRAPHIC CLOSING MARK
+0x815A 0x3007 #IDEOGRAPHIC NUMBER ZERO
+0x815B 0x30FC #KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C 0x2015 #HORIZONTAL BAR
+0x815D 0x2010 #HYPHEN
+0x815E 0xFF0F #FULLWIDTH SOLIDUS
+0x815F 0xFF3C #FULLWIDTH REVERSE SOLIDUS
+0x8160 0xFF5E #FULLWIDTH TILDE
+0x8161 0x2225 #PARALLEL TO
+0x8162 0xFF5C #FULLWIDTH VERTICAL LINE
+0x8163 0x2026 #HORIZONTAL ELLIPSIS
+0x8164 0x2025 #TWO DOT LEADER
+0x8165 0x2018 #LEFT SINGLE QUOTATION MARK
+0x8166 0x2019 #RIGHT SINGLE QUOTATION MARK
+0x8167 0x201C #LEFT DOUBLE QUOTATION MARK
+0x8168 0x201D #RIGHT DOUBLE QUOTATION MARK
+0x8169 0xFF08 #FULLWIDTH LEFT PARENTHESIS
+0x816A 0xFF09 #FULLWIDTH RIGHT PARENTHESIS
+0x816B 0x3014 #LEFT TORTOISE SHELL BRACKET
+0x816C 0x3015 #RIGHT TORTOISE SHELL BRACKET
+0x816D 0xFF3B #FULLWIDTH LEFT SQUARE BRACKET
+0x816E 0xFF3D #FULLWIDTH RIGHT SQUARE BRACKET
+0x816F 0xFF5B #FULLWIDTH LEFT CURLY BRACKET
+0x8170 0xFF5D #FULLWIDTH RIGHT CURLY BRACKET
+0x8171 0x3008 #LEFT ANGLE BRACKET
+0x8172 0x3009 #RIGHT ANGLE BRACKET
+0x8173 0x300A #LEFT DOUBLE ANGLE BRACKET
+0x8174 0x300B #RIGHT DOUBLE ANGLE BRACKET
+0x8175 0x300C #LEFT CORNER BRACKET
+0x8176 0x300D #RIGHT CORNER BRACKET
+0x8177 0x300E #LEFT WHITE CORNER BRACKET
+0x8178 0x300F #RIGHT WHITE CORNER BRACKET
+0x8179 0x3010 #LEFT BLACK LENTICULAR BRACKET
+0x817A 0x3011 #RIGHT BLACK LENTICULAR BRACKET
+0x817B 0xFF0B #FULLWIDTH PLUS SIGN
+0x817C 0xFF0D #FULLWIDTH HYPHEN-MINUS
+0x817D 0x00B1 #PLUS-MINUS SIGN
+0x817E 0x00D7 #MULTIPLICATION SIGN
+0x8180 0x00F7 #DIVISION SIGN
+0x8181 0xFF1D #FULLWIDTH EQUALS SIGN
+0x8182 0x2260 #NOT EQUAL TO
+0x8183 0xFF1C #FULLWIDTH LESS-THAN SIGN
+0x8184 0xFF1E #FULLWIDTH GREATER-THAN SIGN
+0x8185 0x2266 #LESS-THAN OVER EQUAL TO
+0x8186 0x2267 #GREATER-THAN OVER EQUAL TO
+0x8187 0x221E #INFINITY
+0x8188 0x2234 #THEREFORE
+0x8189 0x2642 #MALE SIGN
+0x818A 0x2640 #FEMALE SIGN
+0x818B 0x00B0 #DEGREE SIGN
+0x818C 0x2032 #PRIME
+0x818D 0x2033 #DOUBLE PRIME
+0x818E 0x2103 #DEGREE CELSIUS
+0x818F 0xFFE5 #FULLWIDTH YEN SIGN
+0x8190 0xFF04 #FULLWIDTH DOLLAR SIGN
+0x8191 0xFFE0 #FULLWIDTH CENT SIGN
+0x8192 0xFFE1 #FULLWIDTH POUND SIGN
+0x8193 0xFF05 #FULLWIDTH PERCENT SIGN
+0x8194 0xFF03 #FULLWIDTH NUMBER SIGN
+0x8195 0xFF06 #FULLWIDTH AMPERSAND
+0x8196 0xFF0A #FULLWIDTH ASTERISK
+0x8197 0xFF20 #FULLWIDTH COMMERCIAL AT
+0x8198 0x00A7 #SECTION SIGN
+0x8199 0x2606 #WHITE STAR
+0x819A 0x2605 #BLACK STAR
+0x819B 0x25CB #WHITE CIRCLE
+0x819C 0x25CF #BLACK CIRCLE
+0x819D 0x25CE #BULLSEYE
+0x819E 0x25C7 #WHITE DIAMOND
+0x819F 0x25C6 #BLACK DIAMOND
+0x81A0 0x25A1 #WHITE SQUARE
+0x81A1 0x25A0 #BLACK SQUARE
+0x81A2 0x25B3 #WHITE UP-POINTING TRIANGLE
+0x81A3 0x25B2 #BLACK UP-POINTING TRIANGLE
+0x81A4 0x25BD #WHITE DOWN-POINTING TRIANGLE
+0x81A5 0x25BC #BLACK DOWN-POINTING TRIANGLE
+0x81A6 0x203B #REFERENCE MARK
+0x81A7 0x3012 #POSTAL MARK
+0x81A8 0x2192 #RIGHTWARDS ARROW
+0x81A9 0x2190 #LEFTWARDS ARROW
+0x81AA 0x2191 #UPWARDS ARROW
+0x81AB 0x2193 #DOWNWARDS ARROW
+0x81AC 0x3013 #GETA MARK
+0x81B8 0x2208 #ELEMENT OF
+0x81B9 0x220B #CONTAINS AS MEMBER
+0x81BA 0x2286 #SUBSET OF OR EQUAL TO
+0x81BB 0x2287 #SUPERSET OF OR EQUAL TO
+0x81BC 0x2282 #SUBSET OF
+0x81BD 0x2283 #SUPERSET OF
+0x81BE 0x222A #UNION
+0x81BF 0x2229 #INTERSECTION
+0x81C8 0x2227 #LOGICAL AND
+0x81C9 0x2228 #LOGICAL OR
+0x81CA 0xFFE2 #FULLWIDTH NOT SIGN
+0x81CB 0x21D2 #RIGHTWARDS DOUBLE ARROW
+0x81CC 0x21D4 #LEFT RIGHT DOUBLE ARROW
+0x81CD 0x2200 #FOR ALL
+0x81CE 0x2203 #THERE EXISTS
+0x81DA 0x2220 #ANGLE
+0x81DB 0x22A5 #UP TACK
+0x81DC 0x2312 #ARC
+0x81DD 0x2202 #PARTIAL DIFFERENTIAL
+0x81DE 0x2207 #NABLA
+0x81DF 0x2261 #IDENTICAL TO
+0x81E0 0x2252 #APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x81E1 0x226A #MUCH LESS-THAN
+0x81E2 0x226B #MUCH GREATER-THAN
+0x81E3 0x221A #SQUARE ROOT
+0x81E4 0x223D #REVERSED TILDE
+0x81E5 0x221D #PROPORTIONAL TO
+0x81E6 0x2235 #BECAUSE
+0x81E7 0x222B #INTEGRAL
+0x81E8 0x222C #DOUBLE INTEGRAL
+0x81F0 0x212B #ANGSTROM SIGN
+0x81F1 0x2030 #PER MILLE SIGN
+0x81F2 0x266F #MUSIC SHARP SIGN
+0x81F3 0x266D #MUSIC FLAT SIGN
+0x81F4 0x266A #EIGHTH NOTE
+0x81F5 0x2020 #DAGGER
+0x81F6 0x2021 #DOUBLE DAGGER
+0x81F7 0x00B6 #PILCROW SIGN
+0x81FC 0x25EF #LARGE CIRCLE
+0x824F 0xFF10 #FULLWIDTH DIGIT ZERO
+0x8250 0xFF11 #FULLWIDTH DIGIT ONE
+0x8251 0xFF12 #FULLWIDTH DIGIT TWO
+0x8252 0xFF13 #FULLWIDTH DIGIT THREE
+0x8253 0xFF14 #FULLWIDTH DIGIT FOUR
+0x8254 0xFF15 #FULLWIDTH DIGIT FIVE
+0x8255 0xFF16 #FULLWIDTH DIGIT SIX
+0x8256 0xFF17 #FULLWIDTH DIGIT SEVEN
+0x8257 0xFF18 #FULLWIDTH DIGIT EIGHT
+0x8258 0xFF19 #FULLWIDTH DIGIT NINE
+0x8260 0xFF21 #FULLWIDTH LATIN CAPITAL LETTER A
+0x8261 0xFF22 #FULLWIDTH LATIN CAPITAL LETTER B
+0x8262 0xFF23 #FULLWIDTH LATIN CAPITAL LETTER C
+0x8263 0xFF24 #FULLWIDTH LATIN CAPITAL LETTER D
+0x8264 0xFF25 #FULLWIDTH LATIN CAPITAL LETTER E
+0x8265 0xFF26 #FULLWIDTH LATIN CAPITAL LETTER F
+0x8266 0xFF27 #FULLWIDTH LATIN CAPITAL LETTER G
+0x8267 0xFF28 #FULLWIDTH LATIN CAPITAL LETTER H
+0x8268 0xFF29 #FULLWIDTH LATIN CAPITAL LETTER I
+0x8269 0xFF2A #FULLWIDTH LATIN CAPITAL LETTER J
+0x826A 0xFF2B #FULLWIDTH LATIN CAPITAL LETTER K
+0x826B 0xFF2C #FULLWIDTH LATIN CAPITAL LETTER L
+0x826C 0xFF2D #FULLWIDTH LATIN CAPITAL LETTER M
+0x826D 0xFF2E #FULLWIDTH LATIN CAPITAL LETTER N
+0x826E 0xFF2F #FULLWIDTH LATIN CAPITAL LETTER O
+0x826F 0xFF30 #FULLWIDTH LATIN CAPITAL LETTER P
+0x8270 0xFF31 #FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271 0xFF32 #FULLWIDTH LATIN CAPITAL LETTER R
+0x8272 0xFF33 #FULLWIDTH LATIN CAPITAL LETTER S
+0x8273 0xFF34 #FULLWIDTH LATIN CAPITAL LETTER T
+0x8274 0xFF35 #FULLWIDTH LATIN CAPITAL LETTER U
+0x8275 0xFF36 #FULLWIDTH LATIN CAPITAL LETTER V
+0x8276 0xFF37 #FULLWIDTH LATIN CAPITAL LETTER W
+0x8277 0xFF38 #FULLWIDTH LATIN CAPITAL LETTER X
+0x8278 0xFF39 #FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279 0xFF3A #FULLWIDTH LATIN CAPITAL LETTER Z
+0x8281 0xFF41 #FULLWIDTH LATIN SMALL LETTER A
+0x8282 0xFF42 #FULLWIDTH LATIN SMALL LETTER B
+0x8283 0xFF43 #FULLWIDTH LATIN SMALL LETTER C
+0x8284 0xFF44 #FULLWIDTH LATIN SMALL LETTER D
+0x8285 0xFF45 #FULLWIDTH LATIN SMALL LETTER E
+0x8286 0xFF46 #FULLWIDTH LATIN SMALL LETTER F
+0x8287 0xFF47 #FULLWIDTH LATIN SMALL LETTER G
+0x8288 0xFF48 #FULLWIDTH LATIN SMALL LETTER H
+0x8289 0xFF49 #FULLWIDTH LATIN SMALL LETTER I
+0x828A 0xFF4A #FULLWIDTH LATIN SMALL LETTER J
+0x828B 0xFF4B #FULLWIDTH LATIN SMALL LETTER K
+0x828C 0xFF4C #FULLWIDTH LATIN SMALL LETTER L
+0x828D 0xFF4D #FULLWIDTH LATIN SMALL LETTER M
+0x828E 0xFF4E #FULLWIDTH LATIN SMALL LETTER N
+0x828F 0xFF4F #FULLWIDTH LATIN SMALL LETTER O
+0x8290 0xFF50 #FULLWIDTH LATIN SMALL LETTER P
+0x8291 0xFF51 #FULLWIDTH LATIN SMALL LETTER Q
+0x8292 0xFF52 #FULLWIDTH LATIN SMALL LETTER R
+0x8293 0xFF53 #FULLWIDTH LATIN SMALL LETTER S
+0x8294 0xFF54 #FULLWIDTH LATIN SMALL LETTER T
+0x8295 0xFF55 #FULLWIDTH LATIN SMALL LETTER U
+0x8296 0xFF56 #FULLWIDTH LATIN SMALL LETTER V
+0x8297 0xFF57 #FULLWIDTH LATIN SMALL LETTER W
+0x8298 0xFF58 #FULLWIDTH LATIN SMALL LETTER X
+0x8299 0xFF59 #FULLWIDTH LATIN SMALL LETTER Y
+0x829A 0xFF5A #FULLWIDTH LATIN SMALL LETTER Z
+0x829F 0x3041 #HIRAGANA LETTER SMALL A
+0x82A0 0x3042 #HIRAGANA LETTER A
+0x82A1 0x3043 #HIRAGANA LETTER SMALL I
+0x82A2 0x3044 #HIRAGANA LETTER I
+0x82A3 0x3045 #HIRAGANA LETTER SMALL U
+0x82A4 0x3046 #HIRAGANA LETTER U
+0x82A5 0x3047 #HIRAGANA LETTER SMALL E
+0x82A6 0x3048 #HIRAGANA LETTER E
+0x82A7 0x3049 #HIRAGANA LETTER SMALL O
+0x82A8 0x304A #HIRAGANA LETTER O
+0x82A9 0x304B #HIRAGANA LETTER KA
+0x82AA 0x304C #HIRAGANA LETTER GA
+0x82AB 0x304D #HIRAGANA LETTER KI
+0x82AC 0x304E #HIRAGANA LETTER GI
+0x82AD 0x304F #HIRAGANA LETTER KU
+0x82AE 0x3050 #HIRAGANA LETTER GU
+0x82AF 0x3051 #HIRAGANA LETTER KE
+0x82B0 0x3052 #HIRAGANA LETTER GE
+0x82B1 0x3053 #HIRAGANA LETTER KO
+0x82B2 0x3054 #HIRAGANA LETTER GO
+0x82B3 0x3055 #HIRAGANA LETTER SA
+0x82B4 0x3056 #HIRAGANA LETTER ZA
+0x82B5 0x3057 #HIRAGANA LETTER SI
+0x82B6 0x3058 #HIRAGANA LETTER ZI
+0x82B7 0x3059 #HIRAGANA LETTER SU
+0x82B8 0x305A #HIRAGANA LETTER ZU
+0x82B9 0x305B #HIRAGANA LETTER SE
+0x82BA 0x305C #HIRAGANA LETTER ZE
+0x82BB 0x305D #HIRAGANA LETTER SO
+0x82BC 0x305E #HIRAGANA LETTER ZO
+0x82BD 0x305F #HIRAGANA LETTER TA
+0x82BE 0x3060 #HIRAGANA LETTER DA
+0x82BF 0x3061 #HIRAGANA LETTER TI
+0x82C0 0x3062 #HIRAGANA LETTER DI
+0x82C1 0x3063 #HIRAGANA LETTER SMALL TU
+0x82C2 0x3064 #HIRAGANA LETTER TU
+0x82C3 0x3065 #HIRAGANA LETTER DU
+0x82C4 0x3066 #HIRAGANA LETTER TE
+0x82C5 0x3067 #HIRAGANA LETTER DE
+0x82C6 0x3068 #HIRAGANA LETTER TO
+0x82C7 0x3069 #HIRAGANA LETTER DO
+0x82C8 0x306A #HIRAGANA LETTER NA
+0x82C9 0x306B #HIRAGANA LETTER NI
+0x82CA 0x306C #HIRAGANA LETTER NU
+0x82CB 0x306D #HIRAGANA LETTER NE
+0x82CC 0x306E #HIRAGANA LETTER NO
+0x82CD 0x306F #HIRAGANA LETTER HA
+0x82CE 0x3070 #HIRAGANA LETTER BA
+0x82CF 0x3071 #HIRAGANA LETTER PA
+0x82D0 0x3072 #HIRAGANA LETTER HI
+0x82D1 0x3073 #HIRAGANA LETTER BI
+0x82D2 0x3074 #HIRAGANA LETTER PI
+0x82D3 0x3075 #HIRAGANA LETTER HU
+0x82D4 0x3076 #HIRAGANA LETTER BU
+0x82D5 0x3077 #HIRAGANA LETTER PU
+0x82D6 0x3078 #HIRAGANA LETTER HE
+0x82D7 0x3079 #HIRAGANA LETTER BE
+0x82D8 0x307A #HIRAGANA LETTER PE
+0x82D9 0x307B #HIRAGANA LETTER HO
+0x82DA 0x307C #HIRAGANA LETTER BO
+0x82DB 0x307D #HIRAGANA LETTER PO
+0x82DC 0x307E #HIRAGANA LETTER MA
+0x82DD 0x307F #HIRAGANA LETTER MI
+0x82DE 0x3080 #HIRAGANA LETTER MU
+0x82DF 0x3081 #HIRAGANA LETTER ME
+0x82E0 0x3082 #HIRAGANA LETTER MO
+0x82E1 0x3083 #HIRAGANA LETTER SMALL YA
+0x82E2 0x3084 #HIRAGANA LETTER YA
+0x82E3 0x3085 #HIRAGANA LETTER SMALL YU
+0x82E4 0x3086 #HIRAGANA LETTER YU
+0x82E5 0x3087 #HIRAGANA LETTER SMALL YO
+0x82E6 0x3088 #HIRAGANA LETTER YO
+0x82E7 0x3089 #HIRAGANA LETTER RA
+0x82E8 0x308A #HIRAGANA LETTER RI
+0x82E9 0x308B #HIRAGANA LETTER RU
+0x82EA 0x308C #HIRAGANA LETTER RE
+0x82EB 0x308D #HIRAGANA LETTER RO
+0x82EC 0x308E #HIRAGANA LETTER SMALL WA
+0x82ED 0x308F #HIRAGANA LETTER WA
+0x82EE 0x3090 #HIRAGANA LETTER WI
+0x82EF 0x3091 #HIRAGANA LETTER WE
+0x82F0 0x3092 #HIRAGANA LETTER WO
+0x82F1 0x3093 #HIRAGANA LETTER N
+0x8340 0x30A1 #KATAKANA LETTER SMALL A
+0x8341 0x30A2 #KATAKANA LETTER A
+0x8342 0x30A3 #KATAKANA LETTER SMALL I
+0x8343 0x30A4 #KATAKANA LETTER I
+0x8344 0x30A5 #KATAKANA LETTER SMALL U
+0x8345 0x30A6 #KATAKANA LETTER U
+0x8346 0x30A7 #KATAKANA LETTER SMALL E
+0x8347 0x30A8 #KATAKANA LETTER E
+0x8348 0x30A9 #KATAKANA LETTER SMALL O
+0x8349 0x30AA #KATAKANA LETTER O
+0x834A 0x30AB #KATAKANA LETTER KA
+0x834B 0x30AC #KATAKANA LETTER GA
+0x834C 0x30AD #KATAKANA LETTER KI
+0x834D 0x30AE #KATAKANA LETTER GI
+0x834E 0x30AF #KATAKANA LETTER KU
+0x834F 0x30B0 #KATAKANA LETTER GU
+0x8350 0x30B1 #KATAKANA LETTER KE
+0x8351 0x30B2 #KATAKANA LETTER GE
+0x8352 0x30B3 #KATAKANA LETTER KO
+0x8353 0x30B4 #KATAKANA LETTER GO
+0x8354 0x30B5 #KATAKANA LETTER SA
+0x8355 0x30B6 #KATAKANA LETTER ZA
+0x8356 0x30B7 #KATAKANA LETTER SI
+0x8357 0x30B8 #KATAKANA LETTER ZI
+0x8358 0x30B9 #KATAKANA LETTER SU
+0x8359 0x30BA #KATAKANA LETTER ZU
+0x835A 0x30BB #KATAKANA LETTER SE
+0x835B 0x30BC #KATAKANA LETTER ZE
+0x835C 0x30BD #KATAKANA LETTER SO
+0x835D 0x30BE #KATAKANA LETTER ZO
+0x835E 0x30BF #KATAKANA LETTER TA
+0x835F 0x30C0 #KATAKANA LETTER DA
+0x8360 0x30C1 #KATAKANA LETTER TI
+0x8361 0x30C2 #KATAKANA LETTER DI
+0x8362 0x30C3 #KATAKANA LETTER SMALL TU
+0x8363 0x30C4 #KATAKANA LETTER TU
+0x8364 0x30C5 #KATAKANA LETTER DU
+0x8365 0x30C6 #KATAKANA LETTER TE
+0x8366 0x30C7 #KATAKANA LETTER DE
+0x8367 0x30C8 #KATAKANA LETTER TO
+0x8368 0x30C9 #KATAKANA LETTER DO
+0x8369 0x30CA #KATAKANA LETTER NA
+0x836A 0x30CB #KATAKANA LETTER NI
+0x836B 0x30CC #KATAKANA LETTER NU
+0x836C 0x30CD #KATAKANA LETTER NE
+0x836D 0x30CE #KATAKANA LETTER NO
+0x836E 0x30CF #KATAKANA LETTER HA
+0x836F 0x30D0 #KATAKANA LETTER BA
+0x8370 0x30D1 #KATAKANA LETTER PA
+0x8371 0x30D2 #KATAKANA LETTER HI
+0x8372 0x30D3 #KATAKANA LETTER BI
+0x8373 0x30D4 #KATAKANA LETTER PI
+0x8374 0x30D5 #KATAKANA LETTER HU
+0x8375 0x30D6 #KATAKANA LETTER BU
+0x8376 0x30D7 #KATAKANA LETTER PU
+0x8377 0x30D8 #KATAKANA LETTER HE
+0x8378 0x30D9 #KATAKANA LETTER BE
+0x8379 0x30DA #KATAKANA LETTER PE
+0x837A 0x30DB #KATAKANA LETTER HO
+0x837B 0x30DC #KATAKANA LETTER BO
+0x837C 0x30DD #KATAKANA LETTER PO
+0x837D 0x30DE #KATAKANA LETTER MA
+0x837E 0x30DF #KATAKANA LETTER MI
+0x8380 0x30E0 #KATAKANA LETTER MU
+0x8381 0x30E1 #KATAKANA LETTER ME
+0x8382 0x30E2 #KATAKANA LETTER MO
+0x8383 0x30E3 #KATAKANA LETTER SMALL YA
+0x8384 0x30E4 #KATAKANA LETTER YA
+0x8385 0x30E5 #KATAKANA LETTER SMALL YU
+0x8386 0x30E6 #KATAKANA LETTER YU
+0x8387 0x30E7 #KATAKANA LETTER SMALL YO
+0x8388 0x30E8 #KATAKANA LETTER YO
+0x8389 0x30E9 #KATAKANA LETTER RA
+0x838A 0x30EA #KATAKANA LETTER RI
+0x838B 0x30EB #KATAKANA LETTER RU
+0x838C 0x30EC #KATAKANA LETTER RE
+0x838D 0x30ED #KATAKANA LETTER RO
+0x838E 0x30EE #KATAKANA LETTER SMALL WA
+0x838F 0x30EF #KATAKANA LETTER WA
+0x8390 0x30F0 #KATAKANA LETTER WI
+0x8391 0x30F1 #KATAKANA LETTER WE
+0x8392 0x30F2 #KATAKANA LETTER WO
+0x8393 0x30F3 #KATAKANA LETTER N
+0x8394 0x30F4 #KATAKANA LETTER VU
+0x8395 0x30F5 #KATAKANA LETTER SMALL KA
+0x8396 0x30F6 #KATAKANA LETTER SMALL KE
+0x839F 0x0391 #GREEK CAPITAL LETTER ALPHA
+0x83A0 0x0392 #GREEK CAPITAL LETTER BETA
+0x83A1 0x0393 #GREEK CAPITAL LETTER GAMMA
+0x83A2 0x0394 #GREEK CAPITAL LETTER DELTA
+0x83A3 0x0395 #GREEK CAPITAL LETTER EPSILON
+0x83A4 0x0396 #GREEK CAPITAL LETTER ZETA
+0x83A5 0x0397 #GREEK CAPITAL LETTER ETA
+0x83A6 0x0398 #GREEK CAPITAL LETTER THETA
+0x83A7 0x0399 #GREEK CAPITAL LETTER IOTA
+0x83A8 0x039A #GREEK CAPITAL LETTER KAPPA
+0x83A9 0x039B #GREEK CAPITAL LETTER LAMDA
+0x83AA 0x039C #GREEK CAPITAL LETTER MU
+0x83AB 0x039D #GREEK CAPITAL LETTER NU
+0x83AC 0x039E #GREEK CAPITAL LETTER XI
+0x83AD 0x039F #GREEK CAPITAL LETTER OMICRON
+0x83AE 0x03A0 #GREEK CAPITAL LETTER PI
+0x83AF 0x03A1 #GREEK CAPITAL LETTER RHO
+0x83B0 0x03A3 #GREEK CAPITAL LETTER SIGMA
+0x83B1 0x03A4 #GREEK CAPITAL LETTER TAU
+0x83B2 0x03A5 #GREEK CAPITAL LETTER UPSILON
+0x83B3 0x03A6 #GREEK CAPITAL LETTER PHI
+0x83B4 0x03A7 #GREEK CAPITAL LETTER CHI
+0x83B5 0x03A8 #GREEK CAPITAL LETTER PSI
+0x83B6 0x03A9 #GREEK CAPITAL LETTER OMEGA
+0x83BF 0x03B1 #GREEK SMALL LETTER ALPHA
+0x83C0 0x03B2 #GREEK SMALL LETTER BETA
+0x83C1 0x03B3 #GREEK SMALL LETTER GAMMA
+0x83C2 0x03B4 #GREEK SMALL LETTER DELTA
+0x83C3 0x03B5 #GREEK SMALL LETTER EPSILON
+0x83C4 0x03B6 #GREEK SMALL LETTER ZETA
+0x83C5 0x03B7 #GREEK SMALL LETTER ETA
+0x83C6 0x03B8 #GREEK SMALL LETTER THETA
+0x83C7 0x03B9 #GREEK SMALL LETTER IOTA
+0x83C8 0x03BA #GREEK SMALL LETTER KAPPA
+0x83C9 0x03BB #GREEK SMALL LETTER LAMDA
+0x83CA 0x03BC #GREEK SMALL LETTER MU
+0x83CB 0x03BD #GREEK SMALL LETTER NU
+0x83CC 0x03BE #GREEK SMALL LETTER XI
+0x83CD 0x03BF #GREEK SMALL LETTER OMICRON
+0x83CE 0x03C0 #GREEK SMALL LETTER PI
+0x83CF 0x03C1 #GREEK SMALL LETTER RHO
+0x83D0 0x03C3 #GREEK SMALL LETTER SIGMA
+0x83D1 0x03C4 #GREEK SMALL LETTER TAU
+0x83D2 0x03C5 #GREEK SMALL LETTER UPSILON
+0x83D3 0x03C6 #GREEK SMALL LETTER PHI
+0x83D4 0x03C7 #GREEK SMALL LETTER CHI
+0x83D5 0x03C8 #GREEK SMALL LETTER PSI
+0x83D6 0x03C9 #GREEK SMALL LETTER OMEGA
+0x8440 0x0410 #CYRILLIC CAPITAL LETTER A
+0x8441 0x0411 #CYRILLIC CAPITAL LETTER BE
+0x8442 0x0412 #CYRILLIC CAPITAL LETTER VE
+0x8443 0x0413 #CYRILLIC CAPITAL LETTER GHE
+0x8444 0x0414 #CYRILLIC CAPITAL LETTER DE
+0x8445 0x0415 #CYRILLIC CAPITAL LETTER IE
+0x8446 0x0401 #CYRILLIC CAPITAL LETTER IO
+0x8447 0x0416 #CYRILLIC CAPITAL LETTER ZHE
+0x8448 0x0417 #CYRILLIC CAPITAL LETTER ZE
+0x8449 0x0418 #CYRILLIC CAPITAL LETTER I
+0x844A 0x0419 #CYRILLIC CAPITAL LETTER SHORT I
+0x844B 0x041A #CYRILLIC CAPITAL LETTER KA
+0x844C 0x041B #CYRILLIC CAPITAL LETTER EL
+0x844D 0x041C #CYRILLIC CAPITAL LETTER EM
+0x844E 0x041D #CYRILLIC CAPITAL LETTER EN
+0x844F 0x041E #CYRILLIC CAPITAL LETTER O
+0x8450 0x041F #CYRILLIC CAPITAL LETTER PE
+0x8451 0x0420 #CYRILLIC CAPITAL LETTER ER
+0x8452 0x0421 #CYRILLIC CAPITAL LETTER ES
+0x8453 0x0422 #CYRILLIC CAPITAL LETTER TE
+0x8454 0x0423 #CYRILLIC CAPITAL LETTER U
+0x8455 0x0424 #CYRILLIC CAPITAL LETTER EF
+0x8456 0x0425 #CYRILLIC CAPITAL LETTER HA
+0x8457 0x0426 #CYRILLIC CAPITAL LETTER TSE
+0x8458 0x0427 #CYRILLIC CAPITAL LETTER CHE
+0x8459 0x0428 #CYRILLIC CAPITAL LETTER SHA
+0x845A 0x0429 #CYRILLIC CAPITAL LETTER SHCHA
+0x845B 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C 0x042B #CYRILLIC CAPITAL LETTER YERU
+0x845D 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E 0x042D #CYRILLIC CAPITAL LETTER E
+0x845F 0x042E #CYRILLIC CAPITAL LETTER YU
+0x8460 0x042F #CYRILLIC CAPITAL LETTER YA
+0x8470 0x0430 #CYRILLIC SMALL LETTER A
+0x8471 0x0431 #CYRILLIC SMALL LETTER BE
+0x8472 0x0432 #CYRILLIC SMALL LETTER VE
+0x8473 0x0433 #CYRILLIC SMALL LETTER GHE
+0x8474 0x0434 #CYRILLIC SMALL LETTER DE
+0x8475 0x0435 #CYRILLIC SMALL LETTER IE
+0x8476 0x0451 #CYRILLIC SMALL LETTER IO
+0x8477 0x0436 #CYRILLIC SMALL LETTER ZHE
+0x8478 0x0437 #CYRILLIC SMALL LETTER ZE
+0x8479 0x0438 #CYRILLIC SMALL LETTER I
+0x847A 0x0439 #CYRILLIC SMALL LETTER SHORT I
+0x847B 0x043A #CYRILLIC SMALL LETTER KA
+0x847C 0x043B #CYRILLIC SMALL LETTER EL
+0x847D 0x043C #CYRILLIC SMALL LETTER EM
+0x847E 0x043D #CYRILLIC SMALL LETTER EN
+0x8480 0x043E #CYRILLIC SMALL LETTER O
+0x8481 0x043F #CYRILLIC SMALL LETTER PE
+0x8482 0x0440 #CYRILLIC SMALL LETTER ER
+0x8483 0x0441 #CYRILLIC SMALL LETTER ES
+0x8484 0x0442 #CYRILLIC SMALL LETTER TE
+0x8485 0x0443 #CYRILLIC SMALL LETTER U
+0x8486 0x0444 #CYRILLIC SMALL LETTER EF
+0x8487 0x0445 #CYRILLIC SMALL LETTER HA
+0x8488 0x0446 #CYRILLIC SMALL LETTER TSE
+0x8489 0x0447 #CYRILLIC SMALL LETTER CHE
+0x848A 0x0448 #CYRILLIC SMALL LETTER SHA
+0x848B 0x0449 #CYRILLIC SMALL LETTER SHCHA
+0x848C 0x044A #CYRILLIC SMALL LETTER HARD SIGN
+0x848D 0x044B #CYRILLIC SMALL LETTER YERU
+0x848E 0x044C #CYRILLIC SMALL LETTER SOFT SIGN
+0x848F 0x044D #CYRILLIC SMALL LETTER E
+0x8490 0x044E #CYRILLIC SMALL LETTER YU
+0x8491 0x044F #CYRILLIC SMALL LETTER YA
+0x849F 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0x84A0 0x2502 #BOX DRAWINGS LIGHT VERTICAL
+0x84A1 0x250C #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x84A2 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84A3 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0x84A4 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0x84A5 0x251C #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x84A6 0x252C #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x84A7 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x84A8 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x84A9 0x253C #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x84AA 0x2501 #BOX DRAWINGS HEAVY HORIZONTAL
+0x84AB 0x2503 #BOX DRAWINGS HEAVY VERTICAL
+0x84AC 0x250F #BOX DRAWINGS HEAVY DOWN AND RIGHT
+0x84AD 0x2513 #BOX DRAWINGS HEAVY DOWN AND LEFT
+0x84AE 0x251B #BOX DRAWINGS HEAVY UP AND LEFT
+0x84AF 0x2517 #BOX DRAWINGS HEAVY UP AND RIGHT
+0x84B0 0x2523 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+0x84B1 0x2533 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+0x84B2 0x252B #BOX DRAWINGS HEAVY VERTICAL AND LEFT
+0x84B3 0x253B #BOX DRAWINGS HEAVY UP AND HORIZONTAL
+0x84B4 0x254B #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+0x84B5 0x2520 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+0x84B6 0x252F #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+0x84B7 0x2528 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+0x84B8 0x2537 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+0x84B9 0x253F #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+0x84BA 0x251D #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+0x84BB 0x2530 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+0x84BC 0x2525 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+0x84BD 0x2538 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+0x84BE 0x2542 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+0x8740 0x2460 #CIRCLED DIGIT ONE
+0x8741 0x2461 #CIRCLED DIGIT TWO
+0x8742 0x2462 #CIRCLED DIGIT THREE
+0x8743 0x2463 #CIRCLED DIGIT FOUR
+0x8744 0x2464 #CIRCLED DIGIT FIVE
+0x8745 0x2465 #CIRCLED DIGIT SIX
+0x8746 0x2466 #CIRCLED DIGIT SEVEN
+0x8747 0x2467 #CIRCLED DIGIT EIGHT
+0x8748 0x2468 #CIRCLED DIGIT NINE
+0x8749 0x2469 #CIRCLED NUMBER TEN
+0x874A 0x246A #CIRCLED NUMBER ELEVEN
+0x874B 0x246B #CIRCLED NUMBER TWELVE
+0x874C 0x246C #CIRCLED NUMBER THIRTEEN
+0x874D 0x246D #CIRCLED NUMBER FOURTEEN
+0x874E 0x246E #CIRCLED NUMBER FIFTEEN
+0x874F 0x246F #CIRCLED NUMBER SIXTEEN
+0x8750 0x2470 #CIRCLED NUMBER SEVENTEEN
+0x8751 0x2471 #CIRCLED NUMBER EIGHTEEN
+0x8752 0x2472 #CIRCLED NUMBER NINETEEN
+0x8753 0x2473 #CIRCLED NUMBER TWENTY
+0x8754 0x2160 #ROMAN NUMERAL ONE
+0x8755 0x2161 #ROMAN NUMERAL TWO
+0x8756 0x2162 #ROMAN NUMERAL THREE
+0x8757 0x2163 #ROMAN NUMERAL FOUR
+0x8758 0x2164 #ROMAN NUMERAL FIVE
+0x8759 0x2165 #ROMAN NUMERAL SIX
+0x875A 0x2166 #ROMAN NUMERAL SEVEN
+0x875B 0x2167 #ROMAN NUMERAL EIGHT
+0x875C 0x2168 #ROMAN NUMERAL NINE
+0x875D 0x2169 #ROMAN NUMERAL TEN
+0x875F 0x3349 #SQUARE MIRI
+0x8760 0x3314 #SQUARE KIRO
+0x8761 0x3322 #SQUARE SENTI
+0x8762 0x334D #SQUARE MEETORU
+0x8763 0x3318 #SQUARE GURAMU
+0x8764 0x3327 #SQUARE TON
+0x8765 0x3303 #SQUARE AARU
+0x8766 0x3336 #SQUARE HEKUTAARU
+0x8767 0x3351 #SQUARE RITTORU
+0x8768 0x3357 #SQUARE WATTO
+0x8769 0x330D #SQUARE KARORII
+0x876A 0x3326 #SQUARE DORU
+0x876B 0x3323 #SQUARE SENTO
+0x876C 0x332B #SQUARE PAASENTO
+0x876D 0x334A #SQUARE MIRIBAARU
+0x876E 0x333B #SQUARE PEEZI
+0x876F 0x339C #SQUARE MM
+0x8770 0x339D #SQUARE CM
+0x8771 0x339E #SQUARE KM
+0x8772 0x338E #SQUARE MG
+0x8773 0x338F #SQUARE KG
+0x8774 0x33C4 #SQUARE CC
+0x8775 0x33A1 #SQUARE M SQUARED
+0x877E 0x337B #SQUARE ERA NAME HEISEI
+0x8780 0x301D #REVERSED DOUBLE PRIME QUOTATION MARK
+0x8781 0x301F #LOW DOUBLE PRIME QUOTATION MARK
+0x8782 0x2116 #NUMERO SIGN
+0x8783 0x33CD #SQUARE KK
+0x8784 0x2121 #TELEPHONE SIGN
+0x8785 0x32A4 #CIRCLED IDEOGRAPH HIGH
+0x8786 0x32A5 #CIRCLED IDEOGRAPH CENTRE
+0x8787 0x32A6 #CIRCLED IDEOGRAPH LOW
+0x8788 0x32A7 #CIRCLED IDEOGRAPH LEFT
+0x8789 0x32A8 #CIRCLED IDEOGRAPH RIGHT
+0x878A 0x3231 #PARENTHESIZED IDEOGRAPH STOCK
+0x878B 0x3232 #PARENTHESIZED IDEOGRAPH HAVE
+0x878C 0x3239 #PARENTHESIZED IDEOGRAPH REPRESENT
+0x878D 0x337E #SQUARE ERA NAME MEIZI
+0x878E 0x337D #SQUARE ERA NAME TAISYOU
+0x878F 0x337C #SQUARE ERA NAME SYOUWA
+0x8790 0x2252 #APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x8791 0x2261 #IDENTICAL TO
+0x8792 0x222B #INTEGRAL
+0x8793 0x222E #CONTOUR INTEGRAL
+0x8794 0x2211 #N-ARY SUMMATION
+0x8795 0x221A #SQUARE ROOT
+0x8796 0x22A5 #UP TACK
+0x8797 0x2220 #ANGLE
+0x8798 0x221F #RIGHT ANGLE
+0x8799 0x22BF #RIGHT TRIANGLE
+0x879A 0x2235 #BECAUSE
+0x879B 0x2229 #INTERSECTION
+0x879C 0x222A #UNION
+0x889F 0x4E9C #CJK UNIFIED IDEOGRAPH
+0x88A0 0x5516 #CJK UNIFIED IDEOGRAPH
+0x88A1 0x5A03 #CJK UNIFIED IDEOGRAPH
+0x88A2 0x963F #CJK UNIFIED IDEOGRAPH
+0x88A3 0x54C0 #CJK UNIFIED IDEOGRAPH
+0x88A4 0x611B #CJK UNIFIED IDEOGRAPH
+0x88A5 0x6328 #CJK UNIFIED IDEOGRAPH
+0x88A6 0x59F6 #CJK UNIFIED IDEOGRAPH
+0x88A7 0x9022 #CJK UNIFIED IDEOGRAPH
+0x88A8 0x8475 #CJK UNIFIED IDEOGRAPH
+0x88A9 0x831C #CJK UNIFIED IDEOGRAPH
+0x88AA 0x7A50 #CJK UNIFIED IDEOGRAPH
+0x88AB 0x60AA #CJK UNIFIED IDEOGRAPH
+0x88AC 0x63E1 #CJK UNIFIED IDEOGRAPH
+0x88AD 0x6E25 #CJK UNIFIED IDEOGRAPH
+0x88AE 0x65ED #CJK UNIFIED IDEOGRAPH
+0x88AF 0x8466 #CJK UNIFIED IDEOGRAPH
+0x88B0 0x82A6 #CJK UNIFIED IDEOGRAPH
+0x88B1 0x9BF5 #CJK UNIFIED IDEOGRAPH
+0x88B2 0x6893 #CJK UNIFIED IDEOGRAPH
+0x88B3 0x5727 #CJK UNIFIED IDEOGRAPH
+0x88B4 0x65A1 #CJK UNIFIED IDEOGRAPH
+0x88B5 0x6271 #CJK UNIFIED IDEOGRAPH
+0x88B6 0x5B9B #CJK UNIFIED IDEOGRAPH
+0x88B7 0x59D0 #CJK UNIFIED IDEOGRAPH
+0x88B8 0x867B #CJK UNIFIED IDEOGRAPH
+0x88B9 0x98F4 #CJK UNIFIED IDEOGRAPH
+0x88BA 0x7D62 #CJK UNIFIED IDEOGRAPH
+0x88BB 0x7DBE #CJK UNIFIED IDEOGRAPH
+0x88BC 0x9B8E #CJK UNIFIED IDEOGRAPH
+0x88BD 0x6216 #CJK UNIFIED IDEOGRAPH
+0x88BE 0x7C9F #CJK UNIFIED IDEOGRAPH
+0x88BF 0x88B7 #CJK UNIFIED IDEOGRAPH
+0x88C0 0x5B89 #CJK UNIFIED IDEOGRAPH
+0x88C1 0x5EB5 #CJK UNIFIED IDEOGRAPH
+0x88C2 0x6309 #CJK UNIFIED IDEOGRAPH
+0x88C3 0x6697 #CJK UNIFIED IDEOGRAPH
+0x88C4 0x6848 #CJK UNIFIED IDEOGRAPH
+0x88C5 0x95C7 #CJK UNIFIED IDEOGRAPH
+0x88C6 0x978D #CJK UNIFIED IDEOGRAPH
+0x88C7 0x674F #CJK UNIFIED IDEOGRAPH
+0x88C8 0x4EE5 #CJK UNIFIED IDEOGRAPH
+0x88C9 0x4F0A #CJK UNIFIED IDEOGRAPH
+0x88CA 0x4F4D #CJK UNIFIED IDEOGRAPH
+0x88CB 0x4F9D #CJK UNIFIED IDEOGRAPH
+0x88CC 0x5049 #CJK UNIFIED IDEOGRAPH
+0x88CD 0x56F2 #CJK UNIFIED IDEOGRAPH
+0x88CE 0x5937 #CJK UNIFIED IDEOGRAPH
+0x88CF 0x59D4 #CJK UNIFIED IDEOGRAPH
+0x88D0 0x5A01 #CJK UNIFIED IDEOGRAPH
+0x88D1 0x5C09 #CJK UNIFIED IDEOGRAPH
+0x88D2 0x60DF #CJK UNIFIED IDEOGRAPH
+0x88D3 0x610F #CJK UNIFIED IDEOGRAPH
+0x88D4 0x6170 #CJK UNIFIED IDEOGRAPH
+0x88D5 0x6613 #CJK UNIFIED IDEOGRAPH
+0x88D6 0x6905 #CJK UNIFIED IDEOGRAPH
+0x88D7 0x70BA #CJK UNIFIED IDEOGRAPH
+0x88D8 0x754F #CJK UNIFIED IDEOGRAPH
+0x88D9 0x7570 #CJK UNIFIED IDEOGRAPH
+0x88DA 0x79FB #CJK UNIFIED IDEOGRAPH
+0x88DB 0x7DAD #CJK UNIFIED IDEOGRAPH
+0x88DC 0x7DEF #CJK UNIFIED IDEOGRAPH
+0x88DD 0x80C3 #CJK UNIFIED IDEOGRAPH
+0x88DE 0x840E #CJK UNIFIED IDEOGRAPH
+0x88DF 0x8863 #CJK UNIFIED IDEOGRAPH
+0x88E0 0x8B02 #CJK UNIFIED IDEOGRAPH
+0x88E1 0x9055 #CJK UNIFIED IDEOGRAPH
+0x88E2 0x907A #CJK UNIFIED IDEOGRAPH
+0x88E3 0x533B #CJK UNIFIED IDEOGRAPH
+0x88E4 0x4E95 #CJK UNIFIED IDEOGRAPH
+0x88E5 0x4EA5 #CJK UNIFIED IDEOGRAPH
+0x88E6 0x57DF #CJK UNIFIED IDEOGRAPH
+0x88E7 0x80B2 #CJK UNIFIED IDEOGRAPH
+0x88E8 0x90C1 #CJK UNIFIED IDEOGRAPH
+0x88E9 0x78EF #CJK UNIFIED IDEOGRAPH
+0x88EA 0x4E00 #CJK UNIFIED IDEOGRAPH
+0x88EB 0x58F1 #CJK UNIFIED IDEOGRAPH
+0x88EC 0x6EA2 #CJK UNIFIED IDEOGRAPH
+0x88ED 0x9038 #CJK UNIFIED IDEOGRAPH
+0x88EE 0x7A32 #CJK UNIFIED IDEOGRAPH
+0x88EF 0x8328 #CJK UNIFIED IDEOGRAPH
+0x88F0 0x828B #CJK UNIFIED IDEOGRAPH
+0x88F1 0x9C2F #CJK UNIFIED IDEOGRAPH
+0x88F2 0x5141 #CJK UNIFIED IDEOGRAPH
+0x88F3 0x5370 #CJK UNIFIED IDEOGRAPH
+0x88F4 0x54BD #CJK UNIFIED IDEOGRAPH
+0x88F5 0x54E1 #CJK UNIFIED IDEOGRAPH
+0x88F6 0x56E0 #CJK UNIFIED IDEOGRAPH
+0x88F7 0x59FB #CJK UNIFIED IDEOGRAPH
+0x88F8 0x5F15 #CJK UNIFIED IDEOGRAPH
+0x88F9 0x98F2 #CJK UNIFIED IDEOGRAPH
+0x88FA 0x6DEB #CJK UNIFIED IDEOGRAPH
+0x88FB 0x80E4 #CJK UNIFIED IDEOGRAPH
+0x88FC 0x852D #CJK UNIFIED IDEOGRAPH
+0x8940 0x9662 #CJK UNIFIED IDEOGRAPH
+0x8941 0x9670 #CJK UNIFIED IDEOGRAPH
+0x8942 0x96A0 #CJK UNIFIED IDEOGRAPH
+0x8943 0x97FB #CJK UNIFIED IDEOGRAPH
+0x8944 0x540B #CJK UNIFIED IDEOGRAPH
+0x8945 0x53F3 #CJK UNIFIED IDEOGRAPH
+0x8946 0x5B87 #CJK UNIFIED IDEOGRAPH
+0x8947 0x70CF #CJK UNIFIED IDEOGRAPH
+0x8948 0x7FBD #CJK UNIFIED IDEOGRAPH
+0x8949 0x8FC2 #CJK UNIFIED IDEOGRAPH
+0x894A 0x96E8 #CJK UNIFIED IDEOGRAPH
+0x894B 0x536F #CJK UNIFIED IDEOGRAPH
+0x894C 0x9D5C #CJK UNIFIED IDEOGRAPH
+0x894D 0x7ABA #CJK UNIFIED IDEOGRAPH
+0x894E 0x4E11 #CJK UNIFIED IDEOGRAPH
+0x894F 0x7893 #CJK UNIFIED IDEOGRAPH
+0x8950 0x81FC #CJK UNIFIED IDEOGRAPH
+0x8951 0x6E26 #CJK UNIFIED IDEOGRAPH
+0x8952 0x5618 #CJK UNIFIED IDEOGRAPH
+0x8953 0x5504 #CJK UNIFIED IDEOGRAPH
+0x8954 0x6B1D #CJK UNIFIED IDEOGRAPH
+0x8955 0x851A #CJK UNIFIED IDEOGRAPH
+0x8956 0x9C3B #CJK UNIFIED IDEOGRAPH
+0x8957 0x59E5 #CJK UNIFIED IDEOGRAPH
+0x8958 0x53A9 #CJK UNIFIED IDEOGRAPH
+0x8959 0x6D66 #CJK UNIFIED IDEOGRAPH
+0x895A 0x74DC #CJK UNIFIED IDEOGRAPH
+0x895B 0x958F #CJK UNIFIED IDEOGRAPH
+0x895C 0x5642 #CJK UNIFIED IDEOGRAPH
+0x895D 0x4E91 #CJK UNIFIED IDEOGRAPH
+0x895E 0x904B #CJK UNIFIED IDEOGRAPH
+0x895F 0x96F2 #CJK UNIFIED IDEOGRAPH
+0x8960 0x834F #CJK UNIFIED IDEOGRAPH
+0x8961 0x990C #CJK UNIFIED IDEOGRAPH
+0x8962 0x53E1 #CJK UNIFIED IDEOGRAPH
+0x8963 0x55B6 #CJK UNIFIED IDEOGRAPH
+0x8964 0x5B30 #CJK UNIFIED IDEOGRAPH
+0x8965 0x5F71 #CJK UNIFIED IDEOGRAPH
+0x8966 0x6620 #CJK UNIFIED IDEOGRAPH
+0x8967 0x66F3 #CJK UNIFIED IDEOGRAPH
+0x8968 0x6804 #CJK UNIFIED IDEOGRAPH
+0x8969 0x6C38 #CJK UNIFIED IDEOGRAPH
+0x896A 0x6CF3 #CJK UNIFIED IDEOGRAPH
+0x896B 0x6D29 #CJK UNIFIED IDEOGRAPH
+0x896C 0x745B #CJK UNIFIED IDEOGRAPH
+0x896D 0x76C8 #CJK UNIFIED IDEOGRAPH
+0x896E 0x7A4E #CJK UNIFIED IDEOGRAPH
+0x896F 0x9834 #CJK UNIFIED IDEOGRAPH
+0x8970 0x82F1 #CJK UNIFIED IDEOGRAPH
+0x8971 0x885B #CJK UNIFIED IDEOGRAPH
+0x8972 0x8A60 #CJK UNIFIED IDEOGRAPH
+0x8973 0x92ED #CJK UNIFIED IDEOGRAPH
+0x8974 0x6DB2 #CJK UNIFIED IDEOGRAPH
+0x8975 0x75AB #CJK UNIFIED IDEOGRAPH
+0x8976 0x76CA #CJK UNIFIED IDEOGRAPH
+0x8977 0x99C5 #CJK UNIFIED IDEOGRAPH
+0x8978 0x60A6 #CJK UNIFIED IDEOGRAPH
+0x8979 0x8B01 #CJK UNIFIED IDEOGRAPH
+0x897A 0x8D8A #CJK UNIFIED IDEOGRAPH
+0x897B 0x95B2 #CJK UNIFIED IDEOGRAPH
+0x897C 0x698E #CJK UNIFIED IDEOGRAPH
+0x897D 0x53AD #CJK UNIFIED IDEOGRAPH
+0x897E 0x5186 #CJK UNIFIED IDEOGRAPH
+0x8980 0x5712 #CJK UNIFIED IDEOGRAPH
+0x8981 0x5830 #CJK UNIFIED IDEOGRAPH
+0x8982 0x5944 #CJK UNIFIED IDEOGRAPH
+0x8983 0x5BB4 #CJK UNIFIED IDEOGRAPH
+0x8984 0x5EF6 #CJK UNIFIED IDEOGRAPH
+0x8985 0x6028 #CJK UNIFIED IDEOGRAPH
+0x8986 0x63A9 #CJK UNIFIED IDEOGRAPH
+0x8987 0x63F4 #CJK UNIFIED IDEOGRAPH
+0x8988 0x6CBF #CJK UNIFIED IDEOGRAPH
+0x8989 0x6F14 #CJK UNIFIED IDEOGRAPH
+0x898A 0x708E #CJK UNIFIED IDEOGRAPH
+0x898B 0x7114 #CJK UNIFIED IDEOGRAPH
+0x898C 0x7159 #CJK UNIFIED IDEOGRAPH
+0x898D 0x71D5 #CJK UNIFIED IDEOGRAPH
+0x898E 0x733F #CJK UNIFIED IDEOGRAPH
+0x898F 0x7E01 #CJK UNIFIED IDEOGRAPH
+0x8990 0x8276 #CJK UNIFIED IDEOGRAPH
+0x8991 0x82D1 #CJK UNIFIED IDEOGRAPH
+0x8992 0x8597 #CJK UNIFIED IDEOGRAPH
+0x8993 0x9060 #CJK UNIFIED IDEOGRAPH
+0x8994 0x925B #CJK UNIFIED IDEOGRAPH
+0x8995 0x9D1B #CJK UNIFIED IDEOGRAPH
+0x8996 0x5869 #CJK UNIFIED IDEOGRAPH
+0x8997 0x65BC #CJK UNIFIED IDEOGRAPH
+0x8998 0x6C5A #CJK UNIFIED IDEOGRAPH
+0x8999 0x7525 #CJK UNIFIED IDEOGRAPH
+0x899A 0x51F9 #CJK UNIFIED IDEOGRAPH
+0x899B 0x592E #CJK UNIFIED IDEOGRAPH
+0x899C 0x5965 #CJK UNIFIED IDEOGRAPH
+0x899D 0x5F80 #CJK UNIFIED IDEOGRAPH
+0x899E 0x5FDC #CJK UNIFIED IDEOGRAPH
+0x899F 0x62BC #CJK UNIFIED IDEOGRAPH
+0x89A0 0x65FA #CJK UNIFIED IDEOGRAPH
+0x89A1 0x6A2A #CJK UNIFIED IDEOGRAPH
+0x89A2 0x6B27 #CJK UNIFIED IDEOGRAPH
+0x89A3 0x6BB4 #CJK UNIFIED IDEOGRAPH
+0x89A4 0x738B #CJK UNIFIED IDEOGRAPH
+0x89A5 0x7FC1 #CJK UNIFIED IDEOGRAPH
+0x89A6 0x8956 #CJK UNIFIED IDEOGRAPH
+0x89A7 0x9D2C #CJK UNIFIED IDEOGRAPH
+0x89A8 0x9D0E #CJK UNIFIED IDEOGRAPH
+0x89A9 0x9EC4 #CJK UNIFIED IDEOGRAPH
+0x89AA 0x5CA1 #CJK UNIFIED IDEOGRAPH
+0x89AB 0x6C96 #CJK UNIFIED IDEOGRAPH
+0x89AC 0x837B #CJK UNIFIED IDEOGRAPH
+0x89AD 0x5104 #CJK UNIFIED IDEOGRAPH
+0x89AE 0x5C4B #CJK UNIFIED IDEOGRAPH
+0x89AF 0x61B6 #CJK UNIFIED IDEOGRAPH
+0x89B0 0x81C6 #CJK UNIFIED IDEOGRAPH
+0x89B1 0x6876 #CJK UNIFIED IDEOGRAPH
+0x89B2 0x7261 #CJK UNIFIED IDEOGRAPH
+0x89B3 0x4E59 #CJK UNIFIED IDEOGRAPH
+0x89B4 0x4FFA #CJK UNIFIED IDEOGRAPH
+0x89B5 0x5378 #CJK UNIFIED IDEOGRAPH
+0x89B6 0x6069 #CJK UNIFIED IDEOGRAPH
+0x89B7 0x6E29 #CJK UNIFIED IDEOGRAPH
+0x89B8 0x7A4F #CJK UNIFIED IDEOGRAPH
+0x89B9 0x97F3 #CJK UNIFIED IDEOGRAPH
+0x89BA 0x4E0B #CJK UNIFIED IDEOGRAPH
+0x89BB 0x5316 #CJK UNIFIED IDEOGRAPH
+0x89BC 0x4EEE #CJK UNIFIED IDEOGRAPH
+0x89BD 0x4F55 #CJK UNIFIED IDEOGRAPH
+0x89BE 0x4F3D #CJK UNIFIED IDEOGRAPH
+0x89BF 0x4FA1 #CJK UNIFIED IDEOGRAPH
+0x89C0 0x4F73 #CJK UNIFIED IDEOGRAPH
+0x89C1 0x52A0 #CJK UNIFIED IDEOGRAPH
+0x89C2 0x53EF #CJK UNIFIED IDEOGRAPH
+0x89C3 0x5609 #CJK UNIFIED IDEOGRAPH
+0x89C4 0x590F #CJK UNIFIED IDEOGRAPH
+0x89C5 0x5AC1 #CJK UNIFIED IDEOGRAPH
+0x89C6 0x5BB6 #CJK UNIFIED IDEOGRAPH
+0x89C7 0x5BE1 #CJK UNIFIED IDEOGRAPH
+0x89C8 0x79D1 #CJK UNIFIED IDEOGRAPH
+0x89C9 0x6687 #CJK UNIFIED IDEOGRAPH
+0x89CA 0x679C #CJK UNIFIED IDEOGRAPH
+0x89CB 0x67B6 #CJK UNIFIED IDEOGRAPH
+0x89CC 0x6B4C #CJK UNIFIED IDEOGRAPH
+0x89CD 0x6CB3 #CJK UNIFIED IDEOGRAPH
+0x89CE 0x706B #CJK UNIFIED IDEOGRAPH
+0x89CF 0x73C2 #CJK UNIFIED IDEOGRAPH
+0x89D0 0x798D #CJK UNIFIED IDEOGRAPH
+0x89D1 0x79BE #CJK UNIFIED IDEOGRAPH
+0x89D2 0x7A3C #CJK UNIFIED IDEOGRAPH
+0x89D3 0x7B87 #CJK UNIFIED IDEOGRAPH
+0x89D4 0x82B1 #CJK UNIFIED IDEOGRAPH
+0x89D5 0x82DB #CJK UNIFIED IDEOGRAPH
+0x89D6 0x8304 #CJK UNIFIED IDEOGRAPH
+0x89D7 0x8377 #CJK UNIFIED IDEOGRAPH
+0x89D8 0x83EF #CJK UNIFIED IDEOGRAPH
+0x89D9 0x83D3 #CJK UNIFIED IDEOGRAPH
+0x89DA 0x8766 #CJK UNIFIED IDEOGRAPH
+0x89DB 0x8AB2 #CJK UNIFIED IDEOGRAPH
+0x89DC 0x5629 #CJK UNIFIED IDEOGRAPH
+0x89DD 0x8CA8 #CJK UNIFIED IDEOGRAPH
+0x89DE 0x8FE6 #CJK UNIFIED IDEOGRAPH
+0x89DF 0x904E #CJK UNIFIED IDEOGRAPH
+0x89E0 0x971E #CJK UNIFIED IDEOGRAPH
+0x89E1 0x868A #CJK UNIFIED IDEOGRAPH
+0x89E2 0x4FC4 #CJK UNIFIED IDEOGRAPH
+0x89E3 0x5CE8 #CJK UNIFIED IDEOGRAPH
+0x89E4 0x6211 #CJK UNIFIED IDEOGRAPH
+0x89E5 0x7259 #CJK UNIFIED IDEOGRAPH
+0x89E6 0x753B #CJK UNIFIED IDEOGRAPH
+0x89E7 0x81E5 #CJK UNIFIED IDEOGRAPH
+0x89E8 0x82BD #CJK UNIFIED IDEOGRAPH
+0x89E9 0x86FE #CJK UNIFIED IDEOGRAPH
+0x89EA 0x8CC0 #CJK UNIFIED IDEOGRAPH
+0x89EB 0x96C5 #CJK UNIFIED IDEOGRAPH
+0x89EC 0x9913 #CJK UNIFIED IDEOGRAPH
+0x89ED 0x99D5 #CJK UNIFIED IDEOGRAPH
+0x89EE 0x4ECB #CJK UNIFIED IDEOGRAPH
+0x89EF 0x4F1A #CJK UNIFIED IDEOGRAPH
+0x89F0 0x89E3 #CJK UNIFIED IDEOGRAPH
+0x89F1 0x56DE #CJK UNIFIED IDEOGRAPH
+0x89F2 0x584A #CJK UNIFIED IDEOGRAPH
+0x89F3 0x58CA #CJK UNIFIED IDEOGRAPH
+0x89F4 0x5EFB #CJK UNIFIED IDEOGRAPH
+0x89F5 0x5FEB #CJK UNIFIED IDEOGRAPH
+0x89F6 0x602A #CJK UNIFIED IDEOGRAPH
+0x89F7 0x6094 #CJK UNIFIED IDEOGRAPH
+0x89F8 0x6062 #CJK UNIFIED IDEOGRAPH
+0x89F9 0x61D0 #CJK UNIFIED IDEOGRAPH
+0x89FA 0x6212 #CJK UNIFIED IDEOGRAPH
+0x89FB 0x62D0 #CJK UNIFIED IDEOGRAPH
+0x89FC 0x6539 #CJK UNIFIED IDEOGRAPH
+0x8A40 0x9B41 #CJK UNIFIED IDEOGRAPH
+0x8A41 0x6666 #CJK UNIFIED IDEOGRAPH
+0x8A42 0x68B0 #CJK UNIFIED IDEOGRAPH
+0x8A43 0x6D77 #CJK UNIFIED IDEOGRAPH
+0x8A44 0x7070 #CJK UNIFIED IDEOGRAPH
+0x8A45 0x754C #CJK UNIFIED IDEOGRAPH
+0x8A46 0x7686 #CJK UNIFIED IDEOGRAPH
+0x8A47 0x7D75 #CJK UNIFIED IDEOGRAPH
+0x8A48 0x82A5 #CJK UNIFIED IDEOGRAPH
+0x8A49 0x87F9 #CJK UNIFIED IDEOGRAPH
+0x8A4A 0x958B #CJK UNIFIED IDEOGRAPH
+0x8A4B 0x968E #CJK UNIFIED IDEOGRAPH
+0x8A4C 0x8C9D #CJK UNIFIED IDEOGRAPH
+0x8A4D 0x51F1 #CJK UNIFIED IDEOGRAPH
+0x8A4E 0x52BE #CJK UNIFIED IDEOGRAPH
+0x8A4F 0x5916 #CJK UNIFIED IDEOGRAPH
+0x8A50 0x54B3 #CJK UNIFIED IDEOGRAPH
+0x8A51 0x5BB3 #CJK UNIFIED IDEOGRAPH
+0x8A52 0x5D16 #CJK UNIFIED IDEOGRAPH
+0x8A53 0x6168 #CJK UNIFIED IDEOGRAPH
+0x8A54 0x6982 #CJK UNIFIED IDEOGRAPH
+0x8A55 0x6DAF #CJK UNIFIED IDEOGRAPH
+0x8A56 0x788D #CJK UNIFIED IDEOGRAPH
+0x8A57 0x84CB #CJK UNIFIED IDEOGRAPH
+0x8A58 0x8857 #CJK UNIFIED IDEOGRAPH
+0x8A59 0x8A72 #CJK UNIFIED IDEOGRAPH
+0x8A5A 0x93A7 #CJK UNIFIED IDEOGRAPH
+0x8A5B 0x9AB8 #CJK UNIFIED IDEOGRAPH
+0x8A5C 0x6D6C #CJK UNIFIED IDEOGRAPH
+0x8A5D 0x99A8 #CJK UNIFIED IDEOGRAPH
+0x8A5E 0x86D9 #CJK UNIFIED IDEOGRAPH
+0x8A5F 0x57A3 #CJK UNIFIED IDEOGRAPH
+0x8A60 0x67FF #CJK UNIFIED IDEOGRAPH
+0x8A61 0x86CE #CJK UNIFIED IDEOGRAPH
+0x8A62 0x920E #CJK UNIFIED IDEOGRAPH
+0x8A63 0x5283 #CJK UNIFIED IDEOGRAPH
+0x8A64 0x5687 #CJK UNIFIED IDEOGRAPH
+0x8A65 0x5404 #CJK UNIFIED IDEOGRAPH
+0x8A66 0x5ED3 #CJK UNIFIED IDEOGRAPH
+0x8A67 0x62E1 #CJK UNIFIED IDEOGRAPH
+0x8A68 0x64B9 #CJK UNIFIED IDEOGRAPH
+0x8A69 0x683C #CJK UNIFIED IDEOGRAPH
+0x8A6A 0x6838 #CJK UNIFIED IDEOGRAPH
+0x8A6B 0x6BBB #CJK UNIFIED IDEOGRAPH
+0x8A6C 0x7372 #CJK UNIFIED IDEOGRAPH
+0x8A6D 0x78BA #CJK UNIFIED IDEOGRAPH
+0x8A6E 0x7A6B #CJK UNIFIED IDEOGRAPH
+0x8A6F 0x899A #CJK UNIFIED IDEOGRAPH
+0x8A70 0x89D2 #CJK UNIFIED IDEOGRAPH
+0x8A71 0x8D6B #CJK UNIFIED IDEOGRAPH
+0x8A72 0x8F03 #CJK UNIFIED IDEOGRAPH
+0x8A73 0x90ED #CJK UNIFIED IDEOGRAPH
+0x8A74 0x95A3 #CJK UNIFIED IDEOGRAPH
+0x8A75 0x9694 #CJK UNIFIED IDEOGRAPH
+0x8A76 0x9769 #CJK UNIFIED IDEOGRAPH
+0x8A77 0x5B66 #CJK UNIFIED IDEOGRAPH
+0x8A78 0x5CB3 #CJK UNIFIED IDEOGRAPH
+0x8A79 0x697D #CJK UNIFIED IDEOGRAPH
+0x8A7A 0x984D #CJK UNIFIED IDEOGRAPH
+0x8A7B 0x984E #CJK UNIFIED IDEOGRAPH
+0x8A7C 0x639B #CJK UNIFIED IDEOGRAPH
+0x8A7D 0x7B20 #CJK UNIFIED IDEOGRAPH
+0x8A7E 0x6A2B #CJK UNIFIED IDEOGRAPH
+0x8A80 0x6A7F #CJK UNIFIED IDEOGRAPH
+0x8A81 0x68B6 #CJK UNIFIED IDEOGRAPH
+0x8A82 0x9C0D #CJK UNIFIED IDEOGRAPH
+0x8A83 0x6F5F #CJK UNIFIED IDEOGRAPH
+0x8A84 0x5272 #CJK UNIFIED IDEOGRAPH
+0x8A85 0x559D #CJK UNIFIED IDEOGRAPH
+0x8A86 0x6070 #CJK UNIFIED IDEOGRAPH
+0x8A87 0x62EC #CJK UNIFIED IDEOGRAPH
+0x8A88 0x6D3B #CJK UNIFIED IDEOGRAPH
+0x8A89 0x6E07 #CJK UNIFIED IDEOGRAPH
+0x8A8A 0x6ED1 #CJK UNIFIED IDEOGRAPH
+0x8A8B 0x845B #CJK UNIFIED IDEOGRAPH
+0x8A8C 0x8910 #CJK UNIFIED IDEOGRAPH
+0x8A8D 0x8F44 #CJK UNIFIED IDEOGRAPH
+0x8A8E 0x4E14 #CJK UNIFIED IDEOGRAPH
+0x8A8F 0x9C39 #CJK UNIFIED IDEOGRAPH
+0x8A90 0x53F6 #CJK UNIFIED IDEOGRAPH
+0x8A91 0x691B #CJK UNIFIED IDEOGRAPH
+0x8A92 0x6A3A #CJK UNIFIED IDEOGRAPH
+0x8A93 0x9784 #CJK UNIFIED IDEOGRAPH
+0x8A94 0x682A #CJK UNIFIED IDEOGRAPH
+0x8A95 0x515C #CJK UNIFIED IDEOGRAPH
+0x8A96 0x7AC3 #CJK UNIFIED IDEOGRAPH
+0x8A97 0x84B2 #CJK UNIFIED IDEOGRAPH
+0x8A98 0x91DC #CJK UNIFIED IDEOGRAPH
+0x8A99 0x938C #CJK UNIFIED IDEOGRAPH
+0x8A9A 0x565B #CJK UNIFIED IDEOGRAPH
+0x8A9B 0x9D28 #CJK UNIFIED IDEOGRAPH
+0x8A9C 0x6822 #CJK UNIFIED IDEOGRAPH
+0x8A9D 0x8305 #CJK UNIFIED IDEOGRAPH
+0x8A9E 0x8431 #CJK UNIFIED IDEOGRAPH
+0x8A9F 0x7CA5 #CJK UNIFIED IDEOGRAPH
+0x8AA0 0x5208 #CJK UNIFIED IDEOGRAPH
+0x8AA1 0x82C5 #CJK UNIFIED IDEOGRAPH
+0x8AA2 0x74E6 #CJK UNIFIED IDEOGRAPH
+0x8AA3 0x4E7E #CJK UNIFIED IDEOGRAPH
+0x8AA4 0x4F83 #CJK UNIFIED IDEOGRAPH
+0x8AA5 0x51A0 #CJK UNIFIED IDEOGRAPH
+0x8AA6 0x5BD2 #CJK UNIFIED IDEOGRAPH
+0x8AA7 0x520A #CJK UNIFIED IDEOGRAPH
+0x8AA8 0x52D8 #CJK UNIFIED IDEOGRAPH
+0x8AA9 0x52E7 #CJK UNIFIED IDEOGRAPH
+0x8AAA 0x5DFB #CJK UNIFIED IDEOGRAPH
+0x8AAB 0x559A #CJK UNIFIED IDEOGRAPH
+0x8AAC 0x582A #CJK UNIFIED IDEOGRAPH
+0x8AAD 0x59E6 #CJK UNIFIED IDEOGRAPH
+0x8AAE 0x5B8C #CJK UNIFIED IDEOGRAPH
+0x8AAF 0x5B98 #CJK UNIFIED IDEOGRAPH
+0x8AB0 0x5BDB #CJK UNIFIED IDEOGRAPH
+0x8AB1 0x5E72 #CJK UNIFIED IDEOGRAPH
+0x8AB2 0x5E79 #CJK UNIFIED IDEOGRAPH
+0x8AB3 0x60A3 #CJK UNIFIED IDEOGRAPH
+0x8AB4 0x611F #CJK UNIFIED IDEOGRAPH
+0x8AB5 0x6163 #CJK UNIFIED IDEOGRAPH
+0x8AB6 0x61BE #CJK UNIFIED IDEOGRAPH
+0x8AB7 0x63DB #CJK UNIFIED IDEOGRAPH
+0x8AB8 0x6562 #CJK UNIFIED IDEOGRAPH
+0x8AB9 0x67D1 #CJK UNIFIED IDEOGRAPH
+0x8ABA 0x6853 #CJK UNIFIED IDEOGRAPH
+0x8ABB 0x68FA #CJK UNIFIED IDEOGRAPH
+0x8ABC 0x6B3E #CJK UNIFIED IDEOGRAPH
+0x8ABD 0x6B53 #CJK UNIFIED IDEOGRAPH
+0x8ABE 0x6C57 #CJK UNIFIED IDEOGRAPH
+0x8ABF 0x6F22 #CJK UNIFIED IDEOGRAPH
+0x8AC0 0x6F97 #CJK UNIFIED IDEOGRAPH
+0x8AC1 0x6F45 #CJK UNIFIED IDEOGRAPH
+0x8AC2 0x74B0 #CJK UNIFIED IDEOGRAPH
+0x8AC3 0x7518 #CJK UNIFIED IDEOGRAPH
+0x8AC4 0x76E3 #CJK UNIFIED IDEOGRAPH
+0x8AC5 0x770B #CJK UNIFIED IDEOGRAPH
+0x8AC6 0x7AFF #CJK UNIFIED IDEOGRAPH
+0x8AC7 0x7BA1 #CJK UNIFIED IDEOGRAPH
+0x8AC8 0x7C21 #CJK UNIFIED IDEOGRAPH
+0x8AC9 0x7DE9 #CJK UNIFIED IDEOGRAPH
+0x8ACA 0x7F36 #CJK UNIFIED IDEOGRAPH
+0x8ACB 0x7FF0 #CJK UNIFIED IDEOGRAPH
+0x8ACC 0x809D #CJK UNIFIED IDEOGRAPH
+0x8ACD 0x8266 #CJK UNIFIED IDEOGRAPH
+0x8ACE 0x839E #CJK UNIFIED IDEOGRAPH
+0x8ACF 0x89B3 #CJK UNIFIED IDEOGRAPH
+0x8AD0 0x8ACC #CJK UNIFIED IDEOGRAPH
+0x8AD1 0x8CAB #CJK UNIFIED IDEOGRAPH
+0x8AD2 0x9084 #CJK UNIFIED IDEOGRAPH
+0x8AD3 0x9451 #CJK UNIFIED IDEOGRAPH
+0x8AD4 0x9593 #CJK UNIFIED IDEOGRAPH
+0x8AD5 0x9591 #CJK UNIFIED IDEOGRAPH
+0x8AD6 0x95A2 #CJK UNIFIED IDEOGRAPH
+0x8AD7 0x9665 #CJK UNIFIED IDEOGRAPH
+0x8AD8 0x97D3 #CJK UNIFIED IDEOGRAPH
+0x8AD9 0x9928 #CJK UNIFIED IDEOGRAPH
+0x8ADA 0x8218 #CJK UNIFIED IDEOGRAPH
+0x8ADB 0x4E38 #CJK UNIFIED IDEOGRAPH
+0x8ADC 0x542B #CJK UNIFIED IDEOGRAPH
+0x8ADD 0x5CB8 #CJK UNIFIED IDEOGRAPH
+0x8ADE 0x5DCC #CJK UNIFIED IDEOGRAPH
+0x8ADF 0x73A9 #CJK UNIFIED IDEOGRAPH
+0x8AE0 0x764C #CJK UNIFIED IDEOGRAPH
+0x8AE1 0x773C #CJK UNIFIED IDEOGRAPH
+0x8AE2 0x5CA9 #CJK UNIFIED IDEOGRAPH
+0x8AE3 0x7FEB #CJK UNIFIED IDEOGRAPH
+0x8AE4 0x8D0B #CJK UNIFIED IDEOGRAPH
+0x8AE5 0x96C1 #CJK UNIFIED IDEOGRAPH
+0x8AE6 0x9811 #CJK UNIFIED IDEOGRAPH
+0x8AE7 0x9854 #CJK UNIFIED IDEOGRAPH
+0x8AE8 0x9858 #CJK UNIFIED IDEOGRAPH
+0x8AE9 0x4F01 #CJK UNIFIED IDEOGRAPH
+0x8AEA 0x4F0E #CJK UNIFIED IDEOGRAPH
+0x8AEB 0x5371 #CJK UNIFIED IDEOGRAPH
+0x8AEC 0x559C #CJK UNIFIED IDEOGRAPH
+0x8AED 0x5668 #CJK UNIFIED IDEOGRAPH
+0x8AEE 0x57FA #CJK UNIFIED IDEOGRAPH
+0x8AEF 0x5947 #CJK UNIFIED IDEOGRAPH
+0x8AF0 0x5B09 #CJK UNIFIED IDEOGRAPH
+0x8AF1 0x5BC4 #CJK UNIFIED IDEOGRAPH
+0x8AF2 0x5C90 #CJK UNIFIED IDEOGRAPH
+0x8AF3 0x5E0C #CJK UNIFIED IDEOGRAPH
+0x8AF4 0x5E7E #CJK UNIFIED IDEOGRAPH
+0x8AF5 0x5FCC #CJK UNIFIED IDEOGRAPH
+0x8AF6 0x63EE #CJK UNIFIED IDEOGRAPH
+0x8AF7 0x673A #CJK UNIFIED IDEOGRAPH
+0x8AF8 0x65D7 #CJK UNIFIED IDEOGRAPH
+0x8AF9 0x65E2 #CJK UNIFIED IDEOGRAPH
+0x8AFA 0x671F #CJK UNIFIED IDEOGRAPH
+0x8AFB 0x68CB #CJK UNIFIED IDEOGRAPH
+0x8AFC 0x68C4 #CJK UNIFIED IDEOGRAPH
+0x8B40 0x6A5F #CJK UNIFIED IDEOGRAPH
+0x8B41 0x5E30 #CJK UNIFIED IDEOGRAPH
+0x8B42 0x6BC5 #CJK UNIFIED IDEOGRAPH
+0x8B43 0x6C17 #CJK UNIFIED IDEOGRAPH
+0x8B44 0x6C7D #CJK UNIFIED IDEOGRAPH
+0x8B45 0x757F #CJK UNIFIED IDEOGRAPH
+0x8B46 0x7948 #CJK UNIFIED IDEOGRAPH
+0x8B47 0x5B63 #CJK UNIFIED IDEOGRAPH
+0x8B48 0x7A00 #CJK UNIFIED IDEOGRAPH
+0x8B49 0x7D00 #CJK UNIFIED IDEOGRAPH
+0x8B4A 0x5FBD #CJK UNIFIED IDEOGRAPH
+0x8B4B 0x898F #CJK UNIFIED IDEOGRAPH
+0x8B4C 0x8A18 #CJK UNIFIED IDEOGRAPH
+0x8B4D 0x8CB4 #CJK UNIFIED IDEOGRAPH
+0x8B4E 0x8D77 #CJK UNIFIED IDEOGRAPH
+0x8B4F 0x8ECC #CJK UNIFIED IDEOGRAPH
+0x8B50 0x8F1D #CJK UNIFIED IDEOGRAPH
+0x8B51 0x98E2 #CJK UNIFIED IDEOGRAPH
+0x8B52 0x9A0E #CJK UNIFIED IDEOGRAPH
+0x8B53 0x9B3C #CJK UNIFIED IDEOGRAPH
+0x8B54 0x4E80 #CJK UNIFIED IDEOGRAPH
+0x8B55 0x507D #CJK UNIFIED IDEOGRAPH
+0x8B56 0x5100 #CJK UNIFIED IDEOGRAPH
+0x8B57 0x5993 #CJK UNIFIED IDEOGRAPH
+0x8B58 0x5B9C #CJK UNIFIED IDEOGRAPH
+0x8B59 0x622F #CJK UNIFIED IDEOGRAPH
+0x8B5A 0x6280 #CJK UNIFIED IDEOGRAPH
+0x8B5B 0x64EC #CJK UNIFIED IDEOGRAPH
+0x8B5C 0x6B3A #CJK UNIFIED IDEOGRAPH
+0x8B5D 0x72A0 #CJK UNIFIED IDEOGRAPH
+0x8B5E 0x7591 #CJK UNIFIED IDEOGRAPH
+0x8B5F 0x7947 #CJK UNIFIED IDEOGRAPH
+0x8B60 0x7FA9 #CJK UNIFIED IDEOGRAPH
+0x8B61 0x87FB #CJK UNIFIED IDEOGRAPH
+0x8B62 0x8ABC #CJK UNIFIED IDEOGRAPH
+0x8B63 0x8B70 #CJK UNIFIED IDEOGRAPH
+0x8B64 0x63AC #CJK UNIFIED IDEOGRAPH
+0x8B65 0x83CA #CJK UNIFIED IDEOGRAPH
+0x8B66 0x97A0 #CJK UNIFIED IDEOGRAPH
+0x8B67 0x5409 #CJK UNIFIED IDEOGRAPH
+0x8B68 0x5403 #CJK UNIFIED IDEOGRAPH
+0x8B69 0x55AB #CJK UNIFIED IDEOGRAPH
+0x8B6A 0x6854 #CJK UNIFIED IDEOGRAPH
+0x8B6B 0x6A58 #CJK UNIFIED IDEOGRAPH
+0x8B6C 0x8A70 #CJK UNIFIED IDEOGRAPH
+0x8B6D 0x7827 #CJK UNIFIED IDEOGRAPH
+0x8B6E 0x6775 #CJK UNIFIED IDEOGRAPH
+0x8B6F 0x9ECD #CJK UNIFIED IDEOGRAPH
+0x8B70 0x5374 #CJK UNIFIED IDEOGRAPH
+0x8B71 0x5BA2 #CJK UNIFIED IDEOGRAPH
+0x8B72 0x811A #CJK UNIFIED IDEOGRAPH
+0x8B73 0x8650 #CJK UNIFIED IDEOGRAPH
+0x8B74 0x9006 #CJK UNIFIED IDEOGRAPH
+0x8B75 0x4E18 #CJK UNIFIED IDEOGRAPH
+0x8B76 0x4E45 #CJK UNIFIED IDEOGRAPH
+0x8B77 0x4EC7 #CJK UNIFIED IDEOGRAPH
+0x8B78 0x4F11 #CJK UNIFIED IDEOGRAPH
+0x8B79 0x53CA #CJK UNIFIED IDEOGRAPH
+0x8B7A 0x5438 #CJK UNIFIED IDEOGRAPH
+0x8B7B 0x5BAE #CJK UNIFIED IDEOGRAPH
+0x8B7C 0x5F13 #CJK UNIFIED IDEOGRAPH
+0x8B7D 0x6025 #CJK UNIFIED IDEOGRAPH
+0x8B7E 0x6551 #CJK UNIFIED IDEOGRAPH
+0x8B80 0x673D #CJK UNIFIED IDEOGRAPH
+0x8B81 0x6C42 #CJK UNIFIED IDEOGRAPH
+0x8B82 0x6C72 #CJK UNIFIED IDEOGRAPH
+0x8B83 0x6CE3 #CJK UNIFIED IDEOGRAPH
+0x8B84 0x7078 #CJK UNIFIED IDEOGRAPH
+0x8B85 0x7403 #CJK UNIFIED IDEOGRAPH
+0x8B86 0x7A76 #CJK UNIFIED IDEOGRAPH
+0x8B87 0x7AAE #CJK UNIFIED IDEOGRAPH
+0x8B88 0x7B08 #CJK UNIFIED IDEOGRAPH
+0x8B89 0x7D1A #CJK UNIFIED IDEOGRAPH
+0x8B8A 0x7CFE #CJK UNIFIED IDEOGRAPH
+0x8B8B 0x7D66 #CJK UNIFIED IDEOGRAPH
+0x8B8C 0x65E7 #CJK UNIFIED IDEOGRAPH
+0x8B8D 0x725B #CJK UNIFIED IDEOGRAPH
+0x8B8E 0x53BB #CJK UNIFIED IDEOGRAPH
+0x8B8F 0x5C45 #CJK UNIFIED IDEOGRAPH
+0x8B90 0x5DE8 #CJK UNIFIED IDEOGRAPH
+0x8B91 0x62D2 #CJK UNIFIED IDEOGRAPH
+0x8B92 0x62E0 #CJK UNIFIED IDEOGRAPH
+0x8B93 0x6319 #CJK UNIFIED IDEOGRAPH
+0x8B94 0x6E20 #CJK UNIFIED IDEOGRAPH
+0x8B95 0x865A #CJK UNIFIED IDEOGRAPH
+0x8B96 0x8A31 #CJK UNIFIED IDEOGRAPH
+0x8B97 0x8DDD #CJK UNIFIED IDEOGRAPH
+0x8B98 0x92F8 #CJK UNIFIED IDEOGRAPH
+0x8B99 0x6F01 #CJK UNIFIED IDEOGRAPH
+0x8B9A 0x79A6 #CJK UNIFIED IDEOGRAPH
+0x8B9B 0x9B5A #CJK UNIFIED IDEOGRAPH
+0x8B9C 0x4EA8 #CJK UNIFIED IDEOGRAPH
+0x8B9D 0x4EAB #CJK UNIFIED IDEOGRAPH
+0x8B9E 0x4EAC #CJK UNIFIED IDEOGRAPH
+0x8B9F 0x4F9B #CJK UNIFIED IDEOGRAPH
+0x8BA0 0x4FA0 #CJK UNIFIED IDEOGRAPH
+0x8BA1 0x50D1 #CJK UNIFIED IDEOGRAPH
+0x8BA2 0x5147 #CJK UNIFIED IDEOGRAPH
+0x8BA3 0x7AF6 #CJK UNIFIED IDEOGRAPH
+0x8BA4 0x5171 #CJK UNIFIED IDEOGRAPH
+0x8BA5 0x51F6 #CJK UNIFIED IDEOGRAPH
+0x8BA6 0x5354 #CJK UNIFIED IDEOGRAPH
+0x8BA7 0x5321 #CJK UNIFIED IDEOGRAPH
+0x8BA8 0x537F #CJK UNIFIED IDEOGRAPH
+0x8BA9 0x53EB #CJK UNIFIED IDEOGRAPH
+0x8BAA 0x55AC #CJK UNIFIED IDEOGRAPH
+0x8BAB 0x5883 #CJK UNIFIED IDEOGRAPH
+0x8BAC 0x5CE1 #CJK UNIFIED IDEOGRAPH
+0x8BAD 0x5F37 #CJK UNIFIED IDEOGRAPH
+0x8BAE 0x5F4A #CJK UNIFIED IDEOGRAPH
+0x8BAF 0x602F #CJK UNIFIED IDEOGRAPH
+0x8BB0 0x6050 #CJK UNIFIED IDEOGRAPH
+0x8BB1 0x606D #CJK UNIFIED IDEOGRAPH
+0x8BB2 0x631F #CJK UNIFIED IDEOGRAPH
+0x8BB3 0x6559 #CJK UNIFIED IDEOGRAPH
+0x8BB4 0x6A4B #CJK UNIFIED IDEOGRAPH
+0x8BB5 0x6CC1 #CJK UNIFIED IDEOGRAPH
+0x8BB6 0x72C2 #CJK UNIFIED IDEOGRAPH
+0x8BB7 0x72ED #CJK UNIFIED IDEOGRAPH
+0x8BB8 0x77EF #CJK UNIFIED IDEOGRAPH
+0x8BB9 0x80F8 #CJK UNIFIED IDEOGRAPH
+0x8BBA 0x8105 #CJK UNIFIED IDEOGRAPH
+0x8BBB 0x8208 #CJK UNIFIED IDEOGRAPH
+0x8BBC 0x854E #CJK UNIFIED IDEOGRAPH
+0x8BBD 0x90F7 #CJK UNIFIED IDEOGRAPH
+0x8BBE 0x93E1 #CJK UNIFIED IDEOGRAPH
+0x8BBF 0x97FF #CJK UNIFIED IDEOGRAPH
+0x8BC0 0x9957 #CJK UNIFIED IDEOGRAPH
+0x8BC1 0x9A5A #CJK UNIFIED IDEOGRAPH
+0x8BC2 0x4EF0 #CJK UNIFIED IDEOGRAPH
+0x8BC3 0x51DD #CJK UNIFIED IDEOGRAPH
+0x8BC4 0x5C2D #CJK UNIFIED IDEOGRAPH
+0x8BC5 0x6681 #CJK UNIFIED IDEOGRAPH
+0x8BC6 0x696D #CJK UNIFIED IDEOGRAPH
+0x8BC7 0x5C40 #CJK UNIFIED IDEOGRAPH
+0x8BC8 0x66F2 #CJK UNIFIED IDEOGRAPH
+0x8BC9 0x6975 #CJK UNIFIED IDEOGRAPH
+0x8BCA 0x7389 #CJK UNIFIED IDEOGRAPH
+0x8BCB 0x6850 #CJK UNIFIED IDEOGRAPH
+0x8BCC 0x7C81 #CJK UNIFIED IDEOGRAPH
+0x8BCD 0x50C5 #CJK UNIFIED IDEOGRAPH
+0x8BCE 0x52E4 #CJK UNIFIED IDEOGRAPH
+0x8BCF 0x5747 #CJK UNIFIED IDEOGRAPH
+0x8BD0 0x5DFE #CJK UNIFIED IDEOGRAPH
+0x8BD1 0x9326 #CJK UNIFIED IDEOGRAPH
+0x8BD2 0x65A4 #CJK UNIFIED IDEOGRAPH
+0x8BD3 0x6B23 #CJK UNIFIED IDEOGRAPH
+0x8BD4 0x6B3D #CJK UNIFIED IDEOGRAPH
+0x8BD5 0x7434 #CJK UNIFIED IDEOGRAPH
+0x8BD6 0x7981 #CJK UNIFIED IDEOGRAPH
+0x8BD7 0x79BD #CJK UNIFIED IDEOGRAPH
+0x8BD8 0x7B4B #CJK UNIFIED IDEOGRAPH
+0x8BD9 0x7DCA #CJK UNIFIED IDEOGRAPH
+0x8BDA 0x82B9 #CJK UNIFIED IDEOGRAPH
+0x8BDB 0x83CC #CJK UNIFIED IDEOGRAPH
+0x8BDC 0x887F #CJK UNIFIED IDEOGRAPH
+0x8BDD 0x895F #CJK UNIFIED IDEOGRAPH
+0x8BDE 0x8B39 #CJK UNIFIED IDEOGRAPH
+0x8BDF 0x8FD1 #CJK UNIFIED IDEOGRAPH
+0x8BE0 0x91D1 #CJK UNIFIED IDEOGRAPH
+0x8BE1 0x541F #CJK UNIFIED IDEOGRAPH
+0x8BE2 0x9280 #CJK UNIFIED IDEOGRAPH
+0x8BE3 0x4E5D #CJK UNIFIED IDEOGRAPH
+0x8BE4 0x5036 #CJK UNIFIED IDEOGRAPH
+0x8BE5 0x53E5 #CJK UNIFIED IDEOGRAPH
+0x8BE6 0x533A #CJK UNIFIED IDEOGRAPH
+0x8BE7 0x72D7 #CJK UNIFIED IDEOGRAPH
+0x8BE8 0x7396 #CJK UNIFIED IDEOGRAPH
+0x8BE9 0x77E9 #CJK UNIFIED IDEOGRAPH
+0x8BEA 0x82E6 #CJK UNIFIED IDEOGRAPH
+0x8BEB 0x8EAF #CJK UNIFIED IDEOGRAPH
+0x8BEC 0x99C6 #CJK UNIFIED IDEOGRAPH
+0x8BED 0x99C8 #CJK UNIFIED IDEOGRAPH
+0x8BEE 0x99D2 #CJK UNIFIED IDEOGRAPH
+0x8BEF 0x5177 #CJK UNIFIED IDEOGRAPH
+0x8BF0 0x611A #CJK UNIFIED IDEOGRAPH
+0x8BF1 0x865E #CJK UNIFIED IDEOGRAPH
+0x8BF2 0x55B0 #CJK UNIFIED IDEOGRAPH
+0x8BF3 0x7A7A #CJK UNIFIED IDEOGRAPH
+0x8BF4 0x5076 #CJK UNIFIED IDEOGRAPH
+0x8BF5 0x5BD3 #CJK UNIFIED IDEOGRAPH
+0x8BF6 0x9047 #CJK UNIFIED IDEOGRAPH
+0x8BF7 0x9685 #CJK UNIFIED IDEOGRAPH
+0x8BF8 0x4E32 #CJK UNIFIED IDEOGRAPH
+0x8BF9 0x6ADB #CJK UNIFIED IDEOGRAPH
+0x8BFA 0x91E7 #CJK UNIFIED IDEOGRAPH
+0x8BFB 0x5C51 #CJK UNIFIED IDEOGRAPH
+0x8BFC 0x5C48 #CJK UNIFIED IDEOGRAPH
+0x8C40 0x6398 #CJK UNIFIED IDEOGRAPH
+0x8C41 0x7A9F #CJK UNIFIED IDEOGRAPH
+0x8C42 0x6C93 #CJK UNIFIED IDEOGRAPH
+0x8C43 0x9774 #CJK UNIFIED IDEOGRAPH
+0x8C44 0x8F61 #CJK UNIFIED IDEOGRAPH
+0x8C45 0x7AAA #CJK UNIFIED IDEOGRAPH
+0x8C46 0x718A #CJK UNIFIED IDEOGRAPH
+0x8C47 0x9688 #CJK UNIFIED IDEOGRAPH
+0x8C48 0x7C82 #CJK UNIFIED IDEOGRAPH
+0x8C49 0x6817 #CJK UNIFIED IDEOGRAPH
+0x8C4A 0x7E70 #CJK UNIFIED IDEOGRAPH
+0x8C4B 0x6851 #CJK UNIFIED IDEOGRAPH
+0x8C4C 0x936C #CJK UNIFIED IDEOGRAPH
+0x8C4D 0x52F2 #CJK UNIFIED IDEOGRAPH
+0x8C4E 0x541B #CJK UNIFIED IDEOGRAPH
+0x8C4F 0x85AB #CJK UNIFIED IDEOGRAPH
+0x8C50 0x8A13 #CJK UNIFIED IDEOGRAPH
+0x8C51 0x7FA4 #CJK UNIFIED IDEOGRAPH
+0x8C52 0x8ECD #CJK UNIFIED IDEOGRAPH
+0x8C53 0x90E1 #CJK UNIFIED IDEOGRAPH
+0x8C54 0x5366 #CJK UNIFIED IDEOGRAPH
+0x8C55 0x8888 #CJK UNIFIED IDEOGRAPH
+0x8C56 0x7941 #CJK UNIFIED IDEOGRAPH
+0x8C57 0x4FC2 #CJK UNIFIED IDEOGRAPH
+0x8C58 0x50BE #CJK UNIFIED IDEOGRAPH
+0x8C59 0x5211 #CJK UNIFIED IDEOGRAPH
+0x8C5A 0x5144 #CJK UNIFIED IDEOGRAPH
+0x8C5B 0x5553 #CJK UNIFIED IDEOGRAPH
+0x8C5C 0x572D #CJK UNIFIED IDEOGRAPH
+0x8C5D 0x73EA #CJK UNIFIED IDEOGRAPH
+0x8C5E 0x578B #CJK UNIFIED IDEOGRAPH
+0x8C5F 0x5951 #CJK UNIFIED IDEOGRAPH
+0x8C60 0x5F62 #CJK UNIFIED IDEOGRAPH
+0x8C61 0x5F84 #CJK UNIFIED IDEOGRAPH
+0x8C62 0x6075 #CJK UNIFIED IDEOGRAPH
+0x8C63 0x6176 #CJK UNIFIED IDEOGRAPH
+0x8C64 0x6167 #CJK UNIFIED IDEOGRAPH
+0x8C65 0x61A9 #CJK UNIFIED IDEOGRAPH
+0x8C66 0x63B2 #CJK UNIFIED IDEOGRAPH
+0x8C67 0x643A #CJK UNIFIED IDEOGRAPH
+0x8C68 0x656C #CJK UNIFIED IDEOGRAPH
+0x8C69 0x666F #CJK UNIFIED IDEOGRAPH
+0x8C6A 0x6842 #CJK UNIFIED IDEOGRAPH
+0x8C6B 0x6E13 #CJK UNIFIED IDEOGRAPH
+0x8C6C 0x7566 #CJK UNIFIED IDEOGRAPH
+0x8C6D 0x7A3D #CJK UNIFIED IDEOGRAPH
+0x8C6E 0x7CFB #CJK UNIFIED IDEOGRAPH
+0x8C6F 0x7D4C #CJK UNIFIED IDEOGRAPH
+0x8C70 0x7D99 #CJK UNIFIED IDEOGRAPH
+0x8C71 0x7E4B #CJK UNIFIED IDEOGRAPH
+0x8C72 0x7F6B #CJK UNIFIED IDEOGRAPH
+0x8C73 0x830E #CJK UNIFIED IDEOGRAPH
+0x8C74 0x834A #CJK UNIFIED IDEOGRAPH
+0x8C75 0x86CD #CJK UNIFIED IDEOGRAPH
+0x8C76 0x8A08 #CJK UNIFIED IDEOGRAPH
+0x8C77 0x8A63 #CJK UNIFIED IDEOGRAPH
+0x8C78 0x8B66 #CJK UNIFIED IDEOGRAPH
+0x8C79 0x8EFD #CJK UNIFIED IDEOGRAPH
+0x8C7A 0x981A #CJK UNIFIED IDEOGRAPH
+0x8C7B 0x9D8F #CJK UNIFIED IDEOGRAPH
+0x8C7C 0x82B8 #CJK UNIFIED IDEOGRAPH
+0x8C7D 0x8FCE #CJK UNIFIED IDEOGRAPH
+0x8C7E 0x9BE8 #CJK UNIFIED IDEOGRAPH
+0x8C80 0x5287 #CJK UNIFIED IDEOGRAPH
+0x8C81 0x621F #CJK UNIFIED IDEOGRAPH
+0x8C82 0x6483 #CJK UNIFIED IDEOGRAPH
+0x8C83 0x6FC0 #CJK UNIFIED IDEOGRAPH
+0x8C84 0x9699 #CJK UNIFIED IDEOGRAPH
+0x8C85 0x6841 #CJK UNIFIED IDEOGRAPH
+0x8C86 0x5091 #CJK UNIFIED IDEOGRAPH
+0x8C87 0x6B20 #CJK UNIFIED IDEOGRAPH
+0x8C88 0x6C7A #CJK UNIFIED IDEOGRAPH
+0x8C89 0x6F54 #CJK UNIFIED IDEOGRAPH
+0x8C8A 0x7A74 #CJK UNIFIED IDEOGRAPH
+0x8C8B 0x7D50 #CJK UNIFIED IDEOGRAPH
+0x8C8C 0x8840 #CJK UNIFIED IDEOGRAPH
+0x8C8D 0x8A23 #CJK UNIFIED IDEOGRAPH
+0x8C8E 0x6708 #CJK UNIFIED IDEOGRAPH
+0x8C8F 0x4EF6 #CJK UNIFIED IDEOGRAPH
+0x8C90 0x5039 #CJK UNIFIED IDEOGRAPH
+0x8C91 0x5026 #CJK UNIFIED IDEOGRAPH
+0x8C92 0x5065 #CJK UNIFIED IDEOGRAPH
+0x8C93 0x517C #CJK UNIFIED IDEOGRAPH
+0x8C94 0x5238 #CJK UNIFIED IDEOGRAPH
+0x8C95 0x5263 #CJK UNIFIED IDEOGRAPH
+0x8C96 0x55A7 #CJK UNIFIED IDEOGRAPH
+0x8C97 0x570F #CJK UNIFIED IDEOGRAPH
+0x8C98 0x5805 #CJK UNIFIED IDEOGRAPH
+0x8C99 0x5ACC #CJK UNIFIED IDEOGRAPH
+0x8C9A 0x5EFA #CJK UNIFIED IDEOGRAPH
+0x8C9B 0x61B2 #CJK UNIFIED IDEOGRAPH
+0x8C9C 0x61F8 #CJK UNIFIED IDEOGRAPH
+0x8C9D 0x62F3 #CJK UNIFIED IDEOGRAPH
+0x8C9E 0x6372 #CJK UNIFIED IDEOGRAPH
+0x8C9F 0x691C #CJK UNIFIED IDEOGRAPH
+0x8CA0 0x6A29 #CJK UNIFIED IDEOGRAPH
+0x8CA1 0x727D #CJK UNIFIED IDEOGRAPH
+0x8CA2 0x72AC #CJK UNIFIED IDEOGRAPH
+0x8CA3 0x732E #CJK UNIFIED IDEOGRAPH
+0x8CA4 0x7814 #CJK UNIFIED IDEOGRAPH
+0x8CA5 0x786F #CJK UNIFIED IDEOGRAPH
+0x8CA6 0x7D79 #CJK UNIFIED IDEOGRAPH
+0x8CA7 0x770C #CJK UNIFIED IDEOGRAPH
+0x8CA8 0x80A9 #CJK UNIFIED IDEOGRAPH
+0x8CA9 0x898B #CJK UNIFIED IDEOGRAPH
+0x8CAA 0x8B19 #CJK UNIFIED IDEOGRAPH
+0x8CAB 0x8CE2 #CJK UNIFIED IDEOGRAPH
+0x8CAC 0x8ED2 #CJK UNIFIED IDEOGRAPH
+0x8CAD 0x9063 #CJK UNIFIED IDEOGRAPH
+0x8CAE 0x9375 #CJK UNIFIED IDEOGRAPH
+0x8CAF 0x967A #CJK UNIFIED IDEOGRAPH
+0x8CB0 0x9855 #CJK UNIFIED IDEOGRAPH
+0x8CB1 0x9A13 #CJK UNIFIED IDEOGRAPH
+0x8CB2 0x9E78 #CJK UNIFIED IDEOGRAPH
+0x8CB3 0x5143 #CJK UNIFIED IDEOGRAPH
+0x8CB4 0x539F #CJK UNIFIED IDEOGRAPH
+0x8CB5 0x53B3 #CJK UNIFIED IDEOGRAPH
+0x8CB6 0x5E7B #CJK UNIFIED IDEOGRAPH
+0x8CB7 0x5F26 #CJK UNIFIED IDEOGRAPH
+0x8CB8 0x6E1B #CJK UNIFIED IDEOGRAPH
+0x8CB9 0x6E90 #CJK UNIFIED IDEOGRAPH
+0x8CBA 0x7384 #CJK UNIFIED IDEOGRAPH
+0x8CBB 0x73FE #CJK UNIFIED IDEOGRAPH
+0x8CBC 0x7D43 #CJK UNIFIED IDEOGRAPH
+0x8CBD 0x8237 #CJK UNIFIED IDEOGRAPH
+0x8CBE 0x8A00 #CJK UNIFIED IDEOGRAPH
+0x8CBF 0x8AFA #CJK UNIFIED IDEOGRAPH
+0x8CC0 0x9650 #CJK UNIFIED IDEOGRAPH
+0x8CC1 0x4E4E #CJK UNIFIED IDEOGRAPH
+0x8CC2 0x500B #CJK UNIFIED IDEOGRAPH
+0x8CC3 0x53E4 #CJK UNIFIED IDEOGRAPH
+0x8CC4 0x547C #CJK UNIFIED IDEOGRAPH
+0x8CC5 0x56FA #CJK UNIFIED IDEOGRAPH
+0x8CC6 0x59D1 #CJK UNIFIED IDEOGRAPH
+0x8CC7 0x5B64 #CJK UNIFIED IDEOGRAPH
+0x8CC8 0x5DF1 #CJK UNIFIED IDEOGRAPH
+0x8CC9 0x5EAB #CJK UNIFIED IDEOGRAPH
+0x8CCA 0x5F27 #CJK UNIFIED IDEOGRAPH
+0x8CCB 0x6238 #CJK UNIFIED IDEOGRAPH
+0x8CCC 0x6545 #CJK UNIFIED IDEOGRAPH
+0x8CCD 0x67AF #CJK UNIFIED IDEOGRAPH
+0x8CCE 0x6E56 #CJK UNIFIED IDEOGRAPH
+0x8CCF 0x72D0 #CJK UNIFIED IDEOGRAPH
+0x8CD0 0x7CCA #CJK UNIFIED IDEOGRAPH
+0x8CD1 0x88B4 #CJK UNIFIED IDEOGRAPH
+0x8CD2 0x80A1 #CJK UNIFIED IDEOGRAPH
+0x8CD3 0x80E1 #CJK UNIFIED IDEOGRAPH
+0x8CD4 0x83F0 #CJK UNIFIED IDEOGRAPH
+0x8CD5 0x864E #CJK UNIFIED IDEOGRAPH
+0x8CD6 0x8A87 #CJK UNIFIED IDEOGRAPH
+0x8CD7 0x8DE8 #CJK UNIFIED IDEOGRAPH
+0x8CD8 0x9237 #CJK UNIFIED IDEOGRAPH
+0x8CD9 0x96C7 #CJK UNIFIED IDEOGRAPH
+0x8CDA 0x9867 #CJK UNIFIED IDEOGRAPH
+0x8CDB 0x9F13 #CJK UNIFIED IDEOGRAPH
+0x8CDC 0x4E94 #CJK UNIFIED IDEOGRAPH
+0x8CDD 0x4E92 #CJK UNIFIED IDEOGRAPH
+0x8CDE 0x4F0D #CJK UNIFIED IDEOGRAPH
+0x8CDF 0x5348 #CJK UNIFIED IDEOGRAPH
+0x8CE0 0x5449 #CJK UNIFIED IDEOGRAPH
+0x8CE1 0x543E #CJK UNIFIED IDEOGRAPH
+0x8CE2 0x5A2F #CJK UNIFIED IDEOGRAPH
+0x8CE3 0x5F8C #CJK UNIFIED IDEOGRAPH
+0x8CE4 0x5FA1 #CJK UNIFIED IDEOGRAPH
+0x8CE5 0x609F #CJK UNIFIED IDEOGRAPH
+0x8CE6 0x68A7 #CJK UNIFIED IDEOGRAPH
+0x8CE7 0x6A8E #CJK UNIFIED IDEOGRAPH
+0x8CE8 0x745A #CJK UNIFIED IDEOGRAPH
+0x8CE9 0x7881 #CJK UNIFIED IDEOGRAPH
+0x8CEA 0x8A9E #CJK UNIFIED IDEOGRAPH
+0x8CEB 0x8AA4 #CJK UNIFIED IDEOGRAPH
+0x8CEC 0x8B77 #CJK UNIFIED IDEOGRAPH
+0x8CED 0x9190 #CJK UNIFIED IDEOGRAPH
+0x8CEE 0x4E5E #CJK UNIFIED IDEOGRAPH
+0x8CEF 0x9BC9 #CJK UNIFIED IDEOGRAPH
+0x8CF0 0x4EA4 #CJK UNIFIED IDEOGRAPH
+0x8CF1 0x4F7C #CJK UNIFIED IDEOGRAPH
+0x8CF2 0x4FAF #CJK UNIFIED IDEOGRAPH
+0x8CF3 0x5019 #CJK UNIFIED IDEOGRAPH
+0x8CF4 0x5016 #CJK UNIFIED IDEOGRAPH
+0x8CF5 0x5149 #CJK UNIFIED IDEOGRAPH
+0x8CF6 0x516C #CJK UNIFIED IDEOGRAPH
+0x8CF7 0x529F #CJK UNIFIED IDEOGRAPH
+0x8CF8 0x52B9 #CJK UNIFIED IDEOGRAPH
+0x8CF9 0x52FE #CJK UNIFIED IDEOGRAPH
+0x8CFA 0x539A #CJK UNIFIED IDEOGRAPH
+0x8CFB 0x53E3 #CJK UNIFIED IDEOGRAPH
+0x8CFC 0x5411 #CJK UNIFIED IDEOGRAPH
+0x8D40 0x540E #CJK UNIFIED IDEOGRAPH
+0x8D41 0x5589 #CJK UNIFIED IDEOGRAPH
+0x8D42 0x5751 #CJK UNIFIED IDEOGRAPH
+0x8D43 0x57A2 #CJK UNIFIED IDEOGRAPH
+0x8D44 0x597D #CJK UNIFIED IDEOGRAPH
+0x8D45 0x5B54 #CJK UNIFIED IDEOGRAPH
+0x8D46 0x5B5D #CJK UNIFIED IDEOGRAPH
+0x8D47 0x5B8F #CJK UNIFIED IDEOGRAPH
+0x8D48 0x5DE5 #CJK UNIFIED IDEOGRAPH
+0x8D49 0x5DE7 #CJK UNIFIED IDEOGRAPH
+0x8D4A 0x5DF7 #CJK UNIFIED IDEOGRAPH
+0x8D4B 0x5E78 #CJK UNIFIED IDEOGRAPH
+0x8D4C 0x5E83 #CJK UNIFIED IDEOGRAPH
+0x8D4D 0x5E9A #CJK UNIFIED IDEOGRAPH
+0x8D4E 0x5EB7 #CJK UNIFIED IDEOGRAPH
+0x8D4F 0x5F18 #CJK UNIFIED IDEOGRAPH
+0x8D50 0x6052 #CJK UNIFIED IDEOGRAPH
+0x8D51 0x614C #CJK UNIFIED IDEOGRAPH
+0x8D52 0x6297 #CJK UNIFIED IDEOGRAPH
+0x8D53 0x62D8 #CJK UNIFIED IDEOGRAPH
+0x8D54 0x63A7 #CJK UNIFIED IDEOGRAPH
+0x8D55 0x653B #CJK UNIFIED IDEOGRAPH
+0x8D56 0x6602 #CJK UNIFIED IDEOGRAPH
+0x8D57 0x6643 #CJK UNIFIED IDEOGRAPH
+0x8D58 0x66F4 #CJK UNIFIED IDEOGRAPH
+0x8D59 0x676D #CJK UNIFIED IDEOGRAPH
+0x8D5A 0x6821 #CJK UNIFIED IDEOGRAPH
+0x8D5B 0x6897 #CJK UNIFIED IDEOGRAPH
+0x8D5C 0x69CB #CJK UNIFIED IDEOGRAPH
+0x8D5D 0x6C5F #CJK UNIFIED IDEOGRAPH
+0x8D5E 0x6D2A #CJK UNIFIED IDEOGRAPH
+0x8D5F 0x6D69 #CJK UNIFIED IDEOGRAPH
+0x8D60 0x6E2F #CJK UNIFIED IDEOGRAPH
+0x8D61 0x6E9D #CJK UNIFIED IDEOGRAPH
+0x8D62 0x7532 #CJK UNIFIED IDEOGRAPH
+0x8D63 0x7687 #CJK UNIFIED IDEOGRAPH
+0x8D64 0x786C #CJK UNIFIED IDEOGRAPH
+0x8D65 0x7A3F #CJK UNIFIED IDEOGRAPH
+0x8D66 0x7CE0 #CJK UNIFIED IDEOGRAPH
+0x8D67 0x7D05 #CJK UNIFIED IDEOGRAPH
+0x8D68 0x7D18 #CJK UNIFIED IDEOGRAPH
+0x8D69 0x7D5E #CJK UNIFIED IDEOGRAPH
+0x8D6A 0x7DB1 #CJK UNIFIED IDEOGRAPH
+0x8D6B 0x8015 #CJK UNIFIED IDEOGRAPH
+0x8D6C 0x8003 #CJK UNIFIED IDEOGRAPH
+0x8D6D 0x80AF #CJK UNIFIED IDEOGRAPH
+0x8D6E 0x80B1 #CJK UNIFIED IDEOGRAPH
+0x8D6F 0x8154 #CJK UNIFIED IDEOGRAPH
+0x8D70 0x818F #CJK UNIFIED IDEOGRAPH
+0x8D71 0x822A #CJK UNIFIED IDEOGRAPH
+0x8D72 0x8352 #CJK UNIFIED IDEOGRAPH
+0x8D73 0x884C #CJK UNIFIED IDEOGRAPH
+0x8D74 0x8861 #CJK UNIFIED IDEOGRAPH
+0x8D75 0x8B1B #CJK UNIFIED IDEOGRAPH
+0x8D76 0x8CA2 #CJK UNIFIED IDEOGRAPH
+0x8D77 0x8CFC #CJK UNIFIED IDEOGRAPH
+0x8D78 0x90CA #CJK UNIFIED IDEOGRAPH
+0x8D79 0x9175 #CJK UNIFIED IDEOGRAPH
+0x8D7A 0x9271 #CJK UNIFIED IDEOGRAPH
+0x8D7B 0x783F #CJK UNIFIED IDEOGRAPH
+0x8D7C 0x92FC #CJK UNIFIED IDEOGRAPH
+0x8D7D 0x95A4 #CJK UNIFIED IDEOGRAPH
+0x8D7E 0x964D #CJK UNIFIED IDEOGRAPH
+0x8D80 0x9805 #CJK UNIFIED IDEOGRAPH
+0x8D81 0x9999 #CJK UNIFIED IDEOGRAPH
+0x8D82 0x9AD8 #CJK UNIFIED IDEOGRAPH
+0x8D83 0x9D3B #CJK UNIFIED IDEOGRAPH
+0x8D84 0x525B #CJK UNIFIED IDEOGRAPH
+0x8D85 0x52AB #CJK UNIFIED IDEOGRAPH
+0x8D86 0x53F7 #CJK UNIFIED IDEOGRAPH
+0x8D87 0x5408 #CJK UNIFIED IDEOGRAPH
+0x8D88 0x58D5 #CJK UNIFIED IDEOGRAPH
+0x8D89 0x62F7 #CJK UNIFIED IDEOGRAPH
+0x8D8A 0x6FE0 #CJK UNIFIED IDEOGRAPH
+0x8D8B 0x8C6A #CJK UNIFIED IDEOGRAPH
+0x8D8C 0x8F5F #CJK UNIFIED IDEOGRAPH
+0x8D8D 0x9EB9 #CJK UNIFIED IDEOGRAPH
+0x8D8E 0x514B #CJK UNIFIED IDEOGRAPH
+0x8D8F 0x523B #CJK UNIFIED IDEOGRAPH
+0x8D90 0x544A #CJK UNIFIED IDEOGRAPH
+0x8D91 0x56FD #CJK UNIFIED IDEOGRAPH
+0x8D92 0x7A40 #CJK UNIFIED IDEOGRAPH
+0x8D93 0x9177 #CJK UNIFIED IDEOGRAPH
+0x8D94 0x9D60 #CJK UNIFIED IDEOGRAPH
+0x8D95 0x9ED2 #CJK UNIFIED IDEOGRAPH
+0x8D96 0x7344 #CJK UNIFIED IDEOGRAPH
+0x8D97 0x6F09 #CJK UNIFIED IDEOGRAPH
+0x8D98 0x8170 #CJK UNIFIED IDEOGRAPH
+0x8D99 0x7511 #CJK UNIFIED IDEOGRAPH
+0x8D9A 0x5FFD #CJK UNIFIED IDEOGRAPH
+0x8D9B 0x60DA #CJK UNIFIED IDEOGRAPH
+0x8D9C 0x9AA8 #CJK UNIFIED IDEOGRAPH
+0x8D9D 0x72DB #CJK UNIFIED IDEOGRAPH
+0x8D9E 0x8FBC #CJK UNIFIED IDEOGRAPH
+0x8D9F 0x6B64 #CJK UNIFIED IDEOGRAPH
+0x8DA0 0x9803 #CJK UNIFIED IDEOGRAPH
+0x8DA1 0x4ECA #CJK UNIFIED IDEOGRAPH
+0x8DA2 0x56F0 #CJK UNIFIED IDEOGRAPH
+0x8DA3 0x5764 #CJK UNIFIED IDEOGRAPH
+0x8DA4 0x58BE #CJK UNIFIED IDEOGRAPH
+0x8DA5 0x5A5A #CJK UNIFIED IDEOGRAPH
+0x8DA6 0x6068 #CJK UNIFIED IDEOGRAPH
+0x8DA7 0x61C7 #CJK UNIFIED IDEOGRAPH
+0x8DA8 0x660F #CJK UNIFIED IDEOGRAPH
+0x8DA9 0x6606 #CJK UNIFIED IDEOGRAPH
+0x8DAA 0x6839 #CJK UNIFIED IDEOGRAPH
+0x8DAB 0x68B1 #CJK UNIFIED IDEOGRAPH
+0x8DAC 0x6DF7 #CJK UNIFIED IDEOGRAPH
+0x8DAD 0x75D5 #CJK UNIFIED IDEOGRAPH
+0x8DAE 0x7D3A #CJK UNIFIED IDEOGRAPH
+0x8DAF 0x826E #CJK UNIFIED IDEOGRAPH
+0x8DB0 0x9B42 #CJK UNIFIED IDEOGRAPH
+0x8DB1 0x4E9B #CJK UNIFIED IDEOGRAPH
+0x8DB2 0x4F50 #CJK UNIFIED IDEOGRAPH
+0x8DB3 0x53C9 #CJK UNIFIED IDEOGRAPH
+0x8DB4 0x5506 #CJK UNIFIED IDEOGRAPH
+0x8DB5 0x5D6F #CJK UNIFIED IDEOGRAPH
+0x8DB6 0x5DE6 #CJK UNIFIED IDEOGRAPH
+0x8DB7 0x5DEE #CJK UNIFIED IDEOGRAPH
+0x8DB8 0x67FB #CJK UNIFIED IDEOGRAPH
+0x8DB9 0x6C99 #CJK UNIFIED IDEOGRAPH
+0x8DBA 0x7473 #CJK UNIFIED IDEOGRAPH
+0x8DBB 0x7802 #CJK UNIFIED IDEOGRAPH
+0x8DBC 0x8A50 #CJK UNIFIED IDEOGRAPH
+0x8DBD 0x9396 #CJK UNIFIED IDEOGRAPH
+0x8DBE 0x88DF #CJK UNIFIED IDEOGRAPH
+0x8DBF 0x5750 #CJK UNIFIED IDEOGRAPH
+0x8DC0 0x5EA7 #CJK UNIFIED IDEOGRAPH
+0x8DC1 0x632B #CJK UNIFIED IDEOGRAPH
+0x8DC2 0x50B5 #CJK UNIFIED IDEOGRAPH
+0x8DC3 0x50AC #CJK UNIFIED IDEOGRAPH
+0x8DC4 0x518D #CJK UNIFIED IDEOGRAPH
+0x8DC5 0x6700 #CJK UNIFIED IDEOGRAPH
+0x8DC6 0x54C9 #CJK UNIFIED IDEOGRAPH
+0x8DC7 0x585E #CJK UNIFIED IDEOGRAPH
+0x8DC8 0x59BB #CJK UNIFIED IDEOGRAPH
+0x8DC9 0x5BB0 #CJK UNIFIED IDEOGRAPH
+0x8DCA 0x5F69 #CJK UNIFIED IDEOGRAPH
+0x8DCB 0x624D #CJK UNIFIED IDEOGRAPH
+0x8DCC 0x63A1 #CJK UNIFIED IDEOGRAPH
+0x8DCD 0x683D #CJK UNIFIED IDEOGRAPH
+0x8DCE 0x6B73 #CJK UNIFIED IDEOGRAPH
+0x8DCF 0x6E08 #CJK UNIFIED IDEOGRAPH
+0x8DD0 0x707D #CJK UNIFIED IDEOGRAPH
+0x8DD1 0x91C7 #CJK UNIFIED IDEOGRAPH
+0x8DD2 0x7280 #CJK UNIFIED IDEOGRAPH
+0x8DD3 0x7815 #CJK UNIFIED IDEOGRAPH
+0x8DD4 0x7826 #CJK UNIFIED IDEOGRAPH
+0x8DD5 0x796D #CJK UNIFIED IDEOGRAPH
+0x8DD6 0x658E #CJK UNIFIED IDEOGRAPH
+0x8DD7 0x7D30 #CJK UNIFIED IDEOGRAPH
+0x8DD8 0x83DC #CJK UNIFIED IDEOGRAPH
+0x8DD9 0x88C1 #CJK UNIFIED IDEOGRAPH
+0x8DDA 0x8F09 #CJK UNIFIED IDEOGRAPH
+0x8DDB 0x969B #CJK UNIFIED IDEOGRAPH
+0x8DDC 0x5264 #CJK UNIFIED IDEOGRAPH
+0x8DDD 0x5728 #CJK UNIFIED IDEOGRAPH
+0x8DDE 0x6750 #CJK UNIFIED IDEOGRAPH
+0x8DDF 0x7F6A #CJK UNIFIED IDEOGRAPH
+0x8DE0 0x8CA1 #CJK UNIFIED IDEOGRAPH
+0x8DE1 0x51B4 #CJK UNIFIED IDEOGRAPH
+0x8DE2 0x5742 #CJK UNIFIED IDEOGRAPH
+0x8DE3 0x962A #CJK UNIFIED IDEOGRAPH
+0x8DE4 0x583A #CJK UNIFIED IDEOGRAPH
+0x8DE5 0x698A #CJK UNIFIED IDEOGRAPH
+0x8DE6 0x80B4 #CJK UNIFIED IDEOGRAPH
+0x8DE7 0x54B2 #CJK UNIFIED IDEOGRAPH
+0x8DE8 0x5D0E #CJK UNIFIED IDEOGRAPH
+0x8DE9 0x57FC #CJK UNIFIED IDEOGRAPH
+0x8DEA 0x7895 #CJK UNIFIED IDEOGRAPH
+0x8DEB 0x9DFA #CJK UNIFIED IDEOGRAPH
+0x8DEC 0x4F5C #CJK UNIFIED IDEOGRAPH
+0x8DED 0x524A #CJK UNIFIED IDEOGRAPH
+0x8DEE 0x548B #CJK UNIFIED IDEOGRAPH
+0x8DEF 0x643E #CJK UNIFIED IDEOGRAPH
+0x8DF0 0x6628 #CJK UNIFIED IDEOGRAPH
+0x8DF1 0x6714 #CJK UNIFIED IDEOGRAPH
+0x8DF2 0x67F5 #CJK UNIFIED IDEOGRAPH
+0x8DF3 0x7A84 #CJK UNIFIED IDEOGRAPH
+0x8DF4 0x7B56 #CJK UNIFIED IDEOGRAPH
+0x8DF5 0x7D22 #CJK UNIFIED IDEOGRAPH
+0x8DF6 0x932F #CJK UNIFIED IDEOGRAPH
+0x8DF7 0x685C #CJK UNIFIED IDEOGRAPH
+0x8DF8 0x9BAD #CJK UNIFIED IDEOGRAPH
+0x8DF9 0x7B39 #CJK UNIFIED IDEOGRAPH
+0x8DFA 0x5319 #CJK UNIFIED IDEOGRAPH
+0x8DFB 0x518A #CJK UNIFIED IDEOGRAPH
+0x8DFC 0x5237 #CJK UNIFIED IDEOGRAPH
+0x8E40 0x5BDF #CJK UNIFIED IDEOGRAPH
+0x8E41 0x62F6 #CJK UNIFIED IDEOGRAPH
+0x8E42 0x64AE #CJK UNIFIED IDEOGRAPH
+0x8E43 0x64E6 #CJK UNIFIED IDEOGRAPH
+0x8E44 0x672D #CJK UNIFIED IDEOGRAPH
+0x8E45 0x6BBA #CJK UNIFIED IDEOGRAPH
+0x8E46 0x85A9 #CJK UNIFIED IDEOGRAPH
+0x8E47 0x96D1 #CJK UNIFIED IDEOGRAPH
+0x8E48 0x7690 #CJK UNIFIED IDEOGRAPH
+0x8E49 0x9BD6 #CJK UNIFIED IDEOGRAPH
+0x8E4A 0x634C #CJK UNIFIED IDEOGRAPH
+0x8E4B 0x9306 #CJK UNIFIED IDEOGRAPH
+0x8E4C 0x9BAB #CJK UNIFIED IDEOGRAPH
+0x8E4D 0x76BF #CJK UNIFIED IDEOGRAPH
+0x8E4E 0x6652 #CJK UNIFIED IDEOGRAPH
+0x8E4F 0x4E09 #CJK UNIFIED IDEOGRAPH
+0x8E50 0x5098 #CJK UNIFIED IDEOGRAPH
+0x8E51 0x53C2 #CJK UNIFIED IDEOGRAPH
+0x8E52 0x5C71 #CJK UNIFIED IDEOGRAPH
+0x8E53 0x60E8 #CJK UNIFIED IDEOGRAPH
+0x8E54 0x6492 #CJK UNIFIED IDEOGRAPH
+0x8E55 0x6563 #CJK UNIFIED IDEOGRAPH
+0x8E56 0x685F #CJK UNIFIED IDEOGRAPH
+0x8E57 0x71E6 #CJK UNIFIED IDEOGRAPH
+0x8E58 0x73CA #CJK UNIFIED IDEOGRAPH
+0x8E59 0x7523 #CJK UNIFIED IDEOGRAPH
+0x8E5A 0x7B97 #CJK UNIFIED IDEOGRAPH
+0x8E5B 0x7E82 #CJK UNIFIED IDEOGRAPH
+0x8E5C 0x8695 #CJK UNIFIED IDEOGRAPH
+0x8E5D 0x8B83 #CJK UNIFIED IDEOGRAPH
+0x8E5E 0x8CDB #CJK UNIFIED IDEOGRAPH
+0x8E5F 0x9178 #CJK UNIFIED IDEOGRAPH
+0x8E60 0x9910 #CJK UNIFIED IDEOGRAPH
+0x8E61 0x65AC #CJK UNIFIED IDEOGRAPH
+0x8E62 0x66AB #CJK UNIFIED IDEOGRAPH
+0x8E63 0x6B8B #CJK UNIFIED IDEOGRAPH
+0x8E64 0x4ED5 #CJK UNIFIED IDEOGRAPH
+0x8E65 0x4ED4 #CJK UNIFIED IDEOGRAPH
+0x8E66 0x4F3A #CJK UNIFIED IDEOGRAPH
+0x8E67 0x4F7F #CJK UNIFIED IDEOGRAPH
+0x8E68 0x523A #CJK UNIFIED IDEOGRAPH
+0x8E69 0x53F8 #CJK UNIFIED IDEOGRAPH
+0x8E6A 0x53F2 #CJK UNIFIED IDEOGRAPH
+0x8E6B 0x55E3 #CJK UNIFIED IDEOGRAPH
+0x8E6C 0x56DB #CJK UNIFIED IDEOGRAPH
+0x8E6D 0x58EB #CJK UNIFIED IDEOGRAPH
+0x8E6E 0x59CB #CJK UNIFIED IDEOGRAPH
+0x8E6F 0x59C9 #CJK UNIFIED IDEOGRAPH
+0x8E70 0x59FF #CJK UNIFIED IDEOGRAPH
+0x8E71 0x5B50 #CJK UNIFIED IDEOGRAPH
+0x8E72 0x5C4D #CJK UNIFIED IDEOGRAPH
+0x8E73 0x5E02 #CJK UNIFIED IDEOGRAPH
+0x8E74 0x5E2B #CJK UNIFIED IDEOGRAPH
+0x8E75 0x5FD7 #CJK UNIFIED IDEOGRAPH
+0x8E76 0x601D #CJK UNIFIED IDEOGRAPH
+0x8E77 0x6307 #CJK UNIFIED IDEOGRAPH
+0x8E78 0x652F #CJK UNIFIED IDEOGRAPH
+0x8E79 0x5B5C #CJK UNIFIED IDEOGRAPH
+0x8E7A 0x65AF #CJK UNIFIED IDEOGRAPH
+0x8E7B 0x65BD #CJK UNIFIED IDEOGRAPH
+0x8E7C 0x65E8 #CJK UNIFIED IDEOGRAPH
+0x8E7D 0x679D #CJK UNIFIED IDEOGRAPH
+0x8E7E 0x6B62 #CJK UNIFIED IDEOGRAPH
+0x8E80 0x6B7B #CJK UNIFIED IDEOGRAPH
+0x8E81 0x6C0F #CJK UNIFIED IDEOGRAPH
+0x8E82 0x7345 #CJK UNIFIED IDEOGRAPH
+0x8E83 0x7949 #CJK UNIFIED IDEOGRAPH
+0x8E84 0x79C1 #CJK UNIFIED IDEOGRAPH
+0x8E85 0x7CF8 #CJK UNIFIED IDEOGRAPH
+0x8E86 0x7D19 #CJK UNIFIED IDEOGRAPH
+0x8E87 0x7D2B #CJK UNIFIED IDEOGRAPH
+0x8E88 0x80A2 #CJK UNIFIED IDEOGRAPH
+0x8E89 0x8102 #CJK UNIFIED IDEOGRAPH
+0x8E8A 0x81F3 #CJK UNIFIED IDEOGRAPH
+0x8E8B 0x8996 #CJK UNIFIED IDEOGRAPH
+0x8E8C 0x8A5E #CJK UNIFIED IDEOGRAPH
+0x8E8D 0x8A69 #CJK UNIFIED IDEOGRAPH
+0x8E8E 0x8A66 #CJK UNIFIED IDEOGRAPH
+0x8E8F 0x8A8C #CJK UNIFIED IDEOGRAPH
+0x8E90 0x8AEE #CJK UNIFIED IDEOGRAPH
+0x8E91 0x8CC7 #CJK UNIFIED IDEOGRAPH
+0x8E92 0x8CDC #CJK UNIFIED IDEOGRAPH
+0x8E93 0x96CC #CJK UNIFIED IDEOGRAPH
+0x8E94 0x98FC #CJK UNIFIED IDEOGRAPH
+0x8E95 0x6B6F #CJK UNIFIED IDEOGRAPH
+0x8E96 0x4E8B #CJK UNIFIED IDEOGRAPH
+0x8E97 0x4F3C #CJK UNIFIED IDEOGRAPH
+0x8E98 0x4F8D #CJK UNIFIED IDEOGRAPH
+0x8E99 0x5150 #CJK UNIFIED IDEOGRAPH
+0x8E9A 0x5B57 #CJK UNIFIED IDEOGRAPH
+0x8E9B 0x5BFA #CJK UNIFIED IDEOGRAPH
+0x8E9C 0x6148 #CJK UNIFIED IDEOGRAPH
+0x8E9D 0x6301 #CJK UNIFIED IDEOGRAPH
+0x8E9E 0x6642 #CJK UNIFIED IDEOGRAPH
+0x8E9F 0x6B21 #CJK UNIFIED IDEOGRAPH
+0x8EA0 0x6ECB #CJK UNIFIED IDEOGRAPH
+0x8EA1 0x6CBB #CJK UNIFIED IDEOGRAPH
+0x8EA2 0x723E #CJK UNIFIED IDEOGRAPH
+0x8EA3 0x74BD #CJK UNIFIED IDEOGRAPH
+0x8EA4 0x75D4 #CJK UNIFIED IDEOGRAPH
+0x8EA5 0x78C1 #CJK UNIFIED IDEOGRAPH
+0x8EA6 0x793A #CJK UNIFIED IDEOGRAPH
+0x8EA7 0x800C #CJK UNIFIED IDEOGRAPH
+0x8EA8 0x8033 #CJK UNIFIED IDEOGRAPH
+0x8EA9 0x81EA #CJK UNIFIED IDEOGRAPH
+0x8EAA 0x8494 #CJK UNIFIED IDEOGRAPH
+0x8EAB 0x8F9E #CJK UNIFIED IDEOGRAPH
+0x8EAC 0x6C50 #CJK UNIFIED IDEOGRAPH
+0x8EAD 0x9E7F #CJK UNIFIED IDEOGRAPH
+0x8EAE 0x5F0F #CJK UNIFIED IDEOGRAPH
+0x8EAF 0x8B58 #CJK UNIFIED IDEOGRAPH
+0x8EB0 0x9D2B #CJK UNIFIED IDEOGRAPH
+0x8EB1 0x7AFA #CJK UNIFIED IDEOGRAPH
+0x8EB2 0x8EF8 #CJK UNIFIED IDEOGRAPH
+0x8EB3 0x5B8D #CJK UNIFIED IDEOGRAPH
+0x8EB4 0x96EB #CJK UNIFIED IDEOGRAPH
+0x8EB5 0x4E03 #CJK UNIFIED IDEOGRAPH
+0x8EB6 0x53F1 #CJK UNIFIED IDEOGRAPH
+0x8EB7 0x57F7 #CJK UNIFIED IDEOGRAPH
+0x8EB8 0x5931 #CJK UNIFIED IDEOGRAPH
+0x8EB9 0x5AC9 #CJK UNIFIED IDEOGRAPH
+0x8EBA 0x5BA4 #CJK UNIFIED IDEOGRAPH
+0x8EBB 0x6089 #CJK UNIFIED IDEOGRAPH
+0x8EBC 0x6E7F #CJK UNIFIED IDEOGRAPH
+0x8EBD 0x6F06 #CJK UNIFIED IDEOGRAPH
+0x8EBE 0x75BE #CJK UNIFIED IDEOGRAPH
+0x8EBF 0x8CEA #CJK UNIFIED IDEOGRAPH
+0x8EC0 0x5B9F #CJK UNIFIED IDEOGRAPH
+0x8EC1 0x8500 #CJK UNIFIED IDEOGRAPH
+0x8EC2 0x7BE0 #CJK UNIFIED IDEOGRAPH
+0x8EC3 0x5072 #CJK UNIFIED IDEOGRAPH
+0x8EC4 0x67F4 #CJK UNIFIED IDEOGRAPH
+0x8EC5 0x829D #CJK UNIFIED IDEOGRAPH
+0x8EC6 0x5C61 #CJK UNIFIED IDEOGRAPH
+0x8EC7 0x854A #CJK UNIFIED IDEOGRAPH
+0x8EC8 0x7E1E #CJK UNIFIED IDEOGRAPH
+0x8EC9 0x820E #CJK UNIFIED IDEOGRAPH
+0x8ECA 0x5199 #CJK UNIFIED IDEOGRAPH
+0x8ECB 0x5C04 #CJK UNIFIED IDEOGRAPH
+0x8ECC 0x6368 #CJK UNIFIED IDEOGRAPH
+0x8ECD 0x8D66 #CJK UNIFIED IDEOGRAPH
+0x8ECE 0x659C #CJK UNIFIED IDEOGRAPH
+0x8ECF 0x716E #CJK UNIFIED IDEOGRAPH
+0x8ED0 0x793E #CJK UNIFIED IDEOGRAPH
+0x8ED1 0x7D17 #CJK UNIFIED IDEOGRAPH
+0x8ED2 0x8005 #CJK UNIFIED IDEOGRAPH
+0x8ED3 0x8B1D #CJK UNIFIED IDEOGRAPH
+0x8ED4 0x8ECA #CJK UNIFIED IDEOGRAPH
+0x8ED5 0x906E #CJK UNIFIED IDEOGRAPH
+0x8ED6 0x86C7 #CJK UNIFIED IDEOGRAPH
+0x8ED7 0x90AA #CJK UNIFIED IDEOGRAPH
+0x8ED8 0x501F #CJK UNIFIED IDEOGRAPH
+0x8ED9 0x52FA #CJK UNIFIED IDEOGRAPH
+0x8EDA 0x5C3A #CJK UNIFIED IDEOGRAPH
+0x8EDB 0x6753 #CJK UNIFIED IDEOGRAPH
+0x8EDC 0x707C #CJK UNIFIED IDEOGRAPH
+0x8EDD 0x7235 #CJK UNIFIED IDEOGRAPH
+0x8EDE 0x914C #CJK UNIFIED IDEOGRAPH
+0x8EDF 0x91C8 #CJK UNIFIED IDEOGRAPH
+0x8EE0 0x932B #CJK UNIFIED IDEOGRAPH
+0x8EE1 0x82E5 #CJK UNIFIED IDEOGRAPH
+0x8EE2 0x5BC2 #CJK UNIFIED IDEOGRAPH
+0x8EE3 0x5F31 #CJK UNIFIED IDEOGRAPH
+0x8EE4 0x60F9 #CJK UNIFIED IDEOGRAPH
+0x8EE5 0x4E3B #CJK UNIFIED IDEOGRAPH
+0x8EE6 0x53D6 #CJK UNIFIED IDEOGRAPH
+0x8EE7 0x5B88 #CJK UNIFIED IDEOGRAPH
+0x8EE8 0x624B #CJK UNIFIED IDEOGRAPH
+0x8EE9 0x6731 #CJK UNIFIED IDEOGRAPH
+0x8EEA 0x6B8A #CJK UNIFIED IDEOGRAPH
+0x8EEB 0x72E9 #CJK UNIFIED IDEOGRAPH
+0x8EEC 0x73E0 #CJK UNIFIED IDEOGRAPH
+0x8EED 0x7A2E #CJK UNIFIED IDEOGRAPH
+0x8EEE 0x816B #CJK UNIFIED IDEOGRAPH
+0x8EEF 0x8DA3 #CJK UNIFIED IDEOGRAPH
+0x8EF0 0x9152 #CJK UNIFIED IDEOGRAPH
+0x8EF1 0x9996 #CJK UNIFIED IDEOGRAPH
+0x8EF2 0x5112 #CJK UNIFIED IDEOGRAPH
+0x8EF3 0x53D7 #CJK UNIFIED IDEOGRAPH
+0x8EF4 0x546A #CJK UNIFIED IDEOGRAPH
+0x8EF5 0x5BFF #CJK UNIFIED IDEOGRAPH
+0x8EF6 0x6388 #CJK UNIFIED IDEOGRAPH
+0x8EF7 0x6A39 #CJK UNIFIED IDEOGRAPH
+0x8EF8 0x7DAC #CJK UNIFIED IDEOGRAPH
+0x8EF9 0x9700 #CJK UNIFIED IDEOGRAPH
+0x8EFA 0x56DA #CJK UNIFIED IDEOGRAPH
+0x8EFB 0x53CE #CJK UNIFIED IDEOGRAPH
+0x8EFC 0x5468 #CJK UNIFIED IDEOGRAPH
+0x8F40 0x5B97 #CJK UNIFIED IDEOGRAPH
+0x8F41 0x5C31 #CJK UNIFIED IDEOGRAPH
+0x8F42 0x5DDE #CJK UNIFIED IDEOGRAPH
+0x8F43 0x4FEE #CJK UNIFIED IDEOGRAPH
+0x8F44 0x6101 #CJK UNIFIED IDEOGRAPH
+0x8F45 0x62FE #CJK UNIFIED IDEOGRAPH
+0x8F46 0x6D32 #CJK UNIFIED IDEOGRAPH
+0x8F47 0x79C0 #CJK UNIFIED IDEOGRAPH
+0x8F48 0x79CB #CJK UNIFIED IDEOGRAPH
+0x8F49 0x7D42 #CJK UNIFIED IDEOGRAPH
+0x8F4A 0x7E4D #CJK UNIFIED IDEOGRAPH
+0x8F4B 0x7FD2 #CJK UNIFIED IDEOGRAPH
+0x8F4C 0x81ED #CJK UNIFIED IDEOGRAPH
+0x8F4D 0x821F #CJK UNIFIED IDEOGRAPH
+0x8F4E 0x8490 #CJK UNIFIED IDEOGRAPH
+0x8F4F 0x8846 #CJK UNIFIED IDEOGRAPH
+0x8F50 0x8972 #CJK UNIFIED IDEOGRAPH
+0x8F51 0x8B90 #CJK UNIFIED IDEOGRAPH
+0x8F52 0x8E74 #CJK UNIFIED IDEOGRAPH
+0x8F53 0x8F2F #CJK UNIFIED IDEOGRAPH
+0x8F54 0x9031 #CJK UNIFIED IDEOGRAPH
+0x8F55 0x914B #CJK UNIFIED IDEOGRAPH
+0x8F56 0x916C #CJK UNIFIED IDEOGRAPH
+0x8F57 0x96C6 #CJK UNIFIED IDEOGRAPH
+0x8F58 0x919C #CJK UNIFIED IDEOGRAPH
+0x8F59 0x4EC0 #CJK UNIFIED IDEOGRAPH
+0x8F5A 0x4F4F #CJK UNIFIED IDEOGRAPH
+0x8F5B 0x5145 #CJK UNIFIED IDEOGRAPH
+0x8F5C 0x5341 #CJK UNIFIED IDEOGRAPH
+0x8F5D 0x5F93 #CJK UNIFIED IDEOGRAPH
+0x8F5E 0x620E #CJK UNIFIED IDEOGRAPH
+0x8F5F 0x67D4 #CJK UNIFIED IDEOGRAPH
+0x8F60 0x6C41 #CJK UNIFIED IDEOGRAPH
+0x8F61 0x6E0B #CJK UNIFIED IDEOGRAPH
+0x8F62 0x7363 #CJK UNIFIED IDEOGRAPH
+0x8F63 0x7E26 #CJK UNIFIED IDEOGRAPH
+0x8F64 0x91CD #CJK UNIFIED IDEOGRAPH
+0x8F65 0x9283 #CJK UNIFIED IDEOGRAPH
+0x8F66 0x53D4 #CJK UNIFIED IDEOGRAPH
+0x8F67 0x5919 #CJK UNIFIED IDEOGRAPH
+0x8F68 0x5BBF #CJK UNIFIED IDEOGRAPH
+0x8F69 0x6DD1 #CJK UNIFIED IDEOGRAPH
+0x8F6A 0x795D #CJK UNIFIED IDEOGRAPH
+0x8F6B 0x7E2E #CJK UNIFIED IDEOGRAPH
+0x8F6C 0x7C9B #CJK UNIFIED IDEOGRAPH
+0x8F6D 0x587E #CJK UNIFIED IDEOGRAPH
+0x8F6E 0x719F #CJK UNIFIED IDEOGRAPH
+0x8F6F 0x51FA #CJK UNIFIED IDEOGRAPH
+0x8F70 0x8853 #CJK UNIFIED IDEOGRAPH
+0x8F71 0x8FF0 #CJK UNIFIED IDEOGRAPH
+0x8F72 0x4FCA #CJK UNIFIED IDEOGRAPH
+0x8F73 0x5CFB #CJK UNIFIED IDEOGRAPH
+0x8F74 0x6625 #CJK UNIFIED IDEOGRAPH
+0x8F75 0x77AC #CJK UNIFIED IDEOGRAPH
+0x8F76 0x7AE3 #CJK UNIFIED IDEOGRAPH
+0x8F77 0x821C #CJK UNIFIED IDEOGRAPH
+0x8F78 0x99FF #CJK UNIFIED IDEOGRAPH
+0x8F79 0x51C6 #CJK UNIFIED IDEOGRAPH
+0x8F7A 0x5FAA #CJK UNIFIED IDEOGRAPH
+0x8F7B 0x65EC #CJK UNIFIED IDEOGRAPH
+0x8F7C 0x696F #CJK UNIFIED IDEOGRAPH
+0x8F7D 0x6B89 #CJK UNIFIED IDEOGRAPH
+0x8F7E 0x6DF3 #CJK UNIFIED IDEOGRAPH
+0x8F80 0x6E96 #CJK UNIFIED IDEOGRAPH
+0x8F81 0x6F64 #CJK UNIFIED IDEOGRAPH
+0x8F82 0x76FE #CJK UNIFIED IDEOGRAPH
+0x8F83 0x7D14 #CJK UNIFIED IDEOGRAPH
+0x8F84 0x5DE1 #CJK UNIFIED IDEOGRAPH
+0x8F85 0x9075 #CJK UNIFIED IDEOGRAPH
+0x8F86 0x9187 #CJK UNIFIED IDEOGRAPH
+0x8F87 0x9806 #CJK UNIFIED IDEOGRAPH
+0x8F88 0x51E6 #CJK UNIFIED IDEOGRAPH
+0x8F89 0x521D #CJK UNIFIED IDEOGRAPH
+0x8F8A 0x6240 #CJK UNIFIED IDEOGRAPH
+0x8F8B 0x6691 #CJK UNIFIED IDEOGRAPH
+0x8F8C 0x66D9 #CJK UNIFIED IDEOGRAPH
+0x8F8D 0x6E1A #CJK UNIFIED IDEOGRAPH
+0x8F8E 0x5EB6 #CJK UNIFIED IDEOGRAPH
+0x8F8F 0x7DD2 #CJK UNIFIED IDEOGRAPH
+0x8F90 0x7F72 #CJK UNIFIED IDEOGRAPH
+0x8F91 0x66F8 #CJK UNIFIED IDEOGRAPH
+0x8F92 0x85AF #CJK UNIFIED IDEOGRAPH
+0x8F93 0x85F7 #CJK UNIFIED IDEOGRAPH
+0x8F94 0x8AF8 #CJK UNIFIED IDEOGRAPH
+0x8F95 0x52A9 #CJK UNIFIED IDEOGRAPH
+0x8F96 0x53D9 #CJK UNIFIED IDEOGRAPH
+0x8F97 0x5973 #CJK UNIFIED IDEOGRAPH
+0x8F98 0x5E8F #CJK UNIFIED IDEOGRAPH
+0x8F99 0x5F90 #CJK UNIFIED IDEOGRAPH
+0x8F9A 0x6055 #CJK UNIFIED IDEOGRAPH
+0x8F9B 0x92E4 #CJK UNIFIED IDEOGRAPH
+0x8F9C 0x9664 #CJK UNIFIED IDEOGRAPH
+0x8F9D 0x50B7 #CJK UNIFIED IDEOGRAPH
+0x8F9E 0x511F #CJK UNIFIED IDEOGRAPH
+0x8F9F 0x52DD #CJK UNIFIED IDEOGRAPH
+0x8FA0 0x5320 #CJK UNIFIED IDEOGRAPH
+0x8FA1 0x5347 #CJK UNIFIED IDEOGRAPH
+0x8FA2 0x53EC #CJK UNIFIED IDEOGRAPH
+0x8FA3 0x54E8 #CJK UNIFIED IDEOGRAPH
+0x8FA4 0x5546 #CJK UNIFIED IDEOGRAPH
+0x8FA5 0x5531 #CJK UNIFIED IDEOGRAPH
+0x8FA6 0x5617 #CJK UNIFIED IDEOGRAPH
+0x8FA7 0x5968 #CJK UNIFIED IDEOGRAPH
+0x8FA8 0x59BE #CJK UNIFIED IDEOGRAPH
+0x8FA9 0x5A3C #CJK UNIFIED IDEOGRAPH
+0x8FAA 0x5BB5 #CJK UNIFIED IDEOGRAPH
+0x8FAB 0x5C06 #CJK UNIFIED IDEOGRAPH
+0x8FAC 0x5C0F #CJK UNIFIED IDEOGRAPH
+0x8FAD 0x5C11 #CJK UNIFIED IDEOGRAPH
+0x8FAE 0x5C1A #CJK UNIFIED IDEOGRAPH
+0x8FAF 0x5E84 #CJK UNIFIED IDEOGRAPH
+0x8FB0 0x5E8A #CJK UNIFIED IDEOGRAPH
+0x8FB1 0x5EE0 #CJK UNIFIED IDEOGRAPH
+0x8FB2 0x5F70 #CJK UNIFIED IDEOGRAPH
+0x8FB3 0x627F #CJK UNIFIED IDEOGRAPH
+0x8FB4 0x6284 #CJK UNIFIED IDEOGRAPH
+0x8FB5 0x62DB #CJK UNIFIED IDEOGRAPH
+0x8FB6 0x638C #CJK UNIFIED IDEOGRAPH
+0x8FB7 0x6377 #CJK UNIFIED IDEOGRAPH
+0x8FB8 0x6607 #CJK UNIFIED IDEOGRAPH
+0x8FB9 0x660C #CJK UNIFIED IDEOGRAPH
+0x8FBA 0x662D #CJK UNIFIED IDEOGRAPH
+0x8FBB 0x6676 #CJK UNIFIED IDEOGRAPH
+0x8FBC 0x677E #CJK UNIFIED IDEOGRAPH
+0x8FBD 0x68A2 #CJK UNIFIED IDEOGRAPH
+0x8FBE 0x6A1F #CJK UNIFIED IDEOGRAPH
+0x8FBF 0x6A35 #CJK UNIFIED IDEOGRAPH
+0x8FC0 0x6CBC #CJK UNIFIED IDEOGRAPH
+0x8FC1 0x6D88 #CJK UNIFIED IDEOGRAPH
+0x8FC2 0x6E09 #CJK UNIFIED IDEOGRAPH
+0x8FC3 0x6E58 #CJK UNIFIED IDEOGRAPH
+0x8FC4 0x713C #CJK UNIFIED IDEOGRAPH
+0x8FC5 0x7126 #CJK UNIFIED IDEOGRAPH
+0x8FC6 0x7167 #CJK UNIFIED IDEOGRAPH
+0x8FC7 0x75C7 #CJK UNIFIED IDEOGRAPH
+0x8FC8 0x7701 #CJK UNIFIED IDEOGRAPH
+0x8FC9 0x785D #CJK UNIFIED IDEOGRAPH
+0x8FCA 0x7901 #CJK UNIFIED IDEOGRAPH
+0x8FCB 0x7965 #CJK UNIFIED IDEOGRAPH
+0x8FCC 0x79F0 #CJK UNIFIED IDEOGRAPH
+0x8FCD 0x7AE0 #CJK UNIFIED IDEOGRAPH
+0x8FCE 0x7B11 #CJK UNIFIED IDEOGRAPH
+0x8FCF 0x7CA7 #CJK UNIFIED IDEOGRAPH
+0x8FD0 0x7D39 #CJK UNIFIED IDEOGRAPH
+0x8FD1 0x8096 #CJK UNIFIED IDEOGRAPH
+0x8FD2 0x83D6 #CJK UNIFIED IDEOGRAPH
+0x8FD3 0x848B #CJK UNIFIED IDEOGRAPH
+0x8FD4 0x8549 #CJK UNIFIED IDEOGRAPH
+0x8FD5 0x885D #CJK UNIFIED IDEOGRAPH
+0x8FD6 0x88F3 #CJK UNIFIED IDEOGRAPH
+0x8FD7 0x8A1F #CJK UNIFIED IDEOGRAPH
+0x8FD8 0x8A3C #CJK UNIFIED IDEOGRAPH
+0x8FD9 0x8A54 #CJK UNIFIED IDEOGRAPH
+0x8FDA 0x8A73 #CJK UNIFIED IDEOGRAPH
+0x8FDB 0x8C61 #CJK UNIFIED IDEOGRAPH
+0x8FDC 0x8CDE #CJK UNIFIED IDEOGRAPH
+0x8FDD 0x91A4 #CJK UNIFIED IDEOGRAPH
+0x8FDE 0x9266 #CJK UNIFIED IDEOGRAPH
+0x8FDF 0x937E #CJK UNIFIED IDEOGRAPH
+0x8FE0 0x9418 #CJK UNIFIED IDEOGRAPH
+0x8FE1 0x969C #CJK UNIFIED IDEOGRAPH
+0x8FE2 0x9798 #CJK UNIFIED IDEOGRAPH
+0x8FE3 0x4E0A #CJK UNIFIED IDEOGRAPH
+0x8FE4 0x4E08 #CJK UNIFIED IDEOGRAPH
+0x8FE5 0x4E1E #CJK UNIFIED IDEOGRAPH
+0x8FE6 0x4E57 #CJK UNIFIED IDEOGRAPH
+0x8FE7 0x5197 #CJK UNIFIED IDEOGRAPH
+0x8FE8 0x5270 #CJK UNIFIED IDEOGRAPH
+0x8FE9 0x57CE #CJK UNIFIED IDEOGRAPH
+0x8FEA 0x5834 #CJK UNIFIED IDEOGRAPH
+0x8FEB 0x58CC #CJK UNIFIED IDEOGRAPH
+0x8FEC 0x5B22 #CJK UNIFIED IDEOGRAPH
+0x8FED 0x5E38 #CJK UNIFIED IDEOGRAPH
+0x8FEE 0x60C5 #CJK UNIFIED IDEOGRAPH
+0x8FEF 0x64FE #CJK UNIFIED IDEOGRAPH
+0x8FF0 0x6761 #CJK UNIFIED IDEOGRAPH
+0x8FF1 0x6756 #CJK UNIFIED IDEOGRAPH
+0x8FF2 0x6D44 #CJK UNIFIED IDEOGRAPH
+0x8FF3 0x72B6 #CJK UNIFIED IDEOGRAPH
+0x8FF4 0x7573 #CJK UNIFIED IDEOGRAPH
+0x8FF5 0x7A63 #CJK UNIFIED IDEOGRAPH
+0x8FF6 0x84B8 #CJK UNIFIED IDEOGRAPH
+0x8FF7 0x8B72 #CJK UNIFIED IDEOGRAPH
+0x8FF8 0x91B8 #CJK UNIFIED IDEOGRAPH
+0x8FF9 0x9320 #CJK UNIFIED IDEOGRAPH
+0x8FFA 0x5631 #CJK UNIFIED IDEOGRAPH
+0x8FFB 0x57F4 #CJK UNIFIED IDEOGRAPH
+0x8FFC 0x98FE #CJK UNIFIED IDEOGRAPH
+0x9040 0x62ED #CJK UNIFIED IDEOGRAPH
+0x9041 0x690D #CJK UNIFIED IDEOGRAPH
+0x9042 0x6B96 #CJK UNIFIED IDEOGRAPH
+0x9043 0x71ED #CJK UNIFIED IDEOGRAPH
+0x9044 0x7E54 #CJK UNIFIED IDEOGRAPH
+0x9045 0x8077 #CJK UNIFIED IDEOGRAPH
+0x9046 0x8272 #CJK UNIFIED IDEOGRAPH
+0x9047 0x89E6 #CJK UNIFIED IDEOGRAPH
+0x9048 0x98DF #CJK UNIFIED IDEOGRAPH
+0x9049 0x8755 #CJK UNIFIED IDEOGRAPH
+0x904A 0x8FB1 #CJK UNIFIED IDEOGRAPH
+0x904B 0x5C3B #CJK UNIFIED IDEOGRAPH
+0x904C 0x4F38 #CJK UNIFIED IDEOGRAPH
+0x904D 0x4FE1 #CJK UNIFIED IDEOGRAPH
+0x904E 0x4FB5 #CJK UNIFIED IDEOGRAPH
+0x904F 0x5507 #CJK UNIFIED IDEOGRAPH
+0x9050 0x5A20 #CJK UNIFIED IDEOGRAPH
+0x9051 0x5BDD #CJK UNIFIED IDEOGRAPH
+0x9052 0x5BE9 #CJK UNIFIED IDEOGRAPH
+0x9053 0x5FC3 #CJK UNIFIED IDEOGRAPH
+0x9054 0x614E #CJK UNIFIED IDEOGRAPH
+0x9055 0x632F #CJK UNIFIED IDEOGRAPH
+0x9056 0x65B0 #CJK UNIFIED IDEOGRAPH
+0x9057 0x664B #CJK UNIFIED IDEOGRAPH
+0x9058 0x68EE #CJK UNIFIED IDEOGRAPH
+0x9059 0x699B #CJK UNIFIED IDEOGRAPH
+0x905A 0x6D78 #CJK UNIFIED IDEOGRAPH
+0x905B 0x6DF1 #CJK UNIFIED IDEOGRAPH
+0x905C 0x7533 #CJK UNIFIED IDEOGRAPH
+0x905D 0x75B9 #CJK UNIFIED IDEOGRAPH
+0x905E 0x771F #CJK UNIFIED IDEOGRAPH
+0x905F 0x795E #CJK UNIFIED IDEOGRAPH
+0x9060 0x79E6 #CJK UNIFIED IDEOGRAPH
+0x9061 0x7D33 #CJK UNIFIED IDEOGRAPH
+0x9062 0x81E3 #CJK UNIFIED IDEOGRAPH
+0x9063 0x82AF #CJK UNIFIED IDEOGRAPH
+0x9064 0x85AA #CJK UNIFIED IDEOGRAPH
+0x9065 0x89AA #CJK UNIFIED IDEOGRAPH
+0x9066 0x8A3A #CJK UNIFIED IDEOGRAPH
+0x9067 0x8EAB #CJK UNIFIED IDEOGRAPH
+0x9068 0x8F9B #CJK UNIFIED IDEOGRAPH
+0x9069 0x9032 #CJK UNIFIED IDEOGRAPH
+0x906A 0x91DD #CJK UNIFIED IDEOGRAPH
+0x906B 0x9707 #CJK UNIFIED IDEOGRAPH
+0x906C 0x4EBA #CJK UNIFIED IDEOGRAPH
+0x906D 0x4EC1 #CJK UNIFIED IDEOGRAPH
+0x906E 0x5203 #CJK UNIFIED IDEOGRAPH
+0x906F 0x5875 #CJK UNIFIED IDEOGRAPH
+0x9070 0x58EC #CJK UNIFIED IDEOGRAPH
+0x9071 0x5C0B #CJK UNIFIED IDEOGRAPH
+0x9072 0x751A #CJK UNIFIED IDEOGRAPH
+0x9073 0x5C3D #CJK UNIFIED IDEOGRAPH
+0x9074 0x814E #CJK UNIFIED IDEOGRAPH
+0x9075 0x8A0A #CJK UNIFIED IDEOGRAPH
+0x9076 0x8FC5 #CJK UNIFIED IDEOGRAPH
+0x9077 0x9663 #CJK UNIFIED IDEOGRAPH
+0x9078 0x976D #CJK UNIFIED IDEOGRAPH
+0x9079 0x7B25 #CJK UNIFIED IDEOGRAPH
+0x907A 0x8ACF #CJK UNIFIED IDEOGRAPH
+0x907B 0x9808 #CJK UNIFIED IDEOGRAPH
+0x907C 0x9162 #CJK UNIFIED IDEOGRAPH
+0x907D 0x56F3 #CJK UNIFIED IDEOGRAPH
+0x907E 0x53A8 #CJK UNIFIED IDEOGRAPH
+0x9080 0x9017 #CJK UNIFIED IDEOGRAPH
+0x9081 0x5439 #CJK UNIFIED IDEOGRAPH
+0x9082 0x5782 #CJK UNIFIED IDEOGRAPH
+0x9083 0x5E25 #CJK UNIFIED IDEOGRAPH
+0x9084 0x63A8 #CJK UNIFIED IDEOGRAPH
+0x9085 0x6C34 #CJK UNIFIED IDEOGRAPH
+0x9086 0x708A #CJK UNIFIED IDEOGRAPH
+0x9087 0x7761 #CJK UNIFIED IDEOGRAPH
+0x9088 0x7C8B #CJK UNIFIED IDEOGRAPH
+0x9089 0x7FE0 #CJK UNIFIED IDEOGRAPH
+0x908A 0x8870 #CJK UNIFIED IDEOGRAPH
+0x908B 0x9042 #CJK UNIFIED IDEOGRAPH
+0x908C 0x9154 #CJK UNIFIED IDEOGRAPH
+0x908D 0x9310 #CJK UNIFIED IDEOGRAPH
+0x908E 0x9318 #CJK UNIFIED IDEOGRAPH
+0x908F 0x968F #CJK UNIFIED IDEOGRAPH
+0x9090 0x745E #CJK UNIFIED IDEOGRAPH
+0x9091 0x9AC4 #CJK UNIFIED IDEOGRAPH
+0x9092 0x5D07 #CJK UNIFIED IDEOGRAPH
+0x9093 0x5D69 #CJK UNIFIED IDEOGRAPH
+0x9094 0x6570 #CJK UNIFIED IDEOGRAPH
+0x9095 0x67A2 #CJK UNIFIED IDEOGRAPH
+0x9096 0x8DA8 #CJK UNIFIED IDEOGRAPH
+0x9097 0x96DB #CJK UNIFIED IDEOGRAPH
+0x9098 0x636E #CJK UNIFIED IDEOGRAPH
+0x9099 0x6749 #CJK UNIFIED IDEOGRAPH
+0x909A 0x6919 #CJK UNIFIED IDEOGRAPH
+0x909B 0x83C5 #CJK UNIFIED IDEOGRAPH
+0x909C 0x9817 #CJK UNIFIED IDEOGRAPH
+0x909D 0x96C0 #CJK UNIFIED IDEOGRAPH
+0x909E 0x88FE #CJK UNIFIED IDEOGRAPH
+0x909F 0x6F84 #CJK UNIFIED IDEOGRAPH
+0x90A0 0x647A #CJK UNIFIED IDEOGRAPH
+0x90A1 0x5BF8 #CJK UNIFIED IDEOGRAPH
+0x90A2 0x4E16 #CJK UNIFIED IDEOGRAPH
+0x90A3 0x702C #CJK UNIFIED IDEOGRAPH
+0x90A4 0x755D #CJK UNIFIED IDEOGRAPH
+0x90A5 0x662F #CJK UNIFIED IDEOGRAPH
+0x90A6 0x51C4 #CJK UNIFIED IDEOGRAPH
+0x90A7 0x5236 #CJK UNIFIED IDEOGRAPH
+0x90A8 0x52E2 #CJK UNIFIED IDEOGRAPH
+0x90A9 0x59D3 #CJK UNIFIED IDEOGRAPH
+0x90AA 0x5F81 #CJK UNIFIED IDEOGRAPH
+0x90AB 0x6027 #CJK UNIFIED IDEOGRAPH
+0x90AC 0x6210 #CJK UNIFIED IDEOGRAPH
+0x90AD 0x653F #CJK UNIFIED IDEOGRAPH
+0x90AE 0x6574 #CJK UNIFIED IDEOGRAPH
+0x90AF 0x661F #CJK UNIFIED IDEOGRAPH
+0x90B0 0x6674 #CJK UNIFIED IDEOGRAPH
+0x90B1 0x68F2 #CJK UNIFIED IDEOGRAPH
+0x90B2 0x6816 #CJK UNIFIED IDEOGRAPH
+0x90B3 0x6B63 #CJK UNIFIED IDEOGRAPH
+0x90B4 0x6E05 #CJK UNIFIED IDEOGRAPH
+0x90B5 0x7272 #CJK UNIFIED IDEOGRAPH
+0x90B6 0x751F #CJK UNIFIED IDEOGRAPH
+0x90B7 0x76DB #CJK UNIFIED IDEOGRAPH
+0x90B8 0x7CBE #CJK UNIFIED IDEOGRAPH
+0x90B9 0x8056 #CJK UNIFIED IDEOGRAPH
+0x90BA 0x58F0 #CJK UNIFIED IDEOGRAPH
+0x90BB 0x88FD #CJK UNIFIED IDEOGRAPH
+0x90BC 0x897F #CJK UNIFIED IDEOGRAPH
+0x90BD 0x8AA0 #CJK UNIFIED IDEOGRAPH
+0x90BE 0x8A93 #CJK UNIFIED IDEOGRAPH
+0x90BF 0x8ACB #CJK UNIFIED IDEOGRAPH
+0x90C0 0x901D #CJK UNIFIED IDEOGRAPH
+0x90C1 0x9192 #CJK UNIFIED IDEOGRAPH
+0x90C2 0x9752 #CJK UNIFIED IDEOGRAPH
+0x90C3 0x9759 #CJK UNIFIED IDEOGRAPH
+0x90C4 0x6589 #CJK UNIFIED IDEOGRAPH
+0x90C5 0x7A0E #CJK UNIFIED IDEOGRAPH
+0x90C6 0x8106 #CJK UNIFIED IDEOGRAPH
+0x90C7 0x96BB #CJK UNIFIED IDEOGRAPH
+0x90C8 0x5E2D #CJK UNIFIED IDEOGRAPH
+0x90C9 0x60DC #CJK UNIFIED IDEOGRAPH
+0x90CA 0x621A #CJK UNIFIED IDEOGRAPH
+0x90CB 0x65A5 #CJK UNIFIED IDEOGRAPH
+0x90CC 0x6614 #CJK UNIFIED IDEOGRAPH
+0x90CD 0x6790 #CJK UNIFIED IDEOGRAPH
+0x90CE 0x77F3 #CJK UNIFIED IDEOGRAPH
+0x90CF 0x7A4D #CJK UNIFIED IDEOGRAPH
+0x90D0 0x7C4D #CJK UNIFIED IDEOGRAPH
+0x90D1 0x7E3E #CJK UNIFIED IDEOGRAPH
+0x90D2 0x810A #CJK UNIFIED IDEOGRAPH
+0x90D3 0x8CAC #CJK UNIFIED IDEOGRAPH
+0x90D4 0x8D64 #CJK UNIFIED IDEOGRAPH
+0x90D5 0x8DE1 #CJK UNIFIED IDEOGRAPH
+0x90D6 0x8E5F #CJK UNIFIED IDEOGRAPH
+0x90D7 0x78A9 #CJK UNIFIED IDEOGRAPH
+0x90D8 0x5207 #CJK UNIFIED IDEOGRAPH
+0x90D9 0x62D9 #CJK UNIFIED IDEOGRAPH
+0x90DA 0x63A5 #CJK UNIFIED IDEOGRAPH
+0x90DB 0x6442 #CJK UNIFIED IDEOGRAPH
+0x90DC 0x6298 #CJK UNIFIED IDEOGRAPH
+0x90DD 0x8A2D #CJK UNIFIED IDEOGRAPH
+0x90DE 0x7A83 #CJK UNIFIED IDEOGRAPH
+0x90DF 0x7BC0 #CJK UNIFIED IDEOGRAPH
+0x90E0 0x8AAC #CJK UNIFIED IDEOGRAPH
+0x90E1 0x96EA #CJK UNIFIED IDEOGRAPH
+0x90E2 0x7D76 #CJK UNIFIED IDEOGRAPH
+0x90E3 0x820C #CJK UNIFIED IDEOGRAPH
+0x90E4 0x8749 #CJK UNIFIED IDEOGRAPH
+0x90E5 0x4ED9 #CJK UNIFIED IDEOGRAPH
+0x90E6 0x5148 #CJK UNIFIED IDEOGRAPH
+0x90E7 0x5343 #CJK UNIFIED IDEOGRAPH
+0x90E8 0x5360 #CJK UNIFIED IDEOGRAPH
+0x90E9 0x5BA3 #CJK UNIFIED IDEOGRAPH
+0x90EA 0x5C02 #CJK UNIFIED IDEOGRAPH
+0x90EB 0x5C16 #CJK UNIFIED IDEOGRAPH
+0x90EC 0x5DDD #CJK UNIFIED IDEOGRAPH
+0x90ED 0x6226 #CJK UNIFIED IDEOGRAPH
+0x90EE 0x6247 #CJK UNIFIED IDEOGRAPH
+0x90EF 0x64B0 #CJK UNIFIED IDEOGRAPH
+0x90F0 0x6813 #CJK UNIFIED IDEOGRAPH
+0x90F1 0x6834 #CJK UNIFIED IDEOGRAPH
+0x90F2 0x6CC9 #CJK UNIFIED IDEOGRAPH
+0x90F3 0x6D45 #CJK UNIFIED IDEOGRAPH
+0x90F4 0x6D17 #CJK UNIFIED IDEOGRAPH
+0x90F5 0x67D3 #CJK UNIFIED IDEOGRAPH
+0x90F6 0x6F5C #CJK UNIFIED IDEOGRAPH
+0x90F7 0x714E #CJK UNIFIED IDEOGRAPH
+0x90F8 0x717D #CJK UNIFIED IDEOGRAPH
+0x90F9 0x65CB #CJK UNIFIED IDEOGRAPH
+0x90FA 0x7A7F #CJK UNIFIED IDEOGRAPH
+0x90FB 0x7BAD #CJK UNIFIED IDEOGRAPH
+0x90FC 0x7DDA #CJK UNIFIED IDEOGRAPH
+0x9140 0x7E4A #CJK UNIFIED IDEOGRAPH
+0x9141 0x7FA8 #CJK UNIFIED IDEOGRAPH
+0x9142 0x817A #CJK UNIFIED IDEOGRAPH
+0x9143 0x821B #CJK UNIFIED IDEOGRAPH
+0x9144 0x8239 #CJK UNIFIED IDEOGRAPH
+0x9145 0x85A6 #CJK UNIFIED IDEOGRAPH
+0x9146 0x8A6E #CJK UNIFIED IDEOGRAPH
+0x9147 0x8CCE #CJK UNIFIED IDEOGRAPH
+0x9148 0x8DF5 #CJK UNIFIED IDEOGRAPH
+0x9149 0x9078 #CJK UNIFIED IDEOGRAPH
+0x914A 0x9077 #CJK UNIFIED IDEOGRAPH
+0x914B 0x92AD #CJK UNIFIED IDEOGRAPH
+0x914C 0x9291 #CJK UNIFIED IDEOGRAPH
+0x914D 0x9583 #CJK UNIFIED IDEOGRAPH
+0x914E 0x9BAE #CJK UNIFIED IDEOGRAPH
+0x914F 0x524D #CJK UNIFIED IDEOGRAPH
+0x9150 0x5584 #CJK UNIFIED IDEOGRAPH
+0x9151 0x6F38 #CJK UNIFIED IDEOGRAPH
+0x9152 0x7136 #CJK UNIFIED IDEOGRAPH
+0x9153 0x5168 #CJK UNIFIED IDEOGRAPH
+0x9154 0x7985 #CJK UNIFIED IDEOGRAPH
+0x9155 0x7E55 #CJK UNIFIED IDEOGRAPH
+0x9156 0x81B3 #CJK UNIFIED IDEOGRAPH
+0x9157 0x7CCE #CJK UNIFIED IDEOGRAPH
+0x9158 0x564C #CJK UNIFIED IDEOGRAPH
+0x9159 0x5851 #CJK UNIFIED IDEOGRAPH
+0x915A 0x5CA8 #CJK UNIFIED IDEOGRAPH
+0x915B 0x63AA #CJK UNIFIED IDEOGRAPH
+0x915C 0x66FE #CJK UNIFIED IDEOGRAPH
+0x915D 0x66FD #CJK UNIFIED IDEOGRAPH
+0x915E 0x695A #CJK UNIFIED IDEOGRAPH
+0x915F 0x72D9 #CJK UNIFIED IDEOGRAPH
+0x9160 0x758F #CJK UNIFIED IDEOGRAPH
+0x9161 0x758E #CJK UNIFIED IDEOGRAPH
+0x9162 0x790E #CJK UNIFIED IDEOGRAPH
+0x9163 0x7956 #CJK UNIFIED IDEOGRAPH
+0x9164 0x79DF #CJK UNIFIED IDEOGRAPH
+0x9165 0x7C97 #CJK UNIFIED IDEOGRAPH
+0x9166 0x7D20 #CJK UNIFIED IDEOGRAPH
+0x9167 0x7D44 #CJK UNIFIED IDEOGRAPH
+0x9168 0x8607 #CJK UNIFIED IDEOGRAPH
+0x9169 0x8A34 #CJK UNIFIED IDEOGRAPH
+0x916A 0x963B #CJK UNIFIED IDEOGRAPH
+0x916B 0x9061 #CJK UNIFIED IDEOGRAPH
+0x916C 0x9F20 #CJK UNIFIED IDEOGRAPH
+0x916D 0x50E7 #CJK UNIFIED IDEOGRAPH
+0x916E 0x5275 #CJK UNIFIED IDEOGRAPH
+0x916F 0x53CC #CJK UNIFIED IDEOGRAPH
+0x9170 0x53E2 #CJK UNIFIED IDEOGRAPH
+0x9171 0x5009 #CJK UNIFIED IDEOGRAPH
+0x9172 0x55AA #CJK UNIFIED IDEOGRAPH
+0x9173 0x58EE #CJK UNIFIED IDEOGRAPH
+0x9174 0x594F #CJK UNIFIED IDEOGRAPH
+0x9175 0x723D #CJK UNIFIED IDEOGRAPH
+0x9176 0x5B8B #CJK UNIFIED IDEOGRAPH
+0x9177 0x5C64 #CJK UNIFIED IDEOGRAPH
+0x9178 0x531D #CJK UNIFIED IDEOGRAPH
+0x9179 0x60E3 #CJK UNIFIED IDEOGRAPH
+0x917A 0x60F3 #CJK UNIFIED IDEOGRAPH
+0x917B 0x635C #CJK UNIFIED IDEOGRAPH
+0x917C 0x6383 #CJK UNIFIED IDEOGRAPH
+0x917D 0x633F #CJK UNIFIED IDEOGRAPH
+0x917E 0x63BB #CJK UNIFIED IDEOGRAPH
+0x9180 0x64CD #CJK UNIFIED IDEOGRAPH
+0x9181 0x65E9 #CJK UNIFIED IDEOGRAPH
+0x9182 0x66F9 #CJK UNIFIED IDEOGRAPH
+0x9183 0x5DE3 #CJK UNIFIED IDEOGRAPH
+0x9184 0x69CD #CJK UNIFIED IDEOGRAPH
+0x9185 0x69FD #CJK UNIFIED IDEOGRAPH
+0x9186 0x6F15 #CJK UNIFIED IDEOGRAPH
+0x9187 0x71E5 #CJK UNIFIED IDEOGRAPH
+0x9188 0x4E89 #CJK UNIFIED IDEOGRAPH
+0x9189 0x75E9 #CJK UNIFIED IDEOGRAPH
+0x918A 0x76F8 #CJK UNIFIED IDEOGRAPH
+0x918B 0x7A93 #CJK UNIFIED IDEOGRAPH
+0x918C 0x7CDF #CJK UNIFIED IDEOGRAPH
+0x918D 0x7DCF #CJK UNIFIED IDEOGRAPH
+0x918E 0x7D9C #CJK UNIFIED IDEOGRAPH
+0x918F 0x8061 #CJK UNIFIED IDEOGRAPH
+0x9190 0x8349 #CJK UNIFIED IDEOGRAPH
+0x9191 0x8358 #CJK UNIFIED IDEOGRAPH
+0x9192 0x846C #CJK UNIFIED IDEOGRAPH
+0x9193 0x84BC #CJK UNIFIED IDEOGRAPH
+0x9194 0x85FB #CJK UNIFIED IDEOGRAPH
+0x9195 0x88C5 #CJK UNIFIED IDEOGRAPH
+0x9196 0x8D70 #CJK UNIFIED IDEOGRAPH
+0x9197 0x9001 #CJK UNIFIED IDEOGRAPH
+0x9198 0x906D #CJK UNIFIED IDEOGRAPH
+0x9199 0x9397 #CJK UNIFIED IDEOGRAPH
+0x919A 0x971C #CJK UNIFIED IDEOGRAPH
+0x919B 0x9A12 #CJK UNIFIED IDEOGRAPH
+0x919C 0x50CF #CJK UNIFIED IDEOGRAPH
+0x919D 0x5897 #CJK UNIFIED IDEOGRAPH
+0x919E 0x618E #CJK UNIFIED IDEOGRAPH
+0x919F 0x81D3 #CJK UNIFIED IDEOGRAPH
+0x91A0 0x8535 #CJK UNIFIED IDEOGRAPH
+0x91A1 0x8D08 #CJK UNIFIED IDEOGRAPH
+0x91A2 0x9020 #CJK UNIFIED IDEOGRAPH
+0x91A3 0x4FC3 #CJK UNIFIED IDEOGRAPH
+0x91A4 0x5074 #CJK UNIFIED IDEOGRAPH
+0x91A5 0x5247 #CJK UNIFIED IDEOGRAPH
+0x91A6 0x5373 #CJK UNIFIED IDEOGRAPH
+0x91A7 0x606F #CJK UNIFIED IDEOGRAPH
+0x91A8 0x6349 #CJK UNIFIED IDEOGRAPH
+0x91A9 0x675F #CJK UNIFIED IDEOGRAPH
+0x91AA 0x6E2C #CJK UNIFIED IDEOGRAPH
+0x91AB 0x8DB3 #CJK UNIFIED IDEOGRAPH
+0x91AC 0x901F #CJK UNIFIED IDEOGRAPH
+0x91AD 0x4FD7 #CJK UNIFIED IDEOGRAPH
+0x91AE 0x5C5E #CJK UNIFIED IDEOGRAPH
+0x91AF 0x8CCA #CJK UNIFIED IDEOGRAPH
+0x91B0 0x65CF #CJK UNIFIED IDEOGRAPH
+0x91B1 0x7D9A #CJK UNIFIED IDEOGRAPH
+0x91B2 0x5352 #CJK UNIFIED IDEOGRAPH
+0x91B3 0x8896 #CJK UNIFIED IDEOGRAPH
+0x91B4 0x5176 #CJK UNIFIED IDEOGRAPH
+0x91B5 0x63C3 #CJK UNIFIED IDEOGRAPH
+0x91B6 0x5B58 #CJK UNIFIED IDEOGRAPH
+0x91B7 0x5B6B #CJK UNIFIED IDEOGRAPH
+0x91B8 0x5C0A #CJK UNIFIED IDEOGRAPH
+0x91B9 0x640D #CJK UNIFIED IDEOGRAPH
+0x91BA 0x6751 #CJK UNIFIED IDEOGRAPH
+0x91BB 0x905C #CJK UNIFIED IDEOGRAPH
+0x91BC 0x4ED6 #CJK UNIFIED IDEOGRAPH
+0x91BD 0x591A #CJK UNIFIED IDEOGRAPH
+0x91BE 0x592A #CJK UNIFIED IDEOGRAPH
+0x91BF 0x6C70 #CJK UNIFIED IDEOGRAPH
+0x91C0 0x8A51 #CJK UNIFIED IDEOGRAPH
+0x91C1 0x553E #CJK UNIFIED IDEOGRAPH
+0x91C2 0x5815 #CJK UNIFIED IDEOGRAPH
+0x91C3 0x59A5 #CJK UNIFIED IDEOGRAPH
+0x91C4 0x60F0 #CJK UNIFIED IDEOGRAPH
+0x91C5 0x6253 #CJK UNIFIED IDEOGRAPH
+0x91C6 0x67C1 #CJK UNIFIED IDEOGRAPH
+0x91C7 0x8235 #CJK UNIFIED IDEOGRAPH
+0x91C8 0x6955 #CJK UNIFIED IDEOGRAPH
+0x91C9 0x9640 #CJK UNIFIED IDEOGRAPH
+0x91CA 0x99C4 #CJK UNIFIED IDEOGRAPH
+0x91CB 0x9A28 #CJK UNIFIED IDEOGRAPH
+0x91CC 0x4F53 #CJK UNIFIED IDEOGRAPH
+0x91CD 0x5806 #CJK UNIFIED IDEOGRAPH
+0x91CE 0x5BFE #CJK UNIFIED IDEOGRAPH
+0x91CF 0x8010 #CJK UNIFIED IDEOGRAPH
+0x91D0 0x5CB1 #CJK UNIFIED IDEOGRAPH
+0x91D1 0x5E2F #CJK UNIFIED IDEOGRAPH
+0x91D2 0x5F85 #CJK UNIFIED IDEOGRAPH
+0x91D3 0x6020 #CJK UNIFIED IDEOGRAPH
+0x91D4 0x614B #CJK UNIFIED IDEOGRAPH
+0x91D5 0x6234 #CJK UNIFIED IDEOGRAPH
+0x91D6 0x66FF #CJK UNIFIED IDEOGRAPH
+0x91D7 0x6CF0 #CJK UNIFIED IDEOGRAPH
+0x91D8 0x6EDE #CJK UNIFIED IDEOGRAPH
+0x91D9 0x80CE #CJK UNIFIED IDEOGRAPH
+0x91DA 0x817F #CJK UNIFIED IDEOGRAPH
+0x91DB 0x82D4 #CJK UNIFIED IDEOGRAPH
+0x91DC 0x888B #CJK UNIFIED IDEOGRAPH
+0x91DD 0x8CB8 #CJK UNIFIED IDEOGRAPH
+0x91DE 0x9000 #CJK UNIFIED IDEOGRAPH
+0x91DF 0x902E #CJK UNIFIED IDEOGRAPH
+0x91E0 0x968A #CJK UNIFIED IDEOGRAPH
+0x91E1 0x9EDB #CJK UNIFIED IDEOGRAPH
+0x91E2 0x9BDB #CJK UNIFIED IDEOGRAPH
+0x91E3 0x4EE3 #CJK UNIFIED IDEOGRAPH
+0x91E4 0x53F0 #CJK UNIFIED IDEOGRAPH
+0x91E5 0x5927 #CJK UNIFIED IDEOGRAPH
+0x91E6 0x7B2C #CJK UNIFIED IDEOGRAPH
+0x91E7 0x918D #CJK UNIFIED IDEOGRAPH
+0x91E8 0x984C #CJK UNIFIED IDEOGRAPH
+0x91E9 0x9DF9 #CJK UNIFIED IDEOGRAPH
+0x91EA 0x6EDD #CJK UNIFIED IDEOGRAPH
+0x91EB 0x7027 #CJK UNIFIED IDEOGRAPH
+0x91EC 0x5353 #CJK UNIFIED IDEOGRAPH
+0x91ED 0x5544 #CJK UNIFIED IDEOGRAPH
+0x91EE 0x5B85 #CJK UNIFIED IDEOGRAPH
+0x91EF 0x6258 #CJK UNIFIED IDEOGRAPH
+0x91F0 0x629E #CJK UNIFIED IDEOGRAPH
+0x91F1 0x62D3 #CJK UNIFIED IDEOGRAPH
+0x91F2 0x6CA2 #CJK UNIFIED IDEOGRAPH
+0x91F3 0x6FEF #CJK UNIFIED IDEOGRAPH
+0x91F4 0x7422 #CJK UNIFIED IDEOGRAPH
+0x91F5 0x8A17 #CJK UNIFIED IDEOGRAPH
+0x91F6 0x9438 #CJK UNIFIED IDEOGRAPH
+0x91F7 0x6FC1 #CJK UNIFIED IDEOGRAPH
+0x91F8 0x8AFE #CJK UNIFIED IDEOGRAPH
+0x91F9 0x8338 #CJK UNIFIED IDEOGRAPH
+0x91FA 0x51E7 #CJK UNIFIED IDEOGRAPH
+0x91FB 0x86F8 #CJK UNIFIED IDEOGRAPH
+0x91FC 0x53EA #CJK UNIFIED IDEOGRAPH
+0x9240 0x53E9 #CJK UNIFIED IDEOGRAPH
+0x9241 0x4F46 #CJK UNIFIED IDEOGRAPH
+0x9242 0x9054 #CJK UNIFIED IDEOGRAPH
+0x9243 0x8FB0 #CJK UNIFIED IDEOGRAPH
+0x9244 0x596A #CJK UNIFIED IDEOGRAPH
+0x9245 0x8131 #CJK UNIFIED IDEOGRAPH
+0x9246 0x5DFD #CJK UNIFIED IDEOGRAPH
+0x9247 0x7AEA #CJK UNIFIED IDEOGRAPH
+0x9248 0x8FBF #CJK UNIFIED IDEOGRAPH
+0x9249 0x68DA #CJK UNIFIED IDEOGRAPH
+0x924A 0x8C37 #CJK UNIFIED IDEOGRAPH
+0x924B 0x72F8 #CJK UNIFIED IDEOGRAPH
+0x924C 0x9C48 #CJK UNIFIED IDEOGRAPH
+0x924D 0x6A3D #CJK UNIFIED IDEOGRAPH
+0x924E 0x8AB0 #CJK UNIFIED IDEOGRAPH
+0x924F 0x4E39 #CJK UNIFIED IDEOGRAPH
+0x9250 0x5358 #CJK UNIFIED IDEOGRAPH
+0x9251 0x5606 #CJK UNIFIED IDEOGRAPH
+0x9252 0x5766 #CJK UNIFIED IDEOGRAPH
+0x9253 0x62C5 #CJK UNIFIED IDEOGRAPH
+0x9254 0x63A2 #CJK UNIFIED IDEOGRAPH
+0x9255 0x65E6 #CJK UNIFIED IDEOGRAPH
+0x9256 0x6B4E #CJK UNIFIED IDEOGRAPH
+0x9257 0x6DE1 #CJK UNIFIED IDEOGRAPH
+0x9258 0x6E5B #CJK UNIFIED IDEOGRAPH
+0x9259 0x70AD #CJK UNIFIED IDEOGRAPH
+0x925A 0x77ED #CJK UNIFIED IDEOGRAPH
+0x925B 0x7AEF #CJK UNIFIED IDEOGRAPH
+0x925C 0x7BAA #CJK UNIFIED IDEOGRAPH
+0x925D 0x7DBB #CJK UNIFIED IDEOGRAPH
+0x925E 0x803D #CJK UNIFIED IDEOGRAPH
+0x925F 0x80C6 #CJK UNIFIED IDEOGRAPH
+0x9260 0x86CB #CJK UNIFIED IDEOGRAPH
+0x9261 0x8A95 #CJK UNIFIED IDEOGRAPH
+0x9262 0x935B #CJK UNIFIED IDEOGRAPH
+0x9263 0x56E3 #CJK UNIFIED IDEOGRAPH
+0x9264 0x58C7 #CJK UNIFIED IDEOGRAPH
+0x9265 0x5F3E #CJK UNIFIED IDEOGRAPH
+0x9266 0x65AD #CJK UNIFIED IDEOGRAPH
+0x9267 0x6696 #CJK UNIFIED IDEOGRAPH
+0x9268 0x6A80 #CJK UNIFIED IDEOGRAPH
+0x9269 0x6BB5 #CJK UNIFIED IDEOGRAPH
+0x926A 0x7537 #CJK UNIFIED IDEOGRAPH
+0x926B 0x8AC7 #CJK UNIFIED IDEOGRAPH
+0x926C 0x5024 #CJK UNIFIED IDEOGRAPH
+0x926D 0x77E5 #CJK UNIFIED IDEOGRAPH
+0x926E 0x5730 #CJK UNIFIED IDEOGRAPH
+0x926F 0x5F1B #CJK UNIFIED IDEOGRAPH
+0x9270 0x6065 #CJK UNIFIED IDEOGRAPH
+0x9271 0x667A #CJK UNIFIED IDEOGRAPH
+0x9272 0x6C60 #CJK UNIFIED IDEOGRAPH
+0x9273 0x75F4 #CJK UNIFIED IDEOGRAPH
+0x9274 0x7A1A #CJK UNIFIED IDEOGRAPH
+0x9275 0x7F6E #CJK UNIFIED IDEOGRAPH
+0x9276 0x81F4 #CJK UNIFIED IDEOGRAPH
+0x9277 0x8718 #CJK UNIFIED IDEOGRAPH
+0x9278 0x9045 #CJK UNIFIED IDEOGRAPH
+0x9279 0x99B3 #CJK UNIFIED IDEOGRAPH
+0x927A 0x7BC9 #CJK UNIFIED IDEOGRAPH
+0x927B 0x755C #CJK UNIFIED IDEOGRAPH
+0x927C 0x7AF9 #CJK UNIFIED IDEOGRAPH
+0x927D 0x7B51 #CJK UNIFIED IDEOGRAPH
+0x927E 0x84C4 #CJK UNIFIED IDEOGRAPH
+0x9280 0x9010 #CJK UNIFIED IDEOGRAPH
+0x9281 0x79E9 #CJK UNIFIED IDEOGRAPH
+0x9282 0x7A92 #CJK UNIFIED IDEOGRAPH
+0x9283 0x8336 #CJK UNIFIED IDEOGRAPH
+0x9284 0x5AE1 #CJK UNIFIED IDEOGRAPH
+0x9285 0x7740 #CJK UNIFIED IDEOGRAPH
+0x9286 0x4E2D #CJK UNIFIED IDEOGRAPH
+0x9287 0x4EF2 #CJK UNIFIED IDEOGRAPH
+0x9288 0x5B99 #CJK UNIFIED IDEOGRAPH
+0x9289 0x5FE0 #CJK UNIFIED IDEOGRAPH
+0x928A 0x62BD #CJK UNIFIED IDEOGRAPH
+0x928B 0x663C #CJK UNIFIED IDEOGRAPH
+0x928C 0x67F1 #CJK UNIFIED IDEOGRAPH
+0x928D 0x6CE8 #CJK UNIFIED IDEOGRAPH
+0x928E 0x866B #CJK UNIFIED IDEOGRAPH
+0x928F 0x8877 #CJK UNIFIED IDEOGRAPH
+0x9290 0x8A3B #CJK UNIFIED IDEOGRAPH
+0x9291 0x914E #CJK UNIFIED IDEOGRAPH
+0x9292 0x92F3 #CJK UNIFIED IDEOGRAPH
+0x9293 0x99D0 #CJK UNIFIED IDEOGRAPH
+0x9294 0x6A17 #CJK UNIFIED IDEOGRAPH
+0x9295 0x7026 #CJK UNIFIED IDEOGRAPH
+0x9296 0x732A #CJK UNIFIED IDEOGRAPH
+0x9297 0x82E7 #CJK UNIFIED IDEOGRAPH
+0x9298 0x8457 #CJK UNIFIED IDEOGRAPH
+0x9299 0x8CAF #CJK UNIFIED IDEOGRAPH
+0x929A 0x4E01 #CJK UNIFIED IDEOGRAPH
+0x929B 0x5146 #CJK UNIFIED IDEOGRAPH
+0x929C 0x51CB #CJK UNIFIED IDEOGRAPH
+0x929D 0x558B #CJK UNIFIED IDEOGRAPH
+0x929E 0x5BF5 #CJK UNIFIED IDEOGRAPH
+0x929F 0x5E16 #CJK UNIFIED IDEOGRAPH
+0x92A0 0x5E33 #CJK UNIFIED IDEOGRAPH
+0x92A1 0x5E81 #CJK UNIFIED IDEOGRAPH
+0x92A2 0x5F14 #CJK UNIFIED IDEOGRAPH
+0x92A3 0x5F35 #CJK UNIFIED IDEOGRAPH
+0x92A4 0x5F6B #CJK UNIFIED IDEOGRAPH
+0x92A5 0x5FB4 #CJK UNIFIED IDEOGRAPH
+0x92A6 0x61F2 #CJK UNIFIED IDEOGRAPH
+0x92A7 0x6311 #CJK UNIFIED IDEOGRAPH
+0x92A8 0x66A2 #CJK UNIFIED IDEOGRAPH
+0x92A9 0x671D #CJK UNIFIED IDEOGRAPH
+0x92AA 0x6F6E #CJK UNIFIED IDEOGRAPH
+0x92AB 0x7252 #CJK UNIFIED IDEOGRAPH
+0x92AC 0x753A #CJK UNIFIED IDEOGRAPH
+0x92AD 0x773A #CJK UNIFIED IDEOGRAPH
+0x92AE 0x8074 #CJK UNIFIED IDEOGRAPH
+0x92AF 0x8139 #CJK UNIFIED IDEOGRAPH
+0x92B0 0x8178 #CJK UNIFIED IDEOGRAPH
+0x92B1 0x8776 #CJK UNIFIED IDEOGRAPH
+0x92B2 0x8ABF #CJK UNIFIED IDEOGRAPH
+0x92B3 0x8ADC #CJK UNIFIED IDEOGRAPH
+0x92B4 0x8D85 #CJK UNIFIED IDEOGRAPH
+0x92B5 0x8DF3 #CJK UNIFIED IDEOGRAPH
+0x92B6 0x929A #CJK UNIFIED IDEOGRAPH
+0x92B7 0x9577 #CJK UNIFIED IDEOGRAPH
+0x92B8 0x9802 #CJK UNIFIED IDEOGRAPH
+0x92B9 0x9CE5 #CJK UNIFIED IDEOGRAPH
+0x92BA 0x52C5 #CJK UNIFIED IDEOGRAPH
+0x92BB 0x6357 #CJK UNIFIED IDEOGRAPH
+0x92BC 0x76F4 #CJK UNIFIED IDEOGRAPH
+0x92BD 0x6715 #CJK UNIFIED IDEOGRAPH
+0x92BE 0x6C88 #CJK UNIFIED IDEOGRAPH
+0x92BF 0x73CD #CJK UNIFIED IDEOGRAPH
+0x92C0 0x8CC3 #CJK UNIFIED IDEOGRAPH
+0x92C1 0x93AE #CJK UNIFIED IDEOGRAPH
+0x92C2 0x9673 #CJK UNIFIED IDEOGRAPH
+0x92C3 0x6D25 #CJK UNIFIED IDEOGRAPH
+0x92C4 0x589C #CJK UNIFIED IDEOGRAPH
+0x92C5 0x690E #CJK UNIFIED IDEOGRAPH
+0x92C6 0x69CC #CJK UNIFIED IDEOGRAPH
+0x92C7 0x8FFD #CJK UNIFIED IDEOGRAPH
+0x92C8 0x939A #CJK UNIFIED IDEOGRAPH
+0x92C9 0x75DB #CJK UNIFIED IDEOGRAPH
+0x92CA 0x901A #CJK UNIFIED IDEOGRAPH
+0x92CB 0x585A #CJK UNIFIED IDEOGRAPH
+0x92CC 0x6802 #CJK UNIFIED IDEOGRAPH
+0x92CD 0x63B4 #CJK UNIFIED IDEOGRAPH
+0x92CE 0x69FB #CJK UNIFIED IDEOGRAPH
+0x92CF 0x4F43 #CJK UNIFIED IDEOGRAPH
+0x92D0 0x6F2C #CJK UNIFIED IDEOGRAPH
+0x92D1 0x67D8 #CJK UNIFIED IDEOGRAPH
+0x92D2 0x8FBB #CJK UNIFIED IDEOGRAPH
+0x92D3 0x8526 #CJK UNIFIED IDEOGRAPH
+0x92D4 0x7DB4 #CJK UNIFIED IDEOGRAPH
+0x92D5 0x9354 #CJK UNIFIED IDEOGRAPH
+0x92D6 0x693F #CJK UNIFIED IDEOGRAPH
+0x92D7 0x6F70 #CJK UNIFIED IDEOGRAPH
+0x92D8 0x576A #CJK UNIFIED IDEOGRAPH
+0x92D9 0x58F7 #CJK UNIFIED IDEOGRAPH
+0x92DA 0x5B2C #CJK UNIFIED IDEOGRAPH
+0x92DB 0x7D2C #CJK UNIFIED IDEOGRAPH
+0x92DC 0x722A #CJK UNIFIED IDEOGRAPH
+0x92DD 0x540A #CJK UNIFIED IDEOGRAPH
+0x92DE 0x91E3 #CJK UNIFIED IDEOGRAPH
+0x92DF 0x9DB4 #CJK UNIFIED IDEOGRAPH
+0x92E0 0x4EAD #CJK UNIFIED IDEOGRAPH
+0x92E1 0x4F4E #CJK UNIFIED IDEOGRAPH
+0x92E2 0x505C #CJK UNIFIED IDEOGRAPH
+0x92E3 0x5075 #CJK UNIFIED IDEOGRAPH
+0x92E4 0x5243 #CJK UNIFIED IDEOGRAPH
+0x92E5 0x8C9E #CJK UNIFIED IDEOGRAPH
+0x92E6 0x5448 #CJK UNIFIED IDEOGRAPH
+0x92E7 0x5824 #CJK UNIFIED IDEOGRAPH
+0x92E8 0x5B9A #CJK UNIFIED IDEOGRAPH
+0x92E9 0x5E1D #CJK UNIFIED IDEOGRAPH
+0x92EA 0x5E95 #CJK UNIFIED IDEOGRAPH
+0x92EB 0x5EAD #CJK UNIFIED IDEOGRAPH
+0x92EC 0x5EF7 #CJK UNIFIED IDEOGRAPH
+0x92ED 0x5F1F #CJK UNIFIED IDEOGRAPH
+0x92EE 0x608C #CJK UNIFIED IDEOGRAPH
+0x92EF 0x62B5 #CJK UNIFIED IDEOGRAPH
+0x92F0 0x633A #CJK UNIFIED IDEOGRAPH
+0x92F1 0x63D0 #CJK UNIFIED IDEOGRAPH
+0x92F2 0x68AF #CJK UNIFIED IDEOGRAPH
+0x92F3 0x6C40 #CJK UNIFIED IDEOGRAPH
+0x92F4 0x7887 #CJK UNIFIED IDEOGRAPH
+0x92F5 0x798E #CJK UNIFIED IDEOGRAPH
+0x92F6 0x7A0B #CJK UNIFIED IDEOGRAPH
+0x92F7 0x7DE0 #CJK UNIFIED IDEOGRAPH
+0x92F8 0x8247 #CJK UNIFIED IDEOGRAPH
+0x92F9 0x8A02 #CJK UNIFIED IDEOGRAPH
+0x92FA 0x8AE6 #CJK UNIFIED IDEOGRAPH
+0x92FB 0x8E44 #CJK UNIFIED IDEOGRAPH
+0x92FC 0x9013 #CJK UNIFIED IDEOGRAPH
+0x9340 0x90B8 #CJK UNIFIED IDEOGRAPH
+0x9341 0x912D #CJK UNIFIED IDEOGRAPH
+0x9342 0x91D8 #CJK UNIFIED IDEOGRAPH
+0x9343 0x9F0E #CJK UNIFIED IDEOGRAPH
+0x9344 0x6CE5 #CJK UNIFIED IDEOGRAPH
+0x9345 0x6458 #CJK UNIFIED IDEOGRAPH
+0x9346 0x64E2 #CJK UNIFIED IDEOGRAPH
+0x9347 0x6575 #CJK UNIFIED IDEOGRAPH
+0x9348 0x6EF4 #CJK UNIFIED IDEOGRAPH
+0x9349 0x7684 #CJK UNIFIED IDEOGRAPH
+0x934A 0x7B1B #CJK UNIFIED IDEOGRAPH
+0x934B 0x9069 #CJK UNIFIED IDEOGRAPH
+0x934C 0x93D1 #CJK UNIFIED IDEOGRAPH
+0x934D 0x6EBA #CJK UNIFIED IDEOGRAPH
+0x934E 0x54F2 #CJK UNIFIED IDEOGRAPH
+0x934F 0x5FB9 #CJK UNIFIED IDEOGRAPH
+0x9350 0x64A4 #CJK UNIFIED IDEOGRAPH
+0x9351 0x8F4D #CJK UNIFIED IDEOGRAPH
+0x9352 0x8FED #CJK UNIFIED IDEOGRAPH
+0x9353 0x9244 #CJK UNIFIED IDEOGRAPH
+0x9354 0x5178 #CJK UNIFIED IDEOGRAPH
+0x9355 0x586B #CJK UNIFIED IDEOGRAPH
+0x9356 0x5929 #CJK UNIFIED IDEOGRAPH
+0x9357 0x5C55 #CJK UNIFIED IDEOGRAPH
+0x9358 0x5E97 #CJK UNIFIED IDEOGRAPH
+0x9359 0x6DFB #CJK UNIFIED IDEOGRAPH
+0x935A 0x7E8F #CJK UNIFIED IDEOGRAPH
+0x935B 0x751C #CJK UNIFIED IDEOGRAPH
+0x935C 0x8CBC #CJK UNIFIED IDEOGRAPH
+0x935D 0x8EE2 #CJK UNIFIED IDEOGRAPH
+0x935E 0x985B #CJK UNIFIED IDEOGRAPH
+0x935F 0x70B9 #CJK UNIFIED IDEOGRAPH
+0x9360 0x4F1D #CJK UNIFIED IDEOGRAPH
+0x9361 0x6BBF #CJK UNIFIED IDEOGRAPH
+0x9362 0x6FB1 #CJK UNIFIED IDEOGRAPH
+0x9363 0x7530 #CJK UNIFIED IDEOGRAPH
+0x9364 0x96FB #CJK UNIFIED IDEOGRAPH
+0x9365 0x514E #CJK UNIFIED IDEOGRAPH
+0x9366 0x5410 #CJK UNIFIED IDEOGRAPH
+0x9367 0x5835 #CJK UNIFIED IDEOGRAPH
+0x9368 0x5857 #CJK UNIFIED IDEOGRAPH
+0x9369 0x59AC #CJK UNIFIED IDEOGRAPH
+0x936A 0x5C60 #CJK UNIFIED IDEOGRAPH
+0x936B 0x5F92 #CJK UNIFIED IDEOGRAPH
+0x936C 0x6597 #CJK UNIFIED IDEOGRAPH
+0x936D 0x675C #CJK UNIFIED IDEOGRAPH
+0x936E 0x6E21 #CJK UNIFIED IDEOGRAPH
+0x936F 0x767B #CJK UNIFIED IDEOGRAPH
+0x9370 0x83DF #CJK UNIFIED IDEOGRAPH
+0x9371 0x8CED #CJK UNIFIED IDEOGRAPH
+0x9372 0x9014 #CJK UNIFIED IDEOGRAPH
+0x9373 0x90FD #CJK UNIFIED IDEOGRAPH
+0x9374 0x934D #CJK UNIFIED IDEOGRAPH
+0x9375 0x7825 #CJK UNIFIED IDEOGRAPH
+0x9376 0x783A #CJK UNIFIED IDEOGRAPH
+0x9377 0x52AA #CJK UNIFIED IDEOGRAPH
+0x9378 0x5EA6 #CJK UNIFIED IDEOGRAPH
+0x9379 0x571F #CJK UNIFIED IDEOGRAPH
+0x937A 0x5974 #CJK UNIFIED IDEOGRAPH
+0x937B 0x6012 #CJK UNIFIED IDEOGRAPH
+0x937C 0x5012 #CJK UNIFIED IDEOGRAPH
+0x937D 0x515A #CJK UNIFIED IDEOGRAPH
+0x937E 0x51AC #CJK UNIFIED IDEOGRAPH
+0x9380 0x51CD #CJK UNIFIED IDEOGRAPH
+0x9381 0x5200 #CJK UNIFIED IDEOGRAPH
+0x9382 0x5510 #CJK UNIFIED IDEOGRAPH
+0x9383 0x5854 #CJK UNIFIED IDEOGRAPH
+0x9384 0x5858 #CJK UNIFIED IDEOGRAPH
+0x9385 0x5957 #CJK UNIFIED IDEOGRAPH
+0x9386 0x5B95 #CJK UNIFIED IDEOGRAPH
+0x9387 0x5CF6 #CJK UNIFIED IDEOGRAPH
+0x9388 0x5D8B #CJK UNIFIED IDEOGRAPH
+0x9389 0x60BC #CJK UNIFIED IDEOGRAPH
+0x938A 0x6295 #CJK UNIFIED IDEOGRAPH
+0x938B 0x642D #CJK UNIFIED IDEOGRAPH
+0x938C 0x6771 #CJK UNIFIED IDEOGRAPH
+0x938D 0x6843 #CJK UNIFIED IDEOGRAPH
+0x938E 0x68BC #CJK UNIFIED IDEOGRAPH
+0x938F 0x68DF #CJK UNIFIED IDEOGRAPH
+0x9390 0x76D7 #CJK UNIFIED IDEOGRAPH
+0x9391 0x6DD8 #CJK UNIFIED IDEOGRAPH
+0x9392 0x6E6F #CJK UNIFIED IDEOGRAPH
+0x9393 0x6D9B #CJK UNIFIED IDEOGRAPH
+0x9394 0x706F #CJK UNIFIED IDEOGRAPH
+0x9395 0x71C8 #CJK UNIFIED IDEOGRAPH
+0x9396 0x5F53 #CJK UNIFIED IDEOGRAPH
+0x9397 0x75D8 #CJK UNIFIED IDEOGRAPH
+0x9398 0x7977 #CJK UNIFIED IDEOGRAPH
+0x9399 0x7B49 #CJK UNIFIED IDEOGRAPH
+0x939A 0x7B54 #CJK UNIFIED IDEOGRAPH
+0x939B 0x7B52 #CJK UNIFIED IDEOGRAPH
+0x939C 0x7CD6 #CJK UNIFIED IDEOGRAPH
+0x939D 0x7D71 #CJK UNIFIED IDEOGRAPH
+0x939E 0x5230 #CJK UNIFIED IDEOGRAPH
+0x939F 0x8463 #CJK UNIFIED IDEOGRAPH
+0x93A0 0x8569 #CJK UNIFIED IDEOGRAPH
+0x93A1 0x85E4 #CJK UNIFIED IDEOGRAPH
+0x93A2 0x8A0E #CJK UNIFIED IDEOGRAPH
+0x93A3 0x8B04 #CJK UNIFIED IDEOGRAPH
+0x93A4 0x8C46 #CJK UNIFIED IDEOGRAPH
+0x93A5 0x8E0F #CJK UNIFIED IDEOGRAPH
+0x93A6 0x9003 #CJK UNIFIED IDEOGRAPH
+0x93A7 0x900F #CJK UNIFIED IDEOGRAPH
+0x93A8 0x9419 #CJK UNIFIED IDEOGRAPH
+0x93A9 0x9676 #CJK UNIFIED IDEOGRAPH
+0x93AA 0x982D #CJK UNIFIED IDEOGRAPH
+0x93AB 0x9A30 #CJK UNIFIED IDEOGRAPH
+0x93AC 0x95D8 #CJK UNIFIED IDEOGRAPH
+0x93AD 0x50CD #CJK UNIFIED IDEOGRAPH
+0x93AE 0x52D5 #CJK UNIFIED IDEOGRAPH
+0x93AF 0x540C #CJK UNIFIED IDEOGRAPH
+0x93B0 0x5802 #CJK UNIFIED IDEOGRAPH
+0x93B1 0x5C0E #CJK UNIFIED IDEOGRAPH
+0x93B2 0x61A7 #CJK UNIFIED IDEOGRAPH
+0x93B3 0x649E #CJK UNIFIED IDEOGRAPH
+0x93B4 0x6D1E #CJK UNIFIED IDEOGRAPH
+0x93B5 0x77B3 #CJK UNIFIED IDEOGRAPH
+0x93B6 0x7AE5 #CJK UNIFIED IDEOGRAPH
+0x93B7 0x80F4 #CJK UNIFIED IDEOGRAPH
+0x93B8 0x8404 #CJK UNIFIED IDEOGRAPH
+0x93B9 0x9053 #CJK UNIFIED IDEOGRAPH
+0x93BA 0x9285 #CJK UNIFIED IDEOGRAPH
+0x93BB 0x5CE0 #CJK UNIFIED IDEOGRAPH
+0x93BC 0x9D07 #CJK UNIFIED IDEOGRAPH
+0x93BD 0x533F #CJK UNIFIED IDEOGRAPH
+0x93BE 0x5F97 #CJK UNIFIED IDEOGRAPH
+0x93BF 0x5FB3 #CJK UNIFIED IDEOGRAPH
+0x93C0 0x6D9C #CJK UNIFIED IDEOGRAPH
+0x93C1 0x7279 #CJK UNIFIED IDEOGRAPH
+0x93C2 0x7763 #CJK UNIFIED IDEOGRAPH
+0x93C3 0x79BF #CJK UNIFIED IDEOGRAPH
+0x93C4 0x7BE4 #CJK UNIFIED IDEOGRAPH
+0x93C5 0x6BD2 #CJK UNIFIED IDEOGRAPH
+0x93C6 0x72EC #CJK UNIFIED IDEOGRAPH
+0x93C7 0x8AAD #CJK UNIFIED IDEOGRAPH
+0x93C8 0x6803 #CJK UNIFIED IDEOGRAPH
+0x93C9 0x6A61 #CJK UNIFIED IDEOGRAPH
+0x93CA 0x51F8 #CJK UNIFIED IDEOGRAPH
+0x93CB 0x7A81 #CJK UNIFIED IDEOGRAPH
+0x93CC 0x6934 #CJK UNIFIED IDEOGRAPH
+0x93CD 0x5C4A #CJK UNIFIED IDEOGRAPH
+0x93CE 0x9CF6 #CJK UNIFIED IDEOGRAPH
+0x93CF 0x82EB #CJK UNIFIED IDEOGRAPH
+0x93D0 0x5BC5 #CJK UNIFIED IDEOGRAPH
+0x93D1 0x9149 #CJK UNIFIED IDEOGRAPH
+0x93D2 0x701E #CJK UNIFIED IDEOGRAPH
+0x93D3 0x5678 #CJK UNIFIED IDEOGRAPH
+0x93D4 0x5C6F #CJK UNIFIED IDEOGRAPH
+0x93D5 0x60C7 #CJK UNIFIED IDEOGRAPH
+0x93D6 0x6566 #CJK UNIFIED IDEOGRAPH
+0x93D7 0x6C8C #CJK UNIFIED IDEOGRAPH
+0x93D8 0x8C5A #CJK UNIFIED IDEOGRAPH
+0x93D9 0x9041 #CJK UNIFIED IDEOGRAPH
+0x93DA 0x9813 #CJK UNIFIED IDEOGRAPH
+0x93DB 0x5451 #CJK UNIFIED IDEOGRAPH
+0x93DC 0x66C7 #CJK UNIFIED IDEOGRAPH
+0x93DD 0x920D #CJK UNIFIED IDEOGRAPH
+0x93DE 0x5948 #CJK UNIFIED IDEOGRAPH
+0x93DF 0x90A3 #CJK UNIFIED IDEOGRAPH
+0x93E0 0x5185 #CJK UNIFIED IDEOGRAPH
+0x93E1 0x4E4D #CJK UNIFIED IDEOGRAPH
+0x93E2 0x51EA #CJK UNIFIED IDEOGRAPH
+0x93E3 0x8599 #CJK UNIFIED IDEOGRAPH
+0x93E4 0x8B0E #CJK UNIFIED IDEOGRAPH
+0x93E5 0x7058 #CJK UNIFIED IDEOGRAPH
+0x93E6 0x637A #CJK UNIFIED IDEOGRAPH
+0x93E7 0x934B #CJK UNIFIED IDEOGRAPH
+0x93E8 0x6962 #CJK UNIFIED IDEOGRAPH
+0x93E9 0x99B4 #CJK UNIFIED IDEOGRAPH
+0x93EA 0x7E04 #CJK UNIFIED IDEOGRAPH
+0x93EB 0x7577 #CJK UNIFIED IDEOGRAPH
+0x93EC 0x5357 #CJK UNIFIED IDEOGRAPH
+0x93ED 0x6960 #CJK UNIFIED IDEOGRAPH
+0x93EE 0x8EDF #CJK UNIFIED IDEOGRAPH
+0x93EF 0x96E3 #CJK UNIFIED IDEOGRAPH
+0x93F0 0x6C5D #CJK UNIFIED IDEOGRAPH
+0x93F1 0x4E8C #CJK UNIFIED IDEOGRAPH
+0x93F2 0x5C3C #CJK UNIFIED IDEOGRAPH
+0x93F3 0x5F10 #CJK UNIFIED IDEOGRAPH
+0x93F4 0x8FE9 #CJK UNIFIED IDEOGRAPH
+0x93F5 0x5302 #CJK UNIFIED IDEOGRAPH
+0x93F6 0x8CD1 #CJK UNIFIED IDEOGRAPH
+0x93F7 0x8089 #CJK UNIFIED IDEOGRAPH
+0x93F8 0x8679 #CJK UNIFIED IDEOGRAPH
+0x93F9 0x5EFF #CJK UNIFIED IDEOGRAPH
+0x93FA 0x65E5 #CJK UNIFIED IDEOGRAPH
+0x93FB 0x4E73 #CJK UNIFIED IDEOGRAPH
+0x93FC 0x5165 #CJK UNIFIED IDEOGRAPH
+0x9440 0x5982 #CJK UNIFIED IDEOGRAPH
+0x9441 0x5C3F #CJK UNIFIED IDEOGRAPH
+0x9442 0x97EE #CJK UNIFIED IDEOGRAPH
+0x9443 0x4EFB #CJK UNIFIED IDEOGRAPH
+0x9444 0x598A #CJK UNIFIED IDEOGRAPH
+0x9445 0x5FCD #CJK UNIFIED IDEOGRAPH
+0x9446 0x8A8D #CJK UNIFIED IDEOGRAPH
+0x9447 0x6FE1 #CJK UNIFIED IDEOGRAPH
+0x9448 0x79B0 #CJK UNIFIED IDEOGRAPH
+0x9449 0x7962 #CJK UNIFIED IDEOGRAPH
+0x944A 0x5BE7 #CJK UNIFIED IDEOGRAPH
+0x944B 0x8471 #CJK UNIFIED IDEOGRAPH
+0x944C 0x732B #CJK UNIFIED IDEOGRAPH
+0x944D 0x71B1 #CJK UNIFIED IDEOGRAPH
+0x944E 0x5E74 #CJK UNIFIED IDEOGRAPH
+0x944F 0x5FF5 #CJK UNIFIED IDEOGRAPH
+0x9450 0x637B #CJK UNIFIED IDEOGRAPH
+0x9451 0x649A #CJK UNIFIED IDEOGRAPH
+0x9452 0x71C3 #CJK UNIFIED IDEOGRAPH
+0x9453 0x7C98 #CJK UNIFIED IDEOGRAPH
+0x9454 0x4E43 #CJK UNIFIED IDEOGRAPH
+0x9455 0x5EFC #CJK UNIFIED IDEOGRAPH
+0x9456 0x4E4B #CJK UNIFIED IDEOGRAPH
+0x9457 0x57DC #CJK UNIFIED IDEOGRAPH
+0x9458 0x56A2 #CJK UNIFIED IDEOGRAPH
+0x9459 0x60A9 #CJK UNIFIED IDEOGRAPH
+0x945A 0x6FC3 #CJK UNIFIED IDEOGRAPH
+0x945B 0x7D0D #CJK UNIFIED IDEOGRAPH
+0x945C 0x80FD #CJK UNIFIED IDEOGRAPH
+0x945D 0x8133 #CJK UNIFIED IDEOGRAPH
+0x945E 0x81BF #CJK UNIFIED IDEOGRAPH
+0x945F 0x8FB2 #CJK UNIFIED IDEOGRAPH
+0x9460 0x8997 #CJK UNIFIED IDEOGRAPH
+0x9461 0x86A4 #CJK UNIFIED IDEOGRAPH
+0x9462 0x5DF4 #CJK UNIFIED IDEOGRAPH
+0x9463 0x628A #CJK UNIFIED IDEOGRAPH
+0x9464 0x64AD #CJK UNIFIED IDEOGRAPH
+0x9465 0x8987 #CJK UNIFIED IDEOGRAPH
+0x9466 0x6777 #CJK UNIFIED IDEOGRAPH
+0x9467 0x6CE2 #CJK UNIFIED IDEOGRAPH
+0x9468 0x6D3E #CJK UNIFIED IDEOGRAPH
+0x9469 0x7436 #CJK UNIFIED IDEOGRAPH
+0x946A 0x7834 #CJK UNIFIED IDEOGRAPH
+0x946B 0x5A46 #CJK UNIFIED IDEOGRAPH
+0x946C 0x7F75 #CJK UNIFIED IDEOGRAPH
+0x946D 0x82AD #CJK UNIFIED IDEOGRAPH
+0x946E 0x99AC #CJK UNIFIED IDEOGRAPH
+0x946F 0x4FF3 #CJK UNIFIED IDEOGRAPH
+0x9470 0x5EC3 #CJK UNIFIED IDEOGRAPH
+0x9471 0x62DD #CJK UNIFIED IDEOGRAPH
+0x9472 0x6392 #CJK UNIFIED IDEOGRAPH
+0x9473 0x6557 #CJK UNIFIED IDEOGRAPH
+0x9474 0x676F #CJK UNIFIED IDEOGRAPH
+0x9475 0x76C3 #CJK UNIFIED IDEOGRAPH
+0x9476 0x724C #CJK UNIFIED IDEOGRAPH
+0x9477 0x80CC #CJK UNIFIED IDEOGRAPH
+0x9478 0x80BA #CJK UNIFIED IDEOGRAPH
+0x9479 0x8F29 #CJK UNIFIED IDEOGRAPH
+0x947A 0x914D #CJK UNIFIED IDEOGRAPH
+0x947B 0x500D #CJK UNIFIED IDEOGRAPH
+0x947C 0x57F9 #CJK UNIFIED IDEOGRAPH
+0x947D 0x5A92 #CJK UNIFIED IDEOGRAPH
+0x947E 0x6885 #CJK UNIFIED IDEOGRAPH
+0x9480 0x6973 #CJK UNIFIED IDEOGRAPH
+0x9481 0x7164 #CJK UNIFIED IDEOGRAPH
+0x9482 0x72FD #CJK UNIFIED IDEOGRAPH
+0x9483 0x8CB7 #CJK UNIFIED IDEOGRAPH
+0x9484 0x58F2 #CJK UNIFIED IDEOGRAPH
+0x9485 0x8CE0 #CJK UNIFIED IDEOGRAPH
+0x9486 0x966A #CJK UNIFIED IDEOGRAPH
+0x9487 0x9019 #CJK UNIFIED IDEOGRAPH
+0x9488 0x877F #CJK UNIFIED IDEOGRAPH
+0x9489 0x79E4 #CJK UNIFIED IDEOGRAPH
+0x948A 0x77E7 #CJK UNIFIED IDEOGRAPH
+0x948B 0x8429 #CJK UNIFIED IDEOGRAPH
+0x948C 0x4F2F #CJK UNIFIED IDEOGRAPH
+0x948D 0x5265 #CJK UNIFIED IDEOGRAPH
+0x948E 0x535A #CJK UNIFIED IDEOGRAPH
+0x948F 0x62CD #CJK UNIFIED IDEOGRAPH
+0x9490 0x67CF #CJK UNIFIED IDEOGRAPH
+0x9491 0x6CCA #CJK UNIFIED IDEOGRAPH
+0x9492 0x767D #CJK UNIFIED IDEOGRAPH
+0x9493 0x7B94 #CJK UNIFIED IDEOGRAPH
+0x9494 0x7C95 #CJK UNIFIED IDEOGRAPH
+0x9495 0x8236 #CJK UNIFIED IDEOGRAPH
+0x9496 0x8584 #CJK UNIFIED IDEOGRAPH
+0x9497 0x8FEB #CJK UNIFIED IDEOGRAPH
+0x9498 0x66DD #CJK UNIFIED IDEOGRAPH
+0x9499 0x6F20 #CJK UNIFIED IDEOGRAPH
+0x949A 0x7206 #CJK UNIFIED IDEOGRAPH
+0x949B 0x7E1B #CJK UNIFIED IDEOGRAPH
+0x949C 0x83AB #CJK UNIFIED IDEOGRAPH
+0x949D 0x99C1 #CJK UNIFIED IDEOGRAPH
+0x949E 0x9EA6 #CJK UNIFIED IDEOGRAPH
+0x949F 0x51FD #CJK UNIFIED IDEOGRAPH
+0x94A0 0x7BB1 #CJK UNIFIED IDEOGRAPH
+0x94A1 0x7872 #CJK UNIFIED IDEOGRAPH
+0x94A2 0x7BB8 #CJK UNIFIED IDEOGRAPH
+0x94A3 0x8087 #CJK UNIFIED IDEOGRAPH
+0x94A4 0x7B48 #CJK UNIFIED IDEOGRAPH
+0x94A5 0x6AE8 #CJK UNIFIED IDEOGRAPH
+0x94A6 0x5E61 #CJK UNIFIED IDEOGRAPH
+0x94A7 0x808C #CJK UNIFIED IDEOGRAPH
+0x94A8 0x7551 #CJK UNIFIED IDEOGRAPH
+0x94A9 0x7560 #CJK UNIFIED IDEOGRAPH
+0x94AA 0x516B #CJK UNIFIED IDEOGRAPH
+0x94AB 0x9262 #CJK UNIFIED IDEOGRAPH
+0x94AC 0x6E8C #CJK UNIFIED IDEOGRAPH
+0x94AD 0x767A #CJK UNIFIED IDEOGRAPH
+0x94AE 0x9197 #CJK UNIFIED IDEOGRAPH
+0x94AF 0x9AEA #CJK UNIFIED IDEOGRAPH
+0x94B0 0x4F10 #CJK UNIFIED IDEOGRAPH
+0x94B1 0x7F70 #CJK UNIFIED IDEOGRAPH
+0x94B2 0x629C #CJK UNIFIED IDEOGRAPH
+0x94B3 0x7B4F #CJK UNIFIED IDEOGRAPH
+0x94B4 0x95A5 #CJK UNIFIED IDEOGRAPH
+0x94B5 0x9CE9 #CJK UNIFIED IDEOGRAPH
+0x94B6 0x567A #CJK UNIFIED IDEOGRAPH
+0x94B7 0x5859 #CJK UNIFIED IDEOGRAPH
+0x94B8 0x86E4 #CJK UNIFIED IDEOGRAPH
+0x94B9 0x96BC #CJK UNIFIED IDEOGRAPH
+0x94BA 0x4F34 #CJK UNIFIED IDEOGRAPH
+0x94BB 0x5224 #CJK UNIFIED IDEOGRAPH
+0x94BC 0x534A #CJK UNIFIED IDEOGRAPH
+0x94BD 0x53CD #CJK UNIFIED IDEOGRAPH
+0x94BE 0x53DB #CJK UNIFIED IDEOGRAPH
+0x94BF 0x5E06 #CJK UNIFIED IDEOGRAPH
+0x94C0 0x642C #CJK UNIFIED IDEOGRAPH
+0x94C1 0x6591 #CJK UNIFIED IDEOGRAPH
+0x94C2 0x677F #CJK UNIFIED IDEOGRAPH
+0x94C3 0x6C3E #CJK UNIFIED IDEOGRAPH
+0x94C4 0x6C4E #CJK UNIFIED IDEOGRAPH
+0x94C5 0x7248 #CJK UNIFIED IDEOGRAPH
+0x94C6 0x72AF #CJK UNIFIED IDEOGRAPH
+0x94C7 0x73ED #CJK UNIFIED IDEOGRAPH
+0x94C8 0x7554 #CJK UNIFIED IDEOGRAPH
+0x94C9 0x7E41 #CJK UNIFIED IDEOGRAPH
+0x94CA 0x822C #CJK UNIFIED IDEOGRAPH
+0x94CB 0x85E9 #CJK UNIFIED IDEOGRAPH
+0x94CC 0x8CA9 #CJK UNIFIED IDEOGRAPH
+0x94CD 0x7BC4 #CJK UNIFIED IDEOGRAPH
+0x94CE 0x91C6 #CJK UNIFIED IDEOGRAPH
+0x94CF 0x7169 #CJK UNIFIED IDEOGRAPH
+0x94D0 0x9812 #CJK UNIFIED IDEOGRAPH
+0x94D1 0x98EF #CJK UNIFIED IDEOGRAPH
+0x94D2 0x633D #CJK UNIFIED IDEOGRAPH
+0x94D3 0x6669 #CJK UNIFIED IDEOGRAPH
+0x94D4 0x756A #CJK UNIFIED IDEOGRAPH
+0x94D5 0x76E4 #CJK UNIFIED IDEOGRAPH
+0x94D6 0x78D0 #CJK UNIFIED IDEOGRAPH
+0x94D7 0x8543 #CJK UNIFIED IDEOGRAPH
+0x94D8 0x86EE #CJK UNIFIED IDEOGRAPH
+0x94D9 0x532A #CJK UNIFIED IDEOGRAPH
+0x94DA 0x5351 #CJK UNIFIED IDEOGRAPH
+0x94DB 0x5426 #CJK UNIFIED IDEOGRAPH
+0x94DC 0x5983 #CJK UNIFIED IDEOGRAPH
+0x94DD 0x5E87 #CJK UNIFIED IDEOGRAPH
+0x94DE 0x5F7C #CJK UNIFIED IDEOGRAPH
+0x94DF 0x60B2 #CJK UNIFIED IDEOGRAPH
+0x94E0 0x6249 #CJK UNIFIED IDEOGRAPH
+0x94E1 0x6279 #CJK UNIFIED IDEOGRAPH
+0x94E2 0x62AB #CJK UNIFIED IDEOGRAPH
+0x94E3 0x6590 #CJK UNIFIED IDEOGRAPH
+0x94E4 0x6BD4 #CJK UNIFIED IDEOGRAPH
+0x94E5 0x6CCC #CJK UNIFIED IDEOGRAPH
+0x94E6 0x75B2 #CJK UNIFIED IDEOGRAPH
+0x94E7 0x76AE #CJK UNIFIED IDEOGRAPH
+0x94E8 0x7891 #CJK UNIFIED IDEOGRAPH
+0x94E9 0x79D8 #CJK UNIFIED IDEOGRAPH
+0x94EA 0x7DCB #CJK UNIFIED IDEOGRAPH
+0x94EB 0x7F77 #CJK UNIFIED IDEOGRAPH
+0x94EC 0x80A5 #CJK UNIFIED IDEOGRAPH
+0x94ED 0x88AB #CJK UNIFIED IDEOGRAPH
+0x94EE 0x8AB9 #CJK UNIFIED IDEOGRAPH
+0x94EF 0x8CBB #CJK UNIFIED IDEOGRAPH
+0x94F0 0x907F #CJK UNIFIED IDEOGRAPH
+0x94F1 0x975E #CJK UNIFIED IDEOGRAPH
+0x94F2 0x98DB #CJK UNIFIED IDEOGRAPH
+0x94F3 0x6A0B #CJK UNIFIED IDEOGRAPH
+0x94F4 0x7C38 #CJK UNIFIED IDEOGRAPH
+0x94F5 0x5099 #CJK UNIFIED IDEOGRAPH
+0x94F6 0x5C3E #CJK UNIFIED IDEOGRAPH
+0x94F7 0x5FAE #CJK UNIFIED IDEOGRAPH
+0x94F8 0x6787 #CJK UNIFIED IDEOGRAPH
+0x94F9 0x6BD8 #CJK UNIFIED IDEOGRAPH
+0x94FA 0x7435 #CJK UNIFIED IDEOGRAPH
+0x94FB 0x7709 #CJK UNIFIED IDEOGRAPH
+0x94FC 0x7F8E #CJK UNIFIED IDEOGRAPH
+0x9540 0x9F3B #CJK UNIFIED IDEOGRAPH
+0x9541 0x67CA #CJK UNIFIED IDEOGRAPH
+0x9542 0x7A17 #CJK UNIFIED IDEOGRAPH
+0x9543 0x5339 #CJK UNIFIED IDEOGRAPH
+0x9544 0x758B #CJK UNIFIED IDEOGRAPH
+0x9545 0x9AED #CJK UNIFIED IDEOGRAPH
+0x9546 0x5F66 #CJK UNIFIED IDEOGRAPH
+0x9547 0x819D #CJK UNIFIED IDEOGRAPH
+0x9548 0x83F1 #CJK UNIFIED IDEOGRAPH
+0x9549 0x8098 #CJK UNIFIED IDEOGRAPH
+0x954A 0x5F3C #CJK UNIFIED IDEOGRAPH
+0x954B 0x5FC5 #CJK UNIFIED IDEOGRAPH
+0x954C 0x7562 #CJK UNIFIED IDEOGRAPH
+0x954D 0x7B46 #CJK UNIFIED IDEOGRAPH
+0x954E 0x903C #CJK UNIFIED IDEOGRAPH
+0x954F 0x6867 #CJK UNIFIED IDEOGRAPH
+0x9550 0x59EB #CJK UNIFIED IDEOGRAPH
+0x9551 0x5A9B #CJK UNIFIED IDEOGRAPH
+0x9552 0x7D10 #CJK UNIFIED IDEOGRAPH
+0x9553 0x767E #CJK UNIFIED IDEOGRAPH
+0x9554 0x8B2C #CJK UNIFIED IDEOGRAPH
+0x9555 0x4FF5 #CJK UNIFIED IDEOGRAPH
+0x9556 0x5F6A #CJK UNIFIED IDEOGRAPH
+0x9557 0x6A19 #CJK UNIFIED IDEOGRAPH
+0x9558 0x6C37 #CJK UNIFIED IDEOGRAPH
+0x9559 0x6F02 #CJK UNIFIED IDEOGRAPH
+0x955A 0x74E2 #CJK UNIFIED IDEOGRAPH
+0x955B 0x7968 #CJK UNIFIED IDEOGRAPH
+0x955C 0x8868 #CJK UNIFIED IDEOGRAPH
+0x955D 0x8A55 #CJK UNIFIED IDEOGRAPH
+0x955E 0x8C79 #CJK UNIFIED IDEOGRAPH
+0x955F 0x5EDF #CJK UNIFIED IDEOGRAPH
+0x9560 0x63CF #CJK UNIFIED IDEOGRAPH
+0x9561 0x75C5 #CJK UNIFIED IDEOGRAPH
+0x9562 0x79D2 #CJK UNIFIED IDEOGRAPH
+0x9563 0x82D7 #CJK UNIFIED IDEOGRAPH
+0x9564 0x9328 #CJK UNIFIED IDEOGRAPH
+0x9565 0x92F2 #CJK UNIFIED IDEOGRAPH
+0x9566 0x849C #CJK UNIFIED IDEOGRAPH
+0x9567 0x86ED #CJK UNIFIED IDEOGRAPH
+0x9568 0x9C2D #CJK UNIFIED IDEOGRAPH
+0x9569 0x54C1 #CJK UNIFIED IDEOGRAPH
+0x956A 0x5F6C #CJK UNIFIED IDEOGRAPH
+0x956B 0x658C #CJK UNIFIED IDEOGRAPH
+0x956C 0x6D5C #CJK UNIFIED IDEOGRAPH
+0x956D 0x7015 #CJK UNIFIED IDEOGRAPH
+0x956E 0x8CA7 #CJK UNIFIED IDEOGRAPH
+0x956F 0x8CD3 #CJK UNIFIED IDEOGRAPH
+0x9570 0x983B #CJK UNIFIED IDEOGRAPH
+0x9571 0x654F #CJK UNIFIED IDEOGRAPH
+0x9572 0x74F6 #CJK UNIFIED IDEOGRAPH
+0x9573 0x4E0D #CJK UNIFIED IDEOGRAPH
+0x9574 0x4ED8 #CJK UNIFIED IDEOGRAPH
+0x9575 0x57E0 #CJK UNIFIED IDEOGRAPH
+0x9576 0x592B #CJK UNIFIED IDEOGRAPH
+0x9577 0x5A66 #CJK UNIFIED IDEOGRAPH
+0x9578 0x5BCC #CJK UNIFIED IDEOGRAPH
+0x9579 0x51A8 #CJK UNIFIED IDEOGRAPH
+0x957A 0x5E03 #CJK UNIFIED IDEOGRAPH
+0x957B 0x5E9C #CJK UNIFIED IDEOGRAPH
+0x957C 0x6016 #CJK UNIFIED IDEOGRAPH
+0x957D 0x6276 #CJK UNIFIED IDEOGRAPH
+0x957E 0x6577 #CJK UNIFIED IDEOGRAPH
+0x9580 0x65A7 #CJK UNIFIED IDEOGRAPH
+0x9581 0x666E #CJK UNIFIED IDEOGRAPH
+0x9582 0x6D6E #CJK UNIFIED IDEOGRAPH
+0x9583 0x7236 #CJK UNIFIED IDEOGRAPH
+0x9584 0x7B26 #CJK UNIFIED IDEOGRAPH
+0x9585 0x8150 #CJK UNIFIED IDEOGRAPH
+0x9586 0x819A #CJK UNIFIED IDEOGRAPH
+0x9587 0x8299 #CJK UNIFIED IDEOGRAPH
+0x9588 0x8B5C #CJK UNIFIED IDEOGRAPH
+0x9589 0x8CA0 #CJK UNIFIED IDEOGRAPH
+0x958A 0x8CE6 #CJK UNIFIED IDEOGRAPH
+0x958B 0x8D74 #CJK UNIFIED IDEOGRAPH
+0x958C 0x961C #CJK UNIFIED IDEOGRAPH
+0x958D 0x9644 #CJK UNIFIED IDEOGRAPH
+0x958E 0x4FAE #CJK UNIFIED IDEOGRAPH
+0x958F 0x64AB #CJK UNIFIED IDEOGRAPH
+0x9590 0x6B66 #CJK UNIFIED IDEOGRAPH
+0x9591 0x821E #CJK UNIFIED IDEOGRAPH
+0x9592 0x8461 #CJK UNIFIED IDEOGRAPH
+0x9593 0x856A #CJK UNIFIED IDEOGRAPH
+0x9594 0x90E8 #CJK UNIFIED IDEOGRAPH
+0x9595 0x5C01 #CJK UNIFIED IDEOGRAPH
+0x9596 0x6953 #CJK UNIFIED IDEOGRAPH
+0x9597 0x98A8 #CJK UNIFIED IDEOGRAPH
+0x9598 0x847A #CJK UNIFIED IDEOGRAPH
+0x9599 0x8557 #CJK UNIFIED IDEOGRAPH
+0x959A 0x4F0F #CJK UNIFIED IDEOGRAPH
+0x959B 0x526F #CJK UNIFIED IDEOGRAPH
+0x959C 0x5FA9 #CJK UNIFIED IDEOGRAPH
+0x959D 0x5E45 #CJK UNIFIED IDEOGRAPH
+0x959E 0x670D #CJK UNIFIED IDEOGRAPH
+0x959F 0x798F #CJK UNIFIED IDEOGRAPH
+0x95A0 0x8179 #CJK UNIFIED IDEOGRAPH
+0x95A1 0x8907 #CJK UNIFIED IDEOGRAPH
+0x95A2 0x8986 #CJK UNIFIED IDEOGRAPH
+0x95A3 0x6DF5 #CJK UNIFIED IDEOGRAPH
+0x95A4 0x5F17 #CJK UNIFIED IDEOGRAPH
+0x95A5 0x6255 #CJK UNIFIED IDEOGRAPH
+0x95A6 0x6CB8 #CJK UNIFIED IDEOGRAPH
+0x95A7 0x4ECF #CJK UNIFIED IDEOGRAPH
+0x95A8 0x7269 #CJK UNIFIED IDEOGRAPH
+0x95A9 0x9B92 #CJK UNIFIED IDEOGRAPH
+0x95AA 0x5206 #CJK UNIFIED IDEOGRAPH
+0x95AB 0x543B #CJK UNIFIED IDEOGRAPH
+0x95AC 0x5674 #CJK UNIFIED IDEOGRAPH
+0x95AD 0x58B3 #CJK UNIFIED IDEOGRAPH
+0x95AE 0x61A4 #CJK UNIFIED IDEOGRAPH
+0x95AF 0x626E #CJK UNIFIED IDEOGRAPH
+0x95B0 0x711A #CJK UNIFIED IDEOGRAPH
+0x95B1 0x596E #CJK UNIFIED IDEOGRAPH
+0x95B2 0x7C89 #CJK UNIFIED IDEOGRAPH
+0x95B3 0x7CDE #CJK UNIFIED IDEOGRAPH
+0x95B4 0x7D1B #CJK UNIFIED IDEOGRAPH
+0x95B5 0x96F0 #CJK UNIFIED IDEOGRAPH
+0x95B6 0x6587 #CJK UNIFIED IDEOGRAPH
+0x95B7 0x805E #CJK UNIFIED IDEOGRAPH
+0x95B8 0x4E19 #CJK UNIFIED IDEOGRAPH
+0x95B9 0x4F75 #CJK UNIFIED IDEOGRAPH
+0x95BA 0x5175 #CJK UNIFIED IDEOGRAPH
+0x95BB 0x5840 #CJK UNIFIED IDEOGRAPH
+0x95BC 0x5E63 #CJK UNIFIED IDEOGRAPH
+0x95BD 0x5E73 #CJK UNIFIED IDEOGRAPH
+0x95BE 0x5F0A #CJK UNIFIED IDEOGRAPH
+0x95BF 0x67C4 #CJK UNIFIED IDEOGRAPH
+0x95C0 0x4E26 #CJK UNIFIED IDEOGRAPH
+0x95C1 0x853D #CJK UNIFIED IDEOGRAPH
+0x95C2 0x9589 #CJK UNIFIED IDEOGRAPH
+0x95C3 0x965B #CJK UNIFIED IDEOGRAPH
+0x95C4 0x7C73 #CJK UNIFIED IDEOGRAPH
+0x95C5 0x9801 #CJK UNIFIED IDEOGRAPH
+0x95C6 0x50FB #CJK UNIFIED IDEOGRAPH
+0x95C7 0x58C1 #CJK UNIFIED IDEOGRAPH
+0x95C8 0x7656 #CJK UNIFIED IDEOGRAPH
+0x95C9 0x78A7 #CJK UNIFIED IDEOGRAPH
+0x95CA 0x5225 #CJK UNIFIED IDEOGRAPH
+0x95CB 0x77A5 #CJK UNIFIED IDEOGRAPH
+0x95CC 0x8511 #CJK UNIFIED IDEOGRAPH
+0x95CD 0x7B86 #CJK UNIFIED IDEOGRAPH
+0x95CE 0x504F #CJK UNIFIED IDEOGRAPH
+0x95CF 0x5909 #CJK UNIFIED IDEOGRAPH
+0x95D0 0x7247 #CJK UNIFIED IDEOGRAPH
+0x95D1 0x7BC7 #CJK UNIFIED IDEOGRAPH
+0x95D2 0x7DE8 #CJK UNIFIED IDEOGRAPH
+0x95D3 0x8FBA #CJK UNIFIED IDEOGRAPH
+0x95D4 0x8FD4 #CJK UNIFIED IDEOGRAPH
+0x95D5 0x904D #CJK UNIFIED IDEOGRAPH
+0x95D6 0x4FBF #CJK UNIFIED IDEOGRAPH
+0x95D7 0x52C9 #CJK UNIFIED IDEOGRAPH
+0x95D8 0x5A29 #CJK UNIFIED IDEOGRAPH
+0x95D9 0x5F01 #CJK UNIFIED IDEOGRAPH
+0x95DA 0x97AD #CJK UNIFIED IDEOGRAPH
+0x95DB 0x4FDD #CJK UNIFIED IDEOGRAPH
+0x95DC 0x8217 #CJK UNIFIED IDEOGRAPH
+0x95DD 0x92EA #CJK UNIFIED IDEOGRAPH
+0x95DE 0x5703 #CJK UNIFIED IDEOGRAPH
+0x95DF 0x6355 #CJK UNIFIED IDEOGRAPH
+0x95E0 0x6B69 #CJK UNIFIED IDEOGRAPH
+0x95E1 0x752B #CJK UNIFIED IDEOGRAPH
+0x95E2 0x88DC #CJK UNIFIED IDEOGRAPH
+0x95E3 0x8F14 #CJK UNIFIED IDEOGRAPH
+0x95E4 0x7A42 #CJK UNIFIED IDEOGRAPH
+0x95E5 0x52DF #CJK UNIFIED IDEOGRAPH
+0x95E6 0x5893 #CJK UNIFIED IDEOGRAPH
+0x95E7 0x6155 #CJK UNIFIED IDEOGRAPH
+0x95E8 0x620A #CJK UNIFIED IDEOGRAPH
+0x95E9 0x66AE #CJK UNIFIED IDEOGRAPH
+0x95EA 0x6BCD #CJK UNIFIED IDEOGRAPH
+0x95EB 0x7C3F #CJK UNIFIED IDEOGRAPH
+0x95EC 0x83E9 #CJK UNIFIED IDEOGRAPH
+0x95ED 0x5023 #CJK UNIFIED IDEOGRAPH
+0x95EE 0x4FF8 #CJK UNIFIED IDEOGRAPH
+0x95EF 0x5305 #CJK UNIFIED IDEOGRAPH
+0x95F0 0x5446 #CJK UNIFIED IDEOGRAPH
+0x95F1 0x5831 #CJK UNIFIED IDEOGRAPH
+0x95F2 0x5949 #CJK UNIFIED IDEOGRAPH
+0x95F3 0x5B9D #CJK UNIFIED IDEOGRAPH
+0x95F4 0x5CF0 #CJK UNIFIED IDEOGRAPH
+0x95F5 0x5CEF #CJK UNIFIED IDEOGRAPH
+0x95F6 0x5D29 #CJK UNIFIED IDEOGRAPH
+0x95F7 0x5E96 #CJK UNIFIED IDEOGRAPH
+0x95F8 0x62B1 #CJK UNIFIED IDEOGRAPH
+0x95F9 0x6367 #CJK UNIFIED IDEOGRAPH
+0x95FA 0x653E #CJK UNIFIED IDEOGRAPH
+0x95FB 0x65B9 #CJK UNIFIED IDEOGRAPH
+0x95FC 0x670B #CJK UNIFIED IDEOGRAPH
+0x9640 0x6CD5 #CJK UNIFIED IDEOGRAPH
+0x9641 0x6CE1 #CJK UNIFIED IDEOGRAPH
+0x9642 0x70F9 #CJK UNIFIED IDEOGRAPH
+0x9643 0x7832 #CJK UNIFIED IDEOGRAPH
+0x9644 0x7E2B #CJK UNIFIED IDEOGRAPH
+0x9645 0x80DE #CJK UNIFIED IDEOGRAPH
+0x9646 0x82B3 #CJK UNIFIED IDEOGRAPH
+0x9647 0x840C #CJK UNIFIED IDEOGRAPH
+0x9648 0x84EC #CJK UNIFIED IDEOGRAPH
+0x9649 0x8702 #CJK UNIFIED IDEOGRAPH
+0x964A 0x8912 #CJK UNIFIED IDEOGRAPH
+0x964B 0x8A2A #CJK UNIFIED IDEOGRAPH
+0x964C 0x8C4A #CJK UNIFIED IDEOGRAPH
+0x964D 0x90A6 #CJK UNIFIED IDEOGRAPH
+0x964E 0x92D2 #CJK UNIFIED IDEOGRAPH
+0x964F 0x98FD #CJK UNIFIED IDEOGRAPH
+0x9650 0x9CF3 #CJK UNIFIED IDEOGRAPH
+0x9651 0x9D6C #CJK UNIFIED IDEOGRAPH
+0x9652 0x4E4F #CJK UNIFIED IDEOGRAPH
+0x9653 0x4EA1 #CJK UNIFIED IDEOGRAPH
+0x9654 0x508D #CJK UNIFIED IDEOGRAPH
+0x9655 0x5256 #CJK UNIFIED IDEOGRAPH
+0x9656 0x574A #CJK UNIFIED IDEOGRAPH
+0x9657 0x59A8 #CJK UNIFIED IDEOGRAPH
+0x9658 0x5E3D #CJK UNIFIED IDEOGRAPH
+0x9659 0x5FD8 #CJK UNIFIED IDEOGRAPH
+0x965A 0x5FD9 #CJK UNIFIED IDEOGRAPH
+0x965B 0x623F #CJK UNIFIED IDEOGRAPH
+0x965C 0x66B4 #CJK UNIFIED IDEOGRAPH
+0x965D 0x671B #CJK UNIFIED IDEOGRAPH
+0x965E 0x67D0 #CJK UNIFIED IDEOGRAPH
+0x965F 0x68D2 #CJK UNIFIED IDEOGRAPH
+0x9660 0x5192 #CJK UNIFIED IDEOGRAPH
+0x9661 0x7D21 #CJK UNIFIED IDEOGRAPH
+0x9662 0x80AA #CJK UNIFIED IDEOGRAPH
+0x9663 0x81A8 #CJK UNIFIED IDEOGRAPH
+0x9664 0x8B00 #CJK UNIFIED IDEOGRAPH
+0x9665 0x8C8C #CJK UNIFIED IDEOGRAPH
+0x9666 0x8CBF #CJK UNIFIED IDEOGRAPH
+0x9667 0x927E #CJK UNIFIED IDEOGRAPH
+0x9668 0x9632 #CJK UNIFIED IDEOGRAPH
+0x9669 0x5420 #CJK UNIFIED IDEOGRAPH
+0x966A 0x982C #CJK UNIFIED IDEOGRAPH
+0x966B 0x5317 #CJK UNIFIED IDEOGRAPH
+0x966C 0x50D5 #CJK UNIFIED IDEOGRAPH
+0x966D 0x535C #CJK UNIFIED IDEOGRAPH
+0x966E 0x58A8 #CJK UNIFIED IDEOGRAPH
+0x966F 0x64B2 #CJK UNIFIED IDEOGRAPH
+0x9670 0x6734 #CJK UNIFIED IDEOGRAPH
+0x9671 0x7267 #CJK UNIFIED IDEOGRAPH
+0x9672 0x7766 #CJK UNIFIED IDEOGRAPH
+0x9673 0x7A46 #CJK UNIFIED IDEOGRAPH
+0x9674 0x91E6 #CJK UNIFIED IDEOGRAPH
+0x9675 0x52C3 #CJK UNIFIED IDEOGRAPH
+0x9676 0x6CA1 #CJK UNIFIED IDEOGRAPH
+0x9677 0x6B86 #CJK UNIFIED IDEOGRAPH
+0x9678 0x5800 #CJK UNIFIED IDEOGRAPH
+0x9679 0x5E4C #CJK UNIFIED IDEOGRAPH
+0x967A 0x5954 #CJK UNIFIED IDEOGRAPH
+0x967B 0x672C #CJK UNIFIED IDEOGRAPH
+0x967C 0x7FFB #CJK UNIFIED IDEOGRAPH
+0x967D 0x51E1 #CJK UNIFIED IDEOGRAPH
+0x967E 0x76C6 #CJK UNIFIED IDEOGRAPH
+0x9680 0x6469 #CJK UNIFIED IDEOGRAPH
+0x9681 0x78E8 #CJK UNIFIED IDEOGRAPH
+0x9682 0x9B54 #CJK UNIFIED IDEOGRAPH
+0x9683 0x9EBB #CJK UNIFIED IDEOGRAPH
+0x9684 0x57CB #CJK UNIFIED IDEOGRAPH
+0x9685 0x59B9 #CJK UNIFIED IDEOGRAPH
+0x9686 0x6627 #CJK UNIFIED IDEOGRAPH
+0x9687 0x679A #CJK UNIFIED IDEOGRAPH
+0x9688 0x6BCE #CJK UNIFIED IDEOGRAPH
+0x9689 0x54E9 #CJK UNIFIED IDEOGRAPH
+0x968A 0x69D9 #CJK UNIFIED IDEOGRAPH
+0x968B 0x5E55 #CJK UNIFIED IDEOGRAPH
+0x968C 0x819C #CJK UNIFIED IDEOGRAPH
+0x968D 0x6795 #CJK UNIFIED IDEOGRAPH
+0x968E 0x9BAA #CJK UNIFIED IDEOGRAPH
+0x968F 0x67FE #CJK UNIFIED IDEOGRAPH
+0x9690 0x9C52 #CJK UNIFIED IDEOGRAPH
+0x9691 0x685D #CJK UNIFIED IDEOGRAPH
+0x9692 0x4EA6 #CJK UNIFIED IDEOGRAPH
+0x9693 0x4FE3 #CJK UNIFIED IDEOGRAPH
+0x9694 0x53C8 #CJK UNIFIED IDEOGRAPH
+0x9695 0x62B9 #CJK UNIFIED IDEOGRAPH
+0x9696 0x672B #CJK UNIFIED IDEOGRAPH
+0x9697 0x6CAB #CJK UNIFIED IDEOGRAPH
+0x9698 0x8FC4 #CJK UNIFIED IDEOGRAPH
+0x9699 0x4FAD #CJK UNIFIED IDEOGRAPH
+0x969A 0x7E6D #CJK UNIFIED IDEOGRAPH
+0x969B 0x9EBF #CJK UNIFIED IDEOGRAPH
+0x969C 0x4E07 #CJK UNIFIED IDEOGRAPH
+0x969D 0x6162 #CJK UNIFIED IDEOGRAPH
+0x969E 0x6E80 #CJK UNIFIED IDEOGRAPH
+0x969F 0x6F2B #CJK UNIFIED IDEOGRAPH
+0x96A0 0x8513 #CJK UNIFIED IDEOGRAPH
+0x96A1 0x5473 #CJK UNIFIED IDEOGRAPH
+0x96A2 0x672A #CJK UNIFIED IDEOGRAPH
+0x96A3 0x9B45 #CJK UNIFIED IDEOGRAPH
+0x96A4 0x5DF3 #CJK UNIFIED IDEOGRAPH
+0x96A5 0x7B95 #CJK UNIFIED IDEOGRAPH
+0x96A6 0x5CAC #CJK UNIFIED IDEOGRAPH
+0x96A7 0x5BC6 #CJK UNIFIED IDEOGRAPH
+0x96A8 0x871C #CJK UNIFIED IDEOGRAPH
+0x96A9 0x6E4A #CJK UNIFIED IDEOGRAPH
+0x96AA 0x84D1 #CJK UNIFIED IDEOGRAPH
+0x96AB 0x7A14 #CJK UNIFIED IDEOGRAPH
+0x96AC 0x8108 #CJK UNIFIED IDEOGRAPH
+0x96AD 0x5999 #CJK UNIFIED IDEOGRAPH
+0x96AE 0x7C8D #CJK UNIFIED IDEOGRAPH
+0x96AF 0x6C11 #CJK UNIFIED IDEOGRAPH
+0x96B0 0x7720 #CJK UNIFIED IDEOGRAPH
+0x96B1 0x52D9 #CJK UNIFIED IDEOGRAPH
+0x96B2 0x5922 #CJK UNIFIED IDEOGRAPH
+0x96B3 0x7121 #CJK UNIFIED IDEOGRAPH
+0x96B4 0x725F #CJK UNIFIED IDEOGRAPH
+0x96B5 0x77DB #CJK UNIFIED IDEOGRAPH
+0x96B6 0x9727 #CJK UNIFIED IDEOGRAPH
+0x96B7 0x9D61 #CJK UNIFIED IDEOGRAPH
+0x96B8 0x690B #CJK UNIFIED IDEOGRAPH
+0x96B9 0x5A7F #CJK UNIFIED IDEOGRAPH
+0x96BA 0x5A18 #CJK UNIFIED IDEOGRAPH
+0x96BB 0x51A5 #CJK UNIFIED IDEOGRAPH
+0x96BC 0x540D #CJK UNIFIED IDEOGRAPH
+0x96BD 0x547D #CJK UNIFIED IDEOGRAPH
+0x96BE 0x660E #CJK UNIFIED IDEOGRAPH
+0x96BF 0x76DF #CJK UNIFIED IDEOGRAPH
+0x96C0 0x8FF7 #CJK UNIFIED IDEOGRAPH
+0x96C1 0x9298 #CJK UNIFIED IDEOGRAPH
+0x96C2 0x9CF4 #CJK UNIFIED IDEOGRAPH
+0x96C3 0x59EA #CJK UNIFIED IDEOGRAPH
+0x96C4 0x725D #CJK UNIFIED IDEOGRAPH
+0x96C5 0x6EC5 #CJK UNIFIED IDEOGRAPH
+0x96C6 0x514D #CJK UNIFIED IDEOGRAPH
+0x96C7 0x68C9 #CJK UNIFIED IDEOGRAPH
+0x96C8 0x7DBF #CJK UNIFIED IDEOGRAPH
+0x96C9 0x7DEC #CJK UNIFIED IDEOGRAPH
+0x96CA 0x9762 #CJK UNIFIED IDEOGRAPH
+0x96CB 0x9EBA #CJK UNIFIED IDEOGRAPH
+0x96CC 0x6478 #CJK UNIFIED IDEOGRAPH
+0x96CD 0x6A21 #CJK UNIFIED IDEOGRAPH
+0x96CE 0x8302 #CJK UNIFIED IDEOGRAPH
+0x96CF 0x5984 #CJK UNIFIED IDEOGRAPH
+0x96D0 0x5B5F #CJK UNIFIED IDEOGRAPH
+0x96D1 0x6BDB #CJK UNIFIED IDEOGRAPH
+0x96D2 0x731B #CJK UNIFIED IDEOGRAPH
+0x96D3 0x76F2 #CJK UNIFIED IDEOGRAPH
+0x96D4 0x7DB2 #CJK UNIFIED IDEOGRAPH
+0x96D5 0x8017 #CJK UNIFIED IDEOGRAPH
+0x96D6 0x8499 #CJK UNIFIED IDEOGRAPH
+0x96D7 0x5132 #CJK UNIFIED IDEOGRAPH
+0x96D8 0x6728 #CJK UNIFIED IDEOGRAPH
+0x96D9 0x9ED9 #CJK UNIFIED IDEOGRAPH
+0x96DA 0x76EE #CJK UNIFIED IDEOGRAPH
+0x96DB 0x6762 #CJK UNIFIED IDEOGRAPH
+0x96DC 0x52FF #CJK UNIFIED IDEOGRAPH
+0x96DD 0x9905 #CJK UNIFIED IDEOGRAPH
+0x96DE 0x5C24 #CJK UNIFIED IDEOGRAPH
+0x96DF 0x623B #CJK UNIFIED IDEOGRAPH
+0x96E0 0x7C7E #CJK UNIFIED IDEOGRAPH
+0x96E1 0x8CB0 #CJK UNIFIED IDEOGRAPH
+0x96E2 0x554F #CJK UNIFIED IDEOGRAPH
+0x96E3 0x60B6 #CJK UNIFIED IDEOGRAPH
+0x96E4 0x7D0B #CJK UNIFIED IDEOGRAPH
+0x96E5 0x9580 #CJK UNIFIED IDEOGRAPH
+0x96E6 0x5301 #CJK UNIFIED IDEOGRAPH
+0x96E7 0x4E5F #CJK UNIFIED IDEOGRAPH
+0x96E8 0x51B6 #CJK UNIFIED IDEOGRAPH
+0x96E9 0x591C #CJK UNIFIED IDEOGRAPH
+0x96EA 0x723A #CJK UNIFIED IDEOGRAPH
+0x96EB 0x8036 #CJK UNIFIED IDEOGRAPH
+0x96EC 0x91CE #CJK UNIFIED IDEOGRAPH
+0x96ED 0x5F25 #CJK UNIFIED IDEOGRAPH
+0x96EE 0x77E2 #CJK UNIFIED IDEOGRAPH
+0x96EF 0x5384 #CJK UNIFIED IDEOGRAPH
+0x96F0 0x5F79 #CJK UNIFIED IDEOGRAPH
+0x96F1 0x7D04 #CJK UNIFIED IDEOGRAPH
+0x96F2 0x85AC #CJK UNIFIED IDEOGRAPH
+0x96F3 0x8A33 #CJK UNIFIED IDEOGRAPH
+0x96F4 0x8E8D #CJK UNIFIED IDEOGRAPH
+0x96F5 0x9756 #CJK UNIFIED IDEOGRAPH
+0x96F6 0x67F3 #CJK UNIFIED IDEOGRAPH
+0x96F7 0x85AE #CJK UNIFIED IDEOGRAPH
+0x96F8 0x9453 #CJK UNIFIED IDEOGRAPH
+0x96F9 0x6109 #CJK UNIFIED IDEOGRAPH
+0x96FA 0x6108 #CJK UNIFIED IDEOGRAPH
+0x96FB 0x6CB9 #CJK UNIFIED IDEOGRAPH
+0x96FC 0x7652 #CJK UNIFIED IDEOGRAPH
+0x9740 0x8AED #CJK UNIFIED IDEOGRAPH
+0x9741 0x8F38 #CJK UNIFIED IDEOGRAPH
+0x9742 0x552F #CJK UNIFIED IDEOGRAPH
+0x9743 0x4F51 #CJK UNIFIED IDEOGRAPH
+0x9744 0x512A #CJK UNIFIED IDEOGRAPH
+0x9745 0x52C7 #CJK UNIFIED IDEOGRAPH
+0x9746 0x53CB #CJK UNIFIED IDEOGRAPH
+0x9747 0x5BA5 #CJK UNIFIED IDEOGRAPH
+0x9748 0x5E7D #CJK UNIFIED IDEOGRAPH
+0x9749 0x60A0 #CJK UNIFIED IDEOGRAPH
+0x974A 0x6182 #CJK UNIFIED IDEOGRAPH
+0x974B 0x63D6 #CJK UNIFIED IDEOGRAPH
+0x974C 0x6709 #CJK UNIFIED IDEOGRAPH
+0x974D 0x67DA #CJK UNIFIED IDEOGRAPH
+0x974E 0x6E67 #CJK UNIFIED IDEOGRAPH
+0x974F 0x6D8C #CJK UNIFIED IDEOGRAPH
+0x9750 0x7336 #CJK UNIFIED IDEOGRAPH
+0x9751 0x7337 #CJK UNIFIED IDEOGRAPH
+0x9752 0x7531 #CJK UNIFIED IDEOGRAPH
+0x9753 0x7950 #CJK UNIFIED IDEOGRAPH
+0x9754 0x88D5 #CJK UNIFIED IDEOGRAPH
+0x9755 0x8A98 #CJK UNIFIED IDEOGRAPH
+0x9756 0x904A #CJK UNIFIED IDEOGRAPH
+0x9757 0x9091 #CJK UNIFIED IDEOGRAPH
+0x9758 0x90F5 #CJK UNIFIED IDEOGRAPH
+0x9759 0x96C4 #CJK UNIFIED IDEOGRAPH
+0x975A 0x878D #CJK UNIFIED IDEOGRAPH
+0x975B 0x5915 #CJK UNIFIED IDEOGRAPH
+0x975C 0x4E88 #CJK UNIFIED IDEOGRAPH
+0x975D 0x4F59 #CJK UNIFIED IDEOGRAPH
+0x975E 0x4E0E #CJK UNIFIED IDEOGRAPH
+0x975F 0x8A89 #CJK UNIFIED IDEOGRAPH
+0x9760 0x8F3F #CJK UNIFIED IDEOGRAPH
+0x9761 0x9810 #CJK UNIFIED IDEOGRAPH
+0x9762 0x50AD #CJK UNIFIED IDEOGRAPH
+0x9763 0x5E7C #CJK UNIFIED IDEOGRAPH
+0x9764 0x5996 #CJK UNIFIED IDEOGRAPH
+0x9765 0x5BB9 #CJK UNIFIED IDEOGRAPH
+0x9766 0x5EB8 #CJK UNIFIED IDEOGRAPH
+0x9767 0x63DA #CJK UNIFIED IDEOGRAPH
+0x9768 0x63FA #CJK UNIFIED IDEOGRAPH
+0x9769 0x64C1 #CJK UNIFIED IDEOGRAPH
+0x976A 0x66DC #CJK UNIFIED IDEOGRAPH
+0x976B 0x694A #CJK UNIFIED IDEOGRAPH
+0x976C 0x69D8 #CJK UNIFIED IDEOGRAPH
+0x976D 0x6D0B #CJK UNIFIED IDEOGRAPH
+0x976E 0x6EB6 #CJK UNIFIED IDEOGRAPH
+0x976F 0x7194 #CJK UNIFIED IDEOGRAPH
+0x9770 0x7528 #CJK UNIFIED IDEOGRAPH
+0x9771 0x7AAF #CJK UNIFIED IDEOGRAPH
+0x9772 0x7F8A #CJK UNIFIED IDEOGRAPH
+0x9773 0x8000 #CJK UNIFIED IDEOGRAPH
+0x9774 0x8449 #CJK UNIFIED IDEOGRAPH
+0x9775 0x84C9 #CJK UNIFIED IDEOGRAPH
+0x9776 0x8981 #CJK UNIFIED IDEOGRAPH
+0x9777 0x8B21 #CJK UNIFIED IDEOGRAPH
+0x9778 0x8E0A #CJK UNIFIED IDEOGRAPH
+0x9779 0x9065 #CJK UNIFIED IDEOGRAPH
+0x977A 0x967D #CJK UNIFIED IDEOGRAPH
+0x977B 0x990A #CJK UNIFIED IDEOGRAPH
+0x977C 0x617E #CJK UNIFIED IDEOGRAPH
+0x977D 0x6291 #CJK UNIFIED IDEOGRAPH
+0x977E 0x6B32 #CJK UNIFIED IDEOGRAPH
+0x9780 0x6C83 #CJK UNIFIED IDEOGRAPH
+0x9781 0x6D74 #CJK UNIFIED IDEOGRAPH
+0x9782 0x7FCC #CJK UNIFIED IDEOGRAPH
+0x9783 0x7FFC #CJK UNIFIED IDEOGRAPH
+0x9784 0x6DC0 #CJK UNIFIED IDEOGRAPH
+0x9785 0x7F85 #CJK UNIFIED IDEOGRAPH
+0x9786 0x87BA #CJK UNIFIED IDEOGRAPH
+0x9787 0x88F8 #CJK UNIFIED IDEOGRAPH
+0x9788 0x6765 #CJK UNIFIED IDEOGRAPH
+0x9789 0x83B1 #CJK UNIFIED IDEOGRAPH
+0x978A 0x983C #CJK UNIFIED IDEOGRAPH
+0x978B 0x96F7 #CJK UNIFIED IDEOGRAPH
+0x978C 0x6D1B #CJK UNIFIED IDEOGRAPH
+0x978D 0x7D61 #CJK UNIFIED IDEOGRAPH
+0x978E 0x843D #CJK UNIFIED IDEOGRAPH
+0x978F 0x916A #CJK UNIFIED IDEOGRAPH
+0x9790 0x4E71 #CJK UNIFIED IDEOGRAPH
+0x9791 0x5375 #CJK UNIFIED IDEOGRAPH
+0x9792 0x5D50 #CJK UNIFIED IDEOGRAPH
+0x9793 0x6B04 #CJK UNIFIED IDEOGRAPH
+0x9794 0x6FEB #CJK UNIFIED IDEOGRAPH
+0x9795 0x85CD #CJK UNIFIED IDEOGRAPH
+0x9796 0x862D #CJK UNIFIED IDEOGRAPH
+0x9797 0x89A7 #CJK UNIFIED IDEOGRAPH
+0x9798 0x5229 #CJK UNIFIED IDEOGRAPH
+0x9799 0x540F #CJK UNIFIED IDEOGRAPH
+0x979A 0x5C65 #CJK UNIFIED IDEOGRAPH
+0x979B 0x674E #CJK UNIFIED IDEOGRAPH
+0x979C 0x68A8 #CJK UNIFIED IDEOGRAPH
+0x979D 0x7406 #CJK UNIFIED IDEOGRAPH
+0x979E 0x7483 #CJK UNIFIED IDEOGRAPH
+0x979F 0x75E2 #CJK UNIFIED IDEOGRAPH
+0x97A0 0x88CF #CJK UNIFIED IDEOGRAPH
+0x97A1 0x88E1 #CJK UNIFIED IDEOGRAPH
+0x97A2 0x91CC #CJK UNIFIED IDEOGRAPH
+0x97A3 0x96E2 #CJK UNIFIED IDEOGRAPH
+0x97A4 0x9678 #CJK UNIFIED IDEOGRAPH
+0x97A5 0x5F8B #CJK UNIFIED IDEOGRAPH
+0x97A6 0x7387 #CJK UNIFIED IDEOGRAPH
+0x97A7 0x7ACB #CJK UNIFIED IDEOGRAPH
+0x97A8 0x844E #CJK UNIFIED IDEOGRAPH
+0x97A9 0x63A0 #CJK UNIFIED IDEOGRAPH
+0x97AA 0x7565 #CJK UNIFIED IDEOGRAPH
+0x97AB 0x5289 #CJK UNIFIED IDEOGRAPH
+0x97AC 0x6D41 #CJK UNIFIED IDEOGRAPH
+0x97AD 0x6E9C #CJK UNIFIED IDEOGRAPH
+0x97AE 0x7409 #CJK UNIFIED IDEOGRAPH
+0x97AF 0x7559 #CJK UNIFIED IDEOGRAPH
+0x97B0 0x786B #CJK UNIFIED IDEOGRAPH
+0x97B1 0x7C92 #CJK UNIFIED IDEOGRAPH
+0x97B2 0x9686 #CJK UNIFIED IDEOGRAPH
+0x97B3 0x7ADC #CJK UNIFIED IDEOGRAPH
+0x97B4 0x9F8D #CJK UNIFIED IDEOGRAPH
+0x97B5 0x4FB6 #CJK UNIFIED IDEOGRAPH
+0x97B6 0x616E #CJK UNIFIED IDEOGRAPH
+0x97B7 0x65C5 #CJK UNIFIED IDEOGRAPH
+0x97B8 0x865C #CJK UNIFIED IDEOGRAPH
+0x97B9 0x4E86 #CJK UNIFIED IDEOGRAPH
+0x97BA 0x4EAE #CJK UNIFIED IDEOGRAPH
+0x97BB 0x50DA #CJK UNIFIED IDEOGRAPH
+0x97BC 0x4E21 #CJK UNIFIED IDEOGRAPH
+0x97BD 0x51CC #CJK UNIFIED IDEOGRAPH
+0x97BE 0x5BEE #CJK UNIFIED IDEOGRAPH
+0x97BF 0x6599 #CJK UNIFIED IDEOGRAPH
+0x97C0 0x6881 #CJK UNIFIED IDEOGRAPH
+0x97C1 0x6DBC #CJK UNIFIED IDEOGRAPH
+0x97C2 0x731F #CJK UNIFIED IDEOGRAPH
+0x97C3 0x7642 #CJK UNIFIED IDEOGRAPH
+0x97C4 0x77AD #CJK UNIFIED IDEOGRAPH
+0x97C5 0x7A1C #CJK UNIFIED IDEOGRAPH
+0x97C6 0x7CE7 #CJK UNIFIED IDEOGRAPH
+0x97C7 0x826F #CJK UNIFIED IDEOGRAPH
+0x97C8 0x8AD2 #CJK UNIFIED IDEOGRAPH
+0x97C9 0x907C #CJK UNIFIED IDEOGRAPH
+0x97CA 0x91CF #CJK UNIFIED IDEOGRAPH
+0x97CB 0x9675 #CJK UNIFIED IDEOGRAPH
+0x97CC 0x9818 #CJK UNIFIED IDEOGRAPH
+0x97CD 0x529B #CJK UNIFIED IDEOGRAPH
+0x97CE 0x7DD1 #CJK UNIFIED IDEOGRAPH
+0x97CF 0x502B #CJK UNIFIED IDEOGRAPH
+0x97D0 0x5398 #CJK UNIFIED IDEOGRAPH
+0x97D1 0x6797 #CJK UNIFIED IDEOGRAPH
+0x97D2 0x6DCB #CJK UNIFIED IDEOGRAPH
+0x97D3 0x71D0 #CJK UNIFIED IDEOGRAPH
+0x97D4 0x7433 #CJK UNIFIED IDEOGRAPH
+0x97D5 0x81E8 #CJK UNIFIED IDEOGRAPH
+0x97D6 0x8F2A #CJK UNIFIED IDEOGRAPH
+0x97D7 0x96A3 #CJK UNIFIED IDEOGRAPH
+0x97D8 0x9C57 #CJK UNIFIED IDEOGRAPH
+0x97D9 0x9E9F #CJK UNIFIED IDEOGRAPH
+0x97DA 0x7460 #CJK UNIFIED IDEOGRAPH
+0x97DB 0x5841 #CJK UNIFIED IDEOGRAPH
+0x97DC 0x6D99 #CJK UNIFIED IDEOGRAPH
+0x97DD 0x7D2F #CJK UNIFIED IDEOGRAPH
+0x97DE 0x985E #CJK UNIFIED IDEOGRAPH
+0x97DF 0x4EE4 #CJK UNIFIED IDEOGRAPH
+0x97E0 0x4F36 #CJK UNIFIED IDEOGRAPH
+0x97E1 0x4F8B #CJK UNIFIED IDEOGRAPH
+0x97E2 0x51B7 #CJK UNIFIED IDEOGRAPH
+0x97E3 0x52B1 #CJK UNIFIED IDEOGRAPH
+0x97E4 0x5DBA #CJK UNIFIED IDEOGRAPH
+0x97E5 0x601C #CJK UNIFIED IDEOGRAPH
+0x97E6 0x73B2 #CJK UNIFIED IDEOGRAPH
+0x97E7 0x793C #CJK UNIFIED IDEOGRAPH
+0x97E8 0x82D3 #CJK UNIFIED IDEOGRAPH
+0x97E9 0x9234 #CJK UNIFIED IDEOGRAPH
+0x97EA 0x96B7 #CJK UNIFIED IDEOGRAPH
+0x97EB 0x96F6 #CJK UNIFIED IDEOGRAPH
+0x97EC 0x970A #CJK UNIFIED IDEOGRAPH
+0x97ED 0x9E97 #CJK UNIFIED IDEOGRAPH
+0x97EE 0x9F62 #CJK UNIFIED IDEOGRAPH
+0x97EF 0x66A6 #CJK UNIFIED IDEOGRAPH
+0x97F0 0x6B74 #CJK UNIFIED IDEOGRAPH
+0x97F1 0x5217 #CJK UNIFIED IDEOGRAPH
+0x97F2 0x52A3 #CJK UNIFIED IDEOGRAPH
+0x97F3 0x70C8 #CJK UNIFIED IDEOGRAPH
+0x97F4 0x88C2 #CJK UNIFIED IDEOGRAPH
+0x97F5 0x5EC9 #CJK UNIFIED IDEOGRAPH
+0x97F6 0x604B #CJK UNIFIED IDEOGRAPH
+0x97F7 0x6190 #CJK UNIFIED IDEOGRAPH
+0x97F8 0x6F23 #CJK UNIFIED IDEOGRAPH
+0x97F9 0x7149 #CJK UNIFIED IDEOGRAPH
+0x97FA 0x7C3E #CJK UNIFIED IDEOGRAPH
+0x97FB 0x7DF4 #CJK UNIFIED IDEOGRAPH
+0x97FC 0x806F #CJK UNIFIED IDEOGRAPH
+0x9840 0x84EE #CJK UNIFIED IDEOGRAPH
+0x9841 0x9023 #CJK UNIFIED IDEOGRAPH
+0x9842 0x932C #CJK UNIFIED IDEOGRAPH
+0x9843 0x5442 #CJK UNIFIED IDEOGRAPH
+0x9844 0x9B6F #CJK UNIFIED IDEOGRAPH
+0x9845 0x6AD3 #CJK UNIFIED IDEOGRAPH
+0x9846 0x7089 #CJK UNIFIED IDEOGRAPH
+0x9847 0x8CC2 #CJK UNIFIED IDEOGRAPH
+0x9848 0x8DEF #CJK UNIFIED IDEOGRAPH
+0x9849 0x9732 #CJK UNIFIED IDEOGRAPH
+0x984A 0x52B4 #CJK UNIFIED IDEOGRAPH
+0x984B 0x5A41 #CJK UNIFIED IDEOGRAPH
+0x984C 0x5ECA #CJK UNIFIED IDEOGRAPH
+0x984D 0x5F04 #CJK UNIFIED IDEOGRAPH
+0x984E 0x6717 #CJK UNIFIED IDEOGRAPH
+0x984F 0x697C #CJK UNIFIED IDEOGRAPH
+0x9850 0x6994 #CJK UNIFIED IDEOGRAPH
+0x9851 0x6D6A #CJK UNIFIED IDEOGRAPH
+0x9852 0x6F0F #CJK UNIFIED IDEOGRAPH
+0x9853 0x7262 #CJK UNIFIED IDEOGRAPH
+0x9854 0x72FC #CJK UNIFIED IDEOGRAPH
+0x9855 0x7BED #CJK UNIFIED IDEOGRAPH
+0x9856 0x8001 #CJK UNIFIED IDEOGRAPH
+0x9857 0x807E #CJK UNIFIED IDEOGRAPH
+0x9858 0x874B #CJK UNIFIED IDEOGRAPH
+0x9859 0x90CE #CJK UNIFIED IDEOGRAPH
+0x985A 0x516D #CJK UNIFIED IDEOGRAPH
+0x985B 0x9E93 #CJK UNIFIED IDEOGRAPH
+0x985C 0x7984 #CJK UNIFIED IDEOGRAPH
+0x985D 0x808B #CJK UNIFIED IDEOGRAPH
+0x985E 0x9332 #CJK UNIFIED IDEOGRAPH
+0x985F 0x8AD6 #CJK UNIFIED IDEOGRAPH
+0x9860 0x502D #CJK UNIFIED IDEOGRAPH
+0x9861 0x548C #CJK UNIFIED IDEOGRAPH
+0x9862 0x8A71 #CJK UNIFIED IDEOGRAPH
+0x9863 0x6B6A #CJK UNIFIED IDEOGRAPH
+0x9864 0x8CC4 #CJK UNIFIED IDEOGRAPH
+0x9865 0x8107 #CJK UNIFIED IDEOGRAPH
+0x9866 0x60D1 #CJK UNIFIED IDEOGRAPH
+0x9867 0x67A0 #CJK UNIFIED IDEOGRAPH
+0x9868 0x9DF2 #CJK UNIFIED IDEOGRAPH
+0x9869 0x4E99 #CJK UNIFIED IDEOGRAPH
+0x986A 0x4E98 #CJK UNIFIED IDEOGRAPH
+0x986B 0x9C10 #CJK UNIFIED IDEOGRAPH
+0x986C 0x8A6B #CJK UNIFIED IDEOGRAPH
+0x986D 0x85C1 #CJK UNIFIED IDEOGRAPH
+0x986E 0x8568 #CJK UNIFIED IDEOGRAPH
+0x986F 0x6900 #CJK UNIFIED IDEOGRAPH
+0x9870 0x6E7E #CJK UNIFIED IDEOGRAPH
+0x9871 0x7897 #CJK UNIFIED IDEOGRAPH
+0x9872 0x8155 #CJK UNIFIED IDEOGRAPH
+0x989F 0x5F0C #CJK UNIFIED IDEOGRAPH
+0x98A0 0x4E10 #CJK UNIFIED IDEOGRAPH
+0x98A1 0x4E15 #CJK UNIFIED IDEOGRAPH
+0x98A2 0x4E2A #CJK UNIFIED IDEOGRAPH
+0x98A3 0x4E31 #CJK UNIFIED IDEOGRAPH
+0x98A4 0x4E36 #CJK UNIFIED IDEOGRAPH
+0x98A5 0x4E3C #CJK UNIFIED IDEOGRAPH
+0x98A6 0x4E3F #CJK UNIFIED IDEOGRAPH
+0x98A7 0x4E42 #CJK UNIFIED IDEOGRAPH
+0x98A8 0x4E56 #CJK UNIFIED IDEOGRAPH
+0x98A9 0x4E58 #CJK UNIFIED IDEOGRAPH
+0x98AA 0x4E82 #CJK UNIFIED IDEOGRAPH
+0x98AB 0x4E85 #CJK UNIFIED IDEOGRAPH
+0x98AC 0x8C6B #CJK UNIFIED IDEOGRAPH
+0x98AD 0x4E8A #CJK UNIFIED IDEOGRAPH
+0x98AE 0x8212 #CJK UNIFIED IDEOGRAPH
+0x98AF 0x5F0D #CJK UNIFIED IDEOGRAPH
+0x98B0 0x4E8E #CJK UNIFIED IDEOGRAPH
+0x98B1 0x4E9E #CJK UNIFIED IDEOGRAPH
+0x98B2 0x4E9F #CJK UNIFIED IDEOGRAPH
+0x98B3 0x4EA0 #CJK UNIFIED IDEOGRAPH
+0x98B4 0x4EA2 #CJK UNIFIED IDEOGRAPH
+0x98B5 0x4EB0 #CJK UNIFIED IDEOGRAPH
+0x98B6 0x4EB3 #CJK UNIFIED IDEOGRAPH
+0x98B7 0x4EB6 #CJK UNIFIED IDEOGRAPH
+0x98B8 0x4ECE #CJK UNIFIED IDEOGRAPH
+0x98B9 0x4ECD #CJK UNIFIED IDEOGRAPH
+0x98BA 0x4EC4 #CJK UNIFIED IDEOGRAPH
+0x98BB 0x4EC6 #CJK UNIFIED IDEOGRAPH
+0x98BC 0x4EC2 #CJK UNIFIED IDEOGRAPH
+0x98BD 0x4ED7 #CJK UNIFIED IDEOGRAPH
+0x98BE 0x4EDE #CJK UNIFIED IDEOGRAPH
+0x98BF 0x4EED #CJK UNIFIED IDEOGRAPH
+0x98C0 0x4EDF #CJK UNIFIED IDEOGRAPH
+0x98C1 0x4EF7 #CJK UNIFIED IDEOGRAPH
+0x98C2 0x4F09 #CJK UNIFIED IDEOGRAPH
+0x98C3 0x4F5A #CJK UNIFIED IDEOGRAPH
+0x98C4 0x4F30 #CJK UNIFIED IDEOGRAPH
+0x98C5 0x4F5B #CJK UNIFIED IDEOGRAPH
+0x98C6 0x4F5D #CJK UNIFIED IDEOGRAPH
+0x98C7 0x4F57 #CJK UNIFIED IDEOGRAPH
+0x98C8 0x4F47 #CJK UNIFIED IDEOGRAPH
+0x98C9 0x4F76 #CJK UNIFIED IDEOGRAPH
+0x98CA 0x4F88 #CJK UNIFIED IDEOGRAPH
+0x98CB 0x4F8F #CJK UNIFIED IDEOGRAPH
+0x98CC 0x4F98 #CJK UNIFIED IDEOGRAPH
+0x98CD 0x4F7B #CJK UNIFIED IDEOGRAPH
+0x98CE 0x4F69 #CJK UNIFIED IDEOGRAPH
+0x98CF 0x4F70 #CJK UNIFIED IDEOGRAPH
+0x98D0 0x4F91 #CJK UNIFIED IDEOGRAPH
+0x98D1 0x4F6F #CJK UNIFIED IDEOGRAPH
+0x98D2 0x4F86 #CJK UNIFIED IDEOGRAPH
+0x98D3 0x4F96 #CJK UNIFIED IDEOGRAPH
+0x98D4 0x5118 #CJK UNIFIED IDEOGRAPH
+0x98D5 0x4FD4 #CJK UNIFIED IDEOGRAPH
+0x98D6 0x4FDF #CJK UNIFIED IDEOGRAPH
+0x98D7 0x4FCE #CJK UNIFIED IDEOGRAPH
+0x98D8 0x4FD8 #CJK UNIFIED IDEOGRAPH
+0x98D9 0x4FDB #CJK UNIFIED IDEOGRAPH
+0x98DA 0x4FD1 #CJK UNIFIED IDEOGRAPH
+0x98DB 0x4FDA #CJK UNIFIED IDEOGRAPH
+0x98DC 0x4FD0 #CJK UNIFIED IDEOGRAPH
+0x98DD 0x4FE4 #CJK UNIFIED IDEOGRAPH
+0x98DE 0x4FE5 #CJK UNIFIED IDEOGRAPH
+0x98DF 0x501A #CJK UNIFIED IDEOGRAPH
+0x98E0 0x5028 #CJK UNIFIED IDEOGRAPH
+0x98E1 0x5014 #CJK UNIFIED IDEOGRAPH
+0x98E2 0x502A #CJK UNIFIED IDEOGRAPH
+0x98E3 0x5025 #CJK UNIFIED IDEOGRAPH
+0x98E4 0x5005 #CJK UNIFIED IDEOGRAPH
+0x98E5 0x4F1C #CJK UNIFIED IDEOGRAPH
+0x98E6 0x4FF6 #CJK UNIFIED IDEOGRAPH
+0x98E7 0x5021 #CJK UNIFIED IDEOGRAPH
+0x98E8 0x5029 #CJK UNIFIED IDEOGRAPH
+0x98E9 0x502C #CJK UNIFIED IDEOGRAPH
+0x98EA 0x4FFE #CJK UNIFIED IDEOGRAPH
+0x98EB 0x4FEF #CJK UNIFIED IDEOGRAPH
+0x98EC 0x5011 #CJK UNIFIED IDEOGRAPH
+0x98ED 0x5006 #CJK UNIFIED IDEOGRAPH
+0x98EE 0x5043 #CJK UNIFIED IDEOGRAPH
+0x98EF 0x5047 #CJK UNIFIED IDEOGRAPH
+0x98F0 0x6703 #CJK UNIFIED IDEOGRAPH
+0x98F1 0x5055 #CJK UNIFIED IDEOGRAPH
+0x98F2 0x5050 #CJK UNIFIED IDEOGRAPH
+0x98F3 0x5048 #CJK UNIFIED IDEOGRAPH
+0x98F4 0x505A #CJK UNIFIED IDEOGRAPH
+0x98F5 0x5056 #CJK UNIFIED IDEOGRAPH
+0x98F6 0x506C #CJK UNIFIED IDEOGRAPH
+0x98F7 0x5078 #CJK UNIFIED IDEOGRAPH
+0x98F8 0x5080 #CJK UNIFIED IDEOGRAPH
+0x98F9 0x509A #CJK UNIFIED IDEOGRAPH
+0x98FA 0x5085 #CJK UNIFIED IDEOGRAPH
+0x98FB 0x50B4 #CJK UNIFIED IDEOGRAPH
+0x98FC 0x50B2 #CJK UNIFIED IDEOGRAPH
+0x9940 0x50C9 #CJK UNIFIED IDEOGRAPH
+0x9941 0x50CA #CJK UNIFIED IDEOGRAPH
+0x9942 0x50B3 #CJK UNIFIED IDEOGRAPH
+0x9943 0x50C2 #CJK UNIFIED IDEOGRAPH
+0x9944 0x50D6 #CJK UNIFIED IDEOGRAPH
+0x9945 0x50DE #CJK UNIFIED IDEOGRAPH
+0x9946 0x50E5 #CJK UNIFIED IDEOGRAPH
+0x9947 0x50ED #CJK UNIFIED IDEOGRAPH
+0x9948 0x50E3 #CJK UNIFIED IDEOGRAPH
+0x9949 0x50EE #CJK UNIFIED IDEOGRAPH
+0x994A 0x50F9 #CJK UNIFIED IDEOGRAPH
+0x994B 0x50F5 #CJK UNIFIED IDEOGRAPH
+0x994C 0x5109 #CJK UNIFIED IDEOGRAPH
+0x994D 0x5101 #CJK UNIFIED IDEOGRAPH
+0x994E 0x5102 #CJK UNIFIED IDEOGRAPH
+0x994F 0x5116 #CJK UNIFIED IDEOGRAPH
+0x9950 0x5115 #CJK UNIFIED IDEOGRAPH
+0x9951 0x5114 #CJK UNIFIED IDEOGRAPH
+0x9952 0x511A #CJK UNIFIED IDEOGRAPH
+0x9953 0x5121 #CJK UNIFIED IDEOGRAPH
+0x9954 0x513A #CJK UNIFIED IDEOGRAPH
+0x9955 0x5137 #CJK UNIFIED IDEOGRAPH
+0x9956 0x513C #CJK UNIFIED IDEOGRAPH
+0x9957 0x513B #CJK UNIFIED IDEOGRAPH
+0x9958 0x513F #CJK UNIFIED IDEOGRAPH
+0x9959 0x5140 #CJK UNIFIED IDEOGRAPH
+0x995A 0x5152 #CJK UNIFIED IDEOGRAPH
+0x995B 0x514C #CJK UNIFIED IDEOGRAPH
+0x995C 0x5154 #CJK UNIFIED IDEOGRAPH
+0x995D 0x5162 #CJK UNIFIED IDEOGRAPH
+0x995E 0x7AF8 #CJK UNIFIED IDEOGRAPH
+0x995F 0x5169 #CJK UNIFIED IDEOGRAPH
+0x9960 0x516A #CJK UNIFIED IDEOGRAPH
+0x9961 0x516E #CJK UNIFIED IDEOGRAPH
+0x9962 0x5180 #CJK UNIFIED IDEOGRAPH
+0x9963 0x5182 #CJK UNIFIED IDEOGRAPH
+0x9964 0x56D8 #CJK UNIFIED IDEOGRAPH
+0x9965 0x518C #CJK UNIFIED IDEOGRAPH
+0x9966 0x5189 #CJK UNIFIED IDEOGRAPH
+0x9967 0x518F #CJK UNIFIED IDEOGRAPH
+0x9968 0x5191 #CJK UNIFIED IDEOGRAPH
+0x9969 0x5193 #CJK UNIFIED IDEOGRAPH
+0x996A 0x5195 #CJK UNIFIED IDEOGRAPH
+0x996B 0x5196 #CJK UNIFIED IDEOGRAPH
+0x996C 0x51A4 #CJK UNIFIED IDEOGRAPH
+0x996D 0x51A6 #CJK UNIFIED IDEOGRAPH
+0x996E 0x51A2 #CJK UNIFIED IDEOGRAPH
+0x996F 0x51A9 #CJK UNIFIED IDEOGRAPH
+0x9970 0x51AA #CJK UNIFIED IDEOGRAPH
+0x9971 0x51AB #CJK UNIFIED IDEOGRAPH
+0x9972 0x51B3 #CJK UNIFIED IDEOGRAPH
+0x9973 0x51B1 #CJK UNIFIED IDEOGRAPH
+0x9974 0x51B2 #CJK UNIFIED IDEOGRAPH
+0x9975 0x51B0 #CJK UNIFIED IDEOGRAPH
+0x9976 0x51B5 #CJK UNIFIED IDEOGRAPH
+0x9977 0x51BD #CJK UNIFIED IDEOGRAPH
+0x9978 0x51C5 #CJK UNIFIED IDEOGRAPH
+0x9979 0x51C9 #CJK UNIFIED IDEOGRAPH
+0x997A 0x51DB #CJK UNIFIED IDEOGRAPH
+0x997B 0x51E0 #CJK UNIFIED IDEOGRAPH
+0x997C 0x8655 #CJK UNIFIED IDEOGRAPH
+0x997D 0x51E9 #CJK UNIFIED IDEOGRAPH
+0x997E 0x51ED #CJK UNIFIED IDEOGRAPH
+0x9980 0x51F0 #CJK UNIFIED IDEOGRAPH
+0x9981 0x51F5 #CJK UNIFIED IDEOGRAPH
+0x9982 0x51FE #CJK UNIFIED IDEOGRAPH
+0x9983 0x5204 #CJK UNIFIED IDEOGRAPH
+0x9984 0x520B #CJK UNIFIED IDEOGRAPH
+0x9985 0x5214 #CJK UNIFIED IDEOGRAPH
+0x9986 0x520E #CJK UNIFIED IDEOGRAPH
+0x9987 0x5227 #CJK UNIFIED IDEOGRAPH
+0x9988 0x522A #CJK UNIFIED IDEOGRAPH
+0x9989 0x522E #CJK UNIFIED IDEOGRAPH
+0x998A 0x5233 #CJK UNIFIED IDEOGRAPH
+0x998B 0x5239 #CJK UNIFIED IDEOGRAPH
+0x998C 0x524F #CJK UNIFIED IDEOGRAPH
+0x998D 0x5244 #CJK UNIFIED IDEOGRAPH
+0x998E 0x524B #CJK UNIFIED IDEOGRAPH
+0x998F 0x524C #CJK UNIFIED IDEOGRAPH
+0x9990 0x525E #CJK UNIFIED IDEOGRAPH
+0x9991 0x5254 #CJK UNIFIED IDEOGRAPH
+0x9992 0x526A #CJK UNIFIED IDEOGRAPH
+0x9993 0x5274 #CJK UNIFIED IDEOGRAPH
+0x9994 0x5269 #CJK UNIFIED IDEOGRAPH
+0x9995 0x5273 #CJK UNIFIED IDEOGRAPH
+0x9996 0x527F #CJK UNIFIED IDEOGRAPH
+0x9997 0x527D #CJK UNIFIED IDEOGRAPH
+0x9998 0x528D #CJK UNIFIED IDEOGRAPH
+0x9999 0x5294 #CJK UNIFIED IDEOGRAPH
+0x999A 0x5292 #CJK UNIFIED IDEOGRAPH
+0x999B 0x5271 #CJK UNIFIED IDEOGRAPH
+0x999C 0x5288 #CJK UNIFIED IDEOGRAPH
+0x999D 0x5291 #CJK UNIFIED IDEOGRAPH
+0x999E 0x8FA8 #CJK UNIFIED IDEOGRAPH
+0x999F 0x8FA7 #CJK UNIFIED IDEOGRAPH
+0x99A0 0x52AC #CJK UNIFIED IDEOGRAPH
+0x99A1 0x52AD #CJK UNIFIED IDEOGRAPH
+0x99A2 0x52BC #CJK UNIFIED IDEOGRAPH
+0x99A3 0x52B5 #CJK UNIFIED IDEOGRAPH
+0x99A4 0x52C1 #CJK UNIFIED IDEOGRAPH
+0x99A5 0x52CD #CJK UNIFIED IDEOGRAPH
+0x99A6 0x52D7 #CJK UNIFIED IDEOGRAPH
+0x99A7 0x52DE #CJK UNIFIED IDEOGRAPH
+0x99A8 0x52E3 #CJK UNIFIED IDEOGRAPH
+0x99A9 0x52E6 #CJK UNIFIED IDEOGRAPH
+0x99AA 0x98ED #CJK UNIFIED IDEOGRAPH
+0x99AB 0x52E0 #CJK UNIFIED IDEOGRAPH
+0x99AC 0x52F3 #CJK UNIFIED IDEOGRAPH
+0x99AD 0x52F5 #CJK UNIFIED IDEOGRAPH
+0x99AE 0x52F8 #CJK UNIFIED IDEOGRAPH
+0x99AF 0x52F9 #CJK UNIFIED IDEOGRAPH
+0x99B0 0x5306 #CJK UNIFIED IDEOGRAPH
+0x99B1 0x5308 #CJK UNIFIED IDEOGRAPH
+0x99B2 0x7538 #CJK UNIFIED IDEOGRAPH
+0x99B3 0x530D #CJK UNIFIED IDEOGRAPH
+0x99B4 0x5310 #CJK UNIFIED IDEOGRAPH
+0x99B5 0x530F #CJK UNIFIED IDEOGRAPH
+0x99B6 0x5315 #CJK UNIFIED IDEOGRAPH
+0x99B7 0x531A #CJK UNIFIED IDEOGRAPH
+0x99B8 0x5323 #CJK UNIFIED IDEOGRAPH
+0x99B9 0x532F #CJK UNIFIED IDEOGRAPH
+0x99BA 0x5331 #CJK UNIFIED IDEOGRAPH
+0x99BB 0x5333 #CJK UNIFIED IDEOGRAPH
+0x99BC 0x5338 #CJK UNIFIED IDEOGRAPH
+0x99BD 0x5340 #CJK UNIFIED IDEOGRAPH
+0x99BE 0x5346 #CJK UNIFIED IDEOGRAPH
+0x99BF 0x5345 #CJK UNIFIED IDEOGRAPH
+0x99C0 0x4E17 #CJK UNIFIED IDEOGRAPH
+0x99C1 0x5349 #CJK UNIFIED IDEOGRAPH
+0x99C2 0x534D #CJK UNIFIED IDEOGRAPH
+0x99C3 0x51D6 #CJK UNIFIED IDEOGRAPH
+0x99C4 0x535E #CJK UNIFIED IDEOGRAPH
+0x99C5 0x5369 #CJK UNIFIED IDEOGRAPH
+0x99C6 0x536E #CJK UNIFIED IDEOGRAPH
+0x99C7 0x5918 #CJK UNIFIED IDEOGRAPH
+0x99C8 0x537B #CJK UNIFIED IDEOGRAPH
+0x99C9 0x5377 #CJK UNIFIED IDEOGRAPH
+0x99CA 0x5382 #CJK UNIFIED IDEOGRAPH
+0x99CB 0x5396 #CJK UNIFIED IDEOGRAPH
+0x99CC 0x53A0 #CJK UNIFIED IDEOGRAPH
+0x99CD 0x53A6 #CJK UNIFIED IDEOGRAPH
+0x99CE 0x53A5 #CJK UNIFIED IDEOGRAPH
+0x99CF 0x53AE #CJK UNIFIED IDEOGRAPH
+0x99D0 0x53B0 #CJK UNIFIED IDEOGRAPH
+0x99D1 0x53B6 #CJK UNIFIED IDEOGRAPH
+0x99D2 0x53C3 #CJK UNIFIED IDEOGRAPH
+0x99D3 0x7C12 #CJK UNIFIED IDEOGRAPH
+0x99D4 0x96D9 #CJK UNIFIED IDEOGRAPH
+0x99D5 0x53DF #CJK UNIFIED IDEOGRAPH
+0x99D6 0x66FC #CJK UNIFIED IDEOGRAPH
+0x99D7 0x71EE #CJK UNIFIED IDEOGRAPH
+0x99D8 0x53EE #CJK UNIFIED IDEOGRAPH
+0x99D9 0x53E8 #CJK UNIFIED IDEOGRAPH
+0x99DA 0x53ED #CJK UNIFIED IDEOGRAPH
+0x99DB 0x53FA #CJK UNIFIED IDEOGRAPH
+0x99DC 0x5401 #CJK UNIFIED IDEOGRAPH
+0x99DD 0x543D #CJK UNIFIED IDEOGRAPH
+0x99DE 0x5440 #CJK UNIFIED IDEOGRAPH
+0x99DF 0x542C #CJK UNIFIED IDEOGRAPH
+0x99E0 0x542D #CJK UNIFIED IDEOGRAPH
+0x99E1 0x543C #CJK UNIFIED IDEOGRAPH
+0x99E2 0x542E #CJK UNIFIED IDEOGRAPH
+0x99E3 0x5436 #CJK UNIFIED IDEOGRAPH
+0x99E4 0x5429 #CJK UNIFIED IDEOGRAPH
+0x99E5 0x541D #CJK UNIFIED IDEOGRAPH
+0x99E6 0x544E #CJK UNIFIED IDEOGRAPH
+0x99E7 0x548F #CJK UNIFIED IDEOGRAPH
+0x99E8 0x5475 #CJK UNIFIED IDEOGRAPH
+0x99E9 0x548E #CJK UNIFIED IDEOGRAPH
+0x99EA 0x545F #CJK UNIFIED IDEOGRAPH
+0x99EB 0x5471 #CJK UNIFIED IDEOGRAPH
+0x99EC 0x5477 #CJK UNIFIED IDEOGRAPH
+0x99ED 0x5470 #CJK UNIFIED IDEOGRAPH
+0x99EE 0x5492 #CJK UNIFIED IDEOGRAPH
+0x99EF 0x547B #CJK UNIFIED IDEOGRAPH
+0x99F0 0x5480 #CJK UNIFIED IDEOGRAPH
+0x99F1 0x5476 #CJK UNIFIED IDEOGRAPH
+0x99F2 0x5484 #CJK UNIFIED IDEOGRAPH
+0x99F3 0x5490 #CJK UNIFIED IDEOGRAPH
+0x99F4 0x5486 #CJK UNIFIED IDEOGRAPH
+0x99F5 0x54C7 #CJK UNIFIED IDEOGRAPH
+0x99F6 0x54A2 #CJK UNIFIED IDEOGRAPH
+0x99F7 0x54B8 #CJK UNIFIED IDEOGRAPH
+0x99F8 0x54A5 #CJK UNIFIED IDEOGRAPH
+0x99F9 0x54AC #CJK UNIFIED IDEOGRAPH
+0x99FA 0x54C4 #CJK UNIFIED IDEOGRAPH
+0x99FB 0x54C8 #CJK UNIFIED IDEOGRAPH
+0x99FC 0x54A8 #CJK UNIFIED IDEOGRAPH
+0x9A40 0x54AB #CJK UNIFIED IDEOGRAPH
+0x9A41 0x54C2 #CJK UNIFIED IDEOGRAPH
+0x9A42 0x54A4 #CJK UNIFIED IDEOGRAPH
+0x9A43 0x54BE #CJK UNIFIED IDEOGRAPH
+0x9A44 0x54BC #CJK UNIFIED IDEOGRAPH
+0x9A45 0x54D8 #CJK UNIFIED IDEOGRAPH
+0x9A46 0x54E5 #CJK UNIFIED IDEOGRAPH
+0x9A47 0x54E6 #CJK UNIFIED IDEOGRAPH
+0x9A48 0x550F #CJK UNIFIED IDEOGRAPH
+0x9A49 0x5514 #CJK UNIFIED IDEOGRAPH
+0x9A4A 0x54FD #CJK UNIFIED IDEOGRAPH
+0x9A4B 0x54EE #CJK UNIFIED IDEOGRAPH
+0x9A4C 0x54ED #CJK UNIFIED IDEOGRAPH
+0x9A4D 0x54FA #CJK UNIFIED IDEOGRAPH
+0x9A4E 0x54E2 #CJK UNIFIED IDEOGRAPH
+0x9A4F 0x5539 #CJK UNIFIED IDEOGRAPH
+0x9A50 0x5540 #CJK UNIFIED IDEOGRAPH
+0x9A51 0x5563 #CJK UNIFIED IDEOGRAPH
+0x9A52 0x554C #CJK UNIFIED IDEOGRAPH
+0x9A53 0x552E #CJK UNIFIED IDEOGRAPH
+0x9A54 0x555C #CJK UNIFIED IDEOGRAPH
+0x9A55 0x5545 #CJK UNIFIED IDEOGRAPH
+0x9A56 0x5556 #CJK UNIFIED IDEOGRAPH
+0x9A57 0x5557 #CJK UNIFIED IDEOGRAPH
+0x9A58 0x5538 #CJK UNIFIED IDEOGRAPH
+0x9A59 0x5533 #CJK UNIFIED IDEOGRAPH
+0x9A5A 0x555D #CJK UNIFIED IDEOGRAPH
+0x9A5B 0x5599 #CJK UNIFIED IDEOGRAPH
+0x9A5C 0x5580 #CJK UNIFIED IDEOGRAPH
+0x9A5D 0x54AF #CJK UNIFIED IDEOGRAPH
+0x9A5E 0x558A #CJK UNIFIED IDEOGRAPH
+0x9A5F 0x559F #CJK UNIFIED IDEOGRAPH
+0x9A60 0x557B #CJK UNIFIED IDEOGRAPH
+0x9A61 0x557E #CJK UNIFIED IDEOGRAPH
+0x9A62 0x5598 #CJK UNIFIED IDEOGRAPH
+0x9A63 0x559E #CJK UNIFIED IDEOGRAPH
+0x9A64 0x55AE #CJK UNIFIED IDEOGRAPH
+0x9A65 0x557C #CJK UNIFIED IDEOGRAPH
+0x9A66 0x5583 #CJK UNIFIED IDEOGRAPH
+0x9A67 0x55A9 #CJK UNIFIED IDEOGRAPH
+0x9A68 0x5587 #CJK UNIFIED IDEOGRAPH
+0x9A69 0x55A8 #CJK UNIFIED IDEOGRAPH
+0x9A6A 0x55DA #CJK UNIFIED IDEOGRAPH
+0x9A6B 0x55C5 #CJK UNIFIED IDEOGRAPH
+0x9A6C 0x55DF #CJK UNIFIED IDEOGRAPH
+0x9A6D 0x55C4 #CJK UNIFIED IDEOGRAPH
+0x9A6E 0x55DC #CJK UNIFIED IDEOGRAPH
+0x9A6F 0x55E4 #CJK UNIFIED IDEOGRAPH
+0x9A70 0x55D4 #CJK UNIFIED IDEOGRAPH
+0x9A71 0x5614 #CJK UNIFIED IDEOGRAPH
+0x9A72 0x55F7 #CJK UNIFIED IDEOGRAPH
+0x9A73 0x5616 #CJK UNIFIED IDEOGRAPH
+0x9A74 0x55FE #CJK UNIFIED IDEOGRAPH
+0x9A75 0x55FD #CJK UNIFIED IDEOGRAPH
+0x9A76 0x561B #CJK UNIFIED IDEOGRAPH
+0x9A77 0x55F9 #CJK UNIFIED IDEOGRAPH
+0x9A78 0x564E #CJK UNIFIED IDEOGRAPH
+0x9A79 0x5650 #CJK UNIFIED IDEOGRAPH
+0x9A7A 0x71DF #CJK UNIFIED IDEOGRAPH
+0x9A7B 0x5634 #CJK UNIFIED IDEOGRAPH
+0x9A7C 0x5636 #CJK UNIFIED IDEOGRAPH
+0x9A7D 0x5632 #CJK UNIFIED IDEOGRAPH
+0x9A7E 0x5638 #CJK UNIFIED IDEOGRAPH
+0x9A80 0x566B #CJK UNIFIED IDEOGRAPH
+0x9A81 0x5664 #CJK UNIFIED IDEOGRAPH
+0x9A82 0x562F #CJK UNIFIED IDEOGRAPH
+0x9A83 0x566C #CJK UNIFIED IDEOGRAPH
+0x9A84 0x566A #CJK UNIFIED IDEOGRAPH
+0x9A85 0x5686 #CJK UNIFIED IDEOGRAPH
+0x9A86 0x5680 #CJK UNIFIED IDEOGRAPH
+0x9A87 0x568A #CJK UNIFIED IDEOGRAPH
+0x9A88 0x56A0 #CJK UNIFIED IDEOGRAPH
+0x9A89 0x5694 #CJK UNIFIED IDEOGRAPH
+0x9A8A 0x568F #CJK UNIFIED IDEOGRAPH
+0x9A8B 0x56A5 #CJK UNIFIED IDEOGRAPH
+0x9A8C 0x56AE #CJK UNIFIED IDEOGRAPH
+0x9A8D 0x56B6 #CJK UNIFIED IDEOGRAPH
+0x9A8E 0x56B4 #CJK UNIFIED IDEOGRAPH
+0x9A8F 0x56C2 #CJK UNIFIED IDEOGRAPH
+0x9A90 0x56BC #CJK UNIFIED IDEOGRAPH
+0x9A91 0x56C1 #CJK UNIFIED IDEOGRAPH
+0x9A92 0x56C3 #CJK UNIFIED IDEOGRAPH
+0x9A93 0x56C0 #CJK UNIFIED IDEOGRAPH
+0x9A94 0x56C8 #CJK UNIFIED IDEOGRAPH
+0x9A95 0x56CE #CJK UNIFIED IDEOGRAPH
+0x9A96 0x56D1 #CJK UNIFIED IDEOGRAPH
+0x9A97 0x56D3 #CJK UNIFIED IDEOGRAPH
+0x9A98 0x56D7 #CJK UNIFIED IDEOGRAPH
+0x9A99 0x56EE #CJK UNIFIED IDEOGRAPH
+0x9A9A 0x56F9 #CJK UNIFIED IDEOGRAPH
+0x9A9B 0x5700 #CJK UNIFIED IDEOGRAPH
+0x9A9C 0x56FF #CJK UNIFIED IDEOGRAPH
+0x9A9D 0x5704 #CJK UNIFIED IDEOGRAPH
+0x9A9E 0x5709 #CJK UNIFIED IDEOGRAPH
+0x9A9F 0x5708 #CJK UNIFIED IDEOGRAPH
+0x9AA0 0x570B #CJK UNIFIED IDEOGRAPH
+0x9AA1 0x570D #CJK UNIFIED IDEOGRAPH
+0x9AA2 0x5713 #CJK UNIFIED IDEOGRAPH
+0x9AA3 0x5718 #CJK UNIFIED IDEOGRAPH
+0x9AA4 0x5716 #CJK UNIFIED IDEOGRAPH
+0x9AA5 0x55C7 #CJK UNIFIED IDEOGRAPH
+0x9AA6 0x571C #CJK UNIFIED IDEOGRAPH
+0x9AA7 0x5726 #CJK UNIFIED IDEOGRAPH
+0x9AA8 0x5737 #CJK UNIFIED IDEOGRAPH
+0x9AA9 0x5738 #CJK UNIFIED IDEOGRAPH
+0x9AAA 0x574E #CJK UNIFIED IDEOGRAPH
+0x9AAB 0x573B #CJK UNIFIED IDEOGRAPH
+0x9AAC 0x5740 #CJK UNIFIED IDEOGRAPH
+0x9AAD 0x574F #CJK UNIFIED IDEOGRAPH
+0x9AAE 0x5769 #CJK UNIFIED IDEOGRAPH
+0x9AAF 0x57C0 #CJK UNIFIED IDEOGRAPH
+0x9AB0 0x5788 #CJK UNIFIED IDEOGRAPH
+0x9AB1 0x5761 #CJK UNIFIED IDEOGRAPH
+0x9AB2 0x577F #CJK UNIFIED IDEOGRAPH
+0x9AB3 0x5789 #CJK UNIFIED IDEOGRAPH
+0x9AB4 0x5793 #CJK UNIFIED IDEOGRAPH
+0x9AB5 0x57A0 #CJK UNIFIED IDEOGRAPH
+0x9AB6 0x57B3 #CJK UNIFIED IDEOGRAPH
+0x9AB7 0x57A4 #CJK UNIFIED IDEOGRAPH
+0x9AB8 0x57AA #CJK UNIFIED IDEOGRAPH
+0x9AB9 0x57B0 #CJK UNIFIED IDEOGRAPH
+0x9ABA 0x57C3 #CJK UNIFIED IDEOGRAPH
+0x9ABB 0x57C6 #CJK UNIFIED IDEOGRAPH
+0x9ABC 0x57D4 #CJK UNIFIED IDEOGRAPH
+0x9ABD 0x57D2 #CJK UNIFIED IDEOGRAPH
+0x9ABE 0x57D3 #CJK UNIFIED IDEOGRAPH
+0x9ABF 0x580A #CJK UNIFIED IDEOGRAPH
+0x9AC0 0x57D6 #CJK UNIFIED IDEOGRAPH
+0x9AC1 0x57E3 #CJK UNIFIED IDEOGRAPH
+0x9AC2 0x580B #CJK UNIFIED IDEOGRAPH
+0x9AC3 0x5819 #CJK UNIFIED IDEOGRAPH
+0x9AC4 0x581D #CJK UNIFIED IDEOGRAPH
+0x9AC5 0x5872 #CJK UNIFIED IDEOGRAPH
+0x9AC6 0x5821 #CJK UNIFIED IDEOGRAPH
+0x9AC7 0x5862 #CJK UNIFIED IDEOGRAPH
+0x9AC8 0x584B #CJK UNIFIED IDEOGRAPH
+0x9AC9 0x5870 #CJK UNIFIED IDEOGRAPH
+0x9ACA 0x6BC0 #CJK UNIFIED IDEOGRAPH
+0x9ACB 0x5852 #CJK UNIFIED IDEOGRAPH
+0x9ACC 0x583D #CJK UNIFIED IDEOGRAPH
+0x9ACD 0x5879 #CJK UNIFIED IDEOGRAPH
+0x9ACE 0x5885 #CJK UNIFIED IDEOGRAPH
+0x9ACF 0x58B9 #CJK UNIFIED IDEOGRAPH
+0x9AD0 0x589F #CJK UNIFIED IDEOGRAPH
+0x9AD1 0x58AB #CJK UNIFIED IDEOGRAPH
+0x9AD2 0x58BA #CJK UNIFIED IDEOGRAPH
+0x9AD3 0x58DE #CJK UNIFIED IDEOGRAPH
+0x9AD4 0x58BB #CJK UNIFIED IDEOGRAPH
+0x9AD5 0x58B8 #CJK UNIFIED IDEOGRAPH
+0x9AD6 0x58AE #CJK UNIFIED IDEOGRAPH
+0x9AD7 0x58C5 #CJK UNIFIED IDEOGRAPH
+0x9AD8 0x58D3 #CJK UNIFIED IDEOGRAPH
+0x9AD9 0x58D1 #CJK UNIFIED IDEOGRAPH
+0x9ADA 0x58D7 #CJK UNIFIED IDEOGRAPH
+0x9ADB 0x58D9 #CJK UNIFIED IDEOGRAPH
+0x9ADC 0x58D8 #CJK UNIFIED IDEOGRAPH
+0x9ADD 0x58E5 #CJK UNIFIED IDEOGRAPH
+0x9ADE 0x58DC #CJK UNIFIED IDEOGRAPH
+0x9ADF 0x58E4 #CJK UNIFIED IDEOGRAPH
+0x9AE0 0x58DF #CJK UNIFIED IDEOGRAPH
+0x9AE1 0x58EF #CJK UNIFIED IDEOGRAPH
+0x9AE2 0x58FA #CJK UNIFIED IDEOGRAPH
+0x9AE3 0x58F9 #CJK UNIFIED IDEOGRAPH
+0x9AE4 0x58FB #CJK UNIFIED IDEOGRAPH
+0x9AE5 0x58FC #CJK UNIFIED IDEOGRAPH
+0x9AE6 0x58FD #CJK UNIFIED IDEOGRAPH
+0x9AE7 0x5902 #CJK UNIFIED IDEOGRAPH
+0x9AE8 0x590A #CJK UNIFIED IDEOGRAPH
+0x9AE9 0x5910 #CJK UNIFIED IDEOGRAPH
+0x9AEA 0x591B #CJK UNIFIED IDEOGRAPH
+0x9AEB 0x68A6 #CJK UNIFIED IDEOGRAPH
+0x9AEC 0x5925 #CJK UNIFIED IDEOGRAPH
+0x9AED 0x592C #CJK UNIFIED IDEOGRAPH
+0x9AEE 0x592D #CJK UNIFIED IDEOGRAPH
+0x9AEF 0x5932 #CJK UNIFIED IDEOGRAPH
+0x9AF0 0x5938 #CJK UNIFIED IDEOGRAPH
+0x9AF1 0x593E #CJK UNIFIED IDEOGRAPH
+0x9AF2 0x7AD2 #CJK UNIFIED IDEOGRAPH
+0x9AF3 0x5955 #CJK UNIFIED IDEOGRAPH
+0x9AF4 0x5950 #CJK UNIFIED IDEOGRAPH
+0x9AF5 0x594E #CJK UNIFIED IDEOGRAPH
+0x9AF6 0x595A #CJK UNIFIED IDEOGRAPH
+0x9AF7 0x5958 #CJK UNIFIED IDEOGRAPH
+0x9AF8 0x5962 #CJK UNIFIED IDEOGRAPH
+0x9AF9 0x5960 #CJK UNIFIED IDEOGRAPH
+0x9AFA 0x5967 #CJK UNIFIED IDEOGRAPH
+0x9AFB 0x596C #CJK UNIFIED IDEOGRAPH
+0x9AFC 0x5969 #CJK UNIFIED IDEOGRAPH
+0x9B40 0x5978 #CJK UNIFIED IDEOGRAPH
+0x9B41 0x5981 #CJK UNIFIED IDEOGRAPH
+0x9B42 0x599D #CJK UNIFIED IDEOGRAPH
+0x9B43 0x4F5E #CJK UNIFIED IDEOGRAPH
+0x9B44 0x4FAB #CJK UNIFIED IDEOGRAPH
+0x9B45 0x59A3 #CJK UNIFIED IDEOGRAPH
+0x9B46 0x59B2 #CJK UNIFIED IDEOGRAPH
+0x9B47 0x59C6 #CJK UNIFIED IDEOGRAPH
+0x9B48 0x59E8 #CJK UNIFIED IDEOGRAPH
+0x9B49 0x59DC #CJK UNIFIED IDEOGRAPH
+0x9B4A 0x598D #CJK UNIFIED IDEOGRAPH
+0x9B4B 0x59D9 #CJK UNIFIED IDEOGRAPH
+0x9B4C 0x59DA #CJK UNIFIED IDEOGRAPH
+0x9B4D 0x5A25 #CJK UNIFIED IDEOGRAPH
+0x9B4E 0x5A1F #CJK UNIFIED IDEOGRAPH
+0x9B4F 0x5A11 #CJK UNIFIED IDEOGRAPH
+0x9B50 0x5A1C #CJK UNIFIED IDEOGRAPH
+0x9B51 0x5A09 #CJK UNIFIED IDEOGRAPH
+0x9B52 0x5A1A #CJK UNIFIED IDEOGRAPH
+0x9B53 0x5A40 #CJK UNIFIED IDEOGRAPH
+0x9B54 0x5A6C #CJK UNIFIED IDEOGRAPH
+0x9B55 0x5A49 #CJK UNIFIED IDEOGRAPH
+0x9B56 0x5A35 #CJK UNIFIED IDEOGRAPH
+0x9B57 0x5A36 #CJK UNIFIED IDEOGRAPH
+0x9B58 0x5A62 #CJK UNIFIED IDEOGRAPH
+0x9B59 0x5A6A #CJK UNIFIED IDEOGRAPH
+0x9B5A 0x5A9A #CJK UNIFIED IDEOGRAPH
+0x9B5B 0x5ABC #CJK UNIFIED IDEOGRAPH
+0x9B5C 0x5ABE #CJK UNIFIED IDEOGRAPH
+0x9B5D 0x5ACB #CJK UNIFIED IDEOGRAPH
+0x9B5E 0x5AC2 #CJK UNIFIED IDEOGRAPH
+0x9B5F 0x5ABD #CJK UNIFIED IDEOGRAPH
+0x9B60 0x5AE3 #CJK UNIFIED IDEOGRAPH
+0x9B61 0x5AD7 #CJK UNIFIED IDEOGRAPH
+0x9B62 0x5AE6 #CJK UNIFIED IDEOGRAPH
+0x9B63 0x5AE9 #CJK UNIFIED IDEOGRAPH
+0x9B64 0x5AD6 #CJK UNIFIED IDEOGRAPH
+0x9B65 0x5AFA #CJK UNIFIED IDEOGRAPH
+0x9B66 0x5AFB #CJK UNIFIED IDEOGRAPH
+0x9B67 0x5B0C #CJK UNIFIED IDEOGRAPH
+0x9B68 0x5B0B #CJK UNIFIED IDEOGRAPH
+0x9B69 0x5B16 #CJK UNIFIED IDEOGRAPH
+0x9B6A 0x5B32 #CJK UNIFIED IDEOGRAPH
+0x9B6B 0x5AD0 #CJK UNIFIED IDEOGRAPH
+0x9B6C 0x5B2A #CJK UNIFIED IDEOGRAPH
+0x9B6D 0x5B36 #CJK UNIFIED IDEOGRAPH
+0x9B6E 0x5B3E #CJK UNIFIED IDEOGRAPH
+0x9B6F 0x5B43 #CJK UNIFIED IDEOGRAPH
+0x9B70 0x5B45 #CJK UNIFIED IDEOGRAPH
+0x9B71 0x5B40 #CJK UNIFIED IDEOGRAPH
+0x9B72 0x5B51 #CJK UNIFIED IDEOGRAPH
+0x9B73 0x5B55 #CJK UNIFIED IDEOGRAPH
+0x9B74 0x5B5A #CJK UNIFIED IDEOGRAPH
+0x9B75 0x5B5B #CJK UNIFIED IDEOGRAPH
+0x9B76 0x5B65 #CJK UNIFIED IDEOGRAPH
+0x9B77 0x5B69 #CJK UNIFIED IDEOGRAPH
+0x9B78 0x5B70 #CJK UNIFIED IDEOGRAPH
+0x9B79 0x5B73 #CJK UNIFIED IDEOGRAPH
+0x9B7A 0x5B75 #CJK UNIFIED IDEOGRAPH
+0x9B7B 0x5B78 #CJK UNIFIED IDEOGRAPH
+0x9B7C 0x6588 #CJK UNIFIED IDEOGRAPH
+0x9B7D 0x5B7A #CJK UNIFIED IDEOGRAPH
+0x9B7E 0x5B80 #CJK UNIFIED IDEOGRAPH
+0x9B80 0x5B83 #CJK UNIFIED IDEOGRAPH
+0x9B81 0x5BA6 #CJK UNIFIED IDEOGRAPH
+0x9B82 0x5BB8 #CJK UNIFIED IDEOGRAPH
+0x9B83 0x5BC3 #CJK UNIFIED IDEOGRAPH
+0x9B84 0x5BC7 #CJK UNIFIED IDEOGRAPH
+0x9B85 0x5BC9 #CJK UNIFIED IDEOGRAPH
+0x9B86 0x5BD4 #CJK UNIFIED IDEOGRAPH
+0x9B87 0x5BD0 #CJK UNIFIED IDEOGRAPH
+0x9B88 0x5BE4 #CJK UNIFIED IDEOGRAPH
+0x9B89 0x5BE6 #CJK UNIFIED IDEOGRAPH
+0x9B8A 0x5BE2 #CJK UNIFIED IDEOGRAPH
+0x9B8B 0x5BDE #CJK UNIFIED IDEOGRAPH
+0x9B8C 0x5BE5 #CJK UNIFIED IDEOGRAPH
+0x9B8D 0x5BEB #CJK UNIFIED IDEOGRAPH
+0x9B8E 0x5BF0 #CJK UNIFIED IDEOGRAPH
+0x9B8F 0x5BF6 #CJK UNIFIED IDEOGRAPH
+0x9B90 0x5BF3 #CJK UNIFIED IDEOGRAPH
+0x9B91 0x5C05 #CJK UNIFIED IDEOGRAPH
+0x9B92 0x5C07 #CJK UNIFIED IDEOGRAPH
+0x9B93 0x5C08 #CJK UNIFIED IDEOGRAPH
+0x9B94 0x5C0D #CJK UNIFIED IDEOGRAPH
+0x9B95 0x5C13 #CJK UNIFIED IDEOGRAPH
+0x9B96 0x5C20 #CJK UNIFIED IDEOGRAPH
+0x9B97 0x5C22 #CJK UNIFIED IDEOGRAPH
+0x9B98 0x5C28 #CJK UNIFIED IDEOGRAPH
+0x9B99 0x5C38 #CJK UNIFIED IDEOGRAPH
+0x9B9A 0x5C39 #CJK UNIFIED IDEOGRAPH
+0x9B9B 0x5C41 #CJK UNIFIED IDEOGRAPH
+0x9B9C 0x5C46 #CJK UNIFIED IDEOGRAPH
+0x9B9D 0x5C4E #CJK UNIFIED IDEOGRAPH
+0x9B9E 0x5C53 #CJK UNIFIED IDEOGRAPH
+0x9B9F 0x5C50 #CJK UNIFIED IDEOGRAPH
+0x9BA0 0x5C4F #CJK UNIFIED IDEOGRAPH
+0x9BA1 0x5B71 #CJK UNIFIED IDEOGRAPH
+0x9BA2 0x5C6C #CJK UNIFIED IDEOGRAPH
+0x9BA3 0x5C6E #CJK UNIFIED IDEOGRAPH
+0x9BA4 0x4E62 #CJK UNIFIED IDEOGRAPH
+0x9BA5 0x5C76 #CJK UNIFIED IDEOGRAPH
+0x9BA6 0x5C79 #CJK UNIFIED IDEOGRAPH
+0x9BA7 0x5C8C #CJK UNIFIED IDEOGRAPH
+0x9BA8 0x5C91 #CJK UNIFIED IDEOGRAPH
+0x9BA9 0x5C94 #CJK UNIFIED IDEOGRAPH
+0x9BAA 0x599B #CJK UNIFIED IDEOGRAPH
+0x9BAB 0x5CAB #CJK UNIFIED IDEOGRAPH
+0x9BAC 0x5CBB #CJK UNIFIED IDEOGRAPH
+0x9BAD 0x5CB6 #CJK UNIFIED IDEOGRAPH
+0x9BAE 0x5CBC #CJK UNIFIED IDEOGRAPH
+0x9BAF 0x5CB7 #CJK UNIFIED IDEOGRAPH
+0x9BB0 0x5CC5 #CJK UNIFIED IDEOGRAPH
+0x9BB1 0x5CBE #CJK UNIFIED IDEOGRAPH
+0x9BB2 0x5CC7 #CJK UNIFIED IDEOGRAPH
+0x9BB3 0x5CD9 #CJK UNIFIED IDEOGRAPH
+0x9BB4 0x5CE9 #CJK UNIFIED IDEOGRAPH
+0x9BB5 0x5CFD #CJK UNIFIED IDEOGRAPH
+0x9BB6 0x5CFA #CJK UNIFIED IDEOGRAPH
+0x9BB7 0x5CED #CJK UNIFIED IDEOGRAPH
+0x9BB8 0x5D8C #CJK UNIFIED IDEOGRAPH
+0x9BB9 0x5CEA #CJK UNIFIED IDEOGRAPH
+0x9BBA 0x5D0B #CJK UNIFIED IDEOGRAPH
+0x9BBB 0x5D15 #CJK UNIFIED IDEOGRAPH
+0x9BBC 0x5D17 #CJK UNIFIED IDEOGRAPH
+0x9BBD 0x5D5C #CJK UNIFIED IDEOGRAPH
+0x9BBE 0x5D1F #CJK UNIFIED IDEOGRAPH
+0x9BBF 0x5D1B #CJK UNIFIED IDEOGRAPH
+0x9BC0 0x5D11 #CJK UNIFIED IDEOGRAPH
+0x9BC1 0x5D14 #CJK UNIFIED IDEOGRAPH
+0x9BC2 0x5D22 #CJK UNIFIED IDEOGRAPH
+0x9BC3 0x5D1A #CJK UNIFIED IDEOGRAPH
+0x9BC4 0x5D19 #CJK UNIFIED IDEOGRAPH
+0x9BC5 0x5D18 #CJK UNIFIED IDEOGRAPH
+0x9BC6 0x5D4C #CJK UNIFIED IDEOGRAPH
+0x9BC7 0x5D52 #CJK UNIFIED IDEOGRAPH
+0x9BC8 0x5D4E #CJK UNIFIED IDEOGRAPH
+0x9BC9 0x5D4B #CJK UNIFIED IDEOGRAPH
+0x9BCA 0x5D6C #CJK UNIFIED IDEOGRAPH
+0x9BCB 0x5D73 #CJK UNIFIED IDEOGRAPH
+0x9BCC 0x5D76 #CJK UNIFIED IDEOGRAPH
+0x9BCD 0x5D87 #CJK UNIFIED IDEOGRAPH
+0x9BCE 0x5D84 #CJK UNIFIED IDEOGRAPH
+0x9BCF 0x5D82 #CJK UNIFIED IDEOGRAPH
+0x9BD0 0x5DA2 #CJK UNIFIED IDEOGRAPH
+0x9BD1 0x5D9D #CJK UNIFIED IDEOGRAPH
+0x9BD2 0x5DAC #CJK UNIFIED IDEOGRAPH
+0x9BD3 0x5DAE #CJK UNIFIED IDEOGRAPH
+0x9BD4 0x5DBD #CJK UNIFIED IDEOGRAPH
+0x9BD5 0x5D90 #CJK UNIFIED IDEOGRAPH
+0x9BD6 0x5DB7 #CJK UNIFIED IDEOGRAPH
+0x9BD7 0x5DBC #CJK UNIFIED IDEOGRAPH
+0x9BD8 0x5DC9 #CJK UNIFIED IDEOGRAPH
+0x9BD9 0x5DCD #CJK UNIFIED IDEOGRAPH
+0x9BDA 0x5DD3 #CJK UNIFIED IDEOGRAPH
+0x9BDB 0x5DD2 #CJK UNIFIED IDEOGRAPH
+0x9BDC 0x5DD6 #CJK UNIFIED IDEOGRAPH
+0x9BDD 0x5DDB #CJK UNIFIED IDEOGRAPH
+0x9BDE 0x5DEB #CJK UNIFIED IDEOGRAPH
+0x9BDF 0x5DF2 #CJK UNIFIED IDEOGRAPH
+0x9BE0 0x5DF5 #CJK UNIFIED IDEOGRAPH
+0x9BE1 0x5E0B #CJK UNIFIED IDEOGRAPH
+0x9BE2 0x5E1A #CJK UNIFIED IDEOGRAPH
+0x9BE3 0x5E19 #CJK UNIFIED IDEOGRAPH
+0x9BE4 0x5E11 #CJK UNIFIED IDEOGRAPH
+0x9BE5 0x5E1B #CJK UNIFIED IDEOGRAPH
+0x9BE6 0x5E36 #CJK UNIFIED IDEOGRAPH
+0x9BE7 0x5E37 #CJK UNIFIED IDEOGRAPH
+0x9BE8 0x5E44 #CJK UNIFIED IDEOGRAPH
+0x9BE9 0x5E43 #CJK UNIFIED IDEOGRAPH
+0x9BEA 0x5E40 #CJK UNIFIED IDEOGRAPH
+0x9BEB 0x5E4E #CJK UNIFIED IDEOGRAPH
+0x9BEC 0x5E57 #CJK UNIFIED IDEOGRAPH
+0x9BED 0x5E54 #CJK UNIFIED IDEOGRAPH
+0x9BEE 0x5E5F #CJK UNIFIED IDEOGRAPH
+0x9BEF 0x5E62 #CJK UNIFIED IDEOGRAPH
+0x9BF0 0x5E64 #CJK UNIFIED IDEOGRAPH
+0x9BF1 0x5E47 #CJK UNIFIED IDEOGRAPH
+0x9BF2 0x5E75 #CJK UNIFIED IDEOGRAPH
+0x9BF3 0x5E76 #CJK UNIFIED IDEOGRAPH
+0x9BF4 0x5E7A #CJK UNIFIED IDEOGRAPH
+0x9BF5 0x9EBC #CJK UNIFIED IDEOGRAPH
+0x9BF6 0x5E7F #CJK UNIFIED IDEOGRAPH
+0x9BF7 0x5EA0 #CJK UNIFIED IDEOGRAPH
+0x9BF8 0x5EC1 #CJK UNIFIED IDEOGRAPH
+0x9BF9 0x5EC2 #CJK UNIFIED IDEOGRAPH
+0x9BFA 0x5EC8 #CJK UNIFIED IDEOGRAPH
+0x9BFB 0x5ED0 #CJK UNIFIED IDEOGRAPH
+0x9BFC 0x5ECF #CJK UNIFIED IDEOGRAPH
+0x9C40 0x5ED6 #CJK UNIFIED IDEOGRAPH
+0x9C41 0x5EE3 #CJK UNIFIED IDEOGRAPH
+0x9C42 0x5EDD #CJK UNIFIED IDEOGRAPH
+0x9C43 0x5EDA #CJK UNIFIED IDEOGRAPH
+0x9C44 0x5EDB #CJK UNIFIED IDEOGRAPH
+0x9C45 0x5EE2 #CJK UNIFIED IDEOGRAPH
+0x9C46 0x5EE1 #CJK UNIFIED IDEOGRAPH
+0x9C47 0x5EE8 #CJK UNIFIED IDEOGRAPH
+0x9C48 0x5EE9 #CJK UNIFIED IDEOGRAPH
+0x9C49 0x5EEC #CJK UNIFIED IDEOGRAPH
+0x9C4A 0x5EF1 #CJK UNIFIED IDEOGRAPH
+0x9C4B 0x5EF3 #CJK UNIFIED IDEOGRAPH
+0x9C4C 0x5EF0 #CJK UNIFIED IDEOGRAPH
+0x9C4D 0x5EF4 #CJK UNIFIED IDEOGRAPH
+0x9C4E 0x5EF8 #CJK UNIFIED IDEOGRAPH
+0x9C4F 0x5EFE #CJK UNIFIED IDEOGRAPH
+0x9C50 0x5F03 #CJK UNIFIED IDEOGRAPH
+0x9C51 0x5F09 #CJK UNIFIED IDEOGRAPH
+0x9C52 0x5F5D #CJK UNIFIED IDEOGRAPH
+0x9C53 0x5F5C #CJK UNIFIED IDEOGRAPH
+0x9C54 0x5F0B #CJK UNIFIED IDEOGRAPH
+0x9C55 0x5F11 #CJK UNIFIED IDEOGRAPH
+0x9C56 0x5F16 #CJK UNIFIED IDEOGRAPH
+0x9C57 0x5F29 #CJK UNIFIED IDEOGRAPH
+0x9C58 0x5F2D #CJK UNIFIED IDEOGRAPH
+0x9C59 0x5F38 #CJK UNIFIED IDEOGRAPH
+0x9C5A 0x5F41 #CJK UNIFIED IDEOGRAPH
+0x9C5B 0x5F48 #CJK UNIFIED IDEOGRAPH
+0x9C5C 0x5F4C #CJK UNIFIED IDEOGRAPH
+0x9C5D 0x5F4E #CJK UNIFIED IDEOGRAPH
+0x9C5E 0x5F2F #CJK UNIFIED IDEOGRAPH
+0x9C5F 0x5F51 #CJK UNIFIED IDEOGRAPH
+0x9C60 0x5F56 #CJK UNIFIED IDEOGRAPH
+0x9C61 0x5F57 #CJK UNIFIED IDEOGRAPH
+0x9C62 0x5F59 #CJK UNIFIED IDEOGRAPH
+0x9C63 0x5F61 #CJK UNIFIED IDEOGRAPH
+0x9C64 0x5F6D #CJK UNIFIED IDEOGRAPH
+0x9C65 0x5F73 #CJK UNIFIED IDEOGRAPH
+0x9C66 0x5F77 #CJK UNIFIED IDEOGRAPH
+0x9C67 0x5F83 #CJK UNIFIED IDEOGRAPH
+0x9C68 0x5F82 #CJK UNIFIED IDEOGRAPH
+0x9C69 0x5F7F #CJK UNIFIED IDEOGRAPH
+0x9C6A 0x5F8A #CJK UNIFIED IDEOGRAPH
+0x9C6B 0x5F88 #CJK UNIFIED IDEOGRAPH
+0x9C6C 0x5F91 #CJK UNIFIED IDEOGRAPH
+0x9C6D 0x5F87 #CJK UNIFIED IDEOGRAPH
+0x9C6E 0x5F9E #CJK UNIFIED IDEOGRAPH
+0x9C6F 0x5F99 #CJK UNIFIED IDEOGRAPH
+0x9C70 0x5F98 #CJK UNIFIED IDEOGRAPH
+0x9C71 0x5FA0 #CJK UNIFIED IDEOGRAPH
+0x9C72 0x5FA8 #CJK UNIFIED IDEOGRAPH
+0x9C73 0x5FAD #CJK UNIFIED IDEOGRAPH
+0x9C74 0x5FBC #CJK UNIFIED IDEOGRAPH
+0x9C75 0x5FD6 #CJK UNIFIED IDEOGRAPH
+0x9C76 0x5FFB #CJK UNIFIED IDEOGRAPH
+0x9C77 0x5FE4 #CJK UNIFIED IDEOGRAPH
+0x9C78 0x5FF8 #CJK UNIFIED IDEOGRAPH
+0x9C79 0x5FF1 #CJK UNIFIED IDEOGRAPH
+0x9C7A 0x5FDD #CJK UNIFIED IDEOGRAPH
+0x9C7B 0x60B3 #CJK UNIFIED IDEOGRAPH
+0x9C7C 0x5FFF #CJK UNIFIED IDEOGRAPH
+0x9C7D 0x6021 #CJK UNIFIED IDEOGRAPH
+0x9C7E 0x6060 #CJK UNIFIED IDEOGRAPH
+0x9C80 0x6019 #CJK UNIFIED IDEOGRAPH
+0x9C81 0x6010 #CJK UNIFIED IDEOGRAPH
+0x9C82 0x6029 #CJK UNIFIED IDEOGRAPH
+0x9C83 0x600E #CJK UNIFIED IDEOGRAPH
+0x9C84 0x6031 #CJK UNIFIED IDEOGRAPH
+0x9C85 0x601B #CJK UNIFIED IDEOGRAPH
+0x9C86 0x6015 #CJK UNIFIED IDEOGRAPH
+0x9C87 0x602B #CJK UNIFIED IDEOGRAPH
+0x9C88 0x6026 #CJK UNIFIED IDEOGRAPH
+0x9C89 0x600F #CJK UNIFIED IDEOGRAPH
+0x9C8A 0x603A #CJK UNIFIED IDEOGRAPH
+0x9C8B 0x605A #CJK UNIFIED IDEOGRAPH
+0x9C8C 0x6041 #CJK UNIFIED IDEOGRAPH
+0x9C8D 0x606A #CJK UNIFIED IDEOGRAPH
+0x9C8E 0x6077 #CJK UNIFIED IDEOGRAPH
+0x9C8F 0x605F #CJK UNIFIED IDEOGRAPH
+0x9C90 0x604A #CJK UNIFIED IDEOGRAPH
+0x9C91 0x6046 #CJK UNIFIED IDEOGRAPH
+0x9C92 0x604D #CJK UNIFIED IDEOGRAPH
+0x9C93 0x6063 #CJK UNIFIED IDEOGRAPH
+0x9C94 0x6043 #CJK UNIFIED IDEOGRAPH
+0x9C95 0x6064 #CJK UNIFIED IDEOGRAPH
+0x9C96 0x6042 #CJK UNIFIED IDEOGRAPH
+0x9C97 0x606C #CJK UNIFIED IDEOGRAPH
+0x9C98 0x606B #CJK UNIFIED IDEOGRAPH
+0x9C99 0x6059 #CJK UNIFIED IDEOGRAPH
+0x9C9A 0x6081 #CJK UNIFIED IDEOGRAPH
+0x9C9B 0x608D #CJK UNIFIED IDEOGRAPH
+0x9C9C 0x60E7 #CJK UNIFIED IDEOGRAPH
+0x9C9D 0x6083 #CJK UNIFIED IDEOGRAPH
+0x9C9E 0x609A #CJK UNIFIED IDEOGRAPH
+0x9C9F 0x6084 #CJK UNIFIED IDEOGRAPH
+0x9CA0 0x609B #CJK UNIFIED IDEOGRAPH
+0x9CA1 0x6096 #CJK UNIFIED IDEOGRAPH
+0x9CA2 0x6097 #CJK UNIFIED IDEOGRAPH
+0x9CA3 0x6092 #CJK UNIFIED IDEOGRAPH
+0x9CA4 0x60A7 #CJK UNIFIED IDEOGRAPH
+0x9CA5 0x608B #CJK UNIFIED IDEOGRAPH
+0x9CA6 0x60E1 #CJK UNIFIED IDEOGRAPH
+0x9CA7 0x60B8 #CJK UNIFIED IDEOGRAPH
+0x9CA8 0x60E0 #CJK UNIFIED IDEOGRAPH
+0x9CA9 0x60D3 #CJK UNIFIED IDEOGRAPH
+0x9CAA 0x60B4 #CJK UNIFIED IDEOGRAPH
+0x9CAB 0x5FF0 #CJK UNIFIED IDEOGRAPH
+0x9CAC 0x60BD #CJK UNIFIED IDEOGRAPH
+0x9CAD 0x60C6 #CJK UNIFIED IDEOGRAPH
+0x9CAE 0x60B5 #CJK UNIFIED IDEOGRAPH
+0x9CAF 0x60D8 #CJK UNIFIED IDEOGRAPH
+0x9CB0 0x614D #CJK UNIFIED IDEOGRAPH
+0x9CB1 0x6115 #CJK UNIFIED IDEOGRAPH
+0x9CB2 0x6106 #CJK UNIFIED IDEOGRAPH
+0x9CB3 0x60F6 #CJK UNIFIED IDEOGRAPH
+0x9CB4 0x60F7 #CJK UNIFIED IDEOGRAPH
+0x9CB5 0x6100 #CJK UNIFIED IDEOGRAPH
+0x9CB6 0x60F4 #CJK UNIFIED IDEOGRAPH
+0x9CB7 0x60FA #CJK UNIFIED IDEOGRAPH
+0x9CB8 0x6103 #CJK UNIFIED IDEOGRAPH
+0x9CB9 0x6121 #CJK UNIFIED IDEOGRAPH
+0x9CBA 0x60FB #CJK UNIFIED IDEOGRAPH
+0x9CBB 0x60F1 #CJK UNIFIED IDEOGRAPH
+0x9CBC 0x610D #CJK UNIFIED IDEOGRAPH
+0x9CBD 0x610E #CJK UNIFIED IDEOGRAPH
+0x9CBE 0x6147 #CJK UNIFIED IDEOGRAPH
+0x9CBF 0x613E #CJK UNIFIED IDEOGRAPH
+0x9CC0 0x6128 #CJK UNIFIED IDEOGRAPH
+0x9CC1 0x6127 #CJK UNIFIED IDEOGRAPH
+0x9CC2 0x614A #CJK UNIFIED IDEOGRAPH
+0x9CC3 0x613F #CJK UNIFIED IDEOGRAPH
+0x9CC4 0x613C #CJK UNIFIED IDEOGRAPH
+0x9CC5 0x612C #CJK UNIFIED IDEOGRAPH
+0x9CC6 0x6134 #CJK UNIFIED IDEOGRAPH
+0x9CC7 0x613D #CJK UNIFIED IDEOGRAPH
+0x9CC8 0x6142 #CJK UNIFIED IDEOGRAPH
+0x9CC9 0x6144 #CJK UNIFIED IDEOGRAPH
+0x9CCA 0x6173 #CJK UNIFIED IDEOGRAPH
+0x9CCB 0x6177 #CJK UNIFIED IDEOGRAPH
+0x9CCC 0x6158 #CJK UNIFIED IDEOGRAPH
+0x9CCD 0x6159 #CJK UNIFIED IDEOGRAPH
+0x9CCE 0x615A #CJK UNIFIED IDEOGRAPH
+0x9CCF 0x616B #CJK UNIFIED IDEOGRAPH
+0x9CD0 0x6174 #CJK UNIFIED IDEOGRAPH
+0x9CD1 0x616F #CJK UNIFIED IDEOGRAPH
+0x9CD2 0x6165 #CJK UNIFIED IDEOGRAPH
+0x9CD3 0x6171 #CJK UNIFIED IDEOGRAPH
+0x9CD4 0x615F #CJK UNIFIED IDEOGRAPH
+0x9CD5 0x615D #CJK UNIFIED IDEOGRAPH
+0x9CD6 0x6153 #CJK UNIFIED IDEOGRAPH
+0x9CD7 0x6175 #CJK UNIFIED IDEOGRAPH
+0x9CD8 0x6199 #CJK UNIFIED IDEOGRAPH
+0x9CD9 0x6196 #CJK UNIFIED IDEOGRAPH
+0x9CDA 0x6187 #CJK UNIFIED IDEOGRAPH
+0x9CDB 0x61AC #CJK UNIFIED IDEOGRAPH
+0x9CDC 0x6194 #CJK UNIFIED IDEOGRAPH
+0x9CDD 0x619A #CJK UNIFIED IDEOGRAPH
+0x9CDE 0x618A #CJK UNIFIED IDEOGRAPH
+0x9CDF 0x6191 #CJK UNIFIED IDEOGRAPH
+0x9CE0 0x61AB #CJK UNIFIED IDEOGRAPH
+0x9CE1 0x61AE #CJK UNIFIED IDEOGRAPH
+0x9CE2 0x61CC #CJK UNIFIED IDEOGRAPH
+0x9CE3 0x61CA #CJK UNIFIED IDEOGRAPH
+0x9CE4 0x61C9 #CJK UNIFIED IDEOGRAPH
+0x9CE5 0x61F7 #CJK UNIFIED IDEOGRAPH
+0x9CE6 0x61C8 #CJK UNIFIED IDEOGRAPH
+0x9CE7 0x61C3 #CJK UNIFIED IDEOGRAPH
+0x9CE8 0x61C6 #CJK UNIFIED IDEOGRAPH
+0x9CE9 0x61BA #CJK UNIFIED IDEOGRAPH
+0x9CEA 0x61CB #CJK UNIFIED IDEOGRAPH
+0x9CEB 0x7F79 #CJK UNIFIED IDEOGRAPH
+0x9CEC 0x61CD #CJK UNIFIED IDEOGRAPH
+0x9CED 0x61E6 #CJK UNIFIED IDEOGRAPH
+0x9CEE 0x61E3 #CJK UNIFIED IDEOGRAPH
+0x9CEF 0x61F6 #CJK UNIFIED IDEOGRAPH
+0x9CF0 0x61FA #CJK UNIFIED IDEOGRAPH
+0x9CF1 0x61F4 #CJK UNIFIED IDEOGRAPH
+0x9CF2 0x61FF #CJK UNIFIED IDEOGRAPH
+0x9CF3 0x61FD #CJK UNIFIED IDEOGRAPH
+0x9CF4 0x61FC #CJK UNIFIED IDEOGRAPH
+0x9CF5 0x61FE #CJK UNIFIED IDEOGRAPH
+0x9CF6 0x6200 #CJK UNIFIED IDEOGRAPH
+0x9CF7 0x6208 #CJK UNIFIED IDEOGRAPH
+0x9CF8 0x6209 #CJK UNIFIED IDEOGRAPH
+0x9CF9 0x620D #CJK UNIFIED IDEOGRAPH
+0x9CFA 0x620C #CJK UNIFIED IDEOGRAPH
+0x9CFB 0x6214 #CJK UNIFIED IDEOGRAPH
+0x9CFC 0x621B #CJK UNIFIED IDEOGRAPH
+0x9D40 0x621E #CJK UNIFIED IDEOGRAPH
+0x9D41 0x6221 #CJK UNIFIED IDEOGRAPH
+0x9D42 0x622A #CJK UNIFIED IDEOGRAPH
+0x9D43 0x622E #CJK UNIFIED IDEOGRAPH
+0x9D44 0x6230 #CJK UNIFIED IDEOGRAPH
+0x9D45 0x6232 #CJK UNIFIED IDEOGRAPH
+0x9D46 0x6233 #CJK UNIFIED IDEOGRAPH
+0x9D47 0x6241 #CJK UNIFIED IDEOGRAPH
+0x9D48 0x624E #CJK UNIFIED IDEOGRAPH
+0x9D49 0x625E #CJK UNIFIED IDEOGRAPH
+0x9D4A 0x6263 #CJK UNIFIED IDEOGRAPH
+0x9D4B 0x625B #CJK UNIFIED IDEOGRAPH
+0x9D4C 0x6260 #CJK UNIFIED IDEOGRAPH
+0x9D4D 0x6268 #CJK UNIFIED IDEOGRAPH
+0x9D4E 0x627C #CJK UNIFIED IDEOGRAPH
+0x9D4F 0x6282 #CJK UNIFIED IDEOGRAPH
+0x9D50 0x6289 #CJK UNIFIED IDEOGRAPH
+0x9D51 0x627E #CJK UNIFIED IDEOGRAPH
+0x9D52 0x6292 #CJK UNIFIED IDEOGRAPH
+0x9D53 0x6293 #CJK UNIFIED IDEOGRAPH
+0x9D54 0x6296 #CJK UNIFIED IDEOGRAPH
+0x9D55 0x62D4 #CJK UNIFIED IDEOGRAPH
+0x9D56 0x6283 #CJK UNIFIED IDEOGRAPH
+0x9D57 0x6294 #CJK UNIFIED IDEOGRAPH
+0x9D58 0x62D7 #CJK UNIFIED IDEOGRAPH
+0x9D59 0x62D1 #CJK UNIFIED IDEOGRAPH
+0x9D5A 0x62BB #CJK UNIFIED IDEOGRAPH
+0x9D5B 0x62CF #CJK UNIFIED IDEOGRAPH
+0x9D5C 0x62FF #CJK UNIFIED IDEOGRAPH
+0x9D5D 0x62C6 #CJK UNIFIED IDEOGRAPH
+0x9D5E 0x64D4 #CJK UNIFIED IDEOGRAPH
+0x9D5F 0x62C8 #CJK UNIFIED IDEOGRAPH
+0x9D60 0x62DC #CJK UNIFIED IDEOGRAPH
+0x9D61 0x62CC #CJK UNIFIED IDEOGRAPH
+0x9D62 0x62CA #CJK UNIFIED IDEOGRAPH
+0x9D63 0x62C2 #CJK UNIFIED IDEOGRAPH
+0x9D64 0x62C7 #CJK UNIFIED IDEOGRAPH
+0x9D65 0x629B #CJK UNIFIED IDEOGRAPH
+0x9D66 0x62C9 #CJK UNIFIED IDEOGRAPH
+0x9D67 0x630C #CJK UNIFIED IDEOGRAPH
+0x9D68 0x62EE #CJK UNIFIED IDEOGRAPH
+0x9D69 0x62F1 #CJK UNIFIED IDEOGRAPH
+0x9D6A 0x6327 #CJK UNIFIED IDEOGRAPH
+0x9D6B 0x6302 #CJK UNIFIED IDEOGRAPH
+0x9D6C 0x6308 #CJK UNIFIED IDEOGRAPH
+0x9D6D 0x62EF #CJK UNIFIED IDEOGRAPH
+0x9D6E 0x62F5 #CJK UNIFIED IDEOGRAPH
+0x9D6F 0x6350 #CJK UNIFIED IDEOGRAPH
+0x9D70 0x633E #CJK UNIFIED IDEOGRAPH
+0x9D71 0x634D #CJK UNIFIED IDEOGRAPH
+0x9D72 0x641C #CJK UNIFIED IDEOGRAPH
+0x9D73 0x634F #CJK UNIFIED IDEOGRAPH
+0x9D74 0x6396 #CJK UNIFIED IDEOGRAPH
+0x9D75 0x638E #CJK UNIFIED IDEOGRAPH
+0x9D76 0x6380 #CJK UNIFIED IDEOGRAPH
+0x9D77 0x63AB #CJK UNIFIED IDEOGRAPH
+0x9D78 0x6376 #CJK UNIFIED IDEOGRAPH
+0x9D79 0x63A3 #CJK UNIFIED IDEOGRAPH
+0x9D7A 0x638F #CJK UNIFIED IDEOGRAPH
+0x9D7B 0x6389 #CJK UNIFIED IDEOGRAPH
+0x9D7C 0x639F #CJK UNIFIED IDEOGRAPH
+0x9D7D 0x63B5 #CJK UNIFIED IDEOGRAPH
+0x9D7E 0x636B #CJK UNIFIED IDEOGRAPH
+0x9D80 0x6369 #CJK UNIFIED IDEOGRAPH
+0x9D81 0x63BE #CJK UNIFIED IDEOGRAPH
+0x9D82 0x63E9 #CJK UNIFIED IDEOGRAPH
+0x9D83 0x63C0 #CJK UNIFIED IDEOGRAPH
+0x9D84 0x63C6 #CJK UNIFIED IDEOGRAPH
+0x9D85 0x63E3 #CJK UNIFIED IDEOGRAPH
+0x9D86 0x63C9 #CJK UNIFIED IDEOGRAPH
+0x9D87 0x63D2 #CJK UNIFIED IDEOGRAPH
+0x9D88 0x63F6 #CJK UNIFIED IDEOGRAPH
+0x9D89 0x63C4 #CJK UNIFIED IDEOGRAPH
+0x9D8A 0x6416 #CJK UNIFIED IDEOGRAPH
+0x9D8B 0x6434 #CJK UNIFIED IDEOGRAPH
+0x9D8C 0x6406 #CJK UNIFIED IDEOGRAPH
+0x9D8D 0x6413 #CJK UNIFIED IDEOGRAPH
+0x9D8E 0x6426 #CJK UNIFIED IDEOGRAPH
+0x9D8F 0x6436 #CJK UNIFIED IDEOGRAPH
+0x9D90 0x651D #CJK UNIFIED IDEOGRAPH
+0x9D91 0x6417 #CJK UNIFIED IDEOGRAPH
+0x9D92 0x6428 #CJK UNIFIED IDEOGRAPH
+0x9D93 0x640F #CJK UNIFIED IDEOGRAPH
+0x9D94 0x6467 #CJK UNIFIED IDEOGRAPH
+0x9D95 0x646F #CJK UNIFIED IDEOGRAPH
+0x9D96 0x6476 #CJK UNIFIED IDEOGRAPH
+0x9D97 0x644E #CJK UNIFIED IDEOGRAPH
+0x9D98 0x652A #CJK UNIFIED IDEOGRAPH
+0x9D99 0x6495 #CJK UNIFIED IDEOGRAPH
+0x9D9A 0x6493 #CJK UNIFIED IDEOGRAPH
+0x9D9B 0x64A5 #CJK UNIFIED IDEOGRAPH
+0x9D9C 0x64A9 #CJK UNIFIED IDEOGRAPH
+0x9D9D 0x6488 #CJK UNIFIED IDEOGRAPH
+0x9D9E 0x64BC #CJK UNIFIED IDEOGRAPH
+0x9D9F 0x64DA #CJK UNIFIED IDEOGRAPH
+0x9DA0 0x64D2 #CJK UNIFIED IDEOGRAPH
+0x9DA1 0x64C5 #CJK UNIFIED IDEOGRAPH
+0x9DA2 0x64C7 #CJK UNIFIED IDEOGRAPH
+0x9DA3 0x64BB #CJK UNIFIED IDEOGRAPH
+0x9DA4 0x64D8 #CJK UNIFIED IDEOGRAPH
+0x9DA5 0x64C2 #CJK UNIFIED IDEOGRAPH
+0x9DA6 0x64F1 #CJK UNIFIED IDEOGRAPH
+0x9DA7 0x64E7 #CJK UNIFIED IDEOGRAPH
+0x9DA8 0x8209 #CJK UNIFIED IDEOGRAPH
+0x9DA9 0x64E0 #CJK UNIFIED IDEOGRAPH
+0x9DAA 0x64E1 #CJK UNIFIED IDEOGRAPH
+0x9DAB 0x62AC #CJK UNIFIED IDEOGRAPH
+0x9DAC 0x64E3 #CJK UNIFIED IDEOGRAPH
+0x9DAD 0x64EF #CJK UNIFIED IDEOGRAPH
+0x9DAE 0x652C #CJK UNIFIED IDEOGRAPH
+0x9DAF 0x64F6 #CJK UNIFIED IDEOGRAPH
+0x9DB0 0x64F4 #CJK UNIFIED IDEOGRAPH
+0x9DB1 0x64F2 #CJK UNIFIED IDEOGRAPH
+0x9DB2 0x64FA #CJK UNIFIED IDEOGRAPH
+0x9DB3 0x6500 #CJK UNIFIED IDEOGRAPH
+0x9DB4 0x64FD #CJK UNIFIED IDEOGRAPH
+0x9DB5 0x6518 #CJK UNIFIED IDEOGRAPH
+0x9DB6 0x651C #CJK UNIFIED IDEOGRAPH
+0x9DB7 0x6505 #CJK UNIFIED IDEOGRAPH
+0x9DB8 0x6524 #CJK UNIFIED IDEOGRAPH
+0x9DB9 0x6523 #CJK UNIFIED IDEOGRAPH
+0x9DBA 0x652B #CJK UNIFIED IDEOGRAPH
+0x9DBB 0x6534 #CJK UNIFIED IDEOGRAPH
+0x9DBC 0x6535 #CJK UNIFIED IDEOGRAPH
+0x9DBD 0x6537 #CJK UNIFIED IDEOGRAPH
+0x9DBE 0x6536 #CJK UNIFIED IDEOGRAPH
+0x9DBF 0x6538 #CJK UNIFIED IDEOGRAPH
+0x9DC0 0x754B #CJK UNIFIED IDEOGRAPH
+0x9DC1 0x6548 #CJK UNIFIED IDEOGRAPH
+0x9DC2 0x6556 #CJK UNIFIED IDEOGRAPH
+0x9DC3 0x6555 #CJK UNIFIED IDEOGRAPH
+0x9DC4 0x654D #CJK UNIFIED IDEOGRAPH
+0x9DC5 0x6558 #CJK UNIFIED IDEOGRAPH
+0x9DC6 0x655E #CJK UNIFIED IDEOGRAPH
+0x9DC7 0x655D #CJK UNIFIED IDEOGRAPH
+0x9DC8 0x6572 #CJK UNIFIED IDEOGRAPH
+0x9DC9 0x6578 #CJK UNIFIED IDEOGRAPH
+0x9DCA 0x6582 #CJK UNIFIED IDEOGRAPH
+0x9DCB 0x6583 #CJK UNIFIED IDEOGRAPH
+0x9DCC 0x8B8A #CJK UNIFIED IDEOGRAPH
+0x9DCD 0x659B #CJK UNIFIED IDEOGRAPH
+0x9DCE 0x659F #CJK UNIFIED IDEOGRAPH
+0x9DCF 0x65AB #CJK UNIFIED IDEOGRAPH
+0x9DD0 0x65B7 #CJK UNIFIED IDEOGRAPH
+0x9DD1 0x65C3 #CJK UNIFIED IDEOGRAPH
+0x9DD2 0x65C6 #CJK UNIFIED IDEOGRAPH
+0x9DD3 0x65C1 #CJK UNIFIED IDEOGRAPH
+0x9DD4 0x65C4 #CJK UNIFIED IDEOGRAPH
+0x9DD5 0x65CC #CJK UNIFIED IDEOGRAPH
+0x9DD6 0x65D2 #CJK UNIFIED IDEOGRAPH
+0x9DD7 0x65DB #CJK UNIFIED IDEOGRAPH
+0x9DD8 0x65D9 #CJK UNIFIED IDEOGRAPH
+0x9DD9 0x65E0 #CJK UNIFIED IDEOGRAPH
+0x9DDA 0x65E1 #CJK UNIFIED IDEOGRAPH
+0x9DDB 0x65F1 #CJK UNIFIED IDEOGRAPH
+0x9DDC 0x6772 #CJK UNIFIED IDEOGRAPH
+0x9DDD 0x660A #CJK UNIFIED IDEOGRAPH
+0x9DDE 0x6603 #CJK UNIFIED IDEOGRAPH
+0x9DDF 0x65FB #CJK UNIFIED IDEOGRAPH
+0x9DE0 0x6773 #CJK UNIFIED IDEOGRAPH
+0x9DE1 0x6635 #CJK UNIFIED IDEOGRAPH
+0x9DE2 0x6636 #CJK UNIFIED IDEOGRAPH
+0x9DE3 0x6634 #CJK UNIFIED IDEOGRAPH
+0x9DE4 0x661C #CJK UNIFIED IDEOGRAPH
+0x9DE5 0x664F #CJK UNIFIED IDEOGRAPH
+0x9DE6 0x6644 #CJK UNIFIED IDEOGRAPH
+0x9DE7 0x6649 #CJK UNIFIED IDEOGRAPH
+0x9DE8 0x6641 #CJK UNIFIED IDEOGRAPH
+0x9DE9 0x665E #CJK UNIFIED IDEOGRAPH
+0x9DEA 0x665D #CJK UNIFIED IDEOGRAPH
+0x9DEB 0x6664 #CJK UNIFIED IDEOGRAPH
+0x9DEC 0x6667 #CJK UNIFIED IDEOGRAPH
+0x9DED 0x6668 #CJK UNIFIED IDEOGRAPH
+0x9DEE 0x665F #CJK UNIFIED IDEOGRAPH
+0x9DEF 0x6662 #CJK UNIFIED IDEOGRAPH
+0x9DF0 0x6670 #CJK UNIFIED IDEOGRAPH
+0x9DF1 0x6683 #CJK UNIFIED IDEOGRAPH
+0x9DF2 0x6688 #CJK UNIFIED IDEOGRAPH
+0x9DF3 0x668E #CJK UNIFIED IDEOGRAPH
+0x9DF4 0x6689 #CJK UNIFIED IDEOGRAPH
+0x9DF5 0x6684 #CJK UNIFIED IDEOGRAPH
+0x9DF6 0x6698 #CJK UNIFIED IDEOGRAPH
+0x9DF7 0x669D #CJK UNIFIED IDEOGRAPH
+0x9DF8 0x66C1 #CJK UNIFIED IDEOGRAPH
+0x9DF9 0x66B9 #CJK UNIFIED IDEOGRAPH
+0x9DFA 0x66C9 #CJK UNIFIED IDEOGRAPH
+0x9DFB 0x66BE #CJK UNIFIED IDEOGRAPH
+0x9DFC 0x66BC #CJK UNIFIED IDEOGRAPH
+0x9E40 0x66C4 #CJK UNIFIED IDEOGRAPH
+0x9E41 0x66B8 #CJK UNIFIED IDEOGRAPH
+0x9E42 0x66D6 #CJK UNIFIED IDEOGRAPH
+0x9E43 0x66DA #CJK UNIFIED IDEOGRAPH
+0x9E44 0x66E0 #CJK UNIFIED IDEOGRAPH
+0x9E45 0x663F #CJK UNIFIED IDEOGRAPH
+0x9E46 0x66E6 #CJK UNIFIED IDEOGRAPH
+0x9E47 0x66E9 #CJK UNIFIED IDEOGRAPH
+0x9E48 0x66F0 #CJK UNIFIED IDEOGRAPH
+0x9E49 0x66F5 #CJK UNIFIED IDEOGRAPH
+0x9E4A 0x66F7 #CJK UNIFIED IDEOGRAPH
+0x9E4B 0x670F #CJK UNIFIED IDEOGRAPH
+0x9E4C 0x6716 #CJK UNIFIED IDEOGRAPH
+0x9E4D 0x671E #CJK UNIFIED IDEOGRAPH
+0x9E4E 0x6726 #CJK UNIFIED IDEOGRAPH
+0x9E4F 0x6727 #CJK UNIFIED IDEOGRAPH
+0x9E50 0x9738 #CJK UNIFIED IDEOGRAPH
+0x9E51 0x672E #CJK UNIFIED IDEOGRAPH
+0x9E52 0x673F #CJK UNIFIED IDEOGRAPH
+0x9E53 0x6736 #CJK UNIFIED IDEOGRAPH
+0x9E54 0x6741 #CJK UNIFIED IDEOGRAPH
+0x9E55 0x6738 #CJK UNIFIED IDEOGRAPH
+0x9E56 0x6737 #CJK UNIFIED IDEOGRAPH
+0x9E57 0x6746 #CJK UNIFIED IDEOGRAPH
+0x9E58 0x675E #CJK UNIFIED IDEOGRAPH
+0x9E59 0x6760 #CJK UNIFIED IDEOGRAPH
+0x9E5A 0x6759 #CJK UNIFIED IDEOGRAPH
+0x9E5B 0x6763 #CJK UNIFIED IDEOGRAPH
+0x9E5C 0x6764 #CJK UNIFIED IDEOGRAPH
+0x9E5D 0x6789 #CJK UNIFIED IDEOGRAPH
+0x9E5E 0x6770 #CJK UNIFIED IDEOGRAPH
+0x9E5F 0x67A9 #CJK UNIFIED IDEOGRAPH
+0x9E60 0x677C #CJK UNIFIED IDEOGRAPH
+0x9E61 0x676A #CJK UNIFIED IDEOGRAPH
+0x9E62 0x678C #CJK UNIFIED IDEOGRAPH
+0x9E63 0x678B #CJK UNIFIED IDEOGRAPH
+0x9E64 0x67A6 #CJK UNIFIED IDEOGRAPH
+0x9E65 0x67A1 #CJK UNIFIED IDEOGRAPH
+0x9E66 0x6785 #CJK UNIFIED IDEOGRAPH
+0x9E67 0x67B7 #CJK UNIFIED IDEOGRAPH
+0x9E68 0x67EF #CJK UNIFIED IDEOGRAPH
+0x9E69 0x67B4 #CJK UNIFIED IDEOGRAPH
+0x9E6A 0x67EC #CJK UNIFIED IDEOGRAPH
+0x9E6B 0x67B3 #CJK UNIFIED IDEOGRAPH
+0x9E6C 0x67E9 #CJK UNIFIED IDEOGRAPH
+0x9E6D 0x67B8 #CJK UNIFIED IDEOGRAPH
+0x9E6E 0x67E4 #CJK UNIFIED IDEOGRAPH
+0x9E6F 0x67DE #CJK UNIFIED IDEOGRAPH
+0x9E70 0x67DD #CJK UNIFIED IDEOGRAPH
+0x9E71 0x67E2 #CJK UNIFIED IDEOGRAPH
+0x9E72 0x67EE #CJK UNIFIED IDEOGRAPH
+0x9E73 0x67B9 #CJK UNIFIED IDEOGRAPH
+0x9E74 0x67CE #CJK UNIFIED IDEOGRAPH
+0x9E75 0x67C6 #CJK UNIFIED IDEOGRAPH
+0x9E76 0x67E7 #CJK UNIFIED IDEOGRAPH
+0x9E77 0x6A9C #CJK UNIFIED IDEOGRAPH
+0x9E78 0x681E #CJK UNIFIED IDEOGRAPH
+0x9E79 0x6846 #CJK UNIFIED IDEOGRAPH
+0x9E7A 0x6829 #CJK UNIFIED IDEOGRAPH
+0x9E7B 0x6840 #CJK UNIFIED IDEOGRAPH
+0x9E7C 0x684D #CJK UNIFIED IDEOGRAPH
+0x9E7D 0x6832 #CJK UNIFIED IDEOGRAPH
+0x9E7E 0x684E #CJK UNIFIED IDEOGRAPH
+0x9E80 0x68B3 #CJK UNIFIED IDEOGRAPH
+0x9E81 0x682B #CJK UNIFIED IDEOGRAPH
+0x9E82 0x6859 #CJK UNIFIED IDEOGRAPH
+0x9E83 0x6863 #CJK UNIFIED IDEOGRAPH
+0x9E84 0x6877 #CJK UNIFIED IDEOGRAPH
+0x9E85 0x687F #CJK UNIFIED IDEOGRAPH
+0x9E86 0x689F #CJK UNIFIED IDEOGRAPH
+0x9E87 0x688F #CJK UNIFIED IDEOGRAPH
+0x9E88 0x68AD #CJK UNIFIED IDEOGRAPH
+0x9E89 0x6894 #CJK UNIFIED IDEOGRAPH
+0x9E8A 0x689D #CJK UNIFIED IDEOGRAPH
+0x9E8B 0x689B #CJK UNIFIED IDEOGRAPH
+0x9E8C 0x6883 #CJK UNIFIED IDEOGRAPH
+0x9E8D 0x6AAE #CJK UNIFIED IDEOGRAPH
+0x9E8E 0x68B9 #CJK UNIFIED IDEOGRAPH
+0x9E8F 0x6874 #CJK UNIFIED IDEOGRAPH
+0x9E90 0x68B5 #CJK UNIFIED IDEOGRAPH
+0x9E91 0x68A0 #CJK UNIFIED IDEOGRAPH
+0x9E92 0x68BA #CJK UNIFIED IDEOGRAPH
+0x9E93 0x690F #CJK UNIFIED IDEOGRAPH
+0x9E94 0x688D #CJK UNIFIED IDEOGRAPH
+0x9E95 0x687E #CJK UNIFIED IDEOGRAPH
+0x9E96 0x6901 #CJK UNIFIED IDEOGRAPH
+0x9E97 0x68CA #CJK UNIFIED IDEOGRAPH
+0x9E98 0x6908 #CJK UNIFIED IDEOGRAPH
+0x9E99 0x68D8 #CJK UNIFIED IDEOGRAPH
+0x9E9A 0x6922 #CJK UNIFIED IDEOGRAPH
+0x9E9B 0x6926 #CJK UNIFIED IDEOGRAPH
+0x9E9C 0x68E1 #CJK UNIFIED IDEOGRAPH
+0x9E9D 0x690C #CJK UNIFIED IDEOGRAPH
+0x9E9E 0x68CD #CJK UNIFIED IDEOGRAPH
+0x9E9F 0x68D4 #CJK UNIFIED IDEOGRAPH
+0x9EA0 0x68E7 #CJK UNIFIED IDEOGRAPH
+0x9EA1 0x68D5 #CJK UNIFIED IDEOGRAPH
+0x9EA2 0x6936 #CJK UNIFIED IDEOGRAPH
+0x9EA3 0x6912 #CJK UNIFIED IDEOGRAPH
+0x9EA4 0x6904 #CJK UNIFIED IDEOGRAPH
+0x9EA5 0x68D7 #CJK UNIFIED IDEOGRAPH
+0x9EA6 0x68E3 #CJK UNIFIED IDEOGRAPH
+0x9EA7 0x6925 #CJK UNIFIED IDEOGRAPH
+0x9EA8 0x68F9 #CJK UNIFIED IDEOGRAPH
+0x9EA9 0x68E0 #CJK UNIFIED IDEOGRAPH
+0x9EAA 0x68EF #CJK UNIFIED IDEOGRAPH
+0x9EAB 0x6928 #CJK UNIFIED IDEOGRAPH
+0x9EAC 0x692A #CJK UNIFIED IDEOGRAPH
+0x9EAD 0x691A #CJK UNIFIED IDEOGRAPH
+0x9EAE 0x6923 #CJK UNIFIED IDEOGRAPH
+0x9EAF 0x6921 #CJK UNIFIED IDEOGRAPH
+0x9EB0 0x68C6 #CJK UNIFIED IDEOGRAPH
+0x9EB1 0x6979 #CJK UNIFIED IDEOGRAPH
+0x9EB2 0x6977 #CJK UNIFIED IDEOGRAPH
+0x9EB3 0x695C #CJK UNIFIED IDEOGRAPH
+0x9EB4 0x6978 #CJK UNIFIED IDEOGRAPH
+0x9EB5 0x696B #CJK UNIFIED IDEOGRAPH
+0x9EB6 0x6954 #CJK UNIFIED IDEOGRAPH
+0x9EB7 0x697E #CJK UNIFIED IDEOGRAPH
+0x9EB8 0x696E #CJK UNIFIED IDEOGRAPH
+0x9EB9 0x6939 #CJK UNIFIED IDEOGRAPH
+0x9EBA 0x6974 #CJK UNIFIED IDEOGRAPH
+0x9EBB 0x693D #CJK UNIFIED IDEOGRAPH
+0x9EBC 0x6959 #CJK UNIFIED IDEOGRAPH
+0x9EBD 0x6930 #CJK UNIFIED IDEOGRAPH
+0x9EBE 0x6961 #CJK UNIFIED IDEOGRAPH
+0x9EBF 0x695E #CJK UNIFIED IDEOGRAPH
+0x9EC0 0x695D #CJK UNIFIED IDEOGRAPH
+0x9EC1 0x6981 #CJK UNIFIED IDEOGRAPH
+0x9EC2 0x696A #CJK UNIFIED IDEOGRAPH
+0x9EC3 0x69B2 #CJK UNIFIED IDEOGRAPH
+0x9EC4 0x69AE #CJK UNIFIED IDEOGRAPH
+0x9EC5 0x69D0 #CJK UNIFIED IDEOGRAPH
+0x9EC6 0x69BF #CJK UNIFIED IDEOGRAPH
+0x9EC7 0x69C1 #CJK UNIFIED IDEOGRAPH
+0x9EC8 0x69D3 #CJK UNIFIED IDEOGRAPH
+0x9EC9 0x69BE #CJK UNIFIED IDEOGRAPH
+0x9ECA 0x69CE #CJK UNIFIED IDEOGRAPH
+0x9ECB 0x5BE8 #CJK UNIFIED IDEOGRAPH
+0x9ECC 0x69CA #CJK UNIFIED IDEOGRAPH
+0x9ECD 0x69DD #CJK UNIFIED IDEOGRAPH
+0x9ECE 0x69BB #CJK UNIFIED IDEOGRAPH
+0x9ECF 0x69C3 #CJK UNIFIED IDEOGRAPH
+0x9ED0 0x69A7 #CJK UNIFIED IDEOGRAPH
+0x9ED1 0x6A2E #CJK UNIFIED IDEOGRAPH
+0x9ED2 0x6991 #CJK UNIFIED IDEOGRAPH
+0x9ED3 0x69A0 #CJK UNIFIED IDEOGRAPH
+0x9ED4 0x699C #CJK UNIFIED IDEOGRAPH
+0x9ED5 0x6995 #CJK UNIFIED IDEOGRAPH
+0x9ED6 0x69B4 #CJK UNIFIED IDEOGRAPH
+0x9ED7 0x69DE #CJK UNIFIED IDEOGRAPH
+0x9ED8 0x69E8 #CJK UNIFIED IDEOGRAPH
+0x9ED9 0x6A02 #CJK UNIFIED IDEOGRAPH
+0x9EDA 0x6A1B #CJK UNIFIED IDEOGRAPH
+0x9EDB 0x69FF #CJK UNIFIED IDEOGRAPH
+0x9EDC 0x6B0A #CJK UNIFIED IDEOGRAPH
+0x9EDD 0x69F9 #CJK UNIFIED IDEOGRAPH
+0x9EDE 0x69F2 #CJK UNIFIED IDEOGRAPH
+0x9EDF 0x69E7 #CJK UNIFIED IDEOGRAPH
+0x9EE0 0x6A05 #CJK UNIFIED IDEOGRAPH
+0x9EE1 0x69B1 #CJK UNIFIED IDEOGRAPH
+0x9EE2 0x6A1E #CJK UNIFIED IDEOGRAPH
+0x9EE3 0x69ED #CJK UNIFIED IDEOGRAPH
+0x9EE4 0x6A14 #CJK UNIFIED IDEOGRAPH
+0x9EE5 0x69EB #CJK UNIFIED IDEOGRAPH
+0x9EE6 0x6A0A #CJK UNIFIED IDEOGRAPH
+0x9EE7 0x6A12 #CJK UNIFIED IDEOGRAPH
+0x9EE8 0x6AC1 #CJK UNIFIED IDEOGRAPH
+0x9EE9 0x6A23 #CJK UNIFIED IDEOGRAPH
+0x9EEA 0x6A13 #CJK UNIFIED IDEOGRAPH
+0x9EEB 0x6A44 #CJK UNIFIED IDEOGRAPH
+0x9EEC 0x6A0C #CJK UNIFIED IDEOGRAPH
+0x9EED 0x6A72 #CJK UNIFIED IDEOGRAPH
+0x9EEE 0x6A36 #CJK UNIFIED IDEOGRAPH
+0x9EEF 0x6A78 #CJK UNIFIED IDEOGRAPH
+0x9EF0 0x6A47 #CJK UNIFIED IDEOGRAPH
+0x9EF1 0x6A62 #CJK UNIFIED IDEOGRAPH
+0x9EF2 0x6A59 #CJK UNIFIED IDEOGRAPH
+0x9EF3 0x6A66 #CJK UNIFIED IDEOGRAPH
+0x9EF4 0x6A48 #CJK UNIFIED IDEOGRAPH
+0x9EF5 0x6A38 #CJK UNIFIED IDEOGRAPH
+0x9EF6 0x6A22 #CJK UNIFIED IDEOGRAPH
+0x9EF7 0x6A90 #CJK UNIFIED IDEOGRAPH
+0x9EF8 0x6A8D #CJK UNIFIED IDEOGRAPH
+0x9EF9 0x6AA0 #CJK UNIFIED IDEOGRAPH
+0x9EFA 0x6A84 #CJK UNIFIED IDEOGRAPH
+0x9EFB 0x6AA2 #CJK UNIFIED IDEOGRAPH
+0x9EFC 0x6AA3 #CJK UNIFIED IDEOGRAPH
+0x9F40 0x6A97 #CJK UNIFIED IDEOGRAPH
+0x9F41 0x8617 #CJK UNIFIED IDEOGRAPH
+0x9F42 0x6ABB #CJK UNIFIED IDEOGRAPH
+0x9F43 0x6AC3 #CJK UNIFIED IDEOGRAPH
+0x9F44 0x6AC2 #CJK UNIFIED IDEOGRAPH
+0x9F45 0x6AB8 #CJK UNIFIED IDEOGRAPH
+0x9F46 0x6AB3 #CJK UNIFIED IDEOGRAPH
+0x9F47 0x6AAC #CJK UNIFIED IDEOGRAPH
+0x9F48 0x6ADE #CJK UNIFIED IDEOGRAPH
+0x9F49 0x6AD1 #CJK UNIFIED IDEOGRAPH
+0x9F4A 0x6ADF #CJK UNIFIED IDEOGRAPH
+0x9F4B 0x6AAA #CJK UNIFIED IDEOGRAPH
+0x9F4C 0x6ADA #CJK UNIFIED IDEOGRAPH
+0x9F4D 0x6AEA #CJK UNIFIED IDEOGRAPH
+0x9F4E 0x6AFB #CJK UNIFIED IDEOGRAPH
+0x9F4F 0x6B05 #CJK UNIFIED IDEOGRAPH
+0x9F50 0x8616 #CJK UNIFIED IDEOGRAPH
+0x9F51 0x6AFA #CJK UNIFIED IDEOGRAPH
+0x9F52 0x6B12 #CJK UNIFIED IDEOGRAPH
+0x9F53 0x6B16 #CJK UNIFIED IDEOGRAPH
+0x9F54 0x9B31 #CJK UNIFIED IDEOGRAPH
+0x9F55 0x6B1F #CJK UNIFIED IDEOGRAPH
+0x9F56 0x6B38 #CJK UNIFIED IDEOGRAPH
+0x9F57 0x6B37 #CJK UNIFIED IDEOGRAPH
+0x9F58 0x76DC #CJK UNIFIED IDEOGRAPH
+0x9F59 0x6B39 #CJK UNIFIED IDEOGRAPH
+0x9F5A 0x98EE #CJK UNIFIED IDEOGRAPH
+0x9F5B 0x6B47 #CJK UNIFIED IDEOGRAPH
+0x9F5C 0x6B43 #CJK UNIFIED IDEOGRAPH
+0x9F5D 0x6B49 #CJK UNIFIED IDEOGRAPH
+0x9F5E 0x6B50 #CJK UNIFIED IDEOGRAPH
+0x9F5F 0x6B59 #CJK UNIFIED IDEOGRAPH
+0x9F60 0x6B54 #CJK UNIFIED IDEOGRAPH
+0x9F61 0x6B5B #CJK UNIFIED IDEOGRAPH
+0x9F62 0x6B5F #CJK UNIFIED IDEOGRAPH
+0x9F63 0x6B61 #CJK UNIFIED IDEOGRAPH
+0x9F64 0x6B78 #CJK UNIFIED IDEOGRAPH
+0x9F65 0x6B79 #CJK UNIFIED IDEOGRAPH
+0x9F66 0x6B7F #CJK UNIFIED IDEOGRAPH
+0x9F67 0x6B80 #CJK UNIFIED IDEOGRAPH
+0x9F68 0x6B84 #CJK UNIFIED IDEOGRAPH
+0x9F69 0x6B83 #CJK UNIFIED IDEOGRAPH
+0x9F6A 0x6B8D #CJK UNIFIED IDEOGRAPH
+0x9F6B 0x6B98 #CJK UNIFIED IDEOGRAPH
+0x9F6C 0x6B95 #CJK UNIFIED IDEOGRAPH
+0x9F6D 0x6B9E #CJK UNIFIED IDEOGRAPH
+0x9F6E 0x6BA4 #CJK UNIFIED IDEOGRAPH
+0x9F6F 0x6BAA #CJK UNIFIED IDEOGRAPH
+0x9F70 0x6BAB #CJK UNIFIED IDEOGRAPH
+0x9F71 0x6BAF #CJK UNIFIED IDEOGRAPH
+0x9F72 0x6BB2 #CJK UNIFIED IDEOGRAPH
+0x9F73 0x6BB1 #CJK UNIFIED IDEOGRAPH
+0x9F74 0x6BB3 #CJK UNIFIED IDEOGRAPH
+0x9F75 0x6BB7 #CJK UNIFIED IDEOGRAPH
+0x9F76 0x6BBC #CJK UNIFIED IDEOGRAPH
+0x9F77 0x6BC6 #CJK UNIFIED IDEOGRAPH
+0x9F78 0x6BCB #CJK UNIFIED IDEOGRAPH
+0x9F79 0x6BD3 #CJK UNIFIED IDEOGRAPH
+0x9F7A 0x6BDF #CJK UNIFIED IDEOGRAPH
+0x9F7B 0x6BEC #CJK UNIFIED IDEOGRAPH
+0x9F7C 0x6BEB #CJK UNIFIED IDEOGRAPH
+0x9F7D 0x6BF3 #CJK UNIFIED IDEOGRAPH
+0x9F7E 0x6BEF #CJK UNIFIED IDEOGRAPH
+0x9F80 0x9EBE #CJK UNIFIED IDEOGRAPH
+0x9F81 0x6C08 #CJK UNIFIED IDEOGRAPH
+0x9F82 0x6C13 #CJK UNIFIED IDEOGRAPH
+0x9F83 0x6C14 #CJK UNIFIED IDEOGRAPH
+0x9F84 0x6C1B #CJK UNIFIED IDEOGRAPH
+0x9F85 0x6C24 #CJK UNIFIED IDEOGRAPH
+0x9F86 0x6C23 #CJK UNIFIED IDEOGRAPH
+0x9F87 0x6C5E #CJK UNIFIED IDEOGRAPH
+0x9F88 0x6C55 #CJK UNIFIED IDEOGRAPH
+0x9F89 0x6C62 #CJK UNIFIED IDEOGRAPH
+0x9F8A 0x6C6A #CJK UNIFIED IDEOGRAPH
+0x9F8B 0x6C82 #CJK UNIFIED IDEOGRAPH
+0x9F8C 0x6C8D #CJK UNIFIED IDEOGRAPH
+0x9F8D 0x6C9A #CJK UNIFIED IDEOGRAPH
+0x9F8E 0x6C81 #CJK UNIFIED IDEOGRAPH
+0x9F8F 0x6C9B #CJK UNIFIED IDEOGRAPH
+0x9F90 0x6C7E #CJK UNIFIED IDEOGRAPH
+0x9F91 0x6C68 #CJK UNIFIED IDEOGRAPH
+0x9F92 0x6C73 #CJK UNIFIED IDEOGRAPH
+0x9F93 0x6C92 #CJK UNIFIED IDEOGRAPH
+0x9F94 0x6C90 #CJK UNIFIED IDEOGRAPH
+0x9F95 0x6CC4 #CJK UNIFIED IDEOGRAPH
+0x9F96 0x6CF1 #CJK UNIFIED IDEOGRAPH
+0x9F97 0x6CD3 #CJK UNIFIED IDEOGRAPH
+0x9F98 0x6CBD #CJK UNIFIED IDEOGRAPH
+0x9F99 0x6CD7 #CJK UNIFIED IDEOGRAPH
+0x9F9A 0x6CC5 #CJK UNIFIED IDEOGRAPH
+0x9F9B 0x6CDD #CJK UNIFIED IDEOGRAPH
+0x9F9C 0x6CAE #CJK UNIFIED IDEOGRAPH
+0x9F9D 0x6CB1 #CJK UNIFIED IDEOGRAPH
+0x9F9E 0x6CBE #CJK UNIFIED IDEOGRAPH
+0x9F9F 0x6CBA #CJK UNIFIED IDEOGRAPH
+0x9FA0 0x6CDB #CJK UNIFIED IDEOGRAPH
+0x9FA1 0x6CEF #CJK UNIFIED IDEOGRAPH
+0x9FA2 0x6CD9 #CJK UNIFIED IDEOGRAPH
+0x9FA3 0x6CEA #CJK UNIFIED IDEOGRAPH
+0x9FA4 0x6D1F #CJK UNIFIED IDEOGRAPH
+0x9FA5 0x884D #CJK UNIFIED IDEOGRAPH
+0x9FA6 0x6D36 #CJK UNIFIED IDEOGRAPH
+0x9FA7 0x6D2B #CJK UNIFIED IDEOGRAPH
+0x9FA8 0x6D3D #CJK UNIFIED IDEOGRAPH
+0x9FA9 0x6D38 #CJK UNIFIED IDEOGRAPH
+0x9FAA 0x6D19 #CJK UNIFIED IDEOGRAPH
+0x9FAB 0x6D35 #CJK UNIFIED IDEOGRAPH
+0x9FAC 0x6D33 #CJK UNIFIED IDEOGRAPH
+0x9FAD 0x6D12 #CJK UNIFIED IDEOGRAPH
+0x9FAE 0x6D0C #CJK UNIFIED IDEOGRAPH
+0x9FAF 0x6D63 #CJK UNIFIED IDEOGRAPH
+0x9FB0 0x6D93 #CJK UNIFIED IDEOGRAPH
+0x9FB1 0x6D64 #CJK UNIFIED IDEOGRAPH
+0x9FB2 0x6D5A #CJK UNIFIED IDEOGRAPH
+0x9FB3 0x6D79 #CJK UNIFIED IDEOGRAPH
+0x9FB4 0x6D59 #CJK UNIFIED IDEOGRAPH
+0x9FB5 0x6D8E #CJK UNIFIED IDEOGRAPH
+0x9FB6 0x6D95 #CJK UNIFIED IDEOGRAPH
+0x9FB7 0x6FE4 #CJK UNIFIED IDEOGRAPH
+0x9FB8 0x6D85 #CJK UNIFIED IDEOGRAPH
+0x9FB9 0x6DF9 #CJK UNIFIED IDEOGRAPH
+0x9FBA 0x6E15 #CJK UNIFIED IDEOGRAPH
+0x9FBB 0x6E0A #CJK UNIFIED IDEOGRAPH
+0x9FBC 0x6DB5 #CJK UNIFIED IDEOGRAPH
+0x9FBD 0x6DC7 #CJK UNIFIED IDEOGRAPH
+0x9FBE 0x6DE6 #CJK UNIFIED IDEOGRAPH
+0x9FBF 0x6DB8 #CJK UNIFIED IDEOGRAPH
+0x9FC0 0x6DC6 #CJK UNIFIED IDEOGRAPH
+0x9FC1 0x6DEC #CJK UNIFIED IDEOGRAPH
+0x9FC2 0x6DDE #CJK UNIFIED IDEOGRAPH
+0x9FC3 0x6DCC #CJK UNIFIED IDEOGRAPH
+0x9FC4 0x6DE8 #CJK UNIFIED IDEOGRAPH
+0x9FC5 0x6DD2 #CJK UNIFIED IDEOGRAPH
+0x9FC6 0x6DC5 #CJK UNIFIED IDEOGRAPH
+0x9FC7 0x6DFA #CJK UNIFIED IDEOGRAPH
+0x9FC8 0x6DD9 #CJK UNIFIED IDEOGRAPH
+0x9FC9 0x6DE4 #CJK UNIFIED IDEOGRAPH
+0x9FCA 0x6DD5 #CJK UNIFIED IDEOGRAPH
+0x9FCB 0x6DEA #CJK UNIFIED IDEOGRAPH
+0x9FCC 0x6DEE #CJK UNIFIED IDEOGRAPH
+0x9FCD 0x6E2D #CJK UNIFIED IDEOGRAPH
+0x9FCE 0x6E6E #CJK UNIFIED IDEOGRAPH
+0x9FCF 0x6E2E #CJK UNIFIED IDEOGRAPH
+0x9FD0 0x6E19 #CJK UNIFIED IDEOGRAPH
+0x9FD1 0x6E72 #CJK UNIFIED IDEOGRAPH
+0x9FD2 0x6E5F #CJK UNIFIED IDEOGRAPH
+0x9FD3 0x6E3E #CJK UNIFIED IDEOGRAPH
+0x9FD4 0x6E23 #CJK UNIFIED IDEOGRAPH
+0x9FD5 0x6E6B #CJK UNIFIED IDEOGRAPH
+0x9FD6 0x6E2B #CJK UNIFIED IDEOGRAPH
+0x9FD7 0x6E76 #CJK UNIFIED IDEOGRAPH
+0x9FD8 0x6E4D #CJK UNIFIED IDEOGRAPH
+0x9FD9 0x6E1F #CJK UNIFIED IDEOGRAPH
+0x9FDA 0x6E43 #CJK UNIFIED IDEOGRAPH
+0x9FDB 0x6E3A #CJK UNIFIED IDEOGRAPH
+0x9FDC 0x6E4E #CJK UNIFIED IDEOGRAPH
+0x9FDD 0x6E24 #CJK UNIFIED IDEOGRAPH
+0x9FDE 0x6EFF #CJK UNIFIED IDEOGRAPH
+0x9FDF 0x6E1D #CJK UNIFIED IDEOGRAPH
+0x9FE0 0x6E38 #CJK UNIFIED IDEOGRAPH
+0x9FE1 0x6E82 #CJK UNIFIED IDEOGRAPH
+0x9FE2 0x6EAA #CJK UNIFIED IDEOGRAPH
+0x9FE3 0x6E98 #CJK UNIFIED IDEOGRAPH
+0x9FE4 0x6EC9 #CJK UNIFIED IDEOGRAPH
+0x9FE5 0x6EB7 #CJK UNIFIED IDEOGRAPH
+0x9FE6 0x6ED3 #CJK UNIFIED IDEOGRAPH
+0x9FE7 0x6EBD #CJK UNIFIED IDEOGRAPH
+0x9FE8 0x6EAF #CJK UNIFIED IDEOGRAPH
+0x9FE9 0x6EC4 #CJK UNIFIED IDEOGRAPH
+0x9FEA 0x6EB2 #CJK UNIFIED IDEOGRAPH
+0x9FEB 0x6ED4 #CJK UNIFIED IDEOGRAPH
+0x9FEC 0x6ED5 #CJK UNIFIED IDEOGRAPH
+0x9FED 0x6E8F #CJK UNIFIED IDEOGRAPH
+0x9FEE 0x6EA5 #CJK UNIFIED IDEOGRAPH
+0x9FEF 0x6EC2 #CJK UNIFIED IDEOGRAPH
+0x9FF0 0x6E9F #CJK UNIFIED IDEOGRAPH
+0x9FF1 0x6F41 #CJK UNIFIED IDEOGRAPH
+0x9FF2 0x6F11 #CJK UNIFIED IDEOGRAPH
+0x9FF3 0x704C #CJK UNIFIED IDEOGRAPH
+0x9FF4 0x6EEC #CJK UNIFIED IDEOGRAPH
+0x9FF5 0x6EF8 #CJK UNIFIED IDEOGRAPH
+0x9FF6 0x6EFE #CJK UNIFIED IDEOGRAPH
+0x9FF7 0x6F3F #CJK UNIFIED IDEOGRAPH
+0x9FF8 0x6EF2 #CJK UNIFIED IDEOGRAPH
+0x9FF9 0x6F31 #CJK UNIFIED IDEOGRAPH
+0x9FFA 0x6EEF #CJK UNIFIED IDEOGRAPH
+0x9FFB 0x6F32 #CJK UNIFIED IDEOGRAPH
+0x9FFC 0x6ECC #CJK UNIFIED IDEOGRAPH
+0xE040 0x6F3E #CJK UNIFIED IDEOGRAPH
+0xE041 0x6F13 #CJK UNIFIED IDEOGRAPH
+0xE042 0x6EF7 #CJK UNIFIED IDEOGRAPH
+0xE043 0x6F86 #CJK UNIFIED IDEOGRAPH
+0xE044 0x6F7A #CJK UNIFIED IDEOGRAPH
+0xE045 0x6F78 #CJK UNIFIED IDEOGRAPH
+0xE046 0x6F81 #CJK UNIFIED IDEOGRAPH
+0xE047 0x6F80 #CJK UNIFIED IDEOGRAPH
+0xE048 0x6F6F #CJK UNIFIED IDEOGRAPH
+0xE049 0x6F5B #CJK UNIFIED IDEOGRAPH
+0xE04A 0x6FF3 #CJK UNIFIED IDEOGRAPH
+0xE04B 0x6F6D #CJK UNIFIED IDEOGRAPH
+0xE04C 0x6F82 #CJK UNIFIED IDEOGRAPH
+0xE04D 0x6F7C #CJK UNIFIED IDEOGRAPH
+0xE04E 0x6F58 #CJK UNIFIED IDEOGRAPH
+0xE04F 0x6F8E #CJK UNIFIED IDEOGRAPH
+0xE050 0x6F91 #CJK UNIFIED IDEOGRAPH
+0xE051 0x6FC2 #CJK UNIFIED IDEOGRAPH
+0xE052 0x6F66 #CJK UNIFIED IDEOGRAPH
+0xE053 0x6FB3 #CJK UNIFIED IDEOGRAPH
+0xE054 0x6FA3 #CJK UNIFIED IDEOGRAPH
+0xE055 0x6FA1 #CJK UNIFIED IDEOGRAPH
+0xE056 0x6FA4 #CJK UNIFIED IDEOGRAPH
+0xE057 0x6FB9 #CJK UNIFIED IDEOGRAPH
+0xE058 0x6FC6 #CJK UNIFIED IDEOGRAPH
+0xE059 0x6FAA #CJK UNIFIED IDEOGRAPH
+0xE05A 0x6FDF #CJK UNIFIED IDEOGRAPH
+0xE05B 0x6FD5 #CJK UNIFIED IDEOGRAPH
+0xE05C 0x6FEC #CJK UNIFIED IDEOGRAPH
+0xE05D 0x6FD4 #CJK UNIFIED IDEOGRAPH
+0xE05E 0x6FD8 #CJK UNIFIED IDEOGRAPH
+0xE05F 0x6FF1 #CJK UNIFIED IDEOGRAPH
+0xE060 0x6FEE #CJK UNIFIED IDEOGRAPH
+0xE061 0x6FDB #CJK UNIFIED IDEOGRAPH
+0xE062 0x7009 #CJK UNIFIED IDEOGRAPH
+0xE063 0x700B #CJK UNIFIED IDEOGRAPH
+0xE064 0x6FFA #CJK UNIFIED IDEOGRAPH
+0xE065 0x7011 #CJK UNIFIED IDEOGRAPH
+0xE066 0x7001 #CJK UNIFIED IDEOGRAPH
+0xE067 0x700F #CJK UNIFIED IDEOGRAPH
+0xE068 0x6FFE #CJK UNIFIED IDEOGRAPH
+0xE069 0x701B #CJK UNIFIED IDEOGRAPH
+0xE06A 0x701A #CJK UNIFIED IDEOGRAPH
+0xE06B 0x6F74 #CJK UNIFIED IDEOGRAPH
+0xE06C 0x701D #CJK UNIFIED IDEOGRAPH
+0xE06D 0x7018 #CJK UNIFIED IDEOGRAPH
+0xE06E 0x701F #CJK UNIFIED IDEOGRAPH
+0xE06F 0x7030 #CJK UNIFIED IDEOGRAPH
+0xE070 0x703E #CJK UNIFIED IDEOGRAPH
+0xE071 0x7032 #CJK UNIFIED IDEOGRAPH
+0xE072 0x7051 #CJK UNIFIED IDEOGRAPH
+0xE073 0x7063 #CJK UNIFIED IDEOGRAPH
+0xE074 0x7099 #CJK UNIFIED IDEOGRAPH
+0xE075 0x7092 #CJK UNIFIED IDEOGRAPH
+0xE076 0x70AF #CJK UNIFIED IDEOGRAPH
+0xE077 0x70F1 #CJK UNIFIED IDEOGRAPH
+0xE078 0x70AC #CJK UNIFIED IDEOGRAPH
+0xE079 0x70B8 #CJK UNIFIED IDEOGRAPH
+0xE07A 0x70B3 #CJK UNIFIED IDEOGRAPH
+0xE07B 0x70AE #CJK UNIFIED IDEOGRAPH
+0xE07C 0x70DF #CJK UNIFIED IDEOGRAPH
+0xE07D 0x70CB #CJK UNIFIED IDEOGRAPH
+0xE07E 0x70DD #CJK UNIFIED IDEOGRAPH
+0xE080 0x70D9 #CJK UNIFIED IDEOGRAPH
+0xE081 0x7109 #CJK UNIFIED IDEOGRAPH
+0xE082 0x70FD #CJK UNIFIED IDEOGRAPH
+0xE083 0x711C #CJK UNIFIED IDEOGRAPH
+0xE084 0x7119 #CJK UNIFIED IDEOGRAPH
+0xE085 0x7165 #CJK UNIFIED IDEOGRAPH
+0xE086 0x7155 #CJK UNIFIED IDEOGRAPH
+0xE087 0x7188 #CJK UNIFIED IDEOGRAPH
+0xE088 0x7166 #CJK UNIFIED IDEOGRAPH
+0xE089 0x7162 #CJK UNIFIED IDEOGRAPH
+0xE08A 0x714C #CJK UNIFIED IDEOGRAPH
+0xE08B 0x7156 #CJK UNIFIED IDEOGRAPH
+0xE08C 0x716C #CJK UNIFIED IDEOGRAPH
+0xE08D 0x718F #CJK UNIFIED IDEOGRAPH
+0xE08E 0x71FB #CJK UNIFIED IDEOGRAPH
+0xE08F 0x7184 #CJK UNIFIED IDEOGRAPH
+0xE090 0x7195 #CJK UNIFIED IDEOGRAPH
+0xE091 0x71A8 #CJK UNIFIED IDEOGRAPH
+0xE092 0x71AC #CJK UNIFIED IDEOGRAPH
+0xE093 0x71D7 #CJK UNIFIED IDEOGRAPH
+0xE094 0x71B9 #CJK UNIFIED IDEOGRAPH
+0xE095 0x71BE #CJK UNIFIED IDEOGRAPH
+0xE096 0x71D2 #CJK UNIFIED IDEOGRAPH
+0xE097 0x71C9 #CJK UNIFIED IDEOGRAPH
+0xE098 0x71D4 #CJK UNIFIED IDEOGRAPH
+0xE099 0x71CE #CJK UNIFIED IDEOGRAPH
+0xE09A 0x71E0 #CJK UNIFIED IDEOGRAPH
+0xE09B 0x71EC #CJK UNIFIED IDEOGRAPH
+0xE09C 0x71E7 #CJK UNIFIED IDEOGRAPH
+0xE09D 0x71F5 #CJK UNIFIED IDEOGRAPH
+0xE09E 0x71FC #CJK UNIFIED IDEOGRAPH
+0xE09F 0x71F9 #CJK UNIFIED IDEOGRAPH
+0xE0A0 0x71FF #CJK UNIFIED IDEOGRAPH
+0xE0A1 0x720D #CJK UNIFIED IDEOGRAPH
+0xE0A2 0x7210 #CJK UNIFIED IDEOGRAPH
+0xE0A3 0x721B #CJK UNIFIED IDEOGRAPH
+0xE0A4 0x7228 #CJK UNIFIED IDEOGRAPH
+0xE0A5 0x722D #CJK UNIFIED IDEOGRAPH
+0xE0A6 0x722C #CJK UNIFIED IDEOGRAPH
+0xE0A7 0x7230 #CJK UNIFIED IDEOGRAPH
+0xE0A8 0x7232 #CJK UNIFIED IDEOGRAPH
+0xE0A9 0x723B #CJK UNIFIED IDEOGRAPH
+0xE0AA 0x723C #CJK UNIFIED IDEOGRAPH
+0xE0AB 0x723F #CJK UNIFIED IDEOGRAPH
+0xE0AC 0x7240 #CJK UNIFIED IDEOGRAPH
+0xE0AD 0x7246 #CJK UNIFIED IDEOGRAPH
+0xE0AE 0x724B #CJK UNIFIED IDEOGRAPH
+0xE0AF 0x7258 #CJK UNIFIED IDEOGRAPH
+0xE0B0 0x7274 #CJK UNIFIED IDEOGRAPH
+0xE0B1 0x727E #CJK UNIFIED IDEOGRAPH
+0xE0B2 0x7282 #CJK UNIFIED IDEOGRAPH
+0xE0B3 0x7281 #CJK UNIFIED IDEOGRAPH
+0xE0B4 0x7287 #CJK UNIFIED IDEOGRAPH
+0xE0B5 0x7292 #CJK UNIFIED IDEOGRAPH
+0xE0B6 0x7296 #CJK UNIFIED IDEOGRAPH
+0xE0B7 0x72A2 #CJK UNIFIED IDEOGRAPH
+0xE0B8 0x72A7 #CJK UNIFIED IDEOGRAPH
+0xE0B9 0x72B9 #CJK UNIFIED IDEOGRAPH
+0xE0BA 0x72B2 #CJK UNIFIED IDEOGRAPH
+0xE0BB 0x72C3 #CJK UNIFIED IDEOGRAPH
+0xE0BC 0x72C6 #CJK UNIFIED IDEOGRAPH
+0xE0BD 0x72C4 #CJK UNIFIED IDEOGRAPH
+0xE0BE 0x72CE #CJK UNIFIED IDEOGRAPH
+0xE0BF 0x72D2 #CJK UNIFIED IDEOGRAPH
+0xE0C0 0x72E2 #CJK UNIFIED IDEOGRAPH
+0xE0C1 0x72E0 #CJK UNIFIED IDEOGRAPH
+0xE0C2 0x72E1 #CJK UNIFIED IDEOGRAPH
+0xE0C3 0x72F9 #CJK UNIFIED IDEOGRAPH
+0xE0C4 0x72F7 #CJK UNIFIED IDEOGRAPH
+0xE0C5 0x500F #CJK UNIFIED IDEOGRAPH
+0xE0C6 0x7317 #CJK UNIFIED IDEOGRAPH
+0xE0C7 0x730A #CJK UNIFIED IDEOGRAPH
+0xE0C8 0x731C #CJK UNIFIED IDEOGRAPH
+0xE0C9 0x7316 #CJK UNIFIED IDEOGRAPH
+0xE0CA 0x731D #CJK UNIFIED IDEOGRAPH
+0xE0CB 0x7334 #CJK UNIFIED IDEOGRAPH
+0xE0CC 0x732F #CJK UNIFIED IDEOGRAPH
+0xE0CD 0x7329 #CJK UNIFIED IDEOGRAPH
+0xE0CE 0x7325 #CJK UNIFIED IDEOGRAPH
+0xE0CF 0x733E #CJK UNIFIED IDEOGRAPH
+0xE0D0 0x734E #CJK UNIFIED IDEOGRAPH
+0xE0D1 0x734F #CJK UNIFIED IDEOGRAPH
+0xE0D2 0x9ED8 #CJK UNIFIED IDEOGRAPH
+0xE0D3 0x7357 #CJK UNIFIED IDEOGRAPH
+0xE0D4 0x736A #CJK UNIFIED IDEOGRAPH
+0xE0D5 0x7368 #CJK UNIFIED IDEOGRAPH
+0xE0D6 0x7370 #CJK UNIFIED IDEOGRAPH
+0xE0D7 0x7378 #CJK UNIFIED IDEOGRAPH
+0xE0D8 0x7375 #CJK UNIFIED IDEOGRAPH
+0xE0D9 0x737B #CJK UNIFIED IDEOGRAPH
+0xE0DA 0x737A #CJK UNIFIED IDEOGRAPH
+0xE0DB 0x73C8 #CJK UNIFIED IDEOGRAPH
+0xE0DC 0x73B3 #CJK UNIFIED IDEOGRAPH
+0xE0DD 0x73CE #CJK UNIFIED IDEOGRAPH
+0xE0DE 0x73BB #CJK UNIFIED IDEOGRAPH
+0xE0DF 0x73C0 #CJK UNIFIED IDEOGRAPH
+0xE0E0 0x73E5 #CJK UNIFIED IDEOGRAPH
+0xE0E1 0x73EE #CJK UNIFIED IDEOGRAPH
+0xE0E2 0x73DE #CJK UNIFIED IDEOGRAPH
+0xE0E3 0x74A2 #CJK UNIFIED IDEOGRAPH
+0xE0E4 0x7405 #CJK UNIFIED IDEOGRAPH
+0xE0E5 0x746F #CJK UNIFIED IDEOGRAPH
+0xE0E6 0x7425 #CJK UNIFIED IDEOGRAPH
+0xE0E7 0x73F8 #CJK UNIFIED IDEOGRAPH
+0xE0E8 0x7432 #CJK UNIFIED IDEOGRAPH
+0xE0E9 0x743A #CJK UNIFIED IDEOGRAPH
+0xE0EA 0x7455 #CJK UNIFIED IDEOGRAPH
+0xE0EB 0x743F #CJK UNIFIED IDEOGRAPH
+0xE0EC 0x745F #CJK UNIFIED IDEOGRAPH
+0xE0ED 0x7459 #CJK UNIFIED IDEOGRAPH
+0xE0EE 0x7441 #CJK UNIFIED IDEOGRAPH
+0xE0EF 0x745C #CJK UNIFIED IDEOGRAPH
+0xE0F0 0x7469 #CJK UNIFIED IDEOGRAPH
+0xE0F1 0x7470 #CJK UNIFIED IDEOGRAPH
+0xE0F2 0x7463 #CJK UNIFIED IDEOGRAPH
+0xE0F3 0x746A #CJK UNIFIED IDEOGRAPH
+0xE0F4 0x7476 #CJK UNIFIED IDEOGRAPH
+0xE0F5 0x747E #CJK UNIFIED IDEOGRAPH
+0xE0F6 0x748B #CJK UNIFIED IDEOGRAPH
+0xE0F7 0x749E #CJK UNIFIED IDEOGRAPH
+0xE0F8 0x74A7 #CJK UNIFIED IDEOGRAPH
+0xE0F9 0x74CA #CJK UNIFIED IDEOGRAPH
+0xE0FA 0x74CF #CJK UNIFIED IDEOGRAPH
+0xE0FB 0x74D4 #CJK UNIFIED IDEOGRAPH
+0xE0FC 0x73F1 #CJK UNIFIED IDEOGRAPH
+0xE140 0x74E0 #CJK UNIFIED IDEOGRAPH
+0xE141 0x74E3 #CJK UNIFIED IDEOGRAPH
+0xE142 0x74E7 #CJK UNIFIED IDEOGRAPH
+0xE143 0x74E9 #CJK UNIFIED IDEOGRAPH
+0xE144 0x74EE #CJK UNIFIED IDEOGRAPH
+0xE145 0x74F2 #CJK UNIFIED IDEOGRAPH
+0xE146 0x74F0 #CJK UNIFIED IDEOGRAPH
+0xE147 0x74F1 #CJK UNIFIED IDEOGRAPH
+0xE148 0x74F8 #CJK UNIFIED IDEOGRAPH
+0xE149 0x74F7 #CJK UNIFIED IDEOGRAPH
+0xE14A 0x7504 #CJK UNIFIED IDEOGRAPH
+0xE14B 0x7503 #CJK UNIFIED IDEOGRAPH
+0xE14C 0x7505 #CJK UNIFIED IDEOGRAPH
+0xE14D 0x750C #CJK UNIFIED IDEOGRAPH
+0xE14E 0x750E #CJK UNIFIED IDEOGRAPH
+0xE14F 0x750D #CJK UNIFIED IDEOGRAPH
+0xE150 0x7515 #CJK UNIFIED IDEOGRAPH
+0xE151 0x7513 #CJK UNIFIED IDEOGRAPH
+0xE152 0x751E #CJK UNIFIED IDEOGRAPH
+0xE153 0x7526 #CJK UNIFIED IDEOGRAPH
+0xE154 0x752C #CJK UNIFIED IDEOGRAPH
+0xE155 0x753C #CJK UNIFIED IDEOGRAPH
+0xE156 0x7544 #CJK UNIFIED IDEOGRAPH
+0xE157 0x754D #CJK UNIFIED IDEOGRAPH
+0xE158 0x754A #CJK UNIFIED IDEOGRAPH
+0xE159 0x7549 #CJK UNIFIED IDEOGRAPH
+0xE15A 0x755B #CJK UNIFIED IDEOGRAPH
+0xE15B 0x7546 #CJK UNIFIED IDEOGRAPH
+0xE15C 0x755A #CJK UNIFIED IDEOGRAPH
+0xE15D 0x7569 #CJK UNIFIED IDEOGRAPH
+0xE15E 0x7564 #CJK UNIFIED IDEOGRAPH
+0xE15F 0x7567 #CJK UNIFIED IDEOGRAPH
+0xE160 0x756B #CJK UNIFIED IDEOGRAPH
+0xE161 0x756D #CJK UNIFIED IDEOGRAPH
+0xE162 0x7578 #CJK UNIFIED IDEOGRAPH
+0xE163 0x7576 #CJK UNIFIED IDEOGRAPH
+0xE164 0x7586 #CJK UNIFIED IDEOGRAPH
+0xE165 0x7587 #CJK UNIFIED IDEOGRAPH
+0xE166 0x7574 #CJK UNIFIED IDEOGRAPH
+0xE167 0x758A #CJK UNIFIED IDEOGRAPH
+0xE168 0x7589 #CJK UNIFIED IDEOGRAPH
+0xE169 0x7582 #CJK UNIFIED IDEOGRAPH
+0xE16A 0x7594 #CJK UNIFIED IDEOGRAPH
+0xE16B 0x759A #CJK UNIFIED IDEOGRAPH
+0xE16C 0x759D #CJK UNIFIED IDEOGRAPH
+0xE16D 0x75A5 #CJK UNIFIED IDEOGRAPH
+0xE16E 0x75A3 #CJK UNIFIED IDEOGRAPH
+0xE16F 0x75C2 #CJK UNIFIED IDEOGRAPH
+0xE170 0x75B3 #CJK UNIFIED IDEOGRAPH
+0xE171 0x75C3 #CJK UNIFIED IDEOGRAPH
+0xE172 0x75B5 #CJK UNIFIED IDEOGRAPH
+0xE173 0x75BD #CJK UNIFIED IDEOGRAPH
+0xE174 0x75B8 #CJK UNIFIED IDEOGRAPH
+0xE175 0x75BC #CJK UNIFIED IDEOGRAPH
+0xE176 0x75B1 #CJK UNIFIED IDEOGRAPH
+0xE177 0x75CD #CJK UNIFIED IDEOGRAPH
+0xE178 0x75CA #CJK UNIFIED IDEOGRAPH
+0xE179 0x75D2 #CJK UNIFIED IDEOGRAPH
+0xE17A 0x75D9 #CJK UNIFIED IDEOGRAPH
+0xE17B 0x75E3 #CJK UNIFIED IDEOGRAPH
+0xE17C 0x75DE #CJK UNIFIED IDEOGRAPH
+0xE17D 0x75FE #CJK UNIFIED IDEOGRAPH
+0xE17E 0x75FF #CJK UNIFIED IDEOGRAPH
+0xE180 0x75FC #CJK UNIFIED IDEOGRAPH
+0xE181 0x7601 #CJK UNIFIED IDEOGRAPH
+0xE182 0x75F0 #CJK UNIFIED IDEOGRAPH
+0xE183 0x75FA #CJK UNIFIED IDEOGRAPH
+0xE184 0x75F2 #CJK UNIFIED IDEOGRAPH
+0xE185 0x75F3 #CJK UNIFIED IDEOGRAPH
+0xE186 0x760B #CJK UNIFIED IDEOGRAPH
+0xE187 0x760D #CJK UNIFIED IDEOGRAPH
+0xE188 0x7609 #CJK UNIFIED IDEOGRAPH
+0xE189 0x761F #CJK UNIFIED IDEOGRAPH
+0xE18A 0x7627 #CJK UNIFIED IDEOGRAPH
+0xE18B 0x7620 #CJK UNIFIED IDEOGRAPH
+0xE18C 0x7621 #CJK UNIFIED IDEOGRAPH
+0xE18D 0x7622 #CJK UNIFIED IDEOGRAPH
+0xE18E 0x7624 #CJK UNIFIED IDEOGRAPH
+0xE18F 0x7634 #CJK UNIFIED IDEOGRAPH
+0xE190 0x7630 #CJK UNIFIED IDEOGRAPH
+0xE191 0x763B #CJK UNIFIED IDEOGRAPH
+0xE192 0x7647 #CJK UNIFIED IDEOGRAPH
+0xE193 0x7648 #CJK UNIFIED IDEOGRAPH
+0xE194 0x7646 #CJK UNIFIED IDEOGRAPH
+0xE195 0x765C #CJK UNIFIED IDEOGRAPH
+0xE196 0x7658 #CJK UNIFIED IDEOGRAPH
+0xE197 0x7661 #CJK UNIFIED IDEOGRAPH
+0xE198 0x7662 #CJK UNIFIED IDEOGRAPH
+0xE199 0x7668 #CJK UNIFIED IDEOGRAPH
+0xE19A 0x7669 #CJK UNIFIED IDEOGRAPH
+0xE19B 0x766A #CJK UNIFIED IDEOGRAPH
+0xE19C 0x7667 #CJK UNIFIED IDEOGRAPH
+0xE19D 0x766C #CJK UNIFIED IDEOGRAPH
+0xE19E 0x7670 #CJK UNIFIED IDEOGRAPH
+0xE19F 0x7672 #CJK UNIFIED IDEOGRAPH
+0xE1A0 0x7676 #CJK UNIFIED IDEOGRAPH
+0xE1A1 0x7678 #CJK UNIFIED IDEOGRAPH
+0xE1A2 0x767C #CJK UNIFIED IDEOGRAPH
+0xE1A3 0x7680 #CJK UNIFIED IDEOGRAPH
+0xE1A4 0x7683 #CJK UNIFIED IDEOGRAPH
+0xE1A5 0x7688 #CJK UNIFIED IDEOGRAPH
+0xE1A6 0x768B #CJK UNIFIED IDEOGRAPH
+0xE1A7 0x768E #CJK UNIFIED IDEOGRAPH
+0xE1A8 0x7696 #CJK UNIFIED IDEOGRAPH
+0xE1A9 0x7693 #CJK UNIFIED IDEOGRAPH
+0xE1AA 0x7699 #CJK UNIFIED IDEOGRAPH
+0xE1AB 0x769A #CJK UNIFIED IDEOGRAPH
+0xE1AC 0x76B0 #CJK UNIFIED IDEOGRAPH
+0xE1AD 0x76B4 #CJK UNIFIED IDEOGRAPH
+0xE1AE 0x76B8 #CJK UNIFIED IDEOGRAPH
+0xE1AF 0x76B9 #CJK UNIFIED IDEOGRAPH
+0xE1B0 0x76BA #CJK UNIFIED IDEOGRAPH
+0xE1B1 0x76C2 #CJK UNIFIED IDEOGRAPH
+0xE1B2 0x76CD #CJK UNIFIED IDEOGRAPH
+0xE1B3 0x76D6 #CJK UNIFIED IDEOGRAPH
+0xE1B4 0x76D2 #CJK UNIFIED IDEOGRAPH
+0xE1B5 0x76DE #CJK UNIFIED IDEOGRAPH
+0xE1B6 0x76E1 #CJK UNIFIED IDEOGRAPH
+0xE1B7 0x76E5 #CJK UNIFIED IDEOGRAPH
+0xE1B8 0x76E7 #CJK UNIFIED IDEOGRAPH
+0xE1B9 0x76EA #CJK UNIFIED IDEOGRAPH
+0xE1BA 0x862F #CJK UNIFIED IDEOGRAPH
+0xE1BB 0x76FB #CJK UNIFIED IDEOGRAPH
+0xE1BC 0x7708 #CJK UNIFIED IDEOGRAPH
+0xE1BD 0x7707 #CJK UNIFIED IDEOGRAPH
+0xE1BE 0x7704 #CJK UNIFIED IDEOGRAPH
+0xE1BF 0x7729 #CJK UNIFIED IDEOGRAPH
+0xE1C0 0x7724 #CJK UNIFIED IDEOGRAPH
+0xE1C1 0x771E #CJK UNIFIED IDEOGRAPH
+0xE1C2 0x7725 #CJK UNIFIED IDEOGRAPH
+0xE1C3 0x7726 #CJK UNIFIED IDEOGRAPH
+0xE1C4 0x771B #CJK UNIFIED IDEOGRAPH
+0xE1C5 0x7737 #CJK UNIFIED IDEOGRAPH
+0xE1C6 0x7738 #CJK UNIFIED IDEOGRAPH
+0xE1C7 0x7747 #CJK UNIFIED IDEOGRAPH
+0xE1C8 0x775A #CJK UNIFIED IDEOGRAPH
+0xE1C9 0x7768 #CJK UNIFIED IDEOGRAPH
+0xE1CA 0x776B #CJK UNIFIED IDEOGRAPH
+0xE1CB 0x775B #CJK UNIFIED IDEOGRAPH
+0xE1CC 0x7765 #CJK UNIFIED IDEOGRAPH
+0xE1CD 0x777F #CJK UNIFIED IDEOGRAPH
+0xE1CE 0x777E #CJK UNIFIED IDEOGRAPH
+0xE1CF 0x7779 #CJK UNIFIED IDEOGRAPH
+0xE1D0 0x778E #CJK UNIFIED IDEOGRAPH
+0xE1D1 0x778B #CJK UNIFIED IDEOGRAPH
+0xE1D2 0x7791 #CJK UNIFIED IDEOGRAPH
+0xE1D3 0x77A0 #CJK UNIFIED IDEOGRAPH
+0xE1D4 0x779E #CJK UNIFIED IDEOGRAPH
+0xE1D5 0x77B0 #CJK UNIFIED IDEOGRAPH
+0xE1D6 0x77B6 #CJK UNIFIED IDEOGRAPH
+0xE1D7 0x77B9 #CJK UNIFIED IDEOGRAPH
+0xE1D8 0x77BF #CJK UNIFIED IDEOGRAPH
+0xE1D9 0x77BC #CJK UNIFIED IDEOGRAPH
+0xE1DA 0x77BD #CJK UNIFIED IDEOGRAPH
+0xE1DB 0x77BB #CJK UNIFIED IDEOGRAPH
+0xE1DC 0x77C7 #CJK UNIFIED IDEOGRAPH
+0xE1DD 0x77CD #CJK UNIFIED IDEOGRAPH
+0xE1DE 0x77D7 #CJK UNIFIED IDEOGRAPH
+0xE1DF 0x77DA #CJK UNIFIED IDEOGRAPH
+0xE1E0 0x77DC #CJK UNIFIED IDEOGRAPH
+0xE1E1 0x77E3 #CJK UNIFIED IDEOGRAPH
+0xE1E2 0x77EE #CJK UNIFIED IDEOGRAPH
+0xE1E3 0x77FC #CJK UNIFIED IDEOGRAPH
+0xE1E4 0x780C #CJK UNIFIED IDEOGRAPH
+0xE1E5 0x7812 #CJK UNIFIED IDEOGRAPH
+0xE1E6 0x7926 #CJK UNIFIED IDEOGRAPH
+0xE1E7 0x7820 #CJK UNIFIED IDEOGRAPH
+0xE1E8 0x792A #CJK UNIFIED IDEOGRAPH
+0xE1E9 0x7845 #CJK UNIFIED IDEOGRAPH
+0xE1EA 0x788E #CJK UNIFIED IDEOGRAPH
+0xE1EB 0x7874 #CJK UNIFIED IDEOGRAPH
+0xE1EC 0x7886 #CJK UNIFIED IDEOGRAPH
+0xE1ED 0x787C #CJK UNIFIED IDEOGRAPH
+0xE1EE 0x789A #CJK UNIFIED IDEOGRAPH
+0xE1EF 0x788C #CJK UNIFIED IDEOGRAPH
+0xE1F0 0x78A3 #CJK UNIFIED IDEOGRAPH
+0xE1F1 0x78B5 #CJK UNIFIED IDEOGRAPH
+0xE1F2 0x78AA #CJK UNIFIED IDEOGRAPH
+0xE1F3 0x78AF #CJK UNIFIED IDEOGRAPH
+0xE1F4 0x78D1 #CJK UNIFIED IDEOGRAPH
+0xE1F5 0x78C6 #CJK UNIFIED IDEOGRAPH
+0xE1F6 0x78CB #CJK UNIFIED IDEOGRAPH
+0xE1F7 0x78D4 #CJK UNIFIED IDEOGRAPH
+0xE1F8 0x78BE #CJK UNIFIED IDEOGRAPH
+0xE1F9 0x78BC #CJK UNIFIED IDEOGRAPH
+0xE1FA 0x78C5 #CJK UNIFIED IDEOGRAPH
+0xE1FB 0x78CA #CJK UNIFIED IDEOGRAPH
+0xE1FC 0x78EC #CJK UNIFIED IDEOGRAPH
+0xE240 0x78E7 #CJK UNIFIED IDEOGRAPH
+0xE241 0x78DA #CJK UNIFIED IDEOGRAPH
+0xE242 0x78FD #CJK UNIFIED IDEOGRAPH
+0xE243 0x78F4 #CJK UNIFIED IDEOGRAPH
+0xE244 0x7907 #CJK UNIFIED IDEOGRAPH
+0xE245 0x7912 #CJK UNIFIED IDEOGRAPH
+0xE246 0x7911 #CJK UNIFIED IDEOGRAPH
+0xE247 0x7919 #CJK UNIFIED IDEOGRAPH
+0xE248 0x792C #CJK UNIFIED IDEOGRAPH
+0xE249 0x792B #CJK UNIFIED IDEOGRAPH
+0xE24A 0x7940 #CJK UNIFIED IDEOGRAPH
+0xE24B 0x7960 #CJK UNIFIED IDEOGRAPH
+0xE24C 0x7957 #CJK UNIFIED IDEOGRAPH
+0xE24D 0x795F #CJK UNIFIED IDEOGRAPH
+0xE24E 0x795A #CJK UNIFIED IDEOGRAPH
+0xE24F 0x7955 #CJK UNIFIED IDEOGRAPH
+0xE250 0x7953 #CJK UNIFIED IDEOGRAPH
+0xE251 0x797A #CJK UNIFIED IDEOGRAPH
+0xE252 0x797F #CJK UNIFIED IDEOGRAPH
+0xE253 0x798A #CJK UNIFIED IDEOGRAPH
+0xE254 0x799D #CJK UNIFIED IDEOGRAPH
+0xE255 0x79A7 #CJK UNIFIED IDEOGRAPH
+0xE256 0x9F4B #CJK UNIFIED IDEOGRAPH
+0xE257 0x79AA #CJK UNIFIED IDEOGRAPH
+0xE258 0x79AE #CJK UNIFIED IDEOGRAPH
+0xE259 0x79B3 #CJK UNIFIED IDEOGRAPH
+0xE25A 0x79B9 #CJK UNIFIED IDEOGRAPH
+0xE25B 0x79BA #CJK UNIFIED IDEOGRAPH
+0xE25C 0x79C9 #CJK UNIFIED IDEOGRAPH
+0xE25D 0x79D5 #CJK UNIFIED IDEOGRAPH
+0xE25E 0x79E7 #CJK UNIFIED IDEOGRAPH
+0xE25F 0x79EC #CJK UNIFIED IDEOGRAPH
+0xE260 0x79E1 #CJK UNIFIED IDEOGRAPH
+0xE261 0x79E3 #CJK UNIFIED IDEOGRAPH
+0xE262 0x7A08 #CJK UNIFIED IDEOGRAPH
+0xE263 0x7A0D #CJK UNIFIED IDEOGRAPH
+0xE264 0x7A18 #CJK UNIFIED IDEOGRAPH
+0xE265 0x7A19 #CJK UNIFIED IDEOGRAPH
+0xE266 0x7A20 #CJK UNIFIED IDEOGRAPH
+0xE267 0x7A1F #CJK UNIFIED IDEOGRAPH
+0xE268 0x7980 #CJK UNIFIED IDEOGRAPH
+0xE269 0x7A31 #CJK UNIFIED IDEOGRAPH
+0xE26A 0x7A3B #CJK UNIFIED IDEOGRAPH
+0xE26B 0x7A3E #CJK UNIFIED IDEOGRAPH
+0xE26C 0x7A37 #CJK UNIFIED IDEOGRAPH
+0xE26D 0x7A43 #CJK UNIFIED IDEOGRAPH
+0xE26E 0x7A57 #CJK UNIFIED IDEOGRAPH
+0xE26F 0x7A49 #CJK UNIFIED IDEOGRAPH
+0xE270 0x7A61 #CJK UNIFIED IDEOGRAPH
+0xE271 0x7A62 #CJK UNIFIED IDEOGRAPH
+0xE272 0x7A69 #CJK UNIFIED IDEOGRAPH
+0xE273 0x9F9D #CJK UNIFIED IDEOGRAPH
+0xE274 0x7A70 #CJK UNIFIED IDEOGRAPH
+0xE275 0x7A79 #CJK UNIFIED IDEOGRAPH
+0xE276 0x7A7D #CJK UNIFIED IDEOGRAPH
+0xE277 0x7A88 #CJK UNIFIED IDEOGRAPH
+0xE278 0x7A97 #CJK UNIFIED IDEOGRAPH
+0xE279 0x7A95 #CJK UNIFIED IDEOGRAPH
+0xE27A 0x7A98 #CJK UNIFIED IDEOGRAPH
+0xE27B 0x7A96 #CJK UNIFIED IDEOGRAPH
+0xE27C 0x7AA9 #CJK UNIFIED IDEOGRAPH
+0xE27D 0x7AC8 #CJK UNIFIED IDEOGRAPH
+0xE27E 0x7AB0 #CJK UNIFIED IDEOGRAPH
+0xE280 0x7AB6 #CJK UNIFIED IDEOGRAPH
+0xE281 0x7AC5 #CJK UNIFIED IDEOGRAPH
+0xE282 0x7AC4 #CJK UNIFIED IDEOGRAPH
+0xE283 0x7ABF #CJK UNIFIED IDEOGRAPH
+0xE284 0x9083 #CJK UNIFIED IDEOGRAPH
+0xE285 0x7AC7 #CJK UNIFIED IDEOGRAPH
+0xE286 0x7ACA #CJK UNIFIED IDEOGRAPH
+0xE287 0x7ACD #CJK UNIFIED IDEOGRAPH
+0xE288 0x7ACF #CJK UNIFIED IDEOGRAPH
+0xE289 0x7AD5 #CJK UNIFIED IDEOGRAPH
+0xE28A 0x7AD3 #CJK UNIFIED IDEOGRAPH
+0xE28B 0x7AD9 #CJK UNIFIED IDEOGRAPH
+0xE28C 0x7ADA #CJK UNIFIED IDEOGRAPH
+0xE28D 0x7ADD #CJK UNIFIED IDEOGRAPH
+0xE28E 0x7AE1 #CJK UNIFIED IDEOGRAPH
+0xE28F 0x7AE2 #CJK UNIFIED IDEOGRAPH
+0xE290 0x7AE6 #CJK UNIFIED IDEOGRAPH
+0xE291 0x7AED #CJK UNIFIED IDEOGRAPH
+0xE292 0x7AF0 #CJK UNIFIED IDEOGRAPH
+0xE293 0x7B02 #CJK UNIFIED IDEOGRAPH
+0xE294 0x7B0F #CJK UNIFIED IDEOGRAPH
+0xE295 0x7B0A #CJK UNIFIED IDEOGRAPH
+0xE296 0x7B06 #CJK UNIFIED IDEOGRAPH
+0xE297 0x7B33 #CJK UNIFIED IDEOGRAPH
+0xE298 0x7B18 #CJK UNIFIED IDEOGRAPH
+0xE299 0x7B19 #CJK UNIFIED IDEOGRAPH
+0xE29A 0x7B1E #CJK UNIFIED IDEOGRAPH
+0xE29B 0x7B35 #CJK UNIFIED IDEOGRAPH
+0xE29C 0x7B28 #CJK UNIFIED IDEOGRAPH
+0xE29D 0x7B36 #CJK UNIFIED IDEOGRAPH
+0xE29E 0x7B50 #CJK UNIFIED IDEOGRAPH
+0xE29F 0x7B7A #CJK UNIFIED IDEOGRAPH
+0xE2A0 0x7B04 #CJK UNIFIED IDEOGRAPH
+0xE2A1 0x7B4D #CJK UNIFIED IDEOGRAPH
+0xE2A2 0x7B0B #CJK UNIFIED IDEOGRAPH
+0xE2A3 0x7B4C #CJK UNIFIED IDEOGRAPH
+0xE2A4 0x7B45 #CJK UNIFIED IDEOGRAPH
+0xE2A5 0x7B75 #CJK UNIFIED IDEOGRAPH
+0xE2A6 0x7B65 #CJK UNIFIED IDEOGRAPH
+0xE2A7 0x7B74 #CJK UNIFIED IDEOGRAPH
+0xE2A8 0x7B67 #CJK UNIFIED IDEOGRAPH
+0xE2A9 0x7B70 #CJK UNIFIED IDEOGRAPH
+0xE2AA 0x7B71 #CJK UNIFIED IDEOGRAPH
+0xE2AB 0x7B6C #CJK UNIFIED IDEOGRAPH
+0xE2AC 0x7B6E #CJK UNIFIED IDEOGRAPH
+0xE2AD 0x7B9D #CJK UNIFIED IDEOGRAPH
+0xE2AE 0x7B98 #CJK UNIFIED IDEOGRAPH
+0xE2AF 0x7B9F #CJK UNIFIED IDEOGRAPH
+0xE2B0 0x7B8D #CJK UNIFIED IDEOGRAPH
+0xE2B1 0x7B9C #CJK UNIFIED IDEOGRAPH
+0xE2B2 0x7B9A #CJK UNIFIED IDEOGRAPH
+0xE2B3 0x7B8B #CJK UNIFIED IDEOGRAPH
+0xE2B4 0x7B92 #CJK UNIFIED IDEOGRAPH
+0xE2B5 0x7B8F #CJK UNIFIED IDEOGRAPH
+0xE2B6 0x7B5D #CJK UNIFIED IDEOGRAPH
+0xE2B7 0x7B99 #CJK UNIFIED IDEOGRAPH
+0xE2B8 0x7BCB #CJK UNIFIED IDEOGRAPH
+0xE2B9 0x7BC1 #CJK UNIFIED IDEOGRAPH
+0xE2BA 0x7BCC #CJK UNIFIED IDEOGRAPH
+0xE2BB 0x7BCF #CJK UNIFIED IDEOGRAPH
+0xE2BC 0x7BB4 #CJK UNIFIED IDEOGRAPH
+0xE2BD 0x7BC6 #CJK UNIFIED IDEOGRAPH
+0xE2BE 0x7BDD #CJK UNIFIED IDEOGRAPH
+0xE2BF 0x7BE9 #CJK UNIFIED IDEOGRAPH
+0xE2C0 0x7C11 #CJK UNIFIED IDEOGRAPH
+0xE2C1 0x7C14 #CJK UNIFIED IDEOGRAPH
+0xE2C2 0x7BE6 #CJK UNIFIED IDEOGRAPH
+0xE2C3 0x7BE5 #CJK UNIFIED IDEOGRAPH
+0xE2C4 0x7C60 #CJK UNIFIED IDEOGRAPH
+0xE2C5 0x7C00 #CJK UNIFIED IDEOGRAPH
+0xE2C6 0x7C07 #CJK UNIFIED IDEOGRAPH
+0xE2C7 0x7C13 #CJK UNIFIED IDEOGRAPH
+0xE2C8 0x7BF3 #CJK UNIFIED IDEOGRAPH
+0xE2C9 0x7BF7 #CJK UNIFIED IDEOGRAPH
+0xE2CA 0x7C17 #CJK UNIFIED IDEOGRAPH
+0xE2CB 0x7C0D #CJK UNIFIED IDEOGRAPH
+0xE2CC 0x7BF6 #CJK UNIFIED IDEOGRAPH
+0xE2CD 0x7C23 #CJK UNIFIED IDEOGRAPH
+0xE2CE 0x7C27 #CJK UNIFIED IDEOGRAPH
+0xE2CF 0x7C2A #CJK UNIFIED IDEOGRAPH
+0xE2D0 0x7C1F #CJK UNIFIED IDEOGRAPH
+0xE2D1 0x7C37 #CJK UNIFIED IDEOGRAPH
+0xE2D2 0x7C2B #CJK UNIFIED IDEOGRAPH
+0xE2D3 0x7C3D #CJK UNIFIED IDEOGRAPH
+0xE2D4 0x7C4C #CJK UNIFIED IDEOGRAPH
+0xE2D5 0x7C43 #CJK UNIFIED IDEOGRAPH
+0xE2D6 0x7C54 #CJK UNIFIED IDEOGRAPH
+0xE2D7 0x7C4F #CJK UNIFIED IDEOGRAPH
+0xE2D8 0x7C40 #CJK UNIFIED IDEOGRAPH
+0xE2D9 0x7C50 #CJK UNIFIED IDEOGRAPH
+0xE2DA 0x7C58 #CJK UNIFIED IDEOGRAPH
+0xE2DB 0x7C5F #CJK UNIFIED IDEOGRAPH
+0xE2DC 0x7C64 #CJK UNIFIED IDEOGRAPH
+0xE2DD 0x7C56 #CJK UNIFIED IDEOGRAPH
+0xE2DE 0x7C65 #CJK UNIFIED IDEOGRAPH
+0xE2DF 0x7C6C #CJK UNIFIED IDEOGRAPH
+0xE2E0 0x7C75 #CJK UNIFIED IDEOGRAPH
+0xE2E1 0x7C83 #CJK UNIFIED IDEOGRAPH
+0xE2E2 0x7C90 #CJK UNIFIED IDEOGRAPH
+0xE2E3 0x7CA4 #CJK UNIFIED IDEOGRAPH
+0xE2E4 0x7CAD #CJK UNIFIED IDEOGRAPH
+0xE2E5 0x7CA2 #CJK UNIFIED IDEOGRAPH
+0xE2E6 0x7CAB #CJK UNIFIED IDEOGRAPH
+0xE2E7 0x7CA1 #CJK UNIFIED IDEOGRAPH
+0xE2E8 0x7CA8 #CJK UNIFIED IDEOGRAPH
+0xE2E9 0x7CB3 #CJK UNIFIED IDEOGRAPH
+0xE2EA 0x7CB2 #CJK UNIFIED IDEOGRAPH
+0xE2EB 0x7CB1 #CJK UNIFIED IDEOGRAPH
+0xE2EC 0x7CAE #CJK UNIFIED IDEOGRAPH
+0xE2ED 0x7CB9 #CJK UNIFIED IDEOGRAPH
+0xE2EE 0x7CBD #CJK UNIFIED IDEOGRAPH
+0xE2EF 0x7CC0 #CJK UNIFIED IDEOGRAPH
+0xE2F0 0x7CC5 #CJK UNIFIED IDEOGRAPH
+0xE2F1 0x7CC2 #CJK UNIFIED IDEOGRAPH
+0xE2F2 0x7CD8 #CJK UNIFIED IDEOGRAPH
+0xE2F3 0x7CD2 #CJK UNIFIED IDEOGRAPH
+0xE2F4 0x7CDC #CJK UNIFIED IDEOGRAPH
+0xE2F5 0x7CE2 #CJK UNIFIED IDEOGRAPH
+0xE2F6 0x9B3B #CJK UNIFIED IDEOGRAPH
+0xE2F7 0x7CEF #CJK UNIFIED IDEOGRAPH
+0xE2F8 0x7CF2 #CJK UNIFIED IDEOGRAPH
+0xE2F9 0x7CF4 #CJK UNIFIED IDEOGRAPH
+0xE2FA 0x7CF6 #CJK UNIFIED IDEOGRAPH
+0xE2FB 0x7CFA #CJK UNIFIED IDEOGRAPH
+0xE2FC 0x7D06 #CJK UNIFIED IDEOGRAPH
+0xE340 0x7D02 #CJK UNIFIED IDEOGRAPH
+0xE341 0x7D1C #CJK UNIFIED IDEOGRAPH
+0xE342 0x7D15 #CJK UNIFIED IDEOGRAPH
+0xE343 0x7D0A #CJK UNIFIED IDEOGRAPH
+0xE344 0x7D45 #CJK UNIFIED IDEOGRAPH
+0xE345 0x7D4B #CJK UNIFIED IDEOGRAPH
+0xE346 0x7D2E #CJK UNIFIED IDEOGRAPH
+0xE347 0x7D32 #CJK UNIFIED IDEOGRAPH
+0xE348 0x7D3F #CJK UNIFIED IDEOGRAPH
+0xE349 0x7D35 #CJK UNIFIED IDEOGRAPH
+0xE34A 0x7D46 #CJK UNIFIED IDEOGRAPH
+0xE34B 0x7D73 #CJK UNIFIED IDEOGRAPH
+0xE34C 0x7D56 #CJK UNIFIED IDEOGRAPH
+0xE34D 0x7D4E #CJK UNIFIED IDEOGRAPH
+0xE34E 0x7D72 #CJK UNIFIED IDEOGRAPH
+0xE34F 0x7D68 #CJK UNIFIED IDEOGRAPH
+0xE350 0x7D6E #CJK UNIFIED IDEOGRAPH
+0xE351 0x7D4F #CJK UNIFIED IDEOGRAPH
+0xE352 0x7D63 #CJK UNIFIED IDEOGRAPH
+0xE353 0x7D93 #CJK UNIFIED IDEOGRAPH
+0xE354 0x7D89 #CJK UNIFIED IDEOGRAPH
+0xE355 0x7D5B #CJK UNIFIED IDEOGRAPH
+0xE356 0x7D8F #CJK UNIFIED IDEOGRAPH
+0xE357 0x7D7D #CJK UNIFIED IDEOGRAPH
+0xE358 0x7D9B #CJK UNIFIED IDEOGRAPH
+0xE359 0x7DBA #CJK UNIFIED IDEOGRAPH
+0xE35A 0x7DAE #CJK UNIFIED IDEOGRAPH
+0xE35B 0x7DA3 #CJK UNIFIED IDEOGRAPH
+0xE35C 0x7DB5 #CJK UNIFIED IDEOGRAPH
+0xE35D 0x7DC7 #CJK UNIFIED IDEOGRAPH
+0xE35E 0x7DBD #CJK UNIFIED IDEOGRAPH
+0xE35F 0x7DAB #CJK UNIFIED IDEOGRAPH
+0xE360 0x7E3D #CJK UNIFIED IDEOGRAPH
+0xE361 0x7DA2 #CJK UNIFIED IDEOGRAPH
+0xE362 0x7DAF #CJK UNIFIED IDEOGRAPH
+0xE363 0x7DDC #CJK UNIFIED IDEOGRAPH
+0xE364 0x7DB8 #CJK UNIFIED IDEOGRAPH
+0xE365 0x7D9F #CJK UNIFIED IDEOGRAPH
+0xE366 0x7DB0 #CJK UNIFIED IDEOGRAPH
+0xE367 0x7DD8 #CJK UNIFIED IDEOGRAPH
+0xE368 0x7DDD #CJK UNIFIED IDEOGRAPH
+0xE369 0x7DE4 #CJK UNIFIED IDEOGRAPH
+0xE36A 0x7DDE #CJK UNIFIED IDEOGRAPH
+0xE36B 0x7DFB #CJK UNIFIED IDEOGRAPH
+0xE36C 0x7DF2 #CJK UNIFIED IDEOGRAPH
+0xE36D 0x7DE1 #CJK UNIFIED IDEOGRAPH
+0xE36E 0x7E05 #CJK UNIFIED IDEOGRAPH
+0xE36F 0x7E0A #CJK UNIFIED IDEOGRAPH
+0xE370 0x7E23 #CJK UNIFIED IDEOGRAPH
+0xE371 0x7E21 #CJK UNIFIED IDEOGRAPH
+0xE372 0x7E12 #CJK UNIFIED IDEOGRAPH
+0xE373 0x7E31 #CJK UNIFIED IDEOGRAPH
+0xE374 0x7E1F #CJK UNIFIED IDEOGRAPH
+0xE375 0x7E09 #CJK UNIFIED IDEOGRAPH
+0xE376 0x7E0B #CJK UNIFIED IDEOGRAPH
+0xE377 0x7E22 #CJK UNIFIED IDEOGRAPH
+0xE378 0x7E46 #CJK UNIFIED IDEOGRAPH
+0xE379 0x7E66 #CJK UNIFIED IDEOGRAPH
+0xE37A 0x7E3B #CJK UNIFIED IDEOGRAPH
+0xE37B 0x7E35 #CJK UNIFIED IDEOGRAPH
+0xE37C 0x7E39 #CJK UNIFIED IDEOGRAPH
+0xE37D 0x7E43 #CJK UNIFIED IDEOGRAPH
+0xE37E 0x7E37 #CJK UNIFIED IDEOGRAPH
+0xE380 0x7E32 #CJK UNIFIED IDEOGRAPH
+0xE381 0x7E3A #CJK UNIFIED IDEOGRAPH
+0xE382 0x7E67 #CJK UNIFIED IDEOGRAPH
+0xE383 0x7E5D #CJK UNIFIED IDEOGRAPH
+0xE384 0x7E56 #CJK UNIFIED IDEOGRAPH
+0xE385 0x7E5E #CJK UNIFIED IDEOGRAPH
+0xE386 0x7E59 #CJK UNIFIED IDEOGRAPH
+0xE387 0x7E5A #CJK UNIFIED IDEOGRAPH
+0xE388 0x7E79 #CJK UNIFIED IDEOGRAPH
+0xE389 0x7E6A #CJK UNIFIED IDEOGRAPH
+0xE38A 0x7E69 #CJK UNIFIED IDEOGRAPH
+0xE38B 0x7E7C #CJK UNIFIED IDEOGRAPH
+0xE38C 0x7E7B #CJK UNIFIED IDEOGRAPH
+0xE38D 0x7E83 #CJK UNIFIED IDEOGRAPH
+0xE38E 0x7DD5 #CJK UNIFIED IDEOGRAPH
+0xE38F 0x7E7D #CJK UNIFIED IDEOGRAPH
+0xE390 0x8FAE #CJK UNIFIED IDEOGRAPH
+0xE391 0x7E7F #CJK UNIFIED IDEOGRAPH
+0xE392 0x7E88 #CJK UNIFIED IDEOGRAPH
+0xE393 0x7E89 #CJK UNIFIED IDEOGRAPH
+0xE394 0x7E8C #CJK UNIFIED IDEOGRAPH
+0xE395 0x7E92 #CJK UNIFIED IDEOGRAPH
+0xE396 0x7E90 #CJK UNIFIED IDEOGRAPH
+0xE397 0x7E93 #CJK UNIFIED IDEOGRAPH
+0xE398 0x7E94 #CJK UNIFIED IDEOGRAPH
+0xE399 0x7E96 #CJK UNIFIED IDEOGRAPH
+0xE39A 0x7E8E #CJK UNIFIED IDEOGRAPH
+0xE39B 0x7E9B #CJK UNIFIED IDEOGRAPH
+0xE39C 0x7E9C #CJK UNIFIED IDEOGRAPH
+0xE39D 0x7F38 #CJK UNIFIED IDEOGRAPH
+0xE39E 0x7F3A #CJK UNIFIED IDEOGRAPH
+0xE39F 0x7F45 #CJK UNIFIED IDEOGRAPH
+0xE3A0 0x7F4C #CJK UNIFIED IDEOGRAPH
+0xE3A1 0x7F4D #CJK UNIFIED IDEOGRAPH
+0xE3A2 0x7F4E #CJK UNIFIED IDEOGRAPH
+0xE3A3 0x7F50 #CJK UNIFIED IDEOGRAPH
+0xE3A4 0x7F51 #CJK UNIFIED IDEOGRAPH
+0xE3A5 0x7F55 #CJK UNIFIED IDEOGRAPH
+0xE3A6 0x7F54 #CJK UNIFIED IDEOGRAPH
+0xE3A7 0x7F58 #CJK UNIFIED IDEOGRAPH
+0xE3A8 0x7F5F #CJK UNIFIED IDEOGRAPH
+0xE3A9 0x7F60 #CJK UNIFIED IDEOGRAPH
+0xE3AA 0x7F68 #CJK UNIFIED IDEOGRAPH
+0xE3AB 0x7F69 #CJK UNIFIED IDEOGRAPH
+0xE3AC 0x7F67 #CJK UNIFIED IDEOGRAPH
+0xE3AD 0x7F78 #CJK UNIFIED IDEOGRAPH
+0xE3AE 0x7F82 #CJK UNIFIED IDEOGRAPH
+0xE3AF 0x7F86 #CJK UNIFIED IDEOGRAPH
+0xE3B0 0x7F83 #CJK UNIFIED IDEOGRAPH
+0xE3B1 0x7F88 #CJK UNIFIED IDEOGRAPH
+0xE3B2 0x7F87 #CJK UNIFIED IDEOGRAPH
+0xE3B3 0x7F8C #CJK UNIFIED IDEOGRAPH
+0xE3B4 0x7F94 #CJK UNIFIED IDEOGRAPH
+0xE3B5 0x7F9E #CJK UNIFIED IDEOGRAPH
+0xE3B6 0x7F9D #CJK UNIFIED IDEOGRAPH
+0xE3B7 0x7F9A #CJK UNIFIED IDEOGRAPH
+0xE3B8 0x7FA3 #CJK UNIFIED IDEOGRAPH
+0xE3B9 0x7FAF #CJK UNIFIED IDEOGRAPH
+0xE3BA 0x7FB2 #CJK UNIFIED IDEOGRAPH
+0xE3BB 0x7FB9 #CJK UNIFIED IDEOGRAPH
+0xE3BC 0x7FAE #CJK UNIFIED IDEOGRAPH
+0xE3BD 0x7FB6 #CJK UNIFIED IDEOGRAPH
+0xE3BE 0x7FB8 #CJK UNIFIED IDEOGRAPH
+0xE3BF 0x8B71 #CJK UNIFIED IDEOGRAPH
+0xE3C0 0x7FC5 #CJK UNIFIED IDEOGRAPH
+0xE3C1 0x7FC6 #CJK UNIFIED IDEOGRAPH
+0xE3C2 0x7FCA #CJK UNIFIED IDEOGRAPH
+0xE3C3 0x7FD5 #CJK UNIFIED IDEOGRAPH
+0xE3C4 0x7FD4 #CJK UNIFIED IDEOGRAPH
+0xE3C5 0x7FE1 #CJK UNIFIED IDEOGRAPH
+0xE3C6 0x7FE6 #CJK UNIFIED IDEOGRAPH
+0xE3C7 0x7FE9 #CJK UNIFIED IDEOGRAPH
+0xE3C8 0x7FF3 #CJK UNIFIED IDEOGRAPH
+0xE3C9 0x7FF9 #CJK UNIFIED IDEOGRAPH
+0xE3CA 0x98DC #CJK UNIFIED IDEOGRAPH
+0xE3CB 0x8006 #CJK UNIFIED IDEOGRAPH
+0xE3CC 0x8004 #CJK UNIFIED IDEOGRAPH
+0xE3CD 0x800B #CJK UNIFIED IDEOGRAPH
+0xE3CE 0x8012 #CJK UNIFIED IDEOGRAPH
+0xE3CF 0x8018 #CJK UNIFIED IDEOGRAPH
+0xE3D0 0x8019 #CJK UNIFIED IDEOGRAPH
+0xE3D1 0x801C #CJK UNIFIED IDEOGRAPH
+0xE3D2 0x8021 #CJK UNIFIED IDEOGRAPH
+0xE3D3 0x8028 #CJK UNIFIED IDEOGRAPH
+0xE3D4 0x803F #CJK UNIFIED IDEOGRAPH
+0xE3D5 0x803B #CJK UNIFIED IDEOGRAPH
+0xE3D6 0x804A #CJK UNIFIED IDEOGRAPH
+0xE3D7 0x8046 #CJK UNIFIED IDEOGRAPH
+0xE3D8 0x8052 #CJK UNIFIED IDEOGRAPH
+0xE3D9 0x8058 #CJK UNIFIED IDEOGRAPH
+0xE3DA 0x805A #CJK UNIFIED IDEOGRAPH
+0xE3DB 0x805F #CJK UNIFIED IDEOGRAPH
+0xE3DC 0x8062 #CJK UNIFIED IDEOGRAPH
+0xE3DD 0x8068 #CJK UNIFIED IDEOGRAPH
+0xE3DE 0x8073 #CJK UNIFIED IDEOGRAPH
+0xE3DF 0x8072 #CJK UNIFIED IDEOGRAPH
+0xE3E0 0x8070 #CJK UNIFIED IDEOGRAPH
+0xE3E1 0x8076 #CJK UNIFIED IDEOGRAPH
+0xE3E2 0x8079 #CJK UNIFIED IDEOGRAPH
+0xE3E3 0x807D #CJK UNIFIED IDEOGRAPH
+0xE3E4 0x807F #CJK UNIFIED IDEOGRAPH
+0xE3E5 0x8084 #CJK UNIFIED IDEOGRAPH
+0xE3E6 0x8086 #CJK UNIFIED IDEOGRAPH
+0xE3E7 0x8085 #CJK UNIFIED IDEOGRAPH
+0xE3E8 0x809B #CJK UNIFIED IDEOGRAPH
+0xE3E9 0x8093 #CJK UNIFIED IDEOGRAPH
+0xE3EA 0x809A #CJK UNIFIED IDEOGRAPH
+0xE3EB 0x80AD #CJK UNIFIED IDEOGRAPH
+0xE3EC 0x5190 #CJK UNIFIED IDEOGRAPH
+0xE3ED 0x80AC #CJK UNIFIED IDEOGRAPH
+0xE3EE 0x80DB #CJK UNIFIED IDEOGRAPH
+0xE3EF 0x80E5 #CJK UNIFIED IDEOGRAPH
+0xE3F0 0x80D9 #CJK UNIFIED IDEOGRAPH
+0xE3F1 0x80DD #CJK UNIFIED IDEOGRAPH
+0xE3F2 0x80C4 #CJK UNIFIED IDEOGRAPH
+0xE3F3 0x80DA #CJK UNIFIED IDEOGRAPH
+0xE3F4 0x80D6 #CJK UNIFIED IDEOGRAPH
+0xE3F5 0x8109 #CJK UNIFIED IDEOGRAPH
+0xE3F6 0x80EF #CJK UNIFIED IDEOGRAPH
+0xE3F7 0x80F1 #CJK UNIFIED IDEOGRAPH
+0xE3F8 0x811B #CJK UNIFIED IDEOGRAPH
+0xE3F9 0x8129 #CJK UNIFIED IDEOGRAPH
+0xE3FA 0x8123 #CJK UNIFIED IDEOGRAPH
+0xE3FB 0x812F #CJK UNIFIED IDEOGRAPH
+0xE3FC 0x814B #CJK UNIFIED IDEOGRAPH
+0xE440 0x968B #CJK UNIFIED IDEOGRAPH
+0xE441 0x8146 #CJK UNIFIED IDEOGRAPH
+0xE442 0x813E #CJK UNIFIED IDEOGRAPH
+0xE443 0x8153 #CJK UNIFIED IDEOGRAPH
+0xE444 0x8151 #CJK UNIFIED IDEOGRAPH
+0xE445 0x80FC #CJK UNIFIED IDEOGRAPH
+0xE446 0x8171 #CJK UNIFIED IDEOGRAPH
+0xE447 0x816E #CJK UNIFIED IDEOGRAPH
+0xE448 0x8165 #CJK UNIFIED IDEOGRAPH
+0xE449 0x8166 #CJK UNIFIED IDEOGRAPH
+0xE44A 0x8174 #CJK UNIFIED IDEOGRAPH
+0xE44B 0x8183 #CJK UNIFIED IDEOGRAPH
+0xE44C 0x8188 #CJK UNIFIED IDEOGRAPH
+0xE44D 0x818A #CJK UNIFIED IDEOGRAPH
+0xE44E 0x8180 #CJK UNIFIED IDEOGRAPH
+0xE44F 0x8182 #CJK UNIFIED IDEOGRAPH
+0xE450 0x81A0 #CJK UNIFIED IDEOGRAPH
+0xE451 0x8195 #CJK UNIFIED IDEOGRAPH
+0xE452 0x81A4 #CJK UNIFIED IDEOGRAPH
+0xE453 0x81A3 #CJK UNIFIED IDEOGRAPH
+0xE454 0x815F #CJK UNIFIED IDEOGRAPH
+0xE455 0x8193 #CJK UNIFIED IDEOGRAPH
+0xE456 0x81A9 #CJK UNIFIED IDEOGRAPH
+0xE457 0x81B0 #CJK UNIFIED IDEOGRAPH
+0xE458 0x81B5 #CJK UNIFIED IDEOGRAPH
+0xE459 0x81BE #CJK UNIFIED IDEOGRAPH
+0xE45A 0x81B8 #CJK UNIFIED IDEOGRAPH
+0xE45B 0x81BD #CJK UNIFIED IDEOGRAPH
+0xE45C 0x81C0 #CJK UNIFIED IDEOGRAPH
+0xE45D 0x81C2 #CJK UNIFIED IDEOGRAPH
+0xE45E 0x81BA #CJK UNIFIED IDEOGRAPH
+0xE45F 0x81C9 #CJK UNIFIED IDEOGRAPH
+0xE460 0x81CD #CJK UNIFIED IDEOGRAPH
+0xE461 0x81D1 #CJK UNIFIED IDEOGRAPH
+0xE462 0x81D9 #CJK UNIFIED IDEOGRAPH
+0xE463 0x81D8 #CJK UNIFIED IDEOGRAPH
+0xE464 0x81C8 #CJK UNIFIED IDEOGRAPH
+0xE465 0x81DA #CJK UNIFIED IDEOGRAPH
+0xE466 0x81DF #CJK UNIFIED IDEOGRAPH
+0xE467 0x81E0 #CJK UNIFIED IDEOGRAPH
+0xE468 0x81E7 #CJK UNIFIED IDEOGRAPH
+0xE469 0x81FA #CJK UNIFIED IDEOGRAPH
+0xE46A 0x81FB #CJK UNIFIED IDEOGRAPH
+0xE46B 0x81FE #CJK UNIFIED IDEOGRAPH
+0xE46C 0x8201 #CJK UNIFIED IDEOGRAPH
+0xE46D 0x8202 #CJK UNIFIED IDEOGRAPH
+0xE46E 0x8205 #CJK UNIFIED IDEOGRAPH
+0xE46F 0x8207 #CJK UNIFIED IDEOGRAPH
+0xE470 0x820A #CJK UNIFIED IDEOGRAPH
+0xE471 0x820D #CJK UNIFIED IDEOGRAPH
+0xE472 0x8210 #CJK UNIFIED IDEOGRAPH
+0xE473 0x8216 #CJK UNIFIED IDEOGRAPH
+0xE474 0x8229 #CJK UNIFIED IDEOGRAPH
+0xE475 0x822B #CJK UNIFIED IDEOGRAPH
+0xE476 0x8238 #CJK UNIFIED IDEOGRAPH
+0xE477 0x8233 #CJK UNIFIED IDEOGRAPH
+0xE478 0x8240 #CJK UNIFIED IDEOGRAPH
+0xE479 0x8259 #CJK UNIFIED IDEOGRAPH
+0xE47A 0x8258 #CJK UNIFIED IDEOGRAPH
+0xE47B 0x825D #CJK UNIFIED IDEOGRAPH
+0xE47C 0x825A #CJK UNIFIED IDEOGRAPH
+0xE47D 0x825F #CJK UNIFIED IDEOGRAPH
+0xE47E 0x8264 #CJK UNIFIED IDEOGRAPH
+0xE480 0x8262 #CJK UNIFIED IDEOGRAPH
+0xE481 0x8268 #CJK UNIFIED IDEOGRAPH
+0xE482 0x826A #CJK UNIFIED IDEOGRAPH
+0xE483 0x826B #CJK UNIFIED IDEOGRAPH
+0xE484 0x822E #CJK UNIFIED IDEOGRAPH
+0xE485 0x8271 #CJK UNIFIED IDEOGRAPH
+0xE486 0x8277 #CJK UNIFIED IDEOGRAPH
+0xE487 0x8278 #CJK UNIFIED IDEOGRAPH
+0xE488 0x827E #CJK UNIFIED IDEOGRAPH
+0xE489 0x828D #CJK UNIFIED IDEOGRAPH
+0xE48A 0x8292 #CJK UNIFIED IDEOGRAPH
+0xE48B 0x82AB #CJK UNIFIED IDEOGRAPH
+0xE48C 0x829F #CJK UNIFIED IDEOGRAPH
+0xE48D 0x82BB #CJK UNIFIED IDEOGRAPH
+0xE48E 0x82AC #CJK UNIFIED IDEOGRAPH
+0xE48F 0x82E1 #CJK UNIFIED IDEOGRAPH
+0xE490 0x82E3 #CJK UNIFIED IDEOGRAPH
+0xE491 0x82DF #CJK UNIFIED IDEOGRAPH
+0xE492 0x82D2 #CJK UNIFIED IDEOGRAPH
+0xE493 0x82F4 #CJK UNIFIED IDEOGRAPH
+0xE494 0x82F3 #CJK UNIFIED IDEOGRAPH
+0xE495 0x82FA #CJK UNIFIED IDEOGRAPH
+0xE496 0x8393 #CJK UNIFIED IDEOGRAPH
+0xE497 0x8303 #CJK UNIFIED IDEOGRAPH
+0xE498 0x82FB #CJK UNIFIED IDEOGRAPH
+0xE499 0x82F9 #CJK UNIFIED IDEOGRAPH
+0xE49A 0x82DE #CJK UNIFIED IDEOGRAPH
+0xE49B 0x8306 #CJK UNIFIED IDEOGRAPH
+0xE49C 0x82DC #CJK UNIFIED IDEOGRAPH
+0xE49D 0x8309 #CJK UNIFIED IDEOGRAPH
+0xE49E 0x82D9 #CJK UNIFIED IDEOGRAPH
+0xE49F 0x8335 #CJK UNIFIED IDEOGRAPH
+0xE4A0 0x8334 #CJK UNIFIED IDEOGRAPH
+0xE4A1 0x8316 #CJK UNIFIED IDEOGRAPH
+0xE4A2 0x8332 #CJK UNIFIED IDEOGRAPH
+0xE4A3 0x8331 #CJK UNIFIED IDEOGRAPH
+0xE4A4 0x8340 #CJK UNIFIED IDEOGRAPH
+0xE4A5 0x8339 #CJK UNIFIED IDEOGRAPH
+0xE4A6 0x8350 #CJK UNIFIED IDEOGRAPH
+0xE4A7 0x8345 #CJK UNIFIED IDEOGRAPH
+0xE4A8 0x832F #CJK UNIFIED IDEOGRAPH
+0xE4A9 0x832B #CJK UNIFIED IDEOGRAPH
+0xE4AA 0x8317 #CJK UNIFIED IDEOGRAPH
+0xE4AB 0x8318 #CJK UNIFIED IDEOGRAPH
+0xE4AC 0x8385 #CJK UNIFIED IDEOGRAPH
+0xE4AD 0x839A #CJK UNIFIED IDEOGRAPH
+0xE4AE 0x83AA #CJK UNIFIED IDEOGRAPH
+0xE4AF 0x839F #CJK UNIFIED IDEOGRAPH
+0xE4B0 0x83A2 #CJK UNIFIED IDEOGRAPH
+0xE4B1 0x8396 #CJK UNIFIED IDEOGRAPH
+0xE4B2 0x8323 #CJK UNIFIED IDEOGRAPH
+0xE4B3 0x838E #CJK UNIFIED IDEOGRAPH
+0xE4B4 0x8387 #CJK UNIFIED IDEOGRAPH
+0xE4B5 0x838A #CJK UNIFIED IDEOGRAPH
+0xE4B6 0x837C #CJK UNIFIED IDEOGRAPH
+0xE4B7 0x83B5 #CJK UNIFIED IDEOGRAPH
+0xE4B8 0x8373 #CJK UNIFIED IDEOGRAPH
+0xE4B9 0x8375 #CJK UNIFIED IDEOGRAPH
+0xE4BA 0x83A0 #CJK UNIFIED IDEOGRAPH
+0xE4BB 0x8389 #CJK UNIFIED IDEOGRAPH
+0xE4BC 0x83A8 #CJK UNIFIED IDEOGRAPH
+0xE4BD 0x83F4 #CJK UNIFIED IDEOGRAPH
+0xE4BE 0x8413 #CJK UNIFIED IDEOGRAPH
+0xE4BF 0x83EB #CJK UNIFIED IDEOGRAPH
+0xE4C0 0x83CE #CJK UNIFIED IDEOGRAPH
+0xE4C1 0x83FD #CJK UNIFIED IDEOGRAPH
+0xE4C2 0x8403 #CJK UNIFIED IDEOGRAPH
+0xE4C3 0x83D8 #CJK UNIFIED IDEOGRAPH
+0xE4C4 0x840B #CJK UNIFIED IDEOGRAPH
+0xE4C5 0x83C1 #CJK UNIFIED IDEOGRAPH
+0xE4C6 0x83F7 #CJK UNIFIED IDEOGRAPH
+0xE4C7 0x8407 #CJK UNIFIED IDEOGRAPH
+0xE4C8 0x83E0 #CJK UNIFIED IDEOGRAPH
+0xE4C9 0x83F2 #CJK UNIFIED IDEOGRAPH
+0xE4CA 0x840D #CJK UNIFIED IDEOGRAPH
+0xE4CB 0x8422 #CJK UNIFIED IDEOGRAPH
+0xE4CC 0x8420 #CJK UNIFIED IDEOGRAPH
+0xE4CD 0x83BD #CJK UNIFIED IDEOGRAPH
+0xE4CE 0x8438 #CJK UNIFIED IDEOGRAPH
+0xE4CF 0x8506 #CJK UNIFIED IDEOGRAPH
+0xE4D0 0x83FB #CJK UNIFIED IDEOGRAPH
+0xE4D1 0x846D #CJK UNIFIED IDEOGRAPH
+0xE4D2 0x842A #CJK UNIFIED IDEOGRAPH
+0xE4D3 0x843C #CJK UNIFIED IDEOGRAPH
+0xE4D4 0x855A #CJK UNIFIED IDEOGRAPH
+0xE4D5 0x8484 #CJK UNIFIED IDEOGRAPH
+0xE4D6 0x8477 #CJK UNIFIED IDEOGRAPH
+0xE4D7 0x846B #CJK UNIFIED IDEOGRAPH
+0xE4D8 0x84AD #CJK UNIFIED IDEOGRAPH
+0xE4D9 0x846E #CJK UNIFIED IDEOGRAPH
+0xE4DA 0x8482 #CJK UNIFIED IDEOGRAPH
+0xE4DB 0x8469 #CJK UNIFIED IDEOGRAPH
+0xE4DC 0x8446 #CJK UNIFIED IDEOGRAPH
+0xE4DD 0x842C #CJK UNIFIED IDEOGRAPH
+0xE4DE 0x846F #CJK UNIFIED IDEOGRAPH
+0xE4DF 0x8479 #CJK UNIFIED IDEOGRAPH
+0xE4E0 0x8435 #CJK UNIFIED IDEOGRAPH
+0xE4E1 0x84CA #CJK UNIFIED IDEOGRAPH
+0xE4E2 0x8462 #CJK UNIFIED IDEOGRAPH
+0xE4E3 0x84B9 #CJK UNIFIED IDEOGRAPH
+0xE4E4 0x84BF #CJK UNIFIED IDEOGRAPH
+0xE4E5 0x849F #CJK UNIFIED IDEOGRAPH
+0xE4E6 0x84D9 #CJK UNIFIED IDEOGRAPH
+0xE4E7 0x84CD #CJK UNIFIED IDEOGRAPH
+0xE4E8 0x84BB #CJK UNIFIED IDEOGRAPH
+0xE4E9 0x84DA #CJK UNIFIED IDEOGRAPH
+0xE4EA 0x84D0 #CJK UNIFIED IDEOGRAPH
+0xE4EB 0x84C1 #CJK UNIFIED IDEOGRAPH
+0xE4EC 0x84C6 #CJK UNIFIED IDEOGRAPH
+0xE4ED 0x84D6 #CJK UNIFIED IDEOGRAPH
+0xE4EE 0x84A1 #CJK UNIFIED IDEOGRAPH
+0xE4EF 0x8521 #CJK UNIFIED IDEOGRAPH
+0xE4F0 0x84FF #CJK UNIFIED IDEOGRAPH
+0xE4F1 0x84F4 #CJK UNIFIED IDEOGRAPH
+0xE4F2 0x8517 #CJK UNIFIED IDEOGRAPH
+0xE4F3 0x8518 #CJK UNIFIED IDEOGRAPH
+0xE4F4 0x852C #CJK UNIFIED IDEOGRAPH
+0xE4F5 0x851F #CJK UNIFIED IDEOGRAPH
+0xE4F6 0x8515 #CJK UNIFIED IDEOGRAPH
+0xE4F7 0x8514 #CJK UNIFIED IDEOGRAPH
+0xE4F8 0x84FC #CJK UNIFIED IDEOGRAPH
+0xE4F9 0x8540 #CJK UNIFIED IDEOGRAPH
+0xE4FA 0x8563 #CJK UNIFIED IDEOGRAPH
+0xE4FB 0x8558 #CJK UNIFIED IDEOGRAPH
+0xE4FC 0x8548 #CJK UNIFIED IDEOGRAPH
+0xE540 0x8541 #CJK UNIFIED IDEOGRAPH
+0xE541 0x8602 #CJK UNIFIED IDEOGRAPH
+0xE542 0x854B #CJK UNIFIED IDEOGRAPH
+0xE543 0x8555 #CJK UNIFIED IDEOGRAPH
+0xE544 0x8580 #CJK UNIFIED IDEOGRAPH
+0xE545 0x85A4 #CJK UNIFIED IDEOGRAPH
+0xE546 0x8588 #CJK UNIFIED IDEOGRAPH
+0xE547 0x8591 #CJK UNIFIED IDEOGRAPH
+0xE548 0x858A #CJK UNIFIED IDEOGRAPH
+0xE549 0x85A8 #CJK UNIFIED IDEOGRAPH
+0xE54A 0x856D #CJK UNIFIED IDEOGRAPH
+0xE54B 0x8594 #CJK UNIFIED IDEOGRAPH
+0xE54C 0x859B #CJK UNIFIED IDEOGRAPH
+0xE54D 0x85EA #CJK UNIFIED IDEOGRAPH
+0xE54E 0x8587 #CJK UNIFIED IDEOGRAPH
+0xE54F 0x859C #CJK UNIFIED IDEOGRAPH
+0xE550 0x8577 #CJK UNIFIED IDEOGRAPH
+0xE551 0x857E #CJK UNIFIED IDEOGRAPH
+0xE552 0x8590 #CJK UNIFIED IDEOGRAPH
+0xE553 0x85C9 #CJK UNIFIED IDEOGRAPH
+0xE554 0x85BA #CJK UNIFIED IDEOGRAPH
+0xE555 0x85CF #CJK UNIFIED IDEOGRAPH
+0xE556 0x85B9 #CJK UNIFIED IDEOGRAPH
+0xE557 0x85D0 #CJK UNIFIED IDEOGRAPH
+0xE558 0x85D5 #CJK UNIFIED IDEOGRAPH
+0xE559 0x85DD #CJK UNIFIED IDEOGRAPH
+0xE55A 0x85E5 #CJK UNIFIED IDEOGRAPH
+0xE55B 0x85DC #CJK UNIFIED IDEOGRAPH
+0xE55C 0x85F9 #CJK UNIFIED IDEOGRAPH
+0xE55D 0x860A #CJK UNIFIED IDEOGRAPH
+0xE55E 0x8613 #CJK UNIFIED IDEOGRAPH
+0xE55F 0x860B #CJK UNIFIED IDEOGRAPH
+0xE560 0x85FE #CJK UNIFIED IDEOGRAPH
+0xE561 0x85FA #CJK UNIFIED IDEOGRAPH
+0xE562 0x8606 #CJK UNIFIED IDEOGRAPH
+0xE563 0x8622 #CJK UNIFIED IDEOGRAPH
+0xE564 0x861A #CJK UNIFIED IDEOGRAPH
+0xE565 0x8630 #CJK UNIFIED IDEOGRAPH
+0xE566 0x863F #CJK UNIFIED IDEOGRAPH
+0xE567 0x864D #CJK UNIFIED IDEOGRAPH
+0xE568 0x4E55 #CJK UNIFIED IDEOGRAPH
+0xE569 0x8654 #CJK UNIFIED IDEOGRAPH
+0xE56A 0x865F #CJK UNIFIED IDEOGRAPH
+0xE56B 0x8667 #CJK UNIFIED IDEOGRAPH
+0xE56C 0x8671 #CJK UNIFIED IDEOGRAPH
+0xE56D 0x8693 #CJK UNIFIED IDEOGRAPH
+0xE56E 0x86A3 #CJK UNIFIED IDEOGRAPH
+0xE56F 0x86A9 #CJK UNIFIED IDEOGRAPH
+0xE570 0x86AA #CJK UNIFIED IDEOGRAPH
+0xE571 0x868B #CJK UNIFIED IDEOGRAPH
+0xE572 0x868C #CJK UNIFIED IDEOGRAPH
+0xE573 0x86B6 #CJK UNIFIED IDEOGRAPH
+0xE574 0x86AF #CJK UNIFIED IDEOGRAPH
+0xE575 0x86C4 #CJK UNIFIED IDEOGRAPH
+0xE576 0x86C6 #CJK UNIFIED IDEOGRAPH
+0xE577 0x86B0 #CJK UNIFIED IDEOGRAPH
+0xE578 0x86C9 #CJK UNIFIED IDEOGRAPH
+0xE579 0x8823 #CJK UNIFIED IDEOGRAPH
+0xE57A 0x86AB #CJK UNIFIED IDEOGRAPH
+0xE57B 0x86D4 #CJK UNIFIED IDEOGRAPH
+0xE57C 0x86DE #CJK UNIFIED IDEOGRAPH
+0xE57D 0x86E9 #CJK UNIFIED IDEOGRAPH
+0xE57E 0x86EC #CJK UNIFIED IDEOGRAPH
+0xE580 0x86DF #CJK UNIFIED IDEOGRAPH
+0xE581 0x86DB #CJK UNIFIED IDEOGRAPH
+0xE582 0x86EF #CJK UNIFIED IDEOGRAPH
+0xE583 0x8712 #CJK UNIFIED IDEOGRAPH
+0xE584 0x8706 #CJK UNIFIED IDEOGRAPH
+0xE585 0x8708 #CJK UNIFIED IDEOGRAPH
+0xE586 0x8700 #CJK UNIFIED IDEOGRAPH
+0xE587 0x8703 #CJK UNIFIED IDEOGRAPH
+0xE588 0x86FB #CJK UNIFIED IDEOGRAPH
+0xE589 0x8711 #CJK UNIFIED IDEOGRAPH
+0xE58A 0x8709 #CJK UNIFIED IDEOGRAPH
+0xE58B 0x870D #CJK UNIFIED IDEOGRAPH
+0xE58C 0x86F9 #CJK UNIFIED IDEOGRAPH
+0xE58D 0x870A #CJK UNIFIED IDEOGRAPH
+0xE58E 0x8734 #CJK UNIFIED IDEOGRAPH
+0xE58F 0x873F #CJK UNIFIED IDEOGRAPH
+0xE590 0x8737 #CJK UNIFIED IDEOGRAPH
+0xE591 0x873B #CJK UNIFIED IDEOGRAPH
+0xE592 0x8725 #CJK UNIFIED IDEOGRAPH
+0xE593 0x8729 #CJK UNIFIED IDEOGRAPH
+0xE594 0x871A #CJK UNIFIED IDEOGRAPH
+0xE595 0x8760 #CJK UNIFIED IDEOGRAPH
+0xE596 0x875F #CJK UNIFIED IDEOGRAPH
+0xE597 0x8778 #CJK UNIFIED IDEOGRAPH
+0xE598 0x874C #CJK UNIFIED IDEOGRAPH
+0xE599 0x874E #CJK UNIFIED IDEOGRAPH
+0xE59A 0x8774 #CJK UNIFIED IDEOGRAPH
+0xE59B 0x8757 #CJK UNIFIED IDEOGRAPH
+0xE59C 0x8768 #CJK UNIFIED IDEOGRAPH
+0xE59D 0x876E #CJK UNIFIED IDEOGRAPH
+0xE59E 0x8759 #CJK UNIFIED IDEOGRAPH
+0xE59F 0x8753 #CJK UNIFIED IDEOGRAPH
+0xE5A0 0x8763 #CJK UNIFIED IDEOGRAPH
+0xE5A1 0x876A #CJK UNIFIED IDEOGRAPH
+0xE5A2 0x8805 #CJK UNIFIED IDEOGRAPH
+0xE5A3 0x87A2 #CJK UNIFIED IDEOGRAPH
+0xE5A4 0x879F #CJK UNIFIED IDEOGRAPH
+0xE5A5 0x8782 #CJK UNIFIED IDEOGRAPH
+0xE5A6 0x87AF #CJK UNIFIED IDEOGRAPH
+0xE5A7 0x87CB #CJK UNIFIED IDEOGRAPH
+0xE5A8 0x87BD #CJK UNIFIED IDEOGRAPH
+0xE5A9 0x87C0 #CJK UNIFIED IDEOGRAPH
+0xE5AA 0x87D0 #CJK UNIFIED IDEOGRAPH
+0xE5AB 0x96D6 #CJK UNIFIED IDEOGRAPH
+0xE5AC 0x87AB #CJK UNIFIED IDEOGRAPH
+0xE5AD 0x87C4 #CJK UNIFIED IDEOGRAPH
+0xE5AE 0x87B3 #CJK UNIFIED IDEOGRAPH
+0xE5AF 0x87C7 #CJK UNIFIED IDEOGRAPH
+0xE5B0 0x87C6 #CJK UNIFIED IDEOGRAPH
+0xE5B1 0x87BB #CJK UNIFIED IDEOGRAPH
+0xE5B2 0x87EF #CJK UNIFIED IDEOGRAPH
+0xE5B3 0x87F2 #CJK UNIFIED IDEOGRAPH
+0xE5B4 0x87E0 #CJK UNIFIED IDEOGRAPH
+0xE5B5 0x880F #CJK UNIFIED IDEOGRAPH
+0xE5B6 0x880D #CJK UNIFIED IDEOGRAPH
+0xE5B7 0x87FE #CJK UNIFIED IDEOGRAPH
+0xE5B8 0x87F6 #CJK UNIFIED IDEOGRAPH
+0xE5B9 0x87F7 #CJK UNIFIED IDEOGRAPH
+0xE5BA 0x880E #CJK UNIFIED IDEOGRAPH
+0xE5BB 0x87D2 #CJK UNIFIED IDEOGRAPH
+0xE5BC 0x8811 #CJK UNIFIED IDEOGRAPH
+0xE5BD 0x8816 #CJK UNIFIED IDEOGRAPH
+0xE5BE 0x8815 #CJK UNIFIED IDEOGRAPH
+0xE5BF 0x8822 #CJK UNIFIED IDEOGRAPH
+0xE5C0 0x8821 #CJK UNIFIED IDEOGRAPH
+0xE5C1 0x8831 #CJK UNIFIED IDEOGRAPH
+0xE5C2 0x8836 #CJK UNIFIED IDEOGRAPH
+0xE5C3 0x8839 #CJK UNIFIED IDEOGRAPH
+0xE5C4 0x8827 #CJK UNIFIED IDEOGRAPH
+0xE5C5 0x883B #CJK UNIFIED IDEOGRAPH
+0xE5C6 0x8844 #CJK UNIFIED IDEOGRAPH
+0xE5C7 0x8842 #CJK UNIFIED IDEOGRAPH
+0xE5C8 0x8852 #CJK UNIFIED IDEOGRAPH
+0xE5C9 0x8859 #CJK UNIFIED IDEOGRAPH
+0xE5CA 0x885E #CJK UNIFIED IDEOGRAPH
+0xE5CB 0x8862 #CJK UNIFIED IDEOGRAPH
+0xE5CC 0x886B #CJK UNIFIED IDEOGRAPH
+0xE5CD 0x8881 #CJK UNIFIED IDEOGRAPH
+0xE5CE 0x887E #CJK UNIFIED IDEOGRAPH
+0xE5CF 0x889E #CJK UNIFIED IDEOGRAPH
+0xE5D0 0x8875 #CJK UNIFIED IDEOGRAPH
+0xE5D1 0x887D #CJK UNIFIED IDEOGRAPH
+0xE5D2 0x88B5 #CJK UNIFIED IDEOGRAPH
+0xE5D3 0x8872 #CJK UNIFIED IDEOGRAPH
+0xE5D4 0x8882 #CJK UNIFIED IDEOGRAPH
+0xE5D5 0x8897 #CJK UNIFIED IDEOGRAPH
+0xE5D6 0x8892 #CJK UNIFIED IDEOGRAPH
+0xE5D7 0x88AE #CJK UNIFIED IDEOGRAPH
+0xE5D8 0x8899 #CJK UNIFIED IDEOGRAPH
+0xE5D9 0x88A2 #CJK UNIFIED IDEOGRAPH
+0xE5DA 0x888D #CJK UNIFIED IDEOGRAPH
+0xE5DB 0x88A4 #CJK UNIFIED IDEOGRAPH
+0xE5DC 0x88B0 #CJK UNIFIED IDEOGRAPH
+0xE5DD 0x88BF #CJK UNIFIED IDEOGRAPH
+0xE5DE 0x88B1 #CJK UNIFIED IDEOGRAPH
+0xE5DF 0x88C3 #CJK UNIFIED IDEOGRAPH
+0xE5E0 0x88C4 #CJK UNIFIED IDEOGRAPH
+0xE5E1 0x88D4 #CJK UNIFIED IDEOGRAPH
+0xE5E2 0x88D8 #CJK UNIFIED IDEOGRAPH
+0xE5E3 0x88D9 #CJK UNIFIED IDEOGRAPH
+0xE5E4 0x88DD #CJK UNIFIED IDEOGRAPH
+0xE5E5 0x88F9 #CJK UNIFIED IDEOGRAPH
+0xE5E6 0x8902 #CJK UNIFIED IDEOGRAPH
+0xE5E7 0x88FC #CJK UNIFIED IDEOGRAPH
+0xE5E8 0x88F4 #CJK UNIFIED IDEOGRAPH
+0xE5E9 0x88E8 #CJK UNIFIED IDEOGRAPH
+0xE5EA 0x88F2 #CJK UNIFIED IDEOGRAPH
+0xE5EB 0x8904 #CJK UNIFIED IDEOGRAPH
+0xE5EC 0x890C #CJK UNIFIED IDEOGRAPH
+0xE5ED 0x890A #CJK UNIFIED IDEOGRAPH
+0xE5EE 0x8913 #CJK UNIFIED IDEOGRAPH
+0xE5EF 0x8943 #CJK UNIFIED IDEOGRAPH
+0xE5F0 0x891E #CJK UNIFIED IDEOGRAPH
+0xE5F1 0x8925 #CJK UNIFIED IDEOGRAPH
+0xE5F2 0x892A #CJK UNIFIED IDEOGRAPH
+0xE5F3 0x892B #CJK UNIFIED IDEOGRAPH
+0xE5F4 0x8941 #CJK UNIFIED IDEOGRAPH
+0xE5F5 0x8944 #CJK UNIFIED IDEOGRAPH
+0xE5F6 0x893B #CJK UNIFIED IDEOGRAPH
+0xE5F7 0x8936 #CJK UNIFIED IDEOGRAPH
+0xE5F8 0x8938 #CJK UNIFIED IDEOGRAPH
+0xE5F9 0x894C #CJK UNIFIED IDEOGRAPH
+0xE5FA 0x891D #CJK UNIFIED IDEOGRAPH
+0xE5FB 0x8960 #CJK UNIFIED IDEOGRAPH
+0xE5FC 0x895E #CJK UNIFIED IDEOGRAPH
+0xE640 0x8966 #CJK UNIFIED IDEOGRAPH
+0xE641 0x8964 #CJK UNIFIED IDEOGRAPH
+0xE642 0x896D #CJK UNIFIED IDEOGRAPH
+0xE643 0x896A #CJK UNIFIED IDEOGRAPH
+0xE644 0x896F #CJK UNIFIED IDEOGRAPH
+0xE645 0x8974 #CJK UNIFIED IDEOGRAPH
+0xE646 0x8977 #CJK UNIFIED IDEOGRAPH
+0xE647 0x897E #CJK UNIFIED IDEOGRAPH
+0xE648 0x8983 #CJK UNIFIED IDEOGRAPH
+0xE649 0x8988 #CJK UNIFIED IDEOGRAPH
+0xE64A 0x898A #CJK UNIFIED IDEOGRAPH
+0xE64B 0x8993 #CJK UNIFIED IDEOGRAPH
+0xE64C 0x8998 #CJK UNIFIED IDEOGRAPH
+0xE64D 0x89A1 #CJK UNIFIED IDEOGRAPH
+0xE64E 0x89A9 #CJK UNIFIED IDEOGRAPH
+0xE64F 0x89A6 #CJK UNIFIED IDEOGRAPH
+0xE650 0x89AC #CJK UNIFIED IDEOGRAPH
+0xE651 0x89AF #CJK UNIFIED IDEOGRAPH
+0xE652 0x89B2 #CJK UNIFIED IDEOGRAPH
+0xE653 0x89BA #CJK UNIFIED IDEOGRAPH
+0xE654 0x89BD #CJK UNIFIED IDEOGRAPH
+0xE655 0x89BF #CJK UNIFIED IDEOGRAPH
+0xE656 0x89C0 #CJK UNIFIED IDEOGRAPH
+0xE657 0x89DA #CJK UNIFIED IDEOGRAPH
+0xE658 0x89DC #CJK UNIFIED IDEOGRAPH
+0xE659 0x89DD #CJK UNIFIED IDEOGRAPH
+0xE65A 0x89E7 #CJK UNIFIED IDEOGRAPH
+0xE65B 0x89F4 #CJK UNIFIED IDEOGRAPH
+0xE65C 0x89F8 #CJK UNIFIED IDEOGRAPH
+0xE65D 0x8A03 #CJK UNIFIED IDEOGRAPH
+0xE65E 0x8A16 #CJK UNIFIED IDEOGRAPH
+0xE65F 0x8A10 #CJK UNIFIED IDEOGRAPH
+0xE660 0x8A0C #CJK UNIFIED IDEOGRAPH
+0xE661 0x8A1B #CJK UNIFIED IDEOGRAPH
+0xE662 0x8A1D #CJK UNIFIED IDEOGRAPH
+0xE663 0x8A25 #CJK UNIFIED IDEOGRAPH
+0xE664 0x8A36 #CJK UNIFIED IDEOGRAPH
+0xE665 0x8A41 #CJK UNIFIED IDEOGRAPH
+0xE666 0x8A5B #CJK UNIFIED IDEOGRAPH
+0xE667 0x8A52 #CJK UNIFIED IDEOGRAPH
+0xE668 0x8A46 #CJK UNIFIED IDEOGRAPH
+0xE669 0x8A48 #CJK UNIFIED IDEOGRAPH
+0xE66A 0x8A7C #CJK UNIFIED IDEOGRAPH
+0xE66B 0x8A6D #CJK UNIFIED IDEOGRAPH
+0xE66C 0x8A6C #CJK UNIFIED IDEOGRAPH
+0xE66D 0x8A62 #CJK UNIFIED IDEOGRAPH
+0xE66E 0x8A85 #CJK UNIFIED IDEOGRAPH
+0xE66F 0x8A82 #CJK UNIFIED IDEOGRAPH
+0xE670 0x8A84 #CJK UNIFIED IDEOGRAPH
+0xE671 0x8AA8 #CJK UNIFIED IDEOGRAPH
+0xE672 0x8AA1 #CJK UNIFIED IDEOGRAPH
+0xE673 0x8A91 #CJK UNIFIED IDEOGRAPH
+0xE674 0x8AA5 #CJK UNIFIED IDEOGRAPH
+0xE675 0x8AA6 #CJK UNIFIED IDEOGRAPH
+0xE676 0x8A9A #CJK UNIFIED IDEOGRAPH
+0xE677 0x8AA3 #CJK UNIFIED IDEOGRAPH
+0xE678 0x8AC4 #CJK UNIFIED IDEOGRAPH
+0xE679 0x8ACD #CJK UNIFIED IDEOGRAPH
+0xE67A 0x8AC2 #CJK UNIFIED IDEOGRAPH
+0xE67B 0x8ADA #CJK UNIFIED IDEOGRAPH
+0xE67C 0x8AEB #CJK UNIFIED IDEOGRAPH
+0xE67D 0x8AF3 #CJK UNIFIED IDEOGRAPH
+0xE67E 0x8AE7 #CJK UNIFIED IDEOGRAPH
+0xE680 0x8AE4 #CJK UNIFIED IDEOGRAPH
+0xE681 0x8AF1 #CJK UNIFIED IDEOGRAPH
+0xE682 0x8B14 #CJK UNIFIED IDEOGRAPH
+0xE683 0x8AE0 #CJK UNIFIED IDEOGRAPH
+0xE684 0x8AE2 #CJK UNIFIED IDEOGRAPH
+0xE685 0x8AF7 #CJK UNIFIED IDEOGRAPH
+0xE686 0x8ADE #CJK UNIFIED IDEOGRAPH
+0xE687 0x8ADB #CJK UNIFIED IDEOGRAPH
+0xE688 0x8B0C #CJK UNIFIED IDEOGRAPH
+0xE689 0x8B07 #CJK UNIFIED IDEOGRAPH
+0xE68A 0x8B1A #CJK UNIFIED IDEOGRAPH
+0xE68B 0x8AE1 #CJK UNIFIED IDEOGRAPH
+0xE68C 0x8B16 #CJK UNIFIED IDEOGRAPH
+0xE68D 0x8B10 #CJK UNIFIED IDEOGRAPH
+0xE68E 0x8B17 #CJK UNIFIED IDEOGRAPH
+0xE68F 0x8B20 #CJK UNIFIED IDEOGRAPH
+0xE690 0x8B33 #CJK UNIFIED IDEOGRAPH
+0xE691 0x97AB #CJK UNIFIED IDEOGRAPH
+0xE692 0x8B26 #CJK UNIFIED IDEOGRAPH
+0xE693 0x8B2B #CJK UNIFIED IDEOGRAPH
+0xE694 0x8B3E #CJK UNIFIED IDEOGRAPH
+0xE695 0x8B28 #CJK UNIFIED IDEOGRAPH
+0xE696 0x8B41 #CJK UNIFIED IDEOGRAPH
+0xE697 0x8B4C #CJK UNIFIED IDEOGRAPH
+0xE698 0x8B4F #CJK UNIFIED IDEOGRAPH
+0xE699 0x8B4E #CJK UNIFIED IDEOGRAPH
+0xE69A 0x8B49 #CJK UNIFIED IDEOGRAPH
+0xE69B 0x8B56 #CJK UNIFIED IDEOGRAPH
+0xE69C 0x8B5B #CJK UNIFIED IDEOGRAPH
+0xE69D 0x8B5A #CJK UNIFIED IDEOGRAPH
+0xE69E 0x8B6B #CJK UNIFIED IDEOGRAPH
+0xE69F 0x8B5F #CJK UNIFIED IDEOGRAPH
+0xE6A0 0x8B6C #CJK UNIFIED IDEOGRAPH
+0xE6A1 0x8B6F #CJK UNIFIED IDEOGRAPH
+0xE6A2 0x8B74 #CJK UNIFIED IDEOGRAPH
+0xE6A3 0x8B7D #CJK UNIFIED IDEOGRAPH
+0xE6A4 0x8B80 #CJK UNIFIED IDEOGRAPH
+0xE6A5 0x8B8C #CJK UNIFIED IDEOGRAPH
+0xE6A6 0x8B8E #CJK UNIFIED IDEOGRAPH
+0xE6A7 0x8B92 #CJK UNIFIED IDEOGRAPH
+0xE6A8 0x8B93 #CJK UNIFIED IDEOGRAPH
+0xE6A9 0x8B96 #CJK UNIFIED IDEOGRAPH
+0xE6AA 0x8B99 #CJK UNIFIED IDEOGRAPH
+0xE6AB 0x8B9A #CJK UNIFIED IDEOGRAPH
+0xE6AC 0x8C3A #CJK UNIFIED IDEOGRAPH
+0xE6AD 0x8C41 #CJK UNIFIED IDEOGRAPH
+0xE6AE 0x8C3F #CJK UNIFIED IDEOGRAPH
+0xE6AF 0x8C48 #CJK UNIFIED IDEOGRAPH
+0xE6B0 0x8C4C #CJK UNIFIED IDEOGRAPH
+0xE6B1 0x8C4E #CJK UNIFIED IDEOGRAPH
+0xE6B2 0x8C50 #CJK UNIFIED IDEOGRAPH
+0xE6B3 0x8C55 #CJK UNIFIED IDEOGRAPH
+0xE6B4 0x8C62 #CJK UNIFIED IDEOGRAPH
+0xE6B5 0x8C6C #CJK UNIFIED IDEOGRAPH
+0xE6B6 0x8C78 #CJK UNIFIED IDEOGRAPH
+0xE6B7 0x8C7A #CJK UNIFIED IDEOGRAPH
+0xE6B8 0x8C82 #CJK UNIFIED IDEOGRAPH
+0xE6B9 0x8C89 #CJK UNIFIED IDEOGRAPH
+0xE6BA 0x8C85 #CJK UNIFIED IDEOGRAPH
+0xE6BB 0x8C8A #CJK UNIFIED IDEOGRAPH
+0xE6BC 0x8C8D #CJK UNIFIED IDEOGRAPH
+0xE6BD 0x8C8E #CJK UNIFIED IDEOGRAPH
+0xE6BE 0x8C94 #CJK UNIFIED IDEOGRAPH
+0xE6BF 0x8C7C #CJK UNIFIED IDEOGRAPH
+0xE6C0 0x8C98 #CJK UNIFIED IDEOGRAPH
+0xE6C1 0x621D #CJK UNIFIED IDEOGRAPH
+0xE6C2 0x8CAD #CJK UNIFIED IDEOGRAPH
+0xE6C3 0x8CAA #CJK UNIFIED IDEOGRAPH
+0xE6C4 0x8CBD #CJK UNIFIED IDEOGRAPH
+0xE6C5 0x8CB2 #CJK UNIFIED IDEOGRAPH
+0xE6C6 0x8CB3 #CJK UNIFIED IDEOGRAPH
+0xE6C7 0x8CAE #CJK UNIFIED IDEOGRAPH
+0xE6C8 0x8CB6 #CJK UNIFIED IDEOGRAPH
+0xE6C9 0x8CC8 #CJK UNIFIED IDEOGRAPH
+0xE6CA 0x8CC1 #CJK UNIFIED IDEOGRAPH
+0xE6CB 0x8CE4 #CJK UNIFIED IDEOGRAPH
+0xE6CC 0x8CE3 #CJK UNIFIED IDEOGRAPH
+0xE6CD 0x8CDA #CJK UNIFIED IDEOGRAPH
+0xE6CE 0x8CFD #CJK UNIFIED IDEOGRAPH
+0xE6CF 0x8CFA #CJK UNIFIED IDEOGRAPH
+0xE6D0 0x8CFB #CJK UNIFIED IDEOGRAPH
+0xE6D1 0x8D04 #CJK UNIFIED IDEOGRAPH
+0xE6D2 0x8D05 #CJK UNIFIED IDEOGRAPH
+0xE6D3 0x8D0A #CJK UNIFIED IDEOGRAPH
+0xE6D4 0x8D07 #CJK UNIFIED IDEOGRAPH
+0xE6D5 0x8D0F #CJK UNIFIED IDEOGRAPH
+0xE6D6 0x8D0D #CJK UNIFIED IDEOGRAPH
+0xE6D7 0x8D10 #CJK UNIFIED IDEOGRAPH
+0xE6D8 0x9F4E #CJK UNIFIED IDEOGRAPH
+0xE6D9 0x8D13 #CJK UNIFIED IDEOGRAPH
+0xE6DA 0x8CCD #CJK UNIFIED IDEOGRAPH
+0xE6DB 0x8D14 #CJK UNIFIED IDEOGRAPH
+0xE6DC 0x8D16 #CJK UNIFIED IDEOGRAPH
+0xE6DD 0x8D67 #CJK UNIFIED IDEOGRAPH
+0xE6DE 0x8D6D #CJK UNIFIED IDEOGRAPH
+0xE6DF 0x8D71 #CJK UNIFIED IDEOGRAPH
+0xE6E0 0x8D73 #CJK UNIFIED IDEOGRAPH
+0xE6E1 0x8D81 #CJK UNIFIED IDEOGRAPH
+0xE6E2 0x8D99 #CJK UNIFIED IDEOGRAPH
+0xE6E3 0x8DC2 #CJK UNIFIED IDEOGRAPH
+0xE6E4 0x8DBE #CJK UNIFIED IDEOGRAPH
+0xE6E5 0x8DBA #CJK UNIFIED IDEOGRAPH
+0xE6E6 0x8DCF #CJK UNIFIED IDEOGRAPH
+0xE6E7 0x8DDA #CJK UNIFIED IDEOGRAPH
+0xE6E8 0x8DD6 #CJK UNIFIED IDEOGRAPH
+0xE6E9 0x8DCC #CJK UNIFIED IDEOGRAPH
+0xE6EA 0x8DDB #CJK UNIFIED IDEOGRAPH
+0xE6EB 0x8DCB #CJK UNIFIED IDEOGRAPH
+0xE6EC 0x8DEA #CJK UNIFIED IDEOGRAPH
+0xE6ED 0x8DEB #CJK UNIFIED IDEOGRAPH
+0xE6EE 0x8DDF #CJK UNIFIED IDEOGRAPH
+0xE6EF 0x8DE3 #CJK UNIFIED IDEOGRAPH
+0xE6F0 0x8DFC #CJK UNIFIED IDEOGRAPH
+0xE6F1 0x8E08 #CJK UNIFIED IDEOGRAPH
+0xE6F2 0x8E09 #CJK UNIFIED IDEOGRAPH
+0xE6F3 0x8DFF #CJK UNIFIED IDEOGRAPH
+0xE6F4 0x8E1D #CJK UNIFIED IDEOGRAPH
+0xE6F5 0x8E1E #CJK UNIFIED IDEOGRAPH
+0xE6F6 0x8E10 #CJK UNIFIED IDEOGRAPH
+0xE6F7 0x8E1F #CJK UNIFIED IDEOGRAPH
+0xE6F8 0x8E42 #CJK UNIFIED IDEOGRAPH
+0xE6F9 0x8E35 #CJK UNIFIED IDEOGRAPH
+0xE6FA 0x8E30 #CJK UNIFIED IDEOGRAPH
+0xE6FB 0x8E34 #CJK UNIFIED IDEOGRAPH
+0xE6FC 0x8E4A #CJK UNIFIED IDEOGRAPH
+0xE740 0x8E47 #CJK UNIFIED IDEOGRAPH
+0xE741 0x8E49 #CJK UNIFIED IDEOGRAPH
+0xE742 0x8E4C #CJK UNIFIED IDEOGRAPH
+0xE743 0x8E50 #CJK UNIFIED IDEOGRAPH
+0xE744 0x8E48 #CJK UNIFIED IDEOGRAPH
+0xE745 0x8E59 #CJK UNIFIED IDEOGRAPH
+0xE746 0x8E64 #CJK UNIFIED IDEOGRAPH
+0xE747 0x8E60 #CJK UNIFIED IDEOGRAPH
+0xE748 0x8E2A #CJK UNIFIED IDEOGRAPH
+0xE749 0x8E63 #CJK UNIFIED IDEOGRAPH
+0xE74A 0x8E55 #CJK UNIFIED IDEOGRAPH
+0xE74B 0x8E76 #CJK UNIFIED IDEOGRAPH
+0xE74C 0x8E72 #CJK UNIFIED IDEOGRAPH
+0xE74D 0x8E7C #CJK UNIFIED IDEOGRAPH
+0xE74E 0x8E81 #CJK UNIFIED IDEOGRAPH
+0xE74F 0x8E87 #CJK UNIFIED IDEOGRAPH
+0xE750 0x8E85 #CJK UNIFIED IDEOGRAPH
+0xE751 0x8E84 #CJK UNIFIED IDEOGRAPH
+0xE752 0x8E8B #CJK UNIFIED IDEOGRAPH
+0xE753 0x8E8A #CJK UNIFIED IDEOGRAPH
+0xE754 0x8E93 #CJK UNIFIED IDEOGRAPH
+0xE755 0x8E91 #CJK UNIFIED IDEOGRAPH
+0xE756 0x8E94 #CJK UNIFIED IDEOGRAPH
+0xE757 0x8E99 #CJK UNIFIED IDEOGRAPH
+0xE758 0x8EAA #CJK UNIFIED IDEOGRAPH
+0xE759 0x8EA1 #CJK UNIFIED IDEOGRAPH
+0xE75A 0x8EAC #CJK UNIFIED IDEOGRAPH
+0xE75B 0x8EB0 #CJK UNIFIED IDEOGRAPH
+0xE75C 0x8EC6 #CJK UNIFIED IDEOGRAPH
+0xE75D 0x8EB1 #CJK UNIFIED IDEOGRAPH
+0xE75E 0x8EBE #CJK UNIFIED IDEOGRAPH
+0xE75F 0x8EC5 #CJK UNIFIED IDEOGRAPH
+0xE760 0x8EC8 #CJK UNIFIED IDEOGRAPH
+0xE761 0x8ECB #CJK UNIFIED IDEOGRAPH
+0xE762 0x8EDB #CJK UNIFIED IDEOGRAPH
+0xE763 0x8EE3 #CJK UNIFIED IDEOGRAPH
+0xE764 0x8EFC #CJK UNIFIED IDEOGRAPH
+0xE765 0x8EFB #CJK UNIFIED IDEOGRAPH
+0xE766 0x8EEB #CJK UNIFIED IDEOGRAPH
+0xE767 0x8EFE #CJK UNIFIED IDEOGRAPH
+0xE768 0x8F0A #CJK UNIFIED IDEOGRAPH
+0xE769 0x8F05 #CJK UNIFIED IDEOGRAPH
+0xE76A 0x8F15 #CJK UNIFIED IDEOGRAPH
+0xE76B 0x8F12 #CJK UNIFIED IDEOGRAPH
+0xE76C 0x8F19 #CJK UNIFIED IDEOGRAPH
+0xE76D 0x8F13 #CJK UNIFIED IDEOGRAPH
+0xE76E 0x8F1C #CJK UNIFIED IDEOGRAPH
+0xE76F 0x8F1F #CJK UNIFIED IDEOGRAPH
+0xE770 0x8F1B #CJK UNIFIED IDEOGRAPH
+0xE771 0x8F0C #CJK UNIFIED IDEOGRAPH
+0xE772 0x8F26 #CJK UNIFIED IDEOGRAPH
+0xE773 0x8F33 #CJK UNIFIED IDEOGRAPH
+0xE774 0x8F3B #CJK UNIFIED IDEOGRAPH
+0xE775 0x8F39 #CJK UNIFIED IDEOGRAPH
+0xE776 0x8F45 #CJK UNIFIED IDEOGRAPH
+0xE777 0x8F42 #CJK UNIFIED IDEOGRAPH
+0xE778 0x8F3E #CJK UNIFIED IDEOGRAPH
+0xE779 0x8F4C #CJK UNIFIED IDEOGRAPH
+0xE77A 0x8F49 #CJK UNIFIED IDEOGRAPH
+0xE77B 0x8F46 #CJK UNIFIED IDEOGRAPH
+0xE77C 0x8F4E #CJK UNIFIED IDEOGRAPH
+0xE77D 0x8F57 #CJK UNIFIED IDEOGRAPH
+0xE77E 0x8F5C #CJK UNIFIED IDEOGRAPH
+0xE780 0x8F62 #CJK UNIFIED IDEOGRAPH
+0xE781 0x8F63 #CJK UNIFIED IDEOGRAPH
+0xE782 0x8F64 #CJK UNIFIED IDEOGRAPH
+0xE783 0x8F9C #CJK UNIFIED IDEOGRAPH
+0xE784 0x8F9F #CJK UNIFIED IDEOGRAPH
+0xE785 0x8FA3 #CJK UNIFIED IDEOGRAPH
+0xE786 0x8FAD #CJK UNIFIED IDEOGRAPH
+0xE787 0x8FAF #CJK UNIFIED IDEOGRAPH
+0xE788 0x8FB7 #CJK UNIFIED IDEOGRAPH
+0xE789 0x8FDA #CJK UNIFIED IDEOGRAPH
+0xE78A 0x8FE5 #CJK UNIFIED IDEOGRAPH
+0xE78B 0x8FE2 #CJK UNIFIED IDEOGRAPH
+0xE78C 0x8FEA #CJK UNIFIED IDEOGRAPH
+0xE78D 0x8FEF #CJK UNIFIED IDEOGRAPH
+0xE78E 0x9087 #CJK UNIFIED IDEOGRAPH
+0xE78F 0x8FF4 #CJK UNIFIED IDEOGRAPH
+0xE790 0x9005 #CJK UNIFIED IDEOGRAPH
+0xE791 0x8FF9 #CJK UNIFIED IDEOGRAPH
+0xE792 0x8FFA #CJK UNIFIED IDEOGRAPH
+0xE793 0x9011 #CJK UNIFIED IDEOGRAPH
+0xE794 0x9015 #CJK UNIFIED IDEOGRAPH
+0xE795 0x9021 #CJK UNIFIED IDEOGRAPH
+0xE796 0x900D #CJK UNIFIED IDEOGRAPH
+0xE797 0x901E #CJK UNIFIED IDEOGRAPH
+0xE798 0x9016 #CJK UNIFIED IDEOGRAPH
+0xE799 0x900B #CJK UNIFIED IDEOGRAPH
+0xE79A 0x9027 #CJK UNIFIED IDEOGRAPH
+0xE79B 0x9036 #CJK UNIFIED IDEOGRAPH
+0xE79C 0x9035 #CJK UNIFIED IDEOGRAPH
+0xE79D 0x9039 #CJK UNIFIED IDEOGRAPH
+0xE79E 0x8FF8 #CJK UNIFIED IDEOGRAPH
+0xE79F 0x904F #CJK UNIFIED IDEOGRAPH
+0xE7A0 0x9050 #CJK UNIFIED IDEOGRAPH
+0xE7A1 0x9051 #CJK UNIFIED IDEOGRAPH
+0xE7A2 0x9052 #CJK UNIFIED IDEOGRAPH
+0xE7A3 0x900E #CJK UNIFIED IDEOGRAPH
+0xE7A4 0x9049 #CJK UNIFIED IDEOGRAPH
+0xE7A5 0x903E #CJK UNIFIED IDEOGRAPH
+0xE7A6 0x9056 #CJK UNIFIED IDEOGRAPH
+0xE7A7 0x9058 #CJK UNIFIED IDEOGRAPH
+0xE7A8 0x905E #CJK UNIFIED IDEOGRAPH
+0xE7A9 0x9068 #CJK UNIFIED IDEOGRAPH
+0xE7AA 0x906F #CJK UNIFIED IDEOGRAPH
+0xE7AB 0x9076 #CJK UNIFIED IDEOGRAPH
+0xE7AC 0x96A8 #CJK UNIFIED IDEOGRAPH
+0xE7AD 0x9072 #CJK UNIFIED IDEOGRAPH
+0xE7AE 0x9082 #CJK UNIFIED IDEOGRAPH
+0xE7AF 0x907D #CJK UNIFIED IDEOGRAPH
+0xE7B0 0x9081 #CJK UNIFIED IDEOGRAPH
+0xE7B1 0x9080 #CJK UNIFIED IDEOGRAPH
+0xE7B2 0x908A #CJK UNIFIED IDEOGRAPH
+0xE7B3 0x9089 #CJK UNIFIED IDEOGRAPH
+0xE7B4 0x908F #CJK UNIFIED IDEOGRAPH
+0xE7B5 0x90A8 #CJK UNIFIED IDEOGRAPH
+0xE7B6 0x90AF #CJK UNIFIED IDEOGRAPH
+0xE7B7 0x90B1 #CJK UNIFIED IDEOGRAPH
+0xE7B8 0x90B5 #CJK UNIFIED IDEOGRAPH
+0xE7B9 0x90E2 #CJK UNIFIED IDEOGRAPH
+0xE7BA 0x90E4 #CJK UNIFIED IDEOGRAPH
+0xE7BB 0x6248 #CJK UNIFIED IDEOGRAPH
+0xE7BC 0x90DB #CJK UNIFIED IDEOGRAPH
+0xE7BD 0x9102 #CJK UNIFIED IDEOGRAPH
+0xE7BE 0x9112 #CJK UNIFIED IDEOGRAPH
+0xE7BF 0x9119 #CJK UNIFIED IDEOGRAPH
+0xE7C0 0x9132 #CJK UNIFIED IDEOGRAPH
+0xE7C1 0x9130 #CJK UNIFIED IDEOGRAPH
+0xE7C2 0x914A #CJK UNIFIED IDEOGRAPH
+0xE7C3 0x9156 #CJK UNIFIED IDEOGRAPH
+0xE7C4 0x9158 #CJK UNIFIED IDEOGRAPH
+0xE7C5 0x9163 #CJK UNIFIED IDEOGRAPH
+0xE7C6 0x9165 #CJK UNIFIED IDEOGRAPH
+0xE7C7 0x9169 #CJK UNIFIED IDEOGRAPH
+0xE7C8 0x9173 #CJK UNIFIED IDEOGRAPH
+0xE7C9 0x9172 #CJK UNIFIED IDEOGRAPH
+0xE7CA 0x918B #CJK UNIFIED IDEOGRAPH
+0xE7CB 0x9189 #CJK UNIFIED IDEOGRAPH
+0xE7CC 0x9182 #CJK UNIFIED IDEOGRAPH
+0xE7CD 0x91A2 #CJK UNIFIED IDEOGRAPH
+0xE7CE 0x91AB #CJK UNIFIED IDEOGRAPH
+0xE7CF 0x91AF #CJK UNIFIED IDEOGRAPH
+0xE7D0 0x91AA #CJK UNIFIED IDEOGRAPH
+0xE7D1 0x91B5 #CJK UNIFIED IDEOGRAPH
+0xE7D2 0x91B4 #CJK UNIFIED IDEOGRAPH
+0xE7D3 0x91BA #CJK UNIFIED IDEOGRAPH
+0xE7D4 0x91C0 #CJK UNIFIED IDEOGRAPH
+0xE7D5 0x91C1 #CJK UNIFIED IDEOGRAPH
+0xE7D6 0x91C9 #CJK UNIFIED IDEOGRAPH
+0xE7D7 0x91CB #CJK UNIFIED IDEOGRAPH
+0xE7D8 0x91D0 #CJK UNIFIED IDEOGRAPH
+0xE7D9 0x91D6 #CJK UNIFIED IDEOGRAPH
+0xE7DA 0x91DF #CJK UNIFIED IDEOGRAPH
+0xE7DB 0x91E1 #CJK UNIFIED IDEOGRAPH
+0xE7DC 0x91DB #CJK UNIFIED IDEOGRAPH
+0xE7DD 0x91FC #CJK UNIFIED IDEOGRAPH
+0xE7DE 0x91F5 #CJK UNIFIED IDEOGRAPH
+0xE7DF 0x91F6 #CJK UNIFIED IDEOGRAPH
+0xE7E0 0x921E #CJK UNIFIED IDEOGRAPH
+0xE7E1 0x91FF #CJK UNIFIED IDEOGRAPH
+0xE7E2 0x9214 #CJK UNIFIED IDEOGRAPH
+0xE7E3 0x922C #CJK UNIFIED IDEOGRAPH
+0xE7E4 0x9215 #CJK UNIFIED IDEOGRAPH
+0xE7E5 0x9211 #CJK UNIFIED IDEOGRAPH
+0xE7E6 0x925E #CJK UNIFIED IDEOGRAPH
+0xE7E7 0x9257 #CJK UNIFIED IDEOGRAPH
+0xE7E8 0x9245 #CJK UNIFIED IDEOGRAPH
+0xE7E9 0x9249 #CJK UNIFIED IDEOGRAPH
+0xE7EA 0x9264 #CJK UNIFIED IDEOGRAPH
+0xE7EB 0x9248 #CJK UNIFIED IDEOGRAPH
+0xE7EC 0x9295 #CJK UNIFIED IDEOGRAPH
+0xE7ED 0x923F #CJK UNIFIED IDEOGRAPH
+0xE7EE 0x924B #CJK UNIFIED IDEOGRAPH
+0xE7EF 0x9250 #CJK UNIFIED IDEOGRAPH
+0xE7F0 0x929C #CJK UNIFIED IDEOGRAPH
+0xE7F1 0x9296 #CJK UNIFIED IDEOGRAPH
+0xE7F2 0x9293 #CJK UNIFIED IDEOGRAPH
+0xE7F3 0x929B #CJK UNIFIED IDEOGRAPH
+0xE7F4 0x925A #CJK UNIFIED IDEOGRAPH
+0xE7F5 0x92CF #CJK UNIFIED IDEOGRAPH
+0xE7F6 0x92B9 #CJK UNIFIED IDEOGRAPH
+0xE7F7 0x92B7 #CJK UNIFIED IDEOGRAPH
+0xE7F8 0x92E9 #CJK UNIFIED IDEOGRAPH
+0xE7F9 0x930F #CJK UNIFIED IDEOGRAPH
+0xE7FA 0x92FA #CJK UNIFIED IDEOGRAPH
+0xE7FB 0x9344 #CJK UNIFIED IDEOGRAPH
+0xE7FC 0x932E #CJK UNIFIED IDEOGRAPH
+0xE840 0x9319 #CJK UNIFIED IDEOGRAPH
+0xE841 0x9322 #CJK UNIFIED IDEOGRAPH
+0xE842 0x931A #CJK UNIFIED IDEOGRAPH
+0xE843 0x9323 #CJK UNIFIED IDEOGRAPH
+0xE844 0x933A #CJK UNIFIED IDEOGRAPH
+0xE845 0x9335 #CJK UNIFIED IDEOGRAPH
+0xE846 0x933B #CJK UNIFIED IDEOGRAPH
+0xE847 0x935C #CJK UNIFIED IDEOGRAPH
+0xE848 0x9360 #CJK UNIFIED IDEOGRAPH
+0xE849 0x937C #CJK UNIFIED IDEOGRAPH
+0xE84A 0x936E #CJK UNIFIED IDEOGRAPH
+0xE84B 0x9356 #CJK UNIFIED IDEOGRAPH
+0xE84C 0x93B0 #CJK UNIFIED IDEOGRAPH
+0xE84D 0x93AC #CJK UNIFIED IDEOGRAPH
+0xE84E 0x93AD #CJK UNIFIED IDEOGRAPH
+0xE84F 0x9394 #CJK UNIFIED IDEOGRAPH
+0xE850 0x93B9 #CJK UNIFIED IDEOGRAPH
+0xE851 0x93D6 #CJK UNIFIED IDEOGRAPH
+0xE852 0x93D7 #CJK UNIFIED IDEOGRAPH
+0xE853 0x93E8 #CJK UNIFIED IDEOGRAPH
+0xE854 0x93E5 #CJK UNIFIED IDEOGRAPH
+0xE855 0x93D8 #CJK UNIFIED IDEOGRAPH
+0xE856 0x93C3 #CJK UNIFIED IDEOGRAPH
+0xE857 0x93DD #CJK UNIFIED IDEOGRAPH
+0xE858 0x93D0 #CJK UNIFIED IDEOGRAPH
+0xE859 0x93C8 #CJK UNIFIED IDEOGRAPH
+0xE85A 0x93E4 #CJK UNIFIED IDEOGRAPH
+0xE85B 0x941A #CJK UNIFIED IDEOGRAPH
+0xE85C 0x9414 #CJK UNIFIED IDEOGRAPH
+0xE85D 0x9413 #CJK UNIFIED IDEOGRAPH
+0xE85E 0x9403 #CJK UNIFIED IDEOGRAPH
+0xE85F 0x9407 #CJK UNIFIED IDEOGRAPH
+0xE860 0x9410 #CJK UNIFIED IDEOGRAPH
+0xE861 0x9436 #CJK UNIFIED IDEOGRAPH
+0xE862 0x942B #CJK UNIFIED IDEOGRAPH
+0xE863 0x9435 #CJK UNIFIED IDEOGRAPH
+0xE864 0x9421 #CJK UNIFIED IDEOGRAPH
+0xE865 0x943A #CJK UNIFIED IDEOGRAPH
+0xE866 0x9441 #CJK UNIFIED IDEOGRAPH
+0xE867 0x9452 #CJK UNIFIED IDEOGRAPH
+0xE868 0x9444 #CJK UNIFIED IDEOGRAPH
+0xE869 0x945B #CJK UNIFIED IDEOGRAPH
+0xE86A 0x9460 #CJK UNIFIED IDEOGRAPH
+0xE86B 0x9462 #CJK UNIFIED IDEOGRAPH
+0xE86C 0x945E #CJK UNIFIED IDEOGRAPH
+0xE86D 0x946A #CJK UNIFIED IDEOGRAPH
+0xE86E 0x9229 #CJK UNIFIED IDEOGRAPH
+0xE86F 0x9470 #CJK UNIFIED IDEOGRAPH
+0xE870 0x9475 #CJK UNIFIED IDEOGRAPH
+0xE871 0x9477 #CJK UNIFIED IDEOGRAPH
+0xE872 0x947D #CJK UNIFIED IDEOGRAPH
+0xE873 0x945A #CJK UNIFIED IDEOGRAPH
+0xE874 0x947C #CJK UNIFIED IDEOGRAPH
+0xE875 0x947E #CJK UNIFIED IDEOGRAPH
+0xE876 0x9481 #CJK UNIFIED IDEOGRAPH
+0xE877 0x947F #CJK UNIFIED IDEOGRAPH
+0xE878 0x9582 #CJK UNIFIED IDEOGRAPH
+0xE879 0x9587 #CJK UNIFIED IDEOGRAPH
+0xE87A 0x958A #CJK UNIFIED IDEOGRAPH
+0xE87B 0x9594 #CJK UNIFIED IDEOGRAPH
+0xE87C 0x9596 #CJK UNIFIED IDEOGRAPH
+0xE87D 0x9598 #CJK UNIFIED IDEOGRAPH
+0xE87E 0x9599 #CJK UNIFIED IDEOGRAPH
+0xE880 0x95A0 #CJK UNIFIED IDEOGRAPH
+0xE881 0x95A8 #CJK UNIFIED IDEOGRAPH
+0xE882 0x95A7 #CJK UNIFIED IDEOGRAPH
+0xE883 0x95AD #CJK UNIFIED IDEOGRAPH
+0xE884 0x95BC #CJK UNIFIED IDEOGRAPH
+0xE885 0x95BB #CJK UNIFIED IDEOGRAPH
+0xE886 0x95B9 #CJK UNIFIED IDEOGRAPH
+0xE887 0x95BE #CJK UNIFIED IDEOGRAPH
+0xE888 0x95CA #CJK UNIFIED IDEOGRAPH
+0xE889 0x6FF6 #CJK UNIFIED IDEOGRAPH
+0xE88A 0x95C3 #CJK UNIFIED IDEOGRAPH
+0xE88B 0x95CD #CJK UNIFIED IDEOGRAPH
+0xE88C 0x95CC #CJK UNIFIED IDEOGRAPH
+0xE88D 0x95D5 #CJK UNIFIED IDEOGRAPH
+0xE88E 0x95D4 #CJK UNIFIED IDEOGRAPH
+0xE88F 0x95D6 #CJK UNIFIED IDEOGRAPH
+0xE890 0x95DC #CJK UNIFIED IDEOGRAPH
+0xE891 0x95E1 #CJK UNIFIED IDEOGRAPH
+0xE892 0x95E5 #CJK UNIFIED IDEOGRAPH
+0xE893 0x95E2 #CJK UNIFIED IDEOGRAPH
+0xE894 0x9621 #CJK UNIFIED IDEOGRAPH
+0xE895 0x9628 #CJK UNIFIED IDEOGRAPH
+0xE896 0x962E #CJK UNIFIED IDEOGRAPH
+0xE897 0x962F #CJK UNIFIED IDEOGRAPH
+0xE898 0x9642 #CJK UNIFIED IDEOGRAPH
+0xE899 0x964C #CJK UNIFIED IDEOGRAPH
+0xE89A 0x964F #CJK UNIFIED IDEOGRAPH
+0xE89B 0x964B #CJK UNIFIED IDEOGRAPH
+0xE89C 0x9677 #CJK UNIFIED IDEOGRAPH
+0xE89D 0x965C #CJK UNIFIED IDEOGRAPH
+0xE89E 0x965E #CJK UNIFIED IDEOGRAPH
+0xE89F 0x965D #CJK UNIFIED IDEOGRAPH
+0xE8A0 0x965F #CJK UNIFIED IDEOGRAPH
+0xE8A1 0x9666 #CJK UNIFIED IDEOGRAPH
+0xE8A2 0x9672 #CJK UNIFIED IDEOGRAPH
+0xE8A3 0x966C #CJK UNIFIED IDEOGRAPH
+0xE8A4 0x968D #CJK UNIFIED IDEOGRAPH
+0xE8A5 0x9698 #CJK UNIFIED IDEOGRAPH
+0xE8A6 0x9695 #CJK UNIFIED IDEOGRAPH
+0xE8A7 0x9697 #CJK UNIFIED IDEOGRAPH
+0xE8A8 0x96AA #CJK UNIFIED IDEOGRAPH
+0xE8A9 0x96A7 #CJK UNIFIED IDEOGRAPH
+0xE8AA 0x96B1 #CJK UNIFIED IDEOGRAPH
+0xE8AB 0x96B2 #CJK UNIFIED IDEOGRAPH
+0xE8AC 0x96B0 #CJK UNIFIED IDEOGRAPH
+0xE8AD 0x96B4 #CJK UNIFIED IDEOGRAPH
+0xE8AE 0x96B6 #CJK UNIFIED IDEOGRAPH
+0xE8AF 0x96B8 #CJK UNIFIED IDEOGRAPH
+0xE8B0 0x96B9 #CJK UNIFIED IDEOGRAPH
+0xE8B1 0x96CE #CJK UNIFIED IDEOGRAPH
+0xE8B2 0x96CB #CJK UNIFIED IDEOGRAPH
+0xE8B3 0x96C9 #CJK UNIFIED IDEOGRAPH
+0xE8B4 0x96CD #CJK UNIFIED IDEOGRAPH
+0xE8B5 0x894D #CJK UNIFIED IDEOGRAPH
+0xE8B6 0x96DC #CJK UNIFIED IDEOGRAPH
+0xE8B7 0x970D #CJK UNIFIED IDEOGRAPH
+0xE8B8 0x96D5 #CJK UNIFIED IDEOGRAPH
+0xE8B9 0x96F9 #CJK UNIFIED IDEOGRAPH
+0xE8BA 0x9704 #CJK UNIFIED IDEOGRAPH
+0xE8BB 0x9706 #CJK UNIFIED IDEOGRAPH
+0xE8BC 0x9708 #CJK UNIFIED IDEOGRAPH
+0xE8BD 0x9713 #CJK UNIFIED IDEOGRAPH
+0xE8BE 0x970E #CJK UNIFIED IDEOGRAPH
+0xE8BF 0x9711 #CJK UNIFIED IDEOGRAPH
+0xE8C0 0x970F #CJK UNIFIED IDEOGRAPH
+0xE8C1 0x9716 #CJK UNIFIED IDEOGRAPH
+0xE8C2 0x9719 #CJK UNIFIED IDEOGRAPH
+0xE8C3 0x9724 #CJK UNIFIED IDEOGRAPH
+0xE8C4 0x972A #CJK UNIFIED IDEOGRAPH
+0xE8C5 0x9730 #CJK UNIFIED IDEOGRAPH
+0xE8C6 0x9739 #CJK UNIFIED IDEOGRAPH
+0xE8C7 0x973D #CJK UNIFIED IDEOGRAPH
+0xE8C8 0x973E #CJK UNIFIED IDEOGRAPH
+0xE8C9 0x9744 #CJK UNIFIED IDEOGRAPH
+0xE8CA 0x9746 #CJK UNIFIED IDEOGRAPH
+0xE8CB 0x9748 #CJK UNIFIED IDEOGRAPH
+0xE8CC 0x9742 #CJK UNIFIED IDEOGRAPH
+0xE8CD 0x9749 #CJK UNIFIED IDEOGRAPH
+0xE8CE 0x975C #CJK UNIFIED IDEOGRAPH
+0xE8CF 0x9760 #CJK UNIFIED IDEOGRAPH
+0xE8D0 0x9764 #CJK UNIFIED IDEOGRAPH
+0xE8D1 0x9766 #CJK UNIFIED IDEOGRAPH
+0xE8D2 0x9768 #CJK UNIFIED IDEOGRAPH
+0xE8D3 0x52D2 #CJK UNIFIED IDEOGRAPH
+0xE8D4 0x976B #CJK UNIFIED IDEOGRAPH
+0xE8D5 0x9771 #CJK UNIFIED IDEOGRAPH
+0xE8D6 0x9779 #CJK UNIFIED IDEOGRAPH
+0xE8D7 0x9785 #CJK UNIFIED IDEOGRAPH
+0xE8D8 0x977C #CJK UNIFIED IDEOGRAPH
+0xE8D9 0x9781 #CJK UNIFIED IDEOGRAPH
+0xE8DA 0x977A #CJK UNIFIED IDEOGRAPH
+0xE8DB 0x9786 #CJK UNIFIED IDEOGRAPH
+0xE8DC 0x978B #CJK UNIFIED IDEOGRAPH
+0xE8DD 0x978F #CJK UNIFIED IDEOGRAPH
+0xE8DE 0x9790 #CJK UNIFIED IDEOGRAPH
+0xE8DF 0x979C #CJK UNIFIED IDEOGRAPH
+0xE8E0 0x97A8 #CJK UNIFIED IDEOGRAPH
+0xE8E1 0x97A6 #CJK UNIFIED IDEOGRAPH
+0xE8E2 0x97A3 #CJK UNIFIED IDEOGRAPH
+0xE8E3 0x97B3 #CJK UNIFIED IDEOGRAPH
+0xE8E4 0x97B4 #CJK UNIFIED IDEOGRAPH
+0xE8E5 0x97C3 #CJK UNIFIED IDEOGRAPH
+0xE8E6 0x97C6 #CJK UNIFIED IDEOGRAPH
+0xE8E7 0x97C8 #CJK UNIFIED IDEOGRAPH
+0xE8E8 0x97CB #CJK UNIFIED IDEOGRAPH
+0xE8E9 0x97DC #CJK UNIFIED IDEOGRAPH
+0xE8EA 0x97ED #CJK UNIFIED IDEOGRAPH
+0xE8EB 0x9F4F #CJK UNIFIED IDEOGRAPH
+0xE8EC 0x97F2 #CJK UNIFIED IDEOGRAPH
+0xE8ED 0x7ADF #CJK UNIFIED IDEOGRAPH
+0xE8EE 0x97F6 #CJK UNIFIED IDEOGRAPH
+0xE8EF 0x97F5 #CJK UNIFIED IDEOGRAPH
+0xE8F0 0x980F #CJK UNIFIED IDEOGRAPH
+0xE8F1 0x980C #CJK UNIFIED IDEOGRAPH
+0xE8F2 0x9838 #CJK UNIFIED IDEOGRAPH
+0xE8F3 0x9824 #CJK UNIFIED IDEOGRAPH
+0xE8F4 0x9821 #CJK UNIFIED IDEOGRAPH
+0xE8F5 0x9837 #CJK UNIFIED IDEOGRAPH
+0xE8F6 0x983D #CJK UNIFIED IDEOGRAPH
+0xE8F7 0x9846 #CJK UNIFIED IDEOGRAPH
+0xE8F8 0x984F #CJK UNIFIED IDEOGRAPH
+0xE8F9 0x984B #CJK UNIFIED IDEOGRAPH
+0xE8FA 0x986B #CJK UNIFIED IDEOGRAPH
+0xE8FB 0x986F #CJK UNIFIED IDEOGRAPH
+0xE8FC 0x9870 #CJK UNIFIED IDEOGRAPH
+0xE940 0x9871 #CJK UNIFIED IDEOGRAPH
+0xE941 0x9874 #CJK UNIFIED IDEOGRAPH
+0xE942 0x9873 #CJK UNIFIED IDEOGRAPH
+0xE943 0x98AA #CJK UNIFIED IDEOGRAPH
+0xE944 0x98AF #CJK UNIFIED IDEOGRAPH
+0xE945 0x98B1 #CJK UNIFIED IDEOGRAPH
+0xE946 0x98B6 #CJK UNIFIED IDEOGRAPH
+0xE947 0x98C4 #CJK UNIFIED IDEOGRAPH
+0xE948 0x98C3 #CJK UNIFIED IDEOGRAPH
+0xE949 0x98C6 #CJK UNIFIED IDEOGRAPH
+0xE94A 0x98E9 #CJK UNIFIED IDEOGRAPH
+0xE94B 0x98EB #CJK UNIFIED IDEOGRAPH
+0xE94C 0x9903 #CJK UNIFIED IDEOGRAPH
+0xE94D 0x9909 #CJK UNIFIED IDEOGRAPH
+0xE94E 0x9912 #CJK UNIFIED IDEOGRAPH
+0xE94F 0x9914 #CJK UNIFIED IDEOGRAPH
+0xE950 0x9918 #CJK UNIFIED IDEOGRAPH
+0xE951 0x9921 #CJK UNIFIED IDEOGRAPH
+0xE952 0x991D #CJK UNIFIED IDEOGRAPH
+0xE953 0x991E #CJK UNIFIED IDEOGRAPH
+0xE954 0x9924 #CJK UNIFIED IDEOGRAPH
+0xE955 0x9920 #CJK UNIFIED IDEOGRAPH
+0xE956 0x992C #CJK UNIFIED IDEOGRAPH
+0xE957 0x992E #CJK UNIFIED IDEOGRAPH
+0xE958 0x993D #CJK UNIFIED IDEOGRAPH
+0xE959 0x993E #CJK UNIFIED IDEOGRAPH
+0xE95A 0x9942 #CJK UNIFIED IDEOGRAPH
+0xE95B 0x9949 #CJK UNIFIED IDEOGRAPH
+0xE95C 0x9945 #CJK UNIFIED IDEOGRAPH
+0xE95D 0x9950 #CJK UNIFIED IDEOGRAPH
+0xE95E 0x994B #CJK UNIFIED IDEOGRAPH
+0xE95F 0x9951 #CJK UNIFIED IDEOGRAPH
+0xE960 0x9952 #CJK UNIFIED IDEOGRAPH
+0xE961 0x994C #CJK UNIFIED IDEOGRAPH
+0xE962 0x9955 #CJK UNIFIED IDEOGRAPH
+0xE963 0x9997 #CJK UNIFIED IDEOGRAPH
+0xE964 0x9998 #CJK UNIFIED IDEOGRAPH
+0xE965 0x99A5 #CJK UNIFIED IDEOGRAPH
+0xE966 0x99AD #CJK UNIFIED IDEOGRAPH
+0xE967 0x99AE #CJK UNIFIED IDEOGRAPH
+0xE968 0x99BC #CJK UNIFIED IDEOGRAPH
+0xE969 0x99DF #CJK UNIFIED IDEOGRAPH
+0xE96A 0x99DB #CJK UNIFIED IDEOGRAPH
+0xE96B 0x99DD #CJK UNIFIED IDEOGRAPH
+0xE96C 0x99D8 #CJK UNIFIED IDEOGRAPH
+0xE96D 0x99D1 #CJK UNIFIED IDEOGRAPH
+0xE96E 0x99ED #CJK UNIFIED IDEOGRAPH
+0xE96F 0x99EE #CJK UNIFIED IDEOGRAPH
+0xE970 0x99F1 #CJK UNIFIED IDEOGRAPH
+0xE971 0x99F2 #CJK UNIFIED IDEOGRAPH
+0xE972 0x99FB #CJK UNIFIED IDEOGRAPH
+0xE973 0x99F8 #CJK UNIFIED IDEOGRAPH
+0xE974 0x9A01 #CJK UNIFIED IDEOGRAPH
+0xE975 0x9A0F #CJK UNIFIED IDEOGRAPH
+0xE976 0x9A05 #CJK UNIFIED IDEOGRAPH
+0xE977 0x99E2 #CJK UNIFIED IDEOGRAPH
+0xE978 0x9A19 #CJK UNIFIED IDEOGRAPH
+0xE979 0x9A2B #CJK UNIFIED IDEOGRAPH
+0xE97A 0x9A37 #CJK UNIFIED IDEOGRAPH
+0xE97B 0x9A45 #CJK UNIFIED IDEOGRAPH
+0xE97C 0x9A42 #CJK UNIFIED IDEOGRAPH
+0xE97D 0x9A40 #CJK UNIFIED IDEOGRAPH
+0xE97E 0x9A43 #CJK UNIFIED IDEOGRAPH
+0xE980 0x9A3E #CJK UNIFIED IDEOGRAPH
+0xE981 0x9A55 #CJK UNIFIED IDEOGRAPH
+0xE982 0x9A4D #CJK UNIFIED IDEOGRAPH
+0xE983 0x9A5B #CJK UNIFIED IDEOGRAPH
+0xE984 0x9A57 #CJK UNIFIED IDEOGRAPH
+0xE985 0x9A5F #CJK UNIFIED IDEOGRAPH
+0xE986 0x9A62 #CJK UNIFIED IDEOGRAPH
+0xE987 0x9A65 #CJK UNIFIED IDEOGRAPH
+0xE988 0x9A64 #CJK UNIFIED IDEOGRAPH
+0xE989 0x9A69 #CJK UNIFIED IDEOGRAPH
+0xE98A 0x9A6B #CJK UNIFIED IDEOGRAPH
+0xE98B 0x9A6A #CJK UNIFIED IDEOGRAPH
+0xE98C 0x9AAD #CJK UNIFIED IDEOGRAPH
+0xE98D 0x9AB0 #CJK UNIFIED IDEOGRAPH
+0xE98E 0x9ABC #CJK UNIFIED IDEOGRAPH
+0xE98F 0x9AC0 #CJK UNIFIED IDEOGRAPH
+0xE990 0x9ACF #CJK UNIFIED IDEOGRAPH
+0xE991 0x9AD1 #CJK UNIFIED IDEOGRAPH
+0xE992 0x9AD3 #CJK UNIFIED IDEOGRAPH
+0xE993 0x9AD4 #CJK UNIFIED IDEOGRAPH
+0xE994 0x9ADE #CJK UNIFIED IDEOGRAPH
+0xE995 0x9ADF #CJK UNIFIED IDEOGRAPH
+0xE996 0x9AE2 #CJK UNIFIED IDEOGRAPH
+0xE997 0x9AE3 #CJK UNIFIED IDEOGRAPH
+0xE998 0x9AE6 #CJK UNIFIED IDEOGRAPH
+0xE999 0x9AEF #CJK UNIFIED IDEOGRAPH
+0xE99A 0x9AEB #CJK UNIFIED IDEOGRAPH
+0xE99B 0x9AEE #CJK UNIFIED IDEOGRAPH
+0xE99C 0x9AF4 #CJK UNIFIED IDEOGRAPH
+0xE99D 0x9AF1 #CJK UNIFIED IDEOGRAPH
+0xE99E 0x9AF7 #CJK UNIFIED IDEOGRAPH
+0xE99F 0x9AFB #CJK UNIFIED IDEOGRAPH
+0xE9A0 0x9B06 #CJK UNIFIED IDEOGRAPH
+0xE9A1 0x9B18 #CJK UNIFIED IDEOGRAPH
+0xE9A2 0x9B1A #CJK UNIFIED IDEOGRAPH
+0xE9A3 0x9B1F #CJK UNIFIED IDEOGRAPH
+0xE9A4 0x9B22 #CJK UNIFIED IDEOGRAPH
+0xE9A5 0x9B23 #CJK UNIFIED IDEOGRAPH
+0xE9A6 0x9B25 #CJK UNIFIED IDEOGRAPH
+0xE9A7 0x9B27 #CJK UNIFIED IDEOGRAPH
+0xE9A8 0x9B28 #CJK UNIFIED IDEOGRAPH
+0xE9A9 0x9B29 #CJK UNIFIED IDEOGRAPH
+0xE9AA 0x9B2A #CJK UNIFIED IDEOGRAPH
+0xE9AB 0x9B2E #CJK UNIFIED IDEOGRAPH
+0xE9AC 0x9B2F #CJK UNIFIED IDEOGRAPH
+0xE9AD 0x9B32 #CJK UNIFIED IDEOGRAPH
+0xE9AE 0x9B44 #CJK UNIFIED IDEOGRAPH
+0xE9AF 0x9B43 #CJK UNIFIED IDEOGRAPH
+0xE9B0 0x9B4F #CJK UNIFIED IDEOGRAPH
+0xE9B1 0x9B4D #CJK UNIFIED IDEOGRAPH
+0xE9B2 0x9B4E #CJK UNIFIED IDEOGRAPH
+0xE9B3 0x9B51 #CJK UNIFIED IDEOGRAPH
+0xE9B4 0x9B58 #CJK UNIFIED IDEOGRAPH
+0xE9B5 0x9B74 #CJK UNIFIED IDEOGRAPH
+0xE9B6 0x9B93 #CJK UNIFIED IDEOGRAPH
+0xE9B7 0x9B83 #CJK UNIFIED IDEOGRAPH
+0xE9B8 0x9B91 #CJK UNIFIED IDEOGRAPH
+0xE9B9 0x9B96 #CJK UNIFIED IDEOGRAPH
+0xE9BA 0x9B97 #CJK UNIFIED IDEOGRAPH
+0xE9BB 0x9B9F #CJK UNIFIED IDEOGRAPH
+0xE9BC 0x9BA0 #CJK UNIFIED IDEOGRAPH
+0xE9BD 0x9BA8 #CJK UNIFIED IDEOGRAPH
+0xE9BE 0x9BB4 #CJK UNIFIED IDEOGRAPH
+0xE9BF 0x9BC0 #CJK UNIFIED IDEOGRAPH
+0xE9C0 0x9BCA #CJK UNIFIED IDEOGRAPH
+0xE9C1 0x9BB9 #CJK UNIFIED IDEOGRAPH
+0xE9C2 0x9BC6 #CJK UNIFIED IDEOGRAPH
+0xE9C3 0x9BCF #CJK UNIFIED IDEOGRAPH
+0xE9C4 0x9BD1 #CJK UNIFIED IDEOGRAPH
+0xE9C5 0x9BD2 #CJK UNIFIED IDEOGRAPH
+0xE9C6 0x9BE3 #CJK UNIFIED IDEOGRAPH
+0xE9C7 0x9BE2 #CJK UNIFIED IDEOGRAPH
+0xE9C8 0x9BE4 #CJK UNIFIED IDEOGRAPH
+0xE9C9 0x9BD4 #CJK UNIFIED IDEOGRAPH
+0xE9CA 0x9BE1 #CJK UNIFIED IDEOGRAPH
+0xE9CB 0x9C3A #CJK UNIFIED IDEOGRAPH
+0xE9CC 0x9BF2 #CJK UNIFIED IDEOGRAPH
+0xE9CD 0x9BF1 #CJK UNIFIED IDEOGRAPH
+0xE9CE 0x9BF0 #CJK UNIFIED IDEOGRAPH
+0xE9CF 0x9C15 #CJK UNIFIED IDEOGRAPH
+0xE9D0 0x9C14 #CJK UNIFIED IDEOGRAPH
+0xE9D1 0x9C09 #CJK UNIFIED IDEOGRAPH
+0xE9D2 0x9C13 #CJK UNIFIED IDEOGRAPH
+0xE9D3 0x9C0C #CJK UNIFIED IDEOGRAPH
+0xE9D4 0x9C06 #CJK UNIFIED IDEOGRAPH
+0xE9D5 0x9C08 #CJK UNIFIED IDEOGRAPH
+0xE9D6 0x9C12 #CJK UNIFIED IDEOGRAPH
+0xE9D7 0x9C0A #CJK UNIFIED IDEOGRAPH
+0xE9D8 0x9C04 #CJK UNIFIED IDEOGRAPH
+0xE9D9 0x9C2E #CJK UNIFIED IDEOGRAPH
+0xE9DA 0x9C1B #CJK UNIFIED IDEOGRAPH
+0xE9DB 0x9C25 #CJK UNIFIED IDEOGRAPH
+0xE9DC 0x9C24 #CJK UNIFIED IDEOGRAPH
+0xE9DD 0x9C21 #CJK UNIFIED IDEOGRAPH
+0xE9DE 0x9C30 #CJK UNIFIED IDEOGRAPH
+0xE9DF 0x9C47 #CJK UNIFIED IDEOGRAPH
+0xE9E0 0x9C32 #CJK UNIFIED IDEOGRAPH
+0xE9E1 0x9C46 #CJK UNIFIED IDEOGRAPH
+0xE9E2 0x9C3E #CJK UNIFIED IDEOGRAPH
+0xE9E3 0x9C5A #CJK UNIFIED IDEOGRAPH
+0xE9E4 0x9C60 #CJK UNIFIED IDEOGRAPH
+0xE9E5 0x9C67 #CJK UNIFIED IDEOGRAPH
+0xE9E6 0x9C76 #CJK UNIFIED IDEOGRAPH
+0xE9E7 0x9C78 #CJK UNIFIED IDEOGRAPH
+0xE9E8 0x9CE7 #CJK UNIFIED IDEOGRAPH
+0xE9E9 0x9CEC #CJK UNIFIED IDEOGRAPH
+0xE9EA 0x9CF0 #CJK UNIFIED IDEOGRAPH
+0xE9EB 0x9D09 #CJK UNIFIED IDEOGRAPH
+0xE9EC 0x9D08 #CJK UNIFIED IDEOGRAPH
+0xE9ED 0x9CEB #CJK UNIFIED IDEOGRAPH
+0xE9EE 0x9D03 #CJK UNIFIED IDEOGRAPH
+0xE9EF 0x9D06 #CJK UNIFIED IDEOGRAPH
+0xE9F0 0x9D2A #CJK UNIFIED IDEOGRAPH
+0xE9F1 0x9D26 #CJK UNIFIED IDEOGRAPH
+0xE9F2 0x9DAF #CJK UNIFIED IDEOGRAPH
+0xE9F3 0x9D23 #CJK UNIFIED IDEOGRAPH
+0xE9F4 0x9D1F #CJK UNIFIED IDEOGRAPH
+0xE9F5 0x9D44 #CJK UNIFIED IDEOGRAPH
+0xE9F6 0x9D15 #CJK UNIFIED IDEOGRAPH
+0xE9F7 0x9D12 #CJK UNIFIED IDEOGRAPH
+0xE9F8 0x9D41 #CJK UNIFIED IDEOGRAPH
+0xE9F9 0x9D3F #CJK UNIFIED IDEOGRAPH
+0xE9FA 0x9D3E #CJK UNIFIED IDEOGRAPH
+0xE9FB 0x9D46 #CJK UNIFIED IDEOGRAPH
+0xE9FC 0x9D48 #CJK UNIFIED IDEOGRAPH
+0xEA40 0x9D5D #CJK UNIFIED IDEOGRAPH
+0xEA41 0x9D5E #CJK UNIFIED IDEOGRAPH
+0xEA42 0x9D64 #CJK UNIFIED IDEOGRAPH
+0xEA43 0x9D51 #CJK UNIFIED IDEOGRAPH
+0xEA44 0x9D50 #CJK UNIFIED IDEOGRAPH
+0xEA45 0x9D59 #CJK UNIFIED IDEOGRAPH
+0xEA46 0x9D72 #CJK UNIFIED IDEOGRAPH
+0xEA47 0x9D89 #CJK UNIFIED IDEOGRAPH
+0xEA48 0x9D87 #CJK UNIFIED IDEOGRAPH
+0xEA49 0x9DAB #CJK UNIFIED IDEOGRAPH
+0xEA4A 0x9D6F #CJK UNIFIED IDEOGRAPH
+0xEA4B 0x9D7A #CJK UNIFIED IDEOGRAPH
+0xEA4C 0x9D9A #CJK UNIFIED IDEOGRAPH
+0xEA4D 0x9DA4 #CJK UNIFIED IDEOGRAPH
+0xEA4E 0x9DA9 #CJK UNIFIED IDEOGRAPH
+0xEA4F 0x9DB2 #CJK UNIFIED IDEOGRAPH
+0xEA50 0x9DC4 #CJK UNIFIED IDEOGRAPH
+0xEA51 0x9DC1 #CJK UNIFIED IDEOGRAPH
+0xEA52 0x9DBB #CJK UNIFIED IDEOGRAPH
+0xEA53 0x9DB8 #CJK UNIFIED IDEOGRAPH
+0xEA54 0x9DBA #CJK UNIFIED IDEOGRAPH
+0xEA55 0x9DC6 #CJK UNIFIED IDEOGRAPH
+0xEA56 0x9DCF #CJK UNIFIED IDEOGRAPH
+0xEA57 0x9DC2 #CJK UNIFIED IDEOGRAPH
+0xEA58 0x9DD9 #CJK UNIFIED IDEOGRAPH
+0xEA59 0x9DD3 #CJK UNIFIED IDEOGRAPH
+0xEA5A 0x9DF8 #CJK UNIFIED IDEOGRAPH
+0xEA5B 0x9DE6 #CJK UNIFIED IDEOGRAPH
+0xEA5C 0x9DED #CJK UNIFIED IDEOGRAPH
+0xEA5D 0x9DEF #CJK UNIFIED IDEOGRAPH
+0xEA5E 0x9DFD #CJK UNIFIED IDEOGRAPH
+0xEA5F 0x9E1A #CJK UNIFIED IDEOGRAPH
+0xEA60 0x9E1B #CJK UNIFIED IDEOGRAPH
+0xEA61 0x9E1E #CJK UNIFIED IDEOGRAPH
+0xEA62 0x9E75 #CJK UNIFIED IDEOGRAPH
+0xEA63 0x9E79 #CJK UNIFIED IDEOGRAPH
+0xEA64 0x9E7D #CJK UNIFIED IDEOGRAPH
+0xEA65 0x9E81 #CJK UNIFIED IDEOGRAPH
+0xEA66 0x9E88 #CJK UNIFIED IDEOGRAPH
+0xEA67 0x9E8B #CJK UNIFIED IDEOGRAPH
+0xEA68 0x9E8C #CJK UNIFIED IDEOGRAPH
+0xEA69 0x9E92 #CJK UNIFIED IDEOGRAPH
+0xEA6A 0x9E95 #CJK UNIFIED IDEOGRAPH
+0xEA6B 0x9E91 #CJK UNIFIED IDEOGRAPH
+0xEA6C 0x9E9D #CJK UNIFIED IDEOGRAPH
+0xEA6D 0x9EA5 #CJK UNIFIED IDEOGRAPH
+0xEA6E 0x9EA9 #CJK UNIFIED IDEOGRAPH
+0xEA6F 0x9EB8 #CJK UNIFIED IDEOGRAPH
+0xEA70 0x9EAA #CJK UNIFIED IDEOGRAPH
+0xEA71 0x9EAD #CJK UNIFIED IDEOGRAPH
+0xEA72 0x9761 #CJK UNIFIED IDEOGRAPH
+0xEA73 0x9ECC #CJK UNIFIED IDEOGRAPH
+0xEA74 0x9ECE #CJK UNIFIED IDEOGRAPH
+0xEA75 0x9ECF #CJK UNIFIED IDEOGRAPH
+0xEA76 0x9ED0 #CJK UNIFIED IDEOGRAPH
+0xEA77 0x9ED4 #CJK UNIFIED IDEOGRAPH
+0xEA78 0x9EDC #CJK UNIFIED IDEOGRAPH
+0xEA79 0x9EDE #CJK UNIFIED IDEOGRAPH
+0xEA7A 0x9EDD #CJK UNIFIED IDEOGRAPH
+0xEA7B 0x9EE0 #CJK UNIFIED IDEOGRAPH
+0xEA7C 0x9EE5 #CJK UNIFIED IDEOGRAPH
+0xEA7D 0x9EE8 #CJK UNIFIED IDEOGRAPH
+0xEA7E 0x9EEF #CJK UNIFIED IDEOGRAPH
+0xEA80 0x9EF4 #CJK UNIFIED IDEOGRAPH
+0xEA81 0x9EF6 #CJK UNIFIED IDEOGRAPH
+0xEA82 0x9EF7 #CJK UNIFIED IDEOGRAPH
+0xEA83 0x9EF9 #CJK UNIFIED IDEOGRAPH
+0xEA84 0x9EFB #CJK UNIFIED IDEOGRAPH
+0xEA85 0x9EFC #CJK UNIFIED IDEOGRAPH
+0xEA86 0x9EFD #CJK UNIFIED IDEOGRAPH
+0xEA87 0x9F07 #CJK UNIFIED IDEOGRAPH
+0xEA88 0x9F08 #CJK UNIFIED IDEOGRAPH
+0xEA89 0x76B7 #CJK UNIFIED IDEOGRAPH
+0xEA8A 0x9F15 #CJK UNIFIED IDEOGRAPH
+0xEA8B 0x9F21 #CJK UNIFIED IDEOGRAPH
+0xEA8C 0x9F2C #CJK UNIFIED IDEOGRAPH
+0xEA8D 0x9F3E #CJK UNIFIED IDEOGRAPH
+0xEA8E 0x9F4A #CJK UNIFIED IDEOGRAPH
+0xEA8F 0x9F52 #CJK UNIFIED IDEOGRAPH
+0xEA90 0x9F54 #CJK UNIFIED IDEOGRAPH
+0xEA91 0x9F63 #CJK UNIFIED IDEOGRAPH
+0xEA92 0x9F5F #CJK UNIFIED IDEOGRAPH
+0xEA93 0x9F60 #CJK UNIFIED IDEOGRAPH
+0xEA94 0x9F61 #CJK UNIFIED IDEOGRAPH
+0xEA95 0x9F66 #CJK UNIFIED IDEOGRAPH
+0xEA96 0x9F67 #CJK UNIFIED IDEOGRAPH
+0xEA97 0x9F6C #CJK UNIFIED IDEOGRAPH
+0xEA98 0x9F6A #CJK UNIFIED IDEOGRAPH
+0xEA99 0x9F77 #CJK UNIFIED IDEOGRAPH
+0xEA9A 0x9F72 #CJK UNIFIED IDEOGRAPH
+0xEA9B 0x9F76 #CJK UNIFIED IDEOGRAPH
+0xEA9C 0x9F95 #CJK UNIFIED IDEOGRAPH
+0xEA9D 0x9F9C #CJK UNIFIED IDEOGRAPH
+0xEA9E 0x9FA0 #CJK UNIFIED IDEOGRAPH
+0xEA9F 0x582F #CJK UNIFIED IDEOGRAPH
+0xEAA0 0x69C7 #CJK UNIFIED IDEOGRAPH
+0xEAA1 0x9059 #CJK UNIFIED IDEOGRAPH
+0xEAA2 0x7464 #CJK UNIFIED IDEOGRAPH
+0xEAA3 0x51DC #CJK UNIFIED IDEOGRAPH
+0xEAA4 0x7199 #CJK UNIFIED IDEOGRAPH
+0xED40 0x7E8A #CJK UNIFIED IDEOGRAPH
+0xED41 0x891C #CJK UNIFIED IDEOGRAPH
+0xED42 0x9348 #CJK UNIFIED IDEOGRAPH
+0xED43 0x9288 #CJK UNIFIED IDEOGRAPH
+0xED44 0x84DC #CJK UNIFIED IDEOGRAPH
+0xED45 0x4FC9 #CJK UNIFIED IDEOGRAPH
+0xED46 0x70BB #CJK UNIFIED IDEOGRAPH
+0xED47 0x6631 #CJK UNIFIED IDEOGRAPH
+0xED48 0x68C8 #CJK UNIFIED IDEOGRAPH
+0xED49 0x92F9 #CJK UNIFIED IDEOGRAPH
+0xED4A 0x66FB #CJK UNIFIED IDEOGRAPH
+0xED4B 0x5F45 #CJK UNIFIED IDEOGRAPH
+0xED4C 0x4E28 #CJK UNIFIED IDEOGRAPH
+0xED4D 0x4EE1 #CJK UNIFIED IDEOGRAPH
+0xED4E 0x4EFC #CJK UNIFIED IDEOGRAPH
+0xED4F 0x4F00 #CJK UNIFIED IDEOGRAPH
+0xED50 0x4F03 #CJK UNIFIED IDEOGRAPH
+0xED51 0x4F39 #CJK UNIFIED IDEOGRAPH
+0xED52 0x4F56 #CJK UNIFIED IDEOGRAPH
+0xED53 0x4F92 #CJK UNIFIED IDEOGRAPH
+0xED54 0x4F8A #CJK UNIFIED IDEOGRAPH
+0xED55 0x4F9A #CJK UNIFIED IDEOGRAPH
+0xED56 0x4F94 #CJK UNIFIED IDEOGRAPH
+0xED57 0x4FCD #CJK UNIFIED IDEOGRAPH
+0xED58 0x5040 #CJK UNIFIED IDEOGRAPH
+0xED59 0x5022 #CJK UNIFIED IDEOGRAPH
+0xED5A 0x4FFF #CJK UNIFIED IDEOGRAPH
+0xED5B 0x501E #CJK UNIFIED IDEOGRAPH
+0xED5C 0x5046 #CJK UNIFIED IDEOGRAPH
+0xED5D 0x5070 #CJK UNIFIED IDEOGRAPH
+0xED5E 0x5042 #CJK UNIFIED IDEOGRAPH
+0xED5F 0x5094 #CJK UNIFIED IDEOGRAPH
+0xED60 0x50F4 #CJK UNIFIED IDEOGRAPH
+0xED61 0x50D8 #CJK UNIFIED IDEOGRAPH
+0xED62 0x514A #CJK UNIFIED IDEOGRAPH
+0xED63 0x5164 #CJK UNIFIED IDEOGRAPH
+0xED64 0x519D #CJK UNIFIED IDEOGRAPH
+0xED65 0x51BE #CJK UNIFIED IDEOGRAPH
+0xED66 0x51EC #CJK UNIFIED IDEOGRAPH
+0xED67 0x5215 #CJK UNIFIED IDEOGRAPH
+0xED68 0x529C #CJK UNIFIED IDEOGRAPH
+0xED69 0x52A6 #CJK UNIFIED IDEOGRAPH
+0xED6A 0x52C0 #CJK UNIFIED IDEOGRAPH
+0xED6B 0x52DB #CJK UNIFIED IDEOGRAPH
+0xED6C 0x5300 #CJK UNIFIED IDEOGRAPH
+0xED6D 0x5307 #CJK UNIFIED IDEOGRAPH
+0xED6E 0x5324 #CJK UNIFIED IDEOGRAPH
+0xED6F 0x5372 #CJK UNIFIED IDEOGRAPH
+0xED70 0x5393 #CJK UNIFIED IDEOGRAPH
+0xED71 0x53B2 #CJK UNIFIED IDEOGRAPH
+0xED72 0x53DD #CJK UNIFIED IDEOGRAPH
+0xED73 0xFA0E #CJK COMPATIBILITY IDEOGRAPH
+0xED74 0x549C #CJK UNIFIED IDEOGRAPH
+0xED75 0x548A #CJK UNIFIED IDEOGRAPH
+0xED76 0x54A9 #CJK UNIFIED IDEOGRAPH
+0xED77 0x54FF #CJK UNIFIED IDEOGRAPH
+0xED78 0x5586 #CJK UNIFIED IDEOGRAPH
+0xED79 0x5759 #CJK UNIFIED IDEOGRAPH
+0xED7A 0x5765 #CJK UNIFIED IDEOGRAPH
+0xED7B 0x57AC #CJK UNIFIED IDEOGRAPH
+0xED7C 0x57C8 #CJK UNIFIED IDEOGRAPH
+0xED7D 0x57C7 #CJK UNIFIED IDEOGRAPH
+0xED7E 0xFA0F #CJK COMPATIBILITY IDEOGRAPH
+0xED80 0xFA10 #CJK COMPATIBILITY IDEOGRAPH
+0xED81 0x589E #CJK UNIFIED IDEOGRAPH
+0xED82 0x58B2 #CJK UNIFIED IDEOGRAPH
+0xED83 0x590B #CJK UNIFIED IDEOGRAPH
+0xED84 0x5953 #CJK UNIFIED IDEOGRAPH
+0xED85 0x595B #CJK UNIFIED IDEOGRAPH
+0xED86 0x595D #CJK UNIFIED IDEOGRAPH
+0xED87 0x5963 #CJK UNIFIED IDEOGRAPH
+0xED88 0x59A4 #CJK UNIFIED IDEOGRAPH
+0xED89 0x59BA #CJK UNIFIED IDEOGRAPH
+0xED8A 0x5B56 #CJK UNIFIED IDEOGRAPH
+0xED8B 0x5BC0 #CJK UNIFIED IDEOGRAPH
+0xED8C 0x752F #CJK UNIFIED IDEOGRAPH
+0xED8D 0x5BD8 #CJK UNIFIED IDEOGRAPH
+0xED8E 0x5BEC #CJK UNIFIED IDEOGRAPH
+0xED8F 0x5C1E #CJK UNIFIED IDEOGRAPH
+0xED90 0x5CA6 #CJK UNIFIED IDEOGRAPH
+0xED91 0x5CBA #CJK UNIFIED IDEOGRAPH
+0xED92 0x5CF5 #CJK UNIFIED IDEOGRAPH
+0xED93 0x5D27 #CJK UNIFIED IDEOGRAPH
+0xED94 0x5D53 #CJK UNIFIED IDEOGRAPH
+0xED95 0xFA11 #CJK COMPATIBILITY IDEOGRAPH
+0xED96 0x5D42 #CJK UNIFIED IDEOGRAPH
+0xED97 0x5D6D #CJK UNIFIED IDEOGRAPH
+0xED98 0x5DB8 #CJK UNIFIED IDEOGRAPH
+0xED99 0x5DB9 #CJK UNIFIED IDEOGRAPH
+0xED9A 0x5DD0 #CJK UNIFIED IDEOGRAPH
+0xED9B 0x5F21 #CJK UNIFIED IDEOGRAPH
+0xED9C 0x5F34 #CJK UNIFIED IDEOGRAPH
+0xED9D 0x5F67 #CJK UNIFIED IDEOGRAPH
+0xED9E 0x5FB7 #CJK UNIFIED IDEOGRAPH
+0xED9F 0x5FDE #CJK UNIFIED IDEOGRAPH
+0xEDA0 0x605D #CJK UNIFIED IDEOGRAPH
+0xEDA1 0x6085 #CJK UNIFIED IDEOGRAPH
+0xEDA2 0x608A #CJK UNIFIED IDEOGRAPH
+0xEDA3 0x60DE #CJK UNIFIED IDEOGRAPH
+0xEDA4 0x60D5 #CJK UNIFIED IDEOGRAPH
+0xEDA5 0x6120 #CJK UNIFIED IDEOGRAPH
+0xEDA6 0x60F2 #CJK UNIFIED IDEOGRAPH
+0xEDA7 0x6111 #CJK UNIFIED IDEOGRAPH
+0xEDA8 0x6137 #CJK UNIFIED IDEOGRAPH
+0xEDA9 0x6130 #CJK UNIFIED IDEOGRAPH
+0xEDAA 0x6198 #CJK UNIFIED IDEOGRAPH
+0xEDAB 0x6213 #CJK UNIFIED IDEOGRAPH
+0xEDAC 0x62A6 #CJK UNIFIED IDEOGRAPH
+0xEDAD 0x63F5 #CJK UNIFIED IDEOGRAPH
+0xEDAE 0x6460 #CJK UNIFIED IDEOGRAPH
+0xEDAF 0x649D #CJK UNIFIED IDEOGRAPH
+0xEDB0 0x64CE #CJK UNIFIED IDEOGRAPH
+0xEDB1 0x654E #CJK UNIFIED IDEOGRAPH
+0xEDB2 0x6600 #CJK UNIFIED IDEOGRAPH
+0xEDB3 0x6615 #CJK UNIFIED IDEOGRAPH
+0xEDB4 0x663B #CJK UNIFIED IDEOGRAPH
+0xEDB5 0x6609 #CJK UNIFIED IDEOGRAPH
+0xEDB6 0x662E #CJK UNIFIED IDEOGRAPH
+0xEDB7 0x661E #CJK UNIFIED IDEOGRAPH
+0xEDB8 0x6624 #CJK UNIFIED IDEOGRAPH
+0xEDB9 0x6665 #CJK UNIFIED IDEOGRAPH
+0xEDBA 0x6657 #CJK UNIFIED IDEOGRAPH
+0xEDBB 0x6659 #CJK UNIFIED IDEOGRAPH
+0xEDBC 0xFA12 #CJK COMPATIBILITY IDEOGRAPH
+0xEDBD 0x6673 #CJK UNIFIED IDEOGRAPH
+0xEDBE 0x6699 #CJK UNIFIED IDEOGRAPH
+0xEDBF 0x66A0 #CJK UNIFIED IDEOGRAPH
+0xEDC0 0x66B2 #CJK UNIFIED IDEOGRAPH
+0xEDC1 0x66BF #CJK UNIFIED IDEOGRAPH
+0xEDC2 0x66FA #CJK UNIFIED IDEOGRAPH
+0xEDC3 0x670E #CJK UNIFIED IDEOGRAPH
+0xEDC4 0xF929 #CJK COMPATIBILITY IDEOGRAPH
+0xEDC5 0x6766 #CJK UNIFIED IDEOGRAPH
+0xEDC6 0x67BB #CJK UNIFIED IDEOGRAPH
+0xEDC7 0x6852 #CJK UNIFIED IDEOGRAPH
+0xEDC8 0x67C0 #CJK UNIFIED IDEOGRAPH
+0xEDC9 0x6801 #CJK UNIFIED IDEOGRAPH
+0xEDCA 0x6844 #CJK UNIFIED IDEOGRAPH
+0xEDCB 0x68CF #CJK UNIFIED IDEOGRAPH
+0xEDCC 0xFA13 #CJK COMPATIBILITY IDEOGRAPH
+0xEDCD 0x6968 #CJK UNIFIED IDEOGRAPH
+0xEDCE 0xFA14 #CJK COMPATIBILITY IDEOGRAPH
+0xEDCF 0x6998 #CJK UNIFIED IDEOGRAPH
+0xEDD0 0x69E2 #CJK UNIFIED IDEOGRAPH
+0xEDD1 0x6A30 #CJK UNIFIED IDEOGRAPH
+0xEDD2 0x6A6B #CJK UNIFIED IDEOGRAPH
+0xEDD3 0x6A46 #CJK UNIFIED IDEOGRAPH
+0xEDD4 0x6A73 #CJK UNIFIED IDEOGRAPH
+0xEDD5 0x6A7E #CJK UNIFIED IDEOGRAPH
+0xEDD6 0x6AE2 #CJK UNIFIED IDEOGRAPH
+0xEDD7 0x6AE4 #CJK UNIFIED IDEOGRAPH
+0xEDD8 0x6BD6 #CJK UNIFIED IDEOGRAPH
+0xEDD9 0x6C3F #CJK UNIFIED IDEOGRAPH
+0xEDDA 0x6C5C #CJK UNIFIED IDEOGRAPH
+0xEDDB 0x6C86 #CJK UNIFIED IDEOGRAPH
+0xEDDC 0x6C6F #CJK UNIFIED IDEOGRAPH
+0xEDDD 0x6CDA #CJK UNIFIED IDEOGRAPH
+0xEDDE 0x6D04 #CJK UNIFIED IDEOGRAPH
+0xEDDF 0x6D87 #CJK UNIFIED IDEOGRAPH
+0xEDE0 0x6D6F #CJK UNIFIED IDEOGRAPH
+0xEDE1 0x6D96 #CJK UNIFIED IDEOGRAPH
+0xEDE2 0x6DAC #CJK UNIFIED IDEOGRAPH
+0xEDE3 0x6DCF #CJK UNIFIED IDEOGRAPH
+0xEDE4 0x6DF8 #CJK UNIFIED IDEOGRAPH
+0xEDE5 0x6DF2 #CJK UNIFIED IDEOGRAPH
+0xEDE6 0x6DFC #CJK UNIFIED IDEOGRAPH
+0xEDE7 0x6E39 #CJK UNIFIED IDEOGRAPH
+0xEDE8 0x6E5C #CJK UNIFIED IDEOGRAPH
+0xEDE9 0x6E27 #CJK UNIFIED IDEOGRAPH
+0xEDEA 0x6E3C #CJK UNIFIED IDEOGRAPH
+0xEDEB 0x6EBF #CJK UNIFIED IDEOGRAPH
+0xEDEC 0x6F88 #CJK UNIFIED IDEOGRAPH
+0xEDED 0x6FB5 #CJK UNIFIED IDEOGRAPH
+0xEDEE 0x6FF5 #CJK UNIFIED IDEOGRAPH
+0xEDEF 0x7005 #CJK UNIFIED IDEOGRAPH
+0xEDF0 0x7007 #CJK UNIFIED IDEOGRAPH
+0xEDF1 0x7028 #CJK UNIFIED IDEOGRAPH
+0xEDF2 0x7085 #CJK UNIFIED IDEOGRAPH
+0xEDF3 0x70AB #CJK UNIFIED IDEOGRAPH
+0xEDF4 0x710F #CJK UNIFIED IDEOGRAPH
+0xEDF5 0x7104 #CJK UNIFIED IDEOGRAPH
+0xEDF6 0x715C #CJK UNIFIED IDEOGRAPH
+0xEDF7 0x7146 #CJK UNIFIED IDEOGRAPH
+0xEDF8 0x7147 #CJK UNIFIED IDEOGRAPH
+0xEDF9 0xFA15 #CJK COMPATIBILITY IDEOGRAPH
+0xEDFA 0x71C1 #CJK UNIFIED IDEOGRAPH
+0xEDFB 0x71FE #CJK UNIFIED IDEOGRAPH
+0xEDFC 0x72B1 #CJK UNIFIED IDEOGRAPH
+0xEE40 0x72BE #CJK UNIFIED IDEOGRAPH
+0xEE41 0x7324 #CJK UNIFIED IDEOGRAPH
+0xEE42 0xFA16 #CJK COMPATIBILITY IDEOGRAPH
+0xEE43 0x7377 #CJK UNIFIED IDEOGRAPH
+0xEE44 0x73BD #CJK UNIFIED IDEOGRAPH
+0xEE45 0x73C9 #CJK UNIFIED IDEOGRAPH
+0xEE46 0x73D6 #CJK UNIFIED IDEOGRAPH
+0xEE47 0x73E3 #CJK UNIFIED IDEOGRAPH
+0xEE48 0x73D2 #CJK UNIFIED IDEOGRAPH
+0xEE49 0x7407 #CJK UNIFIED IDEOGRAPH
+0xEE4A 0x73F5 #CJK UNIFIED IDEOGRAPH
+0xEE4B 0x7426 #CJK UNIFIED IDEOGRAPH
+0xEE4C 0x742A #CJK UNIFIED IDEOGRAPH
+0xEE4D 0x7429 #CJK UNIFIED IDEOGRAPH
+0xEE4E 0x742E #CJK UNIFIED IDEOGRAPH
+0xEE4F 0x7462 #CJK UNIFIED IDEOGRAPH
+0xEE50 0x7489 #CJK UNIFIED IDEOGRAPH
+0xEE51 0x749F #CJK UNIFIED IDEOGRAPH
+0xEE52 0x7501 #CJK UNIFIED IDEOGRAPH
+0xEE53 0x756F #CJK UNIFIED IDEOGRAPH
+0xEE54 0x7682 #CJK UNIFIED IDEOGRAPH
+0xEE55 0x769C #CJK UNIFIED IDEOGRAPH
+0xEE56 0x769E #CJK UNIFIED IDEOGRAPH
+0xEE57 0x769B #CJK UNIFIED IDEOGRAPH
+0xEE58 0x76A6 #CJK UNIFIED IDEOGRAPH
+0xEE59 0xFA17 #CJK COMPATIBILITY IDEOGRAPH
+0xEE5A 0x7746 #CJK UNIFIED IDEOGRAPH
+0xEE5B 0x52AF #CJK UNIFIED IDEOGRAPH
+0xEE5C 0x7821 #CJK UNIFIED IDEOGRAPH
+0xEE5D 0x784E #CJK UNIFIED IDEOGRAPH
+0xEE5E 0x7864 #CJK UNIFIED IDEOGRAPH
+0xEE5F 0x787A #CJK UNIFIED IDEOGRAPH
+0xEE60 0x7930 #CJK UNIFIED IDEOGRAPH
+0xEE61 0xFA18 #CJK COMPATIBILITY IDEOGRAPH
+0xEE62 0xFA19 #CJK COMPATIBILITY IDEOGRAPH
+0xEE63 0xFA1A #CJK COMPATIBILITY IDEOGRAPH
+0xEE64 0x7994 #CJK UNIFIED IDEOGRAPH
+0xEE65 0xFA1B #CJK COMPATIBILITY IDEOGRAPH
+0xEE66 0x799B #CJK UNIFIED IDEOGRAPH
+0xEE67 0x7AD1 #CJK UNIFIED IDEOGRAPH
+0xEE68 0x7AE7 #CJK UNIFIED IDEOGRAPH
+0xEE69 0xFA1C #CJK COMPATIBILITY IDEOGRAPH
+0xEE6A 0x7AEB #CJK UNIFIED IDEOGRAPH
+0xEE6B 0x7B9E #CJK UNIFIED IDEOGRAPH
+0xEE6C 0xFA1D #CJK COMPATIBILITY IDEOGRAPH
+0xEE6D 0x7D48 #CJK UNIFIED IDEOGRAPH
+0xEE6E 0x7D5C #CJK UNIFIED IDEOGRAPH
+0xEE6F 0x7DB7 #CJK UNIFIED IDEOGRAPH
+0xEE70 0x7DA0 #CJK UNIFIED IDEOGRAPH
+0xEE71 0x7DD6 #CJK UNIFIED IDEOGRAPH
+0xEE72 0x7E52 #CJK UNIFIED IDEOGRAPH
+0xEE73 0x7F47 #CJK UNIFIED IDEOGRAPH
+0xEE74 0x7FA1 #CJK UNIFIED IDEOGRAPH
+0xEE75 0xFA1E #CJK COMPATIBILITY IDEOGRAPH
+0xEE76 0x8301 #CJK UNIFIED IDEOGRAPH
+0xEE77 0x8362 #CJK UNIFIED IDEOGRAPH
+0xEE78 0x837F #CJK UNIFIED IDEOGRAPH
+0xEE79 0x83C7 #CJK UNIFIED IDEOGRAPH
+0xEE7A 0x83F6 #CJK UNIFIED IDEOGRAPH
+0xEE7B 0x8448 #CJK UNIFIED IDEOGRAPH
+0xEE7C 0x84B4 #CJK UNIFIED IDEOGRAPH
+0xEE7D 0x8553 #CJK UNIFIED IDEOGRAPH
+0xEE7E 0x8559 #CJK UNIFIED IDEOGRAPH
+0xEE80 0x856B #CJK UNIFIED IDEOGRAPH
+0xEE81 0xFA1F #CJK COMPATIBILITY IDEOGRAPH
+0xEE82 0x85B0 #CJK UNIFIED IDEOGRAPH
+0xEE83 0xFA20 #CJK COMPATIBILITY IDEOGRAPH
+0xEE84 0xFA21 #CJK COMPATIBILITY IDEOGRAPH
+0xEE85 0x8807 #CJK UNIFIED IDEOGRAPH
+0xEE86 0x88F5 #CJK UNIFIED IDEOGRAPH
+0xEE87 0x8A12 #CJK UNIFIED IDEOGRAPH
+0xEE88 0x8A37 #CJK UNIFIED IDEOGRAPH
+0xEE89 0x8A79 #CJK UNIFIED IDEOGRAPH
+0xEE8A 0x8AA7 #CJK UNIFIED IDEOGRAPH
+0xEE8B 0x8ABE #CJK UNIFIED IDEOGRAPH
+0xEE8C 0x8ADF #CJK UNIFIED IDEOGRAPH
+0xEE8D 0xFA22 #CJK COMPATIBILITY IDEOGRAPH
+0xEE8E 0x8AF6 #CJK UNIFIED IDEOGRAPH
+0xEE8F 0x8B53 #CJK UNIFIED IDEOGRAPH
+0xEE90 0x8B7F #CJK UNIFIED IDEOGRAPH
+0xEE91 0x8CF0 #CJK UNIFIED IDEOGRAPH
+0xEE92 0x8CF4 #CJK UNIFIED IDEOGRAPH
+0xEE93 0x8D12 #CJK UNIFIED IDEOGRAPH
+0xEE94 0x8D76 #CJK UNIFIED IDEOGRAPH
+0xEE95 0xFA23 #CJK COMPATIBILITY IDEOGRAPH
+0xEE96 0x8ECF #CJK UNIFIED IDEOGRAPH
+0xEE97 0xFA24 #CJK COMPATIBILITY IDEOGRAPH
+0xEE98 0xFA25 #CJK COMPATIBILITY IDEOGRAPH
+0xEE99 0x9067 #CJK UNIFIED IDEOGRAPH
+0xEE9A 0x90DE #CJK UNIFIED IDEOGRAPH
+0xEE9B 0xFA26 #CJK COMPATIBILITY IDEOGRAPH
+0xEE9C 0x9115 #CJK UNIFIED IDEOGRAPH
+0xEE9D 0x9127 #CJK UNIFIED IDEOGRAPH
+0xEE9E 0x91DA #CJK UNIFIED IDEOGRAPH
+0xEE9F 0x91D7 #CJK UNIFIED IDEOGRAPH
+0xEEA0 0x91DE #CJK UNIFIED IDEOGRAPH
+0xEEA1 0x91ED #CJK UNIFIED IDEOGRAPH
+0xEEA2 0x91EE #CJK UNIFIED IDEOGRAPH
+0xEEA3 0x91E4 #CJK UNIFIED IDEOGRAPH
+0xEEA4 0x91E5 #CJK UNIFIED IDEOGRAPH
+0xEEA5 0x9206 #CJK UNIFIED IDEOGRAPH
+0xEEA6 0x9210 #CJK UNIFIED IDEOGRAPH
+0xEEA7 0x920A #CJK UNIFIED IDEOGRAPH
+0xEEA8 0x923A #CJK UNIFIED IDEOGRAPH
+0xEEA9 0x9240 #CJK UNIFIED IDEOGRAPH
+0xEEAA 0x923C #CJK UNIFIED IDEOGRAPH
+0xEEAB 0x924E #CJK UNIFIED IDEOGRAPH
+0xEEAC 0x9259 #CJK UNIFIED IDEOGRAPH
+0xEEAD 0x9251 #CJK UNIFIED IDEOGRAPH
+0xEEAE 0x9239 #CJK UNIFIED IDEOGRAPH
+0xEEAF 0x9267 #CJK UNIFIED IDEOGRAPH
+0xEEB0 0x92A7 #CJK UNIFIED IDEOGRAPH
+0xEEB1 0x9277 #CJK UNIFIED IDEOGRAPH
+0xEEB2 0x9278 #CJK UNIFIED IDEOGRAPH
+0xEEB3 0x92E7 #CJK UNIFIED IDEOGRAPH
+0xEEB4 0x92D7 #CJK UNIFIED IDEOGRAPH
+0xEEB5 0x92D9 #CJK UNIFIED IDEOGRAPH
+0xEEB6 0x92D0 #CJK UNIFIED IDEOGRAPH
+0xEEB7 0xFA27 #CJK COMPATIBILITY IDEOGRAPH
+0xEEB8 0x92D5 #CJK UNIFIED IDEOGRAPH
+0xEEB9 0x92E0 #CJK UNIFIED IDEOGRAPH
+0xEEBA 0x92D3 #CJK UNIFIED IDEOGRAPH
+0xEEBB 0x9325 #CJK UNIFIED IDEOGRAPH
+0xEEBC 0x9321 #CJK UNIFIED IDEOGRAPH
+0xEEBD 0x92FB #CJK UNIFIED IDEOGRAPH
+0xEEBE 0xFA28 #CJK COMPATIBILITY IDEOGRAPH
+0xEEBF 0x931E #CJK UNIFIED IDEOGRAPH
+0xEEC0 0x92FF #CJK UNIFIED IDEOGRAPH
+0xEEC1 0x931D #CJK UNIFIED IDEOGRAPH
+0xEEC2 0x9302 #CJK UNIFIED IDEOGRAPH
+0xEEC3 0x9370 #CJK UNIFIED IDEOGRAPH
+0xEEC4 0x9357 #CJK UNIFIED IDEOGRAPH
+0xEEC5 0x93A4 #CJK UNIFIED IDEOGRAPH
+0xEEC6 0x93C6 #CJK UNIFIED IDEOGRAPH
+0xEEC7 0x93DE #CJK UNIFIED IDEOGRAPH
+0xEEC8 0x93F8 #CJK UNIFIED IDEOGRAPH
+0xEEC9 0x9431 #CJK UNIFIED IDEOGRAPH
+0xEECA 0x9445 #CJK UNIFIED IDEOGRAPH
+0xEECB 0x9448 #CJK UNIFIED IDEOGRAPH
+0xEECC 0x9592 #CJK UNIFIED IDEOGRAPH
+0xEECD 0xF9DC #CJK COMPATIBILITY IDEOGRAPH
+0xEECE 0xFA29 #CJK COMPATIBILITY IDEOGRAPH
+0xEECF 0x969D #CJK UNIFIED IDEOGRAPH
+0xEED0 0x96AF #CJK UNIFIED IDEOGRAPH
+0xEED1 0x9733 #CJK UNIFIED IDEOGRAPH
+0xEED2 0x973B #CJK UNIFIED IDEOGRAPH
+0xEED3 0x9743 #CJK UNIFIED IDEOGRAPH
+0xEED4 0x974D #CJK UNIFIED IDEOGRAPH
+0xEED5 0x974F #CJK UNIFIED IDEOGRAPH
+0xEED6 0x9751 #CJK UNIFIED IDEOGRAPH
+0xEED7 0x9755 #CJK UNIFIED IDEOGRAPH
+0xEED8 0x9857 #CJK UNIFIED IDEOGRAPH
+0xEED9 0x9865 #CJK UNIFIED IDEOGRAPH
+0xEEDA 0xFA2A #CJK COMPATIBILITY IDEOGRAPH
+0xEEDB 0xFA2B #CJK COMPATIBILITY IDEOGRAPH
+0xEEDC 0x9927 #CJK UNIFIED IDEOGRAPH
+0xEEDD 0xFA2C #CJK COMPATIBILITY IDEOGRAPH
+0xEEDE 0x999E #CJK UNIFIED IDEOGRAPH
+0xEEDF 0x9A4E #CJK UNIFIED IDEOGRAPH
+0xEEE0 0x9AD9 #CJK UNIFIED IDEOGRAPH
+0xEEE1 0x9ADC #CJK UNIFIED IDEOGRAPH
+0xEEE2 0x9B75 #CJK UNIFIED IDEOGRAPH
+0xEEE3 0x9B72 #CJK UNIFIED IDEOGRAPH
+0xEEE4 0x9B8F #CJK UNIFIED IDEOGRAPH
+0xEEE5 0x9BB1 #CJK UNIFIED IDEOGRAPH
+0xEEE6 0x9BBB #CJK UNIFIED IDEOGRAPH
+0xEEE7 0x9C00 #CJK UNIFIED IDEOGRAPH
+0xEEE8 0x9D70 #CJK UNIFIED IDEOGRAPH
+0xEEE9 0x9D6B #CJK UNIFIED IDEOGRAPH
+0xEEEA 0xFA2D #CJK COMPATIBILITY IDEOGRAPH
+0xEEEB 0x9E19 #CJK UNIFIED IDEOGRAPH
+0xEEEC 0x9ED1 #CJK UNIFIED IDEOGRAPH
+0xEEEF 0x2170 #SMALL ROMAN NUMERAL ONE
+0xEEF0 0x2171 #SMALL ROMAN NUMERAL TWO
+0xEEF1 0x2172 #SMALL ROMAN NUMERAL THREE
+0xEEF2 0x2173 #SMALL ROMAN NUMERAL FOUR
+0xEEF3 0x2174 #SMALL ROMAN NUMERAL FIVE
+0xEEF4 0x2175 #SMALL ROMAN NUMERAL SIX
+0xEEF5 0x2176 #SMALL ROMAN NUMERAL SEVEN
+0xEEF6 0x2177 #SMALL ROMAN NUMERAL EIGHT
+0xEEF7 0x2178 #SMALL ROMAN NUMERAL NINE
+0xEEF8 0x2179 #SMALL ROMAN NUMERAL TEN
+0xEEF9 0xFFE2 #FULLWIDTH NOT SIGN
+0xEEFA 0xFFE4 #FULLWIDTH BROKEN BAR
+0xEEFB 0xFF07 #FULLWIDTH APOSTROPHE
+0xEEFC 0xFF02 #FULLWIDTH QUOTATION MARK
+0xFA40 0x2170 #SMALL ROMAN NUMERAL ONE
+0xFA41 0x2171 #SMALL ROMAN NUMERAL TWO
+0xFA42 0x2172 #SMALL ROMAN NUMERAL THREE
+0xFA43 0x2173 #SMALL ROMAN NUMERAL FOUR
+0xFA44 0x2174 #SMALL ROMAN NUMERAL FIVE
+0xFA45 0x2175 #SMALL ROMAN NUMERAL SIX
+0xFA46 0x2176 #SMALL ROMAN NUMERAL SEVEN
+0xFA47 0x2177 #SMALL ROMAN NUMERAL EIGHT
+0xFA48 0x2178 #SMALL ROMAN NUMERAL NINE
+0xFA49 0x2179 #SMALL ROMAN NUMERAL TEN
+0xFA4A 0x2160 #ROMAN NUMERAL ONE
+0xFA4B 0x2161 #ROMAN NUMERAL TWO
+0xFA4C 0x2162 #ROMAN NUMERAL THREE
+0xFA4D 0x2163 #ROMAN NUMERAL FOUR
+0xFA4E 0x2164 #ROMAN NUMERAL FIVE
+0xFA4F 0x2165 #ROMAN NUMERAL SIX
+0xFA50 0x2166 #ROMAN NUMERAL SEVEN
+0xFA51 0x2167 #ROMAN NUMERAL EIGHT
+0xFA52 0x2168 #ROMAN NUMERAL NINE
+0xFA53 0x2169 #ROMAN NUMERAL TEN
+0xFA54 0xFFE2 #FULLWIDTH NOT SIGN
+0xFA55 0xFFE4 #FULLWIDTH BROKEN BAR
+0xFA56 0xFF07 #FULLWIDTH APOSTROPHE
+0xFA57 0xFF02 #FULLWIDTH QUOTATION MARK
+0xFA58 0x3231 #PARENTHESIZED IDEOGRAPH STOCK
+0xFA59 0x2116 #NUMERO SIGN
+0xFA5A 0x2121 #TELEPHONE SIGN
+0xFA5B 0x2235 #BECAUSE
+0xFA5C 0x7E8A #CJK UNIFIED IDEOGRAPH
+0xFA5D 0x891C #CJK UNIFIED IDEOGRAPH
+0xFA5E 0x9348 #CJK UNIFIED IDEOGRAPH
+0xFA5F 0x9288 #CJK UNIFIED IDEOGRAPH
+0xFA60 0x84DC #CJK UNIFIED IDEOGRAPH
+0xFA61 0x4FC9 #CJK UNIFIED IDEOGRAPH
+0xFA62 0x70BB #CJK UNIFIED IDEOGRAPH
+0xFA63 0x6631 #CJK UNIFIED IDEOGRAPH
+0xFA64 0x68C8 #CJK UNIFIED IDEOGRAPH
+0xFA65 0x92F9 #CJK UNIFIED IDEOGRAPH
+0xFA66 0x66FB #CJK UNIFIED IDEOGRAPH
+0xFA67 0x5F45 #CJK UNIFIED IDEOGRAPH
+0xFA68 0x4E28 #CJK UNIFIED IDEOGRAPH
+0xFA69 0x4EE1 #CJK UNIFIED IDEOGRAPH
+0xFA6A 0x4EFC #CJK UNIFIED IDEOGRAPH
+0xFA6B 0x4F00 #CJK UNIFIED IDEOGRAPH
+0xFA6C 0x4F03 #CJK UNIFIED IDEOGRAPH
+0xFA6D 0x4F39 #CJK UNIFIED IDEOGRAPH
+0xFA6E 0x4F56 #CJK UNIFIED IDEOGRAPH
+0xFA6F 0x4F92 #CJK UNIFIED IDEOGRAPH
+0xFA70 0x4F8A #CJK UNIFIED IDEOGRAPH
+0xFA71 0x4F9A #CJK UNIFIED IDEOGRAPH
+0xFA72 0x4F94 #CJK UNIFIED IDEOGRAPH
+0xFA73 0x4FCD #CJK UNIFIED IDEOGRAPH
+0xFA74 0x5040 #CJK UNIFIED IDEOGRAPH
+0xFA75 0x5022 #CJK UNIFIED IDEOGRAPH
+0xFA76 0x4FFF #CJK UNIFIED IDEOGRAPH
+0xFA77 0x501E #CJK UNIFIED IDEOGRAPH
+0xFA78 0x5046 #CJK UNIFIED IDEOGRAPH
+0xFA79 0x5070 #CJK UNIFIED IDEOGRAPH
+0xFA7A 0x5042 #CJK UNIFIED IDEOGRAPH
+0xFA7B 0x5094 #CJK UNIFIED IDEOGRAPH
+0xFA7C 0x50F4 #CJK UNIFIED IDEOGRAPH
+0xFA7D 0x50D8 #CJK UNIFIED IDEOGRAPH
+0xFA7E 0x514A #CJK UNIFIED IDEOGRAPH
+0xFA80 0x5164 #CJK UNIFIED IDEOGRAPH
+0xFA81 0x519D #CJK UNIFIED IDEOGRAPH
+0xFA82 0x51BE #CJK UNIFIED IDEOGRAPH
+0xFA83 0x51EC #CJK UNIFIED IDEOGRAPH
+0xFA84 0x5215 #CJK UNIFIED IDEOGRAPH
+0xFA85 0x529C #CJK UNIFIED IDEOGRAPH
+0xFA86 0x52A6 #CJK UNIFIED IDEOGRAPH
+0xFA87 0x52C0 #CJK UNIFIED IDEOGRAPH
+0xFA88 0x52DB #CJK UNIFIED IDEOGRAPH
+0xFA89 0x5300 #CJK UNIFIED IDEOGRAPH
+0xFA8A 0x5307 #CJK UNIFIED IDEOGRAPH
+0xFA8B 0x5324 #CJK UNIFIED IDEOGRAPH
+0xFA8C 0x5372 #CJK UNIFIED IDEOGRAPH
+0xFA8D 0x5393 #CJK UNIFIED IDEOGRAPH
+0xFA8E 0x53B2 #CJK UNIFIED IDEOGRAPH
+0xFA8F 0x53DD #CJK UNIFIED IDEOGRAPH
+0xFA90 0xFA0E #CJK COMPATIBILITY IDEOGRAPH
+0xFA91 0x549C #CJK UNIFIED IDEOGRAPH
+0xFA92 0x548A #CJK UNIFIED IDEOGRAPH
+0xFA93 0x54A9 #CJK UNIFIED IDEOGRAPH
+0xFA94 0x54FF #CJK UNIFIED IDEOGRAPH
+0xFA95 0x5586 #CJK UNIFIED IDEOGRAPH
+0xFA96 0x5759 #CJK UNIFIED IDEOGRAPH
+0xFA97 0x5765 #CJK UNIFIED IDEOGRAPH
+0xFA98 0x57AC #CJK UNIFIED IDEOGRAPH
+0xFA99 0x57C8 #CJK UNIFIED IDEOGRAPH
+0xFA9A 0x57C7 #CJK UNIFIED IDEOGRAPH
+0xFA9B 0xFA0F #CJK COMPATIBILITY IDEOGRAPH
+0xFA9C 0xFA10 #CJK COMPATIBILITY IDEOGRAPH
+0xFA9D 0x589E #CJK UNIFIED IDEOGRAPH
+0xFA9E 0x58B2 #CJK UNIFIED IDEOGRAPH
+0xFA9F 0x590B #CJK UNIFIED IDEOGRAPH
+0xFAA0 0x5953 #CJK UNIFIED IDEOGRAPH
+0xFAA1 0x595B #CJK UNIFIED IDEOGRAPH
+0xFAA2 0x595D #CJK UNIFIED IDEOGRAPH
+0xFAA3 0x5963 #CJK UNIFIED IDEOGRAPH
+0xFAA4 0x59A4 #CJK UNIFIED IDEOGRAPH
+0xFAA5 0x59BA #CJK UNIFIED IDEOGRAPH
+0xFAA6 0x5B56 #CJK UNIFIED IDEOGRAPH
+0xFAA7 0x5BC0 #CJK UNIFIED IDEOGRAPH
+0xFAA8 0x752F #CJK UNIFIED IDEOGRAPH
+0xFAA9 0x5BD8 #CJK UNIFIED IDEOGRAPH
+0xFAAA 0x5BEC #CJK UNIFIED IDEOGRAPH
+0xFAAB 0x5C1E #CJK UNIFIED IDEOGRAPH
+0xFAAC 0x5CA6 #CJK UNIFIED IDEOGRAPH
+0xFAAD 0x5CBA #CJK UNIFIED IDEOGRAPH
+0xFAAE 0x5CF5 #CJK UNIFIED IDEOGRAPH
+0xFAAF 0x5D27 #CJK UNIFIED IDEOGRAPH
+0xFAB0 0x5D53 #CJK UNIFIED IDEOGRAPH
+0xFAB1 0xFA11 #CJK COMPATIBILITY IDEOGRAPH
+0xFAB2 0x5D42 #CJK UNIFIED IDEOGRAPH
+0xFAB3 0x5D6D #CJK UNIFIED IDEOGRAPH
+0xFAB4 0x5DB8 #CJK UNIFIED IDEOGRAPH
+0xFAB5 0x5DB9 #CJK UNIFIED IDEOGRAPH
+0xFAB6 0x5DD0 #CJK UNIFIED IDEOGRAPH
+0xFAB7 0x5F21 #CJK UNIFIED IDEOGRAPH
+0xFAB8 0x5F34 #CJK UNIFIED IDEOGRAPH
+0xFAB9 0x5F67 #CJK UNIFIED IDEOGRAPH
+0xFABA 0x5FB7 #CJK UNIFIED IDEOGRAPH
+0xFABB 0x5FDE #CJK UNIFIED IDEOGRAPH
+0xFABC 0x605D #CJK UNIFIED IDEOGRAPH
+0xFABD 0x6085 #CJK UNIFIED IDEOGRAPH
+0xFABE 0x608A #CJK UNIFIED IDEOGRAPH
+0xFABF 0x60DE #CJK UNIFIED IDEOGRAPH
+0xFAC0 0x60D5 #CJK UNIFIED IDEOGRAPH
+0xFAC1 0x6120 #CJK UNIFIED IDEOGRAPH
+0xFAC2 0x60F2 #CJK UNIFIED IDEOGRAPH
+0xFAC3 0x6111 #CJK UNIFIED IDEOGRAPH
+0xFAC4 0x6137 #CJK UNIFIED IDEOGRAPH
+0xFAC5 0x6130 #CJK UNIFIED IDEOGRAPH
+0xFAC6 0x6198 #CJK UNIFIED IDEOGRAPH
+0xFAC7 0x6213 #CJK UNIFIED IDEOGRAPH
+0xFAC8 0x62A6 #CJK UNIFIED IDEOGRAPH
+0xFAC9 0x63F5 #CJK UNIFIED IDEOGRAPH
+0xFACA 0x6460 #CJK UNIFIED IDEOGRAPH
+0xFACB 0x649D #CJK UNIFIED IDEOGRAPH
+0xFACC 0x64CE #CJK UNIFIED IDEOGRAPH
+0xFACD 0x654E #CJK UNIFIED IDEOGRAPH
+0xFACE 0x6600 #CJK UNIFIED IDEOGRAPH
+0xFACF 0x6615 #CJK UNIFIED IDEOGRAPH
+0xFAD0 0x663B #CJK UNIFIED IDEOGRAPH
+0xFAD1 0x6609 #CJK UNIFIED IDEOGRAPH
+0xFAD2 0x662E #CJK UNIFIED IDEOGRAPH
+0xFAD3 0x661E #CJK UNIFIED IDEOGRAPH
+0xFAD4 0x6624 #CJK UNIFIED IDEOGRAPH
+0xFAD5 0x6665 #CJK UNIFIED IDEOGRAPH
+0xFAD6 0x6657 #CJK UNIFIED IDEOGRAPH
+0xFAD7 0x6659 #CJK UNIFIED IDEOGRAPH
+0xFAD8 0xFA12 #CJK COMPATIBILITY IDEOGRAPH
+0xFAD9 0x6673 #CJK UNIFIED IDEOGRAPH
+0xFADA 0x6699 #CJK UNIFIED IDEOGRAPH
+0xFADB 0x66A0 #CJK UNIFIED IDEOGRAPH
+0xFADC 0x66B2 #CJK UNIFIED IDEOGRAPH
+0xFADD 0x66BF #CJK UNIFIED IDEOGRAPH
+0xFADE 0x66FA #CJK UNIFIED IDEOGRAPH
+0xFADF 0x670E #CJK UNIFIED IDEOGRAPH
+0xFAE0 0xF929 #CJK COMPATIBILITY IDEOGRAPH
+0xFAE1 0x6766 #CJK UNIFIED IDEOGRAPH
+0xFAE2 0x67BB #CJK UNIFIED IDEOGRAPH
+0xFAE3 0x6852 #CJK UNIFIED IDEOGRAPH
+0xFAE4 0x67C0 #CJK UNIFIED IDEOGRAPH
+0xFAE5 0x6801 #CJK UNIFIED IDEOGRAPH
+0xFAE6 0x6844 #CJK UNIFIED IDEOGRAPH
+0xFAE7 0x68CF #CJK UNIFIED IDEOGRAPH
+0xFAE8 0xFA13 #CJK COMPATIBILITY IDEOGRAPH
+0xFAE9 0x6968 #CJK UNIFIED IDEOGRAPH
+0xFAEA 0xFA14 #CJK COMPATIBILITY IDEOGRAPH
+0xFAEB 0x6998 #CJK UNIFIED IDEOGRAPH
+0xFAEC 0x69E2 #CJK UNIFIED IDEOGRAPH
+0xFAED 0x6A30 #CJK UNIFIED IDEOGRAPH
+0xFAEE 0x6A6B #CJK UNIFIED IDEOGRAPH
+0xFAEF 0x6A46 #CJK UNIFIED IDEOGRAPH
+0xFAF0 0x6A73 #CJK UNIFIED IDEOGRAPH
+0xFAF1 0x6A7E #CJK UNIFIED IDEOGRAPH
+0xFAF2 0x6AE2 #CJK UNIFIED IDEOGRAPH
+0xFAF3 0x6AE4 #CJK UNIFIED IDEOGRAPH
+0xFAF4 0x6BD6 #CJK UNIFIED IDEOGRAPH
+0xFAF5 0x6C3F #CJK UNIFIED IDEOGRAPH
+0xFAF6 0x6C5C #CJK UNIFIED IDEOGRAPH
+0xFAF7 0x6C86 #CJK UNIFIED IDEOGRAPH
+0xFAF8 0x6C6F #CJK UNIFIED IDEOGRAPH
+0xFAF9 0x6CDA #CJK UNIFIED IDEOGRAPH
+0xFAFA 0x6D04 #CJK UNIFIED IDEOGRAPH
+0xFAFB 0x6D87 #CJK UNIFIED IDEOGRAPH
+0xFAFC 0x6D6F #CJK UNIFIED IDEOGRAPH
+0xFB40 0x6D96 #CJK UNIFIED IDEOGRAPH
+0xFB41 0x6DAC #CJK UNIFIED IDEOGRAPH
+0xFB42 0x6DCF #CJK UNIFIED IDEOGRAPH
+0xFB43 0x6DF8 #CJK UNIFIED IDEOGRAPH
+0xFB44 0x6DF2 #CJK UNIFIED IDEOGRAPH
+0xFB45 0x6DFC #CJK UNIFIED IDEOGRAPH
+0xFB46 0x6E39 #CJK UNIFIED IDEOGRAPH
+0xFB47 0x6E5C #CJK UNIFIED IDEOGRAPH
+0xFB48 0x6E27 #CJK UNIFIED IDEOGRAPH
+0xFB49 0x6E3C #CJK UNIFIED IDEOGRAPH
+0xFB4A 0x6EBF #CJK UNIFIED IDEOGRAPH
+0xFB4B 0x6F88 #CJK UNIFIED IDEOGRAPH
+0xFB4C 0x6FB5 #CJK UNIFIED IDEOGRAPH
+0xFB4D 0x6FF5 #CJK UNIFIED IDEOGRAPH
+0xFB4E 0x7005 #CJK UNIFIED IDEOGRAPH
+0xFB4F 0x7007 #CJK UNIFIED IDEOGRAPH
+0xFB50 0x7028 #CJK UNIFIED IDEOGRAPH
+0xFB51 0x7085 #CJK UNIFIED IDEOGRAPH
+0xFB52 0x70AB #CJK UNIFIED IDEOGRAPH
+0xFB53 0x710F #CJK UNIFIED IDEOGRAPH
+0xFB54 0x7104 #CJK UNIFIED IDEOGRAPH
+0xFB55 0x715C #CJK UNIFIED IDEOGRAPH
+0xFB56 0x7146 #CJK UNIFIED IDEOGRAPH
+0xFB57 0x7147 #CJK UNIFIED IDEOGRAPH
+0xFB58 0xFA15 #CJK COMPATIBILITY IDEOGRAPH
+0xFB59 0x71C1 #CJK UNIFIED IDEOGRAPH
+0xFB5A 0x71FE #CJK UNIFIED IDEOGRAPH
+0xFB5B 0x72B1 #CJK UNIFIED IDEOGRAPH
+0xFB5C 0x72BE #CJK UNIFIED IDEOGRAPH
+0xFB5D 0x7324 #CJK UNIFIED IDEOGRAPH
+0xFB5E 0xFA16 #CJK COMPATIBILITY IDEOGRAPH
+0xFB5F 0x7377 #CJK UNIFIED IDEOGRAPH
+0xFB60 0x73BD #CJK UNIFIED IDEOGRAPH
+0xFB61 0x73C9 #CJK UNIFIED IDEOGRAPH
+0xFB62 0x73D6 #CJK UNIFIED IDEOGRAPH
+0xFB63 0x73E3 #CJK UNIFIED IDEOGRAPH
+0xFB64 0x73D2 #CJK UNIFIED IDEOGRAPH
+0xFB65 0x7407 #CJK UNIFIED IDEOGRAPH
+0xFB66 0x73F5 #CJK UNIFIED IDEOGRAPH
+0xFB67 0x7426 #CJK UNIFIED IDEOGRAPH
+0xFB68 0x742A #CJK UNIFIED IDEOGRAPH
+0xFB69 0x7429 #CJK UNIFIED IDEOGRAPH
+0xFB6A 0x742E #CJK UNIFIED IDEOGRAPH
+0xFB6B 0x7462 #CJK UNIFIED IDEOGRAPH
+0xFB6C 0x7489 #CJK UNIFIED IDEOGRAPH
+0xFB6D 0x749F #CJK UNIFIED IDEOGRAPH
+0xFB6E 0x7501 #CJK UNIFIED IDEOGRAPH
+0xFB6F 0x756F #CJK UNIFIED IDEOGRAPH
+0xFB70 0x7682 #CJK UNIFIED IDEOGRAPH
+0xFB71 0x769C #CJK UNIFIED IDEOGRAPH
+0xFB72 0x769E #CJK UNIFIED IDEOGRAPH
+0xFB73 0x769B #CJK UNIFIED IDEOGRAPH
+0xFB74 0x76A6 #CJK UNIFIED IDEOGRAPH
+0xFB75 0xFA17 #CJK COMPATIBILITY IDEOGRAPH
+0xFB76 0x7746 #CJK UNIFIED IDEOGRAPH
+0xFB77 0x52AF #CJK UNIFIED IDEOGRAPH
+0xFB78 0x7821 #CJK UNIFIED IDEOGRAPH
+0xFB79 0x784E #CJK UNIFIED IDEOGRAPH
+0xFB7A 0x7864 #CJK UNIFIED IDEOGRAPH
+0xFB7B 0x787A #CJK UNIFIED IDEOGRAPH
+0xFB7C 0x7930 #CJK UNIFIED IDEOGRAPH
+0xFB7D 0xFA18 #CJK COMPATIBILITY IDEOGRAPH
+0xFB7E 0xFA19 #CJK COMPATIBILITY IDEOGRAPH
+0xFB80 0xFA1A #CJK COMPATIBILITY IDEOGRAPH
+0xFB81 0x7994 #CJK UNIFIED IDEOGRAPH
+0xFB82 0xFA1B #CJK COMPATIBILITY IDEOGRAPH
+0xFB83 0x799B #CJK UNIFIED IDEOGRAPH
+0xFB84 0x7AD1 #CJK UNIFIED IDEOGRAPH
+0xFB85 0x7AE7 #CJK UNIFIED IDEOGRAPH
+0xFB86 0xFA1C #CJK COMPATIBILITY IDEOGRAPH
+0xFB87 0x7AEB #CJK UNIFIED IDEOGRAPH
+0xFB88 0x7B9E #CJK UNIFIED IDEOGRAPH
+0xFB89 0xFA1D #CJK COMPATIBILITY IDEOGRAPH
+0xFB8A 0x7D48 #CJK UNIFIED IDEOGRAPH
+0xFB8B 0x7D5C #CJK UNIFIED IDEOGRAPH
+0xFB8C 0x7DB7 #CJK UNIFIED IDEOGRAPH
+0xFB8D 0x7DA0 #CJK UNIFIED IDEOGRAPH
+0xFB8E 0x7DD6 #CJK UNIFIED IDEOGRAPH
+0xFB8F 0x7E52 #CJK UNIFIED IDEOGRAPH
+0xFB90 0x7F47 #CJK UNIFIED IDEOGRAPH
+0xFB91 0x7FA1 #CJK UNIFIED IDEOGRAPH
+0xFB92 0xFA1E #CJK COMPATIBILITY IDEOGRAPH
+0xFB93 0x8301 #CJK UNIFIED IDEOGRAPH
+0xFB94 0x8362 #CJK UNIFIED IDEOGRAPH
+0xFB95 0x837F #CJK UNIFIED IDEOGRAPH
+0xFB96 0x83C7 #CJK UNIFIED IDEOGRAPH
+0xFB97 0x83F6 #CJK UNIFIED IDEOGRAPH
+0xFB98 0x8448 #CJK UNIFIED IDEOGRAPH
+0xFB99 0x84B4 #CJK UNIFIED IDEOGRAPH
+0xFB9A 0x8553 #CJK UNIFIED IDEOGRAPH
+0xFB9B 0x8559 #CJK UNIFIED IDEOGRAPH
+0xFB9C 0x856B #CJK UNIFIED IDEOGRAPH
+0xFB9D 0xFA1F #CJK COMPATIBILITY IDEOGRAPH
+0xFB9E 0x85B0 #CJK UNIFIED IDEOGRAPH
+0xFB9F 0xFA20 #CJK COMPATIBILITY IDEOGRAPH
+0xFBA0 0xFA21 #CJK COMPATIBILITY IDEOGRAPH
+0xFBA1 0x8807 #CJK UNIFIED IDEOGRAPH
+0xFBA2 0x88F5 #CJK UNIFIED IDEOGRAPH
+0xFBA3 0x8A12 #CJK UNIFIED IDEOGRAPH
+0xFBA4 0x8A37 #CJK UNIFIED IDEOGRAPH
+0xFBA5 0x8A79 #CJK UNIFIED IDEOGRAPH
+0xFBA6 0x8AA7 #CJK UNIFIED IDEOGRAPH
+0xFBA7 0x8ABE #CJK UNIFIED IDEOGRAPH
+0xFBA8 0x8ADF #CJK UNIFIED IDEOGRAPH
+0xFBA9 0xFA22 #CJK COMPATIBILITY IDEOGRAPH
+0xFBAA 0x8AF6 #CJK UNIFIED IDEOGRAPH
+0xFBAB 0x8B53 #CJK UNIFIED IDEOGRAPH
+0xFBAC 0x8B7F #CJK UNIFIED IDEOGRAPH
+0xFBAD 0x8CF0 #CJK UNIFIED IDEOGRAPH
+0xFBAE 0x8CF4 #CJK UNIFIED IDEOGRAPH
+0xFBAF 0x8D12 #CJK UNIFIED IDEOGRAPH
+0xFBB0 0x8D76 #CJK UNIFIED IDEOGRAPH
+0xFBB1 0xFA23 #CJK COMPATIBILITY IDEOGRAPH
+0xFBB2 0x8ECF #CJK UNIFIED IDEOGRAPH
+0xFBB3 0xFA24 #CJK COMPATIBILITY IDEOGRAPH
+0xFBB4 0xFA25 #CJK COMPATIBILITY IDEOGRAPH
+0xFBB5 0x9067 #CJK UNIFIED IDEOGRAPH
+0xFBB6 0x90DE #CJK UNIFIED IDEOGRAPH
+0xFBB7 0xFA26 #CJK COMPATIBILITY IDEOGRAPH
+0xFBB8 0x9115 #CJK UNIFIED IDEOGRAPH
+0xFBB9 0x9127 #CJK UNIFIED IDEOGRAPH
+0xFBBA 0x91DA #CJK UNIFIED IDEOGRAPH
+0xFBBB 0x91D7 #CJK UNIFIED IDEOGRAPH
+0xFBBC 0x91DE #CJK UNIFIED IDEOGRAPH
+0xFBBD 0x91ED #CJK UNIFIED IDEOGRAPH
+0xFBBE 0x91EE #CJK UNIFIED IDEOGRAPH
+0xFBBF 0x91E4 #CJK UNIFIED IDEOGRAPH
+0xFBC0 0x91E5 #CJK UNIFIED IDEOGRAPH
+0xFBC1 0x9206 #CJK UNIFIED IDEOGRAPH
+0xFBC2 0x9210 #CJK UNIFIED IDEOGRAPH
+0xFBC3 0x920A #CJK UNIFIED IDEOGRAPH
+0xFBC4 0x923A #CJK UNIFIED IDEOGRAPH
+0xFBC5 0x9240 #CJK UNIFIED IDEOGRAPH
+0xFBC6 0x923C #CJK UNIFIED IDEOGRAPH
+0xFBC7 0x924E #CJK UNIFIED IDEOGRAPH
+0xFBC8 0x9259 #CJK UNIFIED IDEOGRAPH
+0xFBC9 0x9251 #CJK UNIFIED IDEOGRAPH
+0xFBCA 0x9239 #CJK UNIFIED IDEOGRAPH
+0xFBCB 0x9267 #CJK UNIFIED IDEOGRAPH
+0xFBCC 0x92A7 #CJK UNIFIED IDEOGRAPH
+0xFBCD 0x9277 #CJK UNIFIED IDEOGRAPH
+0xFBCE 0x9278 #CJK UNIFIED IDEOGRAPH
+0xFBCF 0x92E7 #CJK UNIFIED IDEOGRAPH
+0xFBD0 0x92D7 #CJK UNIFIED IDEOGRAPH
+0xFBD1 0x92D9 #CJK UNIFIED IDEOGRAPH
+0xFBD2 0x92D0 #CJK UNIFIED IDEOGRAPH
+0xFBD3 0xFA27 #CJK COMPATIBILITY IDEOGRAPH
+0xFBD4 0x92D5 #CJK UNIFIED IDEOGRAPH
+0xFBD5 0x92E0 #CJK UNIFIED IDEOGRAPH
+0xFBD6 0x92D3 #CJK UNIFIED IDEOGRAPH
+0xFBD7 0x9325 #CJK UNIFIED IDEOGRAPH
+0xFBD8 0x9321 #CJK UNIFIED IDEOGRAPH
+0xFBD9 0x92FB #CJK UNIFIED IDEOGRAPH
+0xFBDA 0xFA28 #CJK COMPATIBILITY IDEOGRAPH
+0xFBDB 0x931E #CJK UNIFIED IDEOGRAPH
+0xFBDC 0x92FF #CJK UNIFIED IDEOGRAPH
+0xFBDD 0x931D #CJK UNIFIED IDEOGRAPH
+0xFBDE 0x9302 #CJK UNIFIED IDEOGRAPH
+0xFBDF 0x9370 #CJK UNIFIED IDEOGRAPH
+0xFBE0 0x9357 #CJK UNIFIED IDEOGRAPH
+0xFBE1 0x93A4 #CJK UNIFIED IDEOGRAPH
+0xFBE2 0x93C6 #CJK UNIFIED IDEOGRAPH
+0xFBE3 0x93DE #CJK UNIFIED IDEOGRAPH
+0xFBE4 0x93F8 #CJK UNIFIED IDEOGRAPH
+0xFBE5 0x9431 #CJK UNIFIED IDEOGRAPH
+0xFBE6 0x9445 #CJK UNIFIED IDEOGRAPH
+0xFBE7 0x9448 #CJK UNIFIED IDEOGRAPH
+0xFBE8 0x9592 #CJK UNIFIED IDEOGRAPH
+0xFBE9 0xF9DC #CJK COMPATIBILITY IDEOGRAPH
+0xFBEA 0xFA29 #CJK COMPATIBILITY IDEOGRAPH
+0xFBEB 0x969D #CJK UNIFIED IDEOGRAPH
+0xFBEC 0x96AF #CJK UNIFIED IDEOGRAPH
+0xFBED 0x9733 #CJK UNIFIED IDEOGRAPH
+0xFBEE 0x973B #CJK UNIFIED IDEOGRAPH
+0xFBEF 0x9743 #CJK UNIFIED IDEOGRAPH
+0xFBF0 0x974D #CJK UNIFIED IDEOGRAPH
+0xFBF1 0x974F #CJK UNIFIED IDEOGRAPH
+0xFBF2 0x9751 #CJK UNIFIED IDEOGRAPH
+0xFBF3 0x9755 #CJK UNIFIED IDEOGRAPH
+0xFBF4 0x9857 #CJK UNIFIED IDEOGRAPH
+0xFBF5 0x9865 #CJK UNIFIED IDEOGRAPH
+0xFBF6 0xFA2A #CJK COMPATIBILITY IDEOGRAPH
+0xFBF7 0xFA2B #CJK COMPATIBILITY IDEOGRAPH
+0xFBF8 0x9927 #CJK UNIFIED IDEOGRAPH
+0xFBF9 0xFA2C #CJK COMPATIBILITY IDEOGRAPH
+0xFBFA 0x999E #CJK UNIFIED IDEOGRAPH
+0xFBFB 0x9A4E #CJK UNIFIED IDEOGRAPH
+0xFBFC 0x9AD9 #CJK UNIFIED IDEOGRAPH
+0xFC40 0x9ADC #CJK UNIFIED IDEOGRAPH
+0xFC41 0x9B75 #CJK UNIFIED IDEOGRAPH
+0xFC42 0x9B72 #CJK UNIFIED IDEOGRAPH
+0xFC43 0x9B8F #CJK UNIFIED IDEOGRAPH
+0xFC44 0x9BB1 #CJK UNIFIED IDEOGRAPH
+0xFC45 0x9BBB #CJK UNIFIED IDEOGRAPH
+0xFC46 0x9C00 #CJK UNIFIED IDEOGRAPH
+0xFC47 0x9D70 #CJK UNIFIED IDEOGRAPH
+0xFC48 0x9D6B #CJK UNIFIED IDEOGRAPH
+0xFC49 0xFA2D #CJK COMPATIBILITY IDEOGRAPH
+0xFC4A 0x9E19 #CJK UNIFIED IDEOGRAPH
+0xFC4B 0x9ED1 #CJK UNIFIED IDEOGRAPH
diff --git a/ext/mbstring/tests/data/EUC-JP.txt b/ext/mbstring/tests/data/EUC-JP.txt
new file mode 100644
index 0000000000..8a56f460b1
--- /dev/null
+++ b/ext/mbstring/tests/data/EUC-JP.txt
@@ -0,0 +1,13137 @@
+0x00 0x0000
+0x01 0x0001
+0x02 0x0002
+0x03 0x0003
+0x04 0x0004
+0x05 0x0005
+0x06 0x0006
+0x07 0x0007
+0x08 0x0008
+0x09 0x0009
+0x0A 0x000A
+0x0B 0x000B
+0x0C 0x000C
+0x0D 0x000D
+0x0E 0x000E
+0x0F 0x000F
+0x10 0x0010
+0x11 0x0011
+0x12 0x0012
+0x13 0x0013
+0x14 0x0014
+0x15 0x0015
+0x16 0x0016
+0x17 0x0017
+0x18 0x0018
+0x19 0x0019
+0x1A 0x001A
+0x1B 0x001B
+0x1C 0x001C
+0x1D 0x001D
+0x1E 0x001E
+0x1F 0x001F
+0x20 0x0020
+0x21 0x0021
+0x22 0x0022
+0x23 0x0023
+0x24 0x0024
+0x25 0x0025
+0x26 0x0026
+0x27 0x0027
+0x28 0x0028
+0x29 0x0029
+0x2A 0x002A
+0x2B 0x002B
+0x2C 0x002C
+0x2D 0x002D
+0x2E 0x002E
+0x2F 0x002F
+0x30 0x0030
+0x31 0x0031
+0x32 0x0032
+0x33 0x0033
+0x34 0x0034
+0x35 0x0035
+0x36 0x0036
+0x37 0x0037
+0x38 0x0038
+0x39 0x0039
+0x3A 0x003A
+0x3B 0x003B
+0x3C 0x003C
+0x3D 0x003D
+0x3E 0x003E
+0x3F 0x003F
+0x40 0x0040
+0x41 0x0041
+0x42 0x0042
+0x43 0x0043
+0x44 0x0044
+0x45 0x0045
+0x46 0x0046
+0x47 0x0047
+0x48 0x0048
+0x49 0x0049
+0x4A 0x004A
+0x4B 0x004B
+0x4C 0x004C
+0x4D 0x004D
+0x4E 0x004E
+0x4F 0x004F
+0x50 0x0050
+0x51 0x0051
+0x52 0x0052
+0x53 0x0053
+0x54 0x0054
+0x55 0x0055
+0x56 0x0056
+0x57 0x0057
+0x58 0x0058
+0x59 0x0059
+0x5A 0x005A
+0x5B 0x005B
+0x5C 0x005C
+0x5D 0x005D
+0x5E 0x005E
+0x5F 0x005F
+0x60 0x0060
+0x61 0x0061
+0x62 0x0062
+0x63 0x0063
+0x64 0x0064
+0x65 0x0065
+0x66 0x0066
+0x67 0x0067
+0x68 0x0068
+0x69 0x0069
+0x6A 0x006A
+0x6B 0x006B
+0x6C 0x006C
+0x6D 0x006D
+0x6E 0x006E
+0x6F 0x006F
+0x70 0x0070
+0x71 0x0071
+0x72 0x0072
+0x73 0x0073
+0x74 0x0074
+0x75 0x0075
+0x76 0x0076
+0x77 0x0077
+0x78 0x0078
+0x79 0x0079
+0x7A 0x007A
+0x7B 0x007B
+0x7C 0x007C
+0x7D 0x007D
+0x7E 0x007E
+0x7F 0x007F
+0x8EA1 0xFF61
+0x8EA2 0xFF62
+0x8EA3 0xFF63
+0x8EA4 0xFF64
+0x8EA5 0xFF65
+0x8EA6 0xFF66
+0x8EA7 0xFF67
+0x8EA8 0xFF68
+0x8EA9 0xFF69
+0x8EAA 0xFF6A
+0x8EAB 0xFF6B
+0x8EAC 0xFF6C
+0x8EAD 0xFF6D
+0x8EAE 0xFF6E
+0x8EAF 0xFF6F
+0x8EB0 0xFF70
+0x8EB1 0xFF71
+0x8EB2 0xFF72
+0x8EB3 0xFF73
+0x8EB4 0xFF74
+0x8EB5 0xFF75
+0x8EB6 0xFF76
+0x8EB7 0xFF77
+0x8EB8 0xFF78
+0x8EB9 0xFF79
+0x8EBA 0xFF7A
+0x8EBB 0xFF7B
+0x8EBC 0xFF7C
+0x8EBD 0xFF7D
+0x8EBE 0xFF7E
+0x8EBF 0xFF7F
+0x8EC0 0xFF80
+0x8EC1 0xFF81
+0x8EC2 0xFF82
+0x8EC3 0xFF83
+0x8EC4 0xFF84
+0x8EC5 0xFF85
+0x8EC6 0xFF86
+0x8EC7 0xFF87
+0x8EC8 0xFF88
+0x8EC9 0xFF89
+0x8ECA 0xFF8A
+0x8ECB 0xFF8B
+0x8ECC 0xFF8C
+0x8ECD 0xFF8D
+0x8ECE 0xFF8E
+0x8ECF 0xFF8F
+0x8ED0 0xFF90
+0x8ED1 0xFF91
+0x8ED2 0xFF92
+0x8ED3 0xFF93
+0x8ED4 0xFF94
+0x8ED5 0xFF95
+0x8ED6 0xFF96
+0x8ED7 0xFF97
+0x8ED8 0xFF98
+0x8ED9 0xFF99
+0x8EDA 0xFF9A
+0x8EDB 0xFF9B
+0x8EDC 0xFF9C
+0x8EDD 0xFF9D
+0x8EDE 0xFF9E
+0x8EDF 0xFF9F
+0x8FA2AF 0x02D8
+0x8FA2B0 0x02C7
+0x8FA2B1 0x00B8
+0x8FA2B2 0x02D9
+0x8FA2B3 0x02DD
+0x8FA2B4 0x00AF
+0x8FA2B5 0x02DB
+0x8FA2B6 0x02DA
+0x8FA2B7 0x007E
+0x8FA2B8 0x0384
+0x8FA2B9 0x0385
+0x8FA2C2 0x00A1
+0x8FA2C3 0x00A6
+0x8FA2C4 0x00BF
+0x8FA2EB 0x00BA
+0x8FA2EC 0x00AA
+0x8FA2ED 0x00A9
+0x8FA2EE 0x00AE
+0x8FA2EF 0x2122
+0x8FA2F0 0x00A4
+0x8FA2F1 0x2116
+0x8FA6E1 0x0386
+0x8FA6E2 0x0388
+0x8FA6E3 0x0389
+0x8FA6E4 0x038A
+0x8FA6E5 0x03AA
+0x8FA6E7 0x038C
+0x8FA6E9 0x038E
+0x8FA6EA 0x03AB
+0x8FA6EC 0x038F
+0x8FA6F1 0x03AC
+0x8FA6F2 0x03AD
+0x8FA6F3 0x03AE
+0x8FA6F4 0x03AF
+0x8FA6F5 0x03CA
+0x8FA6F6 0x0390
+0x8FA6F7 0x03CC
+0x8FA6F8 0x03C2
+0x8FA6F9 0x03CD
+0x8FA6FA 0x03CB
+0x8FA6FB 0x03B0
+0x8FA6FC 0x03CE
+0x8FA7C2 0x0402
+0x8FA7C3 0x0403
+0x8FA7C4 0x0404
+0x8FA7C5 0x0405
+0x8FA7C6 0x0406
+0x8FA7C7 0x0407
+0x8FA7C8 0x0408
+0x8FA7C9 0x0409
+0x8FA7CA 0x040A
+0x8FA7CB 0x040B
+0x8FA7CC 0x040C
+0x8FA7CD 0x040E
+0x8FA7CE 0x040F
+0x8FA7F2 0x0452
+0x8FA7F3 0x0453
+0x8FA7F4 0x0454
+0x8FA7F5 0x0455
+0x8FA7F6 0x0456
+0x8FA7F7 0x0457
+0x8FA7F8 0x0458
+0x8FA7F9 0x0459
+0x8FA7FA 0x045A
+0x8FA7FB 0x045B
+0x8FA7FC 0x045C
+0x8FA7FD 0x045E
+0x8FA7FE 0x045F
+0x8FA9A1 0x00C6
+0x8FA9A2 0x0110
+0x8FA9A4 0x0126
+0x8FA9A6 0x0132
+0x8FA9A8 0x0141
+0x8FA9A9 0x013F
+0x8FA9AB 0x014A
+0x8FA9AC 0x00D8
+0x8FA9AD 0x0152
+0x8FA9AF 0x0166
+0x8FA9B0 0x00DE
+0x8FA9C1 0x00E6
+0x8FA9C2 0x0111
+0x8FA9C3 0x00F0
+0x8FA9C4 0x0127
+0x8FA9C5 0x0131
+0x8FA9C6 0x0133
+0x8FA9C7 0x0138
+0x8FA9C8 0x0142
+0x8FA9C9 0x0140
+0x8FA9CA 0x0149
+0x8FA9CB 0x014B
+0x8FA9CC 0x00F8
+0x8FA9CD 0x0153
+0x8FA9CE 0x00DF
+0x8FA9CF 0x0167
+0x8FA9D0 0x00FE
+0x8FAAA1 0x00C1
+0x8FAAA2 0x00C0
+0x8FAAA3 0x00C4
+0x8FAAA4 0x00C2
+0x8FAAA5 0x0102
+0x8FAAA6 0x01CD
+0x8FAAA7 0x0100
+0x8FAAA8 0x0104
+0x8FAAA9 0x00C5
+0x8FAAAA 0x00C3
+0x8FAAAB 0x0106
+0x8FAAAC 0x0108
+0x8FAAAD 0x010C
+0x8FAAAE 0x00C7
+0x8FAAAF 0x010A
+0x8FAAB0 0x010E
+0x8FAAB1 0x00C9
+0x8FAAB2 0x00C8
+0x8FAAB3 0x00CB
+0x8FAAB4 0x00CA
+0x8FAAB5 0x011A
+0x8FAAB6 0x0116
+0x8FAAB7 0x0112
+0x8FAAB8 0x0118
+0x8FAABA 0x011C
+0x8FAABB 0x011E
+0x8FAABC 0x0122
+0x8FAABD 0x0120
+0x8FAABE 0x0124
+0x8FAABF 0x00CD
+0x8FAAC0 0x00CC
+0x8FAAC1 0x00CF
+0x8FAAC2 0x00CE
+0x8FAAC3 0x01CF
+0x8FAAC4 0x0130
+0x8FAAC5 0x012A
+0x8FAAC6 0x012E
+0x8FAAC7 0x0128
+0x8FAAC8 0x0134
+0x8FAAC9 0x0136
+0x8FAACA 0x0139
+0x8FAACB 0x013D
+0x8FAACC 0x013B
+0x8FAACD 0x0143
+0x8FAACE 0x0147
+0x8FAACF 0x0145
+0x8FAAD0 0x00D1
+0x8FAAD1 0x00D3
+0x8FAAD2 0x00D2
+0x8FAAD3 0x00D6
+0x8FAAD4 0x00D4
+0x8FAAD5 0x01D1
+0x8FAAD6 0x0150
+0x8FAAD7 0x014C
+0x8FAAD8 0x00D5
+0x8FAAD9 0x0154
+0x8FAADA 0x0158
+0x8FAADB 0x0156
+0x8FAADC 0x015A
+0x8FAADD 0x015C
+0x8FAADE 0x0160
+0x8FAADF 0x015E
+0x8FAAE0 0x0164
+0x8FAAE1 0x0162
+0x8FAAE2 0x00DA
+0x8FAAE3 0x00D9
+0x8FAAE4 0x00DC
+0x8FAAE5 0x00DB
+0x8FAAE6 0x016C
+0x8FAAE7 0x01D3
+0x8FAAE8 0x0170
+0x8FAAE9 0x016A
+0x8FAAEA 0x0172
+0x8FAAEB 0x016E
+0x8FAAEC 0x0168
+0x8FAAED 0x01D7
+0x8FAAEE 0x01DB
+0x8FAAEF 0x01D9
+0x8FAAF0 0x01D5
+0x8FAAF1 0x0174
+0x8FAAF2 0x00DD
+0x8FAAF3 0x0178
+0x8FAAF4 0x0176
+0x8FAAF5 0x0179
+0x8FAAF6 0x017D
+0x8FAAF7 0x017B
+0x8FABA1 0x00E1
+0x8FABA2 0x00E0
+0x8FABA3 0x00E4
+0x8FABA4 0x00E2
+0x8FABA5 0x0103
+0x8FABA6 0x01CE
+0x8FABA7 0x0101
+0x8FABA8 0x0105
+0x8FABA9 0x00E5
+0x8FABAA 0x00E3
+0x8FABAB 0x0107
+0x8FABAC 0x0109
+0x8FABAD 0x010D
+0x8FABAE 0x00E7
+0x8FABAF 0x010B
+0x8FABB0 0x010F
+0x8FABB1 0x00E9
+0x8FABB2 0x00E8
+0x8FABB3 0x00EB
+0x8FABB4 0x00EA
+0x8FABB5 0x011B
+0x8FABB6 0x0117
+0x8FABB7 0x0113
+0x8FABB8 0x0119
+0x8FABB9 0x01F5
+0x8FABBA 0x011D
+0x8FABBB 0x011F
+0x8FABBD 0x0121
+0x8FABBE 0x0125
+0x8FABBF 0x00ED
+0x8FABC0 0x00EC
+0x8FABC1 0x00EF
+0x8FABC2 0x00EE
+0x8FABC3 0x01D0
+0x8FABC5 0x012B
+0x8FABC6 0x012F
+0x8FABC7 0x0129
+0x8FABC8 0x0135
+0x8FABC9 0x0137
+0x8FABCA 0x013A
+0x8FABCB 0x013E
+0x8FABCC 0x013C
+0x8FABCD 0x0144
+0x8FABCE 0x0148
+0x8FABCF 0x0146
+0x8FABD0 0x00F1
+0x8FABD1 0x00F3
+0x8FABD2 0x00F2
+0x8FABD3 0x00F6
+0x8FABD4 0x00F4
+0x8FABD5 0x01D2
+0x8FABD6 0x0151
+0x8FABD7 0x014D
+0x8FABD8 0x00F5
+0x8FABD9 0x0155
+0x8FABDA 0x0159
+0x8FABDB 0x0157
+0x8FABDC 0x015B
+0x8FABDD 0x015D
+0x8FABDE 0x0161
+0x8FABDF 0x015F
+0x8FABE0 0x0165
+0x8FABE1 0x0163
+0x8FABE2 0x00FA
+0x8FABE3 0x00F9
+0x8FABE4 0x00FC
+0x8FABE5 0x00FB
+0x8FABE6 0x016D
+0x8FABE7 0x01D4
+0x8FABE8 0x0171
+0x8FABE9 0x016B
+0x8FABEA 0x0173
+0x8FABEB 0x016F
+0x8FABEC 0x0169
+0x8FABED 0x01D8
+0x8FABEE 0x01DC
+0x8FABEF 0x01DA
+0x8FABF0 0x01D6
+0x8FABF1 0x0175
+0x8FABF2 0x00FD
+0x8FABF3 0x00FF
+0x8FABF4 0x0177
+0x8FABF5 0x017A
+0x8FABF6 0x017E
+0x8FABF7 0x017C
+0x8FB0A1 0x4E02
+0x8FB0A2 0x4E04
+0x8FB0A3 0x4E05
+0x8FB0A4 0x4E0C
+0x8FB0A5 0x4E12
+0x8FB0A6 0x4E1F
+0x8FB0A7 0x4E23
+0x8FB0A8 0x4E24
+0x8FB0A9 0x4E28
+0x8FB0AA 0x4E2B
+0x8FB0AB 0x4E2E
+0x8FB0AC 0x4E2F
+0x8FB0AD 0x4E30
+0x8FB0AE 0x4E35
+0x8FB0AF 0x4E40
+0x8FB0B0 0x4E41
+0x8FB0B1 0x4E44
+0x8FB0B2 0x4E47
+0x8FB0B3 0x4E51
+0x8FB0B4 0x4E5A
+0x8FB0B5 0x4E5C
+0x8FB0B6 0x4E63
+0x8FB0B7 0x4E68
+0x8FB0B8 0x4E69
+0x8FB0B9 0x4E74
+0x8FB0BA 0x4E75
+0x8FB0BB 0x4E79
+0x8FB0BC 0x4E7F
+0x8FB0BD 0x4E8D
+0x8FB0BE 0x4E96
+0x8FB0BF 0x4E97
+0x8FB0C0 0x4E9D
+0x8FB0C1 0x4EAF
+0x8FB0C2 0x4EB9
+0x8FB0C3 0x4EC3
+0x8FB0C4 0x4ED0
+0x8FB0C5 0x4EDA
+0x8FB0C6 0x4EDB
+0x8FB0C7 0x4EE0
+0x8FB0C8 0x4EE1
+0x8FB0C9 0x4EE2
+0x8FB0CA 0x4EE8
+0x8FB0CB 0x4EEF
+0x8FB0CC 0x4EF1
+0x8FB0CD 0x4EF3
+0x8FB0CE 0x4EF5
+0x8FB0CF 0x4EFD
+0x8FB0D0 0x4EFE
+0x8FB0D1 0x4EFF
+0x8FB0D2 0x4F00
+0x8FB0D3 0x4F02
+0x8FB0D4 0x4F03
+0x8FB0D5 0x4F08
+0x8FB0D6 0x4F0B
+0x8FB0D7 0x4F0C
+0x8FB0D8 0x4F12
+0x8FB0D9 0x4F15
+0x8FB0DA 0x4F16
+0x8FB0DB 0x4F17
+0x8FB0DC 0x4F19
+0x8FB0DD 0x4F2E
+0x8FB0DE 0x4F31
+0x8FB0DF 0x4F60
+0x8FB0E0 0x4F33
+0x8FB0E1 0x4F35
+0x8FB0E2 0x4F37
+0x8FB0E3 0x4F39
+0x8FB0E4 0x4F3B
+0x8FB0E5 0x4F3E
+0x8FB0E6 0x4F40
+0x8FB0E7 0x4F42
+0x8FB0E8 0x4F48
+0x8FB0E9 0x4F49
+0x8FB0EA 0x4F4B
+0x8FB0EB 0x4F4C
+0x8FB0EC 0x4F52
+0x8FB0ED 0x4F54
+0x8FB0EE 0x4F56
+0x8FB0EF 0x4F58
+0x8FB0F0 0x4F5F
+0x8FB0F1 0x4F63
+0x8FB0F2 0x4F6A
+0x8FB0F3 0x4F6C
+0x8FB0F4 0x4F6E
+0x8FB0F5 0x4F71
+0x8FB0F6 0x4F77
+0x8FB0F7 0x4F78
+0x8FB0F8 0x4F79
+0x8FB0F9 0x4F7A
+0x8FB0FA 0x4F7D
+0x8FB0FB 0x4F7E
+0x8FB0FC 0x4F81
+0x8FB0FD 0x4F82
+0x8FB0FE 0x4F84
+0x8FB1A1 0x4F85
+0x8FB1A2 0x4F89
+0x8FB1A3 0x4F8A
+0x8FB1A4 0x4F8C
+0x8FB1A5 0x4F8E
+0x8FB1A6 0x4F90
+0x8FB1A7 0x4F92
+0x8FB1A8 0x4F93
+0x8FB1A9 0x4F94
+0x8FB1AA 0x4F97
+0x8FB1AB 0x4F99
+0x8FB1AC 0x4F9A
+0x8FB1AD 0x4F9E
+0x8FB1AE 0x4F9F
+0x8FB1AF 0x4FB2
+0x8FB1B0 0x4FB7
+0x8FB1B1 0x4FB9
+0x8FB1B2 0x4FBB
+0x8FB1B3 0x4FBC
+0x8FB1B4 0x4FBD
+0x8FB1B5 0x4FBE
+0x8FB1B6 0x4FC0
+0x8FB1B7 0x4FC1
+0x8FB1B8 0x4FC5
+0x8FB1B9 0x4FC6
+0x8FB1BA 0x4FC8
+0x8FB1BB 0x4FC9
+0x8FB1BC 0x4FCB
+0x8FB1BD 0x4FCC
+0x8FB1BE 0x4FCD
+0x8FB1BF 0x4FCF
+0x8FB1C0 0x4FD2
+0x8FB1C1 0x4FDC
+0x8FB1C2 0x4FE0
+0x8FB1C3 0x4FE2
+0x8FB1C4 0x4FF0
+0x8FB1C5 0x4FF2
+0x8FB1C6 0x4FFC
+0x8FB1C7 0x4FFD
+0x8FB1C8 0x4FFF
+0x8FB1C9 0x5000
+0x8FB1CA 0x5001
+0x8FB1CB 0x5004
+0x8FB1CC 0x5007
+0x8FB1CD 0x500A
+0x8FB1CE 0x500C
+0x8FB1CF 0x500E
+0x8FB1D0 0x5010
+0x8FB1D1 0x5013
+0x8FB1D2 0x5017
+0x8FB1D3 0x5018
+0x8FB1D4 0x501B
+0x8FB1D5 0x501C
+0x8FB1D6 0x501D
+0x8FB1D7 0x501E
+0x8FB1D8 0x5022
+0x8FB1D9 0x5027
+0x8FB1DA 0x502E
+0x8FB1DB 0x5030
+0x8FB1DC 0x5032
+0x8FB1DD 0x5033
+0x8FB1DE 0x5035
+0x8FB1DF 0x5040
+0x8FB1E0 0x5041
+0x8FB1E1 0x5042
+0x8FB1E2 0x5045
+0x8FB1E3 0x5046
+0x8FB1E4 0x504A
+0x8FB1E5 0x504C
+0x8FB1E6 0x504E
+0x8FB1E7 0x5051
+0x8FB1E8 0x5052
+0x8FB1E9 0x5053
+0x8FB1EA 0x5057
+0x8FB1EB 0x5059
+0x8FB1EC 0x505F
+0x8FB1ED 0x5060
+0x8FB1EE 0x5062
+0x8FB1EF 0x5063
+0x8FB1F0 0x5066
+0x8FB1F1 0x5067
+0x8FB1F2 0x506A
+0x8FB1F3 0x506D
+0x8FB1F4 0x5070
+0x8FB1F5 0x5071
+0x8FB1F6 0x503B
+0x8FB1F7 0x5081
+0x8FB1F8 0x5083
+0x8FB1F9 0x5084
+0x8FB1FA 0x5086
+0x8FB1FB 0x508A
+0x8FB1FC 0x508E
+0x8FB1FD 0x508F
+0x8FB1FE 0x5090
+0x8FB2A1 0x5092
+0x8FB2A2 0x5093
+0x8FB2A3 0x5094
+0x8FB2A4 0x5096
+0x8FB2A5 0x509B
+0x8FB2A6 0x509C
+0x8FB2A7 0x509E
+0x8FB2A8 0x509F
+0x8FB2A9 0x50A0
+0x8FB2AA 0x50A1
+0x8FB2AB 0x50A2
+0x8FB2AC 0x50AA
+0x8FB2AD 0x50AF
+0x8FB2AE 0x50B0
+0x8FB2AF 0x50B9
+0x8FB2B0 0x50BA
+0x8FB2B1 0x50BD
+0x8FB2B2 0x50C0
+0x8FB2B3 0x50C3
+0x8FB2B4 0x50C4
+0x8FB2B5 0x50C7
+0x8FB2B6 0x50CC
+0x8FB2B7 0x50CE
+0x8FB2B8 0x50D0
+0x8FB2B9 0x50D3
+0x8FB2BA 0x50D4
+0x8FB2BB 0x50D8
+0x8FB2BC 0x50DC
+0x8FB2BD 0x50DD
+0x8FB2BE 0x50DF
+0x8FB2BF 0x50E2
+0x8FB2C0 0x50E4
+0x8FB2C1 0x50E6
+0x8FB2C2 0x50E8
+0x8FB2C3 0x50E9
+0x8FB2C4 0x50EF
+0x8FB2C5 0x50F1
+0x8FB2C6 0x50F6
+0x8FB2C7 0x50FA
+0x8FB2C8 0x50FE
+0x8FB2C9 0x5103
+0x8FB2CA 0x5106
+0x8FB2CB 0x5107
+0x8FB2CC 0x5108
+0x8FB2CD 0x510B
+0x8FB2CE 0x510C
+0x8FB2CF 0x510D
+0x8FB2D0 0x510E
+0x8FB2D1 0x50F2
+0x8FB2D2 0x5110
+0x8FB2D3 0x5117
+0x8FB2D4 0x5119
+0x8FB2D5 0x511B
+0x8FB2D6 0x511C
+0x8FB2D7 0x511D
+0x8FB2D8 0x511E
+0x8FB2D9 0x5123
+0x8FB2DA 0x5127
+0x8FB2DB 0x5128
+0x8FB2DC 0x512C
+0x8FB2DD 0x512D
+0x8FB2DE 0x512F
+0x8FB2DF 0x5131
+0x8FB2E0 0x5133
+0x8FB2E1 0x5134
+0x8FB2E2 0x5135
+0x8FB2E3 0x5138
+0x8FB2E4 0x5139
+0x8FB2E5 0x5142
+0x8FB2E6 0x514A
+0x8FB2E7 0x514F
+0x8FB2E8 0x5153
+0x8FB2E9 0x5155
+0x8FB2EA 0x5157
+0x8FB2EB 0x5158
+0x8FB2EC 0x515F
+0x8FB2ED 0x5164
+0x8FB2EE 0x5166
+0x8FB2EF 0x517E
+0x8FB2F0 0x5183
+0x8FB2F1 0x5184
+0x8FB2F2 0x518B
+0x8FB2F3 0x518E
+0x8FB2F4 0x5198
+0x8FB2F5 0x519D
+0x8FB2F6 0x51A1
+0x8FB2F7 0x51A3
+0x8FB2F8 0x51AD
+0x8FB2F9 0x51B8
+0x8FB2FA 0x51BA
+0x8FB2FB 0x51BC
+0x8FB2FC 0x51BE
+0x8FB2FD 0x51BF
+0x8FB2FE 0x51C2
+0x8FB3A1 0x51C8
+0x8FB3A2 0x51CF
+0x8FB3A3 0x51D1
+0x8FB3A4 0x51D2
+0x8FB3A5 0x51D3
+0x8FB3A6 0x51D5
+0x8FB3A7 0x51D8
+0x8FB3A8 0x51DE
+0x8FB3A9 0x51E2
+0x8FB3AA 0x51E5
+0x8FB3AB 0x51EE
+0x8FB3AC 0x51F2
+0x8FB3AD 0x51F3
+0x8FB3AE 0x51F4
+0x8FB3AF 0x51F7
+0x8FB3B0 0x5201
+0x8FB3B1 0x5202
+0x8FB3B2 0x5205
+0x8FB3B3 0x5212
+0x8FB3B4 0x5213
+0x8FB3B5 0x5215
+0x8FB3B6 0x5216
+0x8FB3B7 0x5218
+0x8FB3B8 0x5222
+0x8FB3B9 0x5228
+0x8FB3BA 0x5231
+0x8FB3BB 0x5232
+0x8FB3BC 0x5235
+0x8FB3BD 0x523C
+0x8FB3BE 0x5245
+0x8FB3BF 0x5249
+0x8FB3C0 0x5255
+0x8FB3C1 0x5257
+0x8FB3C2 0x5258
+0x8FB3C3 0x525A
+0x8FB3C4 0x525C
+0x8FB3C5 0x525F
+0x8FB3C6 0x5260
+0x8FB3C7 0x5261
+0x8FB3C8 0x5266
+0x8FB3C9 0x526E
+0x8FB3CA 0x5277
+0x8FB3CB 0x5278
+0x8FB3CC 0x5279
+0x8FB3CD 0x5280
+0x8FB3CE 0x5282
+0x8FB3CF 0x5285
+0x8FB3D0 0x528A
+0x8FB3D1 0x528C
+0x8FB3D2 0x5293
+0x8FB3D3 0x5295
+0x8FB3D4 0x5296
+0x8FB3D5 0x5297
+0x8FB3D6 0x5298
+0x8FB3D7 0x529A
+0x8FB3D8 0x529C
+0x8FB3D9 0x52A4
+0x8FB3DA 0x52A5
+0x8FB3DB 0x52A6
+0x8FB3DC 0x52A7
+0x8FB3DD 0x52AF
+0x8FB3DE 0x52B0
+0x8FB3DF 0x52B6
+0x8FB3E0 0x52B7
+0x8FB3E1 0x52B8
+0x8FB3E2 0x52BA
+0x8FB3E3 0x52BB
+0x8FB3E4 0x52BD
+0x8FB3E5 0x52C0
+0x8FB3E6 0x52C4
+0x8FB3E7 0x52C6
+0x8FB3E8 0x52C8
+0x8FB3E9 0x52CC
+0x8FB3EA 0x52CF
+0x8FB3EB 0x52D1
+0x8FB3EC 0x52D4
+0x8FB3ED 0x52D6
+0x8FB3EE 0x52DB
+0x8FB3EF 0x52DC
+0x8FB3F0 0x52E1
+0x8FB3F1 0x52E5
+0x8FB3F2 0x52E8
+0x8FB3F3 0x52E9
+0x8FB3F4 0x52EA
+0x8FB3F5 0x52EC
+0x8FB3F6 0x52F0
+0x8FB3F7 0x52F1
+0x8FB3F8 0x52F4
+0x8FB3F9 0x52F6
+0x8FB3FA 0x52F7
+0x8FB3FB 0x5300
+0x8FB3FC 0x5303
+0x8FB3FD 0x530A
+0x8FB3FE 0x530B
+0x8FB4A1 0x530C
+0x8FB4A2 0x5311
+0x8FB4A3 0x5313
+0x8FB4A4 0x5318
+0x8FB4A5 0x531B
+0x8FB4A6 0x531C
+0x8FB4A7 0x531E
+0x8FB4A8 0x531F
+0x8FB4A9 0x5325
+0x8FB4AA 0x5327
+0x8FB4AB 0x5328
+0x8FB4AC 0x5329
+0x8FB4AD 0x532B
+0x8FB4AE 0x532C
+0x8FB4AF 0x532D
+0x8FB4B0 0x5330
+0x8FB4B1 0x5332
+0x8FB4B2 0x5335
+0x8FB4B3 0x533C
+0x8FB4B4 0x533D
+0x8FB4B5 0x533E
+0x8FB4B6 0x5342
+0x8FB4B7 0x534C
+0x8FB4B8 0x534B
+0x8FB4B9 0x5359
+0x8FB4BA 0x535B
+0x8FB4BB 0x5361
+0x8FB4BC 0x5363
+0x8FB4BD 0x5365
+0x8FB4BE 0x536C
+0x8FB4BF 0x536D
+0x8FB4C0 0x5372
+0x8FB4C1 0x5379
+0x8FB4C2 0x537E
+0x8FB4C3 0x5383
+0x8FB4C4 0x5387
+0x8FB4C5 0x5388
+0x8FB4C6 0x538E
+0x8FB4C7 0x5393
+0x8FB4C8 0x5394
+0x8FB4C9 0x5399
+0x8FB4CA 0x539D
+0x8FB4CB 0x53A1
+0x8FB4CC 0x53A4
+0x8FB4CD 0x53AA
+0x8FB4CE 0x53AB
+0x8FB4CF 0x53AF
+0x8FB4D0 0x53B2
+0x8FB4D1 0x53B4
+0x8FB4D2 0x53B5
+0x8FB4D3 0x53B7
+0x8FB4D4 0x53B8
+0x8FB4D5 0x53BA
+0x8FB4D6 0x53BD
+0x8FB4D7 0x53C0
+0x8FB4D8 0x53C5
+0x8FB4D9 0x53CF
+0x8FB4DA 0x53D2
+0x8FB4DB 0x53D3
+0x8FB4DC 0x53D5
+0x8FB4DD 0x53DA
+0x8FB4DE 0x53DD
+0x8FB4DF 0x53DE
+0x8FB4E0 0x53E0
+0x8FB4E1 0x53E6
+0x8FB4E2 0x53E7
+0x8FB4E3 0x53F5
+0x8FB4E4 0x5402
+0x8FB4E5 0x5413
+0x8FB4E6 0x541A
+0x8FB4E7 0x5421
+0x8FB4E8 0x5427
+0x8FB4E9 0x5428
+0x8FB4EA 0x542A
+0x8FB4EB 0x542F
+0x8FB4EC 0x5431
+0x8FB4ED 0x5434
+0x8FB4EE 0x5435
+0x8FB4EF 0x5443
+0x8FB4F0 0x5444
+0x8FB4F1 0x5447
+0x8FB4F2 0x544D
+0x8FB4F3 0x544F
+0x8FB4F4 0x545E
+0x8FB4F5 0x5462
+0x8FB4F6 0x5464
+0x8FB4F7 0x5466
+0x8FB4F8 0x5467
+0x8FB4F9 0x5469
+0x8FB4FA 0x546B
+0x8FB4FB 0x546D
+0x8FB4FC 0x546E
+0x8FB4FD 0x5474
+0x8FB4FE 0x547F
+0x8FB5A1 0x5481
+0x8FB5A2 0x5483
+0x8FB5A3 0x5485
+0x8FB5A4 0x5488
+0x8FB5A5 0x5489
+0x8FB5A6 0x548D
+0x8FB5A7 0x5491
+0x8FB5A8 0x5495
+0x8FB5A9 0x5496
+0x8FB5AA 0x549C
+0x8FB5AB 0x549F
+0x8FB5AC 0x54A1
+0x8FB5AD 0x54A6
+0x8FB5AE 0x54A7
+0x8FB5AF 0x54A9
+0x8FB5B0 0x54AA
+0x8FB5B1 0x54AD
+0x8FB5B2 0x54AE
+0x8FB5B3 0x54B1
+0x8FB5B4 0x54B7
+0x8FB5B5 0x54B9
+0x8FB5B6 0x54BA
+0x8FB5B7 0x54BB
+0x8FB5B8 0x54BF
+0x8FB5B9 0x54C6
+0x8FB5BA 0x54CA
+0x8FB5BB 0x54CD
+0x8FB5BC 0x54CE
+0x8FB5BD 0x54E0
+0x8FB5BE 0x54EA
+0x8FB5BF 0x54EC
+0x8FB5C0 0x54EF
+0x8FB5C1 0x54F6
+0x8FB5C2 0x54FC
+0x8FB5C3 0x54FE
+0x8FB5C4 0x54FF
+0x8FB5C5 0x5500
+0x8FB5C6 0x5501
+0x8FB5C7 0x5505
+0x8FB5C8 0x5508
+0x8FB5C9 0x5509
+0x8FB5CA 0x550C
+0x8FB5CB 0x550D
+0x8FB5CC 0x550E
+0x8FB5CD 0x5515
+0x8FB5CE 0x552A
+0x8FB5CF 0x552B
+0x8FB5D0 0x5532
+0x8FB5D1 0x5535
+0x8FB5D2 0x5536
+0x8FB5D3 0x553B
+0x8FB5D4 0x553C
+0x8FB5D5 0x553D
+0x8FB5D6 0x5541
+0x8FB5D7 0x5547
+0x8FB5D8 0x5549
+0x8FB5D9 0x554A
+0x8FB5DA 0x554D
+0x8FB5DB 0x5550
+0x8FB5DC 0x5551
+0x8FB5DD 0x5558
+0x8FB5DE 0x555A
+0x8FB5DF 0x555B
+0x8FB5E0 0x555E
+0x8FB5E1 0x5560
+0x8FB5E2 0x5561
+0x8FB5E3 0x5564
+0x8FB5E4 0x5566
+0x8FB5E5 0x557F
+0x8FB5E6 0x5581
+0x8FB5E7 0x5582
+0x8FB5E8 0x5586
+0x8FB5E9 0x5588
+0x8FB5EA 0x558E
+0x8FB5EB 0x558F
+0x8FB5EC 0x5591
+0x8FB5ED 0x5592
+0x8FB5EE 0x5593
+0x8FB5EF 0x5594
+0x8FB5F0 0x5597
+0x8FB5F1 0x55A3
+0x8FB5F2 0x55A4
+0x8FB5F3 0x55AD
+0x8FB5F4 0x55B2
+0x8FB5F5 0x55BF
+0x8FB5F6 0x55C1
+0x8FB5F7 0x55C3
+0x8FB5F8 0x55C6
+0x8FB5F9 0x55C9
+0x8FB5FA 0x55CB
+0x8FB5FB 0x55CC
+0x8FB5FC 0x55CE
+0x8FB5FD 0x55D1
+0x8FB5FE 0x55D2
+0x8FB6A1 0x55D3
+0x8FB6A2 0x55D7
+0x8FB6A3 0x55D8
+0x8FB6A4 0x55DB
+0x8FB6A5 0x55DE
+0x8FB6A6 0x55E2
+0x8FB6A7 0x55E9
+0x8FB6A8 0x55F6
+0x8FB6A9 0x55FF
+0x8FB6AA 0x5605
+0x8FB6AB 0x5608
+0x8FB6AC 0x560A
+0x8FB6AD 0x560D
+0x8FB6AE 0x560E
+0x8FB6AF 0x560F
+0x8FB6B0 0x5610
+0x8FB6B1 0x5611
+0x8FB6B2 0x5612
+0x8FB6B3 0x5619
+0x8FB6B4 0x562C
+0x8FB6B5 0x5630
+0x8FB6B6 0x5633
+0x8FB6B7 0x5635
+0x8FB6B8 0x5637
+0x8FB6B9 0x5639
+0x8FB6BA 0x563B
+0x8FB6BB 0x563C
+0x8FB6BC 0x563D
+0x8FB6BD 0x563F
+0x8FB6BE 0x5640
+0x8FB6BF 0x5641
+0x8FB6C0 0x5643
+0x8FB6C1 0x5644
+0x8FB6C2 0x5646
+0x8FB6C3 0x5649
+0x8FB6C4 0x564B
+0x8FB6C5 0x564D
+0x8FB6C6 0x564F
+0x8FB6C7 0x5654
+0x8FB6C8 0x565E
+0x8FB6C9 0x5660
+0x8FB6CA 0x5661
+0x8FB6CB 0x5662
+0x8FB6CC 0x5663
+0x8FB6CD 0x5666
+0x8FB6CE 0x5669
+0x8FB6CF 0x566D
+0x8FB6D0 0x566F
+0x8FB6D1 0x5671
+0x8FB6D2 0x5672
+0x8FB6D3 0x5675
+0x8FB6D4 0x5684
+0x8FB6D5 0x5685
+0x8FB6D6 0x5688
+0x8FB6D7 0x568B
+0x8FB6D8 0x568C
+0x8FB6D9 0x5695
+0x8FB6DA 0x5699
+0x8FB6DB 0x569A
+0x8FB6DC 0x569D
+0x8FB6DD 0x569E
+0x8FB6DE 0x569F
+0x8FB6DF 0x56A6
+0x8FB6E0 0x56A7
+0x8FB6E1 0x56A8
+0x8FB6E2 0x56A9
+0x8FB6E3 0x56AB
+0x8FB6E4 0x56AC
+0x8FB6E5 0x56AD
+0x8FB6E6 0x56B1
+0x8FB6E7 0x56B3
+0x8FB6E8 0x56B7
+0x8FB6E9 0x56BE
+0x8FB6EA 0x56C5
+0x8FB6EB 0x56C9
+0x8FB6EC 0x56CA
+0x8FB6ED 0x56CB
+0x8FB6EE 0x56CF
+0x8FB6EF 0x56D0
+0x8FB6F0 0x56CC
+0x8FB6F1 0x56CD
+0x8FB6F2 0x56D9
+0x8FB6F3 0x56DC
+0x8FB6F4 0x56DD
+0x8FB6F5 0x56DF
+0x8FB6F6 0x56E1
+0x8FB6F7 0x56E4
+0x8FB6F8 0x56E5
+0x8FB6F9 0x56E6
+0x8FB6FA 0x56E7
+0x8FB6FB 0x56E8
+0x8FB6FC 0x56F1
+0x8FB6FD 0x56EB
+0x8FB6FE 0x56ED
+0x8FB7A1 0x56F6
+0x8FB7A2 0x56F7
+0x8FB7A3 0x5701
+0x8FB7A4 0x5702
+0x8FB7A5 0x5707
+0x8FB7A6 0x570A
+0x8FB7A7 0x570C
+0x8FB7A8 0x5711
+0x8FB7A9 0x5715
+0x8FB7AA 0x571A
+0x8FB7AB 0x571B
+0x8FB7AC 0x571D
+0x8FB7AD 0x5720
+0x8FB7AE 0x5722
+0x8FB7AF 0x5723
+0x8FB7B0 0x5724
+0x8FB7B1 0x5725
+0x8FB7B2 0x5729
+0x8FB7B3 0x572A
+0x8FB7B4 0x572C
+0x8FB7B5 0x572E
+0x8FB7B6 0x572F
+0x8FB7B7 0x5733
+0x8FB7B8 0x5734
+0x8FB7B9 0x573D
+0x8FB7BA 0x573E
+0x8FB7BB 0x573F
+0x8FB7BC 0x5745
+0x8FB7BD 0x5746
+0x8FB7BE 0x574C
+0x8FB7BF 0x574D
+0x8FB7C0 0x5752
+0x8FB7C1 0x5762
+0x8FB7C2 0x5765
+0x8FB7C3 0x5767
+0x8FB7C4 0x5768
+0x8FB7C5 0x576B
+0x8FB7C6 0x576D
+0x8FB7C7 0x576E
+0x8FB7C8 0x576F
+0x8FB7C9 0x5770
+0x8FB7CA 0x5771
+0x8FB7CB 0x5773
+0x8FB7CC 0x5774
+0x8FB7CD 0x5775
+0x8FB7CE 0x5777
+0x8FB7CF 0x5779
+0x8FB7D0 0x577A
+0x8FB7D1 0x577B
+0x8FB7D2 0x577C
+0x8FB7D3 0x577E
+0x8FB7D4 0x5781
+0x8FB7D5 0x5783
+0x8FB7D6 0x578C
+0x8FB7D7 0x5794
+0x8FB7D8 0x5797
+0x8FB7D9 0x5799
+0x8FB7DA 0x579A
+0x8FB7DB 0x579C
+0x8FB7DC 0x579D
+0x8FB7DD 0x579E
+0x8FB7DE 0x579F
+0x8FB7DF 0x57A1
+0x8FB7E0 0x5795
+0x8FB7E1 0x57A7
+0x8FB7E2 0x57A8
+0x8FB7E3 0x57A9
+0x8FB7E4 0x57AC
+0x8FB7E5 0x57B8
+0x8FB7E6 0x57BD
+0x8FB7E7 0x57C7
+0x8FB7E8 0x57C8
+0x8FB7E9 0x57CC
+0x8FB7EA 0x57CF
+0x8FB7EB 0x57D5
+0x8FB7EC 0x57DD
+0x8FB7ED 0x57DE
+0x8FB7EE 0x57E4
+0x8FB7EF 0x57E6
+0x8FB7F0 0x57E7
+0x8FB7F1 0x57E9
+0x8FB7F2 0x57ED
+0x8FB7F3 0x57F0
+0x8FB7F4 0x57F5
+0x8FB7F5 0x57F6
+0x8FB7F6 0x57F8
+0x8FB7F7 0x57FD
+0x8FB7F8 0x57FE
+0x8FB7F9 0x57FF
+0x8FB7FA 0x5803
+0x8FB7FB 0x5804
+0x8FB7FC 0x5808
+0x8FB7FD 0x5809
+0x8FB7FE 0x57E1
+0x8FB8A1 0x580C
+0x8FB8A2 0x580D
+0x8FB8A3 0x581B
+0x8FB8A4 0x581E
+0x8FB8A5 0x581F
+0x8FB8A6 0x5820
+0x8FB8A7 0x5826
+0x8FB8A8 0x5827
+0x8FB8A9 0x582D
+0x8FB8AA 0x5832
+0x8FB8AB 0x5839
+0x8FB8AC 0x583F
+0x8FB8AD 0x5849
+0x8FB8AE 0x584C
+0x8FB8AF 0x584D
+0x8FB8B0 0x584F
+0x8FB8B1 0x5850
+0x8FB8B2 0x5855
+0x8FB8B3 0x585F
+0x8FB8B4 0x5861
+0x8FB8B5 0x5864
+0x8FB8B6 0x5867
+0x8FB8B7 0x5868
+0x8FB8B8 0x5878
+0x8FB8B9 0x587C
+0x8FB8BA 0x587F
+0x8FB8BB 0x5880
+0x8FB8BC 0x5881
+0x8FB8BD 0x5887
+0x8FB8BE 0x5888
+0x8FB8BF 0x5889
+0x8FB8C0 0x588A
+0x8FB8C1 0x588C
+0x8FB8C2 0x588D
+0x8FB8C3 0x588F
+0x8FB8C4 0x5890
+0x8FB8C5 0x5894
+0x8FB8C6 0x5896
+0x8FB8C7 0x589D
+0x8FB8C8 0x58A0
+0x8FB8C9 0x58A1
+0x8FB8CA 0x58A2
+0x8FB8CB 0x58A6
+0x8FB8CC 0x58A9
+0x8FB8CD 0x58B1
+0x8FB8CE 0x58B2
+0x8FB8CF 0x58C4
+0x8FB8D0 0x58BC
+0x8FB8D1 0x58C2
+0x8FB8D2 0x58C8
+0x8FB8D3 0x58CD
+0x8FB8D4 0x58CE
+0x8FB8D5 0x58D0
+0x8FB8D6 0x58D2
+0x8FB8D7 0x58D4
+0x8FB8D8 0x58D6
+0x8FB8D9 0x58DA
+0x8FB8DA 0x58DD
+0x8FB8DB 0x58E1
+0x8FB8DC 0x58E2
+0x8FB8DD 0x58E9
+0x8FB8DE 0x58F3
+0x8FB8DF 0x5905
+0x8FB8E0 0x5906
+0x8FB8E1 0x590B
+0x8FB8E2 0x590C
+0x8FB8E3 0x5912
+0x8FB8E4 0x5913
+0x8FB8E5 0x5914
+0x8FB8E6 0x8641
+0x8FB8E7 0x591D
+0x8FB8E8 0x5921
+0x8FB8E9 0x5923
+0x8FB8EA 0x5924
+0x8FB8EB 0x5928
+0x8FB8EC 0x592F
+0x8FB8ED 0x5930
+0x8FB8EE 0x5933
+0x8FB8EF 0x5935
+0x8FB8F0 0x5936
+0x8FB8F1 0x593F
+0x8FB8F2 0x5943
+0x8FB8F3 0x5946
+0x8FB8F4 0x5952
+0x8FB8F5 0x5953
+0x8FB8F6 0x5959
+0x8FB8F7 0x595B
+0x8FB8F8 0x595D
+0x8FB8F9 0x595E
+0x8FB8FA 0x595F
+0x8FB8FB 0x5961
+0x8FB8FC 0x5963
+0x8FB8FD 0x596B
+0x8FB8FE 0x596D
+0x8FB9A1 0x596F
+0x8FB9A2 0x5972
+0x8FB9A3 0x5975
+0x8FB9A4 0x5976
+0x8FB9A5 0x5979
+0x8FB9A6 0x597B
+0x8FB9A7 0x597C
+0x8FB9A8 0x598B
+0x8FB9A9 0x598C
+0x8FB9AA 0x598E
+0x8FB9AB 0x5992
+0x8FB9AC 0x5995
+0x8FB9AD 0x5997
+0x8FB9AE 0x599F
+0x8FB9AF 0x59A4
+0x8FB9B0 0x59A7
+0x8FB9B1 0x59AD
+0x8FB9B2 0x59AE
+0x8FB9B3 0x59AF
+0x8FB9B4 0x59B0
+0x8FB9B5 0x59B3
+0x8FB9B6 0x59B7
+0x8FB9B7 0x59BA
+0x8FB9B8 0x59BC
+0x8FB9B9 0x59C1
+0x8FB9BA 0x59C3
+0x8FB9BB 0x59C4
+0x8FB9BC 0x59C8
+0x8FB9BD 0x59CA
+0x8FB9BE 0x59CD
+0x8FB9BF 0x59D2
+0x8FB9C0 0x59DD
+0x8FB9C1 0x59DE
+0x8FB9C2 0x59DF
+0x8FB9C3 0x59E3
+0x8FB9C4 0x59E4
+0x8FB9C5 0x59E7
+0x8FB9C6 0x59EE
+0x8FB9C7 0x59EF
+0x8FB9C8 0x59F1
+0x8FB9C9 0x59F2
+0x8FB9CA 0x59F4
+0x8FB9CB 0x59F7
+0x8FB9CC 0x5A00
+0x8FB9CD 0x5A04
+0x8FB9CE 0x5A0C
+0x8FB9CF 0x5A0D
+0x8FB9D0 0x5A0E
+0x8FB9D1 0x5A12
+0x8FB9D2 0x5A13
+0x8FB9D3 0x5A1E
+0x8FB9D4 0x5A23
+0x8FB9D5 0x5A24
+0x8FB9D6 0x5A27
+0x8FB9D7 0x5A28
+0x8FB9D8 0x5A2A
+0x8FB9D9 0x5A2D
+0x8FB9DA 0x5A30
+0x8FB9DB 0x5A44
+0x8FB9DC 0x5A45
+0x8FB9DD 0x5A47
+0x8FB9DE 0x5A48
+0x8FB9DF 0x5A4C
+0x8FB9E0 0x5A50
+0x8FB9E1 0x5A55
+0x8FB9E2 0x5A5E
+0x8FB9E3 0x5A63
+0x8FB9E4 0x5A65
+0x8FB9E5 0x5A67
+0x8FB9E6 0x5A6D
+0x8FB9E7 0x5A77
+0x8FB9E8 0x5A7A
+0x8FB9E9 0x5A7B
+0x8FB9EA 0x5A7E
+0x8FB9EB 0x5A8B
+0x8FB9EC 0x5A90
+0x8FB9ED 0x5A93
+0x8FB9EE 0x5A96
+0x8FB9EF 0x5A99
+0x8FB9F0 0x5A9C
+0x8FB9F1 0x5A9E
+0x8FB9F2 0x5A9F
+0x8FB9F3 0x5AA0
+0x8FB9F4 0x5AA2
+0x8FB9F5 0x5AA7
+0x8FB9F6 0x5AAC
+0x8FB9F7 0x5AB1
+0x8FB9F8 0x5AB2
+0x8FB9F9 0x5AB3
+0x8FB9FA 0x5AB5
+0x8FB9FB 0x5AB8
+0x8FB9FC 0x5ABA
+0x8FB9FD 0x5ABB
+0x8FB9FE 0x5ABF
+0x8FBAA1 0x5AC4
+0x8FBAA2 0x5AC6
+0x8FBAA3 0x5AC8
+0x8FBAA4 0x5ACF
+0x8FBAA5 0x5ADA
+0x8FBAA6 0x5ADC
+0x8FBAA7 0x5AE0
+0x8FBAA8 0x5AE5
+0x8FBAA9 0x5AEA
+0x8FBAAA 0x5AEE
+0x8FBAAB 0x5AF5
+0x8FBAAC 0x5AF6
+0x8FBAAD 0x5AFD
+0x8FBAAE 0x5B00
+0x8FBAAF 0x5B01
+0x8FBAB0 0x5B08
+0x8FBAB1 0x5B17
+0x8FBAB2 0x5B34
+0x8FBAB3 0x5B19
+0x8FBAB4 0x5B1B
+0x8FBAB5 0x5B1D
+0x8FBAB6 0x5B21
+0x8FBAB7 0x5B25
+0x8FBAB8 0x5B2D
+0x8FBAB9 0x5B38
+0x8FBABA 0x5B41
+0x8FBABB 0x5B4B
+0x8FBABC 0x5B4C
+0x8FBABD 0x5B52
+0x8FBABE 0x5B56
+0x8FBABF 0x5B5E
+0x8FBAC0 0x5B68
+0x8FBAC1 0x5B6E
+0x8FBAC2 0x5B6F
+0x8FBAC3 0x5B7C
+0x8FBAC4 0x5B7D
+0x8FBAC5 0x5B7E
+0x8FBAC6 0x5B7F
+0x8FBAC7 0x5B81
+0x8FBAC8 0x5B84
+0x8FBAC9 0x5B86
+0x8FBACA 0x5B8A
+0x8FBACB 0x5B8E
+0x8FBACC 0x5B90
+0x8FBACD 0x5B91
+0x8FBACE 0x5B93
+0x8FBACF 0x5B94
+0x8FBAD0 0x5B96
+0x8FBAD1 0x5BA8
+0x8FBAD2 0x5BA9
+0x8FBAD3 0x5BAC
+0x8FBAD4 0x5BAD
+0x8FBAD5 0x5BAF
+0x8FBAD6 0x5BB1
+0x8FBAD7 0x5BB2
+0x8FBAD8 0x5BB7
+0x8FBAD9 0x5BBA
+0x8FBADA 0x5BBC
+0x8FBADB 0x5BC0
+0x8FBADC 0x5BC1
+0x8FBADD 0x5BCD
+0x8FBADE 0x5BCF
+0x8FBADF 0x5BD6
+0x8FBAE0 0x5BD7
+0x8FBAE1 0x5BD8
+0x8FBAE2 0x5BD9
+0x8FBAE3 0x5BDA
+0x8FBAE4 0x5BE0
+0x8FBAE5 0x5BEF
+0x8FBAE6 0x5BF1
+0x8FBAE7 0x5BF4
+0x8FBAE8 0x5BFD
+0x8FBAE9 0x5C0C
+0x8FBAEA 0x5C17
+0x8FBAEB 0x5C1E
+0x8FBAEC 0x5C1F
+0x8FBAED 0x5C23
+0x8FBAEE 0x5C26
+0x8FBAEF 0x5C29
+0x8FBAF0 0x5C2B
+0x8FBAF1 0x5C2C
+0x8FBAF2 0x5C2E
+0x8FBAF3 0x5C30
+0x8FBAF4 0x5C32
+0x8FBAF5 0x5C35
+0x8FBAF6 0x5C36
+0x8FBAF7 0x5C59
+0x8FBAF8 0x5C5A
+0x8FBAF9 0x5C5C
+0x8FBAFA 0x5C62
+0x8FBAFB 0x5C63
+0x8FBAFC 0x5C67
+0x8FBAFD 0x5C68
+0x8FBAFE 0x5C69
+0x8FBBA1 0x5C6D
+0x8FBBA2 0x5C70
+0x8FBBA3 0x5C74
+0x8FBBA4 0x5C75
+0x8FBBA5 0x5C7A
+0x8FBBA6 0x5C7B
+0x8FBBA7 0x5C7C
+0x8FBBA8 0x5C7D
+0x8FBBA9 0x5C87
+0x8FBBAA 0x5C88
+0x8FBBAB 0x5C8A
+0x8FBBAC 0x5C8F
+0x8FBBAD 0x5C92
+0x8FBBAE 0x5C9D
+0x8FBBAF 0x5C9F
+0x8FBBB0 0x5CA0
+0x8FBBB1 0x5CA2
+0x8FBBB2 0x5CA3
+0x8FBBB3 0x5CA6
+0x8FBBB4 0x5CAA
+0x8FBBB5 0x5CB2
+0x8FBBB6 0x5CB4
+0x8FBBB7 0x5CB5
+0x8FBBB8 0x5CBA
+0x8FBBB9 0x5CC9
+0x8FBBBA 0x5CCB
+0x8FBBBB 0x5CD2
+0x8FBBBC 0x5CDD
+0x8FBBBD 0x5CD7
+0x8FBBBE 0x5CEE
+0x8FBBBF 0x5CF1
+0x8FBBC0 0x5CF2
+0x8FBBC1 0x5CF4
+0x8FBBC2 0x5D01
+0x8FBBC3 0x5D06
+0x8FBBC4 0x5D0D
+0x8FBBC5 0x5D12
+0x8FBBC6 0x5D2B
+0x8FBBC7 0x5D23
+0x8FBBC8 0x5D24
+0x8FBBC9 0x5D26
+0x8FBBCA 0x5D27
+0x8FBBCB 0x5D31
+0x8FBBCC 0x5D34
+0x8FBBCD 0x5D39
+0x8FBBCE 0x5D3D
+0x8FBBCF 0x5D3F
+0x8FBBD0 0x5D42
+0x8FBBD1 0x5D43
+0x8FBBD2 0x5D46
+0x8FBBD3 0x5D48
+0x8FBBD4 0x5D55
+0x8FBBD5 0x5D51
+0x8FBBD6 0x5D59
+0x8FBBD7 0x5D4A
+0x8FBBD8 0x5D5F
+0x8FBBD9 0x5D60
+0x8FBBDA 0x5D61
+0x8FBBDB 0x5D62
+0x8FBBDC 0x5D64
+0x8FBBDD 0x5D6A
+0x8FBBDE 0x5D6D
+0x8FBBDF 0x5D70
+0x8FBBE0 0x5D79
+0x8FBBE1 0x5D7A
+0x8FBBE2 0x5D7E
+0x8FBBE3 0x5D7F
+0x8FBBE4 0x5D81
+0x8FBBE5 0x5D83
+0x8FBBE6 0x5D88
+0x8FBBE7 0x5D8A
+0x8FBBE8 0x5D92
+0x8FBBE9 0x5D93
+0x8FBBEA 0x5D94
+0x8FBBEB 0x5D95
+0x8FBBEC 0x5D99
+0x8FBBED 0x5D9B
+0x8FBBEE 0x5D9F
+0x8FBBEF 0x5DA0
+0x8FBBF0 0x5DA7
+0x8FBBF1 0x5DAB
+0x8FBBF2 0x5DB0
+0x8FBBF3 0x5DB4
+0x8FBBF4 0x5DB8
+0x8FBBF5 0x5DB9
+0x8FBBF6 0x5DC3
+0x8FBBF7 0x5DC7
+0x8FBBF8 0x5DCB
+0x8FBBF9 0x5DD0
+0x8FBBFA 0x5DCE
+0x8FBBFB 0x5DD8
+0x8FBBFC 0x5DD9
+0x8FBBFD 0x5DE0
+0x8FBBFE 0x5DE4
+0x8FBCA1 0x5DE9
+0x8FBCA2 0x5DF8
+0x8FBCA3 0x5DF9
+0x8FBCA4 0x5E00
+0x8FBCA5 0x5E07
+0x8FBCA6 0x5E0D
+0x8FBCA7 0x5E12
+0x8FBCA8 0x5E14
+0x8FBCA9 0x5E15
+0x8FBCAA 0x5E18
+0x8FBCAB 0x5E1F
+0x8FBCAC 0x5E20
+0x8FBCAD 0x5E2E
+0x8FBCAE 0x5E28
+0x8FBCAF 0x5E32
+0x8FBCB0 0x5E35
+0x8FBCB1 0x5E3E
+0x8FBCB2 0x5E4B
+0x8FBCB3 0x5E50
+0x8FBCB4 0x5E49
+0x8FBCB5 0x5E51
+0x8FBCB6 0x5E56
+0x8FBCB7 0x5E58
+0x8FBCB8 0x5E5B
+0x8FBCB9 0x5E5C
+0x8FBCBA 0x5E5E
+0x8FBCBB 0x5E68
+0x8FBCBC 0x5E6A
+0x8FBCBD 0x5E6B
+0x8FBCBE 0x5E6C
+0x8FBCBF 0x5E6D
+0x8FBCC0 0x5E6E
+0x8FBCC1 0x5E70
+0x8FBCC2 0x5E80
+0x8FBCC3 0x5E8B
+0x8FBCC4 0x5E8E
+0x8FBCC5 0x5EA2
+0x8FBCC6 0x5EA4
+0x8FBCC7 0x5EA5
+0x8FBCC8 0x5EA8
+0x8FBCC9 0x5EAA
+0x8FBCCA 0x5EAC
+0x8FBCCB 0x5EB1
+0x8FBCCC 0x5EB3
+0x8FBCCD 0x5EBD
+0x8FBCCE 0x5EBE
+0x8FBCCF 0x5EBF
+0x8FBCD0 0x5EC6
+0x8FBCD1 0x5ECC
+0x8FBCD2 0x5ECB
+0x8FBCD3 0x5ECE
+0x8FBCD4 0x5ED1
+0x8FBCD5 0x5ED2
+0x8FBCD6 0x5ED4
+0x8FBCD7 0x5ED5
+0x8FBCD8 0x5EDC
+0x8FBCD9 0x5EDE
+0x8FBCDA 0x5EE5
+0x8FBCDB 0x5EEB
+0x8FBCDC 0x5F02
+0x8FBCDD 0x5F06
+0x8FBCDE 0x5F07
+0x8FBCDF 0x5F08
+0x8FBCE0 0x5F0E
+0x8FBCE1 0x5F19
+0x8FBCE2 0x5F1C
+0x8FBCE3 0x5F1D
+0x8FBCE4 0x5F21
+0x8FBCE5 0x5F22
+0x8FBCE6 0x5F23
+0x8FBCE7 0x5F24
+0x8FBCE8 0x5F28
+0x8FBCE9 0x5F2B
+0x8FBCEA 0x5F2C
+0x8FBCEB 0x5F2E
+0x8FBCEC 0x5F30
+0x8FBCED 0x5F34
+0x8FBCEE 0x5F36
+0x8FBCEF 0x5F3B
+0x8FBCF0 0x5F3D
+0x8FBCF1 0x5F3F
+0x8FBCF2 0x5F40
+0x8FBCF3 0x5F44
+0x8FBCF4 0x5F45
+0x8FBCF5 0x5F47
+0x8FBCF6 0x5F4D
+0x8FBCF7 0x5F50
+0x8FBCF8 0x5F54
+0x8FBCF9 0x5F58
+0x8FBCFA 0x5F5B
+0x8FBCFB 0x5F60
+0x8FBCFC 0x5F63
+0x8FBCFD 0x5F64
+0x8FBCFE 0x5F67
+0x8FBDA1 0x5F6F
+0x8FBDA2 0x5F72
+0x8FBDA3 0x5F74
+0x8FBDA4 0x5F75
+0x8FBDA5 0x5F78
+0x8FBDA6 0x5F7A
+0x8FBDA7 0x5F7D
+0x8FBDA8 0x5F7E
+0x8FBDA9 0x5F89
+0x8FBDAA 0x5F8D
+0x8FBDAB 0x5F8F
+0x8FBDAC 0x5F96
+0x8FBDAD 0x5F9C
+0x8FBDAE 0x5F9D
+0x8FBDAF 0x5FA2
+0x8FBDB0 0x5FA7
+0x8FBDB1 0x5FAB
+0x8FBDB2 0x5FA4
+0x8FBDB3 0x5FAC
+0x8FBDB4 0x5FAF
+0x8FBDB5 0x5FB0
+0x8FBDB6 0x5FB1
+0x8FBDB7 0x5FB8
+0x8FBDB8 0x5FC4
+0x8FBDB9 0x5FC7
+0x8FBDBA 0x5FC8
+0x8FBDBB 0x5FC9
+0x8FBDBC 0x5FCB
+0x8FBDBD 0x5FD0
+0x8FBDBE 0x5FD1
+0x8FBDBF 0x5FD2
+0x8FBDC0 0x5FD3
+0x8FBDC1 0x5FD4
+0x8FBDC2 0x5FDE
+0x8FBDC3 0x5FE1
+0x8FBDC4 0x5FE2
+0x8FBDC5 0x5FE8
+0x8FBDC6 0x5FE9
+0x8FBDC7 0x5FEA
+0x8FBDC8 0x5FEC
+0x8FBDC9 0x5FED
+0x8FBDCA 0x5FEE
+0x8FBDCB 0x5FEF
+0x8FBDCC 0x5FF2
+0x8FBDCD 0x5FF3
+0x8FBDCE 0x5FF6
+0x8FBDCF 0x5FFA
+0x8FBDD0 0x5FFC
+0x8FBDD1 0x6007
+0x8FBDD2 0x600A
+0x8FBDD3 0x600D
+0x8FBDD4 0x6013
+0x8FBDD5 0x6014
+0x8FBDD6 0x6017
+0x8FBDD7 0x6018
+0x8FBDD8 0x601A
+0x8FBDD9 0x601F
+0x8FBDDA 0x6024
+0x8FBDDB 0x602D
+0x8FBDDC 0x6033
+0x8FBDDD 0x6035
+0x8FBDDE 0x6040
+0x8FBDDF 0x6047
+0x8FBDE0 0x6048
+0x8FBDE1 0x6049
+0x8FBDE2 0x604C
+0x8FBDE3 0x6051
+0x8FBDE4 0x6054
+0x8FBDE5 0x6056
+0x8FBDE6 0x6057
+0x8FBDE7 0x605D
+0x8FBDE8 0x6061
+0x8FBDE9 0x6067
+0x8FBDEA 0x6071
+0x8FBDEB 0x607E
+0x8FBDEC 0x607F
+0x8FBDED 0x6082
+0x8FBDEE 0x6086
+0x8FBDEF 0x6088
+0x8FBDF0 0x608A
+0x8FBDF1 0x608E
+0x8FBDF2 0x6091
+0x8FBDF3 0x6093
+0x8FBDF4 0x6095
+0x8FBDF5 0x6098
+0x8FBDF6 0x609D
+0x8FBDF7 0x609E
+0x8FBDF8 0x60A2
+0x8FBDF9 0x60A4
+0x8FBDFA 0x60A5
+0x8FBDFB 0x60A8
+0x8FBDFC 0x60B0
+0x8FBDFD 0x60B1
+0x8FBDFE 0x60B7
+0x8FBEA1 0x60BB
+0x8FBEA2 0x60BE
+0x8FBEA3 0x60C2
+0x8FBEA4 0x60C4
+0x8FBEA5 0x60C8
+0x8FBEA6 0x60C9
+0x8FBEA7 0x60CA
+0x8FBEA8 0x60CB
+0x8FBEA9 0x60CE
+0x8FBEAA 0x60CF
+0x8FBEAB 0x60D4
+0x8FBEAC 0x60D5
+0x8FBEAD 0x60D9
+0x8FBEAE 0x60DB
+0x8FBEAF 0x60DD
+0x8FBEB0 0x60DE
+0x8FBEB1 0x60E2
+0x8FBEB2 0x60E5
+0x8FBEB3 0x60F2
+0x8FBEB4 0x60F5
+0x8FBEB5 0x60F8
+0x8FBEB6 0x60FC
+0x8FBEB7 0x60FD
+0x8FBEB8 0x6102
+0x8FBEB9 0x6107
+0x8FBEBA 0x610A
+0x8FBEBB 0x610C
+0x8FBEBC 0x6110
+0x8FBEBD 0x6111
+0x8FBEBE 0x6112
+0x8FBEBF 0x6113
+0x8FBEC0 0x6114
+0x8FBEC1 0x6116
+0x8FBEC2 0x6117
+0x8FBEC3 0x6119
+0x8FBEC4 0x611C
+0x8FBEC5 0x611E
+0x8FBEC6 0x6122
+0x8FBEC7 0x612A
+0x8FBEC8 0x612B
+0x8FBEC9 0x6130
+0x8FBECA 0x6131
+0x8FBECB 0x6135
+0x8FBECC 0x6136
+0x8FBECD 0x6137
+0x8FBECE 0x6139
+0x8FBECF 0x6141
+0x8FBED0 0x6145
+0x8FBED1 0x6146
+0x8FBED2 0x6149
+0x8FBED3 0x615E
+0x8FBED4 0x6160
+0x8FBED5 0x616C
+0x8FBED6 0x6172
+0x8FBED7 0x6178
+0x8FBED8 0x617B
+0x8FBED9 0x617C
+0x8FBEDA 0x617F
+0x8FBEDB 0x6180
+0x8FBEDC 0x6181
+0x8FBEDD 0x6183
+0x8FBEDE 0x6184
+0x8FBEDF 0x618B
+0x8FBEE0 0x618D
+0x8FBEE1 0x6192
+0x8FBEE2 0x6193
+0x8FBEE3 0x6197
+0x8FBEE4 0x6198
+0x8FBEE5 0x619C
+0x8FBEE6 0x619D
+0x8FBEE7 0x619F
+0x8FBEE8 0x61A0
+0x8FBEE9 0x61A5
+0x8FBEEA 0x61A8
+0x8FBEEB 0x61AA
+0x8FBEEC 0x61AD
+0x8FBEED 0x61B8
+0x8FBEEE 0x61B9
+0x8FBEEF 0x61BC
+0x8FBEF0 0x61C0
+0x8FBEF1 0x61C1
+0x8FBEF2 0x61C2
+0x8FBEF3 0x61CE
+0x8FBEF4 0x61CF
+0x8FBEF5 0x61D5
+0x8FBEF6 0x61DC
+0x8FBEF7 0x61DD
+0x8FBEF8 0x61DE
+0x8FBEF9 0x61DF
+0x8FBEFA 0x61E1
+0x8FBEFB 0x61E2
+0x8FBEFC 0x61E7
+0x8FBEFD 0x61E9
+0x8FBEFE 0x61E5
+0x8FBFA1 0x61EC
+0x8FBFA2 0x61ED
+0x8FBFA3 0x61EF
+0x8FBFA4 0x6201
+0x8FBFA5 0x6203
+0x8FBFA6 0x6204
+0x8FBFA7 0x6207
+0x8FBFA8 0x6213
+0x8FBFA9 0x6215
+0x8FBFAA 0x621C
+0x8FBFAB 0x6220
+0x8FBFAC 0x6222
+0x8FBFAD 0x6223
+0x8FBFAE 0x6227
+0x8FBFAF 0x6229
+0x8FBFB0 0x622B
+0x8FBFB1 0x6239
+0x8FBFB2 0x623D
+0x8FBFB3 0x6242
+0x8FBFB4 0x6243
+0x8FBFB5 0x6244
+0x8FBFB6 0x6246
+0x8FBFB7 0x624C
+0x8FBFB8 0x6250
+0x8FBFB9 0x6251
+0x8FBFBA 0x6252
+0x8FBFBB 0x6254
+0x8FBFBC 0x6256
+0x8FBFBD 0x625A
+0x8FBFBE 0x625C
+0x8FBFBF 0x6264
+0x8FBFC0 0x626D
+0x8FBFC1 0x626F
+0x8FBFC2 0x6273
+0x8FBFC3 0x627A
+0x8FBFC4 0x627D
+0x8FBFC5 0x628D
+0x8FBFC6 0x628E
+0x8FBFC7 0x628F
+0x8FBFC8 0x6290
+0x8FBFC9 0x62A6
+0x8FBFCA 0x62A8
+0x8FBFCB 0x62B3
+0x8FBFCC 0x62B6
+0x8FBFCD 0x62B7
+0x8FBFCE 0x62BA
+0x8FBFCF 0x62BE
+0x8FBFD0 0x62BF
+0x8FBFD1 0x62C4
+0x8FBFD2 0x62CE
+0x8FBFD3 0x62D5
+0x8FBFD4 0x62D6
+0x8FBFD5 0x62DA
+0x8FBFD6 0x62EA
+0x8FBFD7 0x62F2
+0x8FBFD8 0x62F4
+0x8FBFD9 0x62FC
+0x8FBFDA 0x62FD
+0x8FBFDB 0x6303
+0x8FBFDC 0x6304
+0x8FBFDD 0x630A
+0x8FBFDE 0x630B
+0x8FBFDF 0x630D
+0x8FBFE0 0x6310
+0x8FBFE1 0x6313
+0x8FBFE2 0x6316
+0x8FBFE3 0x6318
+0x8FBFE4 0x6329
+0x8FBFE5 0x632A
+0x8FBFE6 0x632D
+0x8FBFE7 0x6335
+0x8FBFE8 0x6336
+0x8FBFE9 0x6339
+0x8FBFEA 0x633C
+0x8FBFEB 0x6341
+0x8FBFEC 0x6342
+0x8FBFED 0x6343
+0x8FBFEE 0x6344
+0x8FBFEF 0x6346
+0x8FBFF0 0x634A
+0x8FBFF1 0x634B
+0x8FBFF2 0x634E
+0x8FBFF3 0x6352
+0x8FBFF4 0x6353
+0x8FBFF5 0x6354
+0x8FBFF6 0x6358
+0x8FBFF7 0x635B
+0x8FBFF8 0x6365
+0x8FBFF9 0x6366
+0x8FBFFA 0x636C
+0x8FBFFB 0x636D
+0x8FBFFC 0x6371
+0x8FBFFD 0x6374
+0x8FBFFE 0x6375
+0x8FC0A1 0x6378
+0x8FC0A2 0x637C
+0x8FC0A3 0x637D
+0x8FC0A4 0x637F
+0x8FC0A5 0x6382
+0x8FC0A6 0x6384
+0x8FC0A7 0x6387
+0x8FC0A8 0x638A
+0x8FC0A9 0x6390
+0x8FC0AA 0x6394
+0x8FC0AB 0x6395
+0x8FC0AC 0x6399
+0x8FC0AD 0x639A
+0x8FC0AE 0x639E
+0x8FC0AF 0x63A4
+0x8FC0B0 0x63A6
+0x8FC0B1 0x63AD
+0x8FC0B2 0x63AE
+0x8FC0B3 0x63AF
+0x8FC0B4 0x63BD
+0x8FC0B5 0x63C1
+0x8FC0B6 0x63C5
+0x8FC0B7 0x63C8
+0x8FC0B8 0x63CE
+0x8FC0B9 0x63D1
+0x8FC0BA 0x63D3
+0x8FC0BB 0x63D4
+0x8FC0BC 0x63D5
+0x8FC0BD 0x63DC
+0x8FC0BE 0x63E0
+0x8FC0BF 0x63E5
+0x8FC0C0 0x63EA
+0x8FC0C1 0x63EC
+0x8FC0C2 0x63F2
+0x8FC0C3 0x63F3
+0x8FC0C4 0x63F5
+0x8FC0C5 0x63F8
+0x8FC0C6 0x63F9
+0x8FC0C7 0x6409
+0x8FC0C8 0x640A
+0x8FC0C9 0x6410
+0x8FC0CA 0x6412
+0x8FC0CB 0x6414
+0x8FC0CC 0x6418
+0x8FC0CD 0x641E
+0x8FC0CE 0x6420
+0x8FC0CF 0x6422
+0x8FC0D0 0x6424
+0x8FC0D1 0x6425
+0x8FC0D2 0x6429
+0x8FC0D3 0x642A
+0x8FC0D4 0x642F
+0x8FC0D5 0x6430
+0x8FC0D6 0x6435
+0x8FC0D7 0x643D
+0x8FC0D8 0x643F
+0x8FC0D9 0x644B
+0x8FC0DA 0x644F
+0x8FC0DB 0x6451
+0x8FC0DC 0x6452
+0x8FC0DD 0x6453
+0x8FC0DE 0x6454
+0x8FC0DF 0x645A
+0x8FC0E0 0x645B
+0x8FC0E1 0x645C
+0x8FC0E2 0x645D
+0x8FC0E3 0x645F
+0x8FC0E4 0x6460
+0x8FC0E5 0x6461
+0x8FC0E6 0x6463
+0x8FC0E7 0x646D
+0x8FC0E8 0x6473
+0x8FC0E9 0x6474
+0x8FC0EA 0x647B
+0x8FC0EB 0x647D
+0x8FC0EC 0x6485
+0x8FC0ED 0x6487
+0x8FC0EE 0x648F
+0x8FC0EF 0x6490
+0x8FC0F0 0x6491
+0x8FC0F1 0x6498
+0x8FC0F2 0x6499
+0x8FC0F3 0x649B
+0x8FC0F4 0x649D
+0x8FC0F5 0x649F
+0x8FC0F6 0x64A1
+0x8FC0F7 0x64A3
+0x8FC0F8 0x64A6
+0x8FC0F9 0x64A8
+0x8FC0FA 0x64AC
+0x8FC0FB 0x64B3
+0x8FC0FC 0x64BD
+0x8FC0FD 0x64BE
+0x8FC0FE 0x64BF
+0x8FC1A1 0x64C4
+0x8FC1A2 0x64C9
+0x8FC1A3 0x64CA
+0x8FC1A4 0x64CB
+0x8FC1A5 0x64CC
+0x8FC1A6 0x64CE
+0x8FC1A7 0x64D0
+0x8FC1A8 0x64D1
+0x8FC1A9 0x64D5
+0x8FC1AA 0x64D7
+0x8FC1AB 0x64E4
+0x8FC1AC 0x64E5
+0x8FC1AD 0x64E9
+0x8FC1AE 0x64EA
+0x8FC1AF 0x64ED
+0x8FC1B0 0x64F0
+0x8FC1B1 0x64F5
+0x8FC1B2 0x64F7
+0x8FC1B3 0x64FB
+0x8FC1B4 0x64FF
+0x8FC1B5 0x6501
+0x8FC1B6 0x6504
+0x8FC1B7 0x6508
+0x8FC1B8 0x6509
+0x8FC1B9 0x650A
+0x8FC1BA 0x650F
+0x8FC1BB 0x6513
+0x8FC1BC 0x6514
+0x8FC1BD 0x6516
+0x8FC1BE 0x6519
+0x8FC1BF 0x651B
+0x8FC1C0 0x651E
+0x8FC1C1 0x651F
+0x8FC1C2 0x6522
+0x8FC1C3 0x6526
+0x8FC1C4 0x6529
+0x8FC1C5 0x652E
+0x8FC1C6 0x6531
+0x8FC1C7 0x653A
+0x8FC1C8 0x653C
+0x8FC1C9 0x653D
+0x8FC1CA 0x6543
+0x8FC1CB 0x6547
+0x8FC1CC 0x6549
+0x8FC1CD 0x6550
+0x8FC1CE 0x6552
+0x8FC1CF 0x6554
+0x8FC1D0 0x655F
+0x8FC1D1 0x6560
+0x8FC1D2 0x6567
+0x8FC1D3 0x656B
+0x8FC1D4 0x657A
+0x8FC1D5 0x657D
+0x8FC1D6 0x6581
+0x8FC1D7 0x6585
+0x8FC1D8 0x658A
+0x8FC1D9 0x6592
+0x8FC1DA 0x6595
+0x8FC1DB 0x6598
+0x8FC1DC 0x659D
+0x8FC1DD 0x65A0
+0x8FC1DE 0x65A3
+0x8FC1DF 0x65A6
+0x8FC1E0 0x65AE
+0x8FC1E1 0x65B2
+0x8FC1E2 0x65B3
+0x8FC1E3 0x65B4
+0x8FC1E4 0x65BF
+0x8FC1E5 0x65C2
+0x8FC1E6 0x65C8
+0x8FC1E7 0x65C9
+0x8FC1E8 0x65CE
+0x8FC1E9 0x65D0
+0x8FC1EA 0x65D4
+0x8FC1EB 0x65D6
+0x8FC1EC 0x65D8
+0x8FC1ED 0x65DF
+0x8FC1EE 0x65F0
+0x8FC1EF 0x65F2
+0x8FC1F0 0x65F4
+0x8FC1F1 0x65F5
+0x8FC1F2 0x65F9
+0x8FC1F3 0x65FE
+0x8FC1F4 0x65FF
+0x8FC1F5 0x6600
+0x8FC1F6 0x6604
+0x8FC1F7 0x6608
+0x8FC1F8 0x6609
+0x8FC1F9 0x660D
+0x8FC1FA 0x6611
+0x8FC1FB 0x6612
+0x8FC1FC 0x6615
+0x8FC1FD 0x6616
+0x8FC1FE 0x661D
+0x8FC2A1 0x661E
+0x8FC2A2 0x6621
+0x8FC2A3 0x6622
+0x8FC2A4 0x6623
+0x8FC2A5 0x6624
+0x8FC2A6 0x6626
+0x8FC2A7 0x6629
+0x8FC2A8 0x662A
+0x8FC2A9 0x662B
+0x8FC2AA 0x662C
+0x8FC2AB 0x662E
+0x8FC2AC 0x6630
+0x8FC2AD 0x6631
+0x8FC2AE 0x6633
+0x8FC2AF 0x6639
+0x8FC2B0 0x6637
+0x8FC2B1 0x6640
+0x8FC2B2 0x6645
+0x8FC2B3 0x6646
+0x8FC2B4 0x664A
+0x8FC2B5 0x664C
+0x8FC2B6 0x6651
+0x8FC2B7 0x664E
+0x8FC2B8 0x6657
+0x8FC2B9 0x6658
+0x8FC2BA 0x6659
+0x8FC2BB 0x665B
+0x8FC2BC 0x665C
+0x8FC2BD 0x6660
+0x8FC2BE 0x6661
+0x8FC2BF 0x66FB
+0x8FC2C0 0x666A
+0x8FC2C1 0x666B
+0x8FC2C2 0x666C
+0x8FC2C3 0x667E
+0x8FC2C4 0x6673
+0x8FC2C5 0x6675
+0x8FC2C6 0x667F
+0x8FC2C7 0x6677
+0x8FC2C8 0x6678
+0x8FC2C9 0x6679
+0x8FC2CA 0x667B
+0x8FC2CB 0x6680
+0x8FC2CC 0x667C
+0x8FC2CD 0x668B
+0x8FC2CE 0x668C
+0x8FC2CF 0x668D
+0x8FC2D0 0x6690
+0x8FC2D1 0x6692
+0x8FC2D2 0x6699
+0x8FC2D3 0x669A
+0x8FC2D4 0x669B
+0x8FC2D5 0x669C
+0x8FC2D6 0x669F
+0x8FC2D7 0x66A0
+0x8FC2D8 0x66A4
+0x8FC2D9 0x66AD
+0x8FC2DA 0x66B1
+0x8FC2DB 0x66B2
+0x8FC2DC 0x66B5
+0x8FC2DD 0x66BB
+0x8FC2DE 0x66BF
+0x8FC2DF 0x66C0
+0x8FC2E0 0x66C2
+0x8FC2E1 0x66C3
+0x8FC2E2 0x66C8
+0x8FC2E3 0x66CC
+0x8FC2E4 0x66CE
+0x8FC2E5 0x66CF
+0x8FC2E6 0x66D4
+0x8FC2E7 0x66DB
+0x8FC2E8 0x66DF
+0x8FC2E9 0x66E8
+0x8FC2EA 0x66EB
+0x8FC2EB 0x66EC
+0x8FC2EC 0x66EE
+0x8FC2ED 0x66FA
+0x8FC2EE 0x6705
+0x8FC2EF 0x6707
+0x8FC2F0 0x670E
+0x8FC2F1 0x6713
+0x8FC2F2 0x6719
+0x8FC2F3 0x671C
+0x8FC2F4 0x6720
+0x8FC2F5 0x6722
+0x8FC2F6 0x6733
+0x8FC2F7 0x673E
+0x8FC2F8 0x6745
+0x8FC2F9 0x6747
+0x8FC2FA 0x6748
+0x8FC2FB 0x674C
+0x8FC2FC 0x6754
+0x8FC2FD 0x6755
+0x8FC2FE 0x675D
+0x8FC3A1 0x6766
+0x8FC3A2 0x676C
+0x8FC3A3 0x676E
+0x8FC3A4 0x6774
+0x8FC3A5 0x6776
+0x8FC3A6 0x677B
+0x8FC3A7 0x6781
+0x8FC3A8 0x6784
+0x8FC3A9 0x678E
+0x8FC3AA 0x678F
+0x8FC3AB 0x6791
+0x8FC3AC 0x6793
+0x8FC3AD 0x6796
+0x8FC3AE 0x6798
+0x8FC3AF 0x6799
+0x8FC3B0 0x679B
+0x8FC3B1 0x67B0
+0x8FC3B2 0x67B1
+0x8FC3B3 0x67B2
+0x8FC3B4 0x67B5
+0x8FC3B5 0x67BB
+0x8FC3B6 0x67BC
+0x8FC3B7 0x67BD
+0x8FC3B8 0x67F9
+0x8FC3B9 0x67C0
+0x8FC3BA 0x67C2
+0x8FC3BB 0x67C3
+0x8FC3BC 0x67C5
+0x8FC3BD 0x67C8
+0x8FC3BE 0x67C9
+0x8FC3BF 0x67D2
+0x8FC3C0 0x67D7
+0x8FC3C1 0x67D9
+0x8FC3C2 0x67DC
+0x8FC3C3 0x67E1
+0x8FC3C4 0x67E6
+0x8FC3C5 0x67F0
+0x8FC3C6 0x67F2
+0x8FC3C7 0x67F6
+0x8FC3C8 0x67F7
+0x8FC3C9 0x6852
+0x8FC3CA 0x6814
+0x8FC3CB 0x6819
+0x8FC3CC 0x681D
+0x8FC3CD 0x681F
+0x8FC3CE 0x6828
+0x8FC3CF 0x6827
+0x8FC3D0 0x682C
+0x8FC3D1 0x682D
+0x8FC3D2 0x682F
+0x8FC3D3 0x6830
+0x8FC3D4 0x6831
+0x8FC3D5 0x6833
+0x8FC3D6 0x683B
+0x8FC3D7 0x683F
+0x8FC3D8 0x6844
+0x8FC3D9 0x6845
+0x8FC3DA 0x684A
+0x8FC3DB 0x684C
+0x8FC3DC 0x6855
+0x8FC3DD 0x6857
+0x8FC3DE 0x6858
+0x8FC3DF 0x685B
+0x8FC3E0 0x686B
+0x8FC3E1 0x686E
+0x8FC3E2 0x686F
+0x8FC3E3 0x6870
+0x8FC3E4 0x6871
+0x8FC3E5 0x6872
+0x8FC3E6 0x6875
+0x8FC3E7 0x6879
+0x8FC3E8 0x687A
+0x8FC3E9 0x687B
+0x8FC3EA 0x687C
+0x8FC3EB 0x6882
+0x8FC3EC 0x6884
+0x8FC3ED 0x6886
+0x8FC3EE 0x6888
+0x8FC3EF 0x6896
+0x8FC3F0 0x6898
+0x8FC3F1 0x689A
+0x8FC3F2 0x689C
+0x8FC3F3 0x68A1
+0x8FC3F4 0x68A3
+0x8FC3F5 0x68A5
+0x8FC3F6 0x68A9
+0x8FC3F7 0x68AA
+0x8FC3F8 0x68AE
+0x8FC3F9 0x68B2
+0x8FC3FA 0x68BB
+0x8FC3FB 0x68C5
+0x8FC3FC 0x68C8
+0x8FC3FD 0x68CC
+0x8FC3FE 0x68CF
+0x8FC4A1 0x68D0
+0x8FC4A2 0x68D1
+0x8FC4A3 0x68D3
+0x8FC4A4 0x68D6
+0x8FC4A5 0x68D9
+0x8FC4A6 0x68DC
+0x8FC4A7 0x68DD
+0x8FC4A8 0x68E5
+0x8FC4A9 0x68E8
+0x8FC4AA 0x68EA
+0x8FC4AB 0x68EB
+0x8FC4AC 0x68EC
+0x8FC4AD 0x68ED
+0x8FC4AE 0x68F0
+0x8FC4AF 0x68F1
+0x8FC4B0 0x68F5
+0x8FC4B1 0x68F6
+0x8FC4B2 0x68FB
+0x8FC4B3 0x68FC
+0x8FC4B4 0x68FD
+0x8FC4B5 0x6906
+0x8FC4B6 0x6909
+0x8FC4B7 0x690A
+0x8FC4B8 0x6910
+0x8FC4B9 0x6911
+0x8FC4BA 0x6913
+0x8FC4BB 0x6916
+0x8FC4BC 0x6917
+0x8FC4BD 0x6931
+0x8FC4BE 0x6933
+0x8FC4BF 0x6935
+0x8FC4C0 0x6938
+0x8FC4C1 0x693B
+0x8FC4C2 0x6942
+0x8FC4C3 0x6945
+0x8FC4C4 0x6949
+0x8FC4C5 0x694E
+0x8FC4C6 0x6957
+0x8FC4C7 0x695B
+0x8FC4C8 0x6963
+0x8FC4C9 0x6964
+0x8FC4CA 0x6965
+0x8FC4CB 0x6966
+0x8FC4CC 0x6968
+0x8FC4CD 0x6969
+0x8FC4CE 0x696C
+0x8FC4CF 0x6970
+0x8FC4D0 0x6971
+0x8FC4D1 0x6972
+0x8FC4D2 0x697A
+0x8FC4D3 0x697B
+0x8FC4D4 0x697F
+0x8FC4D5 0x6980
+0x8FC4D6 0x698D
+0x8FC4D7 0x6992
+0x8FC4D8 0x6996
+0x8FC4D9 0x6998
+0x8FC4DA 0x69A1
+0x8FC4DB 0x69A5
+0x8FC4DC 0x69A6
+0x8FC4DD 0x69A8
+0x8FC4DE 0x69AB
+0x8FC4DF 0x69AD
+0x8FC4E0 0x69AF
+0x8FC4E1 0x69B7
+0x8FC4E2 0x69B8
+0x8FC4E3 0x69BA
+0x8FC4E4 0x69BC
+0x8FC4E5 0x69C5
+0x8FC4E6 0x69C8
+0x8FC4E7 0x69D1
+0x8FC4E8 0x69D6
+0x8FC4E9 0x69D7
+0x8FC4EA 0x69E2
+0x8FC4EB 0x69E5
+0x8FC4EC 0x69EE
+0x8FC4ED 0x69EF
+0x8FC4EE 0x69F1
+0x8FC4EF 0x69F3
+0x8FC4F0 0x69F5
+0x8FC4F1 0x69FE
+0x8FC4F2 0x6A00
+0x8FC4F3 0x6A01
+0x8FC4F4 0x6A03
+0x8FC4F5 0x6A0F
+0x8FC4F6 0x6A11
+0x8FC4F7 0x6A15
+0x8FC4F8 0x6A1A
+0x8FC4F9 0x6A1D
+0x8FC4FA 0x6A20
+0x8FC4FB 0x6A24
+0x8FC4FC 0x6A28
+0x8FC4FD 0x6A30
+0x8FC4FE 0x6A32
+0x8FC5A1 0x6A34
+0x8FC5A2 0x6A37
+0x8FC5A3 0x6A3B
+0x8FC5A4 0x6A3E
+0x8FC5A5 0x6A3F
+0x8FC5A6 0x6A45
+0x8FC5A7 0x6A46
+0x8FC5A8 0x6A49
+0x8FC5A9 0x6A4A
+0x8FC5AA 0x6A4E
+0x8FC5AB 0x6A50
+0x8FC5AC 0x6A51
+0x8FC5AD 0x6A52
+0x8FC5AE 0x6A55
+0x8FC5AF 0x6A56
+0x8FC5B0 0x6A5B
+0x8FC5B1 0x6A64
+0x8FC5B2 0x6A67
+0x8FC5B3 0x6A6A
+0x8FC5B4 0x6A71
+0x8FC5B5 0x6A73
+0x8FC5B6 0x6A7E
+0x8FC5B7 0x6A81
+0x8FC5B8 0x6A83
+0x8FC5B9 0x6A86
+0x8FC5BA 0x6A87
+0x8FC5BB 0x6A89
+0x8FC5BC 0x6A8B
+0x8FC5BD 0x6A91
+0x8FC5BE 0x6A9B
+0x8FC5BF 0x6A9D
+0x8FC5C0 0x6A9E
+0x8FC5C1 0x6A9F
+0x8FC5C2 0x6AA5
+0x8FC5C3 0x6AAB
+0x8FC5C4 0x6AAF
+0x8FC5C5 0x6AB0
+0x8FC5C6 0x6AB1
+0x8FC5C7 0x6AB4
+0x8FC5C8 0x6ABD
+0x8FC5C9 0x6ABE
+0x8FC5CA 0x6ABF
+0x8FC5CB 0x6AC6
+0x8FC5CC 0x6AC9
+0x8FC5CD 0x6AC8
+0x8FC5CE 0x6ACC
+0x8FC5CF 0x6AD0
+0x8FC5D0 0x6AD4
+0x8FC5D1 0x6AD5
+0x8FC5D2 0x6AD6
+0x8FC5D3 0x6ADC
+0x8FC5D4 0x6ADD
+0x8FC5D5 0x6AE4
+0x8FC5D6 0x6AE7
+0x8FC5D7 0x6AEC
+0x8FC5D8 0x6AF0
+0x8FC5D9 0x6AF1
+0x8FC5DA 0x6AF2
+0x8FC5DB 0x6AFC
+0x8FC5DC 0x6AFD
+0x8FC5DD 0x6B02
+0x8FC5DE 0x6B03
+0x8FC5DF 0x6B06
+0x8FC5E0 0x6B07
+0x8FC5E1 0x6B09
+0x8FC5E2 0x6B0F
+0x8FC5E3 0x6B10
+0x8FC5E4 0x6B11
+0x8FC5E5 0x6B17
+0x8FC5E6 0x6B1B
+0x8FC5E7 0x6B1E
+0x8FC5E8 0x6B24
+0x8FC5E9 0x6B28
+0x8FC5EA 0x6B2B
+0x8FC5EB 0x6B2C
+0x8FC5EC 0x6B2F
+0x8FC5ED 0x6B35
+0x8FC5EE 0x6B36
+0x8FC5EF 0x6B3B
+0x8FC5F0 0x6B3F
+0x8FC5F1 0x6B46
+0x8FC5F2 0x6B4A
+0x8FC5F3 0x6B4D
+0x8FC5F4 0x6B52
+0x8FC5F5 0x6B56
+0x8FC5F6 0x6B58
+0x8FC5F7 0x6B5D
+0x8FC5F8 0x6B60
+0x8FC5F9 0x6B67
+0x8FC5FA 0x6B6B
+0x8FC5FB 0x6B6E
+0x8FC5FC 0x6B70
+0x8FC5FD 0x6B75
+0x8FC5FE 0x6B7D
+0x8FC6A1 0x6B7E
+0x8FC6A2 0x6B82
+0x8FC6A3 0x6B85
+0x8FC6A4 0x6B97
+0x8FC6A5 0x6B9B
+0x8FC6A6 0x6B9F
+0x8FC6A7 0x6BA0
+0x8FC6A8 0x6BA2
+0x8FC6A9 0x6BA3
+0x8FC6AA 0x6BA8
+0x8FC6AB 0x6BA9
+0x8FC6AC 0x6BAC
+0x8FC6AD 0x6BAD
+0x8FC6AE 0x6BAE
+0x8FC6AF 0x6BB0
+0x8FC6B0 0x6BB8
+0x8FC6B1 0x6BB9
+0x8FC6B2 0x6BBD
+0x8FC6B3 0x6BBE
+0x8FC6B4 0x6BC3
+0x8FC6B5 0x6BC4
+0x8FC6B6 0x6BC9
+0x8FC6B7 0x6BCC
+0x8FC6B8 0x6BD6
+0x8FC6B9 0x6BDA
+0x8FC6BA 0x6BE1
+0x8FC6BB 0x6BE3
+0x8FC6BC 0x6BE6
+0x8FC6BD 0x6BE7
+0x8FC6BE 0x6BEE
+0x8FC6BF 0x6BF1
+0x8FC6C0 0x6BF7
+0x8FC6C1 0x6BF9
+0x8FC6C2 0x6BFF
+0x8FC6C3 0x6C02
+0x8FC6C4 0x6C04
+0x8FC6C5 0x6C05
+0x8FC6C6 0x6C09
+0x8FC6C7 0x6C0D
+0x8FC6C8 0x6C0E
+0x8FC6C9 0x6C10
+0x8FC6CA 0x6C12
+0x8FC6CB 0x6C19
+0x8FC6CC 0x6C1F
+0x8FC6CD 0x6C26
+0x8FC6CE 0x6C27
+0x8FC6CF 0x6C28
+0x8FC6D0 0x6C2C
+0x8FC6D1 0x6C2E
+0x8FC6D2 0x6C33
+0x8FC6D3 0x6C35
+0x8FC6D4 0x6C36
+0x8FC6D5 0x6C3A
+0x8FC6D6 0x6C3B
+0x8FC6D7 0x6C3F
+0x8FC6D8 0x6C4A
+0x8FC6D9 0x6C4B
+0x8FC6DA 0x6C4D
+0x8FC6DB 0x6C4F
+0x8FC6DC 0x6C52
+0x8FC6DD 0x6C54
+0x8FC6DE 0x6C59
+0x8FC6DF 0x6C5B
+0x8FC6E0 0x6C5C
+0x8FC6E1 0x6C6B
+0x8FC6E2 0x6C6D
+0x8FC6E3 0x6C6F
+0x8FC6E4 0x6C74
+0x8FC6E5 0x6C76
+0x8FC6E6 0x6C78
+0x8FC6E7 0x6C79
+0x8FC6E8 0x6C7B
+0x8FC6E9 0x6C85
+0x8FC6EA 0x6C86
+0x8FC6EB 0x6C87
+0x8FC6EC 0x6C89
+0x8FC6ED 0x6C94
+0x8FC6EE 0x6C95
+0x8FC6EF 0x6C97
+0x8FC6F0 0x6C98
+0x8FC6F1 0x6C9C
+0x8FC6F2 0x6C9F
+0x8FC6F3 0x6CB0
+0x8FC6F4 0x6CB2
+0x8FC6F5 0x6CB4
+0x8FC6F6 0x6CC2
+0x8FC6F7 0x6CC6
+0x8FC6F8 0x6CCD
+0x8FC6F9 0x6CCF
+0x8FC6FA 0x6CD0
+0x8FC6FB 0x6CD1
+0x8FC6FC 0x6CD2
+0x8FC6FD 0x6CD4
+0x8FC6FE 0x6CD6
+0x8FC7A1 0x6CDA
+0x8FC7A2 0x6CDC
+0x8FC7A3 0x6CE0
+0x8FC7A4 0x6CE7
+0x8FC7A5 0x6CE9
+0x8FC7A6 0x6CEB
+0x8FC7A7 0x6CEC
+0x8FC7A8 0x6CEE
+0x8FC7A9 0x6CF2
+0x8FC7AA 0x6CF4
+0x8FC7AB 0x6D04
+0x8FC7AC 0x6D07
+0x8FC7AD 0x6D0A
+0x8FC7AE 0x6D0E
+0x8FC7AF 0x6D0F
+0x8FC7B0 0x6D11
+0x8FC7B1 0x6D13
+0x8FC7B2 0x6D1A
+0x8FC7B3 0x6D26
+0x8FC7B4 0x6D27
+0x8FC7B5 0x6D28
+0x8FC7B6 0x6C67
+0x8FC7B7 0x6D2E
+0x8FC7B8 0x6D2F
+0x8FC7B9 0x6D31
+0x8FC7BA 0x6D39
+0x8FC7BB 0x6D3C
+0x8FC7BC 0x6D3F
+0x8FC7BD 0x6D57
+0x8FC7BE 0x6D5E
+0x8FC7BF 0x6D5F
+0x8FC7C0 0x6D61
+0x8FC7C1 0x6D65
+0x8FC7C2 0x6D67
+0x8FC7C3 0x6D6F
+0x8FC7C4 0x6D70
+0x8FC7C5 0x6D7C
+0x8FC7C6 0x6D82
+0x8FC7C7 0x6D87
+0x8FC7C8 0x6D91
+0x8FC7C9 0x6D92
+0x8FC7CA 0x6D94
+0x8FC7CB 0x6D96
+0x8FC7CC 0x6D97
+0x8FC7CD 0x6D98
+0x8FC7CE 0x6DAA
+0x8FC7CF 0x6DAC
+0x8FC7D0 0x6DB4
+0x8FC7D1 0x6DB7
+0x8FC7D2 0x6DB9
+0x8FC7D3 0x6DBD
+0x8FC7D4 0x6DBF
+0x8FC7D5 0x6DC4
+0x8FC7D6 0x6DC8
+0x8FC7D7 0x6DCA
+0x8FC7D8 0x6DCE
+0x8FC7D9 0x6DCF
+0x8FC7DA 0x6DD6
+0x8FC7DB 0x6DDB
+0x8FC7DC 0x6DDD
+0x8FC7DD 0x6DDF
+0x8FC7DE 0x6DE0
+0x8FC7DF 0x6DE2
+0x8FC7E0 0x6DE5
+0x8FC7E1 0x6DE9
+0x8FC7E2 0x6DEF
+0x8FC7E3 0x6DF0
+0x8FC7E4 0x6DF4
+0x8FC7E5 0x6DF6
+0x8FC7E6 0x6DFC
+0x8FC7E7 0x6E00
+0x8FC7E8 0x6E04
+0x8FC7E9 0x6E1E
+0x8FC7EA 0x6E22
+0x8FC7EB 0x6E27
+0x8FC7EC 0x6E32
+0x8FC7ED 0x6E36
+0x8FC7EE 0x6E39
+0x8FC7EF 0x6E3B
+0x8FC7F0 0x6E3C
+0x8FC7F1 0x6E44
+0x8FC7F2 0x6E45
+0x8FC7F3 0x6E48
+0x8FC7F4 0x6E49
+0x8FC7F5 0x6E4B
+0x8FC7F6 0x6E4F
+0x8FC7F7 0x6E51
+0x8FC7F8 0x6E52
+0x8FC7F9 0x6E53
+0x8FC7FA 0x6E54
+0x8FC7FB 0x6E57
+0x8FC7FC 0x6E5C
+0x8FC7FD 0x6E5D
+0x8FC7FE 0x6E5E
+0x8FC8A1 0x6E62
+0x8FC8A2 0x6E63
+0x8FC8A3 0x6E68
+0x8FC8A4 0x6E73
+0x8FC8A5 0x6E7B
+0x8FC8A6 0x6E7D
+0x8FC8A7 0x6E8D
+0x8FC8A8 0x6E93
+0x8FC8A9 0x6E99
+0x8FC8AA 0x6EA0
+0x8FC8AB 0x6EA7
+0x8FC8AC 0x6EAD
+0x8FC8AD 0x6EAE
+0x8FC8AE 0x6EB1
+0x8FC8AF 0x6EB3
+0x8FC8B0 0x6EBB
+0x8FC8B1 0x6EBF
+0x8FC8B2 0x6EC0
+0x8FC8B3 0x6EC1
+0x8FC8B4 0x6EC3
+0x8FC8B5 0x6EC7
+0x8FC8B6 0x6EC8
+0x8FC8B7 0x6ECA
+0x8FC8B8 0x6ECD
+0x8FC8B9 0x6ECE
+0x8FC8BA 0x6ECF
+0x8FC8BB 0x6EEB
+0x8FC8BC 0x6EED
+0x8FC8BD 0x6EEE
+0x8FC8BE 0x6EF9
+0x8FC8BF 0x6EFB
+0x8FC8C0 0x6EFD
+0x8FC8C1 0x6F04
+0x8FC8C2 0x6F08
+0x8FC8C3 0x6F0A
+0x8FC8C4 0x6F0C
+0x8FC8C5 0x6F0D
+0x8FC8C6 0x6F16
+0x8FC8C7 0x6F18
+0x8FC8C8 0x6F1A
+0x8FC8C9 0x6F1B
+0x8FC8CA 0x6F26
+0x8FC8CB 0x6F29
+0x8FC8CC 0x6F2A
+0x8FC8CD 0x6F2F
+0x8FC8CE 0x6F30
+0x8FC8CF 0x6F33
+0x8FC8D0 0x6F36
+0x8FC8D1 0x6F3B
+0x8FC8D2 0x6F3C
+0x8FC8D3 0x6F2D
+0x8FC8D4 0x6F4F
+0x8FC8D5 0x6F51
+0x8FC8D6 0x6F52
+0x8FC8D7 0x6F53
+0x8FC8D8 0x6F57
+0x8FC8D9 0x6F59
+0x8FC8DA 0x6F5A
+0x8FC8DB 0x6F5D
+0x8FC8DC 0x6F5E
+0x8FC8DD 0x6F61
+0x8FC8DE 0x6F62
+0x8FC8DF 0x6F68
+0x8FC8E0 0x6F6C
+0x8FC8E1 0x6F7D
+0x8FC8E2 0x6F7E
+0x8FC8E3 0x6F83
+0x8FC8E4 0x6F87
+0x8FC8E5 0x6F88
+0x8FC8E6 0x6F8B
+0x8FC8E7 0x6F8C
+0x8FC8E8 0x6F8D
+0x8FC8E9 0x6F90
+0x8FC8EA 0x6F92
+0x8FC8EB 0x6F93
+0x8FC8EC 0x6F94
+0x8FC8ED 0x6F96
+0x8FC8EE 0x6F9A
+0x8FC8EF 0x6F9F
+0x8FC8F0 0x6FA0
+0x8FC8F1 0x6FA5
+0x8FC8F2 0x6FA6
+0x8FC8F3 0x6FA7
+0x8FC8F4 0x6FA8
+0x8FC8F5 0x6FAE
+0x8FC8F6 0x6FAF
+0x8FC8F7 0x6FB0
+0x8FC8F8 0x6FB5
+0x8FC8F9 0x6FB6
+0x8FC8FA 0x6FBC
+0x8FC8FB 0x6FC5
+0x8FC8FC 0x6FC7
+0x8FC8FD 0x6FC8
+0x8FC8FE 0x6FCA
+0x8FC9A1 0x6FDA
+0x8FC9A2 0x6FDE
+0x8FC9A3 0x6FE8
+0x8FC9A4 0x6FE9
+0x8FC9A5 0x6FF0
+0x8FC9A6 0x6FF5
+0x8FC9A7 0x6FF9
+0x8FC9A8 0x6FFC
+0x8FC9A9 0x6FFD
+0x8FC9AA 0x7000
+0x8FC9AB 0x7005
+0x8FC9AC 0x7006
+0x8FC9AD 0x7007
+0x8FC9AE 0x700D
+0x8FC9AF 0x7017
+0x8FC9B0 0x7020
+0x8FC9B1 0x7023
+0x8FC9B2 0x702F
+0x8FC9B3 0x7034
+0x8FC9B4 0x7037
+0x8FC9B5 0x7039
+0x8FC9B6 0x703C
+0x8FC9B7 0x7043
+0x8FC9B8 0x7044
+0x8FC9B9 0x7048
+0x8FC9BA 0x7049
+0x8FC9BB 0x704A
+0x8FC9BC 0x704B
+0x8FC9BD 0x7054
+0x8FC9BE 0x7055
+0x8FC9BF 0x705D
+0x8FC9C0 0x705E
+0x8FC9C1 0x704E
+0x8FC9C2 0x7064
+0x8FC9C3 0x7065
+0x8FC9C4 0x706C
+0x8FC9C5 0x706E
+0x8FC9C6 0x7075
+0x8FC9C7 0x7076
+0x8FC9C8 0x707E
+0x8FC9C9 0x7081
+0x8FC9CA 0x7085
+0x8FC9CB 0x7086
+0x8FC9CC 0x7094
+0x8FC9CD 0x7095
+0x8FC9CE 0x7096
+0x8FC9CF 0x7097
+0x8FC9D0 0x7098
+0x8FC9D1 0x709B
+0x8FC9D2 0x70A4
+0x8FC9D3 0x70AB
+0x8FC9D4 0x70B0
+0x8FC9D5 0x70B1
+0x8FC9D6 0x70B4
+0x8FC9D7 0x70B7
+0x8FC9D8 0x70CA
+0x8FC9D9 0x70D1
+0x8FC9DA 0x70D3
+0x8FC9DB 0x70D4
+0x8FC9DC 0x70D5
+0x8FC9DD 0x70D6
+0x8FC9DE 0x70D8
+0x8FC9DF 0x70DC
+0x8FC9E0 0x70E4
+0x8FC9E1 0x70FA
+0x8FC9E2 0x7103
+0x8FC9E3 0x7104
+0x8FC9E4 0x7105
+0x8FC9E5 0x7106
+0x8FC9E6 0x7107
+0x8FC9E7 0x710B
+0x8FC9E8 0x710C
+0x8FC9E9 0x710F
+0x8FC9EA 0x711E
+0x8FC9EB 0x7120
+0x8FC9EC 0x712B
+0x8FC9ED 0x712D
+0x8FC9EE 0x712F
+0x8FC9EF 0x7130
+0x8FC9F0 0x7131
+0x8FC9F1 0x7138
+0x8FC9F2 0x7141
+0x8FC9F3 0x7145
+0x8FC9F4 0x7146
+0x8FC9F5 0x7147
+0x8FC9F6 0x714A
+0x8FC9F7 0x714B
+0x8FC9F8 0x7150
+0x8FC9F9 0x7152
+0x8FC9FA 0x7157
+0x8FC9FB 0x715A
+0x8FC9FC 0x715C
+0x8FC9FD 0x715E
+0x8FC9FE 0x7160
+0x8FCAA1 0x7168
+0x8FCAA2 0x7179
+0x8FCAA3 0x7180
+0x8FCAA4 0x7185
+0x8FCAA5 0x7187
+0x8FCAA6 0x718C
+0x8FCAA7 0x7192
+0x8FCAA8 0x719A
+0x8FCAA9 0x719B
+0x8FCAAA 0x71A0
+0x8FCAAB 0x71A2
+0x8FCAAC 0x71AF
+0x8FCAAD 0x71B0
+0x8FCAAE 0x71B2
+0x8FCAAF 0x71B3
+0x8FCAB0 0x71BA
+0x8FCAB1 0x71BF
+0x8FCAB2 0x71C0
+0x8FCAB3 0x71C1
+0x8FCAB4 0x71C4
+0x8FCAB5 0x71CB
+0x8FCAB6 0x71CC
+0x8FCAB7 0x71D3
+0x8FCAB8 0x71D6
+0x8FCAB9 0x71D9
+0x8FCABA 0x71DA
+0x8FCABB 0x71DC
+0x8FCABC 0x71F8
+0x8FCABD 0x71FE
+0x8FCABE 0x7200
+0x8FCABF 0x7207
+0x8FCAC0 0x7208
+0x8FCAC1 0x7209
+0x8FCAC2 0x7213
+0x8FCAC3 0x7217
+0x8FCAC4 0x721A
+0x8FCAC5 0x721D
+0x8FCAC6 0x721F
+0x8FCAC7 0x7224
+0x8FCAC8 0x722B
+0x8FCAC9 0x722F
+0x8FCACA 0x7234
+0x8FCACB 0x7238
+0x8FCACC 0x7239
+0x8FCACD 0x7241
+0x8FCACE 0x7242
+0x8FCACF 0x7243
+0x8FCAD0 0x7245
+0x8FCAD1 0x724E
+0x8FCAD2 0x724F
+0x8FCAD3 0x7250
+0x8FCAD4 0x7253
+0x8FCAD5 0x7255
+0x8FCAD6 0x7256
+0x8FCAD7 0x725A
+0x8FCAD8 0x725C
+0x8FCAD9 0x725E
+0x8FCADA 0x7260
+0x8FCADB 0x7263
+0x8FCADC 0x7268
+0x8FCADD 0x726B
+0x8FCADE 0x726E
+0x8FCADF 0x726F
+0x8FCAE0 0x7271
+0x8FCAE1 0x7277
+0x8FCAE2 0x7278
+0x8FCAE3 0x727B
+0x8FCAE4 0x727C
+0x8FCAE5 0x727F
+0x8FCAE6 0x7284
+0x8FCAE7 0x7289
+0x8FCAE8 0x728D
+0x8FCAE9 0x728E
+0x8FCAEA 0x7293
+0x8FCAEB 0x729B
+0x8FCAEC 0x72A8
+0x8FCAED 0x72AD
+0x8FCAEE 0x72AE
+0x8FCAEF 0x72B1
+0x8FCAF0 0x72B4
+0x8FCAF1 0x72BE
+0x8FCAF2 0x72C1
+0x8FCAF3 0x72C7
+0x8FCAF4 0x72C9
+0x8FCAF5 0x72CC
+0x8FCAF6 0x72D5
+0x8FCAF7 0x72D6
+0x8FCAF8 0x72D8
+0x8FCAF9 0x72DF
+0x8FCAFA 0x72E5
+0x8FCAFB 0x72F3
+0x8FCAFC 0x72F4
+0x8FCAFD 0x72FA
+0x8FCAFE 0x72FB
+0x8FCBA1 0x72FE
+0x8FCBA2 0x7302
+0x8FCBA3 0x7304
+0x8FCBA4 0x7305
+0x8FCBA5 0x7307
+0x8FCBA6 0x730B
+0x8FCBA7 0x730D
+0x8FCBA8 0x7312
+0x8FCBA9 0x7313
+0x8FCBAA 0x7318
+0x8FCBAB 0x7319
+0x8FCBAC 0x731E
+0x8FCBAD 0x7322
+0x8FCBAE 0x7324
+0x8FCBAF 0x7327
+0x8FCBB0 0x7328
+0x8FCBB1 0x732C
+0x8FCBB2 0x7331
+0x8FCBB3 0x7332
+0x8FCBB4 0x7335
+0x8FCBB5 0x733A
+0x8FCBB6 0x733B
+0x8FCBB7 0x733D
+0x8FCBB8 0x7343
+0x8FCBB9 0x734D
+0x8FCBBA 0x7350
+0x8FCBBB 0x7352
+0x8FCBBC 0x7356
+0x8FCBBD 0x7358
+0x8FCBBE 0x735D
+0x8FCBBF 0x735E
+0x8FCBC0 0x735F
+0x8FCBC1 0x7360
+0x8FCBC2 0x7366
+0x8FCBC3 0x7367
+0x8FCBC4 0x7369
+0x8FCBC5 0x736B
+0x8FCBC6 0x736C
+0x8FCBC7 0x736E
+0x8FCBC8 0x736F
+0x8FCBC9 0x7371
+0x8FCBCA 0x7377
+0x8FCBCB 0x7379
+0x8FCBCC 0x737C
+0x8FCBCD 0x7380
+0x8FCBCE 0x7381
+0x8FCBCF 0x7383
+0x8FCBD0 0x7385
+0x8FCBD1 0x7386
+0x8FCBD2 0x738E
+0x8FCBD3 0x7390
+0x8FCBD4 0x7393
+0x8FCBD5 0x7395
+0x8FCBD6 0x7397
+0x8FCBD7 0x7398
+0x8FCBD8 0x739C
+0x8FCBD9 0x739E
+0x8FCBDA 0x739F
+0x8FCBDB 0x73A0
+0x8FCBDC 0x73A2
+0x8FCBDD 0x73A5
+0x8FCBDE 0x73A6
+0x8FCBDF 0x73AA
+0x8FCBE0 0x73AB
+0x8FCBE1 0x73AD
+0x8FCBE2 0x73B5
+0x8FCBE3 0x73B7
+0x8FCBE4 0x73B9
+0x8FCBE5 0x73BC
+0x8FCBE6 0x73BD
+0x8FCBE7 0x73BF
+0x8FCBE8 0x73C5
+0x8FCBE9 0x73C6
+0x8FCBEA 0x73C9
+0x8FCBEB 0x73CB
+0x8FCBEC 0x73CC
+0x8FCBED 0x73CF
+0x8FCBEE 0x73D2
+0x8FCBEF 0x73D3
+0x8FCBF0 0x73D6
+0x8FCBF1 0x73D9
+0x8FCBF2 0x73DD
+0x8FCBF3 0x73E1
+0x8FCBF4 0x73E3
+0x8FCBF5 0x73E6
+0x8FCBF6 0x73E7
+0x8FCBF7 0x73E9
+0x8FCBF8 0x73F4
+0x8FCBF9 0x73F5
+0x8FCBFA 0x73F7
+0x8FCBFB 0x73F9
+0x8FCBFC 0x73FA
+0x8FCBFD 0x73FB
+0x8FCBFE 0x73FD
+0x8FCCA1 0x73FF
+0x8FCCA2 0x7400
+0x8FCCA3 0x7401
+0x8FCCA4 0x7404
+0x8FCCA5 0x7407
+0x8FCCA6 0x740A
+0x8FCCA7 0x7411
+0x8FCCA8 0x741A
+0x8FCCA9 0x741B
+0x8FCCAA 0x7424
+0x8FCCAB 0x7426
+0x8FCCAC 0x7428
+0x8FCCAD 0x7429
+0x8FCCAE 0x742A
+0x8FCCAF 0x742B
+0x8FCCB0 0x742C
+0x8FCCB1 0x742D
+0x8FCCB2 0x742E
+0x8FCCB3 0x742F
+0x8FCCB4 0x7430
+0x8FCCB5 0x7431
+0x8FCCB6 0x7439
+0x8FCCB7 0x7440
+0x8FCCB8 0x7443
+0x8FCCB9 0x7444
+0x8FCCBA 0x7446
+0x8FCCBB 0x7447
+0x8FCCBC 0x744B
+0x8FCCBD 0x744D
+0x8FCCBE 0x7451
+0x8FCCBF 0x7452
+0x8FCCC0 0x7457
+0x8FCCC1 0x745D
+0x8FCCC2 0x7462
+0x8FCCC3 0x7466
+0x8FCCC4 0x7467
+0x8FCCC5 0x7468
+0x8FCCC6 0x746B
+0x8FCCC7 0x746D
+0x8FCCC8 0x746E
+0x8FCCC9 0x7471
+0x8FCCCA 0x7472
+0x8FCCCB 0x7480
+0x8FCCCC 0x7481
+0x8FCCCD 0x7485
+0x8FCCCE 0x7486
+0x8FCCCF 0x7487
+0x8FCCD0 0x7489
+0x8FCCD1 0x748F
+0x8FCCD2 0x7490
+0x8FCCD3 0x7491
+0x8FCCD4 0x7492
+0x8FCCD5 0x7498
+0x8FCCD6 0x7499
+0x8FCCD7 0x749A
+0x8FCCD8 0x749C
+0x8FCCD9 0x749F
+0x8FCCDA 0x74A0
+0x8FCCDB 0x74A1
+0x8FCCDC 0x74A3
+0x8FCCDD 0x74A6
+0x8FCCDE 0x74A8
+0x8FCCDF 0x74A9
+0x8FCCE0 0x74AA
+0x8FCCE1 0x74AB
+0x8FCCE2 0x74AE
+0x8FCCE3 0x74AF
+0x8FCCE4 0x74B1
+0x8FCCE5 0x74B2
+0x8FCCE6 0x74B5
+0x8FCCE7 0x74B9
+0x8FCCE8 0x74BB
+0x8FCCE9 0x74BF
+0x8FCCEA 0x74C8
+0x8FCCEB 0x74C9
+0x8FCCEC 0x74CC
+0x8FCCED 0x74D0
+0x8FCCEE 0x74D3
+0x8FCCEF 0x74D8
+0x8FCCF0 0x74DA
+0x8FCCF1 0x74DB
+0x8FCCF2 0x74DE
+0x8FCCF3 0x74DF
+0x8FCCF4 0x74E4
+0x8FCCF5 0x74E8
+0x8FCCF6 0x74EA
+0x8FCCF7 0x74EB
+0x8FCCF8 0x74EF
+0x8FCCF9 0x74F4
+0x8FCCFA 0x74FA
+0x8FCCFB 0x74FB
+0x8FCCFC 0x74FC
+0x8FCCFD 0x74FF
+0x8FCCFE 0x7506
+0x8FCDA1 0x7512
+0x8FCDA2 0x7516
+0x8FCDA3 0x7517
+0x8FCDA4 0x7520
+0x8FCDA5 0x7521
+0x8FCDA6 0x7524
+0x8FCDA7 0x7527
+0x8FCDA8 0x7529
+0x8FCDA9 0x752A
+0x8FCDAA 0x752F
+0x8FCDAB 0x7536
+0x8FCDAC 0x7539
+0x8FCDAD 0x753D
+0x8FCDAE 0x753E
+0x8FCDAF 0x753F
+0x8FCDB0 0x7540
+0x8FCDB1 0x7543
+0x8FCDB2 0x7547
+0x8FCDB3 0x7548
+0x8FCDB4 0x754E
+0x8FCDB5 0x7550
+0x8FCDB6 0x7552
+0x8FCDB7 0x7557
+0x8FCDB8 0x755E
+0x8FCDB9 0x755F
+0x8FCDBA 0x7561
+0x8FCDBB 0x756F
+0x8FCDBC 0x7571
+0x8FCDBD 0x7579
+0x8FCDBE 0x757A
+0x8FCDBF 0x757B
+0x8FCDC0 0x757C
+0x8FCDC1 0x757D
+0x8FCDC2 0x757E
+0x8FCDC3 0x7581
+0x8FCDC4 0x7585
+0x8FCDC5 0x7590
+0x8FCDC6 0x7592
+0x8FCDC7 0x7593
+0x8FCDC8 0x7595
+0x8FCDC9 0x7599
+0x8FCDCA 0x759C
+0x8FCDCB 0x75A2
+0x8FCDCC 0x75A4
+0x8FCDCD 0x75B4
+0x8FCDCE 0x75BA
+0x8FCDCF 0x75BF
+0x8FCDD0 0x75C0
+0x8FCDD1 0x75C1
+0x8FCDD2 0x75C4
+0x8FCDD3 0x75C6
+0x8FCDD4 0x75CC
+0x8FCDD5 0x75CE
+0x8FCDD6 0x75CF
+0x8FCDD7 0x75D7
+0x8FCDD8 0x75DC
+0x8FCDD9 0x75DF
+0x8FCDDA 0x75E0
+0x8FCDDB 0x75E1
+0x8FCDDC 0x75E4
+0x8FCDDD 0x75E7
+0x8FCDDE 0x75EC
+0x8FCDDF 0x75EE
+0x8FCDE0 0x75EF
+0x8FCDE1 0x75F1
+0x8FCDE2 0x75F9
+0x8FCDE3 0x7600
+0x8FCDE4 0x7602
+0x8FCDE5 0x7603
+0x8FCDE6 0x7604
+0x8FCDE7 0x7607
+0x8FCDE8 0x7608
+0x8FCDE9 0x760A
+0x8FCDEA 0x760C
+0x8FCDEB 0x760F
+0x8FCDEC 0x7612
+0x8FCDED 0x7613
+0x8FCDEE 0x7615
+0x8FCDEF 0x7616
+0x8FCDF0 0x7619
+0x8FCDF1 0x761B
+0x8FCDF2 0x761C
+0x8FCDF3 0x761D
+0x8FCDF4 0x761E
+0x8FCDF5 0x7623
+0x8FCDF6 0x7625
+0x8FCDF7 0x7626
+0x8FCDF8 0x7629
+0x8FCDF9 0x762D
+0x8FCDFA 0x7632
+0x8FCDFB 0x7633
+0x8FCDFC 0x7635
+0x8FCDFD 0x7638
+0x8FCDFE 0x7639
+0x8FCEA1 0x763A
+0x8FCEA2 0x763C
+0x8FCEA3 0x764A
+0x8FCEA4 0x7640
+0x8FCEA5 0x7641
+0x8FCEA6 0x7643
+0x8FCEA7 0x7644
+0x8FCEA8 0x7645
+0x8FCEA9 0x7649
+0x8FCEAA 0x764B
+0x8FCEAB 0x7655
+0x8FCEAC 0x7659
+0x8FCEAD 0x765F
+0x8FCEAE 0x7664
+0x8FCEAF 0x7665
+0x8FCEB0 0x766D
+0x8FCEB1 0x766E
+0x8FCEB2 0x766F
+0x8FCEB3 0x7671
+0x8FCEB4 0x7674
+0x8FCEB5 0x7681
+0x8FCEB6 0x7685
+0x8FCEB7 0x768C
+0x8FCEB8 0x768D
+0x8FCEB9 0x7695
+0x8FCEBA 0x769B
+0x8FCEBB 0x769C
+0x8FCEBC 0x769D
+0x8FCEBD 0x769F
+0x8FCEBE 0x76A0
+0x8FCEBF 0x76A2
+0x8FCEC0 0x76A3
+0x8FCEC1 0x76A4
+0x8FCEC2 0x76A5
+0x8FCEC3 0x76A6
+0x8FCEC4 0x76A7
+0x8FCEC5 0x76A8
+0x8FCEC6 0x76AA
+0x8FCEC7 0x76AD
+0x8FCEC8 0x76BD
+0x8FCEC9 0x76C1
+0x8FCECA 0x76C5
+0x8FCECB 0x76C9
+0x8FCECC 0x76CB
+0x8FCECD 0x76CC
+0x8FCECE 0x76CE
+0x8FCECF 0x76D4
+0x8FCED0 0x76D9
+0x8FCED1 0x76E0
+0x8FCED2 0x76E6
+0x8FCED3 0x76E8
+0x8FCED4 0x76EC
+0x8FCED5 0x76F0
+0x8FCED6 0x76F1
+0x8FCED7 0x76F6
+0x8FCED8 0x76F9
+0x8FCED9 0x76FC
+0x8FCEDA 0x7700
+0x8FCEDB 0x7706
+0x8FCEDC 0x770A
+0x8FCEDD 0x770E
+0x8FCEDE 0x7712
+0x8FCEDF 0x7714
+0x8FCEE0 0x7715
+0x8FCEE1 0x7717
+0x8FCEE2 0x7719
+0x8FCEE3 0x771A
+0x8FCEE4 0x771C
+0x8FCEE5 0x7722
+0x8FCEE6 0x7728
+0x8FCEE7 0x772D
+0x8FCEE8 0x772E
+0x8FCEE9 0x772F
+0x8FCEEA 0x7734
+0x8FCEEB 0x7735
+0x8FCEEC 0x7736
+0x8FCEED 0x7739
+0x8FCEEE 0x773D
+0x8FCEEF 0x773E
+0x8FCEF0 0x7742
+0x8FCEF1 0x7745
+0x8FCEF2 0x7746
+0x8FCEF3 0x774A
+0x8FCEF4 0x774D
+0x8FCEF5 0x774E
+0x8FCEF6 0x774F
+0x8FCEF7 0x7752
+0x8FCEF8 0x7756
+0x8FCEF9 0x7757
+0x8FCEFA 0x775C
+0x8FCEFB 0x775E
+0x8FCEFC 0x775F
+0x8FCEFD 0x7760
+0x8FCEFE 0x7762
+0x8FCFA1 0x7764
+0x8FCFA2 0x7767
+0x8FCFA3 0x776A
+0x8FCFA4 0x776C
+0x8FCFA5 0x7770
+0x8FCFA6 0x7772
+0x8FCFA7 0x7773
+0x8FCFA8 0x7774
+0x8FCFA9 0x777A
+0x8FCFAA 0x777D
+0x8FCFAB 0x7780
+0x8FCFAC 0x7784
+0x8FCFAD 0x778C
+0x8FCFAE 0x778D
+0x8FCFAF 0x7794
+0x8FCFB0 0x7795
+0x8FCFB1 0x7796
+0x8FCFB2 0x779A
+0x8FCFB3 0x779F
+0x8FCFB4 0x77A2
+0x8FCFB5 0x77A7
+0x8FCFB6 0x77AA
+0x8FCFB7 0x77AE
+0x8FCFB8 0x77AF
+0x8FCFB9 0x77B1
+0x8FCFBA 0x77B5
+0x8FCFBB 0x77BE
+0x8FCFBC 0x77C3
+0x8FCFBD 0x77C9
+0x8FCFBE 0x77D1
+0x8FCFBF 0x77D2
+0x8FCFC0 0x77D5
+0x8FCFC1 0x77D9
+0x8FCFC2 0x77DE
+0x8FCFC3 0x77DF
+0x8FCFC4 0x77E0
+0x8FCFC5 0x77E4
+0x8FCFC6 0x77E6
+0x8FCFC7 0x77EA
+0x8FCFC8 0x77EC
+0x8FCFC9 0x77F0
+0x8FCFCA 0x77F1
+0x8FCFCB 0x77F4
+0x8FCFCC 0x77F8
+0x8FCFCD 0x77FB
+0x8FCFCE 0x7805
+0x8FCFCF 0x7806
+0x8FCFD0 0x7809
+0x8FCFD1 0x780D
+0x8FCFD2 0x780E
+0x8FCFD3 0x7811
+0x8FCFD4 0x781D
+0x8FCFD5 0x7821
+0x8FCFD6 0x7822
+0x8FCFD7 0x7823
+0x8FCFD8 0x782D
+0x8FCFD9 0x782E
+0x8FCFDA 0x7830
+0x8FCFDB 0x7835
+0x8FCFDC 0x7837
+0x8FCFDD 0x7843
+0x8FCFDE 0x7844
+0x8FCFDF 0x7847
+0x8FCFE0 0x7848
+0x8FCFE1 0x784C
+0x8FCFE2 0x784E
+0x8FCFE3 0x7852
+0x8FCFE4 0x785C
+0x8FCFE5 0x785E
+0x8FCFE6 0x7860
+0x8FCFE7 0x7861
+0x8FCFE8 0x7863
+0x8FCFE9 0x7864
+0x8FCFEA 0x7868
+0x8FCFEB 0x786A
+0x8FCFEC 0x786E
+0x8FCFED 0x787A
+0x8FCFEE 0x787E
+0x8FCFEF 0x788A
+0x8FCFF0 0x788F
+0x8FCFF1 0x7894
+0x8FCFF2 0x7898
+0x8FCFF3 0x78A1
+0x8FCFF4 0x789D
+0x8FCFF5 0x789E
+0x8FCFF6 0x789F
+0x8FCFF7 0x78A4
+0x8FCFF8 0x78A8
+0x8FCFF9 0x78AC
+0x8FCFFA 0x78AD
+0x8FCFFB 0x78B0
+0x8FCFFC 0x78B1
+0x8FCFFD 0x78B2
+0x8FCFFE 0x78B3
+0x8FD0A1 0x78BB
+0x8FD0A2 0x78BD
+0x8FD0A3 0x78BF
+0x8FD0A4 0x78C7
+0x8FD0A5 0x78C8
+0x8FD0A6 0x78C9
+0x8FD0A7 0x78CC
+0x8FD0A8 0x78CE
+0x8FD0A9 0x78D2
+0x8FD0AA 0x78D3
+0x8FD0AB 0x78D5
+0x8FD0AC 0x78D6
+0x8FD0AD 0x78E4
+0x8FD0AE 0x78DB
+0x8FD0AF 0x78DF
+0x8FD0B0 0x78E0
+0x8FD0B1 0x78E1
+0x8FD0B2 0x78E6
+0x8FD0B3 0x78EA
+0x8FD0B4 0x78F2
+0x8FD0B5 0x78F3
+0x8FD0B6 0x7900
+0x8FD0B7 0x78F6
+0x8FD0B8 0x78F7
+0x8FD0B9 0x78FA
+0x8FD0BA 0x78FB
+0x8FD0BB 0x78FF
+0x8FD0BC 0x7906
+0x8FD0BD 0x790C
+0x8FD0BE 0x7910
+0x8FD0BF 0x791A
+0x8FD0C0 0x791C
+0x8FD0C1 0x791E
+0x8FD0C2 0x791F
+0x8FD0C3 0x7920
+0x8FD0C4 0x7925
+0x8FD0C5 0x7927
+0x8FD0C6 0x7929
+0x8FD0C7 0x792D
+0x8FD0C8 0x7931
+0x8FD0C9 0x7934
+0x8FD0CA 0x7935
+0x8FD0CB 0x793B
+0x8FD0CC 0x793D
+0x8FD0CD 0x793F
+0x8FD0CE 0x7944
+0x8FD0CF 0x7945
+0x8FD0D0 0x7946
+0x8FD0D1 0x794A
+0x8FD0D2 0x794B
+0x8FD0D3 0x794F
+0x8FD0D4 0x7951
+0x8FD0D5 0x7954
+0x8FD0D6 0x7958
+0x8FD0D7 0x795B
+0x8FD0D8 0x795C
+0x8FD0D9 0x7967
+0x8FD0DA 0x7969
+0x8FD0DB 0x796B
+0x8FD0DC 0x7972
+0x8FD0DD 0x7979
+0x8FD0DE 0x797B
+0x8FD0DF 0x797C
+0x8FD0E0 0x797E
+0x8FD0E1 0x798B
+0x8FD0E2 0x798C
+0x8FD0E3 0x7991
+0x8FD0E4 0x7993
+0x8FD0E5 0x7994
+0x8FD0E6 0x7995
+0x8FD0E7 0x7996
+0x8FD0E8 0x7998
+0x8FD0E9 0x799B
+0x8FD0EA 0x799C
+0x8FD0EB 0x79A1
+0x8FD0EC 0x79A8
+0x8FD0ED 0x79A9
+0x8FD0EE 0x79AB
+0x8FD0EF 0x79AF
+0x8FD0F0 0x79B1
+0x8FD0F1 0x79B4
+0x8FD0F2 0x79B8
+0x8FD0F3 0x79BB
+0x8FD0F4 0x79C2
+0x8FD0F5 0x79C4
+0x8FD0F6 0x79C7
+0x8FD0F7 0x79C8
+0x8FD0F8 0x79CA
+0x8FD0F9 0x79CF
+0x8FD0FA 0x79D4
+0x8FD0FB 0x79D6
+0x8FD0FC 0x79DA
+0x8FD0FD 0x79DD
+0x8FD0FE 0x79DE
+0x8FD1A1 0x79E0
+0x8FD1A2 0x79E2
+0x8FD1A3 0x79E5
+0x8FD1A4 0x79EA
+0x8FD1A5 0x79EB
+0x8FD1A6 0x79ED
+0x8FD1A7 0x79F1
+0x8FD1A8 0x79F8
+0x8FD1A9 0x79FC
+0x8FD1AA 0x7A02
+0x8FD1AB 0x7A03
+0x8FD1AC 0x7A07
+0x8FD1AD 0x7A09
+0x8FD1AE 0x7A0A
+0x8FD1AF 0x7A0C
+0x8FD1B0 0x7A11
+0x8FD1B1 0x7A15
+0x8FD1B2 0x7A1B
+0x8FD1B3 0x7A1E
+0x8FD1B4 0x7A21
+0x8FD1B5 0x7A27
+0x8FD1B6 0x7A2B
+0x8FD1B7 0x7A2D
+0x8FD1B8 0x7A2F
+0x8FD1B9 0x7A30
+0x8FD1BA 0x7A34
+0x8FD1BB 0x7A35
+0x8FD1BC 0x7A38
+0x8FD1BD 0x7A39
+0x8FD1BE 0x7A3A
+0x8FD1BF 0x7A44
+0x8FD1C0 0x7A45
+0x8FD1C1 0x7A47
+0x8FD1C2 0x7A48
+0x8FD1C3 0x7A4C
+0x8FD1C4 0x7A55
+0x8FD1C5 0x7A56
+0x8FD1C6 0x7A59
+0x8FD1C7 0x7A5C
+0x8FD1C8 0x7A5D
+0x8FD1C9 0x7A5F
+0x8FD1CA 0x7A60
+0x8FD1CB 0x7A65
+0x8FD1CC 0x7A67
+0x8FD1CD 0x7A6A
+0x8FD1CE 0x7A6D
+0x8FD1CF 0x7A75
+0x8FD1D0 0x7A78
+0x8FD1D1 0x7A7E
+0x8FD1D2 0x7A80
+0x8FD1D3 0x7A82
+0x8FD1D4 0x7A85
+0x8FD1D5 0x7A86
+0x8FD1D6 0x7A8A
+0x8FD1D7 0x7A8B
+0x8FD1D8 0x7A90
+0x8FD1D9 0x7A91
+0x8FD1DA 0x7A94
+0x8FD1DB 0x7A9E
+0x8FD1DC 0x7AA0
+0x8FD1DD 0x7AA3
+0x8FD1DE 0x7AAC
+0x8FD1DF 0x7AB3
+0x8FD1E0 0x7AB5
+0x8FD1E1 0x7AB9
+0x8FD1E2 0x7ABB
+0x8FD1E3 0x7ABC
+0x8FD1E4 0x7AC6
+0x8FD1E5 0x7AC9
+0x8FD1E6 0x7ACC
+0x8FD1E7 0x7ACE
+0x8FD1E8 0x7AD1
+0x8FD1E9 0x7ADB
+0x8FD1EA 0x7AE8
+0x8FD1EB 0x7AE9
+0x8FD1EC 0x7AEB
+0x8FD1ED 0x7AEC
+0x8FD1EE 0x7AF1
+0x8FD1EF 0x7AF4
+0x8FD1F0 0x7AFB
+0x8FD1F1 0x7AFD
+0x8FD1F2 0x7AFE
+0x8FD1F3 0x7B07
+0x8FD1F4 0x7B14
+0x8FD1F5 0x7B1F
+0x8FD1F6 0x7B23
+0x8FD1F7 0x7B27
+0x8FD1F8 0x7B29
+0x8FD1F9 0x7B2A
+0x8FD1FA 0x7B2B
+0x8FD1FB 0x7B2D
+0x8FD1FC 0x7B2E
+0x8FD1FD 0x7B2F
+0x8FD1FE 0x7B30
+0x8FD2A1 0x7B31
+0x8FD2A2 0x7B34
+0x8FD2A3 0x7B3D
+0x8FD2A4 0x7B3F
+0x8FD2A5 0x7B40
+0x8FD2A6 0x7B41
+0x8FD2A7 0x7B47
+0x8FD2A8 0x7B4E
+0x8FD2A9 0x7B55
+0x8FD2AA 0x7B60
+0x8FD2AB 0x7B64
+0x8FD2AC 0x7B66
+0x8FD2AD 0x7B69
+0x8FD2AE 0x7B6A
+0x8FD2AF 0x7B6D
+0x8FD2B0 0x7B6F
+0x8FD2B1 0x7B72
+0x8FD2B2 0x7B73
+0x8FD2B3 0x7B77
+0x8FD2B4 0x7B84
+0x8FD2B5 0x7B89
+0x8FD2B6 0x7B8E
+0x8FD2B7 0x7B90
+0x8FD2B8 0x7B91
+0x8FD2B9 0x7B96
+0x8FD2BA 0x7B9B
+0x8FD2BB 0x7B9E
+0x8FD2BC 0x7BA0
+0x8FD2BD 0x7BA5
+0x8FD2BE 0x7BAC
+0x8FD2BF 0x7BAF
+0x8FD2C0 0x7BB0
+0x8FD2C1 0x7BB2
+0x8FD2C2 0x7BB5
+0x8FD2C3 0x7BB6
+0x8FD2C4 0x7BBA
+0x8FD2C5 0x7BBB
+0x8FD2C6 0x7BBC
+0x8FD2C7 0x7BBD
+0x8FD2C8 0x7BC2
+0x8FD2C9 0x7BC5
+0x8FD2CA 0x7BC8
+0x8FD2CB 0x7BCA
+0x8FD2CC 0x7BD4
+0x8FD2CD 0x7BD6
+0x8FD2CE 0x7BD7
+0x8FD2CF 0x7BD9
+0x8FD2D0 0x7BDA
+0x8FD2D1 0x7BDB
+0x8FD2D2 0x7BE8
+0x8FD2D3 0x7BEA
+0x8FD2D4 0x7BF2
+0x8FD2D5 0x7BF4
+0x8FD2D6 0x7BF5
+0x8FD2D7 0x7BF8
+0x8FD2D8 0x7BF9
+0x8FD2D9 0x7BFA
+0x8FD2DA 0x7BFC
+0x8FD2DB 0x7BFE
+0x8FD2DC 0x7C01
+0x8FD2DD 0x7C02
+0x8FD2DE 0x7C03
+0x8FD2DF 0x7C04
+0x8FD2E0 0x7C06
+0x8FD2E1 0x7C09
+0x8FD2E2 0x7C0B
+0x8FD2E3 0x7C0C
+0x8FD2E4 0x7C0E
+0x8FD2E5 0x7C0F
+0x8FD2E6 0x7C19
+0x8FD2E7 0x7C1B
+0x8FD2E8 0x7C20
+0x8FD2E9 0x7C25
+0x8FD2EA 0x7C26
+0x8FD2EB 0x7C28
+0x8FD2EC 0x7C2C
+0x8FD2ED 0x7C31
+0x8FD2EE 0x7C33
+0x8FD2EF 0x7C34
+0x8FD2F0 0x7C36
+0x8FD2F1 0x7C39
+0x8FD2F2 0x7C3A
+0x8FD2F3 0x7C46
+0x8FD2F4 0x7C4A
+0x8FD2F5 0x7C55
+0x8FD2F6 0x7C51
+0x8FD2F7 0x7C52
+0x8FD2F8 0x7C53
+0x8FD2F9 0x7C59
+0x8FD2FA 0x7C5A
+0x8FD2FB 0x7C5B
+0x8FD2FC 0x7C5C
+0x8FD2FD 0x7C5D
+0x8FD2FE 0x7C5E
+0x8FD3A1 0x7C61
+0x8FD3A2 0x7C63
+0x8FD3A3 0x7C67
+0x8FD3A4 0x7C69
+0x8FD3A5 0x7C6D
+0x8FD3A6 0x7C6E
+0x8FD3A7 0x7C70
+0x8FD3A8 0x7C72
+0x8FD3A9 0x7C79
+0x8FD3AA 0x7C7C
+0x8FD3AB 0x7C7D
+0x8FD3AC 0x7C86
+0x8FD3AD 0x7C87
+0x8FD3AE 0x7C8F
+0x8FD3AF 0x7C94
+0x8FD3B0 0x7C9E
+0x8FD3B1 0x7CA0
+0x8FD3B2 0x7CA6
+0x8FD3B3 0x7CB0
+0x8FD3B4 0x7CB6
+0x8FD3B5 0x7CB7
+0x8FD3B6 0x7CBA
+0x8FD3B7 0x7CBB
+0x8FD3B8 0x7CBC
+0x8FD3B9 0x7CBF
+0x8FD3BA 0x7CC4
+0x8FD3BB 0x7CC7
+0x8FD3BC 0x7CC8
+0x8FD3BD 0x7CC9
+0x8FD3BE 0x7CCD
+0x8FD3BF 0x7CCF
+0x8FD3C0 0x7CD3
+0x8FD3C1 0x7CD4
+0x8FD3C2 0x7CD5
+0x8FD3C3 0x7CD7
+0x8FD3C4 0x7CD9
+0x8FD3C5 0x7CDA
+0x8FD3C6 0x7CDD
+0x8FD3C7 0x7CE6
+0x8FD3C8 0x7CE9
+0x8FD3C9 0x7CEB
+0x8FD3CA 0x7CF5
+0x8FD3CB 0x7D03
+0x8FD3CC 0x7D07
+0x8FD3CD 0x7D08
+0x8FD3CE 0x7D09
+0x8FD3CF 0x7D0F
+0x8FD3D0 0x7D11
+0x8FD3D1 0x7D12
+0x8FD3D2 0x7D13
+0x8FD3D3 0x7D16
+0x8FD3D4 0x7D1D
+0x8FD3D5 0x7D1E
+0x8FD3D6 0x7D23
+0x8FD3D7 0x7D26
+0x8FD3D8 0x7D2A
+0x8FD3D9 0x7D2D
+0x8FD3DA 0x7D31
+0x8FD3DB 0x7D3C
+0x8FD3DC 0x7D3D
+0x8FD3DD 0x7D3E
+0x8FD3DE 0x7D40
+0x8FD3DF 0x7D41
+0x8FD3E0 0x7D47
+0x8FD3E1 0x7D48
+0x8FD3E2 0x7D4D
+0x8FD3E3 0x7D51
+0x8FD3E4 0x7D53
+0x8FD3E5 0x7D57
+0x8FD3E6 0x7D59
+0x8FD3E7 0x7D5A
+0x8FD3E8 0x7D5C
+0x8FD3E9 0x7D5D
+0x8FD3EA 0x7D65
+0x8FD3EB 0x7D67
+0x8FD3EC 0x7D6A
+0x8FD3ED 0x7D70
+0x8FD3EE 0x7D78
+0x8FD3EF 0x7D7A
+0x8FD3F0 0x7D7B
+0x8FD3F1 0x7D7F
+0x8FD3F2 0x7D81
+0x8FD3F3 0x7D82
+0x8FD3F4 0x7D83
+0x8FD3F5 0x7D85
+0x8FD3F6 0x7D86
+0x8FD3F7 0x7D88
+0x8FD3F8 0x7D8B
+0x8FD3F9 0x7D8C
+0x8FD3FA 0x7D8D
+0x8FD3FB 0x7D91
+0x8FD3FC 0x7D96
+0x8FD3FD 0x7D97
+0x8FD3FE 0x7D9D
+0x8FD4A1 0x7D9E
+0x8FD4A2 0x7DA6
+0x8FD4A3 0x7DA7
+0x8FD4A4 0x7DAA
+0x8FD4A5 0x7DB3
+0x8FD4A6 0x7DB6
+0x8FD4A7 0x7DB7
+0x8FD4A8 0x7DB9
+0x8FD4A9 0x7DC2
+0x8FD4AA 0x7DC3
+0x8FD4AB 0x7DC4
+0x8FD4AC 0x7DC5
+0x8FD4AD 0x7DC6
+0x8FD4AE 0x7DCC
+0x8FD4AF 0x7DCD
+0x8FD4B0 0x7DCE
+0x8FD4B1 0x7DD7
+0x8FD4B2 0x7DD9
+0x8FD4B3 0x7E00
+0x8FD4B4 0x7DE2
+0x8FD4B5 0x7DE5
+0x8FD4B6 0x7DE6
+0x8FD4B7 0x7DEA
+0x8FD4B8 0x7DEB
+0x8FD4B9 0x7DED
+0x8FD4BA 0x7DF1
+0x8FD4BB 0x7DF5
+0x8FD4BC 0x7DF6
+0x8FD4BD 0x7DF9
+0x8FD4BE 0x7DFA
+0x8FD4BF 0x7E08
+0x8FD4C0 0x7E10
+0x8FD4C1 0x7E11
+0x8FD4C2 0x7E15
+0x8FD4C3 0x7E17
+0x8FD4C4 0x7E1C
+0x8FD4C5 0x7E1D
+0x8FD4C6 0x7E20
+0x8FD4C7 0x7E27
+0x8FD4C8 0x7E28
+0x8FD4C9 0x7E2C
+0x8FD4CA 0x7E2D
+0x8FD4CB 0x7E2F
+0x8FD4CC 0x7E33
+0x8FD4CD 0x7E36
+0x8FD4CE 0x7E3F
+0x8FD4CF 0x7E44
+0x8FD4D0 0x7E45
+0x8FD4D1 0x7E47
+0x8FD4D2 0x7E4E
+0x8FD4D3 0x7E50
+0x8FD4D4 0x7E52
+0x8FD4D5 0x7E58
+0x8FD4D6 0x7E5F
+0x8FD4D7 0x7E61
+0x8FD4D8 0x7E62
+0x8FD4D9 0x7E65
+0x8FD4DA 0x7E6B
+0x8FD4DB 0x7E6E
+0x8FD4DC 0x7E6F
+0x8FD4DD 0x7E73
+0x8FD4DE 0x7E78
+0x8FD4DF 0x7E7E
+0x8FD4E0 0x7E81
+0x8FD4E1 0x7E86
+0x8FD4E2 0x7E87
+0x8FD4E3 0x7E8A
+0x8FD4E4 0x7E8D
+0x8FD4E5 0x7E91
+0x8FD4E6 0x7E95
+0x8FD4E7 0x7E98
+0x8FD4E8 0x7E9A
+0x8FD4E9 0x7E9D
+0x8FD4EA 0x7E9E
+0x8FD4EB 0x7F3C
+0x8FD4EC 0x7F3B
+0x8FD4ED 0x7F3D
+0x8FD4EE 0x7F3E
+0x8FD4EF 0x7F3F
+0x8FD4F0 0x7F43
+0x8FD4F1 0x7F44
+0x8FD4F2 0x7F47
+0x8FD4F3 0x7F4F
+0x8FD4F4 0x7F52
+0x8FD4F5 0x7F53
+0x8FD4F6 0x7F5B
+0x8FD4F7 0x7F5C
+0x8FD4F8 0x7F5D
+0x8FD4F9 0x7F61
+0x8FD4FA 0x7F63
+0x8FD4FB 0x7F64
+0x8FD4FC 0x7F65
+0x8FD4FD 0x7F66
+0x8FD4FE 0x7F6D
+0x8FD5A1 0x7F71
+0x8FD5A2 0x7F7D
+0x8FD5A3 0x7F7E
+0x8FD5A4 0x7F7F
+0x8FD5A5 0x7F80
+0x8FD5A6 0x7F8B
+0x8FD5A7 0x7F8D
+0x8FD5A8 0x7F8F
+0x8FD5A9 0x7F90
+0x8FD5AA 0x7F91
+0x8FD5AB 0x7F96
+0x8FD5AC 0x7F97
+0x8FD5AD 0x7F9C
+0x8FD5AE 0x7FA1
+0x8FD5AF 0x7FA2
+0x8FD5B0 0x7FA6
+0x8FD5B1 0x7FAA
+0x8FD5B2 0x7FAD
+0x8FD5B3 0x7FB4
+0x8FD5B4 0x7FBC
+0x8FD5B5 0x7FBF
+0x8FD5B6 0x7FC0
+0x8FD5B7 0x7FC3
+0x8FD5B8 0x7FC8
+0x8FD5B9 0x7FCE
+0x8FD5BA 0x7FCF
+0x8FD5BB 0x7FDB
+0x8FD5BC 0x7FDF
+0x8FD5BD 0x7FE3
+0x8FD5BE 0x7FE5
+0x8FD5BF 0x7FE8
+0x8FD5C0 0x7FEC
+0x8FD5C1 0x7FEE
+0x8FD5C2 0x7FEF
+0x8FD5C3 0x7FF2
+0x8FD5C4 0x7FFA
+0x8FD5C5 0x7FFD
+0x8FD5C6 0x7FFE
+0x8FD5C7 0x7FFF
+0x8FD5C8 0x8007
+0x8FD5C9 0x8008
+0x8FD5CA 0x800A
+0x8FD5CB 0x800D
+0x8FD5CC 0x800E
+0x8FD5CD 0x800F
+0x8FD5CE 0x8011
+0x8FD5CF 0x8013
+0x8FD5D0 0x8014
+0x8FD5D1 0x8016
+0x8FD5D2 0x801D
+0x8FD5D3 0x801E
+0x8FD5D4 0x801F
+0x8FD5D5 0x8020
+0x8FD5D6 0x8024
+0x8FD5D7 0x8026
+0x8FD5D8 0x802C
+0x8FD5D9 0x802E
+0x8FD5DA 0x8030
+0x8FD5DB 0x8034
+0x8FD5DC 0x8035
+0x8FD5DD 0x8037
+0x8FD5DE 0x8039
+0x8FD5DF 0x803A
+0x8FD5E0 0x803C
+0x8FD5E1 0x803E
+0x8FD5E2 0x8040
+0x8FD5E3 0x8044
+0x8FD5E4 0x8060
+0x8FD5E5 0x8064
+0x8FD5E6 0x8066
+0x8FD5E7 0x806D
+0x8FD5E8 0x8071
+0x8FD5E9 0x8075
+0x8FD5EA 0x8081
+0x8FD5EB 0x8088
+0x8FD5EC 0x808E
+0x8FD5ED 0x809C
+0x8FD5EE 0x809E
+0x8FD5EF 0x80A6
+0x8FD5F0 0x80A7
+0x8FD5F1 0x80AB
+0x8FD5F2 0x80B8
+0x8FD5F3 0x80B9
+0x8FD5F4 0x80C8
+0x8FD5F5 0x80CD
+0x8FD5F6 0x80CF
+0x8FD5F7 0x80D2
+0x8FD5F8 0x80D4
+0x8FD5F9 0x80D5
+0x8FD5FA 0x80D7
+0x8FD5FB 0x80D8
+0x8FD5FC 0x80E0
+0x8FD5FD 0x80ED
+0x8FD5FE 0x80EE
+0x8FD6A1 0x80F0
+0x8FD6A2 0x80F2
+0x8FD6A3 0x80F3
+0x8FD6A4 0x80F6
+0x8FD6A5 0x80F9
+0x8FD6A6 0x80FA
+0x8FD6A7 0x80FE
+0x8FD6A8 0x8103
+0x8FD6A9 0x810B
+0x8FD6AA 0x8116
+0x8FD6AB 0x8117
+0x8FD6AC 0x8118
+0x8FD6AD 0x811C
+0x8FD6AE 0x811E
+0x8FD6AF 0x8120
+0x8FD6B0 0x8124
+0x8FD6B1 0x8127
+0x8FD6B2 0x812C
+0x8FD6B3 0x8130
+0x8FD6B4 0x8135
+0x8FD6B5 0x813A
+0x8FD6B6 0x813C
+0x8FD6B7 0x8145
+0x8FD6B8 0x8147
+0x8FD6B9 0x814A
+0x8FD6BA 0x814C
+0x8FD6BB 0x8152
+0x8FD6BC 0x8157
+0x8FD6BD 0x8160
+0x8FD6BE 0x8161
+0x8FD6BF 0x8167
+0x8FD6C0 0x8168
+0x8FD6C1 0x8169
+0x8FD6C2 0x816D
+0x8FD6C3 0x816F
+0x8FD6C4 0x8177
+0x8FD6C5 0x8181
+0x8FD6C6 0x8190
+0x8FD6C7 0x8184
+0x8FD6C8 0x8185
+0x8FD6C9 0x8186
+0x8FD6CA 0x818B
+0x8FD6CB 0x818E
+0x8FD6CC 0x8196
+0x8FD6CD 0x8198
+0x8FD6CE 0x819B
+0x8FD6CF 0x819E
+0x8FD6D0 0x81A2
+0x8FD6D1 0x81AE
+0x8FD6D2 0x81B2
+0x8FD6D3 0x81B4
+0x8FD6D4 0x81BB
+0x8FD6D5 0x81CB
+0x8FD6D6 0x81C3
+0x8FD6D7 0x81C5
+0x8FD6D8 0x81CA
+0x8FD6D9 0x81CE
+0x8FD6DA 0x81CF
+0x8FD6DB 0x81D5
+0x8FD6DC 0x81D7
+0x8FD6DD 0x81DB
+0x8FD6DE 0x81DD
+0x8FD6DF 0x81DE
+0x8FD6E0 0x81E1
+0x8FD6E1 0x81E4
+0x8FD6E2 0x81EB
+0x8FD6E3 0x81EC
+0x8FD6E4 0x81F0
+0x8FD6E5 0x81F1
+0x8FD6E6 0x81F2
+0x8FD6E7 0x81F5
+0x8FD6E8 0x81F6
+0x8FD6E9 0x81F8
+0x8FD6EA 0x81F9
+0x8FD6EB 0x81FD
+0x8FD6EC 0x81FF
+0x8FD6ED 0x8200
+0x8FD6EE 0x8203
+0x8FD6EF 0x820F
+0x8FD6F0 0x8213
+0x8FD6F1 0x8214
+0x8FD6F2 0x8219
+0x8FD6F3 0x821A
+0x8FD6F4 0x821D
+0x8FD6F5 0x8221
+0x8FD6F6 0x8222
+0x8FD6F7 0x8228
+0x8FD6F8 0x8232
+0x8FD6F9 0x8234
+0x8FD6FA 0x823A
+0x8FD6FB 0x8243
+0x8FD6FC 0x8244
+0x8FD6FD 0x8245
+0x8FD6FE 0x8246
+0x8FD7A1 0x824B
+0x8FD7A2 0x824E
+0x8FD7A3 0x824F
+0x8FD7A4 0x8251
+0x8FD7A5 0x8256
+0x8FD7A6 0x825C
+0x8FD7A7 0x8260
+0x8FD7A8 0x8263
+0x8FD7A9 0x8267
+0x8FD7AA 0x826D
+0x8FD7AB 0x8274
+0x8FD7AC 0x827B
+0x8FD7AD 0x827D
+0x8FD7AE 0x827F
+0x8FD7AF 0x8280
+0x8FD7B0 0x8281
+0x8FD7B1 0x8283
+0x8FD7B2 0x8284
+0x8FD7B3 0x8287
+0x8FD7B4 0x8289
+0x8FD7B5 0x828A
+0x8FD7B6 0x828E
+0x8FD7B7 0x8291
+0x8FD7B8 0x8294
+0x8FD7B9 0x8296
+0x8FD7BA 0x8298
+0x8FD7BB 0x829A
+0x8FD7BC 0x829B
+0x8FD7BD 0x82A0
+0x8FD7BE 0x82A1
+0x8FD7BF 0x82A3
+0x8FD7C0 0x82A4
+0x8FD7C1 0x82A7
+0x8FD7C2 0x82A8
+0x8FD7C3 0x82A9
+0x8FD7C4 0x82AA
+0x8FD7C5 0x82AE
+0x8FD7C6 0x82B0
+0x8FD7C7 0x82B2
+0x8FD7C8 0x82B4
+0x8FD7C9 0x82B7
+0x8FD7CA 0x82BA
+0x8FD7CB 0x82BC
+0x8FD7CC 0x82BE
+0x8FD7CD 0x82BF
+0x8FD7CE 0x82C6
+0x8FD7CF 0x82D0
+0x8FD7D0 0x82D5
+0x8FD7D1 0x82DA
+0x8FD7D2 0x82E0
+0x8FD7D3 0x82E2
+0x8FD7D4 0x82E4
+0x8FD7D5 0x82E8
+0x8FD7D6 0x82EA
+0x8FD7D7 0x82ED
+0x8FD7D8 0x82EF
+0x8FD7D9 0x82F6
+0x8FD7DA 0x82F7
+0x8FD7DB 0x82FD
+0x8FD7DC 0x82FE
+0x8FD7DD 0x8300
+0x8FD7DE 0x8301
+0x8FD7DF 0x8307
+0x8FD7E0 0x8308
+0x8FD7E1 0x830A
+0x8FD7E2 0x830B
+0x8FD7E3 0x8354
+0x8FD7E4 0x831B
+0x8FD7E5 0x831D
+0x8FD7E6 0x831E
+0x8FD7E7 0x831F
+0x8FD7E8 0x8321
+0x8FD7E9 0x8322
+0x8FD7EA 0x832C
+0x8FD7EB 0x832D
+0x8FD7EC 0x832E
+0x8FD7ED 0x8330
+0x8FD7EE 0x8333
+0x8FD7EF 0x8337
+0x8FD7F0 0x833A
+0x8FD7F1 0x833C
+0x8FD7F2 0x833D
+0x8FD7F3 0x8342
+0x8FD7F4 0x8343
+0x8FD7F5 0x8344
+0x8FD7F6 0x8347
+0x8FD7F7 0x834D
+0x8FD7F8 0x834E
+0x8FD7F9 0x8351
+0x8FD7FA 0x8355
+0x8FD7FB 0x8356
+0x8FD7FC 0x8357
+0x8FD7FD 0x8370
+0x8FD7FE 0x8378
+0x8FD8A1 0x837D
+0x8FD8A2 0x837F
+0x8FD8A3 0x8380
+0x8FD8A4 0x8382
+0x8FD8A5 0x8384
+0x8FD8A6 0x8386
+0x8FD8A7 0x838D
+0x8FD8A8 0x8392
+0x8FD8A9 0x8394
+0x8FD8AA 0x8395
+0x8FD8AB 0x8398
+0x8FD8AC 0x8399
+0x8FD8AD 0x839B
+0x8FD8AE 0x839C
+0x8FD8AF 0x839D
+0x8FD8B0 0x83A6
+0x8FD8B1 0x83A7
+0x8FD8B2 0x83A9
+0x8FD8B3 0x83AC
+0x8FD8B4 0x83BE
+0x8FD8B5 0x83BF
+0x8FD8B6 0x83C0
+0x8FD8B7 0x83C7
+0x8FD8B8 0x83C9
+0x8FD8B9 0x83CF
+0x8FD8BA 0x83D0
+0x8FD8BB 0x83D1
+0x8FD8BC 0x83D4
+0x8FD8BD 0x83DD
+0x8FD8BE 0x8353
+0x8FD8BF 0x83E8
+0x8FD8C0 0x83EA
+0x8FD8C1 0x83F6
+0x8FD8C2 0x83F8
+0x8FD8C3 0x83F9
+0x8FD8C4 0x83FC
+0x8FD8C5 0x8401
+0x8FD8C6 0x8406
+0x8FD8C7 0x840A
+0x8FD8C8 0x840F
+0x8FD8C9 0x8411
+0x8FD8CA 0x8415
+0x8FD8CB 0x8419
+0x8FD8CC 0x83AD
+0x8FD8CD 0x842F
+0x8FD8CE 0x8439
+0x8FD8CF 0x8445
+0x8FD8D0 0x8447
+0x8FD8D1 0x8448
+0x8FD8D2 0x844A
+0x8FD8D3 0x844D
+0x8FD8D4 0x844F
+0x8FD8D5 0x8451
+0x8FD8D6 0x8452
+0x8FD8D7 0x8456
+0x8FD8D8 0x8458
+0x8FD8D9 0x8459
+0x8FD8DA 0x845A
+0x8FD8DB 0x845C
+0x8FD8DC 0x8460
+0x8FD8DD 0x8464
+0x8FD8DE 0x8465
+0x8FD8DF 0x8467
+0x8FD8E0 0x846A
+0x8FD8E1 0x8470
+0x8FD8E2 0x8473
+0x8FD8E3 0x8474
+0x8FD8E4 0x8476
+0x8FD8E5 0x8478
+0x8FD8E6 0x847C
+0x8FD8E7 0x847D
+0x8FD8E8 0x8481
+0x8FD8E9 0x8485
+0x8FD8EA 0x8492
+0x8FD8EB 0x8493
+0x8FD8EC 0x8495
+0x8FD8ED 0x849E
+0x8FD8EE 0x84A6
+0x8FD8EF 0x84A8
+0x8FD8F0 0x84A9
+0x8FD8F1 0x84AA
+0x8FD8F2 0x84AF
+0x8FD8F3 0x84B1
+0x8FD8F4 0x84B4
+0x8FD8F5 0x84BA
+0x8FD8F6 0x84BD
+0x8FD8F7 0x84BE
+0x8FD8F8 0x84C0
+0x8FD8F9 0x84C2
+0x8FD8FA 0x84C7
+0x8FD8FB 0x84C8
+0x8FD8FC 0x84CC
+0x8FD8FD 0x84CF
+0x8FD8FE 0x84D3
+0x8FD9A1 0x84DC
+0x8FD9A2 0x84E7
+0x8FD9A3 0x84EA
+0x8FD9A4 0x84EF
+0x8FD9A5 0x84F0
+0x8FD9A6 0x84F1
+0x8FD9A7 0x84F2
+0x8FD9A8 0x84F7
+0x8FD9A9 0x8532
+0x8FD9AA 0x84FA
+0x8FD9AB 0x84FB
+0x8FD9AC 0x84FD
+0x8FD9AD 0x8502
+0x8FD9AE 0x8503
+0x8FD9AF 0x8507
+0x8FD9B0 0x850C
+0x8FD9B1 0x850E
+0x8FD9B2 0x8510
+0x8FD9B3 0x851C
+0x8FD9B4 0x851E
+0x8FD9B5 0x8522
+0x8FD9B6 0x8523
+0x8FD9B7 0x8524
+0x8FD9B8 0x8525
+0x8FD9B9 0x8527
+0x8FD9BA 0x852A
+0x8FD9BB 0x852B
+0x8FD9BC 0x852F
+0x8FD9BD 0x8533
+0x8FD9BE 0x8534
+0x8FD9BF 0x8536
+0x8FD9C0 0x853F
+0x8FD9C1 0x8546
+0x8FD9C2 0x854F
+0x8FD9C3 0x8550
+0x8FD9C4 0x8551
+0x8FD9C5 0x8552
+0x8FD9C6 0x8553
+0x8FD9C7 0x8556
+0x8FD9C8 0x8559
+0x8FD9C9 0x855C
+0x8FD9CA 0x855D
+0x8FD9CB 0x855E
+0x8FD9CC 0x855F
+0x8FD9CD 0x8560
+0x8FD9CE 0x8561
+0x8FD9CF 0x8562
+0x8FD9D0 0x8564
+0x8FD9D1 0x856B
+0x8FD9D2 0x856F
+0x8FD9D3 0x8579
+0x8FD9D4 0x857A
+0x8FD9D5 0x857B
+0x8FD9D6 0x857D
+0x8FD9D7 0x857F
+0x8FD9D8 0x8581
+0x8FD9D9 0x8585
+0x8FD9DA 0x8586
+0x8FD9DB 0x8589
+0x8FD9DC 0x858B
+0x8FD9DD 0x858C
+0x8FD9DE 0x858F
+0x8FD9DF 0x8593
+0x8FD9E0 0x8598
+0x8FD9E1 0x859D
+0x8FD9E2 0x859F
+0x8FD9E3 0x85A0
+0x8FD9E4 0x85A2
+0x8FD9E5 0x85A5
+0x8FD9E6 0x85A7
+0x8FD9E7 0x85B4
+0x8FD9E8 0x85B6
+0x8FD9E9 0x85B7
+0x8FD9EA 0x85B8
+0x8FD9EB 0x85BC
+0x8FD9EC 0x85BD
+0x8FD9ED 0x85BE
+0x8FD9EE 0x85BF
+0x8FD9EF 0x85C2
+0x8FD9F0 0x85C7
+0x8FD9F1 0x85CA
+0x8FD9F2 0x85CB
+0x8FD9F3 0x85CE
+0x8FD9F4 0x85AD
+0x8FD9F5 0x85D8
+0x8FD9F6 0x85DA
+0x8FD9F7 0x85DF
+0x8FD9F8 0x85E0
+0x8FD9F9 0x85E6
+0x8FD9FA 0x85E8
+0x8FD9FB 0x85ED
+0x8FD9FC 0x85F3
+0x8FD9FD 0x85F6
+0x8FD9FE 0x85FC
+0x8FDAA1 0x85FF
+0x8FDAA2 0x8600
+0x8FDAA3 0x8604
+0x8FDAA4 0x8605
+0x8FDAA5 0x860D
+0x8FDAA6 0x860E
+0x8FDAA7 0x8610
+0x8FDAA8 0x8611
+0x8FDAA9 0x8612
+0x8FDAAA 0x8618
+0x8FDAAB 0x8619
+0x8FDAAC 0x861B
+0x8FDAAD 0x861E
+0x8FDAAE 0x8621
+0x8FDAAF 0x8627
+0x8FDAB0 0x8629
+0x8FDAB1 0x8636
+0x8FDAB2 0x8638
+0x8FDAB3 0x863A
+0x8FDAB4 0x863C
+0x8FDAB5 0x863D
+0x8FDAB6 0x8640
+0x8FDAB7 0x8642
+0x8FDAB8 0x8646
+0x8FDAB9 0x8652
+0x8FDABA 0x8653
+0x8FDABB 0x8656
+0x8FDABC 0x8657
+0x8FDABD 0x8658
+0x8FDABE 0x8659
+0x8FDABF 0x865D
+0x8FDAC0 0x8660
+0x8FDAC1 0x8661
+0x8FDAC2 0x8662
+0x8FDAC3 0x8663
+0x8FDAC4 0x8664
+0x8FDAC5 0x8669
+0x8FDAC6 0x866C
+0x8FDAC7 0x866F
+0x8FDAC8 0x8675
+0x8FDAC9 0x8676
+0x8FDACA 0x8677
+0x8FDACB 0x867A
+0x8FDACC 0x868D
+0x8FDACD 0x8691
+0x8FDACE 0x8696
+0x8FDACF 0x8698
+0x8FDAD0 0x869A
+0x8FDAD1 0x869C
+0x8FDAD2 0x86A1
+0x8FDAD3 0x86A6
+0x8FDAD4 0x86A7
+0x8FDAD5 0x86A8
+0x8FDAD6 0x86AD
+0x8FDAD7 0x86B1
+0x8FDAD8 0x86B3
+0x8FDAD9 0x86B4
+0x8FDADA 0x86B5
+0x8FDADB 0x86B7
+0x8FDADC 0x86B8
+0x8FDADD 0x86B9
+0x8FDADE 0x86BF
+0x8FDADF 0x86C0
+0x8FDAE0 0x86C1
+0x8FDAE1 0x86C3
+0x8FDAE2 0x86C5
+0x8FDAE3 0x86D1
+0x8FDAE4 0x86D2
+0x8FDAE5 0x86D5
+0x8FDAE6 0x86D7
+0x8FDAE7 0x86DA
+0x8FDAE8 0x86DC
+0x8FDAE9 0x86E0
+0x8FDAEA 0x86E3
+0x8FDAEB 0x86E5
+0x8FDAEC 0x86E7
+0x8FDAED 0x8688
+0x8FDAEE 0x86FA
+0x8FDAEF 0x86FC
+0x8FDAF0 0x86FD
+0x8FDAF1 0x8704
+0x8FDAF2 0x8705
+0x8FDAF3 0x8707
+0x8FDAF4 0x870B
+0x8FDAF5 0x870E
+0x8FDAF6 0x870F
+0x8FDAF7 0x8710
+0x8FDAF8 0x8713
+0x8FDAF9 0x8714
+0x8FDAFA 0x8719
+0x8FDAFB 0x871E
+0x8FDAFC 0x871F
+0x8FDAFD 0x8721
+0x8FDAFE 0x8723
+0x8FDBA1 0x8728
+0x8FDBA2 0x872E
+0x8FDBA3 0x872F
+0x8FDBA4 0x8731
+0x8FDBA5 0x8732
+0x8FDBA6 0x8739
+0x8FDBA7 0x873A
+0x8FDBA8 0x873C
+0x8FDBA9 0x873D
+0x8FDBAA 0x873E
+0x8FDBAB 0x8740
+0x8FDBAC 0x8743
+0x8FDBAD 0x8745
+0x8FDBAE 0x874D
+0x8FDBAF 0x8758
+0x8FDBB0 0x875D
+0x8FDBB1 0x8761
+0x8FDBB2 0x8764
+0x8FDBB3 0x8765
+0x8FDBB4 0x876F
+0x8FDBB5 0x8771
+0x8FDBB6 0x8772
+0x8FDBB7 0x877B
+0x8FDBB8 0x8783
+0x8FDBB9 0x8784
+0x8FDBBA 0x8785
+0x8FDBBB 0x8786
+0x8FDBBC 0x8787
+0x8FDBBD 0x8788
+0x8FDBBE 0x8789
+0x8FDBBF 0x878B
+0x8FDBC0 0x878C
+0x8FDBC1 0x8790
+0x8FDBC2 0x8793
+0x8FDBC3 0x8795
+0x8FDBC4 0x8797
+0x8FDBC5 0x8798
+0x8FDBC6 0x8799
+0x8FDBC7 0x879E
+0x8FDBC8 0x87A0
+0x8FDBC9 0x87A3
+0x8FDBCA 0x87A7
+0x8FDBCB 0x87AC
+0x8FDBCC 0x87AD
+0x8FDBCD 0x87AE
+0x8FDBCE 0x87B1
+0x8FDBCF 0x87B5
+0x8FDBD0 0x87BE
+0x8FDBD1 0x87BF
+0x8FDBD2 0x87C1
+0x8FDBD3 0x87C8
+0x8FDBD4 0x87C9
+0x8FDBD5 0x87CA
+0x8FDBD6 0x87CE
+0x8FDBD7 0x87D5
+0x8FDBD8 0x87D6
+0x8FDBD9 0x87D9
+0x8FDBDA 0x87DA
+0x8FDBDB 0x87DC
+0x8FDBDC 0x87DF
+0x8FDBDD 0x87E2
+0x8FDBDE 0x87E3
+0x8FDBDF 0x87E4
+0x8FDBE0 0x87EA
+0x8FDBE1 0x87EB
+0x8FDBE2 0x87ED
+0x8FDBE3 0x87F1
+0x8FDBE4 0x87F3
+0x8FDBE5 0x87F8
+0x8FDBE6 0x87FA
+0x8FDBE7 0x87FF
+0x8FDBE8 0x8801
+0x8FDBE9 0x8803
+0x8FDBEA 0x8806
+0x8FDBEB 0x8809
+0x8FDBEC 0x880A
+0x8FDBED 0x880B
+0x8FDBEE 0x8810
+0x8FDBEF 0x8819
+0x8FDBF0 0x8812
+0x8FDBF1 0x8813
+0x8FDBF2 0x8814
+0x8FDBF3 0x8818
+0x8FDBF4 0x881A
+0x8FDBF5 0x881B
+0x8FDBF6 0x881C
+0x8FDBF7 0x881E
+0x8FDBF8 0x881F
+0x8FDBF9 0x8828
+0x8FDBFA 0x882D
+0x8FDBFB 0x882E
+0x8FDBFC 0x8830
+0x8FDBFD 0x8832
+0x8FDBFE 0x8835
+0x8FDCA1 0x883A
+0x8FDCA2 0x883C
+0x8FDCA3 0x8841
+0x8FDCA4 0x8843
+0x8FDCA5 0x8845
+0x8FDCA6 0x8848
+0x8FDCA7 0x8849
+0x8FDCA8 0x884A
+0x8FDCA9 0x884B
+0x8FDCAA 0x884E
+0x8FDCAB 0x8851
+0x8FDCAC 0x8855
+0x8FDCAD 0x8856
+0x8FDCAE 0x8858
+0x8FDCAF 0x885A
+0x8FDCB0 0x885C
+0x8FDCB1 0x885F
+0x8FDCB2 0x8860
+0x8FDCB3 0x8864
+0x8FDCB4 0x8869
+0x8FDCB5 0x8871
+0x8FDCB6 0x8879
+0x8FDCB7 0x887B
+0x8FDCB8 0x8880
+0x8FDCB9 0x8898
+0x8FDCBA 0x889A
+0x8FDCBB 0x889B
+0x8FDCBC 0x889C
+0x8FDCBD 0x889F
+0x8FDCBE 0x88A0
+0x8FDCBF 0x88A8
+0x8FDCC0 0x88AA
+0x8FDCC1 0x88BA
+0x8FDCC2 0x88BD
+0x8FDCC3 0x88BE
+0x8FDCC4 0x88C0
+0x8FDCC5 0x88CA
+0x8FDCC6 0x88CB
+0x8FDCC7 0x88CC
+0x8FDCC8 0x88CD
+0x8FDCC9 0x88CE
+0x8FDCCA 0x88D1
+0x8FDCCB 0x88D2
+0x8FDCCC 0x88D3
+0x8FDCCD 0x88DB
+0x8FDCCE 0x88DE
+0x8FDCCF 0x88E7
+0x8FDCD0 0x88EF
+0x8FDCD1 0x88F0
+0x8FDCD2 0x88F1
+0x8FDCD3 0x88F5
+0x8FDCD4 0x88F7
+0x8FDCD5 0x8901
+0x8FDCD6 0x8906
+0x8FDCD7 0x890D
+0x8FDCD8 0x890E
+0x8FDCD9 0x890F
+0x8FDCDA 0x8915
+0x8FDCDB 0x8916
+0x8FDCDC 0x8918
+0x8FDCDD 0x8919
+0x8FDCDE 0x891A
+0x8FDCDF 0x891C
+0x8FDCE0 0x8920
+0x8FDCE1 0x8926
+0x8FDCE2 0x8927
+0x8FDCE3 0x8928
+0x8FDCE4 0x8930
+0x8FDCE5 0x8931
+0x8FDCE6 0x8932
+0x8FDCE7 0x8935
+0x8FDCE8 0x8939
+0x8FDCE9 0x893A
+0x8FDCEA 0x893E
+0x8FDCEB 0x8940
+0x8FDCEC 0x8942
+0x8FDCED 0x8945
+0x8FDCEE 0x8946
+0x8FDCEF 0x8949
+0x8FDCF0 0x894F
+0x8FDCF1 0x8952
+0x8FDCF2 0x8957
+0x8FDCF3 0x895A
+0x8FDCF4 0x895B
+0x8FDCF5 0x895C
+0x8FDCF6 0x8961
+0x8FDCF7 0x8962
+0x8FDCF8 0x8963
+0x8FDCF9 0x896B
+0x8FDCFA 0x896E
+0x8FDCFB 0x8970
+0x8FDCFC 0x8973
+0x8FDCFD 0x8975
+0x8FDCFE 0x897A
+0x8FDDA1 0x897B
+0x8FDDA2 0x897C
+0x8FDDA3 0x897D
+0x8FDDA4 0x8989
+0x8FDDA5 0x898D
+0x8FDDA6 0x8990
+0x8FDDA7 0x8994
+0x8FDDA8 0x8995
+0x8FDDA9 0x899B
+0x8FDDAA 0x899C
+0x8FDDAB 0x899F
+0x8FDDAC 0x89A0
+0x8FDDAD 0x89A5
+0x8FDDAE 0x89B0
+0x8FDDAF 0x89B4
+0x8FDDB0 0x89B5
+0x8FDDB1 0x89B6
+0x8FDDB2 0x89B7
+0x8FDDB3 0x89BC
+0x8FDDB4 0x89D4
+0x8FDDB5 0x89D5
+0x8FDDB6 0x89D6
+0x8FDDB7 0x89D7
+0x8FDDB8 0x89D8
+0x8FDDB9 0x89E5
+0x8FDDBA 0x89E9
+0x8FDDBB 0x89EB
+0x8FDDBC 0x89ED
+0x8FDDBD 0x89F1
+0x8FDDBE 0x89F3
+0x8FDDBF 0x89F6
+0x8FDDC0 0x89F9
+0x8FDDC1 0x89FD
+0x8FDDC2 0x89FF
+0x8FDDC3 0x8A04
+0x8FDDC4 0x8A05
+0x8FDDC5 0x8A07
+0x8FDDC6 0x8A0F
+0x8FDDC7 0x8A11
+0x8FDDC8 0x8A12
+0x8FDDC9 0x8A14
+0x8FDDCA 0x8A15
+0x8FDDCB 0x8A1E
+0x8FDDCC 0x8A20
+0x8FDDCD 0x8A22
+0x8FDDCE 0x8A24
+0x8FDDCF 0x8A26
+0x8FDDD0 0x8A2B
+0x8FDDD1 0x8A2C
+0x8FDDD2 0x8A2F
+0x8FDDD3 0x8A35
+0x8FDDD4 0x8A37
+0x8FDDD5 0x8A3D
+0x8FDDD6 0x8A3E
+0x8FDDD7 0x8A40
+0x8FDDD8 0x8A43
+0x8FDDD9 0x8A45
+0x8FDDDA 0x8A47
+0x8FDDDB 0x8A49
+0x8FDDDC 0x8A4D
+0x8FDDDD 0x8A4E
+0x8FDDDE 0x8A53
+0x8FDDDF 0x8A56
+0x8FDDE0 0x8A57
+0x8FDDE1 0x8A58
+0x8FDDE2 0x8A5C
+0x8FDDE3 0x8A5D
+0x8FDDE4 0x8A61
+0x8FDDE5 0x8A65
+0x8FDDE6 0x8A67
+0x8FDDE7 0x8A75
+0x8FDDE8 0x8A76
+0x8FDDE9 0x8A77
+0x8FDDEA 0x8A79
+0x8FDDEB 0x8A7A
+0x8FDDEC 0x8A7B
+0x8FDDED 0x8A7E
+0x8FDDEE 0x8A7F
+0x8FDDEF 0x8A80
+0x8FDDF0 0x8A83
+0x8FDDF1 0x8A86
+0x8FDDF2 0x8A8B
+0x8FDDF3 0x8A8F
+0x8FDDF4 0x8A90
+0x8FDDF5 0x8A92
+0x8FDDF6 0x8A96
+0x8FDDF7 0x8A97
+0x8FDDF8 0x8A99
+0x8FDDF9 0x8A9F
+0x8FDDFA 0x8AA7
+0x8FDDFB 0x8AA9
+0x8FDDFC 0x8AAE
+0x8FDDFD 0x8AAF
+0x8FDDFE 0x8AB3
+0x8FDEA1 0x8AB6
+0x8FDEA2 0x8AB7
+0x8FDEA3 0x8ABB
+0x8FDEA4 0x8ABE
+0x8FDEA5 0x8AC3
+0x8FDEA6 0x8AC6
+0x8FDEA7 0x8AC8
+0x8FDEA8 0x8AC9
+0x8FDEA9 0x8ACA
+0x8FDEAA 0x8AD1
+0x8FDEAB 0x8AD3
+0x8FDEAC 0x8AD4
+0x8FDEAD 0x8AD5
+0x8FDEAE 0x8AD7
+0x8FDEAF 0x8ADD
+0x8FDEB0 0x8ADF
+0x8FDEB1 0x8AEC
+0x8FDEB2 0x8AF0
+0x8FDEB3 0x8AF4
+0x8FDEB4 0x8AF5
+0x8FDEB5 0x8AF6
+0x8FDEB6 0x8AFC
+0x8FDEB7 0x8AFF
+0x8FDEB8 0x8B05
+0x8FDEB9 0x8B06
+0x8FDEBA 0x8B0B
+0x8FDEBB 0x8B11
+0x8FDEBC 0x8B1C
+0x8FDEBD 0x8B1E
+0x8FDEBE 0x8B1F
+0x8FDEBF 0x8B0A
+0x8FDEC0 0x8B2D
+0x8FDEC1 0x8B30
+0x8FDEC2 0x8B37
+0x8FDEC3 0x8B3C
+0x8FDEC4 0x8B42
+0x8FDEC5 0x8B43
+0x8FDEC6 0x8B44
+0x8FDEC7 0x8B45
+0x8FDEC8 0x8B46
+0x8FDEC9 0x8B48
+0x8FDECA 0x8B52
+0x8FDECB 0x8B53
+0x8FDECC 0x8B54
+0x8FDECD 0x8B59
+0x8FDECE 0x8B4D
+0x8FDECF 0x8B5E
+0x8FDED0 0x8B63
+0x8FDED1 0x8B6D
+0x8FDED2 0x8B76
+0x8FDED3 0x8B78
+0x8FDED4 0x8B79
+0x8FDED5 0x8B7C
+0x8FDED6 0x8B7E
+0x8FDED7 0x8B81
+0x8FDED8 0x8B84
+0x8FDED9 0x8B85
+0x8FDEDA 0x8B8B
+0x8FDEDB 0x8B8D
+0x8FDEDC 0x8B8F
+0x8FDEDD 0x8B94
+0x8FDEDE 0x8B95
+0x8FDEDF 0x8B9C
+0x8FDEE0 0x8B9E
+0x8FDEE1 0x8B9F
+0x8FDEE2 0x8C38
+0x8FDEE3 0x8C39
+0x8FDEE4 0x8C3D
+0x8FDEE5 0x8C3E
+0x8FDEE6 0x8C45
+0x8FDEE7 0x8C47
+0x8FDEE8 0x8C49
+0x8FDEE9 0x8C4B
+0x8FDEEA 0x8C4F
+0x8FDEEB 0x8C51
+0x8FDEEC 0x8C53
+0x8FDEED 0x8C54
+0x8FDEEE 0x8C57
+0x8FDEEF 0x8C58
+0x8FDEF0 0x8C5B
+0x8FDEF1 0x8C5D
+0x8FDEF2 0x8C59
+0x8FDEF3 0x8C63
+0x8FDEF4 0x8C64
+0x8FDEF5 0x8C66
+0x8FDEF6 0x8C68
+0x8FDEF7 0x8C69
+0x8FDEF8 0x8C6D
+0x8FDEF9 0x8C73
+0x8FDEFA 0x8C75
+0x8FDEFB 0x8C76
+0x8FDEFC 0x8C7B
+0x8FDEFD 0x8C7E
+0x8FDEFE 0x8C86
+0x8FDFA1 0x8C87
+0x8FDFA2 0x8C8B
+0x8FDFA3 0x8C90
+0x8FDFA4 0x8C92
+0x8FDFA5 0x8C93
+0x8FDFA6 0x8C99
+0x8FDFA7 0x8C9B
+0x8FDFA8 0x8C9C
+0x8FDFA9 0x8CA4
+0x8FDFAA 0x8CB9
+0x8FDFAB 0x8CBA
+0x8FDFAC 0x8CC5
+0x8FDFAD 0x8CC6
+0x8FDFAE 0x8CC9
+0x8FDFAF 0x8CCB
+0x8FDFB0 0x8CCF
+0x8FDFB1 0x8CD6
+0x8FDFB2 0x8CD5
+0x8FDFB3 0x8CD9
+0x8FDFB4 0x8CDD
+0x8FDFB5 0x8CE1
+0x8FDFB6 0x8CE8
+0x8FDFB7 0x8CEC
+0x8FDFB8 0x8CEF
+0x8FDFB9 0x8CF0
+0x8FDFBA 0x8CF2
+0x8FDFBB 0x8CF5
+0x8FDFBC 0x8CF7
+0x8FDFBD 0x8CF8
+0x8FDFBE 0x8CFE
+0x8FDFBF 0x8CFF
+0x8FDFC0 0x8D01
+0x8FDFC1 0x8D03
+0x8FDFC2 0x8D09
+0x8FDFC3 0x8D12
+0x8FDFC4 0x8D17
+0x8FDFC5 0x8D1B
+0x8FDFC6 0x8D65
+0x8FDFC7 0x8D69
+0x8FDFC8 0x8D6C
+0x8FDFC9 0x8D6E
+0x8FDFCA 0x8D7F
+0x8FDFCB 0x8D82
+0x8FDFCC 0x8D84
+0x8FDFCD 0x8D88
+0x8FDFCE 0x8D8D
+0x8FDFCF 0x8D90
+0x8FDFD0 0x8D91
+0x8FDFD1 0x8D95
+0x8FDFD2 0x8D9E
+0x8FDFD3 0x8D9F
+0x8FDFD4 0x8DA0
+0x8FDFD5 0x8DA6
+0x8FDFD6 0x8DAB
+0x8FDFD7 0x8DAC
+0x8FDFD8 0x8DAF
+0x8FDFD9 0x8DB2
+0x8FDFDA 0x8DB5
+0x8FDFDB 0x8DB7
+0x8FDFDC 0x8DB9
+0x8FDFDD 0x8DBB
+0x8FDFDE 0x8DC0
+0x8FDFDF 0x8DC5
+0x8FDFE0 0x8DC6
+0x8FDFE1 0x8DC7
+0x8FDFE2 0x8DC8
+0x8FDFE3 0x8DCA
+0x8FDFE4 0x8DCE
+0x8FDFE5 0x8DD1
+0x8FDFE6 0x8DD4
+0x8FDFE7 0x8DD5
+0x8FDFE8 0x8DD7
+0x8FDFE9 0x8DD9
+0x8FDFEA 0x8DE4
+0x8FDFEB 0x8DE5
+0x8FDFEC 0x8DE7
+0x8FDFED 0x8DEC
+0x8FDFEE 0x8DF0
+0x8FDFEF 0x8DBC
+0x8FDFF0 0x8DF1
+0x8FDFF1 0x8DF2
+0x8FDFF2 0x8DF4
+0x8FDFF3 0x8DFD
+0x8FDFF4 0x8E01
+0x8FDFF5 0x8E04
+0x8FDFF6 0x8E05
+0x8FDFF7 0x8E06
+0x8FDFF8 0x8E0B
+0x8FDFF9 0x8E11
+0x8FDFFA 0x8E14
+0x8FDFFB 0x8E16
+0x8FDFFC 0x8E20
+0x8FDFFD 0x8E21
+0x8FDFFE 0x8E22
+0x8FE0A1 0x8E23
+0x8FE0A2 0x8E26
+0x8FE0A3 0x8E27
+0x8FE0A4 0x8E31
+0x8FE0A5 0x8E33
+0x8FE0A6 0x8E36
+0x8FE0A7 0x8E37
+0x8FE0A8 0x8E38
+0x8FE0A9 0x8E39
+0x8FE0AA 0x8E3D
+0x8FE0AB 0x8E40
+0x8FE0AC 0x8E41
+0x8FE0AD 0x8E4B
+0x8FE0AE 0x8E4D
+0x8FE0AF 0x8E4E
+0x8FE0B0 0x8E4F
+0x8FE0B1 0x8E54
+0x8FE0B2 0x8E5B
+0x8FE0B3 0x8E5C
+0x8FE0B4 0x8E5D
+0x8FE0B5 0x8E5E
+0x8FE0B6 0x8E61
+0x8FE0B7 0x8E62
+0x8FE0B8 0x8E69
+0x8FE0B9 0x8E6C
+0x8FE0BA 0x8E6D
+0x8FE0BB 0x8E6F
+0x8FE0BC 0x8E70
+0x8FE0BD 0x8E71
+0x8FE0BE 0x8E79
+0x8FE0BF 0x8E7A
+0x8FE0C0 0x8E7B
+0x8FE0C1 0x8E82
+0x8FE0C2 0x8E83
+0x8FE0C3 0x8E89
+0x8FE0C4 0x8E90
+0x8FE0C5 0x8E92
+0x8FE0C6 0x8E95
+0x8FE0C7 0x8E9A
+0x8FE0C8 0x8E9B
+0x8FE0C9 0x8E9D
+0x8FE0CA 0x8E9E
+0x8FE0CB 0x8EA2
+0x8FE0CC 0x8EA7
+0x8FE0CD 0x8EA9
+0x8FE0CE 0x8EAD
+0x8FE0CF 0x8EAE
+0x8FE0D0 0x8EB3
+0x8FE0D1 0x8EB5
+0x8FE0D2 0x8EBA
+0x8FE0D3 0x8EBB
+0x8FE0D4 0x8EC0
+0x8FE0D5 0x8EC1
+0x8FE0D6 0x8EC3
+0x8FE0D7 0x8EC4
+0x8FE0D8 0x8EC7
+0x8FE0D9 0x8ECF
+0x8FE0DA 0x8ED1
+0x8FE0DB 0x8ED4
+0x8FE0DC 0x8EDC
+0x8FE0DD 0x8EE8
+0x8FE0DE 0x8EEE
+0x8FE0DF 0x8EF0
+0x8FE0E0 0x8EF1
+0x8FE0E1 0x8EF7
+0x8FE0E2 0x8EF9
+0x8FE0E3 0x8EFA
+0x8FE0E4 0x8EED
+0x8FE0E5 0x8F00
+0x8FE0E6 0x8F02
+0x8FE0E7 0x8F07
+0x8FE0E8 0x8F08
+0x8FE0E9 0x8F0F
+0x8FE0EA 0x8F10
+0x8FE0EB 0x8F16
+0x8FE0EC 0x8F17
+0x8FE0ED 0x8F18
+0x8FE0EE 0x8F1E
+0x8FE0EF 0x8F20
+0x8FE0F0 0x8F21
+0x8FE0F1 0x8F23
+0x8FE0F2 0x8F25
+0x8FE0F3 0x8F27
+0x8FE0F4 0x8F28
+0x8FE0F5 0x8F2C
+0x8FE0F6 0x8F2D
+0x8FE0F7 0x8F2E
+0x8FE0F8 0x8F34
+0x8FE0F9 0x8F35
+0x8FE0FA 0x8F36
+0x8FE0FB 0x8F37
+0x8FE0FC 0x8F3A
+0x8FE0FD 0x8F40
+0x8FE0FE 0x8F41
+0x8FE1A1 0x8F43
+0x8FE1A2 0x8F47
+0x8FE1A3 0x8F4F
+0x8FE1A4 0x8F51
+0x8FE1A5 0x8F52
+0x8FE1A6 0x8F53
+0x8FE1A7 0x8F54
+0x8FE1A8 0x8F55
+0x8FE1A9 0x8F58
+0x8FE1AA 0x8F5D
+0x8FE1AB 0x8F5E
+0x8FE1AC 0x8F65
+0x8FE1AD 0x8F9D
+0x8FE1AE 0x8FA0
+0x8FE1AF 0x8FA1
+0x8FE1B0 0x8FA4
+0x8FE1B1 0x8FA5
+0x8FE1B2 0x8FA6
+0x8FE1B3 0x8FB5
+0x8FE1B4 0x8FB6
+0x8FE1B5 0x8FB8
+0x8FE1B6 0x8FBE
+0x8FE1B7 0x8FC0
+0x8FE1B8 0x8FC1
+0x8FE1B9 0x8FC6
+0x8FE1BA 0x8FCA
+0x8FE1BB 0x8FCB
+0x8FE1BC 0x8FCD
+0x8FE1BD 0x8FD0
+0x8FE1BE 0x8FD2
+0x8FE1BF 0x8FD3
+0x8FE1C0 0x8FD5
+0x8FE1C1 0x8FE0
+0x8FE1C2 0x8FE3
+0x8FE1C3 0x8FE4
+0x8FE1C4 0x8FE8
+0x8FE1C5 0x8FEE
+0x8FE1C6 0x8FF1
+0x8FE1C7 0x8FF5
+0x8FE1C8 0x8FF6
+0x8FE1C9 0x8FFB
+0x8FE1CA 0x8FFE
+0x8FE1CB 0x9002
+0x8FE1CC 0x9004
+0x8FE1CD 0x9008
+0x8FE1CE 0x900C
+0x8FE1CF 0x9018
+0x8FE1D0 0x901B
+0x8FE1D1 0x9028
+0x8FE1D2 0x9029
+0x8FE1D3 0x902F
+0x8FE1D4 0x902A
+0x8FE1D5 0x902C
+0x8FE1D6 0x902D
+0x8FE1D7 0x9033
+0x8FE1D8 0x9034
+0x8FE1D9 0x9037
+0x8FE1DA 0x903F
+0x8FE1DB 0x9043
+0x8FE1DC 0x9044
+0x8FE1DD 0x904C
+0x8FE1DE 0x905B
+0x8FE1DF 0x905D
+0x8FE1E0 0x9062
+0x8FE1E1 0x9066
+0x8FE1E2 0x9067
+0x8FE1E3 0x906C
+0x8FE1E4 0x9070
+0x8FE1E5 0x9074
+0x8FE1E6 0x9079
+0x8FE1E7 0x9085
+0x8FE1E8 0x9088
+0x8FE1E9 0x908B
+0x8FE1EA 0x908C
+0x8FE1EB 0x908E
+0x8FE1EC 0x9090
+0x8FE1ED 0x9095
+0x8FE1EE 0x9097
+0x8FE1EF 0x9098
+0x8FE1F0 0x9099
+0x8FE1F1 0x909B
+0x8FE1F2 0x90A0
+0x8FE1F3 0x90A1
+0x8FE1F4 0x90A2
+0x8FE1F5 0x90A5
+0x8FE1F6 0x90B0
+0x8FE1F7 0x90B2
+0x8FE1F8 0x90B3
+0x8FE1F9 0x90B4
+0x8FE1FA 0x90B6
+0x8FE1FB 0x90BD
+0x8FE1FC 0x90CC
+0x8FE1FD 0x90BE
+0x8FE1FE 0x90C3
+0x8FE2A1 0x90C4
+0x8FE2A2 0x90C5
+0x8FE2A3 0x90C7
+0x8FE2A4 0x90C8
+0x8FE2A5 0x90D5
+0x8FE2A6 0x90D7
+0x8FE2A7 0x90D8
+0x8FE2A8 0x90D9
+0x8FE2A9 0x90DC
+0x8FE2AA 0x90DD
+0x8FE2AB 0x90DF
+0x8FE2AC 0x90E5
+0x8FE2AD 0x90D2
+0x8FE2AE 0x90F6
+0x8FE2AF 0x90EB
+0x8FE2B0 0x90EF
+0x8FE2B1 0x90F0
+0x8FE2B2 0x90F4
+0x8FE2B3 0x90FE
+0x8FE2B4 0x90FF
+0x8FE2B5 0x9100
+0x8FE2B6 0x9104
+0x8FE2B7 0x9105
+0x8FE2B8 0x9106
+0x8FE2B9 0x9108
+0x8FE2BA 0x910D
+0x8FE2BB 0x9110
+0x8FE2BC 0x9114
+0x8FE2BD 0x9116
+0x8FE2BE 0x9117
+0x8FE2BF 0x9118
+0x8FE2C0 0x911A
+0x8FE2C1 0x911C
+0x8FE2C2 0x911E
+0x8FE2C3 0x9120
+0x8FE2C4 0x9125
+0x8FE2C5 0x9122
+0x8FE2C6 0x9123
+0x8FE2C7 0x9127
+0x8FE2C8 0x9129
+0x8FE2C9 0x912E
+0x8FE2CA 0x912F
+0x8FE2CB 0x9131
+0x8FE2CC 0x9134
+0x8FE2CD 0x9136
+0x8FE2CE 0x9137
+0x8FE2CF 0x9139
+0x8FE2D0 0x913A
+0x8FE2D1 0x913C
+0x8FE2D2 0x913D
+0x8FE2D3 0x9143
+0x8FE2D4 0x9147
+0x8FE2D5 0x9148
+0x8FE2D6 0x914F
+0x8FE2D7 0x9153
+0x8FE2D8 0x9157
+0x8FE2D9 0x9159
+0x8FE2DA 0x915A
+0x8FE2DB 0x915B
+0x8FE2DC 0x9161
+0x8FE2DD 0x9164
+0x8FE2DE 0x9167
+0x8FE2DF 0x916D
+0x8FE2E0 0x9174
+0x8FE2E1 0x9179
+0x8FE2E2 0x917A
+0x8FE2E3 0x917B
+0x8FE2E4 0x9181
+0x8FE2E5 0x9183
+0x8FE2E6 0x9185
+0x8FE2E7 0x9186
+0x8FE2E8 0x918A
+0x8FE2E9 0x918E
+0x8FE2EA 0x9191
+0x8FE2EB 0x9193
+0x8FE2EC 0x9194
+0x8FE2ED 0x9195
+0x8FE2EE 0x9198
+0x8FE2EF 0x919E
+0x8FE2F0 0x91A1
+0x8FE2F1 0x91A6
+0x8FE2F2 0x91A8
+0x8FE2F3 0x91AC
+0x8FE2F4 0x91AD
+0x8FE2F5 0x91AE
+0x8FE2F6 0x91B0
+0x8FE2F7 0x91B1
+0x8FE2F8 0x91B2
+0x8FE2F9 0x91B3
+0x8FE2FA 0x91B6
+0x8FE2FB 0x91BB
+0x8FE2FC 0x91BC
+0x8FE2FD 0x91BD
+0x8FE2FE 0x91BF
+0x8FE3A1 0x91C2
+0x8FE3A2 0x91C3
+0x8FE3A3 0x91C5
+0x8FE3A4 0x91D3
+0x8FE3A5 0x91D4
+0x8FE3A6 0x91D7
+0x8FE3A7 0x91D9
+0x8FE3A8 0x91DA
+0x8FE3A9 0x91DE
+0x8FE3AA 0x91E4
+0x8FE3AB 0x91E5
+0x8FE3AC 0x91E9
+0x8FE3AD 0x91EA
+0x8FE3AE 0x91EC
+0x8FE3AF 0x91ED
+0x8FE3B0 0x91EE
+0x8FE3B1 0x91EF
+0x8FE3B2 0x91F0
+0x8FE3B3 0x91F1
+0x8FE3B4 0x91F7
+0x8FE3B5 0x91F9
+0x8FE3B6 0x91FB
+0x8FE3B7 0x91FD
+0x8FE3B8 0x9200
+0x8FE3B9 0x9201
+0x8FE3BA 0x9204
+0x8FE3BB 0x9205
+0x8FE3BC 0x9206
+0x8FE3BD 0x9207
+0x8FE3BE 0x9209
+0x8FE3BF 0x920A
+0x8FE3C0 0x920C
+0x8FE3C1 0x9210
+0x8FE3C2 0x9212
+0x8FE3C3 0x9213
+0x8FE3C4 0x9216
+0x8FE3C5 0x9218
+0x8FE3C6 0x921C
+0x8FE3C7 0x921D
+0x8FE3C8 0x9223
+0x8FE3C9 0x9224
+0x8FE3CA 0x9225
+0x8FE3CB 0x9226
+0x8FE3CC 0x9228
+0x8FE3CD 0x922E
+0x8FE3CE 0x922F
+0x8FE3CF 0x9230
+0x8FE3D0 0x9233
+0x8FE3D1 0x9235
+0x8FE3D2 0x9236
+0x8FE3D3 0x9238
+0x8FE3D4 0x9239
+0x8FE3D5 0x923A
+0x8FE3D6 0x923C
+0x8FE3D7 0x923E
+0x8FE3D8 0x9240
+0x8FE3D9 0x9242
+0x8FE3DA 0x9243
+0x8FE3DB 0x9246
+0x8FE3DC 0x9247
+0x8FE3DD 0x924A
+0x8FE3DE 0x924D
+0x8FE3DF 0x924E
+0x8FE3E0 0x924F
+0x8FE3E1 0x9251
+0x8FE3E2 0x9258
+0x8FE3E3 0x9259
+0x8FE3E4 0x925C
+0x8FE3E5 0x925D
+0x8FE3E6 0x9260
+0x8FE3E7 0x9261
+0x8FE3E8 0x9265
+0x8FE3E9 0x9267
+0x8FE3EA 0x9268
+0x8FE3EB 0x9269
+0x8FE3EC 0x926E
+0x8FE3ED 0x926F
+0x8FE3EE 0x9270
+0x8FE3EF 0x9275
+0x8FE3F0 0x9276
+0x8FE3F1 0x9277
+0x8FE3F2 0x9278
+0x8FE3F3 0x9279
+0x8FE3F4 0x927B
+0x8FE3F5 0x927C
+0x8FE3F6 0x927D
+0x8FE3F7 0x927F
+0x8FE3F8 0x9288
+0x8FE3F9 0x9289
+0x8FE3FA 0x928A
+0x8FE3FB 0x928D
+0x8FE3FC 0x928E
+0x8FE3FD 0x9292
+0x8FE3FE 0x9297
+0x8FE4A1 0x9299
+0x8FE4A2 0x929F
+0x8FE4A3 0x92A0
+0x8FE4A4 0x92A4
+0x8FE4A5 0x92A5
+0x8FE4A6 0x92A7
+0x8FE4A7 0x92A8
+0x8FE4A8 0x92AB
+0x8FE4A9 0x92AF
+0x8FE4AA 0x92B2
+0x8FE4AB 0x92B6
+0x8FE4AC 0x92B8
+0x8FE4AD 0x92BA
+0x8FE4AE 0x92BB
+0x8FE4AF 0x92BC
+0x8FE4B0 0x92BD
+0x8FE4B1 0x92BF
+0x8FE4B2 0x92C0
+0x8FE4B3 0x92C1
+0x8FE4B4 0x92C2
+0x8FE4B5 0x92C3
+0x8FE4B6 0x92C5
+0x8FE4B7 0x92C6
+0x8FE4B8 0x92C7
+0x8FE4B9 0x92C8
+0x8FE4BA 0x92CB
+0x8FE4BB 0x92CC
+0x8FE4BC 0x92CD
+0x8FE4BD 0x92CE
+0x8FE4BE 0x92D0
+0x8FE4BF 0x92D3
+0x8FE4C0 0x92D5
+0x8FE4C1 0x92D7
+0x8FE4C2 0x92D8
+0x8FE4C3 0x92D9
+0x8FE4C4 0x92DC
+0x8FE4C5 0x92DD
+0x8FE4C6 0x92DF
+0x8FE4C7 0x92E0
+0x8FE4C8 0x92E1
+0x8FE4C9 0x92E3
+0x8FE4CA 0x92E5
+0x8FE4CB 0x92E7
+0x8FE4CC 0x92E8
+0x8FE4CD 0x92EC
+0x8FE4CE 0x92EE
+0x8FE4CF 0x92F0
+0x8FE4D0 0x92F9
+0x8FE4D1 0x92FB
+0x8FE4D2 0x92FF
+0x8FE4D3 0x9300
+0x8FE4D4 0x9302
+0x8FE4D5 0x9308
+0x8FE4D6 0x930D
+0x8FE4D7 0x9311
+0x8FE4D8 0x9314
+0x8FE4D9 0x9315
+0x8FE4DA 0x931C
+0x8FE4DB 0x931D
+0x8FE4DC 0x931E
+0x8FE4DD 0x931F
+0x8FE4DE 0x9321
+0x8FE4DF 0x9324
+0x8FE4E0 0x9325
+0x8FE4E1 0x9327
+0x8FE4E2 0x9329
+0x8FE4E3 0x932A
+0x8FE4E4 0x9333
+0x8FE4E5 0x9334
+0x8FE4E6 0x9336
+0x8FE4E7 0x9337
+0x8FE4E8 0x9347
+0x8FE4E9 0x9348
+0x8FE4EA 0x9349
+0x8FE4EB 0x9350
+0x8FE4EC 0x9351
+0x8FE4ED 0x9352
+0x8FE4EE 0x9355
+0x8FE4EF 0x9357
+0x8FE4F0 0x9358
+0x8FE4F1 0x935A
+0x8FE4F2 0x935E
+0x8FE4F3 0x9364
+0x8FE4F4 0x9365
+0x8FE4F5 0x9367
+0x8FE4F6 0x9369
+0x8FE4F7 0x936A
+0x8FE4F8 0x936D
+0x8FE4F9 0x936F
+0x8FE4FA 0x9370
+0x8FE4FB 0x9371
+0x8FE4FC 0x9373
+0x8FE4FD 0x9374
+0x8FE4FE 0x9376
+0x8FE5A1 0x937A
+0x8FE5A2 0x937D
+0x8FE5A3 0x937F
+0x8FE5A4 0x9380
+0x8FE5A5 0x9381
+0x8FE5A6 0x9382
+0x8FE5A7 0x9388
+0x8FE5A8 0x938A
+0x8FE5A9 0x938B
+0x8FE5AA 0x938D
+0x8FE5AB 0x938F
+0x8FE5AC 0x9392
+0x8FE5AD 0x9395
+0x8FE5AE 0x9398
+0x8FE5AF 0x939B
+0x8FE5B0 0x939E
+0x8FE5B1 0x93A1
+0x8FE5B2 0x93A3
+0x8FE5B3 0x93A4
+0x8FE5B4 0x93A6
+0x8FE5B5 0x93A8
+0x8FE5B6 0x93AB
+0x8FE5B7 0x93B4
+0x8FE5B8 0x93B5
+0x8FE5B9 0x93B6
+0x8FE5BA 0x93BA
+0x8FE5BB 0x93A9
+0x8FE5BC 0x93C1
+0x8FE5BD 0x93C4
+0x8FE5BE 0x93C5
+0x8FE5BF 0x93C6
+0x8FE5C0 0x93C7
+0x8FE5C1 0x93C9
+0x8FE5C2 0x93CA
+0x8FE5C3 0x93CB
+0x8FE5C4 0x93CC
+0x8FE5C5 0x93CD
+0x8FE5C6 0x93D3
+0x8FE5C7 0x93D9
+0x8FE5C8 0x93DC
+0x8FE5C9 0x93DE
+0x8FE5CA 0x93DF
+0x8FE5CB 0x93E2
+0x8FE5CC 0x93E6
+0x8FE5CD 0x93E7
+0x8FE5CE 0x93F9
+0x8FE5CF 0x93F7
+0x8FE5D0 0x93F8
+0x8FE5D1 0x93FA
+0x8FE5D2 0x93FB
+0x8FE5D3 0x93FD
+0x8FE5D4 0x9401
+0x8FE5D5 0x9402
+0x8FE5D6 0x9404
+0x8FE5D7 0x9408
+0x8FE5D8 0x9409
+0x8FE5D9 0x940D
+0x8FE5DA 0x940E
+0x8FE5DB 0x940F
+0x8FE5DC 0x9415
+0x8FE5DD 0x9416
+0x8FE5DE 0x9417
+0x8FE5DF 0x941F
+0x8FE5E0 0x942E
+0x8FE5E1 0x942F
+0x8FE5E2 0x9431
+0x8FE5E3 0x9432
+0x8FE5E4 0x9433
+0x8FE5E5 0x9434
+0x8FE5E6 0x943B
+0x8FE5E7 0x943F
+0x8FE5E8 0x943D
+0x8FE5E9 0x9443
+0x8FE5EA 0x9445
+0x8FE5EB 0x9448
+0x8FE5EC 0x944A
+0x8FE5ED 0x944C
+0x8FE5EE 0x9455
+0x8FE5EF 0x9459
+0x8FE5F0 0x945C
+0x8FE5F1 0x945F
+0x8FE5F2 0x9461
+0x8FE5F3 0x9463
+0x8FE5F4 0x9468
+0x8FE5F5 0x946B
+0x8FE5F6 0x946D
+0x8FE5F7 0x946E
+0x8FE5F8 0x946F
+0x8FE5F9 0x9471
+0x8FE5FA 0x9472
+0x8FE5FB 0x9484
+0x8FE5FC 0x9483
+0x8FE5FD 0x9578
+0x8FE5FE 0x9579
+0x8FE6A1 0x957E
+0x8FE6A2 0x9584
+0x8FE6A3 0x9588
+0x8FE6A4 0x958C
+0x8FE6A5 0x958D
+0x8FE6A6 0x958E
+0x8FE6A7 0x959D
+0x8FE6A8 0x959E
+0x8FE6A9 0x959F
+0x8FE6AA 0x95A1
+0x8FE6AB 0x95A6
+0x8FE6AC 0x95A9
+0x8FE6AD 0x95AB
+0x8FE6AE 0x95AC
+0x8FE6AF 0x95B4
+0x8FE6B0 0x95B6
+0x8FE6B1 0x95BA
+0x8FE6B2 0x95BD
+0x8FE6B3 0x95BF
+0x8FE6B4 0x95C6
+0x8FE6B5 0x95C8
+0x8FE6B6 0x95C9
+0x8FE6B7 0x95CB
+0x8FE6B8 0x95D0
+0x8FE6B9 0x95D1
+0x8FE6BA 0x95D2
+0x8FE6BB 0x95D3
+0x8FE6BC 0x95D9
+0x8FE6BD 0x95DA
+0x8FE6BE 0x95DD
+0x8FE6BF 0x95DE
+0x8FE6C0 0x95DF
+0x8FE6C1 0x95E0
+0x8FE6C2 0x95E4
+0x8FE6C3 0x95E6
+0x8FE6C4 0x961D
+0x8FE6C5 0x961E
+0x8FE6C6 0x9622
+0x8FE6C7 0x9624
+0x8FE6C8 0x9625
+0x8FE6C9 0x9626
+0x8FE6CA 0x962C
+0x8FE6CB 0x9631
+0x8FE6CC 0x9633
+0x8FE6CD 0x9637
+0x8FE6CE 0x9638
+0x8FE6CF 0x9639
+0x8FE6D0 0x963A
+0x8FE6D1 0x963C
+0x8FE6D2 0x963D
+0x8FE6D3 0x9641
+0x8FE6D4 0x9652
+0x8FE6D5 0x9654
+0x8FE6D6 0x9656
+0x8FE6D7 0x9657
+0x8FE6D8 0x9658
+0x8FE6D9 0x9661
+0x8FE6DA 0x966E
+0x8FE6DB 0x9674
+0x8FE6DC 0x967B
+0x8FE6DD 0x967C
+0x8FE6DE 0x967E
+0x8FE6DF 0x967F
+0x8FE6E0 0x9681
+0x8FE6E1 0x9682
+0x8FE6E2 0x9683
+0x8FE6E3 0x9684
+0x8FE6E4 0x9689
+0x8FE6E5 0x9691
+0x8FE6E6 0x9696
+0x8FE6E7 0x969A
+0x8FE6E8 0x969D
+0x8FE6E9 0x969F
+0x8FE6EA 0x96A4
+0x8FE6EB 0x96A5
+0x8FE6EC 0x96A6
+0x8FE6ED 0x96A9
+0x8FE6EE 0x96AE
+0x8FE6EF 0x96AF
+0x8FE6F0 0x96B3
+0x8FE6F1 0x96BA
+0x8FE6F2 0x96CA
+0x8FE6F3 0x96D2
+0x8FE6F4 0x5DB2
+0x8FE6F5 0x96D8
+0x8FE6F6 0x96DA
+0x8FE6F7 0x96DD
+0x8FE6F8 0x96DE
+0x8FE6F9 0x96DF
+0x8FE6FA 0x96E9
+0x8FE6FB 0x96EF
+0x8FE6FC 0x96F1
+0x8FE6FD 0x96FA
+0x8FE6FE 0x9702
+0x8FE7A1 0x9703
+0x8FE7A2 0x9705
+0x8FE7A3 0x9709
+0x8FE7A4 0x971A
+0x8FE7A5 0x971B
+0x8FE7A6 0x971D
+0x8FE7A7 0x9721
+0x8FE7A8 0x9722
+0x8FE7A9 0x9723
+0x8FE7AA 0x9728
+0x8FE7AB 0x9731
+0x8FE7AC 0x9733
+0x8FE7AD 0x9741
+0x8FE7AE 0x9743
+0x8FE7AF 0x974A
+0x8FE7B0 0x974E
+0x8FE7B1 0x974F
+0x8FE7B2 0x9755
+0x8FE7B3 0x9757
+0x8FE7B4 0x9758
+0x8FE7B5 0x975A
+0x8FE7B6 0x975B
+0x8FE7B7 0x9763
+0x8FE7B8 0x9767
+0x8FE7B9 0x976A
+0x8FE7BA 0x976E
+0x8FE7BB 0x9773
+0x8FE7BC 0x9776
+0x8FE7BD 0x9777
+0x8FE7BE 0x9778
+0x8FE7BF 0x977B
+0x8FE7C0 0x977D
+0x8FE7C1 0x977F
+0x8FE7C2 0x9780
+0x8FE7C3 0x9789
+0x8FE7C4 0x9795
+0x8FE7C5 0x9796
+0x8FE7C6 0x9797
+0x8FE7C7 0x9799
+0x8FE7C8 0x979A
+0x8FE7C9 0x979E
+0x8FE7CA 0x979F
+0x8FE7CB 0x97A2
+0x8FE7CC 0x97AC
+0x8FE7CD 0x97AE
+0x8FE7CE 0x97B1
+0x8FE7CF 0x97B2
+0x8FE7D0 0x97B5
+0x8FE7D1 0x97B6
+0x8FE7D2 0x97B8
+0x8FE7D3 0x97B9
+0x8FE7D4 0x97BA
+0x8FE7D5 0x97BC
+0x8FE7D6 0x97BE
+0x8FE7D7 0x97BF
+0x8FE7D8 0x97C1
+0x8FE7D9 0x97C4
+0x8FE7DA 0x97C5
+0x8FE7DB 0x97C7
+0x8FE7DC 0x97C9
+0x8FE7DD 0x97CA
+0x8FE7DE 0x97CC
+0x8FE7DF 0x97CD
+0x8FE7E0 0x97CE
+0x8FE7E1 0x97D0
+0x8FE7E2 0x97D1
+0x8FE7E3 0x97D4
+0x8FE7E4 0x97D7
+0x8FE7E5 0x97D8
+0x8FE7E6 0x97D9
+0x8FE7E7 0x97DD
+0x8FE7E8 0x97DE
+0x8FE7E9 0x97E0
+0x8FE7EA 0x97DB
+0x8FE7EB 0x97E1
+0x8FE7EC 0x97E4
+0x8FE7ED 0x97EF
+0x8FE7EE 0x97F1
+0x8FE7EF 0x97F4
+0x8FE7F0 0x97F7
+0x8FE7F1 0x97F8
+0x8FE7F2 0x97FA
+0x8FE7F3 0x9807
+0x8FE7F4 0x980A
+0x8FE7F5 0x9819
+0x8FE7F6 0x980D
+0x8FE7F7 0x980E
+0x8FE7F8 0x9814
+0x8FE7F9 0x9816
+0x8FE7FA 0x981C
+0x8FE7FB 0x981E
+0x8FE7FC 0x9820
+0x8FE7FD 0x9823
+0x8FE7FE 0x9826
+0x8FE8A1 0x982B
+0x8FE8A2 0x982E
+0x8FE8A3 0x982F
+0x8FE8A4 0x9830
+0x8FE8A5 0x9832
+0x8FE8A6 0x9833
+0x8FE8A7 0x9835
+0x8FE8A8 0x9825
+0x8FE8A9 0x983E
+0x8FE8AA 0x9844
+0x8FE8AB 0x9847
+0x8FE8AC 0x984A
+0x8FE8AD 0x9851
+0x8FE8AE 0x9852
+0x8FE8AF 0x9853
+0x8FE8B0 0x9856
+0x8FE8B1 0x9857
+0x8FE8B2 0x9859
+0x8FE8B3 0x985A
+0x8FE8B4 0x9862
+0x8FE8B5 0x9863
+0x8FE8B6 0x9865
+0x8FE8B7 0x9866
+0x8FE8B8 0x986A
+0x8FE8B9 0x986C
+0x8FE8BA 0x98AB
+0x8FE8BB 0x98AD
+0x8FE8BC 0x98AE
+0x8FE8BD 0x98B0
+0x8FE8BE 0x98B4
+0x8FE8BF 0x98B7
+0x8FE8C0 0x98B8
+0x8FE8C1 0x98BA
+0x8FE8C2 0x98BB
+0x8FE8C3 0x98BF
+0x8FE8C4 0x98C2
+0x8FE8C5 0x98C5
+0x8FE8C6 0x98C8
+0x8FE8C7 0x98CC
+0x8FE8C8 0x98E1
+0x8FE8C9 0x98E3
+0x8FE8CA 0x98E5
+0x8FE8CB 0x98E6
+0x8FE8CC 0x98E7
+0x8FE8CD 0x98EA
+0x8FE8CE 0x98F3
+0x8FE8CF 0x98F6
+0x8FE8D0 0x9902
+0x8FE8D1 0x9907
+0x8FE8D2 0x9908
+0x8FE8D3 0x9911
+0x8FE8D4 0x9915
+0x8FE8D5 0x9916
+0x8FE8D6 0x9917
+0x8FE8D7 0x991A
+0x8FE8D8 0x991B
+0x8FE8D9 0x991C
+0x8FE8DA 0x991F
+0x8FE8DB 0x9922
+0x8FE8DC 0x9926
+0x8FE8DD 0x9927
+0x8FE8DE 0x992B
+0x8FE8DF 0x9931
+0x8FE8E0 0x9932
+0x8FE8E1 0x9933
+0x8FE8E2 0x9934
+0x8FE8E3 0x9935
+0x8FE8E4 0x9939
+0x8FE8E5 0x993A
+0x8FE8E6 0x993B
+0x8FE8E7 0x993C
+0x8FE8E8 0x9940
+0x8FE8E9 0x9941
+0x8FE8EA 0x9946
+0x8FE8EB 0x9947
+0x8FE8EC 0x9948
+0x8FE8ED 0x994D
+0x8FE8EE 0x994E
+0x8FE8EF 0x9954
+0x8FE8F0 0x9958
+0x8FE8F1 0x9959
+0x8FE8F2 0x995B
+0x8FE8F3 0x995C
+0x8FE8F4 0x995E
+0x8FE8F5 0x995F
+0x8FE8F6 0x9960
+0x8FE8F7 0x999B
+0x8FE8F8 0x999D
+0x8FE8F9 0x999F
+0x8FE8FA 0x99A6
+0x8FE8FB 0x99B0
+0x8FE8FC 0x99B1
+0x8FE8FD 0x99B2
+0x8FE8FE 0x99B5
+0x8FE9A1 0x99B9
+0x8FE9A2 0x99BA
+0x8FE9A3 0x99BD
+0x8FE9A4 0x99BF
+0x8FE9A5 0x99C3
+0x8FE9A6 0x99C9
+0x8FE9A7 0x99D3
+0x8FE9A8 0x99D4
+0x8FE9A9 0x99D9
+0x8FE9AA 0x99DA
+0x8FE9AB 0x99DC
+0x8FE9AC 0x99DE
+0x8FE9AD 0x99E7
+0x8FE9AE 0x99EA
+0x8FE9AF 0x99EB
+0x8FE9B0 0x99EC
+0x8FE9B1 0x99F0
+0x8FE9B2 0x99F4
+0x8FE9B3 0x99F5
+0x8FE9B4 0x99F9
+0x8FE9B5 0x99FD
+0x8FE9B6 0x99FE
+0x8FE9B7 0x9A02
+0x8FE9B8 0x9A03
+0x8FE9B9 0x9A04
+0x8FE9BA 0x9A0B
+0x8FE9BB 0x9A0C
+0x8FE9BC 0x9A10
+0x8FE9BD 0x9A11
+0x8FE9BE 0x9A16
+0x8FE9BF 0x9A1E
+0x8FE9C0 0x9A20
+0x8FE9C1 0x9A22
+0x8FE9C2 0x9A23
+0x8FE9C3 0x9A24
+0x8FE9C4 0x9A27
+0x8FE9C5 0x9A2D
+0x8FE9C6 0x9A2E
+0x8FE9C7 0x9A33
+0x8FE9C8 0x9A35
+0x8FE9C9 0x9A36
+0x8FE9CA 0x9A38
+0x8FE9CB 0x9A47
+0x8FE9CC 0x9A41
+0x8FE9CD 0x9A44
+0x8FE9CE 0x9A4A
+0x8FE9CF 0x9A4B
+0x8FE9D0 0x9A4C
+0x8FE9D1 0x9A4E
+0x8FE9D2 0x9A51
+0x8FE9D3 0x9A54
+0x8FE9D4 0x9A56
+0x8FE9D5 0x9A5D
+0x8FE9D6 0x9AAA
+0x8FE9D7 0x9AAC
+0x8FE9D8 0x9AAE
+0x8FE9D9 0x9AAF
+0x8FE9DA 0x9AB2
+0x8FE9DB 0x9AB4
+0x8FE9DC 0x9AB5
+0x8FE9DD 0x9AB6
+0x8FE9DE 0x9AB9
+0x8FE9DF 0x9ABB
+0x8FE9E0 0x9ABE
+0x8FE9E1 0x9ABF
+0x8FE9E2 0x9AC1
+0x8FE9E3 0x9AC3
+0x8FE9E4 0x9AC6
+0x8FE9E5 0x9AC8
+0x8FE9E6 0x9ACE
+0x8FE9E7 0x9AD0
+0x8FE9E8 0x9AD2
+0x8FE9E9 0x9AD5
+0x8FE9EA 0x9AD6
+0x8FE9EB 0x9AD7
+0x8FE9EC 0x9ADB
+0x8FE9ED 0x9ADC
+0x8FE9EE 0x9AE0
+0x8FE9EF 0x9AE4
+0x8FE9F0 0x9AE5
+0x8FE9F1 0x9AE7
+0x8FE9F2 0x9AE9
+0x8FE9F3 0x9AEC
+0x8FE9F4 0x9AF2
+0x8FE9F5 0x9AF3
+0x8FE9F6 0x9AF5
+0x8FE9F7 0x9AF9
+0x8FE9F8 0x9AFA
+0x8FE9F9 0x9AFD
+0x8FE9FA 0x9AFF
+0x8FE9FB 0x9B00
+0x8FE9FC 0x9B01
+0x8FE9FD 0x9B02
+0x8FE9FE 0x9B03
+0x8FEAA1 0x9B04
+0x8FEAA2 0x9B05
+0x8FEAA3 0x9B08
+0x8FEAA4 0x9B09
+0x8FEAA5 0x9B0B
+0x8FEAA6 0x9B0C
+0x8FEAA7 0x9B0D
+0x8FEAA8 0x9B0E
+0x8FEAA9 0x9B10
+0x8FEAAA 0x9B12
+0x8FEAAB 0x9B16
+0x8FEAAC 0x9B19
+0x8FEAAD 0x9B1B
+0x8FEAAE 0x9B1C
+0x8FEAAF 0x9B20
+0x8FEAB0 0x9B26
+0x8FEAB1 0x9B2B
+0x8FEAB2 0x9B2D
+0x8FEAB3 0x9B33
+0x8FEAB4 0x9B34
+0x8FEAB5 0x9B35
+0x8FEAB6 0x9B37
+0x8FEAB7 0x9B39
+0x8FEAB8 0x9B3A
+0x8FEAB9 0x9B3D
+0x8FEABA 0x9B48
+0x8FEABB 0x9B4B
+0x8FEABC 0x9B4C
+0x8FEABD 0x9B55
+0x8FEABE 0x9B56
+0x8FEABF 0x9B57
+0x8FEAC0 0x9B5B
+0x8FEAC1 0x9B5E
+0x8FEAC2 0x9B61
+0x8FEAC3 0x9B63
+0x8FEAC4 0x9B65
+0x8FEAC5 0x9B66
+0x8FEAC6 0x9B68
+0x8FEAC7 0x9B6A
+0x8FEAC8 0x9B6B
+0x8FEAC9 0x9B6C
+0x8FEACA 0x9B6D
+0x8FEACB 0x9B6E
+0x8FEACC 0x9B73
+0x8FEACD 0x9B75
+0x8FEACE 0x9B77
+0x8FEACF 0x9B78
+0x8FEAD0 0x9B79
+0x8FEAD1 0x9B7F
+0x8FEAD2 0x9B80
+0x8FEAD3 0x9B84
+0x8FEAD4 0x9B85
+0x8FEAD5 0x9B86
+0x8FEAD6 0x9B87
+0x8FEAD7 0x9B89
+0x8FEAD8 0x9B8A
+0x8FEAD9 0x9B8B
+0x8FEADA 0x9B8D
+0x8FEADB 0x9B8F
+0x8FEADC 0x9B90
+0x8FEADD 0x9B94
+0x8FEADE 0x9B9A
+0x8FEADF 0x9B9D
+0x8FEAE0 0x9B9E
+0x8FEAE1 0x9BA6
+0x8FEAE2 0x9BA7
+0x8FEAE3 0x9BA9
+0x8FEAE4 0x9BAC
+0x8FEAE5 0x9BB0
+0x8FEAE6 0x9BB1
+0x8FEAE7 0x9BB2
+0x8FEAE8 0x9BB7
+0x8FEAE9 0x9BB8
+0x8FEAEA 0x9BBB
+0x8FEAEB 0x9BBC
+0x8FEAEC 0x9BBE
+0x8FEAED 0x9BBF
+0x8FEAEE 0x9BC1
+0x8FEAEF 0x9BC7
+0x8FEAF0 0x9BC8
+0x8FEAF1 0x9BCE
+0x8FEAF2 0x9BD0
+0x8FEAF3 0x9BD7
+0x8FEAF4 0x9BD8
+0x8FEAF5 0x9BDD
+0x8FEAF6 0x9BDF
+0x8FEAF7 0x9BE5
+0x8FEAF8 0x9BE7
+0x8FEAF9 0x9BEA
+0x8FEAFA 0x9BEB
+0x8FEAFB 0x9BEF
+0x8FEAFC 0x9BF3
+0x8FEAFD 0x9BF7
+0x8FEAFE 0x9BF8
+0x8FEBA1 0x9BF9
+0x8FEBA2 0x9BFA
+0x8FEBA3 0x9BFD
+0x8FEBA4 0x9BFF
+0x8FEBA5 0x9C00
+0x8FEBA6 0x9C02
+0x8FEBA7 0x9C0B
+0x8FEBA8 0x9C0F
+0x8FEBA9 0x9C11
+0x8FEBAA 0x9C16
+0x8FEBAB 0x9C18
+0x8FEBAC 0x9C19
+0x8FEBAD 0x9C1A
+0x8FEBAE 0x9C1C
+0x8FEBAF 0x9C1E
+0x8FEBB0 0x9C22
+0x8FEBB1 0x9C23
+0x8FEBB2 0x9C26
+0x8FEBB3 0x9C27
+0x8FEBB4 0x9C28
+0x8FEBB5 0x9C29
+0x8FEBB6 0x9C2A
+0x8FEBB7 0x9C31
+0x8FEBB8 0x9C35
+0x8FEBB9 0x9C36
+0x8FEBBA 0x9C37
+0x8FEBBB 0x9C3D
+0x8FEBBC 0x9C41
+0x8FEBBD 0x9C43
+0x8FEBBE 0x9C44
+0x8FEBBF 0x9C45
+0x8FEBC0 0x9C49
+0x8FEBC1 0x9C4A
+0x8FEBC2 0x9C4E
+0x8FEBC3 0x9C4F
+0x8FEBC4 0x9C50
+0x8FEBC5 0x9C53
+0x8FEBC6 0x9C54
+0x8FEBC7 0x9C56
+0x8FEBC8 0x9C58
+0x8FEBC9 0x9C5B
+0x8FEBCA 0x9C5D
+0x8FEBCB 0x9C5E
+0x8FEBCC 0x9C5F
+0x8FEBCD 0x9C63
+0x8FEBCE 0x9C69
+0x8FEBCF 0x9C6A
+0x8FEBD0 0x9C5C
+0x8FEBD1 0x9C6B
+0x8FEBD2 0x9C68
+0x8FEBD3 0x9C6E
+0x8FEBD4 0x9C70
+0x8FEBD5 0x9C72
+0x8FEBD6 0x9C75
+0x8FEBD7 0x9C77
+0x8FEBD8 0x9C7B
+0x8FEBD9 0x9CE6
+0x8FEBDA 0x9CF2
+0x8FEBDB 0x9CF7
+0x8FEBDC 0x9CF9
+0x8FEBDD 0x9D0B
+0x8FEBDE 0x9D02
+0x8FEBDF 0x9D11
+0x8FEBE0 0x9D17
+0x8FEBE1 0x9D18
+0x8FEBE2 0x9D1C
+0x8FEBE3 0x9D1D
+0x8FEBE4 0x9D1E
+0x8FEBE5 0x9D2F
+0x8FEBE6 0x9D30
+0x8FEBE7 0x9D32
+0x8FEBE8 0x9D33
+0x8FEBE9 0x9D34
+0x8FEBEA 0x9D3A
+0x8FEBEB 0x9D3C
+0x8FEBEC 0x9D45
+0x8FEBED 0x9D3D
+0x8FEBEE 0x9D42
+0x8FEBEF 0x9D43
+0x8FEBF0 0x9D47
+0x8FEBF1 0x9D4A
+0x8FEBF2 0x9D53
+0x8FEBF3 0x9D54
+0x8FEBF4 0x9D5F
+0x8FEBF5 0x9D63
+0x8FEBF6 0x9D62
+0x8FEBF7 0x9D65
+0x8FEBF8 0x9D69
+0x8FEBF9 0x9D6A
+0x8FEBFA 0x9D6B
+0x8FEBFB 0x9D70
+0x8FEBFC 0x9D76
+0x8FEBFD 0x9D77
+0x8FEBFE 0x9D7B
+0x8FECA1 0x9D7C
+0x8FECA2 0x9D7E
+0x8FECA3 0x9D83
+0x8FECA4 0x9D84
+0x8FECA5 0x9D86
+0x8FECA6 0x9D8A
+0x8FECA7 0x9D8D
+0x8FECA8 0x9D8E
+0x8FECA9 0x9D92
+0x8FECAA 0x9D93
+0x8FECAB 0x9D95
+0x8FECAC 0x9D96
+0x8FECAD 0x9D97
+0x8FECAE 0x9D98
+0x8FECAF 0x9DA1
+0x8FECB0 0x9DAA
+0x8FECB1 0x9DAC
+0x8FECB2 0x9DAE
+0x8FECB3 0x9DB1
+0x8FECB4 0x9DB5
+0x8FECB5 0x9DB9
+0x8FECB6 0x9DBC
+0x8FECB7 0x9DBF
+0x8FECB8 0x9DC3
+0x8FECB9 0x9DC7
+0x8FECBA 0x9DC9
+0x8FECBB 0x9DCA
+0x8FECBC 0x9DD4
+0x8FECBD 0x9DD5
+0x8FECBE 0x9DD6
+0x8FECBF 0x9DD7
+0x8FECC0 0x9DDA
+0x8FECC1 0x9DDE
+0x8FECC2 0x9DDF
+0x8FECC3 0x9DE0
+0x8FECC4 0x9DE5
+0x8FECC5 0x9DE7
+0x8FECC6 0x9DE9
+0x8FECC7 0x9DEB
+0x8FECC8 0x9DEE
+0x8FECC9 0x9DF0
+0x8FECCA 0x9DF3
+0x8FECCB 0x9DF4
+0x8FECCC 0x9DFE
+0x8FECCD 0x9E0A
+0x8FECCE 0x9E02
+0x8FECCF 0x9E07
+0x8FECD0 0x9E0E
+0x8FECD1 0x9E10
+0x8FECD2 0x9E11
+0x8FECD3 0x9E12
+0x8FECD4 0x9E15
+0x8FECD5 0x9E16
+0x8FECD6 0x9E19
+0x8FECD7 0x9E1C
+0x8FECD8 0x9E1D
+0x8FECD9 0x9E7A
+0x8FECDA 0x9E7B
+0x8FECDB 0x9E7C
+0x8FECDC 0x9E80
+0x8FECDD 0x9E82
+0x8FECDE 0x9E83
+0x8FECDF 0x9E84
+0x8FECE0 0x9E85
+0x8FECE1 0x9E87
+0x8FECE2 0x9E8E
+0x8FECE3 0x9E8F
+0x8FECE4 0x9E96
+0x8FECE5 0x9E98
+0x8FECE6 0x9E9B
+0x8FECE7 0x9E9E
+0x8FECE8 0x9EA4
+0x8FECE9 0x9EA8
+0x8FECEA 0x9EAC
+0x8FECEB 0x9EAE
+0x8FECEC 0x9EAF
+0x8FECED 0x9EB0
+0x8FECEE 0x9EB3
+0x8FECEF 0x9EB4
+0x8FECF0 0x9EB5
+0x8FECF1 0x9EC6
+0x8FECF2 0x9EC8
+0x8FECF3 0x9ECB
+0x8FECF4 0x9ED5
+0x8FECF5 0x9EDF
+0x8FECF6 0x9EE4
+0x8FECF7 0x9EE7
+0x8FECF8 0x9EEC
+0x8FECF9 0x9EED
+0x8FECFA 0x9EEE
+0x8FECFB 0x9EF0
+0x8FECFC 0x9EF1
+0x8FECFD 0x9EF2
+0x8FECFE 0x9EF5
+0x8FEDA1 0x9EF8
+0x8FEDA2 0x9EFF
+0x8FEDA3 0x9F02
+0x8FEDA4 0x9F03
+0x8FEDA5 0x9F09
+0x8FEDA6 0x9F0F
+0x8FEDA7 0x9F10
+0x8FEDA8 0x9F11
+0x8FEDA9 0x9F12
+0x8FEDAA 0x9F14
+0x8FEDAB 0x9F16
+0x8FEDAC 0x9F17
+0x8FEDAD 0x9F19
+0x8FEDAE 0x9F1A
+0x8FEDAF 0x9F1B
+0x8FEDB0 0x9F1F
+0x8FEDB1 0x9F22
+0x8FEDB2 0x9F26
+0x8FEDB3 0x9F2A
+0x8FEDB4 0x9F2B
+0x8FEDB5 0x9F2F
+0x8FEDB6 0x9F31
+0x8FEDB7 0x9F32
+0x8FEDB8 0x9F34
+0x8FEDB9 0x9F37
+0x8FEDBA 0x9F39
+0x8FEDBB 0x9F3A
+0x8FEDBC 0x9F3C
+0x8FEDBD 0x9F3D
+0x8FEDBE 0x9F3F
+0x8FEDBF 0x9F41
+0x8FEDC0 0x9F43
+0x8FEDC1 0x9F44
+0x8FEDC2 0x9F45
+0x8FEDC3 0x9F46
+0x8FEDC4 0x9F47
+0x8FEDC5 0x9F53
+0x8FEDC6 0x9F55
+0x8FEDC7 0x9F56
+0x8FEDC8 0x9F57
+0x8FEDC9 0x9F58
+0x8FEDCA 0x9F5A
+0x8FEDCB 0x9F5D
+0x8FEDCC 0x9F5E
+0x8FEDCD 0x9F68
+0x8FEDCE 0x9F69
+0x8FEDCF 0x9F6D
+0x8FEDD0 0x9F6E
+0x8FEDD1 0x9F6F
+0x8FEDD2 0x9F70
+0x8FEDD3 0x9F71
+0x8FEDD4 0x9F73
+0x8FEDD5 0x9F75
+0x8FEDD6 0x9F7A
+0x8FEDD7 0x9F7D
+0x8FEDD8 0x9F8F
+0x8FEDD9 0x9F90
+0x8FEDDA 0x9F91
+0x8FEDDB 0x9F92
+0x8FEDDC 0x9F94
+0x8FEDDD 0x9F96
+0x8FEDDE 0x9F97
+0x8FEDDF 0x9F9E
+0x8FEDE0 0x9FA1
+0x8FEDE1 0x9FA2
+0x8FEDE2 0x9FA3
+0x8FEDE3 0x9FA5
+0xA1A1 0x3000
+0xA1A2 0x3001
+0xA1A3 0x3002
+0xA1A4 0xFF0C
+0xA1A5 0xFF0E
+0xA1A6 0x30FB
+0xA1A7 0xFF1A
+0xA1A8 0xFF1B
+0xA1A9 0xFF1F
+0xA1AA 0xFF01
+0xA1AB 0x309B
+0xA1AC 0x309C
+0xA1AD 0x00B4
+0xA1AE 0xFF40
+0xA1AF 0x00A8
+0xA1B0 0xFF3E
+0xA1B1 0xFFE3
+0xA1B2 0xFF3F
+0xA1B3 0x30FD
+0xA1B4 0x30FE
+0xA1B5 0x309D
+0xA1B6 0x309E
+0xA1B7 0x3003
+0xA1B8 0x4EDD
+0xA1B9 0x3005
+0xA1BA 0x3006
+0xA1BB 0x3007
+0xA1BC 0x30FC
+0xA1BD 0x2015
+0xA1BE 0x2010
+0xA1BF 0xFF0F
+0xA1C0 0x005C
+0xA1C1 0x301C
+0xA1C2 0x2016
+0xA1C3 0xFF5C
+0xA1C4 0x2026
+0xA1C5 0x2025
+0xA1C6 0x2018
+0xA1C7 0x2019
+0xA1C8 0x201C
+0xA1C9 0x201D
+0xA1CA 0xFF08
+0xA1CB 0xFF09
+0xA1CC 0x3014
+0xA1CD 0x3015
+0xA1CE 0xFF3B
+0xA1CF 0xFF3D
+0xA1D0 0xFF5B
+0xA1D1 0xFF5D
+0xA1D2 0x3008
+0xA1D3 0x3009
+0xA1D4 0x300A
+0xA1D5 0x300B
+0xA1D6 0x300C
+0xA1D7 0x300D
+0xA1D8 0x300E
+0xA1D9 0x300F
+0xA1DA 0x3010
+0xA1DB 0x3011
+0xA1DC 0xFF0B
+0xA1DD 0x2212
+0xA1DE 0x00B1
+0xA1DF 0x00D7
+0xA1E0 0x00F7
+0xA1E1 0xFF1D
+0xA1E2 0x2260
+0xA1E3 0xFF1C
+0xA1E4 0xFF1E
+0xA1E5 0x2266
+0xA1E6 0x2267
+0xA1E7 0x221E
+0xA1E8 0x2234
+0xA1E9 0x2642
+0xA1EA 0x2640
+0xA1EB 0x00B0
+0xA1EC 0x2032
+0xA1ED 0x2033
+0xA1EE 0x2103
+0xA1EF 0xFFE5
+0xA1F0 0xFF04
+0xA1F1 0x00A2
+0xA1F2 0x00A3
+0xA1F3 0xFF05
+0xA1F4 0xFF03
+0xA1F5 0xFF06
+0xA1F6 0xFF0A
+0xA1F7 0xFF20
+0xA1F8 0x00A7
+0xA1F9 0x2606
+0xA1FA 0x2605
+0xA1FB 0x25CB
+0xA1FC 0x25CF
+0xA1FD 0x25CE
+0xA1FE 0x25C7
+0xA2A1 0x25C6
+0xA2A2 0x25A1
+0xA2A3 0x25A0
+0xA2A4 0x25B3
+0xA2A5 0x25B2
+0xA2A6 0x25BD
+0xA2A7 0x25BC
+0xA2A8 0x203B
+0xA2A9 0x3012
+0xA2AA 0x2192
+0xA2AB 0x2190
+0xA2AC 0x2191
+0xA2AD 0x2193
+0xA2AE 0x3013
+0xA2BA 0x2208
+0xA2BB 0x220B
+0xA2BC 0x2286
+0xA2BD 0x2287
+0xA2BE 0x2282
+0xA2BF 0x2283
+0xA2C0 0x222A
+0xA2C1 0x2229
+0xA2CA 0x2227
+0xA2CB 0x2228
+0xA2CC 0x00AC
+0xA2CD 0x21D2
+0xA2CE 0x21D4
+0xA2CF 0x2200
+0xA2D0 0x2203
+0xA2DC 0x2220
+0xA2DD 0x22A5
+0xA2DE 0x2312
+0xA2DF 0x2202
+0xA2E0 0x2207
+0xA2E1 0x2261
+0xA2E2 0x2252
+0xA2E3 0x226A
+0xA2E4 0x226B
+0xA2E5 0x221A
+0xA2E6 0x223D
+0xA2E7 0x221D
+0xA2E8 0x2235
+0xA2E9 0x222B
+0xA2EA 0x222C
+0xA2F2 0x212B
+0xA2F3 0x2030
+0xA2F4 0x266F
+0xA2F5 0x266D
+0xA2F6 0x266A
+0xA2F7 0x2020
+0xA2F8 0x2021
+0xA2F9 0x00B6
+0xA2FE 0x25EF
+0xA3B0 0xFF10
+0xA3B1 0xFF11
+0xA3B2 0xFF12
+0xA3B3 0xFF13
+0xA3B4 0xFF14
+0xA3B5 0xFF15
+0xA3B6 0xFF16
+0xA3B7 0xFF17
+0xA3B8 0xFF18
+0xA3B9 0xFF19
+0xA3C1 0xFF21
+0xA3C2 0xFF22
+0xA3C3 0xFF23
+0xA3C4 0xFF24
+0xA3C5 0xFF25
+0xA3C6 0xFF26
+0xA3C7 0xFF27
+0xA3C8 0xFF28
+0xA3C9 0xFF29
+0xA3CA 0xFF2A
+0xA3CB 0xFF2B
+0xA3CC 0xFF2C
+0xA3CD 0xFF2D
+0xA3CE 0xFF2E
+0xA3CF 0xFF2F
+0xA3D0 0xFF30
+0xA3D1 0xFF31
+0xA3D2 0xFF32
+0xA3D3 0xFF33
+0xA3D4 0xFF34
+0xA3D5 0xFF35
+0xA3D6 0xFF36
+0xA3D7 0xFF37
+0xA3D8 0xFF38
+0xA3D9 0xFF39
+0xA3DA 0xFF3A
+0xA3E1 0xFF41
+0xA3E2 0xFF42
+0xA3E3 0xFF43
+0xA3E4 0xFF44
+0xA3E5 0xFF45
+0xA3E6 0xFF46
+0xA3E7 0xFF47
+0xA3E8 0xFF48
+0xA3E9 0xFF49
+0xA3EA 0xFF4A
+0xA3EB 0xFF4B
+0xA3EC 0xFF4C
+0xA3ED 0xFF4D
+0xA3EE 0xFF4E
+0xA3EF 0xFF4F
+0xA3F0 0xFF50
+0xA3F1 0xFF51
+0xA3F2 0xFF52
+0xA3F3 0xFF53
+0xA3F4 0xFF54
+0xA3F5 0xFF55
+0xA3F6 0xFF56
+0xA3F7 0xFF57
+0xA3F8 0xFF58
+0xA3F9 0xFF59
+0xA3FA 0xFF5A
+0xA4A1 0x3041
+0xA4A2 0x3042
+0xA4A3 0x3043
+0xA4A4 0x3044
+0xA4A5 0x3045
+0xA4A6 0x3046
+0xA4A7 0x3047
+0xA4A8 0x3048
+0xA4A9 0x3049
+0xA4AA 0x304A
+0xA4AB 0x304B
+0xA4AC 0x304C
+0xA4AD 0x304D
+0xA4AE 0x304E
+0xA4AF 0x304F
+0xA4B0 0x3050
+0xA4B1 0x3051
+0xA4B2 0x3052
+0xA4B3 0x3053
+0xA4B4 0x3054
+0xA4B5 0x3055
+0xA4B6 0x3056
+0xA4B7 0x3057
+0xA4B8 0x3058
+0xA4B9 0x3059
+0xA4BA 0x305A
+0xA4BB 0x305B
+0xA4BC 0x305C
+0xA4BD 0x305D
+0xA4BE 0x305E
+0xA4BF 0x305F
+0xA4C0 0x3060
+0xA4C1 0x3061
+0xA4C2 0x3062
+0xA4C3 0x3063
+0xA4C4 0x3064
+0xA4C5 0x3065
+0xA4C6 0x3066
+0xA4C7 0x3067
+0xA4C8 0x3068
+0xA4C9 0x3069
+0xA4CA 0x306A
+0xA4CB 0x306B
+0xA4CC 0x306C
+0xA4CD 0x306D
+0xA4CE 0x306E
+0xA4CF 0x306F
+0xA4D0 0x3070
+0xA4D1 0x3071
+0xA4D2 0x3072
+0xA4D3 0x3073
+0xA4D4 0x3074
+0xA4D5 0x3075
+0xA4D6 0x3076
+0xA4D7 0x3077
+0xA4D8 0x3078
+0xA4D9 0x3079
+0xA4DA 0x307A
+0xA4DB 0x307B
+0xA4DC 0x307C
+0xA4DD 0x307D
+0xA4DE 0x307E
+0xA4DF 0x307F
+0xA4E0 0x3080
+0xA4E1 0x3081
+0xA4E2 0x3082
+0xA4E3 0x3083
+0xA4E4 0x3084
+0xA4E5 0x3085
+0xA4E6 0x3086
+0xA4E7 0x3087
+0xA4E8 0x3088
+0xA4E9 0x3089
+0xA4EA 0x308A
+0xA4EB 0x308B
+0xA4EC 0x308C
+0xA4ED 0x308D
+0xA4EE 0x308E
+0xA4EF 0x308F
+0xA4F0 0x3090
+0xA4F1 0x3091
+0xA4F2 0x3092
+0xA4F3 0x3093
+0xA5A1 0x30A1
+0xA5A2 0x30A2
+0xA5A3 0x30A3
+0xA5A4 0x30A4
+0xA5A5 0x30A5
+0xA5A6 0x30A6
+0xA5A7 0x30A7
+0xA5A8 0x30A8
+0xA5A9 0x30A9
+0xA5AA 0x30AA
+0xA5AB 0x30AB
+0xA5AC 0x30AC
+0xA5AD 0x30AD
+0xA5AE 0x30AE
+0xA5AF 0x30AF
+0xA5B0 0x30B0
+0xA5B1 0x30B1
+0xA5B2 0x30B2
+0xA5B3 0x30B3
+0xA5B4 0x30B4
+0xA5B5 0x30B5
+0xA5B6 0x30B6
+0xA5B7 0x30B7
+0xA5B8 0x30B8
+0xA5B9 0x30B9
+0xA5BA 0x30BA
+0xA5BB 0x30BB
+0xA5BC 0x30BC
+0xA5BD 0x30BD
+0xA5BE 0x30BE
+0xA5BF 0x30BF
+0xA5C0 0x30C0
+0xA5C1 0x30C1
+0xA5C2 0x30C2
+0xA5C3 0x30C3
+0xA5C4 0x30C4
+0xA5C5 0x30C5
+0xA5C6 0x30C6
+0xA5C7 0x30C7
+0xA5C8 0x30C8
+0xA5C9 0x30C9
+0xA5CA 0x30CA
+0xA5CB 0x30CB
+0xA5CC 0x30CC
+0xA5CD 0x30CD
+0xA5CE 0x30CE
+0xA5CF 0x30CF
+0xA5D0 0x30D0
+0xA5D1 0x30D1
+0xA5D2 0x30D2
+0xA5D3 0x30D3
+0xA5D4 0x30D4
+0xA5D5 0x30D5
+0xA5D6 0x30D6
+0xA5D7 0x30D7
+0xA5D8 0x30D8
+0xA5D9 0x30D9
+0xA5DA 0x30DA
+0xA5DB 0x30DB
+0xA5DC 0x30DC
+0xA5DD 0x30DD
+0xA5DE 0x30DE
+0xA5DF 0x30DF
+0xA5E0 0x30E0
+0xA5E1 0x30E1
+0xA5E2 0x30E2
+0xA5E3 0x30E3
+0xA5E4 0x30E4
+0xA5E5 0x30E5
+0xA5E6 0x30E6
+0xA5E7 0x30E7
+0xA5E8 0x30E8
+0xA5E9 0x30E9
+0xA5EA 0x30EA
+0xA5EB 0x30EB
+0xA5EC 0x30EC
+0xA5ED 0x30ED
+0xA5EE 0x30EE
+0xA5EF 0x30EF
+0xA5F0 0x30F0
+0xA5F1 0x30F1
+0xA5F2 0x30F2
+0xA5F3 0x30F3
+0xA5F4 0x30F4
+0xA5F5 0x30F5
+0xA5F6 0x30F6
+0xA6A1 0x0391
+0xA6A2 0x0392
+0xA6A3 0x0393
+0xA6A4 0x0394
+0xA6A5 0x0395
+0xA6A6 0x0396
+0xA6A7 0x0397
+0xA6A8 0x0398
+0xA6A9 0x0399
+0xA6AA 0x039A
+0xA6AB 0x039B
+0xA6AC 0x039C
+0xA6AD 0x039D
+0xA6AE 0x039E
+0xA6AF 0x039F
+0xA6B0 0x03A0
+0xA6B1 0x03A1
+0xA6B2 0x03A3
+0xA6B3 0x03A4
+0xA6B4 0x03A5
+0xA6B5 0x03A6
+0xA6B6 0x03A7
+0xA6B7 0x03A8
+0xA6B8 0x03A9
+0xA6C1 0x03B1
+0xA6C2 0x03B2
+0xA6C3 0x03B3
+0xA6C4 0x03B4
+0xA6C5 0x03B5
+0xA6C6 0x03B6
+0xA6C7 0x03B7
+0xA6C8 0x03B8
+0xA6C9 0x03B9
+0xA6CA 0x03BA
+0xA6CB 0x03BB
+0xA6CC 0x03BC
+0xA6CD 0x03BD
+0xA6CE 0x03BE
+0xA6CF 0x03BF
+0xA6D0 0x03C0
+0xA6D1 0x03C1
+0xA6D2 0x03C3
+0xA6D3 0x03C4
+0xA6D4 0x03C5
+0xA6D5 0x03C6
+0xA6D6 0x03C7
+0xA6D7 0x03C8
+0xA6D8 0x03C9
+0xA7A1 0x0410
+0xA7A2 0x0411
+0xA7A3 0x0412
+0xA7A4 0x0413
+0xA7A5 0x0414
+0xA7A6 0x0415
+0xA7A7 0x0401
+0xA7A8 0x0416
+0xA7A9 0x0417
+0xA7AA 0x0418
+0xA7AB 0x0419
+0xA7AC 0x041A
+0xA7AD 0x041B
+0xA7AE 0x041C
+0xA7AF 0x041D
+0xA7B0 0x041E
+0xA7B1 0x041F
+0xA7B2 0x0420
+0xA7B3 0x0421
+0xA7B4 0x0422
+0xA7B5 0x0423
+0xA7B6 0x0424
+0xA7B7 0x0425
+0xA7B8 0x0426
+0xA7B9 0x0427
+0xA7BA 0x0428
+0xA7BB 0x0429
+0xA7BC 0x042A
+0xA7BD 0x042B
+0xA7BE 0x042C
+0xA7BF 0x042D
+0xA7C0 0x042E
+0xA7C1 0x042F
+0xA7D1 0x0430
+0xA7D2 0x0431
+0xA7D3 0x0432
+0xA7D4 0x0433
+0xA7D5 0x0434
+0xA7D6 0x0435
+0xA7D7 0x0451
+0xA7D8 0x0436
+0xA7D9 0x0437
+0xA7DA 0x0438
+0xA7DB 0x0439
+0xA7DC 0x043A
+0xA7DD 0x043B
+0xA7DE 0x043C
+0xA7DF 0x043D
+0xA7E0 0x043E
+0xA7E1 0x043F
+0xA7E2 0x0440
+0xA7E3 0x0441
+0xA7E4 0x0442
+0xA7E5 0x0443
+0xA7E6 0x0444
+0xA7E7 0x0445
+0xA7E8 0x0446
+0xA7E9 0x0447
+0xA7EA 0x0448
+0xA7EB 0x0449
+0xA7EC 0x044A
+0xA7ED 0x044B
+0xA7EE 0x044C
+0xA7EF 0x044D
+0xA7F0 0x044E
+0xA7F1 0x044F
+0xA8A1 0x2500
+0xA8A2 0x2502
+0xA8A3 0x250C
+0xA8A4 0x2510
+0xA8A5 0x2518
+0xA8A6 0x2514
+0xA8A7 0x251C
+0xA8A8 0x252C
+0xA8A9 0x2524
+0xA8AA 0x2534
+0xA8AB 0x253C
+0xA8AC 0x2501
+0xA8AD 0x2503
+0xA8AE 0x250F
+0xA8AF 0x2513
+0xA8B0 0x251B
+0xA8B1 0x2517
+0xA8B2 0x2523
+0xA8B3 0x2533
+0xA8B4 0x252B
+0xA8B5 0x253B
+0xA8B6 0x254B
+0xA8B7 0x2520
+0xA8B8 0x252F
+0xA8B9 0x2528
+0xA8BA 0x2537
+0xA8BB 0x253F
+0xA8BC 0x251D
+0xA8BD 0x2530
+0xA8BE 0x2525
+0xA8BF 0x2538
+0xA8C0 0x2542
+0xB0A1 0x4E9C
+0xB0A2 0x5516
+0xB0A3 0x5A03
+0xB0A4 0x963F
+0xB0A5 0x54C0
+0xB0A6 0x611B
+0xB0A7 0x6328
+0xB0A8 0x59F6
+0xB0A9 0x9022
+0xB0AA 0x8475
+0xB0AB 0x831C
+0xB0AC 0x7A50
+0xB0AD 0x60AA
+0xB0AE 0x63E1
+0xB0AF 0x6E25
+0xB0B0 0x65ED
+0xB0B1 0x8466
+0xB0B2 0x82A6
+0xB0B3 0x9BF5
+0xB0B4 0x6893
+0xB0B5 0x5727
+0xB0B6 0x65A1
+0xB0B7 0x6271
+0xB0B8 0x5B9B
+0xB0B9 0x59D0
+0xB0BA 0x867B
+0xB0BB 0x98F4
+0xB0BC 0x7D62
+0xB0BD 0x7DBE
+0xB0BE 0x9B8E
+0xB0BF 0x6216
+0xB0C0 0x7C9F
+0xB0C1 0x88B7
+0xB0C2 0x5B89
+0xB0C3 0x5EB5
+0xB0C4 0x6309
+0xB0C5 0x6697
+0xB0C6 0x6848
+0xB0C7 0x95C7
+0xB0C8 0x978D
+0xB0C9 0x674F
+0xB0CA 0x4EE5
+0xB0CB 0x4F0A
+0xB0CC 0x4F4D
+0xB0CD 0x4F9D
+0xB0CE 0x5049
+0xB0CF 0x56F2
+0xB0D0 0x5937
+0xB0D1 0x59D4
+0xB0D2 0x5A01
+0xB0D3 0x5C09
+0xB0D4 0x60DF
+0xB0D5 0x610F
+0xB0D6 0x6170
+0xB0D7 0x6613
+0xB0D8 0x6905
+0xB0D9 0x70BA
+0xB0DA 0x754F
+0xB0DB 0x7570
+0xB0DC 0x79FB
+0xB0DD 0x7DAD
+0xB0DE 0x7DEF
+0xB0DF 0x80C3
+0xB0E0 0x840E
+0xB0E1 0x8863
+0xB0E2 0x8B02
+0xB0E3 0x9055
+0xB0E4 0x907A
+0xB0E5 0x533B
+0xB0E6 0x4E95
+0xB0E7 0x4EA5
+0xB0E8 0x57DF
+0xB0E9 0x80B2
+0xB0EA 0x90C1
+0xB0EB 0x78EF
+0xB0EC 0x4E00
+0xB0ED 0x58F1
+0xB0EE 0x6EA2
+0xB0EF 0x9038
+0xB0F0 0x7A32
+0xB0F1 0x8328
+0xB0F2 0x828B
+0xB0F3 0x9C2F
+0xB0F4 0x5141
+0xB0F5 0x5370
+0xB0F6 0x54BD
+0xB0F7 0x54E1
+0xB0F8 0x56E0
+0xB0F9 0x59FB
+0xB0FA 0x5F15
+0xB0FB 0x98F2
+0xB0FC 0x6DEB
+0xB0FD 0x80E4
+0xB0FE 0x852D
+0xB1A1 0x9662
+0xB1A2 0x9670
+0xB1A3 0x96A0
+0xB1A4 0x97FB
+0xB1A5 0x540B
+0xB1A6 0x53F3
+0xB1A7 0x5B87
+0xB1A8 0x70CF
+0xB1A9 0x7FBD
+0xB1AA 0x8FC2
+0xB1AB 0x96E8
+0xB1AC 0x536F
+0xB1AD 0x9D5C
+0xB1AE 0x7ABA
+0xB1AF 0x4E11
+0xB1B0 0x7893
+0xB1B1 0x81FC
+0xB1B2 0x6E26
+0xB1B3 0x5618
+0xB1B4 0x5504
+0xB1B5 0x6B1D
+0xB1B6 0x851A
+0xB1B7 0x9C3B
+0xB1B8 0x59E5
+0xB1B9 0x53A9
+0xB1BA 0x6D66
+0xB1BB 0x74DC
+0xB1BC 0x958F
+0xB1BD 0x5642
+0xB1BE 0x4E91
+0xB1BF 0x904B
+0xB1C0 0x96F2
+0xB1C1 0x834F
+0xB1C2 0x990C
+0xB1C3 0x53E1
+0xB1C4 0x55B6
+0xB1C5 0x5B30
+0xB1C6 0x5F71
+0xB1C7 0x6620
+0xB1C8 0x66F3
+0xB1C9 0x6804
+0xB1CA 0x6C38
+0xB1CB 0x6CF3
+0xB1CC 0x6D29
+0xB1CD 0x745B
+0xB1CE 0x76C8
+0xB1CF 0x7A4E
+0xB1D0 0x9834
+0xB1D1 0x82F1
+0xB1D2 0x885B
+0xB1D3 0x8A60
+0xB1D4 0x92ED
+0xB1D5 0x6DB2
+0xB1D6 0x75AB
+0xB1D7 0x76CA
+0xB1D8 0x99C5
+0xB1D9 0x60A6
+0xB1DA 0x8B01
+0xB1DB 0x8D8A
+0xB1DC 0x95B2
+0xB1DD 0x698E
+0xB1DE 0x53AD
+0xB1DF 0x5186
+0xB1E0 0x5712
+0xB1E1 0x5830
+0xB1E2 0x5944
+0xB1E3 0x5BB4
+0xB1E4 0x5EF6
+0xB1E5 0x6028
+0xB1E6 0x63A9
+0xB1E7 0x63F4
+0xB1E8 0x6CBF
+0xB1E9 0x6F14
+0xB1EA 0x708E
+0xB1EB 0x7114
+0xB1EC 0x7159
+0xB1ED 0x71D5
+0xB1EE 0x733F
+0xB1EF 0x7E01
+0xB1F0 0x8276
+0xB1F1 0x82D1
+0xB1F2 0x8597
+0xB1F3 0x9060
+0xB1F4 0x925B
+0xB1F5 0x9D1B
+0xB1F6 0x5869
+0xB1F7 0x65BC
+0xB1F8 0x6C5A
+0xB1F9 0x7525
+0xB1FA 0x51F9
+0xB1FB 0x592E
+0xB1FC 0x5965
+0xB1FD 0x5F80
+0xB1FE 0x5FDC
+0xB2A1 0x62BC
+0xB2A2 0x65FA
+0xB2A3 0x6A2A
+0xB2A4 0x6B27
+0xB2A5 0x6BB4
+0xB2A6 0x738B
+0xB2A7 0x7FC1
+0xB2A8 0x8956
+0xB2A9 0x9D2C
+0xB2AA 0x9D0E
+0xB2AB 0x9EC4
+0xB2AC 0x5CA1
+0xB2AD 0x6C96
+0xB2AE 0x837B
+0xB2AF 0x5104
+0xB2B0 0x5C4B
+0xB2B1 0x61B6
+0xB2B2 0x81C6
+0xB2B3 0x6876
+0xB2B4 0x7261
+0xB2B5 0x4E59
+0xB2B6 0x4FFA
+0xB2B7 0x5378
+0xB2B8 0x6069
+0xB2B9 0x6E29
+0xB2BA 0x7A4F
+0xB2BB 0x97F3
+0xB2BC 0x4E0B
+0xB2BD 0x5316
+0xB2BE 0x4EEE
+0xB2BF 0x4F55
+0xB2C0 0x4F3D
+0xB2C1 0x4FA1
+0xB2C2 0x4F73
+0xB2C3 0x52A0
+0xB2C4 0x53EF
+0xB2C5 0x5609
+0xB2C6 0x590F
+0xB2C7 0x5AC1
+0xB2C8 0x5BB6
+0xB2C9 0x5BE1
+0xB2CA 0x79D1
+0xB2CB 0x6687
+0xB2CC 0x679C
+0xB2CD 0x67B6
+0xB2CE 0x6B4C
+0xB2CF 0x6CB3
+0xB2D0 0x706B
+0xB2D1 0x73C2
+0xB2D2 0x798D
+0xB2D3 0x79BE
+0xB2D4 0x7A3C
+0xB2D5 0x7B87
+0xB2D6 0x82B1
+0xB2D7 0x82DB
+0xB2D8 0x8304
+0xB2D9 0x8377
+0xB2DA 0x83EF
+0xB2DB 0x83D3
+0xB2DC 0x8766
+0xB2DD 0x8AB2
+0xB2DE 0x5629
+0xB2DF 0x8CA8
+0xB2E0 0x8FE6
+0xB2E1 0x904E
+0xB2E2 0x971E
+0xB2E3 0x868A
+0xB2E4 0x4FC4
+0xB2E5 0x5CE8
+0xB2E6 0x6211
+0xB2E7 0x7259
+0xB2E8 0x753B
+0xB2E9 0x81E5
+0xB2EA 0x82BD
+0xB2EB 0x86FE
+0xB2EC 0x8CC0
+0xB2ED 0x96C5
+0xB2EE 0x9913
+0xB2EF 0x99D5
+0xB2F0 0x4ECB
+0xB2F1 0x4F1A
+0xB2F2 0x89E3
+0xB2F3 0x56DE
+0xB2F4 0x584A
+0xB2F5 0x58CA
+0xB2F6 0x5EFB
+0xB2F7 0x5FEB
+0xB2F8 0x602A
+0xB2F9 0x6094
+0xB2FA 0x6062
+0xB2FB 0x61D0
+0xB2FC 0x6212
+0xB2FD 0x62D0
+0xB2FE 0x6539
+0xB3A1 0x9B41
+0xB3A2 0x6666
+0xB3A3 0x68B0
+0xB3A4 0x6D77
+0xB3A5 0x7070
+0xB3A6 0x754C
+0xB3A7 0x7686
+0xB3A8 0x7D75
+0xB3A9 0x82A5
+0xB3AA 0x87F9
+0xB3AB 0x958B
+0xB3AC 0x968E
+0xB3AD 0x8C9D
+0xB3AE 0x51F1
+0xB3AF 0x52BE
+0xB3B0 0x5916
+0xB3B1 0x54B3
+0xB3B2 0x5BB3
+0xB3B3 0x5D16
+0xB3B4 0x6168
+0xB3B5 0x6982
+0xB3B6 0x6DAF
+0xB3B7 0x788D
+0xB3B8 0x84CB
+0xB3B9 0x8857
+0xB3BA 0x8A72
+0xB3BB 0x93A7
+0xB3BC 0x9AB8
+0xB3BD 0x6D6C
+0xB3BE 0x99A8
+0xB3BF 0x86D9
+0xB3C0 0x57A3
+0xB3C1 0x67FF
+0xB3C2 0x86CE
+0xB3C3 0x920E
+0xB3C4 0x5283
+0xB3C5 0x5687
+0xB3C6 0x5404
+0xB3C7 0x5ED3
+0xB3C8 0x62E1
+0xB3C9 0x64B9
+0xB3CA 0x683C
+0xB3CB 0x6838
+0xB3CC 0x6BBB
+0xB3CD 0x7372
+0xB3CE 0x78BA
+0xB3CF 0x7A6B
+0xB3D0 0x899A
+0xB3D1 0x89D2
+0xB3D2 0x8D6B
+0xB3D3 0x8F03
+0xB3D4 0x90ED
+0xB3D5 0x95A3
+0xB3D6 0x9694
+0xB3D7 0x9769
+0xB3D8 0x5B66
+0xB3D9 0x5CB3
+0xB3DA 0x697D
+0xB3DB 0x984D
+0xB3DC 0x984E
+0xB3DD 0x639B
+0xB3DE 0x7B20
+0xB3DF 0x6A2B
+0xB3E0 0x6A7F
+0xB3E1 0x68B6
+0xB3E2 0x9C0D
+0xB3E3 0x6F5F
+0xB3E4 0x5272
+0xB3E5 0x559D
+0xB3E6 0x6070
+0xB3E7 0x62EC
+0xB3E8 0x6D3B
+0xB3E9 0x6E07
+0xB3EA 0x6ED1
+0xB3EB 0x845B
+0xB3EC 0x8910
+0xB3ED 0x8F44
+0xB3EE 0x4E14
+0xB3EF 0x9C39
+0xB3F0 0x53F6
+0xB3F1 0x691B
+0xB3F2 0x6A3A
+0xB3F3 0x9784
+0xB3F4 0x682A
+0xB3F5 0x515C
+0xB3F6 0x7AC3
+0xB3F7 0x84B2
+0xB3F8 0x91DC
+0xB3F9 0x938C
+0xB3FA 0x565B
+0xB3FB 0x9D28
+0xB3FC 0x6822
+0xB3FD 0x8305
+0xB3FE 0x8431
+0xB4A1 0x7CA5
+0xB4A2 0x5208
+0xB4A3 0x82C5
+0xB4A4 0x74E6
+0xB4A5 0x4E7E
+0xB4A6 0x4F83
+0xB4A7 0x51A0
+0xB4A8 0x5BD2
+0xB4A9 0x520A
+0xB4AA 0x52D8
+0xB4AB 0x52E7
+0xB4AC 0x5DFB
+0xB4AD 0x559A
+0xB4AE 0x582A
+0xB4AF 0x59E6
+0xB4B0 0x5B8C
+0xB4B1 0x5B98
+0xB4B2 0x5BDB
+0xB4B3 0x5E72
+0xB4B4 0x5E79
+0xB4B5 0x60A3
+0xB4B6 0x611F
+0xB4B7 0x6163
+0xB4B8 0x61BE
+0xB4B9 0x63DB
+0xB4BA 0x6562
+0xB4BB 0x67D1
+0xB4BC 0x6853
+0xB4BD 0x68FA
+0xB4BE 0x6B3E
+0xB4BF 0x6B53
+0xB4C0 0x6C57
+0xB4C1 0x6F22
+0xB4C2 0x6F97
+0xB4C3 0x6F45
+0xB4C4 0x74B0
+0xB4C5 0x7518
+0xB4C6 0x76E3
+0xB4C7 0x770B
+0xB4C8 0x7AFF
+0xB4C9 0x7BA1
+0xB4CA 0x7C21
+0xB4CB 0x7DE9
+0xB4CC 0x7F36
+0xB4CD 0x7FF0
+0xB4CE 0x809D
+0xB4CF 0x8266
+0xB4D0 0x839E
+0xB4D1 0x89B3
+0xB4D2 0x8ACC
+0xB4D3 0x8CAB
+0xB4D4 0x9084
+0xB4D5 0x9451
+0xB4D6 0x9593
+0xB4D7 0x9591
+0xB4D8 0x95A2
+0xB4D9 0x9665
+0xB4DA 0x97D3
+0xB4DB 0x9928
+0xB4DC 0x8218
+0xB4DD 0x4E38
+0xB4DE 0x542B
+0xB4DF 0x5CB8
+0xB4E0 0x5DCC
+0xB4E1 0x73A9
+0xB4E2 0x764C
+0xB4E3 0x773C
+0xB4E4 0x5CA9
+0xB4E5 0x7FEB
+0xB4E6 0x8D0B
+0xB4E7 0x96C1
+0xB4E8 0x9811
+0xB4E9 0x9854
+0xB4EA 0x9858
+0xB4EB 0x4F01
+0xB4EC 0x4F0E
+0xB4ED 0x5371
+0xB4EE 0x559C
+0xB4EF 0x5668
+0xB4F0 0x57FA
+0xB4F1 0x5947
+0xB4F2 0x5B09
+0xB4F3 0x5BC4
+0xB4F4 0x5C90
+0xB4F5 0x5E0C
+0xB4F6 0x5E7E
+0xB4F7 0x5FCC
+0xB4F8 0x63EE
+0xB4F9 0x673A
+0xB4FA 0x65D7
+0xB4FB 0x65E2
+0xB4FC 0x671F
+0xB4FD 0x68CB
+0xB4FE 0x68C4
+0xB5A1 0x6A5F
+0xB5A2 0x5E30
+0xB5A3 0x6BC5
+0xB5A4 0x6C17
+0xB5A5 0x6C7D
+0xB5A6 0x757F
+0xB5A7 0x7948
+0xB5A8 0x5B63
+0xB5A9 0x7A00
+0xB5AA 0x7D00
+0xB5AB 0x5FBD
+0xB5AC 0x898F
+0xB5AD 0x8A18
+0xB5AE 0x8CB4
+0xB5AF 0x8D77
+0xB5B0 0x8ECC
+0xB5B1 0x8F1D
+0xB5B2 0x98E2
+0xB5B3 0x9A0E
+0xB5B4 0x9B3C
+0xB5B5 0x4E80
+0xB5B6 0x507D
+0xB5B7 0x5100
+0xB5B8 0x5993
+0xB5B9 0x5B9C
+0xB5BA 0x622F
+0xB5BB 0x6280
+0xB5BC 0x64EC
+0xB5BD 0x6B3A
+0xB5BE 0x72A0
+0xB5BF 0x7591
+0xB5C0 0x7947
+0xB5C1 0x7FA9
+0xB5C2 0x87FB
+0xB5C3 0x8ABC
+0xB5C4 0x8B70
+0xB5C5 0x63AC
+0xB5C6 0x83CA
+0xB5C7 0x97A0
+0xB5C8 0x5409
+0xB5C9 0x5403
+0xB5CA 0x55AB
+0xB5CB 0x6854
+0xB5CC 0x6A58
+0xB5CD 0x8A70
+0xB5CE 0x7827
+0xB5CF 0x6775
+0xB5D0 0x9ECD
+0xB5D1 0x5374
+0xB5D2 0x5BA2
+0xB5D3 0x811A
+0xB5D4 0x8650
+0xB5D5 0x9006
+0xB5D6 0x4E18
+0xB5D7 0x4E45
+0xB5D8 0x4EC7
+0xB5D9 0x4F11
+0xB5DA 0x53CA
+0xB5DB 0x5438
+0xB5DC 0x5BAE
+0xB5DD 0x5F13
+0xB5DE 0x6025
+0xB5DF 0x6551
+0xB5E0 0x673D
+0xB5E1 0x6C42
+0xB5E2 0x6C72
+0xB5E3 0x6CE3
+0xB5E4 0x7078
+0xB5E5 0x7403
+0xB5E6 0x7A76
+0xB5E7 0x7AAE
+0xB5E8 0x7B08
+0xB5E9 0x7D1A
+0xB5EA 0x7CFE
+0xB5EB 0x7D66
+0xB5EC 0x65E7
+0xB5ED 0x725B
+0xB5EE 0x53BB
+0xB5EF 0x5C45
+0xB5F0 0x5DE8
+0xB5F1 0x62D2
+0xB5F2 0x62E0
+0xB5F3 0x6319
+0xB5F4 0x6E20
+0xB5F5 0x865A
+0xB5F6 0x8A31
+0xB5F7 0x8DDD
+0xB5F8 0x92F8
+0xB5F9 0x6F01
+0xB5FA 0x79A6
+0xB5FB 0x9B5A
+0xB5FC 0x4EA8
+0xB5FD 0x4EAB
+0xB5FE 0x4EAC
+0xB6A1 0x4F9B
+0xB6A2 0x4FA0
+0xB6A3 0x50D1
+0xB6A4 0x5147
+0xB6A5 0x7AF6
+0xB6A6 0x5171
+0xB6A7 0x51F6
+0xB6A8 0x5354
+0xB6A9 0x5321
+0xB6AA 0x537F
+0xB6AB 0x53EB
+0xB6AC 0x55AC
+0xB6AD 0x5883
+0xB6AE 0x5CE1
+0xB6AF 0x5F37
+0xB6B0 0x5F4A
+0xB6B1 0x602F
+0xB6B2 0x6050
+0xB6B3 0x606D
+0xB6B4 0x631F
+0xB6B5 0x6559
+0xB6B6 0x6A4B
+0xB6B7 0x6CC1
+0xB6B8 0x72C2
+0xB6B9 0x72ED
+0xB6BA 0x77EF
+0xB6BB 0x80F8
+0xB6BC 0x8105
+0xB6BD 0x8208
+0xB6BE 0x854E
+0xB6BF 0x90F7
+0xB6C0 0x93E1
+0xB6C1 0x97FF
+0xB6C2 0x9957
+0xB6C3 0x9A5A
+0xB6C4 0x4EF0
+0xB6C5 0x51DD
+0xB6C6 0x5C2D
+0xB6C7 0x6681
+0xB6C8 0x696D
+0xB6C9 0x5C40
+0xB6CA 0x66F2
+0xB6CB 0x6975
+0xB6CC 0x7389
+0xB6CD 0x6850
+0xB6CE 0x7C81
+0xB6CF 0x50C5
+0xB6D0 0x52E4
+0xB6D1 0x5747
+0xB6D2 0x5DFE
+0xB6D3 0x9326
+0xB6D4 0x65A4
+0xB6D5 0x6B23
+0xB6D6 0x6B3D
+0xB6D7 0x7434
+0xB6D8 0x7981
+0xB6D9 0x79BD
+0xB6DA 0x7B4B
+0xB6DB 0x7DCA
+0xB6DC 0x82B9
+0xB6DD 0x83CC
+0xB6DE 0x887F
+0xB6DF 0x895F
+0xB6E0 0x8B39
+0xB6E1 0x8FD1
+0xB6E2 0x91D1
+0xB6E3 0x541F
+0xB6E4 0x9280
+0xB6E5 0x4E5D
+0xB6E6 0x5036
+0xB6E7 0x53E5
+0xB6E8 0x533A
+0xB6E9 0x72D7
+0xB6EA 0x7396
+0xB6EB 0x77E9
+0xB6EC 0x82E6
+0xB6ED 0x8EAF
+0xB6EE 0x99C6
+0xB6EF 0x99C8
+0xB6F0 0x99D2
+0xB6F1 0x5177
+0xB6F2 0x611A
+0xB6F3 0x865E
+0xB6F4 0x55B0
+0xB6F5 0x7A7A
+0xB6F6 0x5076
+0xB6F7 0x5BD3
+0xB6F8 0x9047
+0xB6F9 0x9685
+0xB6FA 0x4E32
+0xB6FB 0x6ADB
+0xB6FC 0x91E7
+0xB6FD 0x5C51
+0xB6FE 0x5C48
+0xB7A1 0x6398
+0xB7A2 0x7A9F
+0xB7A3 0x6C93
+0xB7A4 0x9774
+0xB7A5 0x8F61
+0xB7A6 0x7AAA
+0xB7A7 0x718A
+0xB7A8 0x9688
+0xB7A9 0x7C82
+0xB7AA 0x6817
+0xB7AB 0x7E70
+0xB7AC 0x6851
+0xB7AD 0x936C
+0xB7AE 0x52F2
+0xB7AF 0x541B
+0xB7B0 0x85AB
+0xB7B1 0x8A13
+0xB7B2 0x7FA4
+0xB7B3 0x8ECD
+0xB7B4 0x90E1
+0xB7B5 0x5366
+0xB7B6 0x8888
+0xB7B7 0x7941
+0xB7B8 0x4FC2
+0xB7B9 0x50BE
+0xB7BA 0x5211
+0xB7BB 0x5144
+0xB7BC 0x5553
+0xB7BD 0x572D
+0xB7BE 0x73EA
+0xB7BF 0x578B
+0xB7C0 0x5951
+0xB7C1 0x5F62
+0xB7C2 0x5F84
+0xB7C3 0x6075
+0xB7C4 0x6176
+0xB7C5 0x6167
+0xB7C6 0x61A9
+0xB7C7 0x63B2
+0xB7C8 0x643A
+0xB7C9 0x656C
+0xB7CA 0x666F
+0xB7CB 0x6842
+0xB7CC 0x6E13
+0xB7CD 0x7566
+0xB7CE 0x7A3D
+0xB7CF 0x7CFB
+0xB7D0 0x7D4C
+0xB7D1 0x7D99
+0xB7D2 0x7E4B
+0xB7D3 0x7F6B
+0xB7D4 0x830E
+0xB7D5 0x834A
+0xB7D6 0x86CD
+0xB7D7 0x8A08
+0xB7D8 0x8A63
+0xB7D9 0x8B66
+0xB7DA 0x8EFD
+0xB7DB 0x981A
+0xB7DC 0x9D8F
+0xB7DD 0x82B8
+0xB7DE 0x8FCE
+0xB7DF 0x9BE8
+0xB7E0 0x5287
+0xB7E1 0x621F
+0xB7E2 0x6483
+0xB7E3 0x6FC0
+0xB7E4 0x9699
+0xB7E5 0x6841
+0xB7E6 0x5091
+0xB7E7 0x6B20
+0xB7E8 0x6C7A
+0xB7E9 0x6F54
+0xB7EA 0x7A74
+0xB7EB 0x7D50
+0xB7EC 0x8840
+0xB7ED 0x8A23
+0xB7EE 0x6708
+0xB7EF 0x4EF6
+0xB7F0 0x5039
+0xB7F1 0x5026
+0xB7F2 0x5065
+0xB7F3 0x517C
+0xB7F4 0x5238
+0xB7F5 0x5263
+0xB7F6 0x55A7
+0xB7F7 0x570F
+0xB7F8 0x5805
+0xB7F9 0x5ACC
+0xB7FA 0x5EFA
+0xB7FB 0x61B2
+0xB7FC 0x61F8
+0xB7FD 0x62F3
+0xB7FE 0x6372
+0xB8A1 0x691C
+0xB8A2 0x6A29
+0xB8A3 0x727D
+0xB8A4 0x72AC
+0xB8A5 0x732E
+0xB8A6 0x7814
+0xB8A7 0x786F
+0xB8A8 0x7D79
+0xB8A9 0x770C
+0xB8AA 0x80A9
+0xB8AB 0x898B
+0xB8AC 0x8B19
+0xB8AD 0x8CE2
+0xB8AE 0x8ED2
+0xB8AF 0x9063
+0xB8B0 0x9375
+0xB8B1 0x967A
+0xB8B2 0x9855
+0xB8B3 0x9A13
+0xB8B4 0x9E78
+0xB8B5 0x5143
+0xB8B6 0x539F
+0xB8B7 0x53B3
+0xB8B8 0x5E7B
+0xB8B9 0x5F26
+0xB8BA 0x6E1B
+0xB8BB 0x6E90
+0xB8BC 0x7384
+0xB8BD 0x73FE
+0xB8BE 0x7D43
+0xB8BF 0x8237
+0xB8C0 0x8A00
+0xB8C1 0x8AFA
+0xB8C2 0x9650
+0xB8C3 0x4E4E
+0xB8C4 0x500B
+0xB8C5 0x53E4
+0xB8C6 0x547C
+0xB8C7 0x56FA
+0xB8C8 0x59D1
+0xB8C9 0x5B64
+0xB8CA 0x5DF1
+0xB8CB 0x5EAB
+0xB8CC 0x5F27
+0xB8CD 0x6238
+0xB8CE 0x6545
+0xB8CF 0x67AF
+0xB8D0 0x6E56
+0xB8D1 0x72D0
+0xB8D2 0x7CCA
+0xB8D3 0x88B4
+0xB8D4 0x80A1
+0xB8D5 0x80E1
+0xB8D6 0x83F0
+0xB8D7 0x864E
+0xB8D8 0x8A87
+0xB8D9 0x8DE8
+0xB8DA 0x9237
+0xB8DB 0x96C7
+0xB8DC 0x9867
+0xB8DD 0x9F13
+0xB8DE 0x4E94
+0xB8DF 0x4E92
+0xB8E0 0x4F0D
+0xB8E1 0x5348
+0xB8E2 0x5449
+0xB8E3 0x543E
+0xB8E4 0x5A2F
+0xB8E5 0x5F8C
+0xB8E6 0x5FA1
+0xB8E7 0x609F
+0xB8E8 0x68A7
+0xB8E9 0x6A8E
+0xB8EA 0x745A
+0xB8EB 0x7881
+0xB8EC 0x8A9E
+0xB8ED 0x8AA4
+0xB8EE 0x8B77
+0xB8EF 0x9190
+0xB8F0 0x4E5E
+0xB8F1 0x9BC9
+0xB8F2 0x4EA4
+0xB8F3 0x4F7C
+0xB8F4 0x4FAF
+0xB8F5 0x5019
+0xB8F6 0x5016
+0xB8F7 0x5149
+0xB8F8 0x516C
+0xB8F9 0x529F
+0xB8FA 0x52B9
+0xB8FB 0x52FE
+0xB8FC 0x539A
+0xB8FD 0x53E3
+0xB8FE 0x5411
+0xB9A1 0x540E
+0xB9A2 0x5589
+0xB9A3 0x5751
+0xB9A4 0x57A2
+0xB9A5 0x597D
+0xB9A6 0x5B54
+0xB9A7 0x5B5D
+0xB9A8 0x5B8F
+0xB9A9 0x5DE5
+0xB9AA 0x5DE7
+0xB9AB 0x5DF7
+0xB9AC 0x5E78
+0xB9AD 0x5E83
+0xB9AE 0x5E9A
+0xB9AF 0x5EB7
+0xB9B0 0x5F18
+0xB9B1 0x6052
+0xB9B2 0x614C
+0xB9B3 0x6297
+0xB9B4 0x62D8
+0xB9B5 0x63A7
+0xB9B6 0x653B
+0xB9B7 0x6602
+0xB9B8 0x6643
+0xB9B9 0x66F4
+0xB9BA 0x676D
+0xB9BB 0x6821
+0xB9BC 0x6897
+0xB9BD 0x69CB
+0xB9BE 0x6C5F
+0xB9BF 0x6D2A
+0xB9C0 0x6D69
+0xB9C1 0x6E2F
+0xB9C2 0x6E9D
+0xB9C3 0x7532
+0xB9C4 0x7687
+0xB9C5 0x786C
+0xB9C6 0x7A3F
+0xB9C7 0x7CE0
+0xB9C8 0x7D05
+0xB9C9 0x7D18
+0xB9CA 0x7D5E
+0xB9CB 0x7DB1
+0xB9CC 0x8015
+0xB9CD 0x8003
+0xB9CE 0x80AF
+0xB9CF 0x80B1
+0xB9D0 0x8154
+0xB9D1 0x818F
+0xB9D2 0x822A
+0xB9D3 0x8352
+0xB9D4 0x884C
+0xB9D5 0x8861
+0xB9D6 0x8B1B
+0xB9D7 0x8CA2
+0xB9D8 0x8CFC
+0xB9D9 0x90CA
+0xB9DA 0x9175
+0xB9DB 0x9271
+0xB9DC 0x783F
+0xB9DD 0x92FC
+0xB9DE 0x95A4
+0xB9DF 0x964D
+0xB9E0 0x9805
+0xB9E1 0x9999
+0xB9E2 0x9AD8
+0xB9E3 0x9D3B
+0xB9E4 0x525B
+0xB9E5 0x52AB
+0xB9E6 0x53F7
+0xB9E7 0x5408
+0xB9E8 0x58D5
+0xB9E9 0x62F7
+0xB9EA 0x6FE0
+0xB9EB 0x8C6A
+0xB9EC 0x8F5F
+0xB9ED 0x9EB9
+0xB9EE 0x514B
+0xB9EF 0x523B
+0xB9F0 0x544A
+0xB9F1 0x56FD
+0xB9F2 0x7A40
+0xB9F3 0x9177
+0xB9F4 0x9D60
+0xB9F5 0x9ED2
+0xB9F6 0x7344
+0xB9F7 0x6F09
+0xB9F8 0x8170
+0xB9F9 0x7511
+0xB9FA 0x5FFD
+0xB9FB 0x60DA
+0xB9FC 0x9AA8
+0xB9FD 0x72DB
+0xB9FE 0x8FBC
+0xBAA1 0x6B64
+0xBAA2 0x9803
+0xBAA3 0x4ECA
+0xBAA4 0x56F0
+0xBAA5 0x5764
+0xBAA6 0x58BE
+0xBAA7 0x5A5A
+0xBAA8 0x6068
+0xBAA9 0x61C7
+0xBAAA 0x660F
+0xBAAB 0x6606
+0xBAAC 0x6839
+0xBAAD 0x68B1
+0xBAAE 0x6DF7
+0xBAAF 0x75D5
+0xBAB0 0x7D3A
+0xBAB1 0x826E
+0xBAB2 0x9B42
+0xBAB3 0x4E9B
+0xBAB4 0x4F50
+0xBAB5 0x53C9
+0xBAB6 0x5506
+0xBAB7 0x5D6F
+0xBAB8 0x5DE6
+0xBAB9 0x5DEE
+0xBABA 0x67FB
+0xBABB 0x6C99
+0xBABC 0x7473
+0xBABD 0x7802
+0xBABE 0x8A50
+0xBABF 0x9396
+0xBAC0 0x88DF
+0xBAC1 0x5750
+0xBAC2 0x5EA7
+0xBAC3 0x632B
+0xBAC4 0x50B5
+0xBAC5 0x50AC
+0xBAC6 0x518D
+0xBAC7 0x6700
+0xBAC8 0x54C9
+0xBAC9 0x585E
+0xBACA 0x59BB
+0xBACB 0x5BB0
+0xBACC 0x5F69
+0xBACD 0x624D
+0xBACE 0x63A1
+0xBACF 0x683D
+0xBAD0 0x6B73
+0xBAD1 0x6E08
+0xBAD2 0x707D
+0xBAD3 0x91C7
+0xBAD4 0x7280
+0xBAD5 0x7815
+0xBAD6 0x7826
+0xBAD7 0x796D
+0xBAD8 0x658E
+0xBAD9 0x7D30
+0xBADA 0x83DC
+0xBADB 0x88C1
+0xBADC 0x8F09
+0xBADD 0x969B
+0xBADE 0x5264
+0xBADF 0x5728
+0xBAE0 0x6750
+0xBAE1 0x7F6A
+0xBAE2 0x8CA1
+0xBAE3 0x51B4
+0xBAE4 0x5742
+0xBAE5 0x962A
+0xBAE6 0x583A
+0xBAE7 0x698A
+0xBAE8 0x80B4
+0xBAE9 0x54B2
+0xBAEA 0x5D0E
+0xBAEB 0x57FC
+0xBAEC 0x7895
+0xBAED 0x9DFA
+0xBAEE 0x4F5C
+0xBAEF 0x524A
+0xBAF0 0x548B
+0xBAF1 0x643E
+0xBAF2 0x6628
+0xBAF3 0x6714
+0xBAF4 0x67F5
+0xBAF5 0x7A84
+0xBAF6 0x7B56
+0xBAF7 0x7D22
+0xBAF8 0x932F
+0xBAF9 0x685C
+0xBAFA 0x9BAD
+0xBAFB 0x7B39
+0xBAFC 0x5319
+0xBAFD 0x518A
+0xBAFE 0x5237
+0xBBA1 0x5BDF
+0xBBA2 0x62F6
+0xBBA3 0x64AE
+0xBBA4 0x64E6
+0xBBA5 0x672D
+0xBBA6 0x6BBA
+0xBBA7 0x85A9
+0xBBA8 0x96D1
+0xBBA9 0x7690
+0xBBAA 0x9BD6
+0xBBAB 0x634C
+0xBBAC 0x9306
+0xBBAD 0x9BAB
+0xBBAE 0x76BF
+0xBBAF 0x6652
+0xBBB0 0x4E09
+0xBBB1 0x5098
+0xBBB2 0x53C2
+0xBBB3 0x5C71
+0xBBB4 0x60E8
+0xBBB5 0x6492
+0xBBB6 0x6563
+0xBBB7 0x685F
+0xBBB8 0x71E6
+0xBBB9 0x73CA
+0xBBBA 0x7523
+0xBBBB 0x7B97
+0xBBBC 0x7E82
+0xBBBD 0x8695
+0xBBBE 0x8B83
+0xBBBF 0x8CDB
+0xBBC0 0x9178
+0xBBC1 0x9910
+0xBBC2 0x65AC
+0xBBC3 0x66AB
+0xBBC4 0x6B8B
+0xBBC5 0x4ED5
+0xBBC6 0x4ED4
+0xBBC7 0x4F3A
+0xBBC8 0x4F7F
+0xBBC9 0x523A
+0xBBCA 0x53F8
+0xBBCB 0x53F2
+0xBBCC 0x55E3
+0xBBCD 0x56DB
+0xBBCE 0x58EB
+0xBBCF 0x59CB
+0xBBD0 0x59C9
+0xBBD1 0x59FF
+0xBBD2 0x5B50
+0xBBD3 0x5C4D
+0xBBD4 0x5E02
+0xBBD5 0x5E2B
+0xBBD6 0x5FD7
+0xBBD7 0x601D
+0xBBD8 0x6307
+0xBBD9 0x652F
+0xBBDA 0x5B5C
+0xBBDB 0x65AF
+0xBBDC 0x65BD
+0xBBDD 0x65E8
+0xBBDE 0x679D
+0xBBDF 0x6B62
+0xBBE0 0x6B7B
+0xBBE1 0x6C0F
+0xBBE2 0x7345
+0xBBE3 0x7949
+0xBBE4 0x79C1
+0xBBE5 0x7CF8
+0xBBE6 0x7D19
+0xBBE7 0x7D2B
+0xBBE8 0x80A2
+0xBBE9 0x8102
+0xBBEA 0x81F3
+0xBBEB 0x8996
+0xBBEC 0x8A5E
+0xBBED 0x8A69
+0xBBEE 0x8A66
+0xBBEF 0x8A8C
+0xBBF0 0x8AEE
+0xBBF1 0x8CC7
+0xBBF2 0x8CDC
+0xBBF3 0x96CC
+0xBBF4 0x98FC
+0xBBF5 0x6B6F
+0xBBF6 0x4E8B
+0xBBF7 0x4F3C
+0xBBF8 0x4F8D
+0xBBF9 0x5150
+0xBBFA 0x5B57
+0xBBFB 0x5BFA
+0xBBFC 0x6148
+0xBBFD 0x6301
+0xBBFE 0x6642
+0xBCA1 0x6B21
+0xBCA2 0x6ECB
+0xBCA3 0x6CBB
+0xBCA4 0x723E
+0xBCA5 0x74BD
+0xBCA6 0x75D4
+0xBCA7 0x78C1
+0xBCA8 0x793A
+0xBCA9 0x800C
+0xBCAA 0x8033
+0xBCAB 0x81EA
+0xBCAC 0x8494
+0xBCAD 0x8F9E
+0xBCAE 0x6C50
+0xBCAF 0x9E7F
+0xBCB0 0x5F0F
+0xBCB1 0x8B58
+0xBCB2 0x9D2B
+0xBCB3 0x7AFA
+0xBCB4 0x8EF8
+0xBCB5 0x5B8D
+0xBCB6 0x96EB
+0xBCB7 0x4E03
+0xBCB8 0x53F1
+0xBCB9 0x57F7
+0xBCBA 0x5931
+0xBCBB 0x5AC9
+0xBCBC 0x5BA4
+0xBCBD 0x6089
+0xBCBE 0x6E7F
+0xBCBF 0x6F06
+0xBCC0 0x75BE
+0xBCC1 0x8CEA
+0xBCC2 0x5B9F
+0xBCC3 0x8500
+0xBCC4 0x7BE0
+0xBCC5 0x5072
+0xBCC6 0x67F4
+0xBCC7 0x829D
+0xBCC8 0x5C61
+0xBCC9 0x854A
+0xBCCA 0x7E1E
+0xBCCB 0x820E
+0xBCCC 0x5199
+0xBCCD 0x5C04
+0xBCCE 0x6368
+0xBCCF 0x8D66
+0xBCD0 0x659C
+0xBCD1 0x716E
+0xBCD2 0x793E
+0xBCD3 0x7D17
+0xBCD4 0x8005
+0xBCD5 0x8B1D
+0xBCD6 0x8ECA
+0xBCD7 0x906E
+0xBCD8 0x86C7
+0xBCD9 0x90AA
+0xBCDA 0x501F
+0xBCDB 0x52FA
+0xBCDC 0x5C3A
+0xBCDD 0x6753
+0xBCDE 0x707C
+0xBCDF 0x7235
+0xBCE0 0x914C
+0xBCE1 0x91C8
+0xBCE2 0x932B
+0xBCE3 0x82E5
+0xBCE4 0x5BC2
+0xBCE5 0x5F31
+0xBCE6 0x60F9
+0xBCE7 0x4E3B
+0xBCE8 0x53D6
+0xBCE9 0x5B88
+0xBCEA 0x624B
+0xBCEB 0x6731
+0xBCEC 0x6B8A
+0xBCED 0x72E9
+0xBCEE 0x73E0
+0xBCEF 0x7A2E
+0xBCF0 0x816B
+0xBCF1 0x8DA3
+0xBCF2 0x9152
+0xBCF3 0x9996
+0xBCF4 0x5112
+0xBCF5 0x53D7
+0xBCF6 0x546A
+0xBCF7 0x5BFF
+0xBCF8 0x6388
+0xBCF9 0x6A39
+0xBCFA 0x7DAC
+0xBCFB 0x9700
+0xBCFC 0x56DA
+0xBCFD 0x53CE
+0xBCFE 0x5468
+0xBDA1 0x5B97
+0xBDA2 0x5C31
+0xBDA3 0x5DDE
+0xBDA4 0x4FEE
+0xBDA5 0x6101
+0xBDA6 0x62FE
+0xBDA7 0x6D32
+0xBDA8 0x79C0
+0xBDA9 0x79CB
+0xBDAA 0x7D42
+0xBDAB 0x7E4D
+0xBDAC 0x7FD2
+0xBDAD 0x81ED
+0xBDAE 0x821F
+0xBDAF 0x8490
+0xBDB0 0x8846
+0xBDB1 0x8972
+0xBDB2 0x8B90
+0xBDB3 0x8E74
+0xBDB4 0x8F2F
+0xBDB5 0x9031
+0xBDB6 0x914B
+0xBDB7 0x916C
+0xBDB8 0x96C6
+0xBDB9 0x919C
+0xBDBA 0x4EC0
+0xBDBB 0x4F4F
+0xBDBC 0x5145
+0xBDBD 0x5341
+0xBDBE 0x5F93
+0xBDBF 0x620E
+0xBDC0 0x67D4
+0xBDC1 0x6C41
+0xBDC2 0x6E0B
+0xBDC3 0x7363
+0xBDC4 0x7E26
+0xBDC5 0x91CD
+0xBDC6 0x9283
+0xBDC7 0x53D4
+0xBDC8 0x5919
+0xBDC9 0x5BBF
+0xBDCA 0x6DD1
+0xBDCB 0x795D
+0xBDCC 0x7E2E
+0xBDCD 0x7C9B
+0xBDCE 0x587E
+0xBDCF 0x719F
+0xBDD0 0x51FA
+0xBDD1 0x8853
+0xBDD2 0x8FF0
+0xBDD3 0x4FCA
+0xBDD4 0x5CFB
+0xBDD5 0x6625
+0xBDD6 0x77AC
+0xBDD7 0x7AE3
+0xBDD8 0x821C
+0xBDD9 0x99FF
+0xBDDA 0x51C6
+0xBDDB 0x5FAA
+0xBDDC 0x65EC
+0xBDDD 0x696F
+0xBDDE 0x6B89
+0xBDDF 0x6DF3
+0xBDE0 0x6E96
+0xBDE1 0x6F64
+0xBDE2 0x76FE
+0xBDE3 0x7D14
+0xBDE4 0x5DE1
+0xBDE5 0x9075
+0xBDE6 0x9187
+0xBDE7 0x9806
+0xBDE8 0x51E6
+0xBDE9 0x521D
+0xBDEA 0x6240
+0xBDEB 0x6691
+0xBDEC 0x66D9
+0xBDED 0x6E1A
+0xBDEE 0x5EB6
+0xBDEF 0x7DD2
+0xBDF0 0x7F72
+0xBDF1 0x66F8
+0xBDF2 0x85AF
+0xBDF3 0x85F7
+0xBDF4 0x8AF8
+0xBDF5 0x52A9
+0xBDF6 0x53D9
+0xBDF7 0x5973
+0xBDF8 0x5E8F
+0xBDF9 0x5F90
+0xBDFA 0x6055
+0xBDFB 0x92E4
+0xBDFC 0x9664
+0xBDFD 0x50B7
+0xBDFE 0x511F
+0xBEA1 0x52DD
+0xBEA2 0x5320
+0xBEA3 0x5347
+0xBEA4 0x53EC
+0xBEA5 0x54E8
+0xBEA6 0x5546
+0xBEA7 0x5531
+0xBEA8 0x5617
+0xBEA9 0x5968
+0xBEAA 0x59BE
+0xBEAB 0x5A3C
+0xBEAC 0x5BB5
+0xBEAD 0x5C06
+0xBEAE 0x5C0F
+0xBEAF 0x5C11
+0xBEB0 0x5C1A
+0xBEB1 0x5E84
+0xBEB2 0x5E8A
+0xBEB3 0x5EE0
+0xBEB4 0x5F70
+0xBEB5 0x627F
+0xBEB6 0x6284
+0xBEB7 0x62DB
+0xBEB8 0x638C
+0xBEB9 0x6377
+0xBEBA 0x6607
+0xBEBB 0x660C
+0xBEBC 0x662D
+0xBEBD 0x6676
+0xBEBE 0x677E
+0xBEBF 0x68A2
+0xBEC0 0x6A1F
+0xBEC1 0x6A35
+0xBEC2 0x6CBC
+0xBEC3 0x6D88
+0xBEC4 0x6E09
+0xBEC5 0x6E58
+0xBEC6 0x713C
+0xBEC7 0x7126
+0xBEC8 0x7167
+0xBEC9 0x75C7
+0xBECA 0x7701
+0xBECB 0x785D
+0xBECC 0x7901
+0xBECD 0x7965
+0xBECE 0x79F0
+0xBECF 0x7AE0
+0xBED0 0x7B11
+0xBED1 0x7CA7
+0xBED2 0x7D39
+0xBED3 0x8096
+0xBED4 0x83D6
+0xBED5 0x848B
+0xBED6 0x8549
+0xBED7 0x885D
+0xBED8 0x88F3
+0xBED9 0x8A1F
+0xBEDA 0x8A3C
+0xBEDB 0x8A54
+0xBEDC 0x8A73
+0xBEDD 0x8C61
+0xBEDE 0x8CDE
+0xBEDF 0x91A4
+0xBEE0 0x9266
+0xBEE1 0x937E
+0xBEE2 0x9418
+0xBEE3 0x969C
+0xBEE4 0x9798
+0xBEE5 0x4E0A
+0xBEE6 0x4E08
+0xBEE7 0x4E1E
+0xBEE8 0x4E57
+0xBEE9 0x5197
+0xBEEA 0x5270
+0xBEEB 0x57CE
+0xBEEC 0x5834
+0xBEED 0x58CC
+0xBEEE 0x5B22
+0xBEEF 0x5E38
+0xBEF0 0x60C5
+0xBEF1 0x64FE
+0xBEF2 0x6761
+0xBEF3 0x6756
+0xBEF4 0x6D44
+0xBEF5 0x72B6
+0xBEF6 0x7573
+0xBEF7 0x7A63
+0xBEF8 0x84B8
+0xBEF9 0x8B72
+0xBEFA 0x91B8
+0xBEFB 0x9320
+0xBEFC 0x5631
+0xBEFD 0x57F4
+0xBEFE 0x98FE
+0xBFA1 0x62ED
+0xBFA2 0x690D
+0xBFA3 0x6B96
+0xBFA4 0x71ED
+0xBFA5 0x7E54
+0xBFA6 0x8077
+0xBFA7 0x8272
+0xBFA8 0x89E6
+0xBFA9 0x98DF
+0xBFAA 0x8755
+0xBFAB 0x8FB1
+0xBFAC 0x5C3B
+0xBFAD 0x4F38
+0xBFAE 0x4FE1
+0xBFAF 0x4FB5
+0xBFB0 0x5507
+0xBFB1 0x5A20
+0xBFB2 0x5BDD
+0xBFB3 0x5BE9
+0xBFB4 0x5FC3
+0xBFB5 0x614E
+0xBFB6 0x632F
+0xBFB7 0x65B0
+0xBFB8 0x664B
+0xBFB9 0x68EE
+0xBFBA 0x699B
+0xBFBB 0x6D78
+0xBFBC 0x6DF1
+0xBFBD 0x7533
+0xBFBE 0x75B9
+0xBFBF 0x771F
+0xBFC0 0x795E
+0xBFC1 0x79E6
+0xBFC2 0x7D33
+0xBFC3 0x81E3
+0xBFC4 0x82AF
+0xBFC5 0x85AA
+0xBFC6 0x89AA
+0xBFC7 0x8A3A
+0xBFC8 0x8EAB
+0xBFC9 0x8F9B
+0xBFCA 0x9032
+0xBFCB 0x91DD
+0xBFCC 0x9707
+0xBFCD 0x4EBA
+0xBFCE 0x4EC1
+0xBFCF 0x5203
+0xBFD0 0x5875
+0xBFD1 0x58EC
+0xBFD2 0x5C0B
+0xBFD3 0x751A
+0xBFD4 0x5C3D
+0xBFD5 0x814E
+0xBFD6 0x8A0A
+0xBFD7 0x8FC5
+0xBFD8 0x9663
+0xBFD9 0x976D
+0xBFDA 0x7B25
+0xBFDB 0x8ACF
+0xBFDC 0x9808
+0xBFDD 0x9162
+0xBFDE 0x56F3
+0xBFDF 0x53A8
+0xBFE0 0x9017
+0xBFE1 0x5439
+0xBFE2 0x5782
+0xBFE3 0x5E25
+0xBFE4 0x63A8
+0xBFE5 0x6C34
+0xBFE6 0x708A
+0xBFE7 0x7761
+0xBFE8 0x7C8B
+0xBFE9 0x7FE0
+0xBFEA 0x8870
+0xBFEB 0x9042
+0xBFEC 0x9154
+0xBFED 0x9310
+0xBFEE 0x9318
+0xBFEF 0x968F
+0xBFF0 0x745E
+0xBFF1 0x9AC4
+0xBFF2 0x5D07
+0xBFF3 0x5D69
+0xBFF4 0x6570
+0xBFF5 0x67A2
+0xBFF6 0x8DA8
+0xBFF7 0x96DB
+0xBFF8 0x636E
+0xBFF9 0x6749
+0xBFFA 0x6919
+0xBFFB 0x83C5
+0xBFFC 0x9817
+0xBFFD 0x96C0
+0xBFFE 0x88FE
+0xC0A1 0x6F84
+0xC0A2 0x647A
+0xC0A3 0x5BF8
+0xC0A4 0x4E16
+0xC0A5 0x702C
+0xC0A6 0x755D
+0xC0A7 0x662F
+0xC0A8 0x51C4
+0xC0A9 0x5236
+0xC0AA 0x52E2
+0xC0AB 0x59D3
+0xC0AC 0x5F81
+0xC0AD 0x6027
+0xC0AE 0x6210
+0xC0AF 0x653F
+0xC0B0 0x6574
+0xC0B1 0x661F
+0xC0B2 0x6674
+0xC0B3 0x68F2
+0xC0B4 0x6816
+0xC0B5 0x6B63
+0xC0B6 0x6E05
+0xC0B7 0x7272
+0xC0B8 0x751F
+0xC0B9 0x76DB
+0xC0BA 0x7CBE
+0xC0BB 0x8056
+0xC0BC 0x58F0
+0xC0BD 0x88FD
+0xC0BE 0x897F
+0xC0BF 0x8AA0
+0xC0C0 0x8A93
+0xC0C1 0x8ACB
+0xC0C2 0x901D
+0xC0C3 0x9192
+0xC0C4 0x9752
+0xC0C5 0x9759
+0xC0C6 0x6589
+0xC0C7 0x7A0E
+0xC0C8 0x8106
+0xC0C9 0x96BB
+0xC0CA 0x5E2D
+0xC0CB 0x60DC
+0xC0CC 0x621A
+0xC0CD 0x65A5
+0xC0CE 0x6614
+0xC0CF 0x6790
+0xC0D0 0x77F3
+0xC0D1 0x7A4D
+0xC0D2 0x7C4D
+0xC0D3 0x7E3E
+0xC0D4 0x810A
+0xC0D5 0x8CAC
+0xC0D6 0x8D64
+0xC0D7 0x8DE1
+0xC0D8 0x8E5F
+0xC0D9 0x78A9
+0xC0DA 0x5207
+0xC0DB 0x62D9
+0xC0DC 0x63A5
+0xC0DD 0x6442
+0xC0DE 0x6298
+0xC0DF 0x8A2D
+0xC0E0 0x7A83
+0xC0E1 0x7BC0
+0xC0E2 0x8AAC
+0xC0E3 0x96EA
+0xC0E4 0x7D76
+0xC0E5 0x820C
+0xC0E6 0x8749
+0xC0E7 0x4ED9
+0xC0E8 0x5148
+0xC0E9 0x5343
+0xC0EA 0x5360
+0xC0EB 0x5BA3
+0xC0EC 0x5C02
+0xC0ED 0x5C16
+0xC0EE 0x5DDD
+0xC0EF 0x6226
+0xC0F0 0x6247
+0xC0F1 0x64B0
+0xC0F2 0x6813
+0xC0F3 0x6834
+0xC0F4 0x6CC9
+0xC0F5 0x6D45
+0xC0F6 0x6D17
+0xC0F7 0x67D3
+0xC0F8 0x6F5C
+0xC0F9 0x714E
+0xC0FA 0x717D
+0xC0FB 0x65CB
+0xC0FC 0x7A7F
+0xC0FD 0x7BAD
+0xC0FE 0x7DDA
+0xC1A1 0x7E4A
+0xC1A2 0x7FA8
+0xC1A3 0x817A
+0xC1A4 0x821B
+0xC1A5 0x8239
+0xC1A6 0x85A6
+0xC1A7 0x8A6E
+0xC1A8 0x8CCE
+0xC1A9 0x8DF5
+0xC1AA 0x9078
+0xC1AB 0x9077
+0xC1AC 0x92AD
+0xC1AD 0x9291
+0xC1AE 0x9583
+0xC1AF 0x9BAE
+0xC1B0 0x524D
+0xC1B1 0x5584
+0xC1B2 0x6F38
+0xC1B3 0x7136
+0xC1B4 0x5168
+0xC1B5 0x7985
+0xC1B6 0x7E55
+0xC1B7 0x81B3
+0xC1B8 0x7CCE
+0xC1B9 0x564C
+0xC1BA 0x5851
+0xC1BB 0x5CA8
+0xC1BC 0x63AA
+0xC1BD 0x66FE
+0xC1BE 0x66FD
+0xC1BF 0x695A
+0xC1C0 0x72D9
+0xC1C1 0x758F
+0xC1C2 0x758E
+0xC1C3 0x790E
+0xC1C4 0x7956
+0xC1C5 0x79DF
+0xC1C6 0x7C97
+0xC1C7 0x7D20
+0xC1C8 0x7D44
+0xC1C9 0x8607
+0xC1CA 0x8A34
+0xC1CB 0x963B
+0xC1CC 0x9061
+0xC1CD 0x9F20
+0xC1CE 0x50E7
+0xC1CF 0x5275
+0xC1D0 0x53CC
+0xC1D1 0x53E2
+0xC1D2 0x5009
+0xC1D3 0x55AA
+0xC1D4 0x58EE
+0xC1D5 0x594F
+0xC1D6 0x723D
+0xC1D7 0x5B8B
+0xC1D8 0x5C64
+0xC1D9 0x531D
+0xC1DA 0x60E3
+0xC1DB 0x60F3
+0xC1DC 0x635C
+0xC1DD 0x6383
+0xC1DE 0x633F
+0xC1DF 0x63BB
+0xC1E0 0x64CD
+0xC1E1 0x65E9
+0xC1E2 0x66F9
+0xC1E3 0x5DE3
+0xC1E4 0x69CD
+0xC1E5 0x69FD
+0xC1E6 0x6F15
+0xC1E7 0x71E5
+0xC1E8 0x4E89
+0xC1E9 0x75E9
+0xC1EA 0x76F8
+0xC1EB 0x7A93
+0xC1EC 0x7CDF
+0xC1ED 0x7DCF
+0xC1EE 0x7D9C
+0xC1EF 0x8061
+0xC1F0 0x8349
+0xC1F1 0x8358
+0xC1F2 0x846C
+0xC1F3 0x84BC
+0xC1F4 0x85FB
+0xC1F5 0x88C5
+0xC1F6 0x8D70
+0xC1F7 0x9001
+0xC1F8 0x906D
+0xC1F9 0x9397
+0xC1FA 0x971C
+0xC1FB 0x9A12
+0xC1FC 0x50CF
+0xC1FD 0x5897
+0xC1FE 0x618E
+0xC2A1 0x81D3
+0xC2A2 0x8535
+0xC2A3 0x8D08
+0xC2A4 0x9020
+0xC2A5 0x4FC3
+0xC2A6 0x5074
+0xC2A7 0x5247
+0xC2A8 0x5373
+0xC2A9 0x606F
+0xC2AA 0x6349
+0xC2AB 0x675F
+0xC2AC 0x6E2C
+0xC2AD 0x8DB3
+0xC2AE 0x901F
+0xC2AF 0x4FD7
+0xC2B0 0x5C5E
+0xC2B1 0x8CCA
+0xC2B2 0x65CF
+0xC2B3 0x7D9A
+0xC2B4 0x5352
+0xC2B5 0x8896
+0xC2B6 0x5176
+0xC2B7 0x63C3
+0xC2B8 0x5B58
+0xC2B9 0x5B6B
+0xC2BA 0x5C0A
+0xC2BB 0x640D
+0xC2BC 0x6751
+0xC2BD 0x905C
+0xC2BE 0x4ED6
+0xC2BF 0x591A
+0xC2C0 0x592A
+0xC2C1 0x6C70
+0xC2C2 0x8A51
+0xC2C3 0x553E
+0xC2C4 0x5815
+0xC2C5 0x59A5
+0xC2C6 0x60F0
+0xC2C7 0x6253
+0xC2C8 0x67C1
+0xC2C9 0x8235
+0xC2CA 0x6955
+0xC2CB 0x9640
+0xC2CC 0x99C4
+0xC2CD 0x9A28
+0xC2CE 0x4F53
+0xC2CF 0x5806
+0xC2D0 0x5BFE
+0xC2D1 0x8010
+0xC2D2 0x5CB1
+0xC2D3 0x5E2F
+0xC2D4 0x5F85
+0xC2D5 0x6020
+0xC2D6 0x614B
+0xC2D7 0x6234
+0xC2D8 0x66FF
+0xC2D9 0x6CF0
+0xC2DA 0x6EDE
+0xC2DB 0x80CE
+0xC2DC 0x817F
+0xC2DD 0x82D4
+0xC2DE 0x888B
+0xC2DF 0x8CB8
+0xC2E0 0x9000
+0xC2E1 0x902E
+0xC2E2 0x968A
+0xC2E3 0x9EDB
+0xC2E4 0x9BDB
+0xC2E5 0x4EE3
+0xC2E6 0x53F0
+0xC2E7 0x5927
+0xC2E8 0x7B2C
+0xC2E9 0x918D
+0xC2EA 0x984C
+0xC2EB 0x9DF9
+0xC2EC 0x6EDD
+0xC2ED 0x7027
+0xC2EE 0x5353
+0xC2EF 0x5544
+0xC2F0 0x5B85
+0xC2F1 0x6258
+0xC2F2 0x629E
+0xC2F3 0x62D3
+0xC2F4 0x6CA2
+0xC2F5 0x6FEF
+0xC2F6 0x7422
+0xC2F7 0x8A17
+0xC2F8 0x9438
+0xC2F9 0x6FC1
+0xC2FA 0x8AFE
+0xC2FB 0x8338
+0xC2FC 0x51E7
+0xC2FD 0x86F8
+0xC2FE 0x53EA
+0xC3A1 0x53E9
+0xC3A2 0x4F46
+0xC3A3 0x9054
+0xC3A4 0x8FB0
+0xC3A5 0x596A
+0xC3A6 0x8131
+0xC3A7 0x5DFD
+0xC3A8 0x7AEA
+0xC3A9 0x8FBF
+0xC3AA 0x68DA
+0xC3AB 0x8C37
+0xC3AC 0x72F8
+0xC3AD 0x9C48
+0xC3AE 0x6A3D
+0xC3AF 0x8AB0
+0xC3B0 0x4E39
+0xC3B1 0x5358
+0xC3B2 0x5606
+0xC3B3 0x5766
+0xC3B4 0x62C5
+0xC3B5 0x63A2
+0xC3B6 0x65E6
+0xC3B7 0x6B4E
+0xC3B8 0x6DE1
+0xC3B9 0x6E5B
+0xC3BA 0x70AD
+0xC3BB 0x77ED
+0xC3BC 0x7AEF
+0xC3BD 0x7BAA
+0xC3BE 0x7DBB
+0xC3BF 0x803D
+0xC3C0 0x80C6
+0xC3C1 0x86CB
+0xC3C2 0x8A95
+0xC3C3 0x935B
+0xC3C4 0x56E3
+0xC3C5 0x58C7
+0xC3C6 0x5F3E
+0xC3C7 0x65AD
+0xC3C8 0x6696
+0xC3C9 0x6A80
+0xC3CA 0x6BB5
+0xC3CB 0x7537
+0xC3CC 0x8AC7
+0xC3CD 0x5024
+0xC3CE 0x77E5
+0xC3CF 0x5730
+0xC3D0 0x5F1B
+0xC3D1 0x6065
+0xC3D2 0x667A
+0xC3D3 0x6C60
+0xC3D4 0x75F4
+0xC3D5 0x7A1A
+0xC3D6 0x7F6E
+0xC3D7 0x81F4
+0xC3D8 0x8718
+0xC3D9 0x9045
+0xC3DA 0x99B3
+0xC3DB 0x7BC9
+0xC3DC 0x755C
+0xC3DD 0x7AF9
+0xC3DE 0x7B51
+0xC3DF 0x84C4
+0xC3E0 0x9010
+0xC3E1 0x79E9
+0xC3E2 0x7A92
+0xC3E3 0x8336
+0xC3E4 0x5AE1
+0xC3E5 0x7740
+0xC3E6 0x4E2D
+0xC3E7 0x4EF2
+0xC3E8 0x5B99
+0xC3E9 0x5FE0
+0xC3EA 0x62BD
+0xC3EB 0x663C
+0xC3EC 0x67F1
+0xC3ED 0x6CE8
+0xC3EE 0x866B
+0xC3EF 0x8877
+0xC3F0 0x8A3B
+0xC3F1 0x914E
+0xC3F2 0x92F3
+0xC3F3 0x99D0
+0xC3F4 0x6A17
+0xC3F5 0x7026
+0xC3F6 0x732A
+0xC3F7 0x82E7
+0xC3F8 0x8457
+0xC3F9 0x8CAF
+0xC3FA 0x4E01
+0xC3FB 0x5146
+0xC3FC 0x51CB
+0xC3FD 0x558B
+0xC3FE 0x5BF5
+0xC4A1 0x5E16
+0xC4A2 0x5E33
+0xC4A3 0x5E81
+0xC4A4 0x5F14
+0xC4A5 0x5F35
+0xC4A6 0x5F6B
+0xC4A7 0x5FB4
+0xC4A8 0x61F2
+0xC4A9 0x6311
+0xC4AA 0x66A2
+0xC4AB 0x671D
+0xC4AC 0x6F6E
+0xC4AD 0x7252
+0xC4AE 0x753A
+0xC4AF 0x773A
+0xC4B0 0x8074
+0xC4B1 0x8139
+0xC4B2 0x8178
+0xC4B3 0x8776
+0xC4B4 0x8ABF
+0xC4B5 0x8ADC
+0xC4B6 0x8D85
+0xC4B7 0x8DF3
+0xC4B8 0x929A
+0xC4B9 0x9577
+0xC4BA 0x9802
+0xC4BB 0x9CE5
+0xC4BC 0x52C5
+0xC4BD 0x6357
+0xC4BE 0x76F4
+0xC4BF 0x6715
+0xC4C0 0x6C88
+0xC4C1 0x73CD
+0xC4C2 0x8CC3
+0xC4C3 0x93AE
+0xC4C4 0x9673
+0xC4C5 0x6D25
+0xC4C6 0x589C
+0xC4C7 0x690E
+0xC4C8 0x69CC
+0xC4C9 0x8FFD
+0xC4CA 0x939A
+0xC4CB 0x75DB
+0xC4CC 0x901A
+0xC4CD 0x585A
+0xC4CE 0x6802
+0xC4CF 0x63B4
+0xC4D0 0x69FB
+0xC4D1 0x4F43
+0xC4D2 0x6F2C
+0xC4D3 0x67D8
+0xC4D4 0x8FBB
+0xC4D5 0x8526
+0xC4D6 0x7DB4
+0xC4D7 0x9354
+0xC4D8 0x693F
+0xC4D9 0x6F70
+0xC4DA 0x576A
+0xC4DB 0x58F7
+0xC4DC 0x5B2C
+0xC4DD 0x7D2C
+0xC4DE 0x722A
+0xC4DF 0x540A
+0xC4E0 0x91E3
+0xC4E1 0x9DB4
+0xC4E2 0x4EAD
+0xC4E3 0x4F4E
+0xC4E4 0x505C
+0xC4E5 0x5075
+0xC4E6 0x5243
+0xC4E7 0x8C9E
+0xC4E8 0x5448
+0xC4E9 0x5824
+0xC4EA 0x5B9A
+0xC4EB 0x5E1D
+0xC4EC 0x5E95
+0xC4ED 0x5EAD
+0xC4EE 0x5EF7
+0xC4EF 0x5F1F
+0xC4F0 0x608C
+0xC4F1 0x62B5
+0xC4F2 0x633A
+0xC4F3 0x63D0
+0xC4F4 0x68AF
+0xC4F5 0x6C40
+0xC4F6 0x7887
+0xC4F7 0x798E
+0xC4F8 0x7A0B
+0xC4F9 0x7DE0
+0xC4FA 0x8247
+0xC4FB 0x8A02
+0xC4FC 0x8AE6
+0xC4FD 0x8E44
+0xC4FE 0x9013
+0xC5A1 0x90B8
+0xC5A2 0x912D
+0xC5A3 0x91D8
+0xC5A4 0x9F0E
+0xC5A5 0x6CE5
+0xC5A6 0x6458
+0xC5A7 0x64E2
+0xC5A8 0x6575
+0xC5A9 0x6EF4
+0xC5AA 0x7684
+0xC5AB 0x7B1B
+0xC5AC 0x9069
+0xC5AD 0x93D1
+0xC5AE 0x6EBA
+0xC5AF 0x54F2
+0xC5B0 0x5FB9
+0xC5B1 0x64A4
+0xC5B2 0x8F4D
+0xC5B3 0x8FED
+0xC5B4 0x9244
+0xC5B5 0x5178
+0xC5B6 0x586B
+0xC5B7 0x5929
+0xC5B8 0x5C55
+0xC5B9 0x5E97
+0xC5BA 0x6DFB
+0xC5BB 0x7E8F
+0xC5BC 0x751C
+0xC5BD 0x8CBC
+0xC5BE 0x8EE2
+0xC5BF 0x985B
+0xC5C0 0x70B9
+0xC5C1 0x4F1D
+0xC5C2 0x6BBF
+0xC5C3 0x6FB1
+0xC5C4 0x7530
+0xC5C5 0x96FB
+0xC5C6 0x514E
+0xC5C7 0x5410
+0xC5C8 0x5835
+0xC5C9 0x5857
+0xC5CA 0x59AC
+0xC5CB 0x5C60
+0xC5CC 0x5F92
+0xC5CD 0x6597
+0xC5CE 0x675C
+0xC5CF 0x6E21
+0xC5D0 0x767B
+0xC5D1 0x83DF
+0xC5D2 0x8CED
+0xC5D3 0x9014
+0xC5D4 0x90FD
+0xC5D5 0x934D
+0xC5D6 0x7825
+0xC5D7 0x783A
+0xC5D8 0x52AA
+0xC5D9 0x5EA6
+0xC5DA 0x571F
+0xC5DB 0x5974
+0xC5DC 0x6012
+0xC5DD 0x5012
+0xC5DE 0x515A
+0xC5DF 0x51AC
+0xC5E0 0x51CD
+0xC5E1 0x5200
+0xC5E2 0x5510
+0xC5E3 0x5854
+0xC5E4 0x5858
+0xC5E5 0x5957
+0xC5E6 0x5B95
+0xC5E7 0x5CF6
+0xC5E8 0x5D8B
+0xC5E9 0x60BC
+0xC5EA 0x6295
+0xC5EB 0x642D
+0xC5EC 0x6771
+0xC5ED 0x6843
+0xC5EE 0x68BC
+0xC5EF 0x68DF
+0xC5F0 0x76D7
+0xC5F1 0x6DD8
+0xC5F2 0x6E6F
+0xC5F3 0x6D9B
+0xC5F4 0x706F
+0xC5F5 0x71C8
+0xC5F6 0x5F53
+0xC5F7 0x75D8
+0xC5F8 0x7977
+0xC5F9 0x7B49
+0xC5FA 0x7B54
+0xC5FB 0x7B52
+0xC5FC 0x7CD6
+0xC5FD 0x7D71
+0xC5FE 0x5230
+0xC6A1 0x8463
+0xC6A2 0x8569
+0xC6A3 0x85E4
+0xC6A4 0x8A0E
+0xC6A5 0x8B04
+0xC6A6 0x8C46
+0xC6A7 0x8E0F
+0xC6A8 0x9003
+0xC6A9 0x900F
+0xC6AA 0x9419
+0xC6AB 0x9676
+0xC6AC 0x982D
+0xC6AD 0x9A30
+0xC6AE 0x95D8
+0xC6AF 0x50CD
+0xC6B0 0x52D5
+0xC6B1 0x540C
+0xC6B2 0x5802
+0xC6B3 0x5C0E
+0xC6B4 0x61A7
+0xC6B5 0x649E
+0xC6B6 0x6D1E
+0xC6B7 0x77B3
+0xC6B8 0x7AE5
+0xC6B9 0x80F4
+0xC6BA 0x8404
+0xC6BB 0x9053
+0xC6BC 0x9285
+0xC6BD 0x5CE0
+0xC6BE 0x9D07
+0xC6BF 0x533F
+0xC6C0 0x5F97
+0xC6C1 0x5FB3
+0xC6C2 0x6D9C
+0xC6C3 0x7279
+0xC6C4 0x7763
+0xC6C5 0x79BF
+0xC6C6 0x7BE4
+0xC6C7 0x6BD2
+0xC6C8 0x72EC
+0xC6C9 0x8AAD
+0xC6CA 0x6803
+0xC6CB 0x6A61
+0xC6CC 0x51F8
+0xC6CD 0x7A81
+0xC6CE 0x6934
+0xC6CF 0x5C4A
+0xC6D0 0x9CF6
+0xC6D1 0x82EB
+0xC6D2 0x5BC5
+0xC6D3 0x9149
+0xC6D4 0x701E
+0xC6D5 0x5678
+0xC6D6 0x5C6F
+0xC6D7 0x60C7
+0xC6D8 0x6566
+0xC6D9 0x6C8C
+0xC6DA 0x8C5A
+0xC6DB 0x9041
+0xC6DC 0x9813
+0xC6DD 0x5451
+0xC6DE 0x66C7
+0xC6DF 0x920D
+0xC6E0 0x5948
+0xC6E1 0x90A3
+0xC6E2 0x5185
+0xC6E3 0x4E4D
+0xC6E4 0x51EA
+0xC6E5 0x8599
+0xC6E6 0x8B0E
+0xC6E7 0x7058
+0xC6E8 0x637A
+0xC6E9 0x934B
+0xC6EA 0x6962
+0xC6EB 0x99B4
+0xC6EC 0x7E04
+0xC6ED 0x7577
+0xC6EE 0x5357
+0xC6EF 0x6960
+0xC6F0 0x8EDF
+0xC6F1 0x96E3
+0xC6F2 0x6C5D
+0xC6F3 0x4E8C
+0xC6F4 0x5C3C
+0xC6F5 0x5F10
+0xC6F6 0x8FE9
+0xC6F7 0x5302
+0xC6F8 0x8CD1
+0xC6F9 0x8089
+0xC6FA 0x8679
+0xC6FB 0x5EFF
+0xC6FC 0x65E5
+0xC6FD 0x4E73
+0xC6FE 0x5165
+0xC7A1 0x5982
+0xC7A2 0x5C3F
+0xC7A3 0x97EE
+0xC7A4 0x4EFB
+0xC7A5 0x598A
+0xC7A6 0x5FCD
+0xC7A7 0x8A8D
+0xC7A8 0x6FE1
+0xC7A9 0x79B0
+0xC7AA 0x7962
+0xC7AB 0x5BE7
+0xC7AC 0x8471
+0xC7AD 0x732B
+0xC7AE 0x71B1
+0xC7AF 0x5E74
+0xC7B0 0x5FF5
+0xC7B1 0x637B
+0xC7B2 0x649A
+0xC7B3 0x71C3
+0xC7B4 0x7C98
+0xC7B5 0x4E43
+0xC7B6 0x5EFC
+0xC7B7 0x4E4B
+0xC7B8 0x57DC
+0xC7B9 0x56A2
+0xC7BA 0x60A9
+0xC7BB 0x6FC3
+0xC7BC 0x7D0D
+0xC7BD 0x80FD
+0xC7BE 0x8133
+0xC7BF 0x81BF
+0xC7C0 0x8FB2
+0xC7C1 0x8997
+0xC7C2 0x86A4
+0xC7C3 0x5DF4
+0xC7C4 0x628A
+0xC7C5 0x64AD
+0xC7C6 0x8987
+0xC7C7 0x6777
+0xC7C8 0x6CE2
+0xC7C9 0x6D3E
+0xC7CA 0x7436
+0xC7CB 0x7834
+0xC7CC 0x5A46
+0xC7CD 0x7F75
+0xC7CE 0x82AD
+0xC7CF 0x99AC
+0xC7D0 0x4FF3
+0xC7D1 0x5EC3
+0xC7D2 0x62DD
+0xC7D3 0x6392
+0xC7D4 0x6557
+0xC7D5 0x676F
+0xC7D6 0x76C3
+0xC7D7 0x724C
+0xC7D8 0x80CC
+0xC7D9 0x80BA
+0xC7DA 0x8F29
+0xC7DB 0x914D
+0xC7DC 0x500D
+0xC7DD 0x57F9
+0xC7DE 0x5A92
+0xC7DF 0x6885
+0xC7E0 0x6973
+0xC7E1 0x7164
+0xC7E2 0x72FD
+0xC7E3 0x8CB7
+0xC7E4 0x58F2
+0xC7E5 0x8CE0
+0xC7E6 0x966A
+0xC7E7 0x9019
+0xC7E8 0x877F
+0xC7E9 0x79E4
+0xC7EA 0x77E7
+0xC7EB 0x8429
+0xC7EC 0x4F2F
+0xC7ED 0x5265
+0xC7EE 0x535A
+0xC7EF 0x62CD
+0xC7F0 0x67CF
+0xC7F1 0x6CCA
+0xC7F2 0x767D
+0xC7F3 0x7B94
+0xC7F4 0x7C95
+0xC7F5 0x8236
+0xC7F6 0x8584
+0xC7F7 0x8FEB
+0xC7F8 0x66DD
+0xC7F9 0x6F20
+0xC7FA 0x7206
+0xC7FB 0x7E1B
+0xC7FC 0x83AB
+0xC7FD 0x99C1
+0xC7FE 0x9EA6
+0xC8A1 0x51FD
+0xC8A2 0x7BB1
+0xC8A3 0x7872
+0xC8A4 0x7BB8
+0xC8A5 0x8087
+0xC8A6 0x7B48
+0xC8A7 0x6AE8
+0xC8A8 0x5E61
+0xC8A9 0x808C
+0xC8AA 0x7551
+0xC8AB 0x7560
+0xC8AC 0x516B
+0xC8AD 0x9262
+0xC8AE 0x6E8C
+0xC8AF 0x767A
+0xC8B0 0x9197
+0xC8B1 0x9AEA
+0xC8B2 0x4F10
+0xC8B3 0x7F70
+0xC8B4 0x629C
+0xC8B5 0x7B4F
+0xC8B6 0x95A5
+0xC8B7 0x9CE9
+0xC8B8 0x567A
+0xC8B9 0x5859
+0xC8BA 0x86E4
+0xC8BB 0x96BC
+0xC8BC 0x4F34
+0xC8BD 0x5224
+0xC8BE 0x534A
+0xC8BF 0x53CD
+0xC8C0 0x53DB
+0xC8C1 0x5E06
+0xC8C2 0x642C
+0xC8C3 0x6591
+0xC8C4 0x677F
+0xC8C5 0x6C3E
+0xC8C6 0x6C4E
+0xC8C7 0x7248
+0xC8C8 0x72AF
+0xC8C9 0x73ED
+0xC8CA 0x7554
+0xC8CB 0x7E41
+0xC8CC 0x822C
+0xC8CD 0x85E9
+0xC8CE 0x8CA9
+0xC8CF 0x7BC4
+0xC8D0 0x91C6
+0xC8D1 0x7169
+0xC8D2 0x9812
+0xC8D3 0x98EF
+0xC8D4 0x633D
+0xC8D5 0x6669
+0xC8D6 0x756A
+0xC8D7 0x76E4
+0xC8D8 0x78D0
+0xC8D9 0x8543
+0xC8DA 0x86EE
+0xC8DB 0x532A
+0xC8DC 0x5351
+0xC8DD 0x5426
+0xC8DE 0x5983
+0xC8DF 0x5E87
+0xC8E0 0x5F7C
+0xC8E1 0x60B2
+0xC8E2 0x6249
+0xC8E3 0x6279
+0xC8E4 0x62AB
+0xC8E5 0x6590
+0xC8E6 0x6BD4
+0xC8E7 0x6CCC
+0xC8E8 0x75B2
+0xC8E9 0x76AE
+0xC8EA 0x7891
+0xC8EB 0x79D8
+0xC8EC 0x7DCB
+0xC8ED 0x7F77
+0xC8EE 0x80A5
+0xC8EF 0x88AB
+0xC8F0 0x8AB9
+0xC8F1 0x8CBB
+0xC8F2 0x907F
+0xC8F3 0x975E
+0xC8F4 0x98DB
+0xC8F5 0x6A0B
+0xC8F6 0x7C38
+0xC8F7 0x5099
+0xC8F8 0x5C3E
+0xC8F9 0x5FAE
+0xC8FA 0x6787
+0xC8FB 0x6BD8
+0xC8FC 0x7435
+0xC8FD 0x7709
+0xC8FE 0x7F8E
+0xC9A1 0x9F3B
+0xC9A2 0x67CA
+0xC9A3 0x7A17
+0xC9A4 0x5339
+0xC9A5 0x758B
+0xC9A6 0x9AED
+0xC9A7 0x5F66
+0xC9A8 0x819D
+0xC9A9 0x83F1
+0xC9AA 0x8098
+0xC9AB 0x5F3C
+0xC9AC 0x5FC5
+0xC9AD 0x7562
+0xC9AE 0x7B46
+0xC9AF 0x903C
+0xC9B0 0x6867
+0xC9B1 0x59EB
+0xC9B2 0x5A9B
+0xC9B3 0x7D10
+0xC9B4 0x767E
+0xC9B5 0x8B2C
+0xC9B6 0x4FF5
+0xC9B7 0x5F6A
+0xC9B8 0x6A19
+0xC9B9 0x6C37
+0xC9BA 0x6F02
+0xC9BB 0x74E2
+0xC9BC 0x7968
+0xC9BD 0x8868
+0xC9BE 0x8A55
+0xC9BF 0x8C79
+0xC9C0 0x5EDF
+0xC9C1 0x63CF
+0xC9C2 0x75C5
+0xC9C3 0x79D2
+0xC9C4 0x82D7
+0xC9C5 0x9328
+0xC9C6 0x92F2
+0xC9C7 0x849C
+0xC9C8 0x86ED
+0xC9C9 0x9C2D
+0xC9CA 0x54C1
+0xC9CB 0x5F6C
+0xC9CC 0x658C
+0xC9CD 0x6D5C
+0xC9CE 0x7015
+0xC9CF 0x8CA7
+0xC9D0 0x8CD3
+0xC9D1 0x983B
+0xC9D2 0x654F
+0xC9D3 0x74F6
+0xC9D4 0x4E0D
+0xC9D5 0x4ED8
+0xC9D6 0x57E0
+0xC9D7 0x592B
+0xC9D8 0x5A66
+0xC9D9 0x5BCC
+0xC9DA 0x51A8
+0xC9DB 0x5E03
+0xC9DC 0x5E9C
+0xC9DD 0x6016
+0xC9DE 0x6276
+0xC9DF 0x6577
+0xC9E0 0x65A7
+0xC9E1 0x666E
+0xC9E2 0x6D6E
+0xC9E3 0x7236
+0xC9E4 0x7B26
+0xC9E5 0x8150
+0xC9E6 0x819A
+0xC9E7 0x8299
+0xC9E8 0x8B5C
+0xC9E9 0x8CA0
+0xC9EA 0x8CE6
+0xC9EB 0x8D74
+0xC9EC 0x961C
+0xC9ED 0x9644
+0xC9EE 0x4FAE
+0xC9EF 0x64AB
+0xC9F0 0x6B66
+0xC9F1 0x821E
+0xC9F2 0x8461
+0xC9F3 0x856A
+0xC9F4 0x90E8
+0xC9F5 0x5C01
+0xC9F6 0x6953
+0xC9F7 0x98A8
+0xC9F8 0x847A
+0xC9F9 0x8557
+0xC9FA 0x4F0F
+0xC9FB 0x526F
+0xC9FC 0x5FA9
+0xC9FD 0x5E45
+0xC9FE 0x670D
+0xCAA1 0x798F
+0xCAA2 0x8179
+0xCAA3 0x8907
+0xCAA4 0x8986
+0xCAA5 0x6DF5
+0xCAA6 0x5F17
+0xCAA7 0x6255
+0xCAA8 0x6CB8
+0xCAA9 0x4ECF
+0xCAAA 0x7269
+0xCAAB 0x9B92
+0xCAAC 0x5206
+0xCAAD 0x543B
+0xCAAE 0x5674
+0xCAAF 0x58B3
+0xCAB0 0x61A4
+0xCAB1 0x626E
+0xCAB2 0x711A
+0xCAB3 0x596E
+0xCAB4 0x7C89
+0xCAB5 0x7CDE
+0xCAB6 0x7D1B
+0xCAB7 0x96F0
+0xCAB8 0x6587
+0xCAB9 0x805E
+0xCABA 0x4E19
+0xCABB 0x4F75
+0xCABC 0x5175
+0xCABD 0x5840
+0xCABE 0x5E63
+0xCABF 0x5E73
+0xCAC0 0x5F0A
+0xCAC1 0x67C4
+0xCAC2 0x4E26
+0xCAC3 0x853D
+0xCAC4 0x9589
+0xCAC5 0x965B
+0xCAC6 0x7C73
+0xCAC7 0x9801
+0xCAC8 0x50FB
+0xCAC9 0x58C1
+0xCACA 0x7656
+0xCACB 0x78A7
+0xCACC 0x5225
+0xCACD 0x77A5
+0xCACE 0x8511
+0xCACF 0x7B86
+0xCAD0 0x504F
+0xCAD1 0x5909
+0xCAD2 0x7247
+0xCAD3 0x7BC7
+0xCAD4 0x7DE8
+0xCAD5 0x8FBA
+0xCAD6 0x8FD4
+0xCAD7 0x904D
+0xCAD8 0x4FBF
+0xCAD9 0x52C9
+0xCADA 0x5A29
+0xCADB 0x5F01
+0xCADC 0x97AD
+0xCADD 0x4FDD
+0xCADE 0x8217
+0xCADF 0x92EA
+0xCAE0 0x5703
+0xCAE1 0x6355
+0xCAE2 0x6B69
+0xCAE3 0x752B
+0xCAE4 0x88DC
+0xCAE5 0x8F14
+0xCAE6 0x7A42
+0xCAE7 0x52DF
+0xCAE8 0x5893
+0xCAE9 0x6155
+0xCAEA 0x620A
+0xCAEB 0x66AE
+0xCAEC 0x6BCD
+0xCAED 0x7C3F
+0xCAEE 0x83E9
+0xCAEF 0x5023
+0xCAF0 0x4FF8
+0xCAF1 0x5305
+0xCAF2 0x5446
+0xCAF3 0x5831
+0xCAF4 0x5949
+0xCAF5 0x5B9D
+0xCAF6 0x5CF0
+0xCAF7 0x5CEF
+0xCAF8 0x5D29
+0xCAF9 0x5E96
+0xCAFA 0x62B1
+0xCAFB 0x6367
+0xCAFC 0x653E
+0xCAFD 0x65B9
+0xCAFE 0x670B
+0xCBA1 0x6CD5
+0xCBA2 0x6CE1
+0xCBA3 0x70F9
+0xCBA4 0x7832
+0xCBA5 0x7E2B
+0xCBA6 0x80DE
+0xCBA7 0x82B3
+0xCBA8 0x840C
+0xCBA9 0x84EC
+0xCBAA 0x8702
+0xCBAB 0x8912
+0xCBAC 0x8A2A
+0xCBAD 0x8C4A
+0xCBAE 0x90A6
+0xCBAF 0x92D2
+0xCBB0 0x98FD
+0xCBB1 0x9CF3
+0xCBB2 0x9D6C
+0xCBB3 0x4E4F
+0xCBB4 0x4EA1
+0xCBB5 0x508D
+0xCBB6 0x5256
+0xCBB7 0x574A
+0xCBB8 0x59A8
+0xCBB9 0x5E3D
+0xCBBA 0x5FD8
+0xCBBB 0x5FD9
+0xCBBC 0x623F
+0xCBBD 0x66B4
+0xCBBE 0x671B
+0xCBBF 0x67D0
+0xCBC0 0x68D2
+0xCBC1 0x5192
+0xCBC2 0x7D21
+0xCBC3 0x80AA
+0xCBC4 0x81A8
+0xCBC5 0x8B00
+0xCBC6 0x8C8C
+0xCBC7 0x8CBF
+0xCBC8 0x927E
+0xCBC9 0x9632
+0xCBCA 0x5420
+0xCBCB 0x982C
+0xCBCC 0x5317
+0xCBCD 0x50D5
+0xCBCE 0x535C
+0xCBCF 0x58A8
+0xCBD0 0x64B2
+0xCBD1 0x6734
+0xCBD2 0x7267
+0xCBD3 0x7766
+0xCBD4 0x7A46
+0xCBD5 0x91E6
+0xCBD6 0x52C3
+0xCBD7 0x6CA1
+0xCBD8 0x6B86
+0xCBD9 0x5800
+0xCBDA 0x5E4C
+0xCBDB 0x5954
+0xCBDC 0x672C
+0xCBDD 0x7FFB
+0xCBDE 0x51E1
+0xCBDF 0x76C6
+0xCBE0 0x6469
+0xCBE1 0x78E8
+0xCBE2 0x9B54
+0xCBE3 0x9EBB
+0xCBE4 0x57CB
+0xCBE5 0x59B9
+0xCBE6 0x6627
+0xCBE7 0x679A
+0xCBE8 0x6BCE
+0xCBE9 0x54E9
+0xCBEA 0x69D9
+0xCBEB 0x5E55
+0xCBEC 0x819C
+0xCBED 0x6795
+0xCBEE 0x9BAA
+0xCBEF 0x67FE
+0xCBF0 0x9C52
+0xCBF1 0x685D
+0xCBF2 0x4EA6
+0xCBF3 0x4FE3
+0xCBF4 0x53C8
+0xCBF5 0x62B9
+0xCBF6 0x672B
+0xCBF7 0x6CAB
+0xCBF8 0x8FC4
+0xCBF9 0x4FAD
+0xCBFA 0x7E6D
+0xCBFB 0x9EBF
+0xCBFC 0x4E07
+0xCBFD 0x6162
+0xCBFE 0x6E80
+0xCCA1 0x6F2B
+0xCCA2 0x8513
+0xCCA3 0x5473
+0xCCA4 0x672A
+0xCCA5 0x9B45
+0xCCA6 0x5DF3
+0xCCA7 0x7B95
+0xCCA8 0x5CAC
+0xCCA9 0x5BC6
+0xCCAA 0x871C
+0xCCAB 0x6E4A
+0xCCAC 0x84D1
+0xCCAD 0x7A14
+0xCCAE 0x8108
+0xCCAF 0x5999
+0xCCB0 0x7C8D
+0xCCB1 0x6C11
+0xCCB2 0x7720
+0xCCB3 0x52D9
+0xCCB4 0x5922
+0xCCB5 0x7121
+0xCCB6 0x725F
+0xCCB7 0x77DB
+0xCCB8 0x9727
+0xCCB9 0x9D61
+0xCCBA 0x690B
+0xCCBB 0x5A7F
+0xCCBC 0x5A18
+0xCCBD 0x51A5
+0xCCBE 0x540D
+0xCCBF 0x547D
+0xCCC0 0x660E
+0xCCC1 0x76DF
+0xCCC2 0x8FF7
+0xCCC3 0x9298
+0xCCC4 0x9CF4
+0xCCC5 0x59EA
+0xCCC6 0x725D
+0xCCC7 0x6EC5
+0xCCC8 0x514D
+0xCCC9 0x68C9
+0xCCCA 0x7DBF
+0xCCCB 0x7DEC
+0xCCCC 0x9762
+0xCCCD 0x9EBA
+0xCCCE 0x6478
+0xCCCF 0x6A21
+0xCCD0 0x8302
+0xCCD1 0x5984
+0xCCD2 0x5B5F
+0xCCD3 0x6BDB
+0xCCD4 0x731B
+0xCCD5 0x76F2
+0xCCD6 0x7DB2
+0xCCD7 0x8017
+0xCCD8 0x8499
+0xCCD9 0x5132
+0xCCDA 0x6728
+0xCCDB 0x9ED9
+0xCCDC 0x76EE
+0xCCDD 0x6762
+0xCCDE 0x52FF
+0xCCDF 0x9905
+0xCCE0 0x5C24
+0xCCE1 0x623B
+0xCCE2 0x7C7E
+0xCCE3 0x8CB0
+0xCCE4 0x554F
+0xCCE5 0x60B6
+0xCCE6 0x7D0B
+0xCCE7 0x9580
+0xCCE8 0x5301
+0xCCE9 0x4E5F
+0xCCEA 0x51B6
+0xCCEB 0x591C
+0xCCEC 0x723A
+0xCCED 0x8036
+0xCCEE 0x91CE
+0xCCEF 0x5F25
+0xCCF0 0x77E2
+0xCCF1 0x5384
+0xCCF2 0x5F79
+0xCCF3 0x7D04
+0xCCF4 0x85AC
+0xCCF5 0x8A33
+0xCCF6 0x8E8D
+0xCCF7 0x9756
+0xCCF8 0x67F3
+0xCCF9 0x85AE
+0xCCFA 0x9453
+0xCCFB 0x6109
+0xCCFC 0x6108
+0xCCFD 0x6CB9
+0xCCFE 0x7652
+0xCDA1 0x8AED
+0xCDA2 0x8F38
+0xCDA3 0x552F
+0xCDA4 0x4F51
+0xCDA5 0x512A
+0xCDA6 0x52C7
+0xCDA7 0x53CB
+0xCDA8 0x5BA5
+0xCDA9 0x5E7D
+0xCDAA 0x60A0
+0xCDAB 0x6182
+0xCDAC 0x63D6
+0xCDAD 0x6709
+0xCDAE 0x67DA
+0xCDAF 0x6E67
+0xCDB0 0x6D8C
+0xCDB1 0x7336
+0xCDB2 0x7337
+0xCDB3 0x7531
+0xCDB4 0x7950
+0xCDB5 0x88D5
+0xCDB6 0x8A98
+0xCDB7 0x904A
+0xCDB8 0x9091
+0xCDB9 0x90F5
+0xCDBA 0x96C4
+0xCDBB 0x878D
+0xCDBC 0x5915
+0xCDBD 0x4E88
+0xCDBE 0x4F59
+0xCDBF 0x4E0E
+0xCDC0 0x8A89
+0xCDC1 0x8F3F
+0xCDC2 0x9810
+0xCDC3 0x50AD
+0xCDC4 0x5E7C
+0xCDC5 0x5996
+0xCDC6 0x5BB9
+0xCDC7 0x5EB8
+0xCDC8 0x63DA
+0xCDC9 0x63FA
+0xCDCA 0x64C1
+0xCDCB 0x66DC
+0xCDCC 0x694A
+0xCDCD 0x69D8
+0xCDCE 0x6D0B
+0xCDCF 0x6EB6
+0xCDD0 0x7194
+0xCDD1 0x7528
+0xCDD2 0x7AAF
+0xCDD3 0x7F8A
+0xCDD4 0x8000
+0xCDD5 0x8449
+0xCDD6 0x84C9
+0xCDD7 0x8981
+0xCDD8 0x8B21
+0xCDD9 0x8E0A
+0xCDDA 0x9065
+0xCDDB 0x967D
+0xCDDC 0x990A
+0xCDDD 0x617E
+0xCDDE 0x6291
+0xCDDF 0x6B32
+0xCDE0 0x6C83
+0xCDE1 0x6D74
+0xCDE2 0x7FCC
+0xCDE3 0x7FFC
+0xCDE4 0x6DC0
+0xCDE5 0x7F85
+0xCDE6 0x87BA
+0xCDE7 0x88F8
+0xCDE8 0x6765
+0xCDE9 0x83B1
+0xCDEA 0x983C
+0xCDEB 0x96F7
+0xCDEC 0x6D1B
+0xCDED 0x7D61
+0xCDEE 0x843D
+0xCDEF 0x916A
+0xCDF0 0x4E71
+0xCDF1 0x5375
+0xCDF2 0x5D50
+0xCDF3 0x6B04
+0xCDF4 0x6FEB
+0xCDF5 0x85CD
+0xCDF6 0x862D
+0xCDF7 0x89A7
+0xCDF8 0x5229
+0xCDF9 0x540F
+0xCDFA 0x5C65
+0xCDFB 0x674E
+0xCDFC 0x68A8
+0xCDFD 0x7406
+0xCDFE 0x7483
+0xCEA1 0x75E2
+0xCEA2 0x88CF
+0xCEA3 0x88E1
+0xCEA4 0x91CC
+0xCEA5 0x96E2
+0xCEA6 0x9678
+0xCEA7 0x5F8B
+0xCEA8 0x7387
+0xCEA9 0x7ACB
+0xCEAA 0x844E
+0xCEAB 0x63A0
+0xCEAC 0x7565
+0xCEAD 0x5289
+0xCEAE 0x6D41
+0xCEAF 0x6E9C
+0xCEB0 0x7409
+0xCEB1 0x7559
+0xCEB2 0x786B
+0xCEB3 0x7C92
+0xCEB4 0x9686
+0xCEB5 0x7ADC
+0xCEB6 0x9F8D
+0xCEB7 0x4FB6
+0xCEB8 0x616E
+0xCEB9 0x65C5
+0xCEBA 0x865C
+0xCEBB 0x4E86
+0xCEBC 0x4EAE
+0xCEBD 0x50DA
+0xCEBE 0x4E21
+0xCEBF 0x51CC
+0xCEC0 0x5BEE
+0xCEC1 0x6599
+0xCEC2 0x6881
+0xCEC3 0x6DBC
+0xCEC4 0x731F
+0xCEC5 0x7642
+0xCEC6 0x77AD
+0xCEC7 0x7A1C
+0xCEC8 0x7CE7
+0xCEC9 0x826F
+0xCECA 0x8AD2
+0xCECB 0x907C
+0xCECC 0x91CF
+0xCECD 0x9675
+0xCECE 0x9818
+0xCECF 0x529B
+0xCED0 0x7DD1
+0xCED1 0x502B
+0xCED2 0x5398
+0xCED3 0x6797
+0xCED4 0x6DCB
+0xCED5 0x71D0
+0xCED6 0x7433
+0xCED7 0x81E8
+0xCED8 0x8F2A
+0xCED9 0x96A3
+0xCEDA 0x9C57
+0xCEDB 0x9E9F
+0xCEDC 0x7460
+0xCEDD 0x5841
+0xCEDE 0x6D99
+0xCEDF 0x7D2F
+0xCEE0 0x985E
+0xCEE1 0x4EE4
+0xCEE2 0x4F36
+0xCEE3 0x4F8B
+0xCEE4 0x51B7
+0xCEE5 0x52B1
+0xCEE6 0x5DBA
+0xCEE7 0x601C
+0xCEE8 0x73B2
+0xCEE9 0x793C
+0xCEEA 0x82D3
+0xCEEB 0x9234
+0xCEEC 0x96B7
+0xCEED 0x96F6
+0xCEEE 0x970A
+0xCEEF 0x9E97
+0xCEF0 0x9F62
+0xCEF1 0x66A6
+0xCEF2 0x6B74
+0xCEF3 0x5217
+0xCEF4 0x52A3
+0xCEF5 0x70C8
+0xCEF6 0x88C2
+0xCEF7 0x5EC9
+0xCEF8 0x604B
+0xCEF9 0x6190
+0xCEFA 0x6F23
+0xCEFB 0x7149
+0xCEFC 0x7C3E
+0xCEFD 0x7DF4
+0xCEFE 0x806F
+0xCFA1 0x84EE
+0xCFA2 0x9023
+0xCFA3 0x932C
+0xCFA4 0x5442
+0xCFA5 0x9B6F
+0xCFA6 0x6AD3
+0xCFA7 0x7089
+0xCFA8 0x8CC2
+0xCFA9 0x8DEF
+0xCFAA 0x9732
+0xCFAB 0x52B4
+0xCFAC 0x5A41
+0xCFAD 0x5ECA
+0xCFAE 0x5F04
+0xCFAF 0x6717
+0xCFB0 0x697C
+0xCFB1 0x6994
+0xCFB2 0x6D6A
+0xCFB3 0x6F0F
+0xCFB4 0x7262
+0xCFB5 0x72FC
+0xCFB6 0x7BED
+0xCFB7 0x8001
+0xCFB8 0x807E
+0xCFB9 0x874B
+0xCFBA 0x90CE
+0xCFBB 0x516D
+0xCFBC 0x9E93
+0xCFBD 0x7984
+0xCFBE 0x808B
+0xCFBF 0x9332
+0xCFC0 0x8AD6
+0xCFC1 0x502D
+0xCFC2 0x548C
+0xCFC3 0x8A71
+0xCFC4 0x6B6A
+0xCFC5 0x8CC4
+0xCFC6 0x8107
+0xCFC7 0x60D1
+0xCFC8 0x67A0
+0xCFC9 0x9DF2
+0xCFCA 0x4E99
+0xCFCB 0x4E98
+0xCFCC 0x9C10
+0xCFCD 0x8A6B
+0xCFCE 0x85C1
+0xCFCF 0x8568
+0xCFD0 0x6900
+0xCFD1 0x6E7E
+0xCFD2 0x7897
+0xCFD3 0x8155
+0xD0A1 0x5F0C
+0xD0A2 0x4E10
+0xD0A3 0x4E15
+0xD0A4 0x4E2A
+0xD0A5 0x4E31
+0xD0A6 0x4E36
+0xD0A7 0x4E3C
+0xD0A8 0x4E3F
+0xD0A9 0x4E42
+0xD0AA 0x4E56
+0xD0AB 0x4E58
+0xD0AC 0x4E82
+0xD0AD 0x4E85
+0xD0AE 0x8C6B
+0xD0AF 0x4E8A
+0xD0B0 0x8212
+0xD0B1 0x5F0D
+0xD0B2 0x4E8E
+0xD0B3 0x4E9E
+0xD0B4 0x4E9F
+0xD0B5 0x4EA0
+0xD0B6 0x4EA2
+0xD0B7 0x4EB0
+0xD0B8 0x4EB3
+0xD0B9 0x4EB6
+0xD0BA 0x4ECE
+0xD0BB 0x4ECD
+0xD0BC 0x4EC4
+0xD0BD 0x4EC6
+0xD0BE 0x4EC2
+0xD0BF 0x4ED7
+0xD0C0 0x4EDE
+0xD0C1 0x4EED
+0xD0C2 0x4EDF
+0xD0C3 0x4EF7
+0xD0C4 0x4F09
+0xD0C5 0x4F5A
+0xD0C6 0x4F30
+0xD0C7 0x4F5B
+0xD0C8 0x4F5D
+0xD0C9 0x4F57
+0xD0CA 0x4F47
+0xD0CB 0x4F76
+0xD0CC 0x4F88
+0xD0CD 0x4F8F
+0xD0CE 0x4F98
+0xD0CF 0x4F7B
+0xD0D0 0x4F69
+0xD0D1 0x4F70
+0xD0D2 0x4F91
+0xD0D3 0x4F6F
+0xD0D4 0x4F86
+0xD0D5 0x4F96
+0xD0D6 0x5118
+0xD0D7 0x4FD4
+0xD0D8 0x4FDF
+0xD0D9 0x4FCE
+0xD0DA 0x4FD8
+0xD0DB 0x4FDB
+0xD0DC 0x4FD1
+0xD0DD 0x4FDA
+0xD0DE 0x4FD0
+0xD0DF 0x4FE4
+0xD0E0 0x4FE5
+0xD0E1 0x501A
+0xD0E2 0x5028
+0xD0E3 0x5014
+0xD0E4 0x502A
+0xD0E5 0x5025
+0xD0E6 0x5005
+0xD0E7 0x4F1C
+0xD0E8 0x4FF6
+0xD0E9 0x5021
+0xD0EA 0x5029
+0xD0EB 0x502C
+0xD0EC 0x4FFE
+0xD0ED 0x4FEF
+0xD0EE 0x5011
+0xD0EF 0x5006
+0xD0F0 0x5043
+0xD0F1 0x5047
+0xD0F2 0x6703
+0xD0F3 0x5055
+0xD0F4 0x5050
+0xD0F5 0x5048
+0xD0F6 0x505A
+0xD0F7 0x5056
+0xD0F8 0x506C
+0xD0F9 0x5078
+0xD0FA 0x5080
+0xD0FB 0x509A
+0xD0FC 0x5085
+0xD0FD 0x50B4
+0xD0FE 0x50B2
+0xD1A1 0x50C9
+0xD1A2 0x50CA
+0xD1A3 0x50B3
+0xD1A4 0x50C2
+0xD1A5 0x50D6
+0xD1A6 0x50DE
+0xD1A7 0x50E5
+0xD1A8 0x50ED
+0xD1A9 0x50E3
+0xD1AA 0x50EE
+0xD1AB 0x50F9
+0xD1AC 0x50F5
+0xD1AD 0x5109
+0xD1AE 0x5101
+0xD1AF 0x5102
+0xD1B0 0x5116
+0xD1B1 0x5115
+0xD1B2 0x5114
+0xD1B3 0x511A
+0xD1B4 0x5121
+0xD1B5 0x513A
+0xD1B6 0x5137
+0xD1B7 0x513C
+0xD1B8 0x513B
+0xD1B9 0x513F
+0xD1BA 0x5140
+0xD1BB 0x5152
+0xD1BC 0x514C
+0xD1BD 0x5154
+0xD1BE 0x5162
+0xD1BF 0x7AF8
+0xD1C0 0x5169
+0xD1C1 0x516A
+0xD1C2 0x516E
+0xD1C3 0x5180
+0xD1C4 0x5182
+0xD1C5 0x56D8
+0xD1C6 0x518C
+0xD1C7 0x5189
+0xD1C8 0x518F
+0xD1C9 0x5191
+0xD1CA 0x5193
+0xD1CB 0x5195
+0xD1CC 0x5196
+0xD1CD 0x51A4
+0xD1CE 0x51A6
+0xD1CF 0x51A2
+0xD1D0 0x51A9
+0xD1D1 0x51AA
+0xD1D2 0x51AB
+0xD1D3 0x51B3
+0xD1D4 0x51B1
+0xD1D5 0x51B2
+0xD1D6 0x51B0
+0xD1D7 0x51B5
+0xD1D8 0x51BD
+0xD1D9 0x51C5
+0xD1DA 0x51C9
+0xD1DB 0x51DB
+0xD1DC 0x51E0
+0xD1DD 0x8655
+0xD1DE 0x51E9
+0xD1DF 0x51ED
+0xD1E0 0x51F0
+0xD1E1 0x51F5
+0xD1E2 0x51FE
+0xD1E3 0x5204
+0xD1E4 0x520B
+0xD1E5 0x5214
+0xD1E6 0x520E
+0xD1E7 0x5227
+0xD1E8 0x522A
+0xD1E9 0x522E
+0xD1EA 0x5233
+0xD1EB 0x5239
+0xD1EC 0x524F
+0xD1ED 0x5244
+0xD1EE 0x524B
+0xD1EF 0x524C
+0xD1F0 0x525E
+0xD1F1 0x5254
+0xD1F2 0x526A
+0xD1F3 0x5274
+0xD1F4 0x5269
+0xD1F5 0x5273
+0xD1F6 0x527F
+0xD1F7 0x527D
+0xD1F8 0x528D
+0xD1F9 0x5294
+0xD1FA 0x5292
+0xD1FB 0x5271
+0xD1FC 0x5288
+0xD1FD 0x5291
+0xD1FE 0x8FA8
+0xD2A1 0x8FA7
+0xD2A2 0x52AC
+0xD2A3 0x52AD
+0xD2A4 0x52BC
+0xD2A5 0x52B5
+0xD2A6 0x52C1
+0xD2A7 0x52CD
+0xD2A8 0x52D7
+0xD2A9 0x52DE
+0xD2AA 0x52E3
+0xD2AB 0x52E6
+0xD2AC 0x98ED
+0xD2AD 0x52E0
+0xD2AE 0x52F3
+0xD2AF 0x52F5
+0xD2B0 0x52F8
+0xD2B1 0x52F9
+0xD2B2 0x5306
+0xD2B3 0x5308
+0xD2B4 0x7538
+0xD2B5 0x530D
+0xD2B6 0x5310
+0xD2B7 0x530F
+0xD2B8 0x5315
+0xD2B9 0x531A
+0xD2BA 0x5323
+0xD2BB 0x532F
+0xD2BC 0x5331
+0xD2BD 0x5333
+0xD2BE 0x5338
+0xD2BF 0x5340
+0xD2C0 0x5346
+0xD2C1 0x5345
+0xD2C2 0x4E17
+0xD2C3 0x5349
+0xD2C4 0x534D
+0xD2C5 0x51D6
+0xD2C6 0x535E
+0xD2C7 0x5369
+0xD2C8 0x536E
+0xD2C9 0x5918
+0xD2CA 0x537B
+0xD2CB 0x5377
+0xD2CC 0x5382
+0xD2CD 0x5396
+0xD2CE 0x53A0
+0xD2CF 0x53A6
+0xD2D0 0x53A5
+0xD2D1 0x53AE
+0xD2D2 0x53B0
+0xD2D3 0x53B6
+0xD2D4 0x53C3
+0xD2D5 0x7C12
+0xD2D6 0x96D9
+0xD2D7 0x53DF
+0xD2D8 0x66FC
+0xD2D9 0x71EE
+0xD2DA 0x53EE
+0xD2DB 0x53E8
+0xD2DC 0x53ED
+0xD2DD 0x53FA
+0xD2DE 0x5401
+0xD2DF 0x543D
+0xD2E0 0x5440
+0xD2E1 0x542C
+0xD2E2 0x542D
+0xD2E3 0x543C
+0xD2E4 0x542E
+0xD2E5 0x5436
+0xD2E6 0x5429
+0xD2E7 0x541D
+0xD2E8 0x544E
+0xD2E9 0x548F
+0xD2EA 0x5475
+0xD2EB 0x548E
+0xD2EC 0x545F
+0xD2ED 0x5471
+0xD2EE 0x5477
+0xD2EF 0x5470
+0xD2F0 0x5492
+0xD2F1 0x547B
+0xD2F2 0x5480
+0xD2F3 0x5476
+0xD2F4 0x5484
+0xD2F5 0x5490
+0xD2F6 0x5486
+0xD2F7 0x54C7
+0xD2F8 0x54A2
+0xD2F9 0x54B8
+0xD2FA 0x54A5
+0xD2FB 0x54AC
+0xD2FC 0x54C4
+0xD2FD 0x54C8
+0xD2FE 0x54A8
+0xD3A1 0x54AB
+0xD3A2 0x54C2
+0xD3A3 0x54A4
+0xD3A4 0x54BE
+0xD3A5 0x54BC
+0xD3A6 0x54D8
+0xD3A7 0x54E5
+0xD3A8 0x54E6
+0xD3A9 0x550F
+0xD3AA 0x5514
+0xD3AB 0x54FD
+0xD3AC 0x54EE
+0xD3AD 0x54ED
+0xD3AE 0x54FA
+0xD3AF 0x54E2
+0xD3B0 0x5539
+0xD3B1 0x5540
+0xD3B2 0x5563
+0xD3B3 0x554C
+0xD3B4 0x552E
+0xD3B5 0x555C
+0xD3B6 0x5545
+0xD3B7 0x5556
+0xD3B8 0x5557
+0xD3B9 0x5538
+0xD3BA 0x5533
+0xD3BB 0x555D
+0xD3BC 0x5599
+0xD3BD 0x5580
+0xD3BE 0x54AF
+0xD3BF 0x558A
+0xD3C0 0x559F
+0xD3C1 0x557B
+0xD3C2 0x557E
+0xD3C3 0x5598
+0xD3C4 0x559E
+0xD3C5 0x55AE
+0xD3C6 0x557C
+0xD3C7 0x5583
+0xD3C8 0x55A9
+0xD3C9 0x5587
+0xD3CA 0x55A8
+0xD3CB 0x55DA
+0xD3CC 0x55C5
+0xD3CD 0x55DF
+0xD3CE 0x55C4
+0xD3CF 0x55DC
+0xD3D0 0x55E4
+0xD3D1 0x55D4
+0xD3D2 0x5614
+0xD3D3 0x55F7
+0xD3D4 0x5616
+0xD3D5 0x55FE
+0xD3D6 0x55FD
+0xD3D7 0x561B
+0xD3D8 0x55F9
+0xD3D9 0x564E
+0xD3DA 0x5650
+0xD3DB 0x71DF
+0xD3DC 0x5634
+0xD3DD 0x5636
+0xD3DE 0x5632
+0xD3DF 0x5638
+0xD3E0 0x566B
+0xD3E1 0x5664
+0xD3E2 0x562F
+0xD3E3 0x566C
+0xD3E4 0x566A
+0xD3E5 0x5686
+0xD3E6 0x5680
+0xD3E7 0x568A
+0xD3E8 0x56A0
+0xD3E9 0x5694
+0xD3EA 0x568F
+0xD3EB 0x56A5
+0xD3EC 0x56AE
+0xD3ED 0x56B6
+0xD3EE 0x56B4
+0xD3EF 0x56C2
+0xD3F0 0x56BC
+0xD3F1 0x56C1
+0xD3F2 0x56C3
+0xD3F3 0x56C0
+0xD3F4 0x56C8
+0xD3F5 0x56CE
+0xD3F6 0x56D1
+0xD3F7 0x56D3
+0xD3F8 0x56D7
+0xD3F9 0x56EE
+0xD3FA 0x56F9
+0xD3FB 0x5700
+0xD3FC 0x56FF
+0xD3FD 0x5704
+0xD3FE 0x5709
+0xD4A1 0x5708
+0xD4A2 0x570B
+0xD4A3 0x570D
+0xD4A4 0x5713
+0xD4A5 0x5718
+0xD4A6 0x5716
+0xD4A7 0x55C7
+0xD4A8 0x571C
+0xD4A9 0x5726
+0xD4AA 0x5737
+0xD4AB 0x5738
+0xD4AC 0x574E
+0xD4AD 0x573B
+0xD4AE 0x5740
+0xD4AF 0x574F
+0xD4B0 0x5769
+0xD4B1 0x57C0
+0xD4B2 0x5788
+0xD4B3 0x5761
+0xD4B4 0x577F
+0xD4B5 0x5789
+0xD4B6 0x5793
+0xD4B7 0x57A0
+0xD4B8 0x57B3
+0xD4B9 0x57A4
+0xD4BA 0x57AA
+0xD4BB 0x57B0
+0xD4BC 0x57C3
+0xD4BD 0x57C6
+0xD4BE 0x57D4
+0xD4BF 0x57D2
+0xD4C0 0x57D3
+0xD4C1 0x580A
+0xD4C2 0x57D6
+0xD4C3 0x57E3
+0xD4C4 0x580B
+0xD4C5 0x5819
+0xD4C6 0x581D
+0xD4C7 0x5872
+0xD4C8 0x5821
+0xD4C9 0x5862
+0xD4CA 0x584B
+0xD4CB 0x5870
+0xD4CC 0x6BC0
+0xD4CD 0x5852
+0xD4CE 0x583D
+0xD4CF 0x5879
+0xD4D0 0x5885
+0xD4D1 0x58B9
+0xD4D2 0x589F
+0xD4D3 0x58AB
+0xD4D4 0x58BA
+0xD4D5 0x58DE
+0xD4D6 0x58BB
+0xD4D7 0x58B8
+0xD4D8 0x58AE
+0xD4D9 0x58C5
+0xD4DA 0x58D3
+0xD4DB 0x58D1
+0xD4DC 0x58D7
+0xD4DD 0x58D9
+0xD4DE 0x58D8
+0xD4DF 0x58E5
+0xD4E0 0x58DC
+0xD4E1 0x58E4
+0xD4E2 0x58DF
+0xD4E3 0x58EF
+0xD4E4 0x58FA
+0xD4E5 0x58F9
+0xD4E6 0x58FB
+0xD4E7 0x58FC
+0xD4E8 0x58FD
+0xD4E9 0x5902
+0xD4EA 0x590A
+0xD4EB 0x5910
+0xD4EC 0x591B
+0xD4ED 0x68A6
+0xD4EE 0x5925
+0xD4EF 0x592C
+0xD4F0 0x592D
+0xD4F1 0x5932
+0xD4F2 0x5938
+0xD4F3 0x593E
+0xD4F4 0x7AD2
+0xD4F5 0x5955
+0xD4F6 0x5950
+0xD4F7 0x594E
+0xD4F8 0x595A
+0xD4F9 0x5958
+0xD4FA 0x5962
+0xD4FB 0x5960
+0xD4FC 0x5967
+0xD4FD 0x596C
+0xD4FE 0x5969
+0xD5A1 0x5978
+0xD5A2 0x5981
+0xD5A3 0x599D
+0xD5A4 0x4F5E
+0xD5A5 0x4FAB
+0xD5A6 0x59A3
+0xD5A7 0x59B2
+0xD5A8 0x59C6
+0xD5A9 0x59E8
+0xD5AA 0x59DC
+0xD5AB 0x598D
+0xD5AC 0x59D9
+0xD5AD 0x59DA
+0xD5AE 0x5A25
+0xD5AF 0x5A1F
+0xD5B0 0x5A11
+0xD5B1 0x5A1C
+0xD5B2 0x5A09
+0xD5B3 0x5A1A
+0xD5B4 0x5A40
+0xD5B5 0x5A6C
+0xD5B6 0x5A49
+0xD5B7 0x5A35
+0xD5B8 0x5A36
+0xD5B9 0x5A62
+0xD5BA 0x5A6A
+0xD5BB 0x5A9A
+0xD5BC 0x5ABC
+0xD5BD 0x5ABE
+0xD5BE 0x5ACB
+0xD5BF 0x5AC2
+0xD5C0 0x5ABD
+0xD5C1 0x5AE3
+0xD5C2 0x5AD7
+0xD5C3 0x5AE6
+0xD5C4 0x5AE9
+0xD5C5 0x5AD6
+0xD5C6 0x5AFA
+0xD5C7 0x5AFB
+0xD5C8 0x5B0C
+0xD5C9 0x5B0B
+0xD5CA 0x5B16
+0xD5CB 0x5B32
+0xD5CC 0x5AD0
+0xD5CD 0x5B2A
+0xD5CE 0x5B36
+0xD5CF 0x5B3E
+0xD5D0 0x5B43
+0xD5D1 0x5B45
+0xD5D2 0x5B40
+0xD5D3 0x5B51
+0xD5D4 0x5B55
+0xD5D5 0x5B5A
+0xD5D6 0x5B5B
+0xD5D7 0x5B65
+0xD5D8 0x5B69
+0xD5D9 0x5B70
+0xD5DA 0x5B73
+0xD5DB 0x5B75
+0xD5DC 0x5B78
+0xD5DD 0x6588
+0xD5DE 0x5B7A
+0xD5DF 0x5B80
+0xD5E0 0x5B83
+0xD5E1 0x5BA6
+0xD5E2 0x5BB8
+0xD5E3 0x5BC3
+0xD5E4 0x5BC7
+0xD5E5 0x5BC9
+0xD5E6 0x5BD4
+0xD5E7 0x5BD0
+0xD5E8 0x5BE4
+0xD5E9 0x5BE6
+0xD5EA 0x5BE2
+0xD5EB 0x5BDE
+0xD5EC 0x5BE5
+0xD5ED 0x5BEB
+0xD5EE 0x5BF0
+0xD5EF 0x5BF6
+0xD5F0 0x5BF3
+0xD5F1 0x5C05
+0xD5F2 0x5C07
+0xD5F3 0x5C08
+0xD5F4 0x5C0D
+0xD5F5 0x5C13
+0xD5F6 0x5C20
+0xD5F7 0x5C22
+0xD5F8 0x5C28
+0xD5F9 0x5C38
+0xD5FA 0x5C39
+0xD5FB 0x5C41
+0xD5FC 0x5C46
+0xD5FD 0x5C4E
+0xD5FE 0x5C53
+0xD6A1 0x5C50
+0xD6A2 0x5C4F
+0xD6A3 0x5B71
+0xD6A4 0x5C6C
+0xD6A5 0x5C6E
+0xD6A6 0x4E62
+0xD6A7 0x5C76
+0xD6A8 0x5C79
+0xD6A9 0x5C8C
+0xD6AA 0x5C91
+0xD6AB 0x5C94
+0xD6AC 0x599B
+0xD6AD 0x5CAB
+0xD6AE 0x5CBB
+0xD6AF 0x5CB6
+0xD6B0 0x5CBC
+0xD6B1 0x5CB7
+0xD6B2 0x5CC5
+0xD6B3 0x5CBE
+0xD6B4 0x5CC7
+0xD6B5 0x5CD9
+0xD6B6 0x5CE9
+0xD6B7 0x5CFD
+0xD6B8 0x5CFA
+0xD6B9 0x5CED
+0xD6BA 0x5D8C
+0xD6BB 0x5CEA
+0xD6BC 0x5D0B
+0xD6BD 0x5D15
+0xD6BE 0x5D17
+0xD6BF 0x5D5C
+0xD6C0 0x5D1F
+0xD6C1 0x5D1B
+0xD6C2 0x5D11
+0xD6C3 0x5D14
+0xD6C4 0x5D22
+0xD6C5 0x5D1A
+0xD6C6 0x5D19
+0xD6C7 0x5D18
+0xD6C8 0x5D4C
+0xD6C9 0x5D52
+0xD6CA 0x5D4E
+0xD6CB 0x5D4B
+0xD6CC 0x5D6C
+0xD6CD 0x5D73
+0xD6CE 0x5D76
+0xD6CF 0x5D87
+0xD6D0 0x5D84
+0xD6D1 0x5D82
+0xD6D2 0x5DA2
+0xD6D3 0x5D9D
+0xD6D4 0x5DAC
+0xD6D5 0x5DAE
+0xD6D6 0x5DBD
+0xD6D7 0x5D90
+0xD6D8 0x5DB7
+0xD6D9 0x5DBC
+0xD6DA 0x5DC9
+0xD6DB 0x5DCD
+0xD6DC 0x5DD3
+0xD6DD 0x5DD2
+0xD6DE 0x5DD6
+0xD6DF 0x5DDB
+0xD6E0 0x5DEB
+0xD6E1 0x5DF2
+0xD6E2 0x5DF5
+0xD6E3 0x5E0B
+0xD6E4 0x5E1A
+0xD6E5 0x5E19
+0xD6E6 0x5E11
+0xD6E7 0x5E1B
+0xD6E8 0x5E36
+0xD6E9 0x5E37
+0xD6EA 0x5E44
+0xD6EB 0x5E43
+0xD6EC 0x5E40
+0xD6ED 0x5E4E
+0xD6EE 0x5E57
+0xD6EF 0x5E54
+0xD6F0 0x5E5F
+0xD6F1 0x5E62
+0xD6F2 0x5E64
+0xD6F3 0x5E47
+0xD6F4 0x5E75
+0xD6F5 0x5E76
+0xD6F6 0x5E7A
+0xD6F7 0x9EBC
+0xD6F8 0x5E7F
+0xD6F9 0x5EA0
+0xD6FA 0x5EC1
+0xD6FB 0x5EC2
+0xD6FC 0x5EC8
+0xD6FD 0x5ED0
+0xD6FE 0x5ECF
+0xD7A1 0x5ED6
+0xD7A2 0x5EE3
+0xD7A3 0x5EDD
+0xD7A4 0x5EDA
+0xD7A5 0x5EDB
+0xD7A6 0x5EE2
+0xD7A7 0x5EE1
+0xD7A8 0x5EE8
+0xD7A9 0x5EE9
+0xD7AA 0x5EEC
+0xD7AB 0x5EF1
+0xD7AC 0x5EF3
+0xD7AD 0x5EF0
+0xD7AE 0x5EF4
+0xD7AF 0x5EF8
+0xD7B0 0x5EFE
+0xD7B1 0x5F03
+0xD7B2 0x5F09
+0xD7B3 0x5F5D
+0xD7B4 0x5F5C
+0xD7B5 0x5F0B
+0xD7B6 0x5F11
+0xD7B7 0x5F16
+0xD7B8 0x5F29
+0xD7B9 0x5F2D
+0xD7BA 0x5F38
+0xD7BB 0x5F41
+0xD7BC 0x5F48
+0xD7BD 0x5F4C
+0xD7BE 0x5F4E
+0xD7BF 0x5F2F
+0xD7C0 0x5F51
+0xD7C1 0x5F56
+0xD7C2 0x5F57
+0xD7C3 0x5F59
+0xD7C4 0x5F61
+0xD7C5 0x5F6D
+0xD7C6 0x5F73
+0xD7C7 0x5F77
+0xD7C8 0x5F83
+0xD7C9 0x5F82
+0xD7CA 0x5F7F
+0xD7CB 0x5F8A
+0xD7CC 0x5F88
+0xD7CD 0x5F91
+0xD7CE 0x5F87
+0xD7CF 0x5F9E
+0xD7D0 0x5F99
+0xD7D1 0x5F98
+0xD7D2 0x5FA0
+0xD7D3 0x5FA8
+0xD7D4 0x5FAD
+0xD7D5 0x5FBC
+0xD7D6 0x5FD6
+0xD7D7 0x5FFB
+0xD7D8 0x5FE4
+0xD7D9 0x5FF8
+0xD7DA 0x5FF1
+0xD7DB 0x5FDD
+0xD7DC 0x60B3
+0xD7DD 0x5FFF
+0xD7DE 0x6021
+0xD7DF 0x6060
+0xD7E0 0x6019
+0xD7E1 0x6010
+0xD7E2 0x6029
+0xD7E3 0x600E
+0xD7E4 0x6031
+0xD7E5 0x601B
+0xD7E6 0x6015
+0xD7E7 0x602B
+0xD7E8 0x6026
+0xD7E9 0x600F
+0xD7EA 0x603A
+0xD7EB 0x605A
+0xD7EC 0x6041
+0xD7ED 0x606A
+0xD7EE 0x6077
+0xD7EF 0x605F
+0xD7F0 0x604A
+0xD7F1 0x6046
+0xD7F2 0x604D
+0xD7F3 0x6063
+0xD7F4 0x6043
+0xD7F5 0x6064
+0xD7F6 0x6042
+0xD7F7 0x606C
+0xD7F8 0x606B
+0xD7F9 0x6059
+0xD7FA 0x6081
+0xD7FB 0x608D
+0xD7FC 0x60E7
+0xD7FD 0x6083
+0xD7FE 0x609A
+0xD8A1 0x6084
+0xD8A2 0x609B
+0xD8A3 0x6096
+0xD8A4 0x6097
+0xD8A5 0x6092
+0xD8A6 0x60A7
+0xD8A7 0x608B
+0xD8A8 0x60E1
+0xD8A9 0x60B8
+0xD8AA 0x60E0
+0xD8AB 0x60D3
+0xD8AC 0x60B4
+0xD8AD 0x5FF0
+0xD8AE 0x60BD
+0xD8AF 0x60C6
+0xD8B0 0x60B5
+0xD8B1 0x60D8
+0xD8B2 0x614D
+0xD8B3 0x6115
+0xD8B4 0x6106
+0xD8B5 0x60F6
+0xD8B6 0x60F7
+0xD8B7 0x6100
+0xD8B8 0x60F4
+0xD8B9 0x60FA
+0xD8BA 0x6103
+0xD8BB 0x6121
+0xD8BC 0x60FB
+0xD8BD 0x60F1
+0xD8BE 0x610D
+0xD8BF 0x610E
+0xD8C0 0x6147
+0xD8C1 0x613E
+0xD8C2 0x6128
+0xD8C3 0x6127
+0xD8C4 0x614A
+0xD8C5 0x613F
+0xD8C6 0x613C
+0xD8C7 0x612C
+0xD8C8 0x6134
+0xD8C9 0x613D
+0xD8CA 0x6142
+0xD8CB 0x6144
+0xD8CC 0x6173
+0xD8CD 0x6177
+0xD8CE 0x6158
+0xD8CF 0x6159
+0xD8D0 0x615A
+0xD8D1 0x616B
+0xD8D2 0x6174
+0xD8D3 0x616F
+0xD8D4 0x6165
+0xD8D5 0x6171
+0xD8D6 0x615F
+0xD8D7 0x615D
+0xD8D8 0x6153
+0xD8D9 0x6175
+0xD8DA 0x6199
+0xD8DB 0x6196
+0xD8DC 0x6187
+0xD8DD 0x61AC
+0xD8DE 0x6194
+0xD8DF 0x619A
+0xD8E0 0x618A
+0xD8E1 0x6191
+0xD8E2 0x61AB
+0xD8E3 0x61AE
+0xD8E4 0x61CC
+0xD8E5 0x61CA
+0xD8E6 0x61C9
+0xD8E7 0x61F7
+0xD8E8 0x61C8
+0xD8E9 0x61C3
+0xD8EA 0x61C6
+0xD8EB 0x61BA
+0xD8EC 0x61CB
+0xD8ED 0x7F79
+0xD8EE 0x61CD
+0xD8EF 0x61E6
+0xD8F0 0x61E3
+0xD8F1 0x61F6
+0xD8F2 0x61FA
+0xD8F3 0x61F4
+0xD8F4 0x61FF
+0xD8F5 0x61FD
+0xD8F6 0x61FC
+0xD8F7 0x61FE
+0xD8F8 0x6200
+0xD8F9 0x6208
+0xD8FA 0x6209
+0xD8FB 0x620D
+0xD8FC 0x620C
+0xD8FD 0x6214
+0xD8FE 0x621B
+0xD9A1 0x621E
+0xD9A2 0x6221
+0xD9A3 0x622A
+0xD9A4 0x622E
+0xD9A5 0x6230
+0xD9A6 0x6232
+0xD9A7 0x6233
+0xD9A8 0x6241
+0xD9A9 0x624E
+0xD9AA 0x625E
+0xD9AB 0x6263
+0xD9AC 0x625B
+0xD9AD 0x6260
+0xD9AE 0x6268
+0xD9AF 0x627C
+0xD9B0 0x6282
+0xD9B1 0x6289
+0xD9B2 0x627E
+0xD9B3 0x6292
+0xD9B4 0x6293
+0xD9B5 0x6296
+0xD9B6 0x62D4
+0xD9B7 0x6283
+0xD9B8 0x6294
+0xD9B9 0x62D7
+0xD9BA 0x62D1
+0xD9BB 0x62BB
+0xD9BC 0x62CF
+0xD9BD 0x62FF
+0xD9BE 0x62C6
+0xD9BF 0x64D4
+0xD9C0 0x62C8
+0xD9C1 0x62DC
+0xD9C2 0x62CC
+0xD9C3 0x62CA
+0xD9C4 0x62C2
+0xD9C5 0x62C7
+0xD9C6 0x629B
+0xD9C7 0x62C9
+0xD9C8 0x630C
+0xD9C9 0x62EE
+0xD9CA 0x62F1
+0xD9CB 0x6327
+0xD9CC 0x6302
+0xD9CD 0x6308
+0xD9CE 0x62EF
+0xD9CF 0x62F5
+0xD9D0 0x6350
+0xD9D1 0x633E
+0xD9D2 0x634D
+0xD9D3 0x641C
+0xD9D4 0x634F
+0xD9D5 0x6396
+0xD9D6 0x638E
+0xD9D7 0x6380
+0xD9D8 0x63AB
+0xD9D9 0x6376
+0xD9DA 0x63A3
+0xD9DB 0x638F
+0xD9DC 0x6389
+0xD9DD 0x639F
+0xD9DE 0x63B5
+0xD9DF 0x636B
+0xD9E0 0x6369
+0xD9E1 0x63BE
+0xD9E2 0x63E9
+0xD9E3 0x63C0
+0xD9E4 0x63C6
+0xD9E5 0x63E3
+0xD9E6 0x63C9
+0xD9E7 0x63D2
+0xD9E8 0x63F6
+0xD9E9 0x63C4
+0xD9EA 0x6416
+0xD9EB 0x6434
+0xD9EC 0x6406
+0xD9ED 0x6413
+0xD9EE 0x6426
+0xD9EF 0x6436
+0xD9F0 0x651D
+0xD9F1 0x6417
+0xD9F2 0x6428
+0xD9F3 0x640F
+0xD9F4 0x6467
+0xD9F5 0x646F
+0xD9F6 0x6476
+0xD9F7 0x644E
+0xD9F8 0x652A
+0xD9F9 0x6495
+0xD9FA 0x6493
+0xD9FB 0x64A5
+0xD9FC 0x64A9
+0xD9FD 0x6488
+0xD9FE 0x64BC
+0xDAA1 0x64DA
+0xDAA2 0x64D2
+0xDAA3 0x64C5
+0xDAA4 0x64C7
+0xDAA5 0x64BB
+0xDAA6 0x64D8
+0xDAA7 0x64C2
+0xDAA8 0x64F1
+0xDAA9 0x64E7
+0xDAAA 0x8209
+0xDAAB 0x64E0
+0xDAAC 0x64E1
+0xDAAD 0x62AC
+0xDAAE 0x64E3
+0xDAAF 0x64EF
+0xDAB0 0x652C
+0xDAB1 0x64F6
+0xDAB2 0x64F4
+0xDAB3 0x64F2
+0xDAB4 0x64FA
+0xDAB5 0x6500
+0xDAB6 0x64FD
+0xDAB7 0x6518
+0xDAB8 0x651C
+0xDAB9 0x6505
+0xDABA 0x6524
+0xDABB 0x6523
+0xDABC 0x652B
+0xDABD 0x6534
+0xDABE 0x6535
+0xDABF 0x6537
+0xDAC0 0x6536
+0xDAC1 0x6538
+0xDAC2 0x754B
+0xDAC3 0x6548
+0xDAC4 0x6556
+0xDAC5 0x6555
+0xDAC6 0x654D
+0xDAC7 0x6558
+0xDAC8 0x655E
+0xDAC9 0x655D
+0xDACA 0x6572
+0xDACB 0x6578
+0xDACC 0x6582
+0xDACD 0x6583
+0xDACE 0x8B8A
+0xDACF 0x659B
+0xDAD0 0x659F
+0xDAD1 0x65AB
+0xDAD2 0x65B7
+0xDAD3 0x65C3
+0xDAD4 0x65C6
+0xDAD5 0x65C1
+0xDAD6 0x65C4
+0xDAD7 0x65CC
+0xDAD8 0x65D2
+0xDAD9 0x65DB
+0xDADA 0x65D9
+0xDADB 0x65E0
+0xDADC 0x65E1
+0xDADD 0x65F1
+0xDADE 0x6772
+0xDADF 0x660A
+0xDAE0 0x6603
+0xDAE1 0x65FB
+0xDAE2 0x6773
+0xDAE3 0x6635
+0xDAE4 0x6636
+0xDAE5 0x6634
+0xDAE6 0x661C
+0xDAE7 0x664F
+0xDAE8 0x6644
+0xDAE9 0x6649
+0xDAEA 0x6641
+0xDAEB 0x665E
+0xDAEC 0x665D
+0xDAED 0x6664
+0xDAEE 0x6667
+0xDAEF 0x6668
+0xDAF0 0x665F
+0xDAF1 0x6662
+0xDAF2 0x6670
+0xDAF3 0x6683
+0xDAF4 0x6688
+0xDAF5 0x668E
+0xDAF6 0x6689
+0xDAF7 0x6684
+0xDAF8 0x6698
+0xDAF9 0x669D
+0xDAFA 0x66C1
+0xDAFB 0x66B9
+0xDAFC 0x66C9
+0xDAFD 0x66BE
+0xDAFE 0x66BC
+0xDBA1 0x66C4
+0xDBA2 0x66B8
+0xDBA3 0x66D6
+0xDBA4 0x66DA
+0xDBA5 0x66E0
+0xDBA6 0x663F
+0xDBA7 0x66E6
+0xDBA8 0x66E9
+0xDBA9 0x66F0
+0xDBAA 0x66F5
+0xDBAB 0x66F7
+0xDBAC 0x670F
+0xDBAD 0x6716
+0xDBAE 0x671E
+0xDBAF 0x6726
+0xDBB0 0x6727
+0xDBB1 0x9738
+0xDBB2 0x672E
+0xDBB3 0x673F
+0xDBB4 0x6736
+0xDBB5 0x6741
+0xDBB6 0x6738
+0xDBB7 0x6737
+0xDBB8 0x6746
+0xDBB9 0x675E
+0xDBBA 0x6760
+0xDBBB 0x6759
+0xDBBC 0x6763
+0xDBBD 0x6764
+0xDBBE 0x6789
+0xDBBF 0x6770
+0xDBC0 0x67A9
+0xDBC1 0x677C
+0xDBC2 0x676A
+0xDBC3 0x678C
+0xDBC4 0x678B
+0xDBC5 0x67A6
+0xDBC6 0x67A1
+0xDBC7 0x6785
+0xDBC8 0x67B7
+0xDBC9 0x67EF
+0xDBCA 0x67B4
+0xDBCB 0x67EC
+0xDBCC 0x67B3
+0xDBCD 0x67E9
+0xDBCE 0x67B8
+0xDBCF 0x67E4
+0xDBD0 0x67DE
+0xDBD1 0x67DD
+0xDBD2 0x67E2
+0xDBD3 0x67EE
+0xDBD4 0x67B9
+0xDBD5 0x67CE
+0xDBD6 0x67C6
+0xDBD7 0x67E7
+0xDBD8 0x6A9C
+0xDBD9 0x681E
+0xDBDA 0x6846
+0xDBDB 0x6829
+0xDBDC 0x6840
+0xDBDD 0x684D
+0xDBDE 0x6832
+0xDBDF 0x684E
+0xDBE0 0x68B3
+0xDBE1 0x682B
+0xDBE2 0x6859
+0xDBE3 0x6863
+0xDBE4 0x6877
+0xDBE5 0x687F
+0xDBE6 0x689F
+0xDBE7 0x688F
+0xDBE8 0x68AD
+0xDBE9 0x6894
+0xDBEA 0x689D
+0xDBEB 0x689B
+0xDBEC 0x6883
+0xDBED 0x6AAE
+0xDBEE 0x68B9
+0xDBEF 0x6874
+0xDBF0 0x68B5
+0xDBF1 0x68A0
+0xDBF2 0x68BA
+0xDBF3 0x690F
+0xDBF4 0x688D
+0xDBF5 0x687E
+0xDBF6 0x6901
+0xDBF7 0x68CA
+0xDBF8 0x6908
+0xDBF9 0x68D8
+0xDBFA 0x6922
+0xDBFB 0x6926
+0xDBFC 0x68E1
+0xDBFD 0x690C
+0xDBFE 0x68CD
+0xDCA1 0x68D4
+0xDCA2 0x68E7
+0xDCA3 0x68D5
+0xDCA4 0x6936
+0xDCA5 0x6912
+0xDCA6 0x6904
+0xDCA7 0x68D7
+0xDCA8 0x68E3
+0xDCA9 0x6925
+0xDCAA 0x68F9
+0xDCAB 0x68E0
+0xDCAC 0x68EF
+0xDCAD 0x6928
+0xDCAE 0x692A
+0xDCAF 0x691A
+0xDCB0 0x6923
+0xDCB1 0x6921
+0xDCB2 0x68C6
+0xDCB3 0x6979
+0xDCB4 0x6977
+0xDCB5 0x695C
+0xDCB6 0x6978
+0xDCB7 0x696B
+0xDCB8 0x6954
+0xDCB9 0x697E
+0xDCBA 0x696E
+0xDCBB 0x6939
+0xDCBC 0x6974
+0xDCBD 0x693D
+0xDCBE 0x6959
+0xDCBF 0x6930
+0xDCC0 0x6961
+0xDCC1 0x695E
+0xDCC2 0x695D
+0xDCC3 0x6981
+0xDCC4 0x696A
+0xDCC5 0x69B2
+0xDCC6 0x69AE
+0xDCC7 0x69D0
+0xDCC8 0x69BF
+0xDCC9 0x69C1
+0xDCCA 0x69D3
+0xDCCB 0x69BE
+0xDCCC 0x69CE
+0xDCCD 0x5BE8
+0xDCCE 0x69CA
+0xDCCF 0x69DD
+0xDCD0 0x69BB
+0xDCD1 0x69C3
+0xDCD2 0x69A7
+0xDCD3 0x6A2E
+0xDCD4 0x6991
+0xDCD5 0x69A0
+0xDCD6 0x699C
+0xDCD7 0x6995
+0xDCD8 0x69B4
+0xDCD9 0x69DE
+0xDCDA 0x69E8
+0xDCDB 0x6A02
+0xDCDC 0x6A1B
+0xDCDD 0x69FF
+0xDCDE 0x6B0A
+0xDCDF 0x69F9
+0xDCE0 0x69F2
+0xDCE1 0x69E7
+0xDCE2 0x6A05
+0xDCE3 0x69B1
+0xDCE4 0x6A1E
+0xDCE5 0x69ED
+0xDCE6 0x6A14
+0xDCE7 0x69EB
+0xDCE8 0x6A0A
+0xDCE9 0x6A12
+0xDCEA 0x6AC1
+0xDCEB 0x6A23
+0xDCEC 0x6A13
+0xDCED 0x6A44
+0xDCEE 0x6A0C
+0xDCEF 0x6A72
+0xDCF0 0x6A36
+0xDCF1 0x6A78
+0xDCF2 0x6A47
+0xDCF3 0x6A62
+0xDCF4 0x6A59
+0xDCF5 0x6A66
+0xDCF6 0x6A48
+0xDCF7 0x6A38
+0xDCF8 0x6A22
+0xDCF9 0x6A90
+0xDCFA 0x6A8D
+0xDCFB 0x6AA0
+0xDCFC 0x6A84
+0xDCFD 0x6AA2
+0xDCFE 0x6AA3
+0xDDA1 0x6A97
+0xDDA2 0x8617
+0xDDA3 0x6ABB
+0xDDA4 0x6AC3
+0xDDA5 0x6AC2
+0xDDA6 0x6AB8
+0xDDA7 0x6AB3
+0xDDA8 0x6AAC
+0xDDA9 0x6ADE
+0xDDAA 0x6AD1
+0xDDAB 0x6ADF
+0xDDAC 0x6AAA
+0xDDAD 0x6ADA
+0xDDAE 0x6AEA
+0xDDAF 0x6AFB
+0xDDB0 0x6B05
+0xDDB1 0x8616
+0xDDB2 0x6AFA
+0xDDB3 0x6B12
+0xDDB4 0x6B16
+0xDDB5 0x9B31
+0xDDB6 0x6B1F
+0xDDB7 0x6B38
+0xDDB8 0x6B37
+0xDDB9 0x76DC
+0xDDBA 0x6B39
+0xDDBB 0x98EE
+0xDDBC 0x6B47
+0xDDBD 0x6B43
+0xDDBE 0x6B49
+0xDDBF 0x6B50
+0xDDC0 0x6B59
+0xDDC1 0x6B54
+0xDDC2 0x6B5B
+0xDDC3 0x6B5F
+0xDDC4 0x6B61
+0xDDC5 0x6B78
+0xDDC6 0x6B79
+0xDDC7 0x6B7F
+0xDDC8 0x6B80
+0xDDC9 0x6B84
+0xDDCA 0x6B83
+0xDDCB 0x6B8D
+0xDDCC 0x6B98
+0xDDCD 0x6B95
+0xDDCE 0x6B9E
+0xDDCF 0x6BA4
+0xDDD0 0x6BAA
+0xDDD1 0x6BAB
+0xDDD2 0x6BAF
+0xDDD3 0x6BB2
+0xDDD4 0x6BB1
+0xDDD5 0x6BB3
+0xDDD6 0x6BB7
+0xDDD7 0x6BBC
+0xDDD8 0x6BC6
+0xDDD9 0x6BCB
+0xDDDA 0x6BD3
+0xDDDB 0x6BDF
+0xDDDC 0x6BEC
+0xDDDD 0x6BEB
+0xDDDE 0x6BF3
+0xDDDF 0x6BEF
+0xDDE0 0x9EBE
+0xDDE1 0x6C08
+0xDDE2 0x6C13
+0xDDE3 0x6C14
+0xDDE4 0x6C1B
+0xDDE5 0x6C24
+0xDDE6 0x6C23
+0xDDE7 0x6C5E
+0xDDE8 0x6C55
+0xDDE9 0x6C62
+0xDDEA 0x6C6A
+0xDDEB 0x6C82
+0xDDEC 0x6C8D
+0xDDED 0x6C9A
+0xDDEE 0x6C81
+0xDDEF 0x6C9B
+0xDDF0 0x6C7E
+0xDDF1 0x6C68
+0xDDF2 0x6C73
+0xDDF3 0x6C92
+0xDDF4 0x6C90
+0xDDF5 0x6CC4
+0xDDF6 0x6CF1
+0xDDF7 0x6CD3
+0xDDF8 0x6CBD
+0xDDF9 0x6CD7
+0xDDFA 0x6CC5
+0xDDFB 0x6CDD
+0xDDFC 0x6CAE
+0xDDFD 0x6CB1
+0xDDFE 0x6CBE
+0xDEA1 0x6CBA
+0xDEA2 0x6CDB
+0xDEA3 0x6CEF
+0xDEA4 0x6CD9
+0xDEA5 0x6CEA
+0xDEA6 0x6D1F
+0xDEA7 0x884D
+0xDEA8 0x6D36
+0xDEA9 0x6D2B
+0xDEAA 0x6D3D
+0xDEAB 0x6D38
+0xDEAC 0x6D19
+0xDEAD 0x6D35
+0xDEAE 0x6D33
+0xDEAF 0x6D12
+0xDEB0 0x6D0C
+0xDEB1 0x6D63
+0xDEB2 0x6D93
+0xDEB3 0x6D64
+0xDEB4 0x6D5A
+0xDEB5 0x6D79
+0xDEB6 0x6D59
+0xDEB7 0x6D8E
+0xDEB8 0x6D95
+0xDEB9 0x6FE4
+0xDEBA 0x6D85
+0xDEBB 0x6DF9
+0xDEBC 0x6E15
+0xDEBD 0x6E0A
+0xDEBE 0x6DB5
+0xDEBF 0x6DC7
+0xDEC0 0x6DE6
+0xDEC1 0x6DB8
+0xDEC2 0x6DC6
+0xDEC3 0x6DEC
+0xDEC4 0x6DDE
+0xDEC5 0x6DCC
+0xDEC6 0x6DE8
+0xDEC7 0x6DD2
+0xDEC8 0x6DC5
+0xDEC9 0x6DFA
+0xDECA 0x6DD9
+0xDECB 0x6DE4
+0xDECC 0x6DD5
+0xDECD 0x6DEA
+0xDECE 0x6DEE
+0xDECF 0x6E2D
+0xDED0 0x6E6E
+0xDED1 0x6E2E
+0xDED2 0x6E19
+0xDED3 0x6E72
+0xDED4 0x6E5F
+0xDED5 0x6E3E
+0xDED6 0x6E23
+0xDED7 0x6E6B
+0xDED8 0x6E2B
+0xDED9 0x6E76
+0xDEDA 0x6E4D
+0xDEDB 0x6E1F
+0xDEDC 0x6E43
+0xDEDD 0x6E3A
+0xDEDE 0x6E4E
+0xDEDF 0x6E24
+0xDEE0 0x6EFF
+0xDEE1 0x6E1D
+0xDEE2 0x6E38
+0xDEE3 0x6E82
+0xDEE4 0x6EAA
+0xDEE5 0x6E98
+0xDEE6 0x6EC9
+0xDEE7 0x6EB7
+0xDEE8 0x6ED3
+0xDEE9 0x6EBD
+0xDEEA 0x6EAF
+0xDEEB 0x6EC4
+0xDEEC 0x6EB2
+0xDEED 0x6ED4
+0xDEEE 0x6ED5
+0xDEEF 0x6E8F
+0xDEF0 0x6EA5
+0xDEF1 0x6EC2
+0xDEF2 0x6E9F
+0xDEF3 0x6F41
+0xDEF4 0x6F11
+0xDEF5 0x704C
+0xDEF6 0x6EEC
+0xDEF7 0x6EF8
+0xDEF8 0x6EFE
+0xDEF9 0x6F3F
+0xDEFA 0x6EF2
+0xDEFB 0x6F31
+0xDEFC 0x6EEF
+0xDEFD 0x6F32
+0xDEFE 0x6ECC
+0xDFA1 0x6F3E
+0xDFA2 0x6F13
+0xDFA3 0x6EF7
+0xDFA4 0x6F86
+0xDFA5 0x6F7A
+0xDFA6 0x6F78
+0xDFA7 0x6F81
+0xDFA8 0x6F80
+0xDFA9 0x6F6F
+0xDFAA 0x6F5B
+0xDFAB 0x6FF3
+0xDFAC 0x6F6D
+0xDFAD 0x6F82
+0xDFAE 0x6F7C
+0xDFAF 0x6F58
+0xDFB0 0x6F8E
+0xDFB1 0x6F91
+0xDFB2 0x6FC2
+0xDFB3 0x6F66
+0xDFB4 0x6FB3
+0xDFB5 0x6FA3
+0xDFB6 0x6FA1
+0xDFB7 0x6FA4
+0xDFB8 0x6FB9
+0xDFB9 0x6FC6
+0xDFBA 0x6FAA
+0xDFBB 0x6FDF
+0xDFBC 0x6FD5
+0xDFBD 0x6FEC
+0xDFBE 0x6FD4
+0xDFBF 0x6FD8
+0xDFC0 0x6FF1
+0xDFC1 0x6FEE
+0xDFC2 0x6FDB
+0xDFC3 0x7009
+0xDFC4 0x700B
+0xDFC5 0x6FFA
+0xDFC6 0x7011
+0xDFC7 0x7001
+0xDFC8 0x700F
+0xDFC9 0x6FFE
+0xDFCA 0x701B
+0xDFCB 0x701A
+0xDFCC 0x6F74
+0xDFCD 0x701D
+0xDFCE 0x7018
+0xDFCF 0x701F
+0xDFD0 0x7030
+0xDFD1 0x703E
+0xDFD2 0x7032
+0xDFD3 0x7051
+0xDFD4 0x7063
+0xDFD5 0x7099
+0xDFD6 0x7092
+0xDFD7 0x70AF
+0xDFD8 0x70F1
+0xDFD9 0x70AC
+0xDFDA 0x70B8
+0xDFDB 0x70B3
+0xDFDC 0x70AE
+0xDFDD 0x70DF
+0xDFDE 0x70CB
+0xDFDF 0x70DD
+0xDFE0 0x70D9
+0xDFE1 0x7109
+0xDFE2 0x70FD
+0xDFE3 0x711C
+0xDFE4 0x7119
+0xDFE5 0x7165
+0xDFE6 0x7155
+0xDFE7 0x7188
+0xDFE8 0x7166
+0xDFE9 0x7162
+0xDFEA 0x714C
+0xDFEB 0x7156
+0xDFEC 0x716C
+0xDFED 0x718F
+0xDFEE 0x71FB
+0xDFEF 0x7184
+0xDFF0 0x7195
+0xDFF1 0x71A8
+0xDFF2 0x71AC
+0xDFF3 0x71D7
+0xDFF4 0x71B9
+0xDFF5 0x71BE
+0xDFF6 0x71D2
+0xDFF7 0x71C9
+0xDFF8 0x71D4
+0xDFF9 0x71CE
+0xDFFA 0x71E0
+0xDFFB 0x71EC
+0xDFFC 0x71E7
+0xDFFD 0x71F5
+0xDFFE 0x71FC
+0xE0A1 0x71F9
+0xE0A2 0x71FF
+0xE0A3 0x720D
+0xE0A4 0x7210
+0xE0A5 0x721B
+0xE0A6 0x7228
+0xE0A7 0x722D
+0xE0A8 0x722C
+0xE0A9 0x7230
+0xE0AA 0x7232
+0xE0AB 0x723B
+0xE0AC 0x723C
+0xE0AD 0x723F
+0xE0AE 0x7240
+0xE0AF 0x7246
+0xE0B0 0x724B
+0xE0B1 0x7258
+0xE0B2 0x7274
+0xE0B3 0x727E
+0xE0B4 0x7282
+0xE0B5 0x7281
+0xE0B6 0x7287
+0xE0B7 0x7292
+0xE0B8 0x7296
+0xE0B9 0x72A2
+0xE0BA 0x72A7
+0xE0BB 0x72B9
+0xE0BC 0x72B2
+0xE0BD 0x72C3
+0xE0BE 0x72C6
+0xE0BF 0x72C4
+0xE0C0 0x72CE
+0xE0C1 0x72D2
+0xE0C2 0x72E2
+0xE0C3 0x72E0
+0xE0C4 0x72E1
+0xE0C5 0x72F9
+0xE0C6 0x72F7
+0xE0C7 0x500F
+0xE0C8 0x7317
+0xE0C9 0x730A
+0xE0CA 0x731C
+0xE0CB 0x7316
+0xE0CC 0x731D
+0xE0CD 0x7334
+0xE0CE 0x732F
+0xE0CF 0x7329
+0xE0D0 0x7325
+0xE0D1 0x733E
+0xE0D2 0x734E
+0xE0D3 0x734F
+0xE0D4 0x9ED8
+0xE0D5 0x7357
+0xE0D6 0x736A
+0xE0D7 0x7368
+0xE0D8 0x7370
+0xE0D9 0x7378
+0xE0DA 0x7375
+0xE0DB 0x737B
+0xE0DC 0x737A
+0xE0DD 0x73C8
+0xE0DE 0x73B3
+0xE0DF 0x73CE
+0xE0E0 0x73BB
+0xE0E1 0x73C0
+0xE0E2 0x73E5
+0xE0E3 0x73EE
+0xE0E4 0x73DE
+0xE0E5 0x74A2
+0xE0E6 0x7405
+0xE0E7 0x746F
+0xE0E8 0x7425
+0xE0E9 0x73F8
+0xE0EA 0x7432
+0xE0EB 0x743A
+0xE0EC 0x7455
+0xE0ED 0x743F
+0xE0EE 0x745F
+0xE0EF 0x7459
+0xE0F0 0x7441
+0xE0F1 0x745C
+0xE0F2 0x7469
+0xE0F3 0x7470
+0xE0F4 0x7463
+0xE0F5 0x746A
+0xE0F6 0x7476
+0xE0F7 0x747E
+0xE0F8 0x748B
+0xE0F9 0x749E
+0xE0FA 0x74A7
+0xE0FB 0x74CA
+0xE0FC 0x74CF
+0xE0FD 0x74D4
+0xE0FE 0x73F1
+0xE1A1 0x74E0
+0xE1A2 0x74E3
+0xE1A3 0x74E7
+0xE1A4 0x74E9
+0xE1A5 0x74EE
+0xE1A6 0x74F2
+0xE1A7 0x74F0
+0xE1A8 0x74F1
+0xE1A9 0x74F8
+0xE1AA 0x74F7
+0xE1AB 0x7504
+0xE1AC 0x7503
+0xE1AD 0x7505
+0xE1AE 0x750C
+0xE1AF 0x750E
+0xE1B0 0x750D
+0xE1B1 0x7515
+0xE1B2 0x7513
+0xE1B3 0x751E
+0xE1B4 0x7526
+0xE1B5 0x752C
+0xE1B6 0x753C
+0xE1B7 0x7544
+0xE1B8 0x754D
+0xE1B9 0x754A
+0xE1BA 0x7549
+0xE1BB 0x755B
+0xE1BC 0x7546
+0xE1BD 0x755A
+0xE1BE 0x7569
+0xE1BF 0x7564
+0xE1C0 0x7567
+0xE1C1 0x756B
+0xE1C2 0x756D
+0xE1C3 0x7578
+0xE1C4 0x7576
+0xE1C5 0x7586
+0xE1C6 0x7587
+0xE1C7 0x7574
+0xE1C8 0x758A
+0xE1C9 0x7589
+0xE1CA 0x7582
+0xE1CB 0x7594
+0xE1CC 0x759A
+0xE1CD 0x759D
+0xE1CE 0x75A5
+0xE1CF 0x75A3
+0xE1D0 0x75C2
+0xE1D1 0x75B3
+0xE1D2 0x75C3
+0xE1D3 0x75B5
+0xE1D4 0x75BD
+0xE1D5 0x75B8
+0xE1D6 0x75BC
+0xE1D7 0x75B1
+0xE1D8 0x75CD
+0xE1D9 0x75CA
+0xE1DA 0x75D2
+0xE1DB 0x75D9
+0xE1DC 0x75E3
+0xE1DD 0x75DE
+0xE1DE 0x75FE
+0xE1DF 0x75FF
+0xE1E0 0x75FC
+0xE1E1 0x7601
+0xE1E2 0x75F0
+0xE1E3 0x75FA
+0xE1E4 0x75F2
+0xE1E5 0x75F3
+0xE1E6 0x760B
+0xE1E7 0x760D
+0xE1E8 0x7609
+0xE1E9 0x761F
+0xE1EA 0x7627
+0xE1EB 0x7620
+0xE1EC 0x7621
+0xE1ED 0x7622
+0xE1EE 0x7624
+0xE1EF 0x7634
+0xE1F0 0x7630
+0xE1F1 0x763B
+0xE1F2 0x7647
+0xE1F3 0x7648
+0xE1F4 0x7646
+0xE1F5 0x765C
+0xE1F6 0x7658
+0xE1F7 0x7661
+0xE1F8 0x7662
+0xE1F9 0x7668
+0xE1FA 0x7669
+0xE1FB 0x766A
+0xE1FC 0x7667
+0xE1FD 0x766C
+0xE1FE 0x7670
+0xE2A1 0x7672
+0xE2A2 0x7676
+0xE2A3 0x7678
+0xE2A4 0x767C
+0xE2A5 0x7680
+0xE2A6 0x7683
+0xE2A7 0x7688
+0xE2A8 0x768B
+0xE2A9 0x768E
+0xE2AA 0x7696
+0xE2AB 0x7693
+0xE2AC 0x7699
+0xE2AD 0x769A
+0xE2AE 0x76B0
+0xE2AF 0x76B4
+0xE2B0 0x76B8
+0xE2B1 0x76B9
+0xE2B2 0x76BA
+0xE2B3 0x76C2
+0xE2B4 0x76CD
+0xE2B5 0x76D6
+0xE2B6 0x76D2
+0xE2B7 0x76DE
+0xE2B8 0x76E1
+0xE2B9 0x76E5
+0xE2BA 0x76E7
+0xE2BB 0x76EA
+0xE2BC 0x862F
+0xE2BD 0x76FB
+0xE2BE 0x7708
+0xE2BF 0x7707
+0xE2C0 0x7704
+0xE2C1 0x7729
+0xE2C2 0x7724
+0xE2C3 0x771E
+0xE2C4 0x7725
+0xE2C5 0x7726
+0xE2C6 0x771B
+0xE2C7 0x7737
+0xE2C8 0x7738
+0xE2C9 0x7747
+0xE2CA 0x775A
+0xE2CB 0x7768
+0xE2CC 0x776B
+0xE2CD 0x775B
+0xE2CE 0x7765
+0xE2CF 0x777F
+0xE2D0 0x777E
+0xE2D1 0x7779
+0xE2D2 0x778E
+0xE2D3 0x778B
+0xE2D4 0x7791
+0xE2D5 0x77A0
+0xE2D6 0x779E
+0xE2D7 0x77B0
+0xE2D8 0x77B6
+0xE2D9 0x77B9
+0xE2DA 0x77BF
+0xE2DB 0x77BC
+0xE2DC 0x77BD
+0xE2DD 0x77BB
+0xE2DE 0x77C7
+0xE2DF 0x77CD
+0xE2E0 0x77D7
+0xE2E1 0x77DA
+0xE2E2 0x77DC
+0xE2E3 0x77E3
+0xE2E4 0x77EE
+0xE2E5 0x77FC
+0xE2E6 0x780C
+0xE2E7 0x7812
+0xE2E8 0x7926
+0xE2E9 0x7820
+0xE2EA 0x792A
+0xE2EB 0x7845
+0xE2EC 0x788E
+0xE2ED 0x7874
+0xE2EE 0x7886
+0xE2EF 0x787C
+0xE2F0 0x789A
+0xE2F1 0x788C
+0xE2F2 0x78A3
+0xE2F3 0x78B5
+0xE2F4 0x78AA
+0xE2F5 0x78AF
+0xE2F6 0x78D1
+0xE2F7 0x78C6
+0xE2F8 0x78CB
+0xE2F9 0x78D4
+0xE2FA 0x78BE
+0xE2FB 0x78BC
+0xE2FC 0x78C5
+0xE2FD 0x78CA
+0xE2FE 0x78EC
+0xE3A1 0x78E7
+0xE3A2 0x78DA
+0xE3A3 0x78FD
+0xE3A4 0x78F4
+0xE3A5 0x7907
+0xE3A6 0x7912
+0xE3A7 0x7911
+0xE3A8 0x7919
+0xE3A9 0x792C
+0xE3AA 0x792B
+0xE3AB 0x7940
+0xE3AC 0x7960
+0xE3AD 0x7957
+0xE3AE 0x795F
+0xE3AF 0x795A
+0xE3B0 0x7955
+0xE3B1 0x7953
+0xE3B2 0x797A
+0xE3B3 0x797F
+0xE3B4 0x798A
+0xE3B5 0x799D
+0xE3B6 0x79A7
+0xE3B7 0x9F4B
+0xE3B8 0x79AA
+0xE3B9 0x79AE
+0xE3BA 0x79B3
+0xE3BB 0x79B9
+0xE3BC 0x79BA
+0xE3BD 0x79C9
+0xE3BE 0x79D5
+0xE3BF 0x79E7
+0xE3C0 0x79EC
+0xE3C1 0x79E1
+0xE3C2 0x79E3
+0xE3C3 0x7A08
+0xE3C4 0x7A0D
+0xE3C5 0x7A18
+0xE3C6 0x7A19
+0xE3C7 0x7A20
+0xE3C8 0x7A1F
+0xE3C9 0x7980
+0xE3CA 0x7A31
+0xE3CB 0x7A3B
+0xE3CC 0x7A3E
+0xE3CD 0x7A37
+0xE3CE 0x7A43
+0xE3CF 0x7A57
+0xE3D0 0x7A49
+0xE3D1 0x7A61
+0xE3D2 0x7A62
+0xE3D3 0x7A69
+0xE3D4 0x9F9D
+0xE3D5 0x7A70
+0xE3D6 0x7A79
+0xE3D7 0x7A7D
+0xE3D8 0x7A88
+0xE3D9 0x7A97
+0xE3DA 0x7A95
+0xE3DB 0x7A98
+0xE3DC 0x7A96
+0xE3DD 0x7AA9
+0xE3DE 0x7AC8
+0xE3DF 0x7AB0
+0xE3E0 0x7AB6
+0xE3E1 0x7AC5
+0xE3E2 0x7AC4
+0xE3E3 0x7ABF
+0xE3E4 0x9083
+0xE3E5 0x7AC7
+0xE3E6 0x7ACA
+0xE3E7 0x7ACD
+0xE3E8 0x7ACF
+0xE3E9 0x7AD5
+0xE3EA 0x7AD3
+0xE3EB 0x7AD9
+0xE3EC 0x7ADA
+0xE3ED 0x7ADD
+0xE3EE 0x7AE1
+0xE3EF 0x7AE2
+0xE3F0 0x7AE6
+0xE3F1 0x7AED
+0xE3F2 0x7AF0
+0xE3F3 0x7B02
+0xE3F4 0x7B0F
+0xE3F5 0x7B0A
+0xE3F6 0x7B06
+0xE3F7 0x7B33
+0xE3F8 0x7B18
+0xE3F9 0x7B19
+0xE3FA 0x7B1E
+0xE3FB 0x7B35
+0xE3FC 0x7B28
+0xE3FD 0x7B36
+0xE3FE 0x7B50
+0xE4A1 0x7B7A
+0xE4A2 0x7B04
+0xE4A3 0x7B4D
+0xE4A4 0x7B0B
+0xE4A5 0x7B4C
+0xE4A6 0x7B45
+0xE4A7 0x7B75
+0xE4A8 0x7B65
+0xE4A9 0x7B74
+0xE4AA 0x7B67
+0xE4AB 0x7B70
+0xE4AC 0x7B71
+0xE4AD 0x7B6C
+0xE4AE 0x7B6E
+0xE4AF 0x7B9D
+0xE4B0 0x7B98
+0xE4B1 0x7B9F
+0xE4B2 0x7B8D
+0xE4B3 0x7B9C
+0xE4B4 0x7B9A
+0xE4B5 0x7B8B
+0xE4B6 0x7B92
+0xE4B7 0x7B8F
+0xE4B8 0x7B5D
+0xE4B9 0x7B99
+0xE4BA 0x7BCB
+0xE4BB 0x7BC1
+0xE4BC 0x7BCC
+0xE4BD 0x7BCF
+0xE4BE 0x7BB4
+0xE4BF 0x7BC6
+0xE4C0 0x7BDD
+0xE4C1 0x7BE9
+0xE4C2 0x7C11
+0xE4C3 0x7C14
+0xE4C4 0x7BE6
+0xE4C5 0x7BE5
+0xE4C6 0x7C60
+0xE4C7 0x7C00
+0xE4C8 0x7C07
+0xE4C9 0x7C13
+0xE4CA 0x7BF3
+0xE4CB 0x7BF7
+0xE4CC 0x7C17
+0xE4CD 0x7C0D
+0xE4CE 0x7BF6
+0xE4CF 0x7C23
+0xE4D0 0x7C27
+0xE4D1 0x7C2A
+0xE4D2 0x7C1F
+0xE4D3 0x7C37
+0xE4D4 0x7C2B
+0xE4D5 0x7C3D
+0xE4D6 0x7C4C
+0xE4D7 0x7C43
+0xE4D8 0x7C54
+0xE4D9 0x7C4F
+0xE4DA 0x7C40
+0xE4DB 0x7C50
+0xE4DC 0x7C58
+0xE4DD 0x7C5F
+0xE4DE 0x7C64
+0xE4DF 0x7C56
+0xE4E0 0x7C65
+0xE4E1 0x7C6C
+0xE4E2 0x7C75
+0xE4E3 0x7C83
+0xE4E4 0x7C90
+0xE4E5 0x7CA4
+0xE4E6 0x7CAD
+0xE4E7 0x7CA2
+0xE4E8 0x7CAB
+0xE4E9 0x7CA1
+0xE4EA 0x7CA8
+0xE4EB 0x7CB3
+0xE4EC 0x7CB2
+0xE4ED 0x7CB1
+0xE4EE 0x7CAE
+0xE4EF 0x7CB9
+0xE4F0 0x7CBD
+0xE4F1 0x7CC0
+0xE4F2 0x7CC5
+0xE4F3 0x7CC2
+0xE4F4 0x7CD8
+0xE4F5 0x7CD2
+0xE4F6 0x7CDC
+0xE4F7 0x7CE2
+0xE4F8 0x9B3B
+0xE4F9 0x7CEF
+0xE4FA 0x7CF2
+0xE4FB 0x7CF4
+0xE4FC 0x7CF6
+0xE4FD 0x7CFA
+0xE4FE 0x7D06
+0xE5A1 0x7D02
+0xE5A2 0x7D1C
+0xE5A3 0x7D15
+0xE5A4 0x7D0A
+0xE5A5 0x7D45
+0xE5A6 0x7D4B
+0xE5A7 0x7D2E
+0xE5A8 0x7D32
+0xE5A9 0x7D3F
+0xE5AA 0x7D35
+0xE5AB 0x7D46
+0xE5AC 0x7D73
+0xE5AD 0x7D56
+0xE5AE 0x7D4E
+0xE5AF 0x7D72
+0xE5B0 0x7D68
+0xE5B1 0x7D6E
+0xE5B2 0x7D4F
+0xE5B3 0x7D63
+0xE5B4 0x7D93
+0xE5B5 0x7D89
+0xE5B6 0x7D5B
+0xE5B7 0x7D8F
+0xE5B8 0x7D7D
+0xE5B9 0x7D9B
+0xE5BA 0x7DBA
+0xE5BB 0x7DAE
+0xE5BC 0x7DA3
+0xE5BD 0x7DB5
+0xE5BE 0x7DC7
+0xE5BF 0x7DBD
+0xE5C0 0x7DAB
+0xE5C1 0x7E3D
+0xE5C2 0x7DA2
+0xE5C3 0x7DAF
+0xE5C4 0x7DDC
+0xE5C5 0x7DB8
+0xE5C6 0x7D9F
+0xE5C7 0x7DB0
+0xE5C8 0x7DD8
+0xE5C9 0x7DDD
+0xE5CA 0x7DE4
+0xE5CB 0x7DDE
+0xE5CC 0x7DFB
+0xE5CD 0x7DF2
+0xE5CE 0x7DE1
+0xE5CF 0x7E05
+0xE5D0 0x7E0A
+0xE5D1 0x7E23
+0xE5D2 0x7E21
+0xE5D3 0x7E12
+0xE5D4 0x7E31
+0xE5D5 0x7E1F
+0xE5D6 0x7E09
+0xE5D7 0x7E0B
+0xE5D8 0x7E22
+0xE5D9 0x7E46
+0xE5DA 0x7E66
+0xE5DB 0x7E3B
+0xE5DC 0x7E35
+0xE5DD 0x7E39
+0xE5DE 0x7E43
+0xE5DF 0x7E37
+0xE5E0 0x7E32
+0xE5E1 0x7E3A
+0xE5E2 0x7E67
+0xE5E3 0x7E5D
+0xE5E4 0x7E56
+0xE5E5 0x7E5E
+0xE5E6 0x7E59
+0xE5E7 0x7E5A
+0xE5E8 0x7E79
+0xE5E9 0x7E6A
+0xE5EA 0x7E69
+0xE5EB 0x7E7C
+0xE5EC 0x7E7B
+0xE5ED 0x7E83
+0xE5EE 0x7DD5
+0xE5EF 0x7E7D
+0xE5F0 0x8FAE
+0xE5F1 0x7E7F
+0xE5F2 0x7E88
+0xE5F3 0x7E89
+0xE5F4 0x7E8C
+0xE5F5 0x7E92
+0xE5F6 0x7E90
+0xE5F7 0x7E93
+0xE5F8 0x7E94
+0xE5F9 0x7E96
+0xE5FA 0x7E8E
+0xE5FB 0x7E9B
+0xE5FC 0x7E9C
+0xE5FD 0x7F38
+0xE5FE 0x7F3A
+0xE6A1 0x7F45
+0xE6A2 0x7F4C
+0xE6A3 0x7F4D
+0xE6A4 0x7F4E
+0xE6A5 0x7F50
+0xE6A6 0x7F51
+0xE6A7 0x7F55
+0xE6A8 0x7F54
+0xE6A9 0x7F58
+0xE6AA 0x7F5F
+0xE6AB 0x7F60
+0xE6AC 0x7F68
+0xE6AD 0x7F69
+0xE6AE 0x7F67
+0xE6AF 0x7F78
+0xE6B0 0x7F82
+0xE6B1 0x7F86
+0xE6B2 0x7F83
+0xE6B3 0x7F88
+0xE6B4 0x7F87
+0xE6B5 0x7F8C
+0xE6B6 0x7F94
+0xE6B7 0x7F9E
+0xE6B8 0x7F9D
+0xE6B9 0x7F9A
+0xE6BA 0x7FA3
+0xE6BB 0x7FAF
+0xE6BC 0x7FB2
+0xE6BD 0x7FB9
+0xE6BE 0x7FAE
+0xE6BF 0x7FB6
+0xE6C0 0x7FB8
+0xE6C1 0x8B71
+0xE6C2 0x7FC5
+0xE6C3 0x7FC6
+0xE6C4 0x7FCA
+0xE6C5 0x7FD5
+0xE6C6 0x7FD4
+0xE6C7 0x7FE1
+0xE6C8 0x7FE6
+0xE6C9 0x7FE9
+0xE6CA 0x7FF3
+0xE6CB 0x7FF9
+0xE6CC 0x98DC
+0xE6CD 0x8006
+0xE6CE 0x8004
+0xE6CF 0x800B
+0xE6D0 0x8012
+0xE6D1 0x8018
+0xE6D2 0x8019
+0xE6D3 0x801C
+0xE6D4 0x8021
+0xE6D5 0x8028
+0xE6D6 0x803F
+0xE6D7 0x803B
+0xE6D8 0x804A
+0xE6D9 0x8046
+0xE6DA 0x8052
+0xE6DB 0x8058
+0xE6DC 0x805A
+0xE6DD 0x805F
+0xE6DE 0x8062
+0xE6DF 0x8068
+0xE6E0 0x8073
+0xE6E1 0x8072
+0xE6E2 0x8070
+0xE6E3 0x8076
+0xE6E4 0x8079
+0xE6E5 0x807D
+0xE6E6 0x807F
+0xE6E7 0x8084
+0xE6E8 0x8086
+0xE6E9 0x8085
+0xE6EA 0x809B
+0xE6EB 0x8093
+0xE6EC 0x809A
+0xE6ED 0x80AD
+0xE6EE 0x5190
+0xE6EF 0x80AC
+0xE6F0 0x80DB
+0xE6F1 0x80E5
+0xE6F2 0x80D9
+0xE6F3 0x80DD
+0xE6F4 0x80C4
+0xE6F5 0x80DA
+0xE6F6 0x80D6
+0xE6F7 0x8109
+0xE6F8 0x80EF
+0xE6F9 0x80F1
+0xE6FA 0x811B
+0xE6FB 0x8129
+0xE6FC 0x8123
+0xE6FD 0x812F
+0xE6FE 0x814B
+0xE7A1 0x968B
+0xE7A2 0x8146
+0xE7A3 0x813E
+0xE7A4 0x8153
+0xE7A5 0x8151
+0xE7A6 0x80FC
+0xE7A7 0x8171
+0xE7A8 0x816E
+0xE7A9 0x8165
+0xE7AA 0x8166
+0xE7AB 0x8174
+0xE7AC 0x8183
+0xE7AD 0x8188
+0xE7AE 0x818A
+0xE7AF 0x8180
+0xE7B0 0x8182
+0xE7B1 0x81A0
+0xE7B2 0x8195
+0xE7B3 0x81A4
+0xE7B4 0x81A3
+0xE7B5 0x815F
+0xE7B6 0x8193
+0xE7B7 0x81A9
+0xE7B8 0x81B0
+0xE7B9 0x81B5
+0xE7BA 0x81BE
+0xE7BB 0x81B8
+0xE7BC 0x81BD
+0xE7BD 0x81C0
+0xE7BE 0x81C2
+0xE7BF 0x81BA
+0xE7C0 0x81C9
+0xE7C1 0x81CD
+0xE7C2 0x81D1
+0xE7C3 0x81D9
+0xE7C4 0x81D8
+0xE7C5 0x81C8
+0xE7C6 0x81DA
+0xE7C7 0x81DF
+0xE7C8 0x81E0
+0xE7C9 0x81E7
+0xE7CA 0x81FA
+0xE7CB 0x81FB
+0xE7CC 0x81FE
+0xE7CD 0x8201
+0xE7CE 0x8202
+0xE7CF 0x8205
+0xE7D0 0x8207
+0xE7D1 0x820A
+0xE7D2 0x820D
+0xE7D3 0x8210
+0xE7D4 0x8216
+0xE7D5 0x8229
+0xE7D6 0x822B
+0xE7D7 0x8238
+0xE7D8 0x8233
+0xE7D9 0x8240
+0xE7DA 0x8259
+0xE7DB 0x8258
+0xE7DC 0x825D
+0xE7DD 0x825A
+0xE7DE 0x825F
+0xE7DF 0x8264
+0xE7E0 0x8262
+0xE7E1 0x8268
+0xE7E2 0x826A
+0xE7E3 0x826B
+0xE7E4 0x822E
+0xE7E5 0x8271
+0xE7E6 0x8277
+0xE7E7 0x8278
+0xE7E8 0x827E
+0xE7E9 0x828D
+0xE7EA 0x8292
+0xE7EB 0x82AB
+0xE7EC 0x829F
+0xE7ED 0x82BB
+0xE7EE 0x82AC
+0xE7EF 0x82E1
+0xE7F0 0x82E3
+0xE7F1 0x82DF
+0xE7F2 0x82D2
+0xE7F3 0x82F4
+0xE7F4 0x82F3
+0xE7F5 0x82FA
+0xE7F6 0x8393
+0xE7F7 0x8303
+0xE7F8 0x82FB
+0xE7F9 0x82F9
+0xE7FA 0x82DE
+0xE7FB 0x8306
+0xE7FC 0x82DC
+0xE7FD 0x8309
+0xE7FE 0x82D9
+0xE8A1 0x8335
+0xE8A2 0x8334
+0xE8A3 0x8316
+0xE8A4 0x8332
+0xE8A5 0x8331
+0xE8A6 0x8340
+0xE8A7 0x8339
+0xE8A8 0x8350
+0xE8A9 0x8345
+0xE8AA 0x832F
+0xE8AB 0x832B
+0xE8AC 0x8317
+0xE8AD 0x8318
+0xE8AE 0x8385
+0xE8AF 0x839A
+0xE8B0 0x83AA
+0xE8B1 0x839F
+0xE8B2 0x83A2
+0xE8B3 0x8396
+0xE8B4 0x8323
+0xE8B5 0x838E
+0xE8B6 0x8387
+0xE8B7 0x838A
+0xE8B8 0x837C
+0xE8B9 0x83B5
+0xE8BA 0x8373
+0xE8BB 0x8375
+0xE8BC 0x83A0
+0xE8BD 0x8389
+0xE8BE 0x83A8
+0xE8BF 0x83F4
+0xE8C0 0x8413
+0xE8C1 0x83EB
+0xE8C2 0x83CE
+0xE8C3 0x83FD
+0xE8C4 0x8403
+0xE8C5 0x83D8
+0xE8C6 0x840B
+0xE8C7 0x83C1
+0xE8C8 0x83F7
+0xE8C9 0x8407
+0xE8CA 0x83E0
+0xE8CB 0x83F2
+0xE8CC 0x840D
+0xE8CD 0x8422
+0xE8CE 0x8420
+0xE8CF 0x83BD
+0xE8D0 0x8438
+0xE8D1 0x8506
+0xE8D2 0x83FB
+0xE8D3 0x846D
+0xE8D4 0x842A
+0xE8D5 0x843C
+0xE8D6 0x855A
+0xE8D7 0x8484
+0xE8D8 0x8477
+0xE8D9 0x846B
+0xE8DA 0x84AD
+0xE8DB 0x846E
+0xE8DC 0x8482
+0xE8DD 0x8469
+0xE8DE 0x8446
+0xE8DF 0x842C
+0xE8E0 0x846F
+0xE8E1 0x8479
+0xE8E2 0x8435
+0xE8E3 0x84CA
+0xE8E4 0x8462
+0xE8E5 0x84B9
+0xE8E6 0x84BF
+0xE8E7 0x849F
+0xE8E8 0x84D9
+0xE8E9 0x84CD
+0xE8EA 0x84BB
+0xE8EB 0x84DA
+0xE8EC 0x84D0
+0xE8ED 0x84C1
+0xE8EE 0x84C6
+0xE8EF 0x84D6
+0xE8F0 0x84A1
+0xE8F1 0x8521
+0xE8F2 0x84FF
+0xE8F3 0x84F4
+0xE8F4 0x8517
+0xE8F5 0x8518
+0xE8F6 0x852C
+0xE8F7 0x851F
+0xE8F8 0x8515
+0xE8F9 0x8514
+0xE8FA 0x84FC
+0xE8FB 0x8540
+0xE8FC 0x8563
+0xE8FD 0x8558
+0xE8FE 0x8548
+0xE9A1 0x8541
+0xE9A2 0x8602
+0xE9A3 0x854B
+0xE9A4 0x8555
+0xE9A5 0x8580
+0xE9A6 0x85A4
+0xE9A7 0x8588
+0xE9A8 0x8591
+0xE9A9 0x858A
+0xE9AA 0x85A8
+0xE9AB 0x856D
+0xE9AC 0x8594
+0xE9AD 0x859B
+0xE9AE 0x85EA
+0xE9AF 0x8587
+0xE9B0 0x859C
+0xE9B1 0x8577
+0xE9B2 0x857E
+0xE9B3 0x8590
+0xE9B4 0x85C9
+0xE9B5 0x85BA
+0xE9B6 0x85CF
+0xE9B7 0x85B9
+0xE9B8 0x85D0
+0xE9B9 0x85D5
+0xE9BA 0x85DD
+0xE9BB 0x85E5
+0xE9BC 0x85DC
+0xE9BD 0x85F9
+0xE9BE 0x860A
+0xE9BF 0x8613
+0xE9C0 0x860B
+0xE9C1 0x85FE
+0xE9C2 0x85FA
+0xE9C3 0x8606
+0xE9C4 0x8622
+0xE9C5 0x861A
+0xE9C6 0x8630
+0xE9C7 0x863F
+0xE9C8 0x864D
+0xE9C9 0x4E55
+0xE9CA 0x8654
+0xE9CB 0x865F
+0xE9CC 0x8667
+0xE9CD 0x8671
+0xE9CE 0x8693
+0xE9CF 0x86A3
+0xE9D0 0x86A9
+0xE9D1 0x86AA
+0xE9D2 0x868B
+0xE9D3 0x868C
+0xE9D4 0x86B6
+0xE9D5 0x86AF
+0xE9D6 0x86C4
+0xE9D7 0x86C6
+0xE9D8 0x86B0
+0xE9D9 0x86C9
+0xE9DA 0x8823
+0xE9DB 0x86AB
+0xE9DC 0x86D4
+0xE9DD 0x86DE
+0xE9DE 0x86E9
+0xE9DF 0x86EC
+0xE9E0 0x86DF
+0xE9E1 0x86DB
+0xE9E2 0x86EF
+0xE9E3 0x8712
+0xE9E4 0x8706
+0xE9E5 0x8708
+0xE9E6 0x8700
+0xE9E7 0x8703
+0xE9E8 0x86FB
+0xE9E9 0x8711
+0xE9EA 0x8709
+0xE9EB 0x870D
+0xE9EC 0x86F9
+0xE9ED 0x870A
+0xE9EE 0x8734
+0xE9EF 0x873F
+0xE9F0 0x8737
+0xE9F1 0x873B
+0xE9F2 0x8725
+0xE9F3 0x8729
+0xE9F4 0x871A
+0xE9F5 0x8760
+0xE9F6 0x875F
+0xE9F7 0x8778
+0xE9F8 0x874C
+0xE9F9 0x874E
+0xE9FA 0x8774
+0xE9FB 0x8757
+0xE9FC 0x8768
+0xE9FD 0x876E
+0xE9FE 0x8759
+0xEAA1 0x8753
+0xEAA2 0x8763
+0xEAA3 0x876A
+0xEAA4 0x8805
+0xEAA5 0x87A2
+0xEAA6 0x879F
+0xEAA7 0x8782
+0xEAA8 0x87AF
+0xEAA9 0x87CB
+0xEAAA 0x87BD
+0xEAAB 0x87C0
+0xEAAC 0x87D0
+0xEAAD 0x96D6
+0xEAAE 0x87AB
+0xEAAF 0x87C4
+0xEAB0 0x87B3
+0xEAB1 0x87C7
+0xEAB2 0x87C6
+0xEAB3 0x87BB
+0xEAB4 0x87EF
+0xEAB5 0x87F2
+0xEAB6 0x87E0
+0xEAB7 0x880F
+0xEAB8 0x880D
+0xEAB9 0x87FE
+0xEABA 0x87F6
+0xEABB 0x87F7
+0xEABC 0x880E
+0xEABD 0x87D2
+0xEABE 0x8811
+0xEABF 0x8816
+0xEAC0 0x8815
+0xEAC1 0x8822
+0xEAC2 0x8821
+0xEAC3 0x8831
+0xEAC4 0x8836
+0xEAC5 0x8839
+0xEAC6 0x8827
+0xEAC7 0x883B
+0xEAC8 0x8844
+0xEAC9 0x8842
+0xEACA 0x8852
+0xEACB 0x8859
+0xEACC 0x885E
+0xEACD 0x8862
+0xEACE 0x886B
+0xEACF 0x8881
+0xEAD0 0x887E
+0xEAD1 0x889E
+0xEAD2 0x8875
+0xEAD3 0x887D
+0xEAD4 0x88B5
+0xEAD5 0x8872
+0xEAD6 0x8882
+0xEAD7 0x8897
+0xEAD8 0x8892
+0xEAD9 0x88AE
+0xEADA 0x8899
+0xEADB 0x88A2
+0xEADC 0x888D
+0xEADD 0x88A4
+0xEADE 0x88B0
+0xEADF 0x88BF
+0xEAE0 0x88B1
+0xEAE1 0x88C3
+0xEAE2 0x88C4
+0xEAE3 0x88D4
+0xEAE4 0x88D8
+0xEAE5 0x88D9
+0xEAE6 0x88DD
+0xEAE7 0x88F9
+0xEAE8 0x8902
+0xEAE9 0x88FC
+0xEAEA 0x88F4
+0xEAEB 0x88E8
+0xEAEC 0x88F2
+0xEAED 0x8904
+0xEAEE 0x890C
+0xEAEF 0x890A
+0xEAF0 0x8913
+0xEAF1 0x8943
+0xEAF2 0x891E
+0xEAF3 0x8925
+0xEAF4 0x892A
+0xEAF5 0x892B
+0xEAF6 0x8941
+0xEAF7 0x8944
+0xEAF8 0x893B
+0xEAF9 0x8936
+0xEAFA 0x8938
+0xEAFB 0x894C
+0xEAFC 0x891D
+0xEAFD 0x8960
+0xEAFE 0x895E
+0xEBA1 0x8966
+0xEBA2 0x8964
+0xEBA3 0x896D
+0xEBA4 0x896A
+0xEBA5 0x896F
+0xEBA6 0x8974
+0xEBA7 0x8977
+0xEBA8 0x897E
+0xEBA9 0x8983
+0xEBAA 0x8988
+0xEBAB 0x898A
+0xEBAC 0x8993
+0xEBAD 0x8998
+0xEBAE 0x89A1
+0xEBAF 0x89A9
+0xEBB0 0x89A6
+0xEBB1 0x89AC
+0xEBB2 0x89AF
+0xEBB3 0x89B2
+0xEBB4 0x89BA
+0xEBB5 0x89BD
+0xEBB6 0x89BF
+0xEBB7 0x89C0
+0xEBB8 0x89DA
+0xEBB9 0x89DC
+0xEBBA 0x89DD
+0xEBBB 0x89E7
+0xEBBC 0x89F4
+0xEBBD 0x89F8
+0xEBBE 0x8A03
+0xEBBF 0x8A16
+0xEBC0 0x8A10
+0xEBC1 0x8A0C
+0xEBC2 0x8A1B
+0xEBC3 0x8A1D
+0xEBC4 0x8A25
+0xEBC5 0x8A36
+0xEBC6 0x8A41
+0xEBC7 0x8A5B
+0xEBC8 0x8A52
+0xEBC9 0x8A46
+0xEBCA 0x8A48
+0xEBCB 0x8A7C
+0xEBCC 0x8A6D
+0xEBCD 0x8A6C
+0xEBCE 0x8A62
+0xEBCF 0x8A85
+0xEBD0 0x8A82
+0xEBD1 0x8A84
+0xEBD2 0x8AA8
+0xEBD3 0x8AA1
+0xEBD4 0x8A91
+0xEBD5 0x8AA5
+0xEBD6 0x8AA6
+0xEBD7 0x8A9A
+0xEBD8 0x8AA3
+0xEBD9 0x8AC4
+0xEBDA 0x8ACD
+0xEBDB 0x8AC2
+0xEBDC 0x8ADA
+0xEBDD 0x8AEB
+0xEBDE 0x8AF3
+0xEBDF 0x8AE7
+0xEBE0 0x8AE4
+0xEBE1 0x8AF1
+0xEBE2 0x8B14
+0xEBE3 0x8AE0
+0xEBE4 0x8AE2
+0xEBE5 0x8AF7
+0xEBE6 0x8ADE
+0xEBE7 0x8ADB
+0xEBE8 0x8B0C
+0xEBE9 0x8B07
+0xEBEA 0x8B1A
+0xEBEB 0x8AE1
+0xEBEC 0x8B16
+0xEBED 0x8B10
+0xEBEE 0x8B17
+0xEBEF 0x8B20
+0xEBF0 0x8B33
+0xEBF1 0x97AB
+0xEBF2 0x8B26
+0xEBF3 0x8B2B
+0xEBF4 0x8B3E
+0xEBF5 0x8B28
+0xEBF6 0x8B41
+0xEBF7 0x8B4C
+0xEBF8 0x8B4F
+0xEBF9 0x8B4E
+0xEBFA 0x8B49
+0xEBFB 0x8B56
+0xEBFC 0x8B5B
+0xEBFD 0x8B5A
+0xEBFE 0x8B6B
+0xECA1 0x8B5F
+0xECA2 0x8B6C
+0xECA3 0x8B6F
+0xECA4 0x8B74
+0xECA5 0x8B7D
+0xECA6 0x8B80
+0xECA7 0x8B8C
+0xECA8 0x8B8E
+0xECA9 0x8B92
+0xECAA 0x8B93
+0xECAB 0x8B96
+0xECAC 0x8B99
+0xECAD 0x8B9A
+0xECAE 0x8C3A
+0xECAF 0x8C41
+0xECB0 0x8C3F
+0xECB1 0x8C48
+0xECB2 0x8C4C
+0xECB3 0x8C4E
+0xECB4 0x8C50
+0xECB5 0x8C55
+0xECB6 0x8C62
+0xECB7 0x8C6C
+0xECB8 0x8C78
+0xECB9 0x8C7A
+0xECBA 0x8C82
+0xECBB 0x8C89
+0xECBC 0x8C85
+0xECBD 0x8C8A
+0xECBE 0x8C8D
+0xECBF 0x8C8E
+0xECC0 0x8C94
+0xECC1 0x8C7C
+0xECC2 0x8C98
+0xECC3 0x621D
+0xECC4 0x8CAD
+0xECC5 0x8CAA
+0xECC6 0x8CBD
+0xECC7 0x8CB2
+0xECC8 0x8CB3
+0xECC9 0x8CAE
+0xECCA 0x8CB6
+0xECCB 0x8CC8
+0xECCC 0x8CC1
+0xECCD 0x8CE4
+0xECCE 0x8CE3
+0xECCF 0x8CDA
+0xECD0 0x8CFD
+0xECD1 0x8CFA
+0xECD2 0x8CFB
+0xECD3 0x8D04
+0xECD4 0x8D05
+0xECD5 0x8D0A
+0xECD6 0x8D07
+0xECD7 0x8D0F
+0xECD8 0x8D0D
+0xECD9 0x8D10
+0xECDA 0x9F4E
+0xECDB 0x8D13
+0xECDC 0x8CCD
+0xECDD 0x8D14
+0xECDE 0x8D16
+0xECDF 0x8D67
+0xECE0 0x8D6D
+0xECE1 0x8D71
+0xECE2 0x8D73
+0xECE3 0x8D81
+0xECE4 0x8D99
+0xECE5 0x8DC2
+0xECE6 0x8DBE
+0xECE7 0x8DBA
+0xECE8 0x8DCF
+0xECE9 0x8DDA
+0xECEA 0x8DD6
+0xECEB 0x8DCC
+0xECEC 0x8DDB
+0xECED 0x8DCB
+0xECEE 0x8DEA
+0xECEF 0x8DEB
+0xECF0 0x8DDF
+0xECF1 0x8DE3
+0xECF2 0x8DFC
+0xECF3 0x8E08
+0xECF4 0x8E09
+0xECF5 0x8DFF
+0xECF6 0x8E1D
+0xECF7 0x8E1E
+0xECF8 0x8E10
+0xECF9 0x8E1F
+0xECFA 0x8E42
+0xECFB 0x8E35
+0xECFC 0x8E30
+0xECFD 0x8E34
+0xECFE 0x8E4A
+0xEDA1 0x8E47
+0xEDA2 0x8E49
+0xEDA3 0x8E4C
+0xEDA4 0x8E50
+0xEDA5 0x8E48
+0xEDA6 0x8E59
+0xEDA7 0x8E64
+0xEDA8 0x8E60
+0xEDA9 0x8E2A
+0xEDAA 0x8E63
+0xEDAB 0x8E55
+0xEDAC 0x8E76
+0xEDAD 0x8E72
+0xEDAE 0x8E7C
+0xEDAF 0x8E81
+0xEDB0 0x8E87
+0xEDB1 0x8E85
+0xEDB2 0x8E84
+0xEDB3 0x8E8B
+0xEDB4 0x8E8A
+0xEDB5 0x8E93
+0xEDB6 0x8E91
+0xEDB7 0x8E94
+0xEDB8 0x8E99
+0xEDB9 0x8EAA
+0xEDBA 0x8EA1
+0xEDBB 0x8EAC
+0xEDBC 0x8EB0
+0xEDBD 0x8EC6
+0xEDBE 0x8EB1
+0xEDBF 0x8EBE
+0xEDC0 0x8EC5
+0xEDC1 0x8EC8
+0xEDC2 0x8ECB
+0xEDC3 0x8EDB
+0xEDC4 0x8EE3
+0xEDC5 0x8EFC
+0xEDC6 0x8EFB
+0xEDC7 0x8EEB
+0xEDC8 0x8EFE
+0xEDC9 0x8F0A
+0xEDCA 0x8F05
+0xEDCB 0x8F15
+0xEDCC 0x8F12
+0xEDCD 0x8F19
+0xEDCE 0x8F13
+0xEDCF 0x8F1C
+0xEDD0 0x8F1F
+0xEDD1 0x8F1B
+0xEDD2 0x8F0C
+0xEDD3 0x8F26
+0xEDD4 0x8F33
+0xEDD5 0x8F3B
+0xEDD6 0x8F39
+0xEDD7 0x8F45
+0xEDD8 0x8F42
+0xEDD9 0x8F3E
+0xEDDA 0x8F4C
+0xEDDB 0x8F49
+0xEDDC 0x8F46
+0xEDDD 0x8F4E
+0xEDDE 0x8F57
+0xEDDF 0x8F5C
+0xEDE0 0x8F62
+0xEDE1 0x8F63
+0xEDE2 0x8F64
+0xEDE3 0x8F9C
+0xEDE4 0x8F9F
+0xEDE5 0x8FA3
+0xEDE6 0x8FAD
+0xEDE7 0x8FAF
+0xEDE8 0x8FB7
+0xEDE9 0x8FDA
+0xEDEA 0x8FE5
+0xEDEB 0x8FE2
+0xEDEC 0x8FEA
+0xEDED 0x8FEF
+0xEDEE 0x9087
+0xEDEF 0x8FF4
+0xEDF0 0x9005
+0xEDF1 0x8FF9
+0xEDF2 0x8FFA
+0xEDF3 0x9011
+0xEDF4 0x9015
+0xEDF5 0x9021
+0xEDF6 0x900D
+0xEDF7 0x901E
+0xEDF8 0x9016
+0xEDF9 0x900B
+0xEDFA 0x9027
+0xEDFB 0x9036
+0xEDFC 0x9035
+0xEDFD 0x9039
+0xEDFE 0x8FF8
+0xEEA1 0x904F
+0xEEA2 0x9050
+0xEEA3 0x9051
+0xEEA4 0x9052
+0xEEA5 0x900E
+0xEEA6 0x9049
+0xEEA7 0x903E
+0xEEA8 0x9056
+0xEEA9 0x9058
+0xEEAA 0x905E
+0xEEAB 0x9068
+0xEEAC 0x906F
+0xEEAD 0x9076
+0xEEAE 0x96A8
+0xEEAF 0x9072
+0xEEB0 0x9082
+0xEEB1 0x907D
+0xEEB2 0x9081
+0xEEB3 0x9080
+0xEEB4 0x908A
+0xEEB5 0x9089
+0xEEB6 0x908F
+0xEEB7 0x90A8
+0xEEB8 0x90AF
+0xEEB9 0x90B1
+0xEEBA 0x90B5
+0xEEBB 0x90E2
+0xEEBC 0x90E4
+0xEEBD 0x6248
+0xEEBE 0x90DB
+0xEEBF 0x9102
+0xEEC0 0x9112
+0xEEC1 0x9119
+0xEEC2 0x9132
+0xEEC3 0x9130
+0xEEC4 0x914A
+0xEEC5 0x9156
+0xEEC6 0x9158
+0xEEC7 0x9163
+0xEEC8 0x9165
+0xEEC9 0x9169
+0xEECA 0x9173
+0xEECB 0x9172
+0xEECC 0x918B
+0xEECD 0x9189
+0xEECE 0x9182
+0xEECF 0x91A2
+0xEED0 0x91AB
+0xEED1 0x91AF
+0xEED2 0x91AA
+0xEED3 0x91B5
+0xEED4 0x91B4
+0xEED5 0x91BA
+0xEED6 0x91C0
+0xEED7 0x91C1
+0xEED8 0x91C9
+0xEED9 0x91CB
+0xEEDA 0x91D0
+0xEEDB 0x91D6
+0xEEDC 0x91DF
+0xEEDD 0x91E1
+0xEEDE 0x91DB
+0xEEDF 0x91FC
+0xEEE0 0x91F5
+0xEEE1 0x91F6
+0xEEE2 0x921E
+0xEEE3 0x91FF
+0xEEE4 0x9214
+0xEEE5 0x922C
+0xEEE6 0x9215
+0xEEE7 0x9211
+0xEEE8 0x925E
+0xEEE9 0x9257
+0xEEEA 0x9245
+0xEEEB 0x9249
+0xEEEC 0x9264
+0xEEED 0x9248
+0xEEEE 0x9295
+0xEEEF 0x923F
+0xEEF0 0x924B
+0xEEF1 0x9250
+0xEEF2 0x929C
+0xEEF3 0x9296
+0xEEF4 0x9293
+0xEEF5 0x929B
+0xEEF6 0x925A
+0xEEF7 0x92CF
+0xEEF8 0x92B9
+0xEEF9 0x92B7
+0xEEFA 0x92E9
+0xEEFB 0x930F
+0xEEFC 0x92FA
+0xEEFD 0x9344
+0xEEFE 0x932E
+0xEFA1 0x9319
+0xEFA2 0x9322
+0xEFA3 0x931A
+0xEFA4 0x9323
+0xEFA5 0x933A
+0xEFA6 0x9335
+0xEFA7 0x933B
+0xEFA8 0x935C
+0xEFA9 0x9360
+0xEFAA 0x937C
+0xEFAB 0x936E
+0xEFAC 0x9356
+0xEFAD 0x93B0
+0xEFAE 0x93AC
+0xEFAF 0x93AD
+0xEFB0 0x9394
+0xEFB1 0x93B9
+0xEFB2 0x93D6
+0xEFB3 0x93D7
+0xEFB4 0x93E8
+0xEFB5 0x93E5
+0xEFB6 0x93D8
+0xEFB7 0x93C3
+0xEFB8 0x93DD
+0xEFB9 0x93D0
+0xEFBA 0x93C8
+0xEFBB 0x93E4
+0xEFBC 0x941A
+0xEFBD 0x9414
+0xEFBE 0x9413
+0xEFBF 0x9403
+0xEFC0 0x9407
+0xEFC1 0x9410
+0xEFC2 0x9436
+0xEFC3 0x942B
+0xEFC4 0x9435
+0xEFC5 0x9421
+0xEFC6 0x943A
+0xEFC7 0x9441
+0xEFC8 0x9452
+0xEFC9 0x9444
+0xEFCA 0x945B
+0xEFCB 0x9460
+0xEFCC 0x9462
+0xEFCD 0x945E
+0xEFCE 0x946A
+0xEFCF 0x9229
+0xEFD0 0x9470
+0xEFD1 0x9475
+0xEFD2 0x9477
+0xEFD3 0x947D
+0xEFD4 0x945A
+0xEFD5 0x947C
+0xEFD6 0x947E
+0xEFD7 0x9481
+0xEFD8 0x947F
+0xEFD9 0x9582
+0xEFDA 0x9587
+0xEFDB 0x958A
+0xEFDC 0x9594
+0xEFDD 0x9596
+0xEFDE 0x9598
+0xEFDF 0x9599
+0xEFE0 0x95A0
+0xEFE1 0x95A8
+0xEFE2 0x95A7
+0xEFE3 0x95AD
+0xEFE4 0x95BC
+0xEFE5 0x95BB
+0xEFE6 0x95B9
+0xEFE7 0x95BE
+0xEFE8 0x95CA
+0xEFE9 0x6FF6
+0xEFEA 0x95C3
+0xEFEB 0x95CD
+0xEFEC 0x95CC
+0xEFED 0x95D5
+0xEFEE 0x95D4
+0xEFEF 0x95D6
+0xEFF0 0x95DC
+0xEFF1 0x95E1
+0xEFF2 0x95E5
+0xEFF3 0x95E2
+0xEFF4 0x9621
+0xEFF5 0x9628
+0xEFF6 0x962E
+0xEFF7 0x962F
+0xEFF8 0x9642
+0xEFF9 0x964C
+0xEFFA 0x964F
+0xEFFB 0x964B
+0xEFFC 0x9677
+0xEFFD 0x965C
+0xEFFE 0x965E
+0xF0A1 0x965D
+0xF0A2 0x965F
+0xF0A3 0x9666
+0xF0A4 0x9672
+0xF0A5 0x966C
+0xF0A6 0x968D
+0xF0A7 0x9698
+0xF0A8 0x9695
+0xF0A9 0x9697
+0xF0AA 0x96AA
+0xF0AB 0x96A7
+0xF0AC 0x96B1
+0xF0AD 0x96B2
+0xF0AE 0x96B0
+0xF0AF 0x96B4
+0xF0B0 0x96B6
+0xF0B1 0x96B8
+0xF0B2 0x96B9
+0xF0B3 0x96CE
+0xF0B4 0x96CB
+0xF0B5 0x96C9
+0xF0B6 0x96CD
+0xF0B7 0x894D
+0xF0B8 0x96DC
+0xF0B9 0x970D
+0xF0BA 0x96D5
+0xF0BB 0x96F9
+0xF0BC 0x9704
+0xF0BD 0x9706
+0xF0BE 0x9708
+0xF0BF 0x9713
+0xF0C0 0x970E
+0xF0C1 0x9711
+0xF0C2 0x970F
+0xF0C3 0x9716
+0xF0C4 0x9719
+0xF0C5 0x9724
+0xF0C6 0x972A
+0xF0C7 0x9730
+0xF0C8 0x9739
+0xF0C9 0x973D
+0xF0CA 0x973E
+0xF0CB 0x9744
+0xF0CC 0x9746
+0xF0CD 0x9748
+0xF0CE 0x9742
+0xF0CF 0x9749
+0xF0D0 0x975C
+0xF0D1 0x9760
+0xF0D2 0x9764
+0xF0D3 0x9766
+0xF0D4 0x9768
+0xF0D5 0x52D2
+0xF0D6 0x976B
+0xF0D7 0x9771
+0xF0D8 0x9779
+0xF0D9 0x9785
+0xF0DA 0x977C
+0xF0DB 0x9781
+0xF0DC 0x977A
+0xF0DD 0x9786
+0xF0DE 0x978B
+0xF0DF 0x978F
+0xF0E0 0x9790
+0xF0E1 0x979C
+0xF0E2 0x97A8
+0xF0E3 0x97A6
+0xF0E4 0x97A3
+0xF0E5 0x97B3
+0xF0E6 0x97B4
+0xF0E7 0x97C3
+0xF0E8 0x97C6
+0xF0E9 0x97C8
+0xF0EA 0x97CB
+0xF0EB 0x97DC
+0xF0EC 0x97ED
+0xF0ED 0x9F4F
+0xF0EE 0x97F2
+0xF0EF 0x7ADF
+0xF0F0 0x97F6
+0xF0F1 0x97F5
+0xF0F2 0x980F
+0xF0F3 0x980C
+0xF0F4 0x9838
+0xF0F5 0x9824
+0xF0F6 0x9821
+0xF0F7 0x9837
+0xF0F8 0x983D
+0xF0F9 0x9846
+0xF0FA 0x984F
+0xF0FB 0x984B
+0xF0FC 0x986B
+0xF0FD 0x986F
+0xF0FE 0x9870
+0xF1A1 0x9871
+0xF1A2 0x9874
+0xF1A3 0x9873
+0xF1A4 0x98AA
+0xF1A5 0x98AF
+0xF1A6 0x98B1
+0xF1A7 0x98B6
+0xF1A8 0x98C4
+0xF1A9 0x98C3
+0xF1AA 0x98C6
+0xF1AB 0x98E9
+0xF1AC 0x98EB
+0xF1AD 0x9903
+0xF1AE 0x9909
+0xF1AF 0x9912
+0xF1B0 0x9914
+0xF1B1 0x9918
+0xF1B2 0x9921
+0xF1B3 0x991D
+0xF1B4 0x991E
+0xF1B5 0x9924
+0xF1B6 0x9920
+0xF1B7 0x992C
+0xF1B8 0x992E
+0xF1B9 0x993D
+0xF1BA 0x993E
+0xF1BB 0x9942
+0xF1BC 0x9949
+0xF1BD 0x9945
+0xF1BE 0x9950
+0xF1BF 0x994B
+0xF1C0 0x9951
+0xF1C1 0x9952
+0xF1C2 0x994C
+0xF1C3 0x9955
+0xF1C4 0x9997
+0xF1C5 0x9998
+0xF1C6 0x99A5
+0xF1C7 0x99AD
+0xF1C8 0x99AE
+0xF1C9 0x99BC
+0xF1CA 0x99DF
+0xF1CB 0x99DB
+0xF1CC 0x99DD
+0xF1CD 0x99D8
+0xF1CE 0x99D1
+0xF1CF 0x99ED
+0xF1D0 0x99EE
+0xF1D1 0x99F1
+0xF1D2 0x99F2
+0xF1D3 0x99FB
+0xF1D4 0x99F8
+0xF1D5 0x9A01
+0xF1D6 0x9A0F
+0xF1D7 0x9A05
+0xF1D8 0x99E2
+0xF1D9 0x9A19
+0xF1DA 0x9A2B
+0xF1DB 0x9A37
+0xF1DC 0x9A45
+0xF1DD 0x9A42
+0xF1DE 0x9A40
+0xF1DF 0x9A43
+0xF1E0 0x9A3E
+0xF1E1 0x9A55
+0xF1E2 0x9A4D
+0xF1E3 0x9A5B
+0xF1E4 0x9A57
+0xF1E5 0x9A5F
+0xF1E6 0x9A62
+0xF1E7 0x9A65
+0xF1E8 0x9A64
+0xF1E9 0x9A69
+0xF1EA 0x9A6B
+0xF1EB 0x9A6A
+0xF1EC 0x9AAD
+0xF1ED 0x9AB0
+0xF1EE 0x9ABC
+0xF1EF 0x9AC0
+0xF1F0 0x9ACF
+0xF1F1 0x9AD1
+0xF1F2 0x9AD3
+0xF1F3 0x9AD4
+0xF1F4 0x9ADE
+0xF1F5 0x9ADF
+0xF1F6 0x9AE2
+0xF1F7 0x9AE3
+0xF1F8 0x9AE6
+0xF1F9 0x9AEF
+0xF1FA 0x9AEB
+0xF1FB 0x9AEE
+0xF1FC 0x9AF4
+0xF1FD 0x9AF1
+0xF1FE 0x9AF7
+0xF2A1 0x9AFB
+0xF2A2 0x9B06
+0xF2A3 0x9B18
+0xF2A4 0x9B1A
+0xF2A5 0x9B1F
+0xF2A6 0x9B22
+0xF2A7 0x9B23
+0xF2A8 0x9B25
+0xF2A9 0x9B27
+0xF2AA 0x9B28
+0xF2AB 0x9B29
+0xF2AC 0x9B2A
+0xF2AD 0x9B2E
+0xF2AE 0x9B2F
+0xF2AF 0x9B32
+0xF2B0 0x9B44
+0xF2B1 0x9B43
+0xF2B2 0x9B4F
+0xF2B3 0x9B4D
+0xF2B4 0x9B4E
+0xF2B5 0x9B51
+0xF2B6 0x9B58
+0xF2B7 0x9B74
+0xF2B8 0x9B93
+0xF2B9 0x9B83
+0xF2BA 0x9B91
+0xF2BB 0x9B96
+0xF2BC 0x9B97
+0xF2BD 0x9B9F
+0xF2BE 0x9BA0
+0xF2BF 0x9BA8
+0xF2C0 0x9BB4
+0xF2C1 0x9BC0
+0xF2C2 0x9BCA
+0xF2C3 0x9BB9
+0xF2C4 0x9BC6
+0xF2C5 0x9BCF
+0xF2C6 0x9BD1
+0xF2C7 0x9BD2
+0xF2C8 0x9BE3
+0xF2C9 0x9BE2
+0xF2CA 0x9BE4
+0xF2CB 0x9BD4
+0xF2CC 0x9BE1
+0xF2CD 0x9C3A
+0xF2CE 0x9BF2
+0xF2CF 0x9BF1
+0xF2D0 0x9BF0
+0xF2D1 0x9C15
+0xF2D2 0x9C14
+0xF2D3 0x9C09
+0xF2D4 0x9C13
+0xF2D5 0x9C0C
+0xF2D6 0x9C06
+0xF2D7 0x9C08
+0xF2D8 0x9C12
+0xF2D9 0x9C0A
+0xF2DA 0x9C04
+0xF2DB 0x9C2E
+0xF2DC 0x9C1B
+0xF2DD 0x9C25
+0xF2DE 0x9C24
+0xF2DF 0x9C21
+0xF2E0 0x9C30
+0xF2E1 0x9C47
+0xF2E2 0x9C32
+0xF2E3 0x9C46
+0xF2E4 0x9C3E
+0xF2E5 0x9C5A
+0xF2E6 0x9C60
+0xF2E7 0x9C67
+0xF2E8 0x9C76
+0xF2E9 0x9C78
+0xF2EA 0x9CE7
+0xF2EB 0x9CEC
+0xF2EC 0x9CF0
+0xF2ED 0x9D09
+0xF2EE 0x9D08
+0xF2EF 0x9CEB
+0xF2F0 0x9D03
+0xF2F1 0x9D06
+0xF2F2 0x9D2A
+0xF2F3 0x9D26
+0xF2F4 0x9DAF
+0xF2F5 0x9D23
+0xF2F6 0x9D1F
+0xF2F7 0x9D44
+0xF2F8 0x9D15
+0xF2F9 0x9D12
+0xF2FA 0x9D41
+0xF2FB 0x9D3F
+0xF2FC 0x9D3E
+0xF2FD 0x9D46
+0xF2FE 0x9D48
+0xF3A1 0x9D5D
+0xF3A2 0x9D5E
+0xF3A3 0x9D64
+0xF3A4 0x9D51
+0xF3A5 0x9D50
+0xF3A6 0x9D59
+0xF3A7 0x9D72
+0xF3A8 0x9D89
+0xF3A9 0x9D87
+0xF3AA 0x9DAB
+0xF3AB 0x9D6F
+0xF3AC 0x9D7A
+0xF3AD 0x9D9A
+0xF3AE 0x9DA4
+0xF3AF 0x9DA9
+0xF3B0 0x9DB2
+0xF3B1 0x9DC4
+0xF3B2 0x9DC1
+0xF3B3 0x9DBB
+0xF3B4 0x9DB8
+0xF3B5 0x9DBA
+0xF3B6 0x9DC6
+0xF3B7 0x9DCF
+0xF3B8 0x9DC2
+0xF3B9 0x9DD9
+0xF3BA 0x9DD3
+0xF3BB 0x9DF8
+0xF3BC 0x9DE6
+0xF3BD 0x9DED
+0xF3BE 0x9DEF
+0xF3BF 0x9DFD
+0xF3C0 0x9E1A
+0xF3C1 0x9E1B
+0xF3C2 0x9E1E
+0xF3C3 0x9E75
+0xF3C4 0x9E79
+0xF3C5 0x9E7D
+0xF3C6 0x9E81
+0xF3C7 0x9E88
+0xF3C8 0x9E8B
+0xF3C9 0x9E8C
+0xF3CA 0x9E92
+0xF3CB 0x9E95
+0xF3CC 0x9E91
+0xF3CD 0x9E9D
+0xF3CE 0x9EA5
+0xF3CF 0x9EA9
+0xF3D0 0x9EB8
+0xF3D1 0x9EAA
+0xF3D2 0x9EAD
+0xF3D3 0x9761
+0xF3D4 0x9ECC
+0xF3D5 0x9ECE
+0xF3D6 0x9ECF
+0xF3D7 0x9ED0
+0xF3D8 0x9ED4
+0xF3D9 0x9EDC
+0xF3DA 0x9EDE
+0xF3DB 0x9EDD
+0xF3DC 0x9EE0
+0xF3DD 0x9EE5
+0xF3DE 0x9EE8
+0xF3DF 0x9EEF
+0xF3E0 0x9EF4
+0xF3E1 0x9EF6
+0xF3E2 0x9EF7
+0xF3E3 0x9EF9
+0xF3E4 0x9EFB
+0xF3E5 0x9EFC
+0xF3E6 0x9EFD
+0xF3E7 0x9F07
+0xF3E8 0x9F08
+0xF3E9 0x76B7
+0xF3EA 0x9F15
+0xF3EB 0x9F21
+0xF3EC 0x9F2C
+0xF3ED 0x9F3E
+0xF3EE 0x9F4A
+0xF3EF 0x9F52
+0xF3F0 0x9F54
+0xF3F1 0x9F63
+0xF3F2 0x9F5F
+0xF3F3 0x9F60
+0xF3F4 0x9F61
+0xF3F5 0x9F66
+0xF3F6 0x9F67
+0xF3F7 0x9F6C
+0xF3F8 0x9F6A
+0xF3F9 0x9F77
+0xF3FA 0x9F72
+0xF3FB 0x9F76
+0xF3FC 0x9F95
+0xF3FD 0x9F9C
+0xF3FE 0x9FA0
+0xF4A1 0x582F
+0xF4A2 0x69C7
+0xF4A3 0x9059
+0xF4A4 0x7464
+0xF4A5 0x51DC
+0xF4A6 0x7199
diff --git a/ext/mbstring/tests/data/EmojiSources.txt b/ext/mbstring/tests/data/EmojiSources.txt
new file mode 100644
index 0000000000..b2a526160c
--- /dev/null
+++ b/ext/mbstring/tests/data/EmojiSources.txt
@@ -0,0 +1,763 @@
+# EmojiSources-13.0.0.txt
+# Date: 2019-09-09, 19:40:00 GMT [MS, KW]
+# © 2019 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Unicode Character Database
+# For documentation, see http://www.unicode.org/reports/tr44/
+#
+# This file provides historical mappings between Unicode code points and sequences on one hand
+# and Shift-JIS codes for cell phone carrier symbols on the other hand.
+# Each mapping is symmetric ("round trip"), for equivalent Unicode and carrier
+# symbols or sequences. This file does not include best-fit ("fallback")
+# mappings to similar but not equivalent symbols in either mapping direction.
+#
+# Created for Unicode 6.0 by Markus Scherer.
+# Updated for subsequent versions by Ken Whistler (no changes to mappings).
+#
+# Format: Semicolon-delimited file with a fixed number of fields.
+# Note that the format, including the number of fields, may change in the future.
+#
+# Fields:
+# 0: Unicode code point or sequence
+# 1: DoCoMo Shift-JIS code
+# 2: KDDI Shift-JIS code
+# 3: SoftBank Shift-JIS code
+#
+# Each field 1..3 contains a code if and only if the vendor character set
+# has a symbol which is equivalent to the Unicode character or sequence.
+
+# ================================================
+
+# Keycap sequences for telephone keypad.
+# The following 11 mappings are historical. The combining character sequences
+# in these mappings do not include variation selectors for emoji presentation.
+# Thus they do not match the named character sequences with keycaps listed in
+# NamedSequences.txt.
+# For modern data used in emoji support, see http://www.unicode.org/Public/emoji/latest/
+
+0023 20E3;F985;F489;F7B0
+0030 20E3;F990;F7C9;F7C5
+0031 20E3;F987;F6FB;F7BC
+0032 20E3;F988;F6FC;F7BD
+0033 20E3;F989;F740;F7BE
+0034 20E3;F98A;F741;F7BF
+0035 20E3;F98B;F742;F7C0
+0036 20E3;F98C;F743;F7C1
+0037 20E3;F98D;F744;F7C2
+0038 20E3;F98E;F745;F7C3
+0039 20E3;F98F;F746;F7C4
+
+00A9;F9D6;F774;F7EE
+00AE;F9DB;F775;F7EF
+2002;;F7AA;
+2003;;F7A9;
+2005;;F7AB;
+203C;F9A9;F3F1;
+2049;F9A8;F3F0;
+2122;F9D7;F76A;FBD7
+2139;;F74F;
+2194;F9E1;F47E;
+2195;F9E2;F480;
+2196;F8F8;F768;F7D7
+2197;F8D9;F771;F7D6
+2198;F8F7;F769;F7D8
+2199;F949;F772;F7D9
+21A9;F97E;F779;
+21AA;;F778;
+231A;F9C4;F797;
+231B;;F798;
+23E9;;F74C;F7DC
+23EA;;F74B;F7DD
+23EB;;F761;
+23EC;;F760;
+23F0;F95E;F7B1;
+23F3;F9C1;F654;
+24C2;F8BD;;
+25AA;;F74E;
+25AB;;F74D;
+25B6;;F74A;F7DA
+25C0;;F749;F7DB
+25FB;;F754;
+25FC;;F755;
+25FD;;F750;
+25FE;;F751;
+2600;F89F;F660;F98B
+2601;F8A0;F665;F98A
+260E;F8E8;F7B3;F949
+2611;;F7D9;
+2614;F8A1;F664;F98C
+2615;F8D1;F7B4;F986
+261D;;F6CF;F94F
+263A;;F6D4;FB54
+2648;F8A7;F667;F7DF
+2649;F8A8;F668;F7E0
+264A;F8A9;F669;F7E1
+264B;F8AA;F66A;F7E2
+264C;F8AB;F66B;F7E3
+264D;F8AC;F66C;F7E4
+264E;F8AD;F66D;F7E5
+264F;F8AE;F66E;F7E6
+2650;F8AF;F66F;F7E7
+2651;F8B0;F670;F7E8
+2652;F8B1;F671;F7E9
+2653;F8B2;F672;F7EA
+2660;F8EF;F7BE;F7AE
+2663;F8F1;F7C0;F7AF
+2665;F8EE;F378;F7AC
+2666;F8F0;F7BF;F7AD
+2668;F99C;F695;F763
+267B;F9DA;F47D;
+267F;F8FC;F657;F7AA
+2693;;F682;
+26A0;F9DC;F659;F7F2
+26A1;F8A3;F65F;F77D
+26AA;;F756;
+26AB;;F757;
+26BD;F8B7;F68F;F958
+26BE;F8B4;F693;F956
+26C4;F8A2;F65D;F989
+26C5;;F666;
+26CE;;F673;F7EB
+26D4;;F65C;
+26EA;;F7EB;F977
+26F2;;F342;F761
+26F3;F8B5;F7B6;F954
+26F5;F947;F68D;F95C
+26FA;;F343;F762
+26FD;F8CC;F78E;F97A
+2702;F8D6;F6EF;F9B3
+2705;;F77A;
+2708;F8C3;F68C;F95D
+2709;F977;F6FA;
+270A;F8F4;F488;F950
+270B;F8F6;F7C4;F952
+270C;F8F5;F7C3;F951
+270F;F9BE;F679;
+2712;F952;F7DA;
+2714;;F773;
+2716;;F76B;
+2728;F99F;F37E;F9CE
+2733;;F75A;F7A6
+2734;;F651;F7A5
+2744;;F662;
+2747;;F644;
+274C;;F76C;F9D3
+274E;;F76D;
+2753;;F65B;F960
+2754;;;F9D6
+2755;;;F9D7
+2757;F9A7;F65A;F961
+2764;F991;F7B2;F962
+2795;;F758;
+2796;;F759;
+2797;;F770;
+27A1;;F76E;F7D4
+27B0;F9AF;F3F2;
+2934;F99A;F3EE;
+2935;F9A5;F3EF;
+2B05;;F76F;F7D5
+2B06;;F75B;F7D2
+2B07;;F75C;F7D3
+2B1B;;F765;
+2B1C;;F764;
+2B50;;F663;F9CF
+2B55;;F381;F9D2
+3030;F9AE;;
+303D;;;F76C
+3297;;F36C;F9AD
+3299;F9D9;F6CA;F9B5
+1F004;;F344;F76D
+1F0CF;;F473;
+1F170;;F3E7;FBD2
+1F171;;F3E8;FBD3
+1F17E;;F3E9;FBD5
+1F17F;F8CD;F67E;F790
+1F18E;;F3EA;FBD4
+1F191;F980;F7C8;
+1F192;;F358;F7B4
+1F193;F97B;F795;
+1F194;F97C;F35B;F7C9
+1F195;F982;F7E5;F7B2
+1F196;F9D4;;
+1F197;F9B0;F7CA;F7ED
+1F198;;F6C1;
+1F199;;F6E8;F7B3
+1F19A;;F345;F76E
+1F1E8 1F1F3;;F3D2;FBB3
+1F1E9 1F1EA;;F3CF;FBAE
+1F1EA 1F1F8;;F348;FBB1
+1F1EB 1F1F7;;F3CE;FBAD
+1F1EC 1F1E7;;F3D1;FBB0
+1F1EE 1F1F9;;F3D0;FBAF
+1F1EF 1F1F5;;F6A5;FBAB
+1F1F0 1F1F7;;F3D3;FBB4
+1F1F7 1F1FA;;F349;FBB2
+1F1FA 1F1F8;;F790;FBAC
+1F201;;;F7A3
+1F202;;F35A;F7C8
+1F21A;;;F7B6
+1F22F;;F35E;F7CC
+1F232;F9DD;;
+1F233;F9DE;F35D;F7CB
+1F234;F9DF;;
+1F235;F9E0;F35C;F7CA
+1F236;;;F7B5
+1F237;;;F7B7
+1F238;;;F7B8
+1F239;;F359;F7C7
+1F23A;;F35F;F7CD
+1F250;;F6D0;F7C6
+1F251;;F7D8;
+1F300;F8A4;F641;FB84
+1F301;F8A5;F7B5;
+1F302;F8A6;F3BC;FB7C
+1F303;F957;F3C5;FB8C
+1F304;;;F98E
+1F305;;F3C8;FB8A
+1F306;;F34D;F787
+1F307;;;FB8B
+1F308;;F3C6;FB8D
+1F309;;F698;
+1F30A;F9E4;F481;FB7E
+1F30B;;F457;
+1F30C;;F463;
+1F30F;;F7D0;
+1F311;F940;F7C5;
+1F313;F942;F7C7;
+1F314;F941;F7C6;
+1F315;F944;;
+1F319;F943;F65E;F98D
+1F31B;;F661;
+1F31F;;;F9D5
+1F320;;F640;
+1F330;;F3F9;
+1F331;F9EB;F482;
+1F334;;F6BB;F9A7
+1F335;;F369;F9A8
+1F337;F9E8;F6BD;F9A4
+1F338;F9ED;F6A3;F970
+1F339;;F7EA;F972
+1F33A;;F367;F9A3
+1F33B;;F6BC;F9A5
+1F33C;;F44D;
+1F33D;;F3F7;
+1F33E;;;FB85
+1F33F;;F487;
+1F340;F9E6;F6EC;F750
+1F341;F9EC;F6A7;F758
+1F342;;F340;F759
+1F343;;;FB88
+1F344;;F3F8;
+1F345;;F38F;F9E9
+1F346;;F390;F9EA
+1F347;;F3F5;
+1F348;;F3F3;
+1F349;;F6A6;F9E8
+1F34A;;F38E;F9E6
+1F34C;F9E9;F3F6;
+1F34D;;F3F4;
+1F34E;F9EA;F38D;F9E5
+1F34F;;F45E;
+1F351;;F3FA;
+1F352;F9E7;F6AB;
+1F353;;F6AD;F9E7
+1F354;F8D4;F6AF;F760
+1F355;;F3FC;
+1F356;;F69D;
+1F357;;F440;
+1F358;;F387;F9DD
+1F359;F9EE;F6AE;F9E2
+1F35A;;F388;F9DE
+1F35B;;F38A;F9E1
+1F35C;F9F1;F7D1;F9E0
+1F35D;;F389;F9DF
+1F35E;F9F2;F383;F9D9
+1F35F;;F385;F9DB
+1F360;;F3FB;
+1F361;;F386;F9DC
+1F362;;F38B;F9E3
+1F363;;F38C;F9E4
+1F364;;F474;
+1F365;;F6C6;
+1F366;;F384;F9DA
+1F367;;F3BE;FB80
+1F368;;F44E;
+1F369;;F44F;
+1F36A;;F450;
+1F36B;;F451;
+1F36C;;F452;
+1F36D;;F453;
+1F36E;;F45A;
+1F36F;;F45D;
+1F370;F9EF;F6A9;F987
+1F371;;F391;F9EC
+1F372;;F392;F9ED
+1F373;;F6AA;F788
+1F374;F8D0;F685;F984
+1F375;F9C3;F382;F9D8
+1F376;F9F0;F36A;F9AB
+1F377;F9FB;F69A;
+1F378;F8D2;F69B;F985
+1F379;;F442;
+1F37A;F8D3;F69C;F988
+1F37B;;F36B;F9AC
+1F380;F8E5;F7BC;F9B4
+1F381;F8E6;F6A8;F752
+1F382;F8E7;F7BD;F9EB
+1F383;;F3C2;FB86
+1F384;F948;F6A2;F973
+1F385;;F3C4;FB89
+1F386;;F7FC;F757
+1F387;;F3BF;FB81
+1F388;;F36E;F9B0
+1F389;;F36F;F9B2
+1F38A;;F647;
+1F38B;;F441;
+1F38C;;F34C;F784
+1F38D;;F3B7;FB76
+1F38E;;F3B8;FB78
+1F38F;;F3BB;FB7B
+1F390;;F3C1;FB83
+1F391;;F3C3;FB87
+1F392;;F3BA;FB7A
+1F393;;F3B9;FB79
+1F3A0;F8DA;;
+1F3A1;;F645;F764
+1F3A2;;F3B6;FB73
+1F3A3;;F446;
+1F3A4;F8D7;F6DC;F97C
+1F3A5;F8D8;F6F0;F97D
+1F3A6;;;FBA7
+1F3A7;F8DB;F6E1;F9AA
+1F3A8;F8DC;F7B9;FBA2
+1F3A9;F8DD;F3C9;FBA3
+1F3AA;F8DE;F7BB;
+1F3AB;F8DF;F676;F765
+1F3AC;F950;F697;F9C4
+1F3AD;;F7BA;
+1F3AE;F8EC;F69F;
+1F3AF;;F69E;F770
+1F3B0;;F646;F773
+1F3B1;;F3B1;FB6C
+1F3B2;;F6A1;
+1F3B3;;F447;
+1F3B4;;F472;
+1F3B5;F99B;F7EE;F97E
+1F3B6;F9A4;F6DE;F9C6
+1F3B7;;;F981
+1F3B8;;F6DF;F982
+1F3B9;;F444;
+1F3BA;;F3B0;F983
+1F3BB;;F6E0;
+1F3BC;;F3A0;
+1F3BD;F8B3;;
+1F3BE;F8B6;F690;F955
+1F3BF;F8B8;F380;F953
+1F3C0;F8B9;F7B7;FB6A
+1F3C1;F8BA;F692;F772
+1F3C2;F9B7;F691;
+1F3C3;F9D8;F643;F755
+1F3C4;;F445;F957
+1F3C6;;F346;F771
+1F3C8;;F694;FB6B
+1F3CA;;F3B2;FB6D
+1F3E0;F8C4;F684;F976
+1F3E1;;F7E0;
+1F3E2;F8C5;F686;F978
+1F3E3;F8C6;F351;F794
+1F3E5;F8C7;F352;F796
+1F3E6;F8C8;F683;F78E
+1F3E7;F8C9;F67B;F795
+1F3E8;F8CA;F354;F799
+1F3E9;;F3C7;FBA1
+1F3EA;F8CB;F67C;F797
+1F3EB;F9E3;F353;F798
+1F3EC;;F3CA;FBA4
+1F3ED;;F3CD;FBA8
+1F3EE;;F696;
+1F3EF;;F3CB;FBA5
+1F3F0;;F3CC;FBA6
+1F40C;F9F3;F483;
+1F40D;;F3E3;FBCD
+1F40E;;;F774
+1F411;;;FBC9
+1F412;;;FBC8
+1F414;;F3E4;FBCE
+1F417;;F3E5;FBCF
+1F418;;F3E0;FBC6
+1F419;;F7F7;F74A
+1F41A;;F3C0;FB82
+1F41B;;F3DF;FBC5
+1F41C;;F6B6;
+1F41D;;F45B;
+1F41E;;F45C;
+1F41F;F9F6;;F959
+1F420;;F3DE;FBC2
+1F421;;F6AC;
+1F422;;F347;
+1F423;;F34E;
+1F424;F9F4;F6B9;FBC3
+1F425;;F47A;
+1F426;;;FBC1
+1F427;F9F5;F6B5;F996
+1F428;;F3E1;FBC7
+1F429;;F6B8;
+1F42B;;F3E6;FBD0
+1F42C;;F3DC;FBC0
+1F42D;;F7F2;F994
+1F42E;;F3E2;FBCB
+1F42F;;F7F0;F991
+1F430;;F6B0;FBCC
+1F431;F946;F6B4;F990
+1F432;;F443;
+1F433;;F648;F995
+1F434;F9F9;F6B1;F95A
+1F435;;F6B2;F749
+1F436;F945;F6BA;F993
+1F437;F9FA;F6B7;F74B
+1F438;;F6B3;FBD1
+1F439;;;FBC4
+1F43A;;;FBCA
+1F43B;;F7F1;F992
+1F43C;;F44A;
+1F43D;;F44C;
+1F43E;;F6C7;
+1F440;F8F2;F7C1;FB59
+1F442;F8F3;F7C2;FB5B
+1F443;;F3A4;FB5A
+1F444;;F3A5;FB5C
+1F445;;F44B;
+1F446;;F360;F7CE
+1F447;;F361;F7CF
+1F448;;F6D8;F7D0
+1F449;;F6D9;F7D1
+1F44A;F9A2;F6CC;F94D
+1F44B;;F3AA;FB5E
+1F44C;;F3A8;FB60
+1F44D;F9CC;F6D2;F94E
+1F44E;;F3A9;FB61
+1F44F;;F3A7;FB5F
+1F450;;;FB62
+1F451;F9BF;F7F9;F74E
+1F452;;F371;F9B8
+1F453;F8FB;F6D7;
+1F454;;F366;F9A2
+1F455;F9B3;F7E6;F946
+1F456;F9B6;F47B;
+1F457;;F46F;F9B9
+1F458;;F376;F9C1
+1F459;;F377;F9C2
+1F45A;;F6E6;
+1F45B;F9B4;F6DD;
+1F45C;F8E3;F674;F9C3
+1F45D;F951;;
+1F45E;;F7E7;
+1F45F;F8FA;F3EC;F947
+1F460;F8D5;F6F3;F77E
+1F461;;;F9BA
+1F462;;F372;F9BB
+1F463;F8F9;F3EB;FBD6
+1F464;F955;;
+1F466;;;F941
+1F467;;;F942
+1F468;;F6D5;F944
+1F469;;F6D3;F945
+1F46A;;F6DA;
+1F46B;;;FB68
+1F46E;;F350;F793
+1F46F;;F3AF;FB69
+1F470;;F3BD;
+1F471;;F3D4;FBB5
+1F472;;F3D5;FBB6
+1F473;;F3D6;FBB7
+1F474;;F3D7;FBB8
+1F475;;F3D8;FBB9
+1F476;;F3D9;FBBA
+1F477;;F3DA;FBBB
+1F478;;F3DB;FBBC
+1F479;;F448;
+1F47A;;F449;
+1F47B;;F6A4;F75B
+1F47C;;F7EF;F98F
+1F47D;;F6E7;F74C
+1F47E;;F6C5;F76B
+1F47F;;F6C8;F75A
+1F480;;F6D1;F75C
+1F481;;;F7F3
+1F482;;;FBBE
+1F483;;F3DD;FBBF
+1F484;F9B5;F6E2;F9BC
+1F485;;F373;F9BD
+1F486;;F6E4;F9BE
+1F487;;F374;F9BF
+1F488;;F375;F9C0
+1F489;;F6E9;F77B
+1F48A;;F36D;F9AF
+1F48B;F99E;F6C4;F943
+1F48C;F9BC;F47C;
+1F48D;F9C0;F6ED;F974
+1F48E;;;F975
+1F48F;;F7FA;F751
+1F490;;F368;F9A6
+1F491;;F3AE;FB65
+1F492;;;FB7D
+1F493;F992;F479;F9C7
+1F494;F993;F64F;F963
+1F495;F994;F650;
+1F496;;F379;
+1F497;;;F9C8
+1F498;;F6C3;F9C9
+1F499;;F37A;F9CA
+1F49A;;F37B;F9CB
+1F49B;;F37C;F9CC
+1F49C;;F37D;F9CD
+1F49D;;F458;FB77
+1F49E;;F7CC;
+1F49F;;;F7A4
+1F4A0;F99D;;
+1F4A1;F9A0;F64E;F74F
+1F4A2;F9A1;F6BE;F9D4
+1F4A3;F9A3;F652;F9B1
+1F4A4;F9A6;F64D;F77C
+1F4A5;F9AA;F7CD;
+1F4A6;F9AB;F7CE;F9D1
+1F4A7;F9AC;F6BF;
+1F4A8;F9AD;F6CD;F9D0
+1F4A9;;F6CE;F99B
+1F4AA;;F6C2;F78D
+1F4AB;;F460;
+1F4AC;;F6D6;
+1F4AE;;F6C9;
+1F4AF;;F6CB;
+1F4B0;F9BA;F6A0;F76F
+1F4B1;;;F78A
+1F4B2;;F796;
+1F4B3;;F799;
+1F4B4;F97A;F79A;
+1F4B5;;F7A2;
+1F4B8;;F45F;
+1F4B9;;F34F;F78B
+1F4BA;F956;;F75F
+1F4BB;F9BB;F7E8;F94C
+1F4BC;;F341;F75E
+1F4BD;;F79F;F9B6
+1F4BE;;F77E;
+1F4BF;F8ED;F6E5;F766
+1F4C0;;;F767
+1F4C1;;F7AC;
+1F4C2;;F7AD;
+1F4C3;;F77D;
+1F4C4;;F786;
+1F4C5;;F780;
+1F4C6;;F787;
+1F4C7;;F789;
+1F4C8;;F792;
+1F4C9;;F793;
+1F4CA;;F791;
+1F4CB;;F781;
+1F4CC;;F78A;
+1F4CD;;F77C;
+1F4CE;F9D5;F678;
+1F4CF;;F78D;
+1F4D0;;F67A;
+1F4D1;;F7E2;
+1F4D2;;F78B;
+1F4D3;;F788;
+1F4D4;;F675;
+1F4D5;;F785;
+1F4D6;F8E4;F677;F789
+1F4D7;;F782;
+1F4D8;;F783;
+1F4D9;;F784;
+1F4DA;;F78C;
+1F4DB;;F6F6;
+1F4DC;;F77B;
+1F4DD;F8EA;F365;F9A1
+1F4DE;;F6F7;
+1F4DF;F8BB;F7B8;
+1F4E0;F974;F6F9;F94B
+1F4E1;;F681;F78C
+1F4E2;;;F783
+1F4E3;;;F9B7
+1F4E4;;F7AF;
+1F4E5;;F7B0;
+1F4E6;;F6F8;
+1F4E7;;F475;
+1F4E8;;F7AE;
+1F4E9;F973;F466;F743
+1F4EA;;F6F4;
+1F4EB;;F7E1;F741
+1F4EE;;;F742
+1F4F0;;F7A8;
+1F4F1;F8E9;F7A5;F94A
+1F4F2;F972;F7DF;F744
+1F4F3;;F363;F7F0
+1F4F4;;F364;F7F1
+1F4F6;;F357;F7AB
+1F4F7;F8E2;F6EE;F948
+1F4F9;;F79B;
+1F4FA;F8EB;F6DB;F76A
+1F4FB;;F7E9;F768
+1F4FC;;F79D;F769
+1F503;;F7E4;
+1F50A;;F6EA;F782
+1F50B;;F7A1;
+1F50C;;F7A6;
+1F50D;F981;F6F1;F754
+1F50E;;F7DC;
+1F50F;;F7E3;
+1F510;;F7D3;
+1F511;F97D;F6F2;F980
+1F512;;F6F5;F785
+1F513;;;F786
+1F514;F9B8;F6EB;F9C5
+1F516;;F7DE;
+1F517;;F7A7;
+1F518;;F7DB;
+1F519;;F7DD;
+1F51A;F95D;;
+1F51B;F95C;;
+1F51C;F95B;;
+1F51D;;;F7EC
+1F51E;;F356;F7A7
+1F51F;;F747;
+1F520;;F7D4;
+1F521;;F7D5;
+1F522;;F7D6;
+1F523;;F7D7;
+1F524;;F459;
+1F525;;F653;F75D
+1F526;;F7A0;
+1F527;F9BD;F7A4;
+1F528;;F7FB;F756
+1F529;;F79E;
+1F52A;;F79C;
+1F52B;;F6E3;F753
+1F52E;;F362;
+1F52F;;;F7DE
+1F530;;F658;F7A9
+1F531;;;F971
+1F532;;;F7BA
+1F533;;;F7BB
+1F534;;F766;F7B9
+1F535;;F767;
+1F536;;F762;
+1F537;;F763;
+1F538;;F752;
+1F539;;F753;
+1F53A;;F776;
+1F53B;;F777;
+1F53C;;F75F;
+1F53D;;F75E;
+1F550;;;F964
+1F551;;;F965
+1F552;;;F966
+1F553;;;F967
+1F554;;;F968
+1F555;;;F969
+1F556;;;F96A
+1F557;;;F96B
+1F558;;;F96C
+1F559;;;F96D
+1F55A;;;F96E
+1F55B;;;F96F
+1F5FB;F9E5;F7ED;F97B
+1F5FC;;F699;FBA9
+1F5FD;;;FBBD
+1F5FE;;F78F;
+1F5FF;;F470;
+1F601;F9F8;F485;FB44
+1F602;;F468;FB52
+1F603;F995;F649;F998
+1F604;;;FB55
+1F605;F9C7;;
+1F606;F9CF;;
+1F609;F9CE;F7F3;FB45
+1F60A;;F3A1;F997
+1F60B;F9F7;;
+1F60C;F9C6;F399;FB4A
+1F60D;F9CB;F7F4;F746
+1F60F;F9D1;F393;FB42
+1F612;F9CA;F39D;FB4E
+1F613;F9C8;F7F6;F748
+1F614;F9C5;F394;FB43
+1F616;F998;F397;FB47
+1F618;;F3A3;FB58
+1F61A;;F3A2;FB57
+1F61C;F9CD;F6C0;F745
+1F61D;;;FB49
+1F61E;F997;;F999
+1F620;F996;F64A;F99A
+1F621;F9C9;F461;FB56
+1F622;F9D3;F46D;FB53
+1F623;F9D0;F396;FB46
+1F624;;F395;
+1F625;;;FB41
+1F628;;F39A;FB4B
+1F629;;F46B;
+1F62A;;F398;FB48
+1F62B;;F64C;
+1F62D;F9D2;F64B;FB51
+1F630;;F39F;FB4F
+1F631;F9FC;F7F5;F747
+1F632;;F39E;FB50
+1F633;;F39C;FB4D
+1F635;F999;F7CB;
+1F637;;F39B;FB4C
+1F638;;F484;
+1F639;;F467;
+1F63A;;F465;
+1F63B;;F469;
+1F63C;;F46E;
+1F63D;;F464;
+1F63E;;F462;
+1F63F;;F46C;
+1F640;;F46A;
+1F645;;F3AB;FB63
+1F646;;F3AC;FB64
+1F647;;F3AD;FB66
+1F648;;F454;
+1F649;;F456;
+1F64A;;F455;
+1F64B;;F48A;
+1F64C;;F48B;FB67
+1F64D;;F48C;
+1F64E;;F48D;
+1F64F;;F3A6;FB5D
+1F680;;F7F8;F74D
+1F683;F8BC;F68E;F95E
+1F684;F8BE;;FB75
+1F685;;F689;F95F
+1F687;;F7EC;FB74
+1F689;;F471;F979
+1F68C;F8C1;F688;F79A
+1F68F;;F680;F791
+1F691;;F3B4;FB71
+1F692;;F3B3;FB70
+1F693;;F3B5;FB72
+1F695;;;F79B
+1F697;F8BF;F68A;F95B
+1F699;F8C0;;FB6E
+1F69A;;F68B;FB6F
+1F6A2;F8C2;F355;F7A2
+1F6A4;;;F775
+1F6A5;F8CE;F642;F78F
+1F6A7;;F34A;F777
+1F6A8;;F477;
+1F6A9;F983;F3ED;
+1F6AA;F9B9;;
+1F6AB;;F75D;
+1F6AC;F8E0;F655;F9AE
+1F6AD;F8E1;F656;F7A8
+1F6B2;F9C2;F687;F776
+1F6B6;;F476;F7A1
+1F6B9;;;F778
+1F6BA;;;F779
+1F6BB;F8CF;F67D;F792
+1F6BC;;;F77A
+1F6BD;;;F781
+1F6BE;;;F9A9
+1F6C0;;F34B;F780
+
+# EOF
diff --git a/ext/mbstring/tests/data/ISO-2022-JP-2004-JISX0213.txt b/ext/mbstring/tests/data/ISO-2022-JP-2004-JISX0213.txt
new file mode 100644
index 0000000000..4e4973efac
--- /dev/null
+++ b/ext/mbstring/tests/data/ISO-2022-JP-2004-JISX0213.txt
@@ -0,0 +1,11391 @@
+## ISO-2022-JP-2004 vs Unicode mapping table
+##
+## Date: 3 May 2009
+## License:
+## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
+## Copyright (C) 2001 I'O, All Rights Reserved.
+## Copyright (C) 2006, 2009 Project X0213, All Rights Reserved.
+## You can use, modify, distribute this table freely.
+## Note:
+## 0-XX ISO/IEC 646 IRV (designated by '1b 28 42')
+## 3-XXXX JIS X 0213:2004 plane 1 (designated by '1b 24 28 51')
+## 4-XXXX JIS X 0213:2000 plane 2 (designated by '1b 24 28 50')
+## [1983] JIS codepoint defined by JIS X 0208-1983
+## [1990] JIS codepoint defined by JIS X 0208-1990
+## [2000] JIS codepoint defined by JIS X 0213:2000
+## [2004] JIS codepoint defined by JIS X 0213:2004
+## [Unicode3.1] UCS codepoint defined by Unicode 3.1
+## [Unicode3.2] UCS codepoint defined by Unicode 3.2
+## Windows Windows (CP932) mapping
+## Some 0213 character can't represent by one UCS character.
+## In this table, such characters are described as 'U+xxxx+xxxx'.
+##
+## IRV Unicode Name Note
+0-20 U+0020 # SPACE
+0-21 U+0021 # EXCLAMATION MARK
+0-22 U+0022 # QUOTATION MARK
+0-23 U+0023 # NUMBER SIGN
+0-24 U+0024 # DOLLAR SIGN
+0-25 U+0025 # PERCENT SIGN
+0-26 U+0026 # AMPERSAND
+0-27 U+0027 # APOSTROPHE
+0-28 U+0028 # LEFT PARENTHESIS
+0-29 U+0029 # RIGHT PARENTHESIS
+0-2A U+002A # ASTERISK
+0-2B U+002B # PLUS SIGN
+0-2C U+002C # COMMA
+0-2D U+002D # HYPHEN-MINUS
+0-2E U+002E # FULL STOP
+0-2F U+002F # SOLIDUS
+0-30 U+0030 # DIGIT ZERO
+0-31 U+0031 # DIGIT ONE
+0-32 U+0032 # DIGIT TWO
+0-33 U+0033 # DIGIT THREE
+0-34 U+0034 # DIGIT FOUR
+0-35 U+0035 # DIGIT FIVE
+0-36 U+0036 # DIGIT SIX
+0-37 U+0037 # DIGIT SEVEN
+0-38 U+0038 # DIGIT EIGHT
+0-39 U+0039 # DIGIT NINE
+0-3A U+003A # COLON
+0-3B U+003B # SEMICOLON
+0-3C U+003C # LESS-THAN SIGN
+0-3D U+003D # EQUALS SIGN
+0-3E U+003E # GREATER-THAN SIGN
+0-3F U+003F # QUESTION MARK
+0-40 U+0040 # COMMERCIAL AT
+0-41 U+0041 # LATIN CAPITAL LETTER A
+0-42 U+0042 # LATIN CAPITAL LETTER B
+0-43 U+0043 # LATIN CAPITAL LETTER C
+0-44 U+0044 # LATIN CAPITAL LETTER D
+0-45 U+0045 # LATIN CAPITAL LETTER E
+0-46 U+0046 # LATIN CAPITAL LETTER F
+0-47 U+0047 # LATIN CAPITAL LETTER G
+0-48 U+0048 # LATIN CAPITAL LETTER H
+0-49 U+0049 # LATIN CAPITAL LETTER I
+0-4A U+004A # LATIN CAPITAL LETTER J
+0-4B U+004B # LATIN CAPITAL LETTER K
+0-4C U+004C # LATIN CAPITAL LETTER L
+0-4D U+004D # LATIN CAPITAL LETTER M
+0-4E U+004E # LATIN CAPITAL LETTER N
+0-4F U+004F # LATIN CAPITAL LETTER O
+0-50 U+0050 # LATIN CAPITAL LETTER P
+0-51 U+0051 # LATIN CAPITAL LETTER Q
+0-52 U+0052 # LATIN CAPITAL LETTER R
+0-53 U+0053 # LATIN CAPITAL LETTER S
+0-54 U+0054 # LATIN CAPITAL LETTER T
+0-55 U+0055 # LATIN CAPITAL LETTER U
+0-56 U+0056 # LATIN CAPITAL LETTER V
+0-57 U+0057 # LATIN CAPITAL LETTER W
+0-58 U+0058 # LATIN CAPITAL LETTER X
+0-59 U+0059 # LATIN CAPITAL LETTER Y
+0-5A U+005A # LATIN CAPITAL LETTER Z
+0-5B U+005B # LEFT SQUARE BRACKET
+0-5C U+005C # REVERSE SOLIDUS
+0-5D U+005D # RIGHT SQUARE BRACKET
+0-5E U+005E # CIRCUMFLEX ACCENT
+0-5F U+005F # LOW LINE
+0-60 U+0060 # GRAVE ACCENT
+0-61 U+0061 # LATIN SMALL LETTER A
+0-62 U+0062 # LATIN SMALL LETTER B
+0-63 U+0063 # LATIN SMALL LETTER C
+0-64 U+0064 # LATIN SMALL LETTER D
+0-65 U+0065 # LATIN SMALL LETTER E
+0-66 U+0066 # LATIN SMALL LETTER F
+0-67 U+0067 # LATIN SMALL LETTER G
+0-68 U+0068 # LATIN SMALL LETTER H
+0-69 U+0069 # LATIN SMALL LETTER I
+0-6A U+006A # LATIN SMALL LETTER J
+0-6B U+006B # LATIN SMALL LETTER K
+0-6C U+006C # LATIN SMALL LETTER L
+0-6D U+006D # LATIN SMALL LETTER M
+0-6E U+006E # LATIN SMALL LETTER N
+0-6F U+006F # LATIN SMALL LETTER O
+0-70 U+0070 # LATIN SMALL LETTER P
+0-71 U+0071 # LATIN SMALL LETTER Q
+0-72 U+0072 # LATIN SMALL LETTER R
+0-73 U+0073 # LATIN SMALL LETTER S
+0-74 U+0074 # LATIN SMALL LETTER T
+0-75 U+0075 # LATIN SMALL LETTER U
+0-76 U+0076 # LATIN SMALL LETTER V
+0-77 U+0077 # LATIN SMALL LETTER W
+0-78 U+0078 # LATIN SMALL LETTER X
+0-79 U+0079 # LATIN SMALL LETTER Y
+0-7A U+007A # LATIN SMALL LETTER Z
+0-7B U+007B # LEFT CURLY BRACKET
+0-7C U+007C # VERTICAL LINE
+0-7D U+007D # RIGHT CURLY BRACKET
+0-7E U+007E # TILDE
+## JIS Unicode Name Note
+3-2121 U+3000 # IDEOGRAPHIC SPACE
+3-2122 U+3001 # IDEOGRAPHIC COMMA
+3-2123 U+3002 # IDEOGRAPHIC FULL STOP
+3-2124 U+FF0C # FULLWIDTH COMMA
+3-2125 U+FF0E # FULLWIDTH FULL STOP
+3-2126 U+30FB # KATAKANA MIDDLE DOT
+3-2127 U+FF1A # FULLWIDTH COLON
+3-2128 U+FF1B # FULLWIDTH SEMICOLON
+3-2129 U+FF1F # FULLWIDTH QUESTION MARK
+3-212A U+FF01 # FULLWIDTH EXCLAMATION MARK
+3-212B U+309B # KATAKANA-HIRAGANA VOICED SOUND MARK
+3-212C U+309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+3-212D U+00B4 # ACUTE ACCENT
+3-212E U+FF40 # FULLWIDTH GRAVE ACCENT
+3-212F U+00A8 # DIAERESIS
+3-2130 U+FF3E # FULLWIDTH CIRCUMFLEX ACCENT
+3-2131 U+203E # OVERLINE Windows: U+FFE3
+3-2132 U+FF3F # FULLWIDTH LOW LINE
+3-2133 U+30FD # KATAKANA ITERATION MARK
+3-2134 U+30FE # KATAKANA VOICED ITERATION MARK
+3-2135 U+309D # HIRAGANA ITERATION MARK
+3-2136 U+309E # HIRAGANA VOICED ITERATION MARK
+3-2137 U+3003 # DITTO MARK
+3-2138 U+4EDD # <cjk>
+3-2139 U+3005 # IDEOGRAPHIC ITERATION MARK
+3-213A U+3006 # IDEOGRAPHIC CLOSING MARK
+3-213B U+3007 # IDEOGRAPHIC NUMBER ZERO
+3-213C U+30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+3-213D U+2014 # EM DASH Windows: U+2015
+3-213E U+2010 # HYPHEN
+3-213F U+FF0F # FULLWIDTH SOLIDUS
+3-2140 U+FF3C # FULLWIDTH REVERSE SOLIDUS
+3-2141 U+301C # WAVE DASH Windows: U+FF5E
+3-2142 U+2016 # DOUBLE VERTICAL LINE Windows: U+2225
+3-2143 U+FF5C # FULLWIDTH VERTICAL LINE
+3-2144 U+2026 # HORIZONTAL ELLIPSIS
+3-2145 U+2025 # TWO DOT LEADER
+3-2146 U+2018 # LEFT SINGLE QUOTATION MARK
+3-2147 U+2019 # RIGHT SINGLE QUOTATION MARK
+3-2148 U+201C # LEFT DOUBLE QUOTATION MARK
+3-2149 U+201D # RIGHT DOUBLE QUOTATION MARK
+3-214A U+FF08 # FULLWIDTH LEFT PARENTHESIS
+3-214B U+FF09 # FULLWIDTH RIGHT PARENTHESIS
+3-214C U+3014 # LEFT TORTOISE SHELL BRACKET
+3-214D U+3015 # RIGHT TORTOISE SHELL BRACKET
+3-214E U+FF3B # FULLWIDTH LEFT SQUARE BRACKET
+3-214F U+FF3D # FULLWIDTH RIGHT SQUARE BRACKET
+3-2150 U+FF5B # FULLWIDTH LEFT CURLY BRACKET
+3-2151 U+FF5D # FULLWIDTH RIGHT CURLY BRACKET
+3-2152 U+3008 # LEFT ANGLE BRACKET
+3-2153 U+3009 # RIGHT ANGLE BRACKET
+3-2154 U+300A # LEFT DOUBLE ANGLE BRACKET
+3-2155 U+300B # RIGHT DOUBLE ANGLE BRACKET
+3-2156 U+300C # LEFT CORNER BRACKET
+3-2157 U+300D # RIGHT CORNER BRACKET
+3-2158 U+300E # LEFT WHITE CORNER BRACKET
+3-2159 U+300F # RIGHT WHITE CORNER BRACKET
+3-215A U+3010 # LEFT BLACK LENTICULAR BRACKET
+3-215B U+3011 # RIGHT BLACK LENTICULAR BRACKET
+3-215C U+FF0B # FULLWIDTH PLUS SIGN
+3-215D U+2212 # MINUS SIGN Windows: U+FF0D
+3-215E U+00B1 # PLUS-MINUS SIGN
+3-215F U+00D7 # MULTIPLICATION SIGN
+3-2160 U+00F7 # DIVISION SIGN
+3-2161 U+FF1D # FULLWIDTH EQUALS SIGN
+3-2162 U+2260 # NOT EQUAL TO
+3-2163 U+FF1C # FULLWIDTH LESS-THAN SIGN
+3-2164 U+FF1E # FULLWIDTH GREATER-THAN SIGN
+3-2165 U+2266 # LESS-THAN OVER EQUAL TO
+3-2166 U+2267 # GREATER-THAN OVER EQUAL TO
+3-2167 U+221E # INFINITY
+3-2168 U+2234 # THEREFORE
+3-2169 U+2642 # MALE SIGN
+3-216A U+2640 # FEMALE SIGN
+3-216B U+00B0 # DEGREE SIGN
+3-216C U+2032 # PRIME
+3-216D U+2033 # DOUBLE PRIME
+3-216E U+2103 # DEGREE CELSIUS
+3-216F U+00A5 # YEN SIGN Windows: U+FFE5
+3-2170 U+FF04 # FULLWIDTH DOLLAR SIGN
+3-2171 U+00A2 # CENT SIGN Windows: U+FFE0
+3-2172 U+00A3 # POUND SIGN Windows: U+FFE1
+3-2173 U+FF05 # FULLWIDTH PERCENT SIGN
+3-2174 U+FF03 # FULLWIDTH NUMBER SIGN
+3-2175 U+FF06 # FULLWIDTH AMPERSAND
+3-2176 U+FF0A # FULLWIDTH ASTERISK
+3-2177 U+FF20 # FULLWIDTH COMMERCIAL AT
+3-2178 U+00A7 # SECTION SIGN
+3-2179 U+2606 # WHITE STAR
+3-217A U+2605 # BLACK STAR
+3-217B U+25CB # WHITE CIRCLE
+3-217C U+25CF # BLACK CIRCLE
+3-217D U+25CE # BULLSEYE
+3-217E U+25C7 # WHITE DIAMOND
+3-2221 U+25C6 # BLACK DIAMOND
+3-2222 U+25A1 # WHITE SQUARE
+3-2223 U+25A0 # BLACK SQUARE
+3-2224 U+25B3 # WHITE UP-POINTING TRIANGLE
+3-2225 U+25B2 # BLACK UP-POINTING TRIANGLE
+3-2226 U+25BD # WHITE DOWN-POINTING TRIANGLE
+3-2227 U+25BC # BLACK DOWN-POINTING TRIANGLE
+3-2228 U+203B # REFERENCE MARK
+3-2229 U+3012 # POSTAL MARK
+3-222A U+2192 # RIGHTWARDS ARROW
+3-222B U+2190 # LEFTWARDS ARROW
+3-222C U+2191 # UPWARDS ARROW
+3-222D U+2193 # DOWNWARDS ARROW
+3-222E U+3013 # GETA MARK
+3-222F U+FF07 # FULLWIDTH APOSTROPHE [2000]
+3-2230 U+FF02 # FULLWIDTH QUOTATION MARK [2000]
+3-2231 U+FF0D # FULLWIDTH HYPHEN-MINUS [2000]
+3-2232 U+FF5E # FULLWIDTH TILDE [2000]
+3-2233 U+3033 # VERTICAL KANA REPEAT MARK UPPER HALF [2000]
+3-2234 U+3034 # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF [2000]
+3-2235 U+3035 # VERTICAL KANA REPEAT MARK LOWER HALF [2000]
+3-2236 U+303B # VERTICAL IDEOGRAPHIC ITERATION MARK [2000] [Unicode3.2]
+3-2237 U+303C # MASU MARK [2000] [Unicode3.2]
+3-2238 U+30FF # KATAKANA DIGRAPH KOTO [2000] [Unicode3.2]
+3-2239 U+309F # HIRAGANA DIGRAPH YORI [2000] [Unicode3.2]
+3-223A U+2208 # ELEMENT OF [1983]
+3-223B U+220B # CONTAINS AS MEMBER [1983]
+3-223C U+2286 # SUBSET OF OR EQUAL TO [1983]
+3-223D U+2287 # SUPERSET OF OR EQUAL TO [1983]
+3-223E U+2282 # SUBSET OF [1983]
+3-223F U+2283 # SUPERSET OF [1983]
+3-2240 U+222A # UNION [1983]
+3-2241 U+2229 # INTERSECTION [1983]
+3-2242 U+2284 # NOT A SUBSET OF [2000]
+3-2243 U+2285 # NOT A SUPERSET OF [2000]
+3-2244 U+228A # SUBSET OF WITH NOT EQUAL TO [2000]
+3-2245 U+228B # SUPERSET OF WITH NOT EQUAL TO [2000]
+3-2246 U+2209 # NOT AN ELEMENT OF [2000]
+3-2247 U+2205 # EMPTY SET [2000]
+3-2248 U+2305 # PROJECTIVE [2000]
+3-2249 U+2306 # PERSPECTIVE [2000]
+3-224A U+2227 # LOGICAL AND [1983]
+3-224B U+2228 # LOGICAL OR [1983]
+3-224C U+00AC # NOT SIGN [1983] Windows: U+FFE2
+3-224D U+21D2 # RIGHTWARDS DOUBLE ARROW [1983]
+3-224E U+21D4 # LEFT RIGHT DOUBLE ARROW [1983]
+3-224F U+2200 # FOR ALL [1983]
+3-2250 U+2203 # THERE EXISTS [1983]
+3-2251 U+2295 # CIRCLED PLUS [2000]
+3-2252 U+2296 # CIRCLED MINUS [2000]
+3-2253 U+2297 # CIRCLED TIMES [2000]
+3-2254 U+2225 # PARALLEL TO [2000]
+3-2255 U+2226 # NOT PARALLEL TO [2000]
+3-2256 U+FF5F # FULLWIDTH LEFT WHITE PARENTHESIS [2000] [Unicode3.2]
+3-2257 U+FF60 # FULLWIDTH RIGHT WHITE PARENTHESIS [2000] [Unicode3.2]
+3-2258 U+3018 # LEFT WHITE TORTOISE SHELL BRACKET [2000]
+3-2259 U+3019 # RIGHT WHITE TORTOISE SHELL BRACKET [2000]
+3-225A U+3016 # LEFT WHITE LENTICULAR BRACKET [2000]
+3-225B U+3017 # RIGHT WHITE LENTICULAR BRACKET [2000]
+3-225C U+2220 # ANGLE [1983]
+3-225D U+22A5 # UP TACK [1983]
+3-225E U+2312 # ARC [1983]
+3-225F U+2202 # PARTIAL DIFFERENTIAL [1983]
+3-2260 U+2207 # NABLA [1983]
+3-2261 U+2261 # IDENTICAL TO [1983]
+3-2262 U+2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF [1983]
+3-2263 U+226A # MUCH LESS-THAN [1983]
+3-2264 U+226B # MUCH GREATER-THAN [1983]
+3-2265 U+221A # SQUARE ROOT [1983]
+3-2266 U+223D # REVERSED TILDE [1983]
+3-2267 U+221D # PROPORTIONAL TO [1983]
+3-2268 U+2235 # BECAUSE [1983]
+3-2269 U+222B # INTEGRAL [1983]
+3-226A U+222C # DOUBLE INTEGRAL [1983]
+3-226B U+2262 # NOT IDENTICAL TO [2000]
+3-226C U+2243 # ASYMPTOTICALLY EQUAL TO [2000]
+3-226D U+2245 # APPROXIMATELY EQUAL TO [2000]
+3-226E U+2248 # ALMOST EQUAL TO [2000]
+3-226F U+2276 # LESS-THAN OR GREATER-THAN [2000]
+3-2270 U+2277 # GREATER-THAN OR LESS-THAN [2000]
+3-2271 U+2194 # LEFT RIGHT ARROW [2000]
+3-2272 U+212B # ANGSTROM SIGN [1983]
+3-2273 U+2030 # PER MILLE SIGN [1983]
+3-2274 U+266F # MUSIC SHARP SIGN [1983]
+3-2275 U+266D # MUSIC FLAT SIGN [1983]
+3-2276 U+266A # EIGHTH NOTE [1983]
+3-2277 U+2020 # DAGGER [1983]
+3-2278 U+2021 # DOUBLE DAGGER [1983]
+3-2279 U+00B6 # PILCROW SIGN [1983]
+3-227A U+266E # MUSIC NATURAL SIGN [2000]
+3-227B U+266B # BEAMED EIGHTH NOTES [2000]
+3-227C U+266C # BEAMED SIXTEENTH NOTES [2000]
+3-227D U+2669 # QUARTER NOTE [2000]
+3-227E U+25EF # LARGE CIRCLE [1983]
+3-2321 U+25B7 # WHITE RIGHT-POINTING TRIANGLE [2000]
+3-2322 U+25B6 # BLACK RIGHT-POINTING TRIANGLE [2000]
+3-2323 U+25C1 # WHITE LEFT-POINTING TRIANGLE [2000]
+3-2324 U+25C0 # BLACK LEFT-POINTING TRIANGLE [2000]
+3-2325 U+2197 # NORTH EAST ARROW [2000]
+3-2326 U+2198 # SOUTH EAST ARROW [2000]
+3-2327 U+2196 # NORTH WEST ARROW [2000]
+3-2328 U+2199 # SOUTH WEST ARROW [2000]
+3-2329 U+21C4 # RIGHTWARDS ARROW OVER LEFTWARDS ARROW [2000]
+3-232A U+21E8 # RIGHTWARDS WHITE ARROW [2000]
+3-232B U+21E6 # LEFTWARDS WHITE ARROW [2000]
+3-232C U+21E7 # UPWARDS WHITE ARROW [2000]
+3-232D U+21E9 # DOWNWARDS WHITE ARROW [2000]
+3-232E U+2934 # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS [2000] [Unicode3.2]
+3-232F U+2935 # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS [2000] [Unicode3.2]
+3-2330 U+FF10 # FULLWIDTH DIGIT ZERO
+3-2331 U+FF11 # FULLWIDTH DIGIT ONE
+3-2332 U+FF12 # FULLWIDTH DIGIT TWO
+3-2333 U+FF13 # FULLWIDTH DIGIT THREE
+3-2334 U+FF14 # FULLWIDTH DIGIT FOUR
+3-2335 U+FF15 # FULLWIDTH DIGIT FIVE
+3-2336 U+FF16 # FULLWIDTH DIGIT SIX
+3-2337 U+FF17 # FULLWIDTH DIGIT SEVEN
+3-2338 U+FF18 # FULLWIDTH DIGIT EIGHT
+3-2339 U+FF19 # FULLWIDTH DIGIT NINE
+3-233A U+29BF # CIRCLED BULLET [2000] [Unicode3.2]
+3-233B U+25C9 # FISHEYE [2000]
+3-233C U+303D # PART ALTERNATION MARK [2000] [Unicode3.2]
+3-233D U+FE46 # WHITE SESAME DOT [2000] [Unicode3.2]
+3-233E U+FE45 # SESAME DOT [2000] [Unicode3.2]
+3-233F U+25E6 # WHITE BULLET [2000]
+3-2340 U+2022 # BULLET [2000]
+3-2341 U+FF21 # FULLWIDTH LATIN CAPITAL LETTER A
+3-2342 U+FF22 # FULLWIDTH LATIN CAPITAL LETTER B
+3-2343 U+FF23 # FULLWIDTH LATIN CAPITAL LETTER C
+3-2344 U+FF24 # FULLWIDTH LATIN CAPITAL LETTER D
+3-2345 U+FF25 # FULLWIDTH LATIN CAPITAL LETTER E
+3-2346 U+FF26 # FULLWIDTH LATIN CAPITAL LETTER F
+3-2347 U+FF27 # FULLWIDTH LATIN CAPITAL LETTER G
+3-2348 U+FF28 # FULLWIDTH LATIN CAPITAL LETTER H
+3-2349 U+FF29 # FULLWIDTH LATIN CAPITAL LETTER I
+3-234A U+FF2A # FULLWIDTH LATIN CAPITAL LETTER J
+3-234B U+FF2B # FULLWIDTH LATIN CAPITAL LETTER K
+3-234C U+FF2C # FULLWIDTH LATIN CAPITAL LETTER L
+3-234D U+FF2D # FULLWIDTH LATIN CAPITAL LETTER M
+3-234E U+FF2E # FULLWIDTH LATIN CAPITAL LETTER N
+3-234F U+FF2F # FULLWIDTH LATIN CAPITAL LETTER O
+3-2350 U+FF30 # FULLWIDTH LATIN CAPITAL LETTER P
+3-2351 U+FF31 # FULLWIDTH LATIN CAPITAL LETTER Q
+3-2352 U+FF32 # FULLWIDTH LATIN CAPITAL LETTER R
+3-2353 U+FF33 # FULLWIDTH LATIN CAPITAL LETTER S
+3-2354 U+FF34 # FULLWIDTH LATIN CAPITAL LETTER T
+3-2355 U+FF35 # FULLWIDTH LATIN CAPITAL LETTER U
+3-2356 U+FF36 # FULLWIDTH LATIN CAPITAL LETTER V
+3-2357 U+FF37 # FULLWIDTH LATIN CAPITAL LETTER W
+3-2358 U+FF38 # FULLWIDTH LATIN CAPITAL LETTER X
+3-2359 U+FF39 # FULLWIDTH LATIN CAPITAL LETTER Y
+3-235A U+FF3A # FULLWIDTH LATIN CAPITAL LETTER Z
+3-235B U+2213 # MINUS-OR-PLUS SIGN [2000]
+3-235C U+2135 # ALEF SYMBOL [2000]
+3-235D U+210F # PLANCK CONSTANT OVER TWO PI [2000]
+3-235E U+33CB # SQUARE HP [2000]
+3-235F U+2113 # SCRIPT SMALL L [2000]
+3-2360 U+2127 # INVERTED OHM SIGN [2000]
+3-2361 U+FF41 # FULLWIDTH LATIN SMALL LETTER A
+3-2362 U+FF42 # FULLWIDTH LATIN SMALL LETTER B
+3-2363 U+FF43 # FULLWIDTH LATIN SMALL LETTER C
+3-2364 U+FF44 # FULLWIDTH LATIN SMALL LETTER D
+3-2365 U+FF45 # FULLWIDTH LATIN SMALL LETTER E
+3-2366 U+FF46 # FULLWIDTH LATIN SMALL LETTER F
+3-2367 U+FF47 # FULLWIDTH LATIN SMALL LETTER G
+3-2368 U+FF48 # FULLWIDTH LATIN SMALL LETTER H
+3-2369 U+FF49 # FULLWIDTH LATIN SMALL LETTER I
+3-236A U+FF4A # FULLWIDTH LATIN SMALL LETTER J
+3-236B U+FF4B # FULLWIDTH LATIN SMALL LETTER K
+3-236C U+FF4C # FULLWIDTH LATIN SMALL LETTER L
+3-236D U+FF4D # FULLWIDTH LATIN SMALL LETTER M
+3-236E U+FF4E # FULLWIDTH LATIN SMALL LETTER N
+3-236F U+FF4F # FULLWIDTH LATIN SMALL LETTER O
+3-2370 U+FF50 # FULLWIDTH LATIN SMALL LETTER P
+3-2371 U+FF51 # FULLWIDTH LATIN SMALL LETTER Q
+3-2372 U+FF52 # FULLWIDTH LATIN SMALL LETTER R
+3-2373 U+FF53 # FULLWIDTH LATIN SMALL LETTER S
+3-2374 U+FF54 # FULLWIDTH LATIN SMALL LETTER T
+3-2375 U+FF55 # FULLWIDTH LATIN SMALL LETTER U
+3-2376 U+FF56 # FULLWIDTH LATIN SMALL LETTER V
+3-2377 U+FF57 # FULLWIDTH LATIN SMALL LETTER W
+3-2378 U+FF58 # FULLWIDTH LATIN SMALL LETTER X
+3-2379 U+FF59 # FULLWIDTH LATIN SMALL LETTER Y
+3-237A U+FF5A # FULLWIDTH LATIN SMALL LETTER Z
+3-237B U+30A0 # KATAKANA-HIRAGANA DOUBLE HYPHEN [2000] [Unicode3.2]
+3-237C U+2013 # EN DASH [2000]
+3-237D U+29FA # DOUBLE PLUS [2000] [Unicode3.2]
+3-237E U+29FB # TRIPLE PLUS [2000] [Unicode3.2]
+3-2421 U+3041 # HIRAGANA LETTER SMALL A
+3-2422 U+3042 # HIRAGANA LETTER A
+3-2423 U+3043 # HIRAGANA LETTER SMALL I
+3-2424 U+3044 # HIRAGANA LETTER I
+3-2425 U+3045 # HIRAGANA LETTER SMALL U
+3-2426 U+3046 # HIRAGANA LETTER U
+3-2427 U+3047 # HIRAGANA LETTER SMALL E
+3-2428 U+3048 # HIRAGANA LETTER E
+3-2429 U+3049 # HIRAGANA LETTER SMALL O
+3-242A U+304A # HIRAGANA LETTER O
+3-242B U+304B # HIRAGANA LETTER KA
+3-242C U+304C # HIRAGANA LETTER GA
+3-242D U+304D # HIRAGANA LETTER KI
+3-242E U+304E # HIRAGANA LETTER GI
+3-242F U+304F # HIRAGANA LETTER KU
+3-2430 U+3050 # HIRAGANA LETTER GU
+3-2431 U+3051 # HIRAGANA LETTER KE
+3-2432 U+3052 # HIRAGANA LETTER GE
+3-2433 U+3053 # HIRAGANA LETTER KO
+3-2434 U+3054 # HIRAGANA LETTER GO
+3-2435 U+3055 # HIRAGANA LETTER SA
+3-2436 U+3056 # HIRAGANA LETTER ZA
+3-2437 U+3057 # HIRAGANA LETTER SI
+3-2438 U+3058 # HIRAGANA LETTER ZI
+3-2439 U+3059 # HIRAGANA LETTER SU
+3-243A U+305A # HIRAGANA LETTER ZU
+3-243B U+305B # HIRAGANA LETTER SE
+3-243C U+305C # HIRAGANA LETTER ZE
+3-243D U+305D # HIRAGANA LETTER SO
+3-243E U+305E # HIRAGANA LETTER ZO
+3-243F U+305F # HIRAGANA LETTER TA
+3-2440 U+3060 # HIRAGANA LETTER DA
+3-2441 U+3061 # HIRAGANA LETTER TI
+3-2442 U+3062 # HIRAGANA LETTER DI
+3-2443 U+3063 # HIRAGANA LETTER SMALL TU
+3-2444 U+3064 # HIRAGANA LETTER TU
+3-2445 U+3065 # HIRAGANA LETTER DU
+3-2446 U+3066 # HIRAGANA LETTER TE
+3-2447 U+3067 # HIRAGANA LETTER DE
+3-2448 U+3068 # HIRAGANA LETTER TO
+3-2449 U+3069 # HIRAGANA LETTER DO
+3-244A U+306A # HIRAGANA LETTER NA
+3-244B U+306B # HIRAGANA LETTER NI
+3-244C U+306C # HIRAGANA LETTER NU
+3-244D U+306D # HIRAGANA LETTER NE
+3-244E U+306E # HIRAGANA LETTER NO
+3-244F U+306F # HIRAGANA LETTER HA
+3-2450 U+3070 # HIRAGANA LETTER BA
+3-2451 U+3071 # HIRAGANA LETTER PA
+3-2452 U+3072 # HIRAGANA LETTER HI
+3-2453 U+3073 # HIRAGANA LETTER BI
+3-2454 U+3074 # HIRAGANA LETTER PI
+3-2455 U+3075 # HIRAGANA LETTER HU
+3-2456 U+3076 # HIRAGANA LETTER BU
+3-2457 U+3077 # HIRAGANA LETTER PU
+3-2458 U+3078 # HIRAGANA LETTER HE
+3-2459 U+3079 # HIRAGANA LETTER BE
+3-245A U+307A # HIRAGANA LETTER PE
+3-245B U+307B # HIRAGANA LETTER HO
+3-245C U+307C # HIRAGANA LETTER BO
+3-245D U+307D # HIRAGANA LETTER PO
+3-245E U+307E # HIRAGANA LETTER MA
+3-245F U+307F # HIRAGANA LETTER MI
+3-2460 U+3080 # HIRAGANA LETTER MU
+3-2461 U+3081 # HIRAGANA LETTER ME
+3-2462 U+3082 # HIRAGANA LETTER MO
+3-2463 U+3083 # HIRAGANA LETTER SMALL YA
+3-2464 U+3084 # HIRAGANA LETTER YA
+3-2465 U+3085 # HIRAGANA LETTER SMALL YU
+3-2466 U+3086 # HIRAGANA LETTER YU
+3-2467 U+3087 # HIRAGANA LETTER SMALL YO
+3-2468 U+3088 # HIRAGANA LETTER YO
+3-2469 U+3089 # HIRAGANA LETTER RA
+3-246A U+308A # HIRAGANA LETTER RI
+3-246B U+308B # HIRAGANA LETTER RU
+3-246C U+308C # HIRAGANA LETTER RE
+3-246D U+308D # HIRAGANA LETTER RO
+3-246E U+308E # HIRAGANA LETTER SMALL WA
+3-246F U+308F # HIRAGANA LETTER WA
+3-2470 U+3090 # HIRAGANA LETTER WI
+3-2471 U+3091 # HIRAGANA LETTER WE
+3-2472 U+3092 # HIRAGANA LETTER WO
+3-2473 U+3093 # HIRAGANA LETTER N
+3-2474 U+3094 # HIRAGANA LETTER VU [2000]
+3-2475 U+3095 # HIRAGANA LETTER SMALL KA [2000] [Unicode3.2]
+3-2476 U+3096 # HIRAGANA LETTER SMALL KE [2000] [Unicode3.2]
+3-2477 U+304B+309A # [2000]
+3-2478 U+304D+309A # [2000]
+3-2479 U+304F+309A # [2000]
+3-247A U+3051+309A # [2000]
+3-247B U+3053+309A # [2000]
+3-247C # <reserved>
+3-247D # <reserved>
+3-247E # <reserved>
+3-2521 U+30A1 # KATAKANA LETTER SMALL A
+3-2522 U+30A2 # KATAKANA LETTER A
+3-2523 U+30A3 # KATAKANA LETTER SMALL I
+3-2524 U+30A4 # KATAKANA LETTER I
+3-2525 U+30A5 # KATAKANA LETTER SMALL U
+3-2526 U+30A6 # KATAKANA LETTER U
+3-2527 U+30A7 # KATAKANA LETTER SMALL E
+3-2528 U+30A8 # KATAKANA LETTER E
+3-2529 U+30A9 # KATAKANA LETTER SMALL O
+3-252A U+30AA # KATAKANA LETTER O
+3-252B U+30AB # KATAKANA LETTER KA
+3-252C U+30AC # KATAKANA LETTER GA
+3-252D U+30AD # KATAKANA LETTER KI
+3-252E U+30AE # KATAKANA LETTER GI
+3-252F U+30AF # KATAKANA LETTER KU
+3-2530 U+30B0 # KATAKANA LETTER GU
+3-2531 U+30B1 # KATAKANA LETTER KE
+3-2532 U+30B2 # KATAKANA LETTER GE
+3-2533 U+30B3 # KATAKANA LETTER KO
+3-2534 U+30B4 # KATAKANA LETTER GO
+3-2535 U+30B5 # KATAKANA LETTER SA
+3-2536 U+30B6 # KATAKANA LETTER ZA
+3-2537 U+30B7 # KATAKANA LETTER SI
+3-2538 U+30B8 # KATAKANA LETTER ZI
+3-2539 U+30B9 # KATAKANA LETTER SU
+3-253A U+30BA # KATAKANA LETTER ZU
+3-253B U+30BB # KATAKANA LETTER SE
+3-253C U+30BC # KATAKANA LETTER ZE
+3-253D U+30BD # KATAKANA LETTER SO
+3-253E U+30BE # KATAKANA LETTER ZO
+3-253F U+30BF # KATAKANA LETTER TA
+3-2540 U+30C0 # KATAKANA LETTER DA
+3-2541 U+30C1 # KATAKANA LETTER TI
+3-2542 U+30C2 # KATAKANA LETTER DI
+3-2543 U+30C3 # KATAKANA LETTER SMALL TU
+3-2544 U+30C4 # KATAKANA LETTER TU
+3-2545 U+30C5 # KATAKANA LETTER DU
+3-2546 U+30C6 # KATAKANA LETTER TE
+3-2547 U+30C7 # KATAKANA LETTER DE
+3-2548 U+30C8 # KATAKANA LETTER TO
+3-2549 U+30C9 # KATAKANA LETTER DO
+3-254A U+30CA # KATAKANA LETTER NA
+3-254B U+30CB # KATAKANA LETTER NI
+3-254C U+30CC # KATAKANA LETTER NU
+3-254D U+30CD # KATAKANA LETTER NE
+3-254E U+30CE # KATAKANA LETTER NO
+3-254F U+30CF # KATAKANA LETTER HA
+3-2550 U+30D0 # KATAKANA LETTER BA
+3-2551 U+30D1 # KATAKANA LETTER PA
+3-2552 U+30D2 # KATAKANA LETTER HI
+3-2553 U+30D3 # KATAKANA LETTER BI
+3-2554 U+30D4 # KATAKANA LETTER PI
+3-2555 U+30D5 # KATAKANA LETTER HU
+3-2556 U+30D6 # KATAKANA LETTER BU
+3-2557 U+30D7 # KATAKANA LETTER PU
+3-2558 U+30D8 # KATAKANA LETTER HE
+3-2559 U+30D9 # KATAKANA LETTER BE
+3-255A U+30DA # KATAKANA LETTER PE
+3-255B U+30DB # KATAKANA LETTER HO
+3-255C U+30DC # KATAKANA LETTER BO
+3-255D U+30DD # KATAKANA LETTER PO
+3-255E U+30DE # KATAKANA LETTER MA
+3-255F U+30DF # KATAKANA LETTER MI
+3-2560 U+30E0 # KATAKANA LETTER MU
+3-2561 U+30E1 # KATAKANA LETTER ME
+3-2562 U+30E2 # KATAKANA LETTER MO
+3-2563 U+30E3 # KATAKANA LETTER SMALL YA
+3-2564 U+30E4 # KATAKANA LETTER YA
+3-2565 U+30E5 # KATAKANA LETTER SMALL YU
+3-2566 U+30E6 # KATAKANA LETTER YU
+3-2567 U+30E7 # KATAKANA LETTER SMALL YO
+3-2568 U+30E8 # KATAKANA LETTER YO
+3-2569 U+30E9 # KATAKANA LETTER RA
+3-256A U+30EA # KATAKANA LETTER RI
+3-256B U+30EB # KATAKANA LETTER RU
+3-256C U+30EC # KATAKANA LETTER RE
+3-256D U+30ED # KATAKANA LETTER RO
+3-256E U+30EE # KATAKANA LETTER SMALL WA
+3-256F U+30EF # KATAKANA LETTER WA
+3-2570 U+30F0 # KATAKANA LETTER WI
+3-2571 U+30F1 # KATAKANA LETTER WE
+3-2572 U+30F2 # KATAKANA LETTER WO
+3-2573 U+30F3 # KATAKANA LETTER N
+3-2574 U+30F4 # KATAKANA LETTER VU
+3-2575 U+30F5 # KATAKANA LETTER SMALL KA
+3-2576 U+30F6 # KATAKANA LETTER SMALL KE
+3-2577 U+30AB+309A # [2000]
+3-2578 U+30AD+309A # [2000]
+3-2579 U+30AF+309A # [2000]
+3-257A U+30B1+309A # [2000]
+3-257B U+30B3+309A # [2000]
+3-257C U+30BB+309A # [2000]
+3-257D U+30C4+309A # [2000]
+3-257E U+30C8+309A # [2000]
+3-2621 U+0391 # GREEK CAPITAL LETTER ALPHA
+3-2622 U+0392 # GREEK CAPITAL LETTER BETA
+3-2623 U+0393 # GREEK CAPITAL LETTER GAMMA
+3-2624 U+0394 # GREEK CAPITAL LETTER DELTA
+3-2625 U+0395 # GREEK CAPITAL LETTER EPSILON
+3-2626 U+0396 # GREEK CAPITAL LETTER ZETA
+3-2627 U+0397 # GREEK CAPITAL LETTER ETA
+3-2628 U+0398 # GREEK CAPITAL LETTER THETA
+3-2629 U+0399 # GREEK CAPITAL LETTER IOTA
+3-262A U+039A # GREEK CAPITAL LETTER KAPPA
+3-262B U+039B # GREEK CAPITAL LETTER LAMDA
+3-262C U+039C # GREEK CAPITAL LETTER MU
+3-262D U+039D # GREEK CAPITAL LETTER NU
+3-262E U+039E # GREEK CAPITAL LETTER XI
+3-262F U+039F # GREEK CAPITAL LETTER OMICRON
+3-2630 U+03A0 # GREEK CAPITAL LETTER PI
+3-2631 U+03A1 # GREEK CAPITAL LETTER RHO
+3-2632 U+03A3 # GREEK CAPITAL LETTER SIGMA
+3-2633 U+03A4 # GREEK CAPITAL LETTER TAU
+3-2634 U+03A5 # GREEK CAPITAL LETTER UPSILON
+3-2635 U+03A6 # GREEK CAPITAL LETTER PHI
+3-2636 U+03A7 # GREEK CAPITAL LETTER CHI
+3-2637 U+03A8 # GREEK CAPITAL LETTER PSI
+3-2638 U+03A9 # GREEK CAPITAL LETTER OMEGA
+3-2639 U+2664 # WHITE SPADE SUIT [2000]
+3-263A U+2660 # BLACK SPADE SUIT [2000]
+3-263B U+2662 # WHITE DIAMOND SUIT [2000]
+3-263C U+2666 # BLACK DIAMOND SUIT [2000]
+3-263D U+2661 # WHITE HEART SUIT [2000]
+3-263E U+2665 # BLACK HEART SUIT [2000]
+3-263F U+2667 # WHITE CLUB SUIT [2000]
+3-2640 U+2663 # BLACK CLUB SUIT [2000]
+3-2641 U+03B1 # GREEK SMALL LETTER ALPHA
+3-2642 U+03B2 # GREEK SMALL LETTER BETA
+3-2643 U+03B3 # GREEK SMALL LETTER GAMMA
+3-2644 U+03B4 # GREEK SMALL LETTER DELTA
+3-2645 U+03B5 # GREEK SMALL LETTER EPSILON
+3-2646 U+03B6 # GREEK SMALL LETTER ZETA
+3-2647 U+03B7 # GREEK SMALL LETTER ETA
+3-2648 U+03B8 # GREEK SMALL LETTER THETA
+3-2649 U+03B9 # GREEK SMALL LETTER IOTA
+3-264A U+03BA # GREEK SMALL LETTER KAPPA
+3-264B U+03BB # GREEK SMALL LETTER LAMDA
+3-264C U+03BC # GREEK SMALL LETTER MU
+3-264D U+03BD # GREEK SMALL LETTER NU
+3-264E U+03BE # GREEK SMALL LETTER XI
+3-264F U+03BF # GREEK SMALL LETTER OMICRON
+3-2650 U+03C0 # GREEK SMALL LETTER PI
+3-2651 U+03C1 # GREEK SMALL LETTER RHO
+3-2652 U+03C3 # GREEK SMALL LETTER SIGMA
+3-2653 U+03C4 # GREEK SMALL LETTER TAU
+3-2654 U+03C5 # GREEK SMALL LETTER UPSILON
+3-2655 U+03C6 # GREEK SMALL LETTER PHI
+3-2656 U+03C7 # GREEK SMALL LETTER CHI
+3-2657 U+03C8 # GREEK SMALL LETTER PSI
+3-2658 U+03C9 # GREEK SMALL LETTER OMEGA
+3-2659 U+03C2 # GREEK SMALL LETTER FINAL SIGMA [2000]
+3-265A U+24F5 # DOUBLE CIRCLED DIGIT ONE [2000] [Unicode3.2]
+3-265B U+24F6 # DOUBLE CIRCLED DIGIT TWO [2000] [Unicode3.2]
+3-265C U+24F7 # DOUBLE CIRCLED DIGIT THREE [2000] [Unicode3.2]
+3-265D U+24F8 # DOUBLE CIRCLED DIGIT FOUR [2000] [Unicode3.2]
+3-265E U+24F9 # DOUBLE CIRCLED DIGIT FIVE [2000] [Unicode3.2]
+3-265F U+24FA # DOUBLE CIRCLED DIGIT SIX [2000] [Unicode3.2]
+3-2660 U+24FB # DOUBLE CIRCLED DIGIT SEVEN [2000] [Unicode3.2]
+3-2661 U+24FC # DOUBLE CIRCLED DIGIT EIGHT [2000] [Unicode3.2]
+3-2662 U+24FD # DOUBLE CIRCLED DIGIT NINE [2000] [Unicode3.2]
+3-2663 U+24FE # DOUBLE CIRCLED NUMBER TEN [2000] [Unicode3.2]
+3-2664 U+2616 # WHITE SHOGI PIECE [2000] [Unicode3.2]
+3-2665 U+2617 # BLACK SHOGI PIECE [2000] [Unicode3.2]
+3-2666 U+3020 # POSTAL MARK FACE [2000]
+3-2667 U+260E # BLACK TELEPHONE [2000]
+3-2668 U+2600 # BLACK SUN WITH RAYS [2000]
+3-2669 U+2601 # CLOUD [2000]
+3-266A U+2602 # UMBRELLA [2000]
+3-266B U+2603 # SNOWMAN [2000]
+3-266C U+2668 # HOT SPRINGS [2000]
+3-266D U+25B1 # WHITE PARALLELOGRAM [2000]
+3-266E U+31F0 # KATAKANA LETTER SMALL KU [2000] [Unicode3.2]
+3-266F U+31F1 # KATAKANA LETTER SMALL SI [2000] [Unicode3.2]
+3-2670 U+31F2 # KATAKANA LETTER SMALL SU [2000] [Unicode3.2]
+3-2671 U+31F3 # KATAKANA LETTER SMALL TO [2000] [Unicode3.2]
+3-2672 U+31F4 # KATAKANA LETTER SMALL NU [2000] [Unicode3.2]
+3-2673 U+31F5 # KATAKANA LETTER SMALL HA [2000] [Unicode3.2]
+3-2674 U+31F6 # KATAKANA LETTER SMALL HI [2000] [Unicode3.2]
+3-2675 U+31F7 # KATAKANA LETTER SMALL HU [2000] [Unicode3.2]
+3-2676 U+31F8 # KATAKANA LETTER SMALL HE [2000] [Unicode3.2]
+3-2677 U+31F9 # KATAKANA LETTER SMALL HO [2000] [Unicode3.2]
+3-2678 U+31F7+309A # [2000]
+3-2679 U+31FA # KATAKANA LETTER SMALL MU [2000] [Unicode3.2]
+3-267A U+31FB # KATAKANA LETTER SMALL RA [2000] [Unicode3.2]
+3-267B U+31FC # KATAKANA LETTER SMALL RI [2000] [Unicode3.2]
+3-267C U+31FD # KATAKANA LETTER SMALL RU [2000] [Unicode3.2]
+3-267D U+31FE # KATAKANA LETTER SMALL RE [2000] [Unicode3.2]
+3-267E U+31FF # KATAKANA LETTER SMALL RO [2000] [Unicode3.2]
+3-2721 U+0410 # CYRILLIC CAPITAL LETTER A
+3-2722 U+0411 # CYRILLIC CAPITAL LETTER BE
+3-2723 U+0412 # CYRILLIC CAPITAL LETTER VE
+3-2724 U+0413 # CYRILLIC CAPITAL LETTER GHE
+3-2725 U+0414 # CYRILLIC CAPITAL LETTER DE
+3-2726 U+0415 # CYRILLIC CAPITAL LETTER IE
+3-2727 U+0401 # CYRILLIC CAPITAL LETTER IO
+3-2728 U+0416 # CYRILLIC CAPITAL LETTER ZHE
+3-2729 U+0417 # CYRILLIC CAPITAL LETTER ZE
+3-272A U+0418 # CYRILLIC CAPITAL LETTER I
+3-272B U+0419 # CYRILLIC CAPITAL LETTER SHORT I
+3-272C U+041A # CYRILLIC CAPITAL LETTER KA
+3-272D U+041B # CYRILLIC CAPITAL LETTER EL
+3-272E U+041C # CYRILLIC CAPITAL LETTER EM
+3-272F U+041D # CYRILLIC CAPITAL LETTER EN
+3-2730 U+041E # CYRILLIC CAPITAL LETTER O
+3-2731 U+041F # CYRILLIC CAPITAL LETTER PE
+3-2732 U+0420 # CYRILLIC CAPITAL LETTER ER
+3-2733 U+0421 # CYRILLIC CAPITAL LETTER ES
+3-2734 U+0422 # CYRILLIC CAPITAL LETTER TE
+3-2735 U+0423 # CYRILLIC CAPITAL LETTER U
+3-2736 U+0424 # CYRILLIC CAPITAL LETTER EF
+3-2737 U+0425 # CYRILLIC CAPITAL LETTER HA
+3-2738 U+0426 # CYRILLIC CAPITAL LETTER TSE
+3-2739 U+0427 # CYRILLIC CAPITAL LETTER CHE
+3-273A U+0428 # CYRILLIC CAPITAL LETTER SHA
+3-273B U+0429 # CYRILLIC CAPITAL LETTER SHCHA
+3-273C U+042A # CYRILLIC CAPITAL LETTER HARD SIGN
+3-273D U+042B # CYRILLIC CAPITAL LETTER YERU
+3-273E U+042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+3-273F U+042D # CYRILLIC CAPITAL LETTER E
+3-2740 U+042E # CYRILLIC CAPITAL LETTER YU
+3-2741 U+042F # CYRILLIC CAPITAL LETTER YA
+3-2742 U+23BE # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT [2000] [Unicode3.2]
+3-2743 U+23BF # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT [2000] [Unicode3.2]
+3-2744 U+23C0 # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE [2000] [Unicode3.2]
+3-2745 U+23C1 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2]
+3-2746 U+23C2 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2]
+3-2747 U+23C3 # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE [2000] [Unicode3.2]
+3-2748 U+23C4 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2]
+3-2749 U+23C5 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2]
+3-274A U+23C6 # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE [2000] [Unicode3.2]
+3-274B U+23C7 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE [2000] [Unicode3.2]
+3-274C U+23C8 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE [2000] [Unicode3.2]
+3-274D U+23C9 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL [2000] [Unicode3.2]
+3-274E U+23CA # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL [2000] [Unicode3.2]
+3-274F U+23CB # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT [2000] [Unicode3.2]
+3-2750 U+23CC # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT [2000] [Unicode3.2]
+3-2751 U+0430 # CYRILLIC SMALL LETTER A
+3-2752 U+0431 # CYRILLIC SMALL LETTER BE
+3-2753 U+0432 # CYRILLIC SMALL LETTER VE
+3-2754 U+0433 # CYRILLIC SMALL LETTER GHE
+3-2755 U+0434 # CYRILLIC SMALL LETTER DE
+3-2756 U+0435 # CYRILLIC SMALL LETTER IE
+3-2757 U+0451 # CYRILLIC SMALL LETTER IO
+3-2758 U+0436 # CYRILLIC SMALL LETTER ZHE
+3-2759 U+0437 # CYRILLIC SMALL LETTER ZE
+3-275A U+0438 # CYRILLIC SMALL LETTER I
+3-275B U+0439 # CYRILLIC SMALL LETTER SHORT I
+3-275C U+043A # CYRILLIC SMALL LETTER KA
+3-275D U+043B # CYRILLIC SMALL LETTER EL
+3-275E U+043C # CYRILLIC SMALL LETTER EM
+3-275F U+043D # CYRILLIC SMALL LETTER EN
+3-2760 U+043E # CYRILLIC SMALL LETTER O
+3-2761 U+043F # CYRILLIC SMALL LETTER PE
+3-2762 U+0440 # CYRILLIC SMALL LETTER ER
+3-2763 U+0441 # CYRILLIC SMALL LETTER ES
+3-2764 U+0442 # CYRILLIC SMALL LETTER TE
+3-2765 U+0443 # CYRILLIC SMALL LETTER U
+3-2766 U+0444 # CYRILLIC SMALL LETTER EF
+3-2767 U+0445 # CYRILLIC SMALL LETTER HA
+3-2768 U+0446 # CYRILLIC SMALL LETTER TSE
+3-2769 U+0447 # CYRILLIC SMALL LETTER CHE
+3-276A U+0448 # CYRILLIC SMALL LETTER SHA
+3-276B U+0449 # CYRILLIC SMALL LETTER SHCHA
+3-276C U+044A # CYRILLIC SMALL LETTER HARD SIGN
+3-276D U+044B # CYRILLIC SMALL LETTER YERU
+3-276E U+044C # CYRILLIC SMALL LETTER SOFT SIGN
+3-276F U+044D # CYRILLIC SMALL LETTER E
+3-2770 U+044E # CYRILLIC SMALL LETTER YU
+3-2771 U+044F # CYRILLIC SMALL LETTER YA
+3-2772 U+30F7 # KATAKANA LETTER VA [2000]
+3-2773 U+30F8 # KATAKANA LETTER VI [2000]
+3-2774 U+30F9 # KATAKANA LETTER VE [2000]
+3-2775 U+30FA # KATAKANA LETTER VO [2000]
+3-2776 U+22DA # LESS-THAN EQUAL TO OR GREATER-THAN [2000]
+3-2777 U+22DB # GREATER-THAN EQUAL TO OR LESS-THAN [2000]
+3-2778 U+2153 # VULGAR FRACTION ONE THIRD [2000]
+3-2779 U+2154 # VULGAR FRACTION TWO THIRDS [2000]
+3-277A U+2155 # VULGAR FRACTION ONE FIFTH [2000]
+3-277B U+2713 # CHECK MARK [2000]
+3-277C U+2318 # PLACE OF INTEREST SIGN [2000]
+3-277D U+2423 # OPEN BOX [2000]
+3-277E U+23CE # RETURN SYMBOL [2000] [Unicode3.2]
+3-2821 U+2500 # BOX DRAWINGS LIGHT HORIZONTAL [1983]
+3-2822 U+2502 # BOX DRAWINGS LIGHT VERTICAL [1983]
+3-2823 U+250C # BOX DRAWINGS LIGHT DOWN AND RIGHT [1983]
+3-2824 U+2510 # BOX DRAWINGS LIGHT DOWN AND LEFT [1983]
+3-2825 U+2518 # BOX DRAWINGS LIGHT UP AND LEFT [1983]
+3-2826 U+2514 # BOX DRAWINGS LIGHT UP AND RIGHT [1983]
+3-2827 U+251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT [1983]
+3-2828 U+252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL [1983]
+3-2829 U+2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT [1983]
+3-282A U+2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL [1983]
+3-282B U+253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL [1983]
+3-282C U+2501 # BOX DRAWINGS HEAVY HORIZONTAL [1983]
+3-282D U+2503 # BOX DRAWINGS HEAVY VERTICAL [1983]
+3-282E U+250F # BOX DRAWINGS HEAVY DOWN AND RIGHT [1983]
+3-282F U+2513 # BOX DRAWINGS HEAVY DOWN AND LEFT [1983]
+3-2830 U+251B # BOX DRAWINGS HEAVY UP AND LEFT [1983]
+3-2831 U+2517 # BOX DRAWINGS HEAVY UP AND RIGHT [1983]
+3-2832 U+2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT [1983]
+3-2833 U+2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL [1983]
+3-2834 U+252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT [1983]
+3-2835 U+253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL [1983]
+3-2836 U+254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL [1983]
+3-2837 U+2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT [1983]
+3-2838 U+252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY [1983]
+3-2839 U+2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT [1983]
+3-283A U+2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY [1983]
+3-283B U+253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY [1983]
+3-283C U+251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY [1983]
+3-283D U+2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT [1983]
+3-283E U+2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY [1983]
+3-283F U+2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT [1983]
+3-2840 U+2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT [1983]
+3-2841 U+3251 # CIRCLED NUMBER TWENTY ONE [2000] [Unicode3.2]
+3-2842 U+3252 # CIRCLED NUMBER TWENTY TWO [2000] [Unicode3.2]
+3-2843 U+3253 # CIRCLED NUMBER TWENTY THREE [2000] [Unicode3.2]
+3-2844 U+3254 # CIRCLED NUMBER TWENTY FOUR [2000] [Unicode3.2]
+3-2845 U+3255 # CIRCLED NUMBER TWENTY FIVE [2000] [Unicode3.2]
+3-2846 U+3256 # CIRCLED NUMBER TWENTY SIX [2000] [Unicode3.2]
+3-2847 U+3257 # CIRCLED NUMBER TWENTY SEVEN [2000] [Unicode3.2]
+3-2848 U+3258 # CIRCLED NUMBER TWENTY EIGHT [2000] [Unicode3.2]
+3-2849 U+3259 # CIRCLED NUMBER TWENTY NINE [2000] [Unicode3.2]
+3-284A U+325A # CIRCLED NUMBER THIRTY [2000] [Unicode3.2]
+3-284B U+325B # CIRCLED NUMBER THIRTY ONE [2000] [Unicode3.2]
+3-284C U+325C # CIRCLED NUMBER THIRTY TWO [2000] [Unicode3.2]
+3-284D U+325D # CIRCLED NUMBER THIRTY THREE [2000] [Unicode3.2]
+3-284E U+325E # CIRCLED NUMBER THIRTY FOUR [2000] [Unicode3.2]
+3-284F U+325F # CIRCLED NUMBER THIRTY FIVE [2000] [Unicode3.2]
+3-2850 U+32B1 # CIRCLED NUMBER THIRTY SIX [2000] [Unicode3.2]
+3-2851 U+32B2 # CIRCLED NUMBER THIRTY SEVEN [2000] [Unicode3.2]
+3-2852 U+32B3 # CIRCLED NUMBER THIRTY EIGHT [2000] [Unicode3.2]
+3-2853 U+32B4 # CIRCLED NUMBER THIRTY NINE [2000] [Unicode3.2]
+3-2854 U+32B5 # CIRCLED NUMBER FORTY [2000] [Unicode3.2]
+3-2855 U+32B6 # CIRCLED NUMBER FORTY ONE [2000] [Unicode3.2]
+3-2856 U+32B7 # CIRCLED NUMBER FORTY TWO [2000] [Unicode3.2]
+3-2857 U+32B8 # CIRCLED NUMBER FORTY THREE [2000] [Unicode3.2]
+3-2858 U+32B9 # CIRCLED NUMBER FORTY FOUR [2000] [Unicode3.2]
+3-2859 U+32BA # CIRCLED NUMBER FORTY FIVE [2000] [Unicode3.2]
+3-285A U+32BB # CIRCLED NUMBER FORTY SIX [2000] [Unicode3.2]
+3-285B U+32BC # CIRCLED NUMBER FORTY SEVEN [2000] [Unicode3.2]
+3-285C U+32BD # CIRCLED NUMBER FORTY EIGHT [2000] [Unicode3.2]
+3-285D U+32BE # CIRCLED NUMBER FORTY NINE [2000] [Unicode3.2]
+3-285E U+32BF # CIRCLED NUMBER FIFTY [2000] [Unicode3.2]
+3-285F # <reserved>
+3-2860 # <reserved>
+3-2861 # <reserved>
+3-2862 # <reserved>
+3-2863 # <reserved>
+3-2864 # <reserved>
+3-2865 # <reserved>
+3-2866 # <reserved>
+3-2867 U+25D0 # CIRCLE WITH LEFT HALF BLACK [2000]
+3-2868 U+25D1 # CIRCLE WITH RIGHT HALF BLACK [2000]
+3-2869 U+25D2 # CIRCLE WITH LOWER HALF BLACK [2000]
+3-286A U+25D3 # CIRCLE WITH UPPER HALF BLACK [2000]
+3-286B U+203C # DOUBLE EXCLAMATION MARK [2000]
+3-286C U+2047 # DOUBLE QUESTION MARK [2000] [Unicode3.2]
+3-286D U+2048 # QUESTION EXCLAMATION MARK [2000]
+3-286E U+2049 # EXCLAMATION QUESTION MARK [2000]
+3-286F U+01CD # LATIN CAPITAL LETTER A WITH CARON [2000]
+3-2870 U+01CE # LATIN SMALL LETTER A WITH CARON [2000]
+3-2871 U+01D0 # LATIN SMALL LETTER I WITH CARON [2000]
+3-2872 U+1E3E # LATIN CAPITAL LETTER M WITH ACUTE [2000]
+3-2873 U+1E3F # LATIN SMALL LETTER M WITH ACUTE [2000]
+3-2874 U+01F8 # LATIN CAPITAL LETTER N WITH GRAVE [2000]
+3-2875 U+01F9 # LATIN SMALL LETTER N WITH GRAVE [2000]
+3-2876 U+01D1 # LATIN CAPITAL LETTER O WITH CARON [2000]
+3-2877 U+01D2 # LATIN SMALL LETTER O WITH CARON [2000]
+3-2878 U+01D4 # LATIN SMALL LETTER U WITH CARON [2000]
+3-2879 U+01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON [2000]
+3-287A U+01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE [2000]
+3-287B U+01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON [2000]
+3-287C U+01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE [2000]
+3-287D # <reserved>
+3-287E # <reserved>
+3-2921 U+20AC # EURO SIGN [2000]
+3-2922 U+00A0 # NO-BREAK SPACE [2000]
+3-2923 U+00A1 # INVERTED EXCLAMATION MARK [2000]
+3-2924 U+00A4 # CURRENCY SIGN [2000]
+3-2925 U+00A6 # BROKEN BAR [2000]
+3-2926 U+00A9 # COPYRIGHT SIGN [2000]
+3-2927 U+00AA # FEMININE ORDINAL INDICATOR [2000]
+3-2928 U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK [2000]
+3-2929 U+00AD # SOFT HYPHEN [2000]
+3-292A U+00AE # REGISTERED SIGN [2000]
+3-292B U+00AF # MACRON [2000]
+3-292C U+00B2 # SUPERSCRIPT TWO [2000]
+3-292D U+00B3 # SUPERSCRIPT THREE [2000]
+3-292E U+00B7 # MIDDLE DOT [2000]
+3-292F U+00B8 # CEDILLA [2000]
+3-2930 U+00B9 # SUPERSCRIPT ONE [2000]
+3-2931 U+00BA # MASCULINE ORDINAL INDICATOR [2000]
+3-2932 U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK [2000]
+3-2933 U+00BC # VULGAR FRACTION ONE QUARTER [2000]
+3-2934 U+00BD # VULGAR FRACTION ONE HALF [2000]
+3-2935 U+00BE # VULGAR FRACTION THREE QUARTERS [2000]
+3-2936 U+00BF # INVERTED QUESTION MARK [2000]
+3-2937 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE [2000]
+3-2938 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE [2000]
+3-2939 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX [2000]
+3-293A U+00C3 # LATIN CAPITAL LETTER A WITH TILDE [2000]
+3-293B U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS [2000]
+3-293C U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE [2000]
+3-293D U+00C6 # LATIN CAPITAL LETTER AE [2000]
+3-293E U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA [2000]
+3-293F U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE [2000]
+3-2940 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE [2000]
+3-2941 U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX [2000]
+3-2942 U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS [2000]
+3-2943 U+00CC # LATIN CAPITAL LETTER I WITH GRAVE [2000]
+3-2944 U+00CD # LATIN CAPITAL LETTER I WITH ACUTE [2000]
+3-2945 U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX [2000]
+3-2946 U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS [2000]
+3-2947 U+00D0 # LATIN CAPITAL LETTER ETH [2000]
+3-2948 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE [2000]
+3-2949 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE [2000]
+3-294A U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE [2000]
+3-294B U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX [2000]
+3-294C U+00D5 # LATIN CAPITAL LETTER O WITH TILDE [2000]
+3-294D U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS [2000]
+3-294E U+00D8 # LATIN CAPITAL LETTER O WITH STROKE [2000]
+3-294F U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE [2000]
+3-2950 U+00DA # LATIN CAPITAL LETTER U WITH ACUTE [2000]
+3-2951 U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX [2000]
+3-2952 U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS [2000]
+3-2953 U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE [2000]
+3-2954 U+00DE # LATIN CAPITAL LETTER THORN [2000]
+3-2955 U+00DF # LATIN SMALL LETTER SHARP S [2000]
+3-2956 U+00E0 # LATIN SMALL LETTER A WITH GRAVE [2000]
+3-2957 U+00E1 # LATIN SMALL LETTER A WITH ACUTE [2000]
+3-2958 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX [2000]
+3-2959 U+00E3 # LATIN SMALL LETTER A WITH TILDE [2000]
+3-295A U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS [2000]
+3-295B U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE [2000]
+3-295C U+00E6 # LATIN SMALL LETTER AE [2000]
+3-295D U+00E7 # LATIN SMALL LETTER C WITH CEDILLA [2000]
+3-295E U+00E8 # LATIN SMALL LETTER E WITH GRAVE [2000]
+3-295F U+00E9 # LATIN SMALL LETTER E WITH ACUTE [2000]
+3-2960 U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX [2000]
+3-2961 U+00EB # LATIN SMALL LETTER E WITH DIAERESIS [2000]
+3-2962 U+00EC # LATIN SMALL LETTER I WITH GRAVE [2000]
+3-2963 U+00ED # LATIN SMALL LETTER I WITH ACUTE [2000]
+3-2964 U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX [2000]
+3-2965 U+00EF # LATIN SMALL LETTER I WITH DIAERESIS [2000]
+3-2966 U+00F0 # LATIN SMALL LETTER ETH [2000]
+3-2967 U+00F1 # LATIN SMALL LETTER N WITH TILDE [2000]
+3-2968 U+00F2 # LATIN SMALL LETTER O WITH GRAVE [2000]
+3-2969 U+00F3 # LATIN SMALL LETTER O WITH ACUTE [2000]
+3-296A U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX [2000]
+3-296B U+00F5 # LATIN SMALL LETTER O WITH TILDE [2000]
+3-296C U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS [2000]
+3-296D U+00F8 # LATIN SMALL LETTER O WITH STROKE [2000]
+3-296E U+00F9 # LATIN SMALL LETTER U WITH GRAVE [2000]
+3-296F U+00FA # LATIN SMALL LETTER U WITH ACUTE [2000]
+3-2970 U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX [2000]
+3-2971 U+00FC # LATIN SMALL LETTER U WITH DIAERESIS [2000]
+3-2972 U+00FD # LATIN SMALL LETTER Y WITH ACUTE [2000]
+3-2973 U+00FE # LATIN SMALL LETTER THORN [2000]
+3-2974 U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS [2000]
+3-2975 U+0100 # LATIN CAPITAL LETTER A WITH MACRON [2000]
+3-2976 U+012A # LATIN CAPITAL LETTER I WITH MACRON [2000]
+3-2977 U+016A # LATIN CAPITAL LETTER U WITH MACRON [2000]
+3-2978 U+0112 # LATIN CAPITAL LETTER E WITH MACRON [2000]
+3-2979 U+014C # LATIN CAPITAL LETTER O WITH MACRON [2000]
+3-297A U+0101 # LATIN SMALL LETTER A WITH MACRON [2000]
+3-297B U+012B # LATIN SMALL LETTER I WITH MACRON [2000]
+3-297C U+016B # LATIN SMALL LETTER U WITH MACRON [2000]
+3-297D U+0113 # LATIN SMALL LETTER E WITH MACRON [2000]
+3-297E U+014D # LATIN SMALL LETTER O WITH MACRON [2000]
+3-2A21 U+0104 # LATIN CAPITAL LETTER A WITH OGONEK [2000]
+3-2A22 U+02D8 # BREVE [2000]
+3-2A23 U+0141 # LATIN CAPITAL LETTER L WITH STROKE [2000]
+3-2A24 U+013D # LATIN CAPITAL LETTER L WITH CARON [2000]
+3-2A25 U+015A # LATIN CAPITAL LETTER S WITH ACUTE [2000]
+3-2A26 U+0160 # LATIN CAPITAL LETTER S WITH CARON [2000]
+3-2A27 U+015E # LATIN CAPITAL LETTER S WITH CEDILLA [2000]
+3-2A28 U+0164 # LATIN CAPITAL LETTER T WITH CARON [2000]
+3-2A29 U+0179 # LATIN CAPITAL LETTER Z WITH ACUTE [2000]
+3-2A2A U+017D # LATIN CAPITAL LETTER Z WITH CARON [2000]
+3-2A2B U+017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE [2000]
+3-2A2C U+0105 # LATIN SMALL LETTER A WITH OGONEK [2000]
+3-2A2D U+02DB # OGONEK [2000]
+3-2A2E U+0142 # LATIN SMALL LETTER L WITH STROKE [2000]
+3-2A2F U+013E # LATIN SMALL LETTER L WITH CARON [2000]
+3-2A30 U+015B # LATIN SMALL LETTER S WITH ACUTE [2000]
+3-2A31 U+02C7 # CARON [2000]
+3-2A32 U+0161 # LATIN SMALL LETTER S WITH CARON [2000]
+3-2A33 U+015F # LATIN SMALL LETTER S WITH CEDILLA [2000]
+3-2A34 U+0165 # LATIN SMALL LETTER T WITH CARON [2000]
+3-2A35 U+017A # LATIN SMALL LETTER Z WITH ACUTE [2000]
+3-2A36 U+02DD # DOUBLE ACUTE ACCENT [2000]
+3-2A37 U+017E # LATIN SMALL LETTER Z WITH CARON [2000]
+3-2A38 U+017C # LATIN SMALL LETTER Z WITH DOT ABOVE [2000]
+3-2A39 U+0154 # LATIN CAPITAL LETTER R WITH ACUTE [2000]
+3-2A3A U+0102 # LATIN CAPITAL LETTER A WITH BREVE [2000]
+3-2A3B U+0139 # LATIN CAPITAL LETTER L WITH ACUTE [2000]
+3-2A3C U+0106 # LATIN CAPITAL LETTER C WITH ACUTE [2000]
+3-2A3D U+010C # LATIN CAPITAL LETTER C WITH CARON [2000]
+3-2A3E U+0118 # LATIN CAPITAL LETTER E WITH OGONEK [2000]
+3-2A3F U+011A # LATIN CAPITAL LETTER E WITH CARON [2000]
+3-2A40 U+010E # LATIN CAPITAL LETTER D WITH CARON [2000]
+3-2A41 U+0143 # LATIN CAPITAL LETTER N WITH ACUTE [2000]
+3-2A42 U+0147 # LATIN CAPITAL LETTER N WITH CARON [2000]
+3-2A43 U+0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE [2000]
+3-2A44 U+0158 # LATIN CAPITAL LETTER R WITH CARON [2000]
+3-2A45 U+016E # LATIN CAPITAL LETTER U WITH RING ABOVE [2000]
+3-2A46 U+0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE [2000]
+3-2A47 U+0162 # LATIN CAPITAL LETTER T WITH CEDILLA [2000]
+3-2A48 U+0155 # LATIN SMALL LETTER R WITH ACUTE [2000]
+3-2A49 U+0103 # LATIN SMALL LETTER A WITH BREVE [2000]
+3-2A4A U+013A # LATIN SMALL LETTER L WITH ACUTE [2000]
+3-2A4B U+0107 # LATIN SMALL LETTER C WITH ACUTE [2000]
+3-2A4C U+010D # LATIN SMALL LETTER C WITH CARON [2000]
+3-2A4D U+0119 # LATIN SMALL LETTER E WITH OGONEK [2000]
+3-2A4E U+011B # LATIN SMALL LETTER E WITH CARON [2000]
+3-2A4F U+010F # LATIN SMALL LETTER D WITH CARON [2000]
+3-2A50 U+0111 # LATIN SMALL LETTER D WITH STROKE [2000]
+3-2A51 U+0144 # LATIN SMALL LETTER N WITH ACUTE [2000]
+3-2A52 U+0148 # LATIN SMALL LETTER N WITH CARON [2000]
+3-2A53 U+0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE [2000]
+3-2A54 U+0159 # LATIN SMALL LETTER R WITH CARON [2000]
+3-2A55 U+016F # LATIN SMALL LETTER U WITH RING ABOVE [2000]
+3-2A56 U+0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE [2000]
+3-2A57 U+0163 # LATIN SMALL LETTER T WITH CEDILLA [2000]
+3-2A58 U+02D9 # DOT ABOVE [2000]
+3-2A59 U+0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX [2000]
+3-2A5A U+011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX [2000]
+3-2A5B U+0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX [2000]
+3-2A5C U+0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX [2000]
+3-2A5D U+015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX [2000]
+3-2A5E U+016C # LATIN CAPITAL LETTER U WITH BREVE [2000]
+3-2A5F U+0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX [2000]
+3-2A60 U+011D # LATIN SMALL LETTER G WITH CIRCUMFLEX [2000]
+3-2A61 U+0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX [2000]
+3-2A62 U+0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX [2000]
+3-2A63 U+015D # LATIN SMALL LETTER S WITH CIRCUMFLEX [2000]
+3-2A64 U+016D # LATIN SMALL LETTER U WITH BREVE [2000]
+3-2A65 U+0271 # LATIN SMALL LETTER M WITH HOOK [2000]
+3-2A66 U+028B # LATIN SMALL LETTER V WITH HOOK [2000]
+3-2A67 U+027E # LATIN SMALL LETTER R WITH FISHHOOK [2000]
+3-2A68 U+0283 # LATIN SMALL LETTER ESH [2000]
+3-2A69 U+0292 # LATIN SMALL LETTER EZH [2000]
+3-2A6A U+026C # LATIN SMALL LETTER L WITH BELT [2000]
+3-2A6B U+026E # LATIN SMALL LETTER LEZH [2000]
+3-2A6C U+0279 # LATIN SMALL LETTER TURNED R [2000]
+3-2A6D U+0288 # LATIN SMALL LETTER T WITH RETROFLEX HOOK [2000]
+3-2A6E U+0256 # LATIN SMALL LETTER D WITH TAIL [2000]
+3-2A6F U+0273 # LATIN SMALL LETTER N WITH RETROFLEX HOOK [2000]
+3-2A70 U+027D # LATIN SMALL LETTER R WITH TAIL [2000]
+3-2A71 U+0282 # LATIN SMALL LETTER S WITH HOOK [2000]
+3-2A72 U+0290 # LATIN SMALL LETTER Z WITH RETROFLEX HOOK [2000]
+3-2A73 U+027B # LATIN SMALL LETTER TURNED R WITH HOOK [2000]
+3-2A74 U+026D # LATIN SMALL LETTER L WITH RETROFLEX HOOK [2000]
+3-2A75 U+025F # LATIN SMALL LETTER DOTLESS J WITH STROKE [2000]
+3-2A76 U+0272 # LATIN SMALL LETTER N WITH LEFT HOOK [2000]
+3-2A77 U+029D # LATIN SMALL LETTER J WITH CROSSED-TAIL [2000]
+3-2A78 U+028E # LATIN SMALL LETTER TURNED Y [2000]
+3-2A79 U+0261 # LATIN SMALL LETTER SCRIPT G [2000]
+3-2A7A U+014B # LATIN SMALL LETTER ENG [2000]
+3-2A7B U+0270 # LATIN SMALL LETTER TURNED M WITH LONG LEG [2000]
+3-2A7C U+0281 # LATIN LETTER SMALL CAPITAL INVERTED R [2000]
+3-2A7D U+0127 # LATIN SMALL LETTER H WITH STROKE [2000]
+3-2A7E U+0295 # LATIN LETTER PHARYNGEAL VOICED FRICATIVE [2000]
+3-2B21 U+0294 # LATIN LETTER GLOTTAL STOP [2000]
+3-2B22 U+0266 # LATIN SMALL LETTER H WITH HOOK [2000]
+3-2B23 U+0298 # LATIN LETTER BILABIAL CLICK [2000]
+3-2B24 U+01C2 # LATIN LETTER ALVEOLAR CLICK [2000]
+3-2B25 U+0253 # LATIN SMALL LETTER B WITH HOOK [2000]
+3-2B26 U+0257 # LATIN SMALL LETTER D WITH HOOK [2000]
+3-2B27 U+0284 # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK [2000]
+3-2B28 U+0260 # LATIN SMALL LETTER G WITH HOOK [2000]
+3-2B29 U+0193 # LATIN CAPITAL LETTER G WITH HOOK [2000]
+3-2B2A U+0153 # LATIN SMALL LIGATURE OE [2000]
+3-2B2B U+0152 # LATIN CAPITAL LIGATURE OE [2000]
+3-2B2C U+0268 # LATIN SMALL LETTER I WITH STROKE [2000]
+3-2B2D U+0289 # LATIN SMALL LETTER U BAR [2000]
+3-2B2E U+0258 # LATIN SMALL LETTER REVERSED E [2000]
+3-2B2F U+0275 # LATIN SMALL LETTER BARRED O [2000]
+3-2B30 U+0259 # LATIN SMALL LETTER SCHWA [2000]
+3-2B31 U+025C # LATIN SMALL LETTER REVERSED OPEN E [2000]
+3-2B32 U+025E # LATIN SMALL LETTER CLOSED REVERSED OPEN E [2000]
+3-2B33 U+0250 # LATIN SMALL LETTER TURNED A [2000]
+3-2B34 U+026F # LATIN SMALL LETTER TURNED M [2000]
+3-2B35 U+028A # LATIN SMALL LETTER UPSILON [2000]
+3-2B36 U+0264 # LATIN SMALL LETTER RAMS HORN [2000]
+3-2B37 U+028C # LATIN SMALL LETTER TURNED V [2000]
+3-2B38 U+0254 # LATIN SMALL LETTER OPEN O [2000]
+3-2B39 U+0251 # LATIN SMALL LETTER ALPHA [2000]
+3-2B3A U+0252 # LATIN SMALL LETTER TURNED ALPHA [2000]
+3-2B3B U+028D # LATIN SMALL LETTER TURNED W [2000]
+3-2B3C U+0265 # LATIN SMALL LETTER TURNED H [2000]
+3-2B3D U+02A2 # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE [2000]
+3-2B3E U+02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE [2000]
+3-2B3F U+0255 # LATIN SMALL LETTER C WITH CURL [2000]
+3-2B40 U+0291 # LATIN SMALL LETTER Z WITH CURL [2000]
+3-2B41 U+027A # LATIN SMALL LETTER TURNED R WITH LONG LEG [2000]
+3-2B42 U+0267 # LATIN SMALL LETTER HENG WITH HOOK [2000]
+3-2B43 U+025A # LATIN SMALL LETTER SCHWA WITH HOOK [2000]
+3-2B44 U+00E6+0300 # [2000]
+3-2B45 U+01FD # LATIN SMALL LETTER AE WITH ACUTE [2000]
+3-2B46 U+1F70 # GREEK SMALL LETTER ALPHA WITH VARIA [2000]
+3-2B47 U+1F71 # GREEK SMALL LETTER ALPHA WITH OXIA [2000]
+3-2B48 U+0254+0300 # [2000]
+3-2B49 U+0254+0301 # [2000]
+3-2B4A U+028C+0300 # [2000]
+3-2B4B U+028C+0301 # [2000]
+3-2B4C U+0259+0300 # [2000]
+3-2B4D U+0259+0301 # [2000]
+3-2B4E U+025A+0300 # [2000]
+3-2B4F U+025A+0301 # [2000]
+3-2B50 U+1F72 # GREEK SMALL LETTER EPSILON WITH VARIA [2000]
+3-2B51 U+1F73 # GREEK SMALL LETTER EPSILON WITH OXIA [2000]
+3-2B52 U+0361 # COMBINING DOUBLE INVERTED BREVE [2000]
+3-2B53 U+02C8 # MODIFIER LETTER VERTICAL LINE [2000]
+3-2B54 U+02CC # MODIFIER LETTER LOW VERTICAL LINE [2000]
+3-2B55 U+02D0 # MODIFIER LETTER TRIANGULAR COLON [2000]
+3-2B56 U+02D1 # MODIFIER LETTER HALF TRIANGULAR COLON [2000]
+3-2B57 U+0306 # COMBINING BREVE [2000]
+3-2B58 U+203F # UNDERTIE [2000]
+3-2B59 U+030B # COMBINING DOUBLE ACUTE ACCENT [2000]
+3-2B5A U+0301 # COMBINING ACUTE ACCENT [2000]
+3-2B5B U+0304 # COMBINING MACRON [2000]
+3-2B5C U+0300 # COMBINING GRAVE ACCENT [2000]
+3-2B5D U+030F # COMBINING DOUBLE GRAVE ACCENT [2000]
+3-2B5E U+030C # COMBINING CARON [2000]
+3-2B5F U+0302 # COMBINING CIRCUMFLEX ACCENT [2000]
+3-2B60 U+02E5 # MODIFIER LETTER EXTRA-HIGH TONE BAR [2000]
+3-2B61 U+02E6 # MODIFIER LETTER HIGH TONE BAR [2000]
+3-2B62 U+02E7 # MODIFIER LETTER MID TONE BAR [2000]
+3-2B63 U+02E8 # MODIFIER LETTER LOW TONE BAR [2000]
+3-2B64 U+02E9 # MODIFIER LETTER EXTRA-LOW TONE BAR [2000]
+3-2B65 U+02E9+02E5 # [2000]
+3-2B66 U+02E5+02E9 # [2000]
+3-2B67 U+0325 # COMBINING RING BELOW [2000]
+3-2B68 U+032C # COMBINING CARON BELOW [2000]
+3-2B69 U+0339 # COMBINING RIGHT HALF RING BELOW [2000]
+3-2B6A U+031C # COMBINING LEFT HALF RING BELOW [2000]
+3-2B6B U+031F # COMBINING PLUS SIGN BELOW [2000]
+3-2B6C U+0320 # COMBINING MINUS SIGN BELOW [2000]
+3-2B6D U+0308 # COMBINING DIAERESIS [2000]
+3-2B6E U+033D # COMBINING X ABOVE [2000]
+3-2B6F U+0329 # COMBINING VERTICAL LINE BELOW [2000]
+3-2B70 U+032F # COMBINING INVERTED BREVE BELOW [2000]
+3-2B71 U+02DE # MODIFIER LETTER RHOTIC HOOK [2000]
+3-2B72 U+0324 # COMBINING DIAERESIS BELOW [2000]
+3-2B73 U+0330 # COMBINING TILDE BELOW [2000]
+3-2B74 U+033C # COMBINING SEAGULL BELOW [2000]
+3-2B75 U+0334 # COMBINING TILDE OVERLAY [2000]
+3-2B76 U+031D # COMBINING UP TACK BELOW [2000]
+3-2B77 U+031E # COMBINING DOWN TACK BELOW [2000]
+3-2B78 U+0318 # COMBINING LEFT TACK BELOW [2000]
+3-2B79 U+0319 # COMBINING RIGHT TACK BELOW [2000]
+3-2B7A U+032A # COMBINING BRIDGE BELOW [2000]
+3-2B7B U+033A # COMBINING INVERTED BRIDGE BELOW [2000]
+3-2B7C U+033B # COMBINING SQUARE BELOW [2000]
+3-2B7D U+0303 # COMBINING TILDE [2000]
+3-2B7E U+031A # COMBINING LEFT ANGLE ABOVE [2000]
+3-2C21 U+2776 # DINGBAT NEGATIVE CIRCLED DIGIT ONE [2000]
+3-2C22 U+2777 # DINGBAT NEGATIVE CIRCLED DIGIT TWO [2000]
+3-2C23 U+2778 # DINGBAT NEGATIVE CIRCLED DIGIT THREE [2000]
+3-2C24 U+2779 # DINGBAT NEGATIVE CIRCLED DIGIT FOUR [2000]
+3-2C25 U+277A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE [2000]
+3-2C26 U+277B # DINGBAT NEGATIVE CIRCLED DIGIT SIX [2000]
+3-2C27 U+277C # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN [2000]
+3-2C28 U+277D # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT [2000]
+3-2C29 U+277E # DINGBAT NEGATIVE CIRCLED DIGIT NINE [2000]
+3-2C2A U+277F # DINGBAT NEGATIVE CIRCLED NUMBER TEN [2000]
+3-2C2B U+24EB # NEGATIVE CIRCLED NUMBER ELEVEN [2000] [Unicode3.2]
+3-2C2C U+24EC # NEGATIVE CIRCLED NUMBER TWELVE [2000] [Unicode3.2]
+3-2C2D U+24ED # NEGATIVE CIRCLED NUMBER THIRTEEN [2000] [Unicode3.2]
+3-2C2E U+24EE # NEGATIVE CIRCLED NUMBER FOURTEEN [2000] [Unicode3.2]
+3-2C2F U+24EF # NEGATIVE CIRCLED NUMBER FIFTEEN [2000] [Unicode3.2]
+3-2C30 U+24F0 # NEGATIVE CIRCLED NUMBER SIXTEEN [2000] [Unicode3.2]
+3-2C31 U+24F1 # NEGATIVE CIRCLED NUMBER SEVENTEEN [2000] [Unicode3.2]
+3-2C32 U+24F2 # NEGATIVE CIRCLED NUMBER EIGHTEEN [2000] [Unicode3.2]
+3-2C33 U+24F3 # NEGATIVE CIRCLED NUMBER NINETEEN [2000] [Unicode3.2]
+3-2C34 U+24F4 # NEGATIVE CIRCLED NUMBER TWENTY [2000] [Unicode3.2]
+3-2C35 U+2170 # SMALL ROMAN NUMERAL ONE [2000]
+3-2C36 U+2171 # SMALL ROMAN NUMERAL TWO [2000]
+3-2C37 U+2172 # SMALL ROMAN NUMERAL THREE [2000]
+3-2C38 U+2173 # SMALL ROMAN NUMERAL FOUR [2000]
+3-2C39 U+2174 # SMALL ROMAN NUMERAL FIVE [2000]
+3-2C3A U+2175 # SMALL ROMAN NUMERAL SIX [2000]
+3-2C3B U+2176 # SMALL ROMAN NUMERAL SEVEN [2000]
+3-2C3C U+2177 # SMALL ROMAN NUMERAL EIGHT [2000]
+3-2C3D U+2178 # SMALL ROMAN NUMERAL NINE [2000]
+3-2C3E U+2179 # SMALL ROMAN NUMERAL TEN [2000]
+3-2C3F U+217A # SMALL ROMAN NUMERAL ELEVEN [2000]
+3-2C40 U+217B # SMALL ROMAN NUMERAL TWELVE [2000]
+3-2C41 U+24D0 # CIRCLED LATIN SMALL LETTER A [2000]
+3-2C42 U+24D1 # CIRCLED LATIN SMALL LETTER B [2000]
+3-2C43 U+24D2 # CIRCLED LATIN SMALL LETTER C [2000]
+3-2C44 U+24D3 # CIRCLED LATIN SMALL LETTER D [2000]
+3-2C45 U+24D4 # CIRCLED LATIN SMALL LETTER E [2000]
+3-2C46 U+24D5 # CIRCLED LATIN SMALL LETTER F [2000]
+3-2C47 U+24D6 # CIRCLED LATIN SMALL LETTER G [2000]
+3-2C48 U+24D7 # CIRCLED LATIN SMALL LETTER H [2000]
+3-2C49 U+24D8 # CIRCLED LATIN SMALL LETTER I [2000]
+3-2C4A U+24D9 # CIRCLED LATIN SMALL LETTER J [2000]
+3-2C4B U+24DA # CIRCLED LATIN SMALL LETTER K [2000]
+3-2C4C U+24DB # CIRCLED LATIN SMALL LETTER L [2000]
+3-2C4D U+24DC # CIRCLED LATIN SMALL LETTER M [2000]
+3-2C4E U+24DD # CIRCLED LATIN SMALL LETTER N [2000]
+3-2C4F U+24DE # CIRCLED LATIN SMALL LETTER O [2000]
+3-2C50 U+24DF # CIRCLED LATIN SMALL LETTER P [2000]
+3-2C51 U+24E0 # CIRCLED LATIN SMALL LETTER Q [2000]
+3-2C52 U+24E1 # CIRCLED LATIN SMALL LETTER R [2000]
+3-2C53 U+24E2 # CIRCLED LATIN SMALL LETTER S [2000]
+3-2C54 U+24E3 # CIRCLED LATIN SMALL LETTER T [2000]
+3-2C55 U+24E4 # CIRCLED LATIN SMALL LETTER U [2000]
+3-2C56 U+24E5 # CIRCLED LATIN SMALL LETTER V [2000]
+3-2C57 U+24E6 # CIRCLED LATIN SMALL LETTER W [2000]
+3-2C58 U+24E7 # CIRCLED LATIN SMALL LETTER X [2000]
+3-2C59 U+24E8 # CIRCLED LATIN SMALL LETTER Y [2000]
+3-2C5A U+24E9 # CIRCLED LATIN SMALL LETTER Z [2000]
+3-2C5B U+32D0 # CIRCLED KATAKANA A [2000]
+3-2C5C U+32D1 # CIRCLED KATAKANA I [2000]
+3-2C5D U+32D2 # CIRCLED KATAKANA U [2000]
+3-2C5E U+32D3 # CIRCLED KATAKANA E [2000]
+3-2C5F U+32D4 # CIRCLED KATAKANA O [2000]
+3-2C60 U+32D5 # CIRCLED KATAKANA KA [2000]
+3-2C61 U+32D6 # CIRCLED KATAKANA KI [2000]
+3-2C62 U+32D7 # CIRCLED KATAKANA KU [2000]
+3-2C63 U+32D8 # CIRCLED KATAKANA KE [2000]
+3-2C64 U+32D9 # CIRCLED KATAKANA KO [2000]
+3-2C65 U+32DA # CIRCLED KATAKANA SA [2000]
+3-2C66 U+32DB # CIRCLED KATAKANA SI [2000]
+3-2C67 U+32DC # CIRCLED KATAKANA SU [2000]
+3-2C68 U+32DD # CIRCLED KATAKANA SE [2000]
+3-2C69 U+32DE # CIRCLED KATAKANA SO [2000]
+3-2C6A U+32DF # CIRCLED KATAKANA TA [2000]
+3-2C6B U+32E0 # CIRCLED KATAKANA TI [2000]
+3-2C6C U+32E1 # CIRCLED KATAKANA TU [2000]
+3-2C6D U+32E2 # CIRCLED KATAKANA TE [2000]
+3-2C6E U+32E3 # CIRCLED KATAKANA TO [2000]
+3-2C6F U+32FA # CIRCLED KATAKANA RO [2000]
+3-2C70 U+32E9 # CIRCLED KATAKANA HA [2000]
+3-2C71 U+32E5 # CIRCLED KATAKANA NI [2000]
+3-2C72 U+32ED # CIRCLED KATAKANA HO [2000]
+3-2C73 U+32EC # CIRCLED KATAKANA HE [2000]
+3-2C74 # <reserved>
+3-2C75 # <reserved>
+3-2C76 # <reserved>
+3-2C77 # <reserved>
+3-2C78 # <reserved>
+3-2C79 # <reserved>
+3-2C7A # <reserved>
+3-2C7B # <reserved>
+3-2C7C # <reserved>
+3-2C7D U+2051 # TWO ASTERISKS ALIGNED VERTICALLY [2000] [Unicode3.2]
+3-2C7E U+2042 # ASTERISM [2000]
+3-2D21 U+2460 # CIRCLED DIGIT ONE [2000]
+3-2D22 U+2461 # CIRCLED DIGIT TWO [2000]
+3-2D23 U+2462 # CIRCLED DIGIT THREE [2000]
+3-2D24 U+2463 # CIRCLED DIGIT FOUR [2000]
+3-2D25 U+2464 # CIRCLED DIGIT FIVE [2000]
+3-2D26 U+2465 # CIRCLED DIGIT SIX [2000]
+3-2D27 U+2466 # CIRCLED DIGIT SEVEN [2000]
+3-2D28 U+2467 # CIRCLED DIGIT EIGHT [2000]
+3-2D29 U+2468 # CIRCLED DIGIT NINE [2000]
+3-2D2A U+2469 # CIRCLED NUMBER TEN [2000]
+3-2D2B U+246A # CIRCLED NUMBER ELEVEN [2000]
+3-2D2C U+246B # CIRCLED NUMBER TWELVE [2000]
+3-2D2D U+246C # CIRCLED NUMBER THIRTEEN [2000]
+3-2D2E U+246D # CIRCLED NUMBER FOURTEEN [2000]
+3-2D2F U+246E # CIRCLED NUMBER FIFTEEN [2000]
+3-2D30 U+246F # CIRCLED NUMBER SIXTEEN [2000]
+3-2D31 U+2470 # CIRCLED NUMBER SEVENTEEN [2000]
+3-2D32 U+2471 # CIRCLED NUMBER EIGHTEEN [2000]
+3-2D33 U+2472 # CIRCLED NUMBER NINETEEN [2000]
+3-2D34 U+2473 # CIRCLED NUMBER TWENTY [2000]
+3-2D35 U+2160 # ROMAN NUMERAL ONE [2000]
+3-2D36 U+2161 # ROMAN NUMERAL TWO [2000]
+3-2D37 U+2162 # ROMAN NUMERAL THREE [2000]
+3-2D38 U+2163 # ROMAN NUMERAL FOUR [2000]
+3-2D39 U+2164 # ROMAN NUMERAL FIVE [2000]
+3-2D3A U+2165 # ROMAN NUMERAL SIX [2000]
+3-2D3B U+2166 # ROMAN NUMERAL SEVEN [2000]
+3-2D3C U+2167 # ROMAN NUMERAL EIGHT [2000]
+3-2D3D U+2168 # ROMAN NUMERAL NINE [2000]
+3-2D3E U+2169 # ROMAN NUMERAL TEN [2000]
+3-2D3F U+216A # ROMAN NUMERAL ELEVEN [2000]
+3-2D40 U+3349 # SQUARE MIRI [2000]
+3-2D41 U+3314 # SQUARE KIRO [2000]
+3-2D42 U+3322 # SQUARE SENTI [2000]
+3-2D43 U+334D # SQUARE MEETORU [2000]
+3-2D44 U+3318 # SQUARE GURAMU [2000]
+3-2D45 U+3327 # SQUARE TON [2000]
+3-2D46 U+3303 # SQUARE AARU [2000]
+3-2D47 U+3336 # SQUARE HEKUTAARU [2000]
+3-2D48 U+3351 # SQUARE RITTORU [2000]
+3-2D49 U+3357 # SQUARE WATTO [2000]
+3-2D4A U+330D # SQUARE KARORII [2000]
+3-2D4B U+3326 # SQUARE DORU [2000]
+3-2D4C U+3323 # SQUARE SENTO [2000]
+3-2D4D U+332B # SQUARE PAASENTO [2000]
+3-2D4E U+334A # SQUARE MIRIBAARU [2000]
+3-2D4F U+333B # SQUARE PEEZI [2000]
+3-2D50 U+339C # SQUARE MM [2000]
+3-2D51 U+339D # SQUARE CM [2000]
+3-2D52 U+339E # SQUARE KM [2000]
+3-2D53 U+338E # SQUARE MG [2000]
+3-2D54 U+338F # SQUARE KG [2000]
+3-2D55 U+33C4 # SQUARE CC [2000]
+3-2D56 U+33A1 # SQUARE M SQUARED [2000]
+3-2D57 U+216B # ROMAN NUMERAL TWELVE [2000]
+3-2D58 # <reserved>
+3-2D59 # <reserved>
+3-2D5A # <reserved>
+3-2D5B # <reserved>
+3-2D5C # <reserved>
+3-2D5D # <reserved>
+3-2D5E # <reserved>
+3-2D5F U+337B # SQUARE ERA NAME HEISEI [2000]
+3-2D60 U+301D # REVERSED DOUBLE PRIME QUOTATION MARK [2000]
+3-2D61 U+301F # LOW DOUBLE PRIME QUOTATION MARK [2000]
+3-2D62 U+2116 # NUMERO SIGN [2000]
+3-2D63 U+33CD # SQUARE KK [2000]
+3-2D64 U+2121 # TELEPHONE SIGN [2000]
+3-2D65 U+32A4 # CIRCLED IDEOGRAPH HIGH [2000]
+3-2D66 U+32A5 # CIRCLED IDEOGRAPH CENTRE [2000]
+3-2D67 U+32A6 # CIRCLED IDEOGRAPH LOW [2000]
+3-2D68 U+32A7 # CIRCLED IDEOGRAPH LEFT [2000]
+3-2D69 U+32A8 # CIRCLED IDEOGRAPH RIGHT [2000]
+3-2D6A U+3231 # PARENTHESIZED IDEOGRAPH STOCK [2000]
+3-2D6B U+3232 # PARENTHESIZED IDEOGRAPH HAVE [2000]
+3-2D6C U+3239 # PARENTHESIZED IDEOGRAPH REPRESENT [2000]
+3-2D6D U+337E # SQUARE ERA NAME MEIZI [2000]
+3-2D6E U+337D # SQUARE ERA NAME TAISYOU [2000]
+3-2D6F U+337C # SQUARE ERA NAME SYOUWA [2000]
+3-2D70 # <reserved> Windows: U+2252
+3-2D71 # <reserved> Windows: U+2261
+3-2D72 # <reserved> Windows: U+222B
+3-2D73 U+222E # CONTOUR INTEGRAL [2000]
+3-2D74 # <reserved> Windows: U+2211
+3-2D75 # <reserved> Windows: U+221A
+3-2D76 # <reserved> Windows: U+22A5
+3-2D77 # <reserved> Windows: U+2220
+3-2D78 U+221F # RIGHT ANGLE [2000]
+3-2D79 U+22BF # RIGHT TRIANGLE [2000]
+3-2D7A # <reserved> Windows: U+2235
+3-2D7B # <reserved> Windows: U+2229
+3-2D7C # <reserved> Windows: U+222A
+3-2D7D U+2756 # BLACK DIAMOND MINUS WHITE X [2000]
+3-2D7E U+261E # WHITE RIGHT POINTING INDEX [2000]
+3-2E21 U+4FF1 # <cjk> [2004]
+3-2E22 U+2000B # <cjk> [2000] [Unicode3.1]
+3-2E23 U+3402 # <cjk> [2000]
+3-2E24 U+4E28 # <cjk> [2000]
+3-2E25 U+4E2F # <cjk> [2000]
+3-2E26 U+4E30 # <cjk> [2000]
+3-2E27 U+4E8D # <cjk> [2000]
+3-2E28 U+4EE1 # <cjk> [2000]
+3-2E29 U+4EFD # <cjk> [2000]
+3-2E2A U+4EFF # <cjk> [2000]
+3-2E2B U+4F03 # <cjk> [2000]
+3-2E2C U+4F0B # <cjk> [2000]
+3-2E2D U+4F60 # <cjk> [2000]
+3-2E2E U+4F48 # <cjk> [2000]
+3-2E2F U+4F49 # <cjk> [2000]
+3-2E30 U+4F56 # <cjk> [2000]
+3-2E31 U+4F5F # <cjk> [2000]
+3-2E32 U+4F6A # <cjk> [2000]
+3-2E33 U+4F6C # <cjk> [2000]
+3-2E34 U+4F7E # <cjk> [2000]
+3-2E35 U+4F8A # <cjk> [2000]
+3-2E36 U+4F94 # <cjk> [2000]
+3-2E37 U+4F97 # <cjk> [2000]
+3-2E38 U+FA30 # CJK COMPATIBILITY IDEOGRAPH-FA30 [2000] [Unicode3.2]
+3-2E39 U+4FC9 # <cjk> [2000]
+3-2E3A U+4FE0 # <cjk> [2000]
+3-2E3B U+5001 # <cjk> [2000]
+3-2E3C U+5002 # <cjk> [2000]
+3-2E3D U+500E # <cjk> [2000]
+3-2E3E U+5018 # <cjk> [2000]
+3-2E3F U+5027 # <cjk> [2000]
+3-2E40 U+502E # <cjk> [2000]
+3-2E41 U+5040 # <cjk> [2000]
+3-2E42 U+503B # <cjk> [2000]
+3-2E43 U+5041 # <cjk> [2000]
+3-2E44 U+5094 # <cjk> [2000]
+3-2E45 U+50CC # <cjk> [2000]
+3-2E46 U+50F2 # <cjk> [2000]
+3-2E47 U+50D0 # <cjk> [2000]
+3-2E48 U+50E6 # <cjk> [2000]
+3-2E49 U+FA31 # CJK COMPATIBILITY IDEOGRAPH-FA31 [2000] [Unicode3.2]
+3-2E4A U+5106 # <cjk> [2000]
+3-2E4B U+5103 # <cjk> [2000]
+3-2E4C U+510B # <cjk> [2000]
+3-2E4D U+511E # <cjk> [2000]
+3-2E4E U+5135 # <cjk> [2000]
+3-2E4F U+514A # <cjk> [2000]
+3-2E50 U+FA32 # CJK COMPATIBILITY IDEOGRAPH-FA32 [2000] [Unicode3.2]
+3-2E51 U+5155 # <cjk> [2000]
+3-2E52 U+5157 # <cjk> [2000]
+3-2E53 U+34B5 # <cjk> [2000]
+3-2E54 U+519D # <cjk> [2000]
+3-2E55 U+51C3 # <cjk> [2000]
+3-2E56 U+51CA # <cjk> [2000]
+3-2E57 U+51DE # <cjk> [2000]
+3-2E58 U+51E2 # <cjk> [2000]
+3-2E59 U+51EE # <cjk> [2000]
+3-2E5A U+5201 # <cjk> [2000]
+3-2E5B U+34DB # <cjk> [2000]
+3-2E5C U+5213 # <cjk> [2000]
+3-2E5D U+5215 # <cjk> [2000]
+3-2E5E U+5249 # <cjk> [2000]
+3-2E5F U+5257 # <cjk> [2000]
+3-2E60 U+5261 # <cjk> [2000]
+3-2E61 U+5293 # <cjk> [2000]
+3-2E62 U+52C8 # <cjk> [2000]
+3-2E63 U+FA33 # CJK COMPATIBILITY IDEOGRAPH-FA33 [2000] [Unicode3.2]
+3-2E64 U+52CC # <cjk> [2000]
+3-2E65 U+52D0 # <cjk> [2000]
+3-2E66 U+52D6 # <cjk> [2000]
+3-2E67 U+52DB # <cjk> [2000]
+3-2E68 U+FA34 # CJK COMPATIBILITY IDEOGRAPH-FA34 [2000] [Unicode3.2]
+3-2E69 U+52F0 # <cjk> [2000]
+3-2E6A U+52FB # <cjk> [2000]
+3-2E6B U+5300 # <cjk> [2000]
+3-2E6C U+5307 # <cjk> [2000]
+3-2E6D U+531C # <cjk> [2000]
+3-2E6E U+FA35 # CJK COMPATIBILITY IDEOGRAPH-FA35 [2000] [Unicode3.2]
+3-2E6F U+5361 # <cjk> [2000]
+3-2E70 U+5363 # <cjk> [2000]
+3-2E71 U+537D # <cjk> [2000]
+3-2E72 U+5393 # <cjk> [2000]
+3-2E73 U+539D # <cjk> [2000]
+3-2E74 U+53B2 # <cjk> [2000]
+3-2E75 U+5412 # <cjk> [2000]
+3-2E76 U+5427 # <cjk> [2000]
+3-2E77 U+544D # <cjk> [2000]
+3-2E78 U+549C # <cjk> [2000]
+3-2E79 U+546B # <cjk> [2000]
+3-2E7A U+5474 # <cjk> [2000]
+3-2E7B U+547F # <cjk> [2000]
+3-2E7C U+5488 # <cjk> [2000]
+3-2E7D U+5496 # <cjk> [2000]
+3-2E7E U+54A1 # <cjk> [2000]
+3-2F21 U+54A9 # <cjk> [2000]
+3-2F22 U+54C6 # <cjk> [2000]
+3-2F23 U+54FF # <cjk> [2000]
+3-2F24 U+550E # <cjk> [2000]
+3-2F25 U+552B # <cjk> [2000]
+3-2F26 U+5535 # <cjk> [2000]
+3-2F27 U+5550 # <cjk> [2000]
+3-2F28 U+555E # <cjk> [2000]
+3-2F29 U+5581 # <cjk> [2000]
+3-2F2A U+5586 # <cjk> [2000]
+3-2F2B U+558E # <cjk> [2000]
+3-2F2C U+FA36 # CJK COMPATIBILITY IDEOGRAPH-FA36 [2000] [Unicode3.2]
+3-2F2D U+55AD # <cjk> [2000]
+3-2F2E U+55CE # <cjk> [2000]
+3-2F2F U+FA37 # CJK COMPATIBILITY IDEOGRAPH-FA37 [2000] [Unicode3.2]
+3-2F30 U+5608 # <cjk> [2000]
+3-2F31 U+560E # <cjk> [2000]
+3-2F32 U+563B # <cjk> [2000]
+3-2F33 U+5649 # <cjk> [2000]
+3-2F34 U+5676 # <cjk> [2000]
+3-2F35 U+5666 # <cjk> [2000]
+3-2F36 U+FA38 # CJK COMPATIBILITY IDEOGRAPH-FA38 [2000] [Unicode3.2]
+3-2F37 U+566F # <cjk> [2000]
+3-2F38 U+5671 # <cjk> [2000]
+3-2F39 U+5672 # <cjk> [2000]
+3-2F3A U+5699 # <cjk> [2000]
+3-2F3B U+569E # <cjk> [2000]
+3-2F3C U+56A9 # <cjk> [2000]
+3-2F3D U+56AC # <cjk> [2000]
+3-2F3E U+56B3 # <cjk> [2000]
+3-2F3F U+56C9 # <cjk> [2000]
+3-2F40 U+56CA # <cjk> [2000]
+3-2F41 U+570A # <cjk> [2000]
+3-2F42 U+2123D # <cjk> [2000] [Unicode3.1]
+3-2F43 U+5721 # <cjk> [2000]
+3-2F44 U+572F # <cjk> [2000]
+3-2F45 U+5733 # <cjk> [2000]
+3-2F46 U+5734 # <cjk> [2000]
+3-2F47 U+5770 # <cjk> [2000]
+3-2F48 U+5777 # <cjk> [2000]
+3-2F49 U+577C # <cjk> [2000]
+3-2F4A U+579C # <cjk> [2000]
+3-2F4B U+FA0F # CJK COMPATIBILITY IDEOGRAPH-FA0F [2000]
+3-2F4C U+2131B # <cjk> [2000] [Unicode3.1]
+3-2F4D U+57B8 # <cjk> [2000]
+3-2F4E U+57C7 # <cjk> [2000]
+3-2F4F U+57C8 # <cjk> [2000]
+3-2F50 U+57CF # <cjk> [2000]
+3-2F51 U+57E4 # <cjk> [2000]
+3-2F52 U+57ED # <cjk> [2000]
+3-2F53 U+57F5 # <cjk> [2000]
+3-2F54 U+57F6 # <cjk> [2000]
+3-2F55 U+57FF # <cjk> [2000]
+3-2F56 U+5809 # <cjk> [2000]
+3-2F57 U+FA10 # CJK COMPATIBILITY IDEOGRAPH-FA10 [2000]
+3-2F58 U+5861 # <cjk> [2000]
+3-2F59 U+5864 # <cjk> [2000]
+3-2F5A U+FA39 # CJK COMPATIBILITY IDEOGRAPH-FA39 [2000] [Unicode3.2]
+3-2F5B U+587C # <cjk> [2000]
+3-2F5C U+5889 # <cjk> [2000]
+3-2F5D U+589E # <cjk> [2000]
+3-2F5E U+FA3A # CJK COMPATIBILITY IDEOGRAPH-FA3A [2000] [Unicode3.2]
+3-2F5F U+58A9 # <cjk> [2000]
+3-2F60 U+2146E # <cjk> [2000] [Unicode3.1]
+3-2F61 U+58D2 # <cjk> [2000]
+3-2F62 U+58CE # <cjk> [2000]
+3-2F63 U+58D4 # <cjk> [2000]
+3-2F64 U+58DA # <cjk> [2000]
+3-2F65 U+58E0 # <cjk> [2000]
+3-2F66 U+58E9 # <cjk> [2000]
+3-2F67 U+590C # <cjk> [2000]
+3-2F68 U+8641 # <cjk> [2000]
+3-2F69 U+595D # <cjk> [2000]
+3-2F6A U+596D # <cjk> [2000]
+3-2F6B U+598B # <cjk> [2000]
+3-2F6C U+5992 # <cjk> [2000]
+3-2F6D U+59A4 # <cjk> [2000]
+3-2F6E U+59C3 # <cjk> [2000]
+3-2F6F U+59D2 # <cjk> [2000]
+3-2F70 U+59DD # <cjk> [2000]
+3-2F71 U+5A13 # <cjk> [2000]
+3-2F72 U+5A23 # <cjk> [2000]
+3-2F73 U+5A67 # <cjk> [2000]
+3-2F74 U+5A6D # <cjk> [2000]
+3-2F75 U+5A77 # <cjk> [2000]
+3-2F76 U+5A7E # <cjk> [2000]
+3-2F77 U+5A84 # <cjk> [2000]
+3-2F78 U+5A9E # <cjk> [2000]
+3-2F79 U+5AA7 # <cjk> [2000]
+3-2F7A U+5AC4 # <cjk> [2000]
+3-2F7B U+218BD # <cjk> [2000] [Unicode3.1]
+3-2F7C U+5B19 # <cjk> [2000]
+3-2F7D U+5B25 # <cjk> [2000]
+3-2F7E U+525D # <cjk> [2004]
+3-3021 U+4E9C # <cjk>
+3-3022 U+5516 # <cjk>
+3-3023 U+5A03 # <cjk>
+3-3024 U+963F # <cjk>
+3-3025 U+54C0 # <cjk>
+3-3026 U+611B # <cjk>
+3-3027 U+6328 # <cjk>
+3-3028 U+59F6 # <cjk>
+3-3029 U+9022 # <cjk>
+3-302A U+8475 # <cjk>
+3-302B U+831C # <cjk>
+3-302C U+7A50 # <cjk>
+3-302D U+60AA # <cjk>
+3-302E U+63E1 # <cjk>
+3-302F U+6E25 # <cjk>
+3-3030 U+65ED # <cjk>
+3-3031 U+8466 # <cjk>
+3-3032 U+82A6 # <cjk>
+3-3033 U+9BF5 # <cjk>
+3-3034 U+6893 # <cjk>
+3-3035 U+5727 # <cjk>
+3-3036 U+65A1 # <cjk>
+3-3037 U+6271 # <cjk>
+3-3038 U+5B9B # <cjk>
+3-3039 U+59D0 # <cjk>
+3-303A U+867B # <cjk>
+3-303B U+98F4 # <cjk>
+3-303C U+7D62 # <cjk>
+3-303D U+7DBE # <cjk>
+3-303E U+9B8E # <cjk>
+3-303F U+6216 # <cjk>
+3-3040 U+7C9F # <cjk>
+3-3041 U+88B7 # <cjk>
+3-3042 U+5B89 # <cjk>
+3-3043 U+5EB5 # <cjk>
+3-3044 U+6309 # <cjk>
+3-3045 U+6697 # <cjk>
+3-3046 U+6848 # <cjk>
+3-3047 U+95C7 # <cjk>
+3-3048 U+978D # <cjk>
+3-3049 U+674F # <cjk>
+3-304A U+4EE5 # <cjk>
+3-304B U+4F0A # <cjk>
+3-304C U+4F4D # <cjk>
+3-304D U+4F9D # <cjk>
+3-304E U+5049 # <cjk>
+3-304F U+56F2 # <cjk>
+3-3050 U+5937 # <cjk>
+3-3051 U+59D4 # <cjk>
+3-3052 U+5A01 # <cjk>
+3-3053 U+5C09 # <cjk>
+3-3054 U+60DF # <cjk>
+3-3055 U+610F # <cjk>
+3-3056 U+6170 # <cjk>
+3-3057 U+6613 # <cjk>
+3-3058 U+6905 # <cjk>
+3-3059 U+70BA # <cjk>
+3-305A U+754F # <cjk>
+3-305B U+7570 # <cjk>
+3-305C U+79FB # <cjk>
+3-305D U+7DAD # <cjk>
+3-305E U+7DEF # <cjk>
+3-305F U+80C3 # <cjk>
+3-3060 U+840E # <cjk>
+3-3061 U+8863 # <cjk>
+3-3062 U+8B02 # <cjk>
+3-3063 U+9055 # <cjk>
+3-3064 U+907A # <cjk>
+3-3065 U+533B # <cjk>
+3-3066 U+4E95 # <cjk>
+3-3067 U+4EA5 # <cjk>
+3-3068 U+57DF # <cjk>
+3-3069 U+80B2 # <cjk>
+3-306A U+90C1 # <cjk>
+3-306B U+78EF # <cjk>
+3-306C U+4E00 # <cjk>
+3-306D U+58F1 # <cjk>
+3-306E U+6EA2 # <cjk>
+3-306F U+9038 # <cjk>
+3-3070 U+7A32 # <cjk>
+3-3071 U+8328 # <cjk>
+3-3072 U+828B # <cjk>
+3-3073 U+9C2F # <cjk>
+3-3074 U+5141 # <cjk>
+3-3075 U+5370 # <cjk>
+3-3076 U+54BD # <cjk>
+3-3077 U+54E1 # <cjk>
+3-3078 U+56E0 # <cjk>
+3-3079 U+59FB # <cjk>
+3-307A U+5F15 # <cjk>
+3-307B U+98F2 # <cjk>
+3-307C U+6DEB # <cjk>
+3-307D U+80E4 # <cjk>
+3-307E U+852D # <cjk>
+3-3121 U+9662 # <cjk>
+3-3122 U+9670 # <cjk>
+3-3123 U+96A0 # <cjk>
+3-3124 U+97FB # <cjk>
+3-3125 U+540B # <cjk>
+3-3126 U+53F3 # <cjk>
+3-3127 U+5B87 # <cjk>
+3-3128 U+70CF # <cjk>
+3-3129 U+7FBD # <cjk>
+3-312A U+8FC2 # <cjk>
+3-312B U+96E8 # <cjk>
+3-312C U+536F # <cjk>
+3-312D U+9D5C # <cjk>
+3-312E U+7ABA # <cjk>
+3-312F U+4E11 # <cjk>
+3-3130 U+7893 # <cjk>
+3-3131 U+81FC # <cjk>
+3-3132 U+6E26 # <cjk>
+3-3133 U+5618 # <cjk>
+3-3134 U+5504 # <cjk>
+3-3135 U+6B1D # <cjk>
+3-3136 U+851A # <cjk>
+3-3137 U+9C3B # <cjk>
+3-3138 U+59E5 # <cjk>
+3-3139 U+53A9 # <cjk>
+3-313A U+6D66 # <cjk>
+3-313B U+74DC # <cjk>
+3-313C U+958F # <cjk>
+3-313D U+5642 # <cjk>
+3-313E U+4E91 # <cjk>
+3-313F U+904B # <cjk>
+3-3140 U+96F2 # <cjk>
+3-3141 U+834F # <cjk>
+3-3142 U+990C # <cjk>
+3-3143 U+53E1 # <cjk>
+3-3144 U+55B6 # <cjk>
+3-3145 U+5B30 # <cjk>
+3-3146 U+5F71 # <cjk>
+3-3147 U+6620 # <cjk>
+3-3148 U+66F3 # <cjk>
+3-3149 U+6804 # <cjk>
+3-314A U+6C38 # <cjk>
+3-314B U+6CF3 # <cjk>
+3-314C U+6D29 # <cjk>
+3-314D U+745B # <cjk>
+3-314E U+76C8 # <cjk>
+3-314F U+7A4E # <cjk>
+3-3150 U+9834 # <cjk>
+3-3151 U+82F1 # <cjk>
+3-3152 U+885B # <cjk>
+3-3153 U+8A60 # <cjk>
+3-3154 U+92ED # <cjk>
+3-3155 U+6DB2 # <cjk>
+3-3156 U+75AB # <cjk>
+3-3157 U+76CA # <cjk>
+3-3158 U+99C5 # <cjk>
+3-3159 U+60A6 # <cjk>
+3-315A U+8B01 # <cjk>
+3-315B U+8D8A # <cjk>
+3-315C U+95B2 # <cjk>
+3-315D U+698E # <cjk>
+3-315E U+53AD # <cjk>
+3-315F U+5186 # <cjk>
+3-3160 U+5712 # <cjk>
+3-3161 U+5830 # <cjk>
+3-3162 U+5944 # <cjk>
+3-3163 U+5BB4 # <cjk>
+3-3164 U+5EF6 # <cjk>
+3-3165 U+6028 # <cjk>
+3-3166 U+63A9 # <cjk>
+3-3167 U+63F4 # <cjk>
+3-3168 U+6CBF # <cjk>
+3-3169 U+6F14 # <cjk>
+3-316A U+708E # <cjk>
+3-316B U+7114 # <cjk>
+3-316C U+7159 # <cjk>
+3-316D U+71D5 # <cjk>
+3-316E U+733F # <cjk>
+3-316F U+7E01 # <cjk>
+3-3170 U+8276 # <cjk>
+3-3171 U+82D1 # <cjk>
+3-3172 U+8597 # <cjk>
+3-3173 U+9060 # <cjk>
+3-3174 U+925B # <cjk>
+3-3175 U+9D1B # <cjk>
+3-3176 U+5869 # <cjk>
+3-3177 U+65BC # <cjk>
+3-3178 U+6C5A # <cjk>
+3-3179 U+7525 # <cjk>
+3-317A U+51F9 # <cjk>
+3-317B U+592E # <cjk>
+3-317C U+5965 # <cjk>
+3-317D U+5F80 # <cjk>
+3-317E U+5FDC # <cjk>
+3-3221 U+62BC # <cjk>
+3-3222 U+65FA # <cjk>
+3-3223 U+6A2A # <cjk>
+3-3224 U+6B27 # <cjk>
+3-3225 U+6BB4 # <cjk>
+3-3226 U+738B # <cjk>
+3-3227 U+7FC1 # <cjk>
+3-3228 U+8956 # <cjk>
+3-3229 U+9D2C # <cjk>
+3-322A U+9D0E # <cjk>
+3-322B U+9EC4 # <cjk>
+3-322C U+5CA1 # <cjk>
+3-322D U+6C96 # <cjk>
+3-322E U+837B # <cjk>
+3-322F U+5104 # <cjk>
+3-3230 U+5C4B # <cjk>
+3-3231 U+61B6 # <cjk>
+3-3232 U+81C6 # <cjk>
+3-3233 U+6876 # <cjk>
+3-3234 U+7261 # <cjk>
+3-3235 U+4E59 # <cjk>
+3-3236 U+4FFA # <cjk>
+3-3237 U+5378 # <cjk>
+3-3238 U+6069 # <cjk>
+3-3239 U+6E29 # <cjk>
+3-323A U+7A4F # <cjk>
+3-323B U+97F3 # <cjk>
+3-323C U+4E0B # <cjk>
+3-323D U+5316 # <cjk>
+3-323E U+4EEE # <cjk>
+3-323F U+4F55 # <cjk>
+3-3240 U+4F3D # <cjk>
+3-3241 U+4FA1 # <cjk>
+3-3242 U+4F73 # <cjk>
+3-3243 U+52A0 # <cjk>
+3-3244 U+53EF # <cjk>
+3-3245 U+5609 # <cjk>
+3-3246 U+590F # <cjk>
+3-3247 U+5AC1 # <cjk>
+3-3248 U+5BB6 # <cjk>
+3-3249 U+5BE1 # <cjk>
+3-324A U+79D1 # <cjk>
+3-324B U+6687 # <cjk>
+3-324C U+679C # <cjk>
+3-324D U+67B6 # <cjk>
+3-324E U+6B4C # <cjk>
+3-324F U+6CB3 # <cjk>
+3-3250 U+706B # <cjk>
+3-3251 U+73C2 # <cjk>
+3-3252 U+798D # <cjk>
+3-3253 U+79BE # <cjk>
+3-3254 U+7A3C # <cjk>
+3-3255 U+7B87 # <cjk>
+3-3256 U+82B1 # <cjk>
+3-3257 U+82DB # <cjk>
+3-3258 U+8304 # <cjk>
+3-3259 U+8377 # <cjk>
+3-325A U+83EF # <cjk>
+3-325B U+83D3 # <cjk>
+3-325C U+8766 # <cjk>
+3-325D U+8AB2 # <cjk>
+3-325E U+5629 # <cjk>
+3-325F U+8CA8 # <cjk>
+3-3260 U+8FE6 # <cjk>
+3-3261 U+904E # <cjk>
+3-3262 U+971E # <cjk>
+3-3263 U+868A # <cjk>
+3-3264 U+4FC4 # <cjk>
+3-3265 U+5CE8 # <cjk>
+3-3266 U+6211 # <cjk>
+3-3267 U+7259 # <cjk>
+3-3268 U+753B # <cjk>
+3-3269 U+81E5 # <cjk>
+3-326A U+82BD # <cjk>
+3-326B U+86FE # <cjk>
+3-326C U+8CC0 # <cjk>
+3-326D U+96C5 # <cjk>
+3-326E U+9913 # <cjk>
+3-326F U+99D5 # <cjk>
+3-3270 U+4ECB # <cjk>
+3-3271 U+4F1A # <cjk>
+3-3272 U+89E3 # <cjk>
+3-3273 U+56DE # <cjk>
+3-3274 U+584A # <cjk>
+3-3275 U+58CA # <cjk>
+3-3276 U+5EFB # <cjk>
+3-3277 U+5FEB # <cjk>
+3-3278 U+602A # <cjk>
+3-3279 U+6094 # <cjk>
+3-327A U+6062 # <cjk>
+3-327B U+61D0 # <cjk>
+3-327C U+6212 # <cjk>
+3-327D U+62D0 # <cjk>
+3-327E U+6539 # <cjk>
+3-3321 U+9B41 # <cjk>
+3-3322 U+6666 # <cjk>
+3-3323 U+68B0 # <cjk>
+3-3324 U+6D77 # <cjk>
+3-3325 U+7070 # <cjk>
+3-3326 U+754C # <cjk>
+3-3327 U+7686 # <cjk>
+3-3328 U+7D75 # <cjk>
+3-3329 U+82A5 # <cjk>
+3-332A U+87F9 # <cjk>
+3-332B U+958B # <cjk>
+3-332C U+968E # <cjk>
+3-332D U+8C9D # <cjk>
+3-332E U+51F1 # <cjk>
+3-332F U+52BE # <cjk>
+3-3330 U+5916 # <cjk>
+3-3331 U+54B3 # <cjk>
+3-3332 U+5BB3 # <cjk>
+3-3333 U+5D16 # <cjk>
+3-3334 U+6168 # <cjk>
+3-3335 U+6982 # <cjk>
+3-3336 U+6DAF # <cjk>
+3-3337 U+788D # <cjk>
+3-3338 U+84CB # <cjk>
+3-3339 U+8857 # <cjk>
+3-333A U+8A72 # <cjk>
+3-333B U+93A7 # <cjk>
+3-333C U+9AB8 # <cjk>
+3-333D U+6D6C # <cjk>
+3-333E U+99A8 # <cjk>
+3-333F U+86D9 # <cjk>
+3-3340 U+57A3 # <cjk>
+3-3341 U+67FF # <cjk>
+3-3342 U+86CE # <cjk>
+3-3343 U+920E # <cjk>
+3-3344 U+5283 # <cjk>
+3-3345 U+5687 # <cjk>
+3-3346 U+5404 # <cjk>
+3-3347 U+5ED3 # <cjk>
+3-3348 U+62E1 # <cjk>
+3-3349 U+64B9 # <cjk>
+3-334A U+683C # <cjk>
+3-334B U+6838 # <cjk>
+3-334C U+6BBB # <cjk>
+3-334D U+7372 # <cjk>
+3-334E U+78BA # <cjk>
+3-334F U+7A6B # <cjk>
+3-3350 U+899A # <cjk>
+3-3351 U+89D2 # <cjk>
+3-3352 U+8D6B # <cjk>
+3-3353 U+8F03 # <cjk>
+3-3354 U+90ED # <cjk>
+3-3355 U+95A3 # <cjk>
+3-3356 U+9694 # <cjk>
+3-3357 U+9769 # <cjk>
+3-3358 U+5B66 # <cjk>
+3-3359 U+5CB3 # <cjk>
+3-335A U+697D # <cjk>
+3-335B U+984D # <cjk>
+3-335C U+984E # <cjk>
+3-335D U+639B # <cjk>
+3-335E U+7B20 # <cjk>
+3-335F U+6A2B # <cjk>
+3-3360 U+6A7F # <cjk>
+3-3361 U+68B6 # <cjk>
+3-3362 U+9C0D # <cjk>
+3-3363 U+6F5F # <cjk>
+3-3364 U+5272 # <cjk>
+3-3365 U+559D # <cjk>
+3-3366 U+6070 # <cjk>
+3-3367 U+62EC # <cjk>
+3-3368 U+6D3B # <cjk>
+3-3369 U+6E07 # <cjk>
+3-336A U+6ED1 # <cjk>
+3-336B U+845B # <cjk>
+3-336C U+8910 # <cjk>
+3-336D U+8F44 # <cjk>
+3-336E U+4E14 # <cjk>
+3-336F U+9C39 # <cjk>
+3-3370 U+53F6 # <cjk>
+3-3371 U+691B # <cjk>
+3-3372 U+6A3A # <cjk>
+3-3373 U+9784 # <cjk>
+3-3374 U+682A # <cjk>
+3-3375 U+515C # <cjk>
+3-3376 U+7AC3 # <cjk>
+3-3377 U+84B2 # <cjk>
+3-3378 U+91DC # <cjk>
+3-3379 U+938C # <cjk>
+3-337A U+565B # <cjk>
+3-337B U+9D28 # <cjk>
+3-337C U+6822 # <cjk>
+3-337D U+8305 # <cjk>
+3-337E U+8431 # <cjk>
+3-3421 U+7CA5 # <cjk>
+3-3422 U+5208 # <cjk>
+3-3423 U+82C5 # <cjk>
+3-3424 U+74E6 # <cjk>
+3-3425 U+4E7E # <cjk>
+3-3426 U+4F83 # <cjk>
+3-3427 U+51A0 # <cjk>
+3-3428 U+5BD2 # <cjk>
+3-3429 U+520A # <cjk>
+3-342A U+52D8 # <cjk>
+3-342B U+52E7 # <cjk>
+3-342C U+5DFB # <cjk>
+3-342D U+559A # <cjk>
+3-342E U+582A # <cjk>
+3-342F U+59E6 # <cjk>
+3-3430 U+5B8C # <cjk>
+3-3431 U+5B98 # <cjk>
+3-3432 U+5BDB # <cjk>
+3-3433 U+5E72 # <cjk>
+3-3434 U+5E79 # <cjk>
+3-3435 U+60A3 # <cjk>
+3-3436 U+611F # <cjk>
+3-3437 U+6163 # <cjk>
+3-3438 U+61BE # <cjk>
+3-3439 U+63DB # <cjk>
+3-343A U+6562 # <cjk>
+3-343B U+67D1 # <cjk>
+3-343C U+6853 # <cjk>
+3-343D U+68FA # <cjk>
+3-343E U+6B3E # <cjk>
+3-343F U+6B53 # <cjk>
+3-3440 U+6C57 # <cjk>
+3-3441 U+6F22 # <cjk>
+3-3442 U+6F97 # <cjk>
+3-3443 U+6F45 # <cjk>
+3-3444 U+74B0 # <cjk>
+3-3445 U+7518 # <cjk>
+3-3446 U+76E3 # <cjk>
+3-3447 U+770B # <cjk>
+3-3448 U+7AFF # <cjk>
+3-3449 U+7BA1 # <cjk>
+3-344A U+7C21 # <cjk>
+3-344B U+7DE9 # <cjk>
+3-344C U+7F36 # <cjk>
+3-344D U+7FF0 # <cjk>
+3-344E U+809D # <cjk>
+3-344F U+8266 # <cjk>
+3-3450 U+839E # <cjk>
+3-3451 U+89B3 # <cjk>
+3-3452 U+8ACC # <cjk>
+3-3453 U+8CAB # <cjk>
+3-3454 U+9084 # <cjk>
+3-3455 U+9451 # <cjk>
+3-3456 U+9593 # <cjk>
+3-3457 U+9591 # <cjk>
+3-3458 U+95A2 # <cjk>
+3-3459 U+9665 # <cjk>
+3-345A U+97D3 # <cjk>
+3-345B U+9928 # <cjk>
+3-345C U+8218 # <cjk>
+3-345D U+4E38 # <cjk>
+3-345E U+542B # <cjk>
+3-345F U+5CB8 # <cjk>
+3-3460 U+5DCC # <cjk>
+3-3461 U+73A9 # <cjk>
+3-3462 U+764C # <cjk>
+3-3463 U+773C # <cjk>
+3-3464 U+5CA9 # <cjk>
+3-3465 U+7FEB # <cjk>
+3-3466 U+8D0B # <cjk>
+3-3467 U+96C1 # <cjk>
+3-3468 U+9811 # <cjk>
+3-3469 U+9854 # <cjk>
+3-346A U+9858 # <cjk>
+3-346B U+4F01 # <cjk>
+3-346C U+4F0E # <cjk>
+3-346D U+5371 # <cjk>
+3-346E U+559C # <cjk>
+3-346F U+5668 # <cjk>
+3-3470 U+57FA # <cjk>
+3-3471 U+5947 # <cjk>
+3-3472 U+5B09 # <cjk>
+3-3473 U+5BC4 # <cjk>
+3-3474 U+5C90 # <cjk>
+3-3475 U+5E0C # <cjk>
+3-3476 U+5E7E # <cjk>
+3-3477 U+5FCC # <cjk>
+3-3478 U+63EE # <cjk>
+3-3479 U+673A # <cjk>
+3-347A U+65D7 # <cjk>
+3-347B U+65E2 # <cjk>
+3-347C U+671F # <cjk>
+3-347D U+68CB # <cjk>
+3-347E U+68C4 # <cjk>
+3-3521 U+6A5F # <cjk>
+3-3522 U+5E30 # <cjk>
+3-3523 U+6BC5 # <cjk>
+3-3524 U+6C17 # <cjk>
+3-3525 U+6C7D # <cjk>
+3-3526 U+757F # <cjk>
+3-3527 U+7948 # <cjk>
+3-3528 U+5B63 # <cjk>
+3-3529 U+7A00 # <cjk>
+3-352A U+7D00 # <cjk>
+3-352B U+5FBD # <cjk>
+3-352C U+898F # <cjk>
+3-352D U+8A18 # <cjk>
+3-352E U+8CB4 # <cjk>
+3-352F U+8D77 # <cjk>
+3-3530 U+8ECC # <cjk>
+3-3531 U+8F1D # <cjk>
+3-3532 U+98E2 # <cjk>
+3-3533 U+9A0E # <cjk>
+3-3534 U+9B3C # <cjk>
+3-3535 U+4E80 # <cjk>
+3-3536 U+507D # <cjk>
+3-3537 U+5100 # <cjk>
+3-3538 U+5993 # <cjk>
+3-3539 U+5B9C # <cjk>
+3-353A U+622F # <cjk>
+3-353B U+6280 # <cjk>
+3-353C U+64EC # <cjk>
+3-353D U+6B3A # <cjk>
+3-353E U+72A0 # <cjk>
+3-353F U+7591 # <cjk>
+3-3540 U+7947 # <cjk>
+3-3541 U+7FA9 # <cjk>
+3-3542 U+87FB # <cjk>
+3-3543 U+8ABC # <cjk>
+3-3544 U+8B70 # <cjk>
+3-3545 U+63AC # <cjk>
+3-3546 U+83CA # <cjk>
+3-3547 U+97A0 # <cjk>
+3-3548 U+5409 # <cjk>
+3-3549 U+5403 # <cjk>
+3-354A U+55AB # <cjk>
+3-354B U+6854 # <cjk>
+3-354C U+6A58 # <cjk>
+3-354D U+8A70 # <cjk>
+3-354E U+7827 # <cjk>
+3-354F U+6775 # <cjk>
+3-3550 U+9ECD # <cjk>
+3-3551 U+5374 # <cjk>
+3-3552 U+5BA2 # <cjk>
+3-3553 U+811A # <cjk>
+3-3554 U+8650 # <cjk>
+3-3555 U+9006 # <cjk>
+3-3556 U+4E18 # <cjk>
+3-3557 U+4E45 # <cjk>
+3-3558 U+4EC7 # <cjk>
+3-3559 U+4F11 # <cjk>
+3-355A U+53CA # <cjk>
+3-355B U+5438 # <cjk>
+3-355C U+5BAE # <cjk>
+3-355D U+5F13 # <cjk>
+3-355E U+6025 # <cjk>
+3-355F U+6551 # <cjk>
+3-3560 U+673D # <cjk>
+3-3561 U+6C42 # <cjk>
+3-3562 U+6C72 # <cjk>
+3-3563 U+6CE3 # <cjk>
+3-3564 U+7078 # <cjk>
+3-3565 U+7403 # <cjk>
+3-3566 U+7A76 # <cjk>
+3-3567 U+7AAE # <cjk>
+3-3568 U+7B08 # <cjk>
+3-3569 U+7D1A # <cjk>
+3-356A U+7CFE # <cjk>
+3-356B U+7D66 # <cjk>
+3-356C U+65E7 # <cjk>
+3-356D U+725B # <cjk>
+3-356E U+53BB # <cjk>
+3-356F U+5C45 # <cjk>
+3-3570 U+5DE8 # <cjk>
+3-3571 U+62D2 # <cjk>
+3-3572 U+62E0 # <cjk>
+3-3573 U+6319 # <cjk>
+3-3574 U+6E20 # <cjk>
+3-3575 U+865A # <cjk>
+3-3576 U+8A31 # <cjk>
+3-3577 U+8DDD # <cjk>
+3-3578 U+92F8 # <cjk>
+3-3579 U+6F01 # <cjk>
+3-357A U+79A6 # <cjk>
+3-357B U+9B5A # <cjk>
+3-357C U+4EA8 # <cjk>
+3-357D U+4EAB # <cjk>
+3-357E U+4EAC # <cjk>
+3-3621 U+4F9B # <cjk>
+3-3622 U+4FA0 # <cjk>
+3-3623 U+50D1 # <cjk>
+3-3624 U+5147 # <cjk>
+3-3625 U+7AF6 # <cjk>
+3-3626 U+5171 # <cjk>
+3-3627 U+51F6 # <cjk>
+3-3628 U+5354 # <cjk>
+3-3629 U+5321 # <cjk>
+3-362A U+537F # <cjk>
+3-362B U+53EB # <cjk>
+3-362C U+55AC # <cjk>
+3-362D U+5883 # <cjk>
+3-362E U+5CE1 # <cjk>
+3-362F U+5F37 # <cjk>
+3-3630 U+5F4A # <cjk>
+3-3631 U+602F # <cjk>
+3-3632 U+6050 # <cjk>
+3-3633 U+606D # <cjk>
+3-3634 U+631F # <cjk>
+3-3635 U+6559 # <cjk>
+3-3636 U+6A4B # <cjk>
+3-3637 U+6CC1 # <cjk>
+3-3638 U+72C2 # <cjk>
+3-3639 U+72ED # <cjk>
+3-363A U+77EF # <cjk>
+3-363B U+80F8 # <cjk>
+3-363C U+8105 # <cjk>
+3-363D U+8208 # <cjk>
+3-363E U+854E # <cjk>
+3-363F U+90F7 # <cjk>
+3-3640 U+93E1 # <cjk>
+3-3641 U+97FF # <cjk>
+3-3642 U+9957 # <cjk>
+3-3643 U+9A5A # <cjk>
+3-3644 U+4EF0 # <cjk>
+3-3645 U+51DD # <cjk>
+3-3646 U+5C2D # <cjk>
+3-3647 U+6681 # <cjk>
+3-3648 U+696D # <cjk>
+3-3649 U+5C40 # <cjk>
+3-364A U+66F2 # <cjk>
+3-364B U+6975 # <cjk>
+3-364C U+7389 # <cjk>
+3-364D U+6850 # <cjk>
+3-364E U+7C81 # <cjk>
+3-364F U+50C5 # <cjk>
+3-3650 U+52E4 # <cjk>
+3-3651 U+5747 # <cjk>
+3-3652 U+5DFE # <cjk>
+3-3653 U+9326 # <cjk>
+3-3654 U+65A4 # <cjk>
+3-3655 U+6B23 # <cjk>
+3-3656 U+6B3D # <cjk>
+3-3657 U+7434 # <cjk>
+3-3658 U+7981 # <cjk>
+3-3659 U+79BD # <cjk>
+3-365A U+7B4B # <cjk>
+3-365B U+7DCA # <cjk>
+3-365C U+82B9 # <cjk>
+3-365D U+83CC # <cjk>
+3-365E U+887F # <cjk>
+3-365F U+895F # <cjk>
+3-3660 U+8B39 # <cjk>
+3-3661 U+8FD1 # <cjk>
+3-3662 U+91D1 # <cjk>
+3-3663 U+541F # <cjk>
+3-3664 U+9280 # <cjk>
+3-3665 U+4E5D # <cjk>
+3-3666 U+5036 # <cjk>
+3-3667 U+53E5 # <cjk>
+3-3668 U+533A # <cjk>
+3-3669 U+72D7 # <cjk>
+3-366A U+7396 # <cjk>
+3-366B U+77E9 # <cjk>
+3-366C U+82E6 # <cjk>
+3-366D U+8EAF # <cjk>
+3-366E U+99C6 # <cjk>
+3-366F U+99C8 # <cjk>
+3-3670 U+99D2 # <cjk>
+3-3671 U+5177 # <cjk>
+3-3672 U+611A # <cjk>
+3-3673 U+865E # <cjk>
+3-3674 U+55B0 # <cjk>
+3-3675 U+7A7A # <cjk>
+3-3676 U+5076 # <cjk>
+3-3677 U+5BD3 # <cjk>
+3-3678 U+9047 # <cjk>
+3-3679 U+9685 # <cjk>
+3-367A U+4E32 # <cjk>
+3-367B U+6ADB # <cjk>
+3-367C U+91E7 # <cjk>
+3-367D U+5C51 # <cjk>
+3-367E U+5C48 # <cjk>
+3-3721 U+6398 # <cjk>
+3-3722 U+7A9F # <cjk>
+3-3723 U+6C93 # <cjk>
+3-3724 U+9774 # <cjk>
+3-3725 U+8F61 # <cjk>
+3-3726 U+7AAA # <cjk>
+3-3727 U+718A # <cjk>
+3-3728 U+9688 # <cjk>
+3-3729 U+7C82 # <cjk>
+3-372A U+6817 # <cjk>
+3-372B U+7E70 # <cjk>
+3-372C U+6851 # <cjk>
+3-372D U+936C # <cjk>
+3-372E U+52F2 # <cjk>
+3-372F U+541B # <cjk>
+3-3730 U+85AB # <cjk>
+3-3731 U+8A13 # <cjk>
+3-3732 U+7FA4 # <cjk>
+3-3733 U+8ECD # <cjk>
+3-3734 U+90E1 # <cjk>
+3-3735 U+5366 # <cjk>
+3-3736 U+8888 # <cjk>
+3-3737 U+7941 # <cjk>
+3-3738 U+4FC2 # <cjk>
+3-3739 U+50BE # <cjk>
+3-373A U+5211 # <cjk>
+3-373B U+5144 # <cjk>
+3-373C U+5553 # <cjk>
+3-373D U+572D # <cjk>
+3-373E U+73EA # <cjk>
+3-373F U+578B # <cjk>
+3-3740 U+5951 # <cjk>
+3-3741 U+5F62 # <cjk>
+3-3742 U+5F84 # <cjk>
+3-3743 U+6075 # <cjk>
+3-3744 U+6176 # <cjk>
+3-3745 U+6167 # <cjk>
+3-3746 U+61A9 # <cjk>
+3-3747 U+63B2 # <cjk>
+3-3748 U+643A # <cjk>
+3-3749 U+656C # <cjk>
+3-374A U+666F # <cjk>
+3-374B U+6842 # <cjk>
+3-374C U+6E13 # <cjk>
+3-374D U+7566 # <cjk>
+3-374E U+7A3D # <cjk>
+3-374F U+7CFB # <cjk>
+3-3750 U+7D4C # <cjk>
+3-3751 U+7D99 # <cjk>
+3-3752 U+7E4B # <cjk>
+3-3753 U+7F6B # <cjk>
+3-3754 U+830E # <cjk>
+3-3755 U+834A # <cjk>
+3-3756 U+86CD # <cjk>
+3-3757 U+8A08 # <cjk>
+3-3758 U+8A63 # <cjk>
+3-3759 U+8B66 # <cjk>
+3-375A U+8EFD # <cjk>
+3-375B U+981A # <cjk>
+3-375C U+9D8F # <cjk>
+3-375D U+82B8 # <cjk>
+3-375E U+8FCE # <cjk>
+3-375F U+9BE8 # <cjk>
+3-3760 U+5287 # <cjk>
+3-3761 U+621F # <cjk>
+3-3762 U+6483 # <cjk>
+3-3763 U+6FC0 # <cjk>
+3-3764 U+9699 # <cjk>
+3-3765 U+6841 # <cjk>
+3-3766 U+5091 # <cjk>
+3-3767 U+6B20 # <cjk>
+3-3768 U+6C7A # <cjk>
+3-3769 U+6F54 # <cjk>
+3-376A U+7A74 # <cjk>
+3-376B U+7D50 # <cjk>
+3-376C U+8840 # <cjk>
+3-376D U+8A23 # <cjk>
+3-376E U+6708 # <cjk>
+3-376F U+4EF6 # <cjk>
+3-3770 U+5039 # <cjk>
+3-3771 U+5026 # <cjk>
+3-3772 U+5065 # <cjk>
+3-3773 U+517C # <cjk>
+3-3774 U+5238 # <cjk>
+3-3775 U+5263 # <cjk>
+3-3776 U+55A7 # <cjk>
+3-3777 U+570F # <cjk>
+3-3778 U+5805 # <cjk>
+3-3779 U+5ACC # <cjk>
+3-377A U+5EFA # <cjk>
+3-377B U+61B2 # <cjk>
+3-377C U+61F8 # <cjk>
+3-377D U+62F3 # <cjk>
+3-377E U+6372 # <cjk>
+3-3821 U+691C # <cjk>
+3-3822 U+6A29 # <cjk>
+3-3823 U+727D # <cjk>
+3-3824 U+72AC # <cjk>
+3-3825 U+732E # <cjk>
+3-3826 U+7814 # <cjk>
+3-3827 U+786F # <cjk>
+3-3828 U+7D79 # <cjk>
+3-3829 U+770C # <cjk>
+3-382A U+80A9 # <cjk>
+3-382B U+898B # <cjk>
+3-382C U+8B19 # <cjk>
+3-382D U+8CE2 # <cjk>
+3-382E U+8ED2 # <cjk>
+3-382F U+9063 # <cjk>
+3-3830 U+9375 # <cjk>
+3-3831 U+967A # <cjk>
+3-3832 U+9855 # <cjk>
+3-3833 U+9A13 # <cjk>
+3-3834 U+9E78 # <cjk>
+3-3835 U+5143 # <cjk>
+3-3836 U+539F # <cjk>
+3-3837 U+53B3 # <cjk>
+3-3838 U+5E7B # <cjk>
+3-3839 U+5F26 # <cjk>
+3-383A U+6E1B # <cjk>
+3-383B U+6E90 # <cjk>
+3-383C U+7384 # <cjk>
+3-383D U+73FE # <cjk>
+3-383E U+7D43 # <cjk>
+3-383F U+8237 # <cjk>
+3-3840 U+8A00 # <cjk>
+3-3841 U+8AFA # <cjk>
+3-3842 U+9650 # <cjk>
+3-3843 U+4E4E # <cjk>
+3-3844 U+500B # <cjk>
+3-3845 U+53E4 # <cjk>
+3-3846 U+547C # <cjk>
+3-3847 U+56FA # <cjk>
+3-3848 U+59D1 # <cjk>
+3-3849 U+5B64 # <cjk>
+3-384A U+5DF1 # <cjk>
+3-384B U+5EAB # <cjk>
+3-384C U+5F27 # <cjk>
+3-384D U+6238 # <cjk>
+3-384E U+6545 # <cjk>
+3-384F U+67AF # <cjk>
+3-3850 U+6E56 # <cjk>
+3-3851 U+72D0 # <cjk>
+3-3852 U+7CCA # <cjk>
+3-3853 U+88B4 # <cjk>
+3-3854 U+80A1 # <cjk>
+3-3855 U+80E1 # <cjk>
+3-3856 U+83F0 # <cjk>
+3-3857 U+864E # <cjk>
+3-3858 U+8A87 # <cjk>
+3-3859 U+8DE8 # <cjk>
+3-385A U+9237 # <cjk>
+3-385B U+96C7 # <cjk>
+3-385C U+9867 # <cjk>
+3-385D U+9F13 # <cjk>
+3-385E U+4E94 # <cjk>
+3-385F U+4E92 # <cjk>
+3-3860 U+4F0D # <cjk>
+3-3861 U+5348 # <cjk>
+3-3862 U+5449 # <cjk>
+3-3863 U+543E # <cjk>
+3-3864 U+5A2F # <cjk>
+3-3865 U+5F8C # <cjk>
+3-3866 U+5FA1 # <cjk>
+3-3867 U+609F # <cjk>
+3-3868 U+68A7 # <cjk>
+3-3869 U+6A8E # <cjk>
+3-386A U+745A # <cjk>
+3-386B U+7881 # <cjk>
+3-386C U+8A9E # <cjk>
+3-386D U+8AA4 # <cjk>
+3-386E U+8B77 # <cjk>
+3-386F U+9190 # <cjk>
+3-3870 U+4E5E # <cjk>
+3-3871 U+9BC9 # <cjk>
+3-3872 U+4EA4 # <cjk>
+3-3873 U+4F7C # <cjk>
+3-3874 U+4FAF # <cjk>
+3-3875 U+5019 # <cjk>
+3-3876 U+5016 # <cjk>
+3-3877 U+5149 # <cjk>
+3-3878 U+516C # <cjk>
+3-3879 U+529F # <cjk>
+3-387A U+52B9 # <cjk>
+3-387B U+52FE # <cjk>
+3-387C U+539A # <cjk>
+3-387D U+53E3 # <cjk>
+3-387E U+5411 # <cjk>
+3-3921 U+540E # <cjk>
+3-3922 U+5589 # <cjk>
+3-3923 U+5751 # <cjk>
+3-3924 U+57A2 # <cjk>
+3-3925 U+597D # <cjk>
+3-3926 U+5B54 # <cjk>
+3-3927 U+5B5D # <cjk>
+3-3928 U+5B8F # <cjk>
+3-3929 U+5DE5 # <cjk>
+3-392A U+5DE7 # <cjk>
+3-392B U+5DF7 # <cjk>
+3-392C U+5E78 # <cjk>
+3-392D U+5E83 # <cjk>
+3-392E U+5E9A # <cjk>
+3-392F U+5EB7 # <cjk>
+3-3930 U+5F18 # <cjk>
+3-3931 U+6052 # <cjk>
+3-3932 U+614C # <cjk>
+3-3933 U+6297 # <cjk>
+3-3934 U+62D8 # <cjk>
+3-3935 U+63A7 # <cjk>
+3-3936 U+653B # <cjk>
+3-3937 U+6602 # <cjk>
+3-3938 U+6643 # <cjk>
+3-3939 U+66F4 # <cjk>
+3-393A U+676D # <cjk>
+3-393B U+6821 # <cjk>
+3-393C U+6897 # <cjk>
+3-393D U+69CB # <cjk>
+3-393E U+6C5F # <cjk>
+3-393F U+6D2A # <cjk>
+3-3940 U+6D69 # <cjk>
+3-3941 U+6E2F # <cjk>
+3-3942 U+6E9D # <cjk>
+3-3943 U+7532 # <cjk>
+3-3944 U+7687 # <cjk>
+3-3945 U+786C # <cjk>
+3-3946 U+7A3F # <cjk>
+3-3947 U+7CE0 # <cjk>
+3-3948 U+7D05 # <cjk>
+3-3949 U+7D18 # <cjk>
+3-394A U+7D5E # <cjk>
+3-394B U+7DB1 # <cjk>
+3-394C U+8015 # <cjk>
+3-394D U+8003 # <cjk>
+3-394E U+80AF # <cjk>
+3-394F U+80B1 # <cjk>
+3-3950 U+8154 # <cjk>
+3-3951 U+818F # <cjk>
+3-3952 U+822A # <cjk>
+3-3953 U+8352 # <cjk>
+3-3954 U+884C # <cjk>
+3-3955 U+8861 # <cjk>
+3-3956 U+8B1B # <cjk>
+3-3957 U+8CA2 # <cjk>
+3-3958 U+8CFC # <cjk>
+3-3959 U+90CA # <cjk>
+3-395A U+9175 # <cjk>
+3-395B U+9271 # <cjk>
+3-395C U+783F # <cjk>
+3-395D U+92FC # <cjk>
+3-395E U+95A4 # <cjk>
+3-395F U+964D # <cjk>
+3-3960 U+9805 # <cjk>
+3-3961 U+9999 # <cjk>
+3-3962 U+9AD8 # <cjk>
+3-3963 U+9D3B # <cjk>
+3-3964 U+525B # <cjk>
+3-3965 U+52AB # <cjk>
+3-3966 U+53F7 # <cjk>
+3-3967 U+5408 # <cjk>
+3-3968 U+58D5 # <cjk>
+3-3969 U+62F7 # <cjk>
+3-396A U+6FE0 # <cjk>
+3-396B U+8C6A # <cjk>
+3-396C U+8F5F # <cjk>
+3-396D U+9EB9 # <cjk>
+3-396E U+514B # <cjk>
+3-396F U+523B # <cjk>
+3-3970 U+544A # <cjk>
+3-3971 U+56FD # <cjk>
+3-3972 U+7A40 # <cjk>
+3-3973 U+9177 # <cjk>
+3-3974 U+9D60 # <cjk>
+3-3975 U+9ED2 # <cjk>
+3-3976 U+7344 # <cjk>
+3-3977 U+6F09 # <cjk>
+3-3978 U+8170 # <cjk>
+3-3979 U+7511 # <cjk>
+3-397A U+5FFD # <cjk>
+3-397B U+60DA # <cjk>
+3-397C U+9AA8 # <cjk>
+3-397D U+72DB # <cjk>
+3-397E U+8FBC # <cjk>
+3-3A21 U+6B64 # <cjk>
+3-3A22 U+9803 # <cjk>
+3-3A23 U+4ECA # <cjk>
+3-3A24 U+56F0 # <cjk>
+3-3A25 U+5764 # <cjk>
+3-3A26 U+58BE # <cjk>
+3-3A27 U+5A5A # <cjk>
+3-3A28 U+6068 # <cjk>
+3-3A29 U+61C7 # <cjk>
+3-3A2A U+660F # <cjk>
+3-3A2B U+6606 # <cjk>
+3-3A2C U+6839 # <cjk>
+3-3A2D U+68B1 # <cjk>
+3-3A2E U+6DF7 # <cjk>
+3-3A2F U+75D5 # <cjk>
+3-3A30 U+7D3A # <cjk>
+3-3A31 U+826E # <cjk>
+3-3A32 U+9B42 # <cjk>
+3-3A33 U+4E9B # <cjk>
+3-3A34 U+4F50 # <cjk>
+3-3A35 U+53C9 # <cjk>
+3-3A36 U+5506 # <cjk>
+3-3A37 U+5D6F # <cjk>
+3-3A38 U+5DE6 # <cjk>
+3-3A39 U+5DEE # <cjk>
+3-3A3A U+67FB # <cjk>
+3-3A3B U+6C99 # <cjk>
+3-3A3C U+7473 # <cjk>
+3-3A3D U+7802 # <cjk>
+3-3A3E U+8A50 # <cjk>
+3-3A3F U+9396 # <cjk>
+3-3A40 U+88DF # <cjk>
+3-3A41 U+5750 # <cjk>
+3-3A42 U+5EA7 # <cjk>
+3-3A43 U+632B # <cjk>
+3-3A44 U+50B5 # <cjk>
+3-3A45 U+50AC # <cjk>
+3-3A46 U+518D # <cjk>
+3-3A47 U+6700 # <cjk>
+3-3A48 U+54C9 # <cjk>
+3-3A49 U+585E # <cjk>
+3-3A4A U+59BB # <cjk>
+3-3A4B U+5BB0 # <cjk>
+3-3A4C U+5F69 # <cjk>
+3-3A4D U+624D # <cjk>
+3-3A4E U+63A1 # <cjk>
+3-3A4F U+683D # <cjk>
+3-3A50 U+6B73 # <cjk>
+3-3A51 U+6E08 # <cjk>
+3-3A52 U+707D # <cjk>
+3-3A53 U+91C7 # <cjk>
+3-3A54 U+7280 # <cjk>
+3-3A55 U+7815 # <cjk>
+3-3A56 U+7826 # <cjk>
+3-3A57 U+796D # <cjk>
+3-3A58 U+658E # <cjk>
+3-3A59 U+7D30 # <cjk>
+3-3A5A U+83DC # <cjk>
+3-3A5B U+88C1 # <cjk>
+3-3A5C U+8F09 # <cjk>
+3-3A5D U+969B # <cjk>
+3-3A5E U+5264 # <cjk>
+3-3A5F U+5728 # <cjk>
+3-3A60 U+6750 # <cjk>
+3-3A61 U+7F6A # <cjk>
+3-3A62 U+8CA1 # <cjk>
+3-3A63 U+51B4 # <cjk>
+3-3A64 U+5742 # <cjk>
+3-3A65 U+962A # <cjk>
+3-3A66 U+583A # <cjk>
+3-3A67 U+698A # <cjk>
+3-3A68 U+80B4 # <cjk>
+3-3A69 U+54B2 # <cjk>
+3-3A6A U+5D0E # <cjk>
+3-3A6B U+57FC # <cjk>
+3-3A6C U+7895 # <cjk>
+3-3A6D U+9DFA # <cjk>
+3-3A6E U+4F5C # <cjk>
+3-3A6F U+524A # <cjk>
+3-3A70 U+548B # <cjk>
+3-3A71 U+643E # <cjk>
+3-3A72 U+6628 # <cjk>
+3-3A73 U+6714 # <cjk>
+3-3A74 U+67F5 # <cjk>
+3-3A75 U+7A84 # <cjk>
+3-3A76 U+7B56 # <cjk>
+3-3A77 U+7D22 # <cjk>
+3-3A78 U+932F # <cjk>
+3-3A79 U+685C # <cjk>
+3-3A7A U+9BAD # <cjk>
+3-3A7B U+7B39 # <cjk>
+3-3A7C U+5319 # <cjk>
+3-3A7D U+518A # <cjk>
+3-3A7E U+5237 # <cjk>
+3-3B21 U+5BDF # <cjk>
+3-3B22 U+62F6 # <cjk>
+3-3B23 U+64AE # <cjk>
+3-3B24 U+64E6 # <cjk>
+3-3B25 U+672D # <cjk>
+3-3B26 U+6BBA # <cjk>
+3-3B27 U+85A9 # <cjk>
+3-3B28 U+96D1 # <cjk>
+3-3B29 U+7690 # <cjk>
+3-3B2A U+9BD6 # <cjk>
+3-3B2B U+634C # <cjk>
+3-3B2C U+9306 # <cjk>
+3-3B2D U+9BAB # <cjk>
+3-3B2E U+76BF # <cjk>
+3-3B2F U+6652 # <cjk>
+3-3B30 U+4E09 # <cjk>
+3-3B31 U+5098 # <cjk>
+3-3B32 U+53C2 # <cjk>
+3-3B33 U+5C71 # <cjk>
+3-3B34 U+60E8 # <cjk>
+3-3B35 U+6492 # <cjk>
+3-3B36 U+6563 # <cjk>
+3-3B37 U+685F # <cjk>
+3-3B38 U+71E6 # <cjk>
+3-3B39 U+73CA # <cjk>
+3-3B3A U+7523 # <cjk>
+3-3B3B U+7B97 # <cjk>
+3-3B3C U+7E82 # <cjk>
+3-3B3D U+8695 # <cjk>
+3-3B3E U+8B83 # <cjk>
+3-3B3F U+8CDB # <cjk>
+3-3B40 U+9178 # <cjk>
+3-3B41 U+9910 # <cjk>
+3-3B42 U+65AC # <cjk>
+3-3B43 U+66AB # <cjk>
+3-3B44 U+6B8B # <cjk>
+3-3B45 U+4ED5 # <cjk>
+3-3B46 U+4ED4 # <cjk>
+3-3B47 U+4F3A # <cjk>
+3-3B48 U+4F7F # <cjk>
+3-3B49 U+523A # <cjk>
+3-3B4A U+53F8 # <cjk>
+3-3B4B U+53F2 # <cjk>
+3-3B4C U+55E3 # <cjk>
+3-3B4D U+56DB # <cjk>
+3-3B4E U+58EB # <cjk>
+3-3B4F U+59CB # <cjk>
+3-3B50 U+59C9 # <cjk>
+3-3B51 U+59FF # <cjk>
+3-3B52 U+5B50 # <cjk>
+3-3B53 U+5C4D # <cjk>
+3-3B54 U+5E02 # <cjk>
+3-3B55 U+5E2B # <cjk>
+3-3B56 U+5FD7 # <cjk>
+3-3B57 U+601D # <cjk>
+3-3B58 U+6307 # <cjk>
+3-3B59 U+652F # <cjk>
+3-3B5A U+5B5C # <cjk>
+3-3B5B U+65AF # <cjk>
+3-3B5C U+65BD # <cjk>
+3-3B5D U+65E8 # <cjk>
+3-3B5E U+679D # <cjk>
+3-3B5F U+6B62 # <cjk>
+3-3B60 U+6B7B # <cjk>
+3-3B61 U+6C0F # <cjk>
+3-3B62 U+7345 # <cjk>
+3-3B63 U+7949 # <cjk>
+3-3B64 U+79C1 # <cjk>
+3-3B65 U+7CF8 # <cjk>
+3-3B66 U+7D19 # <cjk>
+3-3B67 U+7D2B # <cjk>
+3-3B68 U+80A2 # <cjk>
+3-3B69 U+8102 # <cjk>
+3-3B6A U+81F3 # <cjk>
+3-3B6B U+8996 # <cjk>
+3-3B6C U+8A5E # <cjk>
+3-3B6D U+8A69 # <cjk>
+3-3B6E U+8A66 # <cjk>
+3-3B6F U+8A8C # <cjk>
+3-3B70 U+8AEE # <cjk>
+3-3B71 U+8CC7 # <cjk>
+3-3B72 U+8CDC # <cjk>
+3-3B73 U+96CC # <cjk>
+3-3B74 U+98FC # <cjk>
+3-3B75 U+6B6F # <cjk>
+3-3B76 U+4E8B # <cjk>
+3-3B77 U+4F3C # <cjk>
+3-3B78 U+4F8D # <cjk>
+3-3B79 U+5150 # <cjk>
+3-3B7A U+5B57 # <cjk>
+3-3B7B U+5BFA # <cjk>
+3-3B7C U+6148 # <cjk>
+3-3B7D U+6301 # <cjk>
+3-3B7E U+6642 # <cjk>
+3-3C21 U+6B21 # <cjk>
+3-3C22 U+6ECB # <cjk>
+3-3C23 U+6CBB # <cjk>
+3-3C24 U+723E # <cjk>
+3-3C25 U+74BD # <cjk>
+3-3C26 U+75D4 # <cjk>
+3-3C27 U+78C1 # <cjk>
+3-3C28 U+793A # <cjk>
+3-3C29 U+800C # <cjk>
+3-3C2A U+8033 # <cjk>
+3-3C2B U+81EA # <cjk>
+3-3C2C U+8494 # <cjk>
+3-3C2D U+8F9E # <cjk>
+3-3C2E U+6C50 # <cjk>
+3-3C2F U+9E7F # <cjk>
+3-3C30 U+5F0F # <cjk>
+3-3C31 U+8B58 # <cjk>
+3-3C32 U+9D2B # <cjk>
+3-3C33 U+7AFA # <cjk>
+3-3C34 U+8EF8 # <cjk>
+3-3C35 U+5B8D # <cjk>
+3-3C36 U+96EB # <cjk>
+3-3C37 U+4E03 # <cjk>
+3-3C38 U+53F1 # <cjk>
+3-3C39 U+57F7 # <cjk>
+3-3C3A U+5931 # <cjk>
+3-3C3B U+5AC9 # <cjk>
+3-3C3C U+5BA4 # <cjk>
+3-3C3D U+6089 # <cjk>
+3-3C3E U+6E7F # <cjk>
+3-3C3F U+6F06 # <cjk>
+3-3C40 U+75BE # <cjk>
+3-3C41 U+8CEA # <cjk>
+3-3C42 U+5B9F # <cjk>
+3-3C43 U+8500 # <cjk>
+3-3C44 U+7BE0 # <cjk>
+3-3C45 U+5072 # <cjk>
+3-3C46 U+67F4 # <cjk>
+3-3C47 U+829D # <cjk>
+3-3C48 U+5C61 # <cjk>
+3-3C49 U+854A # <cjk>
+3-3C4A U+7E1E # <cjk>
+3-3C4B U+820E # <cjk>
+3-3C4C U+5199 # <cjk>
+3-3C4D U+5C04 # <cjk>
+3-3C4E U+6368 # <cjk>
+3-3C4F U+8D66 # <cjk>
+3-3C50 U+659C # <cjk>
+3-3C51 U+716E # <cjk>
+3-3C52 U+793E # <cjk>
+3-3C53 U+7D17 # <cjk>
+3-3C54 U+8005 # <cjk>
+3-3C55 U+8B1D # <cjk>
+3-3C56 U+8ECA # <cjk>
+3-3C57 U+906E # <cjk>
+3-3C58 U+86C7 # <cjk>
+3-3C59 U+90AA # <cjk>
+3-3C5A U+501F # <cjk>
+3-3C5B U+52FA # <cjk>
+3-3C5C U+5C3A # <cjk>
+3-3C5D U+6753 # <cjk>
+3-3C5E U+707C # <cjk>
+3-3C5F U+7235 # <cjk>
+3-3C60 U+914C # <cjk>
+3-3C61 U+91C8 # <cjk>
+3-3C62 U+932B # <cjk>
+3-3C63 U+82E5 # <cjk>
+3-3C64 U+5BC2 # <cjk>
+3-3C65 U+5F31 # <cjk>
+3-3C66 U+60F9 # <cjk>
+3-3C67 U+4E3B # <cjk>
+3-3C68 U+53D6 # <cjk>
+3-3C69 U+5B88 # <cjk>
+3-3C6A U+624B # <cjk>
+3-3C6B U+6731 # <cjk>
+3-3C6C U+6B8A # <cjk>
+3-3C6D U+72E9 # <cjk>
+3-3C6E U+73E0 # <cjk>
+3-3C6F U+7A2E # <cjk>
+3-3C70 U+816B # <cjk>
+3-3C71 U+8DA3 # <cjk>
+3-3C72 U+9152 # <cjk>
+3-3C73 U+9996 # <cjk>
+3-3C74 U+5112 # <cjk>
+3-3C75 U+53D7 # <cjk>
+3-3C76 U+546A # <cjk>
+3-3C77 U+5BFF # <cjk>
+3-3C78 U+6388 # <cjk>
+3-3C79 U+6A39 # <cjk>
+3-3C7A U+7DAC # <cjk>
+3-3C7B U+9700 # <cjk>
+3-3C7C U+56DA # <cjk>
+3-3C7D U+53CE # <cjk>
+3-3C7E U+5468 # <cjk>
+3-3D21 U+5B97 # <cjk>
+3-3D22 U+5C31 # <cjk>
+3-3D23 U+5DDE # <cjk>
+3-3D24 U+4FEE # <cjk>
+3-3D25 U+6101 # <cjk>
+3-3D26 U+62FE # <cjk>
+3-3D27 U+6D32 # <cjk>
+3-3D28 U+79C0 # <cjk>
+3-3D29 U+79CB # <cjk>
+3-3D2A U+7D42 # <cjk>
+3-3D2B U+7E4D # <cjk>
+3-3D2C U+7FD2 # <cjk>
+3-3D2D U+81ED # <cjk>
+3-3D2E U+821F # <cjk>
+3-3D2F U+8490 # <cjk>
+3-3D30 U+8846 # <cjk>
+3-3D31 U+8972 # <cjk>
+3-3D32 U+8B90 # <cjk>
+3-3D33 U+8E74 # <cjk>
+3-3D34 U+8F2F # <cjk>
+3-3D35 U+9031 # <cjk>
+3-3D36 U+914B # <cjk>
+3-3D37 U+916C # <cjk>
+3-3D38 U+96C6 # <cjk>
+3-3D39 U+919C # <cjk>
+3-3D3A U+4EC0 # <cjk>
+3-3D3B U+4F4F # <cjk>
+3-3D3C U+5145 # <cjk>
+3-3D3D U+5341 # <cjk>
+3-3D3E U+5F93 # <cjk>
+3-3D3F U+620E # <cjk>
+3-3D40 U+67D4 # <cjk>
+3-3D41 U+6C41 # <cjk>
+3-3D42 U+6E0B # <cjk>
+3-3D43 U+7363 # <cjk>
+3-3D44 U+7E26 # <cjk>
+3-3D45 U+91CD # <cjk>
+3-3D46 U+9283 # <cjk>
+3-3D47 U+53D4 # <cjk>
+3-3D48 U+5919 # <cjk>
+3-3D49 U+5BBF # <cjk>
+3-3D4A U+6DD1 # <cjk>
+3-3D4B U+795D # <cjk>
+3-3D4C U+7E2E # <cjk>
+3-3D4D U+7C9B # <cjk>
+3-3D4E U+587E # <cjk>
+3-3D4F U+719F # <cjk>
+3-3D50 U+51FA # <cjk>
+3-3D51 U+8853 # <cjk>
+3-3D52 U+8FF0 # <cjk>
+3-3D53 U+4FCA # <cjk>
+3-3D54 U+5CFB # <cjk>
+3-3D55 U+6625 # <cjk>
+3-3D56 U+77AC # <cjk>
+3-3D57 U+7AE3 # <cjk>
+3-3D58 U+821C # <cjk>
+3-3D59 U+99FF # <cjk>
+3-3D5A U+51C6 # <cjk>
+3-3D5B U+5FAA # <cjk>
+3-3D5C U+65EC # <cjk>
+3-3D5D U+696F # <cjk>
+3-3D5E U+6B89 # <cjk>
+3-3D5F U+6DF3 # <cjk>
+3-3D60 U+6E96 # <cjk>
+3-3D61 U+6F64 # <cjk>
+3-3D62 U+76FE # <cjk>
+3-3D63 U+7D14 # <cjk>
+3-3D64 U+5DE1 # <cjk>
+3-3D65 U+9075 # <cjk>
+3-3D66 U+9187 # <cjk>
+3-3D67 U+9806 # <cjk>
+3-3D68 U+51E6 # <cjk>
+3-3D69 U+521D # <cjk>
+3-3D6A U+6240 # <cjk>
+3-3D6B U+6691 # <cjk>
+3-3D6C U+66D9 # <cjk>
+3-3D6D U+6E1A # <cjk>
+3-3D6E U+5EB6 # <cjk>
+3-3D6F U+7DD2 # <cjk>
+3-3D70 U+7F72 # <cjk>
+3-3D71 U+66F8 # <cjk>
+3-3D72 U+85AF # <cjk>
+3-3D73 U+85F7 # <cjk>
+3-3D74 U+8AF8 # <cjk>
+3-3D75 U+52A9 # <cjk>
+3-3D76 U+53D9 # <cjk>
+3-3D77 U+5973 # <cjk>
+3-3D78 U+5E8F # <cjk>
+3-3D79 U+5F90 # <cjk>
+3-3D7A U+6055 # <cjk>
+3-3D7B U+92E4 # <cjk>
+3-3D7C U+9664 # <cjk>
+3-3D7D U+50B7 # <cjk>
+3-3D7E U+511F # <cjk>
+3-3E21 U+52DD # <cjk>
+3-3E22 U+5320 # <cjk>
+3-3E23 U+5347 # <cjk>
+3-3E24 U+53EC # <cjk>
+3-3E25 U+54E8 # <cjk>
+3-3E26 U+5546 # <cjk>
+3-3E27 U+5531 # <cjk>
+3-3E28 U+5617 # <cjk>
+3-3E29 U+5968 # <cjk>
+3-3E2A U+59BE # <cjk>
+3-3E2B U+5A3C # <cjk>
+3-3E2C U+5BB5 # <cjk>
+3-3E2D U+5C06 # <cjk>
+3-3E2E U+5C0F # <cjk>
+3-3E2F U+5C11 # <cjk>
+3-3E30 U+5C1A # <cjk>
+3-3E31 U+5E84 # <cjk>
+3-3E32 U+5E8A # <cjk>
+3-3E33 U+5EE0 # <cjk>
+3-3E34 U+5F70 # <cjk>
+3-3E35 U+627F # <cjk>
+3-3E36 U+6284 # <cjk>
+3-3E37 U+62DB # <cjk>
+3-3E38 U+638C # <cjk>
+3-3E39 U+6377 # <cjk>
+3-3E3A U+6607 # <cjk>
+3-3E3B U+660C # <cjk>
+3-3E3C U+662D # <cjk>
+3-3E3D U+6676 # <cjk>
+3-3E3E U+677E # <cjk>
+3-3E3F U+68A2 # <cjk>
+3-3E40 U+6A1F # <cjk>
+3-3E41 U+6A35 # <cjk>
+3-3E42 U+6CBC # <cjk>
+3-3E43 U+6D88 # <cjk>
+3-3E44 U+6E09 # <cjk>
+3-3E45 U+6E58 # <cjk>
+3-3E46 U+713C # <cjk>
+3-3E47 U+7126 # <cjk>
+3-3E48 U+7167 # <cjk>
+3-3E49 U+75C7 # <cjk>
+3-3E4A U+7701 # <cjk>
+3-3E4B U+785D # <cjk>
+3-3E4C U+7901 # <cjk>
+3-3E4D U+7965 # <cjk>
+3-3E4E U+79F0 # <cjk>
+3-3E4F U+7AE0 # <cjk>
+3-3E50 U+7B11 # <cjk>
+3-3E51 U+7CA7 # <cjk>
+3-3E52 U+7D39 # <cjk>
+3-3E53 U+8096 # <cjk>
+3-3E54 U+83D6 # <cjk>
+3-3E55 U+848B # <cjk>
+3-3E56 U+8549 # <cjk>
+3-3E57 U+885D # <cjk>
+3-3E58 U+88F3 # <cjk>
+3-3E59 U+8A1F # <cjk>
+3-3E5A U+8A3C # <cjk>
+3-3E5B U+8A54 # <cjk>
+3-3E5C U+8A73 # <cjk>
+3-3E5D U+8C61 # <cjk>
+3-3E5E U+8CDE # <cjk>
+3-3E5F U+91A4 # <cjk>
+3-3E60 U+9266 # <cjk>
+3-3E61 U+937E # <cjk>
+3-3E62 U+9418 # <cjk>
+3-3E63 U+969C # <cjk>
+3-3E64 U+9798 # <cjk>
+3-3E65 U+4E0A # <cjk>
+3-3E66 U+4E08 # <cjk>
+3-3E67 U+4E1E # <cjk>
+3-3E68 U+4E57 # <cjk>
+3-3E69 U+5197 # <cjk>
+3-3E6A U+5270 # <cjk>
+3-3E6B U+57CE # <cjk>
+3-3E6C U+5834 # <cjk>
+3-3E6D U+58CC # <cjk>
+3-3E6E U+5B22 # <cjk>
+3-3E6F U+5E38 # <cjk>
+3-3E70 U+60C5 # <cjk>
+3-3E71 U+64FE # <cjk>
+3-3E72 U+6761 # <cjk>
+3-3E73 U+6756 # <cjk>
+3-3E74 U+6D44 # <cjk>
+3-3E75 U+72B6 # <cjk>
+3-3E76 U+7573 # <cjk>
+3-3E77 U+7A63 # <cjk>
+3-3E78 U+84B8 # <cjk>
+3-3E79 U+8B72 # <cjk>
+3-3E7A U+91B8 # <cjk>
+3-3E7B U+9320 # <cjk>
+3-3E7C U+5631 # <cjk>
+3-3E7D U+57F4 # <cjk>
+3-3E7E U+98FE # <cjk>
+3-3F21 U+62ED # <cjk>
+3-3F22 U+690D # <cjk>
+3-3F23 U+6B96 # <cjk>
+3-3F24 U+71ED # <cjk>
+3-3F25 U+7E54 # <cjk>
+3-3F26 U+8077 # <cjk>
+3-3F27 U+8272 # <cjk>
+3-3F28 U+89E6 # <cjk>
+3-3F29 U+98DF # <cjk>
+3-3F2A U+8755 # <cjk>
+3-3F2B U+8FB1 # <cjk>
+3-3F2C U+5C3B # <cjk>
+3-3F2D U+4F38 # <cjk>
+3-3F2E U+4FE1 # <cjk>
+3-3F2F U+4FB5 # <cjk>
+3-3F30 U+5507 # <cjk>
+3-3F31 U+5A20 # <cjk>
+3-3F32 U+5BDD # <cjk>
+3-3F33 U+5BE9 # <cjk>
+3-3F34 U+5FC3 # <cjk>
+3-3F35 U+614E # <cjk>
+3-3F36 U+632F # <cjk>
+3-3F37 U+65B0 # <cjk>
+3-3F38 U+664B # <cjk>
+3-3F39 U+68EE # <cjk>
+3-3F3A U+699B # <cjk>
+3-3F3B U+6D78 # <cjk>
+3-3F3C U+6DF1 # <cjk>
+3-3F3D U+7533 # <cjk>
+3-3F3E U+75B9 # <cjk>
+3-3F3F U+771F # <cjk>
+3-3F40 U+795E # <cjk>
+3-3F41 U+79E6 # <cjk>
+3-3F42 U+7D33 # <cjk>
+3-3F43 U+81E3 # <cjk>
+3-3F44 U+82AF # <cjk>
+3-3F45 U+85AA # <cjk>
+3-3F46 U+89AA # <cjk>
+3-3F47 U+8A3A # <cjk>
+3-3F48 U+8EAB # <cjk>
+3-3F49 U+8F9B # <cjk>
+3-3F4A U+9032 # <cjk>
+3-3F4B U+91DD # <cjk>
+3-3F4C U+9707 # <cjk>
+3-3F4D U+4EBA # <cjk>
+3-3F4E U+4EC1 # <cjk>
+3-3F4F U+5203 # <cjk>
+3-3F50 U+5875 # <cjk>
+3-3F51 U+58EC # <cjk>
+3-3F52 U+5C0B # <cjk>
+3-3F53 U+751A # <cjk>
+3-3F54 U+5C3D # <cjk>
+3-3F55 U+814E # <cjk>
+3-3F56 U+8A0A # <cjk>
+3-3F57 U+8FC5 # <cjk>
+3-3F58 U+9663 # <cjk>
+3-3F59 U+976D # <cjk>
+3-3F5A U+7B25 # <cjk>
+3-3F5B U+8ACF # <cjk>
+3-3F5C U+9808 # <cjk>
+3-3F5D U+9162 # <cjk>
+3-3F5E U+56F3 # <cjk>
+3-3F5F U+53A8 # <cjk>
+3-3F60 U+9017 # <cjk>
+3-3F61 U+5439 # <cjk>
+3-3F62 U+5782 # <cjk>
+3-3F63 U+5E25 # <cjk>
+3-3F64 U+63A8 # <cjk>
+3-3F65 U+6C34 # <cjk>
+3-3F66 U+708A # <cjk>
+3-3F67 U+7761 # <cjk>
+3-3F68 U+7C8B # <cjk>
+3-3F69 U+7FE0 # <cjk>
+3-3F6A U+8870 # <cjk>
+3-3F6B U+9042 # <cjk>
+3-3F6C U+9154 # <cjk>
+3-3F6D U+9310 # <cjk>
+3-3F6E U+9318 # <cjk>
+3-3F6F U+968F # <cjk>
+3-3F70 U+745E # <cjk>
+3-3F71 U+9AC4 # <cjk>
+3-3F72 U+5D07 # <cjk>
+3-3F73 U+5D69 # <cjk>
+3-3F74 U+6570 # <cjk>
+3-3F75 U+67A2 # <cjk>
+3-3F76 U+8DA8 # <cjk>
+3-3F77 U+96DB # <cjk>
+3-3F78 U+636E # <cjk>
+3-3F79 U+6749 # <cjk>
+3-3F7A U+6919 # <cjk>
+3-3F7B U+83C5 # <cjk>
+3-3F7C U+9817 # <cjk>
+3-3F7D U+96C0 # <cjk>
+3-3F7E U+88FE # <cjk>
+3-4021 U+6F84 # <cjk>
+3-4022 U+647A # <cjk>
+3-4023 U+5BF8 # <cjk>
+3-4024 U+4E16 # <cjk>
+3-4025 U+702C # <cjk>
+3-4026 U+755D # <cjk>
+3-4027 U+662F # <cjk>
+3-4028 U+51C4 # <cjk>
+3-4029 U+5236 # <cjk>
+3-402A U+52E2 # <cjk>
+3-402B U+59D3 # <cjk>
+3-402C U+5F81 # <cjk>
+3-402D U+6027 # <cjk>
+3-402E U+6210 # <cjk>
+3-402F U+653F # <cjk>
+3-4030 U+6574 # <cjk>
+3-4031 U+661F # <cjk>
+3-4032 U+6674 # <cjk>
+3-4033 U+68F2 # <cjk>
+3-4034 U+6816 # <cjk>
+3-4035 U+6B63 # <cjk>
+3-4036 U+6E05 # <cjk>
+3-4037 U+7272 # <cjk>
+3-4038 U+751F # <cjk>
+3-4039 U+76DB # <cjk>
+3-403A U+7CBE # <cjk>
+3-403B U+8056 # <cjk>
+3-403C U+58F0 # <cjk>
+3-403D U+88FD # <cjk>
+3-403E U+897F # <cjk>
+3-403F U+8AA0 # <cjk>
+3-4040 U+8A93 # <cjk>
+3-4041 U+8ACB # <cjk>
+3-4042 U+901D # <cjk>
+3-4043 U+9192 # <cjk>
+3-4044 U+9752 # <cjk>
+3-4045 U+9759 # <cjk>
+3-4046 U+6589 # <cjk>
+3-4047 U+7A0E # <cjk>
+3-4048 U+8106 # <cjk>
+3-4049 U+96BB # <cjk>
+3-404A U+5E2D # <cjk>
+3-404B U+60DC # <cjk>
+3-404C U+621A # <cjk>
+3-404D U+65A5 # <cjk>
+3-404E U+6614 # <cjk>
+3-404F U+6790 # <cjk>
+3-4050 U+77F3 # <cjk>
+3-4051 U+7A4D # <cjk>
+3-4052 U+7C4D # <cjk>
+3-4053 U+7E3E # <cjk>
+3-4054 U+810A # <cjk>
+3-4055 U+8CAC # <cjk>
+3-4056 U+8D64 # <cjk>
+3-4057 U+8DE1 # <cjk>
+3-4058 U+8E5F # <cjk>
+3-4059 U+78A9 # <cjk>
+3-405A U+5207 # <cjk>
+3-405B U+62D9 # <cjk>
+3-405C U+63A5 # <cjk>
+3-405D U+6442 # <cjk>
+3-405E U+6298 # <cjk>
+3-405F U+8A2D # <cjk>
+3-4060 U+7A83 # <cjk>
+3-4061 U+7BC0 # <cjk>
+3-4062 U+8AAC # <cjk>
+3-4063 U+96EA # <cjk>
+3-4064 U+7D76 # <cjk>
+3-4065 U+820C # <cjk>
+3-4066 U+8749 # <cjk>
+3-4067 U+4ED9 # <cjk>
+3-4068 U+5148 # <cjk>
+3-4069 U+5343 # <cjk>
+3-406A U+5360 # <cjk>
+3-406B U+5BA3 # <cjk>
+3-406C U+5C02 # <cjk>
+3-406D U+5C16 # <cjk>
+3-406E U+5DDD # <cjk>
+3-406F U+6226 # <cjk>
+3-4070 U+6247 # <cjk>
+3-4071 U+64B0 # <cjk>
+3-4072 U+6813 # <cjk>
+3-4073 U+6834 # <cjk>
+3-4074 U+6CC9 # <cjk>
+3-4075 U+6D45 # <cjk>
+3-4076 U+6D17 # <cjk>
+3-4077 U+67D3 # <cjk>
+3-4078 U+6F5C # <cjk>
+3-4079 U+714E # <cjk>
+3-407A U+717D # <cjk>
+3-407B U+65CB # <cjk>
+3-407C U+7A7F # <cjk>
+3-407D U+7BAD # <cjk>
+3-407E U+7DDA # <cjk>
+3-4121 U+7E4A # <cjk>
+3-4122 U+7FA8 # <cjk>
+3-4123 U+817A # <cjk>
+3-4124 U+821B # <cjk>
+3-4125 U+8239 # <cjk>
+3-4126 U+85A6 # <cjk>
+3-4127 U+8A6E # <cjk>
+3-4128 U+8CCE # <cjk>
+3-4129 U+8DF5 # <cjk>
+3-412A U+9078 # <cjk>
+3-412B U+9077 # <cjk>
+3-412C U+92AD # <cjk>
+3-412D U+9291 # <cjk>
+3-412E U+9583 # <cjk>
+3-412F U+9BAE # <cjk>
+3-4130 U+524D # <cjk>
+3-4131 U+5584 # <cjk>
+3-4132 U+6F38 # <cjk>
+3-4133 U+7136 # <cjk>
+3-4134 U+5168 # <cjk>
+3-4135 U+7985 # <cjk>
+3-4136 U+7E55 # <cjk>
+3-4137 U+81B3 # <cjk>
+3-4138 U+7CCE # <cjk>
+3-4139 U+564C # <cjk>
+3-413A U+5851 # <cjk>
+3-413B U+5CA8 # <cjk>
+3-413C U+63AA # <cjk>
+3-413D U+66FE # <cjk>
+3-413E U+66FD # <cjk>
+3-413F U+695A # <cjk>
+3-4140 U+72D9 # <cjk>
+3-4141 U+758F # <cjk>
+3-4142 U+758E # <cjk>
+3-4143 U+790E # <cjk>
+3-4144 U+7956 # <cjk>
+3-4145 U+79DF # <cjk>
+3-4146 U+7C97 # <cjk>
+3-4147 U+7D20 # <cjk>
+3-4148 U+7D44 # <cjk>
+3-4149 U+8607 # <cjk>
+3-414A U+8A34 # <cjk>
+3-414B U+963B # <cjk>
+3-414C U+9061 # <cjk>
+3-414D U+9F20 # <cjk>
+3-414E U+50E7 # <cjk>
+3-414F U+5275 # <cjk>
+3-4150 U+53CC # <cjk>
+3-4151 U+53E2 # <cjk>
+3-4152 U+5009 # <cjk>
+3-4153 U+55AA # <cjk>
+3-4154 U+58EE # <cjk>
+3-4155 U+594F # <cjk>
+3-4156 U+723D # <cjk>
+3-4157 U+5B8B # <cjk>
+3-4158 U+5C64 # <cjk>
+3-4159 U+531D # <cjk>
+3-415A U+60E3 # <cjk>
+3-415B U+60F3 # <cjk>
+3-415C U+635C # <cjk>
+3-415D U+6383 # <cjk>
+3-415E U+633F # <cjk>
+3-415F U+63BB # <cjk>
+3-4160 U+64CD # <cjk>
+3-4161 U+65E9 # <cjk>
+3-4162 U+66F9 # <cjk>
+3-4163 U+5DE3 # <cjk>
+3-4164 U+69CD # <cjk>
+3-4165 U+69FD # <cjk>
+3-4166 U+6F15 # <cjk>
+3-4167 U+71E5 # <cjk>
+3-4168 U+4E89 # <cjk>
+3-4169 U+75E9 # <cjk>
+3-416A U+76F8 # <cjk>
+3-416B U+7A93 # <cjk>
+3-416C U+7CDF # <cjk>
+3-416D U+7DCF # <cjk>
+3-416E U+7D9C # <cjk>
+3-416F U+8061 # <cjk>
+3-4170 U+8349 # <cjk>
+3-4171 U+8358 # <cjk>
+3-4172 U+846C # <cjk>
+3-4173 U+84BC # <cjk>
+3-4174 U+85FB # <cjk>
+3-4175 U+88C5 # <cjk>
+3-4176 U+8D70 # <cjk>
+3-4177 U+9001 # <cjk>
+3-4178 U+906D # <cjk>
+3-4179 U+9397 # <cjk>
+3-417A U+971C # <cjk>
+3-417B U+9A12 # <cjk>
+3-417C U+50CF # <cjk>
+3-417D U+5897 # <cjk>
+3-417E U+618E # <cjk>
+3-4221 U+81D3 # <cjk>
+3-4222 U+8535 # <cjk>
+3-4223 U+8D08 # <cjk>
+3-4224 U+9020 # <cjk>
+3-4225 U+4FC3 # <cjk>
+3-4226 U+5074 # <cjk>
+3-4227 U+5247 # <cjk>
+3-4228 U+5373 # <cjk>
+3-4229 U+606F # <cjk>
+3-422A U+6349 # <cjk>
+3-422B U+675F # <cjk>
+3-422C U+6E2C # <cjk>
+3-422D U+8DB3 # <cjk>
+3-422E U+901F # <cjk>
+3-422F U+4FD7 # <cjk>
+3-4230 U+5C5E # <cjk>
+3-4231 U+8CCA # <cjk>
+3-4232 U+65CF # <cjk>
+3-4233 U+7D9A # <cjk>
+3-4234 U+5352 # <cjk>
+3-4235 U+8896 # <cjk>
+3-4236 U+5176 # <cjk>
+3-4237 U+63C3 # <cjk>
+3-4238 U+5B58 # <cjk>
+3-4239 U+5B6B # <cjk>
+3-423A U+5C0A # <cjk>
+3-423B U+640D # <cjk>
+3-423C U+6751 # <cjk>
+3-423D U+905C # <cjk>
+3-423E U+4ED6 # <cjk>
+3-423F U+591A # <cjk>
+3-4240 U+592A # <cjk>
+3-4241 U+6C70 # <cjk>
+3-4242 U+8A51 # <cjk>
+3-4243 U+553E # <cjk>
+3-4244 U+5815 # <cjk>
+3-4245 U+59A5 # <cjk>
+3-4246 U+60F0 # <cjk>
+3-4247 U+6253 # <cjk>
+3-4248 U+67C1 # <cjk>
+3-4249 U+8235 # <cjk>
+3-424A U+6955 # <cjk>
+3-424B U+9640 # <cjk>
+3-424C U+99C4 # <cjk>
+3-424D U+9A28 # <cjk>
+3-424E U+4F53 # <cjk>
+3-424F U+5806 # <cjk>
+3-4250 U+5BFE # <cjk>
+3-4251 U+8010 # <cjk>
+3-4252 U+5CB1 # <cjk>
+3-4253 U+5E2F # <cjk>
+3-4254 U+5F85 # <cjk>
+3-4255 U+6020 # <cjk>
+3-4256 U+614B # <cjk>
+3-4257 U+6234 # <cjk>
+3-4258 U+66FF # <cjk>
+3-4259 U+6CF0 # <cjk>
+3-425A U+6EDE # <cjk>
+3-425B U+80CE # <cjk>
+3-425C U+817F # <cjk>
+3-425D U+82D4 # <cjk>
+3-425E U+888B # <cjk>
+3-425F U+8CB8 # <cjk>
+3-4260 U+9000 # <cjk>
+3-4261 U+902E # <cjk>
+3-4262 U+968A # <cjk>
+3-4263 U+9EDB # <cjk>
+3-4264 U+9BDB # <cjk>
+3-4265 U+4EE3 # <cjk>
+3-4266 U+53F0 # <cjk>
+3-4267 U+5927 # <cjk>
+3-4268 U+7B2C # <cjk>
+3-4269 U+918D # <cjk>
+3-426A U+984C # <cjk>
+3-426B U+9DF9 # <cjk>
+3-426C U+6EDD # <cjk>
+3-426D U+7027 # <cjk>
+3-426E U+5353 # <cjk>
+3-426F U+5544 # <cjk>
+3-4270 U+5B85 # <cjk>
+3-4271 U+6258 # <cjk>
+3-4272 U+629E # <cjk>
+3-4273 U+62D3 # <cjk>
+3-4274 U+6CA2 # <cjk>
+3-4275 U+6FEF # <cjk>
+3-4276 U+7422 # <cjk>
+3-4277 U+8A17 # <cjk>
+3-4278 U+9438 # <cjk>
+3-4279 U+6FC1 # <cjk>
+3-427A U+8AFE # <cjk>
+3-427B U+8338 # <cjk>
+3-427C U+51E7 # <cjk>
+3-427D U+86F8 # <cjk>
+3-427E U+53EA # <cjk>
+3-4321 U+53E9 # <cjk>
+3-4322 U+4F46 # <cjk>
+3-4323 U+9054 # <cjk>
+3-4324 U+8FB0 # <cjk>
+3-4325 U+596A # <cjk>
+3-4326 U+8131 # <cjk>
+3-4327 U+5DFD # <cjk>
+3-4328 U+7AEA # <cjk>
+3-4329 U+8FBF # <cjk>
+3-432A U+68DA # <cjk>
+3-432B U+8C37 # <cjk>
+3-432C U+72F8 # <cjk>
+3-432D U+9C48 # <cjk>
+3-432E U+6A3D # <cjk>
+3-432F U+8AB0 # <cjk>
+3-4330 U+4E39 # <cjk>
+3-4331 U+5358 # <cjk>
+3-4332 U+5606 # <cjk>
+3-4333 U+5766 # <cjk>
+3-4334 U+62C5 # <cjk>
+3-4335 U+63A2 # <cjk>
+3-4336 U+65E6 # <cjk>
+3-4337 U+6B4E # <cjk>
+3-4338 U+6DE1 # <cjk>
+3-4339 U+6E5B # <cjk>
+3-433A U+70AD # <cjk>
+3-433B U+77ED # <cjk>
+3-433C U+7AEF # <cjk>
+3-433D U+7BAA # <cjk>
+3-433E U+7DBB # <cjk>
+3-433F U+803D # <cjk>
+3-4340 U+80C6 # <cjk>
+3-4341 U+86CB # <cjk>
+3-4342 U+8A95 # <cjk>
+3-4343 U+935B # <cjk>
+3-4344 U+56E3 # <cjk>
+3-4345 U+58C7 # <cjk>
+3-4346 U+5F3E # <cjk>
+3-4347 U+65AD # <cjk>
+3-4348 U+6696 # <cjk>
+3-4349 U+6A80 # <cjk>
+3-434A U+6BB5 # <cjk>
+3-434B U+7537 # <cjk>
+3-434C U+8AC7 # <cjk>
+3-434D U+5024 # <cjk>
+3-434E U+77E5 # <cjk>
+3-434F U+5730 # <cjk>
+3-4350 U+5F1B # <cjk>
+3-4351 U+6065 # <cjk>
+3-4352 U+667A # <cjk>
+3-4353 U+6C60 # <cjk>
+3-4354 U+75F4 # <cjk>
+3-4355 U+7A1A # <cjk>
+3-4356 U+7F6E # <cjk>
+3-4357 U+81F4 # <cjk>
+3-4358 U+8718 # <cjk>
+3-4359 U+9045 # <cjk>
+3-435A U+99B3 # <cjk>
+3-435B U+7BC9 # <cjk>
+3-435C U+755C # <cjk>
+3-435D U+7AF9 # <cjk>
+3-435E U+7B51 # <cjk>
+3-435F U+84C4 # <cjk>
+3-4360 U+9010 # <cjk>
+3-4361 U+79E9 # <cjk>
+3-4362 U+7A92 # <cjk>
+3-4363 U+8336 # <cjk>
+3-4364 U+5AE1 # <cjk>
+3-4365 U+7740 # <cjk>
+3-4366 U+4E2D # <cjk>
+3-4367 U+4EF2 # <cjk>
+3-4368 U+5B99 # <cjk>
+3-4369 U+5FE0 # <cjk>
+3-436A U+62BD # <cjk>
+3-436B U+663C # <cjk>
+3-436C U+67F1 # <cjk>
+3-436D U+6CE8 # <cjk>
+3-436E U+866B # <cjk>
+3-436F U+8877 # <cjk>
+3-4370 U+8A3B # <cjk>
+3-4371 U+914E # <cjk>
+3-4372 U+92F3 # <cjk>
+3-4373 U+99D0 # <cjk>
+3-4374 U+6A17 # <cjk>
+3-4375 U+7026 # <cjk>
+3-4376 U+732A # <cjk>
+3-4377 U+82E7 # <cjk>
+3-4378 U+8457 # <cjk>
+3-4379 U+8CAF # <cjk>
+3-437A U+4E01 # <cjk>
+3-437B U+5146 # <cjk>
+3-437C U+51CB # <cjk>
+3-437D U+558B # <cjk>
+3-437E U+5BF5 # <cjk>
+3-4421 U+5E16 # <cjk>
+3-4422 U+5E33 # <cjk>
+3-4423 U+5E81 # <cjk>
+3-4424 U+5F14 # <cjk>
+3-4425 U+5F35 # <cjk>
+3-4426 U+5F6B # <cjk>
+3-4427 U+5FB4 # <cjk>
+3-4428 U+61F2 # <cjk>
+3-4429 U+6311 # <cjk>
+3-442A U+66A2 # <cjk>
+3-442B U+671D # <cjk>
+3-442C U+6F6E # <cjk>
+3-442D U+7252 # <cjk>
+3-442E U+753A # <cjk>
+3-442F U+773A # <cjk>
+3-4430 U+8074 # <cjk>
+3-4431 U+8139 # <cjk>
+3-4432 U+8178 # <cjk>
+3-4433 U+8776 # <cjk>
+3-4434 U+8ABF # <cjk>
+3-4435 U+8ADC # <cjk>
+3-4436 U+8D85 # <cjk>
+3-4437 U+8DF3 # <cjk>
+3-4438 U+929A # <cjk>
+3-4439 U+9577 # <cjk>
+3-443A U+9802 # <cjk>
+3-443B U+9CE5 # <cjk>
+3-443C U+52C5 # <cjk>
+3-443D U+6357 # <cjk>
+3-443E U+76F4 # <cjk>
+3-443F U+6715 # <cjk>
+3-4440 U+6C88 # <cjk>
+3-4441 U+73CD # <cjk>
+3-4442 U+8CC3 # <cjk>
+3-4443 U+93AE # <cjk>
+3-4444 U+9673 # <cjk>
+3-4445 U+6D25 # <cjk>
+3-4446 U+589C # <cjk>
+3-4447 U+690E # <cjk>
+3-4448 U+69CC # <cjk>
+3-4449 U+8FFD # <cjk>
+3-444A U+939A # <cjk>
+3-444B U+75DB # <cjk>
+3-444C U+901A # <cjk>
+3-444D U+585A # <cjk>
+3-444E U+6802 # <cjk>
+3-444F U+63B4 # <cjk>
+3-4450 U+69FB # <cjk>
+3-4451 U+4F43 # <cjk>
+3-4452 U+6F2C # <cjk>
+3-4453 U+67D8 # <cjk>
+3-4454 U+8FBB # <cjk>
+3-4455 U+8526 # <cjk>
+3-4456 U+7DB4 # <cjk>
+3-4457 U+9354 # <cjk>
+3-4458 U+693F # <cjk>
+3-4459 U+6F70 # <cjk>
+3-445A U+576A # <cjk>
+3-445B U+58F7 # <cjk>
+3-445C U+5B2C # <cjk>
+3-445D U+7D2C # <cjk>
+3-445E U+722A # <cjk>
+3-445F U+540A # <cjk>
+3-4460 U+91E3 # <cjk>
+3-4461 U+9DB4 # <cjk>
+3-4462 U+4EAD # <cjk>
+3-4463 U+4F4E # <cjk>
+3-4464 U+505C # <cjk>
+3-4465 U+5075 # <cjk>
+3-4466 U+5243 # <cjk>
+3-4467 U+8C9E # <cjk>
+3-4468 U+5448 # <cjk>
+3-4469 U+5824 # <cjk>
+3-446A U+5B9A # <cjk>
+3-446B U+5E1D # <cjk>
+3-446C U+5E95 # <cjk>
+3-446D U+5EAD # <cjk>
+3-446E U+5EF7 # <cjk>
+3-446F U+5F1F # <cjk>
+3-4470 U+608C # <cjk>
+3-4471 U+62B5 # <cjk>
+3-4472 U+633A # <cjk>
+3-4473 U+63D0 # <cjk>
+3-4474 U+68AF # <cjk>
+3-4475 U+6C40 # <cjk>
+3-4476 U+7887 # <cjk>
+3-4477 U+798E # <cjk>
+3-4478 U+7A0B # <cjk>
+3-4479 U+7DE0 # <cjk>
+3-447A U+8247 # <cjk>
+3-447B U+8A02 # <cjk>
+3-447C U+8AE6 # <cjk>
+3-447D U+8E44 # <cjk>
+3-447E U+9013 # <cjk>
+3-4521 U+90B8 # <cjk>
+3-4522 U+912D # <cjk>
+3-4523 U+91D8 # <cjk>
+3-4524 U+9F0E # <cjk>
+3-4525 U+6CE5 # <cjk>
+3-4526 U+6458 # <cjk>
+3-4527 U+64E2 # <cjk>
+3-4528 U+6575 # <cjk>
+3-4529 U+6EF4 # <cjk>
+3-452A U+7684 # <cjk>
+3-452B U+7B1B # <cjk>
+3-452C U+9069 # <cjk>
+3-452D U+93D1 # <cjk>
+3-452E U+6EBA # <cjk>
+3-452F U+54F2 # <cjk>
+3-4530 U+5FB9 # <cjk>
+3-4531 U+64A4 # <cjk>
+3-4532 U+8F4D # <cjk>
+3-4533 U+8FED # <cjk>
+3-4534 U+9244 # <cjk>
+3-4535 U+5178 # <cjk>
+3-4536 U+586B # <cjk>
+3-4537 U+5929 # <cjk>
+3-4538 U+5C55 # <cjk>
+3-4539 U+5E97 # <cjk>
+3-453A U+6DFB # <cjk>
+3-453B U+7E8F # <cjk>
+3-453C U+751C # <cjk>
+3-453D U+8CBC # <cjk>
+3-453E U+8EE2 # <cjk>
+3-453F U+985B # <cjk>
+3-4540 U+70B9 # <cjk>
+3-4541 U+4F1D # <cjk>
+3-4542 U+6BBF # <cjk>
+3-4543 U+6FB1 # <cjk>
+3-4544 U+7530 # <cjk>
+3-4545 U+96FB # <cjk>
+3-4546 U+514E # <cjk>
+3-4547 U+5410 # <cjk>
+3-4548 U+5835 # <cjk>
+3-4549 U+5857 # <cjk>
+3-454A U+59AC # <cjk>
+3-454B U+5C60 # <cjk>
+3-454C U+5F92 # <cjk>
+3-454D U+6597 # <cjk>
+3-454E U+675C # <cjk>
+3-454F U+6E21 # <cjk>
+3-4550 U+767B # <cjk>
+3-4551 U+83DF # <cjk>
+3-4552 U+8CED # <cjk>
+3-4553 U+9014 # <cjk>
+3-4554 U+90FD # <cjk>
+3-4555 U+934D # <cjk>
+3-4556 U+7825 # <cjk>
+3-4557 U+783A # <cjk>
+3-4558 U+52AA # <cjk>
+3-4559 U+5EA6 # <cjk>
+3-455A U+571F # <cjk>
+3-455B U+5974 # <cjk>
+3-455C U+6012 # <cjk>
+3-455D U+5012 # <cjk>
+3-455E U+515A # <cjk>
+3-455F U+51AC # <cjk>
+3-4560 U+51CD # <cjk>
+3-4561 U+5200 # <cjk>
+3-4562 U+5510 # <cjk>
+3-4563 U+5854 # <cjk>
+3-4564 U+5858 # <cjk>
+3-4565 U+5957 # <cjk>
+3-4566 U+5B95 # <cjk>
+3-4567 U+5CF6 # <cjk>
+3-4568 U+5D8B # <cjk>
+3-4569 U+60BC # <cjk>
+3-456A U+6295 # <cjk>
+3-456B U+642D # <cjk>
+3-456C U+6771 # <cjk>
+3-456D U+6843 # <cjk>
+3-456E U+68BC # <cjk>
+3-456F U+68DF # <cjk>
+3-4570 U+76D7 # <cjk>
+3-4571 U+6DD8 # <cjk>
+3-4572 U+6E6F # <cjk>
+3-4573 U+6D9B # <cjk>
+3-4574 U+706F # <cjk>
+3-4575 U+71C8 # <cjk>
+3-4576 U+5F53 # <cjk>
+3-4577 U+75D8 # <cjk>
+3-4578 U+7977 # <cjk>
+3-4579 U+7B49 # <cjk>
+3-457A U+7B54 # <cjk>
+3-457B U+7B52 # <cjk>
+3-457C U+7CD6 # <cjk>
+3-457D U+7D71 # <cjk>
+3-457E U+5230 # <cjk>
+3-4621 U+8463 # <cjk>
+3-4622 U+8569 # <cjk>
+3-4623 U+85E4 # <cjk>
+3-4624 U+8A0E # <cjk>
+3-4625 U+8B04 # <cjk>
+3-4626 U+8C46 # <cjk>
+3-4627 U+8E0F # <cjk>
+3-4628 U+9003 # <cjk>
+3-4629 U+900F # <cjk>
+3-462A U+9419 # <cjk>
+3-462B U+9676 # <cjk>
+3-462C U+982D # <cjk>
+3-462D U+9A30 # <cjk>
+3-462E U+95D8 # <cjk>
+3-462F U+50CD # <cjk>
+3-4630 U+52D5 # <cjk>
+3-4631 U+540C # <cjk>
+3-4632 U+5802 # <cjk>
+3-4633 U+5C0E # <cjk>
+3-4634 U+61A7 # <cjk>
+3-4635 U+649E # <cjk>
+3-4636 U+6D1E # <cjk>
+3-4637 U+77B3 # <cjk>
+3-4638 U+7AE5 # <cjk>
+3-4639 U+80F4 # <cjk>
+3-463A U+8404 # <cjk>
+3-463B U+9053 # <cjk>
+3-463C U+9285 # <cjk>
+3-463D U+5CE0 # <cjk>
+3-463E U+9D07 # <cjk>
+3-463F U+533F # <cjk>
+3-4640 U+5F97 # <cjk>
+3-4641 U+5FB3 # <cjk>
+3-4642 U+6D9C # <cjk>
+3-4643 U+7279 # <cjk>
+3-4644 U+7763 # <cjk>
+3-4645 U+79BF # <cjk>
+3-4646 U+7BE4 # <cjk>
+3-4647 U+6BD2 # <cjk>
+3-4648 U+72EC # <cjk>
+3-4649 U+8AAD # <cjk>
+3-464A U+6803 # <cjk>
+3-464B U+6A61 # <cjk>
+3-464C U+51F8 # <cjk>
+3-464D U+7A81 # <cjk>
+3-464E U+6934 # <cjk>
+3-464F U+5C4A # <cjk>
+3-4650 U+9CF6 # <cjk>
+3-4651 U+82EB # <cjk>
+3-4652 U+5BC5 # <cjk>
+3-4653 U+9149 # <cjk>
+3-4654 U+701E # <cjk>
+3-4655 U+5678 # <cjk>
+3-4656 U+5C6F # <cjk>
+3-4657 U+60C7 # <cjk>
+3-4658 U+6566 # <cjk>
+3-4659 U+6C8C # <cjk>
+3-465A U+8C5A # <cjk>
+3-465B U+9041 # <cjk>
+3-465C U+9813 # <cjk>
+3-465D U+5451 # <cjk>
+3-465E U+66C7 # <cjk>
+3-465F U+920D # <cjk>
+3-4660 U+5948 # <cjk>
+3-4661 U+90A3 # <cjk>
+3-4662 U+5185 # <cjk>
+3-4663 U+4E4D # <cjk>
+3-4664 U+51EA # <cjk>
+3-4665 U+8599 # <cjk>
+3-4666 U+8B0E # <cjk>
+3-4667 U+7058 # <cjk>
+3-4668 U+637A # <cjk>
+3-4669 U+934B # <cjk>
+3-466A U+6962 # <cjk>
+3-466B U+99B4 # <cjk>
+3-466C U+7E04 # <cjk>
+3-466D U+7577 # <cjk>
+3-466E U+5357 # <cjk>
+3-466F U+6960 # <cjk>
+3-4670 U+8EDF # <cjk>
+3-4671 U+96E3 # <cjk>
+3-4672 U+6C5D # <cjk>
+3-4673 U+4E8C # <cjk>
+3-4674 U+5C3C # <cjk>
+3-4675 U+5F10 # <cjk>
+3-4676 U+8FE9 # <cjk>
+3-4677 U+5302 # <cjk>
+3-4678 U+8CD1 # <cjk>
+3-4679 U+8089 # <cjk>
+3-467A U+8679 # <cjk>
+3-467B U+5EFF # <cjk>
+3-467C U+65E5 # <cjk>
+3-467D U+4E73 # <cjk>
+3-467E U+5165 # <cjk>
+3-4721 U+5982 # <cjk>
+3-4722 U+5C3F # <cjk>
+3-4723 U+97EE # <cjk>
+3-4724 U+4EFB # <cjk>
+3-4725 U+598A # <cjk>
+3-4726 U+5FCD # <cjk>
+3-4727 U+8A8D # <cjk>
+3-4728 U+6FE1 # <cjk>
+3-4729 U+79B0 # <cjk>
+3-472A U+7962 # <cjk>
+3-472B U+5BE7 # <cjk>
+3-472C U+8471 # <cjk>
+3-472D U+732B # <cjk>
+3-472E U+71B1 # <cjk>
+3-472F U+5E74 # <cjk>
+3-4730 U+5FF5 # <cjk>
+3-4731 U+637B # <cjk>
+3-4732 U+649A # <cjk>
+3-4733 U+71C3 # <cjk>
+3-4734 U+7C98 # <cjk>
+3-4735 U+4E43 # <cjk>
+3-4736 U+5EFC # <cjk>
+3-4737 U+4E4B # <cjk>
+3-4738 U+57DC # <cjk>
+3-4739 U+56A2 # <cjk>
+3-473A U+60A9 # <cjk>
+3-473B U+6FC3 # <cjk>
+3-473C U+7D0D # <cjk>
+3-473D U+80FD # <cjk>
+3-473E U+8133 # <cjk>
+3-473F U+81BF # <cjk>
+3-4740 U+8FB2 # <cjk>
+3-4741 U+8997 # <cjk>
+3-4742 U+86A4 # <cjk>
+3-4743 U+5DF4 # <cjk>
+3-4744 U+628A # <cjk>
+3-4745 U+64AD # <cjk>
+3-4746 U+8987 # <cjk>
+3-4747 U+6777 # <cjk>
+3-4748 U+6CE2 # <cjk>
+3-4749 U+6D3E # <cjk>
+3-474A U+7436 # <cjk>
+3-474B U+7834 # <cjk>
+3-474C U+5A46 # <cjk>
+3-474D U+7F75 # <cjk>
+3-474E U+82AD # <cjk>
+3-474F U+99AC # <cjk>
+3-4750 U+4FF3 # <cjk>
+3-4751 U+5EC3 # <cjk>
+3-4752 U+62DD # <cjk>
+3-4753 U+6392 # <cjk>
+3-4754 U+6557 # <cjk>
+3-4755 U+676F # <cjk>
+3-4756 U+76C3 # <cjk>
+3-4757 U+724C # <cjk>
+3-4758 U+80CC # <cjk>
+3-4759 U+80BA # <cjk>
+3-475A U+8F29 # <cjk>
+3-475B U+914D # <cjk>
+3-475C U+500D # <cjk>
+3-475D U+57F9 # <cjk>
+3-475E U+5A92 # <cjk>
+3-475F U+6885 # <cjk>
+3-4760 U+6973 # <cjk>
+3-4761 U+7164 # <cjk>
+3-4762 U+72FD # <cjk>
+3-4763 U+8CB7 # <cjk>
+3-4764 U+58F2 # <cjk>
+3-4765 U+8CE0 # <cjk>
+3-4766 U+966A # <cjk>
+3-4767 U+9019 # <cjk>
+3-4768 U+877F # <cjk>
+3-4769 U+79E4 # <cjk>
+3-476A U+77E7 # <cjk>
+3-476B U+8429 # <cjk>
+3-476C U+4F2F # <cjk>
+3-476D U+5265 # <cjk>
+3-476E U+535A # <cjk>
+3-476F U+62CD # <cjk>
+3-4770 U+67CF # <cjk>
+3-4771 U+6CCA # <cjk>
+3-4772 U+767D # <cjk>
+3-4773 U+7B94 # <cjk>
+3-4774 U+7C95 # <cjk>
+3-4775 U+8236 # <cjk>
+3-4776 U+8584 # <cjk>
+3-4777 U+8FEB # <cjk>
+3-4778 U+66DD # <cjk>
+3-4779 U+6F20 # <cjk>
+3-477A U+7206 # <cjk>
+3-477B U+7E1B # <cjk>
+3-477C U+83AB # <cjk>
+3-477D U+99C1 # <cjk>
+3-477E U+9EA6 # <cjk>
+3-4821 U+51FD # <cjk>
+3-4822 U+7BB1 # <cjk>
+3-4823 U+7872 # <cjk>
+3-4824 U+7BB8 # <cjk>
+3-4825 U+8087 # <cjk>
+3-4826 U+7B48 # <cjk>
+3-4827 U+6AE8 # <cjk>
+3-4828 U+5E61 # <cjk>
+3-4829 U+808C # <cjk>
+3-482A U+7551 # <cjk>
+3-482B U+7560 # <cjk>
+3-482C U+516B # <cjk>
+3-482D U+9262 # <cjk>
+3-482E U+6E8C # <cjk>
+3-482F U+767A # <cjk>
+3-4830 U+9197 # <cjk>
+3-4831 U+9AEA # <cjk>
+3-4832 U+4F10 # <cjk>
+3-4833 U+7F70 # <cjk>
+3-4834 U+629C # <cjk>
+3-4835 U+7B4F # <cjk>
+3-4836 U+95A5 # <cjk>
+3-4837 U+9CE9 # <cjk>
+3-4838 U+567A # <cjk>
+3-4839 U+5859 # <cjk>
+3-483A U+86E4 # <cjk>
+3-483B U+96BC # <cjk>
+3-483C U+4F34 # <cjk>
+3-483D U+5224 # <cjk>
+3-483E U+534A # <cjk>
+3-483F U+53CD # <cjk>
+3-4840 U+53DB # <cjk>
+3-4841 U+5E06 # <cjk>
+3-4842 U+642C # <cjk>
+3-4843 U+6591 # <cjk>
+3-4844 U+677F # <cjk>
+3-4845 U+6C3E # <cjk>
+3-4846 U+6C4E # <cjk>
+3-4847 U+7248 # <cjk>
+3-4848 U+72AF # <cjk>
+3-4849 U+73ED # <cjk>
+3-484A U+7554 # <cjk>
+3-484B U+7E41 # <cjk>
+3-484C U+822C # <cjk>
+3-484D U+85E9 # <cjk>
+3-484E U+8CA9 # <cjk>
+3-484F U+7BC4 # <cjk>
+3-4850 U+91C6 # <cjk>
+3-4851 U+7169 # <cjk>
+3-4852 U+9812 # <cjk>
+3-4853 U+98EF # <cjk>
+3-4854 U+633D # <cjk>
+3-4855 U+6669 # <cjk>
+3-4856 U+756A # <cjk>
+3-4857 U+76E4 # <cjk>
+3-4858 U+78D0 # <cjk>
+3-4859 U+8543 # <cjk>
+3-485A U+86EE # <cjk>
+3-485B U+532A # <cjk>
+3-485C U+5351 # <cjk>
+3-485D U+5426 # <cjk>
+3-485E U+5983 # <cjk>
+3-485F U+5E87 # <cjk>
+3-4860 U+5F7C # <cjk>
+3-4861 U+60B2 # <cjk>
+3-4862 U+6249 # <cjk>
+3-4863 U+6279 # <cjk>
+3-4864 U+62AB # <cjk>
+3-4865 U+6590 # <cjk>
+3-4866 U+6BD4 # <cjk>
+3-4867 U+6CCC # <cjk>
+3-4868 U+75B2 # <cjk>
+3-4869 U+76AE # <cjk>
+3-486A U+7891 # <cjk>
+3-486B U+79D8 # <cjk>
+3-486C U+7DCB # <cjk>
+3-486D U+7F77 # <cjk>
+3-486E U+80A5 # <cjk>
+3-486F U+88AB # <cjk>
+3-4870 U+8AB9 # <cjk>
+3-4871 U+8CBB # <cjk>
+3-4872 U+907F # <cjk>
+3-4873 U+975E # <cjk>
+3-4874 U+98DB # <cjk>
+3-4875 U+6A0B # <cjk>
+3-4876 U+7C38 # <cjk>
+3-4877 U+5099 # <cjk>
+3-4878 U+5C3E # <cjk>
+3-4879 U+5FAE # <cjk>
+3-487A U+6787 # <cjk>
+3-487B U+6BD8 # <cjk>
+3-487C U+7435 # <cjk>
+3-487D U+7709 # <cjk>
+3-487E U+7F8E # <cjk>
+3-4921 U+9F3B # <cjk>
+3-4922 U+67CA # <cjk>
+3-4923 U+7A17 # <cjk>
+3-4924 U+5339 # <cjk>
+3-4925 U+758B # <cjk>
+3-4926 U+9AED # <cjk>
+3-4927 U+5F66 # <cjk>
+3-4928 U+819D # <cjk>
+3-4929 U+83F1 # <cjk>
+3-492A U+8098 # <cjk>
+3-492B U+5F3C # <cjk>
+3-492C U+5FC5 # <cjk>
+3-492D U+7562 # <cjk>
+3-492E U+7B46 # <cjk>
+3-492F U+903C # <cjk>
+3-4930 U+6867 # <cjk>
+3-4931 U+59EB # <cjk>
+3-4932 U+5A9B # <cjk>
+3-4933 U+7D10 # <cjk>
+3-4934 U+767E # <cjk>
+3-4935 U+8B2C # <cjk>
+3-4936 U+4FF5 # <cjk>
+3-4937 U+5F6A # <cjk>
+3-4938 U+6A19 # <cjk>
+3-4939 U+6C37 # <cjk>
+3-493A U+6F02 # <cjk>
+3-493B U+74E2 # <cjk>
+3-493C U+7968 # <cjk>
+3-493D U+8868 # <cjk>
+3-493E U+8A55 # <cjk>
+3-493F U+8C79 # <cjk>
+3-4940 U+5EDF # <cjk>
+3-4941 U+63CF # <cjk>
+3-4942 U+75C5 # <cjk>
+3-4943 U+79D2 # <cjk>
+3-4944 U+82D7 # <cjk>
+3-4945 U+9328 # <cjk>
+3-4946 U+92F2 # <cjk>
+3-4947 U+849C # <cjk>
+3-4948 U+86ED # <cjk>
+3-4949 U+9C2D # <cjk>
+3-494A U+54C1 # <cjk>
+3-494B U+5F6C # <cjk>
+3-494C U+658C # <cjk>
+3-494D U+6D5C # <cjk>
+3-494E U+7015 # <cjk>
+3-494F U+8CA7 # <cjk>
+3-4950 U+8CD3 # <cjk>
+3-4951 U+983B # <cjk>
+3-4952 U+654F # <cjk>
+3-4953 U+74F6 # <cjk>
+3-4954 U+4E0D # <cjk>
+3-4955 U+4ED8 # <cjk>
+3-4956 U+57E0 # <cjk>
+3-4957 U+592B # <cjk>
+3-4958 U+5A66 # <cjk>
+3-4959 U+5BCC # <cjk>
+3-495A U+51A8 # <cjk>
+3-495B U+5E03 # <cjk>
+3-495C U+5E9C # <cjk>
+3-495D U+6016 # <cjk>
+3-495E U+6276 # <cjk>
+3-495F U+6577 # <cjk>
+3-4960 U+65A7 # <cjk>
+3-4961 U+666E # <cjk>
+3-4962 U+6D6E # <cjk>
+3-4963 U+7236 # <cjk>
+3-4964 U+7B26 # <cjk>
+3-4965 U+8150 # <cjk>
+3-4966 U+819A # <cjk>
+3-4967 U+8299 # <cjk>
+3-4968 U+8B5C # <cjk>
+3-4969 U+8CA0 # <cjk>
+3-496A U+8CE6 # <cjk>
+3-496B U+8D74 # <cjk>
+3-496C U+961C # <cjk>
+3-496D U+9644 # <cjk>
+3-496E U+4FAE # <cjk>
+3-496F U+64AB # <cjk>
+3-4970 U+6B66 # <cjk>
+3-4971 U+821E # <cjk>
+3-4972 U+8461 # <cjk>
+3-4973 U+856A # <cjk>
+3-4974 U+90E8 # <cjk>
+3-4975 U+5C01 # <cjk>
+3-4976 U+6953 # <cjk>
+3-4977 U+98A8 # <cjk>
+3-4978 U+847A # <cjk>
+3-4979 U+8557 # <cjk>
+3-497A U+4F0F # <cjk>
+3-497B U+526F # <cjk>
+3-497C U+5FA9 # <cjk>
+3-497D U+5E45 # <cjk>
+3-497E U+670D # <cjk>
+3-4A21 U+798F # <cjk>
+3-4A22 U+8179 # <cjk>
+3-4A23 U+8907 # <cjk>
+3-4A24 U+8986 # <cjk>
+3-4A25 U+6DF5 # <cjk>
+3-4A26 U+5F17 # <cjk>
+3-4A27 U+6255 # <cjk>
+3-4A28 U+6CB8 # <cjk>
+3-4A29 U+4ECF # <cjk>
+3-4A2A U+7269 # <cjk>
+3-4A2B U+9B92 # <cjk>
+3-4A2C U+5206 # <cjk>
+3-4A2D U+543B # <cjk>
+3-4A2E U+5674 # <cjk>
+3-4A2F U+58B3 # <cjk>
+3-4A30 U+61A4 # <cjk>
+3-4A31 U+626E # <cjk>
+3-4A32 U+711A # <cjk>
+3-4A33 U+596E # <cjk>
+3-4A34 U+7C89 # <cjk>
+3-4A35 U+7CDE # <cjk>
+3-4A36 U+7D1B # <cjk>
+3-4A37 U+96F0 # <cjk>
+3-4A38 U+6587 # <cjk>
+3-4A39 U+805E # <cjk>
+3-4A3A U+4E19 # <cjk>
+3-4A3B U+4F75 # <cjk>
+3-4A3C U+5175 # <cjk>
+3-4A3D U+5840 # <cjk>
+3-4A3E U+5E63 # <cjk>
+3-4A3F U+5E73 # <cjk>
+3-4A40 U+5F0A # <cjk>
+3-4A41 U+67C4 # <cjk>
+3-4A42 U+4E26 # <cjk>
+3-4A43 U+853D # <cjk>
+3-4A44 U+9589 # <cjk>
+3-4A45 U+965B # <cjk>
+3-4A46 U+7C73 # <cjk>
+3-4A47 U+9801 # <cjk>
+3-4A48 U+50FB # <cjk>
+3-4A49 U+58C1 # <cjk>
+3-4A4A U+7656 # <cjk>
+3-4A4B U+78A7 # <cjk>
+3-4A4C U+5225 # <cjk>
+3-4A4D U+77A5 # <cjk>
+3-4A4E U+8511 # <cjk>
+3-4A4F U+7B86 # <cjk>
+3-4A50 U+504F # <cjk>
+3-4A51 U+5909 # <cjk>
+3-4A52 U+7247 # <cjk>
+3-4A53 U+7BC7 # <cjk>
+3-4A54 U+7DE8 # <cjk>
+3-4A55 U+8FBA # <cjk>
+3-4A56 U+8FD4 # <cjk>
+3-4A57 U+904D # <cjk>
+3-4A58 U+4FBF # <cjk>
+3-4A59 U+52C9 # <cjk>
+3-4A5A U+5A29 # <cjk>
+3-4A5B U+5F01 # <cjk>
+3-4A5C U+97AD # <cjk>
+3-4A5D U+4FDD # <cjk>
+3-4A5E U+8217 # <cjk>
+3-4A5F U+92EA # <cjk>
+3-4A60 U+5703 # <cjk>
+3-4A61 U+6355 # <cjk>
+3-4A62 U+6B69 # <cjk>
+3-4A63 U+752B # <cjk>
+3-4A64 U+88DC # <cjk>
+3-4A65 U+8F14 # <cjk>
+3-4A66 U+7A42 # <cjk>
+3-4A67 U+52DF # <cjk>
+3-4A68 U+5893 # <cjk>
+3-4A69 U+6155 # <cjk>
+3-4A6A U+620A # <cjk>
+3-4A6B U+66AE # <cjk>
+3-4A6C U+6BCD # <cjk>
+3-4A6D U+7C3F # <cjk>
+3-4A6E U+83E9 # <cjk>
+3-4A6F U+5023 # <cjk>
+3-4A70 U+4FF8 # <cjk>
+3-4A71 U+5305 # <cjk>
+3-4A72 U+5446 # <cjk>
+3-4A73 U+5831 # <cjk>
+3-4A74 U+5949 # <cjk>
+3-4A75 U+5B9D # <cjk>
+3-4A76 U+5CF0 # <cjk>
+3-4A77 U+5CEF # <cjk>
+3-4A78 U+5D29 # <cjk>
+3-4A79 U+5E96 # <cjk>
+3-4A7A U+62B1 # <cjk>
+3-4A7B U+6367 # <cjk>
+3-4A7C U+653E # <cjk>
+3-4A7D U+65B9 # <cjk>
+3-4A7E U+670B # <cjk>
+3-4B21 U+6CD5 # <cjk>
+3-4B22 U+6CE1 # <cjk>
+3-4B23 U+70F9 # <cjk>
+3-4B24 U+7832 # <cjk>
+3-4B25 U+7E2B # <cjk>
+3-4B26 U+80DE # <cjk>
+3-4B27 U+82B3 # <cjk>
+3-4B28 U+840C # <cjk>
+3-4B29 U+84EC # <cjk>
+3-4B2A U+8702 # <cjk>
+3-4B2B U+8912 # <cjk>
+3-4B2C U+8A2A # <cjk>
+3-4B2D U+8C4A # <cjk>
+3-4B2E U+90A6 # <cjk>
+3-4B2F U+92D2 # <cjk>
+3-4B30 U+98FD # <cjk>
+3-4B31 U+9CF3 # <cjk>
+3-4B32 U+9D6C # <cjk>
+3-4B33 U+4E4F # <cjk>
+3-4B34 U+4EA1 # <cjk>
+3-4B35 U+508D # <cjk>
+3-4B36 U+5256 # <cjk>
+3-4B37 U+574A # <cjk>
+3-4B38 U+59A8 # <cjk>
+3-4B39 U+5E3D # <cjk>
+3-4B3A U+5FD8 # <cjk>
+3-4B3B U+5FD9 # <cjk>
+3-4B3C U+623F # <cjk>
+3-4B3D U+66B4 # <cjk>
+3-4B3E U+671B # <cjk>
+3-4B3F U+67D0 # <cjk>
+3-4B40 U+68D2 # <cjk>
+3-4B41 U+5192 # <cjk>
+3-4B42 U+7D21 # <cjk>
+3-4B43 U+80AA # <cjk>
+3-4B44 U+81A8 # <cjk>
+3-4B45 U+8B00 # <cjk>
+3-4B46 U+8C8C # <cjk>
+3-4B47 U+8CBF # <cjk>
+3-4B48 U+927E # <cjk>
+3-4B49 U+9632 # <cjk>
+3-4B4A U+5420 # <cjk>
+3-4B4B U+982C # <cjk>
+3-4B4C U+5317 # <cjk>
+3-4B4D U+50D5 # <cjk>
+3-4B4E U+535C # <cjk>
+3-4B4F U+58A8 # <cjk>
+3-4B50 U+64B2 # <cjk>
+3-4B51 U+6734 # <cjk>
+3-4B52 U+7267 # <cjk>
+3-4B53 U+7766 # <cjk>
+3-4B54 U+7A46 # <cjk>
+3-4B55 U+91E6 # <cjk>
+3-4B56 U+52C3 # <cjk>
+3-4B57 U+6CA1 # <cjk>
+3-4B58 U+6B86 # <cjk>
+3-4B59 U+5800 # <cjk>
+3-4B5A U+5E4C # <cjk>
+3-4B5B U+5954 # <cjk>
+3-4B5C U+672C # <cjk>
+3-4B5D U+7FFB # <cjk>
+3-4B5E U+51E1 # <cjk>
+3-4B5F U+76C6 # <cjk>
+3-4B60 U+6469 # <cjk>
+3-4B61 U+78E8 # <cjk>
+3-4B62 U+9B54 # <cjk>
+3-4B63 U+9EBB # <cjk>
+3-4B64 U+57CB # <cjk>
+3-4B65 U+59B9 # <cjk>
+3-4B66 U+6627 # <cjk>
+3-4B67 U+679A # <cjk>
+3-4B68 U+6BCE # <cjk>
+3-4B69 U+54E9 # <cjk>
+3-4B6A U+69D9 # <cjk>
+3-4B6B U+5E55 # <cjk>
+3-4B6C U+819C # <cjk>
+3-4B6D U+6795 # <cjk>
+3-4B6E U+9BAA # <cjk>
+3-4B6F U+67FE # <cjk>
+3-4B70 U+9C52 # <cjk>
+3-4B71 U+685D # <cjk>
+3-4B72 U+4EA6 # <cjk>
+3-4B73 U+4FE3 # <cjk>
+3-4B74 U+53C8 # <cjk>
+3-4B75 U+62B9 # <cjk>
+3-4B76 U+672B # <cjk>
+3-4B77 U+6CAB # <cjk>
+3-4B78 U+8FC4 # <cjk>
+3-4B79 U+4FAD # <cjk>
+3-4B7A U+7E6D # <cjk>
+3-4B7B U+9EBF # <cjk>
+3-4B7C U+4E07 # <cjk>
+3-4B7D U+6162 # <cjk>
+3-4B7E U+6E80 # <cjk>
+3-4C21 U+6F2B # <cjk>
+3-4C22 U+8513 # <cjk>
+3-4C23 U+5473 # <cjk>
+3-4C24 U+672A # <cjk>
+3-4C25 U+9B45 # <cjk>
+3-4C26 U+5DF3 # <cjk>
+3-4C27 U+7B95 # <cjk>
+3-4C28 U+5CAC # <cjk>
+3-4C29 U+5BC6 # <cjk>
+3-4C2A U+871C # <cjk>
+3-4C2B U+6E4A # <cjk>
+3-4C2C U+84D1 # <cjk>
+3-4C2D U+7A14 # <cjk>
+3-4C2E U+8108 # <cjk>
+3-4C2F U+5999 # <cjk>
+3-4C30 U+7C8D # <cjk>
+3-4C31 U+6C11 # <cjk>
+3-4C32 U+7720 # <cjk>
+3-4C33 U+52D9 # <cjk>
+3-4C34 U+5922 # <cjk>
+3-4C35 U+7121 # <cjk>
+3-4C36 U+725F # <cjk>
+3-4C37 U+77DB # <cjk>
+3-4C38 U+9727 # <cjk>
+3-4C39 U+9D61 # <cjk>
+3-4C3A U+690B # <cjk>
+3-4C3B U+5A7F # <cjk>
+3-4C3C U+5A18 # <cjk>
+3-4C3D U+51A5 # <cjk>
+3-4C3E U+540D # <cjk>
+3-4C3F U+547D # <cjk>
+3-4C40 U+660E # <cjk>
+3-4C41 U+76DF # <cjk>
+3-4C42 U+8FF7 # <cjk>
+3-4C43 U+9298 # <cjk>
+3-4C44 U+9CF4 # <cjk>
+3-4C45 U+59EA # <cjk>
+3-4C46 U+725D # <cjk>
+3-4C47 U+6EC5 # <cjk>
+3-4C48 U+514D # <cjk>
+3-4C49 U+68C9 # <cjk>
+3-4C4A U+7DBF # <cjk>
+3-4C4B U+7DEC # <cjk>
+3-4C4C U+9762 # <cjk>
+3-4C4D U+9EBA # <cjk>
+3-4C4E U+6478 # <cjk>
+3-4C4F U+6A21 # <cjk>
+3-4C50 U+8302 # <cjk>
+3-4C51 U+5984 # <cjk>
+3-4C52 U+5B5F # <cjk>
+3-4C53 U+6BDB # <cjk>
+3-4C54 U+731B # <cjk>
+3-4C55 U+76F2 # <cjk>
+3-4C56 U+7DB2 # <cjk>
+3-4C57 U+8017 # <cjk>
+3-4C58 U+8499 # <cjk>
+3-4C59 U+5132 # <cjk>
+3-4C5A U+6728 # <cjk>
+3-4C5B U+9ED9 # <cjk>
+3-4C5C U+76EE # <cjk>
+3-4C5D U+6762 # <cjk>
+3-4C5E U+52FF # <cjk>
+3-4C5F U+9905 # <cjk>
+3-4C60 U+5C24 # <cjk>
+3-4C61 U+623B # <cjk>
+3-4C62 U+7C7E # <cjk>
+3-4C63 U+8CB0 # <cjk>
+3-4C64 U+554F # <cjk>
+3-4C65 U+60B6 # <cjk>
+3-4C66 U+7D0B # <cjk>
+3-4C67 U+9580 # <cjk>
+3-4C68 U+5301 # <cjk>
+3-4C69 U+4E5F # <cjk>
+3-4C6A U+51B6 # <cjk>
+3-4C6B U+591C # <cjk>
+3-4C6C U+723A # <cjk>
+3-4C6D U+8036 # <cjk>
+3-4C6E U+91CE # <cjk>
+3-4C6F U+5F25 # <cjk>
+3-4C70 U+77E2 # <cjk>
+3-4C71 U+5384 # <cjk>
+3-4C72 U+5F79 # <cjk>
+3-4C73 U+7D04 # <cjk>
+3-4C74 U+85AC # <cjk>
+3-4C75 U+8A33 # <cjk>
+3-4C76 U+8E8D # <cjk>
+3-4C77 U+9756 # <cjk>
+3-4C78 U+67F3 # <cjk>
+3-4C79 U+85AE # <cjk>
+3-4C7A U+9453 # <cjk>
+3-4C7B U+6109 # <cjk>
+3-4C7C U+6108 # <cjk>
+3-4C7D U+6CB9 # <cjk>
+3-4C7E U+7652 # <cjk>
+3-4D21 U+8AED # <cjk>
+3-4D22 U+8F38 # <cjk>
+3-4D23 U+552F # <cjk>
+3-4D24 U+4F51 # <cjk>
+3-4D25 U+512A # <cjk>
+3-4D26 U+52C7 # <cjk>
+3-4D27 U+53CB # <cjk>
+3-4D28 U+5BA5 # <cjk>
+3-4D29 U+5E7D # <cjk>
+3-4D2A U+60A0 # <cjk>
+3-4D2B U+6182 # <cjk>
+3-4D2C U+63D6 # <cjk>
+3-4D2D U+6709 # <cjk>
+3-4D2E U+67DA # <cjk>
+3-4D2F U+6E67 # <cjk>
+3-4D30 U+6D8C # <cjk>
+3-4D31 U+7336 # <cjk>
+3-4D32 U+7337 # <cjk>
+3-4D33 U+7531 # <cjk>
+3-4D34 U+7950 # <cjk>
+3-4D35 U+88D5 # <cjk>
+3-4D36 U+8A98 # <cjk>
+3-4D37 U+904A # <cjk>
+3-4D38 U+9091 # <cjk>
+3-4D39 U+90F5 # <cjk>
+3-4D3A U+96C4 # <cjk>
+3-4D3B U+878D # <cjk>
+3-4D3C U+5915 # <cjk>
+3-4D3D U+4E88 # <cjk>
+3-4D3E U+4F59 # <cjk>
+3-4D3F U+4E0E # <cjk>
+3-4D40 U+8A89 # <cjk>
+3-4D41 U+8F3F # <cjk>
+3-4D42 U+9810 # <cjk>
+3-4D43 U+50AD # <cjk>
+3-4D44 U+5E7C # <cjk>
+3-4D45 U+5996 # <cjk>
+3-4D46 U+5BB9 # <cjk>
+3-4D47 U+5EB8 # <cjk>
+3-4D48 U+63DA # <cjk>
+3-4D49 U+63FA # <cjk>
+3-4D4A U+64C1 # <cjk>
+3-4D4B U+66DC # <cjk>
+3-4D4C U+694A # <cjk>
+3-4D4D U+69D8 # <cjk>
+3-4D4E U+6D0B # <cjk>
+3-4D4F U+6EB6 # <cjk>
+3-4D50 U+7194 # <cjk>
+3-4D51 U+7528 # <cjk>
+3-4D52 U+7AAF # <cjk>
+3-4D53 U+7F8A # <cjk>
+3-4D54 U+8000 # <cjk>
+3-4D55 U+8449 # <cjk>
+3-4D56 U+84C9 # <cjk>
+3-4D57 U+8981 # <cjk>
+3-4D58 U+8B21 # <cjk>
+3-4D59 U+8E0A # <cjk>
+3-4D5A U+9065 # <cjk>
+3-4D5B U+967D # <cjk>
+3-4D5C U+990A # <cjk>
+3-4D5D U+617E # <cjk>
+3-4D5E U+6291 # <cjk>
+3-4D5F U+6B32 # <cjk>
+3-4D60 U+6C83 # <cjk>
+3-4D61 U+6D74 # <cjk>
+3-4D62 U+7FCC # <cjk>
+3-4D63 U+7FFC # <cjk>
+3-4D64 U+6DC0 # <cjk>
+3-4D65 U+7F85 # <cjk>
+3-4D66 U+87BA # <cjk>
+3-4D67 U+88F8 # <cjk>
+3-4D68 U+6765 # <cjk>
+3-4D69 U+83B1 # <cjk>
+3-4D6A U+983C # <cjk>
+3-4D6B U+96F7 # <cjk>
+3-4D6C U+6D1B # <cjk>
+3-4D6D U+7D61 # <cjk>
+3-4D6E U+843D # <cjk>
+3-4D6F U+916A # <cjk>
+3-4D70 U+4E71 # <cjk>
+3-4D71 U+5375 # <cjk>
+3-4D72 U+5D50 # <cjk>
+3-4D73 U+6B04 # <cjk>
+3-4D74 U+6FEB # <cjk>
+3-4D75 U+85CD # <cjk>
+3-4D76 U+862D # <cjk>
+3-4D77 U+89A7 # <cjk>
+3-4D78 U+5229 # <cjk>
+3-4D79 U+540F # <cjk>
+3-4D7A U+5C65 # <cjk>
+3-4D7B U+674E # <cjk>
+3-4D7C U+68A8 # <cjk>
+3-4D7D U+7406 # <cjk>
+3-4D7E U+7483 # <cjk>
+3-4E21 U+75E2 # <cjk>
+3-4E22 U+88CF # <cjk>
+3-4E23 U+88E1 # <cjk>
+3-4E24 U+91CC # <cjk>
+3-4E25 U+96E2 # <cjk>
+3-4E26 U+9678 # <cjk>
+3-4E27 U+5F8B # <cjk>
+3-4E28 U+7387 # <cjk>
+3-4E29 U+7ACB # <cjk>
+3-4E2A U+844E # <cjk>
+3-4E2B U+63A0 # <cjk>
+3-4E2C U+7565 # <cjk>
+3-4E2D U+5289 # <cjk>
+3-4E2E U+6D41 # <cjk>
+3-4E2F U+6E9C # <cjk>
+3-4E30 U+7409 # <cjk>
+3-4E31 U+7559 # <cjk>
+3-4E32 U+786B # <cjk>
+3-4E33 U+7C92 # <cjk>
+3-4E34 U+9686 # <cjk>
+3-4E35 U+7ADC # <cjk>
+3-4E36 U+9F8D # <cjk>
+3-4E37 U+4FB6 # <cjk>
+3-4E38 U+616E # <cjk>
+3-4E39 U+65C5 # <cjk>
+3-4E3A U+865C # <cjk>
+3-4E3B U+4E86 # <cjk>
+3-4E3C U+4EAE # <cjk>
+3-4E3D U+50DA # <cjk>
+3-4E3E U+4E21 # <cjk>
+3-4E3F U+51CC # <cjk>
+3-4E40 U+5BEE # <cjk>
+3-4E41 U+6599 # <cjk>
+3-4E42 U+6881 # <cjk>
+3-4E43 U+6DBC # <cjk>
+3-4E44 U+731F # <cjk>
+3-4E45 U+7642 # <cjk>
+3-4E46 U+77AD # <cjk>
+3-4E47 U+7A1C # <cjk>
+3-4E48 U+7CE7 # <cjk>
+3-4E49 U+826F # <cjk>
+3-4E4A U+8AD2 # <cjk>
+3-4E4B U+907C # <cjk>
+3-4E4C U+91CF # <cjk>
+3-4E4D U+9675 # <cjk>
+3-4E4E U+9818 # <cjk>
+3-4E4F U+529B # <cjk>
+3-4E50 U+7DD1 # <cjk>
+3-4E51 U+502B # <cjk>
+3-4E52 U+5398 # <cjk>
+3-4E53 U+6797 # <cjk>
+3-4E54 U+6DCB # <cjk>
+3-4E55 U+71D0 # <cjk>
+3-4E56 U+7433 # <cjk>
+3-4E57 U+81E8 # <cjk>
+3-4E58 U+8F2A # <cjk>
+3-4E59 U+96A3 # <cjk>
+3-4E5A U+9C57 # <cjk>
+3-4E5B U+9E9F # <cjk>
+3-4E5C U+7460 # <cjk>
+3-4E5D U+5841 # <cjk>
+3-4E5E U+6D99 # <cjk>
+3-4E5F U+7D2F # <cjk>
+3-4E60 U+985E # <cjk>
+3-4E61 U+4EE4 # <cjk>
+3-4E62 U+4F36 # <cjk>
+3-4E63 U+4F8B # <cjk>
+3-4E64 U+51B7 # <cjk>
+3-4E65 U+52B1 # <cjk>
+3-4E66 U+5DBA # <cjk>
+3-4E67 U+601C # <cjk>
+3-4E68 U+73B2 # <cjk>
+3-4E69 U+793C # <cjk>
+3-4E6A U+82D3 # <cjk>
+3-4E6B U+9234 # <cjk>
+3-4E6C U+96B7 # <cjk>
+3-4E6D U+96F6 # <cjk>
+3-4E6E U+970A # <cjk>
+3-4E6F U+9E97 # <cjk>
+3-4E70 U+9F62 # <cjk>
+3-4E71 U+66A6 # <cjk>
+3-4E72 U+6B74 # <cjk>
+3-4E73 U+5217 # <cjk>
+3-4E74 U+52A3 # <cjk>
+3-4E75 U+70C8 # <cjk>
+3-4E76 U+88C2 # <cjk>
+3-4E77 U+5EC9 # <cjk>
+3-4E78 U+604B # <cjk>
+3-4E79 U+6190 # <cjk>
+3-4E7A U+6F23 # <cjk>
+3-4E7B U+7149 # <cjk>
+3-4E7C U+7C3E # <cjk>
+3-4E7D U+7DF4 # <cjk>
+3-4E7E U+806F # <cjk>
+3-4F21 U+84EE # <cjk>
+3-4F22 U+9023 # <cjk>
+3-4F23 U+932C # <cjk>
+3-4F24 U+5442 # <cjk>
+3-4F25 U+9B6F # <cjk>
+3-4F26 U+6AD3 # <cjk>
+3-4F27 U+7089 # <cjk>
+3-4F28 U+8CC2 # <cjk>
+3-4F29 U+8DEF # <cjk>
+3-4F2A U+9732 # <cjk>
+3-4F2B U+52B4 # <cjk>
+3-4F2C U+5A41 # <cjk>
+3-4F2D U+5ECA # <cjk>
+3-4F2E U+5F04 # <cjk>
+3-4F2F U+6717 # <cjk>
+3-4F30 U+697C # <cjk>
+3-4F31 U+6994 # <cjk>
+3-4F32 U+6D6A # <cjk>
+3-4F33 U+6F0F # <cjk>
+3-4F34 U+7262 # <cjk>
+3-4F35 U+72FC # <cjk>
+3-4F36 U+7BED # <cjk>
+3-4F37 U+8001 # <cjk>
+3-4F38 U+807E # <cjk>
+3-4F39 U+874B # <cjk>
+3-4F3A U+90CE # <cjk>
+3-4F3B U+516D # <cjk>
+3-4F3C U+9E93 # <cjk>
+3-4F3D U+7984 # <cjk>
+3-4F3E U+808B # <cjk>
+3-4F3F U+9332 # <cjk>
+3-4F40 U+8AD6 # <cjk>
+3-4F41 U+502D # <cjk>
+3-4F42 U+548C # <cjk>
+3-4F43 U+8A71 # <cjk>
+3-4F44 U+6B6A # <cjk>
+3-4F45 U+8CC4 # <cjk>
+3-4F46 U+8107 # <cjk>
+3-4F47 U+60D1 # <cjk>
+3-4F48 U+67A0 # <cjk>
+3-4F49 U+9DF2 # <cjk>
+3-4F4A U+4E99 # <cjk>
+3-4F4B U+4E98 # <cjk>
+3-4F4C U+9C10 # <cjk>
+3-4F4D U+8A6B # <cjk>
+3-4F4E U+85C1 # <cjk>
+3-4F4F U+8568 # <cjk>
+3-4F50 U+6900 # <cjk>
+3-4F51 U+6E7E # <cjk>
+3-4F52 U+7897 # <cjk>
+3-4F53 U+8155 # <cjk>
+3-4F54 U+20B9F # <cjk> [2004] [Unicode3.1]
+3-4F55 U+5B41 # <cjk> [2000]
+3-4F56 U+5B56 # <cjk> [2000]
+3-4F57 U+5B7D # <cjk> [2000]
+3-4F58 U+5B93 # <cjk> [2000]
+3-4F59 U+5BD8 # <cjk> [2000]
+3-4F5A U+5BEC # <cjk> [2000]
+3-4F5B U+5C12 # <cjk> [2000]
+3-4F5C U+5C1E # <cjk> [2000]
+3-4F5D U+5C23 # <cjk> [2000]
+3-4F5E U+5C2B # <cjk> [2000]
+3-4F5F U+378D # <cjk> [2000]
+3-4F60 U+5C62 # <cjk> [2000]
+3-4F61 U+FA3B # CJK COMPATIBILITY IDEOGRAPH-FA3B [2000] [Unicode3.2]
+3-4F62 U+FA3C # CJK COMPATIBILITY IDEOGRAPH-FA3C [2000] [Unicode3.2]
+3-4F63 U+216B4 # <cjk> [2000] [Unicode3.1]
+3-4F64 U+5C7A # <cjk> [2000]
+3-4F65 U+5C8F # <cjk> [2000]
+3-4F66 U+5C9F # <cjk> [2000]
+3-4F67 U+5CA3 # <cjk> [2000]
+3-4F68 U+5CAA # <cjk> [2000]
+3-4F69 U+5CBA # <cjk> [2000]
+3-4F6A U+5CCB # <cjk> [2000]
+3-4F6B U+5CD0 # <cjk> [2000]
+3-4F6C U+5CD2 # <cjk> [2000]
+3-4F6D U+5CF4 # <cjk> [2000]
+3-4F6E U+21E34 # <cjk> [2000] [Unicode3.1]
+3-4F6F U+37E2 # <cjk> [2000]
+3-4F70 U+5D0D # <cjk> [2000]
+3-4F71 U+5D27 # <cjk> [2000]
+3-4F72 U+FA11 # CJK COMPATIBILITY IDEOGRAPH-FA11 [2000]
+3-4F73 U+5D46 # <cjk> [2000]
+3-4F74 U+5D47 # <cjk> [2000]
+3-4F75 U+5D53 # <cjk> [2000]
+3-4F76 U+5D4A # <cjk> [2000]
+3-4F77 U+5D6D # <cjk> [2000]
+3-4F78 U+5D81 # <cjk> [2000]
+3-4F79 U+5DA0 # <cjk> [2000]
+3-4F7A U+5DA4 # <cjk> [2000]
+3-4F7B U+5DA7 # <cjk> [2000]
+3-4F7C U+5DB8 # <cjk> [2000]
+3-4F7D U+5DCB # <cjk> [2000]
+3-4F7E U+541E # <cjk> [2004]
+3-5021 U+5F0C # <cjk>
+3-5022 U+4E10 # <cjk>
+3-5023 U+4E15 # <cjk>
+3-5024 U+4E2A # <cjk>
+3-5025 U+4E31 # <cjk>
+3-5026 U+4E36 # <cjk>
+3-5027 U+4E3C # <cjk>
+3-5028 U+4E3F # <cjk>
+3-5029 U+4E42 # <cjk>
+3-502A U+4E56 # <cjk>
+3-502B U+4E58 # <cjk>
+3-502C U+4E82 # <cjk>
+3-502D U+4E85 # <cjk>
+3-502E U+8C6B # <cjk>
+3-502F U+4E8A # <cjk>
+3-5030 U+8212 # <cjk>
+3-5031 U+5F0D # <cjk>
+3-5032 U+4E8E # <cjk>
+3-5033 U+4E9E # <cjk>
+3-5034 U+4E9F # <cjk>
+3-5035 U+4EA0 # <cjk>
+3-5036 U+4EA2 # <cjk>
+3-5037 U+4EB0 # <cjk>
+3-5038 U+4EB3 # <cjk>
+3-5039 U+4EB6 # <cjk>
+3-503A U+4ECE # <cjk>
+3-503B U+4ECD # <cjk>
+3-503C U+4EC4 # <cjk>
+3-503D U+4EC6 # <cjk>
+3-503E U+4EC2 # <cjk>
+3-503F U+4ED7 # <cjk>
+3-5040 U+4EDE # <cjk>
+3-5041 U+4EED # <cjk>
+3-5042 U+4EDF # <cjk>
+3-5043 U+4EF7 # <cjk>
+3-5044 U+4F09 # <cjk>
+3-5045 U+4F5A # <cjk>
+3-5046 U+4F30 # <cjk>
+3-5047 U+4F5B # <cjk>
+3-5048 U+4F5D # <cjk>
+3-5049 U+4F57 # <cjk>
+3-504A U+4F47 # <cjk>
+3-504B U+4F76 # <cjk>
+3-504C U+4F88 # <cjk>
+3-504D U+4F8F # <cjk>
+3-504E U+4F98 # <cjk>
+3-504F U+4F7B # <cjk>
+3-5050 U+4F69 # <cjk>
+3-5051 U+4F70 # <cjk>
+3-5052 U+4F91 # <cjk>
+3-5053 U+4F6F # <cjk>
+3-5054 U+4F86 # <cjk>
+3-5055 U+4F96 # <cjk>
+3-5056 U+5118 # <cjk>
+3-5057 U+4FD4 # <cjk>
+3-5058 U+4FDF # <cjk>
+3-5059 U+4FCE # <cjk>
+3-505A U+4FD8 # <cjk>
+3-505B U+4FDB # <cjk>
+3-505C U+4FD1 # <cjk>
+3-505D U+4FDA # <cjk>
+3-505E U+4FD0 # <cjk>
+3-505F U+4FE4 # <cjk>
+3-5060 U+4FE5 # <cjk>
+3-5061 U+501A # <cjk>
+3-5062 U+5028 # <cjk>
+3-5063 U+5014 # <cjk>
+3-5064 U+502A # <cjk>
+3-5065 U+5025 # <cjk>
+3-5066 U+5005 # <cjk>
+3-5067 U+4F1C # <cjk>
+3-5068 U+4FF6 # <cjk>
+3-5069 U+5021 # <cjk>
+3-506A U+5029 # <cjk>
+3-506B U+502C # <cjk>
+3-506C U+4FFE # <cjk>
+3-506D U+4FEF # <cjk>
+3-506E U+5011 # <cjk>
+3-506F U+5006 # <cjk>
+3-5070 U+5043 # <cjk>
+3-5071 U+5047 # <cjk>
+3-5072 U+6703 # <cjk>
+3-5073 U+5055 # <cjk>
+3-5074 U+5050 # <cjk>
+3-5075 U+5048 # <cjk>
+3-5076 U+505A # <cjk>
+3-5077 U+5056 # <cjk>
+3-5078 U+506C # <cjk>
+3-5079 U+5078 # <cjk>
+3-507A U+5080 # <cjk>
+3-507B U+509A # <cjk>
+3-507C U+5085 # <cjk>
+3-507D U+50B4 # <cjk>
+3-507E U+50B2 # <cjk>
+3-5121 U+50C9 # <cjk>
+3-5122 U+50CA # <cjk>
+3-5123 U+50B3 # <cjk>
+3-5124 U+50C2 # <cjk>
+3-5125 U+50D6 # <cjk>
+3-5126 U+50DE # <cjk>
+3-5127 U+50E5 # <cjk>
+3-5128 U+50ED # <cjk>
+3-5129 U+50E3 # <cjk>
+3-512A U+50EE # <cjk>
+3-512B U+50F9 # <cjk>
+3-512C U+50F5 # <cjk>
+3-512D U+5109 # <cjk>
+3-512E U+5101 # <cjk>
+3-512F U+5102 # <cjk>
+3-5130 U+5116 # <cjk>
+3-5131 U+5115 # <cjk>
+3-5132 U+5114 # <cjk>
+3-5133 U+511A # <cjk>
+3-5134 U+5121 # <cjk>
+3-5135 U+513A # <cjk>
+3-5136 U+5137 # <cjk>
+3-5137 U+513C # <cjk>
+3-5138 U+513B # <cjk>
+3-5139 U+513F # <cjk>
+3-513A U+5140 # <cjk>
+3-513B U+5152 # <cjk>
+3-513C U+514C # <cjk>
+3-513D U+5154 # <cjk>
+3-513E U+5162 # <cjk>
+3-513F U+7AF8 # <cjk>
+3-5140 U+5169 # <cjk>
+3-5141 U+516A # <cjk>
+3-5142 U+516E # <cjk>
+3-5143 U+5180 # <cjk>
+3-5144 U+5182 # <cjk>
+3-5145 U+56D8 # <cjk>
+3-5146 U+518C # <cjk>
+3-5147 U+5189 # <cjk>
+3-5148 U+518F # <cjk>
+3-5149 U+5191 # <cjk>
+3-514A U+5193 # <cjk>
+3-514B U+5195 # <cjk>
+3-514C U+5196 # <cjk>
+3-514D U+51A4 # <cjk>
+3-514E U+51A6 # <cjk>
+3-514F U+51A2 # <cjk>
+3-5150 U+51A9 # <cjk>
+3-5151 U+51AA # <cjk>
+3-5152 U+51AB # <cjk>
+3-5153 U+51B3 # <cjk>
+3-5154 U+51B1 # <cjk>
+3-5155 U+51B2 # <cjk>
+3-5156 U+51B0 # <cjk>
+3-5157 U+51B5 # <cjk>
+3-5158 U+51BD # <cjk>
+3-5159 U+51C5 # <cjk>
+3-515A U+51C9 # <cjk>
+3-515B U+51DB # <cjk>
+3-515C U+51E0 # <cjk>
+3-515D U+8655 # <cjk>
+3-515E U+51E9 # <cjk>
+3-515F U+51ED # <cjk>
+3-5160 U+51F0 # <cjk>
+3-5161 U+51F5 # <cjk>
+3-5162 U+51FE # <cjk>
+3-5163 U+5204 # <cjk>
+3-5164 U+520B # <cjk>
+3-5165 U+5214 # <cjk>
+3-5166 U+520E # <cjk>
+3-5167 U+5227 # <cjk>
+3-5168 U+522A # <cjk>
+3-5169 U+522E # <cjk>
+3-516A U+5233 # <cjk>
+3-516B U+5239 # <cjk>
+3-516C U+524F # <cjk>
+3-516D U+5244 # <cjk>
+3-516E U+524B # <cjk>
+3-516F U+524C # <cjk>
+3-5170 U+525E # <cjk>
+3-5171 U+5254 # <cjk>
+3-5172 U+526A # <cjk>
+3-5173 U+5274 # <cjk>
+3-5174 U+5269 # <cjk>
+3-5175 U+5273 # <cjk>
+3-5176 U+527F # <cjk>
+3-5177 U+527D # <cjk>
+3-5178 U+528D # <cjk>
+3-5179 U+5294 # <cjk>
+3-517A U+5292 # <cjk>
+3-517B U+5271 # <cjk>
+3-517C U+5288 # <cjk>
+3-517D U+5291 # <cjk>
+3-517E U+8FA8 # <cjk>
+3-5221 U+8FA7 # <cjk>
+3-5222 U+52AC # <cjk>
+3-5223 U+52AD # <cjk>
+3-5224 U+52BC # <cjk>
+3-5225 U+52B5 # <cjk>
+3-5226 U+52C1 # <cjk>
+3-5227 U+52CD # <cjk>
+3-5228 U+52D7 # <cjk>
+3-5229 U+52DE # <cjk>
+3-522A U+52E3 # <cjk>
+3-522B U+52E6 # <cjk>
+3-522C U+98ED # <cjk>
+3-522D U+52E0 # <cjk>
+3-522E U+52F3 # <cjk>
+3-522F U+52F5 # <cjk>
+3-5230 U+52F8 # <cjk>
+3-5231 U+52F9 # <cjk>
+3-5232 U+5306 # <cjk>
+3-5233 U+5308 # <cjk>
+3-5234 U+7538 # <cjk>
+3-5235 U+530D # <cjk>
+3-5236 U+5310 # <cjk>
+3-5237 U+530F # <cjk>
+3-5238 U+5315 # <cjk>
+3-5239 U+531A # <cjk>
+3-523A U+5323 # <cjk>
+3-523B U+532F # <cjk>
+3-523C U+5331 # <cjk>
+3-523D U+5333 # <cjk>
+3-523E U+5338 # <cjk>
+3-523F U+5340 # <cjk>
+3-5240 U+5346 # <cjk>
+3-5241 U+5345 # <cjk>
+3-5242 U+4E17 # <cjk>
+3-5243 U+5349 # <cjk>
+3-5244 U+534D # <cjk>
+3-5245 U+51D6 # <cjk>
+3-5246 U+535E # <cjk>
+3-5247 U+5369 # <cjk>
+3-5248 U+536E # <cjk>
+3-5249 U+5918 # <cjk>
+3-524A U+537B # <cjk>
+3-524B U+5377 # <cjk>
+3-524C U+5382 # <cjk>
+3-524D U+5396 # <cjk>
+3-524E U+53A0 # <cjk>
+3-524F U+53A6 # <cjk>
+3-5250 U+53A5 # <cjk>
+3-5251 U+53AE # <cjk>
+3-5252 U+53B0 # <cjk>
+3-5253 U+53B6 # <cjk>
+3-5254 U+53C3 # <cjk>
+3-5255 U+7C12 # <cjk>
+3-5256 U+96D9 # <cjk>
+3-5257 U+53DF # <cjk>
+3-5258 U+66FC # <cjk>
+3-5259 U+71EE # <cjk>
+3-525A U+53EE # <cjk>
+3-525B U+53E8 # <cjk>
+3-525C U+53ED # <cjk>
+3-525D U+53FA # <cjk>
+3-525E U+5401 # <cjk>
+3-525F U+543D # <cjk>
+3-5260 U+5440 # <cjk>
+3-5261 U+542C # <cjk>
+3-5262 U+542D # <cjk>
+3-5263 U+543C # <cjk>
+3-5264 U+542E # <cjk>
+3-5265 U+5436 # <cjk>
+3-5266 U+5429 # <cjk>
+3-5267 U+541D # <cjk>
+3-5268 U+544E # <cjk>
+3-5269 U+548F # <cjk>
+3-526A U+5475 # <cjk>
+3-526B U+548E # <cjk>
+3-526C U+545F # <cjk>
+3-526D U+5471 # <cjk>
+3-526E U+5477 # <cjk>
+3-526F U+5470 # <cjk>
+3-5270 U+5492 # <cjk>
+3-5271 U+547B # <cjk>
+3-5272 U+5480 # <cjk>
+3-5273 U+5476 # <cjk>
+3-5274 U+5484 # <cjk>
+3-5275 U+5490 # <cjk>
+3-5276 U+5486 # <cjk>
+3-5277 U+54C7 # <cjk>
+3-5278 U+54A2 # <cjk>
+3-5279 U+54B8 # <cjk>
+3-527A U+54A5 # <cjk>
+3-527B U+54AC # <cjk>
+3-527C U+54C4 # <cjk>
+3-527D U+54C8 # <cjk>
+3-527E U+54A8 # <cjk>
+3-5321 U+54AB # <cjk>
+3-5322 U+54C2 # <cjk>
+3-5323 U+54A4 # <cjk>
+3-5324 U+54BE # <cjk>
+3-5325 U+54BC # <cjk>
+3-5326 U+54D8 # <cjk>
+3-5327 U+54E5 # <cjk>
+3-5328 U+54E6 # <cjk>
+3-5329 U+550F # <cjk>
+3-532A U+5514 # <cjk>
+3-532B U+54FD # <cjk>
+3-532C U+54EE # <cjk>
+3-532D U+54ED # <cjk>
+3-532E U+54FA # <cjk>
+3-532F U+54E2 # <cjk>
+3-5330 U+5539 # <cjk>
+3-5331 U+5540 # <cjk>
+3-5332 U+5563 # <cjk>
+3-5333 U+554C # <cjk>
+3-5334 U+552E # <cjk>
+3-5335 U+555C # <cjk>
+3-5336 U+5545 # <cjk>
+3-5337 U+5556 # <cjk>
+3-5338 U+5557 # <cjk>
+3-5339 U+5538 # <cjk>
+3-533A U+5533 # <cjk>
+3-533B U+555D # <cjk>
+3-533C U+5599 # <cjk>
+3-533D U+5580 # <cjk>
+3-533E U+54AF # <cjk>
+3-533F U+558A # <cjk>
+3-5340 U+559F # <cjk>
+3-5341 U+557B # <cjk>
+3-5342 U+557E # <cjk>
+3-5343 U+5598 # <cjk>
+3-5344 U+559E # <cjk>
+3-5345 U+55AE # <cjk>
+3-5346 U+557C # <cjk>
+3-5347 U+5583 # <cjk>
+3-5348 U+55A9 # <cjk>
+3-5349 U+5587 # <cjk>
+3-534A U+55A8 # <cjk>
+3-534B U+55DA # <cjk>
+3-534C U+55C5 # <cjk>
+3-534D U+55DF # <cjk>
+3-534E U+55C4 # <cjk>
+3-534F U+55DC # <cjk>
+3-5350 U+55E4 # <cjk>
+3-5351 U+55D4 # <cjk>
+3-5352 U+5614 # <cjk>
+3-5353 U+55F7 # <cjk>
+3-5354 U+5616 # <cjk>
+3-5355 U+55FE # <cjk>
+3-5356 U+55FD # <cjk>
+3-5357 U+561B # <cjk>
+3-5358 U+55F9 # <cjk>
+3-5359 U+564E # <cjk>
+3-535A U+5650 # <cjk>
+3-535B U+71DF # <cjk>
+3-535C U+5634 # <cjk>
+3-535D U+5636 # <cjk>
+3-535E U+5632 # <cjk>
+3-535F U+5638 # <cjk>
+3-5360 U+566B # <cjk>
+3-5361 U+5664 # <cjk>
+3-5362 U+562F # <cjk>
+3-5363 U+566C # <cjk>
+3-5364 U+566A # <cjk>
+3-5365 U+5686 # <cjk>
+3-5366 U+5680 # <cjk>
+3-5367 U+568A # <cjk>
+3-5368 U+56A0 # <cjk>
+3-5369 U+5694 # <cjk>
+3-536A U+568F # <cjk>
+3-536B U+56A5 # <cjk>
+3-536C U+56AE # <cjk>
+3-536D U+56B6 # <cjk>
+3-536E U+56B4 # <cjk>
+3-536F U+56C2 # <cjk>
+3-5370 U+56BC # <cjk>
+3-5371 U+56C1 # <cjk>
+3-5372 U+56C3 # <cjk>
+3-5373 U+56C0 # <cjk>
+3-5374 U+56C8 # <cjk>
+3-5375 U+56CE # <cjk>
+3-5376 U+56D1 # <cjk>
+3-5377 U+56D3 # <cjk>
+3-5378 U+56D7 # <cjk>
+3-5379 U+56EE # <cjk>
+3-537A U+56F9 # <cjk>
+3-537B U+5700 # <cjk>
+3-537C U+56FF # <cjk>
+3-537D U+5704 # <cjk>
+3-537E U+5709 # <cjk>
+3-5421 U+5708 # <cjk>
+3-5422 U+570B # <cjk>
+3-5423 U+570D # <cjk>
+3-5424 U+5713 # <cjk>
+3-5425 U+5718 # <cjk>
+3-5426 U+5716 # <cjk>
+3-5427 U+55C7 # <cjk>
+3-5428 U+571C # <cjk>
+3-5429 U+5726 # <cjk>
+3-542A U+5737 # <cjk>
+3-542B U+5738 # <cjk>
+3-542C U+574E # <cjk>
+3-542D U+573B # <cjk>
+3-542E U+5740 # <cjk>
+3-542F U+574F # <cjk>
+3-5430 U+5769 # <cjk>
+3-5431 U+57C0 # <cjk>
+3-5432 U+5788 # <cjk>
+3-5433 U+5761 # <cjk>
+3-5434 U+577F # <cjk>
+3-5435 U+5789 # <cjk>
+3-5436 U+5793 # <cjk>
+3-5437 U+57A0 # <cjk>
+3-5438 U+57B3 # <cjk>
+3-5439 U+57A4 # <cjk>
+3-543A U+57AA # <cjk>
+3-543B U+57B0 # <cjk>
+3-543C U+57C3 # <cjk>
+3-543D U+57C6 # <cjk>
+3-543E U+57D4 # <cjk>
+3-543F U+57D2 # <cjk>
+3-5440 U+57D3 # <cjk>
+3-5441 U+580A # <cjk>
+3-5442 U+57D6 # <cjk>
+3-5443 U+57E3 # <cjk>
+3-5444 U+580B # <cjk>
+3-5445 U+5819 # <cjk>
+3-5446 U+581D # <cjk>
+3-5447 U+5872 # <cjk>
+3-5448 U+5821 # <cjk>
+3-5449 U+5862 # <cjk>
+3-544A U+584B # <cjk>
+3-544B U+5870 # <cjk>
+3-544C U+6BC0 # <cjk>
+3-544D U+5852 # <cjk>
+3-544E U+583D # <cjk>
+3-544F U+5879 # <cjk>
+3-5450 U+5885 # <cjk>
+3-5451 U+58B9 # <cjk>
+3-5452 U+589F # <cjk>
+3-5453 U+58AB # <cjk>
+3-5454 U+58BA # <cjk>
+3-5455 U+58DE # <cjk>
+3-5456 U+58BB # <cjk>
+3-5457 U+58B8 # <cjk>
+3-5458 U+58AE # <cjk>
+3-5459 U+58C5 # <cjk>
+3-545A U+58D3 # <cjk>
+3-545B U+58D1 # <cjk>
+3-545C U+58D7 # <cjk>
+3-545D U+58D9 # <cjk>
+3-545E U+58D8 # <cjk>
+3-545F U+58E5 # <cjk>
+3-5460 U+58DC # <cjk>
+3-5461 U+58E4 # <cjk>
+3-5462 U+58DF # <cjk>
+3-5463 U+58EF # <cjk>
+3-5464 U+58FA # <cjk>
+3-5465 U+58F9 # <cjk>
+3-5466 U+58FB # <cjk>
+3-5467 U+58FC # <cjk>
+3-5468 U+58FD # <cjk>
+3-5469 U+5902 # <cjk>
+3-546A U+590A # <cjk>
+3-546B U+5910 # <cjk>
+3-546C U+591B # <cjk>
+3-546D U+68A6 # <cjk>
+3-546E U+5925 # <cjk>
+3-546F U+592C # <cjk>
+3-5470 U+592D # <cjk>
+3-5471 U+5932 # <cjk>
+3-5472 U+5938 # <cjk>
+3-5473 U+593E # <cjk>
+3-5474 U+7AD2 # <cjk>
+3-5475 U+5955 # <cjk>
+3-5476 U+5950 # <cjk>
+3-5477 U+594E # <cjk>
+3-5478 U+595A # <cjk>
+3-5479 U+5958 # <cjk>
+3-547A U+5962 # <cjk>
+3-547B U+5960 # <cjk>
+3-547C U+5967 # <cjk>
+3-547D U+596C # <cjk>
+3-547E U+5969 # <cjk>
+3-5521 U+5978 # <cjk>
+3-5522 U+5981 # <cjk>
+3-5523 U+599D # <cjk>
+3-5524 U+4F5E # <cjk>
+3-5525 U+4FAB # <cjk>
+3-5526 U+59A3 # <cjk>
+3-5527 U+59B2 # <cjk>
+3-5528 U+59C6 # <cjk>
+3-5529 U+59E8 # <cjk>
+3-552A U+59DC # <cjk>
+3-552B U+598D # <cjk>
+3-552C U+59D9 # <cjk>
+3-552D U+59DA # <cjk>
+3-552E U+5A25 # <cjk>
+3-552F U+5A1F # <cjk>
+3-5530 U+5A11 # <cjk>
+3-5531 U+5A1C # <cjk>
+3-5532 U+5A09 # <cjk>
+3-5533 U+5A1A # <cjk>
+3-5534 U+5A40 # <cjk>
+3-5535 U+5A6C # <cjk>
+3-5536 U+5A49 # <cjk>
+3-5537 U+5A35 # <cjk>
+3-5538 U+5A36 # <cjk>
+3-5539 U+5A62 # <cjk>
+3-553A U+5A6A # <cjk>
+3-553B U+5A9A # <cjk>
+3-553C U+5ABC # <cjk>
+3-553D U+5ABE # <cjk>
+3-553E U+5ACB # <cjk>
+3-553F U+5AC2 # <cjk>
+3-5540 U+5ABD # <cjk>
+3-5541 U+5AE3 # <cjk>
+3-5542 U+5AD7 # <cjk>
+3-5543 U+5AE6 # <cjk>
+3-5544 U+5AE9 # <cjk>
+3-5545 U+5AD6 # <cjk>
+3-5546 U+5AFA # <cjk>
+3-5547 U+5AFB # <cjk>
+3-5548 U+5B0C # <cjk>
+3-5549 U+5B0B # <cjk>
+3-554A U+5B16 # <cjk>
+3-554B U+5B32 # <cjk>
+3-554C U+5AD0 # <cjk>
+3-554D U+5B2A # <cjk>
+3-554E U+5B36 # <cjk>
+3-554F U+5B3E # <cjk>
+3-5550 U+5B43 # <cjk>
+3-5551 U+5B45 # <cjk>
+3-5552 U+5B40 # <cjk>
+3-5553 U+5B51 # <cjk>
+3-5554 U+5B55 # <cjk>
+3-5555 U+5B5A # <cjk>
+3-5556 U+5B5B # <cjk>
+3-5557 U+5B65 # <cjk>
+3-5558 U+5B69 # <cjk>
+3-5559 U+5B70 # <cjk>
+3-555A U+5B73 # <cjk>
+3-555B U+5B75 # <cjk>
+3-555C U+5B78 # <cjk>
+3-555D U+6588 # <cjk>
+3-555E U+5B7A # <cjk>
+3-555F U+5B80 # <cjk>
+3-5560 U+5B83 # <cjk>
+3-5561 U+5BA6 # <cjk>
+3-5562 U+5BB8 # <cjk>
+3-5563 U+5BC3 # <cjk>
+3-5564 U+5BC7 # <cjk>
+3-5565 U+5BC9 # <cjk>
+3-5566 U+5BD4 # <cjk>
+3-5567 U+5BD0 # <cjk>
+3-5568 U+5BE4 # <cjk>
+3-5569 U+5BE6 # <cjk>
+3-556A U+5BE2 # <cjk>
+3-556B U+5BDE # <cjk>
+3-556C U+5BE5 # <cjk>
+3-556D U+5BEB # <cjk>
+3-556E U+5BF0 # <cjk>
+3-556F U+5BF6 # <cjk>
+3-5570 U+5BF3 # <cjk>
+3-5571 U+5C05 # <cjk>
+3-5572 U+5C07 # <cjk>
+3-5573 U+5C08 # <cjk>
+3-5574 U+5C0D # <cjk>
+3-5575 U+5C13 # <cjk>
+3-5576 U+5C20 # <cjk>
+3-5577 U+5C22 # <cjk>
+3-5578 U+5C28 # <cjk>
+3-5579 U+5C38 # <cjk>
+3-557A U+5C39 # <cjk>
+3-557B U+5C41 # <cjk>
+3-557C U+5C46 # <cjk>
+3-557D U+5C4E # <cjk>
+3-557E U+5C53 # <cjk>
+3-5621 U+5C50 # <cjk>
+3-5622 U+5C4F # <cjk>
+3-5623 U+5B71 # <cjk>
+3-5624 U+5C6C # <cjk>
+3-5625 U+5C6E # <cjk>
+3-5626 U+4E62 # <cjk>
+3-5627 U+5C76 # <cjk>
+3-5628 U+5C79 # <cjk>
+3-5629 U+5C8C # <cjk>
+3-562A U+5C91 # <cjk>
+3-562B U+5C94 # <cjk>
+3-562C U+599B # <cjk>
+3-562D U+5CAB # <cjk>
+3-562E U+5CBB # <cjk>
+3-562F U+5CB6 # <cjk>
+3-5630 U+5CBC # <cjk>
+3-5631 U+5CB7 # <cjk>
+3-5632 U+5CC5 # <cjk>
+3-5633 U+5CBE # <cjk>
+3-5634 U+5CC7 # <cjk>
+3-5635 U+5CD9 # <cjk>
+3-5636 U+5CE9 # <cjk>
+3-5637 U+5CFD # <cjk>
+3-5638 U+5CFA # <cjk>
+3-5639 U+5CED # <cjk>
+3-563A U+5D8C # <cjk>
+3-563B U+5CEA # <cjk>
+3-563C U+5D0B # <cjk>
+3-563D U+5D15 # <cjk>
+3-563E U+5D17 # <cjk>
+3-563F U+5D5C # <cjk>
+3-5640 U+5D1F # <cjk>
+3-5641 U+5D1B # <cjk>
+3-5642 U+5D11 # <cjk>
+3-5643 U+5D14 # <cjk>
+3-5644 U+5D22 # <cjk>
+3-5645 U+5D1A # <cjk>
+3-5646 U+5D19 # <cjk>
+3-5647 U+5D18 # <cjk>
+3-5648 U+5D4C # <cjk>
+3-5649 U+5D52 # <cjk>
+3-564A U+5D4E # <cjk>
+3-564B U+5D4B # <cjk>
+3-564C U+5D6C # <cjk>
+3-564D U+5D73 # <cjk>
+3-564E U+5D76 # <cjk>
+3-564F U+5D87 # <cjk>
+3-5650 U+5D84 # <cjk>
+3-5651 U+5D82 # <cjk>
+3-5652 U+5DA2 # <cjk>
+3-5653 U+5D9D # <cjk>
+3-5654 U+5DAC # <cjk>
+3-5655 U+5DAE # <cjk>
+3-5656 U+5DBD # <cjk>
+3-5657 U+5D90 # <cjk>
+3-5658 U+5DB7 # <cjk>
+3-5659 U+5DBC # <cjk>
+3-565A U+5DC9 # <cjk>
+3-565B U+5DCD # <cjk>
+3-565C U+5DD3 # <cjk>
+3-565D U+5DD2 # <cjk>
+3-565E U+5DD6 # <cjk>
+3-565F U+5DDB # <cjk>
+3-5660 U+5DEB # <cjk>
+3-5661 U+5DF2 # <cjk>
+3-5662 U+5DF5 # <cjk>
+3-5663 U+5E0B # <cjk>
+3-5664 U+5E1A # <cjk>
+3-5665 U+5E19 # <cjk>
+3-5666 U+5E11 # <cjk>
+3-5667 U+5E1B # <cjk>
+3-5668 U+5E36 # <cjk>
+3-5669 U+5E37 # <cjk>
+3-566A U+5E44 # <cjk>
+3-566B U+5E43 # <cjk>
+3-566C U+5E40 # <cjk>
+3-566D U+5E4E # <cjk>
+3-566E U+5E57 # <cjk>
+3-566F U+5E54 # <cjk>
+3-5670 U+5E5F # <cjk>
+3-5671 U+5E62 # <cjk>
+3-5672 U+5E64 # <cjk>
+3-5673 U+5E47 # <cjk>
+3-5674 U+5E75 # <cjk>
+3-5675 U+5E76 # <cjk>
+3-5676 U+5E7A # <cjk>
+3-5677 U+9EBC # <cjk>
+3-5678 U+5E7F # <cjk>
+3-5679 U+5EA0 # <cjk>
+3-567A U+5EC1 # <cjk>
+3-567B U+5EC2 # <cjk>
+3-567C U+5EC8 # <cjk>
+3-567D U+5ED0 # <cjk>
+3-567E U+5ECF # <cjk>
+3-5721 U+5ED6 # <cjk>
+3-5722 U+5EE3 # <cjk>
+3-5723 U+5EDD # <cjk>
+3-5724 U+5EDA # <cjk>
+3-5725 U+5EDB # <cjk>
+3-5726 U+5EE2 # <cjk>
+3-5727 U+5EE1 # <cjk>
+3-5728 U+5EE8 # <cjk>
+3-5729 U+5EE9 # <cjk>
+3-572A U+5EEC # <cjk>
+3-572B U+5EF1 # <cjk>
+3-572C U+5EF3 # <cjk>
+3-572D U+5EF0 # <cjk>
+3-572E U+5EF4 # <cjk>
+3-572F U+5EF8 # <cjk>
+3-5730 U+5EFE # <cjk>
+3-5731 U+5F03 # <cjk>
+3-5732 U+5F09 # <cjk>
+3-5733 U+5F5D # <cjk>
+3-5734 U+5F5C # <cjk>
+3-5735 U+5F0B # <cjk>
+3-5736 U+5F11 # <cjk>
+3-5737 U+5F16 # <cjk>
+3-5738 U+5F29 # <cjk>
+3-5739 U+5F2D # <cjk>
+3-573A U+5F38 # <cjk>
+3-573B U+5F41 # <cjk>
+3-573C U+5F48 # <cjk>
+3-573D U+5F4C # <cjk>
+3-573E U+5F4E # <cjk>
+3-573F U+5F2F # <cjk>
+3-5740 U+5F51 # <cjk>
+3-5741 U+5F56 # <cjk>
+3-5742 U+5F57 # <cjk>
+3-5743 U+5F59 # <cjk>
+3-5744 U+5F61 # <cjk>
+3-5745 U+5F6D # <cjk>
+3-5746 U+5F73 # <cjk>
+3-5747 U+5F77 # <cjk>
+3-5748 U+5F83 # <cjk>
+3-5749 U+5F82 # <cjk>
+3-574A U+5F7F # <cjk>
+3-574B U+5F8A # <cjk>
+3-574C U+5F88 # <cjk>
+3-574D U+5F91 # <cjk>
+3-574E U+5F87 # <cjk>
+3-574F U+5F9E # <cjk>
+3-5750 U+5F99 # <cjk>
+3-5751 U+5F98 # <cjk>
+3-5752 U+5FA0 # <cjk>
+3-5753 U+5FA8 # <cjk>
+3-5754 U+5FAD # <cjk>
+3-5755 U+5FBC # <cjk>
+3-5756 U+5FD6 # <cjk>
+3-5757 U+5FFB # <cjk>
+3-5758 U+5FE4 # <cjk>
+3-5759 U+5FF8 # <cjk>
+3-575A U+5FF1 # <cjk>
+3-575B U+5FDD # <cjk>
+3-575C U+60B3 # <cjk>
+3-575D U+5FFF # <cjk>
+3-575E U+6021 # <cjk>
+3-575F U+6060 # <cjk>
+3-5760 U+6019 # <cjk>
+3-5761 U+6010 # <cjk>
+3-5762 U+6029 # <cjk>
+3-5763 U+600E # <cjk>
+3-5764 U+6031 # <cjk>
+3-5765 U+601B # <cjk>
+3-5766 U+6015 # <cjk>
+3-5767 U+602B # <cjk>
+3-5768 U+6026 # <cjk>
+3-5769 U+600F # <cjk>
+3-576A U+603A # <cjk>
+3-576B U+605A # <cjk>
+3-576C U+6041 # <cjk>
+3-576D U+606A # <cjk>
+3-576E U+6077 # <cjk>
+3-576F U+605F # <cjk>
+3-5770 U+604A # <cjk>
+3-5771 U+6046 # <cjk>
+3-5772 U+604D # <cjk>
+3-5773 U+6063 # <cjk>
+3-5774 U+6043 # <cjk>
+3-5775 U+6064 # <cjk>
+3-5776 U+6042 # <cjk>
+3-5777 U+606C # <cjk>
+3-5778 U+606B # <cjk>
+3-5779 U+6059 # <cjk>
+3-577A U+6081 # <cjk>
+3-577B U+608D # <cjk>
+3-577C U+60E7 # <cjk>
+3-577D U+6083 # <cjk>
+3-577E U+609A # <cjk>
+3-5821 U+6084 # <cjk>
+3-5822 U+609B # <cjk>
+3-5823 U+6096 # <cjk>
+3-5824 U+6097 # <cjk>
+3-5825 U+6092 # <cjk>
+3-5826 U+60A7 # <cjk>
+3-5827 U+608B # <cjk>
+3-5828 U+60E1 # <cjk>
+3-5829 U+60B8 # <cjk>
+3-582A U+60E0 # <cjk>
+3-582B U+60D3 # <cjk>
+3-582C U+60B4 # <cjk>
+3-582D U+5FF0 # <cjk>
+3-582E U+60BD # <cjk>
+3-582F U+60C6 # <cjk>
+3-5830 U+60B5 # <cjk>
+3-5831 U+60D8 # <cjk>
+3-5832 U+614D # <cjk>
+3-5833 U+6115 # <cjk>
+3-5834 U+6106 # <cjk>
+3-5835 U+60F6 # <cjk>
+3-5836 U+60F7 # <cjk>
+3-5837 U+6100 # <cjk>
+3-5838 U+60F4 # <cjk>
+3-5839 U+60FA # <cjk>
+3-583A U+6103 # <cjk>
+3-583B U+6121 # <cjk>
+3-583C U+60FB # <cjk>
+3-583D U+60F1 # <cjk>
+3-583E U+610D # <cjk>
+3-583F U+610E # <cjk>
+3-5840 U+6147 # <cjk>
+3-5841 U+613E # <cjk>
+3-5842 U+6128 # <cjk>
+3-5843 U+6127 # <cjk>
+3-5844 U+614A # <cjk>
+3-5845 U+613F # <cjk>
+3-5846 U+613C # <cjk>
+3-5847 U+612C # <cjk>
+3-5848 U+6134 # <cjk>
+3-5849 U+613D # <cjk>
+3-584A U+6142 # <cjk>
+3-584B U+6144 # <cjk>
+3-584C U+6173 # <cjk>
+3-584D U+6177 # <cjk>
+3-584E U+6158 # <cjk>
+3-584F U+6159 # <cjk>
+3-5850 U+615A # <cjk>
+3-5851 U+616B # <cjk>
+3-5852 U+6174 # <cjk>
+3-5853 U+616F # <cjk>
+3-5854 U+6165 # <cjk>
+3-5855 U+6171 # <cjk>
+3-5856 U+615F # <cjk>
+3-5857 U+615D # <cjk>
+3-5858 U+6153 # <cjk>
+3-5859 U+6175 # <cjk>
+3-585A U+6199 # <cjk>
+3-585B U+6196 # <cjk>
+3-585C U+6187 # <cjk>
+3-585D U+61AC # <cjk>
+3-585E U+6194 # <cjk>
+3-585F U+619A # <cjk>
+3-5860 U+618A # <cjk>
+3-5861 U+6191 # <cjk>
+3-5862 U+61AB # <cjk>
+3-5863 U+61AE # <cjk>
+3-5864 U+61CC # <cjk>
+3-5865 U+61CA # <cjk>
+3-5866 U+61C9 # <cjk>
+3-5867 U+61F7 # <cjk>
+3-5868 U+61C8 # <cjk>
+3-5869 U+61C3 # <cjk>
+3-586A U+61C6 # <cjk>
+3-586B U+61BA # <cjk>
+3-586C U+61CB # <cjk>
+3-586D U+7F79 # <cjk>
+3-586E U+61CD # <cjk>
+3-586F U+61E6 # <cjk>
+3-5870 U+61E3 # <cjk>
+3-5871 U+61F6 # <cjk>
+3-5872 U+61FA # <cjk>
+3-5873 U+61F4 # <cjk>
+3-5874 U+61FF # <cjk>
+3-5875 U+61FD # <cjk>
+3-5876 U+61FC # <cjk>
+3-5877 U+61FE # <cjk>
+3-5878 U+6200 # <cjk>
+3-5879 U+6208 # <cjk>
+3-587A U+6209 # <cjk>
+3-587B U+620D # <cjk>
+3-587C U+620C # <cjk>
+3-587D U+6214 # <cjk>
+3-587E U+621B # <cjk>
+3-5921 U+621E # <cjk>
+3-5922 U+6221 # <cjk>
+3-5923 U+622A # <cjk>
+3-5924 U+622E # <cjk>
+3-5925 U+6230 # <cjk>
+3-5926 U+6232 # <cjk>
+3-5927 U+6233 # <cjk>
+3-5928 U+6241 # <cjk>
+3-5929 U+624E # <cjk>
+3-592A U+625E # <cjk>
+3-592B U+6263 # <cjk>
+3-592C U+625B # <cjk>
+3-592D U+6260 # <cjk>
+3-592E U+6268 # <cjk>
+3-592F U+627C # <cjk>
+3-5930 U+6282 # <cjk>
+3-5931 U+6289 # <cjk>
+3-5932 U+627E # <cjk>
+3-5933 U+6292 # <cjk>
+3-5934 U+6293 # <cjk>
+3-5935 U+6296 # <cjk>
+3-5936 U+62D4 # <cjk>
+3-5937 U+6283 # <cjk>
+3-5938 U+6294 # <cjk>
+3-5939 U+62D7 # <cjk>
+3-593A U+62D1 # <cjk>
+3-593B U+62BB # <cjk>
+3-593C U+62CF # <cjk>
+3-593D U+62FF # <cjk>
+3-593E U+62C6 # <cjk>
+3-593F U+64D4 # <cjk>
+3-5940 U+62C8 # <cjk>
+3-5941 U+62DC # <cjk>
+3-5942 U+62CC # <cjk>
+3-5943 U+62CA # <cjk>
+3-5944 U+62C2 # <cjk>
+3-5945 U+62C7 # <cjk>
+3-5946 U+629B # <cjk>
+3-5947 U+62C9 # <cjk>
+3-5948 U+630C # <cjk>
+3-5949 U+62EE # <cjk>
+3-594A U+62F1 # <cjk>
+3-594B U+6327 # <cjk>
+3-594C U+6302 # <cjk>
+3-594D U+6308 # <cjk>
+3-594E U+62EF # <cjk>
+3-594F U+62F5 # <cjk>
+3-5950 U+6350 # <cjk>
+3-5951 U+633E # <cjk>
+3-5952 U+634D # <cjk>
+3-5953 U+641C # <cjk>
+3-5954 U+634F # <cjk>
+3-5955 U+6396 # <cjk>
+3-5956 U+638E # <cjk>
+3-5957 U+6380 # <cjk>
+3-5958 U+63AB # <cjk>
+3-5959 U+6376 # <cjk>
+3-595A U+63A3 # <cjk>
+3-595B U+638F # <cjk>
+3-595C U+6389 # <cjk>
+3-595D U+639F # <cjk>
+3-595E U+63B5 # <cjk>
+3-595F U+636B # <cjk>
+3-5960 U+6369 # <cjk>
+3-5961 U+63BE # <cjk>
+3-5962 U+63E9 # <cjk>
+3-5963 U+63C0 # <cjk>
+3-5964 U+63C6 # <cjk>
+3-5965 U+63E3 # <cjk>
+3-5966 U+63C9 # <cjk>
+3-5967 U+63D2 # <cjk>
+3-5968 U+63F6 # <cjk>
+3-5969 U+63C4 # <cjk>
+3-596A U+6416 # <cjk>
+3-596B U+6434 # <cjk>
+3-596C U+6406 # <cjk>
+3-596D U+6413 # <cjk>
+3-596E U+6426 # <cjk>
+3-596F U+6436 # <cjk>
+3-5970 U+651D # <cjk>
+3-5971 U+6417 # <cjk>
+3-5972 U+6428 # <cjk>
+3-5973 U+640F # <cjk>
+3-5974 U+6467 # <cjk>
+3-5975 U+646F # <cjk>
+3-5976 U+6476 # <cjk>
+3-5977 U+644E # <cjk>
+3-5978 U+652A # <cjk>
+3-5979 U+6495 # <cjk>
+3-597A U+6493 # <cjk>
+3-597B U+64A5 # <cjk>
+3-597C U+64A9 # <cjk>
+3-597D U+6488 # <cjk>
+3-597E U+64BC # <cjk>
+3-5A21 U+64DA # <cjk>
+3-5A22 U+64D2 # <cjk>
+3-5A23 U+64C5 # <cjk>
+3-5A24 U+64C7 # <cjk>
+3-5A25 U+64BB # <cjk>
+3-5A26 U+64D8 # <cjk>
+3-5A27 U+64C2 # <cjk>
+3-5A28 U+64F1 # <cjk>
+3-5A29 U+64E7 # <cjk>
+3-5A2A U+8209 # <cjk>
+3-5A2B U+64E0 # <cjk>
+3-5A2C U+64E1 # <cjk>
+3-5A2D U+62AC # <cjk>
+3-5A2E U+64E3 # <cjk>
+3-5A2F U+64EF # <cjk>
+3-5A30 U+652C # <cjk>
+3-5A31 U+64F6 # <cjk>
+3-5A32 U+64F4 # <cjk>
+3-5A33 U+64F2 # <cjk>
+3-5A34 U+64FA # <cjk>
+3-5A35 U+6500 # <cjk>
+3-5A36 U+64FD # <cjk>
+3-5A37 U+6518 # <cjk>
+3-5A38 U+651C # <cjk>
+3-5A39 U+6505 # <cjk>
+3-5A3A U+6524 # <cjk>
+3-5A3B U+6523 # <cjk>
+3-5A3C U+652B # <cjk>
+3-5A3D U+6534 # <cjk>
+3-5A3E U+6535 # <cjk>
+3-5A3F U+6537 # <cjk>
+3-5A40 U+6536 # <cjk>
+3-5A41 U+6538 # <cjk>
+3-5A42 U+754B # <cjk>
+3-5A43 U+6548 # <cjk>
+3-5A44 U+6556 # <cjk>
+3-5A45 U+6555 # <cjk>
+3-5A46 U+654D # <cjk>
+3-5A47 U+6558 # <cjk>
+3-5A48 U+655E # <cjk>
+3-5A49 U+655D # <cjk>
+3-5A4A U+6572 # <cjk>
+3-5A4B U+6578 # <cjk>
+3-5A4C U+6582 # <cjk>
+3-5A4D U+6583 # <cjk>
+3-5A4E U+8B8A # <cjk>
+3-5A4F U+659B # <cjk>
+3-5A50 U+659F # <cjk>
+3-5A51 U+65AB # <cjk>
+3-5A52 U+65B7 # <cjk>
+3-5A53 U+65C3 # <cjk>
+3-5A54 U+65C6 # <cjk>
+3-5A55 U+65C1 # <cjk>
+3-5A56 U+65C4 # <cjk>
+3-5A57 U+65CC # <cjk>
+3-5A58 U+65D2 # <cjk>
+3-5A59 U+65DB # <cjk>
+3-5A5A U+65D9 # <cjk>
+3-5A5B U+65E0 # <cjk>
+3-5A5C U+65E1 # <cjk>
+3-5A5D U+65F1 # <cjk>
+3-5A5E U+6772 # <cjk>
+3-5A5F U+660A # <cjk>
+3-5A60 U+6603 # <cjk>
+3-5A61 U+65FB # <cjk>
+3-5A62 U+6773 # <cjk>
+3-5A63 U+6635 # <cjk>
+3-5A64 U+6636 # <cjk>
+3-5A65 U+6634 # <cjk>
+3-5A66 U+661C # <cjk>
+3-5A67 U+664F # <cjk>
+3-5A68 U+6644 # <cjk>
+3-5A69 U+6649 # <cjk>
+3-5A6A U+6641 # <cjk>
+3-5A6B U+665E # <cjk>
+3-5A6C U+665D # <cjk>
+3-5A6D U+6664 # <cjk>
+3-5A6E U+6667 # <cjk>
+3-5A6F U+6668 # <cjk>
+3-5A70 U+665F # <cjk>
+3-5A71 U+6662 # <cjk>
+3-5A72 U+6670 # <cjk>
+3-5A73 U+6683 # <cjk>
+3-5A74 U+6688 # <cjk>
+3-5A75 U+668E # <cjk>
+3-5A76 U+6689 # <cjk>
+3-5A77 U+6684 # <cjk>
+3-5A78 U+6698 # <cjk>
+3-5A79 U+669D # <cjk>
+3-5A7A U+66C1 # <cjk>
+3-5A7B U+66B9 # <cjk>
+3-5A7C U+66C9 # <cjk>
+3-5A7D U+66BE # <cjk>
+3-5A7E U+66BC # <cjk>
+3-5B21 U+66C4 # <cjk>
+3-5B22 U+66B8 # <cjk>
+3-5B23 U+66D6 # <cjk>
+3-5B24 U+66DA # <cjk>
+3-5B25 U+66E0 # <cjk>
+3-5B26 U+663F # <cjk>
+3-5B27 U+66E6 # <cjk>
+3-5B28 U+66E9 # <cjk>
+3-5B29 U+66F0 # <cjk>
+3-5B2A U+66F5 # <cjk>
+3-5B2B U+66F7 # <cjk>
+3-5B2C U+670F # <cjk>
+3-5B2D U+6716 # <cjk>
+3-5B2E U+671E # <cjk>
+3-5B2F U+6726 # <cjk>
+3-5B30 U+6727 # <cjk>
+3-5B31 U+9738 # <cjk>
+3-5B32 U+672E # <cjk>
+3-5B33 U+673F # <cjk>
+3-5B34 U+6736 # <cjk>
+3-5B35 U+6741 # <cjk>
+3-5B36 U+6738 # <cjk>
+3-5B37 U+6737 # <cjk>
+3-5B38 U+6746 # <cjk>
+3-5B39 U+675E # <cjk>
+3-5B3A U+6760 # <cjk>
+3-5B3B U+6759 # <cjk>
+3-5B3C U+6763 # <cjk>
+3-5B3D U+6764 # <cjk>
+3-5B3E U+6789 # <cjk>
+3-5B3F U+6770 # <cjk>
+3-5B40 U+67A9 # <cjk>
+3-5B41 U+677C # <cjk>
+3-5B42 U+676A # <cjk>
+3-5B43 U+678C # <cjk>
+3-5B44 U+678B # <cjk>
+3-5B45 U+67A6 # <cjk>
+3-5B46 U+67A1 # <cjk>
+3-5B47 U+6785 # <cjk>
+3-5B48 U+67B7 # <cjk>
+3-5B49 U+67EF # <cjk>
+3-5B4A U+67B4 # <cjk>
+3-5B4B U+67EC # <cjk>
+3-5B4C U+67B3 # <cjk>
+3-5B4D U+67E9 # <cjk>
+3-5B4E U+67B8 # <cjk>
+3-5B4F U+67E4 # <cjk>
+3-5B50 U+67DE # <cjk>
+3-5B51 U+67DD # <cjk>
+3-5B52 U+67E2 # <cjk>
+3-5B53 U+67EE # <cjk>
+3-5B54 U+67B9 # <cjk>
+3-5B55 U+67CE # <cjk>
+3-5B56 U+67C6 # <cjk>
+3-5B57 U+67E7 # <cjk>
+3-5B58 U+6A9C # <cjk>
+3-5B59 U+681E # <cjk>
+3-5B5A U+6846 # <cjk>
+3-5B5B U+6829 # <cjk>
+3-5B5C U+6840 # <cjk>
+3-5B5D U+684D # <cjk>
+3-5B5E U+6832 # <cjk>
+3-5B5F U+684E # <cjk>
+3-5B60 U+68B3 # <cjk>
+3-5B61 U+682B # <cjk>
+3-5B62 U+6859 # <cjk>
+3-5B63 U+6863 # <cjk>
+3-5B64 U+6877 # <cjk>
+3-5B65 U+687F # <cjk>
+3-5B66 U+689F # <cjk>
+3-5B67 U+688F # <cjk>
+3-5B68 U+68AD # <cjk>
+3-5B69 U+6894 # <cjk>
+3-5B6A U+689D # <cjk>
+3-5B6B U+689B # <cjk>
+3-5B6C U+6883 # <cjk>
+3-5B6D U+6AAE # <cjk>
+3-5B6E U+68B9 # <cjk>
+3-5B6F U+6874 # <cjk>
+3-5B70 U+68B5 # <cjk>
+3-5B71 U+68A0 # <cjk>
+3-5B72 U+68BA # <cjk>
+3-5B73 U+690F # <cjk>
+3-5B74 U+688D # <cjk>
+3-5B75 U+687E # <cjk>
+3-5B76 U+6901 # <cjk>
+3-5B77 U+68CA # <cjk>
+3-5B78 U+6908 # <cjk>
+3-5B79 U+68D8 # <cjk>
+3-5B7A U+6922 # <cjk>
+3-5B7B U+6926 # <cjk>
+3-5B7C U+68E1 # <cjk>
+3-5B7D U+690C # <cjk>
+3-5B7E U+68CD # <cjk>
+3-5C21 U+68D4 # <cjk>
+3-5C22 U+68E7 # <cjk>
+3-5C23 U+68D5 # <cjk>
+3-5C24 U+6936 # <cjk>
+3-5C25 U+6912 # <cjk>
+3-5C26 U+6904 # <cjk>
+3-5C27 U+68D7 # <cjk>
+3-5C28 U+68E3 # <cjk>
+3-5C29 U+6925 # <cjk>
+3-5C2A U+68F9 # <cjk>
+3-5C2B U+68E0 # <cjk>
+3-5C2C U+68EF # <cjk>
+3-5C2D U+6928 # <cjk>
+3-5C2E U+692A # <cjk>
+3-5C2F U+691A # <cjk>
+3-5C30 U+6923 # <cjk>
+3-5C31 U+6921 # <cjk>
+3-5C32 U+68C6 # <cjk>
+3-5C33 U+6979 # <cjk>
+3-5C34 U+6977 # <cjk>
+3-5C35 U+695C # <cjk>
+3-5C36 U+6978 # <cjk>
+3-5C37 U+696B # <cjk>
+3-5C38 U+6954 # <cjk>
+3-5C39 U+697E # <cjk>
+3-5C3A U+696E # <cjk>
+3-5C3B U+6939 # <cjk>
+3-5C3C U+6974 # <cjk>
+3-5C3D U+693D # <cjk>
+3-5C3E U+6959 # <cjk>
+3-5C3F U+6930 # <cjk>
+3-5C40 U+6961 # <cjk>
+3-5C41 U+695E # <cjk>
+3-5C42 U+695D # <cjk>
+3-5C43 U+6981 # <cjk>
+3-5C44 U+696A # <cjk>
+3-5C45 U+69B2 # <cjk>
+3-5C46 U+69AE # <cjk>
+3-5C47 U+69D0 # <cjk>
+3-5C48 U+69BF # <cjk>
+3-5C49 U+69C1 # <cjk>
+3-5C4A U+69D3 # <cjk>
+3-5C4B U+69BE # <cjk>
+3-5C4C U+69CE # <cjk>
+3-5C4D U+5BE8 # <cjk>
+3-5C4E U+69CA # <cjk>
+3-5C4F U+69DD # <cjk>
+3-5C50 U+69BB # <cjk>
+3-5C51 U+69C3 # <cjk>
+3-5C52 U+69A7 # <cjk>
+3-5C53 U+6A2E # <cjk>
+3-5C54 U+6991 # <cjk>
+3-5C55 U+69A0 # <cjk>
+3-5C56 U+699C # <cjk>
+3-5C57 U+6995 # <cjk>
+3-5C58 U+69B4 # <cjk>
+3-5C59 U+69DE # <cjk>
+3-5C5A U+69E8 # <cjk>
+3-5C5B U+6A02 # <cjk>
+3-5C5C U+6A1B # <cjk>
+3-5C5D U+69FF # <cjk>
+3-5C5E U+6B0A # <cjk>
+3-5C5F U+69F9 # <cjk>
+3-5C60 U+69F2 # <cjk>
+3-5C61 U+69E7 # <cjk>
+3-5C62 U+6A05 # <cjk>
+3-5C63 U+69B1 # <cjk>
+3-5C64 U+6A1E # <cjk>
+3-5C65 U+69ED # <cjk>
+3-5C66 U+6A14 # <cjk>
+3-5C67 U+69EB # <cjk>
+3-5C68 U+6A0A # <cjk>
+3-5C69 U+6A12 # <cjk>
+3-5C6A U+6AC1 # <cjk>
+3-5C6B U+6A23 # <cjk>
+3-5C6C U+6A13 # <cjk>
+3-5C6D U+6A44 # <cjk>
+3-5C6E U+6A0C # <cjk>
+3-5C6F U+6A72 # <cjk>
+3-5C70 U+6A36 # <cjk>
+3-5C71 U+6A78 # <cjk>
+3-5C72 U+6A47 # <cjk>
+3-5C73 U+6A62 # <cjk>
+3-5C74 U+6A59 # <cjk>
+3-5C75 U+6A66 # <cjk>
+3-5C76 U+6A48 # <cjk>
+3-5C77 U+6A38 # <cjk>
+3-5C78 U+6A22 # <cjk>
+3-5C79 U+6A90 # <cjk>
+3-5C7A U+6A8D # <cjk>
+3-5C7B U+6AA0 # <cjk>
+3-5C7C U+6A84 # <cjk>
+3-5C7D U+6AA2 # <cjk>
+3-5C7E U+6AA3 # <cjk>
+3-5D21 U+6A97 # <cjk>
+3-5D22 U+8617 # <cjk>
+3-5D23 U+6ABB # <cjk>
+3-5D24 U+6AC3 # <cjk>
+3-5D25 U+6AC2 # <cjk>
+3-5D26 U+6AB8 # <cjk>
+3-5D27 U+6AB3 # <cjk>
+3-5D28 U+6AAC # <cjk>
+3-5D29 U+6ADE # <cjk>
+3-5D2A U+6AD1 # <cjk>
+3-5D2B U+6ADF # <cjk>
+3-5D2C U+6AAA # <cjk>
+3-5D2D U+6ADA # <cjk>
+3-5D2E U+6AEA # <cjk>
+3-5D2F U+6AFB # <cjk>
+3-5D30 U+6B05 # <cjk>
+3-5D31 U+8616 # <cjk>
+3-5D32 U+6AFA # <cjk>
+3-5D33 U+6B12 # <cjk>
+3-5D34 U+6B16 # <cjk>
+3-5D35 U+9B31 # <cjk>
+3-5D36 U+6B1F # <cjk>
+3-5D37 U+6B38 # <cjk>
+3-5D38 U+6B37 # <cjk>
+3-5D39 U+76DC # <cjk>
+3-5D3A U+6B39 # <cjk>
+3-5D3B U+98EE # <cjk>
+3-5D3C U+6B47 # <cjk>
+3-5D3D U+6B43 # <cjk>
+3-5D3E U+6B49 # <cjk>
+3-5D3F U+6B50 # <cjk>
+3-5D40 U+6B59 # <cjk>
+3-5D41 U+6B54 # <cjk>
+3-5D42 U+6B5B # <cjk>
+3-5D43 U+6B5F # <cjk>
+3-5D44 U+6B61 # <cjk>
+3-5D45 U+6B78 # <cjk>
+3-5D46 U+6B79 # <cjk>
+3-5D47 U+6B7F # <cjk>
+3-5D48 U+6B80 # <cjk>
+3-5D49 U+6B84 # <cjk>
+3-5D4A U+6B83 # <cjk>
+3-5D4B U+6B8D # <cjk>
+3-5D4C U+6B98 # <cjk>
+3-5D4D U+6B95 # <cjk>
+3-5D4E U+6B9E # <cjk>
+3-5D4F U+6BA4 # <cjk>
+3-5D50 U+6BAA # <cjk>
+3-5D51 U+6BAB # <cjk>
+3-5D52 U+6BAF # <cjk>
+3-5D53 U+6BB2 # <cjk>
+3-5D54 U+6BB1 # <cjk>
+3-5D55 U+6BB3 # <cjk>
+3-5D56 U+6BB7 # <cjk>
+3-5D57 U+6BBC # <cjk>
+3-5D58 U+6BC6 # <cjk>
+3-5D59 U+6BCB # <cjk>
+3-5D5A U+6BD3 # <cjk>
+3-5D5B U+6BDF # <cjk>
+3-5D5C U+6BEC # <cjk>
+3-5D5D U+6BEB # <cjk>
+3-5D5E U+6BF3 # <cjk>
+3-5D5F U+6BEF # <cjk>
+3-5D60 U+9EBE # <cjk>
+3-5D61 U+6C08 # <cjk>
+3-5D62 U+6C13 # <cjk>
+3-5D63 U+6C14 # <cjk>
+3-5D64 U+6C1B # <cjk>
+3-5D65 U+6C24 # <cjk>
+3-5D66 U+6C23 # <cjk>
+3-5D67 U+6C5E # <cjk>
+3-5D68 U+6C55 # <cjk>
+3-5D69 U+6C62 # <cjk>
+3-5D6A U+6C6A # <cjk>
+3-5D6B U+6C82 # <cjk>
+3-5D6C U+6C8D # <cjk>
+3-5D6D U+6C9A # <cjk>
+3-5D6E U+6C81 # <cjk>
+3-5D6F U+6C9B # <cjk>
+3-5D70 U+6C7E # <cjk>
+3-5D71 U+6C68 # <cjk>
+3-5D72 U+6C73 # <cjk>
+3-5D73 U+6C92 # <cjk>
+3-5D74 U+6C90 # <cjk>
+3-5D75 U+6CC4 # <cjk>
+3-5D76 U+6CF1 # <cjk>
+3-5D77 U+6CD3 # <cjk>
+3-5D78 U+6CBD # <cjk>
+3-5D79 U+6CD7 # <cjk>
+3-5D7A U+6CC5 # <cjk>
+3-5D7B U+6CDD # <cjk>
+3-5D7C U+6CAE # <cjk>
+3-5D7D U+6CB1 # <cjk>
+3-5D7E U+6CBE # <cjk>
+3-5E21 U+6CBA # <cjk>
+3-5E22 U+6CDB # <cjk>
+3-5E23 U+6CEF # <cjk>
+3-5E24 U+6CD9 # <cjk>
+3-5E25 U+6CEA # <cjk>
+3-5E26 U+6D1F # <cjk>
+3-5E27 U+884D # <cjk>
+3-5E28 U+6D36 # <cjk>
+3-5E29 U+6D2B # <cjk>
+3-5E2A U+6D3D # <cjk>
+3-5E2B U+6D38 # <cjk>
+3-5E2C U+6D19 # <cjk>
+3-5E2D U+6D35 # <cjk>
+3-5E2E U+6D33 # <cjk>
+3-5E2F U+6D12 # <cjk>
+3-5E30 U+6D0C # <cjk>
+3-5E31 U+6D63 # <cjk>
+3-5E32 U+6D93 # <cjk>
+3-5E33 U+6D64 # <cjk>
+3-5E34 U+6D5A # <cjk>
+3-5E35 U+6D79 # <cjk>
+3-5E36 U+6D59 # <cjk>
+3-5E37 U+6D8E # <cjk>
+3-5E38 U+6D95 # <cjk>
+3-5E39 U+6FE4 # <cjk>
+3-5E3A U+6D85 # <cjk>
+3-5E3B U+6DF9 # <cjk>
+3-5E3C U+6E15 # <cjk>
+3-5E3D U+6E0A # <cjk>
+3-5E3E U+6DB5 # <cjk>
+3-5E3F U+6DC7 # <cjk>
+3-5E40 U+6DE6 # <cjk>
+3-5E41 U+6DB8 # <cjk>
+3-5E42 U+6DC6 # <cjk>
+3-5E43 U+6DEC # <cjk>
+3-5E44 U+6DDE # <cjk>
+3-5E45 U+6DCC # <cjk>
+3-5E46 U+6DE8 # <cjk>
+3-5E47 U+6DD2 # <cjk>
+3-5E48 U+6DC5 # <cjk>
+3-5E49 U+6DFA # <cjk>
+3-5E4A U+6DD9 # <cjk>
+3-5E4B U+6DE4 # <cjk>
+3-5E4C U+6DD5 # <cjk>
+3-5E4D U+6DEA # <cjk>
+3-5E4E U+6DEE # <cjk>
+3-5E4F U+6E2D # <cjk>
+3-5E50 U+6E6E # <cjk>
+3-5E51 U+6E2E # <cjk>
+3-5E52 U+6E19 # <cjk>
+3-5E53 U+6E72 # <cjk>
+3-5E54 U+6E5F # <cjk>
+3-5E55 U+6E3E # <cjk>
+3-5E56 U+6E23 # <cjk>
+3-5E57 U+6E6B # <cjk>
+3-5E58 U+6E2B # <cjk>
+3-5E59 U+6E76 # <cjk>
+3-5E5A U+6E4D # <cjk>
+3-5E5B U+6E1F # <cjk>
+3-5E5C U+6E43 # <cjk>
+3-5E5D U+6E3A # <cjk>
+3-5E5E U+6E4E # <cjk>
+3-5E5F U+6E24 # <cjk>
+3-5E60 U+6EFF # <cjk>
+3-5E61 U+6E1D # <cjk>
+3-5E62 U+6E38 # <cjk>
+3-5E63 U+6E82 # <cjk>
+3-5E64 U+6EAA # <cjk>
+3-5E65 U+6E98 # <cjk>
+3-5E66 U+6EC9 # <cjk>
+3-5E67 U+6EB7 # <cjk>
+3-5E68 U+6ED3 # <cjk>
+3-5E69 U+6EBD # <cjk>
+3-5E6A U+6EAF # <cjk>
+3-5E6B U+6EC4 # <cjk>
+3-5E6C U+6EB2 # <cjk>
+3-5E6D U+6ED4 # <cjk>
+3-5E6E U+6ED5 # <cjk>
+3-5E6F U+6E8F # <cjk>
+3-5E70 U+6EA5 # <cjk>
+3-5E71 U+6EC2 # <cjk>
+3-5E72 U+6E9F # <cjk>
+3-5E73 U+6F41 # <cjk>
+3-5E74 U+6F11 # <cjk>
+3-5E75 U+704C # <cjk>
+3-5E76 U+6EEC # <cjk>
+3-5E77 U+6EF8 # <cjk>
+3-5E78 U+6EFE # <cjk>
+3-5E79 U+6F3F # <cjk>
+3-5E7A U+6EF2 # <cjk>
+3-5E7B U+6F31 # <cjk>
+3-5E7C U+6EEF # <cjk>
+3-5E7D U+6F32 # <cjk>
+3-5E7E U+6ECC # <cjk>
+3-5F21 U+6F3E # <cjk>
+3-5F22 U+6F13 # <cjk>
+3-5F23 U+6EF7 # <cjk>
+3-5F24 U+6F86 # <cjk>
+3-5F25 U+6F7A # <cjk>
+3-5F26 U+6F78 # <cjk>
+3-5F27 U+6F81 # <cjk>
+3-5F28 U+6F80 # <cjk>
+3-5F29 U+6F6F # <cjk>
+3-5F2A U+6F5B # <cjk>
+3-5F2B U+6FF3 # <cjk>
+3-5F2C U+6F6D # <cjk>
+3-5F2D U+6F82 # <cjk>
+3-5F2E U+6F7C # <cjk>
+3-5F2F U+6F58 # <cjk>
+3-5F30 U+6F8E # <cjk>
+3-5F31 U+6F91 # <cjk>
+3-5F32 U+6FC2 # <cjk>
+3-5F33 U+6F66 # <cjk>
+3-5F34 U+6FB3 # <cjk>
+3-5F35 U+6FA3 # <cjk>
+3-5F36 U+6FA1 # <cjk>
+3-5F37 U+6FA4 # <cjk>
+3-5F38 U+6FB9 # <cjk>
+3-5F39 U+6FC6 # <cjk>
+3-5F3A U+6FAA # <cjk>
+3-5F3B U+6FDF # <cjk>
+3-5F3C U+6FD5 # <cjk>
+3-5F3D U+6FEC # <cjk>
+3-5F3E U+6FD4 # <cjk>
+3-5F3F U+6FD8 # <cjk>
+3-5F40 U+6FF1 # <cjk>
+3-5F41 U+6FEE # <cjk>
+3-5F42 U+6FDB # <cjk>
+3-5F43 U+7009 # <cjk>
+3-5F44 U+700B # <cjk>
+3-5F45 U+6FFA # <cjk>
+3-5F46 U+7011 # <cjk>
+3-5F47 U+7001 # <cjk>
+3-5F48 U+700F # <cjk>
+3-5F49 U+6FFE # <cjk>
+3-5F4A U+701B # <cjk>
+3-5F4B U+701A # <cjk>
+3-5F4C U+6F74 # <cjk>
+3-5F4D U+701D # <cjk>
+3-5F4E U+7018 # <cjk>
+3-5F4F U+701F # <cjk>
+3-5F50 U+7030 # <cjk>
+3-5F51 U+703E # <cjk>
+3-5F52 U+7032 # <cjk>
+3-5F53 U+7051 # <cjk>
+3-5F54 U+7063 # <cjk>
+3-5F55 U+7099 # <cjk>
+3-5F56 U+7092 # <cjk>
+3-5F57 U+70AF # <cjk>
+3-5F58 U+70F1 # <cjk>
+3-5F59 U+70AC # <cjk>
+3-5F5A U+70B8 # <cjk>
+3-5F5B U+70B3 # <cjk>
+3-5F5C U+70AE # <cjk>
+3-5F5D U+70DF # <cjk>
+3-5F5E U+70CB # <cjk>
+3-5F5F U+70DD # <cjk>
+3-5F60 U+70D9 # <cjk>
+3-5F61 U+7109 # <cjk>
+3-5F62 U+70FD # <cjk>
+3-5F63 U+711C # <cjk>
+3-5F64 U+7119 # <cjk>
+3-5F65 U+7165 # <cjk>
+3-5F66 U+7155 # <cjk>
+3-5F67 U+7188 # <cjk>
+3-5F68 U+7166 # <cjk>
+3-5F69 U+7162 # <cjk>
+3-5F6A U+714C # <cjk>
+3-5F6B U+7156 # <cjk>
+3-5F6C U+716C # <cjk>
+3-5F6D U+718F # <cjk>
+3-5F6E U+71FB # <cjk>
+3-5F6F U+7184 # <cjk>
+3-5F70 U+7195 # <cjk>
+3-5F71 U+71A8 # <cjk>
+3-5F72 U+71AC # <cjk>
+3-5F73 U+71D7 # <cjk>
+3-5F74 U+71B9 # <cjk>
+3-5F75 U+71BE # <cjk>
+3-5F76 U+71D2 # <cjk>
+3-5F77 U+71C9 # <cjk>
+3-5F78 U+71D4 # <cjk>
+3-5F79 U+71CE # <cjk>
+3-5F7A U+71E0 # <cjk>
+3-5F7B U+71EC # <cjk>
+3-5F7C U+71E7 # <cjk>
+3-5F7D U+71F5 # <cjk>
+3-5F7E U+71FC # <cjk>
+3-6021 U+71F9 # <cjk>
+3-6022 U+71FF # <cjk>
+3-6023 U+720D # <cjk>
+3-6024 U+7210 # <cjk>
+3-6025 U+721B # <cjk>
+3-6026 U+7228 # <cjk>
+3-6027 U+722D # <cjk>
+3-6028 U+722C # <cjk>
+3-6029 U+7230 # <cjk>
+3-602A U+7232 # <cjk>
+3-602B U+723B # <cjk>
+3-602C U+723C # <cjk>
+3-602D U+723F # <cjk>
+3-602E U+7240 # <cjk>
+3-602F U+7246 # <cjk>
+3-6030 U+724B # <cjk>
+3-6031 U+7258 # <cjk>
+3-6032 U+7274 # <cjk>
+3-6033 U+727E # <cjk>
+3-6034 U+7282 # <cjk>
+3-6035 U+7281 # <cjk>
+3-6036 U+7287 # <cjk>
+3-6037 U+7292 # <cjk>
+3-6038 U+7296 # <cjk>
+3-6039 U+72A2 # <cjk>
+3-603A U+72A7 # <cjk>
+3-603B U+72B9 # <cjk>
+3-603C U+72B2 # <cjk>
+3-603D U+72C3 # <cjk>
+3-603E U+72C6 # <cjk>
+3-603F U+72C4 # <cjk>
+3-6040 U+72CE # <cjk>
+3-6041 U+72D2 # <cjk>
+3-6042 U+72E2 # <cjk>
+3-6043 U+72E0 # <cjk>
+3-6044 U+72E1 # <cjk>
+3-6045 U+72F9 # <cjk>
+3-6046 U+72F7 # <cjk>
+3-6047 U+500F # <cjk>
+3-6048 U+7317 # <cjk>
+3-6049 U+730A # <cjk>
+3-604A U+731C # <cjk>
+3-604B U+7316 # <cjk>
+3-604C U+731D # <cjk>
+3-604D U+7334 # <cjk>
+3-604E U+732F # <cjk>
+3-604F U+7329 # <cjk>
+3-6050 U+7325 # <cjk>
+3-6051 U+733E # <cjk>
+3-6052 U+734E # <cjk>
+3-6053 U+734F # <cjk>
+3-6054 U+9ED8 # <cjk>
+3-6055 U+7357 # <cjk>
+3-6056 U+736A # <cjk>
+3-6057 U+7368 # <cjk>
+3-6058 U+7370 # <cjk>
+3-6059 U+7378 # <cjk>
+3-605A U+7375 # <cjk>
+3-605B U+737B # <cjk>
+3-605C U+737A # <cjk>
+3-605D U+73C8 # <cjk>
+3-605E U+73B3 # <cjk>
+3-605F U+73CE # <cjk>
+3-6060 U+73BB # <cjk>
+3-6061 U+73C0 # <cjk>
+3-6062 U+73E5 # <cjk>
+3-6063 U+73EE # <cjk>
+3-6064 U+73DE # <cjk>
+3-6065 U+74A2 # <cjk>
+3-6066 U+7405 # <cjk>
+3-6067 U+746F # <cjk>
+3-6068 U+7425 # <cjk>
+3-6069 U+73F8 # <cjk>
+3-606A U+7432 # <cjk>
+3-606B U+743A # <cjk>
+3-606C U+7455 # <cjk>
+3-606D U+743F # <cjk>
+3-606E U+745F # <cjk>
+3-606F U+7459 # <cjk>
+3-6070 U+7441 # <cjk>
+3-6071 U+745C # <cjk>
+3-6072 U+7469 # <cjk>
+3-6073 U+7470 # <cjk>
+3-6074 U+7463 # <cjk>
+3-6075 U+746A # <cjk>
+3-6076 U+7476 # <cjk>
+3-6077 U+747E # <cjk>
+3-6078 U+748B # <cjk>
+3-6079 U+749E # <cjk>
+3-607A U+74A7 # <cjk>
+3-607B U+74CA # <cjk>
+3-607C U+74CF # <cjk>
+3-607D U+74D4 # <cjk>
+3-607E U+73F1 # <cjk>
+3-6121 U+74E0 # <cjk>
+3-6122 U+74E3 # <cjk>
+3-6123 U+74E7 # <cjk>
+3-6124 U+74E9 # <cjk>
+3-6125 U+74EE # <cjk>
+3-6126 U+74F2 # <cjk>
+3-6127 U+74F0 # <cjk>
+3-6128 U+74F1 # <cjk>
+3-6129 U+74F8 # <cjk>
+3-612A U+74F7 # <cjk>
+3-612B U+7504 # <cjk>
+3-612C U+7503 # <cjk>
+3-612D U+7505 # <cjk>
+3-612E U+750C # <cjk>
+3-612F U+750E # <cjk>
+3-6130 U+750D # <cjk>
+3-6131 U+7515 # <cjk>
+3-6132 U+7513 # <cjk>
+3-6133 U+751E # <cjk>
+3-6134 U+7526 # <cjk>
+3-6135 U+752C # <cjk>
+3-6136 U+753C # <cjk>
+3-6137 U+7544 # <cjk>
+3-6138 U+754D # <cjk>
+3-6139 U+754A # <cjk>
+3-613A U+7549 # <cjk>
+3-613B U+755B # <cjk>
+3-613C U+7546 # <cjk>
+3-613D U+755A # <cjk>
+3-613E U+7569 # <cjk>
+3-613F U+7564 # <cjk>
+3-6140 U+7567 # <cjk>
+3-6141 U+756B # <cjk>
+3-6142 U+756D # <cjk>
+3-6143 U+7578 # <cjk>
+3-6144 U+7576 # <cjk>
+3-6145 U+7586 # <cjk>
+3-6146 U+7587 # <cjk>
+3-6147 U+7574 # <cjk>
+3-6148 U+758A # <cjk>
+3-6149 U+7589 # <cjk>
+3-614A U+7582 # <cjk>
+3-614B U+7594 # <cjk>
+3-614C U+759A # <cjk>
+3-614D U+759D # <cjk>
+3-614E U+75A5 # <cjk>
+3-614F U+75A3 # <cjk>
+3-6150 U+75C2 # <cjk>
+3-6151 U+75B3 # <cjk>
+3-6152 U+75C3 # <cjk>
+3-6153 U+75B5 # <cjk>
+3-6154 U+75BD # <cjk>
+3-6155 U+75B8 # <cjk>
+3-6156 U+75BC # <cjk>
+3-6157 U+75B1 # <cjk>
+3-6158 U+75CD # <cjk>
+3-6159 U+75CA # <cjk>
+3-615A U+75D2 # <cjk>
+3-615B U+75D9 # <cjk>
+3-615C U+75E3 # <cjk>
+3-615D U+75DE # <cjk>
+3-615E U+75FE # <cjk>
+3-615F U+75FF # <cjk>
+3-6160 U+75FC # <cjk>
+3-6161 U+7601 # <cjk>
+3-6162 U+75F0 # <cjk>
+3-6163 U+75FA # <cjk>
+3-6164 U+75F2 # <cjk>
+3-6165 U+75F3 # <cjk>
+3-6166 U+760B # <cjk>
+3-6167 U+760D # <cjk>
+3-6168 U+7609 # <cjk>
+3-6169 U+761F # <cjk>
+3-616A U+7627 # <cjk>
+3-616B U+7620 # <cjk>
+3-616C U+7621 # <cjk>
+3-616D U+7622 # <cjk>
+3-616E U+7624 # <cjk>
+3-616F U+7634 # <cjk>
+3-6170 U+7630 # <cjk>
+3-6171 U+763B # <cjk>
+3-6172 U+7647 # <cjk>
+3-6173 U+7648 # <cjk>
+3-6174 U+7646 # <cjk>
+3-6175 U+765C # <cjk>
+3-6176 U+7658 # <cjk>
+3-6177 U+7661 # <cjk>
+3-6178 U+7662 # <cjk>
+3-6179 U+7668 # <cjk>
+3-617A U+7669 # <cjk>
+3-617B U+766A # <cjk>
+3-617C U+7667 # <cjk>
+3-617D U+766C # <cjk>
+3-617E U+7670 # <cjk>
+3-6221 U+7672 # <cjk>
+3-6222 U+7676 # <cjk>
+3-6223 U+7678 # <cjk>
+3-6224 U+767C # <cjk>
+3-6225 U+7680 # <cjk>
+3-6226 U+7683 # <cjk>
+3-6227 U+7688 # <cjk>
+3-6228 U+768B # <cjk>
+3-6229 U+768E # <cjk>
+3-622A U+7696 # <cjk>
+3-622B U+7693 # <cjk>
+3-622C U+7699 # <cjk>
+3-622D U+769A # <cjk>
+3-622E U+76B0 # <cjk>
+3-622F U+76B4 # <cjk>
+3-6230 U+76B8 # <cjk>
+3-6231 U+76B9 # <cjk>
+3-6232 U+76BA # <cjk>
+3-6233 U+76C2 # <cjk>
+3-6234 U+76CD # <cjk>
+3-6235 U+76D6 # <cjk>
+3-6236 U+76D2 # <cjk>
+3-6237 U+76DE # <cjk>
+3-6238 U+76E1 # <cjk>
+3-6239 U+76E5 # <cjk>
+3-623A U+76E7 # <cjk>
+3-623B U+76EA # <cjk>
+3-623C U+862F # <cjk>
+3-623D U+76FB # <cjk>
+3-623E U+7708 # <cjk>
+3-623F U+7707 # <cjk>
+3-6240 U+7704 # <cjk>
+3-6241 U+7729 # <cjk>
+3-6242 U+7724 # <cjk>
+3-6243 U+771E # <cjk>
+3-6244 U+7725 # <cjk>
+3-6245 U+7726 # <cjk>
+3-6246 U+771B # <cjk>
+3-6247 U+7737 # <cjk>
+3-6248 U+7738 # <cjk>
+3-6249 U+7747 # <cjk>
+3-624A U+775A # <cjk>
+3-624B U+7768 # <cjk>
+3-624C U+776B # <cjk>
+3-624D U+775B # <cjk>
+3-624E U+7765 # <cjk>
+3-624F U+777F # <cjk>
+3-6250 U+777E # <cjk>
+3-6251 U+7779 # <cjk>
+3-6252 U+778E # <cjk>
+3-6253 U+778B # <cjk>
+3-6254 U+7791 # <cjk>
+3-6255 U+77A0 # <cjk>
+3-6256 U+779E # <cjk>
+3-6257 U+77B0 # <cjk>
+3-6258 U+77B6 # <cjk>
+3-6259 U+77B9 # <cjk>
+3-625A U+77BF # <cjk>
+3-625B U+77BC # <cjk>
+3-625C U+77BD # <cjk>
+3-625D U+77BB # <cjk>
+3-625E U+77C7 # <cjk>
+3-625F U+77CD # <cjk>
+3-6260 U+77D7 # <cjk>
+3-6261 U+77DA # <cjk>
+3-6262 U+77DC # <cjk>
+3-6263 U+77E3 # <cjk>
+3-6264 U+77EE # <cjk>
+3-6265 U+77FC # <cjk>
+3-6266 U+780C # <cjk>
+3-6267 U+7812 # <cjk>
+3-6268 U+7926 # <cjk>
+3-6269 U+7820 # <cjk>
+3-626A U+792A # <cjk>
+3-626B U+7845 # <cjk>
+3-626C U+788E # <cjk>
+3-626D U+7874 # <cjk>
+3-626E U+7886 # <cjk>
+3-626F U+787C # <cjk>
+3-6270 U+789A # <cjk>
+3-6271 U+788C # <cjk>
+3-6272 U+78A3 # <cjk>
+3-6273 U+78B5 # <cjk>
+3-6274 U+78AA # <cjk>
+3-6275 U+78AF # <cjk>
+3-6276 U+78D1 # <cjk>
+3-6277 U+78C6 # <cjk>
+3-6278 U+78CB # <cjk>
+3-6279 U+78D4 # <cjk>
+3-627A U+78BE # <cjk>
+3-627B U+78BC # <cjk>
+3-627C U+78C5 # <cjk>
+3-627D U+78CA # <cjk>
+3-627E U+78EC # <cjk>
+3-6321 U+78E7 # <cjk>
+3-6322 U+78DA # <cjk>
+3-6323 U+78FD # <cjk>
+3-6324 U+78F4 # <cjk>
+3-6325 U+7907 # <cjk>
+3-6326 U+7912 # <cjk>
+3-6327 U+7911 # <cjk>
+3-6328 U+7919 # <cjk>
+3-6329 U+792C # <cjk>
+3-632A U+792B # <cjk>
+3-632B U+7940 # <cjk>
+3-632C U+7960 # <cjk>
+3-632D U+7957 # <cjk>
+3-632E U+795F # <cjk>
+3-632F U+795A # <cjk>
+3-6330 U+7955 # <cjk>
+3-6331 U+7953 # <cjk>
+3-6332 U+797A # <cjk>
+3-6333 U+797F # <cjk>
+3-6334 U+798A # <cjk>
+3-6335 U+799D # <cjk>
+3-6336 U+79A7 # <cjk>
+3-6337 U+9F4B # <cjk>
+3-6338 U+79AA # <cjk>
+3-6339 U+79AE # <cjk>
+3-633A U+79B3 # <cjk>
+3-633B U+79B9 # <cjk>
+3-633C U+79BA # <cjk>
+3-633D U+79C9 # <cjk>
+3-633E U+79D5 # <cjk>
+3-633F U+79E7 # <cjk>
+3-6340 U+79EC # <cjk>
+3-6341 U+79E1 # <cjk>
+3-6342 U+79E3 # <cjk>
+3-6343 U+7A08 # <cjk>
+3-6344 U+7A0D # <cjk>
+3-6345 U+7A18 # <cjk>
+3-6346 U+7A19 # <cjk>
+3-6347 U+7A20 # <cjk>
+3-6348 U+7A1F # <cjk>
+3-6349 U+7980 # <cjk>
+3-634A U+7A31 # <cjk>
+3-634B U+7A3B # <cjk>
+3-634C U+7A3E # <cjk>
+3-634D U+7A37 # <cjk>
+3-634E U+7A43 # <cjk>
+3-634F U+7A57 # <cjk>
+3-6350 U+7A49 # <cjk>
+3-6351 U+7A61 # <cjk>
+3-6352 U+7A62 # <cjk>
+3-6353 U+7A69 # <cjk>
+3-6354 U+9F9D # <cjk>
+3-6355 U+7A70 # <cjk>
+3-6356 U+7A79 # <cjk>
+3-6357 U+7A7D # <cjk>
+3-6358 U+7A88 # <cjk>
+3-6359 U+7A97 # <cjk>
+3-635A U+7A95 # <cjk>
+3-635B U+7A98 # <cjk>
+3-635C U+7A96 # <cjk>
+3-635D U+7AA9 # <cjk>
+3-635E U+7AC8 # <cjk>
+3-635F U+7AB0 # <cjk>
+3-6360 U+7AB6 # <cjk>
+3-6361 U+7AC5 # <cjk>
+3-6362 U+7AC4 # <cjk>
+3-6363 U+7ABF # <cjk>
+3-6364 U+9083 # <cjk>
+3-6365 U+7AC7 # <cjk>
+3-6366 U+7ACA # <cjk>
+3-6367 U+7ACD # <cjk>
+3-6368 U+7ACF # <cjk>
+3-6369 U+7AD5 # <cjk>
+3-636A U+7AD3 # <cjk>
+3-636B U+7AD9 # <cjk>
+3-636C U+7ADA # <cjk>
+3-636D U+7ADD # <cjk>
+3-636E U+7AE1 # <cjk>
+3-636F U+7AE2 # <cjk>
+3-6370 U+7AE6 # <cjk>
+3-6371 U+7AED # <cjk>
+3-6372 U+7AF0 # <cjk>
+3-6373 U+7B02 # <cjk>
+3-6374 U+7B0F # <cjk>
+3-6375 U+7B0A # <cjk>
+3-6376 U+7B06 # <cjk>
+3-6377 U+7B33 # <cjk>
+3-6378 U+7B18 # <cjk>
+3-6379 U+7B19 # <cjk>
+3-637A U+7B1E # <cjk>
+3-637B U+7B35 # <cjk>
+3-637C U+7B28 # <cjk>
+3-637D U+7B36 # <cjk>
+3-637E U+7B50 # <cjk>
+3-6421 U+7B7A # <cjk>
+3-6422 U+7B04 # <cjk>
+3-6423 U+7B4D # <cjk>
+3-6424 U+7B0B # <cjk>
+3-6425 U+7B4C # <cjk>
+3-6426 U+7B45 # <cjk>
+3-6427 U+7B75 # <cjk>
+3-6428 U+7B65 # <cjk>
+3-6429 U+7B74 # <cjk>
+3-642A U+7B67 # <cjk>
+3-642B U+7B70 # <cjk>
+3-642C U+7B71 # <cjk>
+3-642D U+7B6C # <cjk>
+3-642E U+7B6E # <cjk>
+3-642F U+7B9D # <cjk>
+3-6430 U+7B98 # <cjk>
+3-6431 U+7B9F # <cjk>
+3-6432 U+7B8D # <cjk>
+3-6433 U+7B9C # <cjk>
+3-6434 U+7B9A # <cjk>
+3-6435 U+7B8B # <cjk>
+3-6436 U+7B92 # <cjk>
+3-6437 U+7B8F # <cjk>
+3-6438 U+7B5D # <cjk>
+3-6439 U+7B99 # <cjk>
+3-643A U+7BCB # <cjk>
+3-643B U+7BC1 # <cjk>
+3-643C U+7BCC # <cjk>
+3-643D U+7BCF # <cjk>
+3-643E U+7BB4 # <cjk>
+3-643F U+7BC6 # <cjk>
+3-6440 U+7BDD # <cjk>
+3-6441 U+7BE9 # <cjk>
+3-6442 U+7C11 # <cjk>
+3-6443 U+7C14 # <cjk>
+3-6444 U+7BE6 # <cjk>
+3-6445 U+7BE5 # <cjk>
+3-6446 U+7C60 # <cjk>
+3-6447 U+7C00 # <cjk>
+3-6448 U+7C07 # <cjk>
+3-6449 U+7C13 # <cjk>
+3-644A U+7BF3 # <cjk>
+3-644B U+7BF7 # <cjk>
+3-644C U+7C17 # <cjk>
+3-644D U+7C0D # <cjk>
+3-644E U+7BF6 # <cjk>
+3-644F U+7C23 # <cjk>
+3-6450 U+7C27 # <cjk>
+3-6451 U+7C2A # <cjk>
+3-6452 U+7C1F # <cjk>
+3-6453 U+7C37 # <cjk>
+3-6454 U+7C2B # <cjk>
+3-6455 U+7C3D # <cjk>
+3-6456 U+7C4C # <cjk>
+3-6457 U+7C43 # <cjk>
+3-6458 U+7C54 # <cjk>
+3-6459 U+7C4F # <cjk>
+3-645A U+7C40 # <cjk>
+3-645B U+7C50 # <cjk>
+3-645C U+7C58 # <cjk>
+3-645D U+7C5F # <cjk>
+3-645E U+7C64 # <cjk>
+3-645F U+7C56 # <cjk>
+3-6460 U+7C65 # <cjk>
+3-6461 U+7C6C # <cjk>
+3-6462 U+7C75 # <cjk>
+3-6463 U+7C83 # <cjk>
+3-6464 U+7C90 # <cjk>
+3-6465 U+7CA4 # <cjk>
+3-6466 U+7CAD # <cjk>
+3-6467 U+7CA2 # <cjk>
+3-6468 U+7CAB # <cjk>
+3-6469 U+7CA1 # <cjk>
+3-646A U+7CA8 # <cjk>
+3-646B U+7CB3 # <cjk>
+3-646C U+7CB2 # <cjk>
+3-646D U+7CB1 # <cjk>
+3-646E U+7CAE # <cjk>
+3-646F U+7CB9 # <cjk>
+3-6470 U+7CBD # <cjk>
+3-6471 U+7CC0 # <cjk>
+3-6472 U+7CC5 # <cjk>
+3-6473 U+7CC2 # <cjk>
+3-6474 U+7CD8 # <cjk>
+3-6475 U+7CD2 # <cjk>
+3-6476 U+7CDC # <cjk>
+3-6477 U+7CE2 # <cjk>
+3-6478 U+9B3B # <cjk>
+3-6479 U+7CEF # <cjk>
+3-647A U+7CF2 # <cjk>
+3-647B U+7CF4 # <cjk>
+3-647C U+7CF6 # <cjk>
+3-647D U+7CFA # <cjk>
+3-647E U+7D06 # <cjk>
+3-6521 U+7D02 # <cjk>
+3-6522 U+7D1C # <cjk>
+3-6523 U+7D15 # <cjk>
+3-6524 U+7D0A # <cjk>
+3-6525 U+7D45 # <cjk>
+3-6526 U+7D4B # <cjk>
+3-6527 U+7D2E # <cjk>
+3-6528 U+7D32 # <cjk>
+3-6529 U+7D3F # <cjk>
+3-652A U+7D35 # <cjk>
+3-652B U+7D46 # <cjk>
+3-652C U+7D73 # <cjk>
+3-652D U+7D56 # <cjk>
+3-652E U+7D4E # <cjk>
+3-652F U+7D72 # <cjk>
+3-6530 U+7D68 # <cjk>
+3-6531 U+7D6E # <cjk>
+3-6532 U+7D4F # <cjk>
+3-6533 U+7D63 # <cjk>
+3-6534 U+7D93 # <cjk>
+3-6535 U+7D89 # <cjk>
+3-6536 U+7D5B # <cjk>
+3-6537 U+7D8F # <cjk>
+3-6538 U+7D7D # <cjk>
+3-6539 U+7D9B # <cjk>
+3-653A U+7DBA # <cjk>
+3-653B U+7DAE # <cjk>
+3-653C U+7DA3 # <cjk>
+3-653D U+7DB5 # <cjk>
+3-653E U+7DC7 # <cjk>
+3-653F U+7DBD # <cjk>
+3-6540 U+7DAB # <cjk>
+3-6541 U+7E3D # <cjk>
+3-6542 U+7DA2 # <cjk>
+3-6543 U+7DAF # <cjk>
+3-6544 U+7DDC # <cjk>
+3-6545 U+7DB8 # <cjk>
+3-6546 U+7D9F # <cjk>
+3-6547 U+7DB0 # <cjk>
+3-6548 U+7DD8 # <cjk>
+3-6549 U+7DDD # <cjk>
+3-654A U+7DE4 # <cjk>
+3-654B U+7DDE # <cjk>
+3-654C U+7DFB # <cjk>
+3-654D U+7DF2 # <cjk>
+3-654E U+7DE1 # <cjk>
+3-654F U+7E05 # <cjk>
+3-6550 U+7E0A # <cjk>
+3-6551 U+7E23 # <cjk>
+3-6552 U+7E21 # <cjk>
+3-6553 U+7E12 # <cjk>
+3-6554 U+7E31 # <cjk>
+3-6555 U+7E1F # <cjk>
+3-6556 U+7E09 # <cjk>
+3-6557 U+7E0B # <cjk>
+3-6558 U+7E22 # <cjk>
+3-6559 U+7E46 # <cjk>
+3-655A U+7E66 # <cjk>
+3-655B U+7E3B # <cjk>
+3-655C U+7E35 # <cjk>
+3-655D U+7E39 # <cjk>
+3-655E U+7E43 # <cjk>
+3-655F U+7E37 # <cjk>
+3-6560 U+7E32 # <cjk>
+3-6561 U+7E3A # <cjk>
+3-6562 U+7E67 # <cjk>
+3-6563 U+7E5D # <cjk>
+3-6564 U+7E56 # <cjk>
+3-6565 U+7E5E # <cjk>
+3-6566 U+7E59 # <cjk>
+3-6567 U+7E5A # <cjk>
+3-6568 U+7E79 # <cjk>
+3-6569 U+7E6A # <cjk>
+3-656A U+7E69 # <cjk>
+3-656B U+7E7C # <cjk>
+3-656C U+7E7B # <cjk>
+3-656D U+7E83 # <cjk>
+3-656E U+7DD5 # <cjk>
+3-656F U+7E7D # <cjk>
+3-6570 U+8FAE # <cjk>
+3-6571 U+7E7F # <cjk>
+3-6572 U+7E88 # <cjk>
+3-6573 U+7E89 # <cjk>
+3-6574 U+7E8C # <cjk>
+3-6575 U+7E92 # <cjk>
+3-6576 U+7E90 # <cjk>
+3-6577 U+7E93 # <cjk>
+3-6578 U+7E94 # <cjk>
+3-6579 U+7E96 # <cjk>
+3-657A U+7E8E # <cjk>
+3-657B U+7E9B # <cjk>
+3-657C U+7E9C # <cjk>
+3-657D U+7F38 # <cjk>
+3-657E U+7F3A # <cjk>
+3-6621 U+7F45 # <cjk>
+3-6622 U+7F4C # <cjk>
+3-6623 U+7F4D # <cjk>
+3-6624 U+7F4E # <cjk>
+3-6625 U+7F50 # <cjk>
+3-6626 U+7F51 # <cjk>
+3-6627 U+7F55 # <cjk>
+3-6628 U+7F54 # <cjk>
+3-6629 U+7F58 # <cjk>
+3-662A U+7F5F # <cjk>
+3-662B U+7F60 # <cjk>
+3-662C U+7F68 # <cjk>
+3-662D U+7F69 # <cjk>
+3-662E U+7F67 # <cjk>
+3-662F U+7F78 # <cjk>
+3-6630 U+7F82 # <cjk>
+3-6631 U+7F86 # <cjk>
+3-6632 U+7F83 # <cjk>
+3-6633 U+7F88 # <cjk>
+3-6634 U+7F87 # <cjk>
+3-6635 U+7F8C # <cjk>
+3-6636 U+7F94 # <cjk>
+3-6637 U+7F9E # <cjk>
+3-6638 U+7F9D # <cjk>
+3-6639 U+7F9A # <cjk>
+3-663A U+7FA3 # <cjk>
+3-663B U+7FAF # <cjk>
+3-663C U+7FB2 # <cjk>
+3-663D U+7FB9 # <cjk>
+3-663E U+7FAE # <cjk>
+3-663F U+7FB6 # <cjk>
+3-6640 U+7FB8 # <cjk>
+3-6641 U+8B71 # <cjk>
+3-6642 U+7FC5 # <cjk>
+3-6643 U+7FC6 # <cjk>
+3-6644 U+7FCA # <cjk>
+3-6645 U+7FD5 # <cjk>
+3-6646 U+7FD4 # <cjk>
+3-6647 U+7FE1 # <cjk>
+3-6648 U+7FE6 # <cjk>
+3-6649 U+7FE9 # <cjk>
+3-664A U+7FF3 # <cjk>
+3-664B U+7FF9 # <cjk>
+3-664C U+98DC # <cjk>
+3-664D U+8006 # <cjk>
+3-664E U+8004 # <cjk>
+3-664F U+800B # <cjk>
+3-6650 U+8012 # <cjk>
+3-6651 U+8018 # <cjk>
+3-6652 U+8019 # <cjk>
+3-6653 U+801C # <cjk>
+3-6654 U+8021 # <cjk>
+3-6655 U+8028 # <cjk>
+3-6656 U+803F # <cjk>
+3-6657 U+803B # <cjk>
+3-6658 U+804A # <cjk>
+3-6659 U+8046 # <cjk>
+3-665A U+8052 # <cjk>
+3-665B U+8058 # <cjk>
+3-665C U+805A # <cjk>
+3-665D U+805F # <cjk>
+3-665E U+8062 # <cjk>
+3-665F U+8068 # <cjk>
+3-6660 U+8073 # <cjk>
+3-6661 U+8072 # <cjk>
+3-6662 U+8070 # <cjk>
+3-6663 U+8076 # <cjk>
+3-6664 U+8079 # <cjk>
+3-6665 U+807D # <cjk>
+3-6666 U+807F # <cjk>
+3-6667 U+8084 # <cjk>
+3-6668 U+8086 # <cjk>
+3-6669 U+8085 # <cjk>
+3-666A U+809B # <cjk>
+3-666B U+8093 # <cjk>
+3-666C U+809A # <cjk>
+3-666D U+80AD # <cjk>
+3-666E U+5190 # <cjk>
+3-666F U+80AC # <cjk>
+3-6670 U+80DB # <cjk>
+3-6671 U+80E5 # <cjk>
+3-6672 U+80D9 # <cjk>
+3-6673 U+80DD # <cjk>
+3-6674 U+80C4 # <cjk>
+3-6675 U+80DA # <cjk>
+3-6676 U+80D6 # <cjk>
+3-6677 U+8109 # <cjk>
+3-6678 U+80EF # <cjk>
+3-6679 U+80F1 # <cjk>
+3-667A U+811B # <cjk>
+3-667B U+8129 # <cjk>
+3-667C U+8123 # <cjk>
+3-667D U+812F # <cjk>
+3-667E U+814B # <cjk>
+3-6721 U+968B # <cjk>
+3-6722 U+8146 # <cjk>
+3-6723 U+813E # <cjk>
+3-6724 U+8153 # <cjk>
+3-6725 U+8151 # <cjk>
+3-6726 U+80FC # <cjk>
+3-6727 U+8171 # <cjk>
+3-6728 U+816E # <cjk>
+3-6729 U+8165 # <cjk>
+3-672A U+8166 # <cjk>
+3-672B U+8174 # <cjk>
+3-672C U+8183 # <cjk>
+3-672D U+8188 # <cjk>
+3-672E U+818A # <cjk>
+3-672F U+8180 # <cjk>
+3-6730 U+8182 # <cjk>
+3-6731 U+81A0 # <cjk>
+3-6732 U+8195 # <cjk>
+3-6733 U+81A4 # <cjk>
+3-6734 U+81A3 # <cjk>
+3-6735 U+815F # <cjk>
+3-6736 U+8193 # <cjk>
+3-6737 U+81A9 # <cjk>
+3-6738 U+81B0 # <cjk>
+3-6739 U+81B5 # <cjk>
+3-673A U+81BE # <cjk>
+3-673B U+81B8 # <cjk>
+3-673C U+81BD # <cjk>
+3-673D U+81C0 # <cjk>
+3-673E U+81C2 # <cjk>
+3-673F U+81BA # <cjk>
+3-6740 U+81C9 # <cjk>
+3-6741 U+81CD # <cjk>
+3-6742 U+81D1 # <cjk>
+3-6743 U+81D9 # <cjk>
+3-6744 U+81D8 # <cjk>
+3-6745 U+81C8 # <cjk>
+3-6746 U+81DA # <cjk>
+3-6747 U+81DF # <cjk>
+3-6748 U+81E0 # <cjk>
+3-6749 U+81E7 # <cjk>
+3-674A U+81FA # <cjk>
+3-674B U+81FB # <cjk>
+3-674C U+81FE # <cjk>
+3-674D U+8201 # <cjk>
+3-674E U+8202 # <cjk>
+3-674F U+8205 # <cjk>
+3-6750 U+8207 # <cjk>
+3-6751 U+820A # <cjk>
+3-6752 U+820D # <cjk>
+3-6753 U+8210 # <cjk>
+3-6754 U+8216 # <cjk>
+3-6755 U+8229 # <cjk>
+3-6756 U+822B # <cjk>
+3-6757 U+8238 # <cjk>
+3-6758 U+8233 # <cjk>
+3-6759 U+8240 # <cjk>
+3-675A U+8259 # <cjk>
+3-675B U+8258 # <cjk>
+3-675C U+825D # <cjk>
+3-675D U+825A # <cjk>
+3-675E U+825F # <cjk>
+3-675F U+8264 # <cjk>
+3-6760 U+8262 # <cjk>
+3-6761 U+8268 # <cjk>
+3-6762 U+826A # <cjk>
+3-6763 U+826B # <cjk>
+3-6764 U+822E # <cjk>
+3-6765 U+8271 # <cjk>
+3-6766 U+8277 # <cjk>
+3-6767 U+8278 # <cjk>
+3-6768 U+827E # <cjk>
+3-6769 U+828D # <cjk>
+3-676A U+8292 # <cjk>
+3-676B U+82AB # <cjk>
+3-676C U+829F # <cjk>
+3-676D U+82BB # <cjk>
+3-676E U+82AC # <cjk>
+3-676F U+82E1 # <cjk>
+3-6770 U+82E3 # <cjk>
+3-6771 U+82DF # <cjk>
+3-6772 U+82D2 # <cjk>
+3-6773 U+82F4 # <cjk>
+3-6774 U+82F3 # <cjk>
+3-6775 U+82FA # <cjk>
+3-6776 U+8393 # <cjk>
+3-6777 U+8303 # <cjk>
+3-6778 U+82FB # <cjk>
+3-6779 U+82F9 # <cjk>
+3-677A U+82DE # <cjk>
+3-677B U+8306 # <cjk>
+3-677C U+82DC # <cjk>
+3-677D U+8309 # <cjk>
+3-677E U+82D9 # <cjk>
+3-6821 U+8335 # <cjk>
+3-6822 U+8334 # <cjk>
+3-6823 U+8316 # <cjk>
+3-6824 U+8332 # <cjk>
+3-6825 U+8331 # <cjk>
+3-6826 U+8340 # <cjk>
+3-6827 U+8339 # <cjk>
+3-6828 U+8350 # <cjk>
+3-6829 U+8345 # <cjk>
+3-682A U+832F # <cjk>
+3-682B U+832B # <cjk>
+3-682C U+8317 # <cjk>
+3-682D U+8318 # <cjk>
+3-682E U+8385 # <cjk>
+3-682F U+839A # <cjk>
+3-6830 U+83AA # <cjk>
+3-6831 U+839F # <cjk>
+3-6832 U+83A2 # <cjk>
+3-6833 U+8396 # <cjk>
+3-6834 U+8323 # <cjk>
+3-6835 U+838E # <cjk>
+3-6836 U+8387 # <cjk>
+3-6837 U+838A # <cjk>
+3-6838 U+837C # <cjk>
+3-6839 U+83B5 # <cjk>
+3-683A U+8373 # <cjk>
+3-683B U+8375 # <cjk>
+3-683C U+83A0 # <cjk>
+3-683D U+8389 # <cjk>
+3-683E U+83A8 # <cjk>
+3-683F U+83F4 # <cjk>
+3-6840 U+8413 # <cjk>
+3-6841 U+83EB # <cjk>
+3-6842 U+83CE # <cjk>
+3-6843 U+83FD # <cjk>
+3-6844 U+8403 # <cjk>
+3-6845 U+83D8 # <cjk>
+3-6846 U+840B # <cjk>
+3-6847 U+83C1 # <cjk>
+3-6848 U+83F7 # <cjk>
+3-6849 U+8407 # <cjk>
+3-684A U+83E0 # <cjk>
+3-684B U+83F2 # <cjk>
+3-684C U+840D # <cjk>
+3-684D U+8422 # <cjk>
+3-684E U+8420 # <cjk>
+3-684F U+83BD # <cjk>
+3-6850 U+8438 # <cjk>
+3-6851 U+8506 # <cjk>
+3-6852 U+83FB # <cjk>
+3-6853 U+846D # <cjk>
+3-6854 U+842A # <cjk>
+3-6855 U+843C # <cjk>
+3-6856 U+855A # <cjk>
+3-6857 U+8484 # <cjk>
+3-6858 U+8477 # <cjk>
+3-6859 U+846B # <cjk>
+3-685A U+84AD # <cjk>
+3-685B U+846E # <cjk>
+3-685C U+8482 # <cjk>
+3-685D U+8469 # <cjk>
+3-685E U+8446 # <cjk>
+3-685F U+842C # <cjk>
+3-6860 U+846F # <cjk>
+3-6861 U+8479 # <cjk>
+3-6862 U+8435 # <cjk>
+3-6863 U+84CA # <cjk>
+3-6864 U+8462 # <cjk>
+3-6865 U+84B9 # <cjk>
+3-6866 U+84BF # <cjk>
+3-6867 U+849F # <cjk>
+3-6868 U+84D9 # <cjk>
+3-6869 U+84CD # <cjk>
+3-686A U+84BB # <cjk>
+3-686B U+84DA # <cjk>
+3-686C U+84D0 # <cjk>
+3-686D U+84C1 # <cjk>
+3-686E U+84C6 # <cjk>
+3-686F U+84D6 # <cjk>
+3-6870 U+84A1 # <cjk>
+3-6871 U+8521 # <cjk>
+3-6872 U+84FF # <cjk>
+3-6873 U+84F4 # <cjk>
+3-6874 U+8517 # <cjk>
+3-6875 U+8518 # <cjk>
+3-6876 U+852C # <cjk>
+3-6877 U+851F # <cjk>
+3-6878 U+8515 # <cjk>
+3-6879 U+8514 # <cjk>
+3-687A U+84FC # <cjk>
+3-687B U+8540 # <cjk>
+3-687C U+8563 # <cjk>
+3-687D U+8558 # <cjk>
+3-687E U+8548 # <cjk>
+3-6921 U+8541 # <cjk>
+3-6922 U+8602 # <cjk>
+3-6923 U+854B # <cjk>
+3-6924 U+8555 # <cjk>
+3-6925 U+8580 # <cjk>
+3-6926 U+85A4 # <cjk>
+3-6927 U+8588 # <cjk>
+3-6928 U+8591 # <cjk>
+3-6929 U+858A # <cjk>
+3-692A U+85A8 # <cjk>
+3-692B U+856D # <cjk>
+3-692C U+8594 # <cjk>
+3-692D U+859B # <cjk>
+3-692E U+85EA # <cjk>
+3-692F U+8587 # <cjk>
+3-6930 U+859C # <cjk>
+3-6931 U+8577 # <cjk>
+3-6932 U+857E # <cjk>
+3-6933 U+8590 # <cjk>
+3-6934 U+85C9 # <cjk>
+3-6935 U+85BA # <cjk>
+3-6936 U+85CF # <cjk>
+3-6937 U+85B9 # <cjk>
+3-6938 U+85D0 # <cjk>
+3-6939 U+85D5 # <cjk>
+3-693A U+85DD # <cjk>
+3-693B U+85E5 # <cjk>
+3-693C U+85DC # <cjk>
+3-693D U+85F9 # <cjk>
+3-693E U+860A # <cjk>
+3-693F U+8613 # <cjk>
+3-6940 U+860B # <cjk>
+3-6941 U+85FE # <cjk>
+3-6942 U+85FA # <cjk>
+3-6943 U+8606 # <cjk>
+3-6944 U+8622 # <cjk>
+3-6945 U+861A # <cjk>
+3-6946 U+8630 # <cjk>
+3-6947 U+863F # <cjk>
+3-6948 U+864D # <cjk>
+3-6949 U+4E55 # <cjk>
+3-694A U+8654 # <cjk>
+3-694B U+865F # <cjk>
+3-694C U+8667 # <cjk>
+3-694D U+8671 # <cjk>
+3-694E U+8693 # <cjk>
+3-694F U+86A3 # <cjk>
+3-6950 U+86A9 # <cjk>
+3-6951 U+86AA # <cjk>
+3-6952 U+868B # <cjk>
+3-6953 U+868C # <cjk>
+3-6954 U+86B6 # <cjk>
+3-6955 U+86AF # <cjk>
+3-6956 U+86C4 # <cjk>
+3-6957 U+86C6 # <cjk>
+3-6958 U+86B0 # <cjk>
+3-6959 U+86C9 # <cjk>
+3-695A U+8823 # <cjk>
+3-695B U+86AB # <cjk>
+3-695C U+86D4 # <cjk>
+3-695D U+86DE # <cjk>
+3-695E U+86E9 # <cjk>
+3-695F U+86EC # <cjk>
+3-6960 U+86DF # <cjk>
+3-6961 U+86DB # <cjk>
+3-6962 U+86EF # <cjk>
+3-6963 U+8712 # <cjk>
+3-6964 U+8706 # <cjk>
+3-6965 U+8708 # <cjk>
+3-6966 U+8700 # <cjk>
+3-6967 U+8703 # <cjk>
+3-6968 U+86FB # <cjk>
+3-6969 U+8711 # <cjk>
+3-696A U+8709 # <cjk>
+3-696B U+870D # <cjk>
+3-696C U+86F9 # <cjk>
+3-696D U+870A # <cjk>
+3-696E U+8734 # <cjk>
+3-696F U+873F # <cjk>
+3-6970 U+8737 # <cjk>
+3-6971 U+873B # <cjk>
+3-6972 U+8725 # <cjk>
+3-6973 U+8729 # <cjk>
+3-6974 U+871A # <cjk>
+3-6975 U+8760 # <cjk>
+3-6976 U+875F # <cjk>
+3-6977 U+8778 # <cjk>
+3-6978 U+874C # <cjk>
+3-6979 U+874E # <cjk>
+3-697A U+8774 # <cjk>
+3-697B U+8757 # <cjk>
+3-697C U+8768 # <cjk>
+3-697D U+876E # <cjk>
+3-697E U+8759 # <cjk>
+3-6A21 U+8753 # <cjk>
+3-6A22 U+8763 # <cjk>
+3-6A23 U+876A # <cjk>
+3-6A24 U+8805 # <cjk>
+3-6A25 U+87A2 # <cjk>
+3-6A26 U+879F # <cjk>
+3-6A27 U+8782 # <cjk>
+3-6A28 U+87AF # <cjk>
+3-6A29 U+87CB # <cjk>
+3-6A2A U+87BD # <cjk>
+3-6A2B U+87C0 # <cjk>
+3-6A2C U+87D0 # <cjk>
+3-6A2D U+96D6 # <cjk>
+3-6A2E U+87AB # <cjk>
+3-6A2F U+87C4 # <cjk>
+3-6A30 U+87B3 # <cjk>
+3-6A31 U+87C7 # <cjk>
+3-6A32 U+87C6 # <cjk>
+3-6A33 U+87BB # <cjk>
+3-6A34 U+87EF # <cjk>
+3-6A35 U+87F2 # <cjk>
+3-6A36 U+87E0 # <cjk>
+3-6A37 U+880F # <cjk>
+3-6A38 U+880D # <cjk>
+3-6A39 U+87FE # <cjk>
+3-6A3A U+87F6 # <cjk>
+3-6A3B U+87F7 # <cjk>
+3-6A3C U+880E # <cjk>
+3-6A3D U+87D2 # <cjk>
+3-6A3E U+8811 # <cjk>
+3-6A3F U+8816 # <cjk>
+3-6A40 U+8815 # <cjk>
+3-6A41 U+8822 # <cjk>
+3-6A42 U+8821 # <cjk>
+3-6A43 U+8831 # <cjk>
+3-6A44 U+8836 # <cjk>
+3-6A45 U+8839 # <cjk>
+3-6A46 U+8827 # <cjk>
+3-6A47 U+883B # <cjk>
+3-6A48 U+8844 # <cjk>
+3-6A49 U+8842 # <cjk>
+3-6A4A U+8852 # <cjk>
+3-6A4B U+8859 # <cjk>
+3-6A4C U+885E # <cjk>
+3-6A4D U+8862 # <cjk>
+3-6A4E U+886B # <cjk>
+3-6A4F U+8881 # <cjk>
+3-6A50 U+887E # <cjk>
+3-6A51 U+889E # <cjk>
+3-6A52 U+8875 # <cjk>
+3-6A53 U+887D # <cjk>
+3-6A54 U+88B5 # <cjk>
+3-6A55 U+8872 # <cjk>
+3-6A56 U+8882 # <cjk>
+3-6A57 U+8897 # <cjk>
+3-6A58 U+8892 # <cjk>
+3-6A59 U+88AE # <cjk>
+3-6A5A U+8899 # <cjk>
+3-6A5B U+88A2 # <cjk>
+3-6A5C U+888D # <cjk>
+3-6A5D U+88A4 # <cjk>
+3-6A5E U+88B0 # <cjk>
+3-6A5F U+88BF # <cjk>
+3-6A60 U+88B1 # <cjk>
+3-6A61 U+88C3 # <cjk>
+3-6A62 U+88C4 # <cjk>
+3-6A63 U+88D4 # <cjk>
+3-6A64 U+88D8 # <cjk>
+3-6A65 U+88D9 # <cjk>
+3-6A66 U+88DD # <cjk>
+3-6A67 U+88F9 # <cjk>
+3-6A68 U+8902 # <cjk>
+3-6A69 U+88FC # <cjk>
+3-6A6A U+88F4 # <cjk>
+3-6A6B U+88E8 # <cjk>
+3-6A6C U+88F2 # <cjk>
+3-6A6D U+8904 # <cjk>
+3-6A6E U+890C # <cjk>
+3-6A6F U+890A # <cjk>
+3-6A70 U+8913 # <cjk>
+3-6A71 U+8943 # <cjk>
+3-6A72 U+891E # <cjk>
+3-6A73 U+8925 # <cjk>
+3-6A74 U+892A # <cjk>
+3-6A75 U+892B # <cjk>
+3-6A76 U+8941 # <cjk>
+3-6A77 U+8944 # <cjk>
+3-6A78 U+893B # <cjk>
+3-6A79 U+8936 # <cjk>
+3-6A7A U+8938 # <cjk>
+3-6A7B U+894C # <cjk>
+3-6A7C U+891D # <cjk>
+3-6A7D U+8960 # <cjk>
+3-6A7E U+895E # <cjk>
+3-6B21 U+8966 # <cjk>
+3-6B22 U+8964 # <cjk>
+3-6B23 U+896D # <cjk>
+3-6B24 U+896A # <cjk>
+3-6B25 U+896F # <cjk>
+3-6B26 U+8974 # <cjk>
+3-6B27 U+8977 # <cjk>
+3-6B28 U+897E # <cjk>
+3-6B29 U+8983 # <cjk>
+3-6B2A U+8988 # <cjk>
+3-6B2B U+898A # <cjk>
+3-6B2C U+8993 # <cjk>
+3-6B2D U+8998 # <cjk>
+3-6B2E U+89A1 # <cjk>
+3-6B2F U+89A9 # <cjk>
+3-6B30 U+89A6 # <cjk>
+3-6B31 U+89AC # <cjk>
+3-6B32 U+89AF # <cjk>
+3-6B33 U+89B2 # <cjk>
+3-6B34 U+89BA # <cjk>
+3-6B35 U+89BD # <cjk>
+3-6B36 U+89BF # <cjk>
+3-6B37 U+89C0 # <cjk>
+3-6B38 U+89DA # <cjk>
+3-6B39 U+89DC # <cjk>
+3-6B3A U+89DD # <cjk>
+3-6B3B U+89E7 # <cjk>
+3-6B3C U+89F4 # <cjk>
+3-6B3D U+89F8 # <cjk>
+3-6B3E U+8A03 # <cjk>
+3-6B3F U+8A16 # <cjk>
+3-6B40 U+8A10 # <cjk>
+3-6B41 U+8A0C # <cjk>
+3-6B42 U+8A1B # <cjk>
+3-6B43 U+8A1D # <cjk>
+3-6B44 U+8A25 # <cjk>
+3-6B45 U+8A36 # <cjk>
+3-6B46 U+8A41 # <cjk>
+3-6B47 U+8A5B # <cjk>
+3-6B48 U+8A52 # <cjk>
+3-6B49 U+8A46 # <cjk>
+3-6B4A U+8A48 # <cjk>
+3-6B4B U+8A7C # <cjk>
+3-6B4C U+8A6D # <cjk>
+3-6B4D U+8A6C # <cjk>
+3-6B4E U+8A62 # <cjk>
+3-6B4F U+8A85 # <cjk>
+3-6B50 U+8A82 # <cjk>
+3-6B51 U+8A84 # <cjk>
+3-6B52 U+8AA8 # <cjk>
+3-6B53 U+8AA1 # <cjk>
+3-6B54 U+8A91 # <cjk>
+3-6B55 U+8AA5 # <cjk>
+3-6B56 U+8AA6 # <cjk>
+3-6B57 U+8A9A # <cjk>
+3-6B58 U+8AA3 # <cjk>
+3-6B59 U+8AC4 # <cjk>
+3-6B5A U+8ACD # <cjk>
+3-6B5B U+8AC2 # <cjk>
+3-6B5C U+8ADA # <cjk>
+3-6B5D U+8AEB # <cjk>
+3-6B5E U+8AF3 # <cjk>
+3-6B5F U+8AE7 # <cjk>
+3-6B60 U+8AE4 # <cjk>
+3-6B61 U+8AF1 # <cjk>
+3-6B62 U+8B14 # <cjk>
+3-6B63 U+8AE0 # <cjk>
+3-6B64 U+8AE2 # <cjk>
+3-6B65 U+8AF7 # <cjk>
+3-6B66 U+8ADE # <cjk>
+3-6B67 U+8ADB # <cjk>
+3-6B68 U+8B0C # <cjk>
+3-6B69 U+8B07 # <cjk>
+3-6B6A U+8B1A # <cjk>
+3-6B6B U+8AE1 # <cjk>
+3-6B6C U+8B16 # <cjk>
+3-6B6D U+8B10 # <cjk>
+3-6B6E U+8B17 # <cjk>
+3-6B6F U+8B20 # <cjk>
+3-6B70 U+8B33 # <cjk>
+3-6B71 U+97AB # <cjk>
+3-6B72 U+8B26 # <cjk>
+3-6B73 U+8B2B # <cjk>
+3-6B74 U+8B3E # <cjk>
+3-6B75 U+8B28 # <cjk>
+3-6B76 U+8B41 # <cjk>
+3-6B77 U+8B4C # <cjk>
+3-6B78 U+8B4F # <cjk>
+3-6B79 U+8B4E # <cjk>
+3-6B7A U+8B49 # <cjk>
+3-6B7B U+8B56 # <cjk>
+3-6B7C U+8B5B # <cjk>
+3-6B7D U+8B5A # <cjk>
+3-6B7E U+8B6B # <cjk>
+3-6C21 U+8B5F # <cjk>
+3-6C22 U+8B6C # <cjk>
+3-6C23 U+8B6F # <cjk>
+3-6C24 U+8B74 # <cjk>
+3-6C25 U+8B7D # <cjk>
+3-6C26 U+8B80 # <cjk>
+3-6C27 U+8B8C # <cjk>
+3-6C28 U+8B8E # <cjk>
+3-6C29 U+8B92 # <cjk>
+3-6C2A U+8B93 # <cjk>
+3-6C2B U+8B96 # <cjk>
+3-6C2C U+8B99 # <cjk>
+3-6C2D U+8B9A # <cjk>
+3-6C2E U+8C3A # <cjk>
+3-6C2F U+8C41 # <cjk>
+3-6C30 U+8C3F # <cjk>
+3-6C31 U+8C48 # <cjk>
+3-6C32 U+8C4C # <cjk>
+3-6C33 U+8C4E # <cjk>
+3-6C34 U+8C50 # <cjk>
+3-6C35 U+8C55 # <cjk>
+3-6C36 U+8C62 # <cjk>
+3-6C37 U+8C6C # <cjk>
+3-6C38 U+8C78 # <cjk>
+3-6C39 U+8C7A # <cjk>
+3-6C3A U+8C82 # <cjk>
+3-6C3B U+8C89 # <cjk>
+3-6C3C U+8C85 # <cjk>
+3-6C3D U+8C8A # <cjk>
+3-6C3E U+8C8D # <cjk>
+3-6C3F U+8C8E # <cjk>
+3-6C40 U+8C94 # <cjk>
+3-6C41 U+8C7C # <cjk>
+3-6C42 U+8C98 # <cjk>
+3-6C43 U+621D # <cjk>
+3-6C44 U+8CAD # <cjk>
+3-6C45 U+8CAA # <cjk>
+3-6C46 U+8CBD # <cjk>
+3-6C47 U+8CB2 # <cjk>
+3-6C48 U+8CB3 # <cjk>
+3-6C49 U+8CAE # <cjk>
+3-6C4A U+8CB6 # <cjk>
+3-6C4B U+8CC8 # <cjk>
+3-6C4C U+8CC1 # <cjk>
+3-6C4D U+8CE4 # <cjk>
+3-6C4E U+8CE3 # <cjk>
+3-6C4F U+8CDA # <cjk>
+3-6C50 U+8CFD # <cjk>
+3-6C51 U+8CFA # <cjk>
+3-6C52 U+8CFB # <cjk>
+3-6C53 U+8D04 # <cjk>
+3-6C54 U+8D05 # <cjk>
+3-6C55 U+8D0A # <cjk>
+3-6C56 U+8D07 # <cjk>
+3-6C57 U+8D0F # <cjk>
+3-6C58 U+8D0D # <cjk>
+3-6C59 U+8D10 # <cjk>
+3-6C5A U+9F4E # <cjk>
+3-6C5B U+8D13 # <cjk>
+3-6C5C U+8CCD # <cjk>
+3-6C5D U+8D14 # <cjk>
+3-6C5E U+8D16 # <cjk>
+3-6C5F U+8D67 # <cjk>
+3-6C60 U+8D6D # <cjk>
+3-6C61 U+8D71 # <cjk>
+3-6C62 U+8D73 # <cjk>
+3-6C63 U+8D81 # <cjk>
+3-6C64 U+8D99 # <cjk>
+3-6C65 U+8DC2 # <cjk>
+3-6C66 U+8DBE # <cjk>
+3-6C67 U+8DBA # <cjk>
+3-6C68 U+8DCF # <cjk>
+3-6C69 U+8DDA # <cjk>
+3-6C6A U+8DD6 # <cjk>
+3-6C6B U+8DCC # <cjk>
+3-6C6C U+8DDB # <cjk>
+3-6C6D U+8DCB # <cjk>
+3-6C6E U+8DEA # <cjk>
+3-6C6F U+8DEB # <cjk>
+3-6C70 U+8DDF # <cjk>
+3-6C71 U+8DE3 # <cjk>
+3-6C72 U+8DFC # <cjk>
+3-6C73 U+8E08 # <cjk>
+3-6C74 U+8E09 # <cjk>
+3-6C75 U+8DFF # <cjk>
+3-6C76 U+8E1D # <cjk>
+3-6C77 U+8E1E # <cjk>
+3-6C78 U+8E10 # <cjk>
+3-6C79 U+8E1F # <cjk>
+3-6C7A U+8E42 # <cjk>
+3-6C7B U+8E35 # <cjk>
+3-6C7C U+8E30 # <cjk>
+3-6C7D U+8E34 # <cjk>
+3-6C7E U+8E4A # <cjk>
+3-6D21 U+8E47 # <cjk>
+3-6D22 U+8E49 # <cjk>
+3-6D23 U+8E4C # <cjk>
+3-6D24 U+8E50 # <cjk>
+3-6D25 U+8E48 # <cjk>
+3-6D26 U+8E59 # <cjk>
+3-6D27 U+8E64 # <cjk>
+3-6D28 U+8E60 # <cjk>
+3-6D29 U+8E2A # <cjk>
+3-6D2A U+8E63 # <cjk>
+3-6D2B U+8E55 # <cjk>
+3-6D2C U+8E76 # <cjk>
+3-6D2D U+8E72 # <cjk>
+3-6D2E U+8E7C # <cjk>
+3-6D2F U+8E81 # <cjk>
+3-6D30 U+8E87 # <cjk>
+3-6D31 U+8E85 # <cjk>
+3-6D32 U+8E84 # <cjk>
+3-6D33 U+8E8B # <cjk>
+3-6D34 U+8E8A # <cjk>
+3-6D35 U+8E93 # <cjk>
+3-6D36 U+8E91 # <cjk>
+3-6D37 U+8E94 # <cjk>
+3-6D38 U+8E99 # <cjk>
+3-6D39 U+8EAA # <cjk>
+3-6D3A U+8EA1 # <cjk>
+3-6D3B U+8EAC # <cjk>
+3-6D3C U+8EB0 # <cjk>
+3-6D3D U+8EC6 # <cjk>
+3-6D3E U+8EB1 # <cjk>
+3-6D3F U+8EBE # <cjk>
+3-6D40 U+8EC5 # <cjk>
+3-6D41 U+8EC8 # <cjk>
+3-6D42 U+8ECB # <cjk>
+3-6D43 U+8EDB # <cjk>
+3-6D44 U+8EE3 # <cjk>
+3-6D45 U+8EFC # <cjk>
+3-6D46 U+8EFB # <cjk>
+3-6D47 U+8EEB # <cjk>
+3-6D48 U+8EFE # <cjk>
+3-6D49 U+8F0A # <cjk>
+3-6D4A U+8F05 # <cjk>
+3-6D4B U+8F15 # <cjk>
+3-6D4C U+8F12 # <cjk>
+3-6D4D U+8F19 # <cjk>
+3-6D4E U+8F13 # <cjk>
+3-6D4F U+8F1C # <cjk>
+3-6D50 U+8F1F # <cjk>
+3-6D51 U+8F1B # <cjk>
+3-6D52 U+8F0C # <cjk>
+3-6D53 U+8F26 # <cjk>
+3-6D54 U+8F33 # <cjk>
+3-6D55 U+8F3B # <cjk>
+3-6D56 U+8F39 # <cjk>
+3-6D57 U+8F45 # <cjk>
+3-6D58 U+8F42 # <cjk>
+3-6D59 U+8F3E # <cjk>
+3-6D5A U+8F4C # <cjk>
+3-6D5B U+8F49 # <cjk>
+3-6D5C U+8F46 # <cjk>
+3-6D5D U+8F4E # <cjk>
+3-6D5E U+8F57 # <cjk>
+3-6D5F U+8F5C # <cjk>
+3-6D60 U+8F62 # <cjk>
+3-6D61 U+8F63 # <cjk>
+3-6D62 U+8F64 # <cjk>
+3-6D63 U+8F9C # <cjk>
+3-6D64 U+8F9F # <cjk>
+3-6D65 U+8FA3 # <cjk>
+3-6D66 U+8FAD # <cjk>
+3-6D67 U+8FAF # <cjk>
+3-6D68 U+8FB7 # <cjk>
+3-6D69 U+8FDA # <cjk>
+3-6D6A U+8FE5 # <cjk>
+3-6D6B U+8FE2 # <cjk>
+3-6D6C U+8FEA # <cjk>
+3-6D6D U+8FEF # <cjk>
+3-6D6E U+9087 # <cjk>
+3-6D6F U+8FF4 # <cjk>
+3-6D70 U+9005 # <cjk>
+3-6D71 U+8FF9 # <cjk>
+3-6D72 U+8FFA # <cjk>
+3-6D73 U+9011 # <cjk>
+3-6D74 U+9015 # <cjk>
+3-6D75 U+9021 # <cjk>
+3-6D76 U+900D # <cjk>
+3-6D77 U+901E # <cjk>
+3-6D78 U+9016 # <cjk>
+3-6D79 U+900B # <cjk>
+3-6D7A U+9027 # <cjk>
+3-6D7B U+9036 # <cjk>
+3-6D7C U+9035 # <cjk>
+3-6D7D U+9039 # <cjk>
+3-6D7E U+8FF8 # <cjk>
+3-6E21 U+904F # <cjk>
+3-6E22 U+9050 # <cjk>
+3-6E23 U+9051 # <cjk>
+3-6E24 U+9052 # <cjk>
+3-6E25 U+900E # <cjk>
+3-6E26 U+9049 # <cjk>
+3-6E27 U+903E # <cjk>
+3-6E28 U+9056 # <cjk>
+3-6E29 U+9058 # <cjk>
+3-6E2A U+905E # <cjk>
+3-6E2B U+9068 # <cjk>
+3-6E2C U+906F # <cjk>
+3-6E2D U+9076 # <cjk>
+3-6E2E U+96A8 # <cjk>
+3-6E2F U+9072 # <cjk>
+3-6E30 U+9082 # <cjk>
+3-6E31 U+907D # <cjk>
+3-6E32 U+9081 # <cjk>
+3-6E33 U+9080 # <cjk>
+3-6E34 U+908A # <cjk>
+3-6E35 U+9089 # <cjk>
+3-6E36 U+908F # <cjk>
+3-6E37 U+90A8 # <cjk>
+3-6E38 U+90AF # <cjk>
+3-6E39 U+90B1 # <cjk>
+3-6E3A U+90B5 # <cjk>
+3-6E3B U+90E2 # <cjk>
+3-6E3C U+90E4 # <cjk>
+3-6E3D U+6248 # <cjk>
+3-6E3E U+90DB # <cjk>
+3-6E3F U+9102 # <cjk>
+3-6E40 U+9112 # <cjk>
+3-6E41 U+9119 # <cjk>
+3-6E42 U+9132 # <cjk>
+3-6E43 U+9130 # <cjk>
+3-6E44 U+914A # <cjk>
+3-6E45 U+9156 # <cjk>
+3-6E46 U+9158 # <cjk>
+3-6E47 U+9163 # <cjk>
+3-6E48 U+9165 # <cjk>
+3-6E49 U+9169 # <cjk>
+3-6E4A U+9173 # <cjk>
+3-6E4B U+9172 # <cjk>
+3-6E4C U+918B # <cjk>
+3-6E4D U+9189 # <cjk>
+3-6E4E U+9182 # <cjk>
+3-6E4F U+91A2 # <cjk>
+3-6E50 U+91AB # <cjk>
+3-6E51 U+91AF # <cjk>
+3-6E52 U+91AA # <cjk>
+3-6E53 U+91B5 # <cjk>
+3-6E54 U+91B4 # <cjk>
+3-6E55 U+91BA # <cjk>
+3-6E56 U+91C0 # <cjk>
+3-6E57 U+91C1 # <cjk>
+3-6E58 U+91C9 # <cjk>
+3-6E59 U+91CB # <cjk>
+3-6E5A U+91D0 # <cjk>
+3-6E5B U+91D6 # <cjk>
+3-6E5C U+91DF # <cjk>
+3-6E5D U+91E1 # <cjk>
+3-6E5E U+91DB # <cjk>
+3-6E5F U+91FC # <cjk>
+3-6E60 U+91F5 # <cjk>
+3-6E61 U+91F6 # <cjk>
+3-6E62 U+921E # <cjk>
+3-6E63 U+91FF # <cjk>
+3-6E64 U+9214 # <cjk>
+3-6E65 U+922C # <cjk>
+3-6E66 U+9215 # <cjk>
+3-6E67 U+9211 # <cjk>
+3-6E68 U+925E # <cjk>
+3-6E69 U+9257 # <cjk>
+3-6E6A U+9245 # <cjk>
+3-6E6B U+9249 # <cjk>
+3-6E6C U+9264 # <cjk>
+3-6E6D U+9248 # <cjk>
+3-6E6E U+9295 # <cjk>
+3-6E6F U+923F # <cjk>
+3-6E70 U+924B # <cjk>
+3-6E71 U+9250 # <cjk>
+3-6E72 U+929C # <cjk>
+3-6E73 U+9296 # <cjk>
+3-6E74 U+9293 # <cjk>
+3-6E75 U+929B # <cjk>
+3-6E76 U+925A # <cjk>
+3-6E77 U+92CF # <cjk>
+3-6E78 U+92B9 # <cjk>
+3-6E79 U+92B7 # <cjk>
+3-6E7A U+92E9 # <cjk>
+3-6E7B U+930F # <cjk>
+3-6E7C U+92FA # <cjk>
+3-6E7D U+9344 # <cjk>
+3-6E7E U+932E # <cjk>
+3-6F21 U+9319 # <cjk>
+3-6F22 U+9322 # <cjk>
+3-6F23 U+931A # <cjk>
+3-6F24 U+9323 # <cjk>
+3-6F25 U+933A # <cjk>
+3-6F26 U+9335 # <cjk>
+3-6F27 U+933B # <cjk>
+3-6F28 U+935C # <cjk>
+3-6F29 U+9360 # <cjk>
+3-6F2A U+937C # <cjk>
+3-6F2B U+936E # <cjk>
+3-6F2C U+9356 # <cjk>
+3-6F2D U+93B0 # <cjk>
+3-6F2E U+93AC # <cjk>
+3-6F2F U+93AD # <cjk>
+3-6F30 U+9394 # <cjk>
+3-6F31 U+93B9 # <cjk>
+3-6F32 U+93D6 # <cjk>
+3-6F33 U+93D7 # <cjk>
+3-6F34 U+93E8 # <cjk>
+3-6F35 U+93E5 # <cjk>
+3-6F36 U+93D8 # <cjk>
+3-6F37 U+93C3 # <cjk>
+3-6F38 U+93DD # <cjk>
+3-6F39 U+93D0 # <cjk>
+3-6F3A U+93C8 # <cjk>
+3-6F3B U+93E4 # <cjk>
+3-6F3C U+941A # <cjk>
+3-6F3D U+9414 # <cjk>
+3-6F3E U+9413 # <cjk>
+3-6F3F U+9403 # <cjk>
+3-6F40 U+9407 # <cjk>
+3-6F41 U+9410 # <cjk>
+3-6F42 U+9436 # <cjk>
+3-6F43 U+942B # <cjk>
+3-6F44 U+9435 # <cjk>
+3-6F45 U+9421 # <cjk>
+3-6F46 U+943A # <cjk>
+3-6F47 U+9441 # <cjk>
+3-6F48 U+9452 # <cjk>
+3-6F49 U+9444 # <cjk>
+3-6F4A U+945B # <cjk>
+3-6F4B U+9460 # <cjk>
+3-6F4C U+9462 # <cjk>
+3-6F4D U+945E # <cjk>
+3-6F4E U+946A # <cjk>
+3-6F4F U+9229 # <cjk>
+3-6F50 U+9470 # <cjk>
+3-6F51 U+9475 # <cjk>
+3-6F52 U+9477 # <cjk>
+3-6F53 U+947D # <cjk>
+3-6F54 U+945A # <cjk>
+3-6F55 U+947C # <cjk>
+3-6F56 U+947E # <cjk>
+3-6F57 U+9481 # <cjk>
+3-6F58 U+947F # <cjk>
+3-6F59 U+9582 # <cjk>
+3-6F5A U+9587 # <cjk>
+3-6F5B U+958A # <cjk>
+3-6F5C U+9594 # <cjk>
+3-6F5D U+9596 # <cjk>
+3-6F5E U+9598 # <cjk>
+3-6F5F U+9599 # <cjk>
+3-6F60 U+95A0 # <cjk>
+3-6F61 U+95A8 # <cjk>
+3-6F62 U+95A7 # <cjk>
+3-6F63 U+95AD # <cjk>
+3-6F64 U+95BC # <cjk>
+3-6F65 U+95BB # <cjk>
+3-6F66 U+95B9 # <cjk>
+3-6F67 U+95BE # <cjk>
+3-6F68 U+95CA # <cjk>
+3-6F69 U+6FF6 # <cjk>
+3-6F6A U+95C3 # <cjk>
+3-6F6B U+95CD # <cjk>
+3-6F6C U+95CC # <cjk>
+3-6F6D U+95D5 # <cjk>
+3-6F6E U+95D4 # <cjk>
+3-6F6F U+95D6 # <cjk>
+3-6F70 U+95DC # <cjk>
+3-6F71 U+95E1 # <cjk>
+3-6F72 U+95E5 # <cjk>
+3-6F73 U+95E2 # <cjk>
+3-6F74 U+9621 # <cjk>
+3-6F75 U+9628 # <cjk>
+3-6F76 U+962E # <cjk>
+3-6F77 U+962F # <cjk>
+3-6F78 U+9642 # <cjk>
+3-6F79 U+964C # <cjk>
+3-6F7A U+964F # <cjk>
+3-6F7B U+964B # <cjk>
+3-6F7C U+9677 # <cjk>
+3-6F7D U+965C # <cjk>
+3-6F7E U+965E # <cjk>
+3-7021 U+965D # <cjk>
+3-7022 U+965F # <cjk>
+3-7023 U+9666 # <cjk>
+3-7024 U+9672 # <cjk>
+3-7025 U+966C # <cjk>
+3-7026 U+968D # <cjk>
+3-7027 U+9698 # <cjk>
+3-7028 U+9695 # <cjk>
+3-7029 U+9697 # <cjk>
+3-702A U+96AA # <cjk>
+3-702B U+96A7 # <cjk>
+3-702C U+96B1 # <cjk>
+3-702D U+96B2 # <cjk>
+3-702E U+96B0 # <cjk>
+3-702F U+96B4 # <cjk>
+3-7030 U+96B6 # <cjk>
+3-7031 U+96B8 # <cjk>
+3-7032 U+96B9 # <cjk>
+3-7033 U+96CE # <cjk>
+3-7034 U+96CB # <cjk>
+3-7035 U+96C9 # <cjk>
+3-7036 U+96CD # <cjk>
+3-7037 U+894D # <cjk>
+3-7038 U+96DC # <cjk>
+3-7039 U+970D # <cjk>
+3-703A U+96D5 # <cjk>
+3-703B U+96F9 # <cjk>
+3-703C U+9704 # <cjk>
+3-703D U+9706 # <cjk>
+3-703E U+9708 # <cjk>
+3-703F U+9713 # <cjk>
+3-7040 U+970E # <cjk>
+3-7041 U+9711 # <cjk>
+3-7042 U+970F # <cjk>
+3-7043 U+9716 # <cjk>
+3-7044 U+9719 # <cjk>
+3-7045 U+9724 # <cjk>
+3-7046 U+972A # <cjk>
+3-7047 U+9730 # <cjk>
+3-7048 U+9739 # <cjk>
+3-7049 U+973D # <cjk>
+3-704A U+973E # <cjk>
+3-704B U+9744 # <cjk>
+3-704C U+9746 # <cjk>
+3-704D U+9748 # <cjk>
+3-704E U+9742 # <cjk>
+3-704F U+9749 # <cjk>
+3-7050 U+975C # <cjk>
+3-7051 U+9760 # <cjk>
+3-7052 U+9764 # <cjk>
+3-7053 U+9766 # <cjk>
+3-7054 U+9768 # <cjk>
+3-7055 U+52D2 # <cjk>
+3-7056 U+976B # <cjk>
+3-7057 U+9771 # <cjk>
+3-7058 U+9779 # <cjk>
+3-7059 U+9785 # <cjk>
+3-705A U+977C # <cjk>
+3-705B U+9781 # <cjk>
+3-705C U+977A # <cjk>
+3-705D U+9786 # <cjk>
+3-705E U+978B # <cjk>
+3-705F U+978F # <cjk>
+3-7060 U+9790 # <cjk>
+3-7061 U+979C # <cjk>
+3-7062 U+97A8 # <cjk>
+3-7063 U+97A6 # <cjk>
+3-7064 U+97A3 # <cjk>
+3-7065 U+97B3 # <cjk>
+3-7066 U+97B4 # <cjk>
+3-7067 U+97C3 # <cjk>
+3-7068 U+97C6 # <cjk>
+3-7069 U+97C8 # <cjk>
+3-706A U+97CB # <cjk>
+3-706B U+97DC # <cjk>
+3-706C U+97ED # <cjk>
+3-706D U+9F4F # <cjk>
+3-706E U+97F2 # <cjk>
+3-706F U+7ADF # <cjk>
+3-7070 U+97F6 # <cjk>
+3-7071 U+97F5 # <cjk>
+3-7072 U+980F # <cjk>
+3-7073 U+980C # <cjk>
+3-7074 U+9838 # <cjk>
+3-7075 U+9824 # <cjk>
+3-7076 U+9821 # <cjk>
+3-7077 U+9837 # <cjk>
+3-7078 U+983D # <cjk>
+3-7079 U+9846 # <cjk>
+3-707A U+984F # <cjk>
+3-707B U+984B # <cjk>
+3-707C U+986B # <cjk>
+3-707D U+986F # <cjk>
+3-707E U+9870 # <cjk>
+3-7121 U+9871 # <cjk>
+3-7122 U+9874 # <cjk>
+3-7123 U+9873 # <cjk>
+3-7124 U+98AA # <cjk>
+3-7125 U+98AF # <cjk>
+3-7126 U+98B1 # <cjk>
+3-7127 U+98B6 # <cjk>
+3-7128 U+98C4 # <cjk>
+3-7129 U+98C3 # <cjk>
+3-712A U+98C6 # <cjk>
+3-712B U+98E9 # <cjk>
+3-712C U+98EB # <cjk>
+3-712D U+9903 # <cjk>
+3-712E U+9909 # <cjk>
+3-712F U+9912 # <cjk>
+3-7130 U+9914 # <cjk>
+3-7131 U+9918 # <cjk>
+3-7132 U+9921 # <cjk>
+3-7133 U+991D # <cjk>
+3-7134 U+991E # <cjk>
+3-7135 U+9924 # <cjk>
+3-7136 U+9920 # <cjk>
+3-7137 U+992C # <cjk>
+3-7138 U+992E # <cjk>
+3-7139 U+993D # <cjk>
+3-713A U+993E # <cjk>
+3-713B U+9942 # <cjk>
+3-713C U+9949 # <cjk>
+3-713D U+9945 # <cjk>
+3-713E U+9950 # <cjk>
+3-713F U+994B # <cjk>
+3-7140 U+9951 # <cjk>
+3-7141 U+9952 # <cjk>
+3-7142 U+994C # <cjk>
+3-7143 U+9955 # <cjk>
+3-7144 U+9997 # <cjk>
+3-7145 U+9998 # <cjk>
+3-7146 U+99A5 # <cjk>
+3-7147 U+99AD # <cjk>
+3-7148 U+99AE # <cjk>
+3-7149 U+99BC # <cjk>
+3-714A U+99DF # <cjk>
+3-714B U+99DB # <cjk>
+3-714C U+99DD # <cjk>
+3-714D U+99D8 # <cjk>
+3-714E U+99D1 # <cjk>
+3-714F U+99ED # <cjk>
+3-7150 U+99EE # <cjk>
+3-7151 U+99F1 # <cjk>
+3-7152 U+99F2 # <cjk>
+3-7153 U+99FB # <cjk>
+3-7154 U+99F8 # <cjk>
+3-7155 U+9A01 # <cjk>
+3-7156 U+9A0F # <cjk>
+3-7157 U+9A05 # <cjk>
+3-7158 U+99E2 # <cjk>
+3-7159 U+9A19 # <cjk>
+3-715A U+9A2B # <cjk>
+3-715B U+9A37 # <cjk>
+3-715C U+9A45 # <cjk>
+3-715D U+9A42 # <cjk>
+3-715E U+9A40 # <cjk>
+3-715F U+9A43 # <cjk>
+3-7160 U+9A3E # <cjk>
+3-7161 U+9A55 # <cjk>
+3-7162 U+9A4D # <cjk>
+3-7163 U+9A5B # <cjk>
+3-7164 U+9A57 # <cjk>
+3-7165 U+9A5F # <cjk>
+3-7166 U+9A62 # <cjk>
+3-7167 U+9A65 # <cjk>
+3-7168 U+9A64 # <cjk>
+3-7169 U+9A69 # <cjk>
+3-716A U+9A6B # <cjk>
+3-716B U+9A6A # <cjk>
+3-716C U+9AAD # <cjk>
+3-716D U+9AB0 # <cjk>
+3-716E U+9ABC # <cjk>
+3-716F U+9AC0 # <cjk>
+3-7170 U+9ACF # <cjk>
+3-7171 U+9AD1 # <cjk>
+3-7172 U+9AD3 # <cjk>
+3-7173 U+9AD4 # <cjk>
+3-7174 U+9ADE # <cjk>
+3-7175 U+9ADF # <cjk>
+3-7176 U+9AE2 # <cjk>
+3-7177 U+9AE3 # <cjk>
+3-7178 U+9AE6 # <cjk>
+3-7179 U+9AEF # <cjk>
+3-717A U+9AEB # <cjk>
+3-717B U+9AEE # <cjk>
+3-717C U+9AF4 # <cjk>
+3-717D U+9AF1 # <cjk>
+3-717E U+9AF7 # <cjk>
+3-7221 U+9AFB # <cjk>
+3-7222 U+9B06 # <cjk>
+3-7223 U+9B18 # <cjk>
+3-7224 U+9B1A # <cjk>
+3-7225 U+9B1F # <cjk>
+3-7226 U+9B22 # <cjk>
+3-7227 U+9B23 # <cjk>
+3-7228 U+9B25 # <cjk>
+3-7229 U+9B27 # <cjk>
+3-722A U+9B28 # <cjk>
+3-722B U+9B29 # <cjk>
+3-722C U+9B2A # <cjk>
+3-722D U+9B2E # <cjk>
+3-722E U+9B2F # <cjk>
+3-722F U+9B32 # <cjk>
+3-7230 U+9B44 # <cjk>
+3-7231 U+9B43 # <cjk>
+3-7232 U+9B4F # <cjk>
+3-7233 U+9B4D # <cjk>
+3-7234 U+9B4E # <cjk>
+3-7235 U+9B51 # <cjk>
+3-7236 U+9B58 # <cjk>
+3-7237 U+9B74 # <cjk>
+3-7238 U+9B93 # <cjk>
+3-7239 U+9B83 # <cjk>
+3-723A U+9B91 # <cjk>
+3-723B U+9B96 # <cjk>
+3-723C U+9B97 # <cjk>
+3-723D U+9B9F # <cjk>
+3-723E U+9BA0 # <cjk>
+3-723F U+9BA8 # <cjk>
+3-7240 U+9BB4 # <cjk>
+3-7241 U+9BC0 # <cjk>
+3-7242 U+9BCA # <cjk>
+3-7243 U+9BB9 # <cjk>
+3-7244 U+9BC6 # <cjk>
+3-7245 U+9BCF # <cjk>
+3-7246 U+9BD1 # <cjk>
+3-7247 U+9BD2 # <cjk>
+3-7248 U+9BE3 # <cjk>
+3-7249 U+9BE2 # <cjk>
+3-724A U+9BE4 # <cjk>
+3-724B U+9BD4 # <cjk>
+3-724C U+9BE1 # <cjk>
+3-724D U+9C3A # <cjk>
+3-724E U+9BF2 # <cjk>
+3-724F U+9BF1 # <cjk>
+3-7250 U+9BF0 # <cjk>
+3-7251 U+9C15 # <cjk>
+3-7252 U+9C14 # <cjk>
+3-7253 U+9C09 # <cjk>
+3-7254 U+9C13 # <cjk>
+3-7255 U+9C0C # <cjk>
+3-7256 U+9C06 # <cjk>
+3-7257 U+9C08 # <cjk>
+3-7258 U+9C12 # <cjk>
+3-7259 U+9C0A # <cjk>
+3-725A U+9C04 # <cjk>
+3-725B U+9C2E # <cjk>
+3-725C U+9C1B # <cjk>
+3-725D U+9C25 # <cjk>
+3-725E U+9C24 # <cjk>
+3-725F U+9C21 # <cjk>
+3-7260 U+9C30 # <cjk>
+3-7261 U+9C47 # <cjk>
+3-7262 U+9C32 # <cjk>
+3-7263 U+9C46 # <cjk>
+3-7264 U+9C3E # <cjk>
+3-7265 U+9C5A # <cjk>
+3-7266 U+9C60 # <cjk>
+3-7267 U+9C67 # <cjk>
+3-7268 U+9C76 # <cjk>
+3-7269 U+9C78 # <cjk>
+3-726A U+9CE7 # <cjk>
+3-726B U+9CEC # <cjk>
+3-726C U+9CF0 # <cjk>
+3-726D U+9D09 # <cjk>
+3-726E U+9D08 # <cjk>
+3-726F U+9CEB # <cjk>
+3-7270 U+9D03 # <cjk>
+3-7271 U+9D06 # <cjk>
+3-7272 U+9D2A # <cjk>
+3-7273 U+9D26 # <cjk>
+3-7274 U+9DAF # <cjk>
+3-7275 U+9D23 # <cjk>
+3-7276 U+9D1F # <cjk>
+3-7277 U+9D44 # <cjk>
+3-7278 U+9D15 # <cjk>
+3-7279 U+9D12 # <cjk>
+3-727A U+9D41 # <cjk>
+3-727B U+9D3F # <cjk>
+3-727C U+9D3E # <cjk>
+3-727D U+9D46 # <cjk>
+3-727E U+9D48 # <cjk>
+3-7321 U+9D5D # <cjk>
+3-7322 U+9D5E # <cjk>
+3-7323 U+9D64 # <cjk>
+3-7324 U+9D51 # <cjk>
+3-7325 U+9D50 # <cjk>
+3-7326 U+9D59 # <cjk>
+3-7327 U+9D72 # <cjk>
+3-7328 U+9D89 # <cjk>
+3-7329 U+9D87 # <cjk>
+3-732A U+9DAB # <cjk>
+3-732B U+9D6F # <cjk>
+3-732C U+9D7A # <cjk>
+3-732D U+9D9A # <cjk>
+3-732E U+9DA4 # <cjk>
+3-732F U+9DA9 # <cjk>
+3-7330 U+9DB2 # <cjk>
+3-7331 U+9DC4 # <cjk>
+3-7332 U+9DC1 # <cjk>
+3-7333 U+9DBB # <cjk>
+3-7334 U+9DB8 # <cjk>
+3-7335 U+9DBA # <cjk>
+3-7336 U+9DC6 # <cjk>
+3-7337 U+9DCF # <cjk>
+3-7338 U+9DC2 # <cjk>
+3-7339 U+9DD9 # <cjk>
+3-733A U+9DD3 # <cjk>
+3-733B U+9DF8 # <cjk>
+3-733C U+9DE6 # <cjk>
+3-733D U+9DED # <cjk>
+3-733E U+9DEF # <cjk>
+3-733F U+9DFD # <cjk>
+3-7340 U+9E1A # <cjk>
+3-7341 U+9E1B # <cjk>
+3-7342 U+9E1E # <cjk>
+3-7343 U+9E75 # <cjk>
+3-7344 U+9E79 # <cjk>
+3-7345 U+9E7D # <cjk>
+3-7346 U+9E81 # <cjk>
+3-7347 U+9E88 # <cjk>
+3-7348 U+9E8B # <cjk>
+3-7349 U+9E8C # <cjk>
+3-734A U+9E92 # <cjk>
+3-734B U+9E95 # <cjk>
+3-734C U+9E91 # <cjk>
+3-734D U+9E9D # <cjk>
+3-734E U+9EA5 # <cjk>
+3-734F U+9EA9 # <cjk>
+3-7350 U+9EB8 # <cjk>
+3-7351 U+9EAA # <cjk>
+3-7352 U+9EAD # <cjk>
+3-7353 U+9761 # <cjk>
+3-7354 U+9ECC # <cjk>
+3-7355 U+9ECE # <cjk>
+3-7356 U+9ECF # <cjk>
+3-7357 U+9ED0 # <cjk>
+3-7358 U+9ED4 # <cjk>
+3-7359 U+9EDC # <cjk>
+3-735A U+9EDE # <cjk>
+3-735B U+9EDD # <cjk>
+3-735C U+9EE0 # <cjk>
+3-735D U+9EE5 # <cjk>
+3-735E U+9EE8 # <cjk>
+3-735F U+9EEF # <cjk>
+3-7360 U+9EF4 # <cjk>
+3-7361 U+9EF6 # <cjk>
+3-7362 U+9EF7 # <cjk>
+3-7363 U+9EF9 # <cjk>
+3-7364 U+9EFB # <cjk>
+3-7365 U+9EFC # <cjk>
+3-7366 U+9EFD # <cjk>
+3-7367 U+9F07 # <cjk>
+3-7368 U+9F08 # <cjk>
+3-7369 U+76B7 # <cjk>
+3-736A U+9F15 # <cjk>
+3-736B U+9F21 # <cjk>
+3-736C U+9F2C # <cjk>
+3-736D U+9F3E # <cjk>
+3-736E U+9F4A # <cjk>
+3-736F U+9F52 # <cjk>
+3-7370 U+9F54 # <cjk>
+3-7371 U+9F63 # <cjk>
+3-7372 U+9F5F # <cjk>
+3-7373 U+9F60 # <cjk>
+3-7374 U+9F61 # <cjk>
+3-7375 U+9F66 # <cjk>
+3-7376 U+9F67 # <cjk>
+3-7377 U+9F6C # <cjk>
+3-7378 U+9F6A # <cjk>
+3-7379 U+9F77 # <cjk>
+3-737A U+9F72 # <cjk>
+3-737B U+9F76 # <cjk>
+3-737C U+9F95 # <cjk>
+3-737D U+9F9C # <cjk>
+3-737E U+9FA0 # <cjk>
+3-7421 U+582F # <cjk> [1983]
+3-7422 U+69C7 # <cjk> [1983]
+3-7423 U+9059 # <cjk> [1983]
+3-7424 U+7464 # <cjk> [1983]
+3-7425 U+51DC # <cjk> [1990]
+3-7426 U+7199 # <cjk> [1990]
+3-7427 U+5653 # <cjk> [2004]
+3-7428 U+5DE2 # <cjk> [2000]
+3-7429 U+5E14 # <cjk> [2000]
+3-742A U+5E18 # <cjk> [2000]
+3-742B U+5E58 # <cjk> [2000]
+3-742C U+5E5E # <cjk> [2000]
+3-742D U+5EBE # <cjk> [2000]
+3-742E U+F928 # CJK COMPATIBILITY IDEOGRAPH-F928 [2000]
+3-742F U+5ECB # <cjk> [2000]
+3-7430 U+5EF9 # <cjk> [2000]
+3-7431 U+5F00 # <cjk> [2000]
+3-7432 U+5F02 # <cjk> [2000]
+3-7433 U+5F07 # <cjk> [2000]
+3-7434 U+5F1D # <cjk> [2000]
+3-7435 U+5F23 # <cjk> [2000]
+3-7436 U+5F34 # <cjk> [2000]
+3-7437 U+5F36 # <cjk> [2000]
+3-7438 U+5F3D # <cjk> [2000]
+3-7439 U+5F40 # <cjk> [2000]
+3-743A U+5F45 # <cjk> [2000]
+3-743B U+5F54 # <cjk> [2000]
+3-743C U+5F58 # <cjk> [2000]
+3-743D U+5F64 # <cjk> [2000]
+3-743E U+5F67 # <cjk> [2000]
+3-743F U+5F7D # <cjk> [2000]
+3-7440 U+5F89 # <cjk> [2000]
+3-7441 U+5F9C # <cjk> [2000]
+3-7442 U+5FA7 # <cjk> [2000]
+3-7443 U+5FAF # <cjk> [2000]
+3-7444 U+5FB5 # <cjk> [2000]
+3-7445 U+5FB7 # <cjk> [2000]
+3-7446 U+5FC9 # <cjk> [2000]
+3-7447 U+5FDE # <cjk> [2000]
+3-7448 U+5FE1 # <cjk> [2000]
+3-7449 U+5FE9 # <cjk> [2000]
+3-744A U+600D # <cjk> [2000]
+3-744B U+6014 # <cjk> [2000]
+3-744C U+6018 # <cjk> [2000]
+3-744D U+6033 # <cjk> [2000]
+3-744E U+6035 # <cjk> [2000]
+3-744F U+6047 # <cjk> [2000]
+3-7450 U+FA3D # CJK COMPATIBILITY IDEOGRAPH-FA3D [2000] [Unicode3.2]
+3-7451 U+609D # <cjk> [2000]
+3-7452 U+609E # <cjk> [2000]
+3-7453 U+60CB # <cjk> [2000]
+3-7454 U+60D4 # <cjk> [2000]
+3-7455 U+60D5 # <cjk> [2000]
+3-7456 U+60DD # <cjk> [2000]
+3-7457 U+60F8 # <cjk> [2000]
+3-7458 U+611C # <cjk> [2000]
+3-7459 U+612B # <cjk> [2000]
+3-745A U+6130 # <cjk> [2000]
+3-745B U+6137 # <cjk> [2000]
+3-745C U+FA3E # CJK COMPATIBILITY IDEOGRAPH-FA3E [2000] [Unicode3.2]
+3-745D U+618D # <cjk> [2000]
+3-745E U+FA3F # CJK COMPATIBILITY IDEOGRAPH-FA3F [2000] [Unicode3.2]
+3-745F U+61BC # <cjk> [2000]
+3-7460 U+61B9 # <cjk> [2000]
+3-7461 U+FA40 # CJK COMPATIBILITY IDEOGRAPH-FA40 [2000] [Unicode3.2]
+3-7462 U+6222 # <cjk> [2000]
+3-7463 U+623E # <cjk> [2000]
+3-7464 U+6243 # <cjk> [2000]
+3-7465 U+6256 # <cjk> [2000]
+3-7466 U+625A # <cjk> [2000]
+3-7467 U+626F # <cjk> [2000]
+3-7468 U+6285 # <cjk> [2000]
+3-7469 U+62C4 # <cjk> [2000]
+3-746A U+62D6 # <cjk> [2000]
+3-746B U+62FC # <cjk> [2000]
+3-746C U+630A # <cjk> [2000]
+3-746D U+6318 # <cjk> [2000]
+3-746E U+6339 # <cjk> [2000]
+3-746F U+6343 # <cjk> [2000]
+3-7470 U+6365 # <cjk> [2000]
+3-7471 U+637C # <cjk> [2000]
+3-7472 U+63E5 # <cjk> [2000]
+3-7473 U+63ED # <cjk> [2000]
+3-7474 U+63F5 # <cjk> [2000]
+3-7475 U+6410 # <cjk> [2000]
+3-7476 U+6414 # <cjk> [2000]
+3-7477 U+6422 # <cjk> [2000]
+3-7478 U+6479 # <cjk> [2000]
+3-7479 U+6451 # <cjk> [2000]
+3-747A U+6460 # <cjk> [2000]
+3-747B U+646D # <cjk> [2000]
+3-747C U+64CE # <cjk> [2000]
+3-747D U+64BE # <cjk> [2000]
+3-747E U+64BF # <cjk> [2000]
+3-7521 U+64C4 # <cjk> [2000]
+3-7522 U+64CA # <cjk> [2000]
+3-7523 U+64D0 # <cjk> [2000]
+3-7524 U+64F7 # <cjk> [2000]
+3-7525 U+64FB # <cjk> [2000]
+3-7526 U+6522 # <cjk> [2000]
+3-7527 U+6529 # <cjk> [2000]
+3-7528 U+FA41 # CJK COMPATIBILITY IDEOGRAPH-FA41 [2000] [Unicode3.2]
+3-7529 U+6567 # <cjk> [2000]
+3-752A U+659D # <cjk> [2000]
+3-752B U+FA42 # CJK COMPATIBILITY IDEOGRAPH-FA42 [2000] [Unicode3.2]
+3-752C U+6600 # <cjk> [2000]
+3-752D U+6609 # <cjk> [2000]
+3-752E U+6615 # <cjk> [2000]
+3-752F U+661E # <cjk> [2000]
+3-7530 U+663A # <cjk> [2000]
+3-7531 U+6622 # <cjk> [2000]
+3-7532 U+6624 # <cjk> [2000]
+3-7533 U+662B # <cjk> [2000]
+3-7534 U+6630 # <cjk> [2000]
+3-7535 U+6631 # <cjk> [2000]
+3-7536 U+6633 # <cjk> [2000]
+3-7537 U+66FB # <cjk> [2000]
+3-7538 U+6648 # <cjk> [2000]
+3-7539 U+664C # <cjk> [2000]
+3-753A U+231C4 # <cjk> [2000] [Unicode3.1]
+3-753B U+6659 # <cjk> [2000]
+3-753C U+665A # <cjk> [2000]
+3-753D U+6661 # <cjk> [2000]
+3-753E U+6665 # <cjk> [2000]
+3-753F U+6673 # <cjk> [2000]
+3-7540 U+6677 # <cjk> [2000]
+3-7541 U+6678 # <cjk> [2000]
+3-7542 U+668D # <cjk> [2000]
+3-7543 U+FA43 # CJK COMPATIBILITY IDEOGRAPH-FA43 [2000] [Unicode3.2]
+3-7544 U+66A0 # <cjk> [2000]
+3-7545 U+66B2 # <cjk> [2000]
+3-7546 U+66BB # <cjk> [2000]
+3-7547 U+66C6 # <cjk> [2000]
+3-7548 U+66C8 # <cjk> [2000]
+3-7549 U+3B22 # <cjk> [2000]
+3-754A U+66DB # <cjk> [2000]
+3-754B U+66E8 # <cjk> [2000]
+3-754C U+66FA # <cjk> [2000]
+3-754D U+6713 # <cjk> [2000]
+3-754E U+F929 # CJK COMPATIBILITY IDEOGRAPH-F929 [2000]
+3-754F U+6733 # <cjk> [2000]
+3-7550 U+6766 # <cjk> [2000]
+3-7551 U+6747 # <cjk> [2000]
+3-7552 U+6748 # <cjk> [2000]
+3-7553 U+677B # <cjk> [2000]
+3-7554 U+6781 # <cjk> [2000]
+3-7555 U+6793 # <cjk> [2000]
+3-7556 U+6798 # <cjk> [2000]
+3-7557 U+679B # <cjk> [2000]
+3-7558 U+67BB # <cjk> [2000]
+3-7559 U+67F9 # <cjk> [2000]
+3-755A U+67C0 # <cjk> [2000]
+3-755B U+67D7 # <cjk> [2000]
+3-755C U+67FC # <cjk> [2000]
+3-755D U+6801 # <cjk> [2000]
+3-755E U+6852 # <cjk> [2000]
+3-755F U+681D # <cjk> [2000]
+3-7560 U+682C # <cjk> [2000]
+3-7561 U+6831 # <cjk> [2000]
+3-7562 U+685B # <cjk> [2000]
+3-7563 U+6872 # <cjk> [2000]
+3-7564 U+6875 # <cjk> [2000]
+3-7565 U+FA44 # CJK COMPATIBILITY IDEOGRAPH-FA44 [2000] [Unicode3.2]
+3-7566 U+68A3 # <cjk> [2000]
+3-7567 U+68A5 # <cjk> [2000]
+3-7568 U+68B2 # <cjk> [2000]
+3-7569 U+68C8 # <cjk> [2000]
+3-756A U+68D0 # <cjk> [2000]
+3-756B U+68E8 # <cjk> [2000]
+3-756C U+68ED # <cjk> [2000]
+3-756D U+68F0 # <cjk> [2000]
+3-756E U+68F1 # <cjk> [2000]
+3-756F U+68FC # <cjk> [2000]
+3-7570 U+690A # <cjk> [2000]
+3-7571 U+6949 # <cjk> [2000]
+3-7572 U+235C4 # <cjk> [2000] [Unicode3.1]
+3-7573 U+6935 # <cjk> [2000]
+3-7574 U+6942 # <cjk> [2000]
+3-7575 U+6957 # <cjk> [2000]
+3-7576 U+6963 # <cjk> [2000]
+3-7577 U+6964 # <cjk> [2000]
+3-7578 U+6968 # <cjk> [2000]
+3-7579 U+6980 # <cjk> [2000]
+3-757A U+FA14 # CJK COMPATIBILITY IDEOGRAPH-FA14 [2000]
+3-757B U+69A5 # <cjk> [2000]
+3-757C U+69AD # <cjk> [2000]
+3-757D U+69CF # <cjk> [2000]
+3-757E U+3BB6 # <cjk> [2000]
+3-7621 U+3BC3 # <cjk> [2000]
+3-7622 U+69E2 # <cjk> [2000]
+3-7623 U+69E9 # <cjk> [2000]
+3-7624 U+69EA # <cjk> [2000]
+3-7625 U+69F5 # <cjk> [2000]
+3-7626 U+69F6 # <cjk> [2000]
+3-7627 U+6A0F # <cjk> [2000]
+3-7628 U+6A15 # <cjk> [2000]
+3-7629 U+2373F # <cjk> [2000] [Unicode3.1]
+3-762A U+6A3B # <cjk> [2000]
+3-762B U+6A3E # <cjk> [2000]
+3-762C U+6A45 # <cjk> [2000]
+3-762D U+6A50 # <cjk> [2000]
+3-762E U+6A56 # <cjk> [2000]
+3-762F U+6A5B # <cjk> [2000]
+3-7630 U+6A6B # <cjk> [2000]
+3-7631 U+6A73 # <cjk> [2000]
+3-7632 U+23763 # <cjk> [2000] [Unicode3.1]
+3-7633 U+6A89 # <cjk> [2000]
+3-7634 U+6A94 # <cjk> [2000]
+3-7635 U+6A9D # <cjk> [2000]
+3-7636 U+6A9E # <cjk> [2000]
+3-7637 U+6AA5 # <cjk> [2000]
+3-7638 U+6AE4 # <cjk> [2000]
+3-7639 U+6AE7 # <cjk> [2000]
+3-763A U+3C0F # <cjk> [2000]
+3-763B U+F91D # CJK COMPATIBILITY IDEOGRAPH-F91D [2000]
+3-763C U+6B1B # <cjk> [2000]
+3-763D U+6B1E # <cjk> [2000]
+3-763E U+6B2C # <cjk> [2000]
+3-763F U+6B35 # <cjk> [2000]
+3-7640 U+6B46 # <cjk> [2000]
+3-7641 U+6B56 # <cjk> [2000]
+3-7642 U+6B60 # <cjk> [2000]
+3-7643 U+6B65 # <cjk> [2000]
+3-7644 U+6B67 # <cjk> [2000]
+3-7645 U+6B77 # <cjk> [2000]
+3-7646 U+6B82 # <cjk> [2000]
+3-7647 U+6BA9 # <cjk> [2000]
+3-7648 U+6BAD # <cjk> [2000]
+3-7649 U+F970 # CJK COMPATIBILITY IDEOGRAPH-F970 [2000]
+3-764A U+6BCF # <cjk> [2000]
+3-764B U+6BD6 # <cjk> [2000]
+3-764C U+6BD7 # <cjk> [2000]
+3-764D U+6BFF # <cjk> [2000]
+3-764E U+6C05 # <cjk> [2000]
+3-764F U+6C10 # <cjk> [2000]
+3-7650 U+6C33 # <cjk> [2000]
+3-7651 U+6C59 # <cjk> [2000]
+3-7652 U+6C5C # <cjk> [2000]
+3-7653 U+6CAA # <cjk> [2000]
+3-7654 U+6C74 # <cjk> [2000]
+3-7655 U+6C76 # <cjk> [2000]
+3-7656 U+6C85 # <cjk> [2000]
+3-7657 U+6C86 # <cjk> [2000]
+3-7658 U+6C98 # <cjk> [2000]
+3-7659 U+6C9C # <cjk> [2000]
+3-765A U+6CFB # <cjk> [2000]
+3-765B U+6CC6 # <cjk> [2000]
+3-765C U+6CD4 # <cjk> [2000]
+3-765D U+6CE0 # <cjk> [2000]
+3-765E U+6CEB # <cjk> [2000]
+3-765F U+6CEE # <cjk> [2000]
+3-7660 U+23CFE # <cjk> [2000] [Unicode3.1]
+3-7661 U+6D04 # <cjk> [2000]
+3-7662 U+6D0E # <cjk> [2000]
+3-7663 U+6D2E # <cjk> [2000]
+3-7664 U+6D31 # <cjk> [2000]
+3-7665 U+6D39 # <cjk> [2000]
+3-7666 U+6D3F # <cjk> [2000]
+3-7667 U+6D58 # <cjk> [2000]
+3-7668 U+6D65 # <cjk> [2000]
+3-7669 U+FA45 # CJK COMPATIBILITY IDEOGRAPH-FA45 [2000] [Unicode3.2]
+3-766A U+6D82 # <cjk> [2000]
+3-766B U+6D87 # <cjk> [2000]
+3-766C U+6D89 # <cjk> [2000]
+3-766D U+6D94 # <cjk> [2000]
+3-766E U+6DAA # <cjk> [2000]
+3-766F U+6DAC # <cjk> [2000]
+3-7670 U+6DBF # <cjk> [2000]
+3-7671 U+6DC4 # <cjk> [2000]
+3-7672 U+6DD6 # <cjk> [2000]
+3-7673 U+6DDA # <cjk> [2000]
+3-7674 U+6DDB # <cjk> [2000]
+3-7675 U+6DDD # <cjk> [2000]
+3-7676 U+6DFC # <cjk> [2000]
+3-7677 U+FA46 # CJK COMPATIBILITY IDEOGRAPH-FA46 [2000] [Unicode3.2]
+3-7678 U+6E34 # <cjk> [2000]
+3-7679 U+6E44 # <cjk> [2000]
+3-767A U+6E5C # <cjk> [2000]
+3-767B U+6E5E # <cjk> [2000]
+3-767C U+6EAB # <cjk> [2000]
+3-767D U+6EB1 # <cjk> [2000]
+3-767E U+6EC1 # <cjk> [2000]
+3-7721 U+6EC7 # <cjk> [2000]
+3-7722 U+6ECE # <cjk> [2000]
+3-7723 U+6F10 # <cjk> [2000]
+3-7724 U+6F1A # <cjk> [2000]
+3-7725 U+FA47 # CJK COMPATIBILITY IDEOGRAPH-FA47 [2000] [Unicode3.2]
+3-7726 U+6F2A # <cjk> [2000]
+3-7727 U+6F2F # <cjk> [2000]
+3-7728 U+6F33 # <cjk> [2000]
+3-7729 U+6F51 # <cjk> [2000]
+3-772A U+6F59 # <cjk> [2000]
+3-772B U+6F5E # <cjk> [2000]
+3-772C U+6F61 # <cjk> [2000]
+3-772D U+6F62 # <cjk> [2000]
+3-772E U+6F7E # <cjk> [2000]
+3-772F U+6F88 # <cjk> [2000]
+3-7730 U+6F8C # <cjk> [2000]
+3-7731 U+6F8D # <cjk> [2000]
+3-7732 U+6F94 # <cjk> [2000]
+3-7733 U+6FA0 # <cjk> [2000]
+3-7734 U+6FA7 # <cjk> [2000]
+3-7735 U+6FB6 # <cjk> [2000]
+3-7736 U+6FBC # <cjk> [2000]
+3-7737 U+6FC7 # <cjk> [2000]
+3-7738 U+6FCA # <cjk> [2000]
+3-7739 U+6FF9 # <cjk> [2000]
+3-773A U+6FF0 # <cjk> [2000]
+3-773B U+6FF5 # <cjk> [2000]
+3-773C U+7005 # <cjk> [2000]
+3-773D U+7006 # <cjk> [2000]
+3-773E U+7028 # <cjk> [2000]
+3-773F U+704A # <cjk> [2000]
+3-7740 U+705D # <cjk> [2000]
+3-7741 U+705E # <cjk> [2000]
+3-7742 U+704E # <cjk> [2000]
+3-7743 U+7064 # <cjk> [2000]
+3-7744 U+7075 # <cjk> [2000]
+3-7745 U+7085 # <cjk> [2000]
+3-7746 U+70A4 # <cjk> [2000]
+3-7747 U+70AB # <cjk> [2000]
+3-7748 U+70B7 # <cjk> [2000]
+3-7749 U+70D4 # <cjk> [2000]
+3-774A U+70D8 # <cjk> [2000]
+3-774B U+70E4 # <cjk> [2000]
+3-774C U+710F # <cjk> [2000]
+3-774D U+712B # <cjk> [2000]
+3-774E U+711E # <cjk> [2000]
+3-774F U+7120 # <cjk> [2000]
+3-7750 U+712E # <cjk> [2000]
+3-7751 U+7130 # <cjk> [2000]
+3-7752 U+7146 # <cjk> [2000]
+3-7753 U+7147 # <cjk> [2000]
+3-7754 U+7151 # <cjk> [2000]
+3-7755 U+FA48 # CJK COMPATIBILITY IDEOGRAPH-FA48 [2000] [Unicode3.2]
+3-7756 U+7152 # <cjk> [2000]
+3-7757 U+715C # <cjk> [2000]
+3-7758 U+7160 # <cjk> [2000]
+3-7759 U+7168 # <cjk> [2000]
+3-775A U+FA15 # CJK COMPATIBILITY IDEOGRAPH-FA15 [2000]
+3-775B U+7185 # <cjk> [2000]
+3-775C U+7187 # <cjk> [2000]
+3-775D U+7192 # <cjk> [2000]
+3-775E U+71C1 # <cjk> [2000]
+3-775F U+71BA # <cjk> [2000]
+3-7760 U+71C4 # <cjk> [2000]
+3-7761 U+71FE # <cjk> [2000]
+3-7762 U+7200 # <cjk> [2000]
+3-7763 U+7215 # <cjk> [2000]
+3-7764 U+7255 # <cjk> [2000]
+3-7765 U+7256 # <cjk> [2000]
+3-7766 U+3E3F # <cjk> [2000]
+3-7767 U+728D # <cjk> [2000]
+3-7768 U+729B # <cjk> [2000]
+3-7769 U+72BE # <cjk> [2000]
+3-776A U+72C0 # <cjk> [2000]
+3-776B U+72FB # <cjk> [2000]
+3-776C U+247F1 # <cjk> [2000] [Unicode3.1]
+3-776D U+7327 # <cjk> [2000]
+3-776E U+7328 # <cjk> [2000]
+3-776F U+FA16 # CJK COMPATIBILITY IDEOGRAPH-FA16 [2000]
+3-7770 U+7350 # <cjk> [2000]
+3-7771 U+7366 # <cjk> [2000]
+3-7772 U+737C # <cjk> [2000]
+3-7773 U+7395 # <cjk> [2000]
+3-7774 U+739F # <cjk> [2000]
+3-7775 U+73A0 # <cjk> [2000]
+3-7776 U+73A2 # <cjk> [2000]
+3-7777 U+73A6 # <cjk> [2000]
+3-7778 U+73AB # <cjk> [2000]
+3-7779 U+73C9 # <cjk> [2000]
+3-777A U+73CF # <cjk> [2000]
+3-777B U+73D6 # <cjk> [2000]
+3-777C U+73D9 # <cjk> [2000]
+3-777D U+73E3 # <cjk> [2000]
+3-777E U+73E9 # <cjk> [2000]
+3-7821 U+7407 # <cjk> [2000]
+3-7822 U+740A # <cjk> [2000]
+3-7823 U+741A # <cjk> [2000]
+3-7824 U+741B # <cjk> [2000]
+3-7825 U+FA4A # CJK COMPATIBILITY IDEOGRAPH-FA4A [2000] [Unicode3.2]
+3-7826 U+7426 # <cjk> [2000]
+3-7827 U+7428 # <cjk> [2000]
+3-7828 U+742A # <cjk> [2000]
+3-7829 U+742B # <cjk> [2000]
+3-782A U+742C # <cjk> [2000]
+3-782B U+742E # <cjk> [2000]
+3-782C U+742F # <cjk> [2000]
+3-782D U+7430 # <cjk> [2000]
+3-782E U+7444 # <cjk> [2000]
+3-782F U+7446 # <cjk> [2000]
+3-7830 U+7447 # <cjk> [2000]
+3-7831 U+744B # <cjk> [2000]
+3-7832 U+7457 # <cjk> [2000]
+3-7833 U+7462 # <cjk> [2000]
+3-7834 U+746B # <cjk> [2000]
+3-7835 U+746D # <cjk> [2000]
+3-7836 U+7486 # <cjk> [2000]
+3-7837 U+7487 # <cjk> [2000]
+3-7838 U+7489 # <cjk> [2000]
+3-7839 U+7498 # <cjk> [2000]
+3-783A U+749C # <cjk> [2000]
+3-783B U+749F # <cjk> [2000]
+3-783C U+74A3 # <cjk> [2000]
+3-783D U+7490 # <cjk> [2000]
+3-783E U+74A6 # <cjk> [2000]
+3-783F U+74A8 # <cjk> [2000]
+3-7840 U+74A9 # <cjk> [2000]
+3-7841 U+74B5 # <cjk> [2000]
+3-7842 U+74BF # <cjk> [2000]
+3-7843 U+74C8 # <cjk> [2000]
+3-7844 U+74C9 # <cjk> [2000]
+3-7845 U+74DA # <cjk> [2000]
+3-7846 U+74FF # <cjk> [2000]
+3-7847 U+7501 # <cjk> [2000]
+3-7848 U+7517 # <cjk> [2000]
+3-7849 U+752F # <cjk> [2000]
+3-784A U+756F # <cjk> [2000]
+3-784B U+7579 # <cjk> [2000]
+3-784C U+7592 # <cjk> [2000]
+3-784D U+3F72 # <cjk> [2000]
+3-784E U+75CE # <cjk> [2000]
+3-784F U+75E4 # <cjk> [2000]
+3-7850 U+7600 # <cjk> [2000]
+3-7851 U+7602 # <cjk> [2000]
+3-7852 U+7608 # <cjk> [2000]
+3-7853 U+7615 # <cjk> [2000]
+3-7854 U+7616 # <cjk> [2000]
+3-7855 U+7619 # <cjk> [2000]
+3-7856 U+761E # <cjk> [2000]
+3-7857 U+762D # <cjk> [2000]
+3-7858 U+7635 # <cjk> [2000]
+3-7859 U+7643 # <cjk> [2000]
+3-785A U+764B # <cjk> [2000]
+3-785B U+7664 # <cjk> [2000]
+3-785C U+7665 # <cjk> [2000]
+3-785D U+766D # <cjk> [2000]
+3-785E U+766F # <cjk> [2000]
+3-785F U+7671 # <cjk> [2000]
+3-7860 U+7681 # <cjk> [2000]
+3-7861 U+769B # <cjk> [2000]
+3-7862 U+769D # <cjk> [2000]
+3-7863 U+769E # <cjk> [2000]
+3-7864 U+76A6 # <cjk> [2000]
+3-7865 U+76AA # <cjk> [2000]
+3-7866 U+76B6 # <cjk> [2000]
+3-7867 U+76C5 # <cjk> [2000]
+3-7868 U+76CC # <cjk> [2000]
+3-7869 U+76CE # <cjk> [2000]
+3-786A U+76D4 # <cjk> [2000]
+3-786B U+76E6 # <cjk> [2000]
+3-786C U+76F1 # <cjk> [2000]
+3-786D U+76FC # <cjk> [2000]
+3-786E U+770A # <cjk> [2000]
+3-786F U+7719 # <cjk> [2000]
+3-7870 U+7734 # <cjk> [2000]
+3-7871 U+7736 # <cjk> [2000]
+3-7872 U+7746 # <cjk> [2000]
+3-7873 U+774D # <cjk> [2000]
+3-7874 U+774E # <cjk> [2000]
+3-7875 U+775C # <cjk> [2000]
+3-7876 U+775F # <cjk> [2000]
+3-7877 U+7762 # <cjk> [2000]
+3-7878 U+777A # <cjk> [2000]
+3-7879 U+7780 # <cjk> [2000]
+3-787A U+7794 # <cjk> [2000]
+3-787B U+77AA # <cjk> [2000]
+3-787C U+77E0 # <cjk> [2000]
+3-787D U+782D # <cjk> [2000]
+3-787E U+2548E # <cjk> [2000] [Unicode3.1]
+3-7921 U+7843 # <cjk> [2000]
+3-7922 U+784E # <cjk> [2000]
+3-7923 U+784F # <cjk> [2000]
+3-7924 U+7851 # <cjk> [2000]
+3-7925 U+7868 # <cjk> [2000]
+3-7926 U+786E # <cjk> [2000]
+3-7927 U+FA4B # CJK COMPATIBILITY IDEOGRAPH-FA4B [2000] [Unicode3.2]
+3-7928 U+78B0 # <cjk> [2000]
+3-7929 U+2550E # <cjk> [2000] [Unicode3.1]
+3-792A U+78AD # <cjk> [2000]
+3-792B U+78E4 # <cjk> [2000]
+3-792C U+78F2 # <cjk> [2000]
+3-792D U+7900 # <cjk> [2000]
+3-792E U+78F7 # <cjk> [2000]
+3-792F U+791C # <cjk> [2000]
+3-7930 U+792E # <cjk> [2000]
+3-7931 U+7931 # <cjk> [2000]
+3-7932 U+7934 # <cjk> [2000]
+3-7933 U+FA4C # CJK COMPATIBILITY IDEOGRAPH-FA4C [2000] [Unicode3.2]
+3-7934 U+FA4D # CJK COMPATIBILITY IDEOGRAPH-FA4D [2000] [Unicode3.2]
+3-7935 U+7945 # <cjk> [2000]
+3-7936 U+7946 # <cjk> [2000]
+3-7937 U+FA4E # CJK COMPATIBILITY IDEOGRAPH-FA4E [2000] [Unicode3.2]
+3-7938 U+FA4F # CJK COMPATIBILITY IDEOGRAPH-FA4F [2000] [Unicode3.2]
+3-7939 U+FA50 # CJK COMPATIBILITY IDEOGRAPH-FA50 [2000] [Unicode3.2]
+3-793A U+795C # <cjk> [2000]
+3-793B U+FA51 # CJK COMPATIBILITY IDEOGRAPH-FA51 [2000] [Unicode3.2]
+3-793C U+FA19 # CJK COMPATIBILITY IDEOGRAPH-FA19 [2000]
+3-793D U+FA1A # CJK COMPATIBILITY IDEOGRAPH-FA1A [2000]
+3-793E U+7979 # <cjk> [2000]
+3-793F U+FA52 # CJK COMPATIBILITY IDEOGRAPH-FA52 [2000] [Unicode3.2]
+3-7940 U+FA53 # CJK COMPATIBILITY IDEOGRAPH-FA53 [2000] [Unicode3.2]
+3-7941 U+FA1B # CJK COMPATIBILITY IDEOGRAPH-FA1B [2000]
+3-7942 U+7998 # <cjk> [2000]
+3-7943 U+79B1 # <cjk> [2000]
+3-7944 U+79B8 # <cjk> [2000]
+3-7945 U+79C8 # <cjk> [2000]
+3-7946 U+79CA # <cjk> [2000]
+3-7947 U+25771 # <cjk> [2000] [Unicode3.1]
+3-7948 U+79D4 # <cjk> [2000]
+3-7949 U+79DE # <cjk> [2000]
+3-794A U+79EB # <cjk> [2000]
+3-794B U+79ED # <cjk> [2000]
+3-794C U+7A03 # <cjk> [2000]
+3-794D U+FA54 # CJK COMPATIBILITY IDEOGRAPH-FA54 [2000] [Unicode3.2]
+3-794E U+7A39 # <cjk> [2000]
+3-794F U+7A5D # <cjk> [2000]
+3-7950 U+7A6D # <cjk> [2000]
+3-7951 U+FA55 # CJK COMPATIBILITY IDEOGRAPH-FA55 [2000] [Unicode3.2]
+3-7952 U+7A85 # <cjk> [2000]
+3-7953 U+7AA0 # <cjk> [2000]
+3-7954 U+259C4 # <cjk> [2000] [Unicode3.1]
+3-7955 U+7AB3 # <cjk> [2000]
+3-7956 U+7ABB # <cjk> [2000]
+3-7957 U+7ACE # <cjk> [2000]
+3-7958 U+7AEB # <cjk> [2000]
+3-7959 U+7AFD # <cjk> [2000]
+3-795A U+7B12 # <cjk> [2000]
+3-795B U+7B2D # <cjk> [2000]
+3-795C U+7B3B # <cjk> [2000]
+3-795D U+7B47 # <cjk> [2000]
+3-795E U+7B4E # <cjk> [2000]
+3-795F U+7B60 # <cjk> [2000]
+3-7960 U+7B6D # <cjk> [2000]
+3-7961 U+7B6F # <cjk> [2000]
+3-7962 U+7B72 # <cjk> [2000]
+3-7963 U+7B9E # <cjk> [2000]
+3-7964 U+FA56 # CJK COMPATIBILITY IDEOGRAPH-FA56 [2000] [Unicode3.2]
+3-7965 U+7BD7 # <cjk> [2000]
+3-7966 U+7BD9 # <cjk> [2000]
+3-7967 U+7C01 # <cjk> [2000]
+3-7968 U+7C31 # <cjk> [2000]
+3-7969 U+7C1E # <cjk> [2000]
+3-796A U+7C20 # <cjk> [2000]
+3-796B U+7C33 # <cjk> [2000]
+3-796C U+7C36 # <cjk> [2000]
+3-796D U+4264 # <cjk> [2000]
+3-796E U+25DA1 # <cjk> [2000] [Unicode3.1]
+3-796F U+7C59 # <cjk> [2000]
+3-7970 U+7C6D # <cjk> [2000]
+3-7971 U+7C79 # <cjk> [2000]
+3-7972 U+7C8F # <cjk> [2000]
+3-7973 U+7C94 # <cjk> [2000]
+3-7974 U+7CA0 # <cjk> [2000]
+3-7975 U+7CBC # <cjk> [2000]
+3-7976 U+7CD5 # <cjk> [2000]
+3-7977 U+7CD9 # <cjk> [2000]
+3-7978 U+7CDD # <cjk> [2000]
+3-7979 U+7D07 # <cjk> [2000]
+3-797A U+7D08 # <cjk> [2000]
+3-797B U+7D13 # <cjk> [2000]
+3-797C U+7D1D # <cjk> [2000]
+3-797D U+7D23 # <cjk> [2000]
+3-797E U+7D31 # <cjk> [2000]
+3-7A21 U+7D41 # <cjk> [2000]
+3-7A22 U+7D48 # <cjk> [2000]
+3-7A23 U+7D53 # <cjk> [2000]
+3-7A24 U+7D5C # <cjk> [2000]
+3-7A25 U+7D7A # <cjk> [2000]
+3-7A26 U+7D83 # <cjk> [2000]
+3-7A27 U+7D8B # <cjk> [2000]
+3-7A28 U+7DA0 # <cjk> [2000]
+3-7A29 U+7DA6 # <cjk> [2000]
+3-7A2A U+7DC2 # <cjk> [2000]
+3-7A2B U+7DCC # <cjk> [2000]
+3-7A2C U+7DD6 # <cjk> [2000]
+3-7A2D U+7DE3 # <cjk> [2000]
+3-7A2E U+FA57 # CJK COMPATIBILITY IDEOGRAPH-FA57 [2000] [Unicode3.2]
+3-7A2F U+7E28 # <cjk> [2000]
+3-7A30 U+7E08 # <cjk> [2000]
+3-7A31 U+7E11 # <cjk> [2000]
+3-7A32 U+7E15 # <cjk> [2000]
+3-7A33 U+FA59 # CJK COMPATIBILITY IDEOGRAPH-FA59 [2000] [Unicode3.2]
+3-7A34 U+7E47 # <cjk> [2000]
+3-7A35 U+7E52 # <cjk> [2000]
+3-7A36 U+7E61 # <cjk> [2000]
+3-7A37 U+7E8A # <cjk> [2000]
+3-7A38 U+7E8D # <cjk> [2000]
+3-7A39 U+7F47 # <cjk> [2000]
+3-7A3A U+FA5A # CJK COMPATIBILITY IDEOGRAPH-FA5A [2000] [Unicode3.2]
+3-7A3B U+7F91 # <cjk> [2000]
+3-7A3C U+7F97 # <cjk> [2000]
+3-7A3D U+7FBF # <cjk> [2000]
+3-7A3E U+7FCE # <cjk> [2000]
+3-7A3F U+7FDB # <cjk> [2000]
+3-7A40 U+7FDF # <cjk> [2000]
+3-7A41 U+7FEC # <cjk> [2000]
+3-7A42 U+7FEE # <cjk> [2000]
+3-7A43 U+7FFA # <cjk> [2000]
+3-7A44 U+FA5B # CJK COMPATIBILITY IDEOGRAPH-FA5B [2000] [Unicode3.2]
+3-7A45 U+8014 # <cjk> [2000]
+3-7A46 U+8026 # <cjk> [2000]
+3-7A47 U+8035 # <cjk> [2000]
+3-7A48 U+8037 # <cjk> [2000]
+3-7A49 U+803C # <cjk> [2000]
+3-7A4A U+80CA # <cjk> [2000]
+3-7A4B U+80D7 # <cjk> [2000]
+3-7A4C U+80E0 # <cjk> [2000]
+3-7A4D U+80F3 # <cjk> [2000]
+3-7A4E U+8118 # <cjk> [2000]
+3-7A4F U+814A # <cjk> [2000]
+3-7A50 U+8160 # <cjk> [2000]
+3-7A51 U+8167 # <cjk> [2000]
+3-7A52 U+8168 # <cjk> [2000]
+3-7A53 U+816D # <cjk> [2000]
+3-7A54 U+81BB # <cjk> [2000]
+3-7A55 U+81CA # <cjk> [2000]
+3-7A56 U+81CF # <cjk> [2000]
+3-7A57 U+81D7 # <cjk> [2000]
+3-7A58 U+FA5C # CJK COMPATIBILITY IDEOGRAPH-FA5C [2000] [Unicode3.2]
+3-7A59 U+4453 # <cjk> [2000]
+3-7A5A U+445B # <cjk> [2000]
+3-7A5B U+8260 # <cjk> [2000]
+3-7A5C U+8274 # <cjk> [2000]
+3-7A5D U+26AFF # <cjk> [2000] [Unicode3.1]
+3-7A5E U+828E # <cjk> [2000]
+3-7A5F U+82A1 # <cjk> [2000]
+3-7A60 U+82A3 # <cjk> [2000]
+3-7A61 U+82A4 # <cjk> [2000]
+3-7A62 U+82A9 # <cjk> [2000]
+3-7A63 U+82AE # <cjk> [2000]
+3-7A64 U+82B7 # <cjk> [2000]
+3-7A65 U+82BE # <cjk> [2000]
+3-7A66 U+82BF # <cjk> [2000]
+3-7A67 U+82C6 # <cjk> [2000]
+3-7A68 U+82D5 # <cjk> [2000]
+3-7A69 U+82FD # <cjk> [2000]
+3-7A6A U+82FE # <cjk> [2000]
+3-7A6B U+8300 # <cjk> [2000]
+3-7A6C U+8301 # <cjk> [2000]
+3-7A6D U+8362 # <cjk> [2000]
+3-7A6E U+8322 # <cjk> [2000]
+3-7A6F U+832D # <cjk> [2000]
+3-7A70 U+833A # <cjk> [2000]
+3-7A71 U+8343 # <cjk> [2000]
+3-7A72 U+8347 # <cjk> [2000]
+3-7A73 U+8351 # <cjk> [2000]
+3-7A74 U+8355 # <cjk> [2000]
+3-7A75 U+837D # <cjk> [2000]
+3-7A76 U+8386 # <cjk> [2000]
+3-7A77 U+8392 # <cjk> [2000]
+3-7A78 U+8398 # <cjk> [2000]
+3-7A79 U+83A7 # <cjk> [2000]
+3-7A7A U+83A9 # <cjk> [2000]
+3-7A7B U+83BF # <cjk> [2000]
+3-7A7C U+83C0 # <cjk> [2000]
+3-7A7D U+83C7 # <cjk> [2000]
+3-7A7E U+83CF # <cjk> [2000]
+3-7B21 U+83D1 # <cjk> [2000]
+3-7B22 U+83E1 # <cjk> [2000]
+3-7B23 U+83EA # <cjk> [2000]
+3-7B24 U+8401 # <cjk> [2000]
+3-7B25 U+8406 # <cjk> [2000]
+3-7B26 U+840A # <cjk> [2000]
+3-7B27 U+FA5F # CJK COMPATIBILITY IDEOGRAPH-FA5F [2000] [Unicode3.2]
+3-7B28 U+8448 # <cjk> [2000]
+3-7B29 U+845F # <cjk> [2000]
+3-7B2A U+8470 # <cjk> [2000]
+3-7B2B U+8473 # <cjk> [2000]
+3-7B2C U+8485 # <cjk> [2000]
+3-7B2D U+849E # <cjk> [2000]
+3-7B2E U+84AF # <cjk> [2000]
+3-7B2F U+84B4 # <cjk> [2000]
+3-7B30 U+84BA # <cjk> [2000]
+3-7B31 U+84C0 # <cjk> [2000]
+3-7B32 U+84C2 # <cjk> [2000]
+3-7B33 U+26E40 # <cjk> [2000] [Unicode3.1]
+3-7B34 U+8532 # <cjk> [2000]
+3-7B35 U+851E # <cjk> [2000]
+3-7B36 U+8523 # <cjk> [2000]
+3-7B37 U+852F # <cjk> [2000]
+3-7B38 U+8559 # <cjk> [2000]
+3-7B39 U+8564 # <cjk> [2000]
+3-7B3A U+FA1F # CJK COMPATIBILITY IDEOGRAPH-FA1F [2000]
+3-7B3B U+85AD # <cjk> [2000]
+3-7B3C U+857A # <cjk> [2000]
+3-7B3D U+858C # <cjk> [2000]
+3-7B3E U+858F # <cjk> [2000]
+3-7B3F U+85A2 # <cjk> [2000]
+3-7B40 U+85B0 # <cjk> [2000]
+3-7B41 U+85CB # <cjk> [2000]
+3-7B42 U+85CE # <cjk> [2000]
+3-7B43 U+85ED # <cjk> [2000]
+3-7B44 U+8612 # <cjk> [2000]
+3-7B45 U+85FF # <cjk> [2000]
+3-7B46 U+8604 # <cjk> [2000]
+3-7B47 U+8605 # <cjk> [2000]
+3-7B48 U+8610 # <cjk> [2000]
+3-7B49 U+270F4 # <cjk> [2000] [Unicode3.1]
+3-7B4A U+8618 # <cjk> [2000]
+3-7B4B U+8629 # <cjk> [2000]
+3-7B4C U+8638 # <cjk> [2000]
+3-7B4D U+8657 # <cjk> [2000]
+3-7B4E U+865B # <cjk> [2000]
+3-7B4F U+F936 # CJK COMPATIBILITY IDEOGRAPH-F936 [2000]
+3-7B50 U+8662 # <cjk> [2000]
+3-7B51 U+459D # <cjk> [2000]
+3-7B52 U+866C # <cjk> [2000]
+3-7B53 U+8675 # <cjk> [2000]
+3-7B54 U+8698 # <cjk> [2000]
+3-7B55 U+86B8 # <cjk> [2000]
+3-7B56 U+86FA # <cjk> [2000]
+3-7B57 U+86FC # <cjk> [2000]
+3-7B58 U+86FD # <cjk> [2000]
+3-7B59 U+870B # <cjk> [2000]
+3-7B5A U+8771 # <cjk> [2000]
+3-7B5B U+8787 # <cjk> [2000]
+3-7B5C U+8788 # <cjk> [2000]
+3-7B5D U+87AC # <cjk> [2000]
+3-7B5E U+87AD # <cjk> [2000]
+3-7B5F U+87B5 # <cjk> [2000]
+3-7B60 U+45EA # <cjk> [2000]
+3-7B61 U+87D6 # <cjk> [2000]
+3-7B62 U+87EC # <cjk> [2000]
+3-7B63 U+8806 # <cjk> [2000]
+3-7B64 U+880A # <cjk> [2000]
+3-7B65 U+8810 # <cjk> [2000]
+3-7B66 U+8814 # <cjk> [2000]
+3-7B67 U+881F # <cjk> [2000]
+3-7B68 U+8898 # <cjk> [2000]
+3-7B69 U+88AA # <cjk> [2000]
+3-7B6A U+88CA # <cjk> [2000]
+3-7B6B U+88CE # <cjk> [2000]
+3-7B6C U+27684 # <cjk> [2000] [Unicode3.1]
+3-7B6D U+88F5 # <cjk> [2000]
+3-7B6E U+891C # <cjk> [2000]
+3-7B6F U+FA60 # CJK COMPATIBILITY IDEOGRAPH-FA60 [2000] [Unicode3.2]
+3-7B70 U+8918 # <cjk> [2000]
+3-7B71 U+8919 # <cjk> [2000]
+3-7B72 U+891A # <cjk> [2000]
+3-7B73 U+8927 # <cjk> [2000]
+3-7B74 U+8930 # <cjk> [2000]
+3-7B75 U+8932 # <cjk> [2000]
+3-7B76 U+8939 # <cjk> [2000]
+3-7B77 U+8940 # <cjk> [2000]
+3-7B78 U+8994 # <cjk> [2000]
+3-7B79 U+FA61 # CJK COMPATIBILITY IDEOGRAPH-FA61 [2000] [Unicode3.2]
+3-7B7A U+89D4 # <cjk> [2000]
+3-7B7B U+89E5 # <cjk> [2000]
+3-7B7C U+89F6 # <cjk> [2000]
+3-7B7D U+8A12 # <cjk> [2000]
+3-7B7E U+8A15 # <cjk> [2000]
+3-7C21 U+8A22 # <cjk> [2000]
+3-7C22 U+8A37 # <cjk> [2000]
+3-7C23 U+8A47 # <cjk> [2000]
+3-7C24 U+8A4E # <cjk> [2000]
+3-7C25 U+8A5D # <cjk> [2000]
+3-7C26 U+8A61 # <cjk> [2000]
+3-7C27 U+8A75 # <cjk> [2000]
+3-7C28 U+8A79 # <cjk> [2000]
+3-7C29 U+8AA7 # <cjk> [2000]
+3-7C2A U+8AD0 # <cjk> [2000]
+3-7C2B U+8ADF # <cjk> [2000]
+3-7C2C U+8AF4 # <cjk> [2000]
+3-7C2D U+8AF6 # <cjk> [2000]
+3-7C2E U+FA22 # CJK COMPATIBILITY IDEOGRAPH-FA22 [2000]
+3-7C2F U+FA62 # CJK COMPATIBILITY IDEOGRAPH-FA62 [2000] [Unicode3.2]
+3-7C30 U+FA63 # CJK COMPATIBILITY IDEOGRAPH-FA63 [2000] [Unicode3.2]
+3-7C31 U+8B46 # <cjk> [2000]
+3-7C32 U+8B54 # <cjk> [2000]
+3-7C33 U+8B59 # <cjk> [2000]
+3-7C34 U+8B69 # <cjk> [2000]
+3-7C35 U+8B9D # <cjk> [2000]
+3-7C36 U+8C49 # <cjk> [2000]
+3-7C37 U+8C68 # <cjk> [2000]
+3-7C38 U+FA64 # CJK COMPATIBILITY IDEOGRAPH-FA64 [2000] [Unicode3.2]
+3-7C39 U+8CE1 # <cjk> [2000]
+3-7C3A U+8CF4 # <cjk> [2000]
+3-7C3B U+8CF8 # <cjk> [2000]
+3-7C3C U+8CFE # <cjk> [2000]
+3-7C3D U+FA65 # CJK COMPATIBILITY IDEOGRAPH-FA65 [2000] [Unicode3.2]
+3-7C3E U+8D12 # <cjk> [2000]
+3-7C3F U+8D1B # <cjk> [2000]
+3-7C40 U+8DAF # <cjk> [2000]
+3-7C41 U+8DCE # <cjk> [2000]
+3-7C42 U+8DD1 # <cjk> [2000]
+3-7C43 U+8DD7 # <cjk> [2000]
+3-7C44 U+8E20 # <cjk> [2000]
+3-7C45 U+8E23 # <cjk> [2000]
+3-7C46 U+8E3D # <cjk> [2000]
+3-7C47 U+8E70 # <cjk> [2000]
+3-7C48 U+8E7B # <cjk> [2000]
+3-7C49 U+28277 # <cjk> [2000] [Unicode3.1]
+3-7C4A U+8EC0 # <cjk> [2000]
+3-7C4B U+4844 # <cjk> [2000]
+3-7C4C U+8EFA # <cjk> [2000]
+3-7C4D U+8F1E # <cjk> [2000]
+3-7C4E U+8F2D # <cjk> [2000]
+3-7C4F U+8F36 # <cjk> [2000]
+3-7C50 U+8F54 # <cjk> [2000]
+3-7C51 U+283CD # <cjk> [2000] [Unicode3.1]
+3-7C52 U+8FA6 # <cjk> [2000]
+3-7C53 U+8FB5 # <cjk> [2000]
+3-7C54 U+8FE4 # <cjk> [2000]
+3-7C55 U+8FE8 # <cjk> [2000]
+3-7C56 U+8FEE # <cjk> [2000]
+3-7C57 U+9008 # <cjk> [2000]
+3-7C58 U+902D # <cjk> [2000]
+3-7C59 U+FA67 # CJK COMPATIBILITY IDEOGRAPH-FA67 [2000] [Unicode3.2]
+3-7C5A U+9088 # <cjk> [2000]
+3-7C5B U+9095 # <cjk> [2000]
+3-7C5C U+9097 # <cjk> [2000]
+3-7C5D U+9099 # <cjk> [2000]
+3-7C5E U+909B # <cjk> [2000]
+3-7C5F U+90A2 # <cjk> [2000]
+3-7C60 U+90B3 # <cjk> [2000]
+3-7C61 U+90BE # <cjk> [2000]
+3-7C62 U+90C4 # <cjk> [2000]
+3-7C63 U+90C5 # <cjk> [2000]
+3-7C64 U+90C7 # <cjk> [2000]
+3-7C65 U+90D7 # <cjk> [2000]
+3-7C66 U+90DD # <cjk> [2000]
+3-7C67 U+90DE # <cjk> [2000]
+3-7C68 U+90EF # <cjk> [2000]
+3-7C69 U+90F4 # <cjk> [2000]
+3-7C6A U+FA26 # CJK COMPATIBILITY IDEOGRAPH-FA26 [2000]
+3-7C6B U+9114 # <cjk> [2000]
+3-7C6C U+9115 # <cjk> [2000]
+3-7C6D U+9116 # <cjk> [2000]
+3-7C6E U+9122 # <cjk> [2000]
+3-7C6F U+9123 # <cjk> [2000]
+3-7C70 U+9127 # <cjk> [2000]
+3-7C71 U+912F # <cjk> [2000]
+3-7C72 U+9131 # <cjk> [2000]
+3-7C73 U+9134 # <cjk> [2000]
+3-7C74 U+913D # <cjk> [2000]
+3-7C75 U+9148 # <cjk> [2000]
+3-7C76 U+915B # <cjk> [2000]
+3-7C77 U+9183 # <cjk> [2000]
+3-7C78 U+919E # <cjk> [2000]
+3-7C79 U+91AC # <cjk> [2000]
+3-7C7A U+91B1 # <cjk> [2000]
+3-7C7B U+91BC # <cjk> [2000]
+3-7C7C U+91D7 # <cjk> [2000]
+3-7C7D U+91FB # <cjk> [2000]
+3-7C7E U+91E4 # <cjk> [2000]
+3-7D21 U+91E5 # <cjk> [2000]
+3-7D22 U+91ED # <cjk> [2000]
+3-7D23 U+91F1 # <cjk> [2000]
+3-7D24 U+9207 # <cjk> [2000]
+3-7D25 U+9210 # <cjk> [2000]
+3-7D26 U+9238 # <cjk> [2000]
+3-7D27 U+9239 # <cjk> [2000]
+3-7D28 U+923A # <cjk> [2000]
+3-7D29 U+923C # <cjk> [2000]
+3-7D2A U+9240 # <cjk> [2000]
+3-7D2B U+9243 # <cjk> [2000]
+3-7D2C U+924F # <cjk> [2000]
+3-7D2D U+9278 # <cjk> [2000]
+3-7D2E U+9288 # <cjk> [2000]
+3-7D2F U+92C2 # <cjk> [2000]
+3-7D30 U+92CB # <cjk> [2000]
+3-7D31 U+92CC # <cjk> [2000]
+3-7D32 U+92D3 # <cjk> [2000]
+3-7D33 U+92E0 # <cjk> [2000]
+3-7D34 U+92FF # <cjk> [2000]
+3-7D35 U+9304 # <cjk> [2000]
+3-7D36 U+931F # <cjk> [2000]
+3-7D37 U+9321 # <cjk> [2000]
+3-7D38 U+9325 # <cjk> [2000]
+3-7D39 U+9348 # <cjk> [2000]
+3-7D3A U+9349 # <cjk> [2000]
+3-7D3B U+934A # <cjk> [2000]
+3-7D3C U+9364 # <cjk> [2000]
+3-7D3D U+9365 # <cjk> [2000]
+3-7D3E U+936A # <cjk> [2000]
+3-7D3F U+9370 # <cjk> [2000]
+3-7D40 U+939B # <cjk> [2000]
+3-7D41 U+93A3 # <cjk> [2000]
+3-7D42 U+93BA # <cjk> [2000]
+3-7D43 U+93C6 # <cjk> [2000]
+3-7D44 U+93DE # <cjk> [2000]
+3-7D45 U+93DF # <cjk> [2000]
+3-7D46 U+9404 # <cjk> [2000]
+3-7D47 U+93FD # <cjk> [2000]
+3-7D48 U+9433 # <cjk> [2000]
+3-7D49 U+944A # <cjk> [2000]
+3-7D4A U+9463 # <cjk> [2000]
+3-7D4B U+946B # <cjk> [2000]
+3-7D4C U+9471 # <cjk> [2000]
+3-7D4D U+9472 # <cjk> [2000]
+3-7D4E U+958E # <cjk> [2000]
+3-7D4F U+959F # <cjk> [2000]
+3-7D50 U+95A6 # <cjk> [2000]
+3-7D51 U+95A9 # <cjk> [2000]
+3-7D52 U+95AC # <cjk> [2000]
+3-7D53 U+95B6 # <cjk> [2000]
+3-7D54 U+95BD # <cjk> [2000]
+3-7D55 U+95CB # <cjk> [2000]
+3-7D56 U+95D0 # <cjk> [2000]
+3-7D57 U+95D3 # <cjk> [2000]
+3-7D58 U+49B0 # <cjk> [2000]
+3-7D59 U+95DA # <cjk> [2000]
+3-7D5A U+95DE # <cjk> [2000]
+3-7D5B U+9658 # <cjk> [2000]
+3-7D5C U+9684 # <cjk> [2000]
+3-7D5D U+F9DC # CJK COMPATIBILITY IDEOGRAPH-F9DC [2000]
+3-7D5E U+969D # <cjk> [2000]
+3-7D5F U+96A4 # <cjk> [2000]
+3-7D60 U+96A5 # <cjk> [2000]
+3-7D61 U+96D2 # <cjk> [2000]
+3-7D62 U+96DE # <cjk> [2000]
+3-7D63 U+FA68 # CJK COMPATIBILITY IDEOGRAPH-FA68 [2000] [Unicode3.2]
+3-7D64 U+96E9 # <cjk> [2000]
+3-7D65 U+96EF # <cjk> [2000]
+3-7D66 U+9733 # <cjk> [2000]
+3-7D67 U+973B # <cjk> [2000]
+3-7D68 U+974D # <cjk> [2000]
+3-7D69 U+974E # <cjk> [2000]
+3-7D6A U+974F # <cjk> [2000]
+3-7D6B U+975A # <cjk> [2000]
+3-7D6C U+976E # <cjk> [2000]
+3-7D6D U+9773 # <cjk> [2000]
+3-7D6E U+9795 # <cjk> [2000]
+3-7D6F U+97AE # <cjk> [2000]
+3-7D70 U+97BA # <cjk> [2000]
+3-7D71 U+97C1 # <cjk> [2000]
+3-7D72 U+97C9 # <cjk> [2000]
+3-7D73 U+97DE # <cjk> [2000]
+3-7D74 U+97DB # <cjk> [2000]
+3-7D75 U+97F4 # <cjk> [2000]
+3-7D76 U+FA69 # CJK COMPATIBILITY IDEOGRAPH-FA69 [2000] [Unicode3.2]
+3-7D77 U+980A # <cjk> [2000]
+3-7D78 U+981E # <cjk> [2000]
+3-7D79 U+982B # <cjk> [2000]
+3-7D7A U+9830 # <cjk> [2000]
+3-7D7B U+FA6A # CJK COMPATIBILITY IDEOGRAPH-FA6A [2000] [Unicode3.2]
+3-7D7C U+9852 # <cjk> [2000]
+3-7D7D U+9853 # <cjk> [2000]
+3-7D7E U+9856 # <cjk> [2000]
+3-7E21 U+9857 # <cjk> [2000]
+3-7E22 U+9859 # <cjk> [2000]
+3-7E23 U+985A # <cjk> [2000]
+3-7E24 U+F9D0 # CJK COMPATIBILITY IDEOGRAPH-F9D0 [2000]
+3-7E25 U+9865 # <cjk> [2000]
+3-7E26 U+986C # <cjk> [2000]
+3-7E27 U+98BA # <cjk> [2000]
+3-7E28 U+98C8 # <cjk> [2000]
+3-7E29 U+98E7 # <cjk> [2000]
+3-7E2A U+9958 # <cjk> [2000]
+3-7E2B U+999E # <cjk> [2000]
+3-7E2C U+9A02 # <cjk> [2000]
+3-7E2D U+9A03 # <cjk> [2000]
+3-7E2E U+9A24 # <cjk> [2000]
+3-7E2F U+9A2D # <cjk> [2000]
+3-7E30 U+9A2E # <cjk> [2000]
+3-7E31 U+9A38 # <cjk> [2000]
+3-7E32 U+9A4A # <cjk> [2000]
+3-7E33 U+9A4E # <cjk> [2000]
+3-7E34 U+9A52 # <cjk> [2000]
+3-7E35 U+9AB6 # <cjk> [2000]
+3-7E36 U+9AC1 # <cjk> [2000]
+3-7E37 U+9AC3 # <cjk> [2000]
+3-7E38 U+9ACE # <cjk> [2000]
+3-7E39 U+9AD6 # <cjk> [2000]
+3-7E3A U+9AF9 # <cjk> [2000]
+3-7E3B U+9B02 # <cjk> [2000]
+3-7E3C U+9B08 # <cjk> [2000]
+3-7E3D U+9B20 # <cjk> [2000]
+3-7E3E U+4C17 # <cjk> [2000]
+3-7E3F U+9B2D # <cjk> [2000]
+3-7E40 U+9B5E # <cjk> [2000]
+3-7E41 U+9B79 # <cjk> [2000]
+3-7E42 U+9B66 # <cjk> [2000]
+3-7E43 U+9B72 # <cjk> [2000]
+3-7E44 U+9B75 # <cjk> [2000]
+3-7E45 U+9B84 # <cjk> [2000]
+3-7E46 U+9B8A # <cjk> [2000]
+3-7E47 U+9B8F # <cjk> [2000]
+3-7E48 U+9B9E # <cjk> [2000]
+3-7E49 U+9BA7 # <cjk> [2000]
+3-7E4A U+9BC1 # <cjk> [2000]
+3-7E4B U+9BCE # <cjk> [2000]
+3-7E4C U+9BE5 # <cjk> [2000]
+3-7E4D U+9BF8 # <cjk> [2000]
+3-7E4E U+9BFD # <cjk> [2000]
+3-7E4F U+9C00 # <cjk> [2000]
+3-7E50 U+9C23 # <cjk> [2000]
+3-7E51 U+9C41 # <cjk> [2000]
+3-7E52 U+9C4F # <cjk> [2000]
+3-7E53 U+9C50 # <cjk> [2000]
+3-7E54 U+9C53 # <cjk> [2000]
+3-7E55 U+9C63 # <cjk> [2000]
+3-7E56 U+9C65 # <cjk> [2000]
+3-7E57 U+9C77 # <cjk> [2000]
+3-7E58 U+9D1D # <cjk> [2000]
+3-7E59 U+9D1E # <cjk> [2000]
+3-7E5A U+9D43 # <cjk> [2000]
+3-7E5B U+9D47 # <cjk> [2000]
+3-7E5C U+9D52 # <cjk> [2000]
+3-7E5D U+9D63 # <cjk> [2000]
+3-7E5E U+9D70 # <cjk> [2000]
+3-7E5F U+9D7C # <cjk> [2000]
+3-7E60 U+9D8A # <cjk> [2000]
+3-7E61 U+9D96 # <cjk> [2000]
+3-7E62 U+9DC0 # <cjk> [2000]
+3-7E63 U+9DAC # <cjk> [2000]
+3-7E64 U+9DBC # <cjk> [2000]
+3-7E65 U+9DD7 # <cjk> [2000]
+3-7E66 U+2A190 # <cjk> [2000] [Unicode3.1]
+3-7E67 U+9DE7 # <cjk> [2000]
+3-7E68 U+9E07 # <cjk> [2000]
+3-7E69 U+9E15 # <cjk> [2000]
+3-7E6A U+9E7C # <cjk> [2000]
+3-7E6B U+9E9E # <cjk> [2000]
+3-7E6C U+9EA4 # <cjk> [2000]
+3-7E6D U+9EAC # <cjk> [2000]
+3-7E6E U+9EAF # <cjk> [2000]
+3-7E6F U+9EB4 # <cjk> [2000]
+3-7E70 U+9EB5 # <cjk> [2000]
+3-7E71 U+9EC3 # <cjk> [2000]
+3-7E72 U+9ED1 # <cjk> [2000]
+3-7E73 U+9F10 # <cjk> [2000]
+3-7E74 U+9F39 # <cjk> [2000]
+3-7E75 U+9F57 # <cjk> [2000]
+3-7E76 U+9F90 # <cjk> [2000]
+3-7E77 U+9F94 # <cjk> [2000]
+3-7E78 U+9F97 # <cjk> [2000]
+3-7E79 U+9FA2 # <cjk> [2000]
+3-7E7A U+59F8 # <cjk> [2004]
+3-7E7B U+5C5B # <cjk> [2004]
+3-7E7C U+5E77 # <cjk> [2004]
+3-7E7D U+7626 # <cjk> [2004]
+3-7E7E U+7E6B # <cjk> [2004]
+4-2121 U+20089 # <cjk> [2000] [Unicode3.1]
+4-2122 U+4E02 # <cjk> [2000]
+4-2123 U+4E0F # <cjk> [2000]
+4-2124 U+4E12 # <cjk> [2000]
+4-2125 U+4E29 # <cjk> [2000]
+4-2126 U+4E2B # <cjk> [2000]
+4-2127 U+4E2E # <cjk> [2000]
+4-2128 U+4E40 # <cjk> [2000]
+4-2129 U+4E47 # <cjk> [2000]
+4-212A U+4E48 # <cjk> [2000]
+4-212B U+200A2 # <cjk> [2000] [Unicode3.1]
+4-212C U+4E51 # <cjk> [2000]
+4-212D U+3406 # <cjk> [2000]
+4-212E U+200A4 # <cjk> [2000] [Unicode3.1]
+4-212F U+4E5A # <cjk> [2000]
+4-2130 U+4E69 # <cjk> [2000]
+4-2131 U+4E9D # <cjk> [2000]
+4-2132 U+342C # <cjk> [2000]
+4-2133 U+342E # <cjk> [2000]
+4-2134 U+4EB9 # <cjk> [2000]
+4-2135 U+4EBB # <cjk> [2000]
+4-2136 U+201A2 # <cjk> [2000] [Unicode3.1]
+4-2137 U+4EBC # <cjk> [2000]
+4-2138 U+4EC3 # <cjk> [2000]
+4-2139 U+4EC8 # <cjk> [2000]
+4-213A U+4ED0 # <cjk> [2000]
+4-213B U+4EEB # <cjk> [2000]
+4-213C U+4EDA # <cjk> [2000]
+4-213D U+4EF1 # <cjk> [2000]
+4-213E U+4EF5 # <cjk> [2000]
+4-213F U+4F00 # <cjk> [2000]
+4-2140 U+4F16 # <cjk> [2000]
+4-2141 U+4F64 # <cjk> [2000]
+4-2142 U+4F37 # <cjk> [2000]
+4-2143 U+4F3E # <cjk> [2000]
+4-2144 U+4F54 # <cjk> [2000]
+4-2145 U+4F58 # <cjk> [2000]
+4-2146 U+20213 # <cjk> [2000] [Unicode3.1]
+4-2147 U+4F77 # <cjk> [2000]
+4-2148 U+4F78 # <cjk> [2000]
+4-2149 U+4F7A # <cjk> [2000]
+4-214A U+4F7D # <cjk> [2000]
+4-214B U+4F82 # <cjk> [2000]
+4-214C U+4F85 # <cjk> [2000]
+4-214D U+4F92 # <cjk> [2000]
+4-214E U+4F9A # <cjk> [2000]
+4-214F U+4FE6 # <cjk> [2000]
+4-2150 U+4FB2 # <cjk> [2000]
+4-2151 U+4FBE # <cjk> [2000]
+4-2152 U+4FC5 # <cjk> [2000]
+4-2153 U+4FCB # <cjk> [2000]
+4-2154 U+4FCF # <cjk> [2000]
+4-2155 U+4FD2 # <cjk> [2000]
+4-2156 U+346A # <cjk> [2000]
+4-2157 U+4FF2 # <cjk> [2000]
+4-2158 U+5000 # <cjk> [2000]
+4-2159 U+5010 # <cjk> [2000]
+4-215A U+5013 # <cjk> [2000]
+4-215B U+501C # <cjk> [2000]
+4-215C U+501E # <cjk> [2000]
+4-215D U+5022 # <cjk> [2000]
+4-215E U+3468 # <cjk> [2000]
+4-215F U+5042 # <cjk> [2000]
+4-2160 U+5046 # <cjk> [2000]
+4-2161 U+504E # <cjk> [2000]
+4-2162 U+5053 # <cjk> [2000]
+4-2163 U+5057 # <cjk> [2000]
+4-2164 U+5063 # <cjk> [2000]
+4-2165 U+5066 # <cjk> [2000]
+4-2166 U+506A # <cjk> [2000]
+4-2167 U+5070 # <cjk> [2000]
+4-2168 U+50A3 # <cjk> [2000]
+4-2169 U+5088 # <cjk> [2000]
+4-216A U+5092 # <cjk> [2000]
+4-216B U+5093 # <cjk> [2000]
+4-216C U+5095 # <cjk> [2000]
+4-216D U+5096 # <cjk> [2000]
+4-216E U+509C # <cjk> [2000]
+4-216F U+50AA # <cjk> [2000]
+4-2170 U+2032B # <cjk> [2000] [Unicode3.1]
+4-2171 U+50B1 # <cjk> [2000]
+4-2172 U+50BA # <cjk> [2000]
+4-2173 U+50BB # <cjk> [2000]
+4-2174 U+50C4 # <cjk> [2000]
+4-2175 U+50C7 # <cjk> [2000]
+4-2176 U+50F3 # <cjk> [2000]
+4-2177 U+20381 # <cjk> [2000] [Unicode3.1]
+4-2178 U+50CE # <cjk> [2000]
+4-2179 U+20371 # <cjk> [2000] [Unicode3.1]
+4-217A U+50D4 # <cjk> [2000]
+4-217B U+50D9 # <cjk> [2000]
+4-217C U+50E1 # <cjk> [2000]
+4-217D U+50E9 # <cjk> [2000]
+4-217E U+3492 # <cjk> [2000]
+4-2321 U+5108 # <cjk> [2000]
+4-2322 U+203F9 # <cjk> [2000] [Unicode3.1]
+4-2323 U+5117 # <cjk> [2000]
+4-2324 U+511B # <cjk> [2000]
+4-2325 U+2044A # <cjk> [2000] [Unicode3.1]
+4-2326 U+5160 # <cjk> [2000]
+4-2327 U+20509 # <cjk> [2000] [Unicode3.1]
+4-2328 U+5173 # <cjk> [2000]
+4-2329 U+5183 # <cjk> [2000]
+4-232A U+518B # <cjk> [2000]
+4-232B U+34BC # <cjk> [2000]
+4-232C U+5198 # <cjk> [2000]
+4-232D U+51A3 # <cjk> [2000]
+4-232E U+51AD # <cjk> [2000]
+4-232F U+34C7 # <cjk> [2000]
+4-2330 U+51BC # <cjk> [2000]
+4-2331 U+205D6 # <cjk> [2000] [Unicode3.1]
+4-2332 U+20628 # <cjk> [2000] [Unicode3.1]
+4-2333 U+51F3 # <cjk> [2000]
+4-2334 U+51F4 # <cjk> [2000]
+4-2335 U+5202 # <cjk> [2000]
+4-2336 U+5212 # <cjk> [2000]
+4-2337 U+5216 # <cjk> [2000]
+4-2338 U+2074F # <cjk> [2000] [Unicode3.1]
+4-2339 U+5255 # <cjk> [2000]
+4-233A U+525C # <cjk> [2000]
+4-233B U+526C # <cjk> [2000]
+4-233C U+5277 # <cjk> [2000]
+4-233D U+5284 # <cjk> [2000]
+4-233E U+5282 # <cjk> [2000]
+4-233F U+20807 # <cjk> [2000] [Unicode3.1]
+4-2340 U+5298 # <cjk> [2000]
+4-2341 U+2083A # <cjk> [2000] [Unicode3.1]
+4-2342 U+52A4 # <cjk> [2000]
+4-2343 U+52A6 # <cjk> [2000]
+4-2344 U+52AF # <cjk> [2000]
+4-2345 U+52BA # <cjk> [2000]
+4-2346 U+52BB # <cjk> [2000]
+4-2347 U+52CA # <cjk> [2000]
+4-2348 U+351F # <cjk> [2000]
+4-2349 U+52D1 # <cjk> [2000]
+4-234A U+208B9 # <cjk> [2000] [Unicode3.1]
+4-234B U+52F7 # <cjk> [2000]
+4-234C U+530A # <cjk> [2000]
+4-234D U+530B # <cjk> [2000]
+4-234E U+5324 # <cjk> [2000]
+4-234F U+5335 # <cjk> [2000]
+4-2350 U+533E # <cjk> [2000]
+4-2351 U+5342 # <cjk> [2000]
+4-2352 U+2097C # <cjk> [2000] [Unicode3.1]
+4-2353 U+2099D # <cjk> [2000] [Unicode3.1]
+4-2354 U+5367 # <cjk> [2000]
+4-2355 U+536C # <cjk> [2000]
+4-2356 U+537A # <cjk> [2000]
+4-2357 U+53A4 # <cjk> [2000]
+4-2358 U+53B4 # <cjk> [2000]
+4-2359 U+20AD3 # <cjk> [2000] [Unicode3.1]
+4-235A U+53B7 # <cjk> [2000]
+4-235B U+53C0 # <cjk> [2000]
+4-235C U+20B1D # <cjk> [2000] [Unicode3.1]
+4-235D U+355D # <cjk> [2000]
+4-235E U+355E # <cjk> [2000]
+4-235F U+53D5 # <cjk> [2000]
+4-2360 U+53DA # <cjk> [2000]
+4-2361 U+3563 # <cjk> [2000]
+4-2362 U+53F4 # <cjk> [2000]
+4-2363 U+53F5 # <cjk> [2000]
+4-2364 U+5455 # <cjk> [2000]
+4-2365 U+5424 # <cjk> [2000]
+4-2366 U+5428 # <cjk> [2000]
+4-2367 U+356E # <cjk> [2000]
+4-2368 U+5443 # <cjk> [2000]
+4-2369 U+5462 # <cjk> [2000]
+4-236A U+5466 # <cjk> [2000]
+4-236B U+546C # <cjk> [2000]
+4-236C U+548A # <cjk> [2000]
+4-236D U+548D # <cjk> [2000]
+4-236E U+5495 # <cjk> [2000]
+4-236F U+54A0 # <cjk> [2000]
+4-2370 U+54A6 # <cjk> [2000]
+4-2371 U+54AD # <cjk> [2000]
+4-2372 U+54AE # <cjk> [2000]
+4-2373 U+54B7 # <cjk> [2000]
+4-2374 U+54BA # <cjk> [2000]
+4-2375 U+54BF # <cjk> [2000]
+4-2376 U+54C3 # <cjk> [2000]
+4-2377 U+20D45 # <cjk> [2000] [Unicode3.1]
+4-2378 U+54EC # <cjk> [2000]
+4-2379 U+54EF # <cjk> [2000]
+4-237A U+54F1 # <cjk> [2000]
+4-237B U+54F3 # <cjk> [2000]
+4-237C U+5500 # <cjk> [2000]
+4-237D U+5501 # <cjk> [2000]
+4-237E U+5509 # <cjk> [2000]
+4-2421 U+553C # <cjk> [2000]
+4-2422 U+5541 # <cjk> [2000]
+4-2423 U+35A6 # <cjk> [2000]
+4-2424 U+5547 # <cjk> [2000]
+4-2425 U+554A # <cjk> [2000]
+4-2426 U+35A8 # <cjk> [2000]
+4-2427 U+5560 # <cjk> [2000]
+4-2428 U+5561 # <cjk> [2000]
+4-2429 U+5564 # <cjk> [2000]
+4-242A U+20DE1 # <cjk> [2000] [Unicode3.1]
+4-242B U+557D # <cjk> [2000]
+4-242C U+5582 # <cjk> [2000]
+4-242D U+5588 # <cjk> [2000]
+4-242E U+5591 # <cjk> [2000]
+4-242F U+35C5 # <cjk> [2000]
+4-2430 U+55D2 # <cjk> [2000]
+4-2431 U+20E95 # <cjk> [2000] [Unicode3.1]
+4-2432 U+20E6D # <cjk> [2000] [Unicode3.1]
+4-2433 U+55BF # <cjk> [2000]
+4-2434 U+55C9 # <cjk> [2000]
+4-2435 U+55CC # <cjk> [2000]
+4-2436 U+55D1 # <cjk> [2000]
+4-2437 U+55DD # <cjk> [2000]
+4-2438 U+35DA # <cjk> [2000]
+4-2439 U+55E2 # <cjk> [2000]
+4-243A U+20E64 # <cjk> [2000] [Unicode3.1]
+4-243B U+55E9 # <cjk> [2000]
+4-243C U+5628 # <cjk> [2000]
+4-243D U+20F5F # <cjk> [2000] [Unicode3.1]
+4-243E U+5607 # <cjk> [2000]
+4-243F U+5610 # <cjk> [2000]
+4-2440 U+5630 # <cjk> [2000]
+4-2441 U+5637 # <cjk> [2000]
+4-2442 U+35F4 # <cjk> [2000]
+4-2443 U+563D # <cjk> [2000]
+4-2444 U+563F # <cjk> [2000]
+4-2445 U+5640 # <cjk> [2000]
+4-2446 U+5647 # <cjk> [2000]
+4-2447 U+565E # <cjk> [2000]
+4-2448 U+5660 # <cjk> [2000]
+4-2449 U+566D # <cjk> [2000]
+4-244A U+3605 # <cjk> [2000]
+4-244B U+5688 # <cjk> [2000]
+4-244C U+568C # <cjk> [2000]
+4-244D U+5695 # <cjk> [2000]
+4-244E U+569A # <cjk> [2000]
+4-244F U+569D # <cjk> [2000]
+4-2450 U+56A8 # <cjk> [2000]
+4-2451 U+56AD # <cjk> [2000]
+4-2452 U+56B2 # <cjk> [2000]
+4-2453 U+56C5 # <cjk> [2000]
+4-2454 U+56CD # <cjk> [2000]
+4-2455 U+56DF # <cjk> [2000]
+4-2456 U+56E8 # <cjk> [2000]
+4-2457 U+56F6 # <cjk> [2000]
+4-2458 U+56F7 # <cjk> [2000]
+4-2459 U+21201 # <cjk> [2000] [Unicode3.1]
+4-245A U+5715 # <cjk> [2000]
+4-245B U+5723 # <cjk> [2000]
+4-245C U+21255 # <cjk> [2000] [Unicode3.1]
+4-245D U+5729 # <cjk> [2000]
+4-245E U+2127B # <cjk> [2000] [Unicode3.1]
+4-245F U+5745 # <cjk> [2000]
+4-2460 U+5746 # <cjk> [2000]
+4-2461 U+574C # <cjk> [2000]
+4-2462 U+574D # <cjk> [2000]
+4-2463 U+21274 # <cjk> [2000] [Unicode3.1]
+4-2464 U+5768 # <cjk> [2000]
+4-2465 U+576F # <cjk> [2000]
+4-2466 U+5773 # <cjk> [2000]
+4-2467 U+5774 # <cjk> [2000]
+4-2468 U+5775 # <cjk> [2000]
+4-2469 U+577B # <cjk> [2000]
+4-246A U+212E4 # <cjk> [2000] [Unicode3.1]
+4-246B U+212D7 # <cjk> [2000] [Unicode3.1]
+4-246C U+57AC # <cjk> [2000]
+4-246D U+579A # <cjk> [2000]
+4-246E U+579D # <cjk> [2000]
+4-246F U+579E # <cjk> [2000]
+4-2470 U+57A8 # <cjk> [2000]
+4-2471 U+57D7 # <cjk> [2000]
+4-2472 U+212FD # <cjk> [2000] [Unicode3.1]
+4-2473 U+57CC # <cjk> [2000]
+4-2474 U+21336 # <cjk> [2000] [Unicode3.1]
+4-2475 U+21344 # <cjk> [2000] [Unicode3.1]
+4-2476 U+57DE # <cjk> [2000]
+4-2477 U+57E6 # <cjk> [2000]
+4-2478 U+57F0 # <cjk> [2000]
+4-2479 U+364A # <cjk> [2000]
+4-247A U+57F8 # <cjk> [2000]
+4-247B U+57FB # <cjk> [2000]
+4-247C U+57FD # <cjk> [2000]
+4-247D U+5804 # <cjk> [2000]
+4-247E U+581E # <cjk> [2000]
+4-2521 U+5820 # <cjk> [2000]
+4-2522 U+5827 # <cjk> [2000]
+4-2523 U+5832 # <cjk> [2000]
+4-2524 U+5839 # <cjk> [2000]
+4-2525 U+213C4 # <cjk> [2000] [Unicode3.1]
+4-2526 U+5849 # <cjk> [2000]
+4-2527 U+584C # <cjk> [2000]
+4-2528 U+5867 # <cjk> [2000]
+4-2529 U+588A # <cjk> [2000]
+4-252A U+588B # <cjk> [2000]
+4-252B U+588D # <cjk> [2000]
+4-252C U+588F # <cjk> [2000]
+4-252D U+5890 # <cjk> [2000]
+4-252E U+5894 # <cjk> [2000]
+4-252F U+589D # <cjk> [2000]
+4-2530 U+58AA # <cjk> [2000]
+4-2531 U+58B1 # <cjk> [2000]
+4-2532 U+2146D # <cjk> [2000] [Unicode3.1]
+4-2533 U+58C3 # <cjk> [2000]
+4-2534 U+58CD # <cjk> [2000]
+4-2535 U+58E2 # <cjk> [2000]
+4-2536 U+58F3 # <cjk> [2000]
+4-2537 U+58F4 # <cjk> [2000]
+4-2538 U+5905 # <cjk> [2000]
+4-2539 U+5906 # <cjk> [2000]
+4-253A U+590B # <cjk> [2000]
+4-253B U+590D # <cjk> [2000]
+4-253C U+5914 # <cjk> [2000]
+4-253D U+5924 # <cjk> [2000]
+4-253E U+215D7 # <cjk> [2000] [Unicode3.1]
+4-253F U+3691 # <cjk> [2000]
+4-2540 U+593D # <cjk> [2000]
+4-2541 U+3699 # <cjk> [2000]
+4-2542 U+5946 # <cjk> [2000]
+4-2543 U+3696 # <cjk> [2000]
+4-2544 U+26C29 # <cjk> [2000] [Unicode3.1]
+4-2545 U+595B # <cjk> [2000]
+4-2546 U+595F # <cjk> [2000]
+4-2547 U+21647 # <cjk> [2000] [Unicode3.1]
+4-2548 U+5975 # <cjk> [2000]
+4-2549 U+5976 # <cjk> [2000]
+4-254A U+597C # <cjk> [2000]
+4-254B U+599F # <cjk> [2000]
+4-254C U+59AE # <cjk> [2000]
+4-254D U+59BC # <cjk> [2000]
+4-254E U+59C8 # <cjk> [2000]
+4-254F U+59CD # <cjk> [2000]
+4-2550 U+59DE # <cjk> [2000]
+4-2551 U+59E3 # <cjk> [2000]
+4-2552 U+59E4 # <cjk> [2000]
+4-2553 U+59E7 # <cjk> [2000]
+4-2554 U+59EE # <cjk> [2000]
+4-2555 U+21706 # <cjk> [2000] [Unicode3.1]
+4-2556 U+21742 # <cjk> [2000] [Unicode3.1]
+4-2557 U+36CF # <cjk> [2000]
+4-2558 U+5A0C # <cjk> [2000]
+4-2559 U+5A0D # <cjk> [2000]
+4-255A U+5A17 # <cjk> [2000]
+4-255B U+5A27 # <cjk> [2000]
+4-255C U+5A2D # <cjk> [2000]
+4-255D U+5A55 # <cjk> [2000]
+4-255E U+5A65 # <cjk> [2000]
+4-255F U+5A7A # <cjk> [2000]
+4-2560 U+5A8B # <cjk> [2000]
+4-2561 U+5A9C # <cjk> [2000]
+4-2562 U+5A9F # <cjk> [2000]
+4-2563 U+5AA0 # <cjk> [2000]
+4-2564 U+5AA2 # <cjk> [2000]
+4-2565 U+5AB1 # <cjk> [2000]
+4-2566 U+5AB3 # <cjk> [2000]
+4-2567 U+5AB5 # <cjk> [2000]
+4-2568 U+5ABA # <cjk> [2000]
+4-2569 U+5ABF # <cjk> [2000]
+4-256A U+5ADA # <cjk> [2000]
+4-256B U+5ADC # <cjk> [2000]
+4-256C U+5AE0 # <cjk> [2000]
+4-256D U+5AE5 # <cjk> [2000]
+4-256E U+5AF0 # <cjk> [2000]
+4-256F U+5AEE # <cjk> [2000]
+4-2570 U+5AF5 # <cjk> [2000]
+4-2571 U+5B00 # <cjk> [2000]
+4-2572 U+5B08 # <cjk> [2000]
+4-2573 U+5B17 # <cjk> [2000]
+4-2574 U+5B34 # <cjk> [2000]
+4-2575 U+5B2D # <cjk> [2000]
+4-2576 U+5B4C # <cjk> [2000]
+4-2577 U+5B52 # <cjk> [2000]
+4-2578 U+5B68 # <cjk> [2000]
+4-2579 U+5B6F # <cjk> [2000]
+4-257A U+5B7C # <cjk> [2000]
+4-257B U+5B7F # <cjk> [2000]
+4-257C U+5B81 # <cjk> [2000]
+4-257D U+5B84 # <cjk> [2000]
+4-257E U+219C3 # <cjk> [2000] [Unicode3.1]
+4-2821 U+5B96 # <cjk> [2000]
+4-2822 U+5BAC # <cjk> [2000]
+4-2823 U+3761 # <cjk> [2000]
+4-2824 U+5BC0 # <cjk> [2000]
+4-2825 U+3762 # <cjk> [2000]
+4-2826 U+5BCE # <cjk> [2000]
+4-2827 U+5BD6 # <cjk> [2000]
+4-2828 U+376C # <cjk> [2000]
+4-2829 U+376B # <cjk> [2000]
+4-282A U+5BF1 # <cjk> [2000]
+4-282B U+5BFD # <cjk> [2000]
+4-282C U+3775 # <cjk> [2000]
+4-282D U+5C03 # <cjk> [2000]
+4-282E U+5C29 # <cjk> [2000]
+4-282F U+5C30 # <cjk> [2000]
+4-2830 U+21C56 # <cjk> [2000] [Unicode3.1]
+4-2831 U+5C5F # <cjk> [2000]
+4-2832 U+5C63 # <cjk> [2000]
+4-2833 U+5C67 # <cjk> [2000]
+4-2834 U+5C68 # <cjk> [2000]
+4-2835 U+5C69 # <cjk> [2000]
+4-2836 U+5C70 # <cjk> [2000]
+4-2837 U+21D2D # <cjk> [2000] [Unicode3.1]
+4-2838 U+21D45 # <cjk> [2000] [Unicode3.1]
+4-2839 U+5C7C # <cjk> [2000]
+4-283A U+21D78 # <cjk> [2000] [Unicode3.1]
+4-283B U+21D62 # <cjk> [2000] [Unicode3.1]
+4-283C U+5C88 # <cjk> [2000]
+4-283D U+5C8A # <cjk> [2000]
+4-283E U+37C1 # <cjk> [2000]
+4-283F U+21DA1 # <cjk> [2000] [Unicode3.1]
+4-2840 U+21D9C # <cjk> [2000] [Unicode3.1]
+4-2841 U+5CA0 # <cjk> [2000]
+4-2842 U+5CA2 # <cjk> [2000]
+4-2843 U+5CA6 # <cjk> [2000]
+4-2844 U+5CA7 # <cjk> [2000]
+4-2845 U+21D92 # <cjk> [2000] [Unicode3.1]
+4-2846 U+5CAD # <cjk> [2000]
+4-2847 U+5CB5 # <cjk> [2000]
+4-2848 U+21DB7 # <cjk> [2000] [Unicode3.1]
+4-2849 U+5CC9 # <cjk> [2000]
+4-284A U+21DE0 # <cjk> [2000] [Unicode3.1]
+4-284B U+21E33 # <cjk> [2000] [Unicode3.1]
+4-284C U+5D06 # <cjk> [2000]
+4-284D U+5D10 # <cjk> [2000]
+4-284E U+5D2B # <cjk> [2000]
+4-284F U+5D1D # <cjk> [2000]
+4-2850 U+5D20 # <cjk> [2000]
+4-2851 U+5D24 # <cjk> [2000]
+4-2852 U+5D26 # <cjk> [2000]
+4-2853 U+5D31 # <cjk> [2000]
+4-2854 U+5D39 # <cjk> [2000]
+4-2855 U+5D42 # <cjk> [2000]
+4-2856 U+37E8 # <cjk> [2000]
+4-2857 U+5D61 # <cjk> [2000]
+4-2858 U+5D6A # <cjk> [2000]
+4-2859 U+37F4 # <cjk> [2000]
+4-285A U+5D70 # <cjk> [2000]
+4-285B U+21F1E # <cjk> [2000] [Unicode3.1]
+4-285C U+37FD # <cjk> [2000]
+4-285D U+5D88 # <cjk> [2000]
+4-285E U+3800 # <cjk> [2000]
+4-285F U+5D92 # <cjk> [2000]
+4-2860 U+5D94 # <cjk> [2000]
+4-2861 U+5D97 # <cjk> [2000]
+4-2862 U+5D99 # <cjk> [2000]
+4-2863 U+5DB0 # <cjk> [2000]
+4-2864 U+5DB2 # <cjk> [2000]
+4-2865 U+5DB4 # <cjk> [2000]
+4-2866 U+21F76 # <cjk> [2000] [Unicode3.1]
+4-2867 U+5DB9 # <cjk> [2000]
+4-2868 U+5DD1 # <cjk> [2000]
+4-2869 U+5DD7 # <cjk> [2000]
+4-286A U+5DD8 # <cjk> [2000]
+4-286B U+5DE0 # <cjk> [2000]
+4-286C U+21FFA # <cjk> [2000] [Unicode3.1]
+4-286D U+5DE4 # <cjk> [2000]
+4-286E U+5DE9 # <cjk> [2000]
+4-286F U+382F # <cjk> [2000]
+4-2870 U+5E00 # <cjk> [2000]
+4-2871 U+3836 # <cjk> [2000]
+4-2872 U+5E12 # <cjk> [2000]
+4-2873 U+5E15 # <cjk> [2000]
+4-2874 U+3840 # <cjk> [2000]
+4-2875 U+5E1F # <cjk> [2000]
+4-2876 U+5E2E # <cjk> [2000]
+4-2877 U+5E3E # <cjk> [2000]
+4-2878 U+5E49 # <cjk> [2000]
+4-2879 U+385C # <cjk> [2000]
+4-287A U+5E56 # <cjk> [2000]
+4-287B U+3861 # <cjk> [2000]
+4-287C U+5E6B # <cjk> [2000]
+4-287D U+5E6C # <cjk> [2000]
+4-287E U+5E6D # <cjk> [2000]
+4-2C21 U+5E6E # <cjk> [2000]
+4-2C22 U+2217B # <cjk> [2000] [Unicode3.1]
+4-2C23 U+5EA5 # <cjk> [2000]
+4-2C24 U+5EAA # <cjk> [2000]
+4-2C25 U+5EAC # <cjk> [2000]
+4-2C26 U+5EB9 # <cjk> [2000]
+4-2C27 U+5EBF # <cjk> [2000]
+4-2C28 U+5EC6 # <cjk> [2000]
+4-2C29 U+5ED2 # <cjk> [2000]
+4-2C2A U+5ED9 # <cjk> [2000]
+4-2C2B U+2231E # <cjk> [2000] [Unicode3.1]
+4-2C2C U+5EFD # <cjk> [2000]
+4-2C2D U+5F08 # <cjk> [2000]
+4-2C2E U+5F0E # <cjk> [2000]
+4-2C2F U+5F1C # <cjk> [2000]
+4-2C30 U+223AD # <cjk> [2000] [Unicode3.1]
+4-2C31 U+5F1E # <cjk> [2000]
+4-2C32 U+5F47 # <cjk> [2000]
+4-2C33 U+5F63 # <cjk> [2000]
+4-2C34 U+5F72 # <cjk> [2000]
+4-2C35 U+5F7E # <cjk> [2000]
+4-2C36 U+5F8F # <cjk> [2000]
+4-2C37 U+5FA2 # <cjk> [2000]
+4-2C38 U+5FA4 # <cjk> [2000]
+4-2C39 U+5FB8 # <cjk> [2000]
+4-2C3A U+5FC4 # <cjk> [2000]
+4-2C3B U+38FA # <cjk> [2000]
+4-2C3C U+5FC7 # <cjk> [2000]
+4-2C3D U+5FCB # <cjk> [2000]
+4-2C3E U+5FD2 # <cjk> [2000]
+4-2C3F U+5FD3 # <cjk> [2000]
+4-2C40 U+5FD4 # <cjk> [2000]
+4-2C41 U+5FE2 # <cjk> [2000]
+4-2C42 U+5FEE # <cjk> [2000]
+4-2C43 U+5FEF # <cjk> [2000]
+4-2C44 U+5FF3 # <cjk> [2000]
+4-2C45 U+5FFC # <cjk> [2000]
+4-2C46 U+3917 # <cjk> [2000]
+4-2C47 U+6017 # <cjk> [2000]
+4-2C48 U+6022 # <cjk> [2000]
+4-2C49 U+6024 # <cjk> [2000]
+4-2C4A U+391A # <cjk> [2000]
+4-2C4B U+604C # <cjk> [2000]
+4-2C4C U+607F # <cjk> [2000]
+4-2C4D U+608A # <cjk> [2000]
+4-2C4E U+6095 # <cjk> [2000]
+4-2C4F U+60A8 # <cjk> [2000]
+4-2C50 U+226F3 # <cjk> [2000] [Unicode3.1]
+4-2C51 U+60B0 # <cjk> [2000]
+4-2C52 U+60B1 # <cjk> [2000]
+4-2C53 U+60BE # <cjk> [2000]
+4-2C54 U+60C8 # <cjk> [2000]
+4-2C55 U+60D9 # <cjk> [2000]
+4-2C56 U+60DB # <cjk> [2000]
+4-2C57 U+60EE # <cjk> [2000]
+4-2C58 U+60F2 # <cjk> [2000]
+4-2C59 U+60F5 # <cjk> [2000]
+4-2C5A U+6110 # <cjk> [2000]
+4-2C5B U+6112 # <cjk> [2000]
+4-2C5C U+6113 # <cjk> [2000]
+4-2C5D U+6119 # <cjk> [2000]
+4-2C5E U+611E # <cjk> [2000]
+4-2C5F U+613A # <cjk> [2000]
+4-2C60 U+396F # <cjk> [2000]
+4-2C61 U+6141 # <cjk> [2000]
+4-2C62 U+6146 # <cjk> [2000]
+4-2C63 U+6160 # <cjk> [2000]
+4-2C64 U+617C # <cjk> [2000]
+4-2C65 U+2285B # <cjk> [2000] [Unicode3.1]
+4-2C66 U+6192 # <cjk> [2000]
+4-2C67 U+6193 # <cjk> [2000]
+4-2C68 U+6197 # <cjk> [2000]
+4-2C69 U+6198 # <cjk> [2000]
+4-2C6A U+61A5 # <cjk> [2000]
+4-2C6B U+61A8 # <cjk> [2000]
+4-2C6C U+61AD # <cjk> [2000]
+4-2C6D U+228AB # <cjk> [2000] [Unicode3.1]
+4-2C6E U+61D5 # <cjk> [2000]
+4-2C6F U+61DD # <cjk> [2000]
+4-2C70 U+61DF # <cjk> [2000]
+4-2C71 U+61F5 # <cjk> [2000]
+4-2C72 U+2298F # <cjk> [2000] [Unicode3.1]
+4-2C73 U+6215 # <cjk> [2000]
+4-2C74 U+6223 # <cjk> [2000]
+4-2C75 U+6229 # <cjk> [2000]
+4-2C76 U+6246 # <cjk> [2000]
+4-2C77 U+624C # <cjk> [2000]
+4-2C78 U+6251 # <cjk> [2000]
+4-2C79 U+6252 # <cjk> [2000]
+4-2C7A U+6261 # <cjk> [2000]
+4-2C7B U+6264 # <cjk> [2000]
+4-2C7C U+627B # <cjk> [2000]
+4-2C7D U+626D # <cjk> [2000]
+4-2C7E U+6273 # <cjk> [2000]
+4-2D21 U+6299 # <cjk> [2000]
+4-2D22 U+62A6 # <cjk> [2000]
+4-2D23 U+62D5 # <cjk> [2000]
+4-2D24 U+22AB8 # <cjk> [2000] [Unicode3.1]
+4-2D25 U+62FD # <cjk> [2000]
+4-2D26 U+6303 # <cjk> [2000]
+4-2D27 U+630D # <cjk> [2000]
+4-2D28 U+6310 # <cjk> [2000]
+4-2D29 U+22B4F # <cjk> [2000] [Unicode3.1]
+4-2D2A U+22B50 # <cjk> [2000] [Unicode3.1]
+4-2D2B U+6332 # <cjk> [2000]
+4-2D2C U+6335 # <cjk> [2000]
+4-2D2D U+633B # <cjk> [2000]
+4-2D2E U+633C # <cjk> [2000]
+4-2D2F U+6341 # <cjk> [2000]
+4-2D30 U+6344 # <cjk> [2000]
+4-2D31 U+634E # <cjk> [2000]
+4-2D32 U+22B46 # <cjk> [2000] [Unicode3.1]
+4-2D33 U+6359 # <cjk> [2000]
+4-2D34 U+22C1D # <cjk> [2000] [Unicode3.1]
+4-2D35 U+22BA6 # <cjk> [2000] [Unicode3.1]
+4-2D36 U+636C # <cjk> [2000]
+4-2D37 U+6384 # <cjk> [2000]
+4-2D38 U+6399 # <cjk> [2000]
+4-2D39 U+22C24 # <cjk> [2000] [Unicode3.1]
+4-2D3A U+6394 # <cjk> [2000]
+4-2D3B U+63BD # <cjk> [2000]
+4-2D3C U+63F7 # <cjk> [2000]
+4-2D3D U+63D4 # <cjk> [2000]
+4-2D3E U+63D5 # <cjk> [2000]
+4-2D3F U+63DC # <cjk> [2000]
+4-2D40 U+63E0 # <cjk> [2000]
+4-2D41 U+63EB # <cjk> [2000]
+4-2D42 U+63EC # <cjk> [2000]
+4-2D43 U+63F2 # <cjk> [2000]
+4-2D44 U+6409 # <cjk> [2000]
+4-2D45 U+641E # <cjk> [2000]
+4-2D46 U+6425 # <cjk> [2000]
+4-2D47 U+6429 # <cjk> [2000]
+4-2D48 U+642F # <cjk> [2000]
+4-2D49 U+645A # <cjk> [2000]
+4-2D4A U+645B # <cjk> [2000]
+4-2D4B U+645D # <cjk> [2000]
+4-2D4C U+6473 # <cjk> [2000]
+4-2D4D U+647D # <cjk> [2000]
+4-2D4E U+6487 # <cjk> [2000]
+4-2D4F U+6491 # <cjk> [2000]
+4-2D50 U+649D # <cjk> [2000]
+4-2D51 U+649F # <cjk> [2000]
+4-2D52 U+64CB # <cjk> [2000]
+4-2D53 U+64CC # <cjk> [2000]
+4-2D54 U+64D5 # <cjk> [2000]
+4-2D55 U+64D7 # <cjk> [2000]
+4-2D56 U+22DE1 # <cjk> [2000] [Unicode3.1]
+4-2D57 U+64E4 # <cjk> [2000]
+4-2D58 U+64E5 # <cjk> [2000]
+4-2D59 U+64FF # <cjk> [2000]
+4-2D5A U+6504 # <cjk> [2000]
+4-2D5B U+3A6E # <cjk> [2000]
+4-2D5C U+650F # <cjk> [2000]
+4-2D5D U+6514 # <cjk> [2000]
+4-2D5E U+6516 # <cjk> [2000]
+4-2D5F U+3A73 # <cjk> [2000]
+4-2D60 U+651E # <cjk> [2000]
+4-2D61 U+6532 # <cjk> [2000]
+4-2D62 U+6544 # <cjk> [2000]
+4-2D63 U+6554 # <cjk> [2000]
+4-2D64 U+656B # <cjk> [2000]
+4-2D65 U+657A # <cjk> [2000]
+4-2D66 U+6581 # <cjk> [2000]
+4-2D67 U+6584 # <cjk> [2000]
+4-2D68 U+6585 # <cjk> [2000]
+4-2D69 U+658A # <cjk> [2000]
+4-2D6A U+65B2 # <cjk> [2000]
+4-2D6B U+65B5 # <cjk> [2000]
+4-2D6C U+65B8 # <cjk> [2000]
+4-2D6D U+65BF # <cjk> [2000]
+4-2D6E U+65C2 # <cjk> [2000]
+4-2D6F U+65C9 # <cjk> [2000]
+4-2D70 U+65D4 # <cjk> [2000]
+4-2D71 U+3AD6 # <cjk> [2000]
+4-2D72 U+65F2 # <cjk> [2000]
+4-2D73 U+65F9 # <cjk> [2000]
+4-2D74 U+65FC # <cjk> [2000]
+4-2D75 U+6604 # <cjk> [2000]
+4-2D76 U+6608 # <cjk> [2000]
+4-2D77 U+6621 # <cjk> [2000]
+4-2D78 U+662A # <cjk> [2000]
+4-2D79 U+6645 # <cjk> [2000]
+4-2D7A U+6651 # <cjk> [2000]
+4-2D7B U+664E # <cjk> [2000]
+4-2D7C U+3AEA # <cjk> [2000]
+4-2D7D U+231C3 # <cjk> [2000] [Unicode3.1]
+4-2D7E U+6657 # <cjk> [2000]
+4-2E21 U+665B # <cjk> [2000]
+4-2E22 U+6663 # <cjk> [2000]
+4-2E23 U+231F5 # <cjk> [2000] [Unicode3.1]
+4-2E24 U+231B6 # <cjk> [2000] [Unicode3.1]
+4-2E25 U+666A # <cjk> [2000]
+4-2E26 U+666B # <cjk> [2000]
+4-2E27 U+666C # <cjk> [2000]
+4-2E28 U+666D # <cjk> [2000]
+4-2E29 U+667B # <cjk> [2000]
+4-2E2A U+6680 # <cjk> [2000]
+4-2E2B U+6690 # <cjk> [2000]
+4-2E2C U+6692 # <cjk> [2000]
+4-2E2D U+6699 # <cjk> [2000]
+4-2E2E U+3B0E # <cjk> [2000]
+4-2E2F U+66AD # <cjk> [2000]
+4-2E30 U+66B1 # <cjk> [2000]
+4-2E31 U+66B5 # <cjk> [2000]
+4-2E32 U+3B1A # <cjk> [2000]
+4-2E33 U+66BF # <cjk> [2000]
+4-2E34 U+3B1C # <cjk> [2000]
+4-2E35 U+66EC # <cjk> [2000]
+4-2E36 U+3AD7 # <cjk> [2000]
+4-2E37 U+6701 # <cjk> [2000]
+4-2E38 U+6705 # <cjk> [2000]
+4-2E39 U+6712 # <cjk> [2000]
+4-2E3A U+23372 # <cjk> [2000] [Unicode3.1]
+4-2E3B U+6719 # <cjk> [2000]
+4-2E3C U+233D3 # <cjk> [2000] [Unicode3.1]
+4-2E3D U+233D2 # <cjk> [2000] [Unicode3.1]
+4-2E3E U+674C # <cjk> [2000]
+4-2E3F U+674D # <cjk> [2000]
+4-2E40 U+6754 # <cjk> [2000]
+4-2E41 U+675D # <cjk> [2000]
+4-2E42 U+233D0 # <cjk> [2000] [Unicode3.1]
+4-2E43 U+233E4 # <cjk> [2000] [Unicode3.1]
+4-2E44 U+233D5 # <cjk> [2000] [Unicode3.1]
+4-2E45 U+6774 # <cjk> [2000]
+4-2E46 U+6776 # <cjk> [2000]
+4-2E47 U+233DA # <cjk> [2000] [Unicode3.1]
+4-2E48 U+6792 # <cjk> [2000]
+4-2E49 U+233DF # <cjk> [2000] [Unicode3.1]
+4-2E4A U+8363 # <cjk> [2000]
+4-2E4B U+6810 # <cjk> [2000]
+4-2E4C U+67B0 # <cjk> [2000]
+4-2E4D U+67B2 # <cjk> [2000]
+4-2E4E U+67C3 # <cjk> [2000]
+4-2E4F U+67C8 # <cjk> [2000]
+4-2E50 U+67D2 # <cjk> [2000]
+4-2E51 U+67D9 # <cjk> [2000]
+4-2E52 U+67DB # <cjk> [2000]
+4-2E53 U+67F0 # <cjk> [2000]
+4-2E54 U+67F7 # <cjk> [2000]
+4-2E55 U+2344A # <cjk> [2000] [Unicode3.1]
+4-2E56 U+23451 # <cjk> [2000] [Unicode3.1]
+4-2E57 U+2344B # <cjk> [2000] [Unicode3.1]
+4-2E58 U+6818 # <cjk> [2000]
+4-2E59 U+681F # <cjk> [2000]
+4-2E5A U+682D # <cjk> [2000]
+4-2E5B U+23465 # <cjk> [2000] [Unicode3.1]
+4-2E5C U+6833 # <cjk> [2000]
+4-2E5D U+683B # <cjk> [2000]
+4-2E5E U+683E # <cjk> [2000]
+4-2E5F U+6844 # <cjk> [2000]
+4-2E60 U+6845 # <cjk> [2000]
+4-2E61 U+6849 # <cjk> [2000]
+4-2E62 U+684C # <cjk> [2000]
+4-2E63 U+6855 # <cjk> [2000]
+4-2E64 U+6857 # <cjk> [2000]
+4-2E65 U+3B77 # <cjk> [2000]
+4-2E66 U+686B # <cjk> [2000]
+4-2E67 U+686E # <cjk> [2000]
+4-2E68 U+687A # <cjk> [2000]
+4-2E69 U+687C # <cjk> [2000]
+4-2E6A U+6882 # <cjk> [2000]
+4-2E6B U+6890 # <cjk> [2000]
+4-2E6C U+6896 # <cjk> [2000]
+4-2E6D U+3B6D # <cjk> [2000]
+4-2E6E U+6898 # <cjk> [2000]
+4-2E6F U+6899 # <cjk> [2000]
+4-2E70 U+689A # <cjk> [2000]
+4-2E71 U+689C # <cjk> [2000]
+4-2E72 U+68AA # <cjk> [2000]
+4-2E73 U+68AB # <cjk> [2000]
+4-2E74 U+68B4 # <cjk> [2000]
+4-2E75 U+68BB # <cjk> [2000]
+4-2E76 U+68FB # <cjk> [2000]
+4-2E77 U+234E4 # <cjk> [2000] [Unicode3.1]
+4-2E78 U+2355A # <cjk> [2000] [Unicode3.1]
+4-2E79 U+FA13 # CJK COMPATIBILITY IDEOGRAPH-FA13 [2000]
+4-2E7A U+68C3 # <cjk> [2000]
+4-2E7B U+68C5 # <cjk> [2000]
+4-2E7C U+68CC # <cjk> [2000]
+4-2E7D U+68CF # <cjk> [2000]
+4-2E7E U+68D6 # <cjk> [2000]
+4-2F21 U+68D9 # <cjk> [2000]
+4-2F22 U+68E4 # <cjk> [2000]
+4-2F23 U+68E5 # <cjk> [2000]
+4-2F24 U+68EC # <cjk> [2000]
+4-2F25 U+68F7 # <cjk> [2000]
+4-2F26 U+6903 # <cjk> [2000]
+4-2F27 U+6907 # <cjk> [2000]
+4-2F28 U+3B87 # <cjk> [2000]
+4-2F29 U+3B88 # <cjk> [2000]
+4-2F2A U+23594 # <cjk> [2000] [Unicode3.1]
+4-2F2B U+693B # <cjk> [2000]
+4-2F2C U+3B8D # <cjk> [2000]
+4-2F2D U+6946 # <cjk> [2000]
+4-2F2E U+6969 # <cjk> [2000]
+4-2F2F U+696C # <cjk> [2000]
+4-2F30 U+6972 # <cjk> [2000]
+4-2F31 U+697A # <cjk> [2000]
+4-2F32 U+697F # <cjk> [2000]
+4-2F33 U+6992 # <cjk> [2000]
+4-2F34 U+3BA4 # <cjk> [2000]
+4-2F35 U+6996 # <cjk> [2000]
+4-2F36 U+6998 # <cjk> [2000]
+4-2F37 U+69A6 # <cjk> [2000]
+4-2F38 U+69B0 # <cjk> [2000]
+4-2F39 U+69B7 # <cjk> [2000]
+4-2F3A U+69BA # <cjk> [2000]
+4-2F3B U+69BC # <cjk> [2000]
+4-2F3C U+69C0 # <cjk> [2000]
+4-2F3D U+69D1 # <cjk> [2000]
+4-2F3E U+69D6 # <cjk> [2000]
+4-2F3F U+23639 # <cjk> [2000] [Unicode3.1]
+4-2F40 U+23647 # <cjk> [2000] [Unicode3.1]
+4-2F41 U+6A30 # <cjk> [2000]
+4-2F42 U+23638 # <cjk> [2000] [Unicode3.1]
+4-2F43 U+2363A # <cjk> [2000] [Unicode3.1]
+4-2F44 U+69E3 # <cjk> [2000]
+4-2F45 U+69EE # <cjk> [2000]
+4-2F46 U+69EF # <cjk> [2000]
+4-2F47 U+69F3 # <cjk> [2000]
+4-2F48 U+3BCD # <cjk> [2000]
+4-2F49 U+69F4 # <cjk> [2000]
+4-2F4A U+69FE # <cjk> [2000]
+4-2F4B U+6A11 # <cjk> [2000]
+4-2F4C U+6A1A # <cjk> [2000]
+4-2F4D U+6A1D # <cjk> [2000]
+4-2F4E U+2371C # <cjk> [2000] [Unicode3.1]
+4-2F4F U+6A32 # <cjk> [2000]
+4-2F50 U+6A33 # <cjk> [2000]
+4-2F51 U+6A34 # <cjk> [2000]
+4-2F52 U+6A3F # <cjk> [2000]
+4-2F53 U+6A46 # <cjk> [2000]
+4-2F54 U+6A49 # <cjk> [2000]
+4-2F55 U+6A7A # <cjk> [2000]
+4-2F56 U+6A4E # <cjk> [2000]
+4-2F57 U+6A52 # <cjk> [2000]
+4-2F58 U+6A64 # <cjk> [2000]
+4-2F59 U+2370C # <cjk> [2000] [Unicode3.1]
+4-2F5A U+6A7E # <cjk> [2000]
+4-2F5B U+6A83 # <cjk> [2000]
+4-2F5C U+6A8B # <cjk> [2000]
+4-2F5D U+3BF0 # <cjk> [2000]
+4-2F5E U+6A91 # <cjk> [2000]
+4-2F5F U+6A9F # <cjk> [2000]
+4-2F60 U+6AA1 # <cjk> [2000]
+4-2F61 U+23764 # <cjk> [2000] [Unicode3.1]
+4-2F62 U+6AAB # <cjk> [2000]
+4-2F63 U+6ABD # <cjk> [2000]
+4-2F64 U+6AC6 # <cjk> [2000]
+4-2F65 U+6AD4 # <cjk> [2000]
+4-2F66 U+6AD0 # <cjk> [2000]
+4-2F67 U+6ADC # <cjk> [2000]
+4-2F68 U+6ADD # <cjk> [2000]
+4-2F69 U+237FF # <cjk> [2000] [Unicode3.1]
+4-2F6A U+237E7 # <cjk> [2000] [Unicode3.1]
+4-2F6B U+6AEC # <cjk> [2000]
+4-2F6C U+6AF1 # <cjk> [2000]
+4-2F6D U+6AF2 # <cjk> [2000]
+4-2F6E U+6AF3 # <cjk> [2000]
+4-2F6F U+6AFD # <cjk> [2000]
+4-2F70 U+23824 # <cjk> [2000] [Unicode3.1]
+4-2F71 U+6B0B # <cjk> [2000]
+4-2F72 U+6B0F # <cjk> [2000]
+4-2F73 U+6B10 # <cjk> [2000]
+4-2F74 U+6B11 # <cjk> [2000]
+4-2F75 U+2383D # <cjk> [2000] [Unicode3.1]
+4-2F76 U+6B17 # <cjk> [2000]
+4-2F77 U+3C26 # <cjk> [2000]
+4-2F78 U+6B2F # <cjk> [2000]
+4-2F79 U+6B4A # <cjk> [2000]
+4-2F7A U+6B58 # <cjk> [2000]
+4-2F7B U+6B6C # <cjk> [2000]
+4-2F7C U+6B75 # <cjk> [2000]
+4-2F7D U+6B7A # <cjk> [2000]
+4-2F7E U+6B81 # <cjk> [2000]
+4-6E21 U+6B9B # <cjk> [2000]
+4-6E22 U+6BAE # <cjk> [2000]
+4-6E23 U+23A98 # <cjk> [2000] [Unicode3.1]
+4-6E24 U+6BBD # <cjk> [2000]
+4-6E25 U+6BBE # <cjk> [2000]
+4-6E26 U+6BC7 # <cjk> [2000]
+4-6E27 U+6BC8 # <cjk> [2000]
+4-6E28 U+6BC9 # <cjk> [2000]
+4-6E29 U+6BDA # <cjk> [2000]
+4-6E2A U+6BE6 # <cjk> [2000]
+4-6E2B U+6BE7 # <cjk> [2000]
+4-6E2C U+6BEE # <cjk> [2000]
+4-6E2D U+6BF1 # <cjk> [2000]
+4-6E2E U+6C02 # <cjk> [2000]
+4-6E2F U+6C0A # <cjk> [2000]
+4-6E30 U+6C0E # <cjk> [2000]
+4-6E31 U+6C35 # <cjk> [2000]
+4-6E32 U+6C36 # <cjk> [2000]
+4-6E33 U+6C3A # <cjk> [2000]
+4-6E34 U+23C7F # <cjk> [2000] [Unicode3.1]
+4-6E35 U+6C3F # <cjk> [2000]
+4-6E36 U+6C4D # <cjk> [2000]
+4-6E37 U+6C5B # <cjk> [2000]
+4-6E38 U+6C6D # <cjk> [2000]
+4-6E39 U+6C84 # <cjk> [2000]
+4-6E3A U+6C89 # <cjk> [2000]
+4-6E3B U+3CC3 # <cjk> [2000]
+4-6E3C U+6C94 # <cjk> [2000]
+4-6E3D U+6C95 # <cjk> [2000]
+4-6E3E U+6C97 # <cjk> [2000]
+4-6E3F U+6CAD # <cjk> [2000]
+4-6E40 U+6CC2 # <cjk> [2000]
+4-6E41 U+6CD0 # <cjk> [2000]
+4-6E42 U+3CD2 # <cjk> [2000]
+4-6E43 U+6CD6 # <cjk> [2000]
+4-6E44 U+6CDA # <cjk> [2000]
+4-6E45 U+6CDC # <cjk> [2000]
+4-6E46 U+6CE9 # <cjk> [2000]
+4-6E47 U+6CEC # <cjk> [2000]
+4-6E48 U+6CED # <cjk> [2000]
+4-6E49 U+23D00 # <cjk> [2000] [Unicode3.1]
+4-6E4A U+6D00 # <cjk> [2000]
+4-6E4B U+6D0A # <cjk> [2000]
+4-6E4C U+6D24 # <cjk> [2000]
+4-6E4D U+6D26 # <cjk> [2000]
+4-6E4E U+6D27 # <cjk> [2000]
+4-6E4F U+6C67 # <cjk> [2000]
+4-6E50 U+6D2F # <cjk> [2000]
+4-6E51 U+6D3C # <cjk> [2000]
+4-6E52 U+6D5B # <cjk> [2000]
+4-6E53 U+6D5E # <cjk> [2000]
+4-6E54 U+6D60 # <cjk> [2000]
+4-6E55 U+6D70 # <cjk> [2000]
+4-6E56 U+6D80 # <cjk> [2000]
+4-6E57 U+6D81 # <cjk> [2000]
+4-6E58 U+6D8A # <cjk> [2000]
+4-6E59 U+6D8D # <cjk> [2000]
+4-6E5A U+6D91 # <cjk> [2000]
+4-6E5B U+6D98 # <cjk> [2000]
+4-6E5C U+23D40 # <cjk> [2000] [Unicode3.1]
+4-6E5D U+6E17 # <cjk> [2000]
+4-6E5E U+23DFA # <cjk> [2000] [Unicode3.1]
+4-6E5F U+23DF9 # <cjk> [2000] [Unicode3.1]
+4-6E60 U+23DD3 # <cjk> [2000] [Unicode3.1]
+4-6E61 U+6DAB # <cjk> [2000]
+4-6E62 U+6DAE # <cjk> [2000]
+4-6E63 U+6DB4 # <cjk> [2000]
+4-6E64 U+6DC2 # <cjk> [2000]
+4-6E65 U+6D34 # <cjk> [2000]
+4-6E66 U+6DC8 # <cjk> [2000]
+4-6E67 U+6DCE # <cjk> [2000]
+4-6E68 U+6DCF # <cjk> [2000]
+4-6E69 U+6DD0 # <cjk> [2000]
+4-6E6A U+6DDF # <cjk> [2000]
+4-6E6B U+6DE9 # <cjk> [2000]
+4-6E6C U+6DF6 # <cjk> [2000]
+4-6E6D U+6E36 # <cjk> [2000]
+4-6E6E U+6E1E # <cjk> [2000]
+4-6E6F U+6E22 # <cjk> [2000]
+4-6E70 U+6E27 # <cjk> [2000]
+4-6E71 U+3D11 # <cjk> [2000]
+4-6E72 U+6E32 # <cjk> [2000]
+4-6E73 U+6E3C # <cjk> [2000]
+4-6E74 U+6E48 # <cjk> [2000]
+4-6E75 U+6E49 # <cjk> [2000]
+4-6E76 U+6E4B # <cjk> [2000]
+4-6E77 U+6E4C # <cjk> [2000]
+4-6E78 U+6E4F # <cjk> [2000]
+4-6E79 U+6E51 # <cjk> [2000]
+4-6E7A U+6E53 # <cjk> [2000]
+4-6E7B U+6E54 # <cjk> [2000]
+4-6E7C U+6E57 # <cjk> [2000]
+4-6E7D U+6E63 # <cjk> [2000]
+4-6E7E U+3D1E # <cjk> [2000]
+4-6F21 U+6E93 # <cjk> [2000]
+4-6F22 U+6EA7 # <cjk> [2000]
+4-6F23 U+6EB4 # <cjk> [2000]
+4-6F24 U+6EBF # <cjk> [2000]
+4-6F25 U+6EC3 # <cjk> [2000]
+4-6F26 U+6ECA # <cjk> [2000]
+4-6F27 U+6ED9 # <cjk> [2000]
+4-6F28 U+6F35 # <cjk> [2000]
+4-6F29 U+6EEB # <cjk> [2000]
+4-6F2A U+6EF9 # <cjk> [2000]
+4-6F2B U+6EFB # <cjk> [2000]
+4-6F2C U+6F0A # <cjk> [2000]
+4-6F2D U+6F0C # <cjk> [2000]
+4-6F2E U+6F18 # <cjk> [2000]
+4-6F2F U+6F25 # <cjk> [2000]
+4-6F30 U+6F36 # <cjk> [2000]
+4-6F31 U+6F3C # <cjk> [2000]
+4-6F32 U+23F7E # <cjk> [2000] [Unicode3.1]
+4-6F33 U+6F52 # <cjk> [2000]
+4-6F34 U+6F57 # <cjk> [2000]
+4-6F35 U+6F5A # <cjk> [2000]
+4-6F36 U+6F60 # <cjk> [2000]
+4-6F37 U+6F68 # <cjk> [2000]
+4-6F38 U+6F98 # <cjk> [2000]
+4-6F39 U+6F7D # <cjk> [2000]
+4-6F3A U+6F90 # <cjk> [2000]
+4-6F3B U+6F96 # <cjk> [2000]
+4-6F3C U+6FBE # <cjk> [2000]
+4-6F3D U+6F9F # <cjk> [2000]
+4-6F3E U+6FA5 # <cjk> [2000]
+4-6F3F U+6FAF # <cjk> [2000]
+4-6F40 U+3D64 # <cjk> [2000]
+4-6F41 U+6FB5 # <cjk> [2000]
+4-6F42 U+6FC8 # <cjk> [2000]
+4-6F43 U+6FC9 # <cjk> [2000]
+4-6F44 U+6FDA # <cjk> [2000]
+4-6F45 U+6FDE # <cjk> [2000]
+4-6F46 U+6FE9 # <cjk> [2000]
+4-6F47 U+24096 # <cjk> [2000] [Unicode3.1]
+4-6F48 U+6FFC # <cjk> [2000]
+4-6F49 U+7000 # <cjk> [2000]
+4-6F4A U+7007 # <cjk> [2000]
+4-6F4B U+700A # <cjk> [2000]
+4-6F4C U+7023 # <cjk> [2000]
+4-6F4D U+24103 # <cjk> [2000] [Unicode3.1]
+4-6F4E U+7039 # <cjk> [2000]
+4-6F4F U+703A # <cjk> [2000]
+4-6F50 U+703C # <cjk> [2000]
+4-6F51 U+7043 # <cjk> [2000]
+4-6F52 U+7047 # <cjk> [2000]
+4-6F53 U+704B # <cjk> [2000]
+4-6F54 U+3D9A # <cjk> [2000]
+4-6F55 U+7054 # <cjk> [2000]
+4-6F56 U+7065 # <cjk> [2000]
+4-6F57 U+7069 # <cjk> [2000]
+4-6F58 U+706C # <cjk> [2000]
+4-6F59 U+706E # <cjk> [2000]
+4-6F5A U+7076 # <cjk> [2000]
+4-6F5B U+707E # <cjk> [2000]
+4-6F5C U+7081 # <cjk> [2000]
+4-6F5D U+7086 # <cjk> [2000]
+4-6F5E U+7095 # <cjk> [2000]
+4-6F5F U+7097 # <cjk> [2000]
+4-6F60 U+70BB # <cjk> [2000]
+4-6F61 U+241C6 # <cjk> [2000] [Unicode3.1]
+4-6F62 U+709F # <cjk> [2000]
+4-6F63 U+70B1 # <cjk> [2000]
+4-6F64 U+241FE # <cjk> [2000] [Unicode3.1]
+4-6F65 U+70EC # <cjk> [2000]
+4-6F66 U+70CA # <cjk> [2000]
+4-6F67 U+70D1 # <cjk> [2000]
+4-6F68 U+70D3 # <cjk> [2000]
+4-6F69 U+70DC # <cjk> [2000]
+4-6F6A U+7103 # <cjk> [2000]
+4-6F6B U+7104 # <cjk> [2000]
+4-6F6C U+7106 # <cjk> [2000]
+4-6F6D U+7107 # <cjk> [2000]
+4-6F6E U+7108 # <cjk> [2000]
+4-6F6F U+710C # <cjk> [2000]
+4-6F70 U+3DC0 # <cjk> [2000]
+4-6F71 U+712F # <cjk> [2000]
+4-6F72 U+7131 # <cjk> [2000]
+4-6F73 U+7150 # <cjk> [2000]
+4-6F74 U+714A # <cjk> [2000]
+4-6F75 U+7153 # <cjk> [2000]
+4-6F76 U+715E # <cjk> [2000]
+4-6F77 U+3DD4 # <cjk> [2000]
+4-6F78 U+7196 # <cjk> [2000]
+4-6F79 U+7180 # <cjk> [2000]
+4-6F7A U+719B # <cjk> [2000]
+4-6F7B U+71A0 # <cjk> [2000]
+4-6F7C U+71A2 # <cjk> [2000]
+4-6F7D U+71AE # <cjk> [2000]
+4-6F7E U+71AF # <cjk> [2000]
+4-7021 U+71B3 # <cjk> [2000]
+4-7022 U+243BC # <cjk> [2000] [Unicode3.1]
+4-7023 U+71CB # <cjk> [2000]
+4-7024 U+71D3 # <cjk> [2000]
+4-7025 U+71D9 # <cjk> [2000]
+4-7026 U+71DC # <cjk> [2000]
+4-7027 U+7207 # <cjk> [2000]
+4-7028 U+3E05 # <cjk> [2000]
+4-7029 U+FA49 # CJK COMPATIBILITY IDEOGRAPH-FA49 [2000] [Unicode3.2]
+4-702A U+722B # <cjk> [2000]
+4-702B U+7234 # <cjk> [2000]
+4-702C U+7238 # <cjk> [2000]
+4-702D U+7239 # <cjk> [2000]
+4-702E U+4E2C # <cjk> [2000]
+4-702F U+7242 # <cjk> [2000]
+4-7030 U+7253 # <cjk> [2000]
+4-7031 U+7257 # <cjk> [2000]
+4-7032 U+7263 # <cjk> [2000]
+4-7033 U+24629 # <cjk> [2000] [Unicode3.1]
+4-7034 U+726E # <cjk> [2000]
+4-7035 U+726F # <cjk> [2000]
+4-7036 U+7278 # <cjk> [2000]
+4-7037 U+727F # <cjk> [2000]
+4-7038 U+728E # <cjk> [2000]
+4-7039 U+246A5 # <cjk> [2000] [Unicode3.1]
+4-703A U+72AD # <cjk> [2000]
+4-703B U+72AE # <cjk> [2000]
+4-703C U+72B0 # <cjk> [2000]
+4-703D U+72B1 # <cjk> [2000]
+4-703E U+72C1 # <cjk> [2000]
+4-703F U+3E60 # <cjk> [2000]
+4-7040 U+72CC # <cjk> [2000]
+4-7041 U+3E66 # <cjk> [2000]
+4-7042 U+3E68 # <cjk> [2000]
+4-7043 U+72F3 # <cjk> [2000]
+4-7044 U+72FA # <cjk> [2000]
+4-7045 U+7307 # <cjk> [2000]
+4-7046 U+7312 # <cjk> [2000]
+4-7047 U+7318 # <cjk> [2000]
+4-7048 U+7319 # <cjk> [2000]
+4-7049 U+3E83 # <cjk> [2000]
+4-704A U+7339 # <cjk> [2000]
+4-704B U+732C # <cjk> [2000]
+4-704C U+7331 # <cjk> [2000]
+4-704D U+7333 # <cjk> [2000]
+4-704E U+733D # <cjk> [2000]
+4-704F U+7352 # <cjk> [2000]
+4-7050 U+3E94 # <cjk> [2000]
+4-7051 U+736B # <cjk> [2000]
+4-7052 U+736C # <cjk> [2000]
+4-7053 U+24896 # <cjk> [2000] [Unicode3.1]
+4-7054 U+736E # <cjk> [2000]
+4-7055 U+736F # <cjk> [2000]
+4-7056 U+7371 # <cjk> [2000]
+4-7057 U+7377 # <cjk> [2000]
+4-7058 U+7381 # <cjk> [2000]
+4-7059 U+7385 # <cjk> [2000]
+4-705A U+738A # <cjk> [2000]
+4-705B U+7394 # <cjk> [2000]
+4-705C U+7398 # <cjk> [2000]
+4-705D U+739C # <cjk> [2000]
+4-705E U+739E # <cjk> [2000]
+4-705F U+73A5 # <cjk> [2000]
+4-7060 U+73A8 # <cjk> [2000]
+4-7061 U+73B5 # <cjk> [2000]
+4-7062 U+73B7 # <cjk> [2000]
+4-7063 U+73B9 # <cjk> [2000]
+4-7064 U+73BC # <cjk> [2000]
+4-7065 U+73BF # <cjk> [2000]
+4-7066 U+73C5 # <cjk> [2000]
+4-7067 U+73CB # <cjk> [2000]
+4-7068 U+73E1 # <cjk> [2000]
+4-7069 U+73E7 # <cjk> [2000]
+4-706A U+73F9 # <cjk> [2000]
+4-706B U+7413 # <cjk> [2000]
+4-706C U+73FA # <cjk> [2000]
+4-706D U+7401 # <cjk> [2000]
+4-706E U+7424 # <cjk> [2000]
+4-706F U+7431 # <cjk> [2000]
+4-7070 U+7439 # <cjk> [2000]
+4-7071 U+7453 # <cjk> [2000]
+4-7072 U+7440 # <cjk> [2000]
+4-7073 U+7443 # <cjk> [2000]
+4-7074 U+744D # <cjk> [2000]
+4-7075 U+7452 # <cjk> [2000]
+4-7076 U+745D # <cjk> [2000]
+4-7077 U+7471 # <cjk> [2000]
+4-7078 U+7481 # <cjk> [2000]
+4-7079 U+7485 # <cjk> [2000]
+4-707A U+7488 # <cjk> [2000]
+4-707B U+24A4D # <cjk> [2000] [Unicode3.1]
+4-707C U+7492 # <cjk> [2000]
+4-707D U+7497 # <cjk> [2000]
+4-707E U+7499 # <cjk> [2000]
+4-7121 U+74A0 # <cjk> [2000]
+4-7122 U+74A1 # <cjk> [2000]
+4-7123 U+74A5 # <cjk> [2000]
+4-7124 U+74AA # <cjk> [2000]
+4-7125 U+74AB # <cjk> [2000]
+4-7126 U+74B9 # <cjk> [2000]
+4-7127 U+74BB # <cjk> [2000]
+4-7128 U+74BA # <cjk> [2000]
+4-7129 U+74D6 # <cjk> [2000]
+4-712A U+74D8 # <cjk> [2000]
+4-712B U+74DE # <cjk> [2000]
+4-712C U+74EF # <cjk> [2000]
+4-712D U+74EB # <cjk> [2000]
+4-712E U+24B56 # <cjk> [2000] [Unicode3.1]
+4-712F U+74FA # <cjk> [2000]
+4-7130 U+24B6F # <cjk> [2000] [Unicode3.1]
+4-7131 U+7520 # <cjk> [2000]
+4-7132 U+7524 # <cjk> [2000]
+4-7133 U+752A # <cjk> [2000]
+4-7134 U+3F57 # <cjk> [2000]
+4-7135 U+24C16 # <cjk> [2000] [Unicode3.1]
+4-7136 U+753D # <cjk> [2000]
+4-7137 U+753E # <cjk> [2000]
+4-7138 U+7540 # <cjk> [2000]
+4-7139 U+7548 # <cjk> [2000]
+4-713A U+754E # <cjk> [2000]
+4-713B U+7550 # <cjk> [2000]
+4-713C U+7552 # <cjk> [2000]
+4-713D U+756C # <cjk> [2000]
+4-713E U+7572 # <cjk> [2000]
+4-713F U+7571 # <cjk> [2000]
+4-7140 U+757A # <cjk> [2000]
+4-7141 U+757D # <cjk> [2000]
+4-7142 U+757E # <cjk> [2000]
+4-7143 U+7581 # <cjk> [2000]
+4-7144 U+24D14 # <cjk> [2000] [Unicode3.1]
+4-7145 U+758C # <cjk> [2000]
+4-7146 U+3F75 # <cjk> [2000]
+4-7147 U+75A2 # <cjk> [2000]
+4-7148 U+3F77 # <cjk> [2000]
+4-7149 U+75B0 # <cjk> [2000]
+4-714A U+75B7 # <cjk> [2000]
+4-714B U+75BF # <cjk> [2000]
+4-714C U+75C0 # <cjk> [2000]
+4-714D U+75C6 # <cjk> [2000]
+4-714E U+75CF # <cjk> [2000]
+4-714F U+75D3 # <cjk> [2000]
+4-7150 U+75DD # <cjk> [2000]
+4-7151 U+75DF # <cjk> [2000]
+4-7152 U+75E0 # <cjk> [2000]
+4-7153 U+75E7 # <cjk> [2000]
+4-7154 U+75EC # <cjk> [2000]
+4-7155 U+75EE # <cjk> [2000]
+4-7156 U+75F1 # <cjk> [2000]
+4-7157 U+75F9 # <cjk> [2000]
+4-7158 U+7603 # <cjk> [2000]
+4-7159 U+7618 # <cjk> [2000]
+4-715A U+7607 # <cjk> [2000]
+4-715B U+760F # <cjk> [2000]
+4-715C U+3FAE # <cjk> [2000]
+4-715D U+24E0E # <cjk> [2000] [Unicode3.1]
+4-715E U+7613 # <cjk> [2000]
+4-715F U+761B # <cjk> [2000]
+4-7160 U+761C # <cjk> [2000]
+4-7161 U+24E37 # <cjk> [2000] [Unicode3.1]
+4-7162 U+7625 # <cjk> [2000]
+4-7163 U+7628 # <cjk> [2000]
+4-7164 U+763C # <cjk> [2000]
+4-7165 U+7633 # <cjk> [2000]
+4-7166 U+24E6A # <cjk> [2000] [Unicode3.1]
+4-7167 U+3FC9 # <cjk> [2000]
+4-7168 U+7641 # <cjk> [2000]
+4-7169 U+24E8B # <cjk> [2000] [Unicode3.1]
+4-716A U+7649 # <cjk> [2000]
+4-716B U+7655 # <cjk> [2000]
+4-716C U+3FD7 # <cjk> [2000]
+4-716D U+766E # <cjk> [2000]
+4-716E U+7695 # <cjk> [2000]
+4-716F U+769C # <cjk> [2000]
+4-7170 U+76A1 # <cjk> [2000]
+4-7171 U+76A0 # <cjk> [2000]
+4-7172 U+76A7 # <cjk> [2000]
+4-7173 U+76A8 # <cjk> [2000]
+4-7174 U+76AF # <cjk> [2000]
+4-7175 U+2504A # <cjk> [2000] [Unicode3.1]
+4-7176 U+76C9 # <cjk> [2000]
+4-7177 U+25055 # <cjk> [2000] [Unicode3.1]
+4-7178 U+76E8 # <cjk> [2000]
+4-7179 U+76EC # <cjk> [2000]
+4-717A U+25122 # <cjk> [2000] [Unicode3.1]
+4-717B U+7717 # <cjk> [2000]
+4-717C U+771A # <cjk> [2000]
+4-717D U+772D # <cjk> [2000]
+4-717E U+7735 # <cjk> [2000]
+4-7221 U+251A9 # <cjk> [2000] [Unicode3.1]
+4-7222 U+4039 # <cjk> [2000]
+4-7223 U+251E5 # <cjk> [2000] [Unicode3.1]
+4-7224 U+251CD # <cjk> [2000] [Unicode3.1]
+4-7225 U+7758 # <cjk> [2000]
+4-7226 U+7760 # <cjk> [2000]
+4-7227 U+776A # <cjk> [2000]
+4-7228 U+2521E # <cjk> [2000] [Unicode3.1]
+4-7229 U+7772 # <cjk> [2000]
+4-722A U+777C # <cjk> [2000]
+4-722B U+777D # <cjk> [2000]
+4-722C U+2524C # <cjk> [2000] [Unicode3.1]
+4-722D U+4058 # <cjk> [2000]
+4-722E U+779A # <cjk> [2000]
+4-722F U+779F # <cjk> [2000]
+4-7230 U+77A2 # <cjk> [2000]
+4-7231 U+77A4 # <cjk> [2000]
+4-7232 U+77A9 # <cjk> [2000]
+4-7233 U+77DE # <cjk> [2000]
+4-7234 U+77DF # <cjk> [2000]
+4-7235 U+77E4 # <cjk> [2000]
+4-7236 U+77E6 # <cjk> [2000]
+4-7237 U+77EA # <cjk> [2000]
+4-7238 U+77EC # <cjk> [2000]
+4-7239 U+4093 # <cjk> [2000]
+4-723A U+77F0 # <cjk> [2000]
+4-723B U+77F4 # <cjk> [2000]
+4-723C U+77FB # <cjk> [2000]
+4-723D U+2542E # <cjk> [2000] [Unicode3.1]
+4-723E U+7805 # <cjk> [2000]
+4-723F U+7806 # <cjk> [2000]
+4-7240 U+7809 # <cjk> [2000]
+4-7241 U+780D # <cjk> [2000]
+4-7242 U+7819 # <cjk> [2000]
+4-7243 U+7821 # <cjk> [2000]
+4-7244 U+782C # <cjk> [2000]
+4-7245 U+7847 # <cjk> [2000]
+4-7246 U+7864 # <cjk> [2000]
+4-7247 U+786A # <cjk> [2000]
+4-7248 U+254D9 # <cjk> [2000] [Unicode3.1]
+4-7249 U+788A # <cjk> [2000]
+4-724A U+7894 # <cjk> [2000]
+4-724B U+78A4 # <cjk> [2000]
+4-724C U+789D # <cjk> [2000]
+4-724D U+789E # <cjk> [2000]
+4-724E U+789F # <cjk> [2000]
+4-724F U+78BB # <cjk> [2000]
+4-7250 U+78C8 # <cjk> [2000]
+4-7251 U+78CC # <cjk> [2000]
+4-7252 U+78CE # <cjk> [2000]
+4-7253 U+78D5 # <cjk> [2000]
+4-7254 U+78E0 # <cjk> [2000]
+4-7255 U+78E1 # <cjk> [2000]
+4-7256 U+78E6 # <cjk> [2000]
+4-7257 U+78F9 # <cjk> [2000]
+4-7258 U+78FA # <cjk> [2000]
+4-7259 U+78FB # <cjk> [2000]
+4-725A U+78FE # <cjk> [2000]
+4-725B U+255A7 # <cjk> [2000] [Unicode3.1]
+4-725C U+7910 # <cjk> [2000]
+4-725D U+791B # <cjk> [2000]
+4-725E U+7930 # <cjk> [2000]
+4-725F U+7925 # <cjk> [2000]
+4-7260 U+793B # <cjk> [2000]
+4-7261 U+794A # <cjk> [2000]
+4-7262 U+7958 # <cjk> [2000]
+4-7263 U+795B # <cjk> [2000]
+4-7264 U+4105 # <cjk> [2000]
+4-7265 U+7967 # <cjk> [2000]
+4-7266 U+7972 # <cjk> [2000]
+4-7267 U+7994 # <cjk> [2000]
+4-7268 U+7995 # <cjk> [2000]
+4-7269 U+7996 # <cjk> [2000]
+4-726A U+799B # <cjk> [2000]
+4-726B U+79A1 # <cjk> [2000]
+4-726C U+79A9 # <cjk> [2000]
+4-726D U+79B4 # <cjk> [2000]
+4-726E U+79BB # <cjk> [2000]
+4-726F U+79C2 # <cjk> [2000]
+4-7270 U+79C7 # <cjk> [2000]
+4-7271 U+79CC # <cjk> [2000]
+4-7272 U+79CD # <cjk> [2000]
+4-7273 U+79D6 # <cjk> [2000]
+4-7274 U+4148 # <cjk> [2000]
+4-7275 U+257A9 # <cjk> [2000] [Unicode3.1]
+4-7276 U+257B4 # <cjk> [2000] [Unicode3.1]
+4-7277 U+414F # <cjk> [2000]
+4-7278 U+7A0A # <cjk> [2000]
+4-7279 U+7A11 # <cjk> [2000]
+4-727A U+7A15 # <cjk> [2000]
+4-727B U+7A1B # <cjk> [2000]
+4-727C U+7A1E # <cjk> [2000]
+4-727D U+4163 # <cjk> [2000]
+4-727E U+7A2D # <cjk> [2000]
+4-7321 U+7A38 # <cjk> [2000]
+4-7322 U+7A47 # <cjk> [2000]
+4-7323 U+7A4C # <cjk> [2000]
+4-7324 U+7A56 # <cjk> [2000]
+4-7325 U+7A59 # <cjk> [2000]
+4-7326 U+7A5C # <cjk> [2000]
+4-7327 U+7A5F # <cjk> [2000]
+4-7328 U+7A60 # <cjk> [2000]
+4-7329 U+7A67 # <cjk> [2000]
+4-732A U+7A6A # <cjk> [2000]
+4-732B U+7A75 # <cjk> [2000]
+4-732C U+7A78 # <cjk> [2000]
+4-732D U+7A82 # <cjk> [2000]
+4-732E U+7A8A # <cjk> [2000]
+4-732F U+7A90 # <cjk> [2000]
+4-7330 U+7AA3 # <cjk> [2000]
+4-7331 U+7AAC # <cjk> [2000]
+4-7332 U+259D4 # <cjk> [2000] [Unicode3.1]
+4-7333 U+41B4 # <cjk> [2000]
+4-7334 U+7AB9 # <cjk> [2000]
+4-7335 U+7ABC # <cjk> [2000]
+4-7336 U+7ABE # <cjk> [2000]
+4-7337 U+41BF # <cjk> [2000]
+4-7338 U+7ACC # <cjk> [2000]
+4-7339 U+7AD1 # <cjk> [2000]
+4-733A U+7AE7 # <cjk> [2000]
+4-733B U+7AE8 # <cjk> [2000]
+4-733C U+7AF4 # <cjk> [2000]
+4-733D U+25AE4 # <cjk> [2000] [Unicode3.1]
+4-733E U+25AE3 # <cjk> [2000] [Unicode3.1]
+4-733F U+7B07 # <cjk> [2000]
+4-7340 U+25AF1 # <cjk> [2000] [Unicode3.1]
+4-7341 U+7B3D # <cjk> [2000]
+4-7342 U+7B27 # <cjk> [2000]
+4-7343 U+7B2A # <cjk> [2000]
+4-7344 U+7B2E # <cjk> [2000]
+4-7345 U+7B2F # <cjk> [2000]
+4-7346 U+7B31 # <cjk> [2000]
+4-7347 U+41E6 # <cjk> [2000]
+4-7348 U+41F3 # <cjk> [2000]
+4-7349 U+7B7F # <cjk> [2000]
+4-734A U+7B41 # <cjk> [2000]
+4-734B U+41EE # <cjk> [2000]
+4-734C U+7B55 # <cjk> [2000]
+4-734D U+7B79 # <cjk> [2000]
+4-734E U+7B64 # <cjk> [2000]
+4-734F U+7B66 # <cjk> [2000]
+4-7350 U+7B69 # <cjk> [2000]
+4-7351 U+7B73 # <cjk> [2000]
+4-7352 U+25BB2 # <cjk> [2000] [Unicode3.1]
+4-7353 U+4207 # <cjk> [2000]
+4-7354 U+7B90 # <cjk> [2000]
+4-7355 U+7B91 # <cjk> [2000]
+4-7356 U+7B9B # <cjk> [2000]
+4-7357 U+420E # <cjk> [2000]
+4-7358 U+7BAF # <cjk> [2000]
+4-7359 U+7BB5 # <cjk> [2000]
+4-735A U+7BBC # <cjk> [2000]
+4-735B U+7BC5 # <cjk> [2000]
+4-735C U+7BCA # <cjk> [2000]
+4-735D U+25C4B # <cjk> [2000] [Unicode3.1]
+4-735E U+25C64 # <cjk> [2000] [Unicode3.1]
+4-735F U+7BD4 # <cjk> [2000]
+4-7360 U+7BD6 # <cjk> [2000]
+4-7361 U+7BDA # <cjk> [2000]
+4-7362 U+7BEA # <cjk> [2000]
+4-7363 U+7BF0 # <cjk> [2000]
+4-7364 U+7C03 # <cjk> [2000]
+4-7365 U+7C0B # <cjk> [2000]
+4-7366 U+7C0E # <cjk> [2000]
+4-7367 U+7C0F # <cjk> [2000]
+4-7368 U+7C26 # <cjk> [2000]
+4-7369 U+7C45 # <cjk> [2000]
+4-736A U+7C4A # <cjk> [2000]
+4-736B U+7C51 # <cjk> [2000]
+4-736C U+7C57 # <cjk> [2000]
+4-736D U+7C5E # <cjk> [2000]
+4-736E U+7C61 # <cjk> [2000]
+4-736F U+7C69 # <cjk> [2000]
+4-7370 U+7C6E # <cjk> [2000]
+4-7371 U+7C6F # <cjk> [2000]
+4-7372 U+7C70 # <cjk> [2000]
+4-7373 U+25E2E # <cjk> [2000] [Unicode3.1]
+4-7374 U+25E56 # <cjk> [2000] [Unicode3.1]
+4-7375 U+25E65 # <cjk> [2000] [Unicode3.1]
+4-7376 U+7CA6 # <cjk> [2000]
+4-7377 U+25E62 # <cjk> [2000] [Unicode3.1]
+4-7378 U+7CB6 # <cjk> [2000]
+4-7379 U+7CB7 # <cjk> [2000]
+4-737A U+7CBF # <cjk> [2000]
+4-737B U+25ED8 # <cjk> [2000] [Unicode3.1]
+4-737C U+7CC4 # <cjk> [2000]
+4-737D U+25EC2 # <cjk> [2000] [Unicode3.1]
+4-737E U+7CC8 # <cjk> [2000]
+4-7421 U+7CCD # <cjk> [2000]
+4-7422 U+25EE8 # <cjk> [2000] [Unicode3.1]
+4-7423 U+7CD7 # <cjk> [2000]
+4-7424 U+25F23 # <cjk> [2000] [Unicode3.1]
+4-7425 U+7CE6 # <cjk> [2000]
+4-7426 U+7CEB # <cjk> [2000]
+4-7427 U+25F5C # <cjk> [2000] [Unicode3.1]
+4-7428 U+7CF5 # <cjk> [2000]
+4-7429 U+7D03 # <cjk> [2000]
+4-742A U+7D09 # <cjk> [2000]
+4-742B U+42C6 # <cjk> [2000]
+4-742C U+7D12 # <cjk> [2000]
+4-742D U+7D1E # <cjk> [2000]
+4-742E U+25FE0 # <cjk> [2000] [Unicode3.1]
+4-742F U+25FD4 # <cjk> [2000] [Unicode3.1]
+4-7430 U+7D3D # <cjk> [2000]
+4-7431 U+7D3E # <cjk> [2000]
+4-7432 U+7D40 # <cjk> [2000]
+4-7433 U+7D47 # <cjk> [2000]
+4-7434 U+2600C # <cjk> [2000] [Unicode3.1]
+4-7435 U+25FFB # <cjk> [2000] [Unicode3.1]
+4-7436 U+42D6 # <cjk> [2000]
+4-7437 U+7D59 # <cjk> [2000]
+4-7438 U+7D5A # <cjk> [2000]
+4-7439 U+7D6A # <cjk> [2000]
+4-743A U+7D70 # <cjk> [2000]
+4-743B U+42DD # <cjk> [2000]
+4-743C U+7D7F # <cjk> [2000]
+4-743D U+26017 # <cjk> [2000] [Unicode3.1]
+4-743E U+7D86 # <cjk> [2000]
+4-743F U+7D88 # <cjk> [2000]
+4-7440 U+7D8C # <cjk> [2000]
+4-7441 U+7D97 # <cjk> [2000]
+4-7442 U+26060 # <cjk> [2000] [Unicode3.1]
+4-7443 U+7D9D # <cjk> [2000]
+4-7444 U+7DA7 # <cjk> [2000]
+4-7445 U+7DAA # <cjk> [2000]
+4-7446 U+7DB6 # <cjk> [2000]
+4-7447 U+7DB7 # <cjk> [2000]
+4-7448 U+7DC0 # <cjk> [2000]
+4-7449 U+7DD7 # <cjk> [2000]
+4-744A U+7DD9 # <cjk> [2000]
+4-744B U+7DE6 # <cjk> [2000]
+4-744C U+7DF1 # <cjk> [2000]
+4-744D U+7DF9 # <cjk> [2000]
+4-744E U+4302 # <cjk> [2000]
+4-744F U+260ED # <cjk> [2000] [Unicode3.1]
+4-7450 U+FA58 # CJK COMPATIBILITY IDEOGRAPH-FA58 [2000] [Unicode3.2]
+4-7451 U+7E10 # <cjk> [2000]
+4-7452 U+7E17 # <cjk> [2000]
+4-7453 U+7E1D # <cjk> [2000]
+4-7454 U+7E20 # <cjk> [2000]
+4-7455 U+7E27 # <cjk> [2000]
+4-7456 U+7E2C # <cjk> [2000]
+4-7457 U+7E45 # <cjk> [2000]
+4-7458 U+7E73 # <cjk> [2000]
+4-7459 U+7E75 # <cjk> [2000]
+4-745A U+7E7E # <cjk> [2000]
+4-745B U+7E86 # <cjk> [2000]
+4-745C U+7E87 # <cjk> [2000]
+4-745D U+432B # <cjk> [2000]
+4-745E U+7E91 # <cjk> [2000]
+4-745F U+7E98 # <cjk> [2000]
+4-7460 U+7E9A # <cjk> [2000]
+4-7461 U+4343 # <cjk> [2000]
+4-7462 U+7F3C # <cjk> [2000]
+4-7463 U+7F3B # <cjk> [2000]
+4-7464 U+7F3E # <cjk> [2000]
+4-7465 U+7F43 # <cjk> [2000]
+4-7466 U+7F44 # <cjk> [2000]
+4-7467 U+7F4F # <cjk> [2000]
+4-7468 U+34C1 # <cjk> [2000]
+4-7469 U+26270 # <cjk> [2000] [Unicode3.1]
+4-746A U+7F52 # <cjk> [2000]
+4-746B U+26286 # <cjk> [2000] [Unicode3.1]
+4-746C U+7F61 # <cjk> [2000]
+4-746D U+7F63 # <cjk> [2000]
+4-746E U+7F64 # <cjk> [2000]
+4-746F U+7F6D # <cjk> [2000]
+4-7470 U+7F7D # <cjk> [2000]
+4-7471 U+7F7E # <cjk> [2000]
+4-7472 U+2634C # <cjk> [2000] [Unicode3.1]
+4-7473 U+7F90 # <cjk> [2000]
+4-7474 U+517B # <cjk> [2000]
+4-7475 U+23D0E # <cjk> [2000] [Unicode3.1]
+4-7476 U+7F96 # <cjk> [2000]
+4-7477 U+7F9C # <cjk> [2000]
+4-7478 U+7FAD # <cjk> [2000]
+4-7479 U+26402 # <cjk> [2000] [Unicode3.1]
+4-747A U+7FC3 # <cjk> [2000]
+4-747B U+7FCF # <cjk> [2000]
+4-747C U+7FE3 # <cjk> [2000]
+4-747D U+7FE5 # <cjk> [2000]
+4-747E U+7FEF # <cjk> [2000]
+4-7521 U+7FF2 # <cjk> [2000]
+4-7522 U+8002 # <cjk> [2000]
+4-7523 U+800A # <cjk> [2000]
+4-7524 U+8008 # <cjk> [2000]
+4-7525 U+800E # <cjk> [2000]
+4-7526 U+8011 # <cjk> [2000]
+4-7527 U+8016 # <cjk> [2000]
+4-7528 U+8024 # <cjk> [2000]
+4-7529 U+802C # <cjk> [2000]
+4-752A U+8030 # <cjk> [2000]
+4-752B U+8043 # <cjk> [2000]
+4-752C U+8066 # <cjk> [2000]
+4-752D U+8071 # <cjk> [2000]
+4-752E U+8075 # <cjk> [2000]
+4-752F U+807B # <cjk> [2000]
+4-7530 U+8099 # <cjk> [2000]
+4-7531 U+809C # <cjk> [2000]
+4-7532 U+80A4 # <cjk> [2000]
+4-7533 U+80A7 # <cjk> [2000]
+4-7534 U+80B8 # <cjk> [2000]
+4-7535 U+2667E # <cjk> [2000] [Unicode3.1]
+4-7536 U+80C5 # <cjk> [2000]
+4-7537 U+80D5 # <cjk> [2000]
+4-7538 U+80D8 # <cjk> [2000]
+4-7539 U+80E6 # <cjk> [2000]
+4-753A U+266B0 # <cjk> [2000] [Unicode3.1]
+4-753B U+810D # <cjk> [2000]
+4-753C U+80F5 # <cjk> [2000]
+4-753D U+80FB # <cjk> [2000]
+4-753E U+43EE # <cjk> [2000]
+4-753F U+8135 # <cjk> [2000]
+4-7540 U+8116 # <cjk> [2000]
+4-7541 U+811E # <cjk> [2000]
+4-7542 U+43F0 # <cjk> [2000]
+4-7543 U+8124 # <cjk> [2000]
+4-7544 U+8127 # <cjk> [2000]
+4-7545 U+812C # <cjk> [2000]
+4-7546 U+2671D # <cjk> [2000] [Unicode3.1]
+4-7547 U+813D # <cjk> [2000]
+4-7548 U+4408 # <cjk> [2000]
+4-7549 U+8169 # <cjk> [2000]
+4-754A U+4417 # <cjk> [2000]
+4-754B U+8181 # <cjk> [2000]
+4-754C U+441C # <cjk> [2000]
+4-754D U+8184 # <cjk> [2000]
+4-754E U+8185 # <cjk> [2000]
+4-754F U+4422 # <cjk> [2000]
+4-7550 U+8198 # <cjk> [2000]
+4-7551 U+81B2 # <cjk> [2000]
+4-7552 U+81C1 # <cjk> [2000]
+4-7553 U+81C3 # <cjk> [2000]
+4-7554 U+81D6 # <cjk> [2000]
+4-7555 U+81DB # <cjk> [2000]
+4-7556 U+268DD # <cjk> [2000] [Unicode3.1]
+4-7557 U+81E4 # <cjk> [2000]
+4-7558 U+268EA # <cjk> [2000] [Unicode3.1]
+4-7559 U+81EC # <cjk> [2000]
+4-755A U+26951 # <cjk> [2000] [Unicode3.1]
+4-755B U+81FD # <cjk> [2000]
+4-755C U+81FF # <cjk> [2000]
+4-755D U+2696F # <cjk> [2000] [Unicode3.1]
+4-755E U+8204 # <cjk> [2000]
+4-755F U+269DD # <cjk> [2000] [Unicode3.1]
+4-7560 U+8219 # <cjk> [2000]
+4-7561 U+8221 # <cjk> [2000]
+4-7562 U+8222 # <cjk> [2000]
+4-7563 U+26A1E # <cjk> [2000] [Unicode3.1]
+4-7564 U+8232 # <cjk> [2000]
+4-7565 U+8234 # <cjk> [2000]
+4-7566 U+823C # <cjk> [2000]
+4-7567 U+8246 # <cjk> [2000]
+4-7568 U+8249 # <cjk> [2000]
+4-7569 U+8245 # <cjk> [2000]
+4-756A U+26A58 # <cjk> [2000] [Unicode3.1]
+4-756B U+824B # <cjk> [2000]
+4-756C U+4476 # <cjk> [2000]
+4-756D U+824F # <cjk> [2000]
+4-756E U+447A # <cjk> [2000]
+4-756F U+8257 # <cjk> [2000]
+4-7570 U+26A8C # <cjk> [2000] [Unicode3.1]
+4-7571 U+825C # <cjk> [2000]
+4-7572 U+8263 # <cjk> [2000]
+4-7573 U+26AB7 # <cjk> [2000] [Unicode3.1]
+4-7574 U+FA5D # CJK COMPATIBILITY IDEOGRAPH-FA5D [2000] [Unicode3.2]
+4-7575 U+FA5E # CJK COMPATIBILITY IDEOGRAPH-FA5E [2000] [Unicode3.2]
+4-7576 U+8279 # <cjk> [2000]
+4-7577 U+4491 # <cjk> [2000]
+4-7578 U+827D # <cjk> [2000]
+4-7579 U+827F # <cjk> [2000]
+4-757A U+8283 # <cjk> [2000]
+4-757B U+828A # <cjk> [2000]
+4-757C U+8293 # <cjk> [2000]
+4-757D U+82A7 # <cjk> [2000]
+4-757E U+82A8 # <cjk> [2000]
+4-7621 U+82B2 # <cjk> [2000]
+4-7622 U+82B4 # <cjk> [2000]
+4-7623 U+82BA # <cjk> [2000]
+4-7624 U+82BC # <cjk> [2000]
+4-7625 U+82E2 # <cjk> [2000]
+4-7626 U+82E8 # <cjk> [2000]
+4-7627 U+82F7 # <cjk> [2000]
+4-7628 U+8307 # <cjk> [2000]
+4-7629 U+8308 # <cjk> [2000]
+4-762A U+830C # <cjk> [2000]
+4-762B U+8354 # <cjk> [2000]
+4-762C U+831B # <cjk> [2000]
+4-762D U+831D # <cjk> [2000]
+4-762E U+8330 # <cjk> [2000]
+4-762F U+833C # <cjk> [2000]
+4-7630 U+8344 # <cjk> [2000]
+4-7631 U+8357 # <cjk> [2000]
+4-7632 U+44BE # <cjk> [2000]
+4-7633 U+837F # <cjk> [2000]
+4-7634 U+44D4 # <cjk> [2000]
+4-7635 U+44B3 # <cjk> [2000]
+4-7636 U+838D # <cjk> [2000]
+4-7637 U+8394 # <cjk> [2000]
+4-7638 U+8395 # <cjk> [2000]
+4-7639 U+839B # <cjk> [2000]
+4-763A U+839D # <cjk> [2000]
+4-763B U+83C9 # <cjk> [2000]
+4-763C U+83D0 # <cjk> [2000]
+4-763D U+83D4 # <cjk> [2000]
+4-763E U+83DD # <cjk> [2000]
+4-763F U+83E5 # <cjk> [2000]
+4-7640 U+83F9 # <cjk> [2000]
+4-7641 U+840F # <cjk> [2000]
+4-7642 U+8411 # <cjk> [2000]
+4-7643 U+8415 # <cjk> [2000]
+4-7644 U+26C73 # <cjk> [2000] [Unicode3.1]
+4-7645 U+8417 # <cjk> [2000]
+4-7646 U+8439 # <cjk> [2000]
+4-7647 U+844A # <cjk> [2000]
+4-7648 U+844F # <cjk> [2000]
+4-7649 U+8451 # <cjk> [2000]
+4-764A U+8452 # <cjk> [2000]
+4-764B U+8459 # <cjk> [2000]
+4-764C U+845A # <cjk> [2000]
+4-764D U+845C # <cjk> [2000]
+4-764E U+26CDD # <cjk> [2000] [Unicode3.1]
+4-764F U+8465 # <cjk> [2000]
+4-7650 U+8476 # <cjk> [2000]
+4-7651 U+8478 # <cjk> [2000]
+4-7652 U+847C # <cjk> [2000]
+4-7653 U+8481 # <cjk> [2000]
+4-7654 U+450D # <cjk> [2000]
+4-7655 U+84DC # <cjk> [2000]
+4-7656 U+8497 # <cjk> [2000]
+4-7657 U+84A6 # <cjk> [2000]
+4-7658 U+84BE # <cjk> [2000]
+4-7659 U+4508 # <cjk> [2000]
+4-765A U+84CE # <cjk> [2000]
+4-765B U+84CF # <cjk> [2000]
+4-765C U+84D3 # <cjk> [2000]
+4-765D U+26E65 # <cjk> [2000] [Unicode3.1]
+4-765E U+84E7 # <cjk> [2000]
+4-765F U+84EA # <cjk> [2000]
+4-7660 U+84EF # <cjk> [2000]
+4-7661 U+84F0 # <cjk> [2000]
+4-7662 U+84F1 # <cjk> [2000]
+4-7663 U+84FA # <cjk> [2000]
+4-7664 U+84FD # <cjk> [2000]
+4-7665 U+850C # <cjk> [2000]
+4-7666 U+851B # <cjk> [2000]
+4-7667 U+8524 # <cjk> [2000]
+4-7668 U+8525 # <cjk> [2000]
+4-7669 U+852B # <cjk> [2000]
+4-766A U+8534 # <cjk> [2000]
+4-766B U+854F # <cjk> [2000]
+4-766C U+856F # <cjk> [2000]
+4-766D U+4525 # <cjk> [2000]
+4-766E U+4543 # <cjk> [2000]
+4-766F U+853E # <cjk> [2000]
+4-7670 U+8551 # <cjk> [2000]
+4-7671 U+8553 # <cjk> [2000]
+4-7672 U+855E # <cjk> [2000]
+4-7673 U+8561 # <cjk> [2000]
+4-7674 U+8562 # <cjk> [2000]
+4-7675 U+26F94 # <cjk> [2000] [Unicode3.1]
+4-7676 U+857B # <cjk> [2000]
+4-7677 U+857D # <cjk> [2000]
+4-7678 U+857F # <cjk> [2000]
+4-7679 U+8581 # <cjk> [2000]
+4-767A U+8586 # <cjk> [2000]
+4-767B U+8593 # <cjk> [2000]
+4-767C U+859D # <cjk> [2000]
+4-767D U+859F # <cjk> [2000]
+4-767E U+26FF8 # <cjk> [2000] [Unicode3.1]
+4-7721 U+26FF6 # <cjk> [2000] [Unicode3.1]
+4-7722 U+26FF7 # <cjk> [2000] [Unicode3.1]
+4-7723 U+85B7 # <cjk> [2000]
+4-7724 U+85BC # <cjk> [2000]
+4-7725 U+85C7 # <cjk> [2000]
+4-7726 U+85CA # <cjk> [2000]
+4-7727 U+85D8 # <cjk> [2000]
+4-7728 U+85D9 # <cjk> [2000]
+4-7729 U+85DF # <cjk> [2000]
+4-772A U+85E1 # <cjk> [2000]
+4-772B U+85E6 # <cjk> [2000]
+4-772C U+85F6 # <cjk> [2000]
+4-772D U+8600 # <cjk> [2000]
+4-772E U+8611 # <cjk> [2000]
+4-772F U+861E # <cjk> [2000]
+4-7730 U+8621 # <cjk> [2000]
+4-7731 U+8624 # <cjk> [2000]
+4-7732 U+8627 # <cjk> [2000]
+4-7733 U+2710D # <cjk> [2000] [Unicode3.1]
+4-7734 U+8639 # <cjk> [2000]
+4-7735 U+863C # <cjk> [2000]
+4-7736 U+27139 # <cjk> [2000] [Unicode3.1]
+4-7737 U+8640 # <cjk> [2000]
+4-7738 U+FA20 # CJK COMPATIBILITY IDEOGRAPH-FA20 [2000]
+4-7739 U+8653 # <cjk> [2000]
+4-773A U+8656 # <cjk> [2000]
+4-773B U+866F # <cjk> [2000]
+4-773C U+8677 # <cjk> [2000]
+4-773D U+867A # <cjk> [2000]
+4-773E U+8687 # <cjk> [2000]
+4-773F U+8689 # <cjk> [2000]
+4-7740 U+868D # <cjk> [2000]
+4-7741 U+8691 # <cjk> [2000]
+4-7742 U+869C # <cjk> [2000]
+4-7743 U+869D # <cjk> [2000]
+4-7744 U+86A8 # <cjk> [2000]
+4-7745 U+FA21 # CJK COMPATIBILITY IDEOGRAPH-FA21 [2000]
+4-7746 U+86B1 # <cjk> [2000]
+4-7747 U+86B3 # <cjk> [2000]
+4-7748 U+86C1 # <cjk> [2000]
+4-7749 U+86C3 # <cjk> [2000]
+4-774A U+86D1 # <cjk> [2000]
+4-774B U+86D5 # <cjk> [2000]
+4-774C U+86D7 # <cjk> [2000]
+4-774D U+86E3 # <cjk> [2000]
+4-774E U+86E6 # <cjk> [2000]
+4-774F U+45B8 # <cjk> [2000]
+4-7750 U+8705 # <cjk> [2000]
+4-7751 U+8707 # <cjk> [2000]
+4-7752 U+870E # <cjk> [2000]
+4-7753 U+8710 # <cjk> [2000]
+4-7754 U+8713 # <cjk> [2000]
+4-7755 U+8719 # <cjk> [2000]
+4-7756 U+871F # <cjk> [2000]
+4-7757 U+8721 # <cjk> [2000]
+4-7758 U+8723 # <cjk> [2000]
+4-7759 U+8731 # <cjk> [2000]
+4-775A U+873A # <cjk> [2000]
+4-775B U+873E # <cjk> [2000]
+4-775C U+8740 # <cjk> [2000]
+4-775D U+8743 # <cjk> [2000]
+4-775E U+8751 # <cjk> [2000]
+4-775F U+8758 # <cjk> [2000]
+4-7760 U+8764 # <cjk> [2000]
+4-7761 U+8765 # <cjk> [2000]
+4-7762 U+8772 # <cjk> [2000]
+4-7763 U+877C # <cjk> [2000]
+4-7764 U+273DB # <cjk> [2000] [Unicode3.1]
+4-7765 U+273DA # <cjk> [2000] [Unicode3.1]
+4-7766 U+87A7 # <cjk> [2000]
+4-7767 U+8789 # <cjk> [2000]
+4-7768 U+878B # <cjk> [2000]
+4-7769 U+8793 # <cjk> [2000]
+4-776A U+87A0 # <cjk> [2000]
+4-776B U+273FE # <cjk> [2000] [Unicode3.1]
+4-776C U+45E5 # <cjk> [2000]
+4-776D U+87BE # <cjk> [2000]
+4-776E U+27410 # <cjk> [2000] [Unicode3.1]
+4-776F U+87C1 # <cjk> [2000]
+4-7770 U+87CE # <cjk> [2000]
+4-7771 U+87F5 # <cjk> [2000]
+4-7772 U+87DF # <cjk> [2000]
+4-7773 U+27449 # <cjk> [2000] [Unicode3.1]
+4-7774 U+87E3 # <cjk> [2000]
+4-7775 U+87E5 # <cjk> [2000]
+4-7776 U+87E6 # <cjk> [2000]
+4-7777 U+87EA # <cjk> [2000]
+4-7778 U+87EB # <cjk> [2000]
+4-7779 U+87ED # <cjk> [2000]
+4-777A U+8801 # <cjk> [2000]
+4-777B U+8803 # <cjk> [2000]
+4-777C U+880B # <cjk> [2000]
+4-777D U+8813 # <cjk> [2000]
+4-777E U+8828 # <cjk> [2000]
+4-7821 U+882E # <cjk> [2000]
+4-7822 U+8832 # <cjk> [2000]
+4-7823 U+883C # <cjk> [2000]
+4-7824 U+460F # <cjk> [2000]
+4-7825 U+884A # <cjk> [2000]
+4-7826 U+8858 # <cjk> [2000]
+4-7827 U+885F # <cjk> [2000]
+4-7828 U+8864 # <cjk> [2000]
+4-7829 U+27615 # <cjk> [2000] [Unicode3.1]
+4-782A U+27614 # <cjk> [2000] [Unicode3.1]
+4-782B U+8869 # <cjk> [2000]
+4-782C U+27631 # <cjk> [2000] [Unicode3.1]
+4-782D U+886F # <cjk> [2000]
+4-782E U+88A0 # <cjk> [2000]
+4-782F U+88BC # <cjk> [2000]
+4-7830 U+88BD # <cjk> [2000]
+4-7831 U+88BE # <cjk> [2000]
+4-7832 U+88C0 # <cjk> [2000]
+4-7833 U+88D2 # <cjk> [2000]
+4-7834 U+27693 # <cjk> [2000] [Unicode3.1]
+4-7835 U+88D1 # <cjk> [2000]
+4-7836 U+88D3 # <cjk> [2000]
+4-7837 U+88DB # <cjk> [2000]
+4-7838 U+88F0 # <cjk> [2000]
+4-7839 U+88F1 # <cjk> [2000]
+4-783A U+4641 # <cjk> [2000]
+4-783B U+8901 # <cjk> [2000]
+4-783C U+2770E # <cjk> [2000] [Unicode3.1]
+4-783D U+8937 # <cjk> [2000]
+4-783E U+27723 # <cjk> [2000] [Unicode3.1]
+4-783F U+8942 # <cjk> [2000]
+4-7840 U+8945 # <cjk> [2000]
+4-7841 U+8949 # <cjk> [2000]
+4-7842 U+27752 # <cjk> [2000] [Unicode3.1]
+4-7843 U+4665 # <cjk> [2000]
+4-7844 U+8962 # <cjk> [2000]
+4-7845 U+8980 # <cjk> [2000]
+4-7846 U+8989 # <cjk> [2000]
+4-7847 U+8990 # <cjk> [2000]
+4-7848 U+899F # <cjk> [2000]
+4-7849 U+89B0 # <cjk> [2000]
+4-784A U+89B7 # <cjk> [2000]
+4-784B U+89D6 # <cjk> [2000]
+4-784C U+89D8 # <cjk> [2000]
+4-784D U+89EB # <cjk> [2000]
+4-784E U+46A1 # <cjk> [2000]
+4-784F U+89F1 # <cjk> [2000]
+4-7850 U+89F3 # <cjk> [2000]
+4-7851 U+89FD # <cjk> [2000]
+4-7852 U+89FF # <cjk> [2000]
+4-7853 U+46AF # <cjk> [2000]
+4-7854 U+8A11 # <cjk> [2000]
+4-7855 U+8A14 # <cjk> [2000]
+4-7856 U+27985 # <cjk> [2000] [Unicode3.1]
+4-7857 U+8A21 # <cjk> [2000]
+4-7858 U+8A35 # <cjk> [2000]
+4-7859 U+8A3E # <cjk> [2000]
+4-785A U+8A45 # <cjk> [2000]
+4-785B U+8A4D # <cjk> [2000]
+4-785C U+8A58 # <cjk> [2000]
+4-785D U+8AAE # <cjk> [2000]
+4-785E U+8A90 # <cjk> [2000]
+4-785F U+8AB7 # <cjk> [2000]
+4-7860 U+8ABE # <cjk> [2000]
+4-7861 U+8AD7 # <cjk> [2000]
+4-7862 U+8AFC # <cjk> [2000]
+4-7863 U+27A84 # <cjk> [2000] [Unicode3.1]
+4-7864 U+8B0A # <cjk> [2000]
+4-7865 U+8B05 # <cjk> [2000]
+4-7866 U+8B0D # <cjk> [2000]
+4-7867 U+8B1C # <cjk> [2000]
+4-7868 U+8B1F # <cjk> [2000]
+4-7869 U+8B2D # <cjk> [2000]
+4-786A U+8B43 # <cjk> [2000]
+4-786B U+470C # <cjk> [2000]
+4-786C U+8B51 # <cjk> [2000]
+4-786D U+8B5E # <cjk> [2000]
+4-786E U+8B76 # <cjk> [2000]
+4-786F U+8B7F # <cjk> [2000]
+4-7870 U+8B81 # <cjk> [2000]
+4-7871 U+8B8B # <cjk> [2000]
+4-7872 U+8B94 # <cjk> [2000]
+4-7873 U+8B95 # <cjk> [2000]
+4-7874 U+8B9C # <cjk> [2000]
+4-7875 U+8B9E # <cjk> [2000]
+4-7876 U+8C39 # <cjk> [2000]
+4-7877 U+27BB3 # <cjk> [2000] [Unicode3.1]
+4-7878 U+8C3D # <cjk> [2000]
+4-7879 U+27BBE # <cjk> [2000] [Unicode3.1]
+4-787A U+27BC7 # <cjk> [2000] [Unicode3.1]
+4-787B U+8C45 # <cjk> [2000]
+4-787C U+8C47 # <cjk> [2000]
+4-787D U+8C4F # <cjk> [2000]
+4-787E U+8C54 # <cjk> [2000]
+4-7921 U+8C57 # <cjk> [2000]
+4-7922 U+8C69 # <cjk> [2000]
+4-7923 U+8C6D # <cjk> [2000]
+4-7924 U+8C73 # <cjk> [2000]
+4-7925 U+27CB8 # <cjk> [2000] [Unicode3.1]
+4-7926 U+8C93 # <cjk> [2000]
+4-7927 U+8C92 # <cjk> [2000]
+4-7928 U+8C99 # <cjk> [2000]
+4-7929 U+4764 # <cjk> [2000]
+4-792A U+8C9B # <cjk> [2000]
+4-792B U+8CA4 # <cjk> [2000]
+4-792C U+8CD6 # <cjk> [2000]
+4-792D U+8CD5 # <cjk> [2000]
+4-792E U+8CD9 # <cjk> [2000]
+4-792F U+27DA0 # <cjk> [2000] [Unicode3.1]
+4-7930 U+8CF0 # <cjk> [2000]
+4-7931 U+8CF1 # <cjk> [2000]
+4-7932 U+27E10 # <cjk> [2000] [Unicode3.1]
+4-7933 U+8D09 # <cjk> [2000]
+4-7934 U+8D0E # <cjk> [2000]
+4-7935 U+8D6C # <cjk> [2000]
+4-7936 U+8D84 # <cjk> [2000]
+4-7937 U+8D95 # <cjk> [2000]
+4-7938 U+8DA6 # <cjk> [2000]
+4-7939 U+27FB7 # <cjk> [2000] [Unicode3.1]
+4-793A U+8DC6 # <cjk> [2000]
+4-793B U+8DC8 # <cjk> [2000]
+4-793C U+8DD9 # <cjk> [2000]
+4-793D U+8DEC # <cjk> [2000]
+4-793E U+8E0C # <cjk> [2000]
+4-793F U+47FD # <cjk> [2000]
+4-7940 U+8DFD # <cjk> [2000]
+4-7941 U+8E06 # <cjk> [2000]
+4-7942 U+2808A # <cjk> [2000] [Unicode3.1]
+4-7943 U+8E14 # <cjk> [2000]
+4-7944 U+8E16 # <cjk> [2000]
+4-7945 U+8E21 # <cjk> [2000]
+4-7946 U+8E22 # <cjk> [2000]
+4-7947 U+8E27 # <cjk> [2000]
+4-7948 U+280BB # <cjk> [2000] [Unicode3.1]
+4-7949 U+4816 # <cjk> [2000]
+4-794A U+8E36 # <cjk> [2000]
+4-794B U+8E39 # <cjk> [2000]
+4-794C U+8E4B # <cjk> [2000]
+4-794D U+8E54 # <cjk> [2000]
+4-794E U+8E62 # <cjk> [2000]
+4-794F U+8E6C # <cjk> [2000]
+4-7950 U+8E6D # <cjk> [2000]
+4-7951 U+8E6F # <cjk> [2000]
+4-7952 U+8E98 # <cjk> [2000]
+4-7953 U+8E9E # <cjk> [2000]
+4-7954 U+8EAE # <cjk> [2000]
+4-7955 U+8EB3 # <cjk> [2000]
+4-7956 U+8EB5 # <cjk> [2000]
+4-7957 U+8EB6 # <cjk> [2000]
+4-7958 U+8EBB # <cjk> [2000]
+4-7959 U+28282 # <cjk> [2000] [Unicode3.1]
+4-795A U+8ED1 # <cjk> [2000]
+4-795B U+8ED4 # <cjk> [2000]
+4-795C U+484E # <cjk> [2000]
+4-795D U+8EF9 # <cjk> [2000]
+4-795E U+282F3 # <cjk> [2000] [Unicode3.1]
+4-795F U+8F00 # <cjk> [2000]
+4-7960 U+8F08 # <cjk> [2000]
+4-7961 U+8F17 # <cjk> [2000]
+4-7962 U+8F2B # <cjk> [2000]
+4-7963 U+8F40 # <cjk> [2000]
+4-7964 U+8F4A # <cjk> [2000]
+4-7965 U+8F58 # <cjk> [2000]
+4-7966 U+2840C # <cjk> [2000] [Unicode3.1]
+4-7967 U+8FA4 # <cjk> [2000]
+4-7968 U+8FB4 # <cjk> [2000]
+4-7969 U+FA66 # CJK COMPATIBILITY IDEOGRAPH-FA66 [2000] [Unicode3.2]
+4-796A U+8FB6 # <cjk> [2000]
+4-796B U+28455 # <cjk> [2000] [Unicode3.1]
+4-796C U+8FC1 # <cjk> [2000]
+4-796D U+8FC6 # <cjk> [2000]
+4-796E U+FA24 # CJK COMPATIBILITY IDEOGRAPH-FA24 [2000]
+4-796F U+8FCA # <cjk> [2000]
+4-7970 U+8FCD # <cjk> [2000]
+4-7971 U+8FD3 # <cjk> [2000]
+4-7972 U+8FD5 # <cjk> [2000]
+4-7973 U+8FE0 # <cjk> [2000]
+4-7974 U+8FF1 # <cjk> [2000]
+4-7975 U+8FF5 # <cjk> [2000]
+4-7976 U+8FFB # <cjk> [2000]
+4-7977 U+9002 # <cjk> [2000]
+4-7978 U+900C # <cjk> [2000]
+4-7979 U+9037 # <cjk> [2000]
+4-797A U+2856B # <cjk> [2000] [Unicode3.1]
+4-797B U+9043 # <cjk> [2000]
+4-797C U+9044 # <cjk> [2000]
+4-797D U+905D # <cjk> [2000]
+4-797E U+285C8 # <cjk> [2000] [Unicode3.1]
+4-7A21 U+285C9 # <cjk> [2000] [Unicode3.1]
+4-7A22 U+9085 # <cjk> [2000]
+4-7A23 U+908C # <cjk> [2000]
+4-7A24 U+9090 # <cjk> [2000]
+4-7A25 U+961D # <cjk> [2000]
+4-7A26 U+90A1 # <cjk> [2000]
+4-7A27 U+48B5 # <cjk> [2000]
+4-7A28 U+90B0 # <cjk> [2000]
+4-7A29 U+90B6 # <cjk> [2000]
+4-7A2A U+90C3 # <cjk> [2000]
+4-7A2B U+90C8 # <cjk> [2000]
+4-7A2C U+286D7 # <cjk> [2000] [Unicode3.1]
+4-7A2D U+90DC # <cjk> [2000]
+4-7A2E U+90DF # <cjk> [2000]
+4-7A2F U+286FA # <cjk> [2000] [Unicode3.1]
+4-7A30 U+90F6 # <cjk> [2000]
+4-7A31 U+90F2 # <cjk> [2000]
+4-7A32 U+9100 # <cjk> [2000]
+4-7A33 U+90EB # <cjk> [2000]
+4-7A34 U+90FE # <cjk> [2000]
+4-7A35 U+90FF # <cjk> [2000]
+4-7A36 U+9104 # <cjk> [2000]
+4-7A37 U+9106 # <cjk> [2000]
+4-7A38 U+9118 # <cjk> [2000]
+4-7A39 U+911C # <cjk> [2000]
+4-7A3A U+911E # <cjk> [2000]
+4-7A3B U+9137 # <cjk> [2000]
+4-7A3C U+9139 # <cjk> [2000]
+4-7A3D U+913A # <cjk> [2000]
+4-7A3E U+9146 # <cjk> [2000]
+4-7A3F U+9147 # <cjk> [2000]
+4-7A40 U+9157 # <cjk> [2000]
+4-7A41 U+9159 # <cjk> [2000]
+4-7A42 U+9161 # <cjk> [2000]
+4-7A43 U+9164 # <cjk> [2000]
+4-7A44 U+9174 # <cjk> [2000]
+4-7A45 U+9179 # <cjk> [2000]
+4-7A46 U+9185 # <cjk> [2000]
+4-7A47 U+918E # <cjk> [2000]
+4-7A48 U+91A8 # <cjk> [2000]
+4-7A49 U+91AE # <cjk> [2000]
+4-7A4A U+91B3 # <cjk> [2000]
+4-7A4B U+91B6 # <cjk> [2000]
+4-7A4C U+91C3 # <cjk> [2000]
+4-7A4D U+91C4 # <cjk> [2000]
+4-7A4E U+91DA # <cjk> [2000]
+4-7A4F U+28949 # <cjk> [2000] [Unicode3.1]
+4-7A50 U+28946 # <cjk> [2000] [Unicode3.1]
+4-7A51 U+91EC # <cjk> [2000]
+4-7A52 U+91EE # <cjk> [2000]
+4-7A53 U+9201 # <cjk> [2000]
+4-7A54 U+920A # <cjk> [2000]
+4-7A55 U+9216 # <cjk> [2000]
+4-7A56 U+9217 # <cjk> [2000]
+4-7A57 U+2896B # <cjk> [2000] [Unicode3.1]
+4-7A58 U+9233 # <cjk> [2000]
+4-7A59 U+9242 # <cjk> [2000]
+4-7A5A U+9247 # <cjk> [2000]
+4-7A5B U+924A # <cjk> [2000]
+4-7A5C U+924E # <cjk> [2000]
+4-7A5D U+9251 # <cjk> [2000]
+4-7A5E U+9256 # <cjk> [2000]
+4-7A5F U+9259 # <cjk> [2000]
+4-7A60 U+9260 # <cjk> [2000]
+4-7A61 U+9261 # <cjk> [2000]
+4-7A62 U+9265 # <cjk> [2000]
+4-7A63 U+9267 # <cjk> [2000]
+4-7A64 U+9268 # <cjk> [2000]
+4-7A65 U+28987 # <cjk> [2000] [Unicode3.1]
+4-7A66 U+28988 # <cjk> [2000] [Unicode3.1]
+4-7A67 U+927C # <cjk> [2000]
+4-7A68 U+927D # <cjk> [2000]
+4-7A69 U+927F # <cjk> [2000]
+4-7A6A U+9289 # <cjk> [2000]
+4-7A6B U+928D # <cjk> [2000]
+4-7A6C U+9297 # <cjk> [2000]
+4-7A6D U+9299 # <cjk> [2000]
+4-7A6E U+929F # <cjk> [2000]
+4-7A6F U+92A7 # <cjk> [2000]
+4-7A70 U+92AB # <cjk> [2000]
+4-7A71 U+289BA # <cjk> [2000] [Unicode3.1]
+4-7A72 U+289BB # <cjk> [2000] [Unicode3.1]
+4-7A73 U+92B2 # <cjk> [2000]
+4-7A74 U+92BF # <cjk> [2000]
+4-7A75 U+92C0 # <cjk> [2000]
+4-7A76 U+92C6 # <cjk> [2000]
+4-7A77 U+92CE # <cjk> [2000]
+4-7A78 U+92D0 # <cjk> [2000]
+4-7A79 U+92D7 # <cjk> [2000]
+4-7A7A U+92D9 # <cjk> [2000]
+4-7A7B U+92E5 # <cjk> [2000]
+4-7A7C U+92E7 # <cjk> [2000]
+4-7A7D U+9311 # <cjk> [2000]
+4-7A7E U+28A1E # <cjk> [2000] [Unicode3.1]
+4-7B21 U+28A29 # <cjk> [2000] [Unicode3.1]
+4-7B22 U+92F7 # <cjk> [2000]
+4-7B23 U+92F9 # <cjk> [2000]
+4-7B24 U+92FB # <cjk> [2000]
+4-7B25 U+9302 # <cjk> [2000]
+4-7B26 U+930D # <cjk> [2000]
+4-7B27 U+9315 # <cjk> [2000]
+4-7B28 U+931D # <cjk> [2000]
+4-7B29 U+931E # <cjk> [2000]
+4-7B2A U+9327 # <cjk> [2000]
+4-7B2B U+9329 # <cjk> [2000]
+4-7B2C U+28A71 # <cjk> [2000] [Unicode3.1]
+4-7B2D U+28A43 # <cjk> [2000] [Unicode3.1]
+4-7B2E U+9347 # <cjk> [2000]
+4-7B2F U+9351 # <cjk> [2000]
+4-7B30 U+9357 # <cjk> [2000]
+4-7B31 U+935A # <cjk> [2000]
+4-7B32 U+936B # <cjk> [2000]
+4-7B33 U+9371 # <cjk> [2000]
+4-7B34 U+9373 # <cjk> [2000]
+4-7B35 U+93A1 # <cjk> [2000]
+4-7B36 U+28A99 # <cjk> [2000] [Unicode3.1]
+4-7B37 U+28ACD # <cjk> [2000] [Unicode3.1]
+4-7B38 U+9388 # <cjk> [2000]
+4-7B39 U+938B # <cjk> [2000]
+4-7B3A U+938F # <cjk> [2000]
+4-7B3B U+939E # <cjk> [2000]
+4-7B3C U+93F5 # <cjk> [2000]
+4-7B3D U+28AE4 # <cjk> [2000] [Unicode3.1]
+4-7B3E U+28ADD # <cjk> [2000] [Unicode3.1]
+4-7B3F U+93F1 # <cjk> [2000]
+4-7B40 U+93C1 # <cjk> [2000]
+4-7B41 U+93C7 # <cjk> [2000]
+4-7B42 U+93DC # <cjk> [2000]
+4-7B43 U+93E2 # <cjk> [2000]
+4-7B44 U+93E7 # <cjk> [2000]
+4-7B45 U+9409 # <cjk> [2000]
+4-7B46 U+940F # <cjk> [2000]
+4-7B47 U+9416 # <cjk> [2000]
+4-7B48 U+9417 # <cjk> [2000]
+4-7B49 U+93FB # <cjk> [2000]
+4-7B4A U+9432 # <cjk> [2000]
+4-7B4B U+9434 # <cjk> [2000]
+4-7B4C U+943B # <cjk> [2000]
+4-7B4D U+9445 # <cjk> [2000]
+4-7B4E U+28BC1 # <cjk> [2000] [Unicode3.1]
+4-7B4F U+28BEF # <cjk> [2000] [Unicode3.1]
+4-7B50 U+946D # <cjk> [2000]
+4-7B51 U+946F # <cjk> [2000]
+4-7B52 U+9578 # <cjk> [2000]
+4-7B53 U+9579 # <cjk> [2000]
+4-7B54 U+9586 # <cjk> [2000]
+4-7B55 U+958C # <cjk> [2000]
+4-7B56 U+958D # <cjk> [2000]
+4-7B57 U+28D10 # <cjk> [2000] [Unicode3.1]
+4-7B58 U+95AB # <cjk> [2000]
+4-7B59 U+95B4 # <cjk> [2000]
+4-7B5A U+28D71 # <cjk> [2000] [Unicode3.1]
+4-7B5B U+95C8 # <cjk> [2000]
+4-7B5C U+28DFB # <cjk> [2000] [Unicode3.1]
+4-7B5D U+28E1F # <cjk> [2000] [Unicode3.1]
+4-7B5E U+962C # <cjk> [2000]
+4-7B5F U+9633 # <cjk> [2000]
+4-7B60 U+9634 # <cjk> [2000]
+4-7B61 U+28E36 # <cjk> [2000] [Unicode3.1]
+4-7B62 U+963C # <cjk> [2000]
+4-7B63 U+9641 # <cjk> [2000]
+4-7B64 U+9661 # <cjk> [2000]
+4-7B65 U+28E89 # <cjk> [2000] [Unicode3.1]
+4-7B66 U+9682 # <cjk> [2000]
+4-7B67 U+28EEB # <cjk> [2000] [Unicode3.1]
+4-7B68 U+969A # <cjk> [2000]
+4-7B69 U+28F32 # <cjk> [2000] [Unicode3.1]
+4-7B6A U+49E7 # <cjk> [2000]
+4-7B6B U+96A9 # <cjk> [2000]
+4-7B6C U+96AF # <cjk> [2000]
+4-7B6D U+96B3 # <cjk> [2000]
+4-7B6E U+96BA # <cjk> [2000]
+4-7B6F U+96BD # <cjk> [2000]
+4-7B70 U+49FA # <cjk> [2000]
+4-7B71 U+28FF8 # <cjk> [2000] [Unicode3.1]
+4-7B72 U+96D8 # <cjk> [2000]
+4-7B73 U+96DA # <cjk> [2000]
+4-7B74 U+96DD # <cjk> [2000]
+4-7B75 U+4A04 # <cjk> [2000]
+4-7B76 U+9714 # <cjk> [2000]
+4-7B77 U+9723 # <cjk> [2000]
+4-7B78 U+4A29 # <cjk> [2000]
+4-7B79 U+9736 # <cjk> [2000]
+4-7B7A U+9741 # <cjk> [2000]
+4-7B7B U+9747 # <cjk> [2000]
+4-7B7C U+9755 # <cjk> [2000]
+4-7B7D U+9757 # <cjk> [2000]
+4-7B7E U+975B # <cjk> [2000]
+4-7C21 U+976A # <cjk> [2000]
+4-7C22 U+292A0 # <cjk> [2000] [Unicode3.1]
+4-7C23 U+292B1 # <cjk> [2000] [Unicode3.1]
+4-7C24 U+9796 # <cjk> [2000]
+4-7C25 U+979A # <cjk> [2000]
+4-7C26 U+979E # <cjk> [2000]
+4-7C27 U+97A2 # <cjk> [2000]
+4-7C28 U+97B1 # <cjk> [2000]
+4-7C29 U+97B2 # <cjk> [2000]
+4-7C2A U+97BE # <cjk> [2000]
+4-7C2B U+97CC # <cjk> [2000]
+4-7C2C U+97D1 # <cjk> [2000]
+4-7C2D U+97D4 # <cjk> [2000]
+4-7C2E U+97D8 # <cjk> [2000]
+4-7C2F U+97D9 # <cjk> [2000]
+4-7C30 U+97E1 # <cjk> [2000]
+4-7C31 U+97F1 # <cjk> [2000]
+4-7C32 U+9804 # <cjk> [2000]
+4-7C33 U+980D # <cjk> [2000]
+4-7C34 U+980E # <cjk> [2000]
+4-7C35 U+9814 # <cjk> [2000]
+4-7C36 U+9816 # <cjk> [2000]
+4-7C37 U+4ABC # <cjk> [2000]
+4-7C38 U+29490 # <cjk> [2000] [Unicode3.1]
+4-7C39 U+9823 # <cjk> [2000]
+4-7C3A U+9832 # <cjk> [2000]
+4-7C3B U+9833 # <cjk> [2000]
+4-7C3C U+9825 # <cjk> [2000]
+4-7C3D U+9847 # <cjk> [2000]
+4-7C3E U+9866 # <cjk> [2000]
+4-7C3F U+98AB # <cjk> [2000]
+4-7C40 U+98AD # <cjk> [2000]
+4-7C41 U+98B0 # <cjk> [2000]
+4-7C42 U+295CF # <cjk> [2000] [Unicode3.1]
+4-7C43 U+98B7 # <cjk> [2000]
+4-7C44 U+98B8 # <cjk> [2000]
+4-7C45 U+98BB # <cjk> [2000]
+4-7C46 U+98BC # <cjk> [2000]
+4-7C47 U+98BF # <cjk> [2000]
+4-7C48 U+98C2 # <cjk> [2000]
+4-7C49 U+98C7 # <cjk> [2000]
+4-7C4A U+98CB # <cjk> [2000]
+4-7C4B U+98E0 # <cjk> [2000]
+4-7C4C U+2967F # <cjk> [2000] [Unicode3.1]
+4-7C4D U+98E1 # <cjk> [2000]
+4-7C4E U+98E3 # <cjk> [2000]
+4-7C4F U+98E5 # <cjk> [2000]
+4-7C50 U+98EA # <cjk> [2000]
+4-7C51 U+98F0 # <cjk> [2000]
+4-7C52 U+98F1 # <cjk> [2000]
+4-7C53 U+98F3 # <cjk> [2000]
+4-7C54 U+9908 # <cjk> [2000]
+4-7C55 U+4B3B # <cjk> [2000]
+4-7C56 U+296F0 # <cjk> [2000] [Unicode3.1]
+4-7C57 U+9916 # <cjk> [2000]
+4-7C58 U+9917 # <cjk> [2000]
+4-7C59 U+29719 # <cjk> [2000] [Unicode3.1]
+4-7C5A U+991A # <cjk> [2000]
+4-7C5B U+991B # <cjk> [2000]
+4-7C5C U+991C # <cjk> [2000]
+4-7C5D U+29750 # <cjk> [2000] [Unicode3.1]
+4-7C5E U+9931 # <cjk> [2000]
+4-7C5F U+9932 # <cjk> [2000]
+4-7C60 U+9933 # <cjk> [2000]
+4-7C61 U+993A # <cjk> [2000]
+4-7C62 U+993B # <cjk> [2000]
+4-7C63 U+993C # <cjk> [2000]
+4-7C64 U+9940 # <cjk> [2000]
+4-7C65 U+9941 # <cjk> [2000]
+4-7C66 U+9946 # <cjk> [2000]
+4-7C67 U+994D # <cjk> [2000]
+4-7C68 U+994E # <cjk> [2000]
+4-7C69 U+995C # <cjk> [2000]
+4-7C6A U+995F # <cjk> [2000]
+4-7C6B U+9960 # <cjk> [2000]
+4-7C6C U+99A3 # <cjk> [2000]
+4-7C6D U+99A6 # <cjk> [2000]
+4-7C6E U+99B9 # <cjk> [2000]
+4-7C6F U+99BD # <cjk> [2000]
+4-7C70 U+99BF # <cjk> [2000]
+4-7C71 U+99C3 # <cjk> [2000]
+4-7C72 U+99C9 # <cjk> [2000]
+4-7C73 U+99D4 # <cjk> [2000]
+4-7C74 U+99D9 # <cjk> [2000]
+4-7C75 U+99DE # <cjk> [2000]
+4-7C76 U+298C6 # <cjk> [2000] [Unicode3.1]
+4-7C77 U+99F0 # <cjk> [2000]
+4-7C78 U+99F9 # <cjk> [2000]
+4-7C79 U+99FC # <cjk> [2000]
+4-7C7A U+9A0A # <cjk> [2000]
+4-7C7B U+9A11 # <cjk> [2000]
+4-7C7C U+9A16 # <cjk> [2000]
+4-7C7D U+9A1A # <cjk> [2000]
+4-7C7E U+9A20 # <cjk> [2000]
+4-7D21 U+9A31 # <cjk> [2000]
+4-7D22 U+9A36 # <cjk> [2000]
+4-7D23 U+9A44 # <cjk> [2000]
+4-7D24 U+9A4C # <cjk> [2000]
+4-7D25 U+9A58 # <cjk> [2000]
+4-7D26 U+4BC2 # <cjk> [2000]
+4-7D27 U+9AAF # <cjk> [2000]
+4-7D28 U+4BCA # <cjk> [2000]
+4-7D29 U+9AB7 # <cjk> [2000]
+4-7D2A U+4BD2 # <cjk> [2000]
+4-7D2B U+9AB9 # <cjk> [2000]
+4-7D2C U+29A72 # <cjk> [2000] [Unicode3.1]
+4-7D2D U+9AC6 # <cjk> [2000]
+4-7D2E U+9AD0 # <cjk> [2000]
+4-7D2F U+9AD2 # <cjk> [2000]
+4-7D30 U+9AD5 # <cjk> [2000]
+4-7D31 U+4BE8 # <cjk> [2000]
+4-7D32 U+9ADC # <cjk> [2000]
+4-7D33 U+9AE0 # <cjk> [2000]
+4-7D34 U+9AE5 # <cjk> [2000]
+4-7D35 U+9AE9 # <cjk> [2000]
+4-7D36 U+9B03 # <cjk> [2000]
+4-7D37 U+9B0C # <cjk> [2000]
+4-7D38 U+9B10 # <cjk> [2000]
+4-7D39 U+9B12 # <cjk> [2000]
+4-7D3A U+9B16 # <cjk> [2000]
+4-7D3B U+9B1C # <cjk> [2000]
+4-7D3C U+9B2B # <cjk> [2000]
+4-7D3D U+9B33 # <cjk> [2000]
+4-7D3E U+9B3D # <cjk> [2000]
+4-7D3F U+4C20 # <cjk> [2000]
+4-7D40 U+9B4B # <cjk> [2000]
+4-7D41 U+9B63 # <cjk> [2000]
+4-7D42 U+9B65 # <cjk> [2000]
+4-7D43 U+9B6B # <cjk> [2000]
+4-7D44 U+9B6C # <cjk> [2000]
+4-7D45 U+9B73 # <cjk> [2000]
+4-7D46 U+9B76 # <cjk> [2000]
+4-7D47 U+9B77 # <cjk> [2000]
+4-7D48 U+9BA6 # <cjk> [2000]
+4-7D49 U+9BAC # <cjk> [2000]
+4-7D4A U+9BB1 # <cjk> [2000]
+4-7D4B U+29DDB # <cjk> [2000] [Unicode3.1]
+4-7D4C U+29E3D # <cjk> [2000] [Unicode3.1]
+4-7D4D U+9BB2 # <cjk> [2000]
+4-7D4E U+9BB8 # <cjk> [2000]
+4-7D4F U+9BBE # <cjk> [2000]
+4-7D50 U+9BC7 # <cjk> [2000]
+4-7D51 U+9BF3 # <cjk> [2000]
+4-7D52 U+9BD8 # <cjk> [2000]
+4-7D53 U+9BDD # <cjk> [2000]
+4-7D54 U+9BE7 # <cjk> [2000]
+4-7D55 U+9BEA # <cjk> [2000]
+4-7D56 U+9BEB # <cjk> [2000]
+4-7D57 U+9BEF # <cjk> [2000]
+4-7D58 U+9BEE # <cjk> [2000]
+4-7D59 U+29E15 # <cjk> [2000] [Unicode3.1]
+4-7D5A U+9BFA # <cjk> [2000]
+4-7D5B U+29E8A # <cjk> [2000] [Unicode3.1]
+4-7D5C U+9BF7 # <cjk> [2000]
+4-7D5D U+29E49 # <cjk> [2000] [Unicode3.1]
+4-7D5E U+9C16 # <cjk> [2000]
+4-7D5F U+9C18 # <cjk> [2000]
+4-7D60 U+9C19 # <cjk> [2000]
+4-7D61 U+9C1A # <cjk> [2000]
+4-7D62 U+9C1D # <cjk> [2000]
+4-7D63 U+9C22 # <cjk> [2000]
+4-7D64 U+9C27 # <cjk> [2000]
+4-7D65 U+9C29 # <cjk> [2000]
+4-7D66 U+9C2A # <cjk> [2000]
+4-7D67 U+29EC4 # <cjk> [2000] [Unicode3.1]
+4-7D68 U+9C31 # <cjk> [2000]
+4-7D69 U+9C36 # <cjk> [2000]
+4-7D6A U+9C37 # <cjk> [2000]
+4-7D6B U+9C45 # <cjk> [2000]
+4-7D6C U+9C5C # <cjk> [2000]
+4-7D6D U+29EE9 # <cjk> [2000] [Unicode3.1]
+4-7D6E U+9C49 # <cjk> [2000]
+4-7D6F U+9C4A # <cjk> [2000]
+4-7D70 U+29EDB # <cjk> [2000] [Unicode3.1]
+4-7D71 U+9C54 # <cjk> [2000]
+4-7D72 U+9C58 # <cjk> [2000]
+4-7D73 U+9C5B # <cjk> [2000]
+4-7D74 U+9C5D # <cjk> [2000]
+4-7D75 U+9C5F # <cjk> [2000]
+4-7D76 U+9C69 # <cjk> [2000]
+4-7D77 U+9C6A # <cjk> [2000]
+4-7D78 U+9C6B # <cjk> [2000]
+4-7D79 U+9C6D # <cjk> [2000]
+4-7D7A U+9C6E # <cjk> [2000]
+4-7D7B U+9C70 # <cjk> [2000]
+4-7D7C U+9C72 # <cjk> [2000]
+4-7D7D U+9C75 # <cjk> [2000]
+4-7D7E U+9C7A # <cjk> [2000]
+4-7E21 U+9CE6 # <cjk> [2000]
+4-7E22 U+9CF2 # <cjk> [2000]
+4-7E23 U+9D0B # <cjk> [2000]
+4-7E24 U+9D02 # <cjk> [2000]
+4-7E25 U+29FCE # <cjk> [2000] [Unicode3.1]
+4-7E26 U+9D11 # <cjk> [2000]
+4-7E27 U+9D17 # <cjk> [2000]
+4-7E28 U+9D18 # <cjk> [2000]
+4-7E29 U+2A02F # <cjk> [2000] [Unicode3.1]
+4-7E2A U+4CC4 # <cjk> [2000]
+4-7E2B U+2A01A # <cjk> [2000] [Unicode3.1]
+4-7E2C U+9D32 # <cjk> [2000]
+4-7E2D U+4CD1 # <cjk> [2000]
+4-7E2E U+9D42 # <cjk> [2000]
+4-7E2F U+9D4A # <cjk> [2000]
+4-7E30 U+9D5F # <cjk> [2000]
+4-7E31 U+9D62 # <cjk> [2000]
+4-7E32 U+2A0F9 # <cjk> [2000] [Unicode3.1]
+4-7E33 U+9D69 # <cjk> [2000]
+4-7E34 U+9D6B # <cjk> [2000]
+4-7E35 U+2A082 # <cjk> [2000] [Unicode3.1]
+4-7E36 U+9D73 # <cjk> [2000]
+4-7E37 U+9D76 # <cjk> [2000]
+4-7E38 U+9D77 # <cjk> [2000]
+4-7E39 U+9D7E # <cjk> [2000]
+4-7E3A U+9D84 # <cjk> [2000]
+4-7E3B U+9D8D # <cjk> [2000]
+4-7E3C U+9D99 # <cjk> [2000]
+4-7E3D U+9DA1 # <cjk> [2000]
+4-7E3E U+9DBF # <cjk> [2000]
+4-7E3F U+9DB5 # <cjk> [2000]
+4-7E40 U+9DB9 # <cjk> [2000]
+4-7E41 U+9DBD # <cjk> [2000]
+4-7E42 U+9DC3 # <cjk> [2000]
+4-7E43 U+9DC7 # <cjk> [2000]
+4-7E44 U+9DC9 # <cjk> [2000]
+4-7E45 U+9DD6 # <cjk> [2000]
+4-7E46 U+9DDA # <cjk> [2000]
+4-7E47 U+9DDF # <cjk> [2000]
+4-7E48 U+9DE0 # <cjk> [2000]
+4-7E49 U+9DE3 # <cjk> [2000]
+4-7E4A U+9DF4 # <cjk> [2000]
+4-7E4B U+4D07 # <cjk> [2000]
+4-7E4C U+9E0A # <cjk> [2000]
+4-7E4D U+9E02 # <cjk> [2000]
+4-7E4E U+9E0D # <cjk> [2000]
+4-7E4F U+9E19 # <cjk> [2000]
+4-7E50 U+9E1C # <cjk> [2000]
+4-7E51 U+9E1D # <cjk> [2000]
+4-7E52 U+9E7B # <cjk> [2000]
+4-7E53 U+22218 # <cjk> [2000] [Unicode3.1]
+4-7E54 U+9E80 # <cjk> [2000]
+4-7E55 U+9E85 # <cjk> [2000]
+4-7E56 U+9E9B # <cjk> [2000]
+4-7E57 U+9EA8 # <cjk> [2000]
+4-7E58 U+2A38C # <cjk> [2000] [Unicode3.1]
+4-7E59 U+9EBD # <cjk> [2000]
+4-7E5A U+2A437 # <cjk> [2000] [Unicode3.1]
+4-7E5B U+9EDF # <cjk> [2000]
+4-7E5C U+9EE7 # <cjk> [2000]
+4-7E5D U+9EEE # <cjk> [2000]
+4-7E5E U+9EFF # <cjk> [2000]
+4-7E5F U+9F02 # <cjk> [2000]
+4-7E60 U+4D77 # <cjk> [2000]
+4-7E61 U+9F03 # <cjk> [2000]
+4-7E62 U+9F17 # <cjk> [2000]
+4-7E63 U+9F19 # <cjk> [2000]
+4-7E64 U+9F2F # <cjk> [2000]
+4-7E65 U+9F37 # <cjk> [2000]
+4-7E66 U+9F3A # <cjk> [2000]
+4-7E67 U+9F3D # <cjk> [2000]
+4-7E68 U+9F41 # <cjk> [2000]
+4-7E69 U+9F45 # <cjk> [2000]
+4-7E6A U+9F46 # <cjk> [2000]
+4-7E6B U+9F53 # <cjk> [2000]
+4-7E6C U+9F55 # <cjk> [2000]
+4-7E6D U+9F58 # <cjk> [2000]
+4-7E6E U+2A5F1 # <cjk> [2000] [Unicode3.1]
+4-7E6F U+9F5D # <cjk> [2000]
+4-7E70 U+2A602 # <cjk> [2000] [Unicode3.1]
+4-7E71 U+9F69 # <cjk> [2000]
+4-7E72 U+2A61A # <cjk> [2000] [Unicode3.1]
+4-7E73 U+9F6D # <cjk> [2000]
+4-7E74 U+9F70 # <cjk> [2000]
+4-7E75 U+9F75 # <cjk> [2000]
+4-7E76 U+2A6B2 # <cjk> [2000] [Unicode3.1]
diff --git a/ext/mbstring/tests/data/JISX0201.txt b/ext/mbstring/tests/data/JISX0201.txt
new file mode 100644
index 0000000000..87e9e94192
--- /dev/null
+++ b/ext/mbstring/tests/data/JISX0201.txt
@@ -0,0 +1,202 @@
+#
+# Name: JIS X 0201 (1976) to Unicode 1.1 Table
+# Unicode version: 1.1
+# Table version: 0.9
+# Table format: Format A
+# Date: 8 March 1994
+# Authors: Glenn Adams <glenn@metis.com>
+# John H. Jenkins <John_Jenkins@taligent.com>
+#
+# Copyright (c) 1991-1994 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on magnetic media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Recipient is granted the right to make copies in any form for
+# internal distribution and to freely use the information supplied
+# in the creation of products supporting Unicode. Unicode, Inc.
+# specifically excludes the right to re-distribute this file directly
+# to third parties or other organizations whether for profit or not.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# single-byte JIS X 0201 characters map into Unicode 1.1
+# (ISO/IEC 10646:1-1993 UCS-2).
+#
+# Format: Three tab-separated columns
+# Column #1 is the shift JIS code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode (ISO 10646) name (follows a comment sign)
+#
+# The entries are in JIS order
+#
+# These mappings are provisional, pending definition of
+# official mappings by Japanese standards bodies.
+#
+# Any comments or problems, contact <John_Jenkins@taligent.com>
+#
+#
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x00A5 # YEN SIGN
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x203E # OVERLINE
+0xA1 0xFF61 # HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2 0xFF62 # HALFWIDTH LEFT CORNER BRACKET
+0xA3 0xFF63 # HALFWIDTH RIGHT CORNER BRACKET
+0xA4 0xFF64 # HALFWIDTH IDEOGRAPHIC COMMA
+0xA5 0xFF65 # HALFWIDTH KATAKANA MIDDLE DOT
+0xA6 0xFF66 # HALFWIDTH KATAKANA LETTER WO
+0xA7 0xFF67 # HALFWIDTH KATAKANA LETTER SMALL A
+0xA8 0xFF68 # HALFWIDTH KATAKANA LETTER SMALL I
+0xA9 0xFF69 # HALFWIDTH KATAKANA LETTER SMALL U
+0xAA 0xFF6A # HALFWIDTH KATAKANA LETTER SMALL E
+0xAB 0xFF6B # HALFWIDTH KATAKANA LETTER SMALL O
+0xAC 0xFF6C # HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD 0xFF6D # HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE 0xFF6E # HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF 0xFF6F # HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0 0xFF70 # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1 0xFF71 # HALFWIDTH KATAKANA LETTER A
+0xB2 0xFF72 # HALFWIDTH KATAKANA LETTER I
+0xB3 0xFF73 # HALFWIDTH KATAKANA LETTER U
+0xB4 0xFF74 # HALFWIDTH KATAKANA LETTER E
+0xB5 0xFF75 # HALFWIDTH KATAKANA LETTER O
+0xB6 0xFF76 # HALFWIDTH KATAKANA LETTER KA
+0xB7 0xFF77 # HALFWIDTH KATAKANA LETTER KI
+0xB8 0xFF78 # HALFWIDTH KATAKANA LETTER KU
+0xB9 0xFF79 # HALFWIDTH KATAKANA LETTER KE
+0xBA 0xFF7A # HALFWIDTH KATAKANA LETTER KO
+0xBB 0xFF7B # HALFWIDTH KATAKANA LETTER SA
+0xBC 0xFF7C # HALFWIDTH KATAKANA LETTER SI
+0xBD 0xFF7D # HALFWIDTH KATAKANA LETTER SU
+0xBE 0xFF7E # HALFWIDTH KATAKANA LETTER SE
+0xBF 0xFF7F # HALFWIDTH KATAKANA LETTER SO
+0xC0 0xFF80 # HALFWIDTH KATAKANA LETTER TA
+0xC1 0xFF81 # HALFWIDTH KATAKANA LETTER TI
+0xC2 0xFF82 # HALFWIDTH KATAKANA LETTER TU
+0xC3 0xFF83 # HALFWIDTH KATAKANA LETTER TE
+0xC4 0xFF84 # HALFWIDTH KATAKANA LETTER TO
+0xC5 0xFF85 # HALFWIDTH KATAKANA LETTER NA
+0xC6 0xFF86 # HALFWIDTH KATAKANA LETTER NI
+0xC7 0xFF87 # HALFWIDTH KATAKANA LETTER NU
+0xC8 0xFF88 # HALFWIDTH KATAKANA LETTER NE
+0xC9 0xFF89 # HALFWIDTH KATAKANA LETTER NO
+0xCA 0xFF8A # HALFWIDTH KATAKANA LETTER HA
+0xCB 0xFF8B # HALFWIDTH KATAKANA LETTER HI
+0xCC 0xFF8C # HALFWIDTH KATAKANA LETTER HU
+0xCD 0xFF8D # HALFWIDTH KATAKANA LETTER HE
+0xCE 0xFF8E # HALFWIDTH KATAKANA LETTER HO
+0xCF 0xFF8F # HALFWIDTH KATAKANA LETTER MA
+0xD0 0xFF90 # HALFWIDTH KATAKANA LETTER MI
+0xD1 0xFF91 # HALFWIDTH KATAKANA LETTER MU
+0xD2 0xFF92 # HALFWIDTH KATAKANA LETTER ME
+0xD3 0xFF93 # HALFWIDTH KATAKANA LETTER MO
+0xD4 0xFF94 # HALFWIDTH KATAKANA LETTER YA
+0xD5 0xFF95 # HALFWIDTH KATAKANA LETTER YU
+0xD6 0xFF96 # HALFWIDTH KATAKANA LETTER YO
+0xD7 0xFF97 # HALFWIDTH KATAKANA LETTER RA
+0xD8 0xFF98 # HALFWIDTH KATAKANA LETTER RI
+0xD9 0xFF99 # HALFWIDTH KATAKANA LETTER RU
+0xDA 0xFF9A # HALFWIDTH KATAKANA LETTER RE
+0xDB 0xFF9B # HALFWIDTH KATAKANA LETTER RO
+0xDC 0xFF9C # HALFWIDTH KATAKANA LETTER WA
+0xDD 0xFF9D # HALFWIDTH KATAKANA LETTER N
+0xDE 0xFF9E # HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF 0xFF9F # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
diff --git a/ext/mbstring/tests/data/JISX0208.txt b/ext/mbstring/tests/data/JISX0208.txt
new file mode 100644
index 0000000000..0a9382c276
--- /dev/null
+++ b/ext/mbstring/tests/data/JISX0208.txt
@@ -0,0 +1,6942 @@
+# JIS0208.TXT
+# Date: 2015-12-02 23:50:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: JIS X 0208 (1990) to Unicode
+# Unicode version: 1.1
+# Table version: 2.0
+# Table format: Format A
+# Date: 2011 October 14 (header updated: 2015 December 02)
+#
+# General notes:
+#
+#
+# This table contains one set of mappings from JIS X 0208 (1990) into Unicode.
+# Note that these data are *possible* mappings only and may not be the
+# same as those used by actual products, nor may they be the best suited
+# for all uses. For more information on the mappings between various code
+# pages incorporating the repertoire of JIS X 0208 (1990) and Unicode, consult the
+# VENDORS mapping data.
+#
+#
+# Format: Four tab-separated columns
+# Column #1 is the shift-JIS code (in hex)
+# Column #2 is the JIS X 0208 code (in hex as 0xXXXX)
+# Column #3 is the Unicode (in hex as 0xXXXX)
+# Column #4 the Unicode name (follows a comment sign, '#')
+# The official names for Unicode characters U+4E00
+# to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX",
+# where XXXX is the code point. Including all these
+# names in this file increases its size substantially
+# and needlessly. The token "<CJK>" is used for the
+# name of these characters. If necessary, it can be
+# expanded algorithmically by a parser or editor.
+#
+# The entries are in JIS X 0208 order
+#
+# The following algorithms can be used to change the hex form
+# of JIS 0208 to other standard forms:
+#
+# To change hex to EUC form, add 0x8080
+# To change hex to kuten form, first subtract 0x2020. Then
+# the high and low bytes correspond to the ku and ten of
+# the kuten form. For example, 0x2121 -> 0x0101 -> 0101;
+# 0x7426 -> 0x5406 -> 8406
+#
+# Revision History:
+#
+# [v2.0, 2015 December 02]
+# updates to copyright notice and terms of use
+# no changes to character mappings
+#
+# [v1.0, 2011 October 14]
+# Updated terms of use to current wording.
+# Updated contact information.
+# No changes to the mapping data.
+#
+# [v0.9, 8 March 1994]
+# First release.
+#
+# Use the Unicode reporting form <http://www.unicode.org/reporting.html>
+# for any questions or comments or to report errors in the data.
+#
+0x8140 0x2121 0x3000 # IDEOGRAPHIC SPACE
+0x8141 0x2122 0x3001 # IDEOGRAPHIC COMMA
+0x8142 0x2123 0x3002 # IDEOGRAPHIC FULL STOP
+0x8143 0x2124 0xFF0C # FULLWIDTH COMMA
+0x8144 0x2125 0xFF0E # FULLWIDTH FULL STOP
+0x8145 0x2126 0x30FB # KATAKANA MIDDLE DOT
+0x8146 0x2127 0xFF1A # FULLWIDTH COLON
+0x8147 0x2128 0xFF1B # FULLWIDTH SEMICOLON
+0x8148 0x2129 0xFF1F # FULLWIDTH QUESTION MARK
+0x8149 0x212A 0xFF01 # FULLWIDTH EXCLAMATION MARK
+0x814A 0x212B 0x309B # KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B 0x212C 0x309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C 0x212D 0x00B4 # ACUTE ACCENT
+0x814D 0x212E 0xFF40 # FULLWIDTH GRAVE ACCENT
+0x814E 0x212F 0x00A8 # DIAERESIS
+0x814F 0x2130 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT
+0x8150 0x2131 0xFFE3 # FULLWIDTH MACRON
+0x8151 0x2132 0xFF3F # FULLWIDTH LOW LINE
+0x8152 0x2133 0x30FD # KATAKANA ITERATION MARK
+0x8153 0x2134 0x30FE # KATAKANA VOICED ITERATION MARK
+0x8154 0x2135 0x309D # HIRAGANA ITERATION MARK
+0x8155 0x2136 0x309E # HIRAGANA VOICED ITERATION MARK
+0x8156 0x2137 0x3003 # DITTO MARK
+0x8157 0x2138 0x4EDD # <CJK>
+0x8158 0x2139 0x3005 # IDEOGRAPHIC ITERATION MARK
+0x8159 0x213A 0x3006 # IDEOGRAPHIC CLOSING MARK
+0x815A 0x213B 0x3007 # IDEOGRAPHIC NUMBER ZERO
+0x815B 0x213C 0x30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C 0x213D 0x2015 # HORIZONTAL BAR
+0x815D 0x213E 0x2010 # HYPHEN
+0x815E 0x213F 0xFF0F # FULLWIDTH SOLIDUS
+0x815F 0x2140 0x005C # REVERSE SOLIDUS
+0x8160 0x2141 0x301C # WAVE DASH
+0x8161 0x2142 0x2016 # DOUBLE VERTICAL LINE
+0x8162 0x2143 0xFF5C # FULLWIDTH VERTICAL LINE
+0x8163 0x2144 0x2026 # HORIZONTAL ELLIPSIS
+0x8164 0x2145 0x2025 # TWO DOT LEADER
+0x8165 0x2146 0x2018 # LEFT SINGLE QUOTATION MARK
+0x8166 0x2147 0x2019 # RIGHT SINGLE QUOTATION MARK
+0x8167 0x2148 0x201C # LEFT DOUBLE QUOTATION MARK
+0x8168 0x2149 0x201D # RIGHT DOUBLE QUOTATION MARK
+0x8169 0x214A 0xFF08 # FULLWIDTH LEFT PARENTHESIS
+0x816A 0x214B 0xFF09 # FULLWIDTH RIGHT PARENTHESIS
+0x816B 0x214C 0x3014 # LEFT TORTOISE SHELL BRACKET
+0x816C 0x214D 0x3015 # RIGHT TORTOISE SHELL BRACKET
+0x816D 0x214E 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET
+0x816E 0x214F 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET
+0x816F 0x2150 0xFF5B # FULLWIDTH LEFT CURLY BRACKET
+0x8170 0x2151 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET
+0x8171 0x2152 0x3008 # LEFT ANGLE BRACKET
+0x8172 0x2153 0x3009 # RIGHT ANGLE BRACKET
+0x8173 0x2154 0x300A # LEFT DOUBLE ANGLE BRACKET
+0x8174 0x2155 0x300B # RIGHT DOUBLE ANGLE BRACKET
+0x8175 0x2156 0x300C # LEFT CORNER BRACKET
+0x8176 0x2157 0x300D # RIGHT CORNER BRACKET
+0x8177 0x2158 0x300E # LEFT WHITE CORNER BRACKET
+0x8178 0x2159 0x300F # RIGHT WHITE CORNER BRACKET
+0x8179 0x215A 0x3010 # LEFT BLACK LENTICULAR BRACKET
+0x817A 0x215B 0x3011 # RIGHT BLACK LENTICULAR BRACKET
+0x817B 0x215C 0xFF0B # FULLWIDTH PLUS SIGN
+0x817C 0x215D 0x2212 # MINUS SIGN
+0x817D 0x215E 0x00B1 # PLUS-MINUS SIGN
+0x817E 0x215F 0x00D7 # MULTIPLICATION SIGN
+0x8180 0x2160 0x00F7 # DIVISION SIGN
+0x8181 0x2161 0xFF1D # FULLWIDTH EQUALS SIGN
+0x8182 0x2162 0x2260 # NOT EQUAL TO
+0x8183 0x2163 0xFF1C # FULLWIDTH LESS-THAN SIGN
+0x8184 0x2164 0xFF1E # FULLWIDTH GREATER-THAN SIGN
+0x8185 0x2165 0x2266 # LESS-THAN OVER EQUAL TO
+0x8186 0x2166 0x2267 # GREATER-THAN OVER EQUAL TO
+0x8187 0x2167 0x221E # INFINITY
+0x8188 0x2168 0x2234 # THEREFORE
+0x8189 0x2169 0x2642 # MALE SIGN
+0x818A 0x216A 0x2640 # FEMALE SIGN
+0x818B 0x216B 0x00B0 # DEGREE SIGN
+0x818C 0x216C 0x2032 # PRIME
+0x818D 0x216D 0x2033 # DOUBLE PRIME
+0x818E 0x216E 0x2103 # DEGREE CELSIUS
+0x818F 0x216F 0xFFE5 # FULLWIDTH YEN SIGN
+0x8190 0x2170 0xFF04 # FULLWIDTH DOLLAR SIGN
+0x8191 0x2171 0x00A2 # CENT SIGN
+0x8192 0x2172 0x00A3 # POUND SIGN
+0x8193 0x2173 0xFF05 # FULLWIDTH PERCENT SIGN
+0x8194 0x2174 0xFF03 # FULLWIDTH NUMBER SIGN
+0x8195 0x2175 0xFF06 # FULLWIDTH AMPERSAND
+0x8196 0x2176 0xFF0A # FULLWIDTH ASTERISK
+0x8197 0x2177 0xFF20 # FULLWIDTH COMMERCIAL AT
+0x8198 0x2178 0x00A7 # SECTION SIGN
+0x8199 0x2179 0x2606 # WHITE STAR
+0x819A 0x217A 0x2605 # BLACK STAR
+0x819B 0x217B 0x25CB # WHITE CIRCLE
+0x819C 0x217C 0x25CF # BLACK CIRCLE
+0x819D 0x217D 0x25CE # BULLSEYE
+0x819E 0x217E 0x25C7 # WHITE DIAMOND
+0x819F 0x2221 0x25C6 # BLACK DIAMOND
+0x81A0 0x2222 0x25A1 # WHITE SQUARE
+0x81A1 0x2223 0x25A0 # BLACK SQUARE
+0x81A2 0x2224 0x25B3 # WHITE UP-POINTING TRIANGLE
+0x81A3 0x2225 0x25B2 # BLACK UP-POINTING TRIANGLE
+0x81A4 0x2226 0x25BD # WHITE DOWN-POINTING TRIANGLE
+0x81A5 0x2227 0x25BC # BLACK DOWN-POINTING TRIANGLE
+0x81A6 0x2228 0x203B # REFERENCE MARK
+0x81A7 0x2229 0x3012 # POSTAL MARK
+0x81A8 0x222A 0x2192 # RIGHTWARDS ARROW
+0x81A9 0x222B 0x2190 # LEFTWARDS ARROW
+0x81AA 0x222C 0x2191 # UPWARDS ARROW
+0x81AB 0x222D 0x2193 # DOWNWARDS ARROW
+0x81AC 0x222E 0x3013 # GETA MARK
+0x81B8 0x223A 0x2208 # ELEMENT OF
+0x81B9 0x223B 0x220B # CONTAINS AS MEMBER
+0x81BA 0x223C 0x2286 # SUBSET OF OR EQUAL TO
+0x81BB 0x223D 0x2287 # SUPERSET OF OR EQUAL TO
+0x81BC 0x223E 0x2282 # SUBSET OF
+0x81BD 0x223F 0x2283 # SUPERSET OF
+0x81BE 0x2240 0x222A # UNION
+0x81BF 0x2241 0x2229 # INTERSECTION
+0x81C8 0x224A 0x2227 # LOGICAL AND
+0x81C9 0x224B 0x2228 # LOGICAL OR
+0x81CA 0x224C 0x00AC # NOT SIGN
+0x81CB 0x224D 0x21D2 # RIGHTWARDS DOUBLE ARROW
+0x81CC 0x224E 0x21D4 # LEFT RIGHT DOUBLE ARROW
+0x81CD 0x224F 0x2200 # FOR ALL
+0x81CE 0x2250 0x2203 # THERE EXISTS
+0x81DA 0x225C 0x2220 # ANGLE
+0x81DB 0x225D 0x22A5 # UP TACK
+0x81DC 0x225E 0x2312 # ARC
+0x81DD 0x225F 0x2202 # PARTIAL DIFFERENTIAL
+0x81DE 0x2260 0x2207 # NABLA
+0x81DF 0x2261 0x2261 # IDENTICAL TO
+0x81E0 0x2262 0x2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x81E1 0x2263 0x226A # MUCH LESS-THAN
+0x81E2 0x2264 0x226B # MUCH GREATER-THAN
+0x81E3 0x2265 0x221A # SQUARE ROOT
+0x81E4 0x2266 0x223D # REVERSED TILDE
+0x81E5 0x2267 0x221D # PROPORTIONAL TO
+0x81E6 0x2268 0x2235 # BECAUSE
+0x81E7 0x2269 0x222B # INTEGRAL
+0x81E8 0x226A 0x222C # DOUBLE INTEGRAL
+0x81F0 0x2272 0x212B # ANGSTROM SIGN
+0x81F1 0x2273 0x2030 # PER MILLE SIGN
+0x81F2 0x2274 0x266F # MUSIC SHARP SIGN
+0x81F3 0x2275 0x266D # MUSIC FLAT SIGN
+0x81F4 0x2276 0x266A # EIGHTH NOTE
+0x81F5 0x2277 0x2020 # DAGGER
+0x81F6 0x2278 0x2021 # DOUBLE DAGGER
+0x81F7 0x2279 0x00B6 # PILCROW SIGN
+0x81FC 0x227E 0x25EF # LARGE CIRCLE
+0x824F 0x2330 0xFF10 # FULLWIDTH DIGIT ZERO
+0x8250 0x2331 0xFF11 # FULLWIDTH DIGIT ONE
+0x8251 0x2332 0xFF12 # FULLWIDTH DIGIT TWO
+0x8252 0x2333 0xFF13 # FULLWIDTH DIGIT THREE
+0x8253 0x2334 0xFF14 # FULLWIDTH DIGIT FOUR
+0x8254 0x2335 0xFF15 # FULLWIDTH DIGIT FIVE
+0x8255 0x2336 0xFF16 # FULLWIDTH DIGIT SIX
+0x8256 0x2337 0xFF17 # FULLWIDTH DIGIT SEVEN
+0x8257 0x2338 0xFF18 # FULLWIDTH DIGIT EIGHT
+0x8258 0x2339 0xFF19 # FULLWIDTH DIGIT NINE
+0x8260 0x2341 0xFF21 # FULLWIDTH LATIN CAPITAL LETTER A
+0x8261 0x2342 0xFF22 # FULLWIDTH LATIN CAPITAL LETTER B
+0x8262 0x2343 0xFF23 # FULLWIDTH LATIN CAPITAL LETTER C
+0x8263 0x2344 0xFF24 # FULLWIDTH LATIN CAPITAL LETTER D
+0x8264 0x2345 0xFF25 # FULLWIDTH LATIN CAPITAL LETTER E
+0x8265 0x2346 0xFF26 # FULLWIDTH LATIN CAPITAL LETTER F
+0x8266 0x2347 0xFF27 # FULLWIDTH LATIN CAPITAL LETTER G
+0x8267 0x2348 0xFF28 # FULLWIDTH LATIN CAPITAL LETTER H
+0x8268 0x2349 0xFF29 # FULLWIDTH LATIN CAPITAL LETTER I
+0x8269 0x234A 0xFF2A # FULLWIDTH LATIN CAPITAL LETTER J
+0x826A 0x234B 0xFF2B # FULLWIDTH LATIN CAPITAL LETTER K
+0x826B 0x234C 0xFF2C # FULLWIDTH LATIN CAPITAL LETTER L
+0x826C 0x234D 0xFF2D # FULLWIDTH LATIN CAPITAL LETTER M
+0x826D 0x234E 0xFF2E # FULLWIDTH LATIN CAPITAL LETTER N
+0x826E 0x234F 0xFF2F # FULLWIDTH LATIN CAPITAL LETTER O
+0x826F 0x2350 0xFF30 # FULLWIDTH LATIN CAPITAL LETTER P
+0x8270 0x2351 0xFF31 # FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271 0x2352 0xFF32 # FULLWIDTH LATIN CAPITAL LETTER R
+0x8272 0x2353 0xFF33 # FULLWIDTH LATIN CAPITAL LETTER S
+0x8273 0x2354 0xFF34 # FULLWIDTH LATIN CAPITAL LETTER T
+0x8274 0x2355 0xFF35 # FULLWIDTH LATIN CAPITAL LETTER U
+0x8275 0x2356 0xFF36 # FULLWIDTH LATIN CAPITAL LETTER V
+0x8276 0x2357 0xFF37 # FULLWIDTH LATIN CAPITAL LETTER W
+0x8277 0x2358 0xFF38 # FULLWIDTH LATIN CAPITAL LETTER X
+0x8278 0x2359 0xFF39 # FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279 0x235A 0xFF3A # FULLWIDTH LATIN CAPITAL LETTER Z
+0x8281 0x2361 0xFF41 # FULLWIDTH LATIN SMALL LETTER A
+0x8282 0x2362 0xFF42 # FULLWIDTH LATIN SMALL LETTER B
+0x8283 0x2363 0xFF43 # FULLWIDTH LATIN SMALL LETTER C
+0x8284 0x2364 0xFF44 # FULLWIDTH LATIN SMALL LETTER D
+0x8285 0x2365 0xFF45 # FULLWIDTH LATIN SMALL LETTER E
+0x8286 0x2366 0xFF46 # FULLWIDTH LATIN SMALL LETTER F
+0x8287 0x2367 0xFF47 # FULLWIDTH LATIN SMALL LETTER G
+0x8288 0x2368 0xFF48 # FULLWIDTH LATIN SMALL LETTER H
+0x8289 0x2369 0xFF49 # FULLWIDTH LATIN SMALL LETTER I
+0x828A 0x236A 0xFF4A # FULLWIDTH LATIN SMALL LETTER J
+0x828B 0x236B 0xFF4B # FULLWIDTH LATIN SMALL LETTER K
+0x828C 0x236C 0xFF4C # FULLWIDTH LATIN SMALL LETTER L
+0x828D 0x236D 0xFF4D # FULLWIDTH LATIN SMALL LETTER M
+0x828E 0x236E 0xFF4E # FULLWIDTH LATIN SMALL LETTER N
+0x828F 0x236F 0xFF4F # FULLWIDTH LATIN SMALL LETTER O
+0x8290 0x2370 0xFF50 # FULLWIDTH LATIN SMALL LETTER P
+0x8291 0x2371 0xFF51 # FULLWIDTH LATIN SMALL LETTER Q
+0x8292 0x2372 0xFF52 # FULLWIDTH LATIN SMALL LETTER R
+0x8293 0x2373 0xFF53 # FULLWIDTH LATIN SMALL LETTER S
+0x8294 0x2374 0xFF54 # FULLWIDTH LATIN SMALL LETTER T
+0x8295 0x2375 0xFF55 # FULLWIDTH LATIN SMALL LETTER U
+0x8296 0x2376 0xFF56 # FULLWIDTH LATIN SMALL LETTER V
+0x8297 0x2377 0xFF57 # FULLWIDTH LATIN SMALL LETTER W
+0x8298 0x2378 0xFF58 # FULLWIDTH LATIN SMALL LETTER X
+0x8299 0x2379 0xFF59 # FULLWIDTH LATIN SMALL LETTER Y
+0x829A 0x237A 0xFF5A # FULLWIDTH LATIN SMALL LETTER Z
+0x829F 0x2421 0x3041 # HIRAGANA LETTER SMALL A
+0x82A0 0x2422 0x3042 # HIRAGANA LETTER A
+0x82A1 0x2423 0x3043 # HIRAGANA LETTER SMALL I
+0x82A2 0x2424 0x3044 # HIRAGANA LETTER I
+0x82A3 0x2425 0x3045 # HIRAGANA LETTER SMALL U
+0x82A4 0x2426 0x3046 # HIRAGANA LETTER U
+0x82A5 0x2427 0x3047 # HIRAGANA LETTER SMALL E
+0x82A6 0x2428 0x3048 # HIRAGANA LETTER E
+0x82A7 0x2429 0x3049 # HIRAGANA LETTER SMALL O
+0x82A8 0x242A 0x304A # HIRAGANA LETTER O
+0x82A9 0x242B 0x304B # HIRAGANA LETTER KA
+0x82AA 0x242C 0x304C # HIRAGANA LETTER GA
+0x82AB 0x242D 0x304D # HIRAGANA LETTER KI
+0x82AC 0x242E 0x304E # HIRAGANA LETTER GI
+0x82AD 0x242F 0x304F # HIRAGANA LETTER KU
+0x82AE 0x2430 0x3050 # HIRAGANA LETTER GU
+0x82AF 0x2431 0x3051 # HIRAGANA LETTER KE
+0x82B0 0x2432 0x3052 # HIRAGANA LETTER GE
+0x82B1 0x2433 0x3053 # HIRAGANA LETTER KO
+0x82B2 0x2434 0x3054 # HIRAGANA LETTER GO
+0x82B3 0x2435 0x3055 # HIRAGANA LETTER SA
+0x82B4 0x2436 0x3056 # HIRAGANA LETTER ZA
+0x82B5 0x2437 0x3057 # HIRAGANA LETTER SI
+0x82B6 0x2438 0x3058 # HIRAGANA LETTER ZI
+0x82B7 0x2439 0x3059 # HIRAGANA LETTER SU
+0x82B8 0x243A 0x305A # HIRAGANA LETTER ZU
+0x82B9 0x243B 0x305B # HIRAGANA LETTER SE
+0x82BA 0x243C 0x305C # HIRAGANA LETTER ZE
+0x82BB 0x243D 0x305D # HIRAGANA LETTER SO
+0x82BC 0x243E 0x305E # HIRAGANA LETTER ZO
+0x82BD 0x243F 0x305F # HIRAGANA LETTER TA
+0x82BE 0x2440 0x3060 # HIRAGANA LETTER DA
+0x82BF 0x2441 0x3061 # HIRAGANA LETTER TI
+0x82C0 0x2442 0x3062 # HIRAGANA LETTER DI
+0x82C1 0x2443 0x3063 # HIRAGANA LETTER SMALL TU
+0x82C2 0x2444 0x3064 # HIRAGANA LETTER TU
+0x82C3 0x2445 0x3065 # HIRAGANA LETTER DU
+0x82C4 0x2446 0x3066 # HIRAGANA LETTER TE
+0x82C5 0x2447 0x3067 # HIRAGANA LETTER DE
+0x82C6 0x2448 0x3068 # HIRAGANA LETTER TO
+0x82C7 0x2449 0x3069 # HIRAGANA LETTER DO
+0x82C8 0x244A 0x306A # HIRAGANA LETTER NA
+0x82C9 0x244B 0x306B # HIRAGANA LETTER NI
+0x82CA 0x244C 0x306C # HIRAGANA LETTER NU
+0x82CB 0x244D 0x306D # HIRAGANA LETTER NE
+0x82CC 0x244E 0x306E # HIRAGANA LETTER NO
+0x82CD 0x244F 0x306F # HIRAGANA LETTER HA
+0x82CE 0x2450 0x3070 # HIRAGANA LETTER BA
+0x82CF 0x2451 0x3071 # HIRAGANA LETTER PA
+0x82D0 0x2452 0x3072 # HIRAGANA LETTER HI
+0x82D1 0x2453 0x3073 # HIRAGANA LETTER BI
+0x82D2 0x2454 0x3074 # HIRAGANA LETTER PI
+0x82D3 0x2455 0x3075 # HIRAGANA LETTER HU
+0x82D4 0x2456 0x3076 # HIRAGANA LETTER BU
+0x82D5 0x2457 0x3077 # HIRAGANA LETTER PU
+0x82D6 0x2458 0x3078 # HIRAGANA LETTER HE
+0x82D7 0x2459 0x3079 # HIRAGANA LETTER BE
+0x82D8 0x245A 0x307A # HIRAGANA LETTER PE
+0x82D9 0x245B 0x307B # HIRAGANA LETTER HO
+0x82DA 0x245C 0x307C # HIRAGANA LETTER BO
+0x82DB 0x245D 0x307D # HIRAGANA LETTER PO
+0x82DC 0x245E 0x307E # HIRAGANA LETTER MA
+0x82DD 0x245F 0x307F # HIRAGANA LETTER MI
+0x82DE 0x2460 0x3080 # HIRAGANA LETTER MU
+0x82DF 0x2461 0x3081 # HIRAGANA LETTER ME
+0x82E0 0x2462 0x3082 # HIRAGANA LETTER MO
+0x82E1 0x2463 0x3083 # HIRAGANA LETTER SMALL YA
+0x82E2 0x2464 0x3084 # HIRAGANA LETTER YA
+0x82E3 0x2465 0x3085 # HIRAGANA LETTER SMALL YU
+0x82E4 0x2466 0x3086 # HIRAGANA LETTER YU
+0x82E5 0x2467 0x3087 # HIRAGANA LETTER SMALL YO
+0x82E6 0x2468 0x3088 # HIRAGANA LETTER YO
+0x82E7 0x2469 0x3089 # HIRAGANA LETTER RA
+0x82E8 0x246A 0x308A # HIRAGANA LETTER RI
+0x82E9 0x246B 0x308B # HIRAGANA LETTER RU
+0x82EA 0x246C 0x308C # HIRAGANA LETTER RE
+0x82EB 0x246D 0x308D # HIRAGANA LETTER RO
+0x82EC 0x246E 0x308E # HIRAGANA LETTER SMALL WA
+0x82ED 0x246F 0x308F # HIRAGANA LETTER WA
+0x82EE 0x2470 0x3090 # HIRAGANA LETTER WI
+0x82EF 0x2471 0x3091 # HIRAGANA LETTER WE
+0x82F0 0x2472 0x3092 # HIRAGANA LETTER WO
+0x82F1 0x2473 0x3093 # HIRAGANA LETTER N
+0x8340 0x2521 0x30A1 # KATAKANA LETTER SMALL A
+0x8341 0x2522 0x30A2 # KATAKANA LETTER A
+0x8342 0x2523 0x30A3 # KATAKANA LETTER SMALL I
+0x8343 0x2524 0x30A4 # KATAKANA LETTER I
+0x8344 0x2525 0x30A5 # KATAKANA LETTER SMALL U
+0x8345 0x2526 0x30A6 # KATAKANA LETTER U
+0x8346 0x2527 0x30A7 # KATAKANA LETTER SMALL E
+0x8347 0x2528 0x30A8 # KATAKANA LETTER E
+0x8348 0x2529 0x30A9 # KATAKANA LETTER SMALL O
+0x8349 0x252A 0x30AA # KATAKANA LETTER O
+0x834A 0x252B 0x30AB # KATAKANA LETTER KA
+0x834B 0x252C 0x30AC # KATAKANA LETTER GA
+0x834C 0x252D 0x30AD # KATAKANA LETTER KI
+0x834D 0x252E 0x30AE # KATAKANA LETTER GI
+0x834E 0x252F 0x30AF # KATAKANA LETTER KU
+0x834F 0x2530 0x30B0 # KATAKANA LETTER GU
+0x8350 0x2531 0x30B1 # KATAKANA LETTER KE
+0x8351 0x2532 0x30B2 # KATAKANA LETTER GE
+0x8352 0x2533 0x30B3 # KATAKANA LETTER KO
+0x8353 0x2534 0x30B4 # KATAKANA LETTER GO
+0x8354 0x2535 0x30B5 # KATAKANA LETTER SA
+0x8355 0x2536 0x30B6 # KATAKANA LETTER ZA
+0x8356 0x2537 0x30B7 # KATAKANA LETTER SI
+0x8357 0x2538 0x30B8 # KATAKANA LETTER ZI
+0x8358 0x2539 0x30B9 # KATAKANA LETTER SU
+0x8359 0x253A 0x30BA # KATAKANA LETTER ZU
+0x835A 0x253B 0x30BB # KATAKANA LETTER SE
+0x835B 0x253C 0x30BC # KATAKANA LETTER ZE
+0x835C 0x253D 0x30BD # KATAKANA LETTER SO
+0x835D 0x253E 0x30BE # KATAKANA LETTER ZO
+0x835E 0x253F 0x30BF # KATAKANA LETTER TA
+0x835F 0x2540 0x30C0 # KATAKANA LETTER DA
+0x8360 0x2541 0x30C1 # KATAKANA LETTER TI
+0x8361 0x2542 0x30C2 # KATAKANA LETTER DI
+0x8362 0x2543 0x30C3 # KATAKANA LETTER SMALL TU
+0x8363 0x2544 0x30C4 # KATAKANA LETTER TU
+0x8364 0x2545 0x30C5 # KATAKANA LETTER DU
+0x8365 0x2546 0x30C6 # KATAKANA LETTER TE
+0x8366 0x2547 0x30C7 # KATAKANA LETTER DE
+0x8367 0x2548 0x30C8 # KATAKANA LETTER TO
+0x8368 0x2549 0x30C9 # KATAKANA LETTER DO
+0x8369 0x254A 0x30CA # KATAKANA LETTER NA
+0x836A 0x254B 0x30CB # KATAKANA LETTER NI
+0x836B 0x254C 0x30CC # KATAKANA LETTER NU
+0x836C 0x254D 0x30CD # KATAKANA LETTER NE
+0x836D 0x254E 0x30CE # KATAKANA LETTER NO
+0x836E 0x254F 0x30CF # KATAKANA LETTER HA
+0x836F 0x2550 0x30D0 # KATAKANA LETTER BA
+0x8370 0x2551 0x30D1 # KATAKANA LETTER PA
+0x8371 0x2552 0x30D2 # KATAKANA LETTER HI
+0x8372 0x2553 0x30D3 # KATAKANA LETTER BI
+0x8373 0x2554 0x30D4 # KATAKANA LETTER PI
+0x8374 0x2555 0x30D5 # KATAKANA LETTER HU
+0x8375 0x2556 0x30D6 # KATAKANA LETTER BU
+0x8376 0x2557 0x30D7 # KATAKANA LETTER PU
+0x8377 0x2558 0x30D8 # KATAKANA LETTER HE
+0x8378 0x2559 0x30D9 # KATAKANA LETTER BE
+0x8379 0x255A 0x30DA # KATAKANA LETTER PE
+0x837A 0x255B 0x30DB # KATAKANA LETTER HO
+0x837B 0x255C 0x30DC # KATAKANA LETTER BO
+0x837C 0x255D 0x30DD # KATAKANA LETTER PO
+0x837D 0x255E 0x30DE # KATAKANA LETTER MA
+0x837E 0x255F 0x30DF # KATAKANA LETTER MI
+0x8380 0x2560 0x30E0 # KATAKANA LETTER MU
+0x8381 0x2561 0x30E1 # KATAKANA LETTER ME
+0x8382 0x2562 0x30E2 # KATAKANA LETTER MO
+0x8383 0x2563 0x30E3 # KATAKANA LETTER SMALL YA
+0x8384 0x2564 0x30E4 # KATAKANA LETTER YA
+0x8385 0x2565 0x30E5 # KATAKANA LETTER SMALL YU
+0x8386 0x2566 0x30E6 # KATAKANA LETTER YU
+0x8387 0x2567 0x30E7 # KATAKANA LETTER SMALL YO
+0x8388 0x2568 0x30E8 # KATAKANA LETTER YO
+0x8389 0x2569 0x30E9 # KATAKANA LETTER RA
+0x838A 0x256A 0x30EA # KATAKANA LETTER RI
+0x838B 0x256B 0x30EB # KATAKANA LETTER RU
+0x838C 0x256C 0x30EC # KATAKANA LETTER RE
+0x838D 0x256D 0x30ED # KATAKANA LETTER RO
+0x838E 0x256E 0x30EE # KATAKANA LETTER SMALL WA
+0x838F 0x256F 0x30EF # KATAKANA LETTER WA
+0x8390 0x2570 0x30F0 # KATAKANA LETTER WI
+0x8391 0x2571 0x30F1 # KATAKANA LETTER WE
+0x8392 0x2572 0x30F2 # KATAKANA LETTER WO
+0x8393 0x2573 0x30F3 # KATAKANA LETTER N
+0x8394 0x2574 0x30F4 # KATAKANA LETTER VU
+0x8395 0x2575 0x30F5 # KATAKANA LETTER SMALL KA
+0x8396 0x2576 0x30F6 # KATAKANA LETTER SMALL KE
+0x839F 0x2621 0x0391 # GREEK CAPITAL LETTER ALPHA
+0x83A0 0x2622 0x0392 # GREEK CAPITAL LETTER BETA
+0x83A1 0x2623 0x0393 # GREEK CAPITAL LETTER GAMMA
+0x83A2 0x2624 0x0394 # GREEK CAPITAL LETTER DELTA
+0x83A3 0x2625 0x0395 # GREEK CAPITAL LETTER EPSILON
+0x83A4 0x2626 0x0396 # GREEK CAPITAL LETTER ZETA
+0x83A5 0x2627 0x0397 # GREEK CAPITAL LETTER ETA
+0x83A6 0x2628 0x0398 # GREEK CAPITAL LETTER THETA
+0x83A7 0x2629 0x0399 # GREEK CAPITAL LETTER IOTA
+0x83A8 0x262A 0x039A # GREEK CAPITAL LETTER KAPPA
+0x83A9 0x262B 0x039B # GREEK CAPITAL LETTER LAMDA
+0x83AA 0x262C 0x039C # GREEK CAPITAL LETTER MU
+0x83AB 0x262D 0x039D # GREEK CAPITAL LETTER NU
+0x83AC 0x262E 0x039E # GREEK CAPITAL LETTER XI
+0x83AD 0x262F 0x039F # GREEK CAPITAL LETTER OMICRON
+0x83AE 0x2630 0x03A0 # GREEK CAPITAL LETTER PI
+0x83AF 0x2631 0x03A1 # GREEK CAPITAL LETTER RHO
+0x83B0 0x2632 0x03A3 # GREEK CAPITAL LETTER SIGMA
+0x83B1 0x2633 0x03A4 # GREEK CAPITAL LETTER TAU
+0x83B2 0x2634 0x03A5 # GREEK CAPITAL LETTER UPSILON
+0x83B3 0x2635 0x03A6 # GREEK CAPITAL LETTER PHI
+0x83B4 0x2636 0x03A7 # GREEK CAPITAL LETTER CHI
+0x83B5 0x2637 0x03A8 # GREEK CAPITAL LETTER PSI
+0x83B6 0x2638 0x03A9 # GREEK CAPITAL LETTER OMEGA
+0x83BF 0x2641 0x03B1 # GREEK SMALL LETTER ALPHA
+0x83C0 0x2642 0x03B2 # GREEK SMALL LETTER BETA
+0x83C1 0x2643 0x03B3 # GREEK SMALL LETTER GAMMA
+0x83C2 0x2644 0x03B4 # GREEK SMALL LETTER DELTA
+0x83C3 0x2645 0x03B5 # GREEK SMALL LETTER EPSILON
+0x83C4 0x2646 0x03B6 # GREEK SMALL LETTER ZETA
+0x83C5 0x2647 0x03B7 # GREEK SMALL LETTER ETA
+0x83C6 0x2648 0x03B8 # GREEK SMALL LETTER THETA
+0x83C7 0x2649 0x03B9 # GREEK SMALL LETTER IOTA
+0x83C8 0x264A 0x03BA # GREEK SMALL LETTER KAPPA
+0x83C9 0x264B 0x03BB # GREEK SMALL LETTER LAMDA
+0x83CA 0x264C 0x03BC # GREEK SMALL LETTER MU
+0x83CB 0x264D 0x03BD # GREEK SMALL LETTER NU
+0x83CC 0x264E 0x03BE # GREEK SMALL LETTER XI
+0x83CD 0x264F 0x03BF # GREEK SMALL LETTER OMICRON
+0x83CE 0x2650 0x03C0 # GREEK SMALL LETTER PI
+0x83CF 0x2651 0x03C1 # GREEK SMALL LETTER RHO
+0x83D0 0x2652 0x03C3 # GREEK SMALL LETTER SIGMA
+0x83D1 0x2653 0x03C4 # GREEK SMALL LETTER TAU
+0x83D2 0x2654 0x03C5 # GREEK SMALL LETTER UPSILON
+0x83D3 0x2655 0x03C6 # GREEK SMALL LETTER PHI
+0x83D4 0x2656 0x03C7 # GREEK SMALL LETTER CHI
+0x83D5 0x2657 0x03C8 # GREEK SMALL LETTER PSI
+0x83D6 0x2658 0x03C9 # GREEK SMALL LETTER OMEGA
+0x8440 0x2721 0x0410 # CYRILLIC CAPITAL LETTER A
+0x8441 0x2722 0x0411 # CYRILLIC CAPITAL LETTER BE
+0x8442 0x2723 0x0412 # CYRILLIC CAPITAL LETTER VE
+0x8443 0x2724 0x0413 # CYRILLIC CAPITAL LETTER GHE
+0x8444 0x2725 0x0414 # CYRILLIC CAPITAL LETTER DE
+0x8445 0x2726 0x0415 # CYRILLIC CAPITAL LETTER IE
+0x8446 0x2727 0x0401 # CYRILLIC CAPITAL LETTER IO
+0x8447 0x2728 0x0416 # CYRILLIC CAPITAL LETTER ZHE
+0x8448 0x2729 0x0417 # CYRILLIC CAPITAL LETTER ZE
+0x8449 0x272A 0x0418 # CYRILLIC CAPITAL LETTER I
+0x844A 0x272B 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
+0x844B 0x272C 0x041A # CYRILLIC CAPITAL LETTER KA
+0x844C 0x272D 0x041B # CYRILLIC CAPITAL LETTER EL
+0x844D 0x272E 0x041C # CYRILLIC CAPITAL LETTER EM
+0x844E 0x272F 0x041D # CYRILLIC CAPITAL LETTER EN
+0x844F 0x2730 0x041E # CYRILLIC CAPITAL LETTER O
+0x8450 0x2731 0x041F # CYRILLIC CAPITAL LETTER PE
+0x8451 0x2732 0x0420 # CYRILLIC CAPITAL LETTER ER
+0x8452 0x2733 0x0421 # CYRILLIC CAPITAL LETTER ES
+0x8453 0x2734 0x0422 # CYRILLIC CAPITAL LETTER TE
+0x8454 0x2735 0x0423 # CYRILLIC CAPITAL LETTER U
+0x8455 0x2736 0x0424 # CYRILLIC CAPITAL LETTER EF
+0x8456 0x2737 0x0425 # CYRILLIC CAPITAL LETTER HA
+0x8457 0x2738 0x0426 # CYRILLIC CAPITAL LETTER TSE
+0x8458 0x2739 0x0427 # CYRILLIC CAPITAL LETTER CHE
+0x8459 0x273A 0x0428 # CYRILLIC CAPITAL LETTER SHA
+0x845A 0x273B 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
+0x845B 0x273C 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C 0x273D 0x042B # CYRILLIC CAPITAL LETTER YERU
+0x845D 0x273E 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E 0x273F 0x042D # CYRILLIC CAPITAL LETTER E
+0x845F 0x2740 0x042E # CYRILLIC CAPITAL LETTER YU
+0x8460 0x2741 0x042F # CYRILLIC CAPITAL LETTER YA
+0x8470 0x2751 0x0430 # CYRILLIC SMALL LETTER A
+0x8471 0x2752 0x0431 # CYRILLIC SMALL LETTER BE
+0x8472 0x2753 0x0432 # CYRILLIC SMALL LETTER VE
+0x8473 0x2754 0x0433 # CYRILLIC SMALL LETTER GHE
+0x8474 0x2755 0x0434 # CYRILLIC SMALL LETTER DE
+0x8475 0x2756 0x0435 # CYRILLIC SMALL LETTER IE
+0x8476 0x2757 0x0451 # CYRILLIC SMALL LETTER IO
+0x8477 0x2758 0x0436 # CYRILLIC SMALL LETTER ZHE
+0x8478 0x2759 0x0437 # CYRILLIC SMALL LETTER ZE
+0x8479 0x275A 0x0438 # CYRILLIC SMALL LETTER I
+0x847A 0x275B 0x0439 # CYRILLIC SMALL LETTER SHORT I
+0x847B 0x275C 0x043A # CYRILLIC SMALL LETTER KA
+0x847C 0x275D 0x043B # CYRILLIC SMALL LETTER EL
+0x847D 0x275E 0x043C # CYRILLIC SMALL LETTER EM
+0x847E 0x275F 0x043D # CYRILLIC SMALL LETTER EN
+0x8480 0x2760 0x043E # CYRILLIC SMALL LETTER O
+0x8481 0x2761 0x043F # CYRILLIC SMALL LETTER PE
+0x8482 0x2762 0x0440 # CYRILLIC SMALL LETTER ER
+0x8483 0x2763 0x0441 # CYRILLIC SMALL LETTER ES
+0x8484 0x2764 0x0442 # CYRILLIC SMALL LETTER TE
+0x8485 0x2765 0x0443 # CYRILLIC SMALL LETTER U
+0x8486 0x2766 0x0444 # CYRILLIC SMALL LETTER EF
+0x8487 0x2767 0x0445 # CYRILLIC SMALL LETTER HA
+0x8488 0x2768 0x0446 # CYRILLIC SMALL LETTER TSE
+0x8489 0x2769 0x0447 # CYRILLIC SMALL LETTER CHE
+0x848A 0x276A 0x0448 # CYRILLIC SMALL LETTER SHA
+0x848B 0x276B 0x0449 # CYRILLIC SMALL LETTER SHCHA
+0x848C 0x276C 0x044A # CYRILLIC SMALL LETTER HARD SIGN
+0x848D 0x276D 0x044B # CYRILLIC SMALL LETTER YERU
+0x848E 0x276E 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
+0x848F 0x276F 0x044D # CYRILLIC SMALL LETTER E
+0x8490 0x2770 0x044E # CYRILLIC SMALL LETTER YU
+0x8491 0x2771 0x044F # CYRILLIC SMALL LETTER YA
+0x849F 0x2821 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
+0x84A0 0x2822 0x2502 # BOX DRAWINGS LIGHT VERTICAL
+0x84A1 0x2823 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x84A2 0x2824 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84A3 0x2825 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
+0x84A4 0x2826 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
+0x84A5 0x2827 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x84A6 0x2828 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x84A7 0x2829 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x84A8 0x282A 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x84A9 0x282B 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x84AA 0x282C 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL
+0x84AB 0x282D 0x2503 # BOX DRAWINGS HEAVY VERTICAL
+0x84AC 0x282E 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT
+0x84AD 0x282F 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT
+0x84AE 0x2830 0x251B # BOX DRAWINGS HEAVY UP AND LEFT
+0x84AF 0x2831 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT
+0x84B0 0x2832 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+0x84B1 0x2833 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+0x84B2 0x2834 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+0x84B3 0x2835 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+0x84B4 0x2836 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+0x84B5 0x2837 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+0x84B6 0x2838 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+0x84B7 0x2839 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+0x84B8 0x283A 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+0x84B9 0x283B 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+0x84BA 0x283C 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+0x84BB 0x283D 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+0x84BC 0x283E 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+0x84BD 0x283F 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+0x84BE 0x2840 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+0x889F 0x3021 0x4E9C # <CJK>
+0x88A0 0x3022 0x5516 # <CJK>
+0x88A1 0x3023 0x5A03 # <CJK>
+0x88A2 0x3024 0x963F # <CJK>
+0x88A3 0x3025 0x54C0 # <CJK>
+0x88A4 0x3026 0x611B # <CJK>
+0x88A5 0x3027 0x6328 # <CJK>
+0x88A6 0x3028 0x59F6 # <CJK>
+0x88A7 0x3029 0x9022 # <CJK>
+0x88A8 0x302A 0x8475 # <CJK>
+0x88A9 0x302B 0x831C # <CJK>
+0x88AA 0x302C 0x7A50 # <CJK>
+0x88AB 0x302D 0x60AA # <CJK>
+0x88AC 0x302E 0x63E1 # <CJK>
+0x88AD 0x302F 0x6E25 # <CJK>
+0x88AE 0x3030 0x65ED # <CJK>
+0x88AF 0x3031 0x8466 # <CJK>
+0x88B0 0x3032 0x82A6 # <CJK>
+0x88B1 0x3033 0x9BF5 # <CJK>
+0x88B2 0x3034 0x6893 # <CJK>
+0x88B3 0x3035 0x5727 # <CJK>
+0x88B4 0x3036 0x65A1 # <CJK>
+0x88B5 0x3037 0x6271 # <CJK>
+0x88B6 0x3038 0x5B9B # <CJK>
+0x88B7 0x3039 0x59D0 # <CJK>
+0x88B8 0x303A 0x867B # <CJK>
+0x88B9 0x303B 0x98F4 # <CJK>
+0x88BA 0x303C 0x7D62 # <CJK>
+0x88BB 0x303D 0x7DBE # <CJK>
+0x88BC 0x303E 0x9B8E # <CJK>
+0x88BD 0x303F 0x6216 # <CJK>
+0x88BE 0x3040 0x7C9F # <CJK>
+0x88BF 0x3041 0x88B7 # <CJK>
+0x88C0 0x3042 0x5B89 # <CJK>
+0x88C1 0x3043 0x5EB5 # <CJK>
+0x88C2 0x3044 0x6309 # <CJK>
+0x88C3 0x3045 0x6697 # <CJK>
+0x88C4 0x3046 0x6848 # <CJK>
+0x88C5 0x3047 0x95C7 # <CJK>
+0x88C6 0x3048 0x978D # <CJK>
+0x88C7 0x3049 0x674F # <CJK>
+0x88C8 0x304A 0x4EE5 # <CJK>
+0x88C9 0x304B 0x4F0A # <CJK>
+0x88CA 0x304C 0x4F4D # <CJK>
+0x88CB 0x304D 0x4F9D # <CJK>
+0x88CC 0x304E 0x5049 # <CJK>
+0x88CD 0x304F 0x56F2 # <CJK>
+0x88CE 0x3050 0x5937 # <CJK>
+0x88CF 0x3051 0x59D4 # <CJK>
+0x88D0 0x3052 0x5A01 # <CJK>
+0x88D1 0x3053 0x5C09 # <CJK>
+0x88D2 0x3054 0x60DF # <CJK>
+0x88D3 0x3055 0x610F # <CJK>
+0x88D4 0x3056 0x6170 # <CJK>
+0x88D5 0x3057 0x6613 # <CJK>
+0x88D6 0x3058 0x6905 # <CJK>
+0x88D7 0x3059 0x70BA # <CJK>
+0x88D8 0x305A 0x754F # <CJK>
+0x88D9 0x305B 0x7570 # <CJK>
+0x88DA 0x305C 0x79FB # <CJK>
+0x88DB 0x305D 0x7DAD # <CJK>
+0x88DC 0x305E 0x7DEF # <CJK>
+0x88DD 0x305F 0x80C3 # <CJK>
+0x88DE 0x3060 0x840E # <CJK>
+0x88DF 0x3061 0x8863 # <CJK>
+0x88E0 0x3062 0x8B02 # <CJK>
+0x88E1 0x3063 0x9055 # <CJK>
+0x88E2 0x3064 0x907A # <CJK>
+0x88E3 0x3065 0x533B # <CJK>
+0x88E4 0x3066 0x4E95 # <CJK>
+0x88E5 0x3067 0x4EA5 # <CJK>
+0x88E6 0x3068 0x57DF # <CJK>
+0x88E7 0x3069 0x80B2 # <CJK>
+0x88E8 0x306A 0x90C1 # <CJK>
+0x88E9 0x306B 0x78EF # <CJK>
+0x88EA 0x306C 0x4E00 # <CJK>
+0x88EB 0x306D 0x58F1 # <CJK>
+0x88EC 0x306E 0x6EA2 # <CJK>
+0x88ED 0x306F 0x9038 # <CJK>
+0x88EE 0x3070 0x7A32 # <CJK>
+0x88EF 0x3071 0x8328 # <CJK>
+0x88F0 0x3072 0x828B # <CJK>
+0x88F1 0x3073 0x9C2F # <CJK>
+0x88F2 0x3074 0x5141 # <CJK>
+0x88F3 0x3075 0x5370 # <CJK>
+0x88F4 0x3076 0x54BD # <CJK>
+0x88F5 0x3077 0x54E1 # <CJK>
+0x88F6 0x3078 0x56E0 # <CJK>
+0x88F7 0x3079 0x59FB # <CJK>
+0x88F8 0x307A 0x5F15 # <CJK>
+0x88F9 0x307B 0x98F2 # <CJK>
+0x88FA 0x307C 0x6DEB # <CJK>
+0x88FB 0x307D 0x80E4 # <CJK>
+0x88FC 0x307E 0x852D # <CJK>
+0x8940 0x3121 0x9662 # <CJK>
+0x8941 0x3122 0x9670 # <CJK>
+0x8942 0x3123 0x96A0 # <CJK>
+0x8943 0x3124 0x97FB # <CJK>
+0x8944 0x3125 0x540B # <CJK>
+0x8945 0x3126 0x53F3 # <CJK>
+0x8946 0x3127 0x5B87 # <CJK>
+0x8947 0x3128 0x70CF # <CJK>
+0x8948 0x3129 0x7FBD # <CJK>
+0x8949 0x312A 0x8FC2 # <CJK>
+0x894A 0x312B 0x96E8 # <CJK>
+0x894B 0x312C 0x536F # <CJK>
+0x894C 0x312D 0x9D5C # <CJK>
+0x894D 0x312E 0x7ABA # <CJK>
+0x894E 0x312F 0x4E11 # <CJK>
+0x894F 0x3130 0x7893 # <CJK>
+0x8950 0x3131 0x81FC # <CJK>
+0x8951 0x3132 0x6E26 # <CJK>
+0x8952 0x3133 0x5618 # <CJK>
+0x8953 0x3134 0x5504 # <CJK>
+0x8954 0x3135 0x6B1D # <CJK>
+0x8955 0x3136 0x851A # <CJK>
+0x8956 0x3137 0x9C3B # <CJK>
+0x8957 0x3138 0x59E5 # <CJK>
+0x8958 0x3139 0x53A9 # <CJK>
+0x8959 0x313A 0x6D66 # <CJK>
+0x895A 0x313B 0x74DC # <CJK>
+0x895B 0x313C 0x958F # <CJK>
+0x895C 0x313D 0x5642 # <CJK>
+0x895D 0x313E 0x4E91 # <CJK>
+0x895E 0x313F 0x904B # <CJK>
+0x895F 0x3140 0x96F2 # <CJK>
+0x8960 0x3141 0x834F # <CJK>
+0x8961 0x3142 0x990C # <CJK>
+0x8962 0x3143 0x53E1 # <CJK>
+0x8963 0x3144 0x55B6 # <CJK>
+0x8964 0x3145 0x5B30 # <CJK>
+0x8965 0x3146 0x5F71 # <CJK>
+0x8966 0x3147 0x6620 # <CJK>
+0x8967 0x3148 0x66F3 # <CJK>
+0x8968 0x3149 0x6804 # <CJK>
+0x8969 0x314A 0x6C38 # <CJK>
+0x896A 0x314B 0x6CF3 # <CJK>
+0x896B 0x314C 0x6D29 # <CJK>
+0x896C 0x314D 0x745B # <CJK>
+0x896D 0x314E 0x76C8 # <CJK>
+0x896E 0x314F 0x7A4E # <CJK>
+0x896F 0x3150 0x9834 # <CJK>
+0x8970 0x3151 0x82F1 # <CJK>
+0x8971 0x3152 0x885B # <CJK>
+0x8972 0x3153 0x8A60 # <CJK>
+0x8973 0x3154 0x92ED # <CJK>
+0x8974 0x3155 0x6DB2 # <CJK>
+0x8975 0x3156 0x75AB # <CJK>
+0x8976 0x3157 0x76CA # <CJK>
+0x8977 0x3158 0x99C5 # <CJK>
+0x8978 0x3159 0x60A6 # <CJK>
+0x8979 0x315A 0x8B01 # <CJK>
+0x897A 0x315B 0x8D8A # <CJK>
+0x897B 0x315C 0x95B2 # <CJK>
+0x897C 0x315D 0x698E # <CJK>
+0x897D 0x315E 0x53AD # <CJK>
+0x897E 0x315F 0x5186 # <CJK>
+0x8980 0x3160 0x5712 # <CJK>
+0x8981 0x3161 0x5830 # <CJK>
+0x8982 0x3162 0x5944 # <CJK>
+0x8983 0x3163 0x5BB4 # <CJK>
+0x8984 0x3164 0x5EF6 # <CJK>
+0x8985 0x3165 0x6028 # <CJK>
+0x8986 0x3166 0x63A9 # <CJK>
+0x8987 0x3167 0x63F4 # <CJK>
+0x8988 0x3168 0x6CBF # <CJK>
+0x8989 0x3169 0x6F14 # <CJK>
+0x898A 0x316A 0x708E # <CJK>
+0x898B 0x316B 0x7114 # <CJK>
+0x898C 0x316C 0x7159 # <CJK>
+0x898D 0x316D 0x71D5 # <CJK>
+0x898E 0x316E 0x733F # <CJK>
+0x898F 0x316F 0x7E01 # <CJK>
+0x8990 0x3170 0x8276 # <CJK>
+0x8991 0x3171 0x82D1 # <CJK>
+0x8992 0x3172 0x8597 # <CJK>
+0x8993 0x3173 0x9060 # <CJK>
+0x8994 0x3174 0x925B # <CJK>
+0x8995 0x3175 0x9D1B # <CJK>
+0x8996 0x3176 0x5869 # <CJK>
+0x8997 0x3177 0x65BC # <CJK>
+0x8998 0x3178 0x6C5A # <CJK>
+0x8999 0x3179 0x7525 # <CJK>
+0x899A 0x317A 0x51F9 # <CJK>
+0x899B 0x317B 0x592E # <CJK>
+0x899C 0x317C 0x5965 # <CJK>
+0x899D 0x317D 0x5F80 # <CJK>
+0x899E 0x317E 0x5FDC # <CJK>
+0x899F 0x3221 0x62BC # <CJK>
+0x89A0 0x3222 0x65FA # <CJK>
+0x89A1 0x3223 0x6A2A # <CJK>
+0x89A2 0x3224 0x6B27 # <CJK>
+0x89A3 0x3225 0x6BB4 # <CJK>
+0x89A4 0x3226 0x738B # <CJK>
+0x89A5 0x3227 0x7FC1 # <CJK>
+0x89A6 0x3228 0x8956 # <CJK>
+0x89A7 0x3229 0x9D2C # <CJK>
+0x89A8 0x322A 0x9D0E # <CJK>
+0x89A9 0x322B 0x9EC4 # <CJK>
+0x89AA 0x322C 0x5CA1 # <CJK>
+0x89AB 0x322D 0x6C96 # <CJK>
+0x89AC 0x322E 0x837B # <CJK>
+0x89AD 0x322F 0x5104 # <CJK>
+0x89AE 0x3230 0x5C4B # <CJK>
+0x89AF 0x3231 0x61B6 # <CJK>
+0x89B0 0x3232 0x81C6 # <CJK>
+0x89B1 0x3233 0x6876 # <CJK>
+0x89B2 0x3234 0x7261 # <CJK>
+0x89B3 0x3235 0x4E59 # <CJK>
+0x89B4 0x3236 0x4FFA # <CJK>
+0x89B5 0x3237 0x5378 # <CJK>
+0x89B6 0x3238 0x6069 # <CJK>
+0x89B7 0x3239 0x6E29 # <CJK>
+0x89B8 0x323A 0x7A4F # <CJK>
+0x89B9 0x323B 0x97F3 # <CJK>
+0x89BA 0x323C 0x4E0B # <CJK>
+0x89BB 0x323D 0x5316 # <CJK>
+0x89BC 0x323E 0x4EEE # <CJK>
+0x89BD 0x323F 0x4F55 # <CJK>
+0x89BE 0x3240 0x4F3D # <CJK>
+0x89BF 0x3241 0x4FA1 # <CJK>
+0x89C0 0x3242 0x4F73 # <CJK>
+0x89C1 0x3243 0x52A0 # <CJK>
+0x89C2 0x3244 0x53EF # <CJK>
+0x89C3 0x3245 0x5609 # <CJK>
+0x89C4 0x3246 0x590F # <CJK>
+0x89C5 0x3247 0x5AC1 # <CJK>
+0x89C6 0x3248 0x5BB6 # <CJK>
+0x89C7 0x3249 0x5BE1 # <CJK>
+0x89C8 0x324A 0x79D1 # <CJK>
+0x89C9 0x324B 0x6687 # <CJK>
+0x89CA 0x324C 0x679C # <CJK>
+0x89CB 0x324D 0x67B6 # <CJK>
+0x89CC 0x324E 0x6B4C # <CJK>
+0x89CD 0x324F 0x6CB3 # <CJK>
+0x89CE 0x3250 0x706B # <CJK>
+0x89CF 0x3251 0x73C2 # <CJK>
+0x89D0 0x3252 0x798D # <CJK>
+0x89D1 0x3253 0x79BE # <CJK>
+0x89D2 0x3254 0x7A3C # <CJK>
+0x89D3 0x3255 0x7B87 # <CJK>
+0x89D4 0x3256 0x82B1 # <CJK>
+0x89D5 0x3257 0x82DB # <CJK>
+0x89D6 0x3258 0x8304 # <CJK>
+0x89D7 0x3259 0x8377 # <CJK>
+0x89D8 0x325A 0x83EF # <CJK>
+0x89D9 0x325B 0x83D3 # <CJK>
+0x89DA 0x325C 0x8766 # <CJK>
+0x89DB 0x325D 0x8AB2 # <CJK>
+0x89DC 0x325E 0x5629 # <CJK>
+0x89DD 0x325F 0x8CA8 # <CJK>
+0x89DE 0x3260 0x8FE6 # <CJK>
+0x89DF 0x3261 0x904E # <CJK>
+0x89E0 0x3262 0x971E # <CJK>
+0x89E1 0x3263 0x868A # <CJK>
+0x89E2 0x3264 0x4FC4 # <CJK>
+0x89E3 0x3265 0x5CE8 # <CJK>
+0x89E4 0x3266 0x6211 # <CJK>
+0x89E5 0x3267 0x7259 # <CJK>
+0x89E6 0x3268 0x753B # <CJK>
+0x89E7 0x3269 0x81E5 # <CJK>
+0x89E8 0x326A 0x82BD # <CJK>
+0x89E9 0x326B 0x86FE # <CJK>
+0x89EA 0x326C 0x8CC0 # <CJK>
+0x89EB 0x326D 0x96C5 # <CJK>
+0x89EC 0x326E 0x9913 # <CJK>
+0x89ED 0x326F 0x99D5 # <CJK>
+0x89EE 0x3270 0x4ECB # <CJK>
+0x89EF 0x3271 0x4F1A # <CJK>
+0x89F0 0x3272 0x89E3 # <CJK>
+0x89F1 0x3273 0x56DE # <CJK>
+0x89F2 0x3274 0x584A # <CJK>
+0x89F3 0x3275 0x58CA # <CJK>
+0x89F4 0x3276 0x5EFB # <CJK>
+0x89F5 0x3277 0x5FEB # <CJK>
+0x89F6 0x3278 0x602A # <CJK>
+0x89F7 0x3279 0x6094 # <CJK>
+0x89F8 0x327A 0x6062 # <CJK>
+0x89F9 0x327B 0x61D0 # <CJK>
+0x89FA 0x327C 0x6212 # <CJK>
+0x89FB 0x327D 0x62D0 # <CJK>
+0x89FC 0x327E 0x6539 # <CJK>
+0x8A40 0x3321 0x9B41 # <CJK>
+0x8A41 0x3322 0x6666 # <CJK>
+0x8A42 0x3323 0x68B0 # <CJK>
+0x8A43 0x3324 0x6D77 # <CJK>
+0x8A44 0x3325 0x7070 # <CJK>
+0x8A45 0x3326 0x754C # <CJK>
+0x8A46 0x3327 0x7686 # <CJK>
+0x8A47 0x3328 0x7D75 # <CJK>
+0x8A48 0x3329 0x82A5 # <CJK>
+0x8A49 0x332A 0x87F9 # <CJK>
+0x8A4A 0x332B 0x958B # <CJK>
+0x8A4B 0x332C 0x968E # <CJK>
+0x8A4C 0x332D 0x8C9D # <CJK>
+0x8A4D 0x332E 0x51F1 # <CJK>
+0x8A4E 0x332F 0x52BE # <CJK>
+0x8A4F 0x3330 0x5916 # <CJK>
+0x8A50 0x3331 0x54B3 # <CJK>
+0x8A51 0x3332 0x5BB3 # <CJK>
+0x8A52 0x3333 0x5D16 # <CJK>
+0x8A53 0x3334 0x6168 # <CJK>
+0x8A54 0x3335 0x6982 # <CJK>
+0x8A55 0x3336 0x6DAF # <CJK>
+0x8A56 0x3337 0x788D # <CJK>
+0x8A57 0x3338 0x84CB # <CJK>
+0x8A58 0x3339 0x8857 # <CJK>
+0x8A59 0x333A 0x8A72 # <CJK>
+0x8A5A 0x333B 0x93A7 # <CJK>
+0x8A5B 0x333C 0x9AB8 # <CJK>
+0x8A5C 0x333D 0x6D6C # <CJK>
+0x8A5D 0x333E 0x99A8 # <CJK>
+0x8A5E 0x333F 0x86D9 # <CJK>
+0x8A5F 0x3340 0x57A3 # <CJK>
+0x8A60 0x3341 0x67FF # <CJK>
+0x8A61 0x3342 0x86CE # <CJK>
+0x8A62 0x3343 0x920E # <CJK>
+0x8A63 0x3344 0x5283 # <CJK>
+0x8A64 0x3345 0x5687 # <CJK>
+0x8A65 0x3346 0x5404 # <CJK>
+0x8A66 0x3347 0x5ED3 # <CJK>
+0x8A67 0x3348 0x62E1 # <CJK>
+0x8A68 0x3349 0x64B9 # <CJK>
+0x8A69 0x334A 0x683C # <CJK>
+0x8A6A 0x334B 0x6838 # <CJK>
+0x8A6B 0x334C 0x6BBB # <CJK>
+0x8A6C 0x334D 0x7372 # <CJK>
+0x8A6D 0x334E 0x78BA # <CJK>
+0x8A6E 0x334F 0x7A6B # <CJK>
+0x8A6F 0x3350 0x899A # <CJK>
+0x8A70 0x3351 0x89D2 # <CJK>
+0x8A71 0x3352 0x8D6B # <CJK>
+0x8A72 0x3353 0x8F03 # <CJK>
+0x8A73 0x3354 0x90ED # <CJK>
+0x8A74 0x3355 0x95A3 # <CJK>
+0x8A75 0x3356 0x9694 # <CJK>
+0x8A76 0x3357 0x9769 # <CJK>
+0x8A77 0x3358 0x5B66 # <CJK>
+0x8A78 0x3359 0x5CB3 # <CJK>
+0x8A79 0x335A 0x697D # <CJK>
+0x8A7A 0x335B 0x984D # <CJK>
+0x8A7B 0x335C 0x984E # <CJK>
+0x8A7C 0x335D 0x639B # <CJK>
+0x8A7D 0x335E 0x7B20 # <CJK>
+0x8A7E 0x335F 0x6A2B # <CJK>
+0x8A80 0x3360 0x6A7F # <CJK>
+0x8A81 0x3361 0x68B6 # <CJK>
+0x8A82 0x3362 0x9C0D # <CJK>
+0x8A83 0x3363 0x6F5F # <CJK>
+0x8A84 0x3364 0x5272 # <CJK>
+0x8A85 0x3365 0x559D # <CJK>
+0x8A86 0x3366 0x6070 # <CJK>
+0x8A87 0x3367 0x62EC # <CJK>
+0x8A88 0x3368 0x6D3B # <CJK>
+0x8A89 0x3369 0x6E07 # <CJK>
+0x8A8A 0x336A 0x6ED1 # <CJK>
+0x8A8B 0x336B 0x845B # <CJK>
+0x8A8C 0x336C 0x8910 # <CJK>
+0x8A8D 0x336D 0x8F44 # <CJK>
+0x8A8E 0x336E 0x4E14 # <CJK>
+0x8A8F 0x336F 0x9C39 # <CJK>
+0x8A90 0x3370 0x53F6 # <CJK>
+0x8A91 0x3371 0x691B # <CJK>
+0x8A92 0x3372 0x6A3A # <CJK>
+0x8A93 0x3373 0x9784 # <CJK>
+0x8A94 0x3374 0x682A # <CJK>
+0x8A95 0x3375 0x515C # <CJK>
+0x8A96 0x3376 0x7AC3 # <CJK>
+0x8A97 0x3377 0x84B2 # <CJK>
+0x8A98 0x3378 0x91DC # <CJK>
+0x8A99 0x3379 0x938C # <CJK>
+0x8A9A 0x337A 0x565B # <CJK>
+0x8A9B 0x337B 0x9D28 # <CJK>
+0x8A9C 0x337C 0x6822 # <CJK>
+0x8A9D 0x337D 0x8305 # <CJK>
+0x8A9E 0x337E 0x8431 # <CJK>
+0x8A9F 0x3421 0x7CA5 # <CJK>
+0x8AA0 0x3422 0x5208 # <CJK>
+0x8AA1 0x3423 0x82C5 # <CJK>
+0x8AA2 0x3424 0x74E6 # <CJK>
+0x8AA3 0x3425 0x4E7E # <CJK>
+0x8AA4 0x3426 0x4F83 # <CJK>
+0x8AA5 0x3427 0x51A0 # <CJK>
+0x8AA6 0x3428 0x5BD2 # <CJK>
+0x8AA7 0x3429 0x520A # <CJK>
+0x8AA8 0x342A 0x52D8 # <CJK>
+0x8AA9 0x342B 0x52E7 # <CJK>
+0x8AAA 0x342C 0x5DFB # <CJK>
+0x8AAB 0x342D 0x559A # <CJK>
+0x8AAC 0x342E 0x582A # <CJK>
+0x8AAD 0x342F 0x59E6 # <CJK>
+0x8AAE 0x3430 0x5B8C # <CJK>
+0x8AAF 0x3431 0x5B98 # <CJK>
+0x8AB0 0x3432 0x5BDB # <CJK>
+0x8AB1 0x3433 0x5E72 # <CJK>
+0x8AB2 0x3434 0x5E79 # <CJK>
+0x8AB3 0x3435 0x60A3 # <CJK>
+0x8AB4 0x3436 0x611F # <CJK>
+0x8AB5 0x3437 0x6163 # <CJK>
+0x8AB6 0x3438 0x61BE # <CJK>
+0x8AB7 0x3439 0x63DB # <CJK>
+0x8AB8 0x343A 0x6562 # <CJK>
+0x8AB9 0x343B 0x67D1 # <CJK>
+0x8ABA 0x343C 0x6853 # <CJK>
+0x8ABB 0x343D 0x68FA # <CJK>
+0x8ABC 0x343E 0x6B3E # <CJK>
+0x8ABD 0x343F 0x6B53 # <CJK>
+0x8ABE 0x3440 0x6C57 # <CJK>
+0x8ABF 0x3441 0x6F22 # <CJK>
+0x8AC0 0x3442 0x6F97 # <CJK>
+0x8AC1 0x3443 0x6F45 # <CJK>
+0x8AC2 0x3444 0x74B0 # <CJK>
+0x8AC3 0x3445 0x7518 # <CJK>
+0x8AC4 0x3446 0x76E3 # <CJK>
+0x8AC5 0x3447 0x770B # <CJK>
+0x8AC6 0x3448 0x7AFF # <CJK>
+0x8AC7 0x3449 0x7BA1 # <CJK>
+0x8AC8 0x344A 0x7C21 # <CJK>
+0x8AC9 0x344B 0x7DE9 # <CJK>
+0x8ACA 0x344C 0x7F36 # <CJK>
+0x8ACB 0x344D 0x7FF0 # <CJK>
+0x8ACC 0x344E 0x809D # <CJK>
+0x8ACD 0x344F 0x8266 # <CJK>
+0x8ACE 0x3450 0x839E # <CJK>
+0x8ACF 0x3451 0x89B3 # <CJK>
+0x8AD0 0x3452 0x8ACC # <CJK>
+0x8AD1 0x3453 0x8CAB # <CJK>
+0x8AD2 0x3454 0x9084 # <CJK>
+0x8AD3 0x3455 0x9451 # <CJK>
+0x8AD4 0x3456 0x9593 # <CJK>
+0x8AD5 0x3457 0x9591 # <CJK>
+0x8AD6 0x3458 0x95A2 # <CJK>
+0x8AD7 0x3459 0x9665 # <CJK>
+0x8AD8 0x345A 0x97D3 # <CJK>
+0x8AD9 0x345B 0x9928 # <CJK>
+0x8ADA 0x345C 0x8218 # <CJK>
+0x8ADB 0x345D 0x4E38 # <CJK>
+0x8ADC 0x345E 0x542B # <CJK>
+0x8ADD 0x345F 0x5CB8 # <CJK>
+0x8ADE 0x3460 0x5DCC # <CJK>
+0x8ADF 0x3461 0x73A9 # <CJK>
+0x8AE0 0x3462 0x764C # <CJK>
+0x8AE1 0x3463 0x773C # <CJK>
+0x8AE2 0x3464 0x5CA9 # <CJK>
+0x8AE3 0x3465 0x7FEB # <CJK>
+0x8AE4 0x3466 0x8D0B # <CJK>
+0x8AE5 0x3467 0x96C1 # <CJK>
+0x8AE6 0x3468 0x9811 # <CJK>
+0x8AE7 0x3469 0x9854 # <CJK>
+0x8AE8 0x346A 0x9858 # <CJK>
+0x8AE9 0x346B 0x4F01 # <CJK>
+0x8AEA 0x346C 0x4F0E # <CJK>
+0x8AEB 0x346D 0x5371 # <CJK>
+0x8AEC 0x346E 0x559C # <CJK>
+0x8AED 0x346F 0x5668 # <CJK>
+0x8AEE 0x3470 0x57FA # <CJK>
+0x8AEF 0x3471 0x5947 # <CJK>
+0x8AF0 0x3472 0x5B09 # <CJK>
+0x8AF1 0x3473 0x5BC4 # <CJK>
+0x8AF2 0x3474 0x5C90 # <CJK>
+0x8AF3 0x3475 0x5E0C # <CJK>
+0x8AF4 0x3476 0x5E7E # <CJK>
+0x8AF5 0x3477 0x5FCC # <CJK>
+0x8AF6 0x3478 0x63EE # <CJK>
+0x8AF7 0x3479 0x673A # <CJK>
+0x8AF8 0x347A 0x65D7 # <CJK>
+0x8AF9 0x347B 0x65E2 # <CJK>
+0x8AFA 0x347C 0x671F # <CJK>
+0x8AFB 0x347D 0x68CB # <CJK>
+0x8AFC 0x347E 0x68C4 # <CJK>
+0x8B40 0x3521 0x6A5F # <CJK>
+0x8B41 0x3522 0x5E30 # <CJK>
+0x8B42 0x3523 0x6BC5 # <CJK>
+0x8B43 0x3524 0x6C17 # <CJK>
+0x8B44 0x3525 0x6C7D # <CJK>
+0x8B45 0x3526 0x757F # <CJK>
+0x8B46 0x3527 0x7948 # <CJK>
+0x8B47 0x3528 0x5B63 # <CJK>
+0x8B48 0x3529 0x7A00 # <CJK>
+0x8B49 0x352A 0x7D00 # <CJK>
+0x8B4A 0x352B 0x5FBD # <CJK>
+0x8B4B 0x352C 0x898F # <CJK>
+0x8B4C 0x352D 0x8A18 # <CJK>
+0x8B4D 0x352E 0x8CB4 # <CJK>
+0x8B4E 0x352F 0x8D77 # <CJK>
+0x8B4F 0x3530 0x8ECC # <CJK>
+0x8B50 0x3531 0x8F1D # <CJK>
+0x8B51 0x3532 0x98E2 # <CJK>
+0x8B52 0x3533 0x9A0E # <CJK>
+0x8B53 0x3534 0x9B3C # <CJK>
+0x8B54 0x3535 0x4E80 # <CJK>
+0x8B55 0x3536 0x507D # <CJK>
+0x8B56 0x3537 0x5100 # <CJK>
+0x8B57 0x3538 0x5993 # <CJK>
+0x8B58 0x3539 0x5B9C # <CJK>
+0x8B59 0x353A 0x622F # <CJK>
+0x8B5A 0x353B 0x6280 # <CJK>
+0x8B5B 0x353C 0x64EC # <CJK>
+0x8B5C 0x353D 0x6B3A # <CJK>
+0x8B5D 0x353E 0x72A0 # <CJK>
+0x8B5E 0x353F 0x7591 # <CJK>
+0x8B5F 0x3540 0x7947 # <CJK>
+0x8B60 0x3541 0x7FA9 # <CJK>
+0x8B61 0x3542 0x87FB # <CJK>
+0x8B62 0x3543 0x8ABC # <CJK>
+0x8B63 0x3544 0x8B70 # <CJK>
+0x8B64 0x3545 0x63AC # <CJK>
+0x8B65 0x3546 0x83CA # <CJK>
+0x8B66 0x3547 0x97A0 # <CJK>
+0x8B67 0x3548 0x5409 # <CJK>
+0x8B68 0x3549 0x5403 # <CJK>
+0x8B69 0x354A 0x55AB # <CJK>
+0x8B6A 0x354B 0x6854 # <CJK>
+0x8B6B 0x354C 0x6A58 # <CJK>
+0x8B6C 0x354D 0x8A70 # <CJK>
+0x8B6D 0x354E 0x7827 # <CJK>
+0x8B6E 0x354F 0x6775 # <CJK>
+0x8B6F 0x3550 0x9ECD # <CJK>
+0x8B70 0x3551 0x5374 # <CJK>
+0x8B71 0x3552 0x5BA2 # <CJK>
+0x8B72 0x3553 0x811A # <CJK>
+0x8B73 0x3554 0x8650 # <CJK>
+0x8B74 0x3555 0x9006 # <CJK>
+0x8B75 0x3556 0x4E18 # <CJK>
+0x8B76 0x3557 0x4E45 # <CJK>
+0x8B77 0x3558 0x4EC7 # <CJK>
+0x8B78 0x3559 0x4F11 # <CJK>
+0x8B79 0x355A 0x53CA # <CJK>
+0x8B7A 0x355B 0x5438 # <CJK>
+0x8B7B 0x355C 0x5BAE # <CJK>
+0x8B7C 0x355D 0x5F13 # <CJK>
+0x8B7D 0x355E 0x6025 # <CJK>
+0x8B7E 0x355F 0x6551 # <CJK>
+0x8B80 0x3560 0x673D # <CJK>
+0x8B81 0x3561 0x6C42 # <CJK>
+0x8B82 0x3562 0x6C72 # <CJK>
+0x8B83 0x3563 0x6CE3 # <CJK>
+0x8B84 0x3564 0x7078 # <CJK>
+0x8B85 0x3565 0x7403 # <CJK>
+0x8B86 0x3566 0x7A76 # <CJK>
+0x8B87 0x3567 0x7AAE # <CJK>
+0x8B88 0x3568 0x7B08 # <CJK>
+0x8B89 0x3569 0x7D1A # <CJK>
+0x8B8A 0x356A 0x7CFE # <CJK>
+0x8B8B 0x356B 0x7D66 # <CJK>
+0x8B8C 0x356C 0x65E7 # <CJK>
+0x8B8D 0x356D 0x725B # <CJK>
+0x8B8E 0x356E 0x53BB # <CJK>
+0x8B8F 0x356F 0x5C45 # <CJK>
+0x8B90 0x3570 0x5DE8 # <CJK>
+0x8B91 0x3571 0x62D2 # <CJK>
+0x8B92 0x3572 0x62E0 # <CJK>
+0x8B93 0x3573 0x6319 # <CJK>
+0x8B94 0x3574 0x6E20 # <CJK>
+0x8B95 0x3575 0x865A # <CJK>
+0x8B96 0x3576 0x8A31 # <CJK>
+0x8B97 0x3577 0x8DDD # <CJK>
+0x8B98 0x3578 0x92F8 # <CJK>
+0x8B99 0x3579 0x6F01 # <CJK>
+0x8B9A 0x357A 0x79A6 # <CJK>
+0x8B9B 0x357B 0x9B5A # <CJK>
+0x8B9C 0x357C 0x4EA8 # <CJK>
+0x8B9D 0x357D 0x4EAB # <CJK>
+0x8B9E 0x357E 0x4EAC # <CJK>
+0x8B9F 0x3621 0x4F9B # <CJK>
+0x8BA0 0x3622 0x4FA0 # <CJK>
+0x8BA1 0x3623 0x50D1 # <CJK>
+0x8BA2 0x3624 0x5147 # <CJK>
+0x8BA3 0x3625 0x7AF6 # <CJK>
+0x8BA4 0x3626 0x5171 # <CJK>
+0x8BA5 0x3627 0x51F6 # <CJK>
+0x8BA6 0x3628 0x5354 # <CJK>
+0x8BA7 0x3629 0x5321 # <CJK>
+0x8BA8 0x362A 0x537F # <CJK>
+0x8BA9 0x362B 0x53EB # <CJK>
+0x8BAA 0x362C 0x55AC # <CJK>
+0x8BAB 0x362D 0x5883 # <CJK>
+0x8BAC 0x362E 0x5CE1 # <CJK>
+0x8BAD 0x362F 0x5F37 # <CJK>
+0x8BAE 0x3630 0x5F4A # <CJK>
+0x8BAF 0x3631 0x602F # <CJK>
+0x8BB0 0x3632 0x6050 # <CJK>
+0x8BB1 0x3633 0x606D # <CJK>
+0x8BB2 0x3634 0x631F # <CJK>
+0x8BB3 0x3635 0x6559 # <CJK>
+0x8BB4 0x3636 0x6A4B # <CJK>
+0x8BB5 0x3637 0x6CC1 # <CJK>
+0x8BB6 0x3638 0x72C2 # <CJK>
+0x8BB7 0x3639 0x72ED # <CJK>
+0x8BB8 0x363A 0x77EF # <CJK>
+0x8BB9 0x363B 0x80F8 # <CJK>
+0x8BBA 0x363C 0x8105 # <CJK>
+0x8BBB 0x363D 0x8208 # <CJK>
+0x8BBC 0x363E 0x854E # <CJK>
+0x8BBD 0x363F 0x90F7 # <CJK>
+0x8BBE 0x3640 0x93E1 # <CJK>
+0x8BBF 0x3641 0x97FF # <CJK>
+0x8BC0 0x3642 0x9957 # <CJK>
+0x8BC1 0x3643 0x9A5A # <CJK>
+0x8BC2 0x3644 0x4EF0 # <CJK>
+0x8BC3 0x3645 0x51DD # <CJK>
+0x8BC4 0x3646 0x5C2D # <CJK>
+0x8BC5 0x3647 0x6681 # <CJK>
+0x8BC6 0x3648 0x696D # <CJK>
+0x8BC7 0x3649 0x5C40 # <CJK>
+0x8BC8 0x364A 0x66F2 # <CJK>
+0x8BC9 0x364B 0x6975 # <CJK>
+0x8BCA 0x364C 0x7389 # <CJK>
+0x8BCB 0x364D 0x6850 # <CJK>
+0x8BCC 0x364E 0x7C81 # <CJK>
+0x8BCD 0x364F 0x50C5 # <CJK>
+0x8BCE 0x3650 0x52E4 # <CJK>
+0x8BCF 0x3651 0x5747 # <CJK>
+0x8BD0 0x3652 0x5DFE # <CJK>
+0x8BD1 0x3653 0x9326 # <CJK>
+0x8BD2 0x3654 0x65A4 # <CJK>
+0x8BD3 0x3655 0x6B23 # <CJK>
+0x8BD4 0x3656 0x6B3D # <CJK>
+0x8BD5 0x3657 0x7434 # <CJK>
+0x8BD6 0x3658 0x7981 # <CJK>
+0x8BD7 0x3659 0x79BD # <CJK>
+0x8BD8 0x365A 0x7B4B # <CJK>
+0x8BD9 0x365B 0x7DCA # <CJK>
+0x8BDA 0x365C 0x82B9 # <CJK>
+0x8BDB 0x365D 0x83CC # <CJK>
+0x8BDC 0x365E 0x887F # <CJK>
+0x8BDD 0x365F 0x895F # <CJK>
+0x8BDE 0x3660 0x8B39 # <CJK>
+0x8BDF 0x3661 0x8FD1 # <CJK>
+0x8BE0 0x3662 0x91D1 # <CJK>
+0x8BE1 0x3663 0x541F # <CJK>
+0x8BE2 0x3664 0x9280 # <CJK>
+0x8BE3 0x3665 0x4E5D # <CJK>
+0x8BE4 0x3666 0x5036 # <CJK>
+0x8BE5 0x3667 0x53E5 # <CJK>
+0x8BE6 0x3668 0x533A # <CJK>
+0x8BE7 0x3669 0x72D7 # <CJK>
+0x8BE8 0x366A 0x7396 # <CJK>
+0x8BE9 0x366B 0x77E9 # <CJK>
+0x8BEA 0x366C 0x82E6 # <CJK>
+0x8BEB 0x366D 0x8EAF # <CJK>
+0x8BEC 0x366E 0x99C6 # <CJK>
+0x8BED 0x366F 0x99C8 # <CJK>
+0x8BEE 0x3670 0x99D2 # <CJK>
+0x8BEF 0x3671 0x5177 # <CJK>
+0x8BF0 0x3672 0x611A # <CJK>
+0x8BF1 0x3673 0x865E # <CJK>
+0x8BF2 0x3674 0x55B0 # <CJK>
+0x8BF3 0x3675 0x7A7A # <CJK>
+0x8BF4 0x3676 0x5076 # <CJK>
+0x8BF5 0x3677 0x5BD3 # <CJK>
+0x8BF6 0x3678 0x9047 # <CJK>
+0x8BF7 0x3679 0x9685 # <CJK>
+0x8BF8 0x367A 0x4E32 # <CJK>
+0x8BF9 0x367B 0x6ADB # <CJK>
+0x8BFA 0x367C 0x91E7 # <CJK>
+0x8BFB 0x367D 0x5C51 # <CJK>
+0x8BFC 0x367E 0x5C48 # <CJK>
+0x8C40 0x3721 0x6398 # <CJK>
+0x8C41 0x3722 0x7A9F # <CJK>
+0x8C42 0x3723 0x6C93 # <CJK>
+0x8C43 0x3724 0x9774 # <CJK>
+0x8C44 0x3725 0x8F61 # <CJK>
+0x8C45 0x3726 0x7AAA # <CJK>
+0x8C46 0x3727 0x718A # <CJK>
+0x8C47 0x3728 0x9688 # <CJK>
+0x8C48 0x3729 0x7C82 # <CJK>
+0x8C49 0x372A 0x6817 # <CJK>
+0x8C4A 0x372B 0x7E70 # <CJK>
+0x8C4B 0x372C 0x6851 # <CJK>
+0x8C4C 0x372D 0x936C # <CJK>
+0x8C4D 0x372E 0x52F2 # <CJK>
+0x8C4E 0x372F 0x541B # <CJK>
+0x8C4F 0x3730 0x85AB # <CJK>
+0x8C50 0x3731 0x8A13 # <CJK>
+0x8C51 0x3732 0x7FA4 # <CJK>
+0x8C52 0x3733 0x8ECD # <CJK>
+0x8C53 0x3734 0x90E1 # <CJK>
+0x8C54 0x3735 0x5366 # <CJK>
+0x8C55 0x3736 0x8888 # <CJK>
+0x8C56 0x3737 0x7941 # <CJK>
+0x8C57 0x3738 0x4FC2 # <CJK>
+0x8C58 0x3739 0x50BE # <CJK>
+0x8C59 0x373A 0x5211 # <CJK>
+0x8C5A 0x373B 0x5144 # <CJK>
+0x8C5B 0x373C 0x5553 # <CJK>
+0x8C5C 0x373D 0x572D # <CJK>
+0x8C5D 0x373E 0x73EA # <CJK>
+0x8C5E 0x373F 0x578B # <CJK>
+0x8C5F 0x3740 0x5951 # <CJK>
+0x8C60 0x3741 0x5F62 # <CJK>
+0x8C61 0x3742 0x5F84 # <CJK>
+0x8C62 0x3743 0x6075 # <CJK>
+0x8C63 0x3744 0x6176 # <CJK>
+0x8C64 0x3745 0x6167 # <CJK>
+0x8C65 0x3746 0x61A9 # <CJK>
+0x8C66 0x3747 0x63B2 # <CJK>
+0x8C67 0x3748 0x643A # <CJK>
+0x8C68 0x3749 0x656C # <CJK>
+0x8C69 0x374A 0x666F # <CJK>
+0x8C6A 0x374B 0x6842 # <CJK>
+0x8C6B 0x374C 0x6E13 # <CJK>
+0x8C6C 0x374D 0x7566 # <CJK>
+0x8C6D 0x374E 0x7A3D # <CJK>
+0x8C6E 0x374F 0x7CFB # <CJK>
+0x8C6F 0x3750 0x7D4C # <CJK>
+0x8C70 0x3751 0x7D99 # <CJK>
+0x8C71 0x3752 0x7E4B # <CJK>
+0x8C72 0x3753 0x7F6B # <CJK>
+0x8C73 0x3754 0x830E # <CJK>
+0x8C74 0x3755 0x834A # <CJK>
+0x8C75 0x3756 0x86CD # <CJK>
+0x8C76 0x3757 0x8A08 # <CJK>
+0x8C77 0x3758 0x8A63 # <CJK>
+0x8C78 0x3759 0x8B66 # <CJK>
+0x8C79 0x375A 0x8EFD # <CJK>
+0x8C7A 0x375B 0x981A # <CJK>
+0x8C7B 0x375C 0x9D8F # <CJK>
+0x8C7C 0x375D 0x82B8 # <CJK>
+0x8C7D 0x375E 0x8FCE # <CJK>
+0x8C7E 0x375F 0x9BE8 # <CJK>
+0x8C80 0x3760 0x5287 # <CJK>
+0x8C81 0x3761 0x621F # <CJK>
+0x8C82 0x3762 0x6483 # <CJK>
+0x8C83 0x3763 0x6FC0 # <CJK>
+0x8C84 0x3764 0x9699 # <CJK>
+0x8C85 0x3765 0x6841 # <CJK>
+0x8C86 0x3766 0x5091 # <CJK>
+0x8C87 0x3767 0x6B20 # <CJK>
+0x8C88 0x3768 0x6C7A # <CJK>
+0x8C89 0x3769 0x6F54 # <CJK>
+0x8C8A 0x376A 0x7A74 # <CJK>
+0x8C8B 0x376B 0x7D50 # <CJK>
+0x8C8C 0x376C 0x8840 # <CJK>
+0x8C8D 0x376D 0x8A23 # <CJK>
+0x8C8E 0x376E 0x6708 # <CJK>
+0x8C8F 0x376F 0x4EF6 # <CJK>
+0x8C90 0x3770 0x5039 # <CJK>
+0x8C91 0x3771 0x5026 # <CJK>
+0x8C92 0x3772 0x5065 # <CJK>
+0x8C93 0x3773 0x517C # <CJK>
+0x8C94 0x3774 0x5238 # <CJK>
+0x8C95 0x3775 0x5263 # <CJK>
+0x8C96 0x3776 0x55A7 # <CJK>
+0x8C97 0x3777 0x570F # <CJK>
+0x8C98 0x3778 0x5805 # <CJK>
+0x8C99 0x3779 0x5ACC # <CJK>
+0x8C9A 0x377A 0x5EFA # <CJK>
+0x8C9B 0x377B 0x61B2 # <CJK>
+0x8C9C 0x377C 0x61F8 # <CJK>
+0x8C9D 0x377D 0x62F3 # <CJK>
+0x8C9E 0x377E 0x6372 # <CJK>
+0x8C9F 0x3821 0x691C # <CJK>
+0x8CA0 0x3822 0x6A29 # <CJK>
+0x8CA1 0x3823 0x727D # <CJK>
+0x8CA2 0x3824 0x72AC # <CJK>
+0x8CA3 0x3825 0x732E # <CJK>
+0x8CA4 0x3826 0x7814 # <CJK>
+0x8CA5 0x3827 0x786F # <CJK>
+0x8CA6 0x3828 0x7D79 # <CJK>
+0x8CA7 0x3829 0x770C # <CJK>
+0x8CA8 0x382A 0x80A9 # <CJK>
+0x8CA9 0x382B 0x898B # <CJK>
+0x8CAA 0x382C 0x8B19 # <CJK>
+0x8CAB 0x382D 0x8CE2 # <CJK>
+0x8CAC 0x382E 0x8ED2 # <CJK>
+0x8CAD 0x382F 0x9063 # <CJK>
+0x8CAE 0x3830 0x9375 # <CJK>
+0x8CAF 0x3831 0x967A # <CJK>
+0x8CB0 0x3832 0x9855 # <CJK>
+0x8CB1 0x3833 0x9A13 # <CJK>
+0x8CB2 0x3834 0x9E78 # <CJK>
+0x8CB3 0x3835 0x5143 # <CJK>
+0x8CB4 0x3836 0x539F # <CJK>
+0x8CB5 0x3837 0x53B3 # <CJK>
+0x8CB6 0x3838 0x5E7B # <CJK>
+0x8CB7 0x3839 0x5F26 # <CJK>
+0x8CB8 0x383A 0x6E1B # <CJK>
+0x8CB9 0x383B 0x6E90 # <CJK>
+0x8CBA 0x383C 0x7384 # <CJK>
+0x8CBB 0x383D 0x73FE # <CJK>
+0x8CBC 0x383E 0x7D43 # <CJK>
+0x8CBD 0x383F 0x8237 # <CJK>
+0x8CBE 0x3840 0x8A00 # <CJK>
+0x8CBF 0x3841 0x8AFA # <CJK>
+0x8CC0 0x3842 0x9650 # <CJK>
+0x8CC1 0x3843 0x4E4E # <CJK>
+0x8CC2 0x3844 0x500B # <CJK>
+0x8CC3 0x3845 0x53E4 # <CJK>
+0x8CC4 0x3846 0x547C # <CJK>
+0x8CC5 0x3847 0x56FA # <CJK>
+0x8CC6 0x3848 0x59D1 # <CJK>
+0x8CC7 0x3849 0x5B64 # <CJK>
+0x8CC8 0x384A 0x5DF1 # <CJK>
+0x8CC9 0x384B 0x5EAB # <CJK>
+0x8CCA 0x384C 0x5F27 # <CJK>
+0x8CCB 0x384D 0x6238 # <CJK>
+0x8CCC 0x384E 0x6545 # <CJK>
+0x8CCD 0x384F 0x67AF # <CJK>
+0x8CCE 0x3850 0x6E56 # <CJK>
+0x8CCF 0x3851 0x72D0 # <CJK>
+0x8CD0 0x3852 0x7CCA # <CJK>
+0x8CD1 0x3853 0x88B4 # <CJK>
+0x8CD2 0x3854 0x80A1 # <CJK>
+0x8CD3 0x3855 0x80E1 # <CJK>
+0x8CD4 0x3856 0x83F0 # <CJK>
+0x8CD5 0x3857 0x864E # <CJK>
+0x8CD6 0x3858 0x8A87 # <CJK>
+0x8CD7 0x3859 0x8DE8 # <CJK>
+0x8CD8 0x385A 0x9237 # <CJK>
+0x8CD9 0x385B 0x96C7 # <CJK>
+0x8CDA 0x385C 0x9867 # <CJK>
+0x8CDB 0x385D 0x9F13 # <CJK>
+0x8CDC 0x385E 0x4E94 # <CJK>
+0x8CDD 0x385F 0x4E92 # <CJK>
+0x8CDE 0x3860 0x4F0D # <CJK>
+0x8CDF 0x3861 0x5348 # <CJK>
+0x8CE0 0x3862 0x5449 # <CJK>
+0x8CE1 0x3863 0x543E # <CJK>
+0x8CE2 0x3864 0x5A2F # <CJK>
+0x8CE3 0x3865 0x5F8C # <CJK>
+0x8CE4 0x3866 0x5FA1 # <CJK>
+0x8CE5 0x3867 0x609F # <CJK>
+0x8CE6 0x3868 0x68A7 # <CJK>
+0x8CE7 0x3869 0x6A8E # <CJK>
+0x8CE8 0x386A 0x745A # <CJK>
+0x8CE9 0x386B 0x7881 # <CJK>
+0x8CEA 0x386C 0x8A9E # <CJK>
+0x8CEB 0x386D 0x8AA4 # <CJK>
+0x8CEC 0x386E 0x8B77 # <CJK>
+0x8CED 0x386F 0x9190 # <CJK>
+0x8CEE 0x3870 0x4E5E # <CJK>
+0x8CEF 0x3871 0x9BC9 # <CJK>
+0x8CF0 0x3872 0x4EA4 # <CJK>
+0x8CF1 0x3873 0x4F7C # <CJK>
+0x8CF2 0x3874 0x4FAF # <CJK>
+0x8CF3 0x3875 0x5019 # <CJK>
+0x8CF4 0x3876 0x5016 # <CJK>
+0x8CF5 0x3877 0x5149 # <CJK>
+0x8CF6 0x3878 0x516C # <CJK>
+0x8CF7 0x3879 0x529F # <CJK>
+0x8CF8 0x387A 0x52B9 # <CJK>
+0x8CF9 0x387B 0x52FE # <CJK>
+0x8CFA 0x387C 0x539A # <CJK>
+0x8CFB 0x387D 0x53E3 # <CJK>
+0x8CFC 0x387E 0x5411 # <CJK>
+0x8D40 0x3921 0x540E # <CJK>
+0x8D41 0x3922 0x5589 # <CJK>
+0x8D42 0x3923 0x5751 # <CJK>
+0x8D43 0x3924 0x57A2 # <CJK>
+0x8D44 0x3925 0x597D # <CJK>
+0x8D45 0x3926 0x5B54 # <CJK>
+0x8D46 0x3927 0x5B5D # <CJK>
+0x8D47 0x3928 0x5B8F # <CJK>
+0x8D48 0x3929 0x5DE5 # <CJK>
+0x8D49 0x392A 0x5DE7 # <CJK>
+0x8D4A 0x392B 0x5DF7 # <CJK>
+0x8D4B 0x392C 0x5E78 # <CJK>
+0x8D4C 0x392D 0x5E83 # <CJK>
+0x8D4D 0x392E 0x5E9A # <CJK>
+0x8D4E 0x392F 0x5EB7 # <CJK>
+0x8D4F 0x3930 0x5F18 # <CJK>
+0x8D50 0x3931 0x6052 # <CJK>
+0x8D51 0x3932 0x614C # <CJK>
+0x8D52 0x3933 0x6297 # <CJK>
+0x8D53 0x3934 0x62D8 # <CJK>
+0x8D54 0x3935 0x63A7 # <CJK>
+0x8D55 0x3936 0x653B # <CJK>
+0x8D56 0x3937 0x6602 # <CJK>
+0x8D57 0x3938 0x6643 # <CJK>
+0x8D58 0x3939 0x66F4 # <CJK>
+0x8D59 0x393A 0x676D # <CJK>
+0x8D5A 0x393B 0x6821 # <CJK>
+0x8D5B 0x393C 0x6897 # <CJK>
+0x8D5C 0x393D 0x69CB # <CJK>
+0x8D5D 0x393E 0x6C5F # <CJK>
+0x8D5E 0x393F 0x6D2A # <CJK>
+0x8D5F 0x3940 0x6D69 # <CJK>
+0x8D60 0x3941 0x6E2F # <CJK>
+0x8D61 0x3942 0x6E9D # <CJK>
+0x8D62 0x3943 0x7532 # <CJK>
+0x8D63 0x3944 0x7687 # <CJK>
+0x8D64 0x3945 0x786C # <CJK>
+0x8D65 0x3946 0x7A3F # <CJK>
+0x8D66 0x3947 0x7CE0 # <CJK>
+0x8D67 0x3948 0x7D05 # <CJK>
+0x8D68 0x3949 0x7D18 # <CJK>
+0x8D69 0x394A 0x7D5E # <CJK>
+0x8D6A 0x394B 0x7DB1 # <CJK>
+0x8D6B 0x394C 0x8015 # <CJK>
+0x8D6C 0x394D 0x8003 # <CJK>
+0x8D6D 0x394E 0x80AF # <CJK>
+0x8D6E 0x394F 0x80B1 # <CJK>
+0x8D6F 0x3950 0x8154 # <CJK>
+0x8D70 0x3951 0x818F # <CJK>
+0x8D71 0x3952 0x822A # <CJK>
+0x8D72 0x3953 0x8352 # <CJK>
+0x8D73 0x3954 0x884C # <CJK>
+0x8D74 0x3955 0x8861 # <CJK>
+0x8D75 0x3956 0x8B1B # <CJK>
+0x8D76 0x3957 0x8CA2 # <CJK>
+0x8D77 0x3958 0x8CFC # <CJK>
+0x8D78 0x3959 0x90CA # <CJK>
+0x8D79 0x395A 0x9175 # <CJK>
+0x8D7A 0x395B 0x9271 # <CJK>
+0x8D7B 0x395C 0x783F # <CJK>
+0x8D7C 0x395D 0x92FC # <CJK>
+0x8D7D 0x395E 0x95A4 # <CJK>
+0x8D7E 0x395F 0x964D # <CJK>
+0x8D80 0x3960 0x9805 # <CJK>
+0x8D81 0x3961 0x9999 # <CJK>
+0x8D82 0x3962 0x9AD8 # <CJK>
+0x8D83 0x3963 0x9D3B # <CJK>
+0x8D84 0x3964 0x525B # <CJK>
+0x8D85 0x3965 0x52AB # <CJK>
+0x8D86 0x3966 0x53F7 # <CJK>
+0x8D87 0x3967 0x5408 # <CJK>
+0x8D88 0x3968 0x58D5 # <CJK>
+0x8D89 0x3969 0x62F7 # <CJK>
+0x8D8A 0x396A 0x6FE0 # <CJK>
+0x8D8B 0x396B 0x8C6A # <CJK>
+0x8D8C 0x396C 0x8F5F # <CJK>
+0x8D8D 0x396D 0x9EB9 # <CJK>
+0x8D8E 0x396E 0x514B # <CJK>
+0x8D8F 0x396F 0x523B # <CJK>
+0x8D90 0x3970 0x544A # <CJK>
+0x8D91 0x3971 0x56FD # <CJK>
+0x8D92 0x3972 0x7A40 # <CJK>
+0x8D93 0x3973 0x9177 # <CJK>
+0x8D94 0x3974 0x9D60 # <CJK>
+0x8D95 0x3975 0x9ED2 # <CJK>
+0x8D96 0x3976 0x7344 # <CJK>
+0x8D97 0x3977 0x6F09 # <CJK>
+0x8D98 0x3978 0x8170 # <CJK>
+0x8D99 0x3979 0x7511 # <CJK>
+0x8D9A 0x397A 0x5FFD # <CJK>
+0x8D9B 0x397B 0x60DA # <CJK>
+0x8D9C 0x397C 0x9AA8 # <CJK>
+0x8D9D 0x397D 0x72DB # <CJK>
+0x8D9E 0x397E 0x8FBC # <CJK>
+0x8D9F 0x3A21 0x6B64 # <CJK>
+0x8DA0 0x3A22 0x9803 # <CJK>
+0x8DA1 0x3A23 0x4ECA # <CJK>
+0x8DA2 0x3A24 0x56F0 # <CJK>
+0x8DA3 0x3A25 0x5764 # <CJK>
+0x8DA4 0x3A26 0x58BE # <CJK>
+0x8DA5 0x3A27 0x5A5A # <CJK>
+0x8DA6 0x3A28 0x6068 # <CJK>
+0x8DA7 0x3A29 0x61C7 # <CJK>
+0x8DA8 0x3A2A 0x660F # <CJK>
+0x8DA9 0x3A2B 0x6606 # <CJK>
+0x8DAA 0x3A2C 0x6839 # <CJK>
+0x8DAB 0x3A2D 0x68B1 # <CJK>
+0x8DAC 0x3A2E 0x6DF7 # <CJK>
+0x8DAD 0x3A2F 0x75D5 # <CJK>
+0x8DAE 0x3A30 0x7D3A # <CJK>
+0x8DAF 0x3A31 0x826E # <CJK>
+0x8DB0 0x3A32 0x9B42 # <CJK>
+0x8DB1 0x3A33 0x4E9B # <CJK>
+0x8DB2 0x3A34 0x4F50 # <CJK>
+0x8DB3 0x3A35 0x53C9 # <CJK>
+0x8DB4 0x3A36 0x5506 # <CJK>
+0x8DB5 0x3A37 0x5D6F # <CJK>
+0x8DB6 0x3A38 0x5DE6 # <CJK>
+0x8DB7 0x3A39 0x5DEE # <CJK>
+0x8DB8 0x3A3A 0x67FB # <CJK>
+0x8DB9 0x3A3B 0x6C99 # <CJK>
+0x8DBA 0x3A3C 0x7473 # <CJK>
+0x8DBB 0x3A3D 0x7802 # <CJK>
+0x8DBC 0x3A3E 0x8A50 # <CJK>
+0x8DBD 0x3A3F 0x9396 # <CJK>
+0x8DBE 0x3A40 0x88DF # <CJK>
+0x8DBF 0x3A41 0x5750 # <CJK>
+0x8DC0 0x3A42 0x5EA7 # <CJK>
+0x8DC1 0x3A43 0x632B # <CJK>
+0x8DC2 0x3A44 0x50B5 # <CJK>
+0x8DC3 0x3A45 0x50AC # <CJK>
+0x8DC4 0x3A46 0x518D # <CJK>
+0x8DC5 0x3A47 0x6700 # <CJK>
+0x8DC6 0x3A48 0x54C9 # <CJK>
+0x8DC7 0x3A49 0x585E # <CJK>
+0x8DC8 0x3A4A 0x59BB # <CJK>
+0x8DC9 0x3A4B 0x5BB0 # <CJK>
+0x8DCA 0x3A4C 0x5F69 # <CJK>
+0x8DCB 0x3A4D 0x624D # <CJK>
+0x8DCC 0x3A4E 0x63A1 # <CJK>
+0x8DCD 0x3A4F 0x683D # <CJK>
+0x8DCE 0x3A50 0x6B73 # <CJK>
+0x8DCF 0x3A51 0x6E08 # <CJK>
+0x8DD0 0x3A52 0x707D # <CJK>
+0x8DD1 0x3A53 0x91C7 # <CJK>
+0x8DD2 0x3A54 0x7280 # <CJK>
+0x8DD3 0x3A55 0x7815 # <CJK>
+0x8DD4 0x3A56 0x7826 # <CJK>
+0x8DD5 0x3A57 0x796D # <CJK>
+0x8DD6 0x3A58 0x658E # <CJK>
+0x8DD7 0x3A59 0x7D30 # <CJK>
+0x8DD8 0x3A5A 0x83DC # <CJK>
+0x8DD9 0x3A5B 0x88C1 # <CJK>
+0x8DDA 0x3A5C 0x8F09 # <CJK>
+0x8DDB 0x3A5D 0x969B # <CJK>
+0x8DDC 0x3A5E 0x5264 # <CJK>
+0x8DDD 0x3A5F 0x5728 # <CJK>
+0x8DDE 0x3A60 0x6750 # <CJK>
+0x8DDF 0x3A61 0x7F6A # <CJK>
+0x8DE0 0x3A62 0x8CA1 # <CJK>
+0x8DE1 0x3A63 0x51B4 # <CJK>
+0x8DE2 0x3A64 0x5742 # <CJK>
+0x8DE3 0x3A65 0x962A # <CJK>
+0x8DE4 0x3A66 0x583A # <CJK>
+0x8DE5 0x3A67 0x698A # <CJK>
+0x8DE6 0x3A68 0x80B4 # <CJK>
+0x8DE7 0x3A69 0x54B2 # <CJK>
+0x8DE8 0x3A6A 0x5D0E # <CJK>
+0x8DE9 0x3A6B 0x57FC # <CJK>
+0x8DEA 0x3A6C 0x7895 # <CJK>
+0x8DEB 0x3A6D 0x9DFA # <CJK>
+0x8DEC 0x3A6E 0x4F5C # <CJK>
+0x8DED 0x3A6F 0x524A # <CJK>
+0x8DEE 0x3A70 0x548B # <CJK>
+0x8DEF 0x3A71 0x643E # <CJK>
+0x8DF0 0x3A72 0x6628 # <CJK>
+0x8DF1 0x3A73 0x6714 # <CJK>
+0x8DF2 0x3A74 0x67F5 # <CJK>
+0x8DF3 0x3A75 0x7A84 # <CJK>
+0x8DF4 0x3A76 0x7B56 # <CJK>
+0x8DF5 0x3A77 0x7D22 # <CJK>
+0x8DF6 0x3A78 0x932F # <CJK>
+0x8DF7 0x3A79 0x685C # <CJK>
+0x8DF8 0x3A7A 0x9BAD # <CJK>
+0x8DF9 0x3A7B 0x7B39 # <CJK>
+0x8DFA 0x3A7C 0x5319 # <CJK>
+0x8DFB 0x3A7D 0x518A # <CJK>
+0x8DFC 0x3A7E 0x5237 # <CJK>
+0x8E40 0x3B21 0x5BDF # <CJK>
+0x8E41 0x3B22 0x62F6 # <CJK>
+0x8E42 0x3B23 0x64AE # <CJK>
+0x8E43 0x3B24 0x64E6 # <CJK>
+0x8E44 0x3B25 0x672D # <CJK>
+0x8E45 0x3B26 0x6BBA # <CJK>
+0x8E46 0x3B27 0x85A9 # <CJK>
+0x8E47 0x3B28 0x96D1 # <CJK>
+0x8E48 0x3B29 0x7690 # <CJK>
+0x8E49 0x3B2A 0x9BD6 # <CJK>
+0x8E4A 0x3B2B 0x634C # <CJK>
+0x8E4B 0x3B2C 0x9306 # <CJK>
+0x8E4C 0x3B2D 0x9BAB # <CJK>
+0x8E4D 0x3B2E 0x76BF # <CJK>
+0x8E4E 0x3B2F 0x6652 # <CJK>
+0x8E4F 0x3B30 0x4E09 # <CJK>
+0x8E50 0x3B31 0x5098 # <CJK>
+0x8E51 0x3B32 0x53C2 # <CJK>
+0x8E52 0x3B33 0x5C71 # <CJK>
+0x8E53 0x3B34 0x60E8 # <CJK>
+0x8E54 0x3B35 0x6492 # <CJK>
+0x8E55 0x3B36 0x6563 # <CJK>
+0x8E56 0x3B37 0x685F # <CJK>
+0x8E57 0x3B38 0x71E6 # <CJK>
+0x8E58 0x3B39 0x73CA # <CJK>
+0x8E59 0x3B3A 0x7523 # <CJK>
+0x8E5A 0x3B3B 0x7B97 # <CJK>
+0x8E5B 0x3B3C 0x7E82 # <CJK>
+0x8E5C 0x3B3D 0x8695 # <CJK>
+0x8E5D 0x3B3E 0x8B83 # <CJK>
+0x8E5E 0x3B3F 0x8CDB # <CJK>
+0x8E5F 0x3B40 0x9178 # <CJK>
+0x8E60 0x3B41 0x9910 # <CJK>
+0x8E61 0x3B42 0x65AC # <CJK>
+0x8E62 0x3B43 0x66AB # <CJK>
+0x8E63 0x3B44 0x6B8B # <CJK>
+0x8E64 0x3B45 0x4ED5 # <CJK>
+0x8E65 0x3B46 0x4ED4 # <CJK>
+0x8E66 0x3B47 0x4F3A # <CJK>
+0x8E67 0x3B48 0x4F7F # <CJK>
+0x8E68 0x3B49 0x523A # <CJK>
+0x8E69 0x3B4A 0x53F8 # <CJK>
+0x8E6A 0x3B4B 0x53F2 # <CJK>
+0x8E6B 0x3B4C 0x55E3 # <CJK>
+0x8E6C 0x3B4D 0x56DB # <CJK>
+0x8E6D 0x3B4E 0x58EB # <CJK>
+0x8E6E 0x3B4F 0x59CB # <CJK>
+0x8E6F 0x3B50 0x59C9 # <CJK>
+0x8E70 0x3B51 0x59FF # <CJK>
+0x8E71 0x3B52 0x5B50 # <CJK>
+0x8E72 0x3B53 0x5C4D # <CJK>
+0x8E73 0x3B54 0x5E02 # <CJK>
+0x8E74 0x3B55 0x5E2B # <CJK>
+0x8E75 0x3B56 0x5FD7 # <CJK>
+0x8E76 0x3B57 0x601D # <CJK>
+0x8E77 0x3B58 0x6307 # <CJK>
+0x8E78 0x3B59 0x652F # <CJK>
+0x8E79 0x3B5A 0x5B5C # <CJK>
+0x8E7A 0x3B5B 0x65AF # <CJK>
+0x8E7B 0x3B5C 0x65BD # <CJK>
+0x8E7C 0x3B5D 0x65E8 # <CJK>
+0x8E7D 0x3B5E 0x679D # <CJK>
+0x8E7E 0x3B5F 0x6B62 # <CJK>
+0x8E80 0x3B60 0x6B7B # <CJK>
+0x8E81 0x3B61 0x6C0F # <CJK>
+0x8E82 0x3B62 0x7345 # <CJK>
+0x8E83 0x3B63 0x7949 # <CJK>
+0x8E84 0x3B64 0x79C1 # <CJK>
+0x8E85 0x3B65 0x7CF8 # <CJK>
+0x8E86 0x3B66 0x7D19 # <CJK>
+0x8E87 0x3B67 0x7D2B # <CJK>
+0x8E88 0x3B68 0x80A2 # <CJK>
+0x8E89 0x3B69 0x8102 # <CJK>
+0x8E8A 0x3B6A 0x81F3 # <CJK>
+0x8E8B 0x3B6B 0x8996 # <CJK>
+0x8E8C 0x3B6C 0x8A5E # <CJK>
+0x8E8D 0x3B6D 0x8A69 # <CJK>
+0x8E8E 0x3B6E 0x8A66 # <CJK>
+0x8E8F 0x3B6F 0x8A8C # <CJK>
+0x8E90 0x3B70 0x8AEE # <CJK>
+0x8E91 0x3B71 0x8CC7 # <CJK>
+0x8E92 0x3B72 0x8CDC # <CJK>
+0x8E93 0x3B73 0x96CC # <CJK>
+0x8E94 0x3B74 0x98FC # <CJK>
+0x8E95 0x3B75 0x6B6F # <CJK>
+0x8E96 0x3B76 0x4E8B # <CJK>
+0x8E97 0x3B77 0x4F3C # <CJK>
+0x8E98 0x3B78 0x4F8D # <CJK>
+0x8E99 0x3B79 0x5150 # <CJK>
+0x8E9A 0x3B7A 0x5B57 # <CJK>
+0x8E9B 0x3B7B 0x5BFA # <CJK>
+0x8E9C 0x3B7C 0x6148 # <CJK>
+0x8E9D 0x3B7D 0x6301 # <CJK>
+0x8E9E 0x3B7E 0x6642 # <CJK>
+0x8E9F 0x3C21 0x6B21 # <CJK>
+0x8EA0 0x3C22 0x6ECB # <CJK>
+0x8EA1 0x3C23 0x6CBB # <CJK>
+0x8EA2 0x3C24 0x723E # <CJK>
+0x8EA3 0x3C25 0x74BD # <CJK>
+0x8EA4 0x3C26 0x75D4 # <CJK>
+0x8EA5 0x3C27 0x78C1 # <CJK>
+0x8EA6 0x3C28 0x793A # <CJK>
+0x8EA7 0x3C29 0x800C # <CJK>
+0x8EA8 0x3C2A 0x8033 # <CJK>
+0x8EA9 0x3C2B 0x81EA # <CJK>
+0x8EAA 0x3C2C 0x8494 # <CJK>
+0x8EAB 0x3C2D 0x8F9E # <CJK>
+0x8EAC 0x3C2E 0x6C50 # <CJK>
+0x8EAD 0x3C2F 0x9E7F # <CJK>
+0x8EAE 0x3C30 0x5F0F # <CJK>
+0x8EAF 0x3C31 0x8B58 # <CJK>
+0x8EB0 0x3C32 0x9D2B # <CJK>
+0x8EB1 0x3C33 0x7AFA # <CJK>
+0x8EB2 0x3C34 0x8EF8 # <CJK>
+0x8EB3 0x3C35 0x5B8D # <CJK>
+0x8EB4 0x3C36 0x96EB # <CJK>
+0x8EB5 0x3C37 0x4E03 # <CJK>
+0x8EB6 0x3C38 0x53F1 # <CJK>
+0x8EB7 0x3C39 0x57F7 # <CJK>
+0x8EB8 0x3C3A 0x5931 # <CJK>
+0x8EB9 0x3C3B 0x5AC9 # <CJK>
+0x8EBA 0x3C3C 0x5BA4 # <CJK>
+0x8EBB 0x3C3D 0x6089 # <CJK>
+0x8EBC 0x3C3E 0x6E7F # <CJK>
+0x8EBD 0x3C3F 0x6F06 # <CJK>
+0x8EBE 0x3C40 0x75BE # <CJK>
+0x8EBF 0x3C41 0x8CEA # <CJK>
+0x8EC0 0x3C42 0x5B9F # <CJK>
+0x8EC1 0x3C43 0x8500 # <CJK>
+0x8EC2 0x3C44 0x7BE0 # <CJK>
+0x8EC3 0x3C45 0x5072 # <CJK>
+0x8EC4 0x3C46 0x67F4 # <CJK>
+0x8EC5 0x3C47 0x829D # <CJK>
+0x8EC6 0x3C48 0x5C61 # <CJK>
+0x8EC7 0x3C49 0x854A # <CJK>
+0x8EC8 0x3C4A 0x7E1E # <CJK>
+0x8EC9 0x3C4B 0x820E # <CJK>
+0x8ECA 0x3C4C 0x5199 # <CJK>
+0x8ECB 0x3C4D 0x5C04 # <CJK>
+0x8ECC 0x3C4E 0x6368 # <CJK>
+0x8ECD 0x3C4F 0x8D66 # <CJK>
+0x8ECE 0x3C50 0x659C # <CJK>
+0x8ECF 0x3C51 0x716E # <CJK>
+0x8ED0 0x3C52 0x793E # <CJK>
+0x8ED1 0x3C53 0x7D17 # <CJK>
+0x8ED2 0x3C54 0x8005 # <CJK>
+0x8ED3 0x3C55 0x8B1D # <CJK>
+0x8ED4 0x3C56 0x8ECA # <CJK>
+0x8ED5 0x3C57 0x906E # <CJK>
+0x8ED6 0x3C58 0x86C7 # <CJK>
+0x8ED7 0x3C59 0x90AA # <CJK>
+0x8ED8 0x3C5A 0x501F # <CJK>
+0x8ED9 0x3C5B 0x52FA # <CJK>
+0x8EDA 0x3C5C 0x5C3A # <CJK>
+0x8EDB 0x3C5D 0x6753 # <CJK>
+0x8EDC 0x3C5E 0x707C # <CJK>
+0x8EDD 0x3C5F 0x7235 # <CJK>
+0x8EDE 0x3C60 0x914C # <CJK>
+0x8EDF 0x3C61 0x91C8 # <CJK>
+0x8EE0 0x3C62 0x932B # <CJK>
+0x8EE1 0x3C63 0x82E5 # <CJK>
+0x8EE2 0x3C64 0x5BC2 # <CJK>
+0x8EE3 0x3C65 0x5F31 # <CJK>
+0x8EE4 0x3C66 0x60F9 # <CJK>
+0x8EE5 0x3C67 0x4E3B # <CJK>
+0x8EE6 0x3C68 0x53D6 # <CJK>
+0x8EE7 0x3C69 0x5B88 # <CJK>
+0x8EE8 0x3C6A 0x624B # <CJK>
+0x8EE9 0x3C6B 0x6731 # <CJK>
+0x8EEA 0x3C6C 0x6B8A # <CJK>
+0x8EEB 0x3C6D 0x72E9 # <CJK>
+0x8EEC 0x3C6E 0x73E0 # <CJK>
+0x8EED 0x3C6F 0x7A2E # <CJK>
+0x8EEE 0x3C70 0x816B # <CJK>
+0x8EEF 0x3C71 0x8DA3 # <CJK>
+0x8EF0 0x3C72 0x9152 # <CJK>
+0x8EF1 0x3C73 0x9996 # <CJK>
+0x8EF2 0x3C74 0x5112 # <CJK>
+0x8EF3 0x3C75 0x53D7 # <CJK>
+0x8EF4 0x3C76 0x546A # <CJK>
+0x8EF5 0x3C77 0x5BFF # <CJK>
+0x8EF6 0x3C78 0x6388 # <CJK>
+0x8EF7 0x3C79 0x6A39 # <CJK>
+0x8EF8 0x3C7A 0x7DAC # <CJK>
+0x8EF9 0x3C7B 0x9700 # <CJK>
+0x8EFA 0x3C7C 0x56DA # <CJK>
+0x8EFB 0x3C7D 0x53CE # <CJK>
+0x8EFC 0x3C7E 0x5468 # <CJK>
+0x8F40 0x3D21 0x5B97 # <CJK>
+0x8F41 0x3D22 0x5C31 # <CJK>
+0x8F42 0x3D23 0x5DDE # <CJK>
+0x8F43 0x3D24 0x4FEE # <CJK>
+0x8F44 0x3D25 0x6101 # <CJK>
+0x8F45 0x3D26 0x62FE # <CJK>
+0x8F46 0x3D27 0x6D32 # <CJK>
+0x8F47 0x3D28 0x79C0 # <CJK>
+0x8F48 0x3D29 0x79CB # <CJK>
+0x8F49 0x3D2A 0x7D42 # <CJK>
+0x8F4A 0x3D2B 0x7E4D # <CJK>
+0x8F4B 0x3D2C 0x7FD2 # <CJK>
+0x8F4C 0x3D2D 0x81ED # <CJK>
+0x8F4D 0x3D2E 0x821F # <CJK>
+0x8F4E 0x3D2F 0x8490 # <CJK>
+0x8F4F 0x3D30 0x8846 # <CJK>
+0x8F50 0x3D31 0x8972 # <CJK>
+0x8F51 0x3D32 0x8B90 # <CJK>
+0x8F52 0x3D33 0x8E74 # <CJK>
+0x8F53 0x3D34 0x8F2F # <CJK>
+0x8F54 0x3D35 0x9031 # <CJK>
+0x8F55 0x3D36 0x914B # <CJK>
+0x8F56 0x3D37 0x916C # <CJK>
+0x8F57 0x3D38 0x96C6 # <CJK>
+0x8F58 0x3D39 0x919C # <CJK>
+0x8F59 0x3D3A 0x4EC0 # <CJK>
+0x8F5A 0x3D3B 0x4F4F # <CJK>
+0x8F5B 0x3D3C 0x5145 # <CJK>
+0x8F5C 0x3D3D 0x5341 # <CJK>
+0x8F5D 0x3D3E 0x5F93 # <CJK>
+0x8F5E 0x3D3F 0x620E # <CJK>
+0x8F5F 0x3D40 0x67D4 # <CJK>
+0x8F60 0x3D41 0x6C41 # <CJK>
+0x8F61 0x3D42 0x6E0B # <CJK>
+0x8F62 0x3D43 0x7363 # <CJK>
+0x8F63 0x3D44 0x7E26 # <CJK>
+0x8F64 0x3D45 0x91CD # <CJK>
+0x8F65 0x3D46 0x9283 # <CJK>
+0x8F66 0x3D47 0x53D4 # <CJK>
+0x8F67 0x3D48 0x5919 # <CJK>
+0x8F68 0x3D49 0x5BBF # <CJK>
+0x8F69 0x3D4A 0x6DD1 # <CJK>
+0x8F6A 0x3D4B 0x795D # <CJK>
+0x8F6B 0x3D4C 0x7E2E # <CJK>
+0x8F6C 0x3D4D 0x7C9B # <CJK>
+0x8F6D 0x3D4E 0x587E # <CJK>
+0x8F6E 0x3D4F 0x719F # <CJK>
+0x8F6F 0x3D50 0x51FA # <CJK>
+0x8F70 0x3D51 0x8853 # <CJK>
+0x8F71 0x3D52 0x8FF0 # <CJK>
+0x8F72 0x3D53 0x4FCA # <CJK>
+0x8F73 0x3D54 0x5CFB # <CJK>
+0x8F74 0x3D55 0x6625 # <CJK>
+0x8F75 0x3D56 0x77AC # <CJK>
+0x8F76 0x3D57 0x7AE3 # <CJK>
+0x8F77 0x3D58 0x821C # <CJK>
+0x8F78 0x3D59 0x99FF # <CJK>
+0x8F79 0x3D5A 0x51C6 # <CJK>
+0x8F7A 0x3D5B 0x5FAA # <CJK>
+0x8F7B 0x3D5C 0x65EC # <CJK>
+0x8F7C 0x3D5D 0x696F # <CJK>
+0x8F7D 0x3D5E 0x6B89 # <CJK>
+0x8F7E 0x3D5F 0x6DF3 # <CJK>
+0x8F80 0x3D60 0x6E96 # <CJK>
+0x8F81 0x3D61 0x6F64 # <CJK>
+0x8F82 0x3D62 0x76FE # <CJK>
+0x8F83 0x3D63 0x7D14 # <CJK>
+0x8F84 0x3D64 0x5DE1 # <CJK>
+0x8F85 0x3D65 0x9075 # <CJK>
+0x8F86 0x3D66 0x9187 # <CJK>
+0x8F87 0x3D67 0x9806 # <CJK>
+0x8F88 0x3D68 0x51E6 # <CJK>
+0x8F89 0x3D69 0x521D # <CJK>
+0x8F8A 0x3D6A 0x6240 # <CJK>
+0x8F8B 0x3D6B 0x6691 # <CJK>
+0x8F8C 0x3D6C 0x66D9 # <CJK>
+0x8F8D 0x3D6D 0x6E1A # <CJK>
+0x8F8E 0x3D6E 0x5EB6 # <CJK>
+0x8F8F 0x3D6F 0x7DD2 # <CJK>
+0x8F90 0x3D70 0x7F72 # <CJK>
+0x8F91 0x3D71 0x66F8 # <CJK>
+0x8F92 0x3D72 0x85AF # <CJK>
+0x8F93 0x3D73 0x85F7 # <CJK>
+0x8F94 0x3D74 0x8AF8 # <CJK>
+0x8F95 0x3D75 0x52A9 # <CJK>
+0x8F96 0x3D76 0x53D9 # <CJK>
+0x8F97 0x3D77 0x5973 # <CJK>
+0x8F98 0x3D78 0x5E8F # <CJK>
+0x8F99 0x3D79 0x5F90 # <CJK>
+0x8F9A 0x3D7A 0x6055 # <CJK>
+0x8F9B 0x3D7B 0x92E4 # <CJK>
+0x8F9C 0x3D7C 0x9664 # <CJK>
+0x8F9D 0x3D7D 0x50B7 # <CJK>
+0x8F9E 0x3D7E 0x511F # <CJK>
+0x8F9F 0x3E21 0x52DD # <CJK>
+0x8FA0 0x3E22 0x5320 # <CJK>
+0x8FA1 0x3E23 0x5347 # <CJK>
+0x8FA2 0x3E24 0x53EC # <CJK>
+0x8FA3 0x3E25 0x54E8 # <CJK>
+0x8FA4 0x3E26 0x5546 # <CJK>
+0x8FA5 0x3E27 0x5531 # <CJK>
+0x8FA6 0x3E28 0x5617 # <CJK>
+0x8FA7 0x3E29 0x5968 # <CJK>
+0x8FA8 0x3E2A 0x59BE # <CJK>
+0x8FA9 0x3E2B 0x5A3C # <CJK>
+0x8FAA 0x3E2C 0x5BB5 # <CJK>
+0x8FAB 0x3E2D 0x5C06 # <CJK>
+0x8FAC 0x3E2E 0x5C0F # <CJK>
+0x8FAD 0x3E2F 0x5C11 # <CJK>
+0x8FAE 0x3E30 0x5C1A # <CJK>
+0x8FAF 0x3E31 0x5E84 # <CJK>
+0x8FB0 0x3E32 0x5E8A # <CJK>
+0x8FB1 0x3E33 0x5EE0 # <CJK>
+0x8FB2 0x3E34 0x5F70 # <CJK>
+0x8FB3 0x3E35 0x627F # <CJK>
+0x8FB4 0x3E36 0x6284 # <CJK>
+0x8FB5 0x3E37 0x62DB # <CJK>
+0x8FB6 0x3E38 0x638C # <CJK>
+0x8FB7 0x3E39 0x6377 # <CJK>
+0x8FB8 0x3E3A 0x6607 # <CJK>
+0x8FB9 0x3E3B 0x660C # <CJK>
+0x8FBA 0x3E3C 0x662D # <CJK>
+0x8FBB 0x3E3D 0x6676 # <CJK>
+0x8FBC 0x3E3E 0x677E # <CJK>
+0x8FBD 0x3E3F 0x68A2 # <CJK>
+0x8FBE 0x3E40 0x6A1F # <CJK>
+0x8FBF 0x3E41 0x6A35 # <CJK>
+0x8FC0 0x3E42 0x6CBC # <CJK>
+0x8FC1 0x3E43 0x6D88 # <CJK>
+0x8FC2 0x3E44 0x6E09 # <CJK>
+0x8FC3 0x3E45 0x6E58 # <CJK>
+0x8FC4 0x3E46 0x713C # <CJK>
+0x8FC5 0x3E47 0x7126 # <CJK>
+0x8FC6 0x3E48 0x7167 # <CJK>
+0x8FC7 0x3E49 0x75C7 # <CJK>
+0x8FC8 0x3E4A 0x7701 # <CJK>
+0x8FC9 0x3E4B 0x785D # <CJK>
+0x8FCA 0x3E4C 0x7901 # <CJK>
+0x8FCB 0x3E4D 0x7965 # <CJK>
+0x8FCC 0x3E4E 0x79F0 # <CJK>
+0x8FCD 0x3E4F 0x7AE0 # <CJK>
+0x8FCE 0x3E50 0x7B11 # <CJK>
+0x8FCF 0x3E51 0x7CA7 # <CJK>
+0x8FD0 0x3E52 0x7D39 # <CJK>
+0x8FD1 0x3E53 0x8096 # <CJK>
+0x8FD2 0x3E54 0x83D6 # <CJK>
+0x8FD3 0x3E55 0x848B # <CJK>
+0x8FD4 0x3E56 0x8549 # <CJK>
+0x8FD5 0x3E57 0x885D # <CJK>
+0x8FD6 0x3E58 0x88F3 # <CJK>
+0x8FD7 0x3E59 0x8A1F # <CJK>
+0x8FD8 0x3E5A 0x8A3C # <CJK>
+0x8FD9 0x3E5B 0x8A54 # <CJK>
+0x8FDA 0x3E5C 0x8A73 # <CJK>
+0x8FDB 0x3E5D 0x8C61 # <CJK>
+0x8FDC 0x3E5E 0x8CDE # <CJK>
+0x8FDD 0x3E5F 0x91A4 # <CJK>
+0x8FDE 0x3E60 0x9266 # <CJK>
+0x8FDF 0x3E61 0x937E # <CJK>
+0x8FE0 0x3E62 0x9418 # <CJK>
+0x8FE1 0x3E63 0x969C # <CJK>
+0x8FE2 0x3E64 0x9798 # <CJK>
+0x8FE3 0x3E65 0x4E0A # <CJK>
+0x8FE4 0x3E66 0x4E08 # <CJK>
+0x8FE5 0x3E67 0x4E1E # <CJK>
+0x8FE6 0x3E68 0x4E57 # <CJK>
+0x8FE7 0x3E69 0x5197 # <CJK>
+0x8FE8 0x3E6A 0x5270 # <CJK>
+0x8FE9 0x3E6B 0x57CE # <CJK>
+0x8FEA 0x3E6C 0x5834 # <CJK>
+0x8FEB 0x3E6D 0x58CC # <CJK>
+0x8FEC 0x3E6E 0x5B22 # <CJK>
+0x8FED 0x3E6F 0x5E38 # <CJK>
+0x8FEE 0x3E70 0x60C5 # <CJK>
+0x8FEF 0x3E71 0x64FE # <CJK>
+0x8FF0 0x3E72 0x6761 # <CJK>
+0x8FF1 0x3E73 0x6756 # <CJK>
+0x8FF2 0x3E74 0x6D44 # <CJK>
+0x8FF3 0x3E75 0x72B6 # <CJK>
+0x8FF4 0x3E76 0x7573 # <CJK>
+0x8FF5 0x3E77 0x7A63 # <CJK>
+0x8FF6 0x3E78 0x84B8 # <CJK>
+0x8FF7 0x3E79 0x8B72 # <CJK>
+0x8FF8 0x3E7A 0x91B8 # <CJK>
+0x8FF9 0x3E7B 0x9320 # <CJK>
+0x8FFA 0x3E7C 0x5631 # <CJK>
+0x8FFB 0x3E7D 0x57F4 # <CJK>
+0x8FFC 0x3E7E 0x98FE # <CJK>
+0x9040 0x3F21 0x62ED # <CJK>
+0x9041 0x3F22 0x690D # <CJK>
+0x9042 0x3F23 0x6B96 # <CJK>
+0x9043 0x3F24 0x71ED # <CJK>
+0x9044 0x3F25 0x7E54 # <CJK>
+0x9045 0x3F26 0x8077 # <CJK>
+0x9046 0x3F27 0x8272 # <CJK>
+0x9047 0x3F28 0x89E6 # <CJK>
+0x9048 0x3F29 0x98DF # <CJK>
+0x9049 0x3F2A 0x8755 # <CJK>
+0x904A 0x3F2B 0x8FB1 # <CJK>
+0x904B 0x3F2C 0x5C3B # <CJK>
+0x904C 0x3F2D 0x4F38 # <CJK>
+0x904D 0x3F2E 0x4FE1 # <CJK>
+0x904E 0x3F2F 0x4FB5 # <CJK>
+0x904F 0x3F30 0x5507 # <CJK>
+0x9050 0x3F31 0x5A20 # <CJK>
+0x9051 0x3F32 0x5BDD # <CJK>
+0x9052 0x3F33 0x5BE9 # <CJK>
+0x9053 0x3F34 0x5FC3 # <CJK>
+0x9054 0x3F35 0x614E # <CJK>
+0x9055 0x3F36 0x632F # <CJK>
+0x9056 0x3F37 0x65B0 # <CJK>
+0x9057 0x3F38 0x664B # <CJK>
+0x9058 0x3F39 0x68EE # <CJK>
+0x9059 0x3F3A 0x699B # <CJK>
+0x905A 0x3F3B 0x6D78 # <CJK>
+0x905B 0x3F3C 0x6DF1 # <CJK>
+0x905C 0x3F3D 0x7533 # <CJK>
+0x905D 0x3F3E 0x75B9 # <CJK>
+0x905E 0x3F3F 0x771F # <CJK>
+0x905F 0x3F40 0x795E # <CJK>
+0x9060 0x3F41 0x79E6 # <CJK>
+0x9061 0x3F42 0x7D33 # <CJK>
+0x9062 0x3F43 0x81E3 # <CJK>
+0x9063 0x3F44 0x82AF # <CJK>
+0x9064 0x3F45 0x85AA # <CJK>
+0x9065 0x3F46 0x89AA # <CJK>
+0x9066 0x3F47 0x8A3A # <CJK>
+0x9067 0x3F48 0x8EAB # <CJK>
+0x9068 0x3F49 0x8F9B # <CJK>
+0x9069 0x3F4A 0x9032 # <CJK>
+0x906A 0x3F4B 0x91DD # <CJK>
+0x906B 0x3F4C 0x9707 # <CJK>
+0x906C 0x3F4D 0x4EBA # <CJK>
+0x906D 0x3F4E 0x4EC1 # <CJK>
+0x906E 0x3F4F 0x5203 # <CJK>
+0x906F 0x3F50 0x5875 # <CJK>
+0x9070 0x3F51 0x58EC # <CJK>
+0x9071 0x3F52 0x5C0B # <CJK>
+0x9072 0x3F53 0x751A # <CJK>
+0x9073 0x3F54 0x5C3D # <CJK>
+0x9074 0x3F55 0x814E # <CJK>
+0x9075 0x3F56 0x8A0A # <CJK>
+0x9076 0x3F57 0x8FC5 # <CJK>
+0x9077 0x3F58 0x9663 # <CJK>
+0x9078 0x3F59 0x976D # <CJK>
+0x9079 0x3F5A 0x7B25 # <CJK>
+0x907A 0x3F5B 0x8ACF # <CJK>
+0x907B 0x3F5C 0x9808 # <CJK>
+0x907C 0x3F5D 0x9162 # <CJK>
+0x907D 0x3F5E 0x56F3 # <CJK>
+0x907E 0x3F5F 0x53A8 # <CJK>
+0x9080 0x3F60 0x9017 # <CJK>
+0x9081 0x3F61 0x5439 # <CJK>
+0x9082 0x3F62 0x5782 # <CJK>
+0x9083 0x3F63 0x5E25 # <CJK>
+0x9084 0x3F64 0x63A8 # <CJK>
+0x9085 0x3F65 0x6C34 # <CJK>
+0x9086 0x3F66 0x708A # <CJK>
+0x9087 0x3F67 0x7761 # <CJK>
+0x9088 0x3F68 0x7C8B # <CJK>
+0x9089 0x3F69 0x7FE0 # <CJK>
+0x908A 0x3F6A 0x8870 # <CJK>
+0x908B 0x3F6B 0x9042 # <CJK>
+0x908C 0x3F6C 0x9154 # <CJK>
+0x908D 0x3F6D 0x9310 # <CJK>
+0x908E 0x3F6E 0x9318 # <CJK>
+0x908F 0x3F6F 0x968F # <CJK>
+0x9090 0x3F70 0x745E # <CJK>
+0x9091 0x3F71 0x9AC4 # <CJK>
+0x9092 0x3F72 0x5D07 # <CJK>
+0x9093 0x3F73 0x5D69 # <CJK>
+0x9094 0x3F74 0x6570 # <CJK>
+0x9095 0x3F75 0x67A2 # <CJK>
+0x9096 0x3F76 0x8DA8 # <CJK>
+0x9097 0x3F77 0x96DB # <CJK>
+0x9098 0x3F78 0x636E # <CJK>
+0x9099 0x3F79 0x6749 # <CJK>
+0x909A 0x3F7A 0x6919 # <CJK>
+0x909B 0x3F7B 0x83C5 # <CJK>
+0x909C 0x3F7C 0x9817 # <CJK>
+0x909D 0x3F7D 0x96C0 # <CJK>
+0x909E 0x3F7E 0x88FE # <CJK>
+0x909F 0x4021 0x6F84 # <CJK>
+0x90A0 0x4022 0x647A # <CJK>
+0x90A1 0x4023 0x5BF8 # <CJK>
+0x90A2 0x4024 0x4E16 # <CJK>
+0x90A3 0x4025 0x702C # <CJK>
+0x90A4 0x4026 0x755D # <CJK>
+0x90A5 0x4027 0x662F # <CJK>
+0x90A6 0x4028 0x51C4 # <CJK>
+0x90A7 0x4029 0x5236 # <CJK>
+0x90A8 0x402A 0x52E2 # <CJK>
+0x90A9 0x402B 0x59D3 # <CJK>
+0x90AA 0x402C 0x5F81 # <CJK>
+0x90AB 0x402D 0x6027 # <CJK>
+0x90AC 0x402E 0x6210 # <CJK>
+0x90AD 0x402F 0x653F # <CJK>
+0x90AE 0x4030 0x6574 # <CJK>
+0x90AF 0x4031 0x661F # <CJK>
+0x90B0 0x4032 0x6674 # <CJK>
+0x90B1 0x4033 0x68F2 # <CJK>
+0x90B2 0x4034 0x6816 # <CJK>
+0x90B3 0x4035 0x6B63 # <CJK>
+0x90B4 0x4036 0x6E05 # <CJK>
+0x90B5 0x4037 0x7272 # <CJK>
+0x90B6 0x4038 0x751F # <CJK>
+0x90B7 0x4039 0x76DB # <CJK>
+0x90B8 0x403A 0x7CBE # <CJK>
+0x90B9 0x403B 0x8056 # <CJK>
+0x90BA 0x403C 0x58F0 # <CJK>
+0x90BB 0x403D 0x88FD # <CJK>
+0x90BC 0x403E 0x897F # <CJK>
+0x90BD 0x403F 0x8AA0 # <CJK>
+0x90BE 0x4040 0x8A93 # <CJK>
+0x90BF 0x4041 0x8ACB # <CJK>
+0x90C0 0x4042 0x901D # <CJK>
+0x90C1 0x4043 0x9192 # <CJK>
+0x90C2 0x4044 0x9752 # <CJK>
+0x90C3 0x4045 0x9759 # <CJK>
+0x90C4 0x4046 0x6589 # <CJK>
+0x90C5 0x4047 0x7A0E # <CJK>
+0x90C6 0x4048 0x8106 # <CJK>
+0x90C7 0x4049 0x96BB # <CJK>
+0x90C8 0x404A 0x5E2D # <CJK>
+0x90C9 0x404B 0x60DC # <CJK>
+0x90CA 0x404C 0x621A # <CJK>
+0x90CB 0x404D 0x65A5 # <CJK>
+0x90CC 0x404E 0x6614 # <CJK>
+0x90CD 0x404F 0x6790 # <CJK>
+0x90CE 0x4050 0x77F3 # <CJK>
+0x90CF 0x4051 0x7A4D # <CJK>
+0x90D0 0x4052 0x7C4D # <CJK>
+0x90D1 0x4053 0x7E3E # <CJK>
+0x90D2 0x4054 0x810A # <CJK>
+0x90D3 0x4055 0x8CAC # <CJK>
+0x90D4 0x4056 0x8D64 # <CJK>
+0x90D5 0x4057 0x8DE1 # <CJK>
+0x90D6 0x4058 0x8E5F # <CJK>
+0x90D7 0x4059 0x78A9 # <CJK>
+0x90D8 0x405A 0x5207 # <CJK>
+0x90D9 0x405B 0x62D9 # <CJK>
+0x90DA 0x405C 0x63A5 # <CJK>
+0x90DB 0x405D 0x6442 # <CJK>
+0x90DC 0x405E 0x6298 # <CJK>
+0x90DD 0x405F 0x8A2D # <CJK>
+0x90DE 0x4060 0x7A83 # <CJK>
+0x90DF 0x4061 0x7BC0 # <CJK>
+0x90E0 0x4062 0x8AAC # <CJK>
+0x90E1 0x4063 0x96EA # <CJK>
+0x90E2 0x4064 0x7D76 # <CJK>
+0x90E3 0x4065 0x820C # <CJK>
+0x90E4 0x4066 0x8749 # <CJK>
+0x90E5 0x4067 0x4ED9 # <CJK>
+0x90E6 0x4068 0x5148 # <CJK>
+0x90E7 0x4069 0x5343 # <CJK>
+0x90E8 0x406A 0x5360 # <CJK>
+0x90E9 0x406B 0x5BA3 # <CJK>
+0x90EA 0x406C 0x5C02 # <CJK>
+0x90EB 0x406D 0x5C16 # <CJK>
+0x90EC 0x406E 0x5DDD # <CJK>
+0x90ED 0x406F 0x6226 # <CJK>
+0x90EE 0x4070 0x6247 # <CJK>
+0x90EF 0x4071 0x64B0 # <CJK>
+0x90F0 0x4072 0x6813 # <CJK>
+0x90F1 0x4073 0x6834 # <CJK>
+0x90F2 0x4074 0x6CC9 # <CJK>
+0x90F3 0x4075 0x6D45 # <CJK>
+0x90F4 0x4076 0x6D17 # <CJK>
+0x90F5 0x4077 0x67D3 # <CJK>
+0x90F6 0x4078 0x6F5C # <CJK>
+0x90F7 0x4079 0x714E # <CJK>
+0x90F8 0x407A 0x717D # <CJK>
+0x90F9 0x407B 0x65CB # <CJK>
+0x90FA 0x407C 0x7A7F # <CJK>
+0x90FB 0x407D 0x7BAD # <CJK>
+0x90FC 0x407E 0x7DDA # <CJK>
+0x9140 0x4121 0x7E4A # <CJK>
+0x9141 0x4122 0x7FA8 # <CJK>
+0x9142 0x4123 0x817A # <CJK>
+0x9143 0x4124 0x821B # <CJK>
+0x9144 0x4125 0x8239 # <CJK>
+0x9145 0x4126 0x85A6 # <CJK>
+0x9146 0x4127 0x8A6E # <CJK>
+0x9147 0x4128 0x8CCE # <CJK>
+0x9148 0x4129 0x8DF5 # <CJK>
+0x9149 0x412A 0x9078 # <CJK>
+0x914A 0x412B 0x9077 # <CJK>
+0x914B 0x412C 0x92AD # <CJK>
+0x914C 0x412D 0x9291 # <CJK>
+0x914D 0x412E 0x9583 # <CJK>
+0x914E 0x412F 0x9BAE # <CJK>
+0x914F 0x4130 0x524D # <CJK>
+0x9150 0x4131 0x5584 # <CJK>
+0x9151 0x4132 0x6F38 # <CJK>
+0x9152 0x4133 0x7136 # <CJK>
+0x9153 0x4134 0x5168 # <CJK>
+0x9154 0x4135 0x7985 # <CJK>
+0x9155 0x4136 0x7E55 # <CJK>
+0x9156 0x4137 0x81B3 # <CJK>
+0x9157 0x4138 0x7CCE # <CJK>
+0x9158 0x4139 0x564C # <CJK>
+0x9159 0x413A 0x5851 # <CJK>
+0x915A 0x413B 0x5CA8 # <CJK>
+0x915B 0x413C 0x63AA # <CJK>
+0x915C 0x413D 0x66FE # <CJK>
+0x915D 0x413E 0x66FD # <CJK>
+0x915E 0x413F 0x695A # <CJK>
+0x915F 0x4140 0x72D9 # <CJK>
+0x9160 0x4141 0x758F # <CJK>
+0x9161 0x4142 0x758E # <CJK>
+0x9162 0x4143 0x790E # <CJK>
+0x9163 0x4144 0x7956 # <CJK>
+0x9164 0x4145 0x79DF # <CJK>
+0x9165 0x4146 0x7C97 # <CJK>
+0x9166 0x4147 0x7D20 # <CJK>
+0x9167 0x4148 0x7D44 # <CJK>
+0x9168 0x4149 0x8607 # <CJK>
+0x9169 0x414A 0x8A34 # <CJK>
+0x916A 0x414B 0x963B # <CJK>
+0x916B 0x414C 0x9061 # <CJK>
+0x916C 0x414D 0x9F20 # <CJK>
+0x916D 0x414E 0x50E7 # <CJK>
+0x916E 0x414F 0x5275 # <CJK>
+0x916F 0x4150 0x53CC # <CJK>
+0x9170 0x4151 0x53E2 # <CJK>
+0x9171 0x4152 0x5009 # <CJK>
+0x9172 0x4153 0x55AA # <CJK>
+0x9173 0x4154 0x58EE # <CJK>
+0x9174 0x4155 0x594F # <CJK>
+0x9175 0x4156 0x723D # <CJK>
+0x9176 0x4157 0x5B8B # <CJK>
+0x9177 0x4158 0x5C64 # <CJK>
+0x9178 0x4159 0x531D # <CJK>
+0x9179 0x415A 0x60E3 # <CJK>
+0x917A 0x415B 0x60F3 # <CJK>
+0x917B 0x415C 0x635C # <CJK>
+0x917C 0x415D 0x6383 # <CJK>
+0x917D 0x415E 0x633F # <CJK>
+0x917E 0x415F 0x63BB # <CJK>
+0x9180 0x4160 0x64CD # <CJK>
+0x9181 0x4161 0x65E9 # <CJK>
+0x9182 0x4162 0x66F9 # <CJK>
+0x9183 0x4163 0x5DE3 # <CJK>
+0x9184 0x4164 0x69CD # <CJK>
+0x9185 0x4165 0x69FD # <CJK>
+0x9186 0x4166 0x6F15 # <CJK>
+0x9187 0x4167 0x71E5 # <CJK>
+0x9188 0x4168 0x4E89 # <CJK>
+0x9189 0x4169 0x75E9 # <CJK>
+0x918A 0x416A 0x76F8 # <CJK>
+0x918B 0x416B 0x7A93 # <CJK>
+0x918C 0x416C 0x7CDF # <CJK>
+0x918D 0x416D 0x7DCF # <CJK>
+0x918E 0x416E 0x7D9C # <CJK>
+0x918F 0x416F 0x8061 # <CJK>
+0x9190 0x4170 0x8349 # <CJK>
+0x9191 0x4171 0x8358 # <CJK>
+0x9192 0x4172 0x846C # <CJK>
+0x9193 0x4173 0x84BC # <CJK>
+0x9194 0x4174 0x85FB # <CJK>
+0x9195 0x4175 0x88C5 # <CJK>
+0x9196 0x4176 0x8D70 # <CJK>
+0x9197 0x4177 0x9001 # <CJK>
+0x9198 0x4178 0x906D # <CJK>
+0x9199 0x4179 0x9397 # <CJK>
+0x919A 0x417A 0x971C # <CJK>
+0x919B 0x417B 0x9A12 # <CJK>
+0x919C 0x417C 0x50CF # <CJK>
+0x919D 0x417D 0x5897 # <CJK>
+0x919E 0x417E 0x618E # <CJK>
+0x919F 0x4221 0x81D3 # <CJK>
+0x91A0 0x4222 0x8535 # <CJK>
+0x91A1 0x4223 0x8D08 # <CJK>
+0x91A2 0x4224 0x9020 # <CJK>
+0x91A3 0x4225 0x4FC3 # <CJK>
+0x91A4 0x4226 0x5074 # <CJK>
+0x91A5 0x4227 0x5247 # <CJK>
+0x91A6 0x4228 0x5373 # <CJK>
+0x91A7 0x4229 0x606F # <CJK>
+0x91A8 0x422A 0x6349 # <CJK>
+0x91A9 0x422B 0x675F # <CJK>
+0x91AA 0x422C 0x6E2C # <CJK>
+0x91AB 0x422D 0x8DB3 # <CJK>
+0x91AC 0x422E 0x901F # <CJK>
+0x91AD 0x422F 0x4FD7 # <CJK>
+0x91AE 0x4230 0x5C5E # <CJK>
+0x91AF 0x4231 0x8CCA # <CJK>
+0x91B0 0x4232 0x65CF # <CJK>
+0x91B1 0x4233 0x7D9A # <CJK>
+0x91B2 0x4234 0x5352 # <CJK>
+0x91B3 0x4235 0x8896 # <CJK>
+0x91B4 0x4236 0x5176 # <CJK>
+0x91B5 0x4237 0x63C3 # <CJK>
+0x91B6 0x4238 0x5B58 # <CJK>
+0x91B7 0x4239 0x5B6B # <CJK>
+0x91B8 0x423A 0x5C0A # <CJK>
+0x91B9 0x423B 0x640D # <CJK>
+0x91BA 0x423C 0x6751 # <CJK>
+0x91BB 0x423D 0x905C # <CJK>
+0x91BC 0x423E 0x4ED6 # <CJK>
+0x91BD 0x423F 0x591A # <CJK>
+0x91BE 0x4240 0x592A # <CJK>
+0x91BF 0x4241 0x6C70 # <CJK>
+0x91C0 0x4242 0x8A51 # <CJK>
+0x91C1 0x4243 0x553E # <CJK>
+0x91C2 0x4244 0x5815 # <CJK>
+0x91C3 0x4245 0x59A5 # <CJK>
+0x91C4 0x4246 0x60F0 # <CJK>
+0x91C5 0x4247 0x6253 # <CJK>
+0x91C6 0x4248 0x67C1 # <CJK>
+0x91C7 0x4249 0x8235 # <CJK>
+0x91C8 0x424A 0x6955 # <CJK>
+0x91C9 0x424B 0x9640 # <CJK>
+0x91CA 0x424C 0x99C4 # <CJK>
+0x91CB 0x424D 0x9A28 # <CJK>
+0x91CC 0x424E 0x4F53 # <CJK>
+0x91CD 0x424F 0x5806 # <CJK>
+0x91CE 0x4250 0x5BFE # <CJK>
+0x91CF 0x4251 0x8010 # <CJK>
+0x91D0 0x4252 0x5CB1 # <CJK>
+0x91D1 0x4253 0x5E2F # <CJK>
+0x91D2 0x4254 0x5F85 # <CJK>
+0x91D3 0x4255 0x6020 # <CJK>
+0x91D4 0x4256 0x614B # <CJK>
+0x91D5 0x4257 0x6234 # <CJK>
+0x91D6 0x4258 0x66FF # <CJK>
+0x91D7 0x4259 0x6CF0 # <CJK>
+0x91D8 0x425A 0x6EDE # <CJK>
+0x91D9 0x425B 0x80CE # <CJK>
+0x91DA 0x425C 0x817F # <CJK>
+0x91DB 0x425D 0x82D4 # <CJK>
+0x91DC 0x425E 0x888B # <CJK>
+0x91DD 0x425F 0x8CB8 # <CJK>
+0x91DE 0x4260 0x9000 # <CJK>
+0x91DF 0x4261 0x902E # <CJK>
+0x91E0 0x4262 0x968A # <CJK>
+0x91E1 0x4263 0x9EDB # <CJK>
+0x91E2 0x4264 0x9BDB # <CJK>
+0x91E3 0x4265 0x4EE3 # <CJK>
+0x91E4 0x4266 0x53F0 # <CJK>
+0x91E5 0x4267 0x5927 # <CJK>
+0x91E6 0x4268 0x7B2C # <CJK>
+0x91E7 0x4269 0x918D # <CJK>
+0x91E8 0x426A 0x984C # <CJK>
+0x91E9 0x426B 0x9DF9 # <CJK>
+0x91EA 0x426C 0x6EDD # <CJK>
+0x91EB 0x426D 0x7027 # <CJK>
+0x91EC 0x426E 0x5353 # <CJK>
+0x91ED 0x426F 0x5544 # <CJK>
+0x91EE 0x4270 0x5B85 # <CJK>
+0x91EF 0x4271 0x6258 # <CJK>
+0x91F0 0x4272 0x629E # <CJK>
+0x91F1 0x4273 0x62D3 # <CJK>
+0x91F2 0x4274 0x6CA2 # <CJK>
+0x91F3 0x4275 0x6FEF # <CJK>
+0x91F4 0x4276 0x7422 # <CJK>
+0x91F5 0x4277 0x8A17 # <CJK>
+0x91F6 0x4278 0x9438 # <CJK>
+0x91F7 0x4279 0x6FC1 # <CJK>
+0x91F8 0x427A 0x8AFE # <CJK>
+0x91F9 0x427B 0x8338 # <CJK>
+0x91FA 0x427C 0x51E7 # <CJK>
+0x91FB 0x427D 0x86F8 # <CJK>
+0x91FC 0x427E 0x53EA # <CJK>
+0x9240 0x4321 0x53E9 # <CJK>
+0x9241 0x4322 0x4F46 # <CJK>
+0x9242 0x4323 0x9054 # <CJK>
+0x9243 0x4324 0x8FB0 # <CJK>
+0x9244 0x4325 0x596A # <CJK>
+0x9245 0x4326 0x8131 # <CJK>
+0x9246 0x4327 0x5DFD # <CJK>
+0x9247 0x4328 0x7AEA # <CJK>
+0x9248 0x4329 0x8FBF # <CJK>
+0x9249 0x432A 0x68DA # <CJK>
+0x924A 0x432B 0x8C37 # <CJK>
+0x924B 0x432C 0x72F8 # <CJK>
+0x924C 0x432D 0x9C48 # <CJK>
+0x924D 0x432E 0x6A3D # <CJK>
+0x924E 0x432F 0x8AB0 # <CJK>
+0x924F 0x4330 0x4E39 # <CJK>
+0x9250 0x4331 0x5358 # <CJK>
+0x9251 0x4332 0x5606 # <CJK>
+0x9252 0x4333 0x5766 # <CJK>
+0x9253 0x4334 0x62C5 # <CJK>
+0x9254 0x4335 0x63A2 # <CJK>
+0x9255 0x4336 0x65E6 # <CJK>
+0x9256 0x4337 0x6B4E # <CJK>
+0x9257 0x4338 0x6DE1 # <CJK>
+0x9258 0x4339 0x6E5B # <CJK>
+0x9259 0x433A 0x70AD # <CJK>
+0x925A 0x433B 0x77ED # <CJK>
+0x925B 0x433C 0x7AEF # <CJK>
+0x925C 0x433D 0x7BAA # <CJK>
+0x925D 0x433E 0x7DBB # <CJK>
+0x925E 0x433F 0x803D # <CJK>
+0x925F 0x4340 0x80C6 # <CJK>
+0x9260 0x4341 0x86CB # <CJK>
+0x9261 0x4342 0x8A95 # <CJK>
+0x9262 0x4343 0x935B # <CJK>
+0x9263 0x4344 0x56E3 # <CJK>
+0x9264 0x4345 0x58C7 # <CJK>
+0x9265 0x4346 0x5F3E # <CJK>
+0x9266 0x4347 0x65AD # <CJK>
+0x9267 0x4348 0x6696 # <CJK>
+0x9268 0x4349 0x6A80 # <CJK>
+0x9269 0x434A 0x6BB5 # <CJK>
+0x926A 0x434B 0x7537 # <CJK>
+0x926B 0x434C 0x8AC7 # <CJK>
+0x926C 0x434D 0x5024 # <CJK>
+0x926D 0x434E 0x77E5 # <CJK>
+0x926E 0x434F 0x5730 # <CJK>
+0x926F 0x4350 0x5F1B # <CJK>
+0x9270 0x4351 0x6065 # <CJK>
+0x9271 0x4352 0x667A # <CJK>
+0x9272 0x4353 0x6C60 # <CJK>
+0x9273 0x4354 0x75F4 # <CJK>
+0x9274 0x4355 0x7A1A # <CJK>
+0x9275 0x4356 0x7F6E # <CJK>
+0x9276 0x4357 0x81F4 # <CJK>
+0x9277 0x4358 0x8718 # <CJK>
+0x9278 0x4359 0x9045 # <CJK>
+0x9279 0x435A 0x99B3 # <CJK>
+0x927A 0x435B 0x7BC9 # <CJK>
+0x927B 0x435C 0x755C # <CJK>
+0x927C 0x435D 0x7AF9 # <CJK>
+0x927D 0x435E 0x7B51 # <CJK>
+0x927E 0x435F 0x84C4 # <CJK>
+0x9280 0x4360 0x9010 # <CJK>
+0x9281 0x4361 0x79E9 # <CJK>
+0x9282 0x4362 0x7A92 # <CJK>
+0x9283 0x4363 0x8336 # <CJK>
+0x9284 0x4364 0x5AE1 # <CJK>
+0x9285 0x4365 0x7740 # <CJK>
+0x9286 0x4366 0x4E2D # <CJK>
+0x9287 0x4367 0x4EF2 # <CJK>
+0x9288 0x4368 0x5B99 # <CJK>
+0x9289 0x4369 0x5FE0 # <CJK>
+0x928A 0x436A 0x62BD # <CJK>
+0x928B 0x436B 0x663C # <CJK>
+0x928C 0x436C 0x67F1 # <CJK>
+0x928D 0x436D 0x6CE8 # <CJK>
+0x928E 0x436E 0x866B # <CJK>
+0x928F 0x436F 0x8877 # <CJK>
+0x9290 0x4370 0x8A3B # <CJK>
+0x9291 0x4371 0x914E # <CJK>
+0x9292 0x4372 0x92F3 # <CJK>
+0x9293 0x4373 0x99D0 # <CJK>
+0x9294 0x4374 0x6A17 # <CJK>
+0x9295 0x4375 0x7026 # <CJK>
+0x9296 0x4376 0x732A # <CJK>
+0x9297 0x4377 0x82E7 # <CJK>
+0x9298 0x4378 0x8457 # <CJK>
+0x9299 0x4379 0x8CAF # <CJK>
+0x929A 0x437A 0x4E01 # <CJK>
+0x929B 0x437B 0x5146 # <CJK>
+0x929C 0x437C 0x51CB # <CJK>
+0x929D 0x437D 0x558B # <CJK>
+0x929E 0x437E 0x5BF5 # <CJK>
+0x929F 0x4421 0x5E16 # <CJK>
+0x92A0 0x4422 0x5E33 # <CJK>
+0x92A1 0x4423 0x5E81 # <CJK>
+0x92A2 0x4424 0x5F14 # <CJK>
+0x92A3 0x4425 0x5F35 # <CJK>
+0x92A4 0x4426 0x5F6B # <CJK>
+0x92A5 0x4427 0x5FB4 # <CJK>
+0x92A6 0x4428 0x61F2 # <CJK>
+0x92A7 0x4429 0x6311 # <CJK>
+0x92A8 0x442A 0x66A2 # <CJK>
+0x92A9 0x442B 0x671D # <CJK>
+0x92AA 0x442C 0x6F6E # <CJK>
+0x92AB 0x442D 0x7252 # <CJK>
+0x92AC 0x442E 0x753A # <CJK>
+0x92AD 0x442F 0x773A # <CJK>
+0x92AE 0x4430 0x8074 # <CJK>
+0x92AF 0x4431 0x8139 # <CJK>
+0x92B0 0x4432 0x8178 # <CJK>
+0x92B1 0x4433 0x8776 # <CJK>
+0x92B2 0x4434 0x8ABF # <CJK>
+0x92B3 0x4435 0x8ADC # <CJK>
+0x92B4 0x4436 0x8D85 # <CJK>
+0x92B5 0x4437 0x8DF3 # <CJK>
+0x92B6 0x4438 0x929A # <CJK>
+0x92B7 0x4439 0x9577 # <CJK>
+0x92B8 0x443A 0x9802 # <CJK>
+0x92B9 0x443B 0x9CE5 # <CJK>
+0x92BA 0x443C 0x52C5 # <CJK>
+0x92BB 0x443D 0x6357 # <CJK>
+0x92BC 0x443E 0x76F4 # <CJK>
+0x92BD 0x443F 0x6715 # <CJK>
+0x92BE 0x4440 0x6C88 # <CJK>
+0x92BF 0x4441 0x73CD # <CJK>
+0x92C0 0x4442 0x8CC3 # <CJK>
+0x92C1 0x4443 0x93AE # <CJK>
+0x92C2 0x4444 0x9673 # <CJK>
+0x92C3 0x4445 0x6D25 # <CJK>
+0x92C4 0x4446 0x589C # <CJK>
+0x92C5 0x4447 0x690E # <CJK>
+0x92C6 0x4448 0x69CC # <CJK>
+0x92C7 0x4449 0x8FFD # <CJK>
+0x92C8 0x444A 0x939A # <CJK>
+0x92C9 0x444B 0x75DB # <CJK>
+0x92CA 0x444C 0x901A # <CJK>
+0x92CB 0x444D 0x585A # <CJK>
+0x92CC 0x444E 0x6802 # <CJK>
+0x92CD 0x444F 0x63B4 # <CJK>
+0x92CE 0x4450 0x69FB # <CJK>
+0x92CF 0x4451 0x4F43 # <CJK>
+0x92D0 0x4452 0x6F2C # <CJK>
+0x92D1 0x4453 0x67D8 # <CJK>
+0x92D2 0x4454 0x8FBB # <CJK>
+0x92D3 0x4455 0x8526 # <CJK>
+0x92D4 0x4456 0x7DB4 # <CJK>
+0x92D5 0x4457 0x9354 # <CJK>
+0x92D6 0x4458 0x693F # <CJK>
+0x92D7 0x4459 0x6F70 # <CJK>
+0x92D8 0x445A 0x576A # <CJK>
+0x92D9 0x445B 0x58F7 # <CJK>
+0x92DA 0x445C 0x5B2C # <CJK>
+0x92DB 0x445D 0x7D2C # <CJK>
+0x92DC 0x445E 0x722A # <CJK>
+0x92DD 0x445F 0x540A # <CJK>
+0x92DE 0x4460 0x91E3 # <CJK>
+0x92DF 0x4461 0x9DB4 # <CJK>
+0x92E0 0x4462 0x4EAD # <CJK>
+0x92E1 0x4463 0x4F4E # <CJK>
+0x92E2 0x4464 0x505C # <CJK>
+0x92E3 0x4465 0x5075 # <CJK>
+0x92E4 0x4466 0x5243 # <CJK>
+0x92E5 0x4467 0x8C9E # <CJK>
+0x92E6 0x4468 0x5448 # <CJK>
+0x92E7 0x4469 0x5824 # <CJK>
+0x92E8 0x446A 0x5B9A # <CJK>
+0x92E9 0x446B 0x5E1D # <CJK>
+0x92EA 0x446C 0x5E95 # <CJK>
+0x92EB 0x446D 0x5EAD # <CJK>
+0x92EC 0x446E 0x5EF7 # <CJK>
+0x92ED 0x446F 0x5F1F # <CJK>
+0x92EE 0x4470 0x608C # <CJK>
+0x92EF 0x4471 0x62B5 # <CJK>
+0x92F0 0x4472 0x633A # <CJK>
+0x92F1 0x4473 0x63D0 # <CJK>
+0x92F2 0x4474 0x68AF # <CJK>
+0x92F3 0x4475 0x6C40 # <CJK>
+0x92F4 0x4476 0x7887 # <CJK>
+0x92F5 0x4477 0x798E # <CJK>
+0x92F6 0x4478 0x7A0B # <CJK>
+0x92F7 0x4479 0x7DE0 # <CJK>
+0x92F8 0x447A 0x8247 # <CJK>
+0x92F9 0x447B 0x8A02 # <CJK>
+0x92FA 0x447C 0x8AE6 # <CJK>
+0x92FB 0x447D 0x8E44 # <CJK>
+0x92FC 0x447E 0x9013 # <CJK>
+0x9340 0x4521 0x90B8 # <CJK>
+0x9341 0x4522 0x912D # <CJK>
+0x9342 0x4523 0x91D8 # <CJK>
+0x9343 0x4524 0x9F0E # <CJK>
+0x9344 0x4525 0x6CE5 # <CJK>
+0x9345 0x4526 0x6458 # <CJK>
+0x9346 0x4527 0x64E2 # <CJK>
+0x9347 0x4528 0x6575 # <CJK>
+0x9348 0x4529 0x6EF4 # <CJK>
+0x9349 0x452A 0x7684 # <CJK>
+0x934A 0x452B 0x7B1B # <CJK>
+0x934B 0x452C 0x9069 # <CJK>
+0x934C 0x452D 0x93D1 # <CJK>
+0x934D 0x452E 0x6EBA # <CJK>
+0x934E 0x452F 0x54F2 # <CJK>
+0x934F 0x4530 0x5FB9 # <CJK>
+0x9350 0x4531 0x64A4 # <CJK>
+0x9351 0x4532 0x8F4D # <CJK>
+0x9352 0x4533 0x8FED # <CJK>
+0x9353 0x4534 0x9244 # <CJK>
+0x9354 0x4535 0x5178 # <CJK>
+0x9355 0x4536 0x586B # <CJK>
+0x9356 0x4537 0x5929 # <CJK>
+0x9357 0x4538 0x5C55 # <CJK>
+0x9358 0x4539 0x5E97 # <CJK>
+0x9359 0x453A 0x6DFB # <CJK>
+0x935A 0x453B 0x7E8F # <CJK>
+0x935B 0x453C 0x751C # <CJK>
+0x935C 0x453D 0x8CBC # <CJK>
+0x935D 0x453E 0x8EE2 # <CJK>
+0x935E 0x453F 0x985B # <CJK>
+0x935F 0x4540 0x70B9 # <CJK>
+0x9360 0x4541 0x4F1D # <CJK>
+0x9361 0x4542 0x6BBF # <CJK>
+0x9362 0x4543 0x6FB1 # <CJK>
+0x9363 0x4544 0x7530 # <CJK>
+0x9364 0x4545 0x96FB # <CJK>
+0x9365 0x4546 0x514E # <CJK>
+0x9366 0x4547 0x5410 # <CJK>
+0x9367 0x4548 0x5835 # <CJK>
+0x9368 0x4549 0x5857 # <CJK>
+0x9369 0x454A 0x59AC # <CJK>
+0x936A 0x454B 0x5C60 # <CJK>
+0x936B 0x454C 0x5F92 # <CJK>
+0x936C 0x454D 0x6597 # <CJK>
+0x936D 0x454E 0x675C # <CJK>
+0x936E 0x454F 0x6E21 # <CJK>
+0x936F 0x4550 0x767B # <CJK>
+0x9370 0x4551 0x83DF # <CJK>
+0x9371 0x4552 0x8CED # <CJK>
+0x9372 0x4553 0x9014 # <CJK>
+0x9373 0x4554 0x90FD # <CJK>
+0x9374 0x4555 0x934D # <CJK>
+0x9375 0x4556 0x7825 # <CJK>
+0x9376 0x4557 0x783A # <CJK>
+0x9377 0x4558 0x52AA # <CJK>
+0x9378 0x4559 0x5EA6 # <CJK>
+0x9379 0x455A 0x571F # <CJK>
+0x937A 0x455B 0x5974 # <CJK>
+0x937B 0x455C 0x6012 # <CJK>
+0x937C 0x455D 0x5012 # <CJK>
+0x937D 0x455E 0x515A # <CJK>
+0x937E 0x455F 0x51AC # <CJK>
+0x9380 0x4560 0x51CD # <CJK>
+0x9381 0x4561 0x5200 # <CJK>
+0x9382 0x4562 0x5510 # <CJK>
+0x9383 0x4563 0x5854 # <CJK>
+0x9384 0x4564 0x5858 # <CJK>
+0x9385 0x4565 0x5957 # <CJK>
+0x9386 0x4566 0x5B95 # <CJK>
+0x9387 0x4567 0x5CF6 # <CJK>
+0x9388 0x4568 0x5D8B # <CJK>
+0x9389 0x4569 0x60BC # <CJK>
+0x938A 0x456A 0x6295 # <CJK>
+0x938B 0x456B 0x642D # <CJK>
+0x938C 0x456C 0x6771 # <CJK>
+0x938D 0x456D 0x6843 # <CJK>
+0x938E 0x456E 0x68BC # <CJK>
+0x938F 0x456F 0x68DF # <CJK>
+0x9390 0x4570 0x76D7 # <CJK>
+0x9391 0x4571 0x6DD8 # <CJK>
+0x9392 0x4572 0x6E6F # <CJK>
+0x9393 0x4573 0x6D9B # <CJK>
+0x9394 0x4574 0x706F # <CJK>
+0x9395 0x4575 0x71C8 # <CJK>
+0x9396 0x4576 0x5F53 # <CJK>
+0x9397 0x4577 0x75D8 # <CJK>
+0x9398 0x4578 0x7977 # <CJK>
+0x9399 0x4579 0x7B49 # <CJK>
+0x939A 0x457A 0x7B54 # <CJK>
+0x939B 0x457B 0x7B52 # <CJK>
+0x939C 0x457C 0x7CD6 # <CJK>
+0x939D 0x457D 0x7D71 # <CJK>
+0x939E 0x457E 0x5230 # <CJK>
+0x939F 0x4621 0x8463 # <CJK>
+0x93A0 0x4622 0x8569 # <CJK>
+0x93A1 0x4623 0x85E4 # <CJK>
+0x93A2 0x4624 0x8A0E # <CJK>
+0x93A3 0x4625 0x8B04 # <CJK>
+0x93A4 0x4626 0x8C46 # <CJK>
+0x93A5 0x4627 0x8E0F # <CJK>
+0x93A6 0x4628 0x9003 # <CJK>
+0x93A7 0x4629 0x900F # <CJK>
+0x93A8 0x462A 0x9419 # <CJK>
+0x93A9 0x462B 0x9676 # <CJK>
+0x93AA 0x462C 0x982D # <CJK>
+0x93AB 0x462D 0x9A30 # <CJK>
+0x93AC 0x462E 0x95D8 # <CJK>
+0x93AD 0x462F 0x50CD # <CJK>
+0x93AE 0x4630 0x52D5 # <CJK>
+0x93AF 0x4631 0x540C # <CJK>
+0x93B0 0x4632 0x5802 # <CJK>
+0x93B1 0x4633 0x5C0E # <CJK>
+0x93B2 0x4634 0x61A7 # <CJK>
+0x93B3 0x4635 0x649E # <CJK>
+0x93B4 0x4636 0x6D1E # <CJK>
+0x93B5 0x4637 0x77B3 # <CJK>
+0x93B6 0x4638 0x7AE5 # <CJK>
+0x93B7 0x4639 0x80F4 # <CJK>
+0x93B8 0x463A 0x8404 # <CJK>
+0x93B9 0x463B 0x9053 # <CJK>
+0x93BA 0x463C 0x9285 # <CJK>
+0x93BB 0x463D 0x5CE0 # <CJK>
+0x93BC 0x463E 0x9D07 # <CJK>
+0x93BD 0x463F 0x533F # <CJK>
+0x93BE 0x4640 0x5F97 # <CJK>
+0x93BF 0x4641 0x5FB3 # <CJK>
+0x93C0 0x4642 0x6D9C # <CJK>
+0x93C1 0x4643 0x7279 # <CJK>
+0x93C2 0x4644 0x7763 # <CJK>
+0x93C3 0x4645 0x79BF # <CJK>
+0x93C4 0x4646 0x7BE4 # <CJK>
+0x93C5 0x4647 0x6BD2 # <CJK>
+0x93C6 0x4648 0x72EC # <CJK>
+0x93C7 0x4649 0x8AAD # <CJK>
+0x93C8 0x464A 0x6803 # <CJK>
+0x93C9 0x464B 0x6A61 # <CJK>
+0x93CA 0x464C 0x51F8 # <CJK>
+0x93CB 0x464D 0x7A81 # <CJK>
+0x93CC 0x464E 0x6934 # <CJK>
+0x93CD 0x464F 0x5C4A # <CJK>
+0x93CE 0x4650 0x9CF6 # <CJK>
+0x93CF 0x4651 0x82EB # <CJK>
+0x93D0 0x4652 0x5BC5 # <CJK>
+0x93D1 0x4653 0x9149 # <CJK>
+0x93D2 0x4654 0x701E # <CJK>
+0x93D3 0x4655 0x5678 # <CJK>
+0x93D4 0x4656 0x5C6F # <CJK>
+0x93D5 0x4657 0x60C7 # <CJK>
+0x93D6 0x4658 0x6566 # <CJK>
+0x93D7 0x4659 0x6C8C # <CJK>
+0x93D8 0x465A 0x8C5A # <CJK>
+0x93D9 0x465B 0x9041 # <CJK>
+0x93DA 0x465C 0x9813 # <CJK>
+0x93DB 0x465D 0x5451 # <CJK>
+0x93DC 0x465E 0x66C7 # <CJK>
+0x93DD 0x465F 0x920D # <CJK>
+0x93DE 0x4660 0x5948 # <CJK>
+0x93DF 0x4661 0x90A3 # <CJK>
+0x93E0 0x4662 0x5185 # <CJK>
+0x93E1 0x4663 0x4E4D # <CJK>
+0x93E2 0x4664 0x51EA # <CJK>
+0x93E3 0x4665 0x8599 # <CJK>
+0x93E4 0x4666 0x8B0E # <CJK>
+0x93E5 0x4667 0x7058 # <CJK>
+0x93E6 0x4668 0x637A # <CJK>
+0x93E7 0x4669 0x934B # <CJK>
+0x93E8 0x466A 0x6962 # <CJK>
+0x93E9 0x466B 0x99B4 # <CJK>
+0x93EA 0x466C 0x7E04 # <CJK>
+0x93EB 0x466D 0x7577 # <CJK>
+0x93EC 0x466E 0x5357 # <CJK>
+0x93ED 0x466F 0x6960 # <CJK>
+0x93EE 0x4670 0x8EDF # <CJK>
+0x93EF 0x4671 0x96E3 # <CJK>
+0x93F0 0x4672 0x6C5D # <CJK>
+0x93F1 0x4673 0x4E8C # <CJK>
+0x93F2 0x4674 0x5C3C # <CJK>
+0x93F3 0x4675 0x5F10 # <CJK>
+0x93F4 0x4676 0x8FE9 # <CJK>
+0x93F5 0x4677 0x5302 # <CJK>
+0x93F6 0x4678 0x8CD1 # <CJK>
+0x93F7 0x4679 0x8089 # <CJK>
+0x93F8 0x467A 0x8679 # <CJK>
+0x93F9 0x467B 0x5EFF # <CJK>
+0x93FA 0x467C 0x65E5 # <CJK>
+0x93FB 0x467D 0x4E73 # <CJK>
+0x93FC 0x467E 0x5165 # <CJK>
+0x9440 0x4721 0x5982 # <CJK>
+0x9441 0x4722 0x5C3F # <CJK>
+0x9442 0x4723 0x97EE # <CJK>
+0x9443 0x4724 0x4EFB # <CJK>
+0x9444 0x4725 0x598A # <CJK>
+0x9445 0x4726 0x5FCD # <CJK>
+0x9446 0x4727 0x8A8D # <CJK>
+0x9447 0x4728 0x6FE1 # <CJK>
+0x9448 0x4729 0x79B0 # <CJK>
+0x9449 0x472A 0x7962 # <CJK>
+0x944A 0x472B 0x5BE7 # <CJK>
+0x944B 0x472C 0x8471 # <CJK>
+0x944C 0x472D 0x732B # <CJK>
+0x944D 0x472E 0x71B1 # <CJK>
+0x944E 0x472F 0x5E74 # <CJK>
+0x944F 0x4730 0x5FF5 # <CJK>
+0x9450 0x4731 0x637B # <CJK>
+0x9451 0x4732 0x649A # <CJK>
+0x9452 0x4733 0x71C3 # <CJK>
+0x9453 0x4734 0x7C98 # <CJK>
+0x9454 0x4735 0x4E43 # <CJK>
+0x9455 0x4736 0x5EFC # <CJK>
+0x9456 0x4737 0x4E4B # <CJK>
+0x9457 0x4738 0x57DC # <CJK>
+0x9458 0x4739 0x56A2 # <CJK>
+0x9459 0x473A 0x60A9 # <CJK>
+0x945A 0x473B 0x6FC3 # <CJK>
+0x945B 0x473C 0x7D0D # <CJK>
+0x945C 0x473D 0x80FD # <CJK>
+0x945D 0x473E 0x8133 # <CJK>
+0x945E 0x473F 0x81BF # <CJK>
+0x945F 0x4740 0x8FB2 # <CJK>
+0x9460 0x4741 0x8997 # <CJK>
+0x9461 0x4742 0x86A4 # <CJK>
+0x9462 0x4743 0x5DF4 # <CJK>
+0x9463 0x4744 0x628A # <CJK>
+0x9464 0x4745 0x64AD # <CJK>
+0x9465 0x4746 0x8987 # <CJK>
+0x9466 0x4747 0x6777 # <CJK>
+0x9467 0x4748 0x6CE2 # <CJK>
+0x9468 0x4749 0x6D3E # <CJK>
+0x9469 0x474A 0x7436 # <CJK>
+0x946A 0x474B 0x7834 # <CJK>
+0x946B 0x474C 0x5A46 # <CJK>
+0x946C 0x474D 0x7F75 # <CJK>
+0x946D 0x474E 0x82AD # <CJK>
+0x946E 0x474F 0x99AC # <CJK>
+0x946F 0x4750 0x4FF3 # <CJK>
+0x9470 0x4751 0x5EC3 # <CJK>
+0x9471 0x4752 0x62DD # <CJK>
+0x9472 0x4753 0x6392 # <CJK>
+0x9473 0x4754 0x6557 # <CJK>
+0x9474 0x4755 0x676F # <CJK>
+0x9475 0x4756 0x76C3 # <CJK>
+0x9476 0x4757 0x724C # <CJK>
+0x9477 0x4758 0x80CC # <CJK>
+0x9478 0x4759 0x80BA # <CJK>
+0x9479 0x475A 0x8F29 # <CJK>
+0x947A 0x475B 0x914D # <CJK>
+0x947B 0x475C 0x500D # <CJK>
+0x947C 0x475D 0x57F9 # <CJK>
+0x947D 0x475E 0x5A92 # <CJK>
+0x947E 0x475F 0x6885 # <CJK>
+0x9480 0x4760 0x6973 # <CJK>
+0x9481 0x4761 0x7164 # <CJK>
+0x9482 0x4762 0x72FD # <CJK>
+0x9483 0x4763 0x8CB7 # <CJK>
+0x9484 0x4764 0x58F2 # <CJK>
+0x9485 0x4765 0x8CE0 # <CJK>
+0x9486 0x4766 0x966A # <CJK>
+0x9487 0x4767 0x9019 # <CJK>
+0x9488 0x4768 0x877F # <CJK>
+0x9489 0x4769 0x79E4 # <CJK>
+0x948A 0x476A 0x77E7 # <CJK>
+0x948B 0x476B 0x8429 # <CJK>
+0x948C 0x476C 0x4F2F # <CJK>
+0x948D 0x476D 0x5265 # <CJK>
+0x948E 0x476E 0x535A # <CJK>
+0x948F 0x476F 0x62CD # <CJK>
+0x9490 0x4770 0x67CF # <CJK>
+0x9491 0x4771 0x6CCA # <CJK>
+0x9492 0x4772 0x767D # <CJK>
+0x9493 0x4773 0x7B94 # <CJK>
+0x9494 0x4774 0x7C95 # <CJK>
+0x9495 0x4775 0x8236 # <CJK>
+0x9496 0x4776 0x8584 # <CJK>
+0x9497 0x4777 0x8FEB # <CJK>
+0x9498 0x4778 0x66DD # <CJK>
+0x9499 0x4779 0x6F20 # <CJK>
+0x949A 0x477A 0x7206 # <CJK>
+0x949B 0x477B 0x7E1B # <CJK>
+0x949C 0x477C 0x83AB # <CJK>
+0x949D 0x477D 0x99C1 # <CJK>
+0x949E 0x477E 0x9EA6 # <CJK>
+0x949F 0x4821 0x51FD # <CJK>
+0x94A0 0x4822 0x7BB1 # <CJK>
+0x94A1 0x4823 0x7872 # <CJK>
+0x94A2 0x4824 0x7BB8 # <CJK>
+0x94A3 0x4825 0x8087 # <CJK>
+0x94A4 0x4826 0x7B48 # <CJK>
+0x94A5 0x4827 0x6AE8 # <CJK>
+0x94A6 0x4828 0x5E61 # <CJK>
+0x94A7 0x4829 0x808C # <CJK>
+0x94A8 0x482A 0x7551 # <CJK>
+0x94A9 0x482B 0x7560 # <CJK>
+0x94AA 0x482C 0x516B # <CJK>
+0x94AB 0x482D 0x9262 # <CJK>
+0x94AC 0x482E 0x6E8C # <CJK>
+0x94AD 0x482F 0x767A # <CJK>
+0x94AE 0x4830 0x9197 # <CJK>
+0x94AF 0x4831 0x9AEA # <CJK>
+0x94B0 0x4832 0x4F10 # <CJK>
+0x94B1 0x4833 0x7F70 # <CJK>
+0x94B2 0x4834 0x629C # <CJK>
+0x94B3 0x4835 0x7B4F # <CJK>
+0x94B4 0x4836 0x95A5 # <CJK>
+0x94B5 0x4837 0x9CE9 # <CJK>
+0x94B6 0x4838 0x567A # <CJK>
+0x94B7 0x4839 0x5859 # <CJK>
+0x94B8 0x483A 0x86E4 # <CJK>
+0x94B9 0x483B 0x96BC # <CJK>
+0x94BA 0x483C 0x4F34 # <CJK>
+0x94BB 0x483D 0x5224 # <CJK>
+0x94BC 0x483E 0x534A # <CJK>
+0x94BD 0x483F 0x53CD # <CJK>
+0x94BE 0x4840 0x53DB # <CJK>
+0x94BF 0x4841 0x5E06 # <CJK>
+0x94C0 0x4842 0x642C # <CJK>
+0x94C1 0x4843 0x6591 # <CJK>
+0x94C2 0x4844 0x677F # <CJK>
+0x94C3 0x4845 0x6C3E # <CJK>
+0x94C4 0x4846 0x6C4E # <CJK>
+0x94C5 0x4847 0x7248 # <CJK>
+0x94C6 0x4848 0x72AF # <CJK>
+0x94C7 0x4849 0x73ED # <CJK>
+0x94C8 0x484A 0x7554 # <CJK>
+0x94C9 0x484B 0x7E41 # <CJK>
+0x94CA 0x484C 0x822C # <CJK>
+0x94CB 0x484D 0x85E9 # <CJK>
+0x94CC 0x484E 0x8CA9 # <CJK>
+0x94CD 0x484F 0x7BC4 # <CJK>
+0x94CE 0x4850 0x91C6 # <CJK>
+0x94CF 0x4851 0x7169 # <CJK>
+0x94D0 0x4852 0x9812 # <CJK>
+0x94D1 0x4853 0x98EF # <CJK>
+0x94D2 0x4854 0x633D # <CJK>
+0x94D3 0x4855 0x6669 # <CJK>
+0x94D4 0x4856 0x756A # <CJK>
+0x94D5 0x4857 0x76E4 # <CJK>
+0x94D6 0x4858 0x78D0 # <CJK>
+0x94D7 0x4859 0x8543 # <CJK>
+0x94D8 0x485A 0x86EE # <CJK>
+0x94D9 0x485B 0x532A # <CJK>
+0x94DA 0x485C 0x5351 # <CJK>
+0x94DB 0x485D 0x5426 # <CJK>
+0x94DC 0x485E 0x5983 # <CJK>
+0x94DD 0x485F 0x5E87 # <CJK>
+0x94DE 0x4860 0x5F7C # <CJK>
+0x94DF 0x4861 0x60B2 # <CJK>
+0x94E0 0x4862 0x6249 # <CJK>
+0x94E1 0x4863 0x6279 # <CJK>
+0x94E2 0x4864 0x62AB # <CJK>
+0x94E3 0x4865 0x6590 # <CJK>
+0x94E4 0x4866 0x6BD4 # <CJK>
+0x94E5 0x4867 0x6CCC # <CJK>
+0x94E6 0x4868 0x75B2 # <CJK>
+0x94E7 0x4869 0x76AE # <CJK>
+0x94E8 0x486A 0x7891 # <CJK>
+0x94E9 0x486B 0x79D8 # <CJK>
+0x94EA 0x486C 0x7DCB # <CJK>
+0x94EB 0x486D 0x7F77 # <CJK>
+0x94EC 0x486E 0x80A5 # <CJK>
+0x94ED 0x486F 0x88AB # <CJK>
+0x94EE 0x4870 0x8AB9 # <CJK>
+0x94EF 0x4871 0x8CBB # <CJK>
+0x94F0 0x4872 0x907F # <CJK>
+0x94F1 0x4873 0x975E # <CJK>
+0x94F2 0x4874 0x98DB # <CJK>
+0x94F3 0x4875 0x6A0B # <CJK>
+0x94F4 0x4876 0x7C38 # <CJK>
+0x94F5 0x4877 0x5099 # <CJK>
+0x94F6 0x4878 0x5C3E # <CJK>
+0x94F7 0x4879 0x5FAE # <CJK>
+0x94F8 0x487A 0x6787 # <CJK>
+0x94F9 0x487B 0x6BD8 # <CJK>
+0x94FA 0x487C 0x7435 # <CJK>
+0x94FB 0x487D 0x7709 # <CJK>
+0x94FC 0x487E 0x7F8E # <CJK>
+0x9540 0x4921 0x9F3B # <CJK>
+0x9541 0x4922 0x67CA # <CJK>
+0x9542 0x4923 0x7A17 # <CJK>
+0x9543 0x4924 0x5339 # <CJK>
+0x9544 0x4925 0x758B # <CJK>
+0x9545 0x4926 0x9AED # <CJK>
+0x9546 0x4927 0x5F66 # <CJK>
+0x9547 0x4928 0x819D # <CJK>
+0x9548 0x4929 0x83F1 # <CJK>
+0x9549 0x492A 0x8098 # <CJK>
+0x954A 0x492B 0x5F3C # <CJK>
+0x954B 0x492C 0x5FC5 # <CJK>
+0x954C 0x492D 0x7562 # <CJK>
+0x954D 0x492E 0x7B46 # <CJK>
+0x954E 0x492F 0x903C # <CJK>
+0x954F 0x4930 0x6867 # <CJK>
+0x9550 0x4931 0x59EB # <CJK>
+0x9551 0x4932 0x5A9B # <CJK>
+0x9552 0x4933 0x7D10 # <CJK>
+0x9553 0x4934 0x767E # <CJK>
+0x9554 0x4935 0x8B2C # <CJK>
+0x9555 0x4936 0x4FF5 # <CJK>
+0x9556 0x4937 0x5F6A # <CJK>
+0x9557 0x4938 0x6A19 # <CJK>
+0x9558 0x4939 0x6C37 # <CJK>
+0x9559 0x493A 0x6F02 # <CJK>
+0x955A 0x493B 0x74E2 # <CJK>
+0x955B 0x493C 0x7968 # <CJK>
+0x955C 0x493D 0x8868 # <CJK>
+0x955D 0x493E 0x8A55 # <CJK>
+0x955E 0x493F 0x8C79 # <CJK>
+0x955F 0x4940 0x5EDF # <CJK>
+0x9560 0x4941 0x63CF # <CJK>
+0x9561 0x4942 0x75C5 # <CJK>
+0x9562 0x4943 0x79D2 # <CJK>
+0x9563 0x4944 0x82D7 # <CJK>
+0x9564 0x4945 0x9328 # <CJK>
+0x9565 0x4946 0x92F2 # <CJK>
+0x9566 0x4947 0x849C # <CJK>
+0x9567 0x4948 0x86ED # <CJK>
+0x9568 0x4949 0x9C2D # <CJK>
+0x9569 0x494A 0x54C1 # <CJK>
+0x956A 0x494B 0x5F6C # <CJK>
+0x956B 0x494C 0x658C # <CJK>
+0x956C 0x494D 0x6D5C # <CJK>
+0x956D 0x494E 0x7015 # <CJK>
+0x956E 0x494F 0x8CA7 # <CJK>
+0x956F 0x4950 0x8CD3 # <CJK>
+0x9570 0x4951 0x983B # <CJK>
+0x9571 0x4952 0x654F # <CJK>
+0x9572 0x4953 0x74F6 # <CJK>
+0x9573 0x4954 0x4E0D # <CJK>
+0x9574 0x4955 0x4ED8 # <CJK>
+0x9575 0x4956 0x57E0 # <CJK>
+0x9576 0x4957 0x592B # <CJK>
+0x9577 0x4958 0x5A66 # <CJK>
+0x9578 0x4959 0x5BCC # <CJK>
+0x9579 0x495A 0x51A8 # <CJK>
+0x957A 0x495B 0x5E03 # <CJK>
+0x957B 0x495C 0x5E9C # <CJK>
+0x957C 0x495D 0x6016 # <CJK>
+0x957D 0x495E 0x6276 # <CJK>
+0x957E 0x495F 0x6577 # <CJK>
+0x9580 0x4960 0x65A7 # <CJK>
+0x9581 0x4961 0x666E # <CJK>
+0x9582 0x4962 0x6D6E # <CJK>
+0x9583 0x4963 0x7236 # <CJK>
+0x9584 0x4964 0x7B26 # <CJK>
+0x9585 0x4965 0x8150 # <CJK>
+0x9586 0x4966 0x819A # <CJK>
+0x9587 0x4967 0x8299 # <CJK>
+0x9588 0x4968 0x8B5C # <CJK>
+0x9589 0x4969 0x8CA0 # <CJK>
+0x958A 0x496A 0x8CE6 # <CJK>
+0x958B 0x496B 0x8D74 # <CJK>
+0x958C 0x496C 0x961C # <CJK>
+0x958D 0x496D 0x9644 # <CJK>
+0x958E 0x496E 0x4FAE # <CJK>
+0x958F 0x496F 0x64AB # <CJK>
+0x9590 0x4970 0x6B66 # <CJK>
+0x9591 0x4971 0x821E # <CJK>
+0x9592 0x4972 0x8461 # <CJK>
+0x9593 0x4973 0x856A # <CJK>
+0x9594 0x4974 0x90E8 # <CJK>
+0x9595 0x4975 0x5C01 # <CJK>
+0x9596 0x4976 0x6953 # <CJK>
+0x9597 0x4977 0x98A8 # <CJK>
+0x9598 0x4978 0x847A # <CJK>
+0x9599 0x4979 0x8557 # <CJK>
+0x959A 0x497A 0x4F0F # <CJK>
+0x959B 0x497B 0x526F # <CJK>
+0x959C 0x497C 0x5FA9 # <CJK>
+0x959D 0x497D 0x5E45 # <CJK>
+0x959E 0x497E 0x670D # <CJK>
+0x959F 0x4A21 0x798F # <CJK>
+0x95A0 0x4A22 0x8179 # <CJK>
+0x95A1 0x4A23 0x8907 # <CJK>
+0x95A2 0x4A24 0x8986 # <CJK>
+0x95A3 0x4A25 0x6DF5 # <CJK>
+0x95A4 0x4A26 0x5F17 # <CJK>
+0x95A5 0x4A27 0x6255 # <CJK>
+0x95A6 0x4A28 0x6CB8 # <CJK>
+0x95A7 0x4A29 0x4ECF # <CJK>
+0x95A8 0x4A2A 0x7269 # <CJK>
+0x95A9 0x4A2B 0x9B92 # <CJK>
+0x95AA 0x4A2C 0x5206 # <CJK>
+0x95AB 0x4A2D 0x543B # <CJK>
+0x95AC 0x4A2E 0x5674 # <CJK>
+0x95AD 0x4A2F 0x58B3 # <CJK>
+0x95AE 0x4A30 0x61A4 # <CJK>
+0x95AF 0x4A31 0x626E # <CJK>
+0x95B0 0x4A32 0x711A # <CJK>
+0x95B1 0x4A33 0x596E # <CJK>
+0x95B2 0x4A34 0x7C89 # <CJK>
+0x95B3 0x4A35 0x7CDE # <CJK>
+0x95B4 0x4A36 0x7D1B # <CJK>
+0x95B5 0x4A37 0x96F0 # <CJK>
+0x95B6 0x4A38 0x6587 # <CJK>
+0x95B7 0x4A39 0x805E # <CJK>
+0x95B8 0x4A3A 0x4E19 # <CJK>
+0x95B9 0x4A3B 0x4F75 # <CJK>
+0x95BA 0x4A3C 0x5175 # <CJK>
+0x95BB 0x4A3D 0x5840 # <CJK>
+0x95BC 0x4A3E 0x5E63 # <CJK>
+0x95BD 0x4A3F 0x5E73 # <CJK>
+0x95BE 0x4A40 0x5F0A # <CJK>
+0x95BF 0x4A41 0x67C4 # <CJK>
+0x95C0 0x4A42 0x4E26 # <CJK>
+0x95C1 0x4A43 0x853D # <CJK>
+0x95C2 0x4A44 0x9589 # <CJK>
+0x95C3 0x4A45 0x965B # <CJK>
+0x95C4 0x4A46 0x7C73 # <CJK>
+0x95C5 0x4A47 0x9801 # <CJK>
+0x95C6 0x4A48 0x50FB # <CJK>
+0x95C7 0x4A49 0x58C1 # <CJK>
+0x95C8 0x4A4A 0x7656 # <CJK>
+0x95C9 0x4A4B 0x78A7 # <CJK>
+0x95CA 0x4A4C 0x5225 # <CJK>
+0x95CB 0x4A4D 0x77A5 # <CJK>
+0x95CC 0x4A4E 0x8511 # <CJK>
+0x95CD 0x4A4F 0x7B86 # <CJK>
+0x95CE 0x4A50 0x504F # <CJK>
+0x95CF 0x4A51 0x5909 # <CJK>
+0x95D0 0x4A52 0x7247 # <CJK>
+0x95D1 0x4A53 0x7BC7 # <CJK>
+0x95D2 0x4A54 0x7DE8 # <CJK>
+0x95D3 0x4A55 0x8FBA # <CJK>
+0x95D4 0x4A56 0x8FD4 # <CJK>
+0x95D5 0x4A57 0x904D # <CJK>
+0x95D6 0x4A58 0x4FBF # <CJK>
+0x95D7 0x4A59 0x52C9 # <CJK>
+0x95D8 0x4A5A 0x5A29 # <CJK>
+0x95D9 0x4A5B 0x5F01 # <CJK>
+0x95DA 0x4A5C 0x97AD # <CJK>
+0x95DB 0x4A5D 0x4FDD # <CJK>
+0x95DC 0x4A5E 0x8217 # <CJK>
+0x95DD 0x4A5F 0x92EA # <CJK>
+0x95DE 0x4A60 0x5703 # <CJK>
+0x95DF 0x4A61 0x6355 # <CJK>
+0x95E0 0x4A62 0x6B69 # <CJK>
+0x95E1 0x4A63 0x752B # <CJK>
+0x95E2 0x4A64 0x88DC # <CJK>
+0x95E3 0x4A65 0x8F14 # <CJK>
+0x95E4 0x4A66 0x7A42 # <CJK>
+0x95E5 0x4A67 0x52DF # <CJK>
+0x95E6 0x4A68 0x5893 # <CJK>
+0x95E7 0x4A69 0x6155 # <CJK>
+0x95E8 0x4A6A 0x620A # <CJK>
+0x95E9 0x4A6B 0x66AE # <CJK>
+0x95EA 0x4A6C 0x6BCD # <CJK>
+0x95EB 0x4A6D 0x7C3F # <CJK>
+0x95EC 0x4A6E 0x83E9 # <CJK>
+0x95ED 0x4A6F 0x5023 # <CJK>
+0x95EE 0x4A70 0x4FF8 # <CJK>
+0x95EF 0x4A71 0x5305 # <CJK>
+0x95F0 0x4A72 0x5446 # <CJK>
+0x95F1 0x4A73 0x5831 # <CJK>
+0x95F2 0x4A74 0x5949 # <CJK>
+0x95F3 0x4A75 0x5B9D # <CJK>
+0x95F4 0x4A76 0x5CF0 # <CJK>
+0x95F5 0x4A77 0x5CEF # <CJK>
+0x95F6 0x4A78 0x5D29 # <CJK>
+0x95F7 0x4A79 0x5E96 # <CJK>
+0x95F8 0x4A7A 0x62B1 # <CJK>
+0x95F9 0x4A7B 0x6367 # <CJK>
+0x95FA 0x4A7C 0x653E # <CJK>
+0x95FB 0x4A7D 0x65B9 # <CJK>
+0x95FC 0x4A7E 0x670B # <CJK>
+0x9640 0x4B21 0x6CD5 # <CJK>
+0x9641 0x4B22 0x6CE1 # <CJK>
+0x9642 0x4B23 0x70F9 # <CJK>
+0x9643 0x4B24 0x7832 # <CJK>
+0x9644 0x4B25 0x7E2B # <CJK>
+0x9645 0x4B26 0x80DE # <CJK>
+0x9646 0x4B27 0x82B3 # <CJK>
+0x9647 0x4B28 0x840C # <CJK>
+0x9648 0x4B29 0x84EC # <CJK>
+0x9649 0x4B2A 0x8702 # <CJK>
+0x964A 0x4B2B 0x8912 # <CJK>
+0x964B 0x4B2C 0x8A2A # <CJK>
+0x964C 0x4B2D 0x8C4A # <CJK>
+0x964D 0x4B2E 0x90A6 # <CJK>
+0x964E 0x4B2F 0x92D2 # <CJK>
+0x964F 0x4B30 0x98FD # <CJK>
+0x9650 0x4B31 0x9CF3 # <CJK>
+0x9651 0x4B32 0x9D6C # <CJK>
+0x9652 0x4B33 0x4E4F # <CJK>
+0x9653 0x4B34 0x4EA1 # <CJK>
+0x9654 0x4B35 0x508D # <CJK>
+0x9655 0x4B36 0x5256 # <CJK>
+0x9656 0x4B37 0x574A # <CJK>
+0x9657 0x4B38 0x59A8 # <CJK>
+0x9658 0x4B39 0x5E3D # <CJK>
+0x9659 0x4B3A 0x5FD8 # <CJK>
+0x965A 0x4B3B 0x5FD9 # <CJK>
+0x965B 0x4B3C 0x623F # <CJK>
+0x965C 0x4B3D 0x66B4 # <CJK>
+0x965D 0x4B3E 0x671B # <CJK>
+0x965E 0x4B3F 0x67D0 # <CJK>
+0x965F 0x4B40 0x68D2 # <CJK>
+0x9660 0x4B41 0x5192 # <CJK>
+0x9661 0x4B42 0x7D21 # <CJK>
+0x9662 0x4B43 0x80AA # <CJK>
+0x9663 0x4B44 0x81A8 # <CJK>
+0x9664 0x4B45 0x8B00 # <CJK>
+0x9665 0x4B46 0x8C8C # <CJK>
+0x9666 0x4B47 0x8CBF # <CJK>
+0x9667 0x4B48 0x927E # <CJK>
+0x9668 0x4B49 0x9632 # <CJK>
+0x9669 0x4B4A 0x5420 # <CJK>
+0x966A 0x4B4B 0x982C # <CJK>
+0x966B 0x4B4C 0x5317 # <CJK>
+0x966C 0x4B4D 0x50D5 # <CJK>
+0x966D 0x4B4E 0x535C # <CJK>
+0x966E 0x4B4F 0x58A8 # <CJK>
+0x966F 0x4B50 0x64B2 # <CJK>
+0x9670 0x4B51 0x6734 # <CJK>
+0x9671 0x4B52 0x7267 # <CJK>
+0x9672 0x4B53 0x7766 # <CJK>
+0x9673 0x4B54 0x7A46 # <CJK>
+0x9674 0x4B55 0x91E6 # <CJK>
+0x9675 0x4B56 0x52C3 # <CJK>
+0x9676 0x4B57 0x6CA1 # <CJK>
+0x9677 0x4B58 0x6B86 # <CJK>
+0x9678 0x4B59 0x5800 # <CJK>
+0x9679 0x4B5A 0x5E4C # <CJK>
+0x967A 0x4B5B 0x5954 # <CJK>
+0x967B 0x4B5C 0x672C # <CJK>
+0x967C 0x4B5D 0x7FFB # <CJK>
+0x967D 0x4B5E 0x51E1 # <CJK>
+0x967E 0x4B5F 0x76C6 # <CJK>
+0x9680 0x4B60 0x6469 # <CJK>
+0x9681 0x4B61 0x78E8 # <CJK>
+0x9682 0x4B62 0x9B54 # <CJK>
+0x9683 0x4B63 0x9EBB # <CJK>
+0x9684 0x4B64 0x57CB # <CJK>
+0x9685 0x4B65 0x59B9 # <CJK>
+0x9686 0x4B66 0x6627 # <CJK>
+0x9687 0x4B67 0x679A # <CJK>
+0x9688 0x4B68 0x6BCE # <CJK>
+0x9689 0x4B69 0x54E9 # <CJK>
+0x968A 0x4B6A 0x69D9 # <CJK>
+0x968B 0x4B6B 0x5E55 # <CJK>
+0x968C 0x4B6C 0x819C # <CJK>
+0x968D 0x4B6D 0x6795 # <CJK>
+0x968E 0x4B6E 0x9BAA # <CJK>
+0x968F 0x4B6F 0x67FE # <CJK>
+0x9690 0x4B70 0x9C52 # <CJK>
+0x9691 0x4B71 0x685D # <CJK>
+0x9692 0x4B72 0x4EA6 # <CJK>
+0x9693 0x4B73 0x4FE3 # <CJK>
+0x9694 0x4B74 0x53C8 # <CJK>
+0x9695 0x4B75 0x62B9 # <CJK>
+0x9696 0x4B76 0x672B # <CJK>
+0x9697 0x4B77 0x6CAB # <CJK>
+0x9698 0x4B78 0x8FC4 # <CJK>
+0x9699 0x4B79 0x4FAD # <CJK>
+0x969A 0x4B7A 0x7E6D # <CJK>
+0x969B 0x4B7B 0x9EBF # <CJK>
+0x969C 0x4B7C 0x4E07 # <CJK>
+0x969D 0x4B7D 0x6162 # <CJK>
+0x969E 0x4B7E 0x6E80 # <CJK>
+0x969F 0x4C21 0x6F2B # <CJK>
+0x96A0 0x4C22 0x8513 # <CJK>
+0x96A1 0x4C23 0x5473 # <CJK>
+0x96A2 0x4C24 0x672A # <CJK>
+0x96A3 0x4C25 0x9B45 # <CJK>
+0x96A4 0x4C26 0x5DF3 # <CJK>
+0x96A5 0x4C27 0x7B95 # <CJK>
+0x96A6 0x4C28 0x5CAC # <CJK>
+0x96A7 0x4C29 0x5BC6 # <CJK>
+0x96A8 0x4C2A 0x871C # <CJK>
+0x96A9 0x4C2B 0x6E4A # <CJK>
+0x96AA 0x4C2C 0x84D1 # <CJK>
+0x96AB 0x4C2D 0x7A14 # <CJK>
+0x96AC 0x4C2E 0x8108 # <CJK>
+0x96AD 0x4C2F 0x5999 # <CJK>
+0x96AE 0x4C30 0x7C8D # <CJK>
+0x96AF 0x4C31 0x6C11 # <CJK>
+0x96B0 0x4C32 0x7720 # <CJK>
+0x96B1 0x4C33 0x52D9 # <CJK>
+0x96B2 0x4C34 0x5922 # <CJK>
+0x96B3 0x4C35 0x7121 # <CJK>
+0x96B4 0x4C36 0x725F # <CJK>
+0x96B5 0x4C37 0x77DB # <CJK>
+0x96B6 0x4C38 0x9727 # <CJK>
+0x96B7 0x4C39 0x9D61 # <CJK>
+0x96B8 0x4C3A 0x690B # <CJK>
+0x96B9 0x4C3B 0x5A7F # <CJK>
+0x96BA 0x4C3C 0x5A18 # <CJK>
+0x96BB 0x4C3D 0x51A5 # <CJK>
+0x96BC 0x4C3E 0x540D # <CJK>
+0x96BD 0x4C3F 0x547D # <CJK>
+0x96BE 0x4C40 0x660E # <CJK>
+0x96BF 0x4C41 0x76DF # <CJK>
+0x96C0 0x4C42 0x8FF7 # <CJK>
+0x96C1 0x4C43 0x9298 # <CJK>
+0x96C2 0x4C44 0x9CF4 # <CJK>
+0x96C3 0x4C45 0x59EA # <CJK>
+0x96C4 0x4C46 0x725D # <CJK>
+0x96C5 0x4C47 0x6EC5 # <CJK>
+0x96C6 0x4C48 0x514D # <CJK>
+0x96C7 0x4C49 0x68C9 # <CJK>
+0x96C8 0x4C4A 0x7DBF # <CJK>
+0x96C9 0x4C4B 0x7DEC # <CJK>
+0x96CA 0x4C4C 0x9762 # <CJK>
+0x96CB 0x4C4D 0x9EBA # <CJK>
+0x96CC 0x4C4E 0x6478 # <CJK>
+0x96CD 0x4C4F 0x6A21 # <CJK>
+0x96CE 0x4C50 0x8302 # <CJK>
+0x96CF 0x4C51 0x5984 # <CJK>
+0x96D0 0x4C52 0x5B5F # <CJK>
+0x96D1 0x4C53 0x6BDB # <CJK>
+0x96D2 0x4C54 0x731B # <CJK>
+0x96D3 0x4C55 0x76F2 # <CJK>
+0x96D4 0x4C56 0x7DB2 # <CJK>
+0x96D5 0x4C57 0x8017 # <CJK>
+0x96D6 0x4C58 0x8499 # <CJK>
+0x96D7 0x4C59 0x5132 # <CJK>
+0x96D8 0x4C5A 0x6728 # <CJK>
+0x96D9 0x4C5B 0x9ED9 # <CJK>
+0x96DA 0x4C5C 0x76EE # <CJK>
+0x96DB 0x4C5D 0x6762 # <CJK>
+0x96DC 0x4C5E 0x52FF # <CJK>
+0x96DD 0x4C5F 0x9905 # <CJK>
+0x96DE 0x4C60 0x5C24 # <CJK>
+0x96DF 0x4C61 0x623B # <CJK>
+0x96E0 0x4C62 0x7C7E # <CJK>
+0x96E1 0x4C63 0x8CB0 # <CJK>
+0x96E2 0x4C64 0x554F # <CJK>
+0x96E3 0x4C65 0x60B6 # <CJK>
+0x96E4 0x4C66 0x7D0B # <CJK>
+0x96E5 0x4C67 0x9580 # <CJK>
+0x96E6 0x4C68 0x5301 # <CJK>
+0x96E7 0x4C69 0x4E5F # <CJK>
+0x96E8 0x4C6A 0x51B6 # <CJK>
+0x96E9 0x4C6B 0x591C # <CJK>
+0x96EA 0x4C6C 0x723A # <CJK>
+0x96EB 0x4C6D 0x8036 # <CJK>
+0x96EC 0x4C6E 0x91CE # <CJK>
+0x96ED 0x4C6F 0x5F25 # <CJK>
+0x96EE 0x4C70 0x77E2 # <CJK>
+0x96EF 0x4C71 0x5384 # <CJK>
+0x96F0 0x4C72 0x5F79 # <CJK>
+0x96F1 0x4C73 0x7D04 # <CJK>
+0x96F2 0x4C74 0x85AC # <CJK>
+0x96F3 0x4C75 0x8A33 # <CJK>
+0x96F4 0x4C76 0x8E8D # <CJK>
+0x96F5 0x4C77 0x9756 # <CJK>
+0x96F6 0x4C78 0x67F3 # <CJK>
+0x96F7 0x4C79 0x85AE # <CJK>
+0x96F8 0x4C7A 0x9453 # <CJK>
+0x96F9 0x4C7B 0x6109 # <CJK>
+0x96FA 0x4C7C 0x6108 # <CJK>
+0x96FB 0x4C7D 0x6CB9 # <CJK>
+0x96FC 0x4C7E 0x7652 # <CJK>
+0x9740 0x4D21 0x8AED # <CJK>
+0x9741 0x4D22 0x8F38 # <CJK>
+0x9742 0x4D23 0x552F # <CJK>
+0x9743 0x4D24 0x4F51 # <CJK>
+0x9744 0x4D25 0x512A # <CJK>
+0x9745 0x4D26 0x52C7 # <CJK>
+0x9746 0x4D27 0x53CB # <CJK>
+0x9747 0x4D28 0x5BA5 # <CJK>
+0x9748 0x4D29 0x5E7D # <CJK>
+0x9749 0x4D2A 0x60A0 # <CJK>
+0x974A 0x4D2B 0x6182 # <CJK>
+0x974B 0x4D2C 0x63D6 # <CJK>
+0x974C 0x4D2D 0x6709 # <CJK>
+0x974D 0x4D2E 0x67DA # <CJK>
+0x974E 0x4D2F 0x6E67 # <CJK>
+0x974F 0x4D30 0x6D8C # <CJK>
+0x9750 0x4D31 0x7336 # <CJK>
+0x9751 0x4D32 0x7337 # <CJK>
+0x9752 0x4D33 0x7531 # <CJK>
+0x9753 0x4D34 0x7950 # <CJK>
+0x9754 0x4D35 0x88D5 # <CJK>
+0x9755 0x4D36 0x8A98 # <CJK>
+0x9756 0x4D37 0x904A # <CJK>
+0x9757 0x4D38 0x9091 # <CJK>
+0x9758 0x4D39 0x90F5 # <CJK>
+0x9759 0x4D3A 0x96C4 # <CJK>
+0x975A 0x4D3B 0x878D # <CJK>
+0x975B 0x4D3C 0x5915 # <CJK>
+0x975C 0x4D3D 0x4E88 # <CJK>
+0x975D 0x4D3E 0x4F59 # <CJK>
+0x975E 0x4D3F 0x4E0E # <CJK>
+0x975F 0x4D40 0x8A89 # <CJK>
+0x9760 0x4D41 0x8F3F # <CJK>
+0x9761 0x4D42 0x9810 # <CJK>
+0x9762 0x4D43 0x50AD # <CJK>
+0x9763 0x4D44 0x5E7C # <CJK>
+0x9764 0x4D45 0x5996 # <CJK>
+0x9765 0x4D46 0x5BB9 # <CJK>
+0x9766 0x4D47 0x5EB8 # <CJK>
+0x9767 0x4D48 0x63DA # <CJK>
+0x9768 0x4D49 0x63FA # <CJK>
+0x9769 0x4D4A 0x64C1 # <CJK>
+0x976A 0x4D4B 0x66DC # <CJK>
+0x976B 0x4D4C 0x694A # <CJK>
+0x976C 0x4D4D 0x69D8 # <CJK>
+0x976D 0x4D4E 0x6D0B # <CJK>
+0x976E 0x4D4F 0x6EB6 # <CJK>
+0x976F 0x4D50 0x7194 # <CJK>
+0x9770 0x4D51 0x7528 # <CJK>
+0x9771 0x4D52 0x7AAF # <CJK>
+0x9772 0x4D53 0x7F8A # <CJK>
+0x9773 0x4D54 0x8000 # <CJK>
+0x9774 0x4D55 0x8449 # <CJK>
+0x9775 0x4D56 0x84C9 # <CJK>
+0x9776 0x4D57 0x8981 # <CJK>
+0x9777 0x4D58 0x8B21 # <CJK>
+0x9778 0x4D59 0x8E0A # <CJK>
+0x9779 0x4D5A 0x9065 # <CJK>
+0x977A 0x4D5B 0x967D # <CJK>
+0x977B 0x4D5C 0x990A # <CJK>
+0x977C 0x4D5D 0x617E # <CJK>
+0x977D 0x4D5E 0x6291 # <CJK>
+0x977E 0x4D5F 0x6B32 # <CJK>
+0x9780 0x4D60 0x6C83 # <CJK>
+0x9781 0x4D61 0x6D74 # <CJK>
+0x9782 0x4D62 0x7FCC # <CJK>
+0x9783 0x4D63 0x7FFC # <CJK>
+0x9784 0x4D64 0x6DC0 # <CJK>
+0x9785 0x4D65 0x7F85 # <CJK>
+0x9786 0x4D66 0x87BA # <CJK>
+0x9787 0x4D67 0x88F8 # <CJK>
+0x9788 0x4D68 0x6765 # <CJK>
+0x9789 0x4D69 0x83B1 # <CJK>
+0x978A 0x4D6A 0x983C # <CJK>
+0x978B 0x4D6B 0x96F7 # <CJK>
+0x978C 0x4D6C 0x6D1B # <CJK>
+0x978D 0x4D6D 0x7D61 # <CJK>
+0x978E 0x4D6E 0x843D # <CJK>
+0x978F 0x4D6F 0x916A # <CJK>
+0x9790 0x4D70 0x4E71 # <CJK>
+0x9791 0x4D71 0x5375 # <CJK>
+0x9792 0x4D72 0x5D50 # <CJK>
+0x9793 0x4D73 0x6B04 # <CJK>
+0x9794 0x4D74 0x6FEB # <CJK>
+0x9795 0x4D75 0x85CD # <CJK>
+0x9796 0x4D76 0x862D # <CJK>
+0x9797 0x4D77 0x89A7 # <CJK>
+0x9798 0x4D78 0x5229 # <CJK>
+0x9799 0x4D79 0x540F # <CJK>
+0x979A 0x4D7A 0x5C65 # <CJK>
+0x979B 0x4D7B 0x674E # <CJK>
+0x979C 0x4D7C 0x68A8 # <CJK>
+0x979D 0x4D7D 0x7406 # <CJK>
+0x979E 0x4D7E 0x7483 # <CJK>
+0x979F 0x4E21 0x75E2 # <CJK>
+0x97A0 0x4E22 0x88CF # <CJK>
+0x97A1 0x4E23 0x88E1 # <CJK>
+0x97A2 0x4E24 0x91CC # <CJK>
+0x97A3 0x4E25 0x96E2 # <CJK>
+0x97A4 0x4E26 0x9678 # <CJK>
+0x97A5 0x4E27 0x5F8B # <CJK>
+0x97A6 0x4E28 0x7387 # <CJK>
+0x97A7 0x4E29 0x7ACB # <CJK>
+0x97A8 0x4E2A 0x844E # <CJK>
+0x97A9 0x4E2B 0x63A0 # <CJK>
+0x97AA 0x4E2C 0x7565 # <CJK>
+0x97AB 0x4E2D 0x5289 # <CJK>
+0x97AC 0x4E2E 0x6D41 # <CJK>
+0x97AD 0x4E2F 0x6E9C # <CJK>
+0x97AE 0x4E30 0x7409 # <CJK>
+0x97AF 0x4E31 0x7559 # <CJK>
+0x97B0 0x4E32 0x786B # <CJK>
+0x97B1 0x4E33 0x7C92 # <CJK>
+0x97B2 0x4E34 0x9686 # <CJK>
+0x97B3 0x4E35 0x7ADC # <CJK>
+0x97B4 0x4E36 0x9F8D # <CJK>
+0x97B5 0x4E37 0x4FB6 # <CJK>
+0x97B6 0x4E38 0x616E # <CJK>
+0x97B7 0x4E39 0x65C5 # <CJK>
+0x97B8 0x4E3A 0x865C # <CJK>
+0x97B9 0x4E3B 0x4E86 # <CJK>
+0x97BA 0x4E3C 0x4EAE # <CJK>
+0x97BB 0x4E3D 0x50DA # <CJK>
+0x97BC 0x4E3E 0x4E21 # <CJK>
+0x97BD 0x4E3F 0x51CC # <CJK>
+0x97BE 0x4E40 0x5BEE # <CJK>
+0x97BF 0x4E41 0x6599 # <CJK>
+0x97C0 0x4E42 0x6881 # <CJK>
+0x97C1 0x4E43 0x6DBC # <CJK>
+0x97C2 0x4E44 0x731F # <CJK>
+0x97C3 0x4E45 0x7642 # <CJK>
+0x97C4 0x4E46 0x77AD # <CJK>
+0x97C5 0x4E47 0x7A1C # <CJK>
+0x97C6 0x4E48 0x7CE7 # <CJK>
+0x97C7 0x4E49 0x826F # <CJK>
+0x97C8 0x4E4A 0x8AD2 # <CJK>
+0x97C9 0x4E4B 0x907C # <CJK>
+0x97CA 0x4E4C 0x91CF # <CJK>
+0x97CB 0x4E4D 0x9675 # <CJK>
+0x97CC 0x4E4E 0x9818 # <CJK>
+0x97CD 0x4E4F 0x529B # <CJK>
+0x97CE 0x4E50 0x7DD1 # <CJK>
+0x97CF 0x4E51 0x502B # <CJK>
+0x97D0 0x4E52 0x5398 # <CJK>
+0x97D1 0x4E53 0x6797 # <CJK>
+0x97D2 0x4E54 0x6DCB # <CJK>
+0x97D3 0x4E55 0x71D0 # <CJK>
+0x97D4 0x4E56 0x7433 # <CJK>
+0x97D5 0x4E57 0x81E8 # <CJK>
+0x97D6 0x4E58 0x8F2A # <CJK>
+0x97D7 0x4E59 0x96A3 # <CJK>
+0x97D8 0x4E5A 0x9C57 # <CJK>
+0x97D9 0x4E5B 0x9E9F # <CJK>
+0x97DA 0x4E5C 0x7460 # <CJK>
+0x97DB 0x4E5D 0x5841 # <CJK>
+0x97DC 0x4E5E 0x6D99 # <CJK>
+0x97DD 0x4E5F 0x7D2F # <CJK>
+0x97DE 0x4E60 0x985E # <CJK>
+0x97DF 0x4E61 0x4EE4 # <CJK>
+0x97E0 0x4E62 0x4F36 # <CJK>
+0x97E1 0x4E63 0x4F8B # <CJK>
+0x97E2 0x4E64 0x51B7 # <CJK>
+0x97E3 0x4E65 0x52B1 # <CJK>
+0x97E4 0x4E66 0x5DBA # <CJK>
+0x97E5 0x4E67 0x601C # <CJK>
+0x97E6 0x4E68 0x73B2 # <CJK>
+0x97E7 0x4E69 0x793C # <CJK>
+0x97E8 0x4E6A 0x82D3 # <CJK>
+0x97E9 0x4E6B 0x9234 # <CJK>
+0x97EA 0x4E6C 0x96B7 # <CJK>
+0x97EB 0x4E6D 0x96F6 # <CJK>
+0x97EC 0x4E6E 0x970A # <CJK>
+0x97ED 0x4E6F 0x9E97 # <CJK>
+0x97EE 0x4E70 0x9F62 # <CJK>
+0x97EF 0x4E71 0x66A6 # <CJK>
+0x97F0 0x4E72 0x6B74 # <CJK>
+0x97F1 0x4E73 0x5217 # <CJK>
+0x97F2 0x4E74 0x52A3 # <CJK>
+0x97F3 0x4E75 0x70C8 # <CJK>
+0x97F4 0x4E76 0x88C2 # <CJK>
+0x97F5 0x4E77 0x5EC9 # <CJK>
+0x97F6 0x4E78 0x604B # <CJK>
+0x97F7 0x4E79 0x6190 # <CJK>
+0x97F8 0x4E7A 0x6F23 # <CJK>
+0x97F9 0x4E7B 0x7149 # <CJK>
+0x97FA 0x4E7C 0x7C3E # <CJK>
+0x97FB 0x4E7D 0x7DF4 # <CJK>
+0x97FC 0x4E7E 0x806F # <CJK>
+0x9840 0x4F21 0x84EE # <CJK>
+0x9841 0x4F22 0x9023 # <CJK>
+0x9842 0x4F23 0x932C # <CJK>
+0x9843 0x4F24 0x5442 # <CJK>
+0x9844 0x4F25 0x9B6F # <CJK>
+0x9845 0x4F26 0x6AD3 # <CJK>
+0x9846 0x4F27 0x7089 # <CJK>
+0x9847 0x4F28 0x8CC2 # <CJK>
+0x9848 0x4F29 0x8DEF # <CJK>
+0x9849 0x4F2A 0x9732 # <CJK>
+0x984A 0x4F2B 0x52B4 # <CJK>
+0x984B 0x4F2C 0x5A41 # <CJK>
+0x984C 0x4F2D 0x5ECA # <CJK>
+0x984D 0x4F2E 0x5F04 # <CJK>
+0x984E 0x4F2F 0x6717 # <CJK>
+0x984F 0x4F30 0x697C # <CJK>
+0x9850 0x4F31 0x6994 # <CJK>
+0x9851 0x4F32 0x6D6A # <CJK>
+0x9852 0x4F33 0x6F0F # <CJK>
+0x9853 0x4F34 0x7262 # <CJK>
+0x9854 0x4F35 0x72FC # <CJK>
+0x9855 0x4F36 0x7BED # <CJK>
+0x9856 0x4F37 0x8001 # <CJK>
+0x9857 0x4F38 0x807E # <CJK>
+0x9858 0x4F39 0x874B # <CJK>
+0x9859 0x4F3A 0x90CE # <CJK>
+0x985A 0x4F3B 0x516D # <CJK>
+0x985B 0x4F3C 0x9E93 # <CJK>
+0x985C 0x4F3D 0x7984 # <CJK>
+0x985D 0x4F3E 0x808B # <CJK>
+0x985E 0x4F3F 0x9332 # <CJK>
+0x985F 0x4F40 0x8AD6 # <CJK>
+0x9860 0x4F41 0x502D # <CJK>
+0x9861 0x4F42 0x548C # <CJK>
+0x9862 0x4F43 0x8A71 # <CJK>
+0x9863 0x4F44 0x6B6A # <CJK>
+0x9864 0x4F45 0x8CC4 # <CJK>
+0x9865 0x4F46 0x8107 # <CJK>
+0x9866 0x4F47 0x60D1 # <CJK>
+0x9867 0x4F48 0x67A0 # <CJK>
+0x9868 0x4F49 0x9DF2 # <CJK>
+0x9869 0x4F4A 0x4E99 # <CJK>
+0x986A 0x4F4B 0x4E98 # <CJK>
+0x986B 0x4F4C 0x9C10 # <CJK>
+0x986C 0x4F4D 0x8A6B # <CJK>
+0x986D 0x4F4E 0x85C1 # <CJK>
+0x986E 0x4F4F 0x8568 # <CJK>
+0x986F 0x4F50 0x6900 # <CJK>
+0x9870 0x4F51 0x6E7E # <CJK>
+0x9871 0x4F52 0x7897 # <CJK>
+0x9872 0x4F53 0x8155 # <CJK>
+0x989F 0x5021 0x5F0C # <CJK>
+0x98A0 0x5022 0x4E10 # <CJK>
+0x98A1 0x5023 0x4E15 # <CJK>
+0x98A2 0x5024 0x4E2A # <CJK>
+0x98A3 0x5025 0x4E31 # <CJK>
+0x98A4 0x5026 0x4E36 # <CJK>
+0x98A5 0x5027 0x4E3C # <CJK>
+0x98A6 0x5028 0x4E3F # <CJK>
+0x98A7 0x5029 0x4E42 # <CJK>
+0x98A8 0x502A 0x4E56 # <CJK>
+0x98A9 0x502B 0x4E58 # <CJK>
+0x98AA 0x502C 0x4E82 # <CJK>
+0x98AB 0x502D 0x4E85 # <CJK>
+0x98AC 0x502E 0x8C6B # <CJK>
+0x98AD 0x502F 0x4E8A # <CJK>
+0x98AE 0x5030 0x8212 # <CJK>
+0x98AF 0x5031 0x5F0D # <CJK>
+0x98B0 0x5032 0x4E8E # <CJK>
+0x98B1 0x5033 0x4E9E # <CJK>
+0x98B2 0x5034 0x4E9F # <CJK>
+0x98B3 0x5035 0x4EA0 # <CJK>
+0x98B4 0x5036 0x4EA2 # <CJK>
+0x98B5 0x5037 0x4EB0 # <CJK>
+0x98B6 0x5038 0x4EB3 # <CJK>
+0x98B7 0x5039 0x4EB6 # <CJK>
+0x98B8 0x503A 0x4ECE # <CJK>
+0x98B9 0x503B 0x4ECD # <CJK>
+0x98BA 0x503C 0x4EC4 # <CJK>
+0x98BB 0x503D 0x4EC6 # <CJK>
+0x98BC 0x503E 0x4EC2 # <CJK>
+0x98BD 0x503F 0x4ED7 # <CJK>
+0x98BE 0x5040 0x4EDE # <CJK>
+0x98BF 0x5041 0x4EED # <CJK>
+0x98C0 0x5042 0x4EDF # <CJK>
+0x98C1 0x5043 0x4EF7 # <CJK>
+0x98C2 0x5044 0x4F09 # <CJK>
+0x98C3 0x5045 0x4F5A # <CJK>
+0x98C4 0x5046 0x4F30 # <CJK>
+0x98C5 0x5047 0x4F5B # <CJK>
+0x98C6 0x5048 0x4F5D # <CJK>
+0x98C7 0x5049 0x4F57 # <CJK>
+0x98C8 0x504A 0x4F47 # <CJK>
+0x98C9 0x504B 0x4F76 # <CJK>
+0x98CA 0x504C 0x4F88 # <CJK>
+0x98CB 0x504D 0x4F8F # <CJK>
+0x98CC 0x504E 0x4F98 # <CJK>
+0x98CD 0x504F 0x4F7B # <CJK>
+0x98CE 0x5050 0x4F69 # <CJK>
+0x98CF 0x5051 0x4F70 # <CJK>
+0x98D0 0x5052 0x4F91 # <CJK>
+0x98D1 0x5053 0x4F6F # <CJK>
+0x98D2 0x5054 0x4F86 # <CJK>
+0x98D3 0x5055 0x4F96 # <CJK>
+0x98D4 0x5056 0x5118 # <CJK>
+0x98D5 0x5057 0x4FD4 # <CJK>
+0x98D6 0x5058 0x4FDF # <CJK>
+0x98D7 0x5059 0x4FCE # <CJK>
+0x98D8 0x505A 0x4FD8 # <CJK>
+0x98D9 0x505B 0x4FDB # <CJK>
+0x98DA 0x505C 0x4FD1 # <CJK>
+0x98DB 0x505D 0x4FDA # <CJK>
+0x98DC 0x505E 0x4FD0 # <CJK>
+0x98DD 0x505F 0x4FE4 # <CJK>
+0x98DE 0x5060 0x4FE5 # <CJK>
+0x98DF 0x5061 0x501A # <CJK>
+0x98E0 0x5062 0x5028 # <CJK>
+0x98E1 0x5063 0x5014 # <CJK>
+0x98E2 0x5064 0x502A # <CJK>
+0x98E3 0x5065 0x5025 # <CJK>
+0x98E4 0x5066 0x5005 # <CJK>
+0x98E5 0x5067 0x4F1C # <CJK>
+0x98E6 0x5068 0x4FF6 # <CJK>
+0x98E7 0x5069 0x5021 # <CJK>
+0x98E8 0x506A 0x5029 # <CJK>
+0x98E9 0x506B 0x502C # <CJK>
+0x98EA 0x506C 0x4FFE # <CJK>
+0x98EB 0x506D 0x4FEF # <CJK>
+0x98EC 0x506E 0x5011 # <CJK>
+0x98ED 0x506F 0x5006 # <CJK>
+0x98EE 0x5070 0x5043 # <CJK>
+0x98EF 0x5071 0x5047 # <CJK>
+0x98F0 0x5072 0x6703 # <CJK>
+0x98F1 0x5073 0x5055 # <CJK>
+0x98F2 0x5074 0x5050 # <CJK>
+0x98F3 0x5075 0x5048 # <CJK>
+0x98F4 0x5076 0x505A # <CJK>
+0x98F5 0x5077 0x5056 # <CJK>
+0x98F6 0x5078 0x506C # <CJK>
+0x98F7 0x5079 0x5078 # <CJK>
+0x98F8 0x507A 0x5080 # <CJK>
+0x98F9 0x507B 0x509A # <CJK>
+0x98FA 0x507C 0x5085 # <CJK>
+0x98FB 0x507D 0x50B4 # <CJK>
+0x98FC 0x507E 0x50B2 # <CJK>
+0x9940 0x5121 0x50C9 # <CJK>
+0x9941 0x5122 0x50CA # <CJK>
+0x9942 0x5123 0x50B3 # <CJK>
+0x9943 0x5124 0x50C2 # <CJK>
+0x9944 0x5125 0x50D6 # <CJK>
+0x9945 0x5126 0x50DE # <CJK>
+0x9946 0x5127 0x50E5 # <CJK>
+0x9947 0x5128 0x50ED # <CJK>
+0x9948 0x5129 0x50E3 # <CJK>
+0x9949 0x512A 0x50EE # <CJK>
+0x994A 0x512B 0x50F9 # <CJK>
+0x994B 0x512C 0x50F5 # <CJK>
+0x994C 0x512D 0x5109 # <CJK>
+0x994D 0x512E 0x5101 # <CJK>
+0x994E 0x512F 0x5102 # <CJK>
+0x994F 0x5130 0x5116 # <CJK>
+0x9950 0x5131 0x5115 # <CJK>
+0x9951 0x5132 0x5114 # <CJK>
+0x9952 0x5133 0x511A # <CJK>
+0x9953 0x5134 0x5121 # <CJK>
+0x9954 0x5135 0x513A # <CJK>
+0x9955 0x5136 0x5137 # <CJK>
+0x9956 0x5137 0x513C # <CJK>
+0x9957 0x5138 0x513B # <CJK>
+0x9958 0x5139 0x513F # <CJK>
+0x9959 0x513A 0x5140 # <CJK>
+0x995A 0x513B 0x5152 # <CJK>
+0x995B 0x513C 0x514C # <CJK>
+0x995C 0x513D 0x5154 # <CJK>
+0x995D 0x513E 0x5162 # <CJK>
+0x995E 0x513F 0x7AF8 # <CJK>
+0x995F 0x5140 0x5169 # <CJK>
+0x9960 0x5141 0x516A # <CJK>
+0x9961 0x5142 0x516E # <CJK>
+0x9962 0x5143 0x5180 # <CJK>
+0x9963 0x5144 0x5182 # <CJK>
+0x9964 0x5145 0x56D8 # <CJK>
+0x9965 0x5146 0x518C # <CJK>
+0x9966 0x5147 0x5189 # <CJK>
+0x9967 0x5148 0x518F # <CJK>
+0x9968 0x5149 0x5191 # <CJK>
+0x9969 0x514A 0x5193 # <CJK>
+0x996A 0x514B 0x5195 # <CJK>
+0x996B 0x514C 0x5196 # <CJK>
+0x996C 0x514D 0x51A4 # <CJK>
+0x996D 0x514E 0x51A6 # <CJK>
+0x996E 0x514F 0x51A2 # <CJK>
+0x996F 0x5150 0x51A9 # <CJK>
+0x9970 0x5151 0x51AA # <CJK>
+0x9971 0x5152 0x51AB # <CJK>
+0x9972 0x5153 0x51B3 # <CJK>
+0x9973 0x5154 0x51B1 # <CJK>
+0x9974 0x5155 0x51B2 # <CJK>
+0x9975 0x5156 0x51B0 # <CJK>
+0x9976 0x5157 0x51B5 # <CJK>
+0x9977 0x5158 0x51BD # <CJK>
+0x9978 0x5159 0x51C5 # <CJK>
+0x9979 0x515A 0x51C9 # <CJK>
+0x997A 0x515B 0x51DB # <CJK>
+0x997B 0x515C 0x51E0 # <CJK>
+0x997C 0x515D 0x8655 # <CJK>
+0x997D 0x515E 0x51E9 # <CJK>
+0x997E 0x515F 0x51ED # <CJK>
+0x9980 0x5160 0x51F0 # <CJK>
+0x9981 0x5161 0x51F5 # <CJK>
+0x9982 0x5162 0x51FE # <CJK>
+0x9983 0x5163 0x5204 # <CJK>
+0x9984 0x5164 0x520B # <CJK>
+0x9985 0x5165 0x5214 # <CJK>
+0x9986 0x5166 0x520E # <CJK>
+0x9987 0x5167 0x5227 # <CJK>
+0x9988 0x5168 0x522A # <CJK>
+0x9989 0x5169 0x522E # <CJK>
+0x998A 0x516A 0x5233 # <CJK>
+0x998B 0x516B 0x5239 # <CJK>
+0x998C 0x516C 0x524F # <CJK>
+0x998D 0x516D 0x5244 # <CJK>
+0x998E 0x516E 0x524B # <CJK>
+0x998F 0x516F 0x524C # <CJK>
+0x9990 0x5170 0x525E # <CJK>
+0x9991 0x5171 0x5254 # <CJK>
+0x9992 0x5172 0x526A # <CJK>
+0x9993 0x5173 0x5274 # <CJK>
+0x9994 0x5174 0x5269 # <CJK>
+0x9995 0x5175 0x5273 # <CJK>
+0x9996 0x5176 0x527F # <CJK>
+0x9997 0x5177 0x527D # <CJK>
+0x9998 0x5178 0x528D # <CJK>
+0x9999 0x5179 0x5294 # <CJK>
+0x999A 0x517A 0x5292 # <CJK>
+0x999B 0x517B 0x5271 # <CJK>
+0x999C 0x517C 0x5288 # <CJK>
+0x999D 0x517D 0x5291 # <CJK>
+0x999E 0x517E 0x8FA8 # <CJK>
+0x999F 0x5221 0x8FA7 # <CJK>
+0x99A0 0x5222 0x52AC # <CJK>
+0x99A1 0x5223 0x52AD # <CJK>
+0x99A2 0x5224 0x52BC # <CJK>
+0x99A3 0x5225 0x52B5 # <CJK>
+0x99A4 0x5226 0x52C1 # <CJK>
+0x99A5 0x5227 0x52CD # <CJK>
+0x99A6 0x5228 0x52D7 # <CJK>
+0x99A7 0x5229 0x52DE # <CJK>
+0x99A8 0x522A 0x52E3 # <CJK>
+0x99A9 0x522B 0x52E6 # <CJK>
+0x99AA 0x522C 0x98ED # <CJK>
+0x99AB 0x522D 0x52E0 # <CJK>
+0x99AC 0x522E 0x52F3 # <CJK>
+0x99AD 0x522F 0x52F5 # <CJK>
+0x99AE 0x5230 0x52F8 # <CJK>
+0x99AF 0x5231 0x52F9 # <CJK>
+0x99B0 0x5232 0x5306 # <CJK>
+0x99B1 0x5233 0x5308 # <CJK>
+0x99B2 0x5234 0x7538 # <CJK>
+0x99B3 0x5235 0x530D # <CJK>
+0x99B4 0x5236 0x5310 # <CJK>
+0x99B5 0x5237 0x530F # <CJK>
+0x99B6 0x5238 0x5315 # <CJK>
+0x99B7 0x5239 0x531A # <CJK>
+0x99B8 0x523A 0x5323 # <CJK>
+0x99B9 0x523B 0x532F # <CJK>
+0x99BA 0x523C 0x5331 # <CJK>
+0x99BB 0x523D 0x5333 # <CJK>
+0x99BC 0x523E 0x5338 # <CJK>
+0x99BD 0x523F 0x5340 # <CJK>
+0x99BE 0x5240 0x5346 # <CJK>
+0x99BF 0x5241 0x5345 # <CJK>
+0x99C0 0x5242 0x4E17 # <CJK>
+0x99C1 0x5243 0x5349 # <CJK>
+0x99C2 0x5244 0x534D # <CJK>
+0x99C3 0x5245 0x51D6 # <CJK>
+0x99C4 0x5246 0x535E # <CJK>
+0x99C5 0x5247 0x5369 # <CJK>
+0x99C6 0x5248 0x536E # <CJK>
+0x99C7 0x5249 0x5918 # <CJK>
+0x99C8 0x524A 0x537B # <CJK>
+0x99C9 0x524B 0x5377 # <CJK>
+0x99CA 0x524C 0x5382 # <CJK>
+0x99CB 0x524D 0x5396 # <CJK>
+0x99CC 0x524E 0x53A0 # <CJK>
+0x99CD 0x524F 0x53A6 # <CJK>
+0x99CE 0x5250 0x53A5 # <CJK>
+0x99CF 0x5251 0x53AE # <CJK>
+0x99D0 0x5252 0x53B0 # <CJK>
+0x99D1 0x5253 0x53B6 # <CJK>
+0x99D2 0x5254 0x53C3 # <CJK>
+0x99D3 0x5255 0x7C12 # <CJK>
+0x99D4 0x5256 0x96D9 # <CJK>
+0x99D5 0x5257 0x53DF # <CJK>
+0x99D6 0x5258 0x66FC # <CJK>
+0x99D7 0x5259 0x71EE # <CJK>
+0x99D8 0x525A 0x53EE # <CJK>
+0x99D9 0x525B 0x53E8 # <CJK>
+0x99DA 0x525C 0x53ED # <CJK>
+0x99DB 0x525D 0x53FA # <CJK>
+0x99DC 0x525E 0x5401 # <CJK>
+0x99DD 0x525F 0x543D # <CJK>
+0x99DE 0x5260 0x5440 # <CJK>
+0x99DF 0x5261 0x542C # <CJK>
+0x99E0 0x5262 0x542D # <CJK>
+0x99E1 0x5263 0x543C # <CJK>
+0x99E2 0x5264 0x542E # <CJK>
+0x99E3 0x5265 0x5436 # <CJK>
+0x99E4 0x5266 0x5429 # <CJK>
+0x99E5 0x5267 0x541D # <CJK>
+0x99E6 0x5268 0x544E # <CJK>
+0x99E7 0x5269 0x548F # <CJK>
+0x99E8 0x526A 0x5475 # <CJK>
+0x99E9 0x526B 0x548E # <CJK>
+0x99EA 0x526C 0x545F # <CJK>
+0x99EB 0x526D 0x5471 # <CJK>
+0x99EC 0x526E 0x5477 # <CJK>
+0x99ED 0x526F 0x5470 # <CJK>
+0x99EE 0x5270 0x5492 # <CJK>
+0x99EF 0x5271 0x547B # <CJK>
+0x99F0 0x5272 0x5480 # <CJK>
+0x99F1 0x5273 0x5476 # <CJK>
+0x99F2 0x5274 0x5484 # <CJK>
+0x99F3 0x5275 0x5490 # <CJK>
+0x99F4 0x5276 0x5486 # <CJK>
+0x99F5 0x5277 0x54C7 # <CJK>
+0x99F6 0x5278 0x54A2 # <CJK>
+0x99F7 0x5279 0x54B8 # <CJK>
+0x99F8 0x527A 0x54A5 # <CJK>
+0x99F9 0x527B 0x54AC # <CJK>
+0x99FA 0x527C 0x54C4 # <CJK>
+0x99FB 0x527D 0x54C8 # <CJK>
+0x99FC 0x527E 0x54A8 # <CJK>
+0x9A40 0x5321 0x54AB # <CJK>
+0x9A41 0x5322 0x54C2 # <CJK>
+0x9A42 0x5323 0x54A4 # <CJK>
+0x9A43 0x5324 0x54BE # <CJK>
+0x9A44 0x5325 0x54BC # <CJK>
+0x9A45 0x5326 0x54D8 # <CJK>
+0x9A46 0x5327 0x54E5 # <CJK>
+0x9A47 0x5328 0x54E6 # <CJK>
+0x9A48 0x5329 0x550F # <CJK>
+0x9A49 0x532A 0x5514 # <CJK>
+0x9A4A 0x532B 0x54FD # <CJK>
+0x9A4B 0x532C 0x54EE # <CJK>
+0x9A4C 0x532D 0x54ED # <CJK>
+0x9A4D 0x532E 0x54FA # <CJK>
+0x9A4E 0x532F 0x54E2 # <CJK>
+0x9A4F 0x5330 0x5539 # <CJK>
+0x9A50 0x5331 0x5540 # <CJK>
+0x9A51 0x5332 0x5563 # <CJK>
+0x9A52 0x5333 0x554C # <CJK>
+0x9A53 0x5334 0x552E # <CJK>
+0x9A54 0x5335 0x555C # <CJK>
+0x9A55 0x5336 0x5545 # <CJK>
+0x9A56 0x5337 0x5556 # <CJK>
+0x9A57 0x5338 0x5557 # <CJK>
+0x9A58 0x5339 0x5538 # <CJK>
+0x9A59 0x533A 0x5533 # <CJK>
+0x9A5A 0x533B 0x555D # <CJK>
+0x9A5B 0x533C 0x5599 # <CJK>
+0x9A5C 0x533D 0x5580 # <CJK>
+0x9A5D 0x533E 0x54AF # <CJK>
+0x9A5E 0x533F 0x558A # <CJK>
+0x9A5F 0x5340 0x559F # <CJK>
+0x9A60 0x5341 0x557B # <CJK>
+0x9A61 0x5342 0x557E # <CJK>
+0x9A62 0x5343 0x5598 # <CJK>
+0x9A63 0x5344 0x559E # <CJK>
+0x9A64 0x5345 0x55AE # <CJK>
+0x9A65 0x5346 0x557C # <CJK>
+0x9A66 0x5347 0x5583 # <CJK>
+0x9A67 0x5348 0x55A9 # <CJK>
+0x9A68 0x5349 0x5587 # <CJK>
+0x9A69 0x534A 0x55A8 # <CJK>
+0x9A6A 0x534B 0x55DA # <CJK>
+0x9A6B 0x534C 0x55C5 # <CJK>
+0x9A6C 0x534D 0x55DF # <CJK>
+0x9A6D 0x534E 0x55C4 # <CJK>
+0x9A6E 0x534F 0x55DC # <CJK>
+0x9A6F 0x5350 0x55E4 # <CJK>
+0x9A70 0x5351 0x55D4 # <CJK>
+0x9A71 0x5352 0x5614 # <CJK>
+0x9A72 0x5353 0x55F7 # <CJK>
+0x9A73 0x5354 0x5616 # <CJK>
+0x9A74 0x5355 0x55FE # <CJK>
+0x9A75 0x5356 0x55FD # <CJK>
+0x9A76 0x5357 0x561B # <CJK>
+0x9A77 0x5358 0x55F9 # <CJK>
+0x9A78 0x5359 0x564E # <CJK>
+0x9A79 0x535A 0x5650 # <CJK>
+0x9A7A 0x535B 0x71DF # <CJK>
+0x9A7B 0x535C 0x5634 # <CJK>
+0x9A7C 0x535D 0x5636 # <CJK>
+0x9A7D 0x535E 0x5632 # <CJK>
+0x9A7E 0x535F 0x5638 # <CJK>
+0x9A80 0x5360 0x566B # <CJK>
+0x9A81 0x5361 0x5664 # <CJK>
+0x9A82 0x5362 0x562F # <CJK>
+0x9A83 0x5363 0x566C # <CJK>
+0x9A84 0x5364 0x566A # <CJK>
+0x9A85 0x5365 0x5686 # <CJK>
+0x9A86 0x5366 0x5680 # <CJK>
+0x9A87 0x5367 0x568A # <CJK>
+0x9A88 0x5368 0x56A0 # <CJK>
+0x9A89 0x5369 0x5694 # <CJK>
+0x9A8A 0x536A 0x568F # <CJK>
+0x9A8B 0x536B 0x56A5 # <CJK>
+0x9A8C 0x536C 0x56AE # <CJK>
+0x9A8D 0x536D 0x56B6 # <CJK>
+0x9A8E 0x536E 0x56B4 # <CJK>
+0x9A8F 0x536F 0x56C2 # <CJK>
+0x9A90 0x5370 0x56BC # <CJK>
+0x9A91 0x5371 0x56C1 # <CJK>
+0x9A92 0x5372 0x56C3 # <CJK>
+0x9A93 0x5373 0x56C0 # <CJK>
+0x9A94 0x5374 0x56C8 # <CJK>
+0x9A95 0x5375 0x56CE # <CJK>
+0x9A96 0x5376 0x56D1 # <CJK>
+0x9A97 0x5377 0x56D3 # <CJK>
+0x9A98 0x5378 0x56D7 # <CJK>
+0x9A99 0x5379 0x56EE # <CJK>
+0x9A9A 0x537A 0x56F9 # <CJK>
+0x9A9B 0x537B 0x5700 # <CJK>
+0x9A9C 0x537C 0x56FF # <CJK>
+0x9A9D 0x537D 0x5704 # <CJK>
+0x9A9E 0x537E 0x5709 # <CJK>
+0x9A9F 0x5421 0x5708 # <CJK>
+0x9AA0 0x5422 0x570B # <CJK>
+0x9AA1 0x5423 0x570D # <CJK>
+0x9AA2 0x5424 0x5713 # <CJK>
+0x9AA3 0x5425 0x5718 # <CJK>
+0x9AA4 0x5426 0x5716 # <CJK>
+0x9AA5 0x5427 0x55C7 # <CJK>
+0x9AA6 0x5428 0x571C # <CJK>
+0x9AA7 0x5429 0x5726 # <CJK>
+0x9AA8 0x542A 0x5737 # <CJK>
+0x9AA9 0x542B 0x5738 # <CJK>
+0x9AAA 0x542C 0x574E # <CJK>
+0x9AAB 0x542D 0x573B # <CJK>
+0x9AAC 0x542E 0x5740 # <CJK>
+0x9AAD 0x542F 0x574F # <CJK>
+0x9AAE 0x5430 0x5769 # <CJK>
+0x9AAF 0x5431 0x57C0 # <CJK>
+0x9AB0 0x5432 0x5788 # <CJK>
+0x9AB1 0x5433 0x5761 # <CJK>
+0x9AB2 0x5434 0x577F # <CJK>
+0x9AB3 0x5435 0x5789 # <CJK>
+0x9AB4 0x5436 0x5793 # <CJK>
+0x9AB5 0x5437 0x57A0 # <CJK>
+0x9AB6 0x5438 0x57B3 # <CJK>
+0x9AB7 0x5439 0x57A4 # <CJK>
+0x9AB8 0x543A 0x57AA # <CJK>
+0x9AB9 0x543B 0x57B0 # <CJK>
+0x9ABA 0x543C 0x57C3 # <CJK>
+0x9ABB 0x543D 0x57C6 # <CJK>
+0x9ABC 0x543E 0x57D4 # <CJK>
+0x9ABD 0x543F 0x57D2 # <CJK>
+0x9ABE 0x5440 0x57D3 # <CJK>
+0x9ABF 0x5441 0x580A # <CJK>
+0x9AC0 0x5442 0x57D6 # <CJK>
+0x9AC1 0x5443 0x57E3 # <CJK>
+0x9AC2 0x5444 0x580B # <CJK>
+0x9AC3 0x5445 0x5819 # <CJK>
+0x9AC4 0x5446 0x581D # <CJK>
+0x9AC5 0x5447 0x5872 # <CJK>
+0x9AC6 0x5448 0x5821 # <CJK>
+0x9AC7 0x5449 0x5862 # <CJK>
+0x9AC8 0x544A 0x584B # <CJK>
+0x9AC9 0x544B 0x5870 # <CJK>
+0x9ACA 0x544C 0x6BC0 # <CJK>
+0x9ACB 0x544D 0x5852 # <CJK>
+0x9ACC 0x544E 0x583D # <CJK>
+0x9ACD 0x544F 0x5879 # <CJK>
+0x9ACE 0x5450 0x5885 # <CJK>
+0x9ACF 0x5451 0x58B9 # <CJK>
+0x9AD0 0x5452 0x589F # <CJK>
+0x9AD1 0x5453 0x58AB # <CJK>
+0x9AD2 0x5454 0x58BA # <CJK>
+0x9AD3 0x5455 0x58DE # <CJK>
+0x9AD4 0x5456 0x58BB # <CJK>
+0x9AD5 0x5457 0x58B8 # <CJK>
+0x9AD6 0x5458 0x58AE # <CJK>
+0x9AD7 0x5459 0x58C5 # <CJK>
+0x9AD8 0x545A 0x58D3 # <CJK>
+0x9AD9 0x545B 0x58D1 # <CJK>
+0x9ADA 0x545C 0x58D7 # <CJK>
+0x9ADB 0x545D 0x58D9 # <CJK>
+0x9ADC 0x545E 0x58D8 # <CJK>
+0x9ADD 0x545F 0x58E5 # <CJK>
+0x9ADE 0x5460 0x58DC # <CJK>
+0x9ADF 0x5461 0x58E4 # <CJK>
+0x9AE0 0x5462 0x58DF # <CJK>
+0x9AE1 0x5463 0x58EF # <CJK>
+0x9AE2 0x5464 0x58FA # <CJK>
+0x9AE3 0x5465 0x58F9 # <CJK>
+0x9AE4 0x5466 0x58FB # <CJK>
+0x9AE5 0x5467 0x58FC # <CJK>
+0x9AE6 0x5468 0x58FD # <CJK>
+0x9AE7 0x5469 0x5902 # <CJK>
+0x9AE8 0x546A 0x590A # <CJK>
+0x9AE9 0x546B 0x5910 # <CJK>
+0x9AEA 0x546C 0x591B # <CJK>
+0x9AEB 0x546D 0x68A6 # <CJK>
+0x9AEC 0x546E 0x5925 # <CJK>
+0x9AED 0x546F 0x592C # <CJK>
+0x9AEE 0x5470 0x592D # <CJK>
+0x9AEF 0x5471 0x5932 # <CJK>
+0x9AF0 0x5472 0x5938 # <CJK>
+0x9AF1 0x5473 0x593E # <CJK>
+0x9AF2 0x5474 0x7AD2 # <CJK>
+0x9AF3 0x5475 0x5955 # <CJK>
+0x9AF4 0x5476 0x5950 # <CJK>
+0x9AF5 0x5477 0x594E # <CJK>
+0x9AF6 0x5478 0x595A # <CJK>
+0x9AF7 0x5479 0x5958 # <CJK>
+0x9AF8 0x547A 0x5962 # <CJK>
+0x9AF9 0x547B 0x5960 # <CJK>
+0x9AFA 0x547C 0x5967 # <CJK>
+0x9AFB 0x547D 0x596C # <CJK>
+0x9AFC 0x547E 0x5969 # <CJK>
+0x9B40 0x5521 0x5978 # <CJK>
+0x9B41 0x5522 0x5981 # <CJK>
+0x9B42 0x5523 0x599D # <CJK>
+0x9B43 0x5524 0x4F5E # <CJK>
+0x9B44 0x5525 0x4FAB # <CJK>
+0x9B45 0x5526 0x59A3 # <CJK>
+0x9B46 0x5527 0x59B2 # <CJK>
+0x9B47 0x5528 0x59C6 # <CJK>
+0x9B48 0x5529 0x59E8 # <CJK>
+0x9B49 0x552A 0x59DC # <CJK>
+0x9B4A 0x552B 0x598D # <CJK>
+0x9B4B 0x552C 0x59D9 # <CJK>
+0x9B4C 0x552D 0x59DA # <CJK>
+0x9B4D 0x552E 0x5A25 # <CJK>
+0x9B4E 0x552F 0x5A1F # <CJK>
+0x9B4F 0x5530 0x5A11 # <CJK>
+0x9B50 0x5531 0x5A1C # <CJK>
+0x9B51 0x5532 0x5A09 # <CJK>
+0x9B52 0x5533 0x5A1A # <CJK>
+0x9B53 0x5534 0x5A40 # <CJK>
+0x9B54 0x5535 0x5A6C # <CJK>
+0x9B55 0x5536 0x5A49 # <CJK>
+0x9B56 0x5537 0x5A35 # <CJK>
+0x9B57 0x5538 0x5A36 # <CJK>
+0x9B58 0x5539 0x5A62 # <CJK>
+0x9B59 0x553A 0x5A6A # <CJK>
+0x9B5A 0x553B 0x5A9A # <CJK>
+0x9B5B 0x553C 0x5ABC # <CJK>
+0x9B5C 0x553D 0x5ABE # <CJK>
+0x9B5D 0x553E 0x5ACB # <CJK>
+0x9B5E 0x553F 0x5AC2 # <CJK>
+0x9B5F 0x5540 0x5ABD # <CJK>
+0x9B60 0x5541 0x5AE3 # <CJK>
+0x9B61 0x5542 0x5AD7 # <CJK>
+0x9B62 0x5543 0x5AE6 # <CJK>
+0x9B63 0x5544 0x5AE9 # <CJK>
+0x9B64 0x5545 0x5AD6 # <CJK>
+0x9B65 0x5546 0x5AFA # <CJK>
+0x9B66 0x5547 0x5AFB # <CJK>
+0x9B67 0x5548 0x5B0C # <CJK>
+0x9B68 0x5549 0x5B0B # <CJK>
+0x9B69 0x554A 0x5B16 # <CJK>
+0x9B6A 0x554B 0x5B32 # <CJK>
+0x9B6B 0x554C 0x5AD0 # <CJK>
+0x9B6C 0x554D 0x5B2A # <CJK>
+0x9B6D 0x554E 0x5B36 # <CJK>
+0x9B6E 0x554F 0x5B3E # <CJK>
+0x9B6F 0x5550 0x5B43 # <CJK>
+0x9B70 0x5551 0x5B45 # <CJK>
+0x9B71 0x5552 0x5B40 # <CJK>
+0x9B72 0x5553 0x5B51 # <CJK>
+0x9B73 0x5554 0x5B55 # <CJK>
+0x9B74 0x5555 0x5B5A # <CJK>
+0x9B75 0x5556 0x5B5B # <CJK>
+0x9B76 0x5557 0x5B65 # <CJK>
+0x9B77 0x5558 0x5B69 # <CJK>
+0x9B78 0x5559 0x5B70 # <CJK>
+0x9B79 0x555A 0x5B73 # <CJK>
+0x9B7A 0x555B 0x5B75 # <CJK>
+0x9B7B 0x555C 0x5B78 # <CJK>
+0x9B7C 0x555D 0x6588 # <CJK>
+0x9B7D 0x555E 0x5B7A # <CJK>
+0x9B7E 0x555F 0x5B80 # <CJK>
+0x9B80 0x5560 0x5B83 # <CJK>
+0x9B81 0x5561 0x5BA6 # <CJK>
+0x9B82 0x5562 0x5BB8 # <CJK>
+0x9B83 0x5563 0x5BC3 # <CJK>
+0x9B84 0x5564 0x5BC7 # <CJK>
+0x9B85 0x5565 0x5BC9 # <CJK>
+0x9B86 0x5566 0x5BD4 # <CJK>
+0x9B87 0x5567 0x5BD0 # <CJK>
+0x9B88 0x5568 0x5BE4 # <CJK>
+0x9B89 0x5569 0x5BE6 # <CJK>
+0x9B8A 0x556A 0x5BE2 # <CJK>
+0x9B8B 0x556B 0x5BDE # <CJK>
+0x9B8C 0x556C 0x5BE5 # <CJK>
+0x9B8D 0x556D 0x5BEB # <CJK>
+0x9B8E 0x556E 0x5BF0 # <CJK>
+0x9B8F 0x556F 0x5BF6 # <CJK>
+0x9B90 0x5570 0x5BF3 # <CJK>
+0x9B91 0x5571 0x5C05 # <CJK>
+0x9B92 0x5572 0x5C07 # <CJK>
+0x9B93 0x5573 0x5C08 # <CJK>
+0x9B94 0x5574 0x5C0D # <CJK>
+0x9B95 0x5575 0x5C13 # <CJK>
+0x9B96 0x5576 0x5C20 # <CJK>
+0x9B97 0x5577 0x5C22 # <CJK>
+0x9B98 0x5578 0x5C28 # <CJK>
+0x9B99 0x5579 0x5C38 # <CJK>
+0x9B9A 0x557A 0x5C39 # <CJK>
+0x9B9B 0x557B 0x5C41 # <CJK>
+0x9B9C 0x557C 0x5C46 # <CJK>
+0x9B9D 0x557D 0x5C4E # <CJK>
+0x9B9E 0x557E 0x5C53 # <CJK>
+0x9B9F 0x5621 0x5C50 # <CJK>
+0x9BA0 0x5622 0x5C4F # <CJK>
+0x9BA1 0x5623 0x5B71 # <CJK>
+0x9BA2 0x5624 0x5C6C # <CJK>
+0x9BA3 0x5625 0x5C6E # <CJK>
+0x9BA4 0x5626 0x4E62 # <CJK>
+0x9BA5 0x5627 0x5C76 # <CJK>
+0x9BA6 0x5628 0x5C79 # <CJK>
+0x9BA7 0x5629 0x5C8C # <CJK>
+0x9BA8 0x562A 0x5C91 # <CJK>
+0x9BA9 0x562B 0x5C94 # <CJK>
+0x9BAA 0x562C 0x599B # <CJK>
+0x9BAB 0x562D 0x5CAB # <CJK>
+0x9BAC 0x562E 0x5CBB # <CJK>
+0x9BAD 0x562F 0x5CB6 # <CJK>
+0x9BAE 0x5630 0x5CBC # <CJK>
+0x9BAF 0x5631 0x5CB7 # <CJK>
+0x9BB0 0x5632 0x5CC5 # <CJK>
+0x9BB1 0x5633 0x5CBE # <CJK>
+0x9BB2 0x5634 0x5CC7 # <CJK>
+0x9BB3 0x5635 0x5CD9 # <CJK>
+0x9BB4 0x5636 0x5CE9 # <CJK>
+0x9BB5 0x5637 0x5CFD # <CJK>
+0x9BB6 0x5638 0x5CFA # <CJK>
+0x9BB7 0x5639 0x5CED # <CJK>
+0x9BB8 0x563A 0x5D8C # <CJK>
+0x9BB9 0x563B 0x5CEA # <CJK>
+0x9BBA 0x563C 0x5D0B # <CJK>
+0x9BBB 0x563D 0x5D15 # <CJK>
+0x9BBC 0x563E 0x5D17 # <CJK>
+0x9BBD 0x563F 0x5D5C # <CJK>
+0x9BBE 0x5640 0x5D1F # <CJK>
+0x9BBF 0x5641 0x5D1B # <CJK>
+0x9BC0 0x5642 0x5D11 # <CJK>
+0x9BC1 0x5643 0x5D14 # <CJK>
+0x9BC2 0x5644 0x5D22 # <CJK>
+0x9BC3 0x5645 0x5D1A # <CJK>
+0x9BC4 0x5646 0x5D19 # <CJK>
+0x9BC5 0x5647 0x5D18 # <CJK>
+0x9BC6 0x5648 0x5D4C # <CJK>
+0x9BC7 0x5649 0x5D52 # <CJK>
+0x9BC8 0x564A 0x5D4E # <CJK>
+0x9BC9 0x564B 0x5D4B # <CJK>
+0x9BCA 0x564C 0x5D6C # <CJK>
+0x9BCB 0x564D 0x5D73 # <CJK>
+0x9BCC 0x564E 0x5D76 # <CJK>
+0x9BCD 0x564F 0x5D87 # <CJK>
+0x9BCE 0x5650 0x5D84 # <CJK>
+0x9BCF 0x5651 0x5D82 # <CJK>
+0x9BD0 0x5652 0x5DA2 # <CJK>
+0x9BD1 0x5653 0x5D9D # <CJK>
+0x9BD2 0x5654 0x5DAC # <CJK>
+0x9BD3 0x5655 0x5DAE # <CJK>
+0x9BD4 0x5656 0x5DBD # <CJK>
+0x9BD5 0x5657 0x5D90 # <CJK>
+0x9BD6 0x5658 0x5DB7 # <CJK>
+0x9BD7 0x5659 0x5DBC # <CJK>
+0x9BD8 0x565A 0x5DC9 # <CJK>
+0x9BD9 0x565B 0x5DCD # <CJK>
+0x9BDA 0x565C 0x5DD3 # <CJK>
+0x9BDB 0x565D 0x5DD2 # <CJK>
+0x9BDC 0x565E 0x5DD6 # <CJK>
+0x9BDD 0x565F 0x5DDB # <CJK>
+0x9BDE 0x5660 0x5DEB # <CJK>
+0x9BDF 0x5661 0x5DF2 # <CJK>
+0x9BE0 0x5662 0x5DF5 # <CJK>
+0x9BE1 0x5663 0x5E0B # <CJK>
+0x9BE2 0x5664 0x5E1A # <CJK>
+0x9BE3 0x5665 0x5E19 # <CJK>
+0x9BE4 0x5666 0x5E11 # <CJK>
+0x9BE5 0x5667 0x5E1B # <CJK>
+0x9BE6 0x5668 0x5E36 # <CJK>
+0x9BE7 0x5669 0x5E37 # <CJK>
+0x9BE8 0x566A 0x5E44 # <CJK>
+0x9BE9 0x566B 0x5E43 # <CJK>
+0x9BEA 0x566C 0x5E40 # <CJK>
+0x9BEB 0x566D 0x5E4E # <CJK>
+0x9BEC 0x566E 0x5E57 # <CJK>
+0x9BED 0x566F 0x5E54 # <CJK>
+0x9BEE 0x5670 0x5E5F # <CJK>
+0x9BEF 0x5671 0x5E62 # <CJK>
+0x9BF0 0x5672 0x5E64 # <CJK>
+0x9BF1 0x5673 0x5E47 # <CJK>
+0x9BF2 0x5674 0x5E75 # <CJK>
+0x9BF3 0x5675 0x5E76 # <CJK>
+0x9BF4 0x5676 0x5E7A # <CJK>
+0x9BF5 0x5677 0x9EBC # <CJK>
+0x9BF6 0x5678 0x5E7F # <CJK>
+0x9BF7 0x5679 0x5EA0 # <CJK>
+0x9BF8 0x567A 0x5EC1 # <CJK>
+0x9BF9 0x567B 0x5EC2 # <CJK>
+0x9BFA 0x567C 0x5EC8 # <CJK>
+0x9BFB 0x567D 0x5ED0 # <CJK>
+0x9BFC 0x567E 0x5ECF # <CJK>
+0x9C40 0x5721 0x5ED6 # <CJK>
+0x9C41 0x5722 0x5EE3 # <CJK>
+0x9C42 0x5723 0x5EDD # <CJK>
+0x9C43 0x5724 0x5EDA # <CJK>
+0x9C44 0x5725 0x5EDB # <CJK>
+0x9C45 0x5726 0x5EE2 # <CJK>
+0x9C46 0x5727 0x5EE1 # <CJK>
+0x9C47 0x5728 0x5EE8 # <CJK>
+0x9C48 0x5729 0x5EE9 # <CJK>
+0x9C49 0x572A 0x5EEC # <CJK>
+0x9C4A 0x572B 0x5EF1 # <CJK>
+0x9C4B 0x572C 0x5EF3 # <CJK>
+0x9C4C 0x572D 0x5EF0 # <CJK>
+0x9C4D 0x572E 0x5EF4 # <CJK>
+0x9C4E 0x572F 0x5EF8 # <CJK>
+0x9C4F 0x5730 0x5EFE # <CJK>
+0x9C50 0x5731 0x5F03 # <CJK>
+0x9C51 0x5732 0x5F09 # <CJK>
+0x9C52 0x5733 0x5F5D # <CJK>
+0x9C53 0x5734 0x5F5C # <CJK>
+0x9C54 0x5735 0x5F0B # <CJK>
+0x9C55 0x5736 0x5F11 # <CJK>
+0x9C56 0x5737 0x5F16 # <CJK>
+0x9C57 0x5738 0x5F29 # <CJK>
+0x9C58 0x5739 0x5F2D # <CJK>
+0x9C59 0x573A 0x5F38 # <CJK>
+0x9C5A 0x573B 0x5F41 # <CJK>
+0x9C5B 0x573C 0x5F48 # <CJK>
+0x9C5C 0x573D 0x5F4C # <CJK>
+0x9C5D 0x573E 0x5F4E # <CJK>
+0x9C5E 0x573F 0x5F2F # <CJK>
+0x9C5F 0x5740 0x5F51 # <CJK>
+0x9C60 0x5741 0x5F56 # <CJK>
+0x9C61 0x5742 0x5F57 # <CJK>
+0x9C62 0x5743 0x5F59 # <CJK>
+0x9C63 0x5744 0x5F61 # <CJK>
+0x9C64 0x5745 0x5F6D # <CJK>
+0x9C65 0x5746 0x5F73 # <CJK>
+0x9C66 0x5747 0x5F77 # <CJK>
+0x9C67 0x5748 0x5F83 # <CJK>
+0x9C68 0x5749 0x5F82 # <CJK>
+0x9C69 0x574A 0x5F7F # <CJK>
+0x9C6A 0x574B 0x5F8A # <CJK>
+0x9C6B 0x574C 0x5F88 # <CJK>
+0x9C6C 0x574D 0x5F91 # <CJK>
+0x9C6D 0x574E 0x5F87 # <CJK>
+0x9C6E 0x574F 0x5F9E # <CJK>
+0x9C6F 0x5750 0x5F99 # <CJK>
+0x9C70 0x5751 0x5F98 # <CJK>
+0x9C71 0x5752 0x5FA0 # <CJK>
+0x9C72 0x5753 0x5FA8 # <CJK>
+0x9C73 0x5754 0x5FAD # <CJK>
+0x9C74 0x5755 0x5FBC # <CJK>
+0x9C75 0x5756 0x5FD6 # <CJK>
+0x9C76 0x5757 0x5FFB # <CJK>
+0x9C77 0x5758 0x5FE4 # <CJK>
+0x9C78 0x5759 0x5FF8 # <CJK>
+0x9C79 0x575A 0x5FF1 # <CJK>
+0x9C7A 0x575B 0x5FDD # <CJK>
+0x9C7B 0x575C 0x60B3 # <CJK>
+0x9C7C 0x575D 0x5FFF # <CJK>
+0x9C7D 0x575E 0x6021 # <CJK>
+0x9C7E 0x575F 0x6060 # <CJK>
+0x9C80 0x5760 0x6019 # <CJK>
+0x9C81 0x5761 0x6010 # <CJK>
+0x9C82 0x5762 0x6029 # <CJK>
+0x9C83 0x5763 0x600E # <CJK>
+0x9C84 0x5764 0x6031 # <CJK>
+0x9C85 0x5765 0x601B # <CJK>
+0x9C86 0x5766 0x6015 # <CJK>
+0x9C87 0x5767 0x602B # <CJK>
+0x9C88 0x5768 0x6026 # <CJK>
+0x9C89 0x5769 0x600F # <CJK>
+0x9C8A 0x576A 0x603A # <CJK>
+0x9C8B 0x576B 0x605A # <CJK>
+0x9C8C 0x576C 0x6041 # <CJK>
+0x9C8D 0x576D 0x606A # <CJK>
+0x9C8E 0x576E 0x6077 # <CJK>
+0x9C8F 0x576F 0x605F # <CJK>
+0x9C90 0x5770 0x604A # <CJK>
+0x9C91 0x5771 0x6046 # <CJK>
+0x9C92 0x5772 0x604D # <CJK>
+0x9C93 0x5773 0x6063 # <CJK>
+0x9C94 0x5774 0x6043 # <CJK>
+0x9C95 0x5775 0x6064 # <CJK>
+0x9C96 0x5776 0x6042 # <CJK>
+0x9C97 0x5777 0x606C # <CJK>
+0x9C98 0x5778 0x606B # <CJK>
+0x9C99 0x5779 0x6059 # <CJK>
+0x9C9A 0x577A 0x6081 # <CJK>
+0x9C9B 0x577B 0x608D # <CJK>
+0x9C9C 0x577C 0x60E7 # <CJK>
+0x9C9D 0x577D 0x6083 # <CJK>
+0x9C9E 0x577E 0x609A # <CJK>
+0x9C9F 0x5821 0x6084 # <CJK>
+0x9CA0 0x5822 0x609B # <CJK>
+0x9CA1 0x5823 0x6096 # <CJK>
+0x9CA2 0x5824 0x6097 # <CJK>
+0x9CA3 0x5825 0x6092 # <CJK>
+0x9CA4 0x5826 0x60A7 # <CJK>
+0x9CA5 0x5827 0x608B # <CJK>
+0x9CA6 0x5828 0x60E1 # <CJK>
+0x9CA7 0x5829 0x60B8 # <CJK>
+0x9CA8 0x582A 0x60E0 # <CJK>
+0x9CA9 0x582B 0x60D3 # <CJK>
+0x9CAA 0x582C 0x60B4 # <CJK>
+0x9CAB 0x582D 0x5FF0 # <CJK>
+0x9CAC 0x582E 0x60BD # <CJK>
+0x9CAD 0x582F 0x60C6 # <CJK>
+0x9CAE 0x5830 0x60B5 # <CJK>
+0x9CAF 0x5831 0x60D8 # <CJK>
+0x9CB0 0x5832 0x614D # <CJK>
+0x9CB1 0x5833 0x6115 # <CJK>
+0x9CB2 0x5834 0x6106 # <CJK>
+0x9CB3 0x5835 0x60F6 # <CJK>
+0x9CB4 0x5836 0x60F7 # <CJK>
+0x9CB5 0x5837 0x6100 # <CJK>
+0x9CB6 0x5838 0x60F4 # <CJK>
+0x9CB7 0x5839 0x60FA # <CJK>
+0x9CB8 0x583A 0x6103 # <CJK>
+0x9CB9 0x583B 0x6121 # <CJK>
+0x9CBA 0x583C 0x60FB # <CJK>
+0x9CBB 0x583D 0x60F1 # <CJK>
+0x9CBC 0x583E 0x610D # <CJK>
+0x9CBD 0x583F 0x610E # <CJK>
+0x9CBE 0x5840 0x6147 # <CJK>
+0x9CBF 0x5841 0x613E # <CJK>
+0x9CC0 0x5842 0x6128 # <CJK>
+0x9CC1 0x5843 0x6127 # <CJK>
+0x9CC2 0x5844 0x614A # <CJK>
+0x9CC3 0x5845 0x613F # <CJK>
+0x9CC4 0x5846 0x613C # <CJK>
+0x9CC5 0x5847 0x612C # <CJK>
+0x9CC6 0x5848 0x6134 # <CJK>
+0x9CC7 0x5849 0x613D # <CJK>
+0x9CC8 0x584A 0x6142 # <CJK>
+0x9CC9 0x584B 0x6144 # <CJK>
+0x9CCA 0x584C 0x6173 # <CJK>
+0x9CCB 0x584D 0x6177 # <CJK>
+0x9CCC 0x584E 0x6158 # <CJK>
+0x9CCD 0x584F 0x6159 # <CJK>
+0x9CCE 0x5850 0x615A # <CJK>
+0x9CCF 0x5851 0x616B # <CJK>
+0x9CD0 0x5852 0x6174 # <CJK>
+0x9CD1 0x5853 0x616F # <CJK>
+0x9CD2 0x5854 0x6165 # <CJK>
+0x9CD3 0x5855 0x6171 # <CJK>
+0x9CD4 0x5856 0x615F # <CJK>
+0x9CD5 0x5857 0x615D # <CJK>
+0x9CD6 0x5858 0x6153 # <CJK>
+0x9CD7 0x5859 0x6175 # <CJK>
+0x9CD8 0x585A 0x6199 # <CJK>
+0x9CD9 0x585B 0x6196 # <CJK>
+0x9CDA 0x585C 0x6187 # <CJK>
+0x9CDB 0x585D 0x61AC # <CJK>
+0x9CDC 0x585E 0x6194 # <CJK>
+0x9CDD 0x585F 0x619A # <CJK>
+0x9CDE 0x5860 0x618A # <CJK>
+0x9CDF 0x5861 0x6191 # <CJK>
+0x9CE0 0x5862 0x61AB # <CJK>
+0x9CE1 0x5863 0x61AE # <CJK>
+0x9CE2 0x5864 0x61CC # <CJK>
+0x9CE3 0x5865 0x61CA # <CJK>
+0x9CE4 0x5866 0x61C9 # <CJK>
+0x9CE5 0x5867 0x61F7 # <CJK>
+0x9CE6 0x5868 0x61C8 # <CJK>
+0x9CE7 0x5869 0x61C3 # <CJK>
+0x9CE8 0x586A 0x61C6 # <CJK>
+0x9CE9 0x586B 0x61BA # <CJK>
+0x9CEA 0x586C 0x61CB # <CJK>
+0x9CEB 0x586D 0x7F79 # <CJK>
+0x9CEC 0x586E 0x61CD # <CJK>
+0x9CED 0x586F 0x61E6 # <CJK>
+0x9CEE 0x5870 0x61E3 # <CJK>
+0x9CEF 0x5871 0x61F6 # <CJK>
+0x9CF0 0x5872 0x61FA # <CJK>
+0x9CF1 0x5873 0x61F4 # <CJK>
+0x9CF2 0x5874 0x61FF # <CJK>
+0x9CF3 0x5875 0x61FD # <CJK>
+0x9CF4 0x5876 0x61FC # <CJK>
+0x9CF5 0x5877 0x61FE # <CJK>
+0x9CF6 0x5878 0x6200 # <CJK>
+0x9CF7 0x5879 0x6208 # <CJK>
+0x9CF8 0x587A 0x6209 # <CJK>
+0x9CF9 0x587B 0x620D # <CJK>
+0x9CFA 0x587C 0x620C # <CJK>
+0x9CFB 0x587D 0x6214 # <CJK>
+0x9CFC 0x587E 0x621B # <CJK>
+0x9D40 0x5921 0x621E # <CJK>
+0x9D41 0x5922 0x6221 # <CJK>
+0x9D42 0x5923 0x622A # <CJK>
+0x9D43 0x5924 0x622E # <CJK>
+0x9D44 0x5925 0x6230 # <CJK>
+0x9D45 0x5926 0x6232 # <CJK>
+0x9D46 0x5927 0x6233 # <CJK>
+0x9D47 0x5928 0x6241 # <CJK>
+0x9D48 0x5929 0x624E # <CJK>
+0x9D49 0x592A 0x625E # <CJK>
+0x9D4A 0x592B 0x6263 # <CJK>
+0x9D4B 0x592C 0x625B # <CJK>
+0x9D4C 0x592D 0x6260 # <CJK>
+0x9D4D 0x592E 0x6268 # <CJK>
+0x9D4E 0x592F 0x627C # <CJK>
+0x9D4F 0x5930 0x6282 # <CJK>
+0x9D50 0x5931 0x6289 # <CJK>
+0x9D51 0x5932 0x627E # <CJK>
+0x9D52 0x5933 0x6292 # <CJK>
+0x9D53 0x5934 0x6293 # <CJK>
+0x9D54 0x5935 0x6296 # <CJK>
+0x9D55 0x5936 0x62D4 # <CJK>
+0x9D56 0x5937 0x6283 # <CJK>
+0x9D57 0x5938 0x6294 # <CJK>
+0x9D58 0x5939 0x62D7 # <CJK>
+0x9D59 0x593A 0x62D1 # <CJK>
+0x9D5A 0x593B 0x62BB # <CJK>
+0x9D5B 0x593C 0x62CF # <CJK>
+0x9D5C 0x593D 0x62FF # <CJK>
+0x9D5D 0x593E 0x62C6 # <CJK>
+0x9D5E 0x593F 0x64D4 # <CJK>
+0x9D5F 0x5940 0x62C8 # <CJK>
+0x9D60 0x5941 0x62DC # <CJK>
+0x9D61 0x5942 0x62CC # <CJK>
+0x9D62 0x5943 0x62CA # <CJK>
+0x9D63 0x5944 0x62C2 # <CJK>
+0x9D64 0x5945 0x62C7 # <CJK>
+0x9D65 0x5946 0x629B # <CJK>
+0x9D66 0x5947 0x62C9 # <CJK>
+0x9D67 0x5948 0x630C # <CJK>
+0x9D68 0x5949 0x62EE # <CJK>
+0x9D69 0x594A 0x62F1 # <CJK>
+0x9D6A 0x594B 0x6327 # <CJK>
+0x9D6B 0x594C 0x6302 # <CJK>
+0x9D6C 0x594D 0x6308 # <CJK>
+0x9D6D 0x594E 0x62EF # <CJK>
+0x9D6E 0x594F 0x62F5 # <CJK>
+0x9D6F 0x5950 0x6350 # <CJK>
+0x9D70 0x5951 0x633E # <CJK>
+0x9D71 0x5952 0x634D # <CJK>
+0x9D72 0x5953 0x641C # <CJK>
+0x9D73 0x5954 0x634F # <CJK>
+0x9D74 0x5955 0x6396 # <CJK>
+0x9D75 0x5956 0x638E # <CJK>
+0x9D76 0x5957 0x6380 # <CJK>
+0x9D77 0x5958 0x63AB # <CJK>
+0x9D78 0x5959 0x6376 # <CJK>
+0x9D79 0x595A 0x63A3 # <CJK>
+0x9D7A 0x595B 0x638F # <CJK>
+0x9D7B 0x595C 0x6389 # <CJK>
+0x9D7C 0x595D 0x639F # <CJK>
+0x9D7D 0x595E 0x63B5 # <CJK>
+0x9D7E 0x595F 0x636B # <CJK>
+0x9D80 0x5960 0x6369 # <CJK>
+0x9D81 0x5961 0x63BE # <CJK>
+0x9D82 0x5962 0x63E9 # <CJK>
+0x9D83 0x5963 0x63C0 # <CJK>
+0x9D84 0x5964 0x63C6 # <CJK>
+0x9D85 0x5965 0x63E3 # <CJK>
+0x9D86 0x5966 0x63C9 # <CJK>
+0x9D87 0x5967 0x63D2 # <CJK>
+0x9D88 0x5968 0x63F6 # <CJK>
+0x9D89 0x5969 0x63C4 # <CJK>
+0x9D8A 0x596A 0x6416 # <CJK>
+0x9D8B 0x596B 0x6434 # <CJK>
+0x9D8C 0x596C 0x6406 # <CJK>
+0x9D8D 0x596D 0x6413 # <CJK>
+0x9D8E 0x596E 0x6426 # <CJK>
+0x9D8F 0x596F 0x6436 # <CJK>
+0x9D90 0x5970 0x651D # <CJK>
+0x9D91 0x5971 0x6417 # <CJK>
+0x9D92 0x5972 0x6428 # <CJK>
+0x9D93 0x5973 0x640F # <CJK>
+0x9D94 0x5974 0x6467 # <CJK>
+0x9D95 0x5975 0x646F # <CJK>
+0x9D96 0x5976 0x6476 # <CJK>
+0x9D97 0x5977 0x644E # <CJK>
+0x9D98 0x5978 0x652A # <CJK>
+0x9D99 0x5979 0x6495 # <CJK>
+0x9D9A 0x597A 0x6493 # <CJK>
+0x9D9B 0x597B 0x64A5 # <CJK>
+0x9D9C 0x597C 0x64A9 # <CJK>
+0x9D9D 0x597D 0x6488 # <CJK>
+0x9D9E 0x597E 0x64BC # <CJK>
+0x9D9F 0x5A21 0x64DA # <CJK>
+0x9DA0 0x5A22 0x64D2 # <CJK>
+0x9DA1 0x5A23 0x64C5 # <CJK>
+0x9DA2 0x5A24 0x64C7 # <CJK>
+0x9DA3 0x5A25 0x64BB # <CJK>
+0x9DA4 0x5A26 0x64D8 # <CJK>
+0x9DA5 0x5A27 0x64C2 # <CJK>
+0x9DA6 0x5A28 0x64F1 # <CJK>
+0x9DA7 0x5A29 0x64E7 # <CJK>
+0x9DA8 0x5A2A 0x8209 # <CJK>
+0x9DA9 0x5A2B 0x64E0 # <CJK>
+0x9DAA 0x5A2C 0x64E1 # <CJK>
+0x9DAB 0x5A2D 0x62AC # <CJK>
+0x9DAC 0x5A2E 0x64E3 # <CJK>
+0x9DAD 0x5A2F 0x64EF # <CJK>
+0x9DAE 0x5A30 0x652C # <CJK>
+0x9DAF 0x5A31 0x64F6 # <CJK>
+0x9DB0 0x5A32 0x64F4 # <CJK>
+0x9DB1 0x5A33 0x64F2 # <CJK>
+0x9DB2 0x5A34 0x64FA # <CJK>
+0x9DB3 0x5A35 0x6500 # <CJK>
+0x9DB4 0x5A36 0x64FD # <CJK>
+0x9DB5 0x5A37 0x6518 # <CJK>
+0x9DB6 0x5A38 0x651C # <CJK>
+0x9DB7 0x5A39 0x6505 # <CJK>
+0x9DB8 0x5A3A 0x6524 # <CJK>
+0x9DB9 0x5A3B 0x6523 # <CJK>
+0x9DBA 0x5A3C 0x652B # <CJK>
+0x9DBB 0x5A3D 0x6534 # <CJK>
+0x9DBC 0x5A3E 0x6535 # <CJK>
+0x9DBD 0x5A3F 0x6537 # <CJK>
+0x9DBE 0x5A40 0x6536 # <CJK>
+0x9DBF 0x5A41 0x6538 # <CJK>
+0x9DC0 0x5A42 0x754B # <CJK>
+0x9DC1 0x5A43 0x6548 # <CJK>
+0x9DC2 0x5A44 0x6556 # <CJK>
+0x9DC3 0x5A45 0x6555 # <CJK>
+0x9DC4 0x5A46 0x654D # <CJK>
+0x9DC5 0x5A47 0x6558 # <CJK>
+0x9DC6 0x5A48 0x655E # <CJK>
+0x9DC7 0x5A49 0x655D # <CJK>
+0x9DC8 0x5A4A 0x6572 # <CJK>
+0x9DC9 0x5A4B 0x6578 # <CJK>
+0x9DCA 0x5A4C 0x6582 # <CJK>
+0x9DCB 0x5A4D 0x6583 # <CJK>
+0x9DCC 0x5A4E 0x8B8A # <CJK>
+0x9DCD 0x5A4F 0x659B # <CJK>
+0x9DCE 0x5A50 0x659F # <CJK>
+0x9DCF 0x5A51 0x65AB # <CJK>
+0x9DD0 0x5A52 0x65B7 # <CJK>
+0x9DD1 0x5A53 0x65C3 # <CJK>
+0x9DD2 0x5A54 0x65C6 # <CJK>
+0x9DD3 0x5A55 0x65C1 # <CJK>
+0x9DD4 0x5A56 0x65C4 # <CJK>
+0x9DD5 0x5A57 0x65CC # <CJK>
+0x9DD6 0x5A58 0x65D2 # <CJK>
+0x9DD7 0x5A59 0x65DB # <CJK>
+0x9DD8 0x5A5A 0x65D9 # <CJK>
+0x9DD9 0x5A5B 0x65E0 # <CJK>
+0x9DDA 0x5A5C 0x65E1 # <CJK>
+0x9DDB 0x5A5D 0x65F1 # <CJK>
+0x9DDC 0x5A5E 0x6772 # <CJK>
+0x9DDD 0x5A5F 0x660A # <CJK>
+0x9DDE 0x5A60 0x6603 # <CJK>
+0x9DDF 0x5A61 0x65FB # <CJK>
+0x9DE0 0x5A62 0x6773 # <CJK>
+0x9DE1 0x5A63 0x6635 # <CJK>
+0x9DE2 0x5A64 0x6636 # <CJK>
+0x9DE3 0x5A65 0x6634 # <CJK>
+0x9DE4 0x5A66 0x661C # <CJK>
+0x9DE5 0x5A67 0x664F # <CJK>
+0x9DE6 0x5A68 0x6644 # <CJK>
+0x9DE7 0x5A69 0x6649 # <CJK>
+0x9DE8 0x5A6A 0x6641 # <CJK>
+0x9DE9 0x5A6B 0x665E # <CJK>
+0x9DEA 0x5A6C 0x665D # <CJK>
+0x9DEB 0x5A6D 0x6664 # <CJK>
+0x9DEC 0x5A6E 0x6667 # <CJK>
+0x9DED 0x5A6F 0x6668 # <CJK>
+0x9DEE 0x5A70 0x665F # <CJK>
+0x9DEF 0x5A71 0x6662 # <CJK>
+0x9DF0 0x5A72 0x6670 # <CJK>
+0x9DF1 0x5A73 0x6683 # <CJK>
+0x9DF2 0x5A74 0x6688 # <CJK>
+0x9DF3 0x5A75 0x668E # <CJK>
+0x9DF4 0x5A76 0x6689 # <CJK>
+0x9DF5 0x5A77 0x6684 # <CJK>
+0x9DF6 0x5A78 0x6698 # <CJK>
+0x9DF7 0x5A79 0x669D # <CJK>
+0x9DF8 0x5A7A 0x66C1 # <CJK>
+0x9DF9 0x5A7B 0x66B9 # <CJK>
+0x9DFA 0x5A7C 0x66C9 # <CJK>
+0x9DFB 0x5A7D 0x66BE # <CJK>
+0x9DFC 0x5A7E 0x66BC # <CJK>
+0x9E40 0x5B21 0x66C4 # <CJK>
+0x9E41 0x5B22 0x66B8 # <CJK>
+0x9E42 0x5B23 0x66D6 # <CJK>
+0x9E43 0x5B24 0x66DA # <CJK>
+0x9E44 0x5B25 0x66E0 # <CJK>
+0x9E45 0x5B26 0x663F # <CJK>
+0x9E46 0x5B27 0x66E6 # <CJK>
+0x9E47 0x5B28 0x66E9 # <CJK>
+0x9E48 0x5B29 0x66F0 # <CJK>
+0x9E49 0x5B2A 0x66F5 # <CJK>
+0x9E4A 0x5B2B 0x66F7 # <CJK>
+0x9E4B 0x5B2C 0x670F # <CJK>
+0x9E4C 0x5B2D 0x6716 # <CJK>
+0x9E4D 0x5B2E 0x671E # <CJK>
+0x9E4E 0x5B2F 0x6726 # <CJK>
+0x9E4F 0x5B30 0x6727 # <CJK>
+0x9E50 0x5B31 0x9738 # <CJK>
+0x9E51 0x5B32 0x672E # <CJK>
+0x9E52 0x5B33 0x673F # <CJK>
+0x9E53 0x5B34 0x6736 # <CJK>
+0x9E54 0x5B35 0x6741 # <CJK>
+0x9E55 0x5B36 0x6738 # <CJK>
+0x9E56 0x5B37 0x6737 # <CJK>
+0x9E57 0x5B38 0x6746 # <CJK>
+0x9E58 0x5B39 0x675E # <CJK>
+0x9E59 0x5B3A 0x6760 # <CJK>
+0x9E5A 0x5B3B 0x6759 # <CJK>
+0x9E5B 0x5B3C 0x6763 # <CJK>
+0x9E5C 0x5B3D 0x6764 # <CJK>
+0x9E5D 0x5B3E 0x6789 # <CJK>
+0x9E5E 0x5B3F 0x6770 # <CJK>
+0x9E5F 0x5B40 0x67A9 # <CJK>
+0x9E60 0x5B41 0x677C # <CJK>
+0x9E61 0x5B42 0x676A # <CJK>
+0x9E62 0x5B43 0x678C # <CJK>
+0x9E63 0x5B44 0x678B # <CJK>
+0x9E64 0x5B45 0x67A6 # <CJK>
+0x9E65 0x5B46 0x67A1 # <CJK>
+0x9E66 0x5B47 0x6785 # <CJK>
+0x9E67 0x5B48 0x67B7 # <CJK>
+0x9E68 0x5B49 0x67EF # <CJK>
+0x9E69 0x5B4A 0x67B4 # <CJK>
+0x9E6A 0x5B4B 0x67EC # <CJK>
+0x9E6B 0x5B4C 0x67B3 # <CJK>
+0x9E6C 0x5B4D 0x67E9 # <CJK>
+0x9E6D 0x5B4E 0x67B8 # <CJK>
+0x9E6E 0x5B4F 0x67E4 # <CJK>
+0x9E6F 0x5B50 0x67DE # <CJK>
+0x9E70 0x5B51 0x67DD # <CJK>
+0x9E71 0x5B52 0x67E2 # <CJK>
+0x9E72 0x5B53 0x67EE # <CJK>
+0x9E73 0x5B54 0x67B9 # <CJK>
+0x9E74 0x5B55 0x67CE # <CJK>
+0x9E75 0x5B56 0x67C6 # <CJK>
+0x9E76 0x5B57 0x67E7 # <CJK>
+0x9E77 0x5B58 0x6A9C # <CJK>
+0x9E78 0x5B59 0x681E # <CJK>
+0x9E79 0x5B5A 0x6846 # <CJK>
+0x9E7A 0x5B5B 0x6829 # <CJK>
+0x9E7B 0x5B5C 0x6840 # <CJK>
+0x9E7C 0x5B5D 0x684D # <CJK>
+0x9E7D 0x5B5E 0x6832 # <CJK>
+0x9E7E 0x5B5F 0x684E # <CJK>
+0x9E80 0x5B60 0x68B3 # <CJK>
+0x9E81 0x5B61 0x682B # <CJK>
+0x9E82 0x5B62 0x6859 # <CJK>
+0x9E83 0x5B63 0x6863 # <CJK>
+0x9E84 0x5B64 0x6877 # <CJK>
+0x9E85 0x5B65 0x687F # <CJK>
+0x9E86 0x5B66 0x689F # <CJK>
+0x9E87 0x5B67 0x688F # <CJK>
+0x9E88 0x5B68 0x68AD # <CJK>
+0x9E89 0x5B69 0x6894 # <CJK>
+0x9E8A 0x5B6A 0x689D # <CJK>
+0x9E8B 0x5B6B 0x689B # <CJK>
+0x9E8C 0x5B6C 0x6883 # <CJK>
+0x9E8D 0x5B6D 0x6AAE # <CJK>
+0x9E8E 0x5B6E 0x68B9 # <CJK>
+0x9E8F 0x5B6F 0x6874 # <CJK>
+0x9E90 0x5B70 0x68B5 # <CJK>
+0x9E91 0x5B71 0x68A0 # <CJK>
+0x9E92 0x5B72 0x68BA # <CJK>
+0x9E93 0x5B73 0x690F # <CJK>
+0x9E94 0x5B74 0x688D # <CJK>
+0x9E95 0x5B75 0x687E # <CJK>
+0x9E96 0x5B76 0x6901 # <CJK>
+0x9E97 0x5B77 0x68CA # <CJK>
+0x9E98 0x5B78 0x6908 # <CJK>
+0x9E99 0x5B79 0x68D8 # <CJK>
+0x9E9A 0x5B7A 0x6922 # <CJK>
+0x9E9B 0x5B7B 0x6926 # <CJK>
+0x9E9C 0x5B7C 0x68E1 # <CJK>
+0x9E9D 0x5B7D 0x690C # <CJK>
+0x9E9E 0x5B7E 0x68CD # <CJK>
+0x9E9F 0x5C21 0x68D4 # <CJK>
+0x9EA0 0x5C22 0x68E7 # <CJK>
+0x9EA1 0x5C23 0x68D5 # <CJK>
+0x9EA2 0x5C24 0x6936 # <CJK>
+0x9EA3 0x5C25 0x6912 # <CJK>
+0x9EA4 0x5C26 0x6904 # <CJK>
+0x9EA5 0x5C27 0x68D7 # <CJK>
+0x9EA6 0x5C28 0x68E3 # <CJK>
+0x9EA7 0x5C29 0x6925 # <CJK>
+0x9EA8 0x5C2A 0x68F9 # <CJK>
+0x9EA9 0x5C2B 0x68E0 # <CJK>
+0x9EAA 0x5C2C 0x68EF # <CJK>
+0x9EAB 0x5C2D 0x6928 # <CJK>
+0x9EAC 0x5C2E 0x692A # <CJK>
+0x9EAD 0x5C2F 0x691A # <CJK>
+0x9EAE 0x5C30 0x6923 # <CJK>
+0x9EAF 0x5C31 0x6921 # <CJK>
+0x9EB0 0x5C32 0x68C6 # <CJK>
+0x9EB1 0x5C33 0x6979 # <CJK>
+0x9EB2 0x5C34 0x6977 # <CJK>
+0x9EB3 0x5C35 0x695C # <CJK>
+0x9EB4 0x5C36 0x6978 # <CJK>
+0x9EB5 0x5C37 0x696B # <CJK>
+0x9EB6 0x5C38 0x6954 # <CJK>
+0x9EB7 0x5C39 0x697E # <CJK>
+0x9EB8 0x5C3A 0x696E # <CJK>
+0x9EB9 0x5C3B 0x6939 # <CJK>
+0x9EBA 0x5C3C 0x6974 # <CJK>
+0x9EBB 0x5C3D 0x693D # <CJK>
+0x9EBC 0x5C3E 0x6959 # <CJK>
+0x9EBD 0x5C3F 0x6930 # <CJK>
+0x9EBE 0x5C40 0x6961 # <CJK>
+0x9EBF 0x5C41 0x695E # <CJK>
+0x9EC0 0x5C42 0x695D # <CJK>
+0x9EC1 0x5C43 0x6981 # <CJK>
+0x9EC2 0x5C44 0x696A # <CJK>
+0x9EC3 0x5C45 0x69B2 # <CJK>
+0x9EC4 0x5C46 0x69AE # <CJK>
+0x9EC5 0x5C47 0x69D0 # <CJK>
+0x9EC6 0x5C48 0x69BF # <CJK>
+0x9EC7 0x5C49 0x69C1 # <CJK>
+0x9EC8 0x5C4A 0x69D3 # <CJK>
+0x9EC9 0x5C4B 0x69BE # <CJK>
+0x9ECA 0x5C4C 0x69CE # <CJK>
+0x9ECB 0x5C4D 0x5BE8 # <CJK>
+0x9ECC 0x5C4E 0x69CA # <CJK>
+0x9ECD 0x5C4F 0x69DD # <CJK>
+0x9ECE 0x5C50 0x69BB # <CJK>
+0x9ECF 0x5C51 0x69C3 # <CJK>
+0x9ED0 0x5C52 0x69A7 # <CJK>
+0x9ED1 0x5C53 0x6A2E # <CJK>
+0x9ED2 0x5C54 0x6991 # <CJK>
+0x9ED3 0x5C55 0x69A0 # <CJK>
+0x9ED4 0x5C56 0x699C # <CJK>
+0x9ED5 0x5C57 0x6995 # <CJK>
+0x9ED6 0x5C58 0x69B4 # <CJK>
+0x9ED7 0x5C59 0x69DE # <CJK>
+0x9ED8 0x5C5A 0x69E8 # <CJK>
+0x9ED9 0x5C5B 0x6A02 # <CJK>
+0x9EDA 0x5C5C 0x6A1B # <CJK>
+0x9EDB 0x5C5D 0x69FF # <CJK>
+0x9EDC 0x5C5E 0x6B0A # <CJK>
+0x9EDD 0x5C5F 0x69F9 # <CJK>
+0x9EDE 0x5C60 0x69F2 # <CJK>
+0x9EDF 0x5C61 0x69E7 # <CJK>
+0x9EE0 0x5C62 0x6A05 # <CJK>
+0x9EE1 0x5C63 0x69B1 # <CJK>
+0x9EE2 0x5C64 0x6A1E # <CJK>
+0x9EE3 0x5C65 0x69ED # <CJK>
+0x9EE4 0x5C66 0x6A14 # <CJK>
+0x9EE5 0x5C67 0x69EB # <CJK>
+0x9EE6 0x5C68 0x6A0A # <CJK>
+0x9EE7 0x5C69 0x6A12 # <CJK>
+0x9EE8 0x5C6A 0x6AC1 # <CJK>
+0x9EE9 0x5C6B 0x6A23 # <CJK>
+0x9EEA 0x5C6C 0x6A13 # <CJK>
+0x9EEB 0x5C6D 0x6A44 # <CJK>
+0x9EEC 0x5C6E 0x6A0C # <CJK>
+0x9EED 0x5C6F 0x6A72 # <CJK>
+0x9EEE 0x5C70 0x6A36 # <CJK>
+0x9EEF 0x5C71 0x6A78 # <CJK>
+0x9EF0 0x5C72 0x6A47 # <CJK>
+0x9EF1 0x5C73 0x6A62 # <CJK>
+0x9EF2 0x5C74 0x6A59 # <CJK>
+0x9EF3 0x5C75 0x6A66 # <CJK>
+0x9EF4 0x5C76 0x6A48 # <CJK>
+0x9EF5 0x5C77 0x6A38 # <CJK>
+0x9EF6 0x5C78 0x6A22 # <CJK>
+0x9EF7 0x5C79 0x6A90 # <CJK>
+0x9EF8 0x5C7A 0x6A8D # <CJK>
+0x9EF9 0x5C7B 0x6AA0 # <CJK>
+0x9EFA 0x5C7C 0x6A84 # <CJK>
+0x9EFB 0x5C7D 0x6AA2 # <CJK>
+0x9EFC 0x5C7E 0x6AA3 # <CJK>
+0x9F40 0x5D21 0x6A97 # <CJK>
+0x9F41 0x5D22 0x8617 # <CJK>
+0x9F42 0x5D23 0x6ABB # <CJK>
+0x9F43 0x5D24 0x6AC3 # <CJK>
+0x9F44 0x5D25 0x6AC2 # <CJK>
+0x9F45 0x5D26 0x6AB8 # <CJK>
+0x9F46 0x5D27 0x6AB3 # <CJK>
+0x9F47 0x5D28 0x6AAC # <CJK>
+0x9F48 0x5D29 0x6ADE # <CJK>
+0x9F49 0x5D2A 0x6AD1 # <CJK>
+0x9F4A 0x5D2B 0x6ADF # <CJK>
+0x9F4B 0x5D2C 0x6AAA # <CJK>
+0x9F4C 0x5D2D 0x6ADA # <CJK>
+0x9F4D 0x5D2E 0x6AEA # <CJK>
+0x9F4E 0x5D2F 0x6AFB # <CJK>
+0x9F4F 0x5D30 0x6B05 # <CJK>
+0x9F50 0x5D31 0x8616 # <CJK>
+0x9F51 0x5D32 0x6AFA # <CJK>
+0x9F52 0x5D33 0x6B12 # <CJK>
+0x9F53 0x5D34 0x6B16 # <CJK>
+0x9F54 0x5D35 0x9B31 # <CJK>
+0x9F55 0x5D36 0x6B1F # <CJK>
+0x9F56 0x5D37 0x6B38 # <CJK>
+0x9F57 0x5D38 0x6B37 # <CJK>
+0x9F58 0x5D39 0x76DC # <CJK>
+0x9F59 0x5D3A 0x6B39 # <CJK>
+0x9F5A 0x5D3B 0x98EE # <CJK>
+0x9F5B 0x5D3C 0x6B47 # <CJK>
+0x9F5C 0x5D3D 0x6B43 # <CJK>
+0x9F5D 0x5D3E 0x6B49 # <CJK>
+0x9F5E 0x5D3F 0x6B50 # <CJK>
+0x9F5F 0x5D40 0x6B59 # <CJK>
+0x9F60 0x5D41 0x6B54 # <CJK>
+0x9F61 0x5D42 0x6B5B # <CJK>
+0x9F62 0x5D43 0x6B5F # <CJK>
+0x9F63 0x5D44 0x6B61 # <CJK>
+0x9F64 0x5D45 0x6B78 # <CJK>
+0x9F65 0x5D46 0x6B79 # <CJK>
+0x9F66 0x5D47 0x6B7F # <CJK>
+0x9F67 0x5D48 0x6B80 # <CJK>
+0x9F68 0x5D49 0x6B84 # <CJK>
+0x9F69 0x5D4A 0x6B83 # <CJK>
+0x9F6A 0x5D4B 0x6B8D # <CJK>
+0x9F6B 0x5D4C 0x6B98 # <CJK>
+0x9F6C 0x5D4D 0x6B95 # <CJK>
+0x9F6D 0x5D4E 0x6B9E # <CJK>
+0x9F6E 0x5D4F 0x6BA4 # <CJK>
+0x9F6F 0x5D50 0x6BAA # <CJK>
+0x9F70 0x5D51 0x6BAB # <CJK>
+0x9F71 0x5D52 0x6BAF # <CJK>
+0x9F72 0x5D53 0x6BB2 # <CJK>
+0x9F73 0x5D54 0x6BB1 # <CJK>
+0x9F74 0x5D55 0x6BB3 # <CJK>
+0x9F75 0x5D56 0x6BB7 # <CJK>
+0x9F76 0x5D57 0x6BBC # <CJK>
+0x9F77 0x5D58 0x6BC6 # <CJK>
+0x9F78 0x5D59 0x6BCB # <CJK>
+0x9F79 0x5D5A 0x6BD3 # <CJK>
+0x9F7A 0x5D5B 0x6BDF # <CJK>
+0x9F7B 0x5D5C 0x6BEC # <CJK>
+0x9F7C 0x5D5D 0x6BEB # <CJK>
+0x9F7D 0x5D5E 0x6BF3 # <CJK>
+0x9F7E 0x5D5F 0x6BEF # <CJK>
+0x9F80 0x5D60 0x9EBE # <CJK>
+0x9F81 0x5D61 0x6C08 # <CJK>
+0x9F82 0x5D62 0x6C13 # <CJK>
+0x9F83 0x5D63 0x6C14 # <CJK>
+0x9F84 0x5D64 0x6C1B # <CJK>
+0x9F85 0x5D65 0x6C24 # <CJK>
+0x9F86 0x5D66 0x6C23 # <CJK>
+0x9F87 0x5D67 0x6C5E # <CJK>
+0x9F88 0x5D68 0x6C55 # <CJK>
+0x9F89 0x5D69 0x6C62 # <CJK>
+0x9F8A 0x5D6A 0x6C6A # <CJK>
+0x9F8B 0x5D6B 0x6C82 # <CJK>
+0x9F8C 0x5D6C 0x6C8D # <CJK>
+0x9F8D 0x5D6D 0x6C9A # <CJK>
+0x9F8E 0x5D6E 0x6C81 # <CJK>
+0x9F8F 0x5D6F 0x6C9B # <CJK>
+0x9F90 0x5D70 0x6C7E # <CJK>
+0x9F91 0x5D71 0x6C68 # <CJK>
+0x9F92 0x5D72 0x6C73 # <CJK>
+0x9F93 0x5D73 0x6C92 # <CJK>
+0x9F94 0x5D74 0x6C90 # <CJK>
+0x9F95 0x5D75 0x6CC4 # <CJK>
+0x9F96 0x5D76 0x6CF1 # <CJK>
+0x9F97 0x5D77 0x6CD3 # <CJK>
+0x9F98 0x5D78 0x6CBD # <CJK>
+0x9F99 0x5D79 0x6CD7 # <CJK>
+0x9F9A 0x5D7A 0x6CC5 # <CJK>
+0x9F9B 0x5D7B 0x6CDD # <CJK>
+0x9F9C 0x5D7C 0x6CAE # <CJK>
+0x9F9D 0x5D7D 0x6CB1 # <CJK>
+0x9F9E 0x5D7E 0x6CBE # <CJK>
+0x9F9F 0x5E21 0x6CBA # <CJK>
+0x9FA0 0x5E22 0x6CDB # <CJK>
+0x9FA1 0x5E23 0x6CEF # <CJK>
+0x9FA2 0x5E24 0x6CD9 # <CJK>
+0x9FA3 0x5E25 0x6CEA # <CJK>
+0x9FA4 0x5E26 0x6D1F # <CJK>
+0x9FA5 0x5E27 0x884D # <CJK>
+0x9FA6 0x5E28 0x6D36 # <CJK>
+0x9FA7 0x5E29 0x6D2B # <CJK>
+0x9FA8 0x5E2A 0x6D3D # <CJK>
+0x9FA9 0x5E2B 0x6D38 # <CJK>
+0x9FAA 0x5E2C 0x6D19 # <CJK>
+0x9FAB 0x5E2D 0x6D35 # <CJK>
+0x9FAC 0x5E2E 0x6D33 # <CJK>
+0x9FAD 0x5E2F 0x6D12 # <CJK>
+0x9FAE 0x5E30 0x6D0C # <CJK>
+0x9FAF 0x5E31 0x6D63 # <CJK>
+0x9FB0 0x5E32 0x6D93 # <CJK>
+0x9FB1 0x5E33 0x6D64 # <CJK>
+0x9FB2 0x5E34 0x6D5A # <CJK>
+0x9FB3 0x5E35 0x6D79 # <CJK>
+0x9FB4 0x5E36 0x6D59 # <CJK>
+0x9FB5 0x5E37 0x6D8E # <CJK>
+0x9FB6 0x5E38 0x6D95 # <CJK>
+0x9FB7 0x5E39 0x6FE4 # <CJK>
+0x9FB8 0x5E3A 0x6D85 # <CJK>
+0x9FB9 0x5E3B 0x6DF9 # <CJK>
+0x9FBA 0x5E3C 0x6E15 # <CJK>
+0x9FBB 0x5E3D 0x6E0A # <CJK>
+0x9FBC 0x5E3E 0x6DB5 # <CJK>
+0x9FBD 0x5E3F 0x6DC7 # <CJK>
+0x9FBE 0x5E40 0x6DE6 # <CJK>
+0x9FBF 0x5E41 0x6DB8 # <CJK>
+0x9FC0 0x5E42 0x6DC6 # <CJK>
+0x9FC1 0x5E43 0x6DEC # <CJK>
+0x9FC2 0x5E44 0x6DDE # <CJK>
+0x9FC3 0x5E45 0x6DCC # <CJK>
+0x9FC4 0x5E46 0x6DE8 # <CJK>
+0x9FC5 0x5E47 0x6DD2 # <CJK>
+0x9FC6 0x5E48 0x6DC5 # <CJK>
+0x9FC7 0x5E49 0x6DFA # <CJK>
+0x9FC8 0x5E4A 0x6DD9 # <CJK>
+0x9FC9 0x5E4B 0x6DE4 # <CJK>
+0x9FCA 0x5E4C 0x6DD5 # <CJK>
+0x9FCB 0x5E4D 0x6DEA # <CJK>
+0x9FCC 0x5E4E 0x6DEE # <CJK>
+0x9FCD 0x5E4F 0x6E2D # <CJK>
+0x9FCE 0x5E50 0x6E6E # <CJK>
+0x9FCF 0x5E51 0x6E2E # <CJK>
+0x9FD0 0x5E52 0x6E19 # <CJK>
+0x9FD1 0x5E53 0x6E72 # <CJK>
+0x9FD2 0x5E54 0x6E5F # <CJK>
+0x9FD3 0x5E55 0x6E3E # <CJK>
+0x9FD4 0x5E56 0x6E23 # <CJK>
+0x9FD5 0x5E57 0x6E6B # <CJK>
+0x9FD6 0x5E58 0x6E2B # <CJK>
+0x9FD7 0x5E59 0x6E76 # <CJK>
+0x9FD8 0x5E5A 0x6E4D # <CJK>
+0x9FD9 0x5E5B 0x6E1F # <CJK>
+0x9FDA 0x5E5C 0x6E43 # <CJK>
+0x9FDB 0x5E5D 0x6E3A # <CJK>
+0x9FDC 0x5E5E 0x6E4E # <CJK>
+0x9FDD 0x5E5F 0x6E24 # <CJK>
+0x9FDE 0x5E60 0x6EFF # <CJK>
+0x9FDF 0x5E61 0x6E1D # <CJK>
+0x9FE0 0x5E62 0x6E38 # <CJK>
+0x9FE1 0x5E63 0x6E82 # <CJK>
+0x9FE2 0x5E64 0x6EAA # <CJK>
+0x9FE3 0x5E65 0x6E98 # <CJK>
+0x9FE4 0x5E66 0x6EC9 # <CJK>
+0x9FE5 0x5E67 0x6EB7 # <CJK>
+0x9FE6 0x5E68 0x6ED3 # <CJK>
+0x9FE7 0x5E69 0x6EBD # <CJK>
+0x9FE8 0x5E6A 0x6EAF # <CJK>
+0x9FE9 0x5E6B 0x6EC4 # <CJK>
+0x9FEA 0x5E6C 0x6EB2 # <CJK>
+0x9FEB 0x5E6D 0x6ED4 # <CJK>
+0x9FEC 0x5E6E 0x6ED5 # <CJK>
+0x9FED 0x5E6F 0x6E8F # <CJK>
+0x9FEE 0x5E70 0x6EA5 # <CJK>
+0x9FEF 0x5E71 0x6EC2 # <CJK>
+0x9FF0 0x5E72 0x6E9F # <CJK>
+0x9FF1 0x5E73 0x6F41 # <CJK>
+0x9FF2 0x5E74 0x6F11 # <CJK>
+0x9FF3 0x5E75 0x704C # <CJK>
+0x9FF4 0x5E76 0x6EEC # <CJK>
+0x9FF5 0x5E77 0x6EF8 # <CJK>
+0x9FF6 0x5E78 0x6EFE # <CJK>
+0x9FF7 0x5E79 0x6F3F # <CJK>
+0x9FF8 0x5E7A 0x6EF2 # <CJK>
+0x9FF9 0x5E7B 0x6F31 # <CJK>
+0x9FFA 0x5E7C 0x6EEF # <CJK>
+0x9FFB 0x5E7D 0x6F32 # <CJK>
+0x9FFC 0x5E7E 0x6ECC # <CJK>
+0xE040 0x5F21 0x6F3E # <CJK>
+0xE041 0x5F22 0x6F13 # <CJK>
+0xE042 0x5F23 0x6EF7 # <CJK>
+0xE043 0x5F24 0x6F86 # <CJK>
+0xE044 0x5F25 0x6F7A # <CJK>
+0xE045 0x5F26 0x6F78 # <CJK>
+0xE046 0x5F27 0x6F81 # <CJK>
+0xE047 0x5F28 0x6F80 # <CJK>
+0xE048 0x5F29 0x6F6F # <CJK>
+0xE049 0x5F2A 0x6F5B # <CJK>
+0xE04A 0x5F2B 0x6FF3 # <CJK>
+0xE04B 0x5F2C 0x6F6D # <CJK>
+0xE04C 0x5F2D 0x6F82 # <CJK>
+0xE04D 0x5F2E 0x6F7C # <CJK>
+0xE04E 0x5F2F 0x6F58 # <CJK>
+0xE04F 0x5F30 0x6F8E # <CJK>
+0xE050 0x5F31 0x6F91 # <CJK>
+0xE051 0x5F32 0x6FC2 # <CJK>
+0xE052 0x5F33 0x6F66 # <CJK>
+0xE053 0x5F34 0x6FB3 # <CJK>
+0xE054 0x5F35 0x6FA3 # <CJK>
+0xE055 0x5F36 0x6FA1 # <CJK>
+0xE056 0x5F37 0x6FA4 # <CJK>
+0xE057 0x5F38 0x6FB9 # <CJK>
+0xE058 0x5F39 0x6FC6 # <CJK>
+0xE059 0x5F3A 0x6FAA # <CJK>
+0xE05A 0x5F3B 0x6FDF # <CJK>
+0xE05B 0x5F3C 0x6FD5 # <CJK>
+0xE05C 0x5F3D 0x6FEC # <CJK>
+0xE05D 0x5F3E 0x6FD4 # <CJK>
+0xE05E 0x5F3F 0x6FD8 # <CJK>
+0xE05F 0x5F40 0x6FF1 # <CJK>
+0xE060 0x5F41 0x6FEE # <CJK>
+0xE061 0x5F42 0x6FDB # <CJK>
+0xE062 0x5F43 0x7009 # <CJK>
+0xE063 0x5F44 0x700B # <CJK>
+0xE064 0x5F45 0x6FFA # <CJK>
+0xE065 0x5F46 0x7011 # <CJK>
+0xE066 0x5F47 0x7001 # <CJK>
+0xE067 0x5F48 0x700F # <CJK>
+0xE068 0x5F49 0x6FFE # <CJK>
+0xE069 0x5F4A 0x701B # <CJK>
+0xE06A 0x5F4B 0x701A # <CJK>
+0xE06B 0x5F4C 0x6F74 # <CJK>
+0xE06C 0x5F4D 0x701D # <CJK>
+0xE06D 0x5F4E 0x7018 # <CJK>
+0xE06E 0x5F4F 0x701F # <CJK>
+0xE06F 0x5F50 0x7030 # <CJK>
+0xE070 0x5F51 0x703E # <CJK>
+0xE071 0x5F52 0x7032 # <CJK>
+0xE072 0x5F53 0x7051 # <CJK>
+0xE073 0x5F54 0x7063 # <CJK>
+0xE074 0x5F55 0x7099 # <CJK>
+0xE075 0x5F56 0x7092 # <CJK>
+0xE076 0x5F57 0x70AF # <CJK>
+0xE077 0x5F58 0x70F1 # <CJK>
+0xE078 0x5F59 0x70AC # <CJK>
+0xE079 0x5F5A 0x70B8 # <CJK>
+0xE07A 0x5F5B 0x70B3 # <CJK>
+0xE07B 0x5F5C 0x70AE # <CJK>
+0xE07C 0x5F5D 0x70DF # <CJK>
+0xE07D 0x5F5E 0x70CB # <CJK>
+0xE07E 0x5F5F 0x70DD # <CJK>
+0xE080 0x5F60 0x70D9 # <CJK>
+0xE081 0x5F61 0x7109 # <CJK>
+0xE082 0x5F62 0x70FD # <CJK>
+0xE083 0x5F63 0x711C # <CJK>
+0xE084 0x5F64 0x7119 # <CJK>
+0xE085 0x5F65 0x7165 # <CJK>
+0xE086 0x5F66 0x7155 # <CJK>
+0xE087 0x5F67 0x7188 # <CJK>
+0xE088 0x5F68 0x7166 # <CJK>
+0xE089 0x5F69 0x7162 # <CJK>
+0xE08A 0x5F6A 0x714C # <CJK>
+0xE08B 0x5F6B 0x7156 # <CJK>
+0xE08C 0x5F6C 0x716C # <CJK>
+0xE08D 0x5F6D 0x718F # <CJK>
+0xE08E 0x5F6E 0x71FB # <CJK>
+0xE08F 0x5F6F 0x7184 # <CJK>
+0xE090 0x5F70 0x7195 # <CJK>
+0xE091 0x5F71 0x71A8 # <CJK>
+0xE092 0x5F72 0x71AC # <CJK>
+0xE093 0x5F73 0x71D7 # <CJK>
+0xE094 0x5F74 0x71B9 # <CJK>
+0xE095 0x5F75 0x71BE # <CJK>
+0xE096 0x5F76 0x71D2 # <CJK>
+0xE097 0x5F77 0x71C9 # <CJK>
+0xE098 0x5F78 0x71D4 # <CJK>
+0xE099 0x5F79 0x71CE # <CJK>
+0xE09A 0x5F7A 0x71E0 # <CJK>
+0xE09B 0x5F7B 0x71EC # <CJK>
+0xE09C 0x5F7C 0x71E7 # <CJK>
+0xE09D 0x5F7D 0x71F5 # <CJK>
+0xE09E 0x5F7E 0x71FC # <CJK>
+0xE09F 0x6021 0x71F9 # <CJK>
+0xE0A0 0x6022 0x71FF # <CJK>
+0xE0A1 0x6023 0x720D # <CJK>
+0xE0A2 0x6024 0x7210 # <CJK>
+0xE0A3 0x6025 0x721B # <CJK>
+0xE0A4 0x6026 0x7228 # <CJK>
+0xE0A5 0x6027 0x722D # <CJK>
+0xE0A6 0x6028 0x722C # <CJK>
+0xE0A7 0x6029 0x7230 # <CJK>
+0xE0A8 0x602A 0x7232 # <CJK>
+0xE0A9 0x602B 0x723B # <CJK>
+0xE0AA 0x602C 0x723C # <CJK>
+0xE0AB 0x602D 0x723F # <CJK>
+0xE0AC 0x602E 0x7240 # <CJK>
+0xE0AD 0x602F 0x7246 # <CJK>
+0xE0AE 0x6030 0x724B # <CJK>
+0xE0AF 0x6031 0x7258 # <CJK>
+0xE0B0 0x6032 0x7274 # <CJK>
+0xE0B1 0x6033 0x727E # <CJK>
+0xE0B2 0x6034 0x7282 # <CJK>
+0xE0B3 0x6035 0x7281 # <CJK>
+0xE0B4 0x6036 0x7287 # <CJK>
+0xE0B5 0x6037 0x7292 # <CJK>
+0xE0B6 0x6038 0x7296 # <CJK>
+0xE0B7 0x6039 0x72A2 # <CJK>
+0xE0B8 0x603A 0x72A7 # <CJK>
+0xE0B9 0x603B 0x72B9 # <CJK>
+0xE0BA 0x603C 0x72B2 # <CJK>
+0xE0BB 0x603D 0x72C3 # <CJK>
+0xE0BC 0x603E 0x72C6 # <CJK>
+0xE0BD 0x603F 0x72C4 # <CJK>
+0xE0BE 0x6040 0x72CE # <CJK>
+0xE0BF 0x6041 0x72D2 # <CJK>
+0xE0C0 0x6042 0x72E2 # <CJK>
+0xE0C1 0x6043 0x72E0 # <CJK>
+0xE0C2 0x6044 0x72E1 # <CJK>
+0xE0C3 0x6045 0x72F9 # <CJK>
+0xE0C4 0x6046 0x72F7 # <CJK>
+0xE0C5 0x6047 0x500F # <CJK>
+0xE0C6 0x6048 0x7317 # <CJK>
+0xE0C7 0x6049 0x730A # <CJK>
+0xE0C8 0x604A 0x731C # <CJK>
+0xE0C9 0x604B 0x7316 # <CJK>
+0xE0CA 0x604C 0x731D # <CJK>
+0xE0CB 0x604D 0x7334 # <CJK>
+0xE0CC 0x604E 0x732F # <CJK>
+0xE0CD 0x604F 0x7329 # <CJK>
+0xE0CE 0x6050 0x7325 # <CJK>
+0xE0CF 0x6051 0x733E # <CJK>
+0xE0D0 0x6052 0x734E # <CJK>
+0xE0D1 0x6053 0x734F # <CJK>
+0xE0D2 0x6054 0x9ED8 # <CJK>
+0xE0D3 0x6055 0x7357 # <CJK>
+0xE0D4 0x6056 0x736A # <CJK>
+0xE0D5 0x6057 0x7368 # <CJK>
+0xE0D6 0x6058 0x7370 # <CJK>
+0xE0D7 0x6059 0x7378 # <CJK>
+0xE0D8 0x605A 0x7375 # <CJK>
+0xE0D9 0x605B 0x737B # <CJK>
+0xE0DA 0x605C 0x737A # <CJK>
+0xE0DB 0x605D 0x73C8 # <CJK>
+0xE0DC 0x605E 0x73B3 # <CJK>
+0xE0DD 0x605F 0x73CE # <CJK>
+0xE0DE 0x6060 0x73BB # <CJK>
+0xE0DF 0x6061 0x73C0 # <CJK>
+0xE0E0 0x6062 0x73E5 # <CJK>
+0xE0E1 0x6063 0x73EE # <CJK>
+0xE0E2 0x6064 0x73DE # <CJK>
+0xE0E3 0x6065 0x74A2 # <CJK>
+0xE0E4 0x6066 0x7405 # <CJK>
+0xE0E5 0x6067 0x746F # <CJK>
+0xE0E6 0x6068 0x7425 # <CJK>
+0xE0E7 0x6069 0x73F8 # <CJK>
+0xE0E8 0x606A 0x7432 # <CJK>
+0xE0E9 0x606B 0x743A # <CJK>
+0xE0EA 0x606C 0x7455 # <CJK>
+0xE0EB 0x606D 0x743F # <CJK>
+0xE0EC 0x606E 0x745F # <CJK>
+0xE0ED 0x606F 0x7459 # <CJK>
+0xE0EE 0x6070 0x7441 # <CJK>
+0xE0EF 0x6071 0x745C # <CJK>
+0xE0F0 0x6072 0x7469 # <CJK>
+0xE0F1 0x6073 0x7470 # <CJK>
+0xE0F2 0x6074 0x7463 # <CJK>
+0xE0F3 0x6075 0x746A # <CJK>
+0xE0F4 0x6076 0x7476 # <CJK>
+0xE0F5 0x6077 0x747E # <CJK>
+0xE0F6 0x6078 0x748B # <CJK>
+0xE0F7 0x6079 0x749E # <CJK>
+0xE0F8 0x607A 0x74A7 # <CJK>
+0xE0F9 0x607B 0x74CA # <CJK>
+0xE0FA 0x607C 0x74CF # <CJK>
+0xE0FB 0x607D 0x74D4 # <CJK>
+0xE0FC 0x607E 0x73F1 # <CJK>
+0xE140 0x6121 0x74E0 # <CJK>
+0xE141 0x6122 0x74E3 # <CJK>
+0xE142 0x6123 0x74E7 # <CJK>
+0xE143 0x6124 0x74E9 # <CJK>
+0xE144 0x6125 0x74EE # <CJK>
+0xE145 0x6126 0x74F2 # <CJK>
+0xE146 0x6127 0x74F0 # <CJK>
+0xE147 0x6128 0x74F1 # <CJK>
+0xE148 0x6129 0x74F8 # <CJK>
+0xE149 0x612A 0x74F7 # <CJK>
+0xE14A 0x612B 0x7504 # <CJK>
+0xE14B 0x612C 0x7503 # <CJK>
+0xE14C 0x612D 0x7505 # <CJK>
+0xE14D 0x612E 0x750C # <CJK>
+0xE14E 0x612F 0x750E # <CJK>
+0xE14F 0x6130 0x750D # <CJK>
+0xE150 0x6131 0x7515 # <CJK>
+0xE151 0x6132 0x7513 # <CJK>
+0xE152 0x6133 0x751E # <CJK>
+0xE153 0x6134 0x7526 # <CJK>
+0xE154 0x6135 0x752C # <CJK>
+0xE155 0x6136 0x753C # <CJK>
+0xE156 0x6137 0x7544 # <CJK>
+0xE157 0x6138 0x754D # <CJK>
+0xE158 0x6139 0x754A # <CJK>
+0xE159 0x613A 0x7549 # <CJK>
+0xE15A 0x613B 0x755B # <CJK>
+0xE15B 0x613C 0x7546 # <CJK>
+0xE15C 0x613D 0x755A # <CJK>
+0xE15D 0x613E 0x7569 # <CJK>
+0xE15E 0x613F 0x7564 # <CJK>
+0xE15F 0x6140 0x7567 # <CJK>
+0xE160 0x6141 0x756B # <CJK>
+0xE161 0x6142 0x756D # <CJK>
+0xE162 0x6143 0x7578 # <CJK>
+0xE163 0x6144 0x7576 # <CJK>
+0xE164 0x6145 0x7586 # <CJK>
+0xE165 0x6146 0x7587 # <CJK>
+0xE166 0x6147 0x7574 # <CJK>
+0xE167 0x6148 0x758A # <CJK>
+0xE168 0x6149 0x7589 # <CJK>
+0xE169 0x614A 0x7582 # <CJK>
+0xE16A 0x614B 0x7594 # <CJK>
+0xE16B 0x614C 0x759A # <CJK>
+0xE16C 0x614D 0x759D # <CJK>
+0xE16D 0x614E 0x75A5 # <CJK>
+0xE16E 0x614F 0x75A3 # <CJK>
+0xE16F 0x6150 0x75C2 # <CJK>
+0xE170 0x6151 0x75B3 # <CJK>
+0xE171 0x6152 0x75C3 # <CJK>
+0xE172 0x6153 0x75B5 # <CJK>
+0xE173 0x6154 0x75BD # <CJK>
+0xE174 0x6155 0x75B8 # <CJK>
+0xE175 0x6156 0x75BC # <CJK>
+0xE176 0x6157 0x75B1 # <CJK>
+0xE177 0x6158 0x75CD # <CJK>
+0xE178 0x6159 0x75CA # <CJK>
+0xE179 0x615A 0x75D2 # <CJK>
+0xE17A 0x615B 0x75D9 # <CJK>
+0xE17B 0x615C 0x75E3 # <CJK>
+0xE17C 0x615D 0x75DE # <CJK>
+0xE17D 0x615E 0x75FE # <CJK>
+0xE17E 0x615F 0x75FF # <CJK>
+0xE180 0x6160 0x75FC # <CJK>
+0xE181 0x6161 0x7601 # <CJK>
+0xE182 0x6162 0x75F0 # <CJK>
+0xE183 0x6163 0x75FA # <CJK>
+0xE184 0x6164 0x75F2 # <CJK>
+0xE185 0x6165 0x75F3 # <CJK>
+0xE186 0x6166 0x760B # <CJK>
+0xE187 0x6167 0x760D # <CJK>
+0xE188 0x6168 0x7609 # <CJK>
+0xE189 0x6169 0x761F # <CJK>
+0xE18A 0x616A 0x7627 # <CJK>
+0xE18B 0x616B 0x7620 # <CJK>
+0xE18C 0x616C 0x7621 # <CJK>
+0xE18D 0x616D 0x7622 # <CJK>
+0xE18E 0x616E 0x7624 # <CJK>
+0xE18F 0x616F 0x7634 # <CJK>
+0xE190 0x6170 0x7630 # <CJK>
+0xE191 0x6171 0x763B # <CJK>
+0xE192 0x6172 0x7647 # <CJK>
+0xE193 0x6173 0x7648 # <CJK>
+0xE194 0x6174 0x7646 # <CJK>
+0xE195 0x6175 0x765C # <CJK>
+0xE196 0x6176 0x7658 # <CJK>
+0xE197 0x6177 0x7661 # <CJK>
+0xE198 0x6178 0x7662 # <CJK>
+0xE199 0x6179 0x7668 # <CJK>
+0xE19A 0x617A 0x7669 # <CJK>
+0xE19B 0x617B 0x766A # <CJK>
+0xE19C 0x617C 0x7667 # <CJK>
+0xE19D 0x617D 0x766C # <CJK>
+0xE19E 0x617E 0x7670 # <CJK>
+0xE19F 0x6221 0x7672 # <CJK>
+0xE1A0 0x6222 0x7676 # <CJK>
+0xE1A1 0x6223 0x7678 # <CJK>
+0xE1A2 0x6224 0x767C # <CJK>
+0xE1A3 0x6225 0x7680 # <CJK>
+0xE1A4 0x6226 0x7683 # <CJK>
+0xE1A5 0x6227 0x7688 # <CJK>
+0xE1A6 0x6228 0x768B # <CJK>
+0xE1A7 0x6229 0x768E # <CJK>
+0xE1A8 0x622A 0x7696 # <CJK>
+0xE1A9 0x622B 0x7693 # <CJK>
+0xE1AA 0x622C 0x7699 # <CJK>
+0xE1AB 0x622D 0x769A # <CJK>
+0xE1AC 0x622E 0x76B0 # <CJK>
+0xE1AD 0x622F 0x76B4 # <CJK>
+0xE1AE 0x6230 0x76B8 # <CJK>
+0xE1AF 0x6231 0x76B9 # <CJK>
+0xE1B0 0x6232 0x76BA # <CJK>
+0xE1B1 0x6233 0x76C2 # <CJK>
+0xE1B2 0x6234 0x76CD # <CJK>
+0xE1B3 0x6235 0x76D6 # <CJK>
+0xE1B4 0x6236 0x76D2 # <CJK>
+0xE1B5 0x6237 0x76DE # <CJK>
+0xE1B6 0x6238 0x76E1 # <CJK>
+0xE1B7 0x6239 0x76E5 # <CJK>
+0xE1B8 0x623A 0x76E7 # <CJK>
+0xE1B9 0x623B 0x76EA # <CJK>
+0xE1BA 0x623C 0x862F # <CJK>
+0xE1BB 0x623D 0x76FB # <CJK>
+0xE1BC 0x623E 0x7708 # <CJK>
+0xE1BD 0x623F 0x7707 # <CJK>
+0xE1BE 0x6240 0x7704 # <CJK>
+0xE1BF 0x6241 0x7729 # <CJK>
+0xE1C0 0x6242 0x7724 # <CJK>
+0xE1C1 0x6243 0x771E # <CJK>
+0xE1C2 0x6244 0x7725 # <CJK>
+0xE1C3 0x6245 0x7726 # <CJK>
+0xE1C4 0x6246 0x771B # <CJK>
+0xE1C5 0x6247 0x7737 # <CJK>
+0xE1C6 0x6248 0x7738 # <CJK>
+0xE1C7 0x6249 0x7747 # <CJK>
+0xE1C8 0x624A 0x775A # <CJK>
+0xE1C9 0x624B 0x7768 # <CJK>
+0xE1CA 0x624C 0x776B # <CJK>
+0xE1CB 0x624D 0x775B # <CJK>
+0xE1CC 0x624E 0x7765 # <CJK>
+0xE1CD 0x624F 0x777F # <CJK>
+0xE1CE 0x6250 0x777E # <CJK>
+0xE1CF 0x6251 0x7779 # <CJK>
+0xE1D0 0x6252 0x778E # <CJK>
+0xE1D1 0x6253 0x778B # <CJK>
+0xE1D2 0x6254 0x7791 # <CJK>
+0xE1D3 0x6255 0x77A0 # <CJK>
+0xE1D4 0x6256 0x779E # <CJK>
+0xE1D5 0x6257 0x77B0 # <CJK>
+0xE1D6 0x6258 0x77B6 # <CJK>
+0xE1D7 0x6259 0x77B9 # <CJK>
+0xE1D8 0x625A 0x77BF # <CJK>
+0xE1D9 0x625B 0x77BC # <CJK>
+0xE1DA 0x625C 0x77BD # <CJK>
+0xE1DB 0x625D 0x77BB # <CJK>
+0xE1DC 0x625E 0x77C7 # <CJK>
+0xE1DD 0x625F 0x77CD # <CJK>
+0xE1DE 0x6260 0x77D7 # <CJK>
+0xE1DF 0x6261 0x77DA # <CJK>
+0xE1E0 0x6262 0x77DC # <CJK>
+0xE1E1 0x6263 0x77E3 # <CJK>
+0xE1E2 0x6264 0x77EE # <CJK>
+0xE1E3 0x6265 0x77FC # <CJK>
+0xE1E4 0x6266 0x780C # <CJK>
+0xE1E5 0x6267 0x7812 # <CJK>
+0xE1E6 0x6268 0x7926 # <CJK>
+0xE1E7 0x6269 0x7820 # <CJK>
+0xE1E8 0x626A 0x792A # <CJK>
+0xE1E9 0x626B 0x7845 # <CJK>
+0xE1EA 0x626C 0x788E # <CJK>
+0xE1EB 0x626D 0x7874 # <CJK>
+0xE1EC 0x626E 0x7886 # <CJK>
+0xE1ED 0x626F 0x787C # <CJK>
+0xE1EE 0x6270 0x789A # <CJK>
+0xE1EF 0x6271 0x788C # <CJK>
+0xE1F0 0x6272 0x78A3 # <CJK>
+0xE1F1 0x6273 0x78B5 # <CJK>
+0xE1F2 0x6274 0x78AA # <CJK>
+0xE1F3 0x6275 0x78AF # <CJK>
+0xE1F4 0x6276 0x78D1 # <CJK>
+0xE1F5 0x6277 0x78C6 # <CJK>
+0xE1F6 0x6278 0x78CB # <CJK>
+0xE1F7 0x6279 0x78D4 # <CJK>
+0xE1F8 0x627A 0x78BE # <CJK>
+0xE1F9 0x627B 0x78BC # <CJK>
+0xE1FA 0x627C 0x78C5 # <CJK>
+0xE1FB 0x627D 0x78CA # <CJK>
+0xE1FC 0x627E 0x78EC # <CJK>
+0xE240 0x6321 0x78E7 # <CJK>
+0xE241 0x6322 0x78DA # <CJK>
+0xE242 0x6323 0x78FD # <CJK>
+0xE243 0x6324 0x78F4 # <CJK>
+0xE244 0x6325 0x7907 # <CJK>
+0xE245 0x6326 0x7912 # <CJK>
+0xE246 0x6327 0x7911 # <CJK>
+0xE247 0x6328 0x7919 # <CJK>
+0xE248 0x6329 0x792C # <CJK>
+0xE249 0x632A 0x792B # <CJK>
+0xE24A 0x632B 0x7940 # <CJK>
+0xE24B 0x632C 0x7960 # <CJK>
+0xE24C 0x632D 0x7957 # <CJK>
+0xE24D 0x632E 0x795F # <CJK>
+0xE24E 0x632F 0x795A # <CJK>
+0xE24F 0x6330 0x7955 # <CJK>
+0xE250 0x6331 0x7953 # <CJK>
+0xE251 0x6332 0x797A # <CJK>
+0xE252 0x6333 0x797F # <CJK>
+0xE253 0x6334 0x798A # <CJK>
+0xE254 0x6335 0x799D # <CJK>
+0xE255 0x6336 0x79A7 # <CJK>
+0xE256 0x6337 0x9F4B # <CJK>
+0xE257 0x6338 0x79AA # <CJK>
+0xE258 0x6339 0x79AE # <CJK>
+0xE259 0x633A 0x79B3 # <CJK>
+0xE25A 0x633B 0x79B9 # <CJK>
+0xE25B 0x633C 0x79BA # <CJK>
+0xE25C 0x633D 0x79C9 # <CJK>
+0xE25D 0x633E 0x79D5 # <CJK>
+0xE25E 0x633F 0x79E7 # <CJK>
+0xE25F 0x6340 0x79EC # <CJK>
+0xE260 0x6341 0x79E1 # <CJK>
+0xE261 0x6342 0x79E3 # <CJK>
+0xE262 0x6343 0x7A08 # <CJK>
+0xE263 0x6344 0x7A0D # <CJK>
+0xE264 0x6345 0x7A18 # <CJK>
+0xE265 0x6346 0x7A19 # <CJK>
+0xE266 0x6347 0x7A20 # <CJK>
+0xE267 0x6348 0x7A1F # <CJK>
+0xE268 0x6349 0x7980 # <CJK>
+0xE269 0x634A 0x7A31 # <CJK>
+0xE26A 0x634B 0x7A3B # <CJK>
+0xE26B 0x634C 0x7A3E # <CJK>
+0xE26C 0x634D 0x7A37 # <CJK>
+0xE26D 0x634E 0x7A43 # <CJK>
+0xE26E 0x634F 0x7A57 # <CJK>
+0xE26F 0x6350 0x7A49 # <CJK>
+0xE270 0x6351 0x7A61 # <CJK>
+0xE271 0x6352 0x7A62 # <CJK>
+0xE272 0x6353 0x7A69 # <CJK>
+0xE273 0x6354 0x9F9D # <CJK>
+0xE274 0x6355 0x7A70 # <CJK>
+0xE275 0x6356 0x7A79 # <CJK>
+0xE276 0x6357 0x7A7D # <CJK>
+0xE277 0x6358 0x7A88 # <CJK>
+0xE278 0x6359 0x7A97 # <CJK>
+0xE279 0x635A 0x7A95 # <CJK>
+0xE27A 0x635B 0x7A98 # <CJK>
+0xE27B 0x635C 0x7A96 # <CJK>
+0xE27C 0x635D 0x7AA9 # <CJK>
+0xE27D 0x635E 0x7AC8 # <CJK>
+0xE27E 0x635F 0x7AB0 # <CJK>
+0xE280 0x6360 0x7AB6 # <CJK>
+0xE281 0x6361 0x7AC5 # <CJK>
+0xE282 0x6362 0x7AC4 # <CJK>
+0xE283 0x6363 0x7ABF # <CJK>
+0xE284 0x6364 0x9083 # <CJK>
+0xE285 0x6365 0x7AC7 # <CJK>
+0xE286 0x6366 0x7ACA # <CJK>
+0xE287 0x6367 0x7ACD # <CJK>
+0xE288 0x6368 0x7ACF # <CJK>
+0xE289 0x6369 0x7AD5 # <CJK>
+0xE28A 0x636A 0x7AD3 # <CJK>
+0xE28B 0x636B 0x7AD9 # <CJK>
+0xE28C 0x636C 0x7ADA # <CJK>
+0xE28D 0x636D 0x7ADD # <CJK>
+0xE28E 0x636E 0x7AE1 # <CJK>
+0xE28F 0x636F 0x7AE2 # <CJK>
+0xE290 0x6370 0x7AE6 # <CJK>
+0xE291 0x6371 0x7AED # <CJK>
+0xE292 0x6372 0x7AF0 # <CJK>
+0xE293 0x6373 0x7B02 # <CJK>
+0xE294 0x6374 0x7B0F # <CJK>
+0xE295 0x6375 0x7B0A # <CJK>
+0xE296 0x6376 0x7B06 # <CJK>
+0xE297 0x6377 0x7B33 # <CJK>
+0xE298 0x6378 0x7B18 # <CJK>
+0xE299 0x6379 0x7B19 # <CJK>
+0xE29A 0x637A 0x7B1E # <CJK>
+0xE29B 0x637B 0x7B35 # <CJK>
+0xE29C 0x637C 0x7B28 # <CJK>
+0xE29D 0x637D 0x7B36 # <CJK>
+0xE29E 0x637E 0x7B50 # <CJK>
+0xE29F 0x6421 0x7B7A # <CJK>
+0xE2A0 0x6422 0x7B04 # <CJK>
+0xE2A1 0x6423 0x7B4D # <CJK>
+0xE2A2 0x6424 0x7B0B # <CJK>
+0xE2A3 0x6425 0x7B4C # <CJK>
+0xE2A4 0x6426 0x7B45 # <CJK>
+0xE2A5 0x6427 0x7B75 # <CJK>
+0xE2A6 0x6428 0x7B65 # <CJK>
+0xE2A7 0x6429 0x7B74 # <CJK>
+0xE2A8 0x642A 0x7B67 # <CJK>
+0xE2A9 0x642B 0x7B70 # <CJK>
+0xE2AA 0x642C 0x7B71 # <CJK>
+0xE2AB 0x642D 0x7B6C # <CJK>
+0xE2AC 0x642E 0x7B6E # <CJK>
+0xE2AD 0x642F 0x7B9D # <CJK>
+0xE2AE 0x6430 0x7B98 # <CJK>
+0xE2AF 0x6431 0x7B9F # <CJK>
+0xE2B0 0x6432 0x7B8D # <CJK>
+0xE2B1 0x6433 0x7B9C # <CJK>
+0xE2B2 0x6434 0x7B9A # <CJK>
+0xE2B3 0x6435 0x7B8B # <CJK>
+0xE2B4 0x6436 0x7B92 # <CJK>
+0xE2B5 0x6437 0x7B8F # <CJK>
+0xE2B6 0x6438 0x7B5D # <CJK>
+0xE2B7 0x6439 0x7B99 # <CJK>
+0xE2B8 0x643A 0x7BCB # <CJK>
+0xE2B9 0x643B 0x7BC1 # <CJK>
+0xE2BA 0x643C 0x7BCC # <CJK>
+0xE2BB 0x643D 0x7BCF # <CJK>
+0xE2BC 0x643E 0x7BB4 # <CJK>
+0xE2BD 0x643F 0x7BC6 # <CJK>
+0xE2BE 0x6440 0x7BDD # <CJK>
+0xE2BF 0x6441 0x7BE9 # <CJK>
+0xE2C0 0x6442 0x7C11 # <CJK>
+0xE2C1 0x6443 0x7C14 # <CJK>
+0xE2C2 0x6444 0x7BE6 # <CJK>
+0xE2C3 0x6445 0x7BE5 # <CJK>
+0xE2C4 0x6446 0x7C60 # <CJK>
+0xE2C5 0x6447 0x7C00 # <CJK>
+0xE2C6 0x6448 0x7C07 # <CJK>
+0xE2C7 0x6449 0x7C13 # <CJK>
+0xE2C8 0x644A 0x7BF3 # <CJK>
+0xE2C9 0x644B 0x7BF7 # <CJK>
+0xE2CA 0x644C 0x7C17 # <CJK>
+0xE2CB 0x644D 0x7C0D # <CJK>
+0xE2CC 0x644E 0x7BF6 # <CJK>
+0xE2CD 0x644F 0x7C23 # <CJK>
+0xE2CE 0x6450 0x7C27 # <CJK>
+0xE2CF 0x6451 0x7C2A # <CJK>
+0xE2D0 0x6452 0x7C1F # <CJK>
+0xE2D1 0x6453 0x7C37 # <CJK>
+0xE2D2 0x6454 0x7C2B # <CJK>
+0xE2D3 0x6455 0x7C3D # <CJK>
+0xE2D4 0x6456 0x7C4C # <CJK>
+0xE2D5 0x6457 0x7C43 # <CJK>
+0xE2D6 0x6458 0x7C54 # <CJK>
+0xE2D7 0x6459 0x7C4F # <CJK>
+0xE2D8 0x645A 0x7C40 # <CJK>
+0xE2D9 0x645B 0x7C50 # <CJK>
+0xE2DA 0x645C 0x7C58 # <CJK>
+0xE2DB 0x645D 0x7C5F # <CJK>
+0xE2DC 0x645E 0x7C64 # <CJK>
+0xE2DD 0x645F 0x7C56 # <CJK>
+0xE2DE 0x6460 0x7C65 # <CJK>
+0xE2DF 0x6461 0x7C6C # <CJK>
+0xE2E0 0x6462 0x7C75 # <CJK>
+0xE2E1 0x6463 0x7C83 # <CJK>
+0xE2E2 0x6464 0x7C90 # <CJK>
+0xE2E3 0x6465 0x7CA4 # <CJK>
+0xE2E4 0x6466 0x7CAD # <CJK>
+0xE2E5 0x6467 0x7CA2 # <CJK>
+0xE2E6 0x6468 0x7CAB # <CJK>
+0xE2E7 0x6469 0x7CA1 # <CJK>
+0xE2E8 0x646A 0x7CA8 # <CJK>
+0xE2E9 0x646B 0x7CB3 # <CJK>
+0xE2EA 0x646C 0x7CB2 # <CJK>
+0xE2EB 0x646D 0x7CB1 # <CJK>
+0xE2EC 0x646E 0x7CAE # <CJK>
+0xE2ED 0x646F 0x7CB9 # <CJK>
+0xE2EE 0x6470 0x7CBD # <CJK>
+0xE2EF 0x6471 0x7CC0 # <CJK>
+0xE2F0 0x6472 0x7CC5 # <CJK>
+0xE2F1 0x6473 0x7CC2 # <CJK>
+0xE2F2 0x6474 0x7CD8 # <CJK>
+0xE2F3 0x6475 0x7CD2 # <CJK>
+0xE2F4 0x6476 0x7CDC # <CJK>
+0xE2F5 0x6477 0x7CE2 # <CJK>
+0xE2F6 0x6478 0x9B3B # <CJK>
+0xE2F7 0x6479 0x7CEF # <CJK>
+0xE2F8 0x647A 0x7CF2 # <CJK>
+0xE2F9 0x647B 0x7CF4 # <CJK>
+0xE2FA 0x647C 0x7CF6 # <CJK>
+0xE2FB 0x647D 0x7CFA # <CJK>
+0xE2FC 0x647E 0x7D06 # <CJK>
+0xE340 0x6521 0x7D02 # <CJK>
+0xE341 0x6522 0x7D1C # <CJK>
+0xE342 0x6523 0x7D15 # <CJK>
+0xE343 0x6524 0x7D0A # <CJK>
+0xE344 0x6525 0x7D45 # <CJK>
+0xE345 0x6526 0x7D4B # <CJK>
+0xE346 0x6527 0x7D2E # <CJK>
+0xE347 0x6528 0x7D32 # <CJK>
+0xE348 0x6529 0x7D3F # <CJK>
+0xE349 0x652A 0x7D35 # <CJK>
+0xE34A 0x652B 0x7D46 # <CJK>
+0xE34B 0x652C 0x7D73 # <CJK>
+0xE34C 0x652D 0x7D56 # <CJK>
+0xE34D 0x652E 0x7D4E # <CJK>
+0xE34E 0x652F 0x7D72 # <CJK>
+0xE34F 0x6530 0x7D68 # <CJK>
+0xE350 0x6531 0x7D6E # <CJK>
+0xE351 0x6532 0x7D4F # <CJK>
+0xE352 0x6533 0x7D63 # <CJK>
+0xE353 0x6534 0x7D93 # <CJK>
+0xE354 0x6535 0x7D89 # <CJK>
+0xE355 0x6536 0x7D5B # <CJK>
+0xE356 0x6537 0x7D8F # <CJK>
+0xE357 0x6538 0x7D7D # <CJK>
+0xE358 0x6539 0x7D9B # <CJK>
+0xE359 0x653A 0x7DBA # <CJK>
+0xE35A 0x653B 0x7DAE # <CJK>
+0xE35B 0x653C 0x7DA3 # <CJK>
+0xE35C 0x653D 0x7DB5 # <CJK>
+0xE35D 0x653E 0x7DC7 # <CJK>
+0xE35E 0x653F 0x7DBD # <CJK>
+0xE35F 0x6540 0x7DAB # <CJK>
+0xE360 0x6541 0x7E3D # <CJK>
+0xE361 0x6542 0x7DA2 # <CJK>
+0xE362 0x6543 0x7DAF # <CJK>
+0xE363 0x6544 0x7DDC # <CJK>
+0xE364 0x6545 0x7DB8 # <CJK>
+0xE365 0x6546 0x7D9F # <CJK>
+0xE366 0x6547 0x7DB0 # <CJK>
+0xE367 0x6548 0x7DD8 # <CJK>
+0xE368 0x6549 0x7DDD # <CJK>
+0xE369 0x654A 0x7DE4 # <CJK>
+0xE36A 0x654B 0x7DDE # <CJK>
+0xE36B 0x654C 0x7DFB # <CJK>
+0xE36C 0x654D 0x7DF2 # <CJK>
+0xE36D 0x654E 0x7DE1 # <CJK>
+0xE36E 0x654F 0x7E05 # <CJK>
+0xE36F 0x6550 0x7E0A # <CJK>
+0xE370 0x6551 0x7E23 # <CJK>
+0xE371 0x6552 0x7E21 # <CJK>
+0xE372 0x6553 0x7E12 # <CJK>
+0xE373 0x6554 0x7E31 # <CJK>
+0xE374 0x6555 0x7E1F # <CJK>
+0xE375 0x6556 0x7E09 # <CJK>
+0xE376 0x6557 0x7E0B # <CJK>
+0xE377 0x6558 0x7E22 # <CJK>
+0xE378 0x6559 0x7E46 # <CJK>
+0xE379 0x655A 0x7E66 # <CJK>
+0xE37A 0x655B 0x7E3B # <CJK>
+0xE37B 0x655C 0x7E35 # <CJK>
+0xE37C 0x655D 0x7E39 # <CJK>
+0xE37D 0x655E 0x7E43 # <CJK>
+0xE37E 0x655F 0x7E37 # <CJK>
+0xE380 0x6560 0x7E32 # <CJK>
+0xE381 0x6561 0x7E3A # <CJK>
+0xE382 0x6562 0x7E67 # <CJK>
+0xE383 0x6563 0x7E5D # <CJK>
+0xE384 0x6564 0x7E56 # <CJK>
+0xE385 0x6565 0x7E5E # <CJK>
+0xE386 0x6566 0x7E59 # <CJK>
+0xE387 0x6567 0x7E5A # <CJK>
+0xE388 0x6568 0x7E79 # <CJK>
+0xE389 0x6569 0x7E6A # <CJK>
+0xE38A 0x656A 0x7E69 # <CJK>
+0xE38B 0x656B 0x7E7C # <CJK>
+0xE38C 0x656C 0x7E7B # <CJK>
+0xE38D 0x656D 0x7E83 # <CJK>
+0xE38E 0x656E 0x7DD5 # <CJK>
+0xE38F 0x656F 0x7E7D # <CJK>
+0xE390 0x6570 0x8FAE # <CJK>
+0xE391 0x6571 0x7E7F # <CJK>
+0xE392 0x6572 0x7E88 # <CJK>
+0xE393 0x6573 0x7E89 # <CJK>
+0xE394 0x6574 0x7E8C # <CJK>
+0xE395 0x6575 0x7E92 # <CJK>
+0xE396 0x6576 0x7E90 # <CJK>
+0xE397 0x6577 0x7E93 # <CJK>
+0xE398 0x6578 0x7E94 # <CJK>
+0xE399 0x6579 0x7E96 # <CJK>
+0xE39A 0x657A 0x7E8E # <CJK>
+0xE39B 0x657B 0x7E9B # <CJK>
+0xE39C 0x657C 0x7E9C # <CJK>
+0xE39D 0x657D 0x7F38 # <CJK>
+0xE39E 0x657E 0x7F3A # <CJK>
+0xE39F 0x6621 0x7F45 # <CJK>
+0xE3A0 0x6622 0x7F4C # <CJK>
+0xE3A1 0x6623 0x7F4D # <CJK>
+0xE3A2 0x6624 0x7F4E # <CJK>
+0xE3A3 0x6625 0x7F50 # <CJK>
+0xE3A4 0x6626 0x7F51 # <CJK>
+0xE3A5 0x6627 0x7F55 # <CJK>
+0xE3A6 0x6628 0x7F54 # <CJK>
+0xE3A7 0x6629 0x7F58 # <CJK>
+0xE3A8 0x662A 0x7F5F # <CJK>
+0xE3A9 0x662B 0x7F60 # <CJK>
+0xE3AA 0x662C 0x7F68 # <CJK>
+0xE3AB 0x662D 0x7F69 # <CJK>
+0xE3AC 0x662E 0x7F67 # <CJK>
+0xE3AD 0x662F 0x7F78 # <CJK>
+0xE3AE 0x6630 0x7F82 # <CJK>
+0xE3AF 0x6631 0x7F86 # <CJK>
+0xE3B0 0x6632 0x7F83 # <CJK>
+0xE3B1 0x6633 0x7F88 # <CJK>
+0xE3B2 0x6634 0x7F87 # <CJK>
+0xE3B3 0x6635 0x7F8C # <CJK>
+0xE3B4 0x6636 0x7F94 # <CJK>
+0xE3B5 0x6637 0x7F9E # <CJK>
+0xE3B6 0x6638 0x7F9D # <CJK>
+0xE3B7 0x6639 0x7F9A # <CJK>
+0xE3B8 0x663A 0x7FA3 # <CJK>
+0xE3B9 0x663B 0x7FAF # <CJK>
+0xE3BA 0x663C 0x7FB2 # <CJK>
+0xE3BB 0x663D 0x7FB9 # <CJK>
+0xE3BC 0x663E 0x7FAE # <CJK>
+0xE3BD 0x663F 0x7FB6 # <CJK>
+0xE3BE 0x6640 0x7FB8 # <CJK>
+0xE3BF 0x6641 0x8B71 # <CJK>
+0xE3C0 0x6642 0x7FC5 # <CJK>
+0xE3C1 0x6643 0x7FC6 # <CJK>
+0xE3C2 0x6644 0x7FCA # <CJK>
+0xE3C3 0x6645 0x7FD5 # <CJK>
+0xE3C4 0x6646 0x7FD4 # <CJK>
+0xE3C5 0x6647 0x7FE1 # <CJK>
+0xE3C6 0x6648 0x7FE6 # <CJK>
+0xE3C7 0x6649 0x7FE9 # <CJK>
+0xE3C8 0x664A 0x7FF3 # <CJK>
+0xE3C9 0x664B 0x7FF9 # <CJK>
+0xE3CA 0x664C 0x98DC # <CJK>
+0xE3CB 0x664D 0x8006 # <CJK>
+0xE3CC 0x664E 0x8004 # <CJK>
+0xE3CD 0x664F 0x800B # <CJK>
+0xE3CE 0x6650 0x8012 # <CJK>
+0xE3CF 0x6651 0x8018 # <CJK>
+0xE3D0 0x6652 0x8019 # <CJK>
+0xE3D1 0x6653 0x801C # <CJK>
+0xE3D2 0x6654 0x8021 # <CJK>
+0xE3D3 0x6655 0x8028 # <CJK>
+0xE3D4 0x6656 0x803F # <CJK>
+0xE3D5 0x6657 0x803B # <CJK>
+0xE3D6 0x6658 0x804A # <CJK>
+0xE3D7 0x6659 0x8046 # <CJK>
+0xE3D8 0x665A 0x8052 # <CJK>
+0xE3D9 0x665B 0x8058 # <CJK>
+0xE3DA 0x665C 0x805A # <CJK>
+0xE3DB 0x665D 0x805F # <CJK>
+0xE3DC 0x665E 0x8062 # <CJK>
+0xE3DD 0x665F 0x8068 # <CJK>
+0xE3DE 0x6660 0x8073 # <CJK>
+0xE3DF 0x6661 0x8072 # <CJK>
+0xE3E0 0x6662 0x8070 # <CJK>
+0xE3E1 0x6663 0x8076 # <CJK>
+0xE3E2 0x6664 0x8079 # <CJK>
+0xE3E3 0x6665 0x807D # <CJK>
+0xE3E4 0x6666 0x807F # <CJK>
+0xE3E5 0x6667 0x8084 # <CJK>
+0xE3E6 0x6668 0x8086 # <CJK>
+0xE3E7 0x6669 0x8085 # <CJK>
+0xE3E8 0x666A 0x809B # <CJK>
+0xE3E9 0x666B 0x8093 # <CJK>
+0xE3EA 0x666C 0x809A # <CJK>
+0xE3EB 0x666D 0x80AD # <CJK>
+0xE3EC 0x666E 0x5190 # <CJK>
+0xE3ED 0x666F 0x80AC # <CJK>
+0xE3EE 0x6670 0x80DB # <CJK>
+0xE3EF 0x6671 0x80E5 # <CJK>
+0xE3F0 0x6672 0x80D9 # <CJK>
+0xE3F1 0x6673 0x80DD # <CJK>
+0xE3F2 0x6674 0x80C4 # <CJK>
+0xE3F3 0x6675 0x80DA # <CJK>
+0xE3F4 0x6676 0x80D6 # <CJK>
+0xE3F5 0x6677 0x8109 # <CJK>
+0xE3F6 0x6678 0x80EF # <CJK>
+0xE3F7 0x6679 0x80F1 # <CJK>
+0xE3F8 0x667A 0x811B # <CJK>
+0xE3F9 0x667B 0x8129 # <CJK>
+0xE3FA 0x667C 0x8123 # <CJK>
+0xE3FB 0x667D 0x812F # <CJK>
+0xE3FC 0x667E 0x814B # <CJK>
+0xE440 0x6721 0x968B # <CJK>
+0xE441 0x6722 0x8146 # <CJK>
+0xE442 0x6723 0x813E # <CJK>
+0xE443 0x6724 0x8153 # <CJK>
+0xE444 0x6725 0x8151 # <CJK>
+0xE445 0x6726 0x80FC # <CJK>
+0xE446 0x6727 0x8171 # <CJK>
+0xE447 0x6728 0x816E # <CJK>
+0xE448 0x6729 0x8165 # <CJK>
+0xE449 0x672A 0x8166 # <CJK>
+0xE44A 0x672B 0x8174 # <CJK>
+0xE44B 0x672C 0x8183 # <CJK>
+0xE44C 0x672D 0x8188 # <CJK>
+0xE44D 0x672E 0x818A # <CJK>
+0xE44E 0x672F 0x8180 # <CJK>
+0xE44F 0x6730 0x8182 # <CJK>
+0xE450 0x6731 0x81A0 # <CJK>
+0xE451 0x6732 0x8195 # <CJK>
+0xE452 0x6733 0x81A4 # <CJK>
+0xE453 0x6734 0x81A3 # <CJK>
+0xE454 0x6735 0x815F # <CJK>
+0xE455 0x6736 0x8193 # <CJK>
+0xE456 0x6737 0x81A9 # <CJK>
+0xE457 0x6738 0x81B0 # <CJK>
+0xE458 0x6739 0x81B5 # <CJK>
+0xE459 0x673A 0x81BE # <CJK>
+0xE45A 0x673B 0x81B8 # <CJK>
+0xE45B 0x673C 0x81BD # <CJK>
+0xE45C 0x673D 0x81C0 # <CJK>
+0xE45D 0x673E 0x81C2 # <CJK>
+0xE45E 0x673F 0x81BA # <CJK>
+0xE45F 0x6740 0x81C9 # <CJK>
+0xE460 0x6741 0x81CD # <CJK>
+0xE461 0x6742 0x81D1 # <CJK>
+0xE462 0x6743 0x81D9 # <CJK>
+0xE463 0x6744 0x81D8 # <CJK>
+0xE464 0x6745 0x81C8 # <CJK>
+0xE465 0x6746 0x81DA # <CJK>
+0xE466 0x6747 0x81DF # <CJK>
+0xE467 0x6748 0x81E0 # <CJK>
+0xE468 0x6749 0x81E7 # <CJK>
+0xE469 0x674A 0x81FA # <CJK>
+0xE46A 0x674B 0x81FB # <CJK>
+0xE46B 0x674C 0x81FE # <CJK>
+0xE46C 0x674D 0x8201 # <CJK>
+0xE46D 0x674E 0x8202 # <CJK>
+0xE46E 0x674F 0x8205 # <CJK>
+0xE46F 0x6750 0x8207 # <CJK>
+0xE470 0x6751 0x820A # <CJK>
+0xE471 0x6752 0x820D # <CJK>
+0xE472 0x6753 0x8210 # <CJK>
+0xE473 0x6754 0x8216 # <CJK>
+0xE474 0x6755 0x8229 # <CJK>
+0xE475 0x6756 0x822B # <CJK>
+0xE476 0x6757 0x8238 # <CJK>
+0xE477 0x6758 0x8233 # <CJK>
+0xE478 0x6759 0x8240 # <CJK>
+0xE479 0x675A 0x8259 # <CJK>
+0xE47A 0x675B 0x8258 # <CJK>
+0xE47B 0x675C 0x825D # <CJK>
+0xE47C 0x675D 0x825A # <CJK>
+0xE47D 0x675E 0x825F # <CJK>
+0xE47E 0x675F 0x8264 # <CJK>
+0xE480 0x6760 0x8262 # <CJK>
+0xE481 0x6761 0x8268 # <CJK>
+0xE482 0x6762 0x826A # <CJK>
+0xE483 0x6763 0x826B # <CJK>
+0xE484 0x6764 0x822E # <CJK>
+0xE485 0x6765 0x8271 # <CJK>
+0xE486 0x6766 0x8277 # <CJK>
+0xE487 0x6767 0x8278 # <CJK>
+0xE488 0x6768 0x827E # <CJK>
+0xE489 0x6769 0x828D # <CJK>
+0xE48A 0x676A 0x8292 # <CJK>
+0xE48B 0x676B 0x82AB # <CJK>
+0xE48C 0x676C 0x829F # <CJK>
+0xE48D 0x676D 0x82BB # <CJK>
+0xE48E 0x676E 0x82AC # <CJK>
+0xE48F 0x676F 0x82E1 # <CJK>
+0xE490 0x6770 0x82E3 # <CJK>
+0xE491 0x6771 0x82DF # <CJK>
+0xE492 0x6772 0x82D2 # <CJK>
+0xE493 0x6773 0x82F4 # <CJK>
+0xE494 0x6774 0x82F3 # <CJK>
+0xE495 0x6775 0x82FA # <CJK>
+0xE496 0x6776 0x8393 # <CJK>
+0xE497 0x6777 0x8303 # <CJK>
+0xE498 0x6778 0x82FB # <CJK>
+0xE499 0x6779 0x82F9 # <CJK>
+0xE49A 0x677A 0x82DE # <CJK>
+0xE49B 0x677B 0x8306 # <CJK>
+0xE49C 0x677C 0x82DC # <CJK>
+0xE49D 0x677D 0x8309 # <CJK>
+0xE49E 0x677E 0x82D9 # <CJK>
+0xE49F 0x6821 0x8335 # <CJK>
+0xE4A0 0x6822 0x8334 # <CJK>
+0xE4A1 0x6823 0x8316 # <CJK>
+0xE4A2 0x6824 0x8332 # <CJK>
+0xE4A3 0x6825 0x8331 # <CJK>
+0xE4A4 0x6826 0x8340 # <CJK>
+0xE4A5 0x6827 0x8339 # <CJK>
+0xE4A6 0x6828 0x8350 # <CJK>
+0xE4A7 0x6829 0x8345 # <CJK>
+0xE4A8 0x682A 0x832F # <CJK>
+0xE4A9 0x682B 0x832B # <CJK>
+0xE4AA 0x682C 0x8317 # <CJK>
+0xE4AB 0x682D 0x8318 # <CJK>
+0xE4AC 0x682E 0x8385 # <CJK>
+0xE4AD 0x682F 0x839A # <CJK>
+0xE4AE 0x6830 0x83AA # <CJK>
+0xE4AF 0x6831 0x839F # <CJK>
+0xE4B0 0x6832 0x83A2 # <CJK>
+0xE4B1 0x6833 0x8396 # <CJK>
+0xE4B2 0x6834 0x8323 # <CJK>
+0xE4B3 0x6835 0x838E # <CJK>
+0xE4B4 0x6836 0x8387 # <CJK>
+0xE4B5 0x6837 0x838A # <CJK>
+0xE4B6 0x6838 0x837C # <CJK>
+0xE4B7 0x6839 0x83B5 # <CJK>
+0xE4B8 0x683A 0x8373 # <CJK>
+0xE4B9 0x683B 0x8375 # <CJK>
+0xE4BA 0x683C 0x83A0 # <CJK>
+0xE4BB 0x683D 0x8389 # <CJK>
+0xE4BC 0x683E 0x83A8 # <CJK>
+0xE4BD 0x683F 0x83F4 # <CJK>
+0xE4BE 0x6840 0x8413 # <CJK>
+0xE4BF 0x6841 0x83EB # <CJK>
+0xE4C0 0x6842 0x83CE # <CJK>
+0xE4C1 0x6843 0x83FD # <CJK>
+0xE4C2 0x6844 0x8403 # <CJK>
+0xE4C3 0x6845 0x83D8 # <CJK>
+0xE4C4 0x6846 0x840B # <CJK>
+0xE4C5 0x6847 0x83C1 # <CJK>
+0xE4C6 0x6848 0x83F7 # <CJK>
+0xE4C7 0x6849 0x8407 # <CJK>
+0xE4C8 0x684A 0x83E0 # <CJK>
+0xE4C9 0x684B 0x83F2 # <CJK>
+0xE4CA 0x684C 0x840D # <CJK>
+0xE4CB 0x684D 0x8422 # <CJK>
+0xE4CC 0x684E 0x8420 # <CJK>
+0xE4CD 0x684F 0x83BD # <CJK>
+0xE4CE 0x6850 0x8438 # <CJK>
+0xE4CF 0x6851 0x8506 # <CJK>
+0xE4D0 0x6852 0x83FB # <CJK>
+0xE4D1 0x6853 0x846D # <CJK>
+0xE4D2 0x6854 0x842A # <CJK>
+0xE4D3 0x6855 0x843C # <CJK>
+0xE4D4 0x6856 0x855A # <CJK>
+0xE4D5 0x6857 0x8484 # <CJK>
+0xE4D6 0x6858 0x8477 # <CJK>
+0xE4D7 0x6859 0x846B # <CJK>
+0xE4D8 0x685A 0x84AD # <CJK>
+0xE4D9 0x685B 0x846E # <CJK>
+0xE4DA 0x685C 0x8482 # <CJK>
+0xE4DB 0x685D 0x8469 # <CJK>
+0xE4DC 0x685E 0x8446 # <CJK>
+0xE4DD 0x685F 0x842C # <CJK>
+0xE4DE 0x6860 0x846F # <CJK>
+0xE4DF 0x6861 0x8479 # <CJK>
+0xE4E0 0x6862 0x8435 # <CJK>
+0xE4E1 0x6863 0x84CA # <CJK>
+0xE4E2 0x6864 0x8462 # <CJK>
+0xE4E3 0x6865 0x84B9 # <CJK>
+0xE4E4 0x6866 0x84BF # <CJK>
+0xE4E5 0x6867 0x849F # <CJK>
+0xE4E6 0x6868 0x84D9 # <CJK>
+0xE4E7 0x6869 0x84CD # <CJK>
+0xE4E8 0x686A 0x84BB # <CJK>
+0xE4E9 0x686B 0x84DA # <CJK>
+0xE4EA 0x686C 0x84D0 # <CJK>
+0xE4EB 0x686D 0x84C1 # <CJK>
+0xE4EC 0x686E 0x84C6 # <CJK>
+0xE4ED 0x686F 0x84D6 # <CJK>
+0xE4EE 0x6870 0x84A1 # <CJK>
+0xE4EF 0x6871 0x8521 # <CJK>
+0xE4F0 0x6872 0x84FF # <CJK>
+0xE4F1 0x6873 0x84F4 # <CJK>
+0xE4F2 0x6874 0x8517 # <CJK>
+0xE4F3 0x6875 0x8518 # <CJK>
+0xE4F4 0x6876 0x852C # <CJK>
+0xE4F5 0x6877 0x851F # <CJK>
+0xE4F6 0x6878 0x8515 # <CJK>
+0xE4F7 0x6879 0x8514 # <CJK>
+0xE4F8 0x687A 0x84FC # <CJK>
+0xE4F9 0x687B 0x8540 # <CJK>
+0xE4FA 0x687C 0x8563 # <CJK>
+0xE4FB 0x687D 0x8558 # <CJK>
+0xE4FC 0x687E 0x8548 # <CJK>
+0xE540 0x6921 0x8541 # <CJK>
+0xE541 0x6922 0x8602 # <CJK>
+0xE542 0x6923 0x854B # <CJK>
+0xE543 0x6924 0x8555 # <CJK>
+0xE544 0x6925 0x8580 # <CJK>
+0xE545 0x6926 0x85A4 # <CJK>
+0xE546 0x6927 0x8588 # <CJK>
+0xE547 0x6928 0x8591 # <CJK>
+0xE548 0x6929 0x858A # <CJK>
+0xE549 0x692A 0x85A8 # <CJK>
+0xE54A 0x692B 0x856D # <CJK>
+0xE54B 0x692C 0x8594 # <CJK>
+0xE54C 0x692D 0x859B # <CJK>
+0xE54D 0x692E 0x85EA # <CJK>
+0xE54E 0x692F 0x8587 # <CJK>
+0xE54F 0x6930 0x859C # <CJK>
+0xE550 0x6931 0x8577 # <CJK>
+0xE551 0x6932 0x857E # <CJK>
+0xE552 0x6933 0x8590 # <CJK>
+0xE553 0x6934 0x85C9 # <CJK>
+0xE554 0x6935 0x85BA # <CJK>
+0xE555 0x6936 0x85CF # <CJK>
+0xE556 0x6937 0x85B9 # <CJK>
+0xE557 0x6938 0x85D0 # <CJK>
+0xE558 0x6939 0x85D5 # <CJK>
+0xE559 0x693A 0x85DD # <CJK>
+0xE55A 0x693B 0x85E5 # <CJK>
+0xE55B 0x693C 0x85DC # <CJK>
+0xE55C 0x693D 0x85F9 # <CJK>
+0xE55D 0x693E 0x860A # <CJK>
+0xE55E 0x693F 0x8613 # <CJK>
+0xE55F 0x6940 0x860B # <CJK>
+0xE560 0x6941 0x85FE # <CJK>
+0xE561 0x6942 0x85FA # <CJK>
+0xE562 0x6943 0x8606 # <CJK>
+0xE563 0x6944 0x8622 # <CJK>
+0xE564 0x6945 0x861A # <CJK>
+0xE565 0x6946 0x8630 # <CJK>
+0xE566 0x6947 0x863F # <CJK>
+0xE567 0x6948 0x864D # <CJK>
+0xE568 0x6949 0x4E55 # <CJK>
+0xE569 0x694A 0x8654 # <CJK>
+0xE56A 0x694B 0x865F # <CJK>
+0xE56B 0x694C 0x8667 # <CJK>
+0xE56C 0x694D 0x8671 # <CJK>
+0xE56D 0x694E 0x8693 # <CJK>
+0xE56E 0x694F 0x86A3 # <CJK>
+0xE56F 0x6950 0x86A9 # <CJK>
+0xE570 0x6951 0x86AA # <CJK>
+0xE571 0x6952 0x868B # <CJK>
+0xE572 0x6953 0x868C # <CJK>
+0xE573 0x6954 0x86B6 # <CJK>
+0xE574 0x6955 0x86AF # <CJK>
+0xE575 0x6956 0x86C4 # <CJK>
+0xE576 0x6957 0x86C6 # <CJK>
+0xE577 0x6958 0x86B0 # <CJK>
+0xE578 0x6959 0x86C9 # <CJK>
+0xE579 0x695A 0x8823 # <CJK>
+0xE57A 0x695B 0x86AB # <CJK>
+0xE57B 0x695C 0x86D4 # <CJK>
+0xE57C 0x695D 0x86DE # <CJK>
+0xE57D 0x695E 0x86E9 # <CJK>
+0xE57E 0x695F 0x86EC # <CJK>
+0xE580 0x6960 0x86DF # <CJK>
+0xE581 0x6961 0x86DB # <CJK>
+0xE582 0x6962 0x86EF # <CJK>
+0xE583 0x6963 0x8712 # <CJK>
+0xE584 0x6964 0x8706 # <CJK>
+0xE585 0x6965 0x8708 # <CJK>
+0xE586 0x6966 0x8700 # <CJK>
+0xE587 0x6967 0x8703 # <CJK>
+0xE588 0x6968 0x86FB # <CJK>
+0xE589 0x6969 0x8711 # <CJK>
+0xE58A 0x696A 0x8709 # <CJK>
+0xE58B 0x696B 0x870D # <CJK>
+0xE58C 0x696C 0x86F9 # <CJK>
+0xE58D 0x696D 0x870A # <CJK>
+0xE58E 0x696E 0x8734 # <CJK>
+0xE58F 0x696F 0x873F # <CJK>
+0xE590 0x6970 0x8737 # <CJK>
+0xE591 0x6971 0x873B # <CJK>
+0xE592 0x6972 0x8725 # <CJK>
+0xE593 0x6973 0x8729 # <CJK>
+0xE594 0x6974 0x871A # <CJK>
+0xE595 0x6975 0x8760 # <CJK>
+0xE596 0x6976 0x875F # <CJK>
+0xE597 0x6977 0x8778 # <CJK>
+0xE598 0x6978 0x874C # <CJK>
+0xE599 0x6979 0x874E # <CJK>
+0xE59A 0x697A 0x8774 # <CJK>
+0xE59B 0x697B 0x8757 # <CJK>
+0xE59C 0x697C 0x8768 # <CJK>
+0xE59D 0x697D 0x876E # <CJK>
+0xE59E 0x697E 0x8759 # <CJK>
+0xE59F 0x6A21 0x8753 # <CJK>
+0xE5A0 0x6A22 0x8763 # <CJK>
+0xE5A1 0x6A23 0x876A # <CJK>
+0xE5A2 0x6A24 0x8805 # <CJK>
+0xE5A3 0x6A25 0x87A2 # <CJK>
+0xE5A4 0x6A26 0x879F # <CJK>
+0xE5A5 0x6A27 0x8782 # <CJK>
+0xE5A6 0x6A28 0x87AF # <CJK>
+0xE5A7 0x6A29 0x87CB # <CJK>
+0xE5A8 0x6A2A 0x87BD # <CJK>
+0xE5A9 0x6A2B 0x87C0 # <CJK>
+0xE5AA 0x6A2C 0x87D0 # <CJK>
+0xE5AB 0x6A2D 0x96D6 # <CJK>
+0xE5AC 0x6A2E 0x87AB # <CJK>
+0xE5AD 0x6A2F 0x87C4 # <CJK>
+0xE5AE 0x6A30 0x87B3 # <CJK>
+0xE5AF 0x6A31 0x87C7 # <CJK>
+0xE5B0 0x6A32 0x87C6 # <CJK>
+0xE5B1 0x6A33 0x87BB # <CJK>
+0xE5B2 0x6A34 0x87EF # <CJK>
+0xE5B3 0x6A35 0x87F2 # <CJK>
+0xE5B4 0x6A36 0x87E0 # <CJK>
+0xE5B5 0x6A37 0x880F # <CJK>
+0xE5B6 0x6A38 0x880D # <CJK>
+0xE5B7 0x6A39 0x87FE # <CJK>
+0xE5B8 0x6A3A 0x87F6 # <CJK>
+0xE5B9 0x6A3B 0x87F7 # <CJK>
+0xE5BA 0x6A3C 0x880E # <CJK>
+0xE5BB 0x6A3D 0x87D2 # <CJK>
+0xE5BC 0x6A3E 0x8811 # <CJK>
+0xE5BD 0x6A3F 0x8816 # <CJK>
+0xE5BE 0x6A40 0x8815 # <CJK>
+0xE5BF 0x6A41 0x8822 # <CJK>
+0xE5C0 0x6A42 0x8821 # <CJK>
+0xE5C1 0x6A43 0x8831 # <CJK>
+0xE5C2 0x6A44 0x8836 # <CJK>
+0xE5C3 0x6A45 0x8839 # <CJK>
+0xE5C4 0x6A46 0x8827 # <CJK>
+0xE5C5 0x6A47 0x883B # <CJK>
+0xE5C6 0x6A48 0x8844 # <CJK>
+0xE5C7 0x6A49 0x8842 # <CJK>
+0xE5C8 0x6A4A 0x8852 # <CJK>
+0xE5C9 0x6A4B 0x8859 # <CJK>
+0xE5CA 0x6A4C 0x885E # <CJK>
+0xE5CB 0x6A4D 0x8862 # <CJK>
+0xE5CC 0x6A4E 0x886B # <CJK>
+0xE5CD 0x6A4F 0x8881 # <CJK>
+0xE5CE 0x6A50 0x887E # <CJK>
+0xE5CF 0x6A51 0x889E # <CJK>
+0xE5D0 0x6A52 0x8875 # <CJK>
+0xE5D1 0x6A53 0x887D # <CJK>
+0xE5D2 0x6A54 0x88B5 # <CJK>
+0xE5D3 0x6A55 0x8872 # <CJK>
+0xE5D4 0x6A56 0x8882 # <CJK>
+0xE5D5 0x6A57 0x8897 # <CJK>
+0xE5D6 0x6A58 0x8892 # <CJK>
+0xE5D7 0x6A59 0x88AE # <CJK>
+0xE5D8 0x6A5A 0x8899 # <CJK>
+0xE5D9 0x6A5B 0x88A2 # <CJK>
+0xE5DA 0x6A5C 0x888D # <CJK>
+0xE5DB 0x6A5D 0x88A4 # <CJK>
+0xE5DC 0x6A5E 0x88B0 # <CJK>
+0xE5DD 0x6A5F 0x88BF # <CJK>
+0xE5DE 0x6A60 0x88B1 # <CJK>
+0xE5DF 0x6A61 0x88C3 # <CJK>
+0xE5E0 0x6A62 0x88C4 # <CJK>
+0xE5E1 0x6A63 0x88D4 # <CJK>
+0xE5E2 0x6A64 0x88D8 # <CJK>
+0xE5E3 0x6A65 0x88D9 # <CJK>
+0xE5E4 0x6A66 0x88DD # <CJK>
+0xE5E5 0x6A67 0x88F9 # <CJK>
+0xE5E6 0x6A68 0x8902 # <CJK>
+0xE5E7 0x6A69 0x88FC # <CJK>
+0xE5E8 0x6A6A 0x88F4 # <CJK>
+0xE5E9 0x6A6B 0x88E8 # <CJK>
+0xE5EA 0x6A6C 0x88F2 # <CJK>
+0xE5EB 0x6A6D 0x8904 # <CJK>
+0xE5EC 0x6A6E 0x890C # <CJK>
+0xE5ED 0x6A6F 0x890A # <CJK>
+0xE5EE 0x6A70 0x8913 # <CJK>
+0xE5EF 0x6A71 0x8943 # <CJK>
+0xE5F0 0x6A72 0x891E # <CJK>
+0xE5F1 0x6A73 0x8925 # <CJK>
+0xE5F2 0x6A74 0x892A # <CJK>
+0xE5F3 0x6A75 0x892B # <CJK>
+0xE5F4 0x6A76 0x8941 # <CJK>
+0xE5F5 0x6A77 0x8944 # <CJK>
+0xE5F6 0x6A78 0x893B # <CJK>
+0xE5F7 0x6A79 0x8936 # <CJK>
+0xE5F8 0x6A7A 0x8938 # <CJK>
+0xE5F9 0x6A7B 0x894C # <CJK>
+0xE5FA 0x6A7C 0x891D # <CJK>
+0xE5FB 0x6A7D 0x8960 # <CJK>
+0xE5FC 0x6A7E 0x895E # <CJK>
+0xE640 0x6B21 0x8966 # <CJK>
+0xE641 0x6B22 0x8964 # <CJK>
+0xE642 0x6B23 0x896D # <CJK>
+0xE643 0x6B24 0x896A # <CJK>
+0xE644 0x6B25 0x896F # <CJK>
+0xE645 0x6B26 0x8974 # <CJK>
+0xE646 0x6B27 0x8977 # <CJK>
+0xE647 0x6B28 0x897E # <CJK>
+0xE648 0x6B29 0x8983 # <CJK>
+0xE649 0x6B2A 0x8988 # <CJK>
+0xE64A 0x6B2B 0x898A # <CJK>
+0xE64B 0x6B2C 0x8993 # <CJK>
+0xE64C 0x6B2D 0x8998 # <CJK>
+0xE64D 0x6B2E 0x89A1 # <CJK>
+0xE64E 0x6B2F 0x89A9 # <CJK>
+0xE64F 0x6B30 0x89A6 # <CJK>
+0xE650 0x6B31 0x89AC # <CJK>
+0xE651 0x6B32 0x89AF # <CJK>
+0xE652 0x6B33 0x89B2 # <CJK>
+0xE653 0x6B34 0x89BA # <CJK>
+0xE654 0x6B35 0x89BD # <CJK>
+0xE655 0x6B36 0x89BF # <CJK>
+0xE656 0x6B37 0x89C0 # <CJK>
+0xE657 0x6B38 0x89DA # <CJK>
+0xE658 0x6B39 0x89DC # <CJK>
+0xE659 0x6B3A 0x89DD # <CJK>
+0xE65A 0x6B3B 0x89E7 # <CJK>
+0xE65B 0x6B3C 0x89F4 # <CJK>
+0xE65C 0x6B3D 0x89F8 # <CJK>
+0xE65D 0x6B3E 0x8A03 # <CJK>
+0xE65E 0x6B3F 0x8A16 # <CJK>
+0xE65F 0x6B40 0x8A10 # <CJK>
+0xE660 0x6B41 0x8A0C # <CJK>
+0xE661 0x6B42 0x8A1B # <CJK>
+0xE662 0x6B43 0x8A1D # <CJK>
+0xE663 0x6B44 0x8A25 # <CJK>
+0xE664 0x6B45 0x8A36 # <CJK>
+0xE665 0x6B46 0x8A41 # <CJK>
+0xE666 0x6B47 0x8A5B # <CJK>
+0xE667 0x6B48 0x8A52 # <CJK>
+0xE668 0x6B49 0x8A46 # <CJK>
+0xE669 0x6B4A 0x8A48 # <CJK>
+0xE66A 0x6B4B 0x8A7C # <CJK>
+0xE66B 0x6B4C 0x8A6D # <CJK>
+0xE66C 0x6B4D 0x8A6C # <CJK>
+0xE66D 0x6B4E 0x8A62 # <CJK>
+0xE66E 0x6B4F 0x8A85 # <CJK>
+0xE66F 0x6B50 0x8A82 # <CJK>
+0xE670 0x6B51 0x8A84 # <CJK>
+0xE671 0x6B52 0x8AA8 # <CJK>
+0xE672 0x6B53 0x8AA1 # <CJK>
+0xE673 0x6B54 0x8A91 # <CJK>
+0xE674 0x6B55 0x8AA5 # <CJK>
+0xE675 0x6B56 0x8AA6 # <CJK>
+0xE676 0x6B57 0x8A9A # <CJK>
+0xE677 0x6B58 0x8AA3 # <CJK>
+0xE678 0x6B59 0x8AC4 # <CJK>
+0xE679 0x6B5A 0x8ACD # <CJK>
+0xE67A 0x6B5B 0x8AC2 # <CJK>
+0xE67B 0x6B5C 0x8ADA # <CJK>
+0xE67C 0x6B5D 0x8AEB # <CJK>
+0xE67D 0x6B5E 0x8AF3 # <CJK>
+0xE67E 0x6B5F 0x8AE7 # <CJK>
+0xE680 0x6B60 0x8AE4 # <CJK>
+0xE681 0x6B61 0x8AF1 # <CJK>
+0xE682 0x6B62 0x8B14 # <CJK>
+0xE683 0x6B63 0x8AE0 # <CJK>
+0xE684 0x6B64 0x8AE2 # <CJK>
+0xE685 0x6B65 0x8AF7 # <CJK>
+0xE686 0x6B66 0x8ADE # <CJK>
+0xE687 0x6B67 0x8ADB # <CJK>
+0xE688 0x6B68 0x8B0C # <CJK>
+0xE689 0x6B69 0x8B07 # <CJK>
+0xE68A 0x6B6A 0x8B1A # <CJK>
+0xE68B 0x6B6B 0x8AE1 # <CJK>
+0xE68C 0x6B6C 0x8B16 # <CJK>
+0xE68D 0x6B6D 0x8B10 # <CJK>
+0xE68E 0x6B6E 0x8B17 # <CJK>
+0xE68F 0x6B6F 0x8B20 # <CJK>
+0xE690 0x6B70 0x8B33 # <CJK>
+0xE691 0x6B71 0x97AB # <CJK>
+0xE692 0x6B72 0x8B26 # <CJK>
+0xE693 0x6B73 0x8B2B # <CJK>
+0xE694 0x6B74 0x8B3E # <CJK>
+0xE695 0x6B75 0x8B28 # <CJK>
+0xE696 0x6B76 0x8B41 # <CJK>
+0xE697 0x6B77 0x8B4C # <CJK>
+0xE698 0x6B78 0x8B4F # <CJK>
+0xE699 0x6B79 0x8B4E # <CJK>
+0xE69A 0x6B7A 0x8B49 # <CJK>
+0xE69B 0x6B7B 0x8B56 # <CJK>
+0xE69C 0x6B7C 0x8B5B # <CJK>
+0xE69D 0x6B7D 0x8B5A # <CJK>
+0xE69E 0x6B7E 0x8B6B # <CJK>
+0xE69F 0x6C21 0x8B5F # <CJK>
+0xE6A0 0x6C22 0x8B6C # <CJK>
+0xE6A1 0x6C23 0x8B6F # <CJK>
+0xE6A2 0x6C24 0x8B74 # <CJK>
+0xE6A3 0x6C25 0x8B7D # <CJK>
+0xE6A4 0x6C26 0x8B80 # <CJK>
+0xE6A5 0x6C27 0x8B8C # <CJK>
+0xE6A6 0x6C28 0x8B8E # <CJK>
+0xE6A7 0x6C29 0x8B92 # <CJK>
+0xE6A8 0x6C2A 0x8B93 # <CJK>
+0xE6A9 0x6C2B 0x8B96 # <CJK>
+0xE6AA 0x6C2C 0x8B99 # <CJK>
+0xE6AB 0x6C2D 0x8B9A # <CJK>
+0xE6AC 0x6C2E 0x8C3A # <CJK>
+0xE6AD 0x6C2F 0x8C41 # <CJK>
+0xE6AE 0x6C30 0x8C3F # <CJK>
+0xE6AF 0x6C31 0x8C48 # <CJK>
+0xE6B0 0x6C32 0x8C4C # <CJK>
+0xE6B1 0x6C33 0x8C4E # <CJK>
+0xE6B2 0x6C34 0x8C50 # <CJK>
+0xE6B3 0x6C35 0x8C55 # <CJK>
+0xE6B4 0x6C36 0x8C62 # <CJK>
+0xE6B5 0x6C37 0x8C6C # <CJK>
+0xE6B6 0x6C38 0x8C78 # <CJK>
+0xE6B7 0x6C39 0x8C7A # <CJK>
+0xE6B8 0x6C3A 0x8C82 # <CJK>
+0xE6B9 0x6C3B 0x8C89 # <CJK>
+0xE6BA 0x6C3C 0x8C85 # <CJK>
+0xE6BB 0x6C3D 0x8C8A # <CJK>
+0xE6BC 0x6C3E 0x8C8D # <CJK>
+0xE6BD 0x6C3F 0x8C8E # <CJK>
+0xE6BE 0x6C40 0x8C94 # <CJK>
+0xE6BF 0x6C41 0x8C7C # <CJK>
+0xE6C0 0x6C42 0x8C98 # <CJK>
+0xE6C1 0x6C43 0x621D # <CJK>
+0xE6C2 0x6C44 0x8CAD # <CJK>
+0xE6C3 0x6C45 0x8CAA # <CJK>
+0xE6C4 0x6C46 0x8CBD # <CJK>
+0xE6C5 0x6C47 0x8CB2 # <CJK>
+0xE6C6 0x6C48 0x8CB3 # <CJK>
+0xE6C7 0x6C49 0x8CAE # <CJK>
+0xE6C8 0x6C4A 0x8CB6 # <CJK>
+0xE6C9 0x6C4B 0x8CC8 # <CJK>
+0xE6CA 0x6C4C 0x8CC1 # <CJK>
+0xE6CB 0x6C4D 0x8CE4 # <CJK>
+0xE6CC 0x6C4E 0x8CE3 # <CJK>
+0xE6CD 0x6C4F 0x8CDA # <CJK>
+0xE6CE 0x6C50 0x8CFD # <CJK>
+0xE6CF 0x6C51 0x8CFA # <CJK>
+0xE6D0 0x6C52 0x8CFB # <CJK>
+0xE6D1 0x6C53 0x8D04 # <CJK>
+0xE6D2 0x6C54 0x8D05 # <CJK>
+0xE6D3 0x6C55 0x8D0A # <CJK>
+0xE6D4 0x6C56 0x8D07 # <CJK>
+0xE6D5 0x6C57 0x8D0F # <CJK>
+0xE6D6 0x6C58 0x8D0D # <CJK>
+0xE6D7 0x6C59 0x8D10 # <CJK>
+0xE6D8 0x6C5A 0x9F4E # <CJK>
+0xE6D9 0x6C5B 0x8D13 # <CJK>
+0xE6DA 0x6C5C 0x8CCD # <CJK>
+0xE6DB 0x6C5D 0x8D14 # <CJK>
+0xE6DC 0x6C5E 0x8D16 # <CJK>
+0xE6DD 0x6C5F 0x8D67 # <CJK>
+0xE6DE 0x6C60 0x8D6D # <CJK>
+0xE6DF 0x6C61 0x8D71 # <CJK>
+0xE6E0 0x6C62 0x8D73 # <CJK>
+0xE6E1 0x6C63 0x8D81 # <CJK>
+0xE6E2 0x6C64 0x8D99 # <CJK>
+0xE6E3 0x6C65 0x8DC2 # <CJK>
+0xE6E4 0x6C66 0x8DBE # <CJK>
+0xE6E5 0x6C67 0x8DBA # <CJK>
+0xE6E6 0x6C68 0x8DCF # <CJK>
+0xE6E7 0x6C69 0x8DDA # <CJK>
+0xE6E8 0x6C6A 0x8DD6 # <CJK>
+0xE6E9 0x6C6B 0x8DCC # <CJK>
+0xE6EA 0x6C6C 0x8DDB # <CJK>
+0xE6EB 0x6C6D 0x8DCB # <CJK>
+0xE6EC 0x6C6E 0x8DEA # <CJK>
+0xE6ED 0x6C6F 0x8DEB # <CJK>
+0xE6EE 0x6C70 0x8DDF # <CJK>
+0xE6EF 0x6C71 0x8DE3 # <CJK>
+0xE6F0 0x6C72 0x8DFC # <CJK>
+0xE6F1 0x6C73 0x8E08 # <CJK>
+0xE6F2 0x6C74 0x8E09 # <CJK>
+0xE6F3 0x6C75 0x8DFF # <CJK>
+0xE6F4 0x6C76 0x8E1D # <CJK>
+0xE6F5 0x6C77 0x8E1E # <CJK>
+0xE6F6 0x6C78 0x8E10 # <CJK>
+0xE6F7 0x6C79 0x8E1F # <CJK>
+0xE6F8 0x6C7A 0x8E42 # <CJK>
+0xE6F9 0x6C7B 0x8E35 # <CJK>
+0xE6FA 0x6C7C 0x8E30 # <CJK>
+0xE6FB 0x6C7D 0x8E34 # <CJK>
+0xE6FC 0x6C7E 0x8E4A # <CJK>
+0xE740 0x6D21 0x8E47 # <CJK>
+0xE741 0x6D22 0x8E49 # <CJK>
+0xE742 0x6D23 0x8E4C # <CJK>
+0xE743 0x6D24 0x8E50 # <CJK>
+0xE744 0x6D25 0x8E48 # <CJK>
+0xE745 0x6D26 0x8E59 # <CJK>
+0xE746 0x6D27 0x8E64 # <CJK>
+0xE747 0x6D28 0x8E60 # <CJK>
+0xE748 0x6D29 0x8E2A # <CJK>
+0xE749 0x6D2A 0x8E63 # <CJK>
+0xE74A 0x6D2B 0x8E55 # <CJK>
+0xE74B 0x6D2C 0x8E76 # <CJK>
+0xE74C 0x6D2D 0x8E72 # <CJK>
+0xE74D 0x6D2E 0x8E7C # <CJK>
+0xE74E 0x6D2F 0x8E81 # <CJK>
+0xE74F 0x6D30 0x8E87 # <CJK>
+0xE750 0x6D31 0x8E85 # <CJK>
+0xE751 0x6D32 0x8E84 # <CJK>
+0xE752 0x6D33 0x8E8B # <CJK>
+0xE753 0x6D34 0x8E8A # <CJK>
+0xE754 0x6D35 0x8E93 # <CJK>
+0xE755 0x6D36 0x8E91 # <CJK>
+0xE756 0x6D37 0x8E94 # <CJK>
+0xE757 0x6D38 0x8E99 # <CJK>
+0xE758 0x6D39 0x8EAA # <CJK>
+0xE759 0x6D3A 0x8EA1 # <CJK>
+0xE75A 0x6D3B 0x8EAC # <CJK>
+0xE75B 0x6D3C 0x8EB0 # <CJK>
+0xE75C 0x6D3D 0x8EC6 # <CJK>
+0xE75D 0x6D3E 0x8EB1 # <CJK>
+0xE75E 0x6D3F 0x8EBE # <CJK>
+0xE75F 0x6D40 0x8EC5 # <CJK>
+0xE760 0x6D41 0x8EC8 # <CJK>
+0xE761 0x6D42 0x8ECB # <CJK>
+0xE762 0x6D43 0x8EDB # <CJK>
+0xE763 0x6D44 0x8EE3 # <CJK>
+0xE764 0x6D45 0x8EFC # <CJK>
+0xE765 0x6D46 0x8EFB # <CJK>
+0xE766 0x6D47 0x8EEB # <CJK>
+0xE767 0x6D48 0x8EFE # <CJK>
+0xE768 0x6D49 0x8F0A # <CJK>
+0xE769 0x6D4A 0x8F05 # <CJK>
+0xE76A 0x6D4B 0x8F15 # <CJK>
+0xE76B 0x6D4C 0x8F12 # <CJK>
+0xE76C 0x6D4D 0x8F19 # <CJK>
+0xE76D 0x6D4E 0x8F13 # <CJK>
+0xE76E 0x6D4F 0x8F1C # <CJK>
+0xE76F 0x6D50 0x8F1F # <CJK>
+0xE770 0x6D51 0x8F1B # <CJK>
+0xE771 0x6D52 0x8F0C # <CJK>
+0xE772 0x6D53 0x8F26 # <CJK>
+0xE773 0x6D54 0x8F33 # <CJK>
+0xE774 0x6D55 0x8F3B # <CJK>
+0xE775 0x6D56 0x8F39 # <CJK>
+0xE776 0x6D57 0x8F45 # <CJK>
+0xE777 0x6D58 0x8F42 # <CJK>
+0xE778 0x6D59 0x8F3E # <CJK>
+0xE779 0x6D5A 0x8F4C # <CJK>
+0xE77A 0x6D5B 0x8F49 # <CJK>
+0xE77B 0x6D5C 0x8F46 # <CJK>
+0xE77C 0x6D5D 0x8F4E # <CJK>
+0xE77D 0x6D5E 0x8F57 # <CJK>
+0xE77E 0x6D5F 0x8F5C # <CJK>
+0xE780 0x6D60 0x8F62 # <CJK>
+0xE781 0x6D61 0x8F63 # <CJK>
+0xE782 0x6D62 0x8F64 # <CJK>
+0xE783 0x6D63 0x8F9C # <CJK>
+0xE784 0x6D64 0x8F9F # <CJK>
+0xE785 0x6D65 0x8FA3 # <CJK>
+0xE786 0x6D66 0x8FAD # <CJK>
+0xE787 0x6D67 0x8FAF # <CJK>
+0xE788 0x6D68 0x8FB7 # <CJK>
+0xE789 0x6D69 0x8FDA # <CJK>
+0xE78A 0x6D6A 0x8FE5 # <CJK>
+0xE78B 0x6D6B 0x8FE2 # <CJK>
+0xE78C 0x6D6C 0x8FEA # <CJK>
+0xE78D 0x6D6D 0x8FEF # <CJK>
+0xE78E 0x6D6E 0x9087 # <CJK>
+0xE78F 0x6D6F 0x8FF4 # <CJK>
+0xE790 0x6D70 0x9005 # <CJK>
+0xE791 0x6D71 0x8FF9 # <CJK>
+0xE792 0x6D72 0x8FFA # <CJK>
+0xE793 0x6D73 0x9011 # <CJK>
+0xE794 0x6D74 0x9015 # <CJK>
+0xE795 0x6D75 0x9021 # <CJK>
+0xE796 0x6D76 0x900D # <CJK>
+0xE797 0x6D77 0x901E # <CJK>
+0xE798 0x6D78 0x9016 # <CJK>
+0xE799 0x6D79 0x900B # <CJK>
+0xE79A 0x6D7A 0x9027 # <CJK>
+0xE79B 0x6D7B 0x9036 # <CJK>
+0xE79C 0x6D7C 0x9035 # <CJK>
+0xE79D 0x6D7D 0x9039 # <CJK>
+0xE79E 0x6D7E 0x8FF8 # <CJK>
+0xE79F 0x6E21 0x904F # <CJK>
+0xE7A0 0x6E22 0x9050 # <CJK>
+0xE7A1 0x6E23 0x9051 # <CJK>
+0xE7A2 0x6E24 0x9052 # <CJK>
+0xE7A3 0x6E25 0x900E # <CJK>
+0xE7A4 0x6E26 0x9049 # <CJK>
+0xE7A5 0x6E27 0x903E # <CJK>
+0xE7A6 0x6E28 0x9056 # <CJK>
+0xE7A7 0x6E29 0x9058 # <CJK>
+0xE7A8 0x6E2A 0x905E # <CJK>
+0xE7A9 0x6E2B 0x9068 # <CJK>
+0xE7AA 0x6E2C 0x906F # <CJK>
+0xE7AB 0x6E2D 0x9076 # <CJK>
+0xE7AC 0x6E2E 0x96A8 # <CJK>
+0xE7AD 0x6E2F 0x9072 # <CJK>
+0xE7AE 0x6E30 0x9082 # <CJK>
+0xE7AF 0x6E31 0x907D # <CJK>
+0xE7B0 0x6E32 0x9081 # <CJK>
+0xE7B1 0x6E33 0x9080 # <CJK>
+0xE7B2 0x6E34 0x908A # <CJK>
+0xE7B3 0x6E35 0x9089 # <CJK>
+0xE7B4 0x6E36 0x908F # <CJK>
+0xE7B5 0x6E37 0x90A8 # <CJK>
+0xE7B6 0x6E38 0x90AF # <CJK>
+0xE7B7 0x6E39 0x90B1 # <CJK>
+0xE7B8 0x6E3A 0x90B5 # <CJK>
+0xE7B9 0x6E3B 0x90E2 # <CJK>
+0xE7BA 0x6E3C 0x90E4 # <CJK>
+0xE7BB 0x6E3D 0x6248 # <CJK>
+0xE7BC 0x6E3E 0x90DB # <CJK>
+0xE7BD 0x6E3F 0x9102 # <CJK>
+0xE7BE 0x6E40 0x9112 # <CJK>
+0xE7BF 0x6E41 0x9119 # <CJK>
+0xE7C0 0x6E42 0x9132 # <CJK>
+0xE7C1 0x6E43 0x9130 # <CJK>
+0xE7C2 0x6E44 0x914A # <CJK>
+0xE7C3 0x6E45 0x9156 # <CJK>
+0xE7C4 0x6E46 0x9158 # <CJK>
+0xE7C5 0x6E47 0x9163 # <CJK>
+0xE7C6 0x6E48 0x9165 # <CJK>
+0xE7C7 0x6E49 0x9169 # <CJK>
+0xE7C8 0x6E4A 0x9173 # <CJK>
+0xE7C9 0x6E4B 0x9172 # <CJK>
+0xE7CA 0x6E4C 0x918B # <CJK>
+0xE7CB 0x6E4D 0x9189 # <CJK>
+0xE7CC 0x6E4E 0x9182 # <CJK>
+0xE7CD 0x6E4F 0x91A2 # <CJK>
+0xE7CE 0x6E50 0x91AB # <CJK>
+0xE7CF 0x6E51 0x91AF # <CJK>
+0xE7D0 0x6E52 0x91AA # <CJK>
+0xE7D1 0x6E53 0x91B5 # <CJK>
+0xE7D2 0x6E54 0x91B4 # <CJK>
+0xE7D3 0x6E55 0x91BA # <CJK>
+0xE7D4 0x6E56 0x91C0 # <CJK>
+0xE7D5 0x6E57 0x91C1 # <CJK>
+0xE7D6 0x6E58 0x91C9 # <CJK>
+0xE7D7 0x6E59 0x91CB # <CJK>
+0xE7D8 0x6E5A 0x91D0 # <CJK>
+0xE7D9 0x6E5B 0x91D6 # <CJK>
+0xE7DA 0x6E5C 0x91DF # <CJK>
+0xE7DB 0x6E5D 0x91E1 # <CJK>
+0xE7DC 0x6E5E 0x91DB # <CJK>
+0xE7DD 0x6E5F 0x91FC # <CJK>
+0xE7DE 0x6E60 0x91F5 # <CJK>
+0xE7DF 0x6E61 0x91F6 # <CJK>
+0xE7E0 0x6E62 0x921E # <CJK>
+0xE7E1 0x6E63 0x91FF # <CJK>
+0xE7E2 0x6E64 0x9214 # <CJK>
+0xE7E3 0x6E65 0x922C # <CJK>
+0xE7E4 0x6E66 0x9215 # <CJK>
+0xE7E5 0x6E67 0x9211 # <CJK>
+0xE7E6 0x6E68 0x925E # <CJK>
+0xE7E7 0x6E69 0x9257 # <CJK>
+0xE7E8 0x6E6A 0x9245 # <CJK>
+0xE7E9 0x6E6B 0x9249 # <CJK>
+0xE7EA 0x6E6C 0x9264 # <CJK>
+0xE7EB 0x6E6D 0x9248 # <CJK>
+0xE7EC 0x6E6E 0x9295 # <CJK>
+0xE7ED 0x6E6F 0x923F # <CJK>
+0xE7EE 0x6E70 0x924B # <CJK>
+0xE7EF 0x6E71 0x9250 # <CJK>
+0xE7F0 0x6E72 0x929C # <CJK>
+0xE7F1 0x6E73 0x9296 # <CJK>
+0xE7F2 0x6E74 0x9293 # <CJK>
+0xE7F3 0x6E75 0x929B # <CJK>
+0xE7F4 0x6E76 0x925A # <CJK>
+0xE7F5 0x6E77 0x92CF # <CJK>
+0xE7F6 0x6E78 0x92B9 # <CJK>
+0xE7F7 0x6E79 0x92B7 # <CJK>
+0xE7F8 0x6E7A 0x92E9 # <CJK>
+0xE7F9 0x6E7B 0x930F # <CJK>
+0xE7FA 0x6E7C 0x92FA # <CJK>
+0xE7FB 0x6E7D 0x9344 # <CJK>
+0xE7FC 0x6E7E 0x932E # <CJK>
+0xE840 0x6F21 0x9319 # <CJK>
+0xE841 0x6F22 0x9322 # <CJK>
+0xE842 0x6F23 0x931A # <CJK>
+0xE843 0x6F24 0x9323 # <CJK>
+0xE844 0x6F25 0x933A # <CJK>
+0xE845 0x6F26 0x9335 # <CJK>
+0xE846 0x6F27 0x933B # <CJK>
+0xE847 0x6F28 0x935C # <CJK>
+0xE848 0x6F29 0x9360 # <CJK>
+0xE849 0x6F2A 0x937C # <CJK>
+0xE84A 0x6F2B 0x936E # <CJK>
+0xE84B 0x6F2C 0x9356 # <CJK>
+0xE84C 0x6F2D 0x93B0 # <CJK>
+0xE84D 0x6F2E 0x93AC # <CJK>
+0xE84E 0x6F2F 0x93AD # <CJK>
+0xE84F 0x6F30 0x9394 # <CJK>
+0xE850 0x6F31 0x93B9 # <CJK>
+0xE851 0x6F32 0x93D6 # <CJK>
+0xE852 0x6F33 0x93D7 # <CJK>
+0xE853 0x6F34 0x93E8 # <CJK>
+0xE854 0x6F35 0x93E5 # <CJK>
+0xE855 0x6F36 0x93D8 # <CJK>
+0xE856 0x6F37 0x93C3 # <CJK>
+0xE857 0x6F38 0x93DD # <CJK>
+0xE858 0x6F39 0x93D0 # <CJK>
+0xE859 0x6F3A 0x93C8 # <CJK>
+0xE85A 0x6F3B 0x93E4 # <CJK>
+0xE85B 0x6F3C 0x941A # <CJK>
+0xE85C 0x6F3D 0x9414 # <CJK>
+0xE85D 0x6F3E 0x9413 # <CJK>
+0xE85E 0x6F3F 0x9403 # <CJK>
+0xE85F 0x6F40 0x9407 # <CJK>
+0xE860 0x6F41 0x9410 # <CJK>
+0xE861 0x6F42 0x9436 # <CJK>
+0xE862 0x6F43 0x942B # <CJK>
+0xE863 0x6F44 0x9435 # <CJK>
+0xE864 0x6F45 0x9421 # <CJK>
+0xE865 0x6F46 0x943A # <CJK>
+0xE866 0x6F47 0x9441 # <CJK>
+0xE867 0x6F48 0x9452 # <CJK>
+0xE868 0x6F49 0x9444 # <CJK>
+0xE869 0x6F4A 0x945B # <CJK>
+0xE86A 0x6F4B 0x9460 # <CJK>
+0xE86B 0x6F4C 0x9462 # <CJK>
+0xE86C 0x6F4D 0x945E # <CJK>
+0xE86D 0x6F4E 0x946A # <CJK>
+0xE86E 0x6F4F 0x9229 # <CJK>
+0xE86F 0x6F50 0x9470 # <CJK>
+0xE870 0x6F51 0x9475 # <CJK>
+0xE871 0x6F52 0x9477 # <CJK>
+0xE872 0x6F53 0x947D # <CJK>
+0xE873 0x6F54 0x945A # <CJK>
+0xE874 0x6F55 0x947C # <CJK>
+0xE875 0x6F56 0x947E # <CJK>
+0xE876 0x6F57 0x9481 # <CJK>
+0xE877 0x6F58 0x947F # <CJK>
+0xE878 0x6F59 0x9582 # <CJK>
+0xE879 0x6F5A 0x9587 # <CJK>
+0xE87A 0x6F5B 0x958A # <CJK>
+0xE87B 0x6F5C 0x9594 # <CJK>
+0xE87C 0x6F5D 0x9596 # <CJK>
+0xE87D 0x6F5E 0x9598 # <CJK>
+0xE87E 0x6F5F 0x9599 # <CJK>
+0xE880 0x6F60 0x95A0 # <CJK>
+0xE881 0x6F61 0x95A8 # <CJK>
+0xE882 0x6F62 0x95A7 # <CJK>
+0xE883 0x6F63 0x95AD # <CJK>
+0xE884 0x6F64 0x95BC # <CJK>
+0xE885 0x6F65 0x95BB # <CJK>
+0xE886 0x6F66 0x95B9 # <CJK>
+0xE887 0x6F67 0x95BE # <CJK>
+0xE888 0x6F68 0x95CA # <CJK>
+0xE889 0x6F69 0x6FF6 # <CJK>
+0xE88A 0x6F6A 0x95C3 # <CJK>
+0xE88B 0x6F6B 0x95CD # <CJK>
+0xE88C 0x6F6C 0x95CC # <CJK>
+0xE88D 0x6F6D 0x95D5 # <CJK>
+0xE88E 0x6F6E 0x95D4 # <CJK>
+0xE88F 0x6F6F 0x95D6 # <CJK>
+0xE890 0x6F70 0x95DC # <CJK>
+0xE891 0x6F71 0x95E1 # <CJK>
+0xE892 0x6F72 0x95E5 # <CJK>
+0xE893 0x6F73 0x95E2 # <CJK>
+0xE894 0x6F74 0x9621 # <CJK>
+0xE895 0x6F75 0x9628 # <CJK>
+0xE896 0x6F76 0x962E # <CJK>
+0xE897 0x6F77 0x962F # <CJK>
+0xE898 0x6F78 0x9642 # <CJK>
+0xE899 0x6F79 0x964C # <CJK>
+0xE89A 0x6F7A 0x964F # <CJK>
+0xE89B 0x6F7B 0x964B # <CJK>
+0xE89C 0x6F7C 0x9677 # <CJK>
+0xE89D 0x6F7D 0x965C # <CJK>
+0xE89E 0x6F7E 0x965E # <CJK>
+0xE89F 0x7021 0x965D # <CJK>
+0xE8A0 0x7022 0x965F # <CJK>
+0xE8A1 0x7023 0x9666 # <CJK>
+0xE8A2 0x7024 0x9672 # <CJK>
+0xE8A3 0x7025 0x966C # <CJK>
+0xE8A4 0x7026 0x968D # <CJK>
+0xE8A5 0x7027 0x9698 # <CJK>
+0xE8A6 0x7028 0x9695 # <CJK>
+0xE8A7 0x7029 0x9697 # <CJK>
+0xE8A8 0x702A 0x96AA # <CJK>
+0xE8A9 0x702B 0x96A7 # <CJK>
+0xE8AA 0x702C 0x96B1 # <CJK>
+0xE8AB 0x702D 0x96B2 # <CJK>
+0xE8AC 0x702E 0x96B0 # <CJK>
+0xE8AD 0x702F 0x96B4 # <CJK>
+0xE8AE 0x7030 0x96B6 # <CJK>
+0xE8AF 0x7031 0x96B8 # <CJK>
+0xE8B0 0x7032 0x96B9 # <CJK>
+0xE8B1 0x7033 0x96CE # <CJK>
+0xE8B2 0x7034 0x96CB # <CJK>
+0xE8B3 0x7035 0x96C9 # <CJK>
+0xE8B4 0x7036 0x96CD # <CJK>
+0xE8B5 0x7037 0x894D # <CJK>
+0xE8B6 0x7038 0x96DC # <CJK>
+0xE8B7 0x7039 0x970D # <CJK>
+0xE8B8 0x703A 0x96D5 # <CJK>
+0xE8B9 0x703B 0x96F9 # <CJK>
+0xE8BA 0x703C 0x9704 # <CJK>
+0xE8BB 0x703D 0x9706 # <CJK>
+0xE8BC 0x703E 0x9708 # <CJK>
+0xE8BD 0x703F 0x9713 # <CJK>
+0xE8BE 0x7040 0x970E # <CJK>
+0xE8BF 0x7041 0x9711 # <CJK>
+0xE8C0 0x7042 0x970F # <CJK>
+0xE8C1 0x7043 0x9716 # <CJK>
+0xE8C2 0x7044 0x9719 # <CJK>
+0xE8C3 0x7045 0x9724 # <CJK>
+0xE8C4 0x7046 0x972A # <CJK>
+0xE8C5 0x7047 0x9730 # <CJK>
+0xE8C6 0x7048 0x9739 # <CJK>
+0xE8C7 0x7049 0x973D # <CJK>
+0xE8C8 0x704A 0x973E # <CJK>
+0xE8C9 0x704B 0x9744 # <CJK>
+0xE8CA 0x704C 0x9746 # <CJK>
+0xE8CB 0x704D 0x9748 # <CJK>
+0xE8CC 0x704E 0x9742 # <CJK>
+0xE8CD 0x704F 0x9749 # <CJK>
+0xE8CE 0x7050 0x975C # <CJK>
+0xE8CF 0x7051 0x9760 # <CJK>
+0xE8D0 0x7052 0x9764 # <CJK>
+0xE8D1 0x7053 0x9766 # <CJK>
+0xE8D2 0x7054 0x9768 # <CJK>
+0xE8D3 0x7055 0x52D2 # <CJK>
+0xE8D4 0x7056 0x976B # <CJK>
+0xE8D5 0x7057 0x9771 # <CJK>
+0xE8D6 0x7058 0x9779 # <CJK>
+0xE8D7 0x7059 0x9785 # <CJK>
+0xE8D8 0x705A 0x977C # <CJK>
+0xE8D9 0x705B 0x9781 # <CJK>
+0xE8DA 0x705C 0x977A # <CJK>
+0xE8DB 0x705D 0x9786 # <CJK>
+0xE8DC 0x705E 0x978B # <CJK>
+0xE8DD 0x705F 0x978F # <CJK>
+0xE8DE 0x7060 0x9790 # <CJK>
+0xE8DF 0x7061 0x979C # <CJK>
+0xE8E0 0x7062 0x97A8 # <CJK>
+0xE8E1 0x7063 0x97A6 # <CJK>
+0xE8E2 0x7064 0x97A3 # <CJK>
+0xE8E3 0x7065 0x97B3 # <CJK>
+0xE8E4 0x7066 0x97B4 # <CJK>
+0xE8E5 0x7067 0x97C3 # <CJK>
+0xE8E6 0x7068 0x97C6 # <CJK>
+0xE8E7 0x7069 0x97C8 # <CJK>
+0xE8E8 0x706A 0x97CB # <CJK>
+0xE8E9 0x706B 0x97DC # <CJK>
+0xE8EA 0x706C 0x97ED # <CJK>
+0xE8EB 0x706D 0x9F4F # <CJK>
+0xE8EC 0x706E 0x97F2 # <CJK>
+0xE8ED 0x706F 0x7ADF # <CJK>
+0xE8EE 0x7070 0x97F6 # <CJK>
+0xE8EF 0x7071 0x97F5 # <CJK>
+0xE8F0 0x7072 0x980F # <CJK>
+0xE8F1 0x7073 0x980C # <CJK>
+0xE8F2 0x7074 0x9838 # <CJK>
+0xE8F3 0x7075 0x9824 # <CJK>
+0xE8F4 0x7076 0x9821 # <CJK>
+0xE8F5 0x7077 0x9837 # <CJK>
+0xE8F6 0x7078 0x983D # <CJK>
+0xE8F7 0x7079 0x9846 # <CJK>
+0xE8F8 0x707A 0x984F # <CJK>
+0xE8F9 0x707B 0x984B # <CJK>
+0xE8FA 0x707C 0x986B # <CJK>
+0xE8FB 0x707D 0x986F # <CJK>
+0xE8FC 0x707E 0x9870 # <CJK>
+0xE940 0x7121 0x9871 # <CJK>
+0xE941 0x7122 0x9874 # <CJK>
+0xE942 0x7123 0x9873 # <CJK>
+0xE943 0x7124 0x98AA # <CJK>
+0xE944 0x7125 0x98AF # <CJK>
+0xE945 0x7126 0x98B1 # <CJK>
+0xE946 0x7127 0x98B6 # <CJK>
+0xE947 0x7128 0x98C4 # <CJK>
+0xE948 0x7129 0x98C3 # <CJK>
+0xE949 0x712A 0x98C6 # <CJK>
+0xE94A 0x712B 0x98E9 # <CJK>
+0xE94B 0x712C 0x98EB # <CJK>
+0xE94C 0x712D 0x9903 # <CJK>
+0xE94D 0x712E 0x9909 # <CJK>
+0xE94E 0x712F 0x9912 # <CJK>
+0xE94F 0x7130 0x9914 # <CJK>
+0xE950 0x7131 0x9918 # <CJK>
+0xE951 0x7132 0x9921 # <CJK>
+0xE952 0x7133 0x991D # <CJK>
+0xE953 0x7134 0x991E # <CJK>
+0xE954 0x7135 0x9924 # <CJK>
+0xE955 0x7136 0x9920 # <CJK>
+0xE956 0x7137 0x992C # <CJK>
+0xE957 0x7138 0x992E # <CJK>
+0xE958 0x7139 0x993D # <CJK>
+0xE959 0x713A 0x993E # <CJK>
+0xE95A 0x713B 0x9942 # <CJK>
+0xE95B 0x713C 0x9949 # <CJK>
+0xE95C 0x713D 0x9945 # <CJK>
+0xE95D 0x713E 0x9950 # <CJK>
+0xE95E 0x713F 0x994B # <CJK>
+0xE95F 0x7140 0x9951 # <CJK>
+0xE960 0x7141 0x9952 # <CJK>
+0xE961 0x7142 0x994C # <CJK>
+0xE962 0x7143 0x9955 # <CJK>
+0xE963 0x7144 0x9997 # <CJK>
+0xE964 0x7145 0x9998 # <CJK>
+0xE965 0x7146 0x99A5 # <CJK>
+0xE966 0x7147 0x99AD # <CJK>
+0xE967 0x7148 0x99AE # <CJK>
+0xE968 0x7149 0x99BC # <CJK>
+0xE969 0x714A 0x99DF # <CJK>
+0xE96A 0x714B 0x99DB # <CJK>
+0xE96B 0x714C 0x99DD # <CJK>
+0xE96C 0x714D 0x99D8 # <CJK>
+0xE96D 0x714E 0x99D1 # <CJK>
+0xE96E 0x714F 0x99ED # <CJK>
+0xE96F 0x7150 0x99EE # <CJK>
+0xE970 0x7151 0x99F1 # <CJK>
+0xE971 0x7152 0x99F2 # <CJK>
+0xE972 0x7153 0x99FB # <CJK>
+0xE973 0x7154 0x99F8 # <CJK>
+0xE974 0x7155 0x9A01 # <CJK>
+0xE975 0x7156 0x9A0F # <CJK>
+0xE976 0x7157 0x9A05 # <CJK>
+0xE977 0x7158 0x99E2 # <CJK>
+0xE978 0x7159 0x9A19 # <CJK>
+0xE979 0x715A 0x9A2B # <CJK>
+0xE97A 0x715B 0x9A37 # <CJK>
+0xE97B 0x715C 0x9A45 # <CJK>
+0xE97C 0x715D 0x9A42 # <CJK>
+0xE97D 0x715E 0x9A40 # <CJK>
+0xE97E 0x715F 0x9A43 # <CJK>
+0xE980 0x7160 0x9A3E # <CJK>
+0xE981 0x7161 0x9A55 # <CJK>
+0xE982 0x7162 0x9A4D # <CJK>
+0xE983 0x7163 0x9A5B # <CJK>
+0xE984 0x7164 0x9A57 # <CJK>
+0xE985 0x7165 0x9A5F # <CJK>
+0xE986 0x7166 0x9A62 # <CJK>
+0xE987 0x7167 0x9A65 # <CJK>
+0xE988 0x7168 0x9A64 # <CJK>
+0xE989 0x7169 0x9A69 # <CJK>
+0xE98A 0x716A 0x9A6B # <CJK>
+0xE98B 0x716B 0x9A6A # <CJK>
+0xE98C 0x716C 0x9AAD # <CJK>
+0xE98D 0x716D 0x9AB0 # <CJK>
+0xE98E 0x716E 0x9ABC # <CJK>
+0xE98F 0x716F 0x9AC0 # <CJK>
+0xE990 0x7170 0x9ACF # <CJK>
+0xE991 0x7171 0x9AD1 # <CJK>
+0xE992 0x7172 0x9AD3 # <CJK>
+0xE993 0x7173 0x9AD4 # <CJK>
+0xE994 0x7174 0x9ADE # <CJK>
+0xE995 0x7175 0x9ADF # <CJK>
+0xE996 0x7176 0x9AE2 # <CJK>
+0xE997 0x7177 0x9AE3 # <CJK>
+0xE998 0x7178 0x9AE6 # <CJK>
+0xE999 0x7179 0x9AEF # <CJK>
+0xE99A 0x717A 0x9AEB # <CJK>
+0xE99B 0x717B 0x9AEE # <CJK>
+0xE99C 0x717C 0x9AF4 # <CJK>
+0xE99D 0x717D 0x9AF1 # <CJK>
+0xE99E 0x717E 0x9AF7 # <CJK>
+0xE99F 0x7221 0x9AFB # <CJK>
+0xE9A0 0x7222 0x9B06 # <CJK>
+0xE9A1 0x7223 0x9B18 # <CJK>
+0xE9A2 0x7224 0x9B1A # <CJK>
+0xE9A3 0x7225 0x9B1F # <CJK>
+0xE9A4 0x7226 0x9B22 # <CJK>
+0xE9A5 0x7227 0x9B23 # <CJK>
+0xE9A6 0x7228 0x9B25 # <CJK>
+0xE9A7 0x7229 0x9B27 # <CJK>
+0xE9A8 0x722A 0x9B28 # <CJK>
+0xE9A9 0x722B 0x9B29 # <CJK>
+0xE9AA 0x722C 0x9B2A # <CJK>
+0xE9AB 0x722D 0x9B2E # <CJK>
+0xE9AC 0x722E 0x9B2F # <CJK>
+0xE9AD 0x722F 0x9B32 # <CJK>
+0xE9AE 0x7230 0x9B44 # <CJK>
+0xE9AF 0x7231 0x9B43 # <CJK>
+0xE9B0 0x7232 0x9B4F # <CJK>
+0xE9B1 0x7233 0x9B4D # <CJK>
+0xE9B2 0x7234 0x9B4E # <CJK>
+0xE9B3 0x7235 0x9B51 # <CJK>
+0xE9B4 0x7236 0x9B58 # <CJK>
+0xE9B5 0x7237 0x9B74 # <CJK>
+0xE9B6 0x7238 0x9B93 # <CJK>
+0xE9B7 0x7239 0x9B83 # <CJK>
+0xE9B8 0x723A 0x9B91 # <CJK>
+0xE9B9 0x723B 0x9B96 # <CJK>
+0xE9BA 0x723C 0x9B97 # <CJK>
+0xE9BB 0x723D 0x9B9F # <CJK>
+0xE9BC 0x723E 0x9BA0 # <CJK>
+0xE9BD 0x723F 0x9BA8 # <CJK>
+0xE9BE 0x7240 0x9BB4 # <CJK>
+0xE9BF 0x7241 0x9BC0 # <CJK>
+0xE9C0 0x7242 0x9BCA # <CJK>
+0xE9C1 0x7243 0x9BB9 # <CJK>
+0xE9C2 0x7244 0x9BC6 # <CJK>
+0xE9C3 0x7245 0x9BCF # <CJK>
+0xE9C4 0x7246 0x9BD1 # <CJK>
+0xE9C5 0x7247 0x9BD2 # <CJK>
+0xE9C6 0x7248 0x9BE3 # <CJK>
+0xE9C7 0x7249 0x9BE2 # <CJK>
+0xE9C8 0x724A 0x9BE4 # <CJK>
+0xE9C9 0x724B 0x9BD4 # <CJK>
+0xE9CA 0x724C 0x9BE1 # <CJK>
+0xE9CB 0x724D 0x9C3A # <CJK>
+0xE9CC 0x724E 0x9BF2 # <CJK>
+0xE9CD 0x724F 0x9BF1 # <CJK>
+0xE9CE 0x7250 0x9BF0 # <CJK>
+0xE9CF 0x7251 0x9C15 # <CJK>
+0xE9D0 0x7252 0x9C14 # <CJK>
+0xE9D1 0x7253 0x9C09 # <CJK>
+0xE9D2 0x7254 0x9C13 # <CJK>
+0xE9D3 0x7255 0x9C0C # <CJK>
+0xE9D4 0x7256 0x9C06 # <CJK>
+0xE9D5 0x7257 0x9C08 # <CJK>
+0xE9D6 0x7258 0x9C12 # <CJK>
+0xE9D7 0x7259 0x9C0A # <CJK>
+0xE9D8 0x725A 0x9C04 # <CJK>
+0xE9D9 0x725B 0x9C2E # <CJK>
+0xE9DA 0x725C 0x9C1B # <CJK>
+0xE9DB 0x725D 0x9C25 # <CJK>
+0xE9DC 0x725E 0x9C24 # <CJK>
+0xE9DD 0x725F 0x9C21 # <CJK>
+0xE9DE 0x7260 0x9C30 # <CJK>
+0xE9DF 0x7261 0x9C47 # <CJK>
+0xE9E0 0x7262 0x9C32 # <CJK>
+0xE9E1 0x7263 0x9C46 # <CJK>
+0xE9E2 0x7264 0x9C3E # <CJK>
+0xE9E3 0x7265 0x9C5A # <CJK>
+0xE9E4 0x7266 0x9C60 # <CJK>
+0xE9E5 0x7267 0x9C67 # <CJK>
+0xE9E6 0x7268 0x9C76 # <CJK>
+0xE9E7 0x7269 0x9C78 # <CJK>
+0xE9E8 0x726A 0x9CE7 # <CJK>
+0xE9E9 0x726B 0x9CEC # <CJK>
+0xE9EA 0x726C 0x9CF0 # <CJK>
+0xE9EB 0x726D 0x9D09 # <CJK>
+0xE9EC 0x726E 0x9D08 # <CJK>
+0xE9ED 0x726F 0x9CEB # <CJK>
+0xE9EE 0x7270 0x9D03 # <CJK>
+0xE9EF 0x7271 0x9D06 # <CJK>
+0xE9F0 0x7272 0x9D2A # <CJK>
+0xE9F1 0x7273 0x9D26 # <CJK>
+0xE9F2 0x7274 0x9DAF # <CJK>
+0xE9F3 0x7275 0x9D23 # <CJK>
+0xE9F4 0x7276 0x9D1F # <CJK>
+0xE9F5 0x7277 0x9D44 # <CJK>
+0xE9F6 0x7278 0x9D15 # <CJK>
+0xE9F7 0x7279 0x9D12 # <CJK>
+0xE9F8 0x727A 0x9D41 # <CJK>
+0xE9F9 0x727B 0x9D3F # <CJK>
+0xE9FA 0x727C 0x9D3E # <CJK>
+0xE9FB 0x727D 0x9D46 # <CJK>
+0xE9FC 0x727E 0x9D48 # <CJK>
+0xEA40 0x7321 0x9D5D # <CJK>
+0xEA41 0x7322 0x9D5E # <CJK>
+0xEA42 0x7323 0x9D64 # <CJK>
+0xEA43 0x7324 0x9D51 # <CJK>
+0xEA44 0x7325 0x9D50 # <CJK>
+0xEA45 0x7326 0x9D59 # <CJK>
+0xEA46 0x7327 0x9D72 # <CJK>
+0xEA47 0x7328 0x9D89 # <CJK>
+0xEA48 0x7329 0x9D87 # <CJK>
+0xEA49 0x732A 0x9DAB # <CJK>
+0xEA4A 0x732B 0x9D6F # <CJK>
+0xEA4B 0x732C 0x9D7A # <CJK>
+0xEA4C 0x732D 0x9D9A # <CJK>
+0xEA4D 0x732E 0x9DA4 # <CJK>
+0xEA4E 0x732F 0x9DA9 # <CJK>
+0xEA4F 0x7330 0x9DB2 # <CJK>
+0xEA50 0x7331 0x9DC4 # <CJK>
+0xEA51 0x7332 0x9DC1 # <CJK>
+0xEA52 0x7333 0x9DBB # <CJK>
+0xEA53 0x7334 0x9DB8 # <CJK>
+0xEA54 0x7335 0x9DBA # <CJK>
+0xEA55 0x7336 0x9DC6 # <CJK>
+0xEA56 0x7337 0x9DCF # <CJK>
+0xEA57 0x7338 0x9DC2 # <CJK>
+0xEA58 0x7339 0x9DD9 # <CJK>
+0xEA59 0x733A 0x9DD3 # <CJK>
+0xEA5A 0x733B 0x9DF8 # <CJK>
+0xEA5B 0x733C 0x9DE6 # <CJK>
+0xEA5C 0x733D 0x9DED # <CJK>
+0xEA5D 0x733E 0x9DEF # <CJK>
+0xEA5E 0x733F 0x9DFD # <CJK>
+0xEA5F 0x7340 0x9E1A # <CJK>
+0xEA60 0x7341 0x9E1B # <CJK>
+0xEA61 0x7342 0x9E1E # <CJK>
+0xEA62 0x7343 0x9E75 # <CJK>
+0xEA63 0x7344 0x9E79 # <CJK>
+0xEA64 0x7345 0x9E7D # <CJK>
+0xEA65 0x7346 0x9E81 # <CJK>
+0xEA66 0x7347 0x9E88 # <CJK>
+0xEA67 0x7348 0x9E8B # <CJK>
+0xEA68 0x7349 0x9E8C # <CJK>
+0xEA69 0x734A 0x9E92 # <CJK>
+0xEA6A 0x734B 0x9E95 # <CJK>
+0xEA6B 0x734C 0x9E91 # <CJK>
+0xEA6C 0x734D 0x9E9D # <CJK>
+0xEA6D 0x734E 0x9EA5 # <CJK>
+0xEA6E 0x734F 0x9EA9 # <CJK>
+0xEA6F 0x7350 0x9EB8 # <CJK>
+0xEA70 0x7351 0x9EAA # <CJK>
+0xEA71 0x7352 0x9EAD # <CJK>
+0xEA72 0x7353 0x9761 # <CJK>
+0xEA73 0x7354 0x9ECC # <CJK>
+0xEA74 0x7355 0x9ECE # <CJK>
+0xEA75 0x7356 0x9ECF # <CJK>
+0xEA76 0x7357 0x9ED0 # <CJK>
+0xEA77 0x7358 0x9ED4 # <CJK>
+0xEA78 0x7359 0x9EDC # <CJK>
+0xEA79 0x735A 0x9EDE # <CJK>
+0xEA7A 0x735B 0x9EDD # <CJK>
+0xEA7B 0x735C 0x9EE0 # <CJK>
+0xEA7C 0x735D 0x9EE5 # <CJK>
+0xEA7D 0x735E 0x9EE8 # <CJK>
+0xEA7E 0x735F 0x9EEF # <CJK>
+0xEA80 0x7360 0x9EF4 # <CJK>
+0xEA81 0x7361 0x9EF6 # <CJK>
+0xEA82 0x7362 0x9EF7 # <CJK>
+0xEA83 0x7363 0x9EF9 # <CJK>
+0xEA84 0x7364 0x9EFB # <CJK>
+0xEA85 0x7365 0x9EFC # <CJK>
+0xEA86 0x7366 0x9EFD # <CJK>
+0xEA87 0x7367 0x9F07 # <CJK>
+0xEA88 0x7368 0x9F08 # <CJK>
+0xEA89 0x7369 0x76B7 # <CJK>
+0xEA8A 0x736A 0x9F15 # <CJK>
+0xEA8B 0x736B 0x9F21 # <CJK>
+0xEA8C 0x736C 0x9F2C # <CJK>
+0xEA8D 0x736D 0x9F3E # <CJK>
+0xEA8E 0x736E 0x9F4A # <CJK>
+0xEA8F 0x736F 0x9F52 # <CJK>
+0xEA90 0x7370 0x9F54 # <CJK>
+0xEA91 0x7371 0x9F63 # <CJK>
+0xEA92 0x7372 0x9F5F # <CJK>
+0xEA93 0x7373 0x9F60 # <CJK>
+0xEA94 0x7374 0x9F61 # <CJK>
+0xEA95 0x7375 0x9F66 # <CJK>
+0xEA96 0x7376 0x9F67 # <CJK>
+0xEA97 0x7377 0x9F6C # <CJK>
+0xEA98 0x7378 0x9F6A # <CJK>
+0xEA99 0x7379 0x9F77 # <CJK>
+0xEA9A 0x737A 0x9F72 # <CJK>
+0xEA9B 0x737B 0x9F76 # <CJK>
+0xEA9C 0x737C 0x9F95 # <CJK>
+0xEA9D 0x737D 0x9F9C # <CJK>
+0xEA9E 0x737E 0x9FA0 # <CJK>
+0xEA9F 0x7421 0x582F # <CJK>
+0xEAA0 0x7422 0x69C7 # <CJK>
+0xEAA1 0x7423 0x9059 # <CJK>
+0xEAA2 0x7424 0x7464 # <CJK>
+0xEAA3 0x7425 0x51DC # <CJK>
+0xEAA4 0x7426 0x7199 # <CJK>
diff --git a/ext/mbstring/tests/data/JISX0212.txt b/ext/mbstring/tests/data/JISX0212.txt
new file mode 100644
index 0000000000..316d28e4d1
--- /dev/null
+++ b/ext/mbstring/tests/data/JISX0212.txt
@@ -0,0 +1,6141 @@
+#
+# Name: JIS X 0212 (1990) to Unicode
+# Unicode version: 1.1
+# Table version: 0.9
+# Table format: Format A
+# Date: 8 March 1994
+# Authors: Glenn Adams <glenn@metis.com>
+# John H. Jenkins <John_Jenkins@taligent.com>
+#
+# Copyright (c) 1991-1994 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on magnetic media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Recipient is granted the right to make copies in any form for
+# internal distribution and to freely use the information supplied
+# in the creation of products supporting Unicode. Unicode, Inc.
+# specifically excludes the right to re-distribute this file directly
+# to third parties or other organizations whether for profit or not.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# JIS X 0212 (1983) characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the JIS X 0212 code (in hex as 0xXXXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+# The official names for Unicode characters U+4E00
+# to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX",
+# where XXXX is the code point. Including all these
+# names in this file increases its size substantially
+# and needlessly. The token "<CJK>" is used for the
+# name of these characters. If necessary, it can be
+# expanded algorithmically by a parser or editor.
+#
+# The entries are in JIS X 0212 order
+#
+# The following algorithms can be used to change the hex form
+# of JIS 0212 to other standard forms:
+#
+# To change hex to EUC form, add 0x8080
+# To change hex to kuten form, first subtract 0x2020. Then
+# the high and low bytes correspond to the ku and ten of
+# the kuten form. For example, 0x2121 -> 0x0101 -> 0101;
+# 0x6D63 -> 0x4D43 -> 7767
+#
+# The kanji mappings are a normative part of ISO/IEC 10646. The
+# non-kanji mappings are provisional, pending definition of
+# official mappings by Japanese standards bodies
+#
+# Any comments or problems, contact <John_Jenkins@taligent.com>
+#
+# Notes:
+#
+# 1. JIS X 0212 apparently unified the following two symbols
+# into a single character at 0x2922:
+#
+# LATIN CAPITAL LETTER D WITH STROKE
+# LATIN CAPITAL LETTER ETH
+#
+# However, JIS X 0212 maintains the distinction between
+# the lowercase forms of these two elements at 0x2942 and 0x2943.
+# Given the structre of these JIS encodings, it is clear that
+# 0x2922 and 0x2942 are intended to be a capital/small pair.
+# Consequently, in the Unicode mapping, 0x2922 is treated as
+# LATIN CAPITAL LETTER D WITH STROKE.
+#
+0x222F 0x02D8 # BREVE
+0x2230 0x02C7 # CARON (Mandarin Chinese third tone)
+0x2231 0x00B8 # CEDILLA
+0x2232 0x02D9 # DOT ABOVE (Mandarin Chinese light tone)
+0x2233 0x02DD # DOUBLE ACUTE ACCENT
+0x2234 0x00AF # MACRON
+0x2235 0x02DB # OGONEK
+0x2236 0x02DA # RING ABOVE
+0x2237 0x007E # TILDE
+0x2238 0x0384 # GREEK TONOS
+0x2239 0x0385 # GREEK DIALYTIKA TONOS
+0x2242 0x00A1 # INVERTED EXCLAMATION MARK
+0x2243 0x00A6 # BROKEN BAR
+0x2244 0x00BF # INVERTED QUESTION MARK
+0x226B 0x00BA # MASCULINE ORDINAL INDICATOR
+0x226C 0x00AA # FEMININE ORDINAL INDICATOR
+0x226D 0x00A9 # COPYRIGHT SIGN
+0x226E 0x00AE # REGISTERED SIGN
+0x226F 0x2122 # TRADE MARK SIGN
+0x2270 0x00A4 # CURRENCY SIGN
+0x2271 0x2116 # NUMERO SIGN
+0x2661 0x0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0x2662 0x0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0x2663 0x0389 # GREEK CAPITAL LETTER ETA WITH TONOS
+0x2664 0x038A # GREEK CAPITAL LETTER IOTA WITH TONOS
+0x2665 0x03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0x2667 0x038C # GREEK CAPITAL LETTER OMICRON WITH TONOS
+0x2669 0x038E # GREEK CAPITAL LETTER UPSILON WITH TONOS
+0x266A 0x03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0x266C 0x038F # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0x2671 0x03AC # GREEK SMALL LETTER ALPHA WITH TONOS
+0x2672 0x03AD # GREEK SMALL LETTER EPSILON WITH TONOS
+0x2673 0x03AE # GREEK SMALL LETTER ETA WITH TONOS
+0x2674 0x03AF # GREEK SMALL LETTER IOTA WITH TONOS
+0x2675 0x03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0x2676 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0x2677 0x03CC # GREEK SMALL LETTER OMICRON WITH TONOS
+0x2678 0x03C2 # GREEK SMALL LETTER FINAL SIGMA
+0x2679 0x03CD # GREEK SMALL LETTER UPSILON WITH TONOS
+0x267A 0x03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0x267B 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+0x267C 0x03CE # GREEK SMALL LETTER OMEGA WITH TONOS
+0x2742 0x0402 # CYRILLIC CAPITAL LETTER DJE
+0x2743 0x0403 # CYRILLIC CAPITAL LETTER GJE
+0x2744 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0x2745 0x0405 # CYRILLIC CAPITAL LETTER DZE
+0x2746 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0x2747 0x0407 # CYRILLIC CAPITAL LETTER YI
+0x2748 0x0408 # CYRILLIC CAPITAL LETTER JE
+0x2749 0x0409 # CYRILLIC CAPITAL LETTER LJE
+0x274A 0x040A # CYRILLIC CAPITAL LETTER NJE
+0x274B 0x040B # CYRILLIC CAPITAL LETTER TSHE
+0x274C 0x040C # CYRILLIC CAPITAL LETTER KJE
+0x274D 0x040E # CYRILLIC CAPITAL LETTER SHORT U
+0x274E 0x040F # CYRILLIC CAPITAL LETTER DZHE
+0x2772 0x0452 # CYRILLIC SMALL LETTER DJE
+0x2773 0x0453 # CYRILLIC SMALL LETTER GJE
+0x2774 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE
+0x2775 0x0455 # CYRILLIC SMALL LETTER DZE
+0x2776 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0x2777 0x0457 # CYRILLIC SMALL LETTER YI
+0x2778 0x0458 # CYRILLIC SMALL LETTER JE
+0x2779 0x0459 # CYRILLIC SMALL LETTER LJE
+0x277A 0x045A # CYRILLIC SMALL LETTER NJE
+0x277B 0x045B # CYRILLIC SMALL LETTER TSHE
+0x277C 0x045C # CYRILLIC SMALL LETTER KJE
+0x277D 0x045E # CYRILLIC SMALL LETTER SHORT U
+0x277E 0x045F # CYRILLIC SMALL LETTER DZHE
+0x2921 0x00C6 # LATIN CAPITAL LIGATURE AE
+0x2922 0x0110 # LATIN CAPITAL LETTER D WITH STROKE
+0x2924 0x0126 # LATIN CAPITAL LETTER H WITH STROKE
+0x2926 0x0132 # LATIN CAPITAL LIGATURE IJ
+0x2928 0x0141 # LATIN CAPITAL LETTER L WITH STROKE
+0x2929 0x013F # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0x292B 0x014A # LATIN CAPITAL LETTER ENG
+0x292C 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0x292D 0x0152 # LATIN CAPITAL LIGATURE OE
+0x292F 0x0166 # LATIN CAPITAL LETTER T WITH STROKE
+0x2930 0x00DE # LATIN CAPITAL LETTER THORN
+0x2941 0x00E6 # LATIN SMALL LIGATURE AE
+0x2942 0x0111 # LATIN SMALL LETTER D WITH STROKE
+0x2943 0x00F0 # LATIN SMALL LETTER ETH
+0x2944 0x0127 # LATIN SMALL LETTER H WITH STROKE
+0x2945 0x0131 # LATIN SMALL LETTER DOTLESS I
+0x2946 0x0133 # LATIN SMALL LIGATURE IJ
+0x2947 0x0138 # LATIN SMALL LETTER KRA
+0x2948 0x0142 # LATIN SMALL LETTER L WITH STROKE
+0x2949 0x0140 # LATIN SMALL LETTER L WITH MIDDLE DOT
+0x294A 0x0149 # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+0x294B 0x014B # LATIN SMALL LETTER ENG
+0x294C 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0x294D 0x0153 # LATIN SMALL LIGATURE OE
+0x294E 0x00DF # LATIN SMALL LETTER SHARP S
+0x294F 0x0167 # LATIN SMALL LETTER T WITH STROKE
+0x2950 0x00FE # LATIN SMALL LETTER THORN
+0x2A21 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0x2A22 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0x2A23 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0x2A24 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0x2A25 0x0102 # LATIN CAPITAL LETTER A WITH BREVE
+0x2A26 0x01CD # LATIN CAPITAL LETTER A WITH CARON
+0x2A27 0x0100 # LATIN CAPITAL LETTER A WITH MACRON
+0x2A28 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0x2A29 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0x2A2A 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0x2A2B 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0x2A2C 0x0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0x2A2D 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0x2A2E 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0x2A2F 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+0x2A30 0x010E # LATIN CAPITAL LETTER D WITH CARON
+0x2A31 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0x2A32 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0x2A33 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0x2A34 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0x2A35 0x011A # LATIN CAPITAL LETTER E WITH CARON
+0x2A36 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0x2A37 0x0112 # LATIN CAPITAL LETTER E WITH MACRON
+0x2A38 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0x2A3A 0x011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+0x2A3B 0x011E # LATIN CAPITAL LETTER G WITH BREVE
+0x2A3C 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+0x2A3D 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0x2A3E 0x0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0x2A3F 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0x2A40 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0x2A41 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0x2A42 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0x2A43 0x01CF # LATIN CAPITAL LETTER I WITH CARON
+0x2A44 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0x2A45 0x012A # LATIN CAPITAL LETTER I WITH MACRON
+0x2A46 0x012E # LATIN CAPITAL LETTER I WITH OGONEK
+0x2A47 0x0128 # LATIN CAPITAL LETTER I WITH TILDE
+0x2A48 0x0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0x2A49 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+0x2A4A 0x0139 # LATIN CAPITAL LETTER L WITH ACUTE
+0x2A4B 0x013D # LATIN CAPITAL LETTER L WITH CARON
+0x2A4C 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA
+0x2A4D 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE
+0x2A4E 0x0147 # LATIN CAPITAL LETTER N WITH CARON
+0x2A4F 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+0x2A50 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0x2A51 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0x2A52 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0x2A53 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0x2A54 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0x2A55 0x01D1 # LATIN CAPITAL LETTER O WITH CARON
+0x2A56 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0x2A57 0x014C # LATIN CAPITAL LETTER O WITH MACRON
+0x2A58 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0x2A59 0x0154 # LATIN CAPITAL LETTER R WITH ACUTE
+0x2A5A 0x0158 # LATIN CAPITAL LETTER R WITH CARON
+0x2A5B 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+0x2A5C 0x015A # LATIN CAPITAL LETTER S WITH ACUTE
+0x2A5D 0x015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+0x2A5E 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0x2A5F 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA
+0x2A60 0x0164 # LATIN CAPITAL LETTER T WITH CARON
+0x2A61 0x0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+0x2A62 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0x2A63 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0x2A64 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0x2A65 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0x2A66 0x016C # LATIN CAPITAL LETTER U WITH BREVE
+0x2A67 0x01D3 # LATIN CAPITAL LETTER U WITH CARON
+0x2A68 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0x2A69 0x016A # LATIN CAPITAL LETTER U WITH MACRON
+0x2A6A 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK
+0x2A6B 0x016E # LATIN CAPITAL LETTER U WITH RING ABOVE
+0x2A6C 0x0168 # LATIN CAPITAL LETTER U WITH TILDE
+0x2A6D 0x01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+0x2A6E 0x01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+0x2A6F 0x01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+0x2A70 0x01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+0x2A71 0x0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0x2A72 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0x2A73 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0x2A74 0x0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0x2A75 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+0x2A76 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0x2A77 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0x2B21 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0x2B22 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0x2B23 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0x2B24 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x2B25 0x0103 # LATIN SMALL LETTER A WITH BREVE
+0x2B26 0x01CE # LATIN SMALL LETTER A WITH CARON
+0x2B27 0x0101 # LATIN SMALL LETTER A WITH MACRON
+0x2B28 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0x2B29 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0x2B2A 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0x2B2B 0x0107 # LATIN SMALL LETTER C WITH ACUTE
+0x2B2C 0x0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX
+0x2B2D 0x010D # LATIN SMALL LETTER C WITH CARON
+0x2B2E 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0x2B2F 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE
+0x2B30 0x010F # LATIN SMALL LETTER D WITH CARON
+0x2B31 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0x2B32 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0x2B33 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0x2B34 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x2B35 0x011B # LATIN SMALL LETTER E WITH CARON
+0x2B36 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+0x2B37 0x0113 # LATIN SMALL LETTER E WITH MACRON
+0x2B38 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0x2B39 0x01F5 # LATIN SMALL LETTER G WITH ACUTE
+0x2B3A 0x011D # LATIN SMALL LETTER G WITH CIRCUMFLEX
+0x2B3B 0x011F # LATIN SMALL LETTER G WITH BREVE
+0x2B3D 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+0x2B3E 0x0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX
+0x2B3F 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0x2B40 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0x2B41 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0x2B42 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x2B43 0x01D0 # LATIN SMALL LETTER I WITH CARON
+0x2B45 0x012B # LATIN SMALL LETTER I WITH MACRON
+0x2B46 0x012F # LATIN SMALL LETTER I WITH OGONEK
+0x2B47 0x0129 # LATIN SMALL LETTER I WITH TILDE
+0x2B48 0x0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX
+0x2B49 0x0137 # LATIN SMALL LETTER K WITH CEDILLA
+0x2B4A 0x013A # LATIN SMALL LETTER L WITH ACUTE
+0x2B4B 0x013E # LATIN SMALL LETTER L WITH CARON
+0x2B4C 0x013C # LATIN SMALL LETTER L WITH CEDILLA
+0x2B4D 0x0144 # LATIN SMALL LETTER N WITH ACUTE
+0x2B4E 0x0148 # LATIN SMALL LETTER N WITH CARON
+0x2B4F 0x0146 # LATIN SMALL LETTER N WITH CEDILLA
+0x2B50 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0x2B51 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0x2B52 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0x2B53 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0x2B54 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x2B55 0x01D2 # LATIN SMALL LETTER O WITH CARON
+0x2B56 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0x2B57 0x014D # LATIN SMALL LETTER O WITH MACRON
+0x2B58 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0x2B59 0x0155 # LATIN SMALL LETTER R WITH ACUTE
+0x2B5A 0x0159 # LATIN SMALL LETTER R WITH CARON
+0x2B5B 0x0157 # LATIN SMALL LETTER R WITH CEDILLA
+0x2B5C 0x015B # LATIN SMALL LETTER S WITH ACUTE
+0x2B5D 0x015D # LATIN SMALL LETTER S WITH CIRCUMFLEX
+0x2B5E 0x0161 # LATIN SMALL LETTER S WITH CARON
+0x2B5F 0x015F # LATIN SMALL LETTER S WITH CEDILLA
+0x2B60 0x0165 # LATIN SMALL LETTER T WITH CARON
+0x2B61 0x0163 # LATIN SMALL LETTER T WITH CEDILLA
+0x2B62 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0x2B63 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0x2B64 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0x2B65 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x2B66 0x016D # LATIN SMALL LETTER U WITH BREVE
+0x2B67 0x01D4 # LATIN SMALL LETTER U WITH CARON
+0x2B68 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0x2B69 0x016B # LATIN SMALL LETTER U WITH MACRON
+0x2B6A 0x0173 # LATIN SMALL LETTER U WITH OGONEK
+0x2B6B 0x016F # LATIN SMALL LETTER U WITH RING ABOVE
+0x2B6C 0x0169 # LATIN SMALL LETTER U WITH TILDE
+0x2B6D 0x01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+0x2B6E 0x01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+0x2B6F 0x01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+0x2B70 0x01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+0x2B71 0x0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX
+0x2B72 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0x2B73 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
+0x2B74 0x0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0x2B75 0x017A # LATIN SMALL LETTER Z WITH ACUTE
+0x2B76 0x017E # LATIN SMALL LETTER Z WITH CARON
+0x2B77 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0x3021 0x4E02 # <CJK>
+0x3022 0x4E04 # <CJK>
+0x3023 0x4E05 # <CJK>
+0x3024 0x4E0C # <CJK>
+0x3025 0x4E12 # <CJK>
+0x3026 0x4E1F # <CJK>
+0x3027 0x4E23 # <CJK>
+0x3028 0x4E24 # <CJK>
+0x3029 0x4E28 # <CJK>
+0x302A 0x4E2B # <CJK>
+0x302B 0x4E2E # <CJK>
+0x302C 0x4E2F # <CJK>
+0x302D 0x4E30 # <CJK>
+0x302E 0x4E35 # <CJK>
+0x302F 0x4E40 # <CJK>
+0x3030 0x4E41 # <CJK>
+0x3031 0x4E44 # <CJK>
+0x3032 0x4E47 # <CJK>
+0x3033 0x4E51 # <CJK>
+0x3034 0x4E5A # <CJK>
+0x3035 0x4E5C # <CJK>
+0x3036 0x4E63 # <CJK>
+0x3037 0x4E68 # <CJK>
+0x3038 0x4E69 # <CJK>
+0x3039 0x4E74 # <CJK>
+0x303A 0x4E75 # <CJK>
+0x303B 0x4E79 # <CJK>
+0x303C 0x4E7F # <CJK>
+0x303D 0x4E8D # <CJK>
+0x303E 0x4E96 # <CJK>
+0x303F 0x4E97 # <CJK>
+0x3040 0x4E9D # <CJK>
+0x3041 0x4EAF # <CJK>
+0x3042 0x4EB9 # <CJK>
+0x3043 0x4EC3 # <CJK>
+0x3044 0x4ED0 # <CJK>
+0x3045 0x4EDA # <CJK>
+0x3046 0x4EDB # <CJK>
+0x3047 0x4EE0 # <CJK>
+0x3048 0x4EE1 # <CJK>
+0x3049 0x4EE2 # <CJK>
+0x304A 0x4EE8 # <CJK>
+0x304B 0x4EEF # <CJK>
+0x304C 0x4EF1 # <CJK>
+0x304D 0x4EF3 # <CJK>
+0x304E 0x4EF5 # <CJK>
+0x304F 0x4EFD # <CJK>
+0x3050 0x4EFE # <CJK>
+0x3051 0x4EFF # <CJK>
+0x3052 0x4F00 # <CJK>
+0x3053 0x4F02 # <CJK>
+0x3054 0x4F03 # <CJK>
+0x3055 0x4F08 # <CJK>
+0x3056 0x4F0B # <CJK>
+0x3057 0x4F0C # <CJK>
+0x3058 0x4F12 # <CJK>
+0x3059 0x4F15 # <CJK>
+0x305A 0x4F16 # <CJK>
+0x305B 0x4F17 # <CJK>
+0x305C 0x4F19 # <CJK>
+0x305D 0x4F2E # <CJK>
+0x305E 0x4F31 # <CJK>
+0x305F 0x4F60 # <CJK>
+0x3060 0x4F33 # <CJK>
+0x3061 0x4F35 # <CJK>
+0x3062 0x4F37 # <CJK>
+0x3063 0x4F39 # <CJK>
+0x3064 0x4F3B # <CJK>
+0x3065 0x4F3E # <CJK>
+0x3066 0x4F40 # <CJK>
+0x3067 0x4F42 # <CJK>
+0x3068 0x4F48 # <CJK>
+0x3069 0x4F49 # <CJK>
+0x306A 0x4F4B # <CJK>
+0x306B 0x4F4C # <CJK>
+0x306C 0x4F52 # <CJK>
+0x306D 0x4F54 # <CJK>
+0x306E 0x4F56 # <CJK>
+0x306F 0x4F58 # <CJK>
+0x3070 0x4F5F # <CJK>
+0x3071 0x4F63 # <CJK>
+0x3072 0x4F6A # <CJK>
+0x3073 0x4F6C # <CJK>
+0x3074 0x4F6E # <CJK>
+0x3075 0x4F71 # <CJK>
+0x3076 0x4F77 # <CJK>
+0x3077 0x4F78 # <CJK>
+0x3078 0x4F79 # <CJK>
+0x3079 0x4F7A # <CJK>
+0x307A 0x4F7D # <CJK>
+0x307B 0x4F7E # <CJK>
+0x307C 0x4F81 # <CJK>
+0x307D 0x4F82 # <CJK>
+0x307E 0x4F84 # <CJK>
+0x3121 0x4F85 # <CJK>
+0x3122 0x4F89 # <CJK>
+0x3123 0x4F8A # <CJK>
+0x3124 0x4F8C # <CJK>
+0x3125 0x4F8E # <CJK>
+0x3126 0x4F90 # <CJK>
+0x3127 0x4F92 # <CJK>
+0x3128 0x4F93 # <CJK>
+0x3129 0x4F94 # <CJK>
+0x312A 0x4F97 # <CJK>
+0x312B 0x4F99 # <CJK>
+0x312C 0x4F9A # <CJK>
+0x312D 0x4F9E # <CJK>
+0x312E 0x4F9F # <CJK>
+0x312F 0x4FB2 # <CJK>
+0x3130 0x4FB7 # <CJK>
+0x3131 0x4FB9 # <CJK>
+0x3132 0x4FBB # <CJK>
+0x3133 0x4FBC # <CJK>
+0x3134 0x4FBD # <CJK>
+0x3135 0x4FBE # <CJK>
+0x3136 0x4FC0 # <CJK>
+0x3137 0x4FC1 # <CJK>
+0x3138 0x4FC5 # <CJK>
+0x3139 0x4FC6 # <CJK>
+0x313A 0x4FC8 # <CJK>
+0x313B 0x4FC9 # <CJK>
+0x313C 0x4FCB # <CJK>
+0x313D 0x4FCC # <CJK>
+0x313E 0x4FCD # <CJK>
+0x313F 0x4FCF # <CJK>
+0x3140 0x4FD2 # <CJK>
+0x3141 0x4FDC # <CJK>
+0x3142 0x4FE0 # <CJK>
+0x3143 0x4FE2 # <CJK>
+0x3144 0x4FF0 # <CJK>
+0x3145 0x4FF2 # <CJK>
+0x3146 0x4FFC # <CJK>
+0x3147 0x4FFD # <CJK>
+0x3148 0x4FFF # <CJK>
+0x3149 0x5000 # <CJK>
+0x314A 0x5001 # <CJK>
+0x314B 0x5004 # <CJK>
+0x314C 0x5007 # <CJK>
+0x314D 0x500A # <CJK>
+0x314E 0x500C # <CJK>
+0x314F 0x500E # <CJK>
+0x3150 0x5010 # <CJK>
+0x3151 0x5013 # <CJK>
+0x3152 0x5017 # <CJK>
+0x3153 0x5018 # <CJK>
+0x3154 0x501B # <CJK>
+0x3155 0x501C # <CJK>
+0x3156 0x501D # <CJK>
+0x3157 0x501E # <CJK>
+0x3158 0x5022 # <CJK>
+0x3159 0x5027 # <CJK>
+0x315A 0x502E # <CJK>
+0x315B 0x5030 # <CJK>
+0x315C 0x5032 # <CJK>
+0x315D 0x5033 # <CJK>
+0x315E 0x5035 # <CJK>
+0x315F 0x5040 # <CJK>
+0x3160 0x5041 # <CJK>
+0x3161 0x5042 # <CJK>
+0x3162 0x5045 # <CJK>
+0x3163 0x5046 # <CJK>
+0x3164 0x504A # <CJK>
+0x3165 0x504C # <CJK>
+0x3166 0x504E # <CJK>
+0x3167 0x5051 # <CJK>
+0x3168 0x5052 # <CJK>
+0x3169 0x5053 # <CJK>
+0x316A 0x5057 # <CJK>
+0x316B 0x5059 # <CJK>
+0x316C 0x505F # <CJK>
+0x316D 0x5060 # <CJK>
+0x316E 0x5062 # <CJK>
+0x316F 0x5063 # <CJK>
+0x3170 0x5066 # <CJK>
+0x3171 0x5067 # <CJK>
+0x3172 0x506A # <CJK>
+0x3173 0x506D # <CJK>
+0x3174 0x5070 # <CJK>
+0x3175 0x5071 # <CJK>
+0x3176 0x503B # <CJK>
+0x3177 0x5081 # <CJK>
+0x3178 0x5083 # <CJK>
+0x3179 0x5084 # <CJK>
+0x317A 0x5086 # <CJK>
+0x317B 0x508A # <CJK>
+0x317C 0x508E # <CJK>
+0x317D 0x508F # <CJK>
+0x317E 0x5090 # <CJK>
+0x3221 0x5092 # <CJK>
+0x3222 0x5093 # <CJK>
+0x3223 0x5094 # <CJK>
+0x3224 0x5096 # <CJK>
+0x3225 0x509B # <CJK>
+0x3226 0x509C # <CJK>
+0x3227 0x509E # <CJK>
+0x3228 0x509F # <CJK>
+0x3229 0x50A0 # <CJK>
+0x322A 0x50A1 # <CJK>
+0x322B 0x50A2 # <CJK>
+0x322C 0x50AA # <CJK>
+0x322D 0x50AF # <CJK>
+0x322E 0x50B0 # <CJK>
+0x322F 0x50B9 # <CJK>
+0x3230 0x50BA # <CJK>
+0x3231 0x50BD # <CJK>
+0x3232 0x50C0 # <CJK>
+0x3233 0x50C3 # <CJK>
+0x3234 0x50C4 # <CJK>
+0x3235 0x50C7 # <CJK>
+0x3236 0x50CC # <CJK>
+0x3237 0x50CE # <CJK>
+0x3238 0x50D0 # <CJK>
+0x3239 0x50D3 # <CJK>
+0x323A 0x50D4 # <CJK>
+0x323B 0x50D8 # <CJK>
+0x323C 0x50DC # <CJK>
+0x323D 0x50DD # <CJK>
+0x323E 0x50DF # <CJK>
+0x323F 0x50E2 # <CJK>
+0x3240 0x50E4 # <CJK>
+0x3241 0x50E6 # <CJK>
+0x3242 0x50E8 # <CJK>
+0x3243 0x50E9 # <CJK>
+0x3244 0x50EF # <CJK>
+0x3245 0x50F1 # <CJK>
+0x3246 0x50F6 # <CJK>
+0x3247 0x50FA # <CJK>
+0x3248 0x50FE # <CJK>
+0x3249 0x5103 # <CJK>
+0x324A 0x5106 # <CJK>
+0x324B 0x5107 # <CJK>
+0x324C 0x5108 # <CJK>
+0x324D 0x510B # <CJK>
+0x324E 0x510C # <CJK>
+0x324F 0x510D # <CJK>
+0x3250 0x510E # <CJK>
+0x3251 0x50F2 # <CJK>
+0x3252 0x5110 # <CJK>
+0x3253 0x5117 # <CJK>
+0x3254 0x5119 # <CJK>
+0x3255 0x511B # <CJK>
+0x3256 0x511C # <CJK>
+0x3257 0x511D # <CJK>
+0x3258 0x511E # <CJK>
+0x3259 0x5123 # <CJK>
+0x325A 0x5127 # <CJK>
+0x325B 0x5128 # <CJK>
+0x325C 0x512C # <CJK>
+0x325D 0x512D # <CJK>
+0x325E 0x512F # <CJK>
+0x325F 0x5131 # <CJK>
+0x3260 0x5133 # <CJK>
+0x3261 0x5134 # <CJK>
+0x3262 0x5135 # <CJK>
+0x3263 0x5138 # <CJK>
+0x3264 0x5139 # <CJK>
+0x3265 0x5142 # <CJK>
+0x3266 0x514A # <CJK>
+0x3267 0x514F # <CJK>
+0x3268 0x5153 # <CJK>
+0x3269 0x5155 # <CJK>
+0x326A 0x5157 # <CJK>
+0x326B 0x5158 # <CJK>
+0x326C 0x515F # <CJK>
+0x326D 0x5164 # <CJK>
+0x326E 0x5166 # <CJK>
+0x326F 0x517E # <CJK>
+0x3270 0x5183 # <CJK>
+0x3271 0x5184 # <CJK>
+0x3272 0x518B # <CJK>
+0x3273 0x518E # <CJK>
+0x3274 0x5198 # <CJK>
+0x3275 0x519D # <CJK>
+0x3276 0x51A1 # <CJK>
+0x3277 0x51A3 # <CJK>
+0x3278 0x51AD # <CJK>
+0x3279 0x51B8 # <CJK>
+0x327A 0x51BA # <CJK>
+0x327B 0x51BC # <CJK>
+0x327C 0x51BE # <CJK>
+0x327D 0x51BF # <CJK>
+0x327E 0x51C2 # <CJK>
+0x3321 0x51C8 # <CJK>
+0x3322 0x51CF # <CJK>
+0x3323 0x51D1 # <CJK>
+0x3324 0x51D2 # <CJK>
+0x3325 0x51D3 # <CJK>
+0x3326 0x51D5 # <CJK>
+0x3327 0x51D8 # <CJK>
+0x3328 0x51DE # <CJK>
+0x3329 0x51E2 # <CJK>
+0x332A 0x51E5 # <CJK>
+0x332B 0x51EE # <CJK>
+0x332C 0x51F2 # <CJK>
+0x332D 0x51F3 # <CJK>
+0x332E 0x51F4 # <CJK>
+0x332F 0x51F7 # <CJK>
+0x3330 0x5201 # <CJK>
+0x3331 0x5202 # <CJK>
+0x3332 0x5205 # <CJK>
+0x3333 0x5212 # <CJK>
+0x3334 0x5213 # <CJK>
+0x3335 0x5215 # <CJK>
+0x3336 0x5216 # <CJK>
+0x3337 0x5218 # <CJK>
+0x3338 0x5222 # <CJK>
+0x3339 0x5228 # <CJK>
+0x333A 0x5231 # <CJK>
+0x333B 0x5232 # <CJK>
+0x333C 0x5235 # <CJK>
+0x333D 0x523C # <CJK>
+0x333E 0x5245 # <CJK>
+0x333F 0x5249 # <CJK>
+0x3340 0x5255 # <CJK>
+0x3341 0x5257 # <CJK>
+0x3342 0x5258 # <CJK>
+0x3343 0x525A # <CJK>
+0x3344 0x525C # <CJK>
+0x3345 0x525F # <CJK>
+0x3346 0x5260 # <CJK>
+0x3347 0x5261 # <CJK>
+0x3348 0x5266 # <CJK>
+0x3349 0x526E # <CJK>
+0x334A 0x5277 # <CJK>
+0x334B 0x5278 # <CJK>
+0x334C 0x5279 # <CJK>
+0x334D 0x5280 # <CJK>
+0x334E 0x5282 # <CJK>
+0x334F 0x5285 # <CJK>
+0x3350 0x528A # <CJK>
+0x3351 0x528C # <CJK>
+0x3352 0x5293 # <CJK>
+0x3353 0x5295 # <CJK>
+0x3354 0x5296 # <CJK>
+0x3355 0x5297 # <CJK>
+0x3356 0x5298 # <CJK>
+0x3357 0x529A # <CJK>
+0x3358 0x529C # <CJK>
+0x3359 0x52A4 # <CJK>
+0x335A 0x52A5 # <CJK>
+0x335B 0x52A6 # <CJK>
+0x335C 0x52A7 # <CJK>
+0x335D 0x52AF # <CJK>
+0x335E 0x52B0 # <CJK>
+0x335F 0x52B6 # <CJK>
+0x3360 0x52B7 # <CJK>
+0x3361 0x52B8 # <CJK>
+0x3362 0x52BA # <CJK>
+0x3363 0x52BB # <CJK>
+0x3364 0x52BD # <CJK>
+0x3365 0x52C0 # <CJK>
+0x3366 0x52C4 # <CJK>
+0x3367 0x52C6 # <CJK>
+0x3368 0x52C8 # <CJK>
+0x3369 0x52CC # <CJK>
+0x336A 0x52CF # <CJK>
+0x336B 0x52D1 # <CJK>
+0x336C 0x52D4 # <CJK>
+0x336D 0x52D6 # <CJK>
+0x336E 0x52DB # <CJK>
+0x336F 0x52DC # <CJK>
+0x3370 0x52E1 # <CJK>
+0x3371 0x52E5 # <CJK>
+0x3372 0x52E8 # <CJK>
+0x3373 0x52E9 # <CJK>
+0x3374 0x52EA # <CJK>
+0x3375 0x52EC # <CJK>
+0x3376 0x52F0 # <CJK>
+0x3377 0x52F1 # <CJK>
+0x3378 0x52F4 # <CJK>
+0x3379 0x52F6 # <CJK>
+0x337A 0x52F7 # <CJK>
+0x337B 0x5300 # <CJK>
+0x337C 0x5303 # <CJK>
+0x337D 0x530A # <CJK>
+0x337E 0x530B # <CJK>
+0x3421 0x530C # <CJK>
+0x3422 0x5311 # <CJK>
+0x3423 0x5313 # <CJK>
+0x3424 0x5318 # <CJK>
+0x3425 0x531B # <CJK>
+0x3426 0x531C # <CJK>
+0x3427 0x531E # <CJK>
+0x3428 0x531F # <CJK>
+0x3429 0x5325 # <CJK>
+0x342A 0x5327 # <CJK>
+0x342B 0x5328 # <CJK>
+0x342C 0x5329 # <CJK>
+0x342D 0x532B # <CJK>
+0x342E 0x532C # <CJK>
+0x342F 0x532D # <CJK>
+0x3430 0x5330 # <CJK>
+0x3431 0x5332 # <CJK>
+0x3432 0x5335 # <CJK>
+0x3433 0x533C # <CJK>
+0x3434 0x533D # <CJK>
+0x3435 0x533E # <CJK>
+0x3436 0x5342 # <CJK>
+0x3437 0x534C # <CJK>
+0x3438 0x534B # <CJK>
+0x3439 0x5359 # <CJK>
+0x343A 0x535B # <CJK>
+0x343B 0x5361 # <CJK>
+0x343C 0x5363 # <CJK>
+0x343D 0x5365 # <CJK>
+0x343E 0x536C # <CJK>
+0x343F 0x536D # <CJK>
+0x3440 0x5372 # <CJK>
+0x3441 0x5379 # <CJK>
+0x3442 0x537E # <CJK>
+0x3443 0x5383 # <CJK>
+0x3444 0x5387 # <CJK>
+0x3445 0x5388 # <CJK>
+0x3446 0x538E # <CJK>
+0x3447 0x5393 # <CJK>
+0x3448 0x5394 # <CJK>
+0x3449 0x5399 # <CJK>
+0x344A 0x539D # <CJK>
+0x344B 0x53A1 # <CJK>
+0x344C 0x53A4 # <CJK>
+0x344D 0x53AA # <CJK>
+0x344E 0x53AB # <CJK>
+0x344F 0x53AF # <CJK>
+0x3450 0x53B2 # <CJK>
+0x3451 0x53B4 # <CJK>
+0x3452 0x53B5 # <CJK>
+0x3453 0x53B7 # <CJK>
+0x3454 0x53B8 # <CJK>
+0x3455 0x53BA # <CJK>
+0x3456 0x53BD # <CJK>
+0x3457 0x53C0 # <CJK>
+0x3458 0x53C5 # <CJK>
+0x3459 0x53CF # <CJK>
+0x345A 0x53D2 # <CJK>
+0x345B 0x53D3 # <CJK>
+0x345C 0x53D5 # <CJK>
+0x345D 0x53DA # <CJK>
+0x345E 0x53DD # <CJK>
+0x345F 0x53DE # <CJK>
+0x3460 0x53E0 # <CJK>
+0x3461 0x53E6 # <CJK>
+0x3462 0x53E7 # <CJK>
+0x3463 0x53F5 # <CJK>
+0x3464 0x5402 # <CJK>
+0x3465 0x5413 # <CJK>
+0x3466 0x541A # <CJK>
+0x3467 0x5421 # <CJK>
+0x3468 0x5427 # <CJK>
+0x3469 0x5428 # <CJK>
+0x346A 0x542A # <CJK>
+0x346B 0x542F # <CJK>
+0x346C 0x5431 # <CJK>
+0x346D 0x5434 # <CJK>
+0x346E 0x5435 # <CJK>
+0x346F 0x5443 # <CJK>
+0x3470 0x5444 # <CJK>
+0x3471 0x5447 # <CJK>
+0x3472 0x544D # <CJK>
+0x3473 0x544F # <CJK>
+0x3474 0x545E # <CJK>
+0x3475 0x5462 # <CJK>
+0x3476 0x5464 # <CJK>
+0x3477 0x5466 # <CJK>
+0x3478 0x5467 # <CJK>
+0x3479 0x5469 # <CJK>
+0x347A 0x546B # <CJK>
+0x347B 0x546D # <CJK>
+0x347C 0x546E # <CJK>
+0x347D 0x5474 # <CJK>
+0x347E 0x547F # <CJK>
+0x3521 0x5481 # <CJK>
+0x3522 0x5483 # <CJK>
+0x3523 0x5485 # <CJK>
+0x3524 0x5488 # <CJK>
+0x3525 0x5489 # <CJK>
+0x3526 0x548D # <CJK>
+0x3527 0x5491 # <CJK>
+0x3528 0x5495 # <CJK>
+0x3529 0x5496 # <CJK>
+0x352A 0x549C # <CJK>
+0x352B 0x549F # <CJK>
+0x352C 0x54A1 # <CJK>
+0x352D 0x54A6 # <CJK>
+0x352E 0x54A7 # <CJK>
+0x352F 0x54A9 # <CJK>
+0x3530 0x54AA # <CJK>
+0x3531 0x54AD # <CJK>
+0x3532 0x54AE # <CJK>
+0x3533 0x54B1 # <CJK>
+0x3534 0x54B7 # <CJK>
+0x3535 0x54B9 # <CJK>
+0x3536 0x54BA # <CJK>
+0x3537 0x54BB # <CJK>
+0x3538 0x54BF # <CJK>
+0x3539 0x54C6 # <CJK>
+0x353A 0x54CA # <CJK>
+0x353B 0x54CD # <CJK>
+0x353C 0x54CE # <CJK>
+0x353D 0x54E0 # <CJK>
+0x353E 0x54EA # <CJK>
+0x353F 0x54EC # <CJK>
+0x3540 0x54EF # <CJK>
+0x3541 0x54F6 # <CJK>
+0x3542 0x54FC # <CJK>
+0x3543 0x54FE # <CJK>
+0x3544 0x54FF # <CJK>
+0x3545 0x5500 # <CJK>
+0x3546 0x5501 # <CJK>
+0x3547 0x5505 # <CJK>
+0x3548 0x5508 # <CJK>
+0x3549 0x5509 # <CJK>
+0x354A 0x550C # <CJK>
+0x354B 0x550D # <CJK>
+0x354C 0x550E # <CJK>
+0x354D 0x5515 # <CJK>
+0x354E 0x552A # <CJK>
+0x354F 0x552B # <CJK>
+0x3550 0x5532 # <CJK>
+0x3551 0x5535 # <CJK>
+0x3552 0x5536 # <CJK>
+0x3553 0x553B # <CJK>
+0x3554 0x553C # <CJK>
+0x3555 0x553D # <CJK>
+0x3556 0x5541 # <CJK>
+0x3557 0x5547 # <CJK>
+0x3558 0x5549 # <CJK>
+0x3559 0x554A # <CJK>
+0x355A 0x554D # <CJK>
+0x355B 0x5550 # <CJK>
+0x355C 0x5551 # <CJK>
+0x355D 0x5558 # <CJK>
+0x355E 0x555A # <CJK>
+0x355F 0x555B # <CJK>
+0x3560 0x555E # <CJK>
+0x3561 0x5560 # <CJK>
+0x3562 0x5561 # <CJK>
+0x3563 0x5564 # <CJK>
+0x3564 0x5566 # <CJK>
+0x3565 0x557F # <CJK>
+0x3566 0x5581 # <CJK>
+0x3567 0x5582 # <CJK>
+0x3568 0x5586 # <CJK>
+0x3569 0x5588 # <CJK>
+0x356A 0x558E # <CJK>
+0x356B 0x558F # <CJK>
+0x356C 0x5591 # <CJK>
+0x356D 0x5592 # <CJK>
+0x356E 0x5593 # <CJK>
+0x356F 0x5594 # <CJK>
+0x3570 0x5597 # <CJK>
+0x3571 0x55A3 # <CJK>
+0x3572 0x55A4 # <CJK>
+0x3573 0x55AD # <CJK>
+0x3574 0x55B2 # <CJK>
+0x3575 0x55BF # <CJK>
+0x3576 0x55C1 # <CJK>
+0x3577 0x55C3 # <CJK>
+0x3578 0x55C6 # <CJK>
+0x3579 0x55C9 # <CJK>
+0x357A 0x55CB # <CJK>
+0x357B 0x55CC # <CJK>
+0x357C 0x55CE # <CJK>
+0x357D 0x55D1 # <CJK>
+0x357E 0x55D2 # <CJK>
+0x3621 0x55D3 # <CJK>
+0x3622 0x55D7 # <CJK>
+0x3623 0x55D8 # <CJK>
+0x3624 0x55DB # <CJK>
+0x3625 0x55DE # <CJK>
+0x3626 0x55E2 # <CJK>
+0x3627 0x55E9 # <CJK>
+0x3628 0x55F6 # <CJK>
+0x3629 0x55FF # <CJK>
+0x362A 0x5605 # <CJK>
+0x362B 0x5608 # <CJK>
+0x362C 0x560A # <CJK>
+0x362D 0x560D # <CJK>
+0x362E 0x560E # <CJK>
+0x362F 0x560F # <CJK>
+0x3630 0x5610 # <CJK>
+0x3631 0x5611 # <CJK>
+0x3632 0x5612 # <CJK>
+0x3633 0x5619 # <CJK>
+0x3634 0x562C # <CJK>
+0x3635 0x5630 # <CJK>
+0x3636 0x5633 # <CJK>
+0x3637 0x5635 # <CJK>
+0x3638 0x5637 # <CJK>
+0x3639 0x5639 # <CJK>
+0x363A 0x563B # <CJK>
+0x363B 0x563C # <CJK>
+0x363C 0x563D # <CJK>
+0x363D 0x563F # <CJK>
+0x363E 0x5640 # <CJK>
+0x363F 0x5641 # <CJK>
+0x3640 0x5643 # <CJK>
+0x3641 0x5644 # <CJK>
+0x3642 0x5646 # <CJK>
+0x3643 0x5649 # <CJK>
+0x3644 0x564B # <CJK>
+0x3645 0x564D # <CJK>
+0x3646 0x564F # <CJK>
+0x3647 0x5654 # <CJK>
+0x3648 0x565E # <CJK>
+0x3649 0x5660 # <CJK>
+0x364A 0x5661 # <CJK>
+0x364B 0x5662 # <CJK>
+0x364C 0x5663 # <CJK>
+0x364D 0x5666 # <CJK>
+0x364E 0x5669 # <CJK>
+0x364F 0x566D # <CJK>
+0x3650 0x566F # <CJK>
+0x3651 0x5671 # <CJK>
+0x3652 0x5672 # <CJK>
+0x3653 0x5675 # <CJK>
+0x3654 0x5684 # <CJK>
+0x3655 0x5685 # <CJK>
+0x3656 0x5688 # <CJK>
+0x3657 0x568B # <CJK>
+0x3658 0x568C # <CJK>
+0x3659 0x5695 # <CJK>
+0x365A 0x5699 # <CJK>
+0x365B 0x569A # <CJK>
+0x365C 0x569D # <CJK>
+0x365D 0x569E # <CJK>
+0x365E 0x569F # <CJK>
+0x365F 0x56A6 # <CJK>
+0x3660 0x56A7 # <CJK>
+0x3661 0x56A8 # <CJK>
+0x3662 0x56A9 # <CJK>
+0x3663 0x56AB # <CJK>
+0x3664 0x56AC # <CJK>
+0x3665 0x56AD # <CJK>
+0x3666 0x56B1 # <CJK>
+0x3667 0x56B3 # <CJK>
+0x3668 0x56B7 # <CJK>
+0x3669 0x56BE # <CJK>
+0x366A 0x56C5 # <CJK>
+0x366B 0x56C9 # <CJK>
+0x366C 0x56CA # <CJK>
+0x366D 0x56CB # <CJK>
+0x366E 0x56CF # <CJK>
+0x366F 0x56D0 # <CJK>
+0x3670 0x56CC # <CJK>
+0x3671 0x56CD # <CJK>
+0x3672 0x56D9 # <CJK>
+0x3673 0x56DC # <CJK>
+0x3674 0x56DD # <CJK>
+0x3675 0x56DF # <CJK>
+0x3676 0x56E1 # <CJK>
+0x3677 0x56E4 # <CJK>
+0x3678 0x56E5 # <CJK>
+0x3679 0x56E6 # <CJK>
+0x367A 0x56E7 # <CJK>
+0x367B 0x56E8 # <CJK>
+0x367C 0x56F1 # <CJK>
+0x367D 0x56EB # <CJK>
+0x367E 0x56ED # <CJK>
+0x3721 0x56F6 # <CJK>
+0x3722 0x56F7 # <CJK>
+0x3723 0x5701 # <CJK>
+0x3724 0x5702 # <CJK>
+0x3725 0x5707 # <CJK>
+0x3726 0x570A # <CJK>
+0x3727 0x570C # <CJK>
+0x3728 0x5711 # <CJK>
+0x3729 0x5715 # <CJK>
+0x372A 0x571A # <CJK>
+0x372B 0x571B # <CJK>
+0x372C 0x571D # <CJK>
+0x372D 0x5720 # <CJK>
+0x372E 0x5722 # <CJK>
+0x372F 0x5723 # <CJK>
+0x3730 0x5724 # <CJK>
+0x3731 0x5725 # <CJK>
+0x3732 0x5729 # <CJK>
+0x3733 0x572A # <CJK>
+0x3734 0x572C # <CJK>
+0x3735 0x572E # <CJK>
+0x3736 0x572F # <CJK>
+0x3737 0x5733 # <CJK>
+0x3738 0x5734 # <CJK>
+0x3739 0x573D # <CJK>
+0x373A 0x573E # <CJK>
+0x373B 0x573F # <CJK>
+0x373C 0x5745 # <CJK>
+0x373D 0x5746 # <CJK>
+0x373E 0x574C # <CJK>
+0x373F 0x574D # <CJK>
+0x3740 0x5752 # <CJK>
+0x3741 0x5762 # <CJK>
+0x3742 0x5765 # <CJK>
+0x3743 0x5767 # <CJK>
+0x3744 0x5768 # <CJK>
+0x3745 0x576B # <CJK>
+0x3746 0x576D # <CJK>
+0x3747 0x576E # <CJK>
+0x3748 0x576F # <CJK>
+0x3749 0x5770 # <CJK>
+0x374A 0x5771 # <CJK>
+0x374B 0x5773 # <CJK>
+0x374C 0x5774 # <CJK>
+0x374D 0x5775 # <CJK>
+0x374E 0x5777 # <CJK>
+0x374F 0x5779 # <CJK>
+0x3750 0x577A # <CJK>
+0x3751 0x577B # <CJK>
+0x3752 0x577C # <CJK>
+0x3753 0x577E # <CJK>
+0x3754 0x5781 # <CJK>
+0x3755 0x5783 # <CJK>
+0x3756 0x578C # <CJK>
+0x3757 0x5794 # <CJK>
+0x3758 0x5797 # <CJK>
+0x3759 0x5799 # <CJK>
+0x375A 0x579A # <CJK>
+0x375B 0x579C # <CJK>
+0x375C 0x579D # <CJK>
+0x375D 0x579E # <CJK>
+0x375E 0x579F # <CJK>
+0x375F 0x57A1 # <CJK>
+0x3760 0x5795 # <CJK>
+0x3761 0x57A7 # <CJK>
+0x3762 0x57A8 # <CJK>
+0x3763 0x57A9 # <CJK>
+0x3764 0x57AC # <CJK>
+0x3765 0x57B8 # <CJK>
+0x3766 0x57BD # <CJK>
+0x3767 0x57C7 # <CJK>
+0x3768 0x57C8 # <CJK>
+0x3769 0x57CC # <CJK>
+0x376A 0x57CF # <CJK>
+0x376B 0x57D5 # <CJK>
+0x376C 0x57DD # <CJK>
+0x376D 0x57DE # <CJK>
+0x376E 0x57E4 # <CJK>
+0x376F 0x57E6 # <CJK>
+0x3770 0x57E7 # <CJK>
+0x3771 0x57E9 # <CJK>
+0x3772 0x57ED # <CJK>
+0x3773 0x57F0 # <CJK>
+0x3774 0x57F5 # <CJK>
+0x3775 0x57F6 # <CJK>
+0x3776 0x57F8 # <CJK>
+0x3777 0x57FD # <CJK>
+0x3778 0x57FE # <CJK>
+0x3779 0x57FF # <CJK>
+0x377A 0x5803 # <CJK>
+0x377B 0x5804 # <CJK>
+0x377C 0x5808 # <CJK>
+0x377D 0x5809 # <CJK>
+0x377E 0x57E1 # <CJK>
+0x3821 0x580C # <CJK>
+0x3822 0x580D # <CJK>
+0x3823 0x581B # <CJK>
+0x3824 0x581E # <CJK>
+0x3825 0x581F # <CJK>
+0x3826 0x5820 # <CJK>
+0x3827 0x5826 # <CJK>
+0x3828 0x5827 # <CJK>
+0x3829 0x582D # <CJK>
+0x382A 0x5832 # <CJK>
+0x382B 0x5839 # <CJK>
+0x382C 0x583F # <CJK>
+0x382D 0x5849 # <CJK>
+0x382E 0x584C # <CJK>
+0x382F 0x584D # <CJK>
+0x3830 0x584F # <CJK>
+0x3831 0x5850 # <CJK>
+0x3832 0x5855 # <CJK>
+0x3833 0x585F # <CJK>
+0x3834 0x5861 # <CJK>
+0x3835 0x5864 # <CJK>
+0x3836 0x5867 # <CJK>
+0x3837 0x5868 # <CJK>
+0x3838 0x5878 # <CJK>
+0x3839 0x587C # <CJK>
+0x383A 0x587F # <CJK>
+0x383B 0x5880 # <CJK>
+0x383C 0x5881 # <CJK>
+0x383D 0x5887 # <CJK>
+0x383E 0x5888 # <CJK>
+0x383F 0x5889 # <CJK>
+0x3840 0x588A # <CJK>
+0x3841 0x588C # <CJK>
+0x3842 0x588D # <CJK>
+0x3843 0x588F # <CJK>
+0x3844 0x5890 # <CJK>
+0x3845 0x5894 # <CJK>
+0x3846 0x5896 # <CJK>
+0x3847 0x589D # <CJK>
+0x3848 0x58A0 # <CJK>
+0x3849 0x58A1 # <CJK>
+0x384A 0x58A2 # <CJK>
+0x384B 0x58A6 # <CJK>
+0x384C 0x58A9 # <CJK>
+0x384D 0x58B1 # <CJK>
+0x384E 0x58B2 # <CJK>
+0x384F 0x58C4 # <CJK>
+0x3850 0x58BC # <CJK>
+0x3851 0x58C2 # <CJK>
+0x3852 0x58C8 # <CJK>
+0x3853 0x58CD # <CJK>
+0x3854 0x58CE # <CJK>
+0x3855 0x58D0 # <CJK>
+0x3856 0x58D2 # <CJK>
+0x3857 0x58D4 # <CJK>
+0x3858 0x58D6 # <CJK>
+0x3859 0x58DA # <CJK>
+0x385A 0x58DD # <CJK>
+0x385B 0x58E1 # <CJK>
+0x385C 0x58E2 # <CJK>
+0x385D 0x58E9 # <CJK>
+0x385E 0x58F3 # <CJK>
+0x385F 0x5905 # <CJK>
+0x3860 0x5906 # <CJK>
+0x3861 0x590B # <CJK>
+0x3862 0x590C # <CJK>
+0x3863 0x5912 # <CJK>
+0x3864 0x5913 # <CJK>
+0x3865 0x5914 # <CJK>
+0x3866 0x8641 # <CJK>
+0x3867 0x591D # <CJK>
+0x3868 0x5921 # <CJK>
+0x3869 0x5923 # <CJK>
+0x386A 0x5924 # <CJK>
+0x386B 0x5928 # <CJK>
+0x386C 0x592F # <CJK>
+0x386D 0x5930 # <CJK>
+0x386E 0x5933 # <CJK>
+0x386F 0x5935 # <CJK>
+0x3870 0x5936 # <CJK>
+0x3871 0x593F # <CJK>
+0x3872 0x5943 # <CJK>
+0x3873 0x5946 # <CJK>
+0x3874 0x5952 # <CJK>
+0x3875 0x5953 # <CJK>
+0x3876 0x5959 # <CJK>
+0x3877 0x595B # <CJK>
+0x3878 0x595D # <CJK>
+0x3879 0x595E # <CJK>
+0x387A 0x595F # <CJK>
+0x387B 0x5961 # <CJK>
+0x387C 0x5963 # <CJK>
+0x387D 0x596B # <CJK>
+0x387E 0x596D # <CJK>
+0x3921 0x596F # <CJK>
+0x3922 0x5972 # <CJK>
+0x3923 0x5975 # <CJK>
+0x3924 0x5976 # <CJK>
+0x3925 0x5979 # <CJK>
+0x3926 0x597B # <CJK>
+0x3927 0x597C # <CJK>
+0x3928 0x598B # <CJK>
+0x3929 0x598C # <CJK>
+0x392A 0x598E # <CJK>
+0x392B 0x5992 # <CJK>
+0x392C 0x5995 # <CJK>
+0x392D 0x5997 # <CJK>
+0x392E 0x599F # <CJK>
+0x392F 0x59A4 # <CJK>
+0x3930 0x59A7 # <CJK>
+0x3931 0x59AD # <CJK>
+0x3932 0x59AE # <CJK>
+0x3933 0x59AF # <CJK>
+0x3934 0x59B0 # <CJK>
+0x3935 0x59B3 # <CJK>
+0x3936 0x59B7 # <CJK>
+0x3937 0x59BA # <CJK>
+0x3938 0x59BC # <CJK>
+0x3939 0x59C1 # <CJK>
+0x393A 0x59C3 # <CJK>
+0x393B 0x59C4 # <CJK>
+0x393C 0x59C8 # <CJK>
+0x393D 0x59CA # <CJK>
+0x393E 0x59CD # <CJK>
+0x393F 0x59D2 # <CJK>
+0x3940 0x59DD # <CJK>
+0x3941 0x59DE # <CJK>
+0x3942 0x59DF # <CJK>
+0x3943 0x59E3 # <CJK>
+0x3944 0x59E4 # <CJK>
+0x3945 0x59E7 # <CJK>
+0x3946 0x59EE # <CJK>
+0x3947 0x59EF # <CJK>
+0x3948 0x59F1 # <CJK>
+0x3949 0x59F2 # <CJK>
+0x394A 0x59F4 # <CJK>
+0x394B 0x59F7 # <CJK>
+0x394C 0x5A00 # <CJK>
+0x394D 0x5A04 # <CJK>
+0x394E 0x5A0C # <CJK>
+0x394F 0x5A0D # <CJK>
+0x3950 0x5A0E # <CJK>
+0x3951 0x5A12 # <CJK>
+0x3952 0x5A13 # <CJK>
+0x3953 0x5A1E # <CJK>
+0x3954 0x5A23 # <CJK>
+0x3955 0x5A24 # <CJK>
+0x3956 0x5A27 # <CJK>
+0x3957 0x5A28 # <CJK>
+0x3958 0x5A2A # <CJK>
+0x3959 0x5A2D # <CJK>
+0x395A 0x5A30 # <CJK>
+0x395B 0x5A44 # <CJK>
+0x395C 0x5A45 # <CJK>
+0x395D 0x5A47 # <CJK>
+0x395E 0x5A48 # <CJK>
+0x395F 0x5A4C # <CJK>
+0x3960 0x5A50 # <CJK>
+0x3961 0x5A55 # <CJK>
+0x3962 0x5A5E # <CJK>
+0x3963 0x5A63 # <CJK>
+0x3964 0x5A65 # <CJK>
+0x3965 0x5A67 # <CJK>
+0x3966 0x5A6D # <CJK>
+0x3967 0x5A77 # <CJK>
+0x3968 0x5A7A # <CJK>
+0x3969 0x5A7B # <CJK>
+0x396A 0x5A7E # <CJK>
+0x396B 0x5A8B # <CJK>
+0x396C 0x5A90 # <CJK>
+0x396D 0x5A93 # <CJK>
+0x396E 0x5A96 # <CJK>
+0x396F 0x5A99 # <CJK>
+0x3970 0x5A9C # <CJK>
+0x3971 0x5A9E # <CJK>
+0x3972 0x5A9F # <CJK>
+0x3973 0x5AA0 # <CJK>
+0x3974 0x5AA2 # <CJK>
+0x3975 0x5AA7 # <CJK>
+0x3976 0x5AAC # <CJK>
+0x3977 0x5AB1 # <CJK>
+0x3978 0x5AB2 # <CJK>
+0x3979 0x5AB3 # <CJK>
+0x397A 0x5AB5 # <CJK>
+0x397B 0x5AB8 # <CJK>
+0x397C 0x5ABA # <CJK>
+0x397D 0x5ABB # <CJK>
+0x397E 0x5ABF # <CJK>
+0x3A21 0x5AC4 # <CJK>
+0x3A22 0x5AC6 # <CJK>
+0x3A23 0x5AC8 # <CJK>
+0x3A24 0x5ACF # <CJK>
+0x3A25 0x5ADA # <CJK>
+0x3A26 0x5ADC # <CJK>
+0x3A27 0x5AE0 # <CJK>
+0x3A28 0x5AE5 # <CJK>
+0x3A29 0x5AEA # <CJK>
+0x3A2A 0x5AEE # <CJK>
+0x3A2B 0x5AF5 # <CJK>
+0x3A2C 0x5AF6 # <CJK>
+0x3A2D 0x5AFD # <CJK>
+0x3A2E 0x5B00 # <CJK>
+0x3A2F 0x5B01 # <CJK>
+0x3A30 0x5B08 # <CJK>
+0x3A31 0x5B17 # <CJK>
+0x3A32 0x5B34 # <CJK>
+0x3A33 0x5B19 # <CJK>
+0x3A34 0x5B1B # <CJK>
+0x3A35 0x5B1D # <CJK>
+0x3A36 0x5B21 # <CJK>
+0x3A37 0x5B25 # <CJK>
+0x3A38 0x5B2D # <CJK>
+0x3A39 0x5B38 # <CJK>
+0x3A3A 0x5B41 # <CJK>
+0x3A3B 0x5B4B # <CJK>
+0x3A3C 0x5B4C # <CJK>
+0x3A3D 0x5B52 # <CJK>
+0x3A3E 0x5B56 # <CJK>
+0x3A3F 0x5B5E # <CJK>
+0x3A40 0x5B68 # <CJK>
+0x3A41 0x5B6E # <CJK>
+0x3A42 0x5B6F # <CJK>
+0x3A43 0x5B7C # <CJK>
+0x3A44 0x5B7D # <CJK>
+0x3A45 0x5B7E # <CJK>
+0x3A46 0x5B7F # <CJK>
+0x3A47 0x5B81 # <CJK>
+0x3A48 0x5B84 # <CJK>
+0x3A49 0x5B86 # <CJK>
+0x3A4A 0x5B8A # <CJK>
+0x3A4B 0x5B8E # <CJK>
+0x3A4C 0x5B90 # <CJK>
+0x3A4D 0x5B91 # <CJK>
+0x3A4E 0x5B93 # <CJK>
+0x3A4F 0x5B94 # <CJK>
+0x3A50 0x5B96 # <CJK>
+0x3A51 0x5BA8 # <CJK>
+0x3A52 0x5BA9 # <CJK>
+0x3A53 0x5BAC # <CJK>
+0x3A54 0x5BAD # <CJK>
+0x3A55 0x5BAF # <CJK>
+0x3A56 0x5BB1 # <CJK>
+0x3A57 0x5BB2 # <CJK>
+0x3A58 0x5BB7 # <CJK>
+0x3A59 0x5BBA # <CJK>
+0x3A5A 0x5BBC # <CJK>
+0x3A5B 0x5BC0 # <CJK>
+0x3A5C 0x5BC1 # <CJK>
+0x3A5D 0x5BCD # <CJK>
+0x3A5E 0x5BCF # <CJK>
+0x3A5F 0x5BD6 # <CJK>
+0x3A60 0x5BD7 # <CJK>
+0x3A61 0x5BD8 # <CJK>
+0x3A62 0x5BD9 # <CJK>
+0x3A63 0x5BDA # <CJK>
+0x3A64 0x5BE0 # <CJK>
+0x3A65 0x5BEF # <CJK>
+0x3A66 0x5BF1 # <CJK>
+0x3A67 0x5BF4 # <CJK>
+0x3A68 0x5BFD # <CJK>
+0x3A69 0x5C0C # <CJK>
+0x3A6A 0x5C17 # <CJK>
+0x3A6B 0x5C1E # <CJK>
+0x3A6C 0x5C1F # <CJK>
+0x3A6D 0x5C23 # <CJK>
+0x3A6E 0x5C26 # <CJK>
+0x3A6F 0x5C29 # <CJK>
+0x3A70 0x5C2B # <CJK>
+0x3A71 0x5C2C # <CJK>
+0x3A72 0x5C2E # <CJK>
+0x3A73 0x5C30 # <CJK>
+0x3A74 0x5C32 # <CJK>
+0x3A75 0x5C35 # <CJK>
+0x3A76 0x5C36 # <CJK>
+0x3A77 0x5C59 # <CJK>
+0x3A78 0x5C5A # <CJK>
+0x3A79 0x5C5C # <CJK>
+0x3A7A 0x5C62 # <CJK>
+0x3A7B 0x5C63 # <CJK>
+0x3A7C 0x5C67 # <CJK>
+0x3A7D 0x5C68 # <CJK>
+0x3A7E 0x5C69 # <CJK>
+0x3B21 0x5C6D # <CJK>
+0x3B22 0x5C70 # <CJK>
+0x3B23 0x5C74 # <CJK>
+0x3B24 0x5C75 # <CJK>
+0x3B25 0x5C7A # <CJK>
+0x3B26 0x5C7B # <CJK>
+0x3B27 0x5C7C # <CJK>
+0x3B28 0x5C7D # <CJK>
+0x3B29 0x5C87 # <CJK>
+0x3B2A 0x5C88 # <CJK>
+0x3B2B 0x5C8A # <CJK>
+0x3B2C 0x5C8F # <CJK>
+0x3B2D 0x5C92 # <CJK>
+0x3B2E 0x5C9D # <CJK>
+0x3B2F 0x5C9F # <CJK>
+0x3B30 0x5CA0 # <CJK>
+0x3B31 0x5CA2 # <CJK>
+0x3B32 0x5CA3 # <CJK>
+0x3B33 0x5CA6 # <CJK>
+0x3B34 0x5CAA # <CJK>
+0x3B35 0x5CB2 # <CJK>
+0x3B36 0x5CB4 # <CJK>
+0x3B37 0x5CB5 # <CJK>
+0x3B38 0x5CBA # <CJK>
+0x3B39 0x5CC9 # <CJK>
+0x3B3A 0x5CCB # <CJK>
+0x3B3B 0x5CD2 # <CJK>
+0x3B3C 0x5CDD # <CJK>
+0x3B3D 0x5CD7 # <CJK>
+0x3B3E 0x5CEE # <CJK>
+0x3B3F 0x5CF1 # <CJK>
+0x3B40 0x5CF2 # <CJK>
+0x3B41 0x5CF4 # <CJK>
+0x3B42 0x5D01 # <CJK>
+0x3B43 0x5D06 # <CJK>
+0x3B44 0x5D0D # <CJK>
+0x3B45 0x5D12 # <CJK>
+0x3B46 0x5D2B # <CJK>
+0x3B47 0x5D23 # <CJK>
+0x3B48 0x5D24 # <CJK>
+0x3B49 0x5D26 # <CJK>
+0x3B4A 0x5D27 # <CJK>
+0x3B4B 0x5D31 # <CJK>
+0x3B4C 0x5D34 # <CJK>
+0x3B4D 0x5D39 # <CJK>
+0x3B4E 0x5D3D # <CJK>
+0x3B4F 0x5D3F # <CJK>
+0x3B50 0x5D42 # <CJK>
+0x3B51 0x5D43 # <CJK>
+0x3B52 0x5D46 # <CJK>
+0x3B53 0x5D48 # <CJK>
+0x3B54 0x5D55 # <CJK>
+0x3B55 0x5D51 # <CJK>
+0x3B56 0x5D59 # <CJK>
+0x3B57 0x5D4A # <CJK>
+0x3B58 0x5D5F # <CJK>
+0x3B59 0x5D60 # <CJK>
+0x3B5A 0x5D61 # <CJK>
+0x3B5B 0x5D62 # <CJK>
+0x3B5C 0x5D64 # <CJK>
+0x3B5D 0x5D6A # <CJK>
+0x3B5E 0x5D6D # <CJK>
+0x3B5F 0x5D70 # <CJK>
+0x3B60 0x5D79 # <CJK>
+0x3B61 0x5D7A # <CJK>
+0x3B62 0x5D7E # <CJK>
+0x3B63 0x5D7F # <CJK>
+0x3B64 0x5D81 # <CJK>
+0x3B65 0x5D83 # <CJK>
+0x3B66 0x5D88 # <CJK>
+0x3B67 0x5D8A # <CJK>
+0x3B68 0x5D92 # <CJK>
+0x3B69 0x5D93 # <CJK>
+0x3B6A 0x5D94 # <CJK>
+0x3B6B 0x5D95 # <CJK>
+0x3B6C 0x5D99 # <CJK>
+0x3B6D 0x5D9B # <CJK>
+0x3B6E 0x5D9F # <CJK>
+0x3B6F 0x5DA0 # <CJK>
+0x3B70 0x5DA7 # <CJK>
+0x3B71 0x5DAB # <CJK>
+0x3B72 0x5DB0 # <CJK>
+0x3B73 0x5DB4 # <CJK>
+0x3B74 0x5DB8 # <CJK>
+0x3B75 0x5DB9 # <CJK>
+0x3B76 0x5DC3 # <CJK>
+0x3B77 0x5DC7 # <CJK>
+0x3B78 0x5DCB # <CJK>
+0x3B79 0x5DD0 # <CJK>
+0x3B7A 0x5DCE # <CJK>
+0x3B7B 0x5DD8 # <CJK>
+0x3B7C 0x5DD9 # <CJK>
+0x3B7D 0x5DE0 # <CJK>
+0x3B7E 0x5DE4 # <CJK>
+0x3C21 0x5DE9 # <CJK>
+0x3C22 0x5DF8 # <CJK>
+0x3C23 0x5DF9 # <CJK>
+0x3C24 0x5E00 # <CJK>
+0x3C25 0x5E07 # <CJK>
+0x3C26 0x5E0D # <CJK>
+0x3C27 0x5E12 # <CJK>
+0x3C28 0x5E14 # <CJK>
+0x3C29 0x5E15 # <CJK>
+0x3C2A 0x5E18 # <CJK>
+0x3C2B 0x5E1F # <CJK>
+0x3C2C 0x5E20 # <CJK>
+0x3C2D 0x5E2E # <CJK>
+0x3C2E 0x5E28 # <CJK>
+0x3C2F 0x5E32 # <CJK>
+0x3C30 0x5E35 # <CJK>
+0x3C31 0x5E3E # <CJK>
+0x3C32 0x5E4B # <CJK>
+0x3C33 0x5E50 # <CJK>
+0x3C34 0x5E49 # <CJK>
+0x3C35 0x5E51 # <CJK>
+0x3C36 0x5E56 # <CJK>
+0x3C37 0x5E58 # <CJK>
+0x3C38 0x5E5B # <CJK>
+0x3C39 0x5E5C # <CJK>
+0x3C3A 0x5E5E # <CJK>
+0x3C3B 0x5E68 # <CJK>
+0x3C3C 0x5E6A # <CJK>
+0x3C3D 0x5E6B # <CJK>
+0x3C3E 0x5E6C # <CJK>
+0x3C3F 0x5E6D # <CJK>
+0x3C40 0x5E6E # <CJK>
+0x3C41 0x5E70 # <CJK>
+0x3C42 0x5E80 # <CJK>
+0x3C43 0x5E8B # <CJK>
+0x3C44 0x5E8E # <CJK>
+0x3C45 0x5EA2 # <CJK>
+0x3C46 0x5EA4 # <CJK>
+0x3C47 0x5EA5 # <CJK>
+0x3C48 0x5EA8 # <CJK>
+0x3C49 0x5EAA # <CJK>
+0x3C4A 0x5EAC # <CJK>
+0x3C4B 0x5EB1 # <CJK>
+0x3C4C 0x5EB3 # <CJK>
+0x3C4D 0x5EBD # <CJK>
+0x3C4E 0x5EBE # <CJK>
+0x3C4F 0x5EBF # <CJK>
+0x3C50 0x5EC6 # <CJK>
+0x3C51 0x5ECC # <CJK>
+0x3C52 0x5ECB # <CJK>
+0x3C53 0x5ECE # <CJK>
+0x3C54 0x5ED1 # <CJK>
+0x3C55 0x5ED2 # <CJK>
+0x3C56 0x5ED4 # <CJK>
+0x3C57 0x5ED5 # <CJK>
+0x3C58 0x5EDC # <CJK>
+0x3C59 0x5EDE # <CJK>
+0x3C5A 0x5EE5 # <CJK>
+0x3C5B 0x5EEB # <CJK>
+0x3C5C 0x5F02 # <CJK>
+0x3C5D 0x5F06 # <CJK>
+0x3C5E 0x5F07 # <CJK>
+0x3C5F 0x5F08 # <CJK>
+0x3C60 0x5F0E # <CJK>
+0x3C61 0x5F19 # <CJK>
+0x3C62 0x5F1C # <CJK>
+0x3C63 0x5F1D # <CJK>
+0x3C64 0x5F21 # <CJK>
+0x3C65 0x5F22 # <CJK>
+0x3C66 0x5F23 # <CJK>
+0x3C67 0x5F24 # <CJK>
+0x3C68 0x5F28 # <CJK>
+0x3C69 0x5F2B # <CJK>
+0x3C6A 0x5F2C # <CJK>
+0x3C6B 0x5F2E # <CJK>
+0x3C6C 0x5F30 # <CJK>
+0x3C6D 0x5F34 # <CJK>
+0x3C6E 0x5F36 # <CJK>
+0x3C6F 0x5F3B # <CJK>
+0x3C70 0x5F3D # <CJK>
+0x3C71 0x5F3F # <CJK>
+0x3C72 0x5F40 # <CJK>
+0x3C73 0x5F44 # <CJK>
+0x3C74 0x5F45 # <CJK>
+0x3C75 0x5F47 # <CJK>
+0x3C76 0x5F4D # <CJK>
+0x3C77 0x5F50 # <CJK>
+0x3C78 0x5F54 # <CJK>
+0x3C79 0x5F58 # <CJK>
+0x3C7A 0x5F5B # <CJK>
+0x3C7B 0x5F60 # <CJK>
+0x3C7C 0x5F63 # <CJK>
+0x3C7D 0x5F64 # <CJK>
+0x3C7E 0x5F67 # <CJK>
+0x3D21 0x5F6F # <CJK>
+0x3D22 0x5F72 # <CJK>
+0x3D23 0x5F74 # <CJK>
+0x3D24 0x5F75 # <CJK>
+0x3D25 0x5F78 # <CJK>
+0x3D26 0x5F7A # <CJK>
+0x3D27 0x5F7D # <CJK>
+0x3D28 0x5F7E # <CJK>
+0x3D29 0x5F89 # <CJK>
+0x3D2A 0x5F8D # <CJK>
+0x3D2B 0x5F8F # <CJK>
+0x3D2C 0x5F96 # <CJK>
+0x3D2D 0x5F9C # <CJK>
+0x3D2E 0x5F9D # <CJK>
+0x3D2F 0x5FA2 # <CJK>
+0x3D30 0x5FA7 # <CJK>
+0x3D31 0x5FAB # <CJK>
+0x3D32 0x5FA4 # <CJK>
+0x3D33 0x5FAC # <CJK>
+0x3D34 0x5FAF # <CJK>
+0x3D35 0x5FB0 # <CJK>
+0x3D36 0x5FB1 # <CJK>
+0x3D37 0x5FB8 # <CJK>
+0x3D38 0x5FC4 # <CJK>
+0x3D39 0x5FC7 # <CJK>
+0x3D3A 0x5FC8 # <CJK>
+0x3D3B 0x5FC9 # <CJK>
+0x3D3C 0x5FCB # <CJK>
+0x3D3D 0x5FD0 # <CJK>
+0x3D3E 0x5FD1 # <CJK>
+0x3D3F 0x5FD2 # <CJK>
+0x3D40 0x5FD3 # <CJK>
+0x3D41 0x5FD4 # <CJK>
+0x3D42 0x5FDE # <CJK>
+0x3D43 0x5FE1 # <CJK>
+0x3D44 0x5FE2 # <CJK>
+0x3D45 0x5FE8 # <CJK>
+0x3D46 0x5FE9 # <CJK>
+0x3D47 0x5FEA # <CJK>
+0x3D48 0x5FEC # <CJK>
+0x3D49 0x5FED # <CJK>
+0x3D4A 0x5FEE # <CJK>
+0x3D4B 0x5FEF # <CJK>
+0x3D4C 0x5FF2 # <CJK>
+0x3D4D 0x5FF3 # <CJK>
+0x3D4E 0x5FF6 # <CJK>
+0x3D4F 0x5FFA # <CJK>
+0x3D50 0x5FFC # <CJK>
+0x3D51 0x6007 # <CJK>
+0x3D52 0x600A # <CJK>
+0x3D53 0x600D # <CJK>
+0x3D54 0x6013 # <CJK>
+0x3D55 0x6014 # <CJK>
+0x3D56 0x6017 # <CJK>
+0x3D57 0x6018 # <CJK>
+0x3D58 0x601A # <CJK>
+0x3D59 0x601F # <CJK>
+0x3D5A 0x6024 # <CJK>
+0x3D5B 0x602D # <CJK>
+0x3D5C 0x6033 # <CJK>
+0x3D5D 0x6035 # <CJK>
+0x3D5E 0x6040 # <CJK>
+0x3D5F 0x6047 # <CJK>
+0x3D60 0x6048 # <CJK>
+0x3D61 0x6049 # <CJK>
+0x3D62 0x604C # <CJK>
+0x3D63 0x6051 # <CJK>
+0x3D64 0x6054 # <CJK>
+0x3D65 0x6056 # <CJK>
+0x3D66 0x6057 # <CJK>
+0x3D67 0x605D # <CJK>
+0x3D68 0x6061 # <CJK>
+0x3D69 0x6067 # <CJK>
+0x3D6A 0x6071 # <CJK>
+0x3D6B 0x607E # <CJK>
+0x3D6C 0x607F # <CJK>
+0x3D6D 0x6082 # <CJK>
+0x3D6E 0x6086 # <CJK>
+0x3D6F 0x6088 # <CJK>
+0x3D70 0x608A # <CJK>
+0x3D71 0x608E # <CJK>
+0x3D72 0x6091 # <CJK>
+0x3D73 0x6093 # <CJK>
+0x3D74 0x6095 # <CJK>
+0x3D75 0x6098 # <CJK>
+0x3D76 0x609D # <CJK>
+0x3D77 0x609E # <CJK>
+0x3D78 0x60A2 # <CJK>
+0x3D79 0x60A4 # <CJK>
+0x3D7A 0x60A5 # <CJK>
+0x3D7B 0x60A8 # <CJK>
+0x3D7C 0x60B0 # <CJK>
+0x3D7D 0x60B1 # <CJK>
+0x3D7E 0x60B7 # <CJK>
+0x3E21 0x60BB # <CJK>
+0x3E22 0x60BE # <CJK>
+0x3E23 0x60C2 # <CJK>
+0x3E24 0x60C4 # <CJK>
+0x3E25 0x60C8 # <CJK>
+0x3E26 0x60C9 # <CJK>
+0x3E27 0x60CA # <CJK>
+0x3E28 0x60CB # <CJK>
+0x3E29 0x60CE # <CJK>
+0x3E2A 0x60CF # <CJK>
+0x3E2B 0x60D4 # <CJK>
+0x3E2C 0x60D5 # <CJK>
+0x3E2D 0x60D9 # <CJK>
+0x3E2E 0x60DB # <CJK>
+0x3E2F 0x60DD # <CJK>
+0x3E30 0x60DE # <CJK>
+0x3E31 0x60E2 # <CJK>
+0x3E32 0x60E5 # <CJK>
+0x3E33 0x60F2 # <CJK>
+0x3E34 0x60F5 # <CJK>
+0x3E35 0x60F8 # <CJK>
+0x3E36 0x60FC # <CJK>
+0x3E37 0x60FD # <CJK>
+0x3E38 0x6102 # <CJK>
+0x3E39 0x6107 # <CJK>
+0x3E3A 0x610A # <CJK>
+0x3E3B 0x610C # <CJK>
+0x3E3C 0x6110 # <CJK>
+0x3E3D 0x6111 # <CJK>
+0x3E3E 0x6112 # <CJK>
+0x3E3F 0x6113 # <CJK>
+0x3E40 0x6114 # <CJK>
+0x3E41 0x6116 # <CJK>
+0x3E42 0x6117 # <CJK>
+0x3E43 0x6119 # <CJK>
+0x3E44 0x611C # <CJK>
+0x3E45 0x611E # <CJK>
+0x3E46 0x6122 # <CJK>
+0x3E47 0x612A # <CJK>
+0x3E48 0x612B # <CJK>
+0x3E49 0x6130 # <CJK>
+0x3E4A 0x6131 # <CJK>
+0x3E4B 0x6135 # <CJK>
+0x3E4C 0x6136 # <CJK>
+0x3E4D 0x6137 # <CJK>
+0x3E4E 0x6139 # <CJK>
+0x3E4F 0x6141 # <CJK>
+0x3E50 0x6145 # <CJK>
+0x3E51 0x6146 # <CJK>
+0x3E52 0x6149 # <CJK>
+0x3E53 0x615E # <CJK>
+0x3E54 0x6160 # <CJK>
+0x3E55 0x616C # <CJK>
+0x3E56 0x6172 # <CJK>
+0x3E57 0x6178 # <CJK>
+0x3E58 0x617B # <CJK>
+0x3E59 0x617C # <CJK>
+0x3E5A 0x617F # <CJK>
+0x3E5B 0x6180 # <CJK>
+0x3E5C 0x6181 # <CJK>
+0x3E5D 0x6183 # <CJK>
+0x3E5E 0x6184 # <CJK>
+0x3E5F 0x618B # <CJK>
+0x3E60 0x618D # <CJK>
+0x3E61 0x6192 # <CJK>
+0x3E62 0x6193 # <CJK>
+0x3E63 0x6197 # <CJK>
+0x3E64 0x6198 # <CJK>
+0x3E65 0x619C # <CJK>
+0x3E66 0x619D # <CJK>
+0x3E67 0x619F # <CJK>
+0x3E68 0x61A0 # <CJK>
+0x3E69 0x61A5 # <CJK>
+0x3E6A 0x61A8 # <CJK>
+0x3E6B 0x61AA # <CJK>
+0x3E6C 0x61AD # <CJK>
+0x3E6D 0x61B8 # <CJK>
+0x3E6E 0x61B9 # <CJK>
+0x3E6F 0x61BC # <CJK>
+0x3E70 0x61C0 # <CJK>
+0x3E71 0x61C1 # <CJK>
+0x3E72 0x61C2 # <CJK>
+0x3E73 0x61CE # <CJK>
+0x3E74 0x61CF # <CJK>
+0x3E75 0x61D5 # <CJK>
+0x3E76 0x61DC # <CJK>
+0x3E77 0x61DD # <CJK>
+0x3E78 0x61DE # <CJK>
+0x3E79 0x61DF # <CJK>
+0x3E7A 0x61E1 # <CJK>
+0x3E7B 0x61E2 # <CJK>
+0x3E7C 0x61E7 # <CJK>
+0x3E7D 0x61E9 # <CJK>
+0x3E7E 0x61E5 # <CJK>
+0x3F21 0x61EC # <CJK>
+0x3F22 0x61ED # <CJK>
+0x3F23 0x61EF # <CJK>
+0x3F24 0x6201 # <CJK>
+0x3F25 0x6203 # <CJK>
+0x3F26 0x6204 # <CJK>
+0x3F27 0x6207 # <CJK>
+0x3F28 0x6213 # <CJK>
+0x3F29 0x6215 # <CJK>
+0x3F2A 0x621C # <CJK>
+0x3F2B 0x6220 # <CJK>
+0x3F2C 0x6222 # <CJK>
+0x3F2D 0x6223 # <CJK>
+0x3F2E 0x6227 # <CJK>
+0x3F2F 0x6229 # <CJK>
+0x3F30 0x622B # <CJK>
+0x3F31 0x6239 # <CJK>
+0x3F32 0x623D # <CJK>
+0x3F33 0x6242 # <CJK>
+0x3F34 0x6243 # <CJK>
+0x3F35 0x6244 # <CJK>
+0x3F36 0x6246 # <CJK>
+0x3F37 0x624C # <CJK>
+0x3F38 0x6250 # <CJK>
+0x3F39 0x6251 # <CJK>
+0x3F3A 0x6252 # <CJK>
+0x3F3B 0x6254 # <CJK>
+0x3F3C 0x6256 # <CJK>
+0x3F3D 0x625A # <CJK>
+0x3F3E 0x625C # <CJK>
+0x3F3F 0x6264 # <CJK>
+0x3F40 0x626D # <CJK>
+0x3F41 0x626F # <CJK>
+0x3F42 0x6273 # <CJK>
+0x3F43 0x627A # <CJK>
+0x3F44 0x627D # <CJK>
+0x3F45 0x628D # <CJK>
+0x3F46 0x628E # <CJK>
+0x3F47 0x628F # <CJK>
+0x3F48 0x6290 # <CJK>
+0x3F49 0x62A6 # <CJK>
+0x3F4A 0x62A8 # <CJK>
+0x3F4B 0x62B3 # <CJK>
+0x3F4C 0x62B6 # <CJK>
+0x3F4D 0x62B7 # <CJK>
+0x3F4E 0x62BA # <CJK>
+0x3F4F 0x62BE # <CJK>
+0x3F50 0x62BF # <CJK>
+0x3F51 0x62C4 # <CJK>
+0x3F52 0x62CE # <CJK>
+0x3F53 0x62D5 # <CJK>
+0x3F54 0x62D6 # <CJK>
+0x3F55 0x62DA # <CJK>
+0x3F56 0x62EA # <CJK>
+0x3F57 0x62F2 # <CJK>
+0x3F58 0x62F4 # <CJK>
+0x3F59 0x62FC # <CJK>
+0x3F5A 0x62FD # <CJK>
+0x3F5B 0x6303 # <CJK>
+0x3F5C 0x6304 # <CJK>
+0x3F5D 0x630A # <CJK>
+0x3F5E 0x630B # <CJK>
+0x3F5F 0x630D # <CJK>
+0x3F60 0x6310 # <CJK>
+0x3F61 0x6313 # <CJK>
+0x3F62 0x6316 # <CJK>
+0x3F63 0x6318 # <CJK>
+0x3F64 0x6329 # <CJK>
+0x3F65 0x632A # <CJK>
+0x3F66 0x632D # <CJK>
+0x3F67 0x6335 # <CJK>
+0x3F68 0x6336 # <CJK>
+0x3F69 0x6339 # <CJK>
+0x3F6A 0x633C # <CJK>
+0x3F6B 0x6341 # <CJK>
+0x3F6C 0x6342 # <CJK>
+0x3F6D 0x6343 # <CJK>
+0x3F6E 0x6344 # <CJK>
+0x3F6F 0x6346 # <CJK>
+0x3F70 0x634A # <CJK>
+0x3F71 0x634B # <CJK>
+0x3F72 0x634E # <CJK>
+0x3F73 0x6352 # <CJK>
+0x3F74 0x6353 # <CJK>
+0x3F75 0x6354 # <CJK>
+0x3F76 0x6358 # <CJK>
+0x3F77 0x635B # <CJK>
+0x3F78 0x6365 # <CJK>
+0x3F79 0x6366 # <CJK>
+0x3F7A 0x636C # <CJK>
+0x3F7B 0x636D # <CJK>
+0x3F7C 0x6371 # <CJK>
+0x3F7D 0x6374 # <CJK>
+0x3F7E 0x6375 # <CJK>
+0x4021 0x6378 # <CJK>
+0x4022 0x637C # <CJK>
+0x4023 0x637D # <CJK>
+0x4024 0x637F # <CJK>
+0x4025 0x6382 # <CJK>
+0x4026 0x6384 # <CJK>
+0x4027 0x6387 # <CJK>
+0x4028 0x638A # <CJK>
+0x4029 0x6390 # <CJK>
+0x402A 0x6394 # <CJK>
+0x402B 0x6395 # <CJK>
+0x402C 0x6399 # <CJK>
+0x402D 0x639A # <CJK>
+0x402E 0x639E # <CJK>
+0x402F 0x63A4 # <CJK>
+0x4030 0x63A6 # <CJK>
+0x4031 0x63AD # <CJK>
+0x4032 0x63AE # <CJK>
+0x4033 0x63AF # <CJK>
+0x4034 0x63BD # <CJK>
+0x4035 0x63C1 # <CJK>
+0x4036 0x63C5 # <CJK>
+0x4037 0x63C8 # <CJK>
+0x4038 0x63CE # <CJK>
+0x4039 0x63D1 # <CJK>
+0x403A 0x63D3 # <CJK>
+0x403B 0x63D4 # <CJK>
+0x403C 0x63D5 # <CJK>
+0x403D 0x63DC # <CJK>
+0x403E 0x63E0 # <CJK>
+0x403F 0x63E5 # <CJK>
+0x4040 0x63EA # <CJK>
+0x4041 0x63EC # <CJK>
+0x4042 0x63F2 # <CJK>
+0x4043 0x63F3 # <CJK>
+0x4044 0x63F5 # <CJK>
+0x4045 0x63F8 # <CJK>
+0x4046 0x63F9 # <CJK>
+0x4047 0x6409 # <CJK>
+0x4048 0x640A # <CJK>
+0x4049 0x6410 # <CJK>
+0x404A 0x6412 # <CJK>
+0x404B 0x6414 # <CJK>
+0x404C 0x6418 # <CJK>
+0x404D 0x641E # <CJK>
+0x404E 0x6420 # <CJK>
+0x404F 0x6422 # <CJK>
+0x4050 0x6424 # <CJK>
+0x4051 0x6425 # <CJK>
+0x4052 0x6429 # <CJK>
+0x4053 0x642A # <CJK>
+0x4054 0x642F # <CJK>
+0x4055 0x6430 # <CJK>
+0x4056 0x6435 # <CJK>
+0x4057 0x643D # <CJK>
+0x4058 0x643F # <CJK>
+0x4059 0x644B # <CJK>
+0x405A 0x644F # <CJK>
+0x405B 0x6451 # <CJK>
+0x405C 0x6452 # <CJK>
+0x405D 0x6453 # <CJK>
+0x405E 0x6454 # <CJK>
+0x405F 0x645A # <CJK>
+0x4060 0x645B # <CJK>
+0x4061 0x645C # <CJK>
+0x4062 0x645D # <CJK>
+0x4063 0x645F # <CJK>
+0x4064 0x6460 # <CJK>
+0x4065 0x6461 # <CJK>
+0x4066 0x6463 # <CJK>
+0x4067 0x646D # <CJK>
+0x4068 0x6473 # <CJK>
+0x4069 0x6474 # <CJK>
+0x406A 0x647B # <CJK>
+0x406B 0x647D # <CJK>
+0x406C 0x6485 # <CJK>
+0x406D 0x6487 # <CJK>
+0x406E 0x648F # <CJK>
+0x406F 0x6490 # <CJK>
+0x4070 0x6491 # <CJK>
+0x4071 0x6498 # <CJK>
+0x4072 0x6499 # <CJK>
+0x4073 0x649B # <CJK>
+0x4074 0x649D # <CJK>
+0x4075 0x649F # <CJK>
+0x4076 0x64A1 # <CJK>
+0x4077 0x64A3 # <CJK>
+0x4078 0x64A6 # <CJK>
+0x4079 0x64A8 # <CJK>
+0x407A 0x64AC # <CJK>
+0x407B 0x64B3 # <CJK>
+0x407C 0x64BD # <CJK>
+0x407D 0x64BE # <CJK>
+0x407E 0x64BF # <CJK>
+0x4121 0x64C4 # <CJK>
+0x4122 0x64C9 # <CJK>
+0x4123 0x64CA # <CJK>
+0x4124 0x64CB # <CJK>
+0x4125 0x64CC # <CJK>
+0x4126 0x64CE # <CJK>
+0x4127 0x64D0 # <CJK>
+0x4128 0x64D1 # <CJK>
+0x4129 0x64D5 # <CJK>
+0x412A 0x64D7 # <CJK>
+0x412B 0x64E4 # <CJK>
+0x412C 0x64E5 # <CJK>
+0x412D 0x64E9 # <CJK>
+0x412E 0x64EA # <CJK>
+0x412F 0x64ED # <CJK>
+0x4130 0x64F0 # <CJK>
+0x4131 0x64F5 # <CJK>
+0x4132 0x64F7 # <CJK>
+0x4133 0x64FB # <CJK>
+0x4134 0x64FF # <CJK>
+0x4135 0x6501 # <CJK>
+0x4136 0x6504 # <CJK>
+0x4137 0x6508 # <CJK>
+0x4138 0x6509 # <CJK>
+0x4139 0x650A # <CJK>
+0x413A 0x650F # <CJK>
+0x413B 0x6513 # <CJK>
+0x413C 0x6514 # <CJK>
+0x413D 0x6516 # <CJK>
+0x413E 0x6519 # <CJK>
+0x413F 0x651B # <CJK>
+0x4140 0x651E # <CJK>
+0x4141 0x651F # <CJK>
+0x4142 0x6522 # <CJK>
+0x4143 0x6526 # <CJK>
+0x4144 0x6529 # <CJK>
+0x4145 0x652E # <CJK>
+0x4146 0x6531 # <CJK>
+0x4147 0x653A # <CJK>
+0x4148 0x653C # <CJK>
+0x4149 0x653D # <CJK>
+0x414A 0x6543 # <CJK>
+0x414B 0x6547 # <CJK>
+0x414C 0x6549 # <CJK>
+0x414D 0x6550 # <CJK>
+0x414E 0x6552 # <CJK>
+0x414F 0x6554 # <CJK>
+0x4150 0x655F # <CJK>
+0x4151 0x6560 # <CJK>
+0x4152 0x6567 # <CJK>
+0x4153 0x656B # <CJK>
+0x4154 0x657A # <CJK>
+0x4155 0x657D # <CJK>
+0x4156 0x6581 # <CJK>
+0x4157 0x6585 # <CJK>
+0x4158 0x658A # <CJK>
+0x4159 0x6592 # <CJK>
+0x415A 0x6595 # <CJK>
+0x415B 0x6598 # <CJK>
+0x415C 0x659D # <CJK>
+0x415D 0x65A0 # <CJK>
+0x415E 0x65A3 # <CJK>
+0x415F 0x65A6 # <CJK>
+0x4160 0x65AE # <CJK>
+0x4161 0x65B2 # <CJK>
+0x4162 0x65B3 # <CJK>
+0x4163 0x65B4 # <CJK>
+0x4164 0x65BF # <CJK>
+0x4165 0x65C2 # <CJK>
+0x4166 0x65C8 # <CJK>
+0x4167 0x65C9 # <CJK>
+0x4168 0x65CE # <CJK>
+0x4169 0x65D0 # <CJK>
+0x416A 0x65D4 # <CJK>
+0x416B 0x65D6 # <CJK>
+0x416C 0x65D8 # <CJK>
+0x416D 0x65DF # <CJK>
+0x416E 0x65F0 # <CJK>
+0x416F 0x65F2 # <CJK>
+0x4170 0x65F4 # <CJK>
+0x4171 0x65F5 # <CJK>
+0x4172 0x65F9 # <CJK>
+0x4173 0x65FE # <CJK>
+0x4174 0x65FF # <CJK>
+0x4175 0x6600 # <CJK>
+0x4176 0x6604 # <CJK>
+0x4177 0x6608 # <CJK>
+0x4178 0x6609 # <CJK>
+0x4179 0x660D # <CJK>
+0x417A 0x6611 # <CJK>
+0x417B 0x6612 # <CJK>
+0x417C 0x6615 # <CJK>
+0x417D 0x6616 # <CJK>
+0x417E 0x661D # <CJK>
+0x4221 0x661E # <CJK>
+0x4222 0x6621 # <CJK>
+0x4223 0x6622 # <CJK>
+0x4224 0x6623 # <CJK>
+0x4225 0x6624 # <CJK>
+0x4226 0x6626 # <CJK>
+0x4227 0x6629 # <CJK>
+0x4228 0x662A # <CJK>
+0x4229 0x662B # <CJK>
+0x422A 0x662C # <CJK>
+0x422B 0x662E # <CJK>
+0x422C 0x6630 # <CJK>
+0x422D 0x6631 # <CJK>
+0x422E 0x6633 # <CJK>
+0x422F 0x6639 # <CJK>
+0x4230 0x6637 # <CJK>
+0x4231 0x6640 # <CJK>
+0x4232 0x6645 # <CJK>
+0x4233 0x6646 # <CJK>
+0x4234 0x664A # <CJK>
+0x4235 0x664C # <CJK>
+0x4236 0x6651 # <CJK>
+0x4237 0x664E # <CJK>
+0x4238 0x6657 # <CJK>
+0x4239 0x6658 # <CJK>
+0x423A 0x6659 # <CJK>
+0x423B 0x665B # <CJK>
+0x423C 0x665C # <CJK>
+0x423D 0x6660 # <CJK>
+0x423E 0x6661 # <CJK>
+0x423F 0x66FB # <CJK>
+0x4240 0x666A # <CJK>
+0x4241 0x666B # <CJK>
+0x4242 0x666C # <CJK>
+0x4243 0x667E # <CJK>
+0x4244 0x6673 # <CJK>
+0x4245 0x6675 # <CJK>
+0x4246 0x667F # <CJK>
+0x4247 0x6677 # <CJK>
+0x4248 0x6678 # <CJK>
+0x4249 0x6679 # <CJK>
+0x424A 0x667B # <CJK>
+0x424B 0x6680 # <CJK>
+0x424C 0x667C # <CJK>
+0x424D 0x668B # <CJK>
+0x424E 0x668C # <CJK>
+0x424F 0x668D # <CJK>
+0x4250 0x6690 # <CJK>
+0x4251 0x6692 # <CJK>
+0x4252 0x6699 # <CJK>
+0x4253 0x669A # <CJK>
+0x4254 0x669B # <CJK>
+0x4255 0x669C # <CJK>
+0x4256 0x669F # <CJK>
+0x4257 0x66A0 # <CJK>
+0x4258 0x66A4 # <CJK>
+0x4259 0x66AD # <CJK>
+0x425A 0x66B1 # <CJK>
+0x425B 0x66B2 # <CJK>
+0x425C 0x66B5 # <CJK>
+0x425D 0x66BB # <CJK>
+0x425E 0x66BF # <CJK>
+0x425F 0x66C0 # <CJK>
+0x4260 0x66C2 # <CJK>
+0x4261 0x66C3 # <CJK>
+0x4262 0x66C8 # <CJK>
+0x4263 0x66CC # <CJK>
+0x4264 0x66CE # <CJK>
+0x4265 0x66CF # <CJK>
+0x4266 0x66D4 # <CJK>
+0x4267 0x66DB # <CJK>
+0x4268 0x66DF # <CJK>
+0x4269 0x66E8 # <CJK>
+0x426A 0x66EB # <CJK>
+0x426B 0x66EC # <CJK>
+0x426C 0x66EE # <CJK>
+0x426D 0x66FA # <CJK>
+0x426E 0x6705 # <CJK>
+0x426F 0x6707 # <CJK>
+0x4270 0x670E # <CJK>
+0x4271 0x6713 # <CJK>
+0x4272 0x6719 # <CJK>
+0x4273 0x671C # <CJK>
+0x4274 0x6720 # <CJK>
+0x4275 0x6722 # <CJK>
+0x4276 0x6733 # <CJK>
+0x4277 0x673E # <CJK>
+0x4278 0x6745 # <CJK>
+0x4279 0x6747 # <CJK>
+0x427A 0x6748 # <CJK>
+0x427B 0x674C # <CJK>
+0x427C 0x6754 # <CJK>
+0x427D 0x6755 # <CJK>
+0x427E 0x675D # <CJK>
+0x4321 0x6766 # <CJK>
+0x4322 0x676C # <CJK>
+0x4323 0x676E # <CJK>
+0x4324 0x6774 # <CJK>
+0x4325 0x6776 # <CJK>
+0x4326 0x677B # <CJK>
+0x4327 0x6781 # <CJK>
+0x4328 0x6784 # <CJK>
+0x4329 0x678E # <CJK>
+0x432A 0x678F # <CJK>
+0x432B 0x6791 # <CJK>
+0x432C 0x6793 # <CJK>
+0x432D 0x6796 # <CJK>
+0x432E 0x6798 # <CJK>
+0x432F 0x6799 # <CJK>
+0x4330 0x679B # <CJK>
+0x4331 0x67B0 # <CJK>
+0x4332 0x67B1 # <CJK>
+0x4333 0x67B2 # <CJK>
+0x4334 0x67B5 # <CJK>
+0x4335 0x67BB # <CJK>
+0x4336 0x67BC # <CJK>
+0x4337 0x67BD # <CJK>
+0x4338 0x67F9 # <CJK>
+0x4339 0x67C0 # <CJK>
+0x433A 0x67C2 # <CJK>
+0x433B 0x67C3 # <CJK>
+0x433C 0x67C5 # <CJK>
+0x433D 0x67C8 # <CJK>
+0x433E 0x67C9 # <CJK>
+0x433F 0x67D2 # <CJK>
+0x4340 0x67D7 # <CJK>
+0x4341 0x67D9 # <CJK>
+0x4342 0x67DC # <CJK>
+0x4343 0x67E1 # <CJK>
+0x4344 0x67E6 # <CJK>
+0x4345 0x67F0 # <CJK>
+0x4346 0x67F2 # <CJK>
+0x4347 0x67F6 # <CJK>
+0x4348 0x67F7 # <CJK>
+0x4349 0x6852 # <CJK>
+0x434A 0x6814 # <CJK>
+0x434B 0x6819 # <CJK>
+0x434C 0x681D # <CJK>
+0x434D 0x681F # <CJK>
+0x434E 0x6828 # <CJK>
+0x434F 0x6827 # <CJK>
+0x4350 0x682C # <CJK>
+0x4351 0x682D # <CJK>
+0x4352 0x682F # <CJK>
+0x4353 0x6830 # <CJK>
+0x4354 0x6831 # <CJK>
+0x4355 0x6833 # <CJK>
+0x4356 0x683B # <CJK>
+0x4357 0x683F # <CJK>
+0x4358 0x6844 # <CJK>
+0x4359 0x6845 # <CJK>
+0x435A 0x684A # <CJK>
+0x435B 0x684C # <CJK>
+0x435C 0x6855 # <CJK>
+0x435D 0x6857 # <CJK>
+0x435E 0x6858 # <CJK>
+0x435F 0x685B # <CJK>
+0x4360 0x686B # <CJK>
+0x4361 0x686E # <CJK>
+0x4362 0x686F # <CJK>
+0x4363 0x6870 # <CJK>
+0x4364 0x6871 # <CJK>
+0x4365 0x6872 # <CJK>
+0x4366 0x6875 # <CJK>
+0x4367 0x6879 # <CJK>
+0x4368 0x687A # <CJK>
+0x4369 0x687B # <CJK>
+0x436A 0x687C # <CJK>
+0x436B 0x6882 # <CJK>
+0x436C 0x6884 # <CJK>
+0x436D 0x6886 # <CJK>
+0x436E 0x6888 # <CJK>
+0x436F 0x6896 # <CJK>
+0x4370 0x6898 # <CJK>
+0x4371 0x689A # <CJK>
+0x4372 0x689C # <CJK>
+0x4373 0x68A1 # <CJK>
+0x4374 0x68A3 # <CJK>
+0x4375 0x68A5 # <CJK>
+0x4376 0x68A9 # <CJK>
+0x4377 0x68AA # <CJK>
+0x4378 0x68AE # <CJK>
+0x4379 0x68B2 # <CJK>
+0x437A 0x68BB # <CJK>
+0x437B 0x68C5 # <CJK>
+0x437C 0x68C8 # <CJK>
+0x437D 0x68CC # <CJK>
+0x437E 0x68CF # <CJK>
+0x4421 0x68D0 # <CJK>
+0x4422 0x68D1 # <CJK>
+0x4423 0x68D3 # <CJK>
+0x4424 0x68D6 # <CJK>
+0x4425 0x68D9 # <CJK>
+0x4426 0x68DC # <CJK>
+0x4427 0x68DD # <CJK>
+0x4428 0x68E5 # <CJK>
+0x4429 0x68E8 # <CJK>
+0x442A 0x68EA # <CJK>
+0x442B 0x68EB # <CJK>
+0x442C 0x68EC # <CJK>
+0x442D 0x68ED # <CJK>
+0x442E 0x68F0 # <CJK>
+0x442F 0x68F1 # <CJK>
+0x4430 0x68F5 # <CJK>
+0x4431 0x68F6 # <CJK>
+0x4432 0x68FB # <CJK>
+0x4433 0x68FC # <CJK>
+0x4434 0x68FD # <CJK>
+0x4435 0x6906 # <CJK>
+0x4436 0x6909 # <CJK>
+0x4437 0x690A # <CJK>
+0x4438 0x6910 # <CJK>
+0x4439 0x6911 # <CJK>
+0x443A 0x6913 # <CJK>
+0x443B 0x6916 # <CJK>
+0x443C 0x6917 # <CJK>
+0x443D 0x6931 # <CJK>
+0x443E 0x6933 # <CJK>
+0x443F 0x6935 # <CJK>
+0x4440 0x6938 # <CJK>
+0x4441 0x693B # <CJK>
+0x4442 0x6942 # <CJK>
+0x4443 0x6945 # <CJK>
+0x4444 0x6949 # <CJK>
+0x4445 0x694E # <CJK>
+0x4446 0x6957 # <CJK>
+0x4447 0x695B # <CJK>
+0x4448 0x6963 # <CJK>
+0x4449 0x6964 # <CJK>
+0x444A 0x6965 # <CJK>
+0x444B 0x6966 # <CJK>
+0x444C 0x6968 # <CJK>
+0x444D 0x6969 # <CJK>
+0x444E 0x696C # <CJK>
+0x444F 0x6970 # <CJK>
+0x4450 0x6971 # <CJK>
+0x4451 0x6972 # <CJK>
+0x4452 0x697A # <CJK>
+0x4453 0x697B # <CJK>
+0x4454 0x697F # <CJK>
+0x4455 0x6980 # <CJK>
+0x4456 0x698D # <CJK>
+0x4457 0x6992 # <CJK>
+0x4458 0x6996 # <CJK>
+0x4459 0x6998 # <CJK>
+0x445A 0x69A1 # <CJK>
+0x445B 0x69A5 # <CJK>
+0x445C 0x69A6 # <CJK>
+0x445D 0x69A8 # <CJK>
+0x445E 0x69AB # <CJK>
+0x445F 0x69AD # <CJK>
+0x4460 0x69AF # <CJK>
+0x4461 0x69B7 # <CJK>
+0x4462 0x69B8 # <CJK>
+0x4463 0x69BA # <CJK>
+0x4464 0x69BC # <CJK>
+0x4465 0x69C5 # <CJK>
+0x4466 0x69C8 # <CJK>
+0x4467 0x69D1 # <CJK>
+0x4468 0x69D6 # <CJK>
+0x4469 0x69D7 # <CJK>
+0x446A 0x69E2 # <CJK>
+0x446B 0x69E5 # <CJK>
+0x446C 0x69EE # <CJK>
+0x446D 0x69EF # <CJK>
+0x446E 0x69F1 # <CJK>
+0x446F 0x69F3 # <CJK>
+0x4470 0x69F5 # <CJK>
+0x4471 0x69FE # <CJK>
+0x4472 0x6A00 # <CJK>
+0x4473 0x6A01 # <CJK>
+0x4474 0x6A03 # <CJK>
+0x4475 0x6A0F # <CJK>
+0x4476 0x6A11 # <CJK>
+0x4477 0x6A15 # <CJK>
+0x4478 0x6A1A # <CJK>
+0x4479 0x6A1D # <CJK>
+0x447A 0x6A20 # <CJK>
+0x447B 0x6A24 # <CJK>
+0x447C 0x6A28 # <CJK>
+0x447D 0x6A30 # <CJK>
+0x447E 0x6A32 # <CJK>
+0x4521 0x6A34 # <CJK>
+0x4522 0x6A37 # <CJK>
+0x4523 0x6A3B # <CJK>
+0x4524 0x6A3E # <CJK>
+0x4525 0x6A3F # <CJK>
+0x4526 0x6A45 # <CJK>
+0x4527 0x6A46 # <CJK>
+0x4528 0x6A49 # <CJK>
+0x4529 0x6A4A # <CJK>
+0x452A 0x6A4E # <CJK>
+0x452B 0x6A50 # <CJK>
+0x452C 0x6A51 # <CJK>
+0x452D 0x6A52 # <CJK>
+0x452E 0x6A55 # <CJK>
+0x452F 0x6A56 # <CJK>
+0x4530 0x6A5B # <CJK>
+0x4531 0x6A64 # <CJK>
+0x4532 0x6A67 # <CJK>
+0x4533 0x6A6A # <CJK>
+0x4534 0x6A71 # <CJK>
+0x4535 0x6A73 # <CJK>
+0x4536 0x6A7E # <CJK>
+0x4537 0x6A81 # <CJK>
+0x4538 0x6A83 # <CJK>
+0x4539 0x6A86 # <CJK>
+0x453A 0x6A87 # <CJK>
+0x453B 0x6A89 # <CJK>
+0x453C 0x6A8B # <CJK>
+0x453D 0x6A91 # <CJK>
+0x453E 0x6A9B # <CJK>
+0x453F 0x6A9D # <CJK>
+0x4540 0x6A9E # <CJK>
+0x4541 0x6A9F # <CJK>
+0x4542 0x6AA5 # <CJK>
+0x4543 0x6AAB # <CJK>
+0x4544 0x6AAF # <CJK>
+0x4545 0x6AB0 # <CJK>
+0x4546 0x6AB1 # <CJK>
+0x4547 0x6AB4 # <CJK>
+0x4548 0x6ABD # <CJK>
+0x4549 0x6ABE # <CJK>
+0x454A 0x6ABF # <CJK>
+0x454B 0x6AC6 # <CJK>
+0x454C 0x6AC9 # <CJK>
+0x454D 0x6AC8 # <CJK>
+0x454E 0x6ACC # <CJK>
+0x454F 0x6AD0 # <CJK>
+0x4550 0x6AD4 # <CJK>
+0x4551 0x6AD5 # <CJK>
+0x4552 0x6AD6 # <CJK>
+0x4553 0x6ADC # <CJK>
+0x4554 0x6ADD # <CJK>
+0x4555 0x6AE4 # <CJK>
+0x4556 0x6AE7 # <CJK>
+0x4557 0x6AEC # <CJK>
+0x4558 0x6AF0 # <CJK>
+0x4559 0x6AF1 # <CJK>
+0x455A 0x6AF2 # <CJK>
+0x455B 0x6AFC # <CJK>
+0x455C 0x6AFD # <CJK>
+0x455D 0x6B02 # <CJK>
+0x455E 0x6B03 # <CJK>
+0x455F 0x6B06 # <CJK>
+0x4560 0x6B07 # <CJK>
+0x4561 0x6B09 # <CJK>
+0x4562 0x6B0F # <CJK>
+0x4563 0x6B10 # <CJK>
+0x4564 0x6B11 # <CJK>
+0x4565 0x6B17 # <CJK>
+0x4566 0x6B1B # <CJK>
+0x4567 0x6B1E # <CJK>
+0x4568 0x6B24 # <CJK>
+0x4569 0x6B28 # <CJK>
+0x456A 0x6B2B # <CJK>
+0x456B 0x6B2C # <CJK>
+0x456C 0x6B2F # <CJK>
+0x456D 0x6B35 # <CJK>
+0x456E 0x6B36 # <CJK>
+0x456F 0x6B3B # <CJK>
+0x4570 0x6B3F # <CJK>
+0x4571 0x6B46 # <CJK>
+0x4572 0x6B4A # <CJK>
+0x4573 0x6B4D # <CJK>
+0x4574 0x6B52 # <CJK>
+0x4575 0x6B56 # <CJK>
+0x4576 0x6B58 # <CJK>
+0x4577 0x6B5D # <CJK>
+0x4578 0x6B60 # <CJK>
+0x4579 0x6B67 # <CJK>
+0x457A 0x6B6B # <CJK>
+0x457B 0x6B6E # <CJK>
+0x457C 0x6B70 # <CJK>
+0x457D 0x6B75 # <CJK>
+0x457E 0x6B7D # <CJK>
+0x4621 0x6B7E # <CJK>
+0x4622 0x6B82 # <CJK>
+0x4623 0x6B85 # <CJK>
+0x4624 0x6B97 # <CJK>
+0x4625 0x6B9B # <CJK>
+0x4626 0x6B9F # <CJK>
+0x4627 0x6BA0 # <CJK>
+0x4628 0x6BA2 # <CJK>
+0x4629 0x6BA3 # <CJK>
+0x462A 0x6BA8 # <CJK>
+0x462B 0x6BA9 # <CJK>
+0x462C 0x6BAC # <CJK>
+0x462D 0x6BAD # <CJK>
+0x462E 0x6BAE # <CJK>
+0x462F 0x6BB0 # <CJK>
+0x4630 0x6BB8 # <CJK>
+0x4631 0x6BB9 # <CJK>
+0x4632 0x6BBD # <CJK>
+0x4633 0x6BBE # <CJK>
+0x4634 0x6BC3 # <CJK>
+0x4635 0x6BC4 # <CJK>
+0x4636 0x6BC9 # <CJK>
+0x4637 0x6BCC # <CJK>
+0x4638 0x6BD6 # <CJK>
+0x4639 0x6BDA # <CJK>
+0x463A 0x6BE1 # <CJK>
+0x463B 0x6BE3 # <CJK>
+0x463C 0x6BE6 # <CJK>
+0x463D 0x6BE7 # <CJK>
+0x463E 0x6BEE # <CJK>
+0x463F 0x6BF1 # <CJK>
+0x4640 0x6BF7 # <CJK>
+0x4641 0x6BF9 # <CJK>
+0x4642 0x6BFF # <CJK>
+0x4643 0x6C02 # <CJK>
+0x4644 0x6C04 # <CJK>
+0x4645 0x6C05 # <CJK>
+0x4646 0x6C09 # <CJK>
+0x4647 0x6C0D # <CJK>
+0x4648 0x6C0E # <CJK>
+0x4649 0x6C10 # <CJK>
+0x464A 0x6C12 # <CJK>
+0x464B 0x6C19 # <CJK>
+0x464C 0x6C1F # <CJK>
+0x464D 0x6C26 # <CJK>
+0x464E 0x6C27 # <CJK>
+0x464F 0x6C28 # <CJK>
+0x4650 0x6C2C # <CJK>
+0x4651 0x6C2E # <CJK>
+0x4652 0x6C33 # <CJK>
+0x4653 0x6C35 # <CJK>
+0x4654 0x6C36 # <CJK>
+0x4655 0x6C3A # <CJK>
+0x4656 0x6C3B # <CJK>
+0x4657 0x6C3F # <CJK>
+0x4658 0x6C4A # <CJK>
+0x4659 0x6C4B # <CJK>
+0x465A 0x6C4D # <CJK>
+0x465B 0x6C4F # <CJK>
+0x465C 0x6C52 # <CJK>
+0x465D 0x6C54 # <CJK>
+0x465E 0x6C59 # <CJK>
+0x465F 0x6C5B # <CJK>
+0x4660 0x6C5C # <CJK>
+0x4661 0x6C6B # <CJK>
+0x4662 0x6C6D # <CJK>
+0x4663 0x6C6F # <CJK>
+0x4664 0x6C74 # <CJK>
+0x4665 0x6C76 # <CJK>
+0x4666 0x6C78 # <CJK>
+0x4667 0x6C79 # <CJK>
+0x4668 0x6C7B # <CJK>
+0x4669 0x6C85 # <CJK>
+0x466A 0x6C86 # <CJK>
+0x466B 0x6C87 # <CJK>
+0x466C 0x6C89 # <CJK>
+0x466D 0x6C94 # <CJK>
+0x466E 0x6C95 # <CJK>
+0x466F 0x6C97 # <CJK>
+0x4670 0x6C98 # <CJK>
+0x4671 0x6C9C # <CJK>
+0x4672 0x6C9F # <CJK>
+0x4673 0x6CB0 # <CJK>
+0x4674 0x6CB2 # <CJK>
+0x4675 0x6CB4 # <CJK>
+0x4676 0x6CC2 # <CJK>
+0x4677 0x6CC6 # <CJK>
+0x4678 0x6CCD # <CJK>
+0x4679 0x6CCF # <CJK>
+0x467A 0x6CD0 # <CJK>
+0x467B 0x6CD1 # <CJK>
+0x467C 0x6CD2 # <CJK>
+0x467D 0x6CD4 # <CJK>
+0x467E 0x6CD6 # <CJK>
+0x4721 0x6CDA # <CJK>
+0x4722 0x6CDC # <CJK>
+0x4723 0x6CE0 # <CJK>
+0x4724 0x6CE7 # <CJK>
+0x4725 0x6CE9 # <CJK>
+0x4726 0x6CEB # <CJK>
+0x4727 0x6CEC # <CJK>
+0x4728 0x6CEE # <CJK>
+0x4729 0x6CF2 # <CJK>
+0x472A 0x6CF4 # <CJK>
+0x472B 0x6D04 # <CJK>
+0x472C 0x6D07 # <CJK>
+0x472D 0x6D0A # <CJK>
+0x472E 0x6D0E # <CJK>
+0x472F 0x6D0F # <CJK>
+0x4730 0x6D11 # <CJK>
+0x4731 0x6D13 # <CJK>
+0x4732 0x6D1A # <CJK>
+0x4733 0x6D26 # <CJK>
+0x4734 0x6D27 # <CJK>
+0x4735 0x6D28 # <CJK>
+0x4736 0x6C67 # <CJK>
+0x4737 0x6D2E # <CJK>
+0x4738 0x6D2F # <CJK>
+0x4739 0x6D31 # <CJK>
+0x473A 0x6D39 # <CJK>
+0x473B 0x6D3C # <CJK>
+0x473C 0x6D3F # <CJK>
+0x473D 0x6D57 # <CJK>
+0x473E 0x6D5E # <CJK>
+0x473F 0x6D5F # <CJK>
+0x4740 0x6D61 # <CJK>
+0x4741 0x6D65 # <CJK>
+0x4742 0x6D67 # <CJK>
+0x4743 0x6D6F # <CJK>
+0x4744 0x6D70 # <CJK>
+0x4745 0x6D7C # <CJK>
+0x4746 0x6D82 # <CJK>
+0x4747 0x6D87 # <CJK>
+0x4748 0x6D91 # <CJK>
+0x4749 0x6D92 # <CJK>
+0x474A 0x6D94 # <CJK>
+0x474B 0x6D96 # <CJK>
+0x474C 0x6D97 # <CJK>
+0x474D 0x6D98 # <CJK>
+0x474E 0x6DAA # <CJK>
+0x474F 0x6DAC # <CJK>
+0x4750 0x6DB4 # <CJK>
+0x4751 0x6DB7 # <CJK>
+0x4752 0x6DB9 # <CJK>
+0x4753 0x6DBD # <CJK>
+0x4754 0x6DBF # <CJK>
+0x4755 0x6DC4 # <CJK>
+0x4756 0x6DC8 # <CJK>
+0x4757 0x6DCA # <CJK>
+0x4758 0x6DCE # <CJK>
+0x4759 0x6DCF # <CJK>
+0x475A 0x6DD6 # <CJK>
+0x475B 0x6DDB # <CJK>
+0x475C 0x6DDD # <CJK>
+0x475D 0x6DDF # <CJK>
+0x475E 0x6DE0 # <CJK>
+0x475F 0x6DE2 # <CJK>
+0x4760 0x6DE5 # <CJK>
+0x4761 0x6DE9 # <CJK>
+0x4762 0x6DEF # <CJK>
+0x4763 0x6DF0 # <CJK>
+0x4764 0x6DF4 # <CJK>
+0x4765 0x6DF6 # <CJK>
+0x4766 0x6DFC # <CJK>
+0x4767 0x6E00 # <CJK>
+0x4768 0x6E04 # <CJK>
+0x4769 0x6E1E # <CJK>
+0x476A 0x6E22 # <CJK>
+0x476B 0x6E27 # <CJK>
+0x476C 0x6E32 # <CJK>
+0x476D 0x6E36 # <CJK>
+0x476E 0x6E39 # <CJK>
+0x476F 0x6E3B # <CJK>
+0x4770 0x6E3C # <CJK>
+0x4771 0x6E44 # <CJK>
+0x4772 0x6E45 # <CJK>
+0x4773 0x6E48 # <CJK>
+0x4774 0x6E49 # <CJK>
+0x4775 0x6E4B # <CJK>
+0x4776 0x6E4F # <CJK>
+0x4777 0x6E51 # <CJK>
+0x4778 0x6E52 # <CJK>
+0x4779 0x6E53 # <CJK>
+0x477A 0x6E54 # <CJK>
+0x477B 0x6E57 # <CJK>
+0x477C 0x6E5C # <CJK>
+0x477D 0x6E5D # <CJK>
+0x477E 0x6E5E # <CJK>
+0x4821 0x6E62 # <CJK>
+0x4822 0x6E63 # <CJK>
+0x4823 0x6E68 # <CJK>
+0x4824 0x6E73 # <CJK>
+0x4825 0x6E7B # <CJK>
+0x4826 0x6E7D # <CJK>
+0x4827 0x6E8D # <CJK>
+0x4828 0x6E93 # <CJK>
+0x4829 0x6E99 # <CJK>
+0x482A 0x6EA0 # <CJK>
+0x482B 0x6EA7 # <CJK>
+0x482C 0x6EAD # <CJK>
+0x482D 0x6EAE # <CJK>
+0x482E 0x6EB1 # <CJK>
+0x482F 0x6EB3 # <CJK>
+0x4830 0x6EBB # <CJK>
+0x4831 0x6EBF # <CJK>
+0x4832 0x6EC0 # <CJK>
+0x4833 0x6EC1 # <CJK>
+0x4834 0x6EC3 # <CJK>
+0x4835 0x6EC7 # <CJK>
+0x4836 0x6EC8 # <CJK>
+0x4837 0x6ECA # <CJK>
+0x4838 0x6ECD # <CJK>
+0x4839 0x6ECE # <CJK>
+0x483A 0x6ECF # <CJK>
+0x483B 0x6EEB # <CJK>
+0x483C 0x6EED # <CJK>
+0x483D 0x6EEE # <CJK>
+0x483E 0x6EF9 # <CJK>
+0x483F 0x6EFB # <CJK>
+0x4840 0x6EFD # <CJK>
+0x4841 0x6F04 # <CJK>
+0x4842 0x6F08 # <CJK>
+0x4843 0x6F0A # <CJK>
+0x4844 0x6F0C # <CJK>
+0x4845 0x6F0D # <CJK>
+0x4846 0x6F16 # <CJK>
+0x4847 0x6F18 # <CJK>
+0x4848 0x6F1A # <CJK>
+0x4849 0x6F1B # <CJK>
+0x484A 0x6F26 # <CJK>
+0x484B 0x6F29 # <CJK>
+0x484C 0x6F2A # <CJK>
+0x484D 0x6F2F # <CJK>
+0x484E 0x6F30 # <CJK>
+0x484F 0x6F33 # <CJK>
+0x4850 0x6F36 # <CJK>
+0x4851 0x6F3B # <CJK>
+0x4852 0x6F3C # <CJK>
+0x4853 0x6F2D # <CJK>
+0x4854 0x6F4F # <CJK>
+0x4855 0x6F51 # <CJK>
+0x4856 0x6F52 # <CJK>
+0x4857 0x6F53 # <CJK>
+0x4858 0x6F57 # <CJK>
+0x4859 0x6F59 # <CJK>
+0x485A 0x6F5A # <CJK>
+0x485B 0x6F5D # <CJK>
+0x485C 0x6F5E # <CJK>
+0x485D 0x6F61 # <CJK>
+0x485E 0x6F62 # <CJK>
+0x485F 0x6F68 # <CJK>
+0x4860 0x6F6C # <CJK>
+0x4861 0x6F7D # <CJK>
+0x4862 0x6F7E # <CJK>
+0x4863 0x6F83 # <CJK>
+0x4864 0x6F87 # <CJK>
+0x4865 0x6F88 # <CJK>
+0x4866 0x6F8B # <CJK>
+0x4867 0x6F8C # <CJK>
+0x4868 0x6F8D # <CJK>
+0x4869 0x6F90 # <CJK>
+0x486A 0x6F92 # <CJK>
+0x486B 0x6F93 # <CJK>
+0x486C 0x6F94 # <CJK>
+0x486D 0x6F96 # <CJK>
+0x486E 0x6F9A # <CJK>
+0x486F 0x6F9F # <CJK>
+0x4870 0x6FA0 # <CJK>
+0x4871 0x6FA5 # <CJK>
+0x4872 0x6FA6 # <CJK>
+0x4873 0x6FA7 # <CJK>
+0x4874 0x6FA8 # <CJK>
+0x4875 0x6FAE # <CJK>
+0x4876 0x6FAF # <CJK>
+0x4877 0x6FB0 # <CJK>
+0x4878 0x6FB5 # <CJK>
+0x4879 0x6FB6 # <CJK>
+0x487A 0x6FBC # <CJK>
+0x487B 0x6FC5 # <CJK>
+0x487C 0x6FC7 # <CJK>
+0x487D 0x6FC8 # <CJK>
+0x487E 0x6FCA # <CJK>
+0x4921 0x6FDA # <CJK>
+0x4922 0x6FDE # <CJK>
+0x4923 0x6FE8 # <CJK>
+0x4924 0x6FE9 # <CJK>
+0x4925 0x6FF0 # <CJK>
+0x4926 0x6FF5 # <CJK>
+0x4927 0x6FF9 # <CJK>
+0x4928 0x6FFC # <CJK>
+0x4929 0x6FFD # <CJK>
+0x492A 0x7000 # <CJK>
+0x492B 0x7005 # <CJK>
+0x492C 0x7006 # <CJK>
+0x492D 0x7007 # <CJK>
+0x492E 0x700D # <CJK>
+0x492F 0x7017 # <CJK>
+0x4930 0x7020 # <CJK>
+0x4931 0x7023 # <CJK>
+0x4932 0x702F # <CJK>
+0x4933 0x7034 # <CJK>
+0x4934 0x7037 # <CJK>
+0x4935 0x7039 # <CJK>
+0x4936 0x703C # <CJK>
+0x4937 0x7043 # <CJK>
+0x4938 0x7044 # <CJK>
+0x4939 0x7048 # <CJK>
+0x493A 0x7049 # <CJK>
+0x493B 0x704A # <CJK>
+0x493C 0x704B # <CJK>
+0x493D 0x7054 # <CJK>
+0x493E 0x7055 # <CJK>
+0x493F 0x705D # <CJK>
+0x4940 0x705E # <CJK>
+0x4941 0x704E # <CJK>
+0x4942 0x7064 # <CJK>
+0x4943 0x7065 # <CJK>
+0x4944 0x706C # <CJK>
+0x4945 0x706E # <CJK>
+0x4946 0x7075 # <CJK>
+0x4947 0x7076 # <CJK>
+0x4948 0x707E # <CJK>
+0x4949 0x7081 # <CJK>
+0x494A 0x7085 # <CJK>
+0x494B 0x7086 # <CJK>
+0x494C 0x7094 # <CJK>
+0x494D 0x7095 # <CJK>
+0x494E 0x7096 # <CJK>
+0x494F 0x7097 # <CJK>
+0x4950 0x7098 # <CJK>
+0x4951 0x709B # <CJK>
+0x4952 0x70A4 # <CJK>
+0x4953 0x70AB # <CJK>
+0x4954 0x70B0 # <CJK>
+0x4955 0x70B1 # <CJK>
+0x4956 0x70B4 # <CJK>
+0x4957 0x70B7 # <CJK>
+0x4958 0x70CA # <CJK>
+0x4959 0x70D1 # <CJK>
+0x495A 0x70D3 # <CJK>
+0x495B 0x70D4 # <CJK>
+0x495C 0x70D5 # <CJK>
+0x495D 0x70D6 # <CJK>
+0x495E 0x70D8 # <CJK>
+0x495F 0x70DC # <CJK>
+0x4960 0x70E4 # <CJK>
+0x4961 0x70FA # <CJK>
+0x4962 0x7103 # <CJK>
+0x4963 0x7104 # <CJK>
+0x4964 0x7105 # <CJK>
+0x4965 0x7106 # <CJK>
+0x4966 0x7107 # <CJK>
+0x4967 0x710B # <CJK>
+0x4968 0x710C # <CJK>
+0x4969 0x710F # <CJK>
+0x496A 0x711E # <CJK>
+0x496B 0x7120 # <CJK>
+0x496C 0x712B # <CJK>
+0x496D 0x712D # <CJK>
+0x496E 0x712F # <CJK>
+0x496F 0x7130 # <CJK>
+0x4970 0x7131 # <CJK>
+0x4971 0x7138 # <CJK>
+0x4972 0x7141 # <CJK>
+0x4973 0x7145 # <CJK>
+0x4974 0x7146 # <CJK>
+0x4975 0x7147 # <CJK>
+0x4976 0x714A # <CJK>
+0x4977 0x714B # <CJK>
+0x4978 0x7150 # <CJK>
+0x4979 0x7152 # <CJK>
+0x497A 0x7157 # <CJK>
+0x497B 0x715A # <CJK>
+0x497C 0x715C # <CJK>
+0x497D 0x715E # <CJK>
+0x497E 0x7160 # <CJK>
+0x4A21 0x7168 # <CJK>
+0x4A22 0x7179 # <CJK>
+0x4A23 0x7180 # <CJK>
+0x4A24 0x7185 # <CJK>
+0x4A25 0x7187 # <CJK>
+0x4A26 0x718C # <CJK>
+0x4A27 0x7192 # <CJK>
+0x4A28 0x719A # <CJK>
+0x4A29 0x719B # <CJK>
+0x4A2A 0x71A0 # <CJK>
+0x4A2B 0x71A2 # <CJK>
+0x4A2C 0x71AF # <CJK>
+0x4A2D 0x71B0 # <CJK>
+0x4A2E 0x71B2 # <CJK>
+0x4A2F 0x71B3 # <CJK>
+0x4A30 0x71BA # <CJK>
+0x4A31 0x71BF # <CJK>
+0x4A32 0x71C0 # <CJK>
+0x4A33 0x71C1 # <CJK>
+0x4A34 0x71C4 # <CJK>
+0x4A35 0x71CB # <CJK>
+0x4A36 0x71CC # <CJK>
+0x4A37 0x71D3 # <CJK>
+0x4A38 0x71D6 # <CJK>
+0x4A39 0x71D9 # <CJK>
+0x4A3A 0x71DA # <CJK>
+0x4A3B 0x71DC # <CJK>
+0x4A3C 0x71F8 # <CJK>
+0x4A3D 0x71FE # <CJK>
+0x4A3E 0x7200 # <CJK>
+0x4A3F 0x7207 # <CJK>
+0x4A40 0x7208 # <CJK>
+0x4A41 0x7209 # <CJK>
+0x4A42 0x7213 # <CJK>
+0x4A43 0x7217 # <CJK>
+0x4A44 0x721A # <CJK>
+0x4A45 0x721D # <CJK>
+0x4A46 0x721F # <CJK>
+0x4A47 0x7224 # <CJK>
+0x4A48 0x722B # <CJK>
+0x4A49 0x722F # <CJK>
+0x4A4A 0x7234 # <CJK>
+0x4A4B 0x7238 # <CJK>
+0x4A4C 0x7239 # <CJK>
+0x4A4D 0x7241 # <CJK>
+0x4A4E 0x7242 # <CJK>
+0x4A4F 0x7243 # <CJK>
+0x4A50 0x7245 # <CJK>
+0x4A51 0x724E # <CJK>
+0x4A52 0x724F # <CJK>
+0x4A53 0x7250 # <CJK>
+0x4A54 0x7253 # <CJK>
+0x4A55 0x7255 # <CJK>
+0x4A56 0x7256 # <CJK>
+0x4A57 0x725A # <CJK>
+0x4A58 0x725C # <CJK>
+0x4A59 0x725E # <CJK>
+0x4A5A 0x7260 # <CJK>
+0x4A5B 0x7263 # <CJK>
+0x4A5C 0x7268 # <CJK>
+0x4A5D 0x726B # <CJK>
+0x4A5E 0x726E # <CJK>
+0x4A5F 0x726F # <CJK>
+0x4A60 0x7271 # <CJK>
+0x4A61 0x7277 # <CJK>
+0x4A62 0x7278 # <CJK>
+0x4A63 0x727B # <CJK>
+0x4A64 0x727C # <CJK>
+0x4A65 0x727F # <CJK>
+0x4A66 0x7284 # <CJK>
+0x4A67 0x7289 # <CJK>
+0x4A68 0x728D # <CJK>
+0x4A69 0x728E # <CJK>
+0x4A6A 0x7293 # <CJK>
+0x4A6B 0x729B # <CJK>
+0x4A6C 0x72A8 # <CJK>
+0x4A6D 0x72AD # <CJK>
+0x4A6E 0x72AE # <CJK>
+0x4A6F 0x72B1 # <CJK>
+0x4A70 0x72B4 # <CJK>
+0x4A71 0x72BE # <CJK>
+0x4A72 0x72C1 # <CJK>
+0x4A73 0x72C7 # <CJK>
+0x4A74 0x72C9 # <CJK>
+0x4A75 0x72CC # <CJK>
+0x4A76 0x72D5 # <CJK>
+0x4A77 0x72D6 # <CJK>
+0x4A78 0x72D8 # <CJK>
+0x4A79 0x72DF # <CJK>
+0x4A7A 0x72E5 # <CJK>
+0x4A7B 0x72F3 # <CJK>
+0x4A7C 0x72F4 # <CJK>
+0x4A7D 0x72FA # <CJK>
+0x4A7E 0x72FB # <CJK>
+0x4B21 0x72FE # <CJK>
+0x4B22 0x7302 # <CJK>
+0x4B23 0x7304 # <CJK>
+0x4B24 0x7305 # <CJK>
+0x4B25 0x7307 # <CJK>
+0x4B26 0x730B # <CJK>
+0x4B27 0x730D # <CJK>
+0x4B28 0x7312 # <CJK>
+0x4B29 0x7313 # <CJK>
+0x4B2A 0x7318 # <CJK>
+0x4B2B 0x7319 # <CJK>
+0x4B2C 0x731E # <CJK>
+0x4B2D 0x7322 # <CJK>
+0x4B2E 0x7324 # <CJK>
+0x4B2F 0x7327 # <CJK>
+0x4B30 0x7328 # <CJK>
+0x4B31 0x732C # <CJK>
+0x4B32 0x7331 # <CJK>
+0x4B33 0x7332 # <CJK>
+0x4B34 0x7335 # <CJK>
+0x4B35 0x733A # <CJK>
+0x4B36 0x733B # <CJK>
+0x4B37 0x733D # <CJK>
+0x4B38 0x7343 # <CJK>
+0x4B39 0x734D # <CJK>
+0x4B3A 0x7350 # <CJK>
+0x4B3B 0x7352 # <CJK>
+0x4B3C 0x7356 # <CJK>
+0x4B3D 0x7358 # <CJK>
+0x4B3E 0x735D # <CJK>
+0x4B3F 0x735E # <CJK>
+0x4B40 0x735F # <CJK>
+0x4B41 0x7360 # <CJK>
+0x4B42 0x7366 # <CJK>
+0x4B43 0x7367 # <CJK>
+0x4B44 0x7369 # <CJK>
+0x4B45 0x736B # <CJK>
+0x4B46 0x736C # <CJK>
+0x4B47 0x736E # <CJK>
+0x4B48 0x736F # <CJK>
+0x4B49 0x7371 # <CJK>
+0x4B4A 0x7377 # <CJK>
+0x4B4B 0x7379 # <CJK>
+0x4B4C 0x737C # <CJK>
+0x4B4D 0x7380 # <CJK>
+0x4B4E 0x7381 # <CJK>
+0x4B4F 0x7383 # <CJK>
+0x4B50 0x7385 # <CJK>
+0x4B51 0x7386 # <CJK>
+0x4B52 0x738E # <CJK>
+0x4B53 0x7390 # <CJK>
+0x4B54 0x7393 # <CJK>
+0x4B55 0x7395 # <CJK>
+0x4B56 0x7397 # <CJK>
+0x4B57 0x7398 # <CJK>
+0x4B58 0x739C # <CJK>
+0x4B59 0x739E # <CJK>
+0x4B5A 0x739F # <CJK>
+0x4B5B 0x73A0 # <CJK>
+0x4B5C 0x73A2 # <CJK>
+0x4B5D 0x73A5 # <CJK>
+0x4B5E 0x73A6 # <CJK>
+0x4B5F 0x73AA # <CJK>
+0x4B60 0x73AB # <CJK>
+0x4B61 0x73AD # <CJK>
+0x4B62 0x73B5 # <CJK>
+0x4B63 0x73B7 # <CJK>
+0x4B64 0x73B9 # <CJK>
+0x4B65 0x73BC # <CJK>
+0x4B66 0x73BD # <CJK>
+0x4B67 0x73BF # <CJK>
+0x4B68 0x73C5 # <CJK>
+0x4B69 0x73C6 # <CJK>
+0x4B6A 0x73C9 # <CJK>
+0x4B6B 0x73CB # <CJK>
+0x4B6C 0x73CC # <CJK>
+0x4B6D 0x73CF # <CJK>
+0x4B6E 0x73D2 # <CJK>
+0x4B6F 0x73D3 # <CJK>
+0x4B70 0x73D6 # <CJK>
+0x4B71 0x73D9 # <CJK>
+0x4B72 0x73DD # <CJK>
+0x4B73 0x73E1 # <CJK>
+0x4B74 0x73E3 # <CJK>
+0x4B75 0x73E6 # <CJK>
+0x4B76 0x73E7 # <CJK>
+0x4B77 0x73E9 # <CJK>
+0x4B78 0x73F4 # <CJK>
+0x4B79 0x73F5 # <CJK>
+0x4B7A 0x73F7 # <CJK>
+0x4B7B 0x73F9 # <CJK>
+0x4B7C 0x73FA # <CJK>
+0x4B7D 0x73FB # <CJK>
+0x4B7E 0x73FD # <CJK>
+0x4C21 0x73FF # <CJK>
+0x4C22 0x7400 # <CJK>
+0x4C23 0x7401 # <CJK>
+0x4C24 0x7404 # <CJK>
+0x4C25 0x7407 # <CJK>
+0x4C26 0x740A # <CJK>
+0x4C27 0x7411 # <CJK>
+0x4C28 0x741A # <CJK>
+0x4C29 0x741B # <CJK>
+0x4C2A 0x7424 # <CJK>
+0x4C2B 0x7426 # <CJK>
+0x4C2C 0x7428 # <CJK>
+0x4C2D 0x7429 # <CJK>
+0x4C2E 0x742A # <CJK>
+0x4C2F 0x742B # <CJK>
+0x4C30 0x742C # <CJK>
+0x4C31 0x742D # <CJK>
+0x4C32 0x742E # <CJK>
+0x4C33 0x742F # <CJK>
+0x4C34 0x7430 # <CJK>
+0x4C35 0x7431 # <CJK>
+0x4C36 0x7439 # <CJK>
+0x4C37 0x7440 # <CJK>
+0x4C38 0x7443 # <CJK>
+0x4C39 0x7444 # <CJK>
+0x4C3A 0x7446 # <CJK>
+0x4C3B 0x7447 # <CJK>
+0x4C3C 0x744B # <CJK>
+0x4C3D 0x744D # <CJK>
+0x4C3E 0x7451 # <CJK>
+0x4C3F 0x7452 # <CJK>
+0x4C40 0x7457 # <CJK>
+0x4C41 0x745D # <CJK>
+0x4C42 0x7462 # <CJK>
+0x4C43 0x7466 # <CJK>
+0x4C44 0x7467 # <CJK>
+0x4C45 0x7468 # <CJK>
+0x4C46 0x746B # <CJK>
+0x4C47 0x746D # <CJK>
+0x4C48 0x746E # <CJK>
+0x4C49 0x7471 # <CJK>
+0x4C4A 0x7472 # <CJK>
+0x4C4B 0x7480 # <CJK>
+0x4C4C 0x7481 # <CJK>
+0x4C4D 0x7485 # <CJK>
+0x4C4E 0x7486 # <CJK>
+0x4C4F 0x7487 # <CJK>
+0x4C50 0x7489 # <CJK>
+0x4C51 0x748F # <CJK>
+0x4C52 0x7490 # <CJK>
+0x4C53 0x7491 # <CJK>
+0x4C54 0x7492 # <CJK>
+0x4C55 0x7498 # <CJK>
+0x4C56 0x7499 # <CJK>
+0x4C57 0x749A # <CJK>
+0x4C58 0x749C # <CJK>
+0x4C59 0x749F # <CJK>
+0x4C5A 0x74A0 # <CJK>
+0x4C5B 0x74A1 # <CJK>
+0x4C5C 0x74A3 # <CJK>
+0x4C5D 0x74A6 # <CJK>
+0x4C5E 0x74A8 # <CJK>
+0x4C5F 0x74A9 # <CJK>
+0x4C60 0x74AA # <CJK>
+0x4C61 0x74AB # <CJK>
+0x4C62 0x74AE # <CJK>
+0x4C63 0x74AF # <CJK>
+0x4C64 0x74B1 # <CJK>
+0x4C65 0x74B2 # <CJK>
+0x4C66 0x74B5 # <CJK>
+0x4C67 0x74B9 # <CJK>
+0x4C68 0x74BB # <CJK>
+0x4C69 0x74BF # <CJK>
+0x4C6A 0x74C8 # <CJK>
+0x4C6B 0x74C9 # <CJK>
+0x4C6C 0x74CC # <CJK>
+0x4C6D 0x74D0 # <CJK>
+0x4C6E 0x74D3 # <CJK>
+0x4C6F 0x74D8 # <CJK>
+0x4C70 0x74DA # <CJK>
+0x4C71 0x74DB # <CJK>
+0x4C72 0x74DE # <CJK>
+0x4C73 0x74DF # <CJK>
+0x4C74 0x74E4 # <CJK>
+0x4C75 0x74E8 # <CJK>
+0x4C76 0x74EA # <CJK>
+0x4C77 0x74EB # <CJK>
+0x4C78 0x74EF # <CJK>
+0x4C79 0x74F4 # <CJK>
+0x4C7A 0x74FA # <CJK>
+0x4C7B 0x74FB # <CJK>
+0x4C7C 0x74FC # <CJK>
+0x4C7D 0x74FF # <CJK>
+0x4C7E 0x7506 # <CJK>
+0x4D21 0x7512 # <CJK>
+0x4D22 0x7516 # <CJK>
+0x4D23 0x7517 # <CJK>
+0x4D24 0x7520 # <CJK>
+0x4D25 0x7521 # <CJK>
+0x4D26 0x7524 # <CJK>
+0x4D27 0x7527 # <CJK>
+0x4D28 0x7529 # <CJK>
+0x4D29 0x752A # <CJK>
+0x4D2A 0x752F # <CJK>
+0x4D2B 0x7536 # <CJK>
+0x4D2C 0x7539 # <CJK>
+0x4D2D 0x753D # <CJK>
+0x4D2E 0x753E # <CJK>
+0x4D2F 0x753F # <CJK>
+0x4D30 0x7540 # <CJK>
+0x4D31 0x7543 # <CJK>
+0x4D32 0x7547 # <CJK>
+0x4D33 0x7548 # <CJK>
+0x4D34 0x754E # <CJK>
+0x4D35 0x7550 # <CJK>
+0x4D36 0x7552 # <CJK>
+0x4D37 0x7557 # <CJK>
+0x4D38 0x755E # <CJK>
+0x4D39 0x755F # <CJK>
+0x4D3A 0x7561 # <CJK>
+0x4D3B 0x756F # <CJK>
+0x4D3C 0x7571 # <CJK>
+0x4D3D 0x7579 # <CJK>
+0x4D3E 0x757A # <CJK>
+0x4D3F 0x757B # <CJK>
+0x4D40 0x757C # <CJK>
+0x4D41 0x757D # <CJK>
+0x4D42 0x757E # <CJK>
+0x4D43 0x7581 # <CJK>
+0x4D44 0x7585 # <CJK>
+0x4D45 0x7590 # <CJK>
+0x4D46 0x7592 # <CJK>
+0x4D47 0x7593 # <CJK>
+0x4D48 0x7595 # <CJK>
+0x4D49 0x7599 # <CJK>
+0x4D4A 0x759C # <CJK>
+0x4D4B 0x75A2 # <CJK>
+0x4D4C 0x75A4 # <CJK>
+0x4D4D 0x75B4 # <CJK>
+0x4D4E 0x75BA # <CJK>
+0x4D4F 0x75BF # <CJK>
+0x4D50 0x75C0 # <CJK>
+0x4D51 0x75C1 # <CJK>
+0x4D52 0x75C4 # <CJK>
+0x4D53 0x75C6 # <CJK>
+0x4D54 0x75CC # <CJK>
+0x4D55 0x75CE # <CJK>
+0x4D56 0x75CF # <CJK>
+0x4D57 0x75D7 # <CJK>
+0x4D58 0x75DC # <CJK>
+0x4D59 0x75DF # <CJK>
+0x4D5A 0x75E0 # <CJK>
+0x4D5B 0x75E1 # <CJK>
+0x4D5C 0x75E4 # <CJK>
+0x4D5D 0x75E7 # <CJK>
+0x4D5E 0x75EC # <CJK>
+0x4D5F 0x75EE # <CJK>
+0x4D60 0x75EF # <CJK>
+0x4D61 0x75F1 # <CJK>
+0x4D62 0x75F9 # <CJK>
+0x4D63 0x7600 # <CJK>
+0x4D64 0x7602 # <CJK>
+0x4D65 0x7603 # <CJK>
+0x4D66 0x7604 # <CJK>
+0x4D67 0x7607 # <CJK>
+0x4D68 0x7608 # <CJK>
+0x4D69 0x760A # <CJK>
+0x4D6A 0x760C # <CJK>
+0x4D6B 0x760F # <CJK>
+0x4D6C 0x7612 # <CJK>
+0x4D6D 0x7613 # <CJK>
+0x4D6E 0x7615 # <CJK>
+0x4D6F 0x7616 # <CJK>
+0x4D70 0x7619 # <CJK>
+0x4D71 0x761B # <CJK>
+0x4D72 0x761C # <CJK>
+0x4D73 0x761D # <CJK>
+0x4D74 0x761E # <CJK>
+0x4D75 0x7623 # <CJK>
+0x4D76 0x7625 # <CJK>
+0x4D77 0x7626 # <CJK>
+0x4D78 0x7629 # <CJK>
+0x4D79 0x762D # <CJK>
+0x4D7A 0x7632 # <CJK>
+0x4D7B 0x7633 # <CJK>
+0x4D7C 0x7635 # <CJK>
+0x4D7D 0x7638 # <CJK>
+0x4D7E 0x7639 # <CJK>
+0x4E21 0x763A # <CJK>
+0x4E22 0x763C # <CJK>
+0x4E23 0x764A # <CJK>
+0x4E24 0x7640 # <CJK>
+0x4E25 0x7641 # <CJK>
+0x4E26 0x7643 # <CJK>
+0x4E27 0x7644 # <CJK>
+0x4E28 0x7645 # <CJK>
+0x4E29 0x7649 # <CJK>
+0x4E2A 0x764B # <CJK>
+0x4E2B 0x7655 # <CJK>
+0x4E2C 0x7659 # <CJK>
+0x4E2D 0x765F # <CJK>
+0x4E2E 0x7664 # <CJK>
+0x4E2F 0x7665 # <CJK>
+0x4E30 0x766D # <CJK>
+0x4E31 0x766E # <CJK>
+0x4E32 0x766F # <CJK>
+0x4E33 0x7671 # <CJK>
+0x4E34 0x7674 # <CJK>
+0x4E35 0x7681 # <CJK>
+0x4E36 0x7685 # <CJK>
+0x4E37 0x768C # <CJK>
+0x4E38 0x768D # <CJK>
+0x4E39 0x7695 # <CJK>
+0x4E3A 0x769B # <CJK>
+0x4E3B 0x769C # <CJK>
+0x4E3C 0x769D # <CJK>
+0x4E3D 0x769F # <CJK>
+0x4E3E 0x76A0 # <CJK>
+0x4E3F 0x76A2 # <CJK>
+0x4E40 0x76A3 # <CJK>
+0x4E41 0x76A4 # <CJK>
+0x4E42 0x76A5 # <CJK>
+0x4E43 0x76A6 # <CJK>
+0x4E44 0x76A7 # <CJK>
+0x4E45 0x76A8 # <CJK>
+0x4E46 0x76AA # <CJK>
+0x4E47 0x76AD # <CJK>
+0x4E48 0x76BD # <CJK>
+0x4E49 0x76C1 # <CJK>
+0x4E4A 0x76C5 # <CJK>
+0x4E4B 0x76C9 # <CJK>
+0x4E4C 0x76CB # <CJK>
+0x4E4D 0x76CC # <CJK>
+0x4E4E 0x76CE # <CJK>
+0x4E4F 0x76D4 # <CJK>
+0x4E50 0x76D9 # <CJK>
+0x4E51 0x76E0 # <CJK>
+0x4E52 0x76E6 # <CJK>
+0x4E53 0x76E8 # <CJK>
+0x4E54 0x76EC # <CJK>
+0x4E55 0x76F0 # <CJK>
+0x4E56 0x76F1 # <CJK>
+0x4E57 0x76F6 # <CJK>
+0x4E58 0x76F9 # <CJK>
+0x4E59 0x76FC # <CJK>
+0x4E5A 0x7700 # <CJK>
+0x4E5B 0x7706 # <CJK>
+0x4E5C 0x770A # <CJK>
+0x4E5D 0x770E # <CJK>
+0x4E5E 0x7712 # <CJK>
+0x4E5F 0x7714 # <CJK>
+0x4E60 0x7715 # <CJK>
+0x4E61 0x7717 # <CJK>
+0x4E62 0x7719 # <CJK>
+0x4E63 0x771A # <CJK>
+0x4E64 0x771C # <CJK>
+0x4E65 0x7722 # <CJK>
+0x4E66 0x7728 # <CJK>
+0x4E67 0x772D # <CJK>
+0x4E68 0x772E # <CJK>
+0x4E69 0x772F # <CJK>
+0x4E6A 0x7734 # <CJK>
+0x4E6B 0x7735 # <CJK>
+0x4E6C 0x7736 # <CJK>
+0x4E6D 0x7739 # <CJK>
+0x4E6E 0x773D # <CJK>
+0x4E6F 0x773E # <CJK>
+0x4E70 0x7742 # <CJK>
+0x4E71 0x7745 # <CJK>
+0x4E72 0x7746 # <CJK>
+0x4E73 0x774A # <CJK>
+0x4E74 0x774D # <CJK>
+0x4E75 0x774E # <CJK>
+0x4E76 0x774F # <CJK>
+0x4E77 0x7752 # <CJK>
+0x4E78 0x7756 # <CJK>
+0x4E79 0x7757 # <CJK>
+0x4E7A 0x775C # <CJK>
+0x4E7B 0x775E # <CJK>
+0x4E7C 0x775F # <CJK>
+0x4E7D 0x7760 # <CJK>
+0x4E7E 0x7762 # <CJK>
+0x4F21 0x7764 # <CJK>
+0x4F22 0x7767 # <CJK>
+0x4F23 0x776A # <CJK>
+0x4F24 0x776C # <CJK>
+0x4F25 0x7770 # <CJK>
+0x4F26 0x7772 # <CJK>
+0x4F27 0x7773 # <CJK>
+0x4F28 0x7774 # <CJK>
+0x4F29 0x777A # <CJK>
+0x4F2A 0x777D # <CJK>
+0x4F2B 0x7780 # <CJK>
+0x4F2C 0x7784 # <CJK>
+0x4F2D 0x778C # <CJK>
+0x4F2E 0x778D # <CJK>
+0x4F2F 0x7794 # <CJK>
+0x4F30 0x7795 # <CJK>
+0x4F31 0x7796 # <CJK>
+0x4F32 0x779A # <CJK>
+0x4F33 0x779F # <CJK>
+0x4F34 0x77A2 # <CJK>
+0x4F35 0x77A7 # <CJK>
+0x4F36 0x77AA # <CJK>
+0x4F37 0x77AE # <CJK>
+0x4F38 0x77AF # <CJK>
+0x4F39 0x77B1 # <CJK>
+0x4F3A 0x77B5 # <CJK>
+0x4F3B 0x77BE # <CJK>
+0x4F3C 0x77C3 # <CJK>
+0x4F3D 0x77C9 # <CJK>
+0x4F3E 0x77D1 # <CJK>
+0x4F3F 0x77D2 # <CJK>
+0x4F40 0x77D5 # <CJK>
+0x4F41 0x77D9 # <CJK>
+0x4F42 0x77DE # <CJK>
+0x4F43 0x77DF # <CJK>
+0x4F44 0x77E0 # <CJK>
+0x4F45 0x77E4 # <CJK>
+0x4F46 0x77E6 # <CJK>
+0x4F47 0x77EA # <CJK>
+0x4F48 0x77EC # <CJK>
+0x4F49 0x77F0 # <CJK>
+0x4F4A 0x77F1 # <CJK>
+0x4F4B 0x77F4 # <CJK>
+0x4F4C 0x77F8 # <CJK>
+0x4F4D 0x77FB # <CJK>
+0x4F4E 0x7805 # <CJK>
+0x4F4F 0x7806 # <CJK>
+0x4F50 0x7809 # <CJK>
+0x4F51 0x780D # <CJK>
+0x4F52 0x780E # <CJK>
+0x4F53 0x7811 # <CJK>
+0x4F54 0x781D # <CJK>
+0x4F55 0x7821 # <CJK>
+0x4F56 0x7822 # <CJK>
+0x4F57 0x7823 # <CJK>
+0x4F58 0x782D # <CJK>
+0x4F59 0x782E # <CJK>
+0x4F5A 0x7830 # <CJK>
+0x4F5B 0x7835 # <CJK>
+0x4F5C 0x7837 # <CJK>
+0x4F5D 0x7843 # <CJK>
+0x4F5E 0x7844 # <CJK>
+0x4F5F 0x7847 # <CJK>
+0x4F60 0x7848 # <CJK>
+0x4F61 0x784C # <CJK>
+0x4F62 0x784E # <CJK>
+0x4F63 0x7852 # <CJK>
+0x4F64 0x785C # <CJK>
+0x4F65 0x785E # <CJK>
+0x4F66 0x7860 # <CJK>
+0x4F67 0x7861 # <CJK>
+0x4F68 0x7863 # <CJK>
+0x4F69 0x7864 # <CJK>
+0x4F6A 0x7868 # <CJK>
+0x4F6B 0x786A # <CJK>
+0x4F6C 0x786E # <CJK>
+0x4F6D 0x787A # <CJK>
+0x4F6E 0x787E # <CJK>
+0x4F6F 0x788A # <CJK>
+0x4F70 0x788F # <CJK>
+0x4F71 0x7894 # <CJK>
+0x4F72 0x7898 # <CJK>
+0x4F73 0x78A1 # <CJK>
+0x4F74 0x789D # <CJK>
+0x4F75 0x789E # <CJK>
+0x4F76 0x789F # <CJK>
+0x4F77 0x78A4 # <CJK>
+0x4F78 0x78A8 # <CJK>
+0x4F79 0x78AC # <CJK>
+0x4F7A 0x78AD # <CJK>
+0x4F7B 0x78B0 # <CJK>
+0x4F7C 0x78B1 # <CJK>
+0x4F7D 0x78B2 # <CJK>
+0x4F7E 0x78B3 # <CJK>
+0x5021 0x78BB # <CJK>
+0x5022 0x78BD # <CJK>
+0x5023 0x78BF # <CJK>
+0x5024 0x78C7 # <CJK>
+0x5025 0x78C8 # <CJK>
+0x5026 0x78C9 # <CJK>
+0x5027 0x78CC # <CJK>
+0x5028 0x78CE # <CJK>
+0x5029 0x78D2 # <CJK>
+0x502A 0x78D3 # <CJK>
+0x502B 0x78D5 # <CJK>
+0x502C 0x78D6 # <CJK>
+0x502D 0x78E4 # <CJK>
+0x502E 0x78DB # <CJK>
+0x502F 0x78DF # <CJK>
+0x5030 0x78E0 # <CJK>
+0x5031 0x78E1 # <CJK>
+0x5032 0x78E6 # <CJK>
+0x5033 0x78EA # <CJK>
+0x5034 0x78F2 # <CJK>
+0x5035 0x78F3 # <CJK>
+0x5036 0x7900 # <CJK>
+0x5037 0x78F6 # <CJK>
+0x5038 0x78F7 # <CJK>
+0x5039 0x78FA # <CJK>
+0x503A 0x78FB # <CJK>
+0x503B 0x78FF # <CJK>
+0x503C 0x7906 # <CJK>
+0x503D 0x790C # <CJK>
+0x503E 0x7910 # <CJK>
+0x503F 0x791A # <CJK>
+0x5040 0x791C # <CJK>
+0x5041 0x791E # <CJK>
+0x5042 0x791F # <CJK>
+0x5043 0x7920 # <CJK>
+0x5044 0x7925 # <CJK>
+0x5045 0x7927 # <CJK>
+0x5046 0x7929 # <CJK>
+0x5047 0x792D # <CJK>
+0x5048 0x7931 # <CJK>
+0x5049 0x7934 # <CJK>
+0x504A 0x7935 # <CJK>
+0x504B 0x793B # <CJK>
+0x504C 0x793D # <CJK>
+0x504D 0x793F # <CJK>
+0x504E 0x7944 # <CJK>
+0x504F 0x7945 # <CJK>
+0x5050 0x7946 # <CJK>
+0x5051 0x794A # <CJK>
+0x5052 0x794B # <CJK>
+0x5053 0x794F # <CJK>
+0x5054 0x7951 # <CJK>
+0x5055 0x7954 # <CJK>
+0x5056 0x7958 # <CJK>
+0x5057 0x795B # <CJK>
+0x5058 0x795C # <CJK>
+0x5059 0x7967 # <CJK>
+0x505A 0x7969 # <CJK>
+0x505B 0x796B # <CJK>
+0x505C 0x7972 # <CJK>
+0x505D 0x7979 # <CJK>
+0x505E 0x797B # <CJK>
+0x505F 0x797C # <CJK>
+0x5060 0x797E # <CJK>
+0x5061 0x798B # <CJK>
+0x5062 0x798C # <CJK>
+0x5063 0x7991 # <CJK>
+0x5064 0x7993 # <CJK>
+0x5065 0x7994 # <CJK>
+0x5066 0x7995 # <CJK>
+0x5067 0x7996 # <CJK>
+0x5068 0x7998 # <CJK>
+0x5069 0x799B # <CJK>
+0x506A 0x799C # <CJK>
+0x506B 0x79A1 # <CJK>
+0x506C 0x79A8 # <CJK>
+0x506D 0x79A9 # <CJK>
+0x506E 0x79AB # <CJK>
+0x506F 0x79AF # <CJK>
+0x5070 0x79B1 # <CJK>
+0x5071 0x79B4 # <CJK>
+0x5072 0x79B8 # <CJK>
+0x5073 0x79BB # <CJK>
+0x5074 0x79C2 # <CJK>
+0x5075 0x79C4 # <CJK>
+0x5076 0x79C7 # <CJK>
+0x5077 0x79C8 # <CJK>
+0x5078 0x79CA # <CJK>
+0x5079 0x79CF # <CJK>
+0x507A 0x79D4 # <CJK>
+0x507B 0x79D6 # <CJK>
+0x507C 0x79DA # <CJK>
+0x507D 0x79DD # <CJK>
+0x507E 0x79DE # <CJK>
+0x5121 0x79E0 # <CJK>
+0x5122 0x79E2 # <CJK>
+0x5123 0x79E5 # <CJK>
+0x5124 0x79EA # <CJK>
+0x5125 0x79EB # <CJK>
+0x5126 0x79ED # <CJK>
+0x5127 0x79F1 # <CJK>
+0x5128 0x79F8 # <CJK>
+0x5129 0x79FC # <CJK>
+0x512A 0x7A02 # <CJK>
+0x512B 0x7A03 # <CJK>
+0x512C 0x7A07 # <CJK>
+0x512D 0x7A09 # <CJK>
+0x512E 0x7A0A # <CJK>
+0x512F 0x7A0C # <CJK>
+0x5130 0x7A11 # <CJK>
+0x5131 0x7A15 # <CJK>
+0x5132 0x7A1B # <CJK>
+0x5133 0x7A1E # <CJK>
+0x5134 0x7A21 # <CJK>
+0x5135 0x7A27 # <CJK>
+0x5136 0x7A2B # <CJK>
+0x5137 0x7A2D # <CJK>
+0x5138 0x7A2F # <CJK>
+0x5139 0x7A30 # <CJK>
+0x513A 0x7A34 # <CJK>
+0x513B 0x7A35 # <CJK>
+0x513C 0x7A38 # <CJK>
+0x513D 0x7A39 # <CJK>
+0x513E 0x7A3A # <CJK>
+0x513F 0x7A44 # <CJK>
+0x5140 0x7A45 # <CJK>
+0x5141 0x7A47 # <CJK>
+0x5142 0x7A48 # <CJK>
+0x5143 0x7A4C # <CJK>
+0x5144 0x7A55 # <CJK>
+0x5145 0x7A56 # <CJK>
+0x5146 0x7A59 # <CJK>
+0x5147 0x7A5C # <CJK>
+0x5148 0x7A5D # <CJK>
+0x5149 0x7A5F # <CJK>
+0x514A 0x7A60 # <CJK>
+0x514B 0x7A65 # <CJK>
+0x514C 0x7A67 # <CJK>
+0x514D 0x7A6A # <CJK>
+0x514E 0x7A6D # <CJK>
+0x514F 0x7A75 # <CJK>
+0x5150 0x7A78 # <CJK>
+0x5151 0x7A7E # <CJK>
+0x5152 0x7A80 # <CJK>
+0x5153 0x7A82 # <CJK>
+0x5154 0x7A85 # <CJK>
+0x5155 0x7A86 # <CJK>
+0x5156 0x7A8A # <CJK>
+0x5157 0x7A8B # <CJK>
+0x5158 0x7A90 # <CJK>
+0x5159 0x7A91 # <CJK>
+0x515A 0x7A94 # <CJK>
+0x515B 0x7A9E # <CJK>
+0x515C 0x7AA0 # <CJK>
+0x515D 0x7AA3 # <CJK>
+0x515E 0x7AAC # <CJK>
+0x515F 0x7AB3 # <CJK>
+0x5160 0x7AB5 # <CJK>
+0x5161 0x7AB9 # <CJK>
+0x5162 0x7ABB # <CJK>
+0x5163 0x7ABC # <CJK>
+0x5164 0x7AC6 # <CJK>
+0x5165 0x7AC9 # <CJK>
+0x5166 0x7ACC # <CJK>
+0x5167 0x7ACE # <CJK>
+0x5168 0x7AD1 # <CJK>
+0x5169 0x7ADB # <CJK>
+0x516A 0x7AE8 # <CJK>
+0x516B 0x7AE9 # <CJK>
+0x516C 0x7AEB # <CJK>
+0x516D 0x7AEC # <CJK>
+0x516E 0x7AF1 # <CJK>
+0x516F 0x7AF4 # <CJK>
+0x5170 0x7AFB # <CJK>
+0x5171 0x7AFD # <CJK>
+0x5172 0x7AFE # <CJK>
+0x5173 0x7B07 # <CJK>
+0x5174 0x7B14 # <CJK>
+0x5175 0x7B1F # <CJK>
+0x5176 0x7B23 # <CJK>
+0x5177 0x7B27 # <CJK>
+0x5178 0x7B29 # <CJK>
+0x5179 0x7B2A # <CJK>
+0x517A 0x7B2B # <CJK>
+0x517B 0x7B2D # <CJK>
+0x517C 0x7B2E # <CJK>
+0x517D 0x7B2F # <CJK>
+0x517E 0x7B30 # <CJK>
+0x5221 0x7B31 # <CJK>
+0x5222 0x7B34 # <CJK>
+0x5223 0x7B3D # <CJK>
+0x5224 0x7B3F # <CJK>
+0x5225 0x7B40 # <CJK>
+0x5226 0x7B41 # <CJK>
+0x5227 0x7B47 # <CJK>
+0x5228 0x7B4E # <CJK>
+0x5229 0x7B55 # <CJK>
+0x522A 0x7B60 # <CJK>
+0x522B 0x7B64 # <CJK>
+0x522C 0x7B66 # <CJK>
+0x522D 0x7B69 # <CJK>
+0x522E 0x7B6A # <CJK>
+0x522F 0x7B6D # <CJK>
+0x5230 0x7B6F # <CJK>
+0x5231 0x7B72 # <CJK>
+0x5232 0x7B73 # <CJK>
+0x5233 0x7B77 # <CJK>
+0x5234 0x7B84 # <CJK>
+0x5235 0x7B89 # <CJK>
+0x5236 0x7B8E # <CJK>
+0x5237 0x7B90 # <CJK>
+0x5238 0x7B91 # <CJK>
+0x5239 0x7B96 # <CJK>
+0x523A 0x7B9B # <CJK>
+0x523B 0x7B9E # <CJK>
+0x523C 0x7BA0 # <CJK>
+0x523D 0x7BA5 # <CJK>
+0x523E 0x7BAC # <CJK>
+0x523F 0x7BAF # <CJK>
+0x5240 0x7BB0 # <CJK>
+0x5241 0x7BB2 # <CJK>
+0x5242 0x7BB5 # <CJK>
+0x5243 0x7BB6 # <CJK>
+0x5244 0x7BBA # <CJK>
+0x5245 0x7BBB # <CJK>
+0x5246 0x7BBC # <CJK>
+0x5247 0x7BBD # <CJK>
+0x5248 0x7BC2 # <CJK>
+0x5249 0x7BC5 # <CJK>
+0x524A 0x7BC8 # <CJK>
+0x524B 0x7BCA # <CJK>
+0x524C 0x7BD4 # <CJK>
+0x524D 0x7BD6 # <CJK>
+0x524E 0x7BD7 # <CJK>
+0x524F 0x7BD9 # <CJK>
+0x5250 0x7BDA # <CJK>
+0x5251 0x7BDB # <CJK>
+0x5252 0x7BE8 # <CJK>
+0x5253 0x7BEA # <CJK>
+0x5254 0x7BF2 # <CJK>
+0x5255 0x7BF4 # <CJK>
+0x5256 0x7BF5 # <CJK>
+0x5257 0x7BF8 # <CJK>
+0x5258 0x7BF9 # <CJK>
+0x5259 0x7BFA # <CJK>
+0x525A 0x7BFC # <CJK>
+0x525B 0x7BFE # <CJK>
+0x525C 0x7C01 # <CJK>
+0x525D 0x7C02 # <CJK>
+0x525E 0x7C03 # <CJK>
+0x525F 0x7C04 # <CJK>
+0x5260 0x7C06 # <CJK>
+0x5261 0x7C09 # <CJK>
+0x5262 0x7C0B # <CJK>
+0x5263 0x7C0C # <CJK>
+0x5264 0x7C0E # <CJK>
+0x5265 0x7C0F # <CJK>
+0x5266 0x7C19 # <CJK>
+0x5267 0x7C1B # <CJK>
+0x5268 0x7C20 # <CJK>
+0x5269 0x7C25 # <CJK>
+0x526A 0x7C26 # <CJK>
+0x526B 0x7C28 # <CJK>
+0x526C 0x7C2C # <CJK>
+0x526D 0x7C31 # <CJK>
+0x526E 0x7C33 # <CJK>
+0x526F 0x7C34 # <CJK>
+0x5270 0x7C36 # <CJK>
+0x5271 0x7C39 # <CJK>
+0x5272 0x7C3A # <CJK>
+0x5273 0x7C46 # <CJK>
+0x5274 0x7C4A # <CJK>
+0x5275 0x7C55 # <CJK>
+0x5276 0x7C51 # <CJK>
+0x5277 0x7C52 # <CJK>
+0x5278 0x7C53 # <CJK>
+0x5279 0x7C59 # <CJK>
+0x527A 0x7C5A # <CJK>
+0x527B 0x7C5B # <CJK>
+0x527C 0x7C5C # <CJK>
+0x527D 0x7C5D # <CJK>
+0x527E 0x7C5E # <CJK>
+0x5321 0x7C61 # <CJK>
+0x5322 0x7C63 # <CJK>
+0x5323 0x7C67 # <CJK>
+0x5324 0x7C69 # <CJK>
+0x5325 0x7C6D # <CJK>
+0x5326 0x7C6E # <CJK>
+0x5327 0x7C70 # <CJK>
+0x5328 0x7C72 # <CJK>
+0x5329 0x7C79 # <CJK>
+0x532A 0x7C7C # <CJK>
+0x532B 0x7C7D # <CJK>
+0x532C 0x7C86 # <CJK>
+0x532D 0x7C87 # <CJK>
+0x532E 0x7C8F # <CJK>
+0x532F 0x7C94 # <CJK>
+0x5330 0x7C9E # <CJK>
+0x5331 0x7CA0 # <CJK>
+0x5332 0x7CA6 # <CJK>
+0x5333 0x7CB0 # <CJK>
+0x5334 0x7CB6 # <CJK>
+0x5335 0x7CB7 # <CJK>
+0x5336 0x7CBA # <CJK>
+0x5337 0x7CBB # <CJK>
+0x5338 0x7CBC # <CJK>
+0x5339 0x7CBF # <CJK>
+0x533A 0x7CC4 # <CJK>
+0x533B 0x7CC7 # <CJK>
+0x533C 0x7CC8 # <CJK>
+0x533D 0x7CC9 # <CJK>
+0x533E 0x7CCD # <CJK>
+0x533F 0x7CCF # <CJK>
+0x5340 0x7CD3 # <CJK>
+0x5341 0x7CD4 # <CJK>
+0x5342 0x7CD5 # <CJK>
+0x5343 0x7CD7 # <CJK>
+0x5344 0x7CD9 # <CJK>
+0x5345 0x7CDA # <CJK>
+0x5346 0x7CDD # <CJK>
+0x5347 0x7CE6 # <CJK>
+0x5348 0x7CE9 # <CJK>
+0x5349 0x7CEB # <CJK>
+0x534A 0x7CF5 # <CJK>
+0x534B 0x7D03 # <CJK>
+0x534C 0x7D07 # <CJK>
+0x534D 0x7D08 # <CJK>
+0x534E 0x7D09 # <CJK>
+0x534F 0x7D0F # <CJK>
+0x5350 0x7D11 # <CJK>
+0x5351 0x7D12 # <CJK>
+0x5352 0x7D13 # <CJK>
+0x5353 0x7D16 # <CJK>
+0x5354 0x7D1D # <CJK>
+0x5355 0x7D1E # <CJK>
+0x5356 0x7D23 # <CJK>
+0x5357 0x7D26 # <CJK>
+0x5358 0x7D2A # <CJK>
+0x5359 0x7D2D # <CJK>
+0x535A 0x7D31 # <CJK>
+0x535B 0x7D3C # <CJK>
+0x535C 0x7D3D # <CJK>
+0x535D 0x7D3E # <CJK>
+0x535E 0x7D40 # <CJK>
+0x535F 0x7D41 # <CJK>
+0x5360 0x7D47 # <CJK>
+0x5361 0x7D48 # <CJK>
+0x5362 0x7D4D # <CJK>
+0x5363 0x7D51 # <CJK>
+0x5364 0x7D53 # <CJK>
+0x5365 0x7D57 # <CJK>
+0x5366 0x7D59 # <CJK>
+0x5367 0x7D5A # <CJK>
+0x5368 0x7D5C # <CJK>
+0x5369 0x7D5D # <CJK>
+0x536A 0x7D65 # <CJK>
+0x536B 0x7D67 # <CJK>
+0x536C 0x7D6A # <CJK>
+0x536D 0x7D70 # <CJK>
+0x536E 0x7D78 # <CJK>
+0x536F 0x7D7A # <CJK>
+0x5370 0x7D7B # <CJK>
+0x5371 0x7D7F # <CJK>
+0x5372 0x7D81 # <CJK>
+0x5373 0x7D82 # <CJK>
+0x5374 0x7D83 # <CJK>
+0x5375 0x7D85 # <CJK>
+0x5376 0x7D86 # <CJK>
+0x5377 0x7D88 # <CJK>
+0x5378 0x7D8B # <CJK>
+0x5379 0x7D8C # <CJK>
+0x537A 0x7D8D # <CJK>
+0x537B 0x7D91 # <CJK>
+0x537C 0x7D96 # <CJK>
+0x537D 0x7D97 # <CJK>
+0x537E 0x7D9D # <CJK>
+0x5421 0x7D9E # <CJK>
+0x5422 0x7DA6 # <CJK>
+0x5423 0x7DA7 # <CJK>
+0x5424 0x7DAA # <CJK>
+0x5425 0x7DB3 # <CJK>
+0x5426 0x7DB6 # <CJK>
+0x5427 0x7DB7 # <CJK>
+0x5428 0x7DB9 # <CJK>
+0x5429 0x7DC2 # <CJK>
+0x542A 0x7DC3 # <CJK>
+0x542B 0x7DC4 # <CJK>
+0x542C 0x7DC5 # <CJK>
+0x542D 0x7DC6 # <CJK>
+0x542E 0x7DCC # <CJK>
+0x542F 0x7DCD # <CJK>
+0x5430 0x7DCE # <CJK>
+0x5431 0x7DD7 # <CJK>
+0x5432 0x7DD9 # <CJK>
+0x5433 0x7E00 # <CJK>
+0x5434 0x7DE2 # <CJK>
+0x5435 0x7DE5 # <CJK>
+0x5436 0x7DE6 # <CJK>
+0x5437 0x7DEA # <CJK>
+0x5438 0x7DEB # <CJK>
+0x5439 0x7DED # <CJK>
+0x543A 0x7DF1 # <CJK>
+0x543B 0x7DF5 # <CJK>
+0x543C 0x7DF6 # <CJK>
+0x543D 0x7DF9 # <CJK>
+0x543E 0x7DFA # <CJK>
+0x543F 0x7E08 # <CJK>
+0x5440 0x7E10 # <CJK>
+0x5441 0x7E11 # <CJK>
+0x5442 0x7E15 # <CJK>
+0x5443 0x7E17 # <CJK>
+0x5444 0x7E1C # <CJK>
+0x5445 0x7E1D # <CJK>
+0x5446 0x7E20 # <CJK>
+0x5447 0x7E27 # <CJK>
+0x5448 0x7E28 # <CJK>
+0x5449 0x7E2C # <CJK>
+0x544A 0x7E2D # <CJK>
+0x544B 0x7E2F # <CJK>
+0x544C 0x7E33 # <CJK>
+0x544D 0x7E36 # <CJK>
+0x544E 0x7E3F # <CJK>
+0x544F 0x7E44 # <CJK>
+0x5450 0x7E45 # <CJK>
+0x5451 0x7E47 # <CJK>
+0x5452 0x7E4E # <CJK>
+0x5453 0x7E50 # <CJK>
+0x5454 0x7E52 # <CJK>
+0x5455 0x7E58 # <CJK>
+0x5456 0x7E5F # <CJK>
+0x5457 0x7E61 # <CJK>
+0x5458 0x7E62 # <CJK>
+0x5459 0x7E65 # <CJK>
+0x545A 0x7E6B # <CJK>
+0x545B 0x7E6E # <CJK>
+0x545C 0x7E6F # <CJK>
+0x545D 0x7E73 # <CJK>
+0x545E 0x7E78 # <CJK>
+0x545F 0x7E7E # <CJK>
+0x5460 0x7E81 # <CJK>
+0x5461 0x7E86 # <CJK>
+0x5462 0x7E87 # <CJK>
+0x5463 0x7E8A # <CJK>
+0x5464 0x7E8D # <CJK>
+0x5465 0x7E91 # <CJK>
+0x5466 0x7E95 # <CJK>
+0x5467 0x7E98 # <CJK>
+0x5468 0x7E9A # <CJK>
+0x5469 0x7E9D # <CJK>
+0x546A 0x7E9E # <CJK>
+0x546B 0x7F3C # <CJK>
+0x546C 0x7F3B # <CJK>
+0x546D 0x7F3D # <CJK>
+0x546E 0x7F3E # <CJK>
+0x546F 0x7F3F # <CJK>
+0x5470 0x7F43 # <CJK>
+0x5471 0x7F44 # <CJK>
+0x5472 0x7F47 # <CJK>
+0x5473 0x7F4F # <CJK>
+0x5474 0x7F52 # <CJK>
+0x5475 0x7F53 # <CJK>
+0x5476 0x7F5B # <CJK>
+0x5477 0x7F5C # <CJK>
+0x5478 0x7F5D # <CJK>
+0x5479 0x7F61 # <CJK>
+0x547A 0x7F63 # <CJK>
+0x547B 0x7F64 # <CJK>
+0x547C 0x7F65 # <CJK>
+0x547D 0x7F66 # <CJK>
+0x547E 0x7F6D # <CJK>
+0x5521 0x7F71 # <CJK>
+0x5522 0x7F7D # <CJK>
+0x5523 0x7F7E # <CJK>
+0x5524 0x7F7F # <CJK>
+0x5525 0x7F80 # <CJK>
+0x5526 0x7F8B # <CJK>
+0x5527 0x7F8D # <CJK>
+0x5528 0x7F8F # <CJK>
+0x5529 0x7F90 # <CJK>
+0x552A 0x7F91 # <CJK>
+0x552B 0x7F96 # <CJK>
+0x552C 0x7F97 # <CJK>
+0x552D 0x7F9C # <CJK>
+0x552E 0x7FA1 # <CJK>
+0x552F 0x7FA2 # <CJK>
+0x5530 0x7FA6 # <CJK>
+0x5531 0x7FAA # <CJK>
+0x5532 0x7FAD # <CJK>
+0x5533 0x7FB4 # <CJK>
+0x5534 0x7FBC # <CJK>
+0x5535 0x7FBF # <CJK>
+0x5536 0x7FC0 # <CJK>
+0x5537 0x7FC3 # <CJK>
+0x5538 0x7FC8 # <CJK>
+0x5539 0x7FCE # <CJK>
+0x553A 0x7FCF # <CJK>
+0x553B 0x7FDB # <CJK>
+0x553C 0x7FDF # <CJK>
+0x553D 0x7FE3 # <CJK>
+0x553E 0x7FE5 # <CJK>
+0x553F 0x7FE8 # <CJK>
+0x5540 0x7FEC # <CJK>
+0x5541 0x7FEE # <CJK>
+0x5542 0x7FEF # <CJK>
+0x5543 0x7FF2 # <CJK>
+0x5544 0x7FFA # <CJK>
+0x5545 0x7FFD # <CJK>
+0x5546 0x7FFE # <CJK>
+0x5547 0x7FFF # <CJK>
+0x5548 0x8007 # <CJK>
+0x5549 0x8008 # <CJK>
+0x554A 0x800A # <CJK>
+0x554B 0x800D # <CJK>
+0x554C 0x800E # <CJK>
+0x554D 0x800F # <CJK>
+0x554E 0x8011 # <CJK>
+0x554F 0x8013 # <CJK>
+0x5550 0x8014 # <CJK>
+0x5551 0x8016 # <CJK>
+0x5552 0x801D # <CJK>
+0x5553 0x801E # <CJK>
+0x5554 0x801F # <CJK>
+0x5555 0x8020 # <CJK>
+0x5556 0x8024 # <CJK>
+0x5557 0x8026 # <CJK>
+0x5558 0x802C # <CJK>
+0x5559 0x802E # <CJK>
+0x555A 0x8030 # <CJK>
+0x555B 0x8034 # <CJK>
+0x555C 0x8035 # <CJK>
+0x555D 0x8037 # <CJK>
+0x555E 0x8039 # <CJK>
+0x555F 0x803A # <CJK>
+0x5560 0x803C # <CJK>
+0x5561 0x803E # <CJK>
+0x5562 0x8040 # <CJK>
+0x5563 0x8044 # <CJK>
+0x5564 0x8060 # <CJK>
+0x5565 0x8064 # <CJK>
+0x5566 0x8066 # <CJK>
+0x5567 0x806D # <CJK>
+0x5568 0x8071 # <CJK>
+0x5569 0x8075 # <CJK>
+0x556A 0x8081 # <CJK>
+0x556B 0x8088 # <CJK>
+0x556C 0x808E # <CJK>
+0x556D 0x809C # <CJK>
+0x556E 0x809E # <CJK>
+0x556F 0x80A6 # <CJK>
+0x5570 0x80A7 # <CJK>
+0x5571 0x80AB # <CJK>
+0x5572 0x80B8 # <CJK>
+0x5573 0x80B9 # <CJK>
+0x5574 0x80C8 # <CJK>
+0x5575 0x80CD # <CJK>
+0x5576 0x80CF # <CJK>
+0x5577 0x80D2 # <CJK>
+0x5578 0x80D4 # <CJK>
+0x5579 0x80D5 # <CJK>
+0x557A 0x80D7 # <CJK>
+0x557B 0x80D8 # <CJK>
+0x557C 0x80E0 # <CJK>
+0x557D 0x80ED # <CJK>
+0x557E 0x80EE # <CJK>
+0x5621 0x80F0 # <CJK>
+0x5622 0x80F2 # <CJK>
+0x5623 0x80F3 # <CJK>
+0x5624 0x80F6 # <CJK>
+0x5625 0x80F9 # <CJK>
+0x5626 0x80FA # <CJK>
+0x5627 0x80FE # <CJK>
+0x5628 0x8103 # <CJK>
+0x5629 0x810B # <CJK>
+0x562A 0x8116 # <CJK>
+0x562B 0x8117 # <CJK>
+0x562C 0x8118 # <CJK>
+0x562D 0x811C # <CJK>
+0x562E 0x811E # <CJK>
+0x562F 0x8120 # <CJK>
+0x5630 0x8124 # <CJK>
+0x5631 0x8127 # <CJK>
+0x5632 0x812C # <CJK>
+0x5633 0x8130 # <CJK>
+0x5634 0x8135 # <CJK>
+0x5635 0x813A # <CJK>
+0x5636 0x813C # <CJK>
+0x5637 0x8145 # <CJK>
+0x5638 0x8147 # <CJK>
+0x5639 0x814A # <CJK>
+0x563A 0x814C # <CJK>
+0x563B 0x8152 # <CJK>
+0x563C 0x8157 # <CJK>
+0x563D 0x8160 # <CJK>
+0x563E 0x8161 # <CJK>
+0x563F 0x8167 # <CJK>
+0x5640 0x8168 # <CJK>
+0x5641 0x8169 # <CJK>
+0x5642 0x816D # <CJK>
+0x5643 0x816F # <CJK>
+0x5644 0x8177 # <CJK>
+0x5645 0x8181 # <CJK>
+0x5646 0x8190 # <CJK>
+0x5647 0x8184 # <CJK>
+0x5648 0x8185 # <CJK>
+0x5649 0x8186 # <CJK>
+0x564A 0x818B # <CJK>
+0x564B 0x818E # <CJK>
+0x564C 0x8196 # <CJK>
+0x564D 0x8198 # <CJK>
+0x564E 0x819B # <CJK>
+0x564F 0x819E # <CJK>
+0x5650 0x81A2 # <CJK>
+0x5651 0x81AE # <CJK>
+0x5652 0x81B2 # <CJK>
+0x5653 0x81B4 # <CJK>
+0x5654 0x81BB # <CJK>
+0x5655 0x81CB # <CJK>
+0x5656 0x81C3 # <CJK>
+0x5657 0x81C5 # <CJK>
+0x5658 0x81CA # <CJK>
+0x5659 0x81CE # <CJK>
+0x565A 0x81CF # <CJK>
+0x565B 0x81D5 # <CJK>
+0x565C 0x81D7 # <CJK>
+0x565D 0x81DB # <CJK>
+0x565E 0x81DD # <CJK>
+0x565F 0x81DE # <CJK>
+0x5660 0x81E1 # <CJK>
+0x5661 0x81E4 # <CJK>
+0x5662 0x81EB # <CJK>
+0x5663 0x81EC # <CJK>
+0x5664 0x81F0 # <CJK>
+0x5665 0x81F1 # <CJK>
+0x5666 0x81F2 # <CJK>
+0x5667 0x81F5 # <CJK>
+0x5668 0x81F6 # <CJK>
+0x5669 0x81F8 # <CJK>
+0x566A 0x81F9 # <CJK>
+0x566B 0x81FD # <CJK>
+0x566C 0x81FF # <CJK>
+0x566D 0x8200 # <CJK>
+0x566E 0x8203 # <CJK>
+0x566F 0x820F # <CJK>
+0x5670 0x8213 # <CJK>
+0x5671 0x8214 # <CJK>
+0x5672 0x8219 # <CJK>
+0x5673 0x821A # <CJK>
+0x5674 0x821D # <CJK>
+0x5675 0x8221 # <CJK>
+0x5676 0x8222 # <CJK>
+0x5677 0x8228 # <CJK>
+0x5678 0x8232 # <CJK>
+0x5679 0x8234 # <CJK>
+0x567A 0x823A # <CJK>
+0x567B 0x8243 # <CJK>
+0x567C 0x8244 # <CJK>
+0x567D 0x8245 # <CJK>
+0x567E 0x8246 # <CJK>
+0x5721 0x824B # <CJK>
+0x5722 0x824E # <CJK>
+0x5723 0x824F # <CJK>
+0x5724 0x8251 # <CJK>
+0x5725 0x8256 # <CJK>
+0x5726 0x825C # <CJK>
+0x5727 0x8260 # <CJK>
+0x5728 0x8263 # <CJK>
+0x5729 0x8267 # <CJK>
+0x572A 0x826D # <CJK>
+0x572B 0x8274 # <CJK>
+0x572C 0x827B # <CJK>
+0x572D 0x827D # <CJK>
+0x572E 0x827F # <CJK>
+0x572F 0x8280 # <CJK>
+0x5730 0x8281 # <CJK>
+0x5731 0x8283 # <CJK>
+0x5732 0x8284 # <CJK>
+0x5733 0x8287 # <CJK>
+0x5734 0x8289 # <CJK>
+0x5735 0x828A # <CJK>
+0x5736 0x828E # <CJK>
+0x5737 0x8291 # <CJK>
+0x5738 0x8294 # <CJK>
+0x5739 0x8296 # <CJK>
+0x573A 0x8298 # <CJK>
+0x573B 0x829A # <CJK>
+0x573C 0x829B # <CJK>
+0x573D 0x82A0 # <CJK>
+0x573E 0x82A1 # <CJK>
+0x573F 0x82A3 # <CJK>
+0x5740 0x82A4 # <CJK>
+0x5741 0x82A7 # <CJK>
+0x5742 0x82A8 # <CJK>
+0x5743 0x82A9 # <CJK>
+0x5744 0x82AA # <CJK>
+0x5745 0x82AE # <CJK>
+0x5746 0x82B0 # <CJK>
+0x5747 0x82B2 # <CJK>
+0x5748 0x82B4 # <CJK>
+0x5749 0x82B7 # <CJK>
+0x574A 0x82BA # <CJK>
+0x574B 0x82BC # <CJK>
+0x574C 0x82BE # <CJK>
+0x574D 0x82BF # <CJK>
+0x574E 0x82C6 # <CJK>
+0x574F 0x82D0 # <CJK>
+0x5750 0x82D5 # <CJK>
+0x5751 0x82DA # <CJK>
+0x5752 0x82E0 # <CJK>
+0x5753 0x82E2 # <CJK>
+0x5754 0x82E4 # <CJK>
+0x5755 0x82E8 # <CJK>
+0x5756 0x82EA # <CJK>
+0x5757 0x82ED # <CJK>
+0x5758 0x82EF # <CJK>
+0x5759 0x82F6 # <CJK>
+0x575A 0x82F7 # <CJK>
+0x575B 0x82FD # <CJK>
+0x575C 0x82FE # <CJK>
+0x575D 0x8300 # <CJK>
+0x575E 0x8301 # <CJK>
+0x575F 0x8307 # <CJK>
+0x5760 0x8308 # <CJK>
+0x5761 0x830A # <CJK>
+0x5762 0x830B # <CJK>
+0x5763 0x8354 # <CJK>
+0x5764 0x831B # <CJK>
+0x5765 0x831D # <CJK>
+0x5766 0x831E # <CJK>
+0x5767 0x831F # <CJK>
+0x5768 0x8321 # <CJK>
+0x5769 0x8322 # <CJK>
+0x576A 0x832C # <CJK>
+0x576B 0x832D # <CJK>
+0x576C 0x832E # <CJK>
+0x576D 0x8330 # <CJK>
+0x576E 0x8333 # <CJK>
+0x576F 0x8337 # <CJK>
+0x5770 0x833A # <CJK>
+0x5771 0x833C # <CJK>
+0x5772 0x833D # <CJK>
+0x5773 0x8342 # <CJK>
+0x5774 0x8343 # <CJK>
+0x5775 0x8344 # <CJK>
+0x5776 0x8347 # <CJK>
+0x5777 0x834D # <CJK>
+0x5778 0x834E # <CJK>
+0x5779 0x8351 # <CJK>
+0x577A 0x8355 # <CJK>
+0x577B 0x8356 # <CJK>
+0x577C 0x8357 # <CJK>
+0x577D 0x8370 # <CJK>
+0x577E 0x8378 # <CJK>
+0x5821 0x837D # <CJK>
+0x5822 0x837F # <CJK>
+0x5823 0x8380 # <CJK>
+0x5824 0x8382 # <CJK>
+0x5825 0x8384 # <CJK>
+0x5826 0x8386 # <CJK>
+0x5827 0x838D # <CJK>
+0x5828 0x8392 # <CJK>
+0x5829 0x8394 # <CJK>
+0x582A 0x8395 # <CJK>
+0x582B 0x8398 # <CJK>
+0x582C 0x8399 # <CJK>
+0x582D 0x839B # <CJK>
+0x582E 0x839C # <CJK>
+0x582F 0x839D # <CJK>
+0x5830 0x83A6 # <CJK>
+0x5831 0x83A7 # <CJK>
+0x5832 0x83A9 # <CJK>
+0x5833 0x83AC # <CJK>
+0x5834 0x83BE # <CJK>
+0x5835 0x83BF # <CJK>
+0x5836 0x83C0 # <CJK>
+0x5837 0x83C7 # <CJK>
+0x5838 0x83C9 # <CJK>
+0x5839 0x83CF # <CJK>
+0x583A 0x83D0 # <CJK>
+0x583B 0x83D1 # <CJK>
+0x583C 0x83D4 # <CJK>
+0x583D 0x83DD # <CJK>
+0x583E 0x8353 # <CJK>
+0x583F 0x83E8 # <CJK>
+0x5840 0x83EA # <CJK>
+0x5841 0x83F6 # <CJK>
+0x5842 0x83F8 # <CJK>
+0x5843 0x83F9 # <CJK>
+0x5844 0x83FC # <CJK>
+0x5845 0x8401 # <CJK>
+0x5846 0x8406 # <CJK>
+0x5847 0x840A # <CJK>
+0x5848 0x840F # <CJK>
+0x5849 0x8411 # <CJK>
+0x584A 0x8415 # <CJK>
+0x584B 0x8419 # <CJK>
+0x584C 0x83AD # <CJK>
+0x584D 0x842F # <CJK>
+0x584E 0x8439 # <CJK>
+0x584F 0x8445 # <CJK>
+0x5850 0x8447 # <CJK>
+0x5851 0x8448 # <CJK>
+0x5852 0x844A # <CJK>
+0x5853 0x844D # <CJK>
+0x5854 0x844F # <CJK>
+0x5855 0x8451 # <CJK>
+0x5856 0x8452 # <CJK>
+0x5857 0x8456 # <CJK>
+0x5858 0x8458 # <CJK>
+0x5859 0x8459 # <CJK>
+0x585A 0x845A # <CJK>
+0x585B 0x845C # <CJK>
+0x585C 0x8460 # <CJK>
+0x585D 0x8464 # <CJK>
+0x585E 0x8465 # <CJK>
+0x585F 0x8467 # <CJK>
+0x5860 0x846A # <CJK>
+0x5861 0x8470 # <CJK>
+0x5862 0x8473 # <CJK>
+0x5863 0x8474 # <CJK>
+0x5864 0x8476 # <CJK>
+0x5865 0x8478 # <CJK>
+0x5866 0x847C # <CJK>
+0x5867 0x847D # <CJK>
+0x5868 0x8481 # <CJK>
+0x5869 0x8485 # <CJK>
+0x586A 0x8492 # <CJK>
+0x586B 0x8493 # <CJK>
+0x586C 0x8495 # <CJK>
+0x586D 0x849E # <CJK>
+0x586E 0x84A6 # <CJK>
+0x586F 0x84A8 # <CJK>
+0x5870 0x84A9 # <CJK>
+0x5871 0x84AA # <CJK>
+0x5872 0x84AF # <CJK>
+0x5873 0x84B1 # <CJK>
+0x5874 0x84B4 # <CJK>
+0x5875 0x84BA # <CJK>
+0x5876 0x84BD # <CJK>
+0x5877 0x84BE # <CJK>
+0x5878 0x84C0 # <CJK>
+0x5879 0x84C2 # <CJK>
+0x587A 0x84C7 # <CJK>
+0x587B 0x84C8 # <CJK>
+0x587C 0x84CC # <CJK>
+0x587D 0x84CF # <CJK>
+0x587E 0x84D3 # <CJK>
+0x5921 0x84DC # <CJK>
+0x5922 0x84E7 # <CJK>
+0x5923 0x84EA # <CJK>
+0x5924 0x84EF # <CJK>
+0x5925 0x84F0 # <CJK>
+0x5926 0x84F1 # <CJK>
+0x5927 0x84F2 # <CJK>
+0x5928 0x84F7 # <CJK>
+0x5929 0x8532 # <CJK>
+0x592A 0x84FA # <CJK>
+0x592B 0x84FB # <CJK>
+0x592C 0x84FD # <CJK>
+0x592D 0x8502 # <CJK>
+0x592E 0x8503 # <CJK>
+0x592F 0x8507 # <CJK>
+0x5930 0x850C # <CJK>
+0x5931 0x850E # <CJK>
+0x5932 0x8510 # <CJK>
+0x5933 0x851C # <CJK>
+0x5934 0x851E # <CJK>
+0x5935 0x8522 # <CJK>
+0x5936 0x8523 # <CJK>
+0x5937 0x8524 # <CJK>
+0x5938 0x8525 # <CJK>
+0x5939 0x8527 # <CJK>
+0x593A 0x852A # <CJK>
+0x593B 0x852B # <CJK>
+0x593C 0x852F # <CJK>
+0x593D 0x8533 # <CJK>
+0x593E 0x8534 # <CJK>
+0x593F 0x8536 # <CJK>
+0x5940 0x853F # <CJK>
+0x5941 0x8546 # <CJK>
+0x5942 0x854F # <CJK>
+0x5943 0x8550 # <CJK>
+0x5944 0x8551 # <CJK>
+0x5945 0x8552 # <CJK>
+0x5946 0x8553 # <CJK>
+0x5947 0x8556 # <CJK>
+0x5948 0x8559 # <CJK>
+0x5949 0x855C # <CJK>
+0x594A 0x855D # <CJK>
+0x594B 0x855E # <CJK>
+0x594C 0x855F # <CJK>
+0x594D 0x8560 # <CJK>
+0x594E 0x8561 # <CJK>
+0x594F 0x8562 # <CJK>
+0x5950 0x8564 # <CJK>
+0x5951 0x856B # <CJK>
+0x5952 0x856F # <CJK>
+0x5953 0x8579 # <CJK>
+0x5954 0x857A # <CJK>
+0x5955 0x857B # <CJK>
+0x5956 0x857D # <CJK>
+0x5957 0x857F # <CJK>
+0x5958 0x8581 # <CJK>
+0x5959 0x8585 # <CJK>
+0x595A 0x8586 # <CJK>
+0x595B 0x8589 # <CJK>
+0x595C 0x858B # <CJK>
+0x595D 0x858C # <CJK>
+0x595E 0x858F # <CJK>
+0x595F 0x8593 # <CJK>
+0x5960 0x8598 # <CJK>
+0x5961 0x859D # <CJK>
+0x5962 0x859F # <CJK>
+0x5963 0x85A0 # <CJK>
+0x5964 0x85A2 # <CJK>
+0x5965 0x85A5 # <CJK>
+0x5966 0x85A7 # <CJK>
+0x5967 0x85B4 # <CJK>
+0x5968 0x85B6 # <CJK>
+0x5969 0x85B7 # <CJK>
+0x596A 0x85B8 # <CJK>
+0x596B 0x85BC # <CJK>
+0x596C 0x85BD # <CJK>
+0x596D 0x85BE # <CJK>
+0x596E 0x85BF # <CJK>
+0x596F 0x85C2 # <CJK>
+0x5970 0x85C7 # <CJK>
+0x5971 0x85CA # <CJK>
+0x5972 0x85CB # <CJK>
+0x5973 0x85CE # <CJK>
+0x5974 0x85AD # <CJK>
+0x5975 0x85D8 # <CJK>
+0x5976 0x85DA # <CJK>
+0x5977 0x85DF # <CJK>
+0x5978 0x85E0 # <CJK>
+0x5979 0x85E6 # <CJK>
+0x597A 0x85E8 # <CJK>
+0x597B 0x85ED # <CJK>
+0x597C 0x85F3 # <CJK>
+0x597D 0x85F6 # <CJK>
+0x597E 0x85FC # <CJK>
+0x5A21 0x85FF # <CJK>
+0x5A22 0x8600 # <CJK>
+0x5A23 0x8604 # <CJK>
+0x5A24 0x8605 # <CJK>
+0x5A25 0x860D # <CJK>
+0x5A26 0x860E # <CJK>
+0x5A27 0x8610 # <CJK>
+0x5A28 0x8611 # <CJK>
+0x5A29 0x8612 # <CJK>
+0x5A2A 0x8618 # <CJK>
+0x5A2B 0x8619 # <CJK>
+0x5A2C 0x861B # <CJK>
+0x5A2D 0x861E # <CJK>
+0x5A2E 0x8621 # <CJK>
+0x5A2F 0x8627 # <CJK>
+0x5A30 0x8629 # <CJK>
+0x5A31 0x8636 # <CJK>
+0x5A32 0x8638 # <CJK>
+0x5A33 0x863A # <CJK>
+0x5A34 0x863C # <CJK>
+0x5A35 0x863D # <CJK>
+0x5A36 0x8640 # <CJK>
+0x5A37 0x8642 # <CJK>
+0x5A38 0x8646 # <CJK>
+0x5A39 0x8652 # <CJK>
+0x5A3A 0x8653 # <CJK>
+0x5A3B 0x8656 # <CJK>
+0x5A3C 0x8657 # <CJK>
+0x5A3D 0x8658 # <CJK>
+0x5A3E 0x8659 # <CJK>
+0x5A3F 0x865D # <CJK>
+0x5A40 0x8660 # <CJK>
+0x5A41 0x8661 # <CJK>
+0x5A42 0x8662 # <CJK>
+0x5A43 0x8663 # <CJK>
+0x5A44 0x8664 # <CJK>
+0x5A45 0x8669 # <CJK>
+0x5A46 0x866C # <CJK>
+0x5A47 0x866F # <CJK>
+0x5A48 0x8675 # <CJK>
+0x5A49 0x8676 # <CJK>
+0x5A4A 0x8677 # <CJK>
+0x5A4B 0x867A # <CJK>
+0x5A4C 0x868D # <CJK>
+0x5A4D 0x8691 # <CJK>
+0x5A4E 0x8696 # <CJK>
+0x5A4F 0x8698 # <CJK>
+0x5A50 0x869A # <CJK>
+0x5A51 0x869C # <CJK>
+0x5A52 0x86A1 # <CJK>
+0x5A53 0x86A6 # <CJK>
+0x5A54 0x86A7 # <CJK>
+0x5A55 0x86A8 # <CJK>
+0x5A56 0x86AD # <CJK>
+0x5A57 0x86B1 # <CJK>
+0x5A58 0x86B3 # <CJK>
+0x5A59 0x86B4 # <CJK>
+0x5A5A 0x86B5 # <CJK>
+0x5A5B 0x86B7 # <CJK>
+0x5A5C 0x86B8 # <CJK>
+0x5A5D 0x86B9 # <CJK>
+0x5A5E 0x86BF # <CJK>
+0x5A5F 0x86C0 # <CJK>
+0x5A60 0x86C1 # <CJK>
+0x5A61 0x86C3 # <CJK>
+0x5A62 0x86C5 # <CJK>
+0x5A63 0x86D1 # <CJK>
+0x5A64 0x86D2 # <CJK>
+0x5A65 0x86D5 # <CJK>
+0x5A66 0x86D7 # <CJK>
+0x5A67 0x86DA # <CJK>
+0x5A68 0x86DC # <CJK>
+0x5A69 0x86E0 # <CJK>
+0x5A6A 0x86E3 # <CJK>
+0x5A6B 0x86E5 # <CJK>
+0x5A6C 0x86E7 # <CJK>
+0x5A6D 0x8688 # <CJK>
+0x5A6E 0x86FA # <CJK>
+0x5A6F 0x86FC # <CJK>
+0x5A70 0x86FD # <CJK>
+0x5A71 0x8704 # <CJK>
+0x5A72 0x8705 # <CJK>
+0x5A73 0x8707 # <CJK>
+0x5A74 0x870B # <CJK>
+0x5A75 0x870E # <CJK>
+0x5A76 0x870F # <CJK>
+0x5A77 0x8710 # <CJK>
+0x5A78 0x8713 # <CJK>
+0x5A79 0x8714 # <CJK>
+0x5A7A 0x8719 # <CJK>
+0x5A7B 0x871E # <CJK>
+0x5A7C 0x871F # <CJK>
+0x5A7D 0x8721 # <CJK>
+0x5A7E 0x8723 # <CJK>
+0x5B21 0x8728 # <CJK>
+0x5B22 0x872E # <CJK>
+0x5B23 0x872F # <CJK>
+0x5B24 0x8731 # <CJK>
+0x5B25 0x8732 # <CJK>
+0x5B26 0x8739 # <CJK>
+0x5B27 0x873A # <CJK>
+0x5B28 0x873C # <CJK>
+0x5B29 0x873D # <CJK>
+0x5B2A 0x873E # <CJK>
+0x5B2B 0x8740 # <CJK>
+0x5B2C 0x8743 # <CJK>
+0x5B2D 0x8745 # <CJK>
+0x5B2E 0x874D # <CJK>
+0x5B2F 0x8758 # <CJK>
+0x5B30 0x875D # <CJK>
+0x5B31 0x8761 # <CJK>
+0x5B32 0x8764 # <CJK>
+0x5B33 0x8765 # <CJK>
+0x5B34 0x876F # <CJK>
+0x5B35 0x8771 # <CJK>
+0x5B36 0x8772 # <CJK>
+0x5B37 0x877B # <CJK>
+0x5B38 0x8783 # <CJK>
+0x5B39 0x8784 # <CJK>
+0x5B3A 0x8785 # <CJK>
+0x5B3B 0x8786 # <CJK>
+0x5B3C 0x8787 # <CJK>
+0x5B3D 0x8788 # <CJK>
+0x5B3E 0x8789 # <CJK>
+0x5B3F 0x878B # <CJK>
+0x5B40 0x878C # <CJK>
+0x5B41 0x8790 # <CJK>
+0x5B42 0x8793 # <CJK>
+0x5B43 0x8795 # <CJK>
+0x5B44 0x8797 # <CJK>
+0x5B45 0x8798 # <CJK>
+0x5B46 0x8799 # <CJK>
+0x5B47 0x879E # <CJK>
+0x5B48 0x87A0 # <CJK>
+0x5B49 0x87A3 # <CJK>
+0x5B4A 0x87A7 # <CJK>
+0x5B4B 0x87AC # <CJK>
+0x5B4C 0x87AD # <CJK>
+0x5B4D 0x87AE # <CJK>
+0x5B4E 0x87B1 # <CJK>
+0x5B4F 0x87B5 # <CJK>
+0x5B50 0x87BE # <CJK>
+0x5B51 0x87BF # <CJK>
+0x5B52 0x87C1 # <CJK>
+0x5B53 0x87C8 # <CJK>
+0x5B54 0x87C9 # <CJK>
+0x5B55 0x87CA # <CJK>
+0x5B56 0x87CE # <CJK>
+0x5B57 0x87D5 # <CJK>
+0x5B58 0x87D6 # <CJK>
+0x5B59 0x87D9 # <CJK>
+0x5B5A 0x87DA # <CJK>
+0x5B5B 0x87DC # <CJK>
+0x5B5C 0x87DF # <CJK>
+0x5B5D 0x87E2 # <CJK>
+0x5B5E 0x87E3 # <CJK>
+0x5B5F 0x87E4 # <CJK>
+0x5B60 0x87EA # <CJK>
+0x5B61 0x87EB # <CJK>
+0x5B62 0x87ED # <CJK>
+0x5B63 0x87F1 # <CJK>
+0x5B64 0x87F3 # <CJK>
+0x5B65 0x87F8 # <CJK>
+0x5B66 0x87FA # <CJK>
+0x5B67 0x87FF # <CJK>
+0x5B68 0x8801 # <CJK>
+0x5B69 0x8803 # <CJK>
+0x5B6A 0x8806 # <CJK>
+0x5B6B 0x8809 # <CJK>
+0x5B6C 0x880A # <CJK>
+0x5B6D 0x880B # <CJK>
+0x5B6E 0x8810 # <CJK>
+0x5B6F 0x8819 # <CJK>
+0x5B70 0x8812 # <CJK>
+0x5B71 0x8813 # <CJK>
+0x5B72 0x8814 # <CJK>
+0x5B73 0x8818 # <CJK>
+0x5B74 0x881A # <CJK>
+0x5B75 0x881B # <CJK>
+0x5B76 0x881C # <CJK>
+0x5B77 0x881E # <CJK>
+0x5B78 0x881F # <CJK>
+0x5B79 0x8828 # <CJK>
+0x5B7A 0x882D # <CJK>
+0x5B7B 0x882E # <CJK>
+0x5B7C 0x8830 # <CJK>
+0x5B7D 0x8832 # <CJK>
+0x5B7E 0x8835 # <CJK>
+0x5C21 0x883A # <CJK>
+0x5C22 0x883C # <CJK>
+0x5C23 0x8841 # <CJK>
+0x5C24 0x8843 # <CJK>
+0x5C25 0x8845 # <CJK>
+0x5C26 0x8848 # <CJK>
+0x5C27 0x8849 # <CJK>
+0x5C28 0x884A # <CJK>
+0x5C29 0x884B # <CJK>
+0x5C2A 0x884E # <CJK>
+0x5C2B 0x8851 # <CJK>
+0x5C2C 0x8855 # <CJK>
+0x5C2D 0x8856 # <CJK>
+0x5C2E 0x8858 # <CJK>
+0x5C2F 0x885A # <CJK>
+0x5C30 0x885C # <CJK>
+0x5C31 0x885F # <CJK>
+0x5C32 0x8860 # <CJK>
+0x5C33 0x8864 # <CJK>
+0x5C34 0x8869 # <CJK>
+0x5C35 0x8871 # <CJK>
+0x5C36 0x8879 # <CJK>
+0x5C37 0x887B # <CJK>
+0x5C38 0x8880 # <CJK>
+0x5C39 0x8898 # <CJK>
+0x5C3A 0x889A # <CJK>
+0x5C3B 0x889B # <CJK>
+0x5C3C 0x889C # <CJK>
+0x5C3D 0x889F # <CJK>
+0x5C3E 0x88A0 # <CJK>
+0x5C3F 0x88A8 # <CJK>
+0x5C40 0x88AA # <CJK>
+0x5C41 0x88BA # <CJK>
+0x5C42 0x88BD # <CJK>
+0x5C43 0x88BE # <CJK>
+0x5C44 0x88C0 # <CJK>
+0x5C45 0x88CA # <CJK>
+0x5C46 0x88CB # <CJK>
+0x5C47 0x88CC # <CJK>
+0x5C48 0x88CD # <CJK>
+0x5C49 0x88CE # <CJK>
+0x5C4A 0x88D1 # <CJK>
+0x5C4B 0x88D2 # <CJK>
+0x5C4C 0x88D3 # <CJK>
+0x5C4D 0x88DB # <CJK>
+0x5C4E 0x88DE # <CJK>
+0x5C4F 0x88E7 # <CJK>
+0x5C50 0x88EF # <CJK>
+0x5C51 0x88F0 # <CJK>
+0x5C52 0x88F1 # <CJK>
+0x5C53 0x88F5 # <CJK>
+0x5C54 0x88F7 # <CJK>
+0x5C55 0x8901 # <CJK>
+0x5C56 0x8906 # <CJK>
+0x5C57 0x890D # <CJK>
+0x5C58 0x890E # <CJK>
+0x5C59 0x890F # <CJK>
+0x5C5A 0x8915 # <CJK>
+0x5C5B 0x8916 # <CJK>
+0x5C5C 0x8918 # <CJK>
+0x5C5D 0x8919 # <CJK>
+0x5C5E 0x891A # <CJK>
+0x5C5F 0x891C # <CJK>
+0x5C60 0x8920 # <CJK>
+0x5C61 0x8926 # <CJK>
+0x5C62 0x8927 # <CJK>
+0x5C63 0x8928 # <CJK>
+0x5C64 0x8930 # <CJK>
+0x5C65 0x8931 # <CJK>
+0x5C66 0x8932 # <CJK>
+0x5C67 0x8935 # <CJK>
+0x5C68 0x8939 # <CJK>
+0x5C69 0x893A # <CJK>
+0x5C6A 0x893E # <CJK>
+0x5C6B 0x8940 # <CJK>
+0x5C6C 0x8942 # <CJK>
+0x5C6D 0x8945 # <CJK>
+0x5C6E 0x8946 # <CJK>
+0x5C6F 0x8949 # <CJK>
+0x5C70 0x894F # <CJK>
+0x5C71 0x8952 # <CJK>
+0x5C72 0x8957 # <CJK>
+0x5C73 0x895A # <CJK>
+0x5C74 0x895B # <CJK>
+0x5C75 0x895C # <CJK>
+0x5C76 0x8961 # <CJK>
+0x5C77 0x8962 # <CJK>
+0x5C78 0x8963 # <CJK>
+0x5C79 0x896B # <CJK>
+0x5C7A 0x896E # <CJK>
+0x5C7B 0x8970 # <CJK>
+0x5C7C 0x8973 # <CJK>
+0x5C7D 0x8975 # <CJK>
+0x5C7E 0x897A # <CJK>
+0x5D21 0x897B # <CJK>
+0x5D22 0x897C # <CJK>
+0x5D23 0x897D # <CJK>
+0x5D24 0x8989 # <CJK>
+0x5D25 0x898D # <CJK>
+0x5D26 0x8990 # <CJK>
+0x5D27 0x8994 # <CJK>
+0x5D28 0x8995 # <CJK>
+0x5D29 0x899B # <CJK>
+0x5D2A 0x899C # <CJK>
+0x5D2B 0x899F # <CJK>
+0x5D2C 0x89A0 # <CJK>
+0x5D2D 0x89A5 # <CJK>
+0x5D2E 0x89B0 # <CJK>
+0x5D2F 0x89B4 # <CJK>
+0x5D30 0x89B5 # <CJK>
+0x5D31 0x89B6 # <CJK>
+0x5D32 0x89B7 # <CJK>
+0x5D33 0x89BC # <CJK>
+0x5D34 0x89D4 # <CJK>
+0x5D35 0x89D5 # <CJK>
+0x5D36 0x89D6 # <CJK>
+0x5D37 0x89D7 # <CJK>
+0x5D38 0x89D8 # <CJK>
+0x5D39 0x89E5 # <CJK>
+0x5D3A 0x89E9 # <CJK>
+0x5D3B 0x89EB # <CJK>
+0x5D3C 0x89ED # <CJK>
+0x5D3D 0x89F1 # <CJK>
+0x5D3E 0x89F3 # <CJK>
+0x5D3F 0x89F6 # <CJK>
+0x5D40 0x89F9 # <CJK>
+0x5D41 0x89FD # <CJK>
+0x5D42 0x89FF # <CJK>
+0x5D43 0x8A04 # <CJK>
+0x5D44 0x8A05 # <CJK>
+0x5D45 0x8A07 # <CJK>
+0x5D46 0x8A0F # <CJK>
+0x5D47 0x8A11 # <CJK>
+0x5D48 0x8A12 # <CJK>
+0x5D49 0x8A14 # <CJK>
+0x5D4A 0x8A15 # <CJK>
+0x5D4B 0x8A1E # <CJK>
+0x5D4C 0x8A20 # <CJK>
+0x5D4D 0x8A22 # <CJK>
+0x5D4E 0x8A24 # <CJK>
+0x5D4F 0x8A26 # <CJK>
+0x5D50 0x8A2B # <CJK>
+0x5D51 0x8A2C # <CJK>
+0x5D52 0x8A2F # <CJK>
+0x5D53 0x8A35 # <CJK>
+0x5D54 0x8A37 # <CJK>
+0x5D55 0x8A3D # <CJK>
+0x5D56 0x8A3E # <CJK>
+0x5D57 0x8A40 # <CJK>
+0x5D58 0x8A43 # <CJK>
+0x5D59 0x8A45 # <CJK>
+0x5D5A 0x8A47 # <CJK>
+0x5D5B 0x8A49 # <CJK>
+0x5D5C 0x8A4D # <CJK>
+0x5D5D 0x8A4E # <CJK>
+0x5D5E 0x8A53 # <CJK>
+0x5D5F 0x8A56 # <CJK>
+0x5D60 0x8A57 # <CJK>
+0x5D61 0x8A58 # <CJK>
+0x5D62 0x8A5C # <CJK>
+0x5D63 0x8A5D # <CJK>
+0x5D64 0x8A61 # <CJK>
+0x5D65 0x8A65 # <CJK>
+0x5D66 0x8A67 # <CJK>
+0x5D67 0x8A75 # <CJK>
+0x5D68 0x8A76 # <CJK>
+0x5D69 0x8A77 # <CJK>
+0x5D6A 0x8A79 # <CJK>
+0x5D6B 0x8A7A # <CJK>
+0x5D6C 0x8A7B # <CJK>
+0x5D6D 0x8A7E # <CJK>
+0x5D6E 0x8A7F # <CJK>
+0x5D6F 0x8A80 # <CJK>
+0x5D70 0x8A83 # <CJK>
+0x5D71 0x8A86 # <CJK>
+0x5D72 0x8A8B # <CJK>
+0x5D73 0x8A8F # <CJK>
+0x5D74 0x8A90 # <CJK>
+0x5D75 0x8A92 # <CJK>
+0x5D76 0x8A96 # <CJK>
+0x5D77 0x8A97 # <CJK>
+0x5D78 0x8A99 # <CJK>
+0x5D79 0x8A9F # <CJK>
+0x5D7A 0x8AA7 # <CJK>
+0x5D7B 0x8AA9 # <CJK>
+0x5D7C 0x8AAE # <CJK>
+0x5D7D 0x8AAF # <CJK>
+0x5D7E 0x8AB3 # <CJK>
+0x5E21 0x8AB6 # <CJK>
+0x5E22 0x8AB7 # <CJK>
+0x5E23 0x8ABB # <CJK>
+0x5E24 0x8ABE # <CJK>
+0x5E25 0x8AC3 # <CJK>
+0x5E26 0x8AC6 # <CJK>
+0x5E27 0x8AC8 # <CJK>
+0x5E28 0x8AC9 # <CJK>
+0x5E29 0x8ACA # <CJK>
+0x5E2A 0x8AD1 # <CJK>
+0x5E2B 0x8AD3 # <CJK>
+0x5E2C 0x8AD4 # <CJK>
+0x5E2D 0x8AD5 # <CJK>
+0x5E2E 0x8AD7 # <CJK>
+0x5E2F 0x8ADD # <CJK>
+0x5E30 0x8ADF # <CJK>
+0x5E31 0x8AEC # <CJK>
+0x5E32 0x8AF0 # <CJK>
+0x5E33 0x8AF4 # <CJK>
+0x5E34 0x8AF5 # <CJK>
+0x5E35 0x8AF6 # <CJK>
+0x5E36 0x8AFC # <CJK>
+0x5E37 0x8AFF # <CJK>
+0x5E38 0x8B05 # <CJK>
+0x5E39 0x8B06 # <CJK>
+0x5E3A 0x8B0B # <CJK>
+0x5E3B 0x8B11 # <CJK>
+0x5E3C 0x8B1C # <CJK>
+0x5E3D 0x8B1E # <CJK>
+0x5E3E 0x8B1F # <CJK>
+0x5E3F 0x8B0A # <CJK>
+0x5E40 0x8B2D # <CJK>
+0x5E41 0x8B30 # <CJK>
+0x5E42 0x8B37 # <CJK>
+0x5E43 0x8B3C # <CJK>
+0x5E44 0x8B42 # <CJK>
+0x5E45 0x8B43 # <CJK>
+0x5E46 0x8B44 # <CJK>
+0x5E47 0x8B45 # <CJK>
+0x5E48 0x8B46 # <CJK>
+0x5E49 0x8B48 # <CJK>
+0x5E4A 0x8B52 # <CJK>
+0x5E4B 0x8B53 # <CJK>
+0x5E4C 0x8B54 # <CJK>
+0x5E4D 0x8B59 # <CJK>
+0x5E4E 0x8B4D # <CJK>
+0x5E4F 0x8B5E # <CJK>
+0x5E50 0x8B63 # <CJK>
+0x5E51 0x8B6D # <CJK>
+0x5E52 0x8B76 # <CJK>
+0x5E53 0x8B78 # <CJK>
+0x5E54 0x8B79 # <CJK>
+0x5E55 0x8B7C # <CJK>
+0x5E56 0x8B7E # <CJK>
+0x5E57 0x8B81 # <CJK>
+0x5E58 0x8B84 # <CJK>
+0x5E59 0x8B85 # <CJK>
+0x5E5A 0x8B8B # <CJK>
+0x5E5B 0x8B8D # <CJK>
+0x5E5C 0x8B8F # <CJK>
+0x5E5D 0x8B94 # <CJK>
+0x5E5E 0x8B95 # <CJK>
+0x5E5F 0x8B9C # <CJK>
+0x5E60 0x8B9E # <CJK>
+0x5E61 0x8B9F # <CJK>
+0x5E62 0x8C38 # <CJK>
+0x5E63 0x8C39 # <CJK>
+0x5E64 0x8C3D # <CJK>
+0x5E65 0x8C3E # <CJK>
+0x5E66 0x8C45 # <CJK>
+0x5E67 0x8C47 # <CJK>
+0x5E68 0x8C49 # <CJK>
+0x5E69 0x8C4B # <CJK>
+0x5E6A 0x8C4F # <CJK>
+0x5E6B 0x8C51 # <CJK>
+0x5E6C 0x8C53 # <CJK>
+0x5E6D 0x8C54 # <CJK>
+0x5E6E 0x8C57 # <CJK>
+0x5E6F 0x8C58 # <CJK>
+0x5E70 0x8C5B # <CJK>
+0x5E71 0x8C5D # <CJK>
+0x5E72 0x8C59 # <CJK>
+0x5E73 0x8C63 # <CJK>
+0x5E74 0x8C64 # <CJK>
+0x5E75 0x8C66 # <CJK>
+0x5E76 0x8C68 # <CJK>
+0x5E77 0x8C69 # <CJK>
+0x5E78 0x8C6D # <CJK>
+0x5E79 0x8C73 # <CJK>
+0x5E7A 0x8C75 # <CJK>
+0x5E7B 0x8C76 # <CJK>
+0x5E7C 0x8C7B # <CJK>
+0x5E7D 0x8C7E # <CJK>
+0x5E7E 0x8C86 # <CJK>
+0x5F21 0x8C87 # <CJK>
+0x5F22 0x8C8B # <CJK>
+0x5F23 0x8C90 # <CJK>
+0x5F24 0x8C92 # <CJK>
+0x5F25 0x8C93 # <CJK>
+0x5F26 0x8C99 # <CJK>
+0x5F27 0x8C9B # <CJK>
+0x5F28 0x8C9C # <CJK>
+0x5F29 0x8CA4 # <CJK>
+0x5F2A 0x8CB9 # <CJK>
+0x5F2B 0x8CBA # <CJK>
+0x5F2C 0x8CC5 # <CJK>
+0x5F2D 0x8CC6 # <CJK>
+0x5F2E 0x8CC9 # <CJK>
+0x5F2F 0x8CCB # <CJK>
+0x5F30 0x8CCF # <CJK>
+0x5F31 0x8CD6 # <CJK>
+0x5F32 0x8CD5 # <CJK>
+0x5F33 0x8CD9 # <CJK>
+0x5F34 0x8CDD # <CJK>
+0x5F35 0x8CE1 # <CJK>
+0x5F36 0x8CE8 # <CJK>
+0x5F37 0x8CEC # <CJK>
+0x5F38 0x8CEF # <CJK>
+0x5F39 0x8CF0 # <CJK>
+0x5F3A 0x8CF2 # <CJK>
+0x5F3B 0x8CF5 # <CJK>
+0x5F3C 0x8CF7 # <CJK>
+0x5F3D 0x8CF8 # <CJK>
+0x5F3E 0x8CFE # <CJK>
+0x5F3F 0x8CFF # <CJK>
+0x5F40 0x8D01 # <CJK>
+0x5F41 0x8D03 # <CJK>
+0x5F42 0x8D09 # <CJK>
+0x5F43 0x8D12 # <CJK>
+0x5F44 0x8D17 # <CJK>
+0x5F45 0x8D1B # <CJK>
+0x5F46 0x8D65 # <CJK>
+0x5F47 0x8D69 # <CJK>
+0x5F48 0x8D6C # <CJK>
+0x5F49 0x8D6E # <CJK>
+0x5F4A 0x8D7F # <CJK>
+0x5F4B 0x8D82 # <CJK>
+0x5F4C 0x8D84 # <CJK>
+0x5F4D 0x8D88 # <CJK>
+0x5F4E 0x8D8D # <CJK>
+0x5F4F 0x8D90 # <CJK>
+0x5F50 0x8D91 # <CJK>
+0x5F51 0x8D95 # <CJK>
+0x5F52 0x8D9E # <CJK>
+0x5F53 0x8D9F # <CJK>
+0x5F54 0x8DA0 # <CJK>
+0x5F55 0x8DA6 # <CJK>
+0x5F56 0x8DAB # <CJK>
+0x5F57 0x8DAC # <CJK>
+0x5F58 0x8DAF # <CJK>
+0x5F59 0x8DB2 # <CJK>
+0x5F5A 0x8DB5 # <CJK>
+0x5F5B 0x8DB7 # <CJK>
+0x5F5C 0x8DB9 # <CJK>
+0x5F5D 0x8DBB # <CJK>
+0x5F5E 0x8DC0 # <CJK>
+0x5F5F 0x8DC5 # <CJK>
+0x5F60 0x8DC6 # <CJK>
+0x5F61 0x8DC7 # <CJK>
+0x5F62 0x8DC8 # <CJK>
+0x5F63 0x8DCA # <CJK>
+0x5F64 0x8DCE # <CJK>
+0x5F65 0x8DD1 # <CJK>
+0x5F66 0x8DD4 # <CJK>
+0x5F67 0x8DD5 # <CJK>
+0x5F68 0x8DD7 # <CJK>
+0x5F69 0x8DD9 # <CJK>
+0x5F6A 0x8DE4 # <CJK>
+0x5F6B 0x8DE5 # <CJK>
+0x5F6C 0x8DE7 # <CJK>
+0x5F6D 0x8DEC # <CJK>
+0x5F6E 0x8DF0 # <CJK>
+0x5F6F 0x8DBC # <CJK>
+0x5F70 0x8DF1 # <CJK>
+0x5F71 0x8DF2 # <CJK>
+0x5F72 0x8DF4 # <CJK>
+0x5F73 0x8DFD # <CJK>
+0x5F74 0x8E01 # <CJK>
+0x5F75 0x8E04 # <CJK>
+0x5F76 0x8E05 # <CJK>
+0x5F77 0x8E06 # <CJK>
+0x5F78 0x8E0B # <CJK>
+0x5F79 0x8E11 # <CJK>
+0x5F7A 0x8E14 # <CJK>
+0x5F7B 0x8E16 # <CJK>
+0x5F7C 0x8E20 # <CJK>
+0x5F7D 0x8E21 # <CJK>
+0x5F7E 0x8E22 # <CJK>
+0x6021 0x8E23 # <CJK>
+0x6022 0x8E26 # <CJK>
+0x6023 0x8E27 # <CJK>
+0x6024 0x8E31 # <CJK>
+0x6025 0x8E33 # <CJK>
+0x6026 0x8E36 # <CJK>
+0x6027 0x8E37 # <CJK>
+0x6028 0x8E38 # <CJK>
+0x6029 0x8E39 # <CJK>
+0x602A 0x8E3D # <CJK>
+0x602B 0x8E40 # <CJK>
+0x602C 0x8E41 # <CJK>
+0x602D 0x8E4B # <CJK>
+0x602E 0x8E4D # <CJK>
+0x602F 0x8E4E # <CJK>
+0x6030 0x8E4F # <CJK>
+0x6031 0x8E54 # <CJK>
+0x6032 0x8E5B # <CJK>
+0x6033 0x8E5C # <CJK>
+0x6034 0x8E5D # <CJK>
+0x6035 0x8E5E # <CJK>
+0x6036 0x8E61 # <CJK>
+0x6037 0x8E62 # <CJK>
+0x6038 0x8E69 # <CJK>
+0x6039 0x8E6C # <CJK>
+0x603A 0x8E6D # <CJK>
+0x603B 0x8E6F # <CJK>
+0x603C 0x8E70 # <CJK>
+0x603D 0x8E71 # <CJK>
+0x603E 0x8E79 # <CJK>
+0x603F 0x8E7A # <CJK>
+0x6040 0x8E7B # <CJK>
+0x6041 0x8E82 # <CJK>
+0x6042 0x8E83 # <CJK>
+0x6043 0x8E89 # <CJK>
+0x6044 0x8E90 # <CJK>
+0x6045 0x8E92 # <CJK>
+0x6046 0x8E95 # <CJK>
+0x6047 0x8E9A # <CJK>
+0x6048 0x8E9B # <CJK>
+0x6049 0x8E9D # <CJK>
+0x604A 0x8E9E # <CJK>
+0x604B 0x8EA2 # <CJK>
+0x604C 0x8EA7 # <CJK>
+0x604D 0x8EA9 # <CJK>
+0x604E 0x8EAD # <CJK>
+0x604F 0x8EAE # <CJK>
+0x6050 0x8EB3 # <CJK>
+0x6051 0x8EB5 # <CJK>
+0x6052 0x8EBA # <CJK>
+0x6053 0x8EBB # <CJK>
+0x6054 0x8EC0 # <CJK>
+0x6055 0x8EC1 # <CJK>
+0x6056 0x8EC3 # <CJK>
+0x6057 0x8EC4 # <CJK>
+0x6058 0x8EC7 # <CJK>
+0x6059 0x8ECF # <CJK>
+0x605A 0x8ED1 # <CJK>
+0x605B 0x8ED4 # <CJK>
+0x605C 0x8EDC # <CJK>
+0x605D 0x8EE8 # <CJK>
+0x605E 0x8EEE # <CJK>
+0x605F 0x8EF0 # <CJK>
+0x6060 0x8EF1 # <CJK>
+0x6061 0x8EF7 # <CJK>
+0x6062 0x8EF9 # <CJK>
+0x6063 0x8EFA # <CJK>
+0x6064 0x8EED # <CJK>
+0x6065 0x8F00 # <CJK>
+0x6066 0x8F02 # <CJK>
+0x6067 0x8F07 # <CJK>
+0x6068 0x8F08 # <CJK>
+0x6069 0x8F0F # <CJK>
+0x606A 0x8F10 # <CJK>
+0x606B 0x8F16 # <CJK>
+0x606C 0x8F17 # <CJK>
+0x606D 0x8F18 # <CJK>
+0x606E 0x8F1E # <CJK>
+0x606F 0x8F20 # <CJK>
+0x6070 0x8F21 # <CJK>
+0x6071 0x8F23 # <CJK>
+0x6072 0x8F25 # <CJK>
+0x6073 0x8F27 # <CJK>
+0x6074 0x8F28 # <CJK>
+0x6075 0x8F2C # <CJK>
+0x6076 0x8F2D # <CJK>
+0x6077 0x8F2E # <CJK>
+0x6078 0x8F34 # <CJK>
+0x6079 0x8F35 # <CJK>
+0x607A 0x8F36 # <CJK>
+0x607B 0x8F37 # <CJK>
+0x607C 0x8F3A # <CJK>
+0x607D 0x8F40 # <CJK>
+0x607E 0x8F41 # <CJK>
+0x6121 0x8F43 # <CJK>
+0x6122 0x8F47 # <CJK>
+0x6123 0x8F4F # <CJK>
+0x6124 0x8F51 # <CJK>
+0x6125 0x8F52 # <CJK>
+0x6126 0x8F53 # <CJK>
+0x6127 0x8F54 # <CJK>
+0x6128 0x8F55 # <CJK>
+0x6129 0x8F58 # <CJK>
+0x612A 0x8F5D # <CJK>
+0x612B 0x8F5E # <CJK>
+0x612C 0x8F65 # <CJK>
+0x612D 0x8F9D # <CJK>
+0x612E 0x8FA0 # <CJK>
+0x612F 0x8FA1 # <CJK>
+0x6130 0x8FA4 # <CJK>
+0x6131 0x8FA5 # <CJK>
+0x6132 0x8FA6 # <CJK>
+0x6133 0x8FB5 # <CJK>
+0x6134 0x8FB6 # <CJK>
+0x6135 0x8FB8 # <CJK>
+0x6136 0x8FBE # <CJK>
+0x6137 0x8FC0 # <CJK>
+0x6138 0x8FC1 # <CJK>
+0x6139 0x8FC6 # <CJK>
+0x613A 0x8FCA # <CJK>
+0x613B 0x8FCB # <CJK>
+0x613C 0x8FCD # <CJK>
+0x613D 0x8FD0 # <CJK>
+0x613E 0x8FD2 # <CJK>
+0x613F 0x8FD3 # <CJK>
+0x6140 0x8FD5 # <CJK>
+0x6141 0x8FE0 # <CJK>
+0x6142 0x8FE3 # <CJK>
+0x6143 0x8FE4 # <CJK>
+0x6144 0x8FE8 # <CJK>
+0x6145 0x8FEE # <CJK>
+0x6146 0x8FF1 # <CJK>
+0x6147 0x8FF5 # <CJK>
+0x6148 0x8FF6 # <CJK>
+0x6149 0x8FFB # <CJK>
+0x614A 0x8FFE # <CJK>
+0x614B 0x9002 # <CJK>
+0x614C 0x9004 # <CJK>
+0x614D 0x9008 # <CJK>
+0x614E 0x900C # <CJK>
+0x614F 0x9018 # <CJK>
+0x6150 0x901B # <CJK>
+0x6151 0x9028 # <CJK>
+0x6152 0x9029 # <CJK>
+0x6153 0x902F # <CJK>
+0x6154 0x902A # <CJK>
+0x6155 0x902C # <CJK>
+0x6156 0x902D # <CJK>
+0x6157 0x9033 # <CJK>
+0x6158 0x9034 # <CJK>
+0x6159 0x9037 # <CJK>
+0x615A 0x903F # <CJK>
+0x615B 0x9043 # <CJK>
+0x615C 0x9044 # <CJK>
+0x615D 0x904C # <CJK>
+0x615E 0x905B # <CJK>
+0x615F 0x905D # <CJK>
+0x6160 0x9062 # <CJK>
+0x6161 0x9066 # <CJK>
+0x6162 0x9067 # <CJK>
+0x6163 0x906C # <CJK>
+0x6164 0x9070 # <CJK>
+0x6165 0x9074 # <CJK>
+0x6166 0x9079 # <CJK>
+0x6167 0x9085 # <CJK>
+0x6168 0x9088 # <CJK>
+0x6169 0x908B # <CJK>
+0x616A 0x908C # <CJK>
+0x616B 0x908E # <CJK>
+0x616C 0x9090 # <CJK>
+0x616D 0x9095 # <CJK>
+0x616E 0x9097 # <CJK>
+0x616F 0x9098 # <CJK>
+0x6170 0x9099 # <CJK>
+0x6171 0x909B # <CJK>
+0x6172 0x90A0 # <CJK>
+0x6173 0x90A1 # <CJK>
+0x6174 0x90A2 # <CJK>
+0x6175 0x90A5 # <CJK>
+0x6176 0x90B0 # <CJK>
+0x6177 0x90B2 # <CJK>
+0x6178 0x90B3 # <CJK>
+0x6179 0x90B4 # <CJK>
+0x617A 0x90B6 # <CJK>
+0x617B 0x90BD # <CJK>
+0x617C 0x90CC # <CJK>
+0x617D 0x90BE # <CJK>
+0x617E 0x90C3 # <CJK>
+0x6221 0x90C4 # <CJK>
+0x6222 0x90C5 # <CJK>
+0x6223 0x90C7 # <CJK>
+0x6224 0x90C8 # <CJK>
+0x6225 0x90D5 # <CJK>
+0x6226 0x90D7 # <CJK>
+0x6227 0x90D8 # <CJK>
+0x6228 0x90D9 # <CJK>
+0x6229 0x90DC # <CJK>
+0x622A 0x90DD # <CJK>
+0x622B 0x90DF # <CJK>
+0x622C 0x90E5 # <CJK>
+0x622D 0x90D2 # <CJK>
+0x622E 0x90F6 # <CJK>
+0x622F 0x90EB # <CJK>
+0x6230 0x90EF # <CJK>
+0x6231 0x90F0 # <CJK>
+0x6232 0x90F4 # <CJK>
+0x6233 0x90FE # <CJK>
+0x6234 0x90FF # <CJK>
+0x6235 0x9100 # <CJK>
+0x6236 0x9104 # <CJK>
+0x6237 0x9105 # <CJK>
+0x6238 0x9106 # <CJK>
+0x6239 0x9108 # <CJK>
+0x623A 0x910D # <CJK>
+0x623B 0x9110 # <CJK>
+0x623C 0x9114 # <CJK>
+0x623D 0x9116 # <CJK>
+0x623E 0x9117 # <CJK>
+0x623F 0x9118 # <CJK>
+0x6240 0x911A # <CJK>
+0x6241 0x911C # <CJK>
+0x6242 0x911E # <CJK>
+0x6243 0x9120 # <CJK>
+0x6244 0x9125 # <CJK>
+0x6245 0x9122 # <CJK>
+0x6246 0x9123 # <CJK>
+0x6247 0x9127 # <CJK>
+0x6248 0x9129 # <CJK>
+0x6249 0x912E # <CJK>
+0x624A 0x912F # <CJK>
+0x624B 0x9131 # <CJK>
+0x624C 0x9134 # <CJK>
+0x624D 0x9136 # <CJK>
+0x624E 0x9137 # <CJK>
+0x624F 0x9139 # <CJK>
+0x6250 0x913A # <CJK>
+0x6251 0x913C # <CJK>
+0x6252 0x913D # <CJK>
+0x6253 0x9143 # <CJK>
+0x6254 0x9147 # <CJK>
+0x6255 0x9148 # <CJK>
+0x6256 0x914F # <CJK>
+0x6257 0x9153 # <CJK>
+0x6258 0x9157 # <CJK>
+0x6259 0x9159 # <CJK>
+0x625A 0x915A # <CJK>
+0x625B 0x915B # <CJK>
+0x625C 0x9161 # <CJK>
+0x625D 0x9164 # <CJK>
+0x625E 0x9167 # <CJK>
+0x625F 0x916D # <CJK>
+0x6260 0x9174 # <CJK>
+0x6261 0x9179 # <CJK>
+0x6262 0x917A # <CJK>
+0x6263 0x917B # <CJK>
+0x6264 0x9181 # <CJK>
+0x6265 0x9183 # <CJK>
+0x6266 0x9185 # <CJK>
+0x6267 0x9186 # <CJK>
+0x6268 0x918A # <CJK>
+0x6269 0x918E # <CJK>
+0x626A 0x9191 # <CJK>
+0x626B 0x9193 # <CJK>
+0x626C 0x9194 # <CJK>
+0x626D 0x9195 # <CJK>
+0x626E 0x9198 # <CJK>
+0x626F 0x919E # <CJK>
+0x6270 0x91A1 # <CJK>
+0x6271 0x91A6 # <CJK>
+0x6272 0x91A8 # <CJK>
+0x6273 0x91AC # <CJK>
+0x6274 0x91AD # <CJK>
+0x6275 0x91AE # <CJK>
+0x6276 0x91B0 # <CJK>
+0x6277 0x91B1 # <CJK>
+0x6278 0x91B2 # <CJK>
+0x6279 0x91B3 # <CJK>
+0x627A 0x91B6 # <CJK>
+0x627B 0x91BB # <CJK>
+0x627C 0x91BC # <CJK>
+0x627D 0x91BD # <CJK>
+0x627E 0x91BF # <CJK>
+0x6321 0x91C2 # <CJK>
+0x6322 0x91C3 # <CJK>
+0x6323 0x91C5 # <CJK>
+0x6324 0x91D3 # <CJK>
+0x6325 0x91D4 # <CJK>
+0x6326 0x91D7 # <CJK>
+0x6327 0x91D9 # <CJK>
+0x6328 0x91DA # <CJK>
+0x6329 0x91DE # <CJK>
+0x632A 0x91E4 # <CJK>
+0x632B 0x91E5 # <CJK>
+0x632C 0x91E9 # <CJK>
+0x632D 0x91EA # <CJK>
+0x632E 0x91EC # <CJK>
+0x632F 0x91ED # <CJK>
+0x6330 0x91EE # <CJK>
+0x6331 0x91EF # <CJK>
+0x6332 0x91F0 # <CJK>
+0x6333 0x91F1 # <CJK>
+0x6334 0x91F7 # <CJK>
+0x6335 0x91F9 # <CJK>
+0x6336 0x91FB # <CJK>
+0x6337 0x91FD # <CJK>
+0x6338 0x9200 # <CJK>
+0x6339 0x9201 # <CJK>
+0x633A 0x9204 # <CJK>
+0x633B 0x9205 # <CJK>
+0x633C 0x9206 # <CJK>
+0x633D 0x9207 # <CJK>
+0x633E 0x9209 # <CJK>
+0x633F 0x920A # <CJK>
+0x6340 0x920C # <CJK>
+0x6341 0x9210 # <CJK>
+0x6342 0x9212 # <CJK>
+0x6343 0x9213 # <CJK>
+0x6344 0x9216 # <CJK>
+0x6345 0x9218 # <CJK>
+0x6346 0x921C # <CJK>
+0x6347 0x921D # <CJK>
+0x6348 0x9223 # <CJK>
+0x6349 0x9224 # <CJK>
+0x634A 0x9225 # <CJK>
+0x634B 0x9226 # <CJK>
+0x634C 0x9228 # <CJK>
+0x634D 0x922E # <CJK>
+0x634E 0x922F # <CJK>
+0x634F 0x9230 # <CJK>
+0x6350 0x9233 # <CJK>
+0x6351 0x9235 # <CJK>
+0x6352 0x9236 # <CJK>
+0x6353 0x9238 # <CJK>
+0x6354 0x9239 # <CJK>
+0x6355 0x923A # <CJK>
+0x6356 0x923C # <CJK>
+0x6357 0x923E # <CJK>
+0x6358 0x9240 # <CJK>
+0x6359 0x9242 # <CJK>
+0x635A 0x9243 # <CJK>
+0x635B 0x9246 # <CJK>
+0x635C 0x9247 # <CJK>
+0x635D 0x924A # <CJK>
+0x635E 0x924D # <CJK>
+0x635F 0x924E # <CJK>
+0x6360 0x924F # <CJK>
+0x6361 0x9251 # <CJK>
+0x6362 0x9258 # <CJK>
+0x6363 0x9259 # <CJK>
+0x6364 0x925C # <CJK>
+0x6365 0x925D # <CJK>
+0x6366 0x9260 # <CJK>
+0x6367 0x9261 # <CJK>
+0x6368 0x9265 # <CJK>
+0x6369 0x9267 # <CJK>
+0x636A 0x9268 # <CJK>
+0x636B 0x9269 # <CJK>
+0x636C 0x926E # <CJK>
+0x636D 0x926F # <CJK>
+0x636E 0x9270 # <CJK>
+0x636F 0x9275 # <CJK>
+0x6370 0x9276 # <CJK>
+0x6371 0x9277 # <CJK>
+0x6372 0x9278 # <CJK>
+0x6373 0x9279 # <CJK>
+0x6374 0x927B # <CJK>
+0x6375 0x927C # <CJK>
+0x6376 0x927D # <CJK>
+0x6377 0x927F # <CJK>
+0x6378 0x9288 # <CJK>
+0x6379 0x9289 # <CJK>
+0x637A 0x928A # <CJK>
+0x637B 0x928D # <CJK>
+0x637C 0x928E # <CJK>
+0x637D 0x9292 # <CJK>
+0x637E 0x9297 # <CJK>
+0x6421 0x9299 # <CJK>
+0x6422 0x929F # <CJK>
+0x6423 0x92A0 # <CJK>
+0x6424 0x92A4 # <CJK>
+0x6425 0x92A5 # <CJK>
+0x6426 0x92A7 # <CJK>
+0x6427 0x92A8 # <CJK>
+0x6428 0x92AB # <CJK>
+0x6429 0x92AF # <CJK>
+0x642A 0x92B2 # <CJK>
+0x642B 0x92B6 # <CJK>
+0x642C 0x92B8 # <CJK>
+0x642D 0x92BA # <CJK>
+0x642E 0x92BB # <CJK>
+0x642F 0x92BC # <CJK>
+0x6430 0x92BD # <CJK>
+0x6431 0x92BF # <CJK>
+0x6432 0x92C0 # <CJK>
+0x6433 0x92C1 # <CJK>
+0x6434 0x92C2 # <CJK>
+0x6435 0x92C3 # <CJK>
+0x6436 0x92C5 # <CJK>
+0x6437 0x92C6 # <CJK>
+0x6438 0x92C7 # <CJK>
+0x6439 0x92C8 # <CJK>
+0x643A 0x92CB # <CJK>
+0x643B 0x92CC # <CJK>
+0x643C 0x92CD # <CJK>
+0x643D 0x92CE # <CJK>
+0x643E 0x92D0 # <CJK>
+0x643F 0x92D3 # <CJK>
+0x6440 0x92D5 # <CJK>
+0x6441 0x92D7 # <CJK>
+0x6442 0x92D8 # <CJK>
+0x6443 0x92D9 # <CJK>
+0x6444 0x92DC # <CJK>
+0x6445 0x92DD # <CJK>
+0x6446 0x92DF # <CJK>
+0x6447 0x92E0 # <CJK>
+0x6448 0x92E1 # <CJK>
+0x6449 0x92E3 # <CJK>
+0x644A 0x92E5 # <CJK>
+0x644B 0x92E7 # <CJK>
+0x644C 0x92E8 # <CJK>
+0x644D 0x92EC # <CJK>
+0x644E 0x92EE # <CJK>
+0x644F 0x92F0 # <CJK>
+0x6450 0x92F9 # <CJK>
+0x6451 0x92FB # <CJK>
+0x6452 0x92FF # <CJK>
+0x6453 0x9300 # <CJK>
+0x6454 0x9302 # <CJK>
+0x6455 0x9308 # <CJK>
+0x6456 0x930D # <CJK>
+0x6457 0x9311 # <CJK>
+0x6458 0x9314 # <CJK>
+0x6459 0x9315 # <CJK>
+0x645A 0x931C # <CJK>
+0x645B 0x931D # <CJK>
+0x645C 0x931E # <CJK>
+0x645D 0x931F # <CJK>
+0x645E 0x9321 # <CJK>
+0x645F 0x9324 # <CJK>
+0x6460 0x9325 # <CJK>
+0x6461 0x9327 # <CJK>
+0x6462 0x9329 # <CJK>
+0x6463 0x932A # <CJK>
+0x6464 0x9333 # <CJK>
+0x6465 0x9334 # <CJK>
+0x6466 0x9336 # <CJK>
+0x6467 0x9337 # <CJK>
+0x6468 0x9347 # <CJK>
+0x6469 0x9348 # <CJK>
+0x646A 0x9349 # <CJK>
+0x646B 0x9350 # <CJK>
+0x646C 0x9351 # <CJK>
+0x646D 0x9352 # <CJK>
+0x646E 0x9355 # <CJK>
+0x646F 0x9357 # <CJK>
+0x6470 0x9358 # <CJK>
+0x6471 0x935A # <CJK>
+0x6472 0x935E # <CJK>
+0x6473 0x9364 # <CJK>
+0x6474 0x9365 # <CJK>
+0x6475 0x9367 # <CJK>
+0x6476 0x9369 # <CJK>
+0x6477 0x936A # <CJK>
+0x6478 0x936D # <CJK>
+0x6479 0x936F # <CJK>
+0x647A 0x9370 # <CJK>
+0x647B 0x9371 # <CJK>
+0x647C 0x9373 # <CJK>
+0x647D 0x9374 # <CJK>
+0x647E 0x9376 # <CJK>
+0x6521 0x937A # <CJK>
+0x6522 0x937D # <CJK>
+0x6523 0x937F # <CJK>
+0x6524 0x9380 # <CJK>
+0x6525 0x9381 # <CJK>
+0x6526 0x9382 # <CJK>
+0x6527 0x9388 # <CJK>
+0x6528 0x938A # <CJK>
+0x6529 0x938B # <CJK>
+0x652A 0x938D # <CJK>
+0x652B 0x938F # <CJK>
+0x652C 0x9392 # <CJK>
+0x652D 0x9395 # <CJK>
+0x652E 0x9398 # <CJK>
+0x652F 0x939B # <CJK>
+0x6530 0x939E # <CJK>
+0x6531 0x93A1 # <CJK>
+0x6532 0x93A3 # <CJK>
+0x6533 0x93A4 # <CJK>
+0x6534 0x93A6 # <CJK>
+0x6535 0x93A8 # <CJK>
+0x6536 0x93AB # <CJK>
+0x6537 0x93B4 # <CJK>
+0x6538 0x93B5 # <CJK>
+0x6539 0x93B6 # <CJK>
+0x653A 0x93BA # <CJK>
+0x653B 0x93A9 # <CJK>
+0x653C 0x93C1 # <CJK>
+0x653D 0x93C4 # <CJK>
+0x653E 0x93C5 # <CJK>
+0x653F 0x93C6 # <CJK>
+0x6540 0x93C7 # <CJK>
+0x6541 0x93C9 # <CJK>
+0x6542 0x93CA # <CJK>
+0x6543 0x93CB # <CJK>
+0x6544 0x93CC # <CJK>
+0x6545 0x93CD # <CJK>
+0x6546 0x93D3 # <CJK>
+0x6547 0x93D9 # <CJK>
+0x6548 0x93DC # <CJK>
+0x6549 0x93DE # <CJK>
+0x654A 0x93DF # <CJK>
+0x654B 0x93E2 # <CJK>
+0x654C 0x93E6 # <CJK>
+0x654D 0x93E7 # <CJK>
+0x654E 0x93F9 # <CJK>
+0x654F 0x93F7 # <CJK>
+0x6550 0x93F8 # <CJK>
+0x6551 0x93FA # <CJK>
+0x6552 0x93FB # <CJK>
+0x6553 0x93FD # <CJK>
+0x6554 0x9401 # <CJK>
+0x6555 0x9402 # <CJK>
+0x6556 0x9404 # <CJK>
+0x6557 0x9408 # <CJK>
+0x6558 0x9409 # <CJK>
+0x6559 0x940D # <CJK>
+0x655A 0x940E # <CJK>
+0x655B 0x940F # <CJK>
+0x655C 0x9415 # <CJK>
+0x655D 0x9416 # <CJK>
+0x655E 0x9417 # <CJK>
+0x655F 0x941F # <CJK>
+0x6560 0x942E # <CJK>
+0x6561 0x942F # <CJK>
+0x6562 0x9431 # <CJK>
+0x6563 0x9432 # <CJK>
+0x6564 0x9433 # <CJK>
+0x6565 0x9434 # <CJK>
+0x6566 0x943B # <CJK>
+0x6567 0x943F # <CJK>
+0x6568 0x943D # <CJK>
+0x6569 0x9443 # <CJK>
+0x656A 0x9445 # <CJK>
+0x656B 0x9448 # <CJK>
+0x656C 0x944A # <CJK>
+0x656D 0x944C # <CJK>
+0x656E 0x9455 # <CJK>
+0x656F 0x9459 # <CJK>
+0x6570 0x945C # <CJK>
+0x6571 0x945F # <CJK>
+0x6572 0x9461 # <CJK>
+0x6573 0x9463 # <CJK>
+0x6574 0x9468 # <CJK>
+0x6575 0x946B # <CJK>
+0x6576 0x946D # <CJK>
+0x6577 0x946E # <CJK>
+0x6578 0x946F # <CJK>
+0x6579 0x9471 # <CJK>
+0x657A 0x9472 # <CJK>
+0x657B 0x9484 # <CJK>
+0x657C 0x9483 # <CJK>
+0x657D 0x9578 # <CJK>
+0x657E 0x9579 # <CJK>
+0x6621 0x957E # <CJK>
+0x6622 0x9584 # <CJK>
+0x6623 0x9588 # <CJK>
+0x6624 0x958C # <CJK>
+0x6625 0x958D # <CJK>
+0x6626 0x958E # <CJK>
+0x6627 0x959D # <CJK>
+0x6628 0x959E # <CJK>
+0x6629 0x959F # <CJK>
+0x662A 0x95A1 # <CJK>
+0x662B 0x95A6 # <CJK>
+0x662C 0x95A9 # <CJK>
+0x662D 0x95AB # <CJK>
+0x662E 0x95AC # <CJK>
+0x662F 0x95B4 # <CJK>
+0x6630 0x95B6 # <CJK>
+0x6631 0x95BA # <CJK>
+0x6632 0x95BD # <CJK>
+0x6633 0x95BF # <CJK>
+0x6634 0x95C6 # <CJK>
+0x6635 0x95C8 # <CJK>
+0x6636 0x95C9 # <CJK>
+0x6637 0x95CB # <CJK>
+0x6638 0x95D0 # <CJK>
+0x6639 0x95D1 # <CJK>
+0x663A 0x95D2 # <CJK>
+0x663B 0x95D3 # <CJK>
+0x663C 0x95D9 # <CJK>
+0x663D 0x95DA # <CJK>
+0x663E 0x95DD # <CJK>
+0x663F 0x95DE # <CJK>
+0x6640 0x95DF # <CJK>
+0x6641 0x95E0 # <CJK>
+0x6642 0x95E4 # <CJK>
+0x6643 0x95E6 # <CJK>
+0x6644 0x961D # <CJK>
+0x6645 0x961E # <CJK>
+0x6646 0x9622 # <CJK>
+0x6647 0x9624 # <CJK>
+0x6648 0x9625 # <CJK>
+0x6649 0x9626 # <CJK>
+0x664A 0x962C # <CJK>
+0x664B 0x9631 # <CJK>
+0x664C 0x9633 # <CJK>
+0x664D 0x9637 # <CJK>
+0x664E 0x9638 # <CJK>
+0x664F 0x9639 # <CJK>
+0x6650 0x963A # <CJK>
+0x6651 0x963C # <CJK>
+0x6652 0x963D # <CJK>
+0x6653 0x9641 # <CJK>
+0x6654 0x9652 # <CJK>
+0x6655 0x9654 # <CJK>
+0x6656 0x9656 # <CJK>
+0x6657 0x9657 # <CJK>
+0x6658 0x9658 # <CJK>
+0x6659 0x9661 # <CJK>
+0x665A 0x966E # <CJK>
+0x665B 0x9674 # <CJK>
+0x665C 0x967B # <CJK>
+0x665D 0x967C # <CJK>
+0x665E 0x967E # <CJK>
+0x665F 0x967F # <CJK>
+0x6660 0x9681 # <CJK>
+0x6661 0x9682 # <CJK>
+0x6662 0x9683 # <CJK>
+0x6663 0x9684 # <CJK>
+0x6664 0x9689 # <CJK>
+0x6665 0x9691 # <CJK>
+0x6666 0x9696 # <CJK>
+0x6667 0x969A # <CJK>
+0x6668 0x969D # <CJK>
+0x6669 0x969F # <CJK>
+0x666A 0x96A4 # <CJK>
+0x666B 0x96A5 # <CJK>
+0x666C 0x96A6 # <CJK>
+0x666D 0x96A9 # <CJK>
+0x666E 0x96AE # <CJK>
+0x666F 0x96AF # <CJK>
+0x6670 0x96B3 # <CJK>
+0x6671 0x96BA # <CJK>
+0x6672 0x96CA # <CJK>
+0x6673 0x96D2 # <CJK>
+0x6674 0x5DB2 # <CJK>
+0x6675 0x96D8 # <CJK>
+0x6676 0x96DA # <CJK>
+0x6677 0x96DD # <CJK>
+0x6678 0x96DE # <CJK>
+0x6679 0x96DF # <CJK>
+0x667A 0x96E9 # <CJK>
+0x667B 0x96EF # <CJK>
+0x667C 0x96F1 # <CJK>
+0x667D 0x96FA # <CJK>
+0x667E 0x9702 # <CJK>
+0x6721 0x9703 # <CJK>
+0x6722 0x9705 # <CJK>
+0x6723 0x9709 # <CJK>
+0x6724 0x971A # <CJK>
+0x6725 0x971B # <CJK>
+0x6726 0x971D # <CJK>
+0x6727 0x9721 # <CJK>
+0x6728 0x9722 # <CJK>
+0x6729 0x9723 # <CJK>
+0x672A 0x9728 # <CJK>
+0x672B 0x9731 # <CJK>
+0x672C 0x9733 # <CJK>
+0x672D 0x9741 # <CJK>
+0x672E 0x9743 # <CJK>
+0x672F 0x974A # <CJK>
+0x6730 0x974E # <CJK>
+0x6731 0x974F # <CJK>
+0x6732 0x9755 # <CJK>
+0x6733 0x9757 # <CJK>
+0x6734 0x9758 # <CJK>
+0x6735 0x975A # <CJK>
+0x6736 0x975B # <CJK>
+0x6737 0x9763 # <CJK>
+0x6738 0x9767 # <CJK>
+0x6739 0x976A # <CJK>
+0x673A 0x976E # <CJK>
+0x673B 0x9773 # <CJK>
+0x673C 0x9776 # <CJK>
+0x673D 0x9777 # <CJK>
+0x673E 0x9778 # <CJK>
+0x673F 0x977B # <CJK>
+0x6740 0x977D # <CJK>
+0x6741 0x977F # <CJK>
+0x6742 0x9780 # <CJK>
+0x6743 0x9789 # <CJK>
+0x6744 0x9795 # <CJK>
+0x6745 0x9796 # <CJK>
+0x6746 0x9797 # <CJK>
+0x6747 0x9799 # <CJK>
+0x6748 0x979A # <CJK>
+0x6749 0x979E # <CJK>
+0x674A 0x979F # <CJK>
+0x674B 0x97A2 # <CJK>
+0x674C 0x97AC # <CJK>
+0x674D 0x97AE # <CJK>
+0x674E 0x97B1 # <CJK>
+0x674F 0x97B2 # <CJK>
+0x6750 0x97B5 # <CJK>
+0x6751 0x97B6 # <CJK>
+0x6752 0x97B8 # <CJK>
+0x6753 0x97B9 # <CJK>
+0x6754 0x97BA # <CJK>
+0x6755 0x97BC # <CJK>
+0x6756 0x97BE # <CJK>
+0x6757 0x97BF # <CJK>
+0x6758 0x97C1 # <CJK>
+0x6759 0x97C4 # <CJK>
+0x675A 0x97C5 # <CJK>
+0x675B 0x97C7 # <CJK>
+0x675C 0x97C9 # <CJK>
+0x675D 0x97CA # <CJK>
+0x675E 0x97CC # <CJK>
+0x675F 0x97CD # <CJK>
+0x6760 0x97CE # <CJK>
+0x6761 0x97D0 # <CJK>
+0x6762 0x97D1 # <CJK>
+0x6763 0x97D4 # <CJK>
+0x6764 0x97D7 # <CJK>
+0x6765 0x97D8 # <CJK>
+0x6766 0x97D9 # <CJK>
+0x6767 0x97DD # <CJK>
+0x6768 0x97DE # <CJK>
+0x6769 0x97E0 # <CJK>
+0x676A 0x97DB # <CJK>
+0x676B 0x97E1 # <CJK>
+0x676C 0x97E4 # <CJK>
+0x676D 0x97EF # <CJK>
+0x676E 0x97F1 # <CJK>
+0x676F 0x97F4 # <CJK>
+0x6770 0x97F7 # <CJK>
+0x6771 0x97F8 # <CJK>
+0x6772 0x97FA # <CJK>
+0x6773 0x9807 # <CJK>
+0x6774 0x980A # <CJK>
+0x6775 0x9819 # <CJK>
+0x6776 0x980D # <CJK>
+0x6777 0x980E # <CJK>
+0x6778 0x9814 # <CJK>
+0x6779 0x9816 # <CJK>
+0x677A 0x981C # <CJK>
+0x677B 0x981E # <CJK>
+0x677C 0x9820 # <CJK>
+0x677D 0x9823 # <CJK>
+0x677E 0x9826 # <CJK>
+0x6821 0x982B # <CJK>
+0x6822 0x982E # <CJK>
+0x6823 0x982F # <CJK>
+0x6824 0x9830 # <CJK>
+0x6825 0x9832 # <CJK>
+0x6826 0x9833 # <CJK>
+0x6827 0x9835 # <CJK>
+0x6828 0x9825 # <CJK>
+0x6829 0x983E # <CJK>
+0x682A 0x9844 # <CJK>
+0x682B 0x9847 # <CJK>
+0x682C 0x984A # <CJK>
+0x682D 0x9851 # <CJK>
+0x682E 0x9852 # <CJK>
+0x682F 0x9853 # <CJK>
+0x6830 0x9856 # <CJK>
+0x6831 0x9857 # <CJK>
+0x6832 0x9859 # <CJK>
+0x6833 0x985A # <CJK>
+0x6834 0x9862 # <CJK>
+0x6835 0x9863 # <CJK>
+0x6836 0x9865 # <CJK>
+0x6837 0x9866 # <CJK>
+0x6838 0x986A # <CJK>
+0x6839 0x986C # <CJK>
+0x683A 0x98AB # <CJK>
+0x683B 0x98AD # <CJK>
+0x683C 0x98AE # <CJK>
+0x683D 0x98B0 # <CJK>
+0x683E 0x98B4 # <CJK>
+0x683F 0x98B7 # <CJK>
+0x6840 0x98B8 # <CJK>
+0x6841 0x98BA # <CJK>
+0x6842 0x98BB # <CJK>
+0x6843 0x98BF # <CJK>
+0x6844 0x98C2 # <CJK>
+0x6845 0x98C5 # <CJK>
+0x6846 0x98C8 # <CJK>
+0x6847 0x98CC # <CJK>
+0x6848 0x98E1 # <CJK>
+0x6849 0x98E3 # <CJK>
+0x684A 0x98E5 # <CJK>
+0x684B 0x98E6 # <CJK>
+0x684C 0x98E7 # <CJK>
+0x684D 0x98EA # <CJK>
+0x684E 0x98F3 # <CJK>
+0x684F 0x98F6 # <CJK>
+0x6850 0x9902 # <CJK>
+0x6851 0x9907 # <CJK>
+0x6852 0x9908 # <CJK>
+0x6853 0x9911 # <CJK>
+0x6854 0x9915 # <CJK>
+0x6855 0x9916 # <CJK>
+0x6856 0x9917 # <CJK>
+0x6857 0x991A # <CJK>
+0x6858 0x991B # <CJK>
+0x6859 0x991C # <CJK>
+0x685A 0x991F # <CJK>
+0x685B 0x9922 # <CJK>
+0x685C 0x9926 # <CJK>
+0x685D 0x9927 # <CJK>
+0x685E 0x992B # <CJK>
+0x685F 0x9931 # <CJK>
+0x6860 0x9932 # <CJK>
+0x6861 0x9933 # <CJK>
+0x6862 0x9934 # <CJK>
+0x6863 0x9935 # <CJK>
+0x6864 0x9939 # <CJK>
+0x6865 0x993A # <CJK>
+0x6866 0x993B # <CJK>
+0x6867 0x993C # <CJK>
+0x6868 0x9940 # <CJK>
+0x6869 0x9941 # <CJK>
+0x686A 0x9946 # <CJK>
+0x686B 0x9947 # <CJK>
+0x686C 0x9948 # <CJK>
+0x686D 0x994D # <CJK>
+0x686E 0x994E # <CJK>
+0x686F 0x9954 # <CJK>
+0x6870 0x9958 # <CJK>
+0x6871 0x9959 # <CJK>
+0x6872 0x995B # <CJK>
+0x6873 0x995C # <CJK>
+0x6874 0x995E # <CJK>
+0x6875 0x995F # <CJK>
+0x6876 0x9960 # <CJK>
+0x6877 0x999B # <CJK>
+0x6878 0x999D # <CJK>
+0x6879 0x999F # <CJK>
+0x687A 0x99A6 # <CJK>
+0x687B 0x99B0 # <CJK>
+0x687C 0x99B1 # <CJK>
+0x687D 0x99B2 # <CJK>
+0x687E 0x99B5 # <CJK>
+0x6921 0x99B9 # <CJK>
+0x6922 0x99BA # <CJK>
+0x6923 0x99BD # <CJK>
+0x6924 0x99BF # <CJK>
+0x6925 0x99C3 # <CJK>
+0x6926 0x99C9 # <CJK>
+0x6927 0x99D3 # <CJK>
+0x6928 0x99D4 # <CJK>
+0x6929 0x99D9 # <CJK>
+0x692A 0x99DA # <CJK>
+0x692B 0x99DC # <CJK>
+0x692C 0x99DE # <CJK>
+0x692D 0x99E7 # <CJK>
+0x692E 0x99EA # <CJK>
+0x692F 0x99EB # <CJK>
+0x6930 0x99EC # <CJK>
+0x6931 0x99F0 # <CJK>
+0x6932 0x99F4 # <CJK>
+0x6933 0x99F5 # <CJK>
+0x6934 0x99F9 # <CJK>
+0x6935 0x99FD # <CJK>
+0x6936 0x99FE # <CJK>
+0x6937 0x9A02 # <CJK>
+0x6938 0x9A03 # <CJK>
+0x6939 0x9A04 # <CJK>
+0x693A 0x9A0B # <CJK>
+0x693B 0x9A0C # <CJK>
+0x693C 0x9A10 # <CJK>
+0x693D 0x9A11 # <CJK>
+0x693E 0x9A16 # <CJK>
+0x693F 0x9A1E # <CJK>
+0x6940 0x9A20 # <CJK>
+0x6941 0x9A22 # <CJK>
+0x6942 0x9A23 # <CJK>
+0x6943 0x9A24 # <CJK>
+0x6944 0x9A27 # <CJK>
+0x6945 0x9A2D # <CJK>
+0x6946 0x9A2E # <CJK>
+0x6947 0x9A33 # <CJK>
+0x6948 0x9A35 # <CJK>
+0x6949 0x9A36 # <CJK>
+0x694A 0x9A38 # <CJK>
+0x694B 0x9A47 # <CJK>
+0x694C 0x9A41 # <CJK>
+0x694D 0x9A44 # <CJK>
+0x694E 0x9A4A # <CJK>
+0x694F 0x9A4B # <CJK>
+0x6950 0x9A4C # <CJK>
+0x6951 0x9A4E # <CJK>
+0x6952 0x9A51 # <CJK>
+0x6953 0x9A54 # <CJK>
+0x6954 0x9A56 # <CJK>
+0x6955 0x9A5D # <CJK>
+0x6956 0x9AAA # <CJK>
+0x6957 0x9AAC # <CJK>
+0x6958 0x9AAE # <CJK>
+0x6959 0x9AAF # <CJK>
+0x695A 0x9AB2 # <CJK>
+0x695B 0x9AB4 # <CJK>
+0x695C 0x9AB5 # <CJK>
+0x695D 0x9AB6 # <CJK>
+0x695E 0x9AB9 # <CJK>
+0x695F 0x9ABB # <CJK>
+0x6960 0x9ABE # <CJK>
+0x6961 0x9ABF # <CJK>
+0x6962 0x9AC1 # <CJK>
+0x6963 0x9AC3 # <CJK>
+0x6964 0x9AC6 # <CJK>
+0x6965 0x9AC8 # <CJK>
+0x6966 0x9ACE # <CJK>
+0x6967 0x9AD0 # <CJK>
+0x6968 0x9AD2 # <CJK>
+0x6969 0x9AD5 # <CJK>
+0x696A 0x9AD6 # <CJK>
+0x696B 0x9AD7 # <CJK>
+0x696C 0x9ADB # <CJK>
+0x696D 0x9ADC # <CJK>
+0x696E 0x9AE0 # <CJK>
+0x696F 0x9AE4 # <CJK>
+0x6970 0x9AE5 # <CJK>
+0x6971 0x9AE7 # <CJK>
+0x6972 0x9AE9 # <CJK>
+0x6973 0x9AEC # <CJK>
+0x6974 0x9AF2 # <CJK>
+0x6975 0x9AF3 # <CJK>
+0x6976 0x9AF5 # <CJK>
+0x6977 0x9AF9 # <CJK>
+0x6978 0x9AFA # <CJK>
+0x6979 0x9AFD # <CJK>
+0x697A 0x9AFF # <CJK>
+0x697B 0x9B00 # <CJK>
+0x697C 0x9B01 # <CJK>
+0x697D 0x9B02 # <CJK>
+0x697E 0x9B03 # <CJK>
+0x6A21 0x9B04 # <CJK>
+0x6A22 0x9B05 # <CJK>
+0x6A23 0x9B08 # <CJK>
+0x6A24 0x9B09 # <CJK>
+0x6A25 0x9B0B # <CJK>
+0x6A26 0x9B0C # <CJK>
+0x6A27 0x9B0D # <CJK>
+0x6A28 0x9B0E # <CJK>
+0x6A29 0x9B10 # <CJK>
+0x6A2A 0x9B12 # <CJK>
+0x6A2B 0x9B16 # <CJK>
+0x6A2C 0x9B19 # <CJK>
+0x6A2D 0x9B1B # <CJK>
+0x6A2E 0x9B1C # <CJK>
+0x6A2F 0x9B20 # <CJK>
+0x6A30 0x9B26 # <CJK>
+0x6A31 0x9B2B # <CJK>
+0x6A32 0x9B2D # <CJK>
+0x6A33 0x9B33 # <CJK>
+0x6A34 0x9B34 # <CJK>
+0x6A35 0x9B35 # <CJK>
+0x6A36 0x9B37 # <CJK>
+0x6A37 0x9B39 # <CJK>
+0x6A38 0x9B3A # <CJK>
+0x6A39 0x9B3D # <CJK>
+0x6A3A 0x9B48 # <CJK>
+0x6A3B 0x9B4B # <CJK>
+0x6A3C 0x9B4C # <CJK>
+0x6A3D 0x9B55 # <CJK>
+0x6A3E 0x9B56 # <CJK>
+0x6A3F 0x9B57 # <CJK>
+0x6A40 0x9B5B # <CJK>
+0x6A41 0x9B5E # <CJK>
+0x6A42 0x9B61 # <CJK>
+0x6A43 0x9B63 # <CJK>
+0x6A44 0x9B65 # <CJK>
+0x6A45 0x9B66 # <CJK>
+0x6A46 0x9B68 # <CJK>
+0x6A47 0x9B6A # <CJK>
+0x6A48 0x9B6B # <CJK>
+0x6A49 0x9B6C # <CJK>
+0x6A4A 0x9B6D # <CJK>
+0x6A4B 0x9B6E # <CJK>
+0x6A4C 0x9B73 # <CJK>
+0x6A4D 0x9B75 # <CJK>
+0x6A4E 0x9B77 # <CJK>
+0x6A4F 0x9B78 # <CJK>
+0x6A50 0x9B79 # <CJK>
+0x6A51 0x9B7F # <CJK>
+0x6A52 0x9B80 # <CJK>
+0x6A53 0x9B84 # <CJK>
+0x6A54 0x9B85 # <CJK>
+0x6A55 0x9B86 # <CJK>
+0x6A56 0x9B87 # <CJK>
+0x6A57 0x9B89 # <CJK>
+0x6A58 0x9B8A # <CJK>
+0x6A59 0x9B8B # <CJK>
+0x6A5A 0x9B8D # <CJK>
+0x6A5B 0x9B8F # <CJK>
+0x6A5C 0x9B90 # <CJK>
+0x6A5D 0x9B94 # <CJK>
+0x6A5E 0x9B9A # <CJK>
+0x6A5F 0x9B9D # <CJK>
+0x6A60 0x9B9E # <CJK>
+0x6A61 0x9BA6 # <CJK>
+0x6A62 0x9BA7 # <CJK>
+0x6A63 0x9BA9 # <CJK>
+0x6A64 0x9BAC # <CJK>
+0x6A65 0x9BB0 # <CJK>
+0x6A66 0x9BB1 # <CJK>
+0x6A67 0x9BB2 # <CJK>
+0x6A68 0x9BB7 # <CJK>
+0x6A69 0x9BB8 # <CJK>
+0x6A6A 0x9BBB # <CJK>
+0x6A6B 0x9BBC # <CJK>
+0x6A6C 0x9BBE # <CJK>
+0x6A6D 0x9BBF # <CJK>
+0x6A6E 0x9BC1 # <CJK>
+0x6A6F 0x9BC7 # <CJK>
+0x6A70 0x9BC8 # <CJK>
+0x6A71 0x9BCE # <CJK>
+0x6A72 0x9BD0 # <CJK>
+0x6A73 0x9BD7 # <CJK>
+0x6A74 0x9BD8 # <CJK>
+0x6A75 0x9BDD # <CJK>
+0x6A76 0x9BDF # <CJK>
+0x6A77 0x9BE5 # <CJK>
+0x6A78 0x9BE7 # <CJK>
+0x6A79 0x9BEA # <CJK>
+0x6A7A 0x9BEB # <CJK>
+0x6A7B 0x9BEF # <CJK>
+0x6A7C 0x9BF3 # <CJK>
+0x6A7D 0x9BF7 # <CJK>
+0x6A7E 0x9BF8 # <CJK>
+0x6B21 0x9BF9 # <CJK>
+0x6B22 0x9BFA # <CJK>
+0x6B23 0x9BFD # <CJK>
+0x6B24 0x9BFF # <CJK>
+0x6B25 0x9C00 # <CJK>
+0x6B26 0x9C02 # <CJK>
+0x6B27 0x9C0B # <CJK>
+0x6B28 0x9C0F # <CJK>
+0x6B29 0x9C11 # <CJK>
+0x6B2A 0x9C16 # <CJK>
+0x6B2B 0x9C18 # <CJK>
+0x6B2C 0x9C19 # <CJK>
+0x6B2D 0x9C1A # <CJK>
+0x6B2E 0x9C1C # <CJK>
+0x6B2F 0x9C1E # <CJK>
+0x6B30 0x9C22 # <CJK>
+0x6B31 0x9C23 # <CJK>
+0x6B32 0x9C26 # <CJK>
+0x6B33 0x9C27 # <CJK>
+0x6B34 0x9C28 # <CJK>
+0x6B35 0x9C29 # <CJK>
+0x6B36 0x9C2A # <CJK>
+0x6B37 0x9C31 # <CJK>
+0x6B38 0x9C35 # <CJK>
+0x6B39 0x9C36 # <CJK>
+0x6B3A 0x9C37 # <CJK>
+0x6B3B 0x9C3D # <CJK>
+0x6B3C 0x9C41 # <CJK>
+0x6B3D 0x9C43 # <CJK>
+0x6B3E 0x9C44 # <CJK>
+0x6B3F 0x9C45 # <CJK>
+0x6B40 0x9C49 # <CJK>
+0x6B41 0x9C4A # <CJK>
+0x6B42 0x9C4E # <CJK>
+0x6B43 0x9C4F # <CJK>
+0x6B44 0x9C50 # <CJK>
+0x6B45 0x9C53 # <CJK>
+0x6B46 0x9C54 # <CJK>
+0x6B47 0x9C56 # <CJK>
+0x6B48 0x9C58 # <CJK>
+0x6B49 0x9C5B # <CJK>
+0x6B4A 0x9C5D # <CJK>
+0x6B4B 0x9C5E # <CJK>
+0x6B4C 0x9C5F # <CJK>
+0x6B4D 0x9C63 # <CJK>
+0x6B4E 0x9C69 # <CJK>
+0x6B4F 0x9C6A # <CJK>
+0x6B50 0x9C5C # <CJK>
+0x6B51 0x9C6B # <CJK>
+0x6B52 0x9C68 # <CJK>
+0x6B53 0x9C6E # <CJK>
+0x6B54 0x9C70 # <CJK>
+0x6B55 0x9C72 # <CJK>
+0x6B56 0x9C75 # <CJK>
+0x6B57 0x9C77 # <CJK>
+0x6B58 0x9C7B # <CJK>
+0x6B59 0x9CE6 # <CJK>
+0x6B5A 0x9CF2 # <CJK>
+0x6B5B 0x9CF7 # <CJK>
+0x6B5C 0x9CF9 # <CJK>
+0x6B5D 0x9D0B # <CJK>
+0x6B5E 0x9D02 # <CJK>
+0x6B5F 0x9D11 # <CJK>
+0x6B60 0x9D17 # <CJK>
+0x6B61 0x9D18 # <CJK>
+0x6B62 0x9D1C # <CJK>
+0x6B63 0x9D1D # <CJK>
+0x6B64 0x9D1E # <CJK>
+0x6B65 0x9D2F # <CJK>
+0x6B66 0x9D30 # <CJK>
+0x6B67 0x9D32 # <CJK>
+0x6B68 0x9D33 # <CJK>
+0x6B69 0x9D34 # <CJK>
+0x6B6A 0x9D3A # <CJK>
+0x6B6B 0x9D3C # <CJK>
+0x6B6C 0x9D45 # <CJK>
+0x6B6D 0x9D3D # <CJK>
+0x6B6E 0x9D42 # <CJK>
+0x6B6F 0x9D43 # <CJK>
+0x6B70 0x9D47 # <CJK>
+0x6B71 0x9D4A # <CJK>
+0x6B72 0x9D53 # <CJK>
+0x6B73 0x9D54 # <CJK>
+0x6B74 0x9D5F # <CJK>
+0x6B75 0x9D63 # <CJK>
+0x6B76 0x9D62 # <CJK>
+0x6B77 0x9D65 # <CJK>
+0x6B78 0x9D69 # <CJK>
+0x6B79 0x9D6A # <CJK>
+0x6B7A 0x9D6B # <CJK>
+0x6B7B 0x9D70 # <CJK>
+0x6B7C 0x9D76 # <CJK>
+0x6B7D 0x9D77 # <CJK>
+0x6B7E 0x9D7B # <CJK>
+0x6C21 0x9D7C # <CJK>
+0x6C22 0x9D7E # <CJK>
+0x6C23 0x9D83 # <CJK>
+0x6C24 0x9D84 # <CJK>
+0x6C25 0x9D86 # <CJK>
+0x6C26 0x9D8A # <CJK>
+0x6C27 0x9D8D # <CJK>
+0x6C28 0x9D8E # <CJK>
+0x6C29 0x9D92 # <CJK>
+0x6C2A 0x9D93 # <CJK>
+0x6C2B 0x9D95 # <CJK>
+0x6C2C 0x9D96 # <CJK>
+0x6C2D 0x9D97 # <CJK>
+0x6C2E 0x9D98 # <CJK>
+0x6C2F 0x9DA1 # <CJK>
+0x6C30 0x9DAA # <CJK>
+0x6C31 0x9DAC # <CJK>
+0x6C32 0x9DAE # <CJK>
+0x6C33 0x9DB1 # <CJK>
+0x6C34 0x9DB5 # <CJK>
+0x6C35 0x9DB9 # <CJK>
+0x6C36 0x9DBC # <CJK>
+0x6C37 0x9DBF # <CJK>
+0x6C38 0x9DC3 # <CJK>
+0x6C39 0x9DC7 # <CJK>
+0x6C3A 0x9DC9 # <CJK>
+0x6C3B 0x9DCA # <CJK>
+0x6C3C 0x9DD4 # <CJK>
+0x6C3D 0x9DD5 # <CJK>
+0x6C3E 0x9DD6 # <CJK>
+0x6C3F 0x9DD7 # <CJK>
+0x6C40 0x9DDA # <CJK>
+0x6C41 0x9DDE # <CJK>
+0x6C42 0x9DDF # <CJK>
+0x6C43 0x9DE0 # <CJK>
+0x6C44 0x9DE5 # <CJK>
+0x6C45 0x9DE7 # <CJK>
+0x6C46 0x9DE9 # <CJK>
+0x6C47 0x9DEB # <CJK>
+0x6C48 0x9DEE # <CJK>
+0x6C49 0x9DF0 # <CJK>
+0x6C4A 0x9DF3 # <CJK>
+0x6C4B 0x9DF4 # <CJK>
+0x6C4C 0x9DFE # <CJK>
+0x6C4D 0x9E0A # <CJK>
+0x6C4E 0x9E02 # <CJK>
+0x6C4F 0x9E07 # <CJK>
+0x6C50 0x9E0E # <CJK>
+0x6C51 0x9E10 # <CJK>
+0x6C52 0x9E11 # <CJK>
+0x6C53 0x9E12 # <CJK>
+0x6C54 0x9E15 # <CJK>
+0x6C55 0x9E16 # <CJK>
+0x6C56 0x9E19 # <CJK>
+0x6C57 0x9E1C # <CJK>
+0x6C58 0x9E1D # <CJK>
+0x6C59 0x9E7A # <CJK>
+0x6C5A 0x9E7B # <CJK>
+0x6C5B 0x9E7C # <CJK>
+0x6C5C 0x9E80 # <CJK>
+0x6C5D 0x9E82 # <CJK>
+0x6C5E 0x9E83 # <CJK>
+0x6C5F 0x9E84 # <CJK>
+0x6C60 0x9E85 # <CJK>
+0x6C61 0x9E87 # <CJK>
+0x6C62 0x9E8E # <CJK>
+0x6C63 0x9E8F # <CJK>
+0x6C64 0x9E96 # <CJK>
+0x6C65 0x9E98 # <CJK>
+0x6C66 0x9E9B # <CJK>
+0x6C67 0x9E9E # <CJK>
+0x6C68 0x9EA4 # <CJK>
+0x6C69 0x9EA8 # <CJK>
+0x6C6A 0x9EAC # <CJK>
+0x6C6B 0x9EAE # <CJK>
+0x6C6C 0x9EAF # <CJK>
+0x6C6D 0x9EB0 # <CJK>
+0x6C6E 0x9EB3 # <CJK>
+0x6C6F 0x9EB4 # <CJK>
+0x6C70 0x9EB5 # <CJK>
+0x6C71 0x9EC6 # <CJK>
+0x6C72 0x9EC8 # <CJK>
+0x6C73 0x9ECB # <CJK>
+0x6C74 0x9ED5 # <CJK>
+0x6C75 0x9EDF # <CJK>
+0x6C76 0x9EE4 # <CJK>
+0x6C77 0x9EE7 # <CJK>
+0x6C78 0x9EEC # <CJK>
+0x6C79 0x9EED # <CJK>
+0x6C7A 0x9EEE # <CJK>
+0x6C7B 0x9EF0 # <CJK>
+0x6C7C 0x9EF1 # <CJK>
+0x6C7D 0x9EF2 # <CJK>
+0x6C7E 0x9EF5 # <CJK>
+0x6D21 0x9EF8 # <CJK>
+0x6D22 0x9EFF # <CJK>
+0x6D23 0x9F02 # <CJK>
+0x6D24 0x9F03 # <CJK>
+0x6D25 0x9F09 # <CJK>
+0x6D26 0x9F0F # <CJK>
+0x6D27 0x9F10 # <CJK>
+0x6D28 0x9F11 # <CJK>
+0x6D29 0x9F12 # <CJK>
+0x6D2A 0x9F14 # <CJK>
+0x6D2B 0x9F16 # <CJK>
+0x6D2C 0x9F17 # <CJK>
+0x6D2D 0x9F19 # <CJK>
+0x6D2E 0x9F1A # <CJK>
+0x6D2F 0x9F1B # <CJK>
+0x6D30 0x9F1F # <CJK>
+0x6D31 0x9F22 # <CJK>
+0x6D32 0x9F26 # <CJK>
+0x6D33 0x9F2A # <CJK>
+0x6D34 0x9F2B # <CJK>
+0x6D35 0x9F2F # <CJK>
+0x6D36 0x9F31 # <CJK>
+0x6D37 0x9F32 # <CJK>
+0x6D38 0x9F34 # <CJK>
+0x6D39 0x9F37 # <CJK>
+0x6D3A 0x9F39 # <CJK>
+0x6D3B 0x9F3A # <CJK>
+0x6D3C 0x9F3C # <CJK>
+0x6D3D 0x9F3D # <CJK>
+0x6D3E 0x9F3F # <CJK>
+0x6D3F 0x9F41 # <CJK>
+0x6D40 0x9F43 # <CJK>
+0x6D41 0x9F44 # <CJK>
+0x6D42 0x9F45 # <CJK>
+0x6D43 0x9F46 # <CJK>
+0x6D44 0x9F47 # <CJK>
+0x6D45 0x9F53 # <CJK>
+0x6D46 0x9F55 # <CJK>
+0x6D47 0x9F56 # <CJK>
+0x6D48 0x9F57 # <CJK>
+0x6D49 0x9F58 # <CJK>
+0x6D4A 0x9F5A # <CJK>
+0x6D4B 0x9F5D # <CJK>
+0x6D4C 0x9F5E # <CJK>
+0x6D4D 0x9F68 # <CJK>
+0x6D4E 0x9F69 # <CJK>
+0x6D4F 0x9F6D # <CJK>
+0x6D50 0x9F6E # <CJK>
+0x6D51 0x9F6F # <CJK>
+0x6D52 0x9F70 # <CJK>
+0x6D53 0x9F71 # <CJK>
+0x6D54 0x9F73 # <CJK>
+0x6D55 0x9F75 # <CJK>
+0x6D56 0x9F7A # <CJK>
+0x6D57 0x9F7D # <CJK>
+0x6D58 0x9F8F # <CJK>
+0x6D59 0x9F90 # <CJK>
+0x6D5A 0x9F91 # <CJK>
+0x6D5B 0x9F92 # <CJK>
+0x6D5C 0x9F94 # <CJK>
+0x6D5D 0x9F96 # <CJK>
+0x6D5E 0x9F97 # <CJK>
+0x6D5F 0x9F9E # <CJK>
+0x6D60 0x9FA1 # <CJK>
+0x6D61 0x9FA2 # <CJK>
+0x6D62 0x9FA3 # <CJK>
+0x6D63 0x9FA5 # <CJK>
diff --git a/ext/mbstring/tests/data/KOI8-R.txt b/ext/mbstring/tests/data/KOI8-R.txt
new file mode 100644
index 0000000000..2a1afb70d9
--- /dev/null
+++ b/ext/mbstring/tests/data/KOI8-R.txt
@@ -0,0 +1,294 @@
+# KOI8-R.TXT
+# Date: 2016-01-04 23:05:00 GMT [KW]
+# © 2016 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: KOI8-R (RFC1489) to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 18 August 1999 (header updated: 2016-January-04)
+# Authors: Helmut Richter <richter@lrz.de>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# KOI8-R characters map into Unicode. The underlying document is the
+# mapping described in RFC 1489. No statements are made as to whether
+# this mapping is the same as the mapping defined as "Code Page 878"
+# with some vendors.
+#
+# Format: Three tab-separated columns
+# Column #1 is the KOI8-R code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in KOI8-R order.
+#
+# Version history
+# 1.0 version: created.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
+0x81 0x2502 # BOX DRAWINGS LIGHT VERTICAL
+0x82 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x83 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
+0x85 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
+0x86 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x87 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x88 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x89 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x8A 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x8B 0x2580 # UPPER HALF BLOCK
+0x8C 0x2584 # LOWER HALF BLOCK
+0x8D 0x2588 # FULL BLOCK
+0x8E 0x258C # LEFT HALF BLOCK
+0x8F 0x2590 # RIGHT HALF BLOCK
+0x90 0x2591 # LIGHT SHADE
+0x91 0x2592 # MEDIUM SHADE
+0x92 0x2593 # DARK SHADE
+0x93 0x2320 # TOP HALF INTEGRAL
+0x94 0x25A0 # BLACK SQUARE
+0x95 0x2219 # BULLET OPERATOR
+0x96 0x221A # SQUARE ROOT
+0x97 0x2248 # ALMOST EQUAL TO
+0x98 0x2264 # LESS-THAN OR EQUAL TO
+0x99 0x2265 # GREATER-THAN OR EQUAL TO
+0x9A 0x00A0 # NO-BREAK SPACE
+0x9B 0x2321 # BOTTOM HALF INTEGRAL
+0x9C 0x00B0 # DEGREE SIGN
+0x9D 0x00B2 # SUPERSCRIPT TWO
+0x9E 0x00B7 # MIDDLE DOT
+0x9F 0x00F7 # DIVISION SIGN
+0xA0 0x2550 # BOX DRAWINGS DOUBLE HORIZONTAL
+0xA1 0x2551 # BOX DRAWINGS DOUBLE VERTICAL
+0xA2 0x2552 # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xA3 0x0451 # CYRILLIC SMALL LETTER IO
+0xA4 0x2553 # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xA5 0x2554 # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xA6 0x2555 # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xA7 0x2556 # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xA8 0x2557 # BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xA9 0x2558 # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xAA 0x2559 # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xAB 0x255A # BOX DRAWINGS DOUBLE UP AND RIGHT
+0xAC 0x255B # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xAD 0x255C # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xAE 0x255D # BOX DRAWINGS DOUBLE UP AND LEFT
+0xAF 0x255E # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xB0 0x255F # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xB1 0x2560 # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xB2 0x2561 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xB3 0x0401 # CYRILLIC CAPITAL LETTER IO
+0xB4 0x2562 # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xB5 0x2563 # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xB6 0x2564 # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xB7 0x2565 # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xB8 0x2566 # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xB9 0x2567 # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xBA 0x2568 # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xBB 0x2569 # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xBC 0x256A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xBD 0x256B # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xBE 0x256C # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xBF 0x00A9 # COPYRIGHT SIGN
+0xC0 0x044E # CYRILLIC SMALL LETTER YU
+0xC1 0x0430 # CYRILLIC SMALL LETTER A
+0xC2 0x0431 # CYRILLIC SMALL LETTER BE
+0xC3 0x0446 # CYRILLIC SMALL LETTER TSE
+0xC4 0x0434 # CYRILLIC SMALL LETTER DE
+0xC5 0x0435 # CYRILLIC SMALL LETTER IE
+0xC6 0x0444 # CYRILLIC SMALL LETTER EF
+0xC7 0x0433 # CYRILLIC SMALL LETTER GHE
+0xC8 0x0445 # CYRILLIC SMALL LETTER HA
+0xC9 0x0438 # CYRILLIC SMALL LETTER I
+0xCA 0x0439 # CYRILLIC SMALL LETTER SHORT I
+0xCB 0x043A # CYRILLIC SMALL LETTER KA
+0xCC 0x043B # CYRILLIC SMALL LETTER EL
+0xCD 0x043C # CYRILLIC SMALL LETTER EM
+0xCE 0x043D # CYRILLIC SMALL LETTER EN
+0xCF 0x043E # CYRILLIC SMALL LETTER O
+0xD0 0x043F # CYRILLIC SMALL LETTER PE
+0xD1 0x044F # CYRILLIC SMALL LETTER YA
+0xD2 0x0440 # CYRILLIC SMALL LETTER ER
+0xD3 0x0441 # CYRILLIC SMALL LETTER ES
+0xD4 0x0442 # CYRILLIC SMALL LETTER TE
+0xD5 0x0443 # CYRILLIC SMALL LETTER U
+0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE
+0xD7 0x0432 # CYRILLIC SMALL LETTER VE
+0xD8 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
+0xD9 0x044B # CYRILLIC SMALL LETTER YERU
+0xDA 0x0437 # CYRILLIC SMALL LETTER ZE
+0xDB 0x0448 # CYRILLIC SMALL LETTER SHA
+0xDC 0x044D # CYRILLIC SMALL LETTER E
+0xDD 0x0449 # CYRILLIC SMALL LETTER SHCHA
+0xDE 0x0447 # CYRILLIC SMALL LETTER CHE
+0xDF 0x044A # CYRILLIC SMALL LETTER HARD SIGN
+0xE0 0x042E # CYRILLIC CAPITAL LETTER YU
+0xE1 0x0410 # CYRILLIC CAPITAL LETTER A
+0xE2 0x0411 # CYRILLIC CAPITAL LETTER BE
+0xE3 0x0426 # CYRILLIC CAPITAL LETTER TSE
+0xE4 0x0414 # CYRILLIC CAPITAL LETTER DE
+0xE5 0x0415 # CYRILLIC CAPITAL LETTER IE
+0xE6 0x0424 # CYRILLIC CAPITAL LETTER EF
+0xE7 0x0413 # CYRILLIC CAPITAL LETTER GHE
+0xE8 0x0425 # CYRILLIC CAPITAL LETTER HA
+0xE9 0x0418 # CYRILLIC CAPITAL LETTER I
+0xEA 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
+0xEB 0x041A # CYRILLIC CAPITAL LETTER KA
+0xEC 0x041B # CYRILLIC CAPITAL LETTER EL
+0xED 0x041C # CYRILLIC CAPITAL LETTER EM
+0xEE 0x041D # CYRILLIC CAPITAL LETTER EN
+0xEF 0x041E # CYRILLIC CAPITAL LETTER O
+0xF0 0x041F # CYRILLIC CAPITAL LETTER PE
+0xF1 0x042F # CYRILLIC CAPITAL LETTER YA
+0xF2 0x0420 # CYRILLIC CAPITAL LETTER ER
+0xF3 0x0421 # CYRILLIC CAPITAL LETTER ES
+0xF4 0x0422 # CYRILLIC CAPITAL LETTER TE
+0xF5 0x0423 # CYRILLIC CAPITAL LETTER U
+0xF6 0x0416 # CYRILLIC CAPITAL LETTER ZHE
+0xF7 0x0412 # CYRILLIC CAPITAL LETTER VE
+0xF8 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0xF9 0x042B # CYRILLIC CAPITAL LETTER YERU
+0xFA 0x0417 # CYRILLIC CAPITAL LETTER ZE
+0xFB 0x0428 # CYRILLIC CAPITAL LETTER SHA
+0xFC 0x042D # CYRILLIC CAPITAL LETTER E
+0xFD 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
+0xFE 0x0427 # CYRILLIC CAPITAL LETTER CHE
+0xFF 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
diff --git a/ext/mbstring/tests/data/KOI8-U.txt b/ext/mbstring/tests/data/KOI8-U.txt
new file mode 100644
index 0000000000..c533b39409
--- /dev/null
+++ b/ext/mbstring/tests/data/KOI8-U.txt
@@ -0,0 +1,301 @@
+# KOI8-U.TXT
+# Date: 2016-01-04 23:09:00 GMT [KW]
+# © 2016 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+#
+# Name: KOI8-U (RFC2319) to Unicode
+# Unicode version: 5.1
+# Table version: 2.0
+# Table format: Format A
+# Date: 13 October 2008 (header updated: 2016-January-04)
+# Authors: Philippe Verdy <verdy_p AT wanadoo.fr>,
+# Helmut Richter <richter@lrz.de>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# KOI8-U characters map into Unicode. The underlying document is the
+# mapping described in RFC 2319. No statements are made as to whether
+# this mapping is the same as the mapping defined as "Code Page 878"
+# with some vendors.
+#
+# The KOI8-U (RFC2319) encoding is a variant based on KOI8-R (RFC1489),
+# where the support for four additional Cyrillic letters was added (both small
+# and capital letters), replacing 8 box-drawing characters. It is still widely
+# used to encode texts in Ukrainian, Byelorussian and Bulgarian.
+#
+# Format: Three tab-separated columns
+# Column #1 is the KOI8-U code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in KOI8-U order.
+#
+# Version history
+# 1.0 version: created.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# <http://www.unicode.org/Public/MAPPINGS/>
+#
+# Any comments or problems, contact the Unicode Consortium at:
+# <http://www.unicode.org/reporting.html>
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
+0x81 0x2502 # BOX DRAWINGS LIGHT VERTICAL
+0x82 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x83 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
+0x85 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
+0x86 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x87 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x88 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x89 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x8A 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x8B 0x2580 # UPPER HALF BLOCK
+0x8C 0x2584 # LOWER HALF BLOCK
+0x8D 0x2588 # FULL BLOCK
+0x8E 0x258C # LEFT HALF BLOCK
+0x8F 0x2590 # RIGHT HALF BLOCK
+0x90 0x2591 # LIGHT SHADE
+0x91 0x2592 # MEDIUM SHADE
+0x92 0x2593 # DARK SHADE
+0x93 0x2320 # TOP HALF INTEGRAL
+0x94 0x25A0 # BLACK SQUARE
+0x95 0x2219 # BULLET OPERATOR
+0x96 0x221A # SQUARE ROOT
+0x97 0x2248 # ALMOST EQUAL TO
+0x98 0x2264 # LESS-THAN OR EQUAL TO
+0x99 0x2265 # GREATER-THAN OR EQUAL TO
+0x9A 0x00A0 # NO-BREAK SPACE
+0x9B 0x2321 # BOTTOM HALF INTEGRAL
+0x9C 0x00B0 # DEGREE SIGN
+0x9D 0x00B2 # SUPERSCRIPT TWO
+0x9E 0x00B7 # MIDDLE DOT
+0x9F 0x00F7 # DIVISION SIGN
+0xA0 0x2550 # BOX DRAWINGS DOUBLE HORIZONTAL
+0xA1 0x2551 # BOX DRAWINGS DOUBLE VERTICAL
+0xA2 0x2552 # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xA3 0x0451 # CYRILLIC SMALL LETTER IO
+0xA4 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE
+0xA5 0x2554 # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xA6 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xA7 0x0457 # CYRILLIC SMALL LETTER YI (UKRAINIAN)
+0xA8 0x2557 # BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xA9 0x2558 # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xAA 0x2559 # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xAB 0x255A # BOX DRAWINGS DOUBLE UP AND RIGHT
+0xAC 0x255B # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xAD 0x0491 # CYRILLIC SMALL LETTER GHE WITH UPTURN
+0xAE 0x255D # BOX DRAWINGS DOUBLE UP AND LEFT
+0xAF 0x255E # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xB0 0x255F # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xB1 0x2560 # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xB2 0x2561 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xB3 0x0401 # CYRILLIC CAPITAL LETTER IO
+0xB4 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xB5 0x2563 # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xB6 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xB7 0x0407 # CYRILLIC CAPITAL LETTER YI (UKRAINIAN)
+0xB8 0x2566 # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xB9 0x2567 # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xBA 0x2568 # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xBB 0x2569 # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xBC 0x256A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xBD 0x0490 # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0xBE 0x256C # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xBF 0x00A9 # COPYRIGHT SIGN
+0xC0 0x044E # CYRILLIC SMALL LETTER YU
+0xC1 0x0430 # CYRILLIC SMALL LETTER A
+0xC2 0x0431 # CYRILLIC SMALL LETTER BE
+0xC3 0x0446 # CYRILLIC SMALL LETTER TSE
+0xC4 0x0434 # CYRILLIC SMALL LETTER DE
+0xC5 0x0435 # CYRILLIC SMALL LETTER IE
+0xC6 0x0444 # CYRILLIC SMALL LETTER EF
+0xC7 0x0433 # CYRILLIC SMALL LETTER GHE
+0xC8 0x0445 # CYRILLIC SMALL LETTER HA
+0xC9 0x0438 # CYRILLIC SMALL LETTER I
+0xCA 0x0439 # CYRILLIC SMALL LETTER SHORT I
+0xCB 0x043A # CYRILLIC SMALL LETTER KA
+0xCC 0x043B # CYRILLIC SMALL LETTER EL
+0xCD 0x043C # CYRILLIC SMALL LETTER EM
+0xCE 0x043D # CYRILLIC SMALL LETTER EN
+0xCF 0x043E # CYRILLIC SMALL LETTER O
+0xD0 0x043F # CYRILLIC SMALL LETTER PE
+0xD1 0x044F # CYRILLIC SMALL LETTER YA
+0xD2 0x0440 # CYRILLIC SMALL LETTER ER
+0xD3 0x0441 # CYRILLIC SMALL LETTER ES
+0xD4 0x0442 # CYRILLIC SMALL LETTER TE
+0xD5 0x0443 # CYRILLIC SMALL LETTER U
+0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE
+0xD7 0x0432 # CYRILLIC SMALL LETTER VE
+0xD8 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
+0xD9 0x044B # CYRILLIC SMALL LETTER YERU
+0xDA 0x0437 # CYRILLIC SMALL LETTER ZE
+0xDB 0x0448 # CYRILLIC SMALL LETTER SHA
+0xDC 0x044D # CYRILLIC SMALL LETTER E
+0xDD 0x0449 # CYRILLIC SMALL LETTER SHCHA
+0xDE 0x0447 # CYRILLIC SMALL LETTER CHE
+0xDF 0x044A # CYRILLIC SMALL LETTER HARD SIGN
+0xE0 0x042E # CYRILLIC CAPITAL LETTER YU
+0xE1 0x0410 # CYRILLIC CAPITAL LETTER A
+0xE2 0x0411 # CYRILLIC CAPITAL LETTER BE
+0xE3 0x0426 # CYRILLIC CAPITAL LETTER TSE
+0xE4 0x0414 # CYRILLIC CAPITAL LETTER DE
+0xE5 0x0415 # CYRILLIC CAPITAL LETTER IE
+0xE6 0x0424 # CYRILLIC CAPITAL LETTER EF
+0xE7 0x0413 # CYRILLIC CAPITAL LETTER GHE
+0xE8 0x0425 # CYRILLIC CAPITAL LETTER HA
+0xE9 0x0418 # CYRILLIC CAPITAL LETTER I
+0xEA 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
+0xEB 0x041A # CYRILLIC CAPITAL LETTER KA
+0xEC 0x041B # CYRILLIC CAPITAL LETTER EL
+0xED 0x041C # CYRILLIC CAPITAL LETTER EM
+0xEE 0x041D # CYRILLIC CAPITAL LETTER EN
+0xEF 0x041E # CYRILLIC CAPITAL LETTER O
+0xF0 0x041F # CYRILLIC CAPITAL LETTER PE
+0xF1 0x042F # CYRILLIC CAPITAL LETTER YA
+0xF2 0x0420 # CYRILLIC CAPITAL LETTER ER
+0xF3 0x0421 # CYRILLIC CAPITAL LETTER ES
+0xF4 0x0422 # CYRILLIC CAPITAL LETTER TE
+0xF5 0x0423 # CYRILLIC CAPITAL LETTER U
+0xF6 0x0416 # CYRILLIC CAPITAL LETTER ZHE
+0xF7 0x0412 # CYRILLIC CAPITAL LETTER VE
+0xF8 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0xF9 0x042B # CYRILLIC CAPITAL LETTER YERU
+0xFA 0x0417 # CYRILLIC CAPITAL LETTER ZE
+0xFB 0x0428 # CYRILLIC CAPITAL LETTER SHA
+0xFC 0x042D # CYRILLIC CAPITAL LETTER E
+0xFD 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
+0xFE 0x0427 # CYRILLIC CAPITAL LETTER CHE
+0xFF 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
diff --git a/ext/mbstring/tests/data/MacJapanese-SJIS.txt b/ext/mbstring/tests/data/MacJapanese-SJIS.txt
new file mode 100644
index 0000000000..a604c019aa
--- /dev/null
+++ b/ext/mbstring/tests/data/MacJapanese-SJIS.txt
@@ -0,0 +1,7728 @@
+#=======================================================================
+# File name: JAPANESE.TXT
+#
+# Contents: Map (external version) from Mac OS Japanese
+# encoding to Unicode 2.1 and later.
+#
+# Copyright: (c) 1994-2002, 2005 by Apple Computer, Inc., all rights
+# reserved.
+#
+# Contact: charsets@apple.com
+#
+# Changes:
+#
+# c02 2005-Apr-05 Update header comments. Matches internal xml
+# <c1.4+1.5> and Text Encoding Converter 2.0.
+# b4,c1 2002-Dec-19 Update URLs. Matches internal utom<b18>.
+# b03 1999-Sep-22 Change mappings for 0xFF, 0x8150, 0x8163,
+# 0xEB50, and 0xEB63 to reduce problems in
+# interconversion with CP 932. Update contact
+# e-mail address. Matches internal utom<b9>,
+# ufrm<b10>, and Text Encoding Converter
+# version 1.5.
+# b02 1998-Aug-18 Update the mappings for Mac OS Japanese
+# 0x8650 and 0x8855. Update the description of
+# the PostScript screen variant. Matches
+# internal utom<b7>, ufrm<b7>.
+# n06 1998-Feb-05 Update to match internal utom<n10>, ufrm<n27>
+# and Text Encoding Converter version 1.3:
+# Use standard Unicodes plus transcoding hints
+# instead of single corporate characters; see
+# details below. Also reorder into single list
+# with all one-byte characters at the
+# beginning, and rewrite all the initial
+# comments.
+# n03 1995-Apr-15 Matches internal ufrm<n11>.
+#
+# Standard header:
+# ----------------
+#
+# Apple, the Apple logo, and Macintosh are trademarks of Apple
+# Computer, Inc., registered in the United States and other countries.
+# Unicode is a trademark of Unicode Inc. For the sake of brevity,
+# throughout this document, "Macintosh" can be used to refer to
+# Macintosh computers and "Unicode" can be used to refer to the
+# Unicode standard.
+#
+# Apple Computer, Inc. ("Apple") makes no warranty or representation,
+# either express or implied, with respect to this document and the
+# included data, its quality, accuracy, or fitness for a particular
+# purpose. In no event will Apple be liable for direct, indirect,
+# special, incidental, or consequential damages resulting from any
+# defect or inaccuracy in this document or the included data.
+#
+# These mapping tables and character lists are subject to change.
+# The latest tables should be available from the following:
+#
+# <http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/>
+#
+# For general information about Mac OS encodings and these mapping
+# tables, see the file "README.TXT".
+#
+# Format:
+# -------
+#
+# Three tab-separated columns;
+# '#' begins a comment which continues to the end of the line.
+# Column #1 is the Mac OS Japanese code (in hex as 0xNN or 0xNNNN)
+# Column #2 is the corresponding Unicode or Unicode sequence (in
+# hex as 0xNNNN, 0xNNNN+0xNNNN, etc.). Sequences of up to 5
+# Unicode characters are used here.
+# Column #3 is a comment containing the Unicode name.
+# In some cases an additional comment follows the Unicode name.
+#
+# The entries are in Mac OS Japanese code order.
+# All one-byte characters are at the beginning.
+#
+# Some of these mappings require the use of corporate characters.
+# See the file "CORPCHAR.TXT" and notes below.
+#
+# Control character mappings are not shown in this table, following
+# the conventions of the standard UTC mapping tables. However, the
+# Mac OS Japanese encoding uses the standard control characters at
+# 0x00-0x1F and 0x7F.
+#
+# Notes on Mac OS Japanese:
+# -------------------------
+#
+# This is a legacy Mac OS encoding; in the Mac OS X Carbon and Cocoa
+# environments, it is only supported directly in programming
+# interfaces for QuickDraw Text, the Script Manager, and related
+# Text Utilities. For other purposes it is supported via transcoding
+# to and from Unicode.
+#
+# This table covers the standard Mac OS Japanese encoding used
+# in Mac OS versions 7.1 and later. The Mac OS Japanese encoding is
+# based on Shift-JIS, but adds another 300 or so characters using
+# code points that are unassigned in Shift-JIS. Certain Mac OS
+# Japanese fonts are based on a modified version of the Mac OS
+# Japanese encoding; see below.
+#
+# Some of the information below comes from Ken Lunde's book
+# "Understanding Japanese Information Processing", O'Reilly & Assoc.,
+# 1993.
+#
+# 1. Conventional Shift-JIS
+#
+# Most Shift-JIS implementations include the following characters:
+#
+# a) One-byte characters from JIS X0201-1976. This has two parts:
+#
+# - JIS-Roman, the Japanese national variant of ISO 646 (the
+# international version of ASCII). This is identical to ASCII
+# except that 0x5C is YEN SIGN instead of REVERSE SOLIDUS,
+# 0x7E is OVERLINE instead of TILDE, and usually 0x7C is
+# BROKEN BAR instead of VERTICAL LINE (although this last
+# difference is sometimes seen as just a glyph variant).
+#
+# - "Halfwidth" katakana and punctuation characters with codes
+# 0xA1-0xDF.
+#
+# c) Two-byte characters with first/lead/high byte in the range
+# 0x81-0x9F or 0xE0-0xFC, and second/trail/low byte in the
+# range 0x40-0x7E or 0x80-0xFC. The first byte range was chosen
+# to avoid any JIS X0201 characters. The two-byte characters
+# include:
+#
+# - Characters from JIS X0208-1990, transformed so they map
+# onto Shift-JIS code points 0x8140-0xEFFC. The original JIS
+# X0208 characters have code points in the range 0x2121 to
+# 0x7E7E (corresponding to "ku-ten" codes in the range 1,1 to
+# 94,94 - i.e. row and column on a JIS X0208 chart).
+#
+# - A user-defined range using Shift-JIS code points
+# 0xF040-0xFCFC, providing 2444 code points.
+#
+# Note: PostScript fonts are based on JIS X0208-1983 (formerly
+# known as JIS C6226-1983). This earlier version of JIS X0208
+# lacks two Kanji characters that were added for JIS X0208-1990;
+# these have Shift-JIS codes xEAA3 and 0xEAA4.
+#
+# 2. Mac OS Japanese changes and additions
+#
+# a) One-byte changes and additions
+#
+# - Changes to JIS-Roman: In Mac OS Japanese, 0x7C and 0x7E
+# are assigned as in ASCII, not as in JIS-Roman:
+# 0x7C VERTICAL LINE (can be considered a glyph difference)
+# 0x7E TILDE
+#
+# - Additional one-byte characters: basic Shift-JIS leaves
+# five one-byte code points unassigned. Mac OS Japanese assigns
+# these as follows:
+# 0x80 REVERSE SOLIDUS (the character at 0x5C in ASCII)
+# 0xA0 NO-BREAK SPACE ("halfwidth"; common Shift-JIS addition)
+# 0xFD COPYRIGHT SIGN
+# 0xFE TRADE MARK SIGN
+# 0xFF halfwidth horizontal ellipsis
+#
+# b) Two-byte additions
+#
+# Many JIS X0208 code points are unassigned; these correspond to
+# many unassigned code points in Shift-JIS. Many implementations
+# of Shift-JIS, including Mac OS Japanese, add characters using
+# these code points. The standard Mac OS Japanese additions are:
+#
+# - 260 symbols and dingbat-like number and letter forms using
+# Shift-JIS codes in the range 0x8540-0x886D. These include
+# circled and parenthesized numbers and letters, square katakana
+# and Kanji forms, etc.
+#
+# - 53 vertical forms for hiragana, katakana, and punctuation,
+# using Shift-JIS codes in the range 0xEB41-0xED96. These are
+# so-called "ku+84" vertical forms, since their ku-ten code is
+# derived from that of the corresponding abstract or horizontal
+# form character by adding 84 to the ku (row) number.
+#
+# Most of these additional characters are found in other vendor
+# implementations of Shift-JIS, although often with different
+# code points, and so most of these characters are also found
+# in Unicode. However, some of these additional characters do
+# not correspond to any standard single Unicode character.
+#
+# 3. Mac OS Japanese font variants
+#
+# Some fonts used with Mac OS Japanese implement variants of the
+# encoding described above.
+#
+# a) Basic variant
+#
+# This is used with the fonts TohabaGothic and TohabaMincho. This
+# variant has none of the two-byte additions described in section 2b
+# above, but it does have all the one-byte changes and additions
+# described in section 2a.
+#
+# These fonts also lack glyphs for the Kanji characters at 0xEAA3
+# and 0xEAA4.
+#
+# b) PostScript screen variant
+#
+# This is used with the screen fonts ChuGothic and SaiMincho. This
+# variant does not have the Apple 260 symbols and dingbat-like
+# additions in the range 0x8540-0x886D; instead it has a different
+# set of about 160 symbols and dingbat-like additions in the range
+# 0x86A2-0x879C. Like the standard variant, it does have the ku+84
+# vertical forms in the range 0xEB41-0xED96; it also has additional
+# vertical forms in the ranges 0xEE5F-0xEE6E and 0xEE80-0xEE81
+# (although many fonts do not have glyphs for these additional
+# vertical forms). This variant also has the one-byte changes at
+# 0x7C and 0x7E and the additions at 0x80 and 0xA0, but these fonts
+# lack glyphs for the one-byte additions at 0xFD-0xFF. These fonts
+# also lack glyphs for the Kanji characters at 0xEAA3 and 0xEAA4.
+#
+# c) PostScript printer variant
+#
+# When the screen fonts ChuGothic and SaiMincho are printed on
+# certain printers such as Apple's LaserWriter NTX-J, the printer
+# will use a built-in font that is supposed to match the screen font.
+# In fact, the printer fonts implement a superset of the screen
+# variant described above; the PostScript printer variant adds a
+# set of about 440 additional characters in the range 0x8540-0x879C.
+# This is a different set of additions than the 260 in standard
+# Mac OS Japanese, and is similar to the "NEC" additions found in
+# some other implementations. It includes circled and parenthesized
+# numbers and letters and square katakana, as well as many two-byte
+# "halfwidth" forms for Latin, katakana, punctuation, and box
+# drawing characters. It also includes several duplicates of
+# standard JIS X0208 characters.
+#
+# d) Old ku+10 verticals variant
+#
+# This is used with certain old versions of the fonts MaruGothic and
+# HonMincho - only the versions of those fonts used in the Japanese
+# localized versions of System 7.1.
+#
+# This variant has none of the two-byte additions described in
+# section 2b above. Instead, it has a set of "ku+10" vertical forms
+# for hiragana, katakana, and punctuation, using Shift-JIS codes in
+# the range 0x8641-0x8896.
+#
+# Unicode mapping issues and notes:
+# ---------------------------------
+#
+# 1. Mapping the user-defined range
+#
+# The table below covers only the standard Mac OS Japanese encoding.
+# It does not include mappings for the Shift-JIS user-defined range;
+# this is mapped onto Unicodes 0xE000-0xE98B as follows:
+# 0xF040-0xF07E -> 0xE000-0xE03E
+# 0xF080-0xF0FC -> 0xE03F-0xE0BB
+# 0xF140-0xF17E -> 0xE0BC-0xE0FA
+# 0xF180-0xF1FC -> 0xE0FB-0xE177
+# ...
+# 0xFC40-0xFC7E -> 0xE8D0-0xE90E
+# 0xFC80-0xFCFC -> 0xE90F-0xE98B
+#
+# 2. Mapping the Apple two-byte additions
+#
+# The goals in the mappings provided here are:
+# - Ensure roundtrip mapping from every character in Mac OS Japanese
+# to Unicode and back
+# - Use standard Unicode characters as much as possible, to maximize
+# interchangeability of the resulting Unicode text. Whenever possible,
+# avoid having content carried by private-use characters.
+#
+# Since not all of the Mac OS Japanese characters correspond to
+# distinct, single Unicode characters, we employ various strategies.
+#
+# a) Map a single Mac OS Japanese character to a sequence of Unicode
+# characters
+#
+# For example, the character 0x8791 in the Apple extensions is a
+# circled Kanji for "big". There is no single Unicode character for
+# this. However, this can be mapped to the Unicode sequence
+# 0x5927+0x20DD, ideograph "big" + COMBINING ENCLOSING CIRCLE.
+#
+# b) Use private use characters to mark variants or groupings that
+# are similar to a sequence of one or more standard Unicode
+# characters.
+#
+# Apple has defined a block of 32 corporate characters as "transcoding
+# hints." These are used in combination with standard Unicode characters
+# to force them to be treated in a special way for mapping to other
+# encodings; they have no other effect. Sixteen of these transcoding
+# hints are "grouping hints" - they indicate that the next 2-4 Unicode
+# characters should be treated as a single entity for transcoding. The
+# other sixteen transcoding hints are "variant tags" - they are like
+# combining characters, and can follow a standard Unicode (or a sequence
+# consisting of a base character and other combining characters) to
+# cause it to be treated in a special way for transcoding. These always
+# terminate a combining-character sequence.
+#
+# The transcoding coding hints used in this mapping table are:
+#
+# 0xF860 group next 2 characters as a single entity for transcoding
+# 0xF861 group next 3 characters as a single entity for transcoding
+# 0xF862 group next 4 characters as a single entity for transcoding
+# 0xF87A variant tag for "negative" (i.e. black & white reversed)
+# 0xF87E variant tag for vertical form
+# 0xF87F variant tag for other alternate form
+#
+# For example, the Apple addition character 0x85AB is Roman numeral
+# thirteen. There is no single Unicode for this (although there are
+# standard Unicodes for Roman numerals 1-12). Using the grouping hint
+# 0xF862 in combination with standard Unicodes, we can map this as
+# 0xF862+0x0058+0x0049+0x0049+0x0049 (i.e. X + I + I + I).
+#
+# 3. Mapping the basic Shift-JIS characters and Apple one-byte additions
+#
+# The mappings for basic Shift-JIS are based on the UTC mappings for
+# Shift-JIS dated 8 March 1994, by Glenn Adams and John H. Jenkins.
+#
+# There were adjusted as necessary to accommodate the Apple one-byte
+# changes and additions. They were also adjusted to accommodate some
+# changes to the UTC mapping suggested by the Japanese Standards
+# Association.
+#
+# code UTC Apple reason
+# point mapping mapping for change
+# ----- ------- ------- ----------
+# 0x7E 0x203E 0x007E Mac OS Japanese has TILDE here, not
+# OVERLINE
+# 0x815C 0x2015 0x2014 Suggested by JSA
+# 0x815F 0x005C 0xFF3C Avoid conflict with Apple one-byte
+# addition 0x80, which maps to 0x005C.
+# (CP 932 also maps 0x815F to 0xFF3C).
+#
+# Details of mapping changes in each version:
+# -------------------------------------------
+#
+# Changes from version b02 to version b03:
+#
+# - Change the mapping for 0x8150 from 0x203E to 0xFFE3; change the
+# mapping of the corresponding vertical form 0xEB50 from
+# 0x203E+0xF87E to 0xFFE3+0xF87E. Change the mapping of 0x8163 from
+# 0x22EF to 0x2026; change the mapping of the corresponding vertical
+# form 0xEB63 from 0x22EF+0xF87E to 0x2026+0xF87E. These changes
+# reduce problems in interconversion with CP 932.
+# - Consequently, change the mapping of 0xFF from 0x2026 to
+# 0x2026+0xF87F to avoid conflict with the new mapping of 0x8163.
+#
+# Changes from version n06 to version b02:
+#
+# - Change the mapping for 0x8650 from 0xFF4C+0xF87F to 0x2113; change
+# the mapping for 0x8855 from 0x301E to 0x301F. Update the description
+# of the PostScript screen variant to include the 160 characters in the
+# range 0x86A2-0x879C.
+#
+# Changes from version n03 to version n06:
+#
+# - Changed mappings of several Apple additions from single corporate
+# character to standard Unicodes + transcoding hint:
+# 0x8591, 0x85AB-AD, 0x85BF-C1, 0x8645, 0x864B, 0x8650, 0x865D, 0x869E,
+# 0x86CE, 0x86D3-D6, 0x87FB-FC.
+# - Changed mapping of one Apple addition from single corporate character
+# to standard Unicode: 0x8855.
+# - Changed mappings of several Apple vertical forms additions from
+# single corporate character to standard Unicodes + transcoding hint:
+# 0xEB41-42, 0xEB50, 0xEB5B, 0xEB5D, 0xEB60-63, 0xEB6D-6E, 0xEB81,
+# plus all vertical forms in the range 0xEC9F-ED96.
+#
+##################
+
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x00A5 # YEN SIGN
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE # Apple change from standard Shift-JIS
+#
+0x80 0x005C # REVERSE SOLIDUS # Apple addition; changes mapping of 0x815F
+#
+0xA0 0x00A0 # NO-BREAK SPACE # Apple addition
+0xA1 0xFF61 # HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2 0xFF62 # HALFWIDTH LEFT CORNER BRACKET
+0xA3 0xFF63 # HALFWIDTH RIGHT CORNER BRACKET
+0xA4 0xFF64 # HALFWIDTH IDEOGRAPHIC COMMA
+0xA5 0xFF65 # HALFWIDTH KATAKANA MIDDLE DOT
+0xA6 0xFF66 # HALFWIDTH KATAKANA LETTER WO
+0xA7 0xFF67 # HALFWIDTH KATAKANA LETTER SMALL A
+0xA8 0xFF68 # HALFWIDTH KATAKANA LETTER SMALL I
+0xA9 0xFF69 # HALFWIDTH KATAKANA LETTER SMALL U
+0xAA 0xFF6A # HALFWIDTH KATAKANA LETTER SMALL E
+0xAB 0xFF6B # HALFWIDTH KATAKANA LETTER SMALL O
+0xAC 0xFF6C # HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD 0xFF6D # HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE 0xFF6E # HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF 0xFF6F # HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0 0xFF70 # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1 0xFF71 # HALFWIDTH KATAKANA LETTER A
+0xB2 0xFF72 # HALFWIDTH KATAKANA LETTER I
+0xB3 0xFF73 # HALFWIDTH KATAKANA LETTER U
+0xB4 0xFF74 # HALFWIDTH KATAKANA LETTER E
+0xB5 0xFF75 # HALFWIDTH KATAKANA LETTER O
+0xB6 0xFF76 # HALFWIDTH KATAKANA LETTER KA
+0xB7 0xFF77 # HALFWIDTH KATAKANA LETTER KI
+0xB8 0xFF78 # HALFWIDTH KATAKANA LETTER KU
+0xB9 0xFF79 # HALFWIDTH KATAKANA LETTER KE
+0xBA 0xFF7A # HALFWIDTH KATAKANA LETTER KO
+0xBB 0xFF7B # HALFWIDTH KATAKANA LETTER SA
+0xBC 0xFF7C # HALFWIDTH KATAKANA LETTER SI
+0xBD 0xFF7D # HALFWIDTH KATAKANA LETTER SU
+0xBE 0xFF7E # HALFWIDTH KATAKANA LETTER SE
+0xBF 0xFF7F # HALFWIDTH KATAKANA LETTER SO
+0xC0 0xFF80 # HALFWIDTH KATAKANA LETTER TA
+0xC1 0xFF81 # HALFWIDTH KATAKANA LETTER TI
+0xC2 0xFF82 # HALFWIDTH KATAKANA LETTER TU
+0xC3 0xFF83 # HALFWIDTH KATAKANA LETTER TE
+0xC4 0xFF84 # HALFWIDTH KATAKANA LETTER TO
+0xC5 0xFF85 # HALFWIDTH KATAKANA LETTER NA
+0xC6 0xFF86 # HALFWIDTH KATAKANA LETTER NI
+0xC7 0xFF87 # HALFWIDTH KATAKANA LETTER NU
+0xC8 0xFF88 # HALFWIDTH KATAKANA LETTER NE
+0xC9 0xFF89 # HALFWIDTH KATAKANA LETTER NO
+0xCA 0xFF8A # HALFWIDTH KATAKANA LETTER HA
+0xCB 0xFF8B # HALFWIDTH KATAKANA LETTER HI
+0xCC 0xFF8C # HALFWIDTH KATAKANA LETTER HU
+0xCD 0xFF8D # HALFWIDTH KATAKANA LETTER HE
+0xCE 0xFF8E # HALFWIDTH KATAKANA LETTER HO
+0xCF 0xFF8F # HALFWIDTH KATAKANA LETTER MA
+0xD0 0xFF90 # HALFWIDTH KATAKANA LETTER MI
+0xD1 0xFF91 # HALFWIDTH KATAKANA LETTER MU
+0xD2 0xFF92 # HALFWIDTH KATAKANA LETTER ME
+0xD3 0xFF93 # HALFWIDTH KATAKANA LETTER MO
+0xD4 0xFF94 # HALFWIDTH KATAKANA LETTER YA
+0xD5 0xFF95 # HALFWIDTH KATAKANA LETTER YU
+0xD6 0xFF96 # HALFWIDTH KATAKANA LETTER YO
+0xD7 0xFF97 # HALFWIDTH KATAKANA LETTER RA
+0xD8 0xFF98 # HALFWIDTH KATAKANA LETTER RI
+0xD9 0xFF99 # HALFWIDTH KATAKANA LETTER RU
+0xDA 0xFF9A # HALFWIDTH KATAKANA LETTER RE
+0xDB 0xFF9B # HALFWIDTH KATAKANA LETTER RO
+0xDC 0xFF9C # HALFWIDTH KATAKANA LETTER WA
+0xDD 0xFF9D # HALFWIDTH KATAKANA LETTER N
+0xDE 0xFF9E # HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF 0xFF9F # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+#
+0xFD 0x00A9 # COPYRIGHT SIGN # Apple addition
+0xFE 0x2122 # TRADE MARK SIGN # Apple addition
+0xFF 0x2026+0xF87F # halfwidth horizontal ellipsis # Apple addition
+#
+0x8140 0x3000 # IDEOGRAPHIC SPACE
+0x8141 0x3001 # IDEOGRAPHIC COMMA
+0x8142 0x3002 # IDEOGRAPHIC FULL STOP
+0x8143 0xFF0C # FULLWIDTH COMMA
+0x8144 0xFF0E # FULLWIDTH FULL STOP
+0x8145 0x30FB # KATAKANA MIDDLE DOT
+0x8146 0xFF1A # FULLWIDTH COLON
+0x8147 0xFF1B # FULLWIDTH SEMICOLON
+0x8148 0xFF1F # FULLWIDTH QUESTION MARK
+0x8149 0xFF01 # FULLWIDTH EXCLAMATION MARK
+0x814A 0x309B # KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B 0x309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C 0x00B4 # ACUTE ACCENT
+0x814D 0xFF40 # FULLWIDTH GRAVE ACCENT
+0x814E 0x00A8 # DIAERESIS
+0x814F 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT
+0x8150 0xFFE3 # FULLWIDTH MACRON
+0x8151 0xFF3F # FULLWIDTH LOW LINE
+0x8152 0x30FD # KATAKANA ITERATION MARK
+0x8153 0x30FE # KATAKANA VOICED ITERATION MARK
+0x8154 0x309D # HIRAGANA ITERATION MARK
+0x8155 0x309E # HIRAGANA VOICED ITERATION MARK
+0x8156 0x3003 # DITTO MARK
+0x8157 0x4EDD # <CJK>
+0x8158 0x3005 # IDEOGRAPHIC ITERATION MARK
+0x8159 0x3006 # IDEOGRAPHIC CLOSING MARK
+0x815A 0x3007 # IDEOGRAPHIC NUMBER ZERO
+0x815B 0x30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C 0x2014 # EM DASH # change UTC mapping to match JIS spec
+0x815D 0x2010 # HYPHEN
+0x815E 0xFF0F # FULLWIDTH SOLIDUS
+0x815F 0xFF3C # FULLWIDTH REVERSE SOLIDUS # change UTC mapping to separate from 0x80
+0x8160 0x301C # WAVE DASH
+0x8161 0x2016 # DOUBLE VERTICAL LINE
+0x8162 0xFF5C # FULLWIDTH VERTICAL LINE
+0x8163 0x2026 # HORIZONTAL ELLIPSIS
+0x8164 0x2025 # TWO DOT LEADER
+0x8165 0x2018 # LEFT SINGLE QUOTATION MARK
+0x8166 0x2019 # RIGHT SINGLE QUOTATION MARK
+0x8167 0x201C # LEFT DOUBLE QUOTATION MARK
+0x8168 0x201D # RIGHT DOUBLE QUOTATION MARK
+0x8169 0xFF08 # FULLWIDTH LEFT PARENTHESIS
+0x816A 0xFF09 # FULLWIDTH RIGHT PARENTHESIS
+0x816B 0x3014 # LEFT TORTOISE SHELL BRACKET
+0x816C 0x3015 # RIGHT TORTOISE SHELL BRACKET
+0x816D 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET
+0x816E 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET
+0x816F 0xFF5B # FULLWIDTH LEFT CURLY BRACKET
+0x8170 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET
+0x8171 0x3008 # LEFT ANGLE BRACKET
+0x8172 0x3009 # RIGHT ANGLE BRACKET
+0x8173 0x300A # LEFT DOUBLE ANGLE BRACKET
+0x8174 0x300B # RIGHT DOUBLE ANGLE BRACKET
+0x8175 0x300C # LEFT CORNER BRACKET
+0x8176 0x300D # RIGHT CORNER BRACKET
+0x8177 0x300E # LEFT WHITE CORNER BRACKET
+0x8178 0x300F # RIGHT WHITE CORNER BRACKET
+0x8179 0x3010 # LEFT BLACK LENTICULAR BRACKET
+0x817A 0x3011 # RIGHT BLACK LENTICULAR BRACKET
+0x817B 0xFF0B # FULLWIDTH PLUS SIGN
+0x817C 0x2212 # MINUS SIGN
+0x817D 0x00B1 # PLUS-MINUS SIGN
+0x817E 0x00D7 # MULTIPLICATION SIGN
+0x8180 0x00F7 # DIVISION SIGN
+0x8181 0xFF1D # FULLWIDTH EQUALS SIGN
+0x8182 0x2260 # NOT EQUAL TO
+0x8183 0xFF1C # FULLWIDTH LESS-THAN SIGN
+0x8184 0xFF1E # FULLWIDTH GREATER-THAN SIGN
+0x8185 0x2266 # LESS-THAN OVER EQUAL TO
+0x8186 0x2267 # GREATER-THAN OVER EQUAL TO
+0x8187 0x221E # INFINITY
+0x8188 0x2234 # THEREFORE
+0x8189 0x2642 # MALE SIGN
+0x818A 0x2640 # FEMALE SIGN
+0x818B 0x00B0 # DEGREE SIGN
+0x818C 0x2032 # PRIME
+0x818D 0x2033 # DOUBLE PRIME
+0x818E 0x2103 # DEGREE CELSIUS
+0x818F 0xFFE5 # FULLWIDTH YEN SIGN
+0x8190 0xFF04 # FULLWIDTH DOLLAR SIGN
+0x8191 0x00A2 # CENT SIGN
+0x8192 0x00A3 # POUND SIGN
+0x8193 0xFF05 # FULLWIDTH PERCENT SIGN
+0x8194 0xFF03 # FULLWIDTH NUMBER SIGN
+0x8195 0xFF06 # FULLWIDTH AMPERSAND
+0x8196 0xFF0A # FULLWIDTH ASTERISK
+0x8197 0xFF20 # FULLWIDTH COMMERCIAL AT
+0x8198 0x00A7 # SECTION SIGN
+0x8199 0x2606 # WHITE STAR
+0x819A 0x2605 # BLACK STAR
+0x819B 0x25CB # WHITE CIRCLE
+0x819C 0x25CF # BLACK CIRCLE
+0x819D 0x25CE # BULLSEYE
+0x819E 0x25C7 # WHITE DIAMOND
+0x819F 0x25C6 # BLACK DIAMOND
+0x81A0 0x25A1 # WHITE SQUARE
+0x81A1 0x25A0 # BLACK SQUARE
+0x81A2 0x25B3 # WHITE UP-POINTING TRIANGLE
+0x81A3 0x25B2 # BLACK UP-POINTING TRIANGLE
+0x81A4 0x25BD # WHITE DOWN-POINTING TRIANGLE
+0x81A5 0x25BC # BLACK DOWN-POINTING TRIANGLE
+0x81A6 0x203B # REFERENCE MARK
+0x81A7 0x3012 # POSTAL MARK
+0x81A8 0x2192 # RIGHTWARDS ARROW
+0x81A9 0x2190 # LEFTWARDS ARROW
+0x81AA 0x2191 # UPWARDS ARROW
+0x81AB 0x2193 # DOWNWARDS ARROW
+0x81AC 0x3013 # GETA MARK
+0x81B8 0x2208 # ELEMENT OF
+0x81B9 0x220B # CONTAINS AS MEMBER
+0x81BA 0x2286 # SUBSET OF OR EQUAL TO
+0x81BB 0x2287 # SUPERSET OF OR EQUAL TO
+0x81BC 0x2282 # SUBSET OF
+0x81BD 0x2283 # SUPERSET OF
+0x81BE 0x222A # UNION
+0x81BF 0x2229 # INTERSECTION
+0x81C8 0x2227 # LOGICAL AND
+0x81C9 0x2228 # LOGICAL OR
+0x81CA 0x00AC # NOT SIGN
+0x81CB 0x21D2 # RIGHTWARDS DOUBLE ARROW
+0x81CC 0x21D4 # LEFT RIGHT DOUBLE ARROW
+0x81CD 0x2200 # FOR ALL
+0x81CE 0x2203 # THERE EXISTS
+0x81DA 0x2220 # ANGLE
+0x81DB 0x22A5 # UP TACK
+0x81DC 0x2312 # ARC
+0x81DD 0x2202 # PARTIAL DIFFERENTIAL
+0x81DE 0x2207 # NABLA
+0x81DF 0x2261 # IDENTICAL TO
+0x81E0 0x2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x81E1 0x226A # MUCH LESS-THAN
+0x81E2 0x226B # MUCH GREATER-THAN
+0x81E3 0x221A # SQUARE ROOT
+0x81E4 0x223D # REVERSED TILDE # This UTC mapping is questionable
+0x81E5 0x221D # PROPORTIONAL TO
+0x81E6 0x2235 # BECAUSE
+0x81E7 0x222B # INTEGRAL
+0x81E8 0x222C # DOUBLE INTEGRAL
+0x81F0 0x212B # ANGSTROM SIGN
+0x81F1 0x2030 # PER MILLE SIGN
+0x81F2 0x266F # MUSIC SHARP SIGN
+0x81F3 0x266D # MUSIC FLAT SIGN
+0x81F4 0x266A # EIGHTH NOTE
+0x81F5 0x2020 # DAGGER
+0x81F6 0x2021 # DOUBLE DAGGER
+0x81F7 0x00B6 # PILCROW SIGN
+0x81FC 0x25EF # LARGE CIRCLE
+0x824F 0xFF10 # FULLWIDTH DIGIT ZERO
+0x8250 0xFF11 # FULLWIDTH DIGIT ONE
+0x8251 0xFF12 # FULLWIDTH DIGIT TWO
+0x8252 0xFF13 # FULLWIDTH DIGIT THREE
+0x8253 0xFF14 # FULLWIDTH DIGIT FOUR
+0x8254 0xFF15 # FULLWIDTH DIGIT FIVE
+0x8255 0xFF16 # FULLWIDTH DIGIT SIX
+0x8256 0xFF17 # FULLWIDTH DIGIT SEVEN
+0x8257 0xFF18 # FULLWIDTH DIGIT EIGHT
+0x8258 0xFF19 # FULLWIDTH DIGIT NINE
+0x8260 0xFF21 # FULLWIDTH LATIN CAPITAL LETTER A
+0x8261 0xFF22 # FULLWIDTH LATIN CAPITAL LETTER B
+0x8262 0xFF23 # FULLWIDTH LATIN CAPITAL LETTER C
+0x8263 0xFF24 # FULLWIDTH LATIN CAPITAL LETTER D
+0x8264 0xFF25 # FULLWIDTH LATIN CAPITAL LETTER E
+0x8265 0xFF26 # FULLWIDTH LATIN CAPITAL LETTER F
+0x8266 0xFF27 # FULLWIDTH LATIN CAPITAL LETTER G
+0x8267 0xFF28 # FULLWIDTH LATIN CAPITAL LETTER H
+0x8268 0xFF29 # FULLWIDTH LATIN CAPITAL LETTER I
+0x8269 0xFF2A # FULLWIDTH LATIN CAPITAL LETTER J
+0x826A 0xFF2B # FULLWIDTH LATIN CAPITAL LETTER K
+0x826B 0xFF2C # FULLWIDTH LATIN CAPITAL LETTER L
+0x826C 0xFF2D # FULLWIDTH LATIN CAPITAL LETTER M
+0x826D 0xFF2E # FULLWIDTH LATIN CAPITAL LETTER N
+0x826E 0xFF2F # FULLWIDTH LATIN CAPITAL LETTER O
+0x826F 0xFF30 # FULLWIDTH LATIN CAPITAL LETTER P
+0x8270 0xFF31 # FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271 0xFF32 # FULLWIDTH LATIN CAPITAL LETTER R
+0x8272 0xFF33 # FULLWIDTH LATIN CAPITAL LETTER S
+0x8273 0xFF34 # FULLWIDTH LATIN CAPITAL LETTER T
+0x8274 0xFF35 # FULLWIDTH LATIN CAPITAL LETTER U
+0x8275 0xFF36 # FULLWIDTH LATIN CAPITAL LETTER V
+0x8276 0xFF37 # FULLWIDTH LATIN CAPITAL LETTER W
+0x8277 0xFF38 # FULLWIDTH LATIN CAPITAL LETTER X
+0x8278 0xFF39 # FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279 0xFF3A # FULLWIDTH LATIN CAPITAL LETTER Z
+0x8281 0xFF41 # FULLWIDTH LATIN SMALL LETTER A
+0x8282 0xFF42 # FULLWIDTH LATIN SMALL LETTER B
+0x8283 0xFF43 # FULLWIDTH LATIN SMALL LETTER C
+0x8284 0xFF44 # FULLWIDTH LATIN SMALL LETTER D
+0x8285 0xFF45 # FULLWIDTH LATIN SMALL LETTER E
+0x8286 0xFF46 # FULLWIDTH LATIN SMALL LETTER F
+0x8287 0xFF47 # FULLWIDTH LATIN SMALL LETTER G
+0x8288 0xFF48 # FULLWIDTH LATIN SMALL LETTER H
+0x8289 0xFF49 # FULLWIDTH LATIN SMALL LETTER I
+0x828A 0xFF4A # FULLWIDTH LATIN SMALL LETTER J
+0x828B 0xFF4B # FULLWIDTH LATIN SMALL LETTER K
+0x828C 0xFF4C # FULLWIDTH LATIN SMALL LETTER L
+0x828D 0xFF4D # FULLWIDTH LATIN SMALL LETTER M
+0x828E 0xFF4E # FULLWIDTH LATIN SMALL LETTER N
+0x828F 0xFF4F # FULLWIDTH LATIN SMALL LETTER O
+0x8290 0xFF50 # FULLWIDTH LATIN SMALL LETTER P
+0x8291 0xFF51 # FULLWIDTH LATIN SMALL LETTER Q
+0x8292 0xFF52 # FULLWIDTH LATIN SMALL LETTER R
+0x8293 0xFF53 # FULLWIDTH LATIN SMALL LETTER S
+0x8294 0xFF54 # FULLWIDTH LATIN SMALL LETTER T
+0x8295 0xFF55 # FULLWIDTH LATIN SMALL LETTER U
+0x8296 0xFF56 # FULLWIDTH LATIN SMALL LETTER V
+0x8297 0xFF57 # FULLWIDTH LATIN SMALL LETTER W
+0x8298 0xFF58 # FULLWIDTH LATIN SMALL LETTER X
+0x8299 0xFF59 # FULLWIDTH LATIN SMALL LETTER Y
+0x829A 0xFF5A # FULLWIDTH LATIN SMALL LETTER Z
+0x829F 0x3041 # HIRAGANA LETTER SMALL A
+0x82A0 0x3042 # HIRAGANA LETTER A
+0x82A1 0x3043 # HIRAGANA LETTER SMALL I
+0x82A2 0x3044 # HIRAGANA LETTER I
+0x82A3 0x3045 # HIRAGANA LETTER SMALL U
+0x82A4 0x3046 # HIRAGANA LETTER U
+0x82A5 0x3047 # HIRAGANA LETTER SMALL E
+0x82A6 0x3048 # HIRAGANA LETTER E
+0x82A7 0x3049 # HIRAGANA LETTER SMALL O
+0x82A8 0x304A # HIRAGANA LETTER O
+0x82A9 0x304B # HIRAGANA LETTER KA
+0x82AA 0x304C # HIRAGANA LETTER GA
+0x82AB 0x304D # HIRAGANA LETTER KI
+0x82AC 0x304E # HIRAGANA LETTER GI
+0x82AD 0x304F # HIRAGANA LETTER KU
+0x82AE 0x3050 # HIRAGANA LETTER GU
+0x82AF 0x3051 # HIRAGANA LETTER KE
+0x82B0 0x3052 # HIRAGANA LETTER GE
+0x82B1 0x3053 # HIRAGANA LETTER KO
+0x82B2 0x3054 # HIRAGANA LETTER GO
+0x82B3 0x3055 # HIRAGANA LETTER SA
+0x82B4 0x3056 # HIRAGANA LETTER ZA
+0x82B5 0x3057 # HIRAGANA LETTER SI
+0x82B6 0x3058 # HIRAGANA LETTER ZI
+0x82B7 0x3059 # HIRAGANA LETTER SU
+0x82B8 0x305A # HIRAGANA LETTER ZU
+0x82B9 0x305B # HIRAGANA LETTER SE
+0x82BA 0x305C # HIRAGANA LETTER ZE
+0x82BB 0x305D # HIRAGANA LETTER SO
+0x82BC 0x305E # HIRAGANA LETTER ZO
+0x82BD 0x305F # HIRAGANA LETTER TA
+0x82BE 0x3060 # HIRAGANA LETTER DA
+0x82BF 0x3061 # HIRAGANA LETTER TI
+0x82C0 0x3062 # HIRAGANA LETTER DI
+0x82C1 0x3063 # HIRAGANA LETTER SMALL TU
+0x82C2 0x3064 # HIRAGANA LETTER TU
+0x82C3 0x3065 # HIRAGANA LETTER DU
+0x82C4 0x3066 # HIRAGANA LETTER TE
+0x82C5 0x3067 # HIRAGANA LETTER DE
+0x82C6 0x3068 # HIRAGANA LETTER TO
+0x82C7 0x3069 # HIRAGANA LETTER DO
+0x82C8 0x306A # HIRAGANA LETTER NA
+0x82C9 0x306B # HIRAGANA LETTER NI
+0x82CA 0x306C # HIRAGANA LETTER NU
+0x82CB 0x306D # HIRAGANA LETTER NE
+0x82CC 0x306E # HIRAGANA LETTER NO
+0x82CD 0x306F # HIRAGANA LETTER HA
+0x82CE 0x3070 # HIRAGANA LETTER BA
+0x82CF 0x3071 # HIRAGANA LETTER PA
+0x82D0 0x3072 # HIRAGANA LETTER HI
+0x82D1 0x3073 # HIRAGANA LETTER BI
+0x82D2 0x3074 # HIRAGANA LETTER PI
+0x82D3 0x3075 # HIRAGANA LETTER HU
+0x82D4 0x3076 # HIRAGANA LETTER BU
+0x82D5 0x3077 # HIRAGANA LETTER PU
+0x82D6 0x3078 # HIRAGANA LETTER HE
+0x82D7 0x3079 # HIRAGANA LETTER BE
+0x82D8 0x307A # HIRAGANA LETTER PE
+0x82D9 0x307B # HIRAGANA LETTER HO
+0x82DA 0x307C # HIRAGANA LETTER BO
+0x82DB 0x307D # HIRAGANA LETTER PO
+0x82DC 0x307E # HIRAGANA LETTER MA
+0x82DD 0x307F # HIRAGANA LETTER MI
+0x82DE 0x3080 # HIRAGANA LETTER MU
+0x82DF 0x3081 # HIRAGANA LETTER ME
+0x82E0 0x3082 # HIRAGANA LETTER MO
+0x82E1 0x3083 # HIRAGANA LETTER SMALL YA
+0x82E2 0x3084 # HIRAGANA LETTER YA
+0x82E3 0x3085 # HIRAGANA LETTER SMALL YU
+0x82E4 0x3086 # HIRAGANA LETTER YU
+0x82E5 0x3087 # HIRAGANA LETTER SMALL YO
+0x82E6 0x3088 # HIRAGANA LETTER YO
+0x82E7 0x3089 # HIRAGANA LETTER RA
+0x82E8 0x308A # HIRAGANA LETTER RI
+0x82E9 0x308B # HIRAGANA LETTER RU
+0x82EA 0x308C # HIRAGANA LETTER RE
+0x82EB 0x308D # HIRAGANA LETTER RO
+0x82EC 0x308E # HIRAGANA LETTER SMALL WA
+0x82ED 0x308F # HIRAGANA LETTER WA
+0x82EE 0x3090 # HIRAGANA LETTER WI
+0x82EF 0x3091 # HIRAGANA LETTER WE
+0x82F0 0x3092 # HIRAGANA LETTER WO
+0x82F1 0x3093 # HIRAGANA LETTER N
+0x8340 0x30A1 # KATAKANA LETTER SMALL A
+0x8341 0x30A2 # KATAKANA LETTER A
+0x8342 0x30A3 # KATAKANA LETTER SMALL I
+0x8343 0x30A4 # KATAKANA LETTER I
+0x8344 0x30A5 # KATAKANA LETTER SMALL U
+0x8345 0x30A6 # KATAKANA LETTER U
+0x8346 0x30A7 # KATAKANA LETTER SMALL E
+0x8347 0x30A8 # KATAKANA LETTER E
+0x8348 0x30A9 # KATAKANA LETTER SMALL O
+0x8349 0x30AA # KATAKANA LETTER O
+0x834A 0x30AB # KATAKANA LETTER KA
+0x834B 0x30AC # KATAKANA LETTER GA
+0x834C 0x30AD # KATAKANA LETTER KI
+0x834D 0x30AE # KATAKANA LETTER GI
+0x834E 0x30AF # KATAKANA LETTER KU
+0x834F 0x30B0 # KATAKANA LETTER GU
+0x8350 0x30B1 # KATAKANA LETTER KE
+0x8351 0x30B2 # KATAKANA LETTER GE
+0x8352 0x30B3 # KATAKANA LETTER KO
+0x8353 0x30B4 # KATAKANA LETTER GO
+0x8354 0x30B5 # KATAKANA LETTER SA
+0x8355 0x30B6 # KATAKANA LETTER ZA
+0x8356 0x30B7 # KATAKANA LETTER SI
+0x8357 0x30B8 # KATAKANA LETTER ZI
+0x8358 0x30B9 # KATAKANA LETTER SU
+0x8359 0x30BA # KATAKANA LETTER ZU
+0x835A 0x30BB # KATAKANA LETTER SE
+0x835B 0x30BC # KATAKANA LETTER ZE
+0x835C 0x30BD # KATAKANA LETTER SO
+0x835D 0x30BE # KATAKANA LETTER ZO
+0x835E 0x30BF # KATAKANA LETTER TA
+0x835F 0x30C0 # KATAKANA LETTER DA
+0x8360 0x30C1 # KATAKANA LETTER TI
+0x8361 0x30C2 # KATAKANA LETTER DI
+0x8362 0x30C3 # KATAKANA LETTER SMALL TU
+0x8363 0x30C4 # KATAKANA LETTER TU
+0x8364 0x30C5 # KATAKANA LETTER DU
+0x8365 0x30C6 # KATAKANA LETTER TE
+0x8366 0x30C7 # KATAKANA LETTER DE
+0x8367 0x30C8 # KATAKANA LETTER TO
+0x8368 0x30C9 # KATAKANA LETTER DO
+0x8369 0x30CA # KATAKANA LETTER NA
+0x836A 0x30CB # KATAKANA LETTER NI
+0x836B 0x30CC # KATAKANA LETTER NU
+0x836C 0x30CD # KATAKANA LETTER NE
+0x836D 0x30CE # KATAKANA LETTER NO
+0x836E 0x30CF # KATAKANA LETTER HA
+0x836F 0x30D0 # KATAKANA LETTER BA
+0x8370 0x30D1 # KATAKANA LETTER PA
+0x8371 0x30D2 # KATAKANA LETTER HI
+0x8372 0x30D3 # KATAKANA LETTER BI
+0x8373 0x30D4 # KATAKANA LETTER PI
+0x8374 0x30D5 # KATAKANA LETTER HU
+0x8375 0x30D6 # KATAKANA LETTER BU
+0x8376 0x30D7 # KATAKANA LETTER PU
+0x8377 0x30D8 # KATAKANA LETTER HE
+0x8378 0x30D9 # KATAKANA LETTER BE
+0x8379 0x30DA # KATAKANA LETTER PE
+0x837A 0x30DB # KATAKANA LETTER HO
+0x837B 0x30DC # KATAKANA LETTER BO
+0x837C 0x30DD # KATAKANA LETTER PO
+0x837D 0x30DE # KATAKANA LETTER MA
+0x837E 0x30DF # KATAKANA LETTER MI
+0x8380 0x30E0 # KATAKANA LETTER MU
+0x8381 0x30E1 # KATAKANA LETTER ME
+0x8382 0x30E2 # KATAKANA LETTER MO
+0x8383 0x30E3 # KATAKANA LETTER SMALL YA
+0x8384 0x30E4 # KATAKANA LETTER YA
+0x8385 0x30E5 # KATAKANA LETTER SMALL YU
+0x8386 0x30E6 # KATAKANA LETTER YU
+0x8387 0x30E7 # KATAKANA LETTER SMALL YO
+0x8388 0x30E8 # KATAKANA LETTER YO
+0x8389 0x30E9 # KATAKANA LETTER RA
+0x838A 0x30EA # KATAKANA LETTER RI
+0x838B 0x30EB # KATAKANA LETTER RU
+0x838C 0x30EC # KATAKANA LETTER RE
+0x838D 0x30ED # KATAKANA LETTER RO
+0x838E 0x30EE # KATAKANA LETTER SMALL WA
+0x838F 0x30EF # KATAKANA LETTER WA
+0x8390 0x30F0 # KATAKANA LETTER WI
+0x8391 0x30F1 # KATAKANA LETTER WE
+0x8392 0x30F2 # KATAKANA LETTER WO
+0x8393 0x30F3 # KATAKANA LETTER N
+0x8394 0x30F4 # KATAKANA LETTER VU
+0x8395 0x30F5 # KATAKANA LETTER SMALL KA
+0x8396 0x30F6 # KATAKANA LETTER SMALL KE
+0x839F 0x0391 # GREEK CAPITAL LETTER ALPHA
+0x83A0 0x0392 # GREEK CAPITAL LETTER BETA
+0x83A1 0x0393 # GREEK CAPITAL LETTER GAMMA
+0x83A2 0x0394 # GREEK CAPITAL LETTER DELTA
+0x83A3 0x0395 # GREEK CAPITAL LETTER EPSILON
+0x83A4 0x0396 # GREEK CAPITAL LETTER ZETA
+0x83A5 0x0397 # GREEK CAPITAL LETTER ETA
+0x83A6 0x0398 # GREEK CAPITAL LETTER THETA
+0x83A7 0x0399 # GREEK CAPITAL LETTER IOTA
+0x83A8 0x039A # GREEK CAPITAL LETTER KAPPA
+0x83A9 0x039B # GREEK CAPITAL LETTER LAMDA
+0x83AA 0x039C # GREEK CAPITAL LETTER MU
+0x83AB 0x039D # GREEK CAPITAL LETTER NU
+0x83AC 0x039E # GREEK CAPITAL LETTER XI
+0x83AD 0x039F # GREEK CAPITAL LETTER OMICRON
+0x83AE 0x03A0 # GREEK CAPITAL LETTER PI
+0x83AF 0x03A1 # GREEK CAPITAL LETTER RHO
+0x83B0 0x03A3 # GREEK CAPITAL LETTER SIGMA
+0x83B1 0x03A4 # GREEK CAPITAL LETTER TAU
+0x83B2 0x03A5 # GREEK CAPITAL LETTER UPSILON
+0x83B3 0x03A6 # GREEK CAPITAL LETTER PHI
+0x83B4 0x03A7 # GREEK CAPITAL LETTER CHI
+0x83B5 0x03A8 # GREEK CAPITAL LETTER PSI
+0x83B6 0x03A9 # GREEK CAPITAL LETTER OMEGA
+0x83BF 0x03B1 # GREEK SMALL LETTER ALPHA
+0x83C0 0x03B2 # GREEK SMALL LETTER BETA
+0x83C1 0x03B3 # GREEK SMALL LETTER GAMMA
+0x83C2 0x03B4 # GREEK SMALL LETTER DELTA
+0x83C3 0x03B5 # GREEK SMALL LETTER EPSILON
+0x83C4 0x03B6 # GREEK SMALL LETTER ZETA
+0x83C5 0x03B7 # GREEK SMALL LETTER ETA
+0x83C6 0x03B8 # GREEK SMALL LETTER THETA
+0x83C7 0x03B9 # GREEK SMALL LETTER IOTA
+0x83C8 0x03BA # GREEK SMALL LETTER KAPPA
+0x83C9 0x03BB # GREEK SMALL LETTER LAMDA
+0x83CA 0x03BC # GREEK SMALL LETTER MU
+0x83CB 0x03BD # GREEK SMALL LETTER NU
+0x83CC 0x03BE # GREEK SMALL LETTER XI
+0x83CD 0x03BF # GREEK SMALL LETTER OMICRON
+0x83CE 0x03C0 # GREEK SMALL LETTER PI
+0x83CF 0x03C1 # GREEK SMALL LETTER RHO
+0x83D0 0x03C3 # GREEK SMALL LETTER SIGMA
+0x83D1 0x03C4 # GREEK SMALL LETTER TAU
+0x83D2 0x03C5 # GREEK SMALL LETTER UPSILON
+0x83D3 0x03C6 # GREEK SMALL LETTER PHI
+0x83D4 0x03C7 # GREEK SMALL LETTER CHI
+0x83D5 0x03C8 # GREEK SMALL LETTER PSI
+0x83D6 0x03C9 # GREEK SMALL LETTER OMEGA
+0x8440 0x0410 # CYRILLIC CAPITAL LETTER A
+0x8441 0x0411 # CYRILLIC CAPITAL LETTER BE
+0x8442 0x0412 # CYRILLIC CAPITAL LETTER VE
+0x8443 0x0413 # CYRILLIC CAPITAL LETTER GHE
+0x8444 0x0414 # CYRILLIC CAPITAL LETTER DE
+0x8445 0x0415 # CYRILLIC CAPITAL LETTER IE
+0x8446 0x0401 # CYRILLIC CAPITAL LETTER IO
+0x8447 0x0416 # CYRILLIC CAPITAL LETTER ZHE
+0x8448 0x0417 # CYRILLIC CAPITAL LETTER ZE
+0x8449 0x0418 # CYRILLIC CAPITAL LETTER I
+0x844A 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
+0x844B 0x041A # CYRILLIC CAPITAL LETTER KA
+0x844C 0x041B # CYRILLIC CAPITAL LETTER EL
+0x844D 0x041C # CYRILLIC CAPITAL LETTER EM
+0x844E 0x041D # CYRILLIC CAPITAL LETTER EN
+0x844F 0x041E # CYRILLIC CAPITAL LETTER O
+0x8450 0x041F # CYRILLIC CAPITAL LETTER PE
+0x8451 0x0420 # CYRILLIC CAPITAL LETTER ER
+0x8452 0x0421 # CYRILLIC CAPITAL LETTER ES
+0x8453 0x0422 # CYRILLIC CAPITAL LETTER TE
+0x8454 0x0423 # CYRILLIC CAPITAL LETTER U
+0x8455 0x0424 # CYRILLIC CAPITAL LETTER EF
+0x8456 0x0425 # CYRILLIC CAPITAL LETTER HA
+0x8457 0x0426 # CYRILLIC CAPITAL LETTER TSE
+0x8458 0x0427 # CYRILLIC CAPITAL LETTER CHE
+0x8459 0x0428 # CYRILLIC CAPITAL LETTER SHA
+0x845A 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
+0x845B 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C 0x042B # CYRILLIC CAPITAL LETTER YERU
+0x845D 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E 0x042D # CYRILLIC CAPITAL LETTER E
+0x845F 0x042E # CYRILLIC CAPITAL LETTER YU
+0x8460 0x042F # CYRILLIC CAPITAL LETTER YA
+0x8470 0x0430 # CYRILLIC SMALL LETTER A
+0x8471 0x0431 # CYRILLIC SMALL LETTER BE
+0x8472 0x0432 # CYRILLIC SMALL LETTER VE
+0x8473 0x0433 # CYRILLIC SMALL LETTER GHE
+0x8474 0x0434 # CYRILLIC SMALL LETTER DE
+0x8475 0x0435 # CYRILLIC SMALL LETTER IE
+0x8476 0x0451 # CYRILLIC SMALL LETTER IO
+0x8477 0x0436 # CYRILLIC SMALL LETTER ZHE
+0x8478 0x0437 # CYRILLIC SMALL LETTER ZE
+0x8479 0x0438 # CYRILLIC SMALL LETTER I
+0x847A 0x0439 # CYRILLIC SMALL LETTER SHORT I
+0x847B 0x043A # CYRILLIC SMALL LETTER KA
+0x847C 0x043B # CYRILLIC SMALL LETTER EL
+0x847D 0x043C # CYRILLIC SMALL LETTER EM
+0x847E 0x043D # CYRILLIC SMALL LETTER EN
+0x8480 0x043E # CYRILLIC SMALL LETTER O
+0x8481 0x043F # CYRILLIC SMALL LETTER PE
+0x8482 0x0440 # CYRILLIC SMALL LETTER ER
+0x8483 0x0441 # CYRILLIC SMALL LETTER ES
+0x8484 0x0442 # CYRILLIC SMALL LETTER TE
+0x8485 0x0443 # CYRILLIC SMALL LETTER U
+0x8486 0x0444 # CYRILLIC SMALL LETTER EF
+0x8487 0x0445 # CYRILLIC SMALL LETTER HA
+0x8488 0x0446 # CYRILLIC SMALL LETTER TSE
+0x8489 0x0447 # CYRILLIC SMALL LETTER CHE
+0x848A 0x0448 # CYRILLIC SMALL LETTER SHA
+0x848B 0x0449 # CYRILLIC SMALL LETTER SHCHA
+0x848C 0x044A # CYRILLIC SMALL LETTER HARD SIGN
+0x848D 0x044B # CYRILLIC SMALL LETTER YERU
+0x848E 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
+0x848F 0x044D # CYRILLIC SMALL LETTER E
+0x8490 0x044E # CYRILLIC SMALL LETTER YU
+0x8491 0x044F # CYRILLIC SMALL LETTER YA
+0x849F 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
+0x84A0 0x2502 # BOX DRAWINGS LIGHT VERTICAL
+0x84A1 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x84A2 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84A3 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
+0x84A4 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
+0x84A5 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x84A6 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x84A7 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x84A8 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x84A9 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x84AA 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL
+0x84AB 0x2503 # BOX DRAWINGS HEAVY VERTICAL
+0x84AC 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT
+0x84AD 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT
+0x84AE 0x251B # BOX DRAWINGS HEAVY UP AND LEFT
+0x84AF 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT
+0x84B0 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+0x84B1 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+0x84B2 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+0x84B3 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+0x84B4 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+0x84B5 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+0x84B6 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+0x84B7 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+0x84B8 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+0x84B9 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+0x84BA 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+0x84BB 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+0x84BC 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+0x84BD 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+0x84BE 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+
+# Apple additions
+0x8540 0x2460 # CIRCLED DIGIT ONE
+0x8541 0x2461 # CIRCLED DIGIT TWO
+0x8542 0x2462 # CIRCLED DIGIT THREE
+0x8543 0x2463 # CIRCLED DIGIT FOUR
+0x8544 0x2464 # CIRCLED DIGIT FIVE
+0x8545 0x2465 # CIRCLED DIGIT SIX
+0x8546 0x2466 # CIRCLED DIGIT SEVEN
+0x8547 0x2467 # CIRCLED DIGIT EIGHT
+0x8548 0x2468 # CIRCLED DIGIT NINE
+0x8549 0x2469 # CIRCLED NUMBER TEN
+0x854A 0x246A # CIRCLED NUMBER ELEVEN
+0x854B 0x246B # CIRCLED NUMBER TWELVE
+0x854C 0x246C # CIRCLED NUMBER THIRTEEN
+0x854D 0x246D # CIRCLED NUMBER FOURTEEN
+0x854E 0x246E # CIRCLED NUMBER FIFTEEN
+0x854F 0x246F # CIRCLED NUMBER SIXTEEN
+0x8550 0x2470 # CIRCLED NUMBER SEVENTEEN
+0x8551 0x2471 # CIRCLED NUMBER EIGHTEEN
+0x8552 0x2472 # CIRCLED NUMBER NINETEEN
+0x8553 0x2473 # CIRCLED NUMBER TWENTY
+0x855E 0x2474 # PARENTHESIZED DIGIT ONE
+0x855F 0x2475 # PARENTHESIZED DIGIT TWO
+0x8560 0x2476 # PARENTHESIZED DIGIT THREE
+0x8561 0x2477 # PARENTHESIZED DIGIT FOUR
+0x8562 0x2478 # PARENTHESIZED DIGIT FIVE
+0x8563 0x2479 # PARENTHESIZED DIGIT SIX
+0x8564 0x247A # PARENTHESIZED DIGIT SEVEN
+0x8565 0x247B # PARENTHESIZED DIGIT EIGHT
+0x8566 0x247C # PARENTHESIZED DIGIT NINE
+0x8567 0x247D # PARENTHESIZED NUMBER TEN
+0x8568 0x247E # PARENTHESIZED NUMBER ELEVEN
+0x8569 0x247F # PARENTHESIZED NUMBER TWELVE
+0x856A 0x2480 # PARENTHESIZED NUMBER THIRTEEN
+0x856B 0x2481 # PARENTHESIZED NUMBER FOURTEEN
+0x856C 0x2482 # PARENTHESIZED NUMBER FIFTEEN
+0x856D 0x2483 # PARENTHESIZED NUMBER SIXTEEN
+0x856E 0x2484 # PARENTHESIZED NUMBER SEVENTEEN
+0x856F 0x2485 # PARENTHESIZED NUMBER EIGHTEEN
+0x8570 0x2486 # PARENTHESIZED NUMBER NINETEEN
+0x8571 0x2487 # PARENTHESIZED NUMBER TWENTY
+0x857C 0x2776 # DINGBAT NEGATIVE CIRCLED DIGIT ONE
+0x857D 0x2777 # DINGBAT NEGATIVE CIRCLED DIGIT TWO
+0x857E 0x2778 # DINGBAT NEGATIVE CIRCLED DIGIT THREE
+0x8580 0x2779 # DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+0x8581 0x277A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+0x8582 0x277B # DINGBAT NEGATIVE CIRCLED DIGIT SIX
+0x8583 0x277C # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+0x8584 0x277D # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+0x8585 0x277E # DINGBAT NEGATIVE CIRCLED DIGIT NINE
+0x8591 0xF860+0x0030+0x002E # digit zero full stop
+0x8592 0x2488 # DIGIT ONE FULL STOP
+0x8593 0x2489 # DIGIT TWO FULL STOP
+0x8594 0x248A # DIGIT THREE FULL STOP
+0x8595 0x248B # DIGIT FOUR FULL STOP
+0x8596 0x248C # DIGIT FIVE FULL STOP
+0x8597 0x248D # DIGIT SIX FULL STOP
+0x8598 0x248E # DIGIT SEVEN FULL STOP
+0x8599 0x248F # DIGIT EIGHT FULL STOP
+0x859A 0x2490 # DIGIT NINE FULL STOP
+0x859F 0x2160 # ROMAN NUMERAL ONE
+0x85A0 0x2161 # ROMAN NUMERAL TWO
+0x85A1 0x2162 # ROMAN NUMERAL THREE
+0x85A2 0x2163 # ROMAN NUMERAL FOUR
+0x85A3 0x2164 # ROMAN NUMERAL FIVE
+0x85A4 0x2165 # ROMAN NUMERAL SIX
+0x85A5 0x2166 # ROMAN NUMERAL SEVEN
+0x85A6 0x2167 # ROMAN NUMERAL EIGHT
+0x85A7 0x2168 # ROMAN NUMERAL NINE
+0x85A8 0x2169 # ROMAN NUMERAL TEN
+0x85A9 0x216A # ROMAN NUMERAL ELEVEN
+0x85AA 0x216B # ROMAN NUMERAL TWELVE
+0x85AB 0xF862+0x0058+0x0049+0x0049+0x0049 # roman numeral thirteen
+0x85AC 0xF861+0x0058+0x0049+0x0056 # roman numeral fourteen
+0x85AD 0xF860+0x0058+0x0056 # roman numeral fifteen
+0x85B3 0x2170 # SMALL ROMAN NUMERAL ONE
+0x85B4 0x2171 # SMALL ROMAN NUMERAL TWO
+0x85B5 0x2172 # SMALL ROMAN NUMERAL THREE
+0x85B6 0x2173 # SMALL ROMAN NUMERAL FOUR
+0x85B7 0x2174 # SMALL ROMAN NUMERAL FIVE
+0x85B8 0x2175 # SMALL ROMAN NUMERAL SIX
+0x85B9 0x2176 # SMALL ROMAN NUMERAL SEVEN
+0x85BA 0x2177 # SMALL ROMAN NUMERAL EIGHT
+0x85BB 0x2178 # SMALL ROMAN NUMERAL NINE
+0x85BC 0x2179 # SMALL ROMAN NUMERAL TEN
+0x85BD 0x217A # SMALL ROMAN NUMERAL ELEVEN
+0x85BE 0x217B # SMALL ROMAN NUMERAL TWELVE
+0x85BF 0xF862+0x0078+0x0069+0x0069+0x0069 # small roman numeral thirteen
+0x85C0 0xF861+0x0078+0x0069+0x0076 # small roman numeral fourteen
+0x85C1 0xF860+0x0078+0x0076 # small roman numeral fifteen
+0x85DB 0x249C # PARENTHESIZED LATIN SMALL LETTER A
+0x85DC 0x249D # PARENTHESIZED LATIN SMALL LETTER B
+0x85DD 0x249E # PARENTHESIZED LATIN SMALL LETTER C
+0x85DE 0x249F # PARENTHESIZED LATIN SMALL LETTER D
+0x85DF 0x24A0 # PARENTHESIZED LATIN SMALL LETTER E
+0x85E0 0x24A1 # PARENTHESIZED LATIN SMALL LETTER F
+0x85E1 0x24A2 # PARENTHESIZED LATIN SMALL LETTER G
+0x85E2 0x24A3 # PARENTHESIZED LATIN SMALL LETTER H
+0x85E3 0x24A4 # PARENTHESIZED LATIN SMALL LETTER I
+0x85E4 0x24A5 # PARENTHESIZED LATIN SMALL LETTER J
+0x85E5 0x24A6 # PARENTHESIZED LATIN SMALL LETTER K
+0x85E6 0x24A7 # PARENTHESIZED LATIN SMALL LETTER L
+0x85E7 0x24A8 # PARENTHESIZED LATIN SMALL LETTER M
+0x85E8 0x24A9 # PARENTHESIZED LATIN SMALL LETTER N
+0x85E9 0x24AA # PARENTHESIZED LATIN SMALL LETTER O
+0x85EA 0x24AB # PARENTHESIZED LATIN SMALL LETTER P
+0x85EB 0x24AC # PARENTHESIZED LATIN SMALL LETTER Q
+0x85EC 0x24AD # PARENTHESIZED LATIN SMALL LETTER R
+0x85ED 0x24AE # PARENTHESIZED LATIN SMALL LETTER S
+0x85EE 0x24AF # PARENTHESIZED LATIN SMALL LETTER T
+0x85EF 0x24B0 # PARENTHESIZED LATIN SMALL LETTER U
+0x85F0 0x24B1 # PARENTHESIZED LATIN SMALL LETTER V
+0x85F1 0x24B2 # PARENTHESIZED LATIN SMALL LETTER W
+0x85F2 0x24B3 # PARENTHESIZED LATIN SMALL LETTER X
+0x85F3 0x24B4 # PARENTHESIZED LATIN SMALL LETTER Y
+0x85F4 0x24B5 # PARENTHESIZED LATIN SMALL LETTER Z
+0x8640 0x339C # SQUARE MM
+0x8641 0x339F # SQUARE MM SQUARED
+0x8642 0x339D # SQUARE CM
+0x8643 0x33A0 # SQUARE CM SQUARED
+0x8644 0x33A4 # SQUARE CM CUBED
+0x8645 0xFF4D+0xF87F # square m
+0x8646 0x33A1 # SQUARE M SQUARED
+0x8647 0x33A5 # SQUARE M CUBED
+0x8648 0x339E # SQUARE KM
+0x8649 0x33A2 # SQUARE KM SQUARED
+0x864A 0x338E # SQUARE MG
+0x864B 0xFF47+0xF87F # square g
+0x864C 0x338F # SQUARE KG
+0x864D 0x33C4 # SQUARE CC
+0x864E 0x3396 # SQUARE ML
+0x864F 0x3397 # SQUARE DL
+0x8650 0x2113 # SCRIPT SMALL L
+0x8651 0x3398 # SQUARE KL
+0x8652 0x33B3 # SQUARE MS
+0x8653 0x33B2 # SQUARE MU S
+0x8654 0x33B1 # SQUARE NS
+0x8655 0x33B0 # SQUARE PS
+0x8656 0x2109 # DEGREE FAHRENHEIT
+0x8657 0x33D4 # SQUARE MB SMALL
+0x8658 0x33CB # SQUARE HP
+0x8659 0x3390 # SQUARE HZ
+0x865A 0x3385 # SQUARE KB
+0x865B 0x3386 # SQUARE MB
+0x865C 0x3387 # SQUARE GB
+0x865D 0xF860+0x0054+0x0042 # square TB
+0x869B 0x2116 # NUMERO SIGN
+0x869C 0x33CD # SQUARE KK
+0x869D 0x2121 # TELEPHONE SIGN
+0x869E 0xF861+0x0046+0x0041+0x0058 # FAX sign # or for Unicode 4.0, 0x213B FACSIMILE SIGN
+0x869F 0x2664 # WHITE SPADE SUIT
+0x86A0 0x2667 # WHITE CLUB SUIT
+0x86A1 0x2661 # WHITE HEART SUIT
+0x86A2 0x2662 # WHITE DIAMOND SUIT
+0x86A3 0x2660 # BLACK SPADE SUIT
+0x86A4 0x2663 # BLACK CLUB SUIT
+0x86A5 0x2665 # BLACK HEART SUIT
+0x86A6 0x2666 # BLACK DIAMOND SUIT
+0x86B3 0x3020 # POSTAL MARK FACE
+0x86B4 0x260E # BLACK TELEPHONE
+0x86B5 0x3004 # JAPANESE INDUSTRIAL STANDARD SYMBOL
+0x86C7 0x261E # WHITE RIGHT POINTING INDEX
+0x86C8 0x261C # WHITE LEFT POINTING INDEX
+0x86C9 0x261D # WHITE UP POINTING INDEX
+0x86CA 0x261F # WHITE DOWN POINTING INDEX
+0x86CB 0x21C6 # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+0x86CC 0x21C4 # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+0x86CD 0x21C5 # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+0x86CE 0xF860+0x2193+0x2191 # downwards arrow leftwards of upwards arrow
+0x86CF 0x21E8 # RIGHTWARDS WHITE ARROW
+0x86D0 0x21E6 # LEFTWARDS WHITE ARROW
+0x86D1 0x21E7 # UPWARDS WHITE ARROW
+0x86D2 0x21E9 # DOWNWARDS WHITE ARROW
+0x86D3 0x21E8+0xF87A # rightwards black arrow # or 0x27A1 BLACK RIGHTWARDS ARROW
+0x86D4 0x21E6+0xF87A # leftwards black arrow # or for Unicode 4.0, 0x2B05 LEFTWARDS BLACK ARROW
+0x86D5 0x21E7+0xF87A # upwards black arrow # or for Unicode 4.0, 0x2B06 UPWARDS BLACK ARROW
+0x86D6 0x21E9+0xF87A # downwards black arrow # or for Unicode 4.0, 0x2B07 DOWNWARDS BLACK ARROW
+0x8740 0x3230 # PARENTHESIZED IDEOGRAPH SUN
+0x8741 0x322A # PARENTHESIZED IDEOGRAPH MOON
+0x8742 0x322B # PARENTHESIZED IDEOGRAPH FIRE
+0x8743 0x322C # PARENTHESIZED IDEOGRAPH WATER
+0x8744 0x322D # PARENTHESIZED IDEOGRAPH WOOD
+0x8745 0x322E # PARENTHESIZED IDEOGRAPH METAL
+0x8746 0x322F # PARENTHESIZED IDEOGRAPH EARTH
+0x8747 0x3240 # PARENTHESIZED IDEOGRAPH FESTIVAL
+0x8748 0x3237 # PARENTHESIZED IDEOGRAPH CONGRATULATION
+0x8749 0x3242 # PARENTHESIZED IDEOGRAPH SELF
+0x874A 0x3243 # PARENTHESIZED IDEOGRAPH REACH
+0x874B 0x3239 # PARENTHESIZED IDEOGRAPH REPRESENT
+0x874C 0x323A # PARENTHESIZED IDEOGRAPH CALL
+0x874D 0x3231 # PARENTHESIZED IDEOGRAPH STOCK
+0x874E 0x323E # PARENTHESIZED IDEOGRAPH RESOURCE
+0x874F 0x3234 # PARENTHESIZED IDEOGRAPH NAME
+0x8750 0x3232 # PARENTHESIZED IDEOGRAPH HAVE
+0x8751 0x323B # PARENTHESIZED IDEOGRAPH STUDY
+0x8752 0x3236 # PARENTHESIZED IDEOGRAPH FINANCIAL
+0x8753 0x3233 # PARENTHESIZED IDEOGRAPH SOCIETY
+0x8754 0x3235 # PARENTHESIZED IDEOGRAPH SPECIAL
+0x8755 0x323C # PARENTHESIZED IDEOGRAPH SUPERVISE
+0x8756 0x323D # PARENTHESIZED IDEOGRAPH ENTERPRISE
+0x8757 0x323F # PARENTHESIZED IDEOGRAPH ALLIANCE
+0x8758 0x3238 # PARENTHESIZED IDEOGRAPH LABOR
+0x8791 0x5927+0x20DD # ideograph big + COMBINING ENCLOSING CIRCLE
+0x8792 0x5C0F+0x20DD # ideograph small + COMBINING ENCLOSING CIRCLE
+0x8793 0x32A4 # CIRCLED IDEOGRAPH HIGH
+0x8794 0x32A5 # CIRCLED IDEOGRAPH CENTRE
+0x8795 0x32A6 # CIRCLED IDEOGRAPH LOW
+0x8796 0x32A7 # CIRCLED IDEOGRAPH LEFT
+0x8797 0x32A8 # CIRCLED IDEOGRAPH RIGHT
+0x8798 0x32A9 # CIRCLED IDEOGRAPH MEDICINE
+0x8799 0x3296 # CIRCLED IDEOGRAPH FINANCIAL
+0x879A 0x329D # CIRCLED IDEOGRAPH EXCELLENT
+0x879B 0x3298 # CIRCLED IDEOGRAPH LABOR
+0x879C 0x329E # CIRCLED IDEOGRAPH PRINT
+0x879D 0x63A7+0x20DD # ideograph memo + COMBINING ENCLOSING CIRCLE
+0x879E 0x3299 # CIRCLED IDEOGRAPH SECRET
+0x879F 0x3349 # SQUARE MIRI
+0x87A0 0x3322 # SQUARE SENTI
+0x87A1 0x334D # SQUARE MEETORU
+0x87A2 0x3314 # SQUARE KIRO
+0x87A3 0x3316 # SQUARE KIROMEETORU
+0x87A4 0x3305 # SQUARE INTI
+0x87A5 0x3333 # SQUARE HUIITO
+0x87A6 0x334E # SQUARE YAADO
+0x87A7 0x3303 # SQUARE AARU
+0x87A8 0x3336 # SQUARE HEKUTAARU
+0x87A9 0x3318 # SQUARE GURAMU
+0x87AA 0x3315 # SQUARE KIROGURAMU
+0x87AB 0x3327 # SQUARE TON
+0x87AC 0x3351 # SQUARE RITTORU
+0x87AD 0x334A # SQUARE MIRIBAARU
+0x87AE 0x3339 # SQUARE HERUTU
+0x87AF 0x3357 # SQUARE WATTO
+0x87B0 0x330D # SQUARE KARORII
+0x87B1 0x3342 # SQUARE HOON
+0x87B2 0x3323 # SQUARE SENTO
+0x87B3 0x3326 # SQUARE DORU
+0x87B4 0x333B # SQUARE PEEZI
+0x87B5 0x332B # SQUARE PAASENTO
+0x87BD 0x3300 # SQUARE APAATO
+0x87BE 0x331E # SQUARE KOOPO
+0x87BF 0x332A # SQUARE HAITU
+0x87C0 0x3331 # SQUARE BIRU
+0x87C1 0x3347 # SQUARE MANSYON
+0x87E5 0x337E # SQUARE ERA NAME MEIZI
+0x87E6 0x337D # SQUARE ERA NAME TAISYOU
+0x87E7 0x337C # SQUARE ERA NAME SYOUWA
+0x87E8 0x337B # SQUARE ERA NAME HEISEI
+0x87FA 0x337F # SQUARE CORPORATION
+0x87FB 0xF862+0x6709+0x9650+0x4F1A+0x793E # square "limited company, ltd. [yuugen gaisha]"
+0x87FC 0xF862+0x8CA1+0x56E3+0x6CD5+0x4EBA # square "foundation [zaidan houjin]"
+0x8840 0x222E # CONTOUR INTEGRAL
+0x8841 0x221F # RIGHT ANGLE
+0x8842 0x22BF # RIGHT TRIANGLE
+0x8854 0x301D # REVERSED DOUBLE PRIME QUOTATION MARK
+0x8855 0x301F # LOW DOUBLE PRIME QUOTATION MARK
+0x8868 0x3094 # HIRAGANA LETTER VU
+0x886A 0x30F7 # KATAKANA LETTER VA
+0x886B 0x30F8 # KATAKANA LETTER VI
+0x886C 0x30F9 # KATAKANA LETTER VE
+0x886D 0x30FA # KATAKANA LETTER VO
+
+# Standard
+0x889F 0x4E9C # <CJK>
+0x88A0 0x5516 # <CJK>
+0x88A1 0x5A03 # <CJK>
+0x88A2 0x963F # <CJK>
+0x88A3 0x54C0 # <CJK>
+0x88A4 0x611B # <CJK>
+0x88A5 0x6328 # <CJK>
+0x88A6 0x59F6 # <CJK>
+0x88A7 0x9022 # <CJK>
+0x88A8 0x8475 # <CJK>
+0x88A9 0x831C # <CJK>
+0x88AA 0x7A50 # <CJK>
+0x88AB 0x60AA # <CJK>
+0x88AC 0x63E1 # <CJK>
+0x88AD 0x6E25 # <CJK>
+0x88AE 0x65ED # <CJK>
+0x88AF 0x8466 # <CJK>
+0x88B0 0x82A6 # <CJK>
+0x88B1 0x9BF5 # <CJK>
+0x88B2 0x6893 # <CJK>
+0x88B3 0x5727 # <CJK>
+0x88B4 0x65A1 # <CJK>
+0x88B5 0x6271 # <CJK>
+0x88B6 0x5B9B # <CJK>
+0x88B7 0x59D0 # <CJK>
+0x88B8 0x867B # <CJK>
+0x88B9 0x98F4 # <CJK>
+0x88BA 0x7D62 # <CJK>
+0x88BB 0x7DBE # <CJK>
+0x88BC 0x9B8E # <CJK>
+0x88BD 0x6216 # <CJK>
+0x88BE 0x7C9F # <CJK>
+0x88BF 0x88B7 # <CJK>
+0x88C0 0x5B89 # <CJK>
+0x88C1 0x5EB5 # <CJK>
+0x88C2 0x6309 # <CJK>
+0x88C3 0x6697 # <CJK>
+0x88C4 0x6848 # <CJK>
+0x88C5 0x95C7 # <CJK>
+0x88C6 0x978D # <CJK>
+0x88C7 0x674F # <CJK>
+0x88C8 0x4EE5 # <CJK>
+0x88C9 0x4F0A # <CJK>
+0x88CA 0x4F4D # <CJK>
+0x88CB 0x4F9D # <CJK>
+0x88CC 0x5049 # <CJK>
+0x88CD 0x56F2 # <CJK>
+0x88CE 0x5937 # <CJK>
+0x88CF 0x59D4 # <CJK>
+0x88D0 0x5A01 # <CJK>
+0x88D1 0x5C09 # <CJK>
+0x88D2 0x60DF # <CJK>
+0x88D3 0x610F # <CJK>
+0x88D4 0x6170 # <CJK>
+0x88D5 0x6613 # <CJK>
+0x88D6 0x6905 # <CJK>
+0x88D7 0x70BA # <CJK>
+0x88D8 0x754F # <CJK>
+0x88D9 0x7570 # <CJK>
+0x88DA 0x79FB # <CJK>
+0x88DB 0x7DAD # <CJK>
+0x88DC 0x7DEF # <CJK>
+0x88DD 0x80C3 # <CJK>
+0x88DE 0x840E # <CJK>
+0x88DF 0x8863 # <CJK>
+0x88E0 0x8B02 # <CJK>
+0x88E1 0x9055 # <CJK>
+0x88E2 0x907A # <CJK>
+0x88E3 0x533B # <CJK>
+0x88E4 0x4E95 # <CJK>
+0x88E5 0x4EA5 # <CJK>
+0x88E6 0x57DF # <CJK>
+0x88E7 0x80B2 # <CJK>
+0x88E8 0x90C1 # <CJK>
+0x88E9 0x78EF # <CJK>
+0x88EA 0x4E00 # <CJK>
+0x88EB 0x58F1 # <CJK>
+0x88EC 0x6EA2 # <CJK>
+0x88ED 0x9038 # <CJK>
+0x88EE 0x7A32 # <CJK>
+0x88EF 0x8328 # <CJK>
+0x88F0 0x828B # <CJK>
+0x88F1 0x9C2F # <CJK>
+0x88F2 0x5141 # <CJK>
+0x88F3 0x5370 # <CJK>
+0x88F4 0x54BD # <CJK>
+0x88F5 0x54E1 # <CJK>
+0x88F6 0x56E0 # <CJK>
+0x88F7 0x59FB # <CJK>
+0x88F8 0x5F15 # <CJK>
+0x88F9 0x98F2 # <CJK>
+0x88FA 0x6DEB # <CJK>
+0x88FB 0x80E4 # <CJK>
+0x88FC 0x852D # <CJK>
+0x8940 0x9662 # <CJK>
+0x8941 0x9670 # <CJK>
+0x8942 0x96A0 # <CJK>
+0x8943 0x97FB # <CJK>
+0x8944 0x540B # <CJK>
+0x8945 0x53F3 # <CJK>
+0x8946 0x5B87 # <CJK>
+0x8947 0x70CF # <CJK>
+0x8948 0x7FBD # <CJK>
+0x8949 0x8FC2 # <CJK>
+0x894A 0x96E8 # <CJK>
+0x894B 0x536F # <CJK>
+0x894C 0x9D5C # <CJK>
+0x894D 0x7ABA # <CJK>
+0x894E 0x4E11 # <CJK>
+0x894F 0x7893 # <CJK>
+0x8950 0x81FC # <CJK>
+0x8951 0x6E26 # <CJK>
+0x8952 0x5618 # <CJK>
+0x8953 0x5504 # <CJK>
+0x8954 0x6B1D # <CJK>
+0x8955 0x851A # <CJK>
+0x8956 0x9C3B # <CJK>
+0x8957 0x59E5 # <CJK>
+0x8958 0x53A9 # <CJK>
+0x8959 0x6D66 # <CJK>
+0x895A 0x74DC # <CJK>
+0x895B 0x958F # <CJK>
+0x895C 0x5642 # <CJK>
+0x895D 0x4E91 # <CJK>
+0x895E 0x904B # <CJK>
+0x895F 0x96F2 # <CJK>
+0x8960 0x834F # <CJK>
+0x8961 0x990C # <CJK>
+0x8962 0x53E1 # <CJK>
+0x8963 0x55B6 # <CJK>
+0x8964 0x5B30 # <CJK>
+0x8965 0x5F71 # <CJK>
+0x8966 0x6620 # <CJK>
+0x8967 0x66F3 # <CJK>
+0x8968 0x6804 # <CJK>
+0x8969 0x6C38 # <CJK>
+0x896A 0x6CF3 # <CJK>
+0x896B 0x6D29 # <CJK>
+0x896C 0x745B # <CJK>
+0x896D 0x76C8 # <CJK>
+0x896E 0x7A4E # <CJK>
+0x896F 0x9834 # <CJK>
+0x8970 0x82F1 # <CJK>
+0x8971 0x885B # <CJK>
+0x8972 0x8A60 # <CJK>
+0x8973 0x92ED # <CJK>
+0x8974 0x6DB2 # <CJK>
+0x8975 0x75AB # <CJK>
+0x8976 0x76CA # <CJK>
+0x8977 0x99C5 # <CJK>
+0x8978 0x60A6 # <CJK>
+0x8979 0x8B01 # <CJK>
+0x897A 0x8D8A # <CJK>
+0x897B 0x95B2 # <CJK>
+0x897C 0x698E # <CJK>
+0x897D 0x53AD # <CJK>
+0x897E 0x5186 # <CJK>
+0x8980 0x5712 # <CJK>
+0x8981 0x5830 # <CJK>
+0x8982 0x5944 # <CJK>
+0x8983 0x5BB4 # <CJK>
+0x8984 0x5EF6 # <CJK>
+0x8985 0x6028 # <CJK>
+0x8986 0x63A9 # <CJK>
+0x8987 0x63F4 # <CJK>
+0x8988 0x6CBF # <CJK>
+0x8989 0x6F14 # <CJK>
+0x898A 0x708E # <CJK>
+0x898B 0x7114 # <CJK>
+0x898C 0x7159 # <CJK>
+0x898D 0x71D5 # <CJK>
+0x898E 0x733F # <CJK>
+0x898F 0x7E01 # <CJK>
+0x8990 0x8276 # <CJK>
+0x8991 0x82D1 # <CJK>
+0x8992 0x8597 # <CJK>
+0x8993 0x9060 # <CJK>
+0x8994 0x925B # <CJK>
+0x8995 0x9D1B # <CJK>
+0x8996 0x5869 # <CJK>
+0x8997 0x65BC # <CJK>
+0x8998 0x6C5A # <CJK>
+0x8999 0x7525 # <CJK>
+0x899A 0x51F9 # <CJK>
+0x899B 0x592E # <CJK>
+0x899C 0x5965 # <CJK>
+0x899D 0x5F80 # <CJK>
+0x899E 0x5FDC # <CJK>
+0x899F 0x62BC # <CJK>
+0x89A0 0x65FA # <CJK>
+0x89A1 0x6A2A # <CJK>
+0x89A2 0x6B27 # <CJK>
+0x89A3 0x6BB4 # <CJK>
+0x89A4 0x738B # <CJK>
+0x89A5 0x7FC1 # <CJK>
+0x89A6 0x8956 # <CJK>
+0x89A7 0x9D2C # <CJK>
+0x89A8 0x9D0E # <CJK>
+0x89A9 0x9EC4 # <CJK>
+0x89AA 0x5CA1 # <CJK>
+0x89AB 0x6C96 # <CJK>
+0x89AC 0x837B # <CJK>
+0x89AD 0x5104 # <CJK>
+0x89AE 0x5C4B # <CJK>
+0x89AF 0x61B6 # <CJK>
+0x89B0 0x81C6 # <CJK>
+0x89B1 0x6876 # <CJK>
+0x89B2 0x7261 # <CJK>
+0x89B3 0x4E59 # <CJK>
+0x89B4 0x4FFA # <CJK>
+0x89B5 0x5378 # <CJK>
+0x89B6 0x6069 # <CJK>
+0x89B7 0x6E29 # <CJK>
+0x89B8 0x7A4F # <CJK>
+0x89B9 0x97F3 # <CJK>
+0x89BA 0x4E0B # <CJK>
+0x89BB 0x5316 # <CJK>
+0x89BC 0x4EEE # <CJK>
+0x89BD 0x4F55 # <CJK>
+0x89BE 0x4F3D # <CJK>
+0x89BF 0x4FA1 # <CJK>
+0x89C0 0x4F73 # <CJK>
+0x89C1 0x52A0 # <CJK>
+0x89C2 0x53EF # <CJK>
+0x89C3 0x5609 # <CJK>
+0x89C4 0x590F # <CJK>
+0x89C5 0x5AC1 # <CJK>
+0x89C6 0x5BB6 # <CJK>
+0x89C7 0x5BE1 # <CJK>
+0x89C8 0x79D1 # <CJK>
+0x89C9 0x6687 # <CJK>
+0x89CA 0x679C # <CJK>
+0x89CB 0x67B6 # <CJK>
+0x89CC 0x6B4C # <CJK>
+0x89CD 0x6CB3 # <CJK>
+0x89CE 0x706B # <CJK>
+0x89CF 0x73C2 # <CJK>
+0x89D0 0x798D # <CJK>
+0x89D1 0x79BE # <CJK>
+0x89D2 0x7A3C # <CJK>
+0x89D3 0x7B87 # <CJK>
+0x89D4 0x82B1 # <CJK>
+0x89D5 0x82DB # <CJK>
+0x89D6 0x8304 # <CJK>
+0x89D7 0x8377 # <CJK>
+0x89D8 0x83EF # <CJK>
+0x89D9 0x83D3 # <CJK>
+0x89DA 0x8766 # <CJK>
+0x89DB 0x8AB2 # <CJK>
+0x89DC 0x5629 # <CJK>
+0x89DD 0x8CA8 # <CJK>
+0x89DE 0x8FE6 # <CJK>
+0x89DF 0x904E # <CJK>
+0x89E0 0x971E # <CJK>
+0x89E1 0x868A # <CJK>
+0x89E2 0x4FC4 # <CJK>
+0x89E3 0x5CE8 # <CJK>
+0x89E4 0x6211 # <CJK>
+0x89E5 0x7259 # <CJK>
+0x89E6 0x753B # <CJK>
+0x89E7 0x81E5 # <CJK>
+0x89E8 0x82BD # <CJK>
+0x89E9 0x86FE # <CJK>
+0x89EA 0x8CC0 # <CJK>
+0x89EB 0x96C5 # <CJK>
+0x89EC 0x9913 # <CJK>
+0x89ED 0x99D5 # <CJK>
+0x89EE 0x4ECB # <CJK>
+0x89EF 0x4F1A # <CJK>
+0x89F0 0x89E3 # <CJK>
+0x89F1 0x56DE # <CJK>
+0x89F2 0x584A # <CJK>
+0x89F3 0x58CA # <CJK>
+0x89F4 0x5EFB # <CJK>
+0x89F5 0x5FEB # <CJK>
+0x89F6 0x602A # <CJK>
+0x89F7 0x6094 # <CJK>
+0x89F8 0x6062 # <CJK>
+0x89F9 0x61D0 # <CJK>
+0x89FA 0x6212 # <CJK>
+0x89FB 0x62D0 # <CJK>
+0x89FC 0x6539 # <CJK>
+0x8A40 0x9B41 # <CJK>
+0x8A41 0x6666 # <CJK>
+0x8A42 0x68B0 # <CJK>
+0x8A43 0x6D77 # <CJK>
+0x8A44 0x7070 # <CJK>
+0x8A45 0x754C # <CJK>
+0x8A46 0x7686 # <CJK>
+0x8A47 0x7D75 # <CJK>
+0x8A48 0x82A5 # <CJK>
+0x8A49 0x87F9 # <CJK>
+0x8A4A 0x958B # <CJK>
+0x8A4B 0x968E # <CJK>
+0x8A4C 0x8C9D # <CJK>
+0x8A4D 0x51F1 # <CJK>
+0x8A4E 0x52BE # <CJK>
+0x8A4F 0x5916 # <CJK>
+0x8A50 0x54B3 # <CJK>
+0x8A51 0x5BB3 # <CJK>
+0x8A52 0x5D16 # <CJK>
+0x8A53 0x6168 # <CJK>
+0x8A54 0x6982 # <CJK>
+0x8A55 0x6DAF # <CJK>
+0x8A56 0x788D # <CJK>
+0x8A57 0x84CB # <CJK>
+0x8A58 0x8857 # <CJK>
+0x8A59 0x8A72 # <CJK>
+0x8A5A 0x93A7 # <CJK>
+0x8A5B 0x9AB8 # <CJK>
+0x8A5C 0x6D6C # <CJK>
+0x8A5D 0x99A8 # <CJK>
+0x8A5E 0x86D9 # <CJK>
+0x8A5F 0x57A3 # <CJK>
+0x8A60 0x67FF # <CJK>
+0x8A61 0x86CE # <CJK>
+0x8A62 0x920E # <CJK>
+0x8A63 0x5283 # <CJK>
+0x8A64 0x5687 # <CJK>
+0x8A65 0x5404 # <CJK>
+0x8A66 0x5ED3 # <CJK>
+0x8A67 0x62E1 # <CJK>
+0x8A68 0x64B9 # <CJK>
+0x8A69 0x683C # <CJK>
+0x8A6A 0x6838 # <CJK>
+0x8A6B 0x6BBB # <CJK>
+0x8A6C 0x7372 # <CJK>
+0x8A6D 0x78BA # <CJK>
+0x8A6E 0x7A6B # <CJK>
+0x8A6F 0x899A # <CJK>
+0x8A70 0x89D2 # <CJK>
+0x8A71 0x8D6B # <CJK>
+0x8A72 0x8F03 # <CJK>
+0x8A73 0x90ED # <CJK>
+0x8A74 0x95A3 # <CJK>
+0x8A75 0x9694 # <CJK>
+0x8A76 0x9769 # <CJK>
+0x8A77 0x5B66 # <CJK>
+0x8A78 0x5CB3 # <CJK>
+0x8A79 0x697D # <CJK>
+0x8A7A 0x984D # <CJK>
+0x8A7B 0x984E # <CJK>
+0x8A7C 0x639B # <CJK>
+0x8A7D 0x7B20 # <CJK>
+0x8A7E 0x6A2B # <CJK>
+0x8A80 0x6A7F # <CJK>
+0x8A81 0x68B6 # <CJK>
+0x8A82 0x9C0D # <CJK>
+0x8A83 0x6F5F # <CJK>
+0x8A84 0x5272 # <CJK>
+0x8A85 0x559D # <CJK>
+0x8A86 0x6070 # <CJK>
+0x8A87 0x62EC # <CJK>
+0x8A88 0x6D3B # <CJK>
+0x8A89 0x6E07 # <CJK>
+0x8A8A 0x6ED1 # <CJK>
+0x8A8B 0x845B # <CJK>
+0x8A8C 0x8910 # <CJK>
+0x8A8D 0x8F44 # <CJK>
+0x8A8E 0x4E14 # <CJK>
+0x8A8F 0x9C39 # <CJK>
+0x8A90 0x53F6 # <CJK>
+0x8A91 0x691B # <CJK>
+0x8A92 0x6A3A # <CJK>
+0x8A93 0x9784 # <CJK>
+0x8A94 0x682A # <CJK>
+0x8A95 0x515C # <CJK>
+0x8A96 0x7AC3 # <CJK>
+0x8A97 0x84B2 # <CJK>
+0x8A98 0x91DC # <CJK>
+0x8A99 0x938C # <CJK>
+0x8A9A 0x565B # <CJK>
+0x8A9B 0x9D28 # <CJK>
+0x8A9C 0x6822 # <CJK>
+0x8A9D 0x8305 # <CJK>
+0x8A9E 0x8431 # <CJK>
+0x8A9F 0x7CA5 # <CJK>
+0x8AA0 0x5208 # <CJK>
+0x8AA1 0x82C5 # <CJK>
+0x8AA2 0x74E6 # <CJK>
+0x8AA3 0x4E7E # <CJK>
+0x8AA4 0x4F83 # <CJK>
+0x8AA5 0x51A0 # <CJK>
+0x8AA6 0x5BD2 # <CJK>
+0x8AA7 0x520A # <CJK>
+0x8AA8 0x52D8 # <CJK>
+0x8AA9 0x52E7 # <CJK>
+0x8AAA 0x5DFB # <CJK>
+0x8AAB 0x559A # <CJK>
+0x8AAC 0x582A # <CJK>
+0x8AAD 0x59E6 # <CJK>
+0x8AAE 0x5B8C # <CJK>
+0x8AAF 0x5B98 # <CJK>
+0x8AB0 0x5BDB # <CJK>
+0x8AB1 0x5E72 # <CJK>
+0x8AB2 0x5E79 # <CJK>
+0x8AB3 0x60A3 # <CJK>
+0x8AB4 0x611F # <CJK>
+0x8AB5 0x6163 # <CJK>
+0x8AB6 0x61BE # <CJK>
+0x8AB7 0x63DB # <CJK>
+0x8AB8 0x6562 # <CJK>
+0x8AB9 0x67D1 # <CJK>
+0x8ABA 0x6853 # <CJK>
+0x8ABB 0x68FA # <CJK>
+0x8ABC 0x6B3E # <CJK>
+0x8ABD 0x6B53 # <CJK>
+0x8ABE 0x6C57 # <CJK>
+0x8ABF 0x6F22 # <CJK>
+0x8AC0 0x6F97 # <CJK>
+0x8AC1 0x6F45 # <CJK>
+0x8AC2 0x74B0 # <CJK>
+0x8AC3 0x7518 # <CJK>
+0x8AC4 0x76E3 # <CJK>
+0x8AC5 0x770B # <CJK>
+0x8AC6 0x7AFF # <CJK>
+0x8AC7 0x7BA1 # <CJK>
+0x8AC8 0x7C21 # <CJK>
+0x8AC9 0x7DE9 # <CJK>
+0x8ACA 0x7F36 # <CJK>
+0x8ACB 0x7FF0 # <CJK>
+0x8ACC 0x809D # <CJK>
+0x8ACD 0x8266 # <CJK>
+0x8ACE 0x839E # <CJK>
+0x8ACF 0x89B3 # <CJK>
+0x8AD0 0x8ACC # <CJK>
+0x8AD1 0x8CAB # <CJK>
+0x8AD2 0x9084 # <CJK>
+0x8AD3 0x9451 # <CJK>
+0x8AD4 0x9593 # <CJK>
+0x8AD5 0x9591 # <CJK>
+0x8AD6 0x95A2 # <CJK>
+0x8AD7 0x9665 # <CJK>
+0x8AD8 0x97D3 # <CJK>
+0x8AD9 0x9928 # <CJK>
+0x8ADA 0x8218 # <CJK>
+0x8ADB 0x4E38 # <CJK>
+0x8ADC 0x542B # <CJK>
+0x8ADD 0x5CB8 # <CJK>
+0x8ADE 0x5DCC # <CJK>
+0x8ADF 0x73A9 # <CJK>
+0x8AE0 0x764C # <CJK>
+0x8AE1 0x773C # <CJK>
+0x8AE2 0x5CA9 # <CJK>
+0x8AE3 0x7FEB # <CJK>
+0x8AE4 0x8D0B # <CJK>
+0x8AE5 0x96C1 # <CJK>
+0x8AE6 0x9811 # <CJK>
+0x8AE7 0x9854 # <CJK>
+0x8AE8 0x9858 # <CJK>
+0x8AE9 0x4F01 # <CJK>
+0x8AEA 0x4F0E # <CJK>
+0x8AEB 0x5371 # <CJK>
+0x8AEC 0x559C # <CJK>
+0x8AED 0x5668 # <CJK>
+0x8AEE 0x57FA # <CJK>
+0x8AEF 0x5947 # <CJK>
+0x8AF0 0x5B09 # <CJK>
+0x8AF1 0x5BC4 # <CJK>
+0x8AF2 0x5C90 # <CJK>
+0x8AF3 0x5E0C # <CJK>
+0x8AF4 0x5E7E # <CJK>
+0x8AF5 0x5FCC # <CJK>
+0x8AF6 0x63EE # <CJK>
+0x8AF7 0x673A # <CJK>
+0x8AF8 0x65D7 # <CJK>
+0x8AF9 0x65E2 # <CJK>
+0x8AFA 0x671F # <CJK>
+0x8AFB 0x68CB # <CJK>
+0x8AFC 0x68C4 # <CJK>
+0x8B40 0x6A5F # <CJK>
+0x8B41 0x5E30 # <CJK>
+0x8B42 0x6BC5 # <CJK>
+0x8B43 0x6C17 # <CJK>
+0x8B44 0x6C7D # <CJK>
+0x8B45 0x757F # <CJK>
+0x8B46 0x7948 # <CJK>
+0x8B47 0x5B63 # <CJK>
+0x8B48 0x7A00 # <CJK>
+0x8B49 0x7D00 # <CJK>
+0x8B4A 0x5FBD # <CJK>
+0x8B4B 0x898F # <CJK>
+0x8B4C 0x8A18 # <CJK>
+0x8B4D 0x8CB4 # <CJK>
+0x8B4E 0x8D77 # <CJK>
+0x8B4F 0x8ECC # <CJK>
+0x8B50 0x8F1D # <CJK>
+0x8B51 0x98E2 # <CJK>
+0x8B52 0x9A0E # <CJK>
+0x8B53 0x9B3C # <CJK>
+0x8B54 0x4E80 # <CJK>
+0x8B55 0x507D # <CJK>
+0x8B56 0x5100 # <CJK>
+0x8B57 0x5993 # <CJK>
+0x8B58 0x5B9C # <CJK>
+0x8B59 0x622F # <CJK>
+0x8B5A 0x6280 # <CJK>
+0x8B5B 0x64EC # <CJK>
+0x8B5C 0x6B3A # <CJK>
+0x8B5D 0x72A0 # <CJK>
+0x8B5E 0x7591 # <CJK>
+0x8B5F 0x7947 # <CJK>
+0x8B60 0x7FA9 # <CJK>
+0x8B61 0x87FB # <CJK>
+0x8B62 0x8ABC # <CJK>
+0x8B63 0x8B70 # <CJK>
+0x8B64 0x63AC # <CJK>
+0x8B65 0x83CA # <CJK>
+0x8B66 0x97A0 # <CJK>
+0x8B67 0x5409 # <CJK>
+0x8B68 0x5403 # <CJK>
+0x8B69 0x55AB # <CJK>
+0x8B6A 0x6854 # <CJK>
+0x8B6B 0x6A58 # <CJK>
+0x8B6C 0x8A70 # <CJK>
+0x8B6D 0x7827 # <CJK>
+0x8B6E 0x6775 # <CJK>
+0x8B6F 0x9ECD # <CJK>
+0x8B70 0x5374 # <CJK>
+0x8B71 0x5BA2 # <CJK>
+0x8B72 0x811A # <CJK>
+0x8B73 0x8650 # <CJK>
+0x8B74 0x9006 # <CJK>
+0x8B75 0x4E18 # <CJK>
+0x8B76 0x4E45 # <CJK>
+0x8B77 0x4EC7 # <CJK>
+0x8B78 0x4F11 # <CJK>
+0x8B79 0x53CA # <CJK>
+0x8B7A 0x5438 # <CJK>
+0x8B7B 0x5BAE # <CJK>
+0x8B7C 0x5F13 # <CJK>
+0x8B7D 0x6025 # <CJK>
+0x8B7E 0x6551 # <CJK>
+0x8B80 0x673D # <CJK>
+0x8B81 0x6C42 # <CJK>
+0x8B82 0x6C72 # <CJK>
+0x8B83 0x6CE3 # <CJK>
+0x8B84 0x7078 # <CJK>
+0x8B85 0x7403 # <CJK>
+0x8B86 0x7A76 # <CJK>
+0x8B87 0x7AAE # <CJK>
+0x8B88 0x7B08 # <CJK>
+0x8B89 0x7D1A # <CJK>
+0x8B8A 0x7CFE # <CJK>
+0x8B8B 0x7D66 # <CJK>
+0x8B8C 0x65E7 # <CJK>
+0x8B8D 0x725B # <CJK>
+0x8B8E 0x53BB # <CJK>
+0x8B8F 0x5C45 # <CJK>
+0x8B90 0x5DE8 # <CJK>
+0x8B91 0x62D2 # <CJK>
+0x8B92 0x62E0 # <CJK>
+0x8B93 0x6319 # <CJK>
+0x8B94 0x6E20 # <CJK>
+0x8B95 0x865A # <CJK>
+0x8B96 0x8A31 # <CJK>
+0x8B97 0x8DDD # <CJK>
+0x8B98 0x92F8 # <CJK>
+0x8B99 0x6F01 # <CJK>
+0x8B9A 0x79A6 # <CJK>
+0x8B9B 0x9B5A # <CJK>
+0x8B9C 0x4EA8 # <CJK>
+0x8B9D 0x4EAB # <CJK>
+0x8B9E 0x4EAC # <CJK>
+0x8B9F 0x4F9B # <CJK>
+0x8BA0 0x4FA0 # <CJK>
+0x8BA1 0x50D1 # <CJK>
+0x8BA2 0x5147 # <CJK>
+0x8BA3 0x7AF6 # <CJK>
+0x8BA4 0x5171 # <CJK>
+0x8BA5 0x51F6 # <CJK>
+0x8BA6 0x5354 # <CJK>
+0x8BA7 0x5321 # <CJK>
+0x8BA8 0x537F # <CJK>
+0x8BA9 0x53EB # <CJK>
+0x8BAA 0x55AC # <CJK>
+0x8BAB 0x5883 # <CJK>
+0x8BAC 0x5CE1 # <CJK>
+0x8BAD 0x5F37 # <CJK>
+0x8BAE 0x5F4A # <CJK>
+0x8BAF 0x602F # <CJK>
+0x8BB0 0x6050 # <CJK>
+0x8BB1 0x606D # <CJK>
+0x8BB2 0x631F # <CJK>
+0x8BB3 0x6559 # <CJK>
+0x8BB4 0x6A4B # <CJK>
+0x8BB5 0x6CC1 # <CJK>
+0x8BB6 0x72C2 # <CJK>
+0x8BB7 0x72ED # <CJK>
+0x8BB8 0x77EF # <CJK>
+0x8BB9 0x80F8 # <CJK>
+0x8BBA 0x8105 # <CJK>
+0x8BBB 0x8208 # <CJK>
+0x8BBC 0x854E # <CJK>
+0x8BBD 0x90F7 # <CJK>
+0x8BBE 0x93E1 # <CJK>
+0x8BBF 0x97FF # <CJK>
+0x8BC0 0x9957 # <CJK>
+0x8BC1 0x9A5A # <CJK>
+0x8BC2 0x4EF0 # <CJK>
+0x8BC3 0x51DD # <CJK>
+0x8BC4 0x5C2D # <CJK>
+0x8BC5 0x6681 # <CJK>
+0x8BC6 0x696D # <CJK>
+0x8BC7 0x5C40 # <CJK>
+0x8BC8 0x66F2 # <CJK>
+0x8BC9 0x6975 # <CJK>
+0x8BCA 0x7389 # <CJK>
+0x8BCB 0x6850 # <CJK>
+0x8BCC 0x7C81 # <CJK>
+0x8BCD 0x50C5 # <CJK>
+0x8BCE 0x52E4 # <CJK>
+0x8BCF 0x5747 # <CJK>
+0x8BD0 0x5DFE # <CJK>
+0x8BD1 0x9326 # <CJK>
+0x8BD2 0x65A4 # <CJK>
+0x8BD3 0x6B23 # <CJK>
+0x8BD4 0x6B3D # <CJK>
+0x8BD5 0x7434 # <CJK>
+0x8BD6 0x7981 # <CJK>
+0x8BD7 0x79BD # <CJK>
+0x8BD8 0x7B4B # <CJK>
+0x8BD9 0x7DCA # <CJK>
+0x8BDA 0x82B9 # <CJK>
+0x8BDB 0x83CC # <CJK>
+0x8BDC 0x887F # <CJK>
+0x8BDD 0x895F # <CJK>
+0x8BDE 0x8B39 # <CJK>
+0x8BDF 0x8FD1 # <CJK>
+0x8BE0 0x91D1 # <CJK>
+0x8BE1 0x541F # <CJK>
+0x8BE2 0x9280 # <CJK>
+0x8BE3 0x4E5D # <CJK>
+0x8BE4 0x5036 # <CJK>
+0x8BE5 0x53E5 # <CJK>
+0x8BE6 0x533A # <CJK>
+0x8BE7 0x72D7 # <CJK>
+0x8BE8 0x7396 # <CJK>
+0x8BE9 0x77E9 # <CJK>
+0x8BEA 0x82E6 # <CJK>
+0x8BEB 0x8EAF # <CJK>
+0x8BEC 0x99C6 # <CJK>
+0x8BED 0x99C8 # <CJK>
+0x8BEE 0x99D2 # <CJK>
+0x8BEF 0x5177 # <CJK>
+0x8BF0 0x611A # <CJK>
+0x8BF1 0x865E # <CJK>
+0x8BF2 0x55B0 # <CJK>
+0x8BF3 0x7A7A # <CJK>
+0x8BF4 0x5076 # <CJK>
+0x8BF5 0x5BD3 # <CJK>
+0x8BF6 0x9047 # <CJK>
+0x8BF7 0x9685 # <CJK>
+0x8BF8 0x4E32 # <CJK>
+0x8BF9 0x6ADB # <CJK>
+0x8BFA 0x91E7 # <CJK>
+0x8BFB 0x5C51 # <CJK>
+0x8BFC 0x5C48 # <CJK>
+0x8C40 0x6398 # <CJK>
+0x8C41 0x7A9F # <CJK>
+0x8C42 0x6C93 # <CJK>
+0x8C43 0x9774 # <CJK>
+0x8C44 0x8F61 # <CJK>
+0x8C45 0x7AAA # <CJK>
+0x8C46 0x718A # <CJK>
+0x8C47 0x9688 # <CJK>
+0x8C48 0x7C82 # <CJK>
+0x8C49 0x6817 # <CJK>
+0x8C4A 0x7E70 # <CJK>
+0x8C4B 0x6851 # <CJK>
+0x8C4C 0x936C # <CJK>
+0x8C4D 0x52F2 # <CJK>
+0x8C4E 0x541B # <CJK>
+0x8C4F 0x85AB # <CJK>
+0x8C50 0x8A13 # <CJK>
+0x8C51 0x7FA4 # <CJK>
+0x8C52 0x8ECD # <CJK>
+0x8C53 0x90E1 # <CJK>
+0x8C54 0x5366 # <CJK>
+0x8C55 0x8888 # <CJK>
+0x8C56 0x7941 # <CJK>
+0x8C57 0x4FC2 # <CJK>
+0x8C58 0x50BE # <CJK>
+0x8C59 0x5211 # <CJK>
+0x8C5A 0x5144 # <CJK>
+0x8C5B 0x5553 # <CJK>
+0x8C5C 0x572D # <CJK>
+0x8C5D 0x73EA # <CJK>
+0x8C5E 0x578B # <CJK>
+0x8C5F 0x5951 # <CJK>
+0x8C60 0x5F62 # <CJK>
+0x8C61 0x5F84 # <CJK>
+0x8C62 0x6075 # <CJK>
+0x8C63 0x6176 # <CJK>
+0x8C64 0x6167 # <CJK>
+0x8C65 0x61A9 # <CJK>
+0x8C66 0x63B2 # <CJK>
+0x8C67 0x643A # <CJK>
+0x8C68 0x656C # <CJK>
+0x8C69 0x666F # <CJK>
+0x8C6A 0x6842 # <CJK>
+0x8C6B 0x6E13 # <CJK>
+0x8C6C 0x7566 # <CJK>
+0x8C6D 0x7A3D # <CJK>
+0x8C6E 0x7CFB # <CJK>
+0x8C6F 0x7D4C # <CJK>
+0x8C70 0x7D99 # <CJK>
+0x8C71 0x7E4B # <CJK>
+0x8C72 0x7F6B # <CJK>
+0x8C73 0x830E # <CJK>
+0x8C74 0x834A # <CJK>
+0x8C75 0x86CD # <CJK>
+0x8C76 0x8A08 # <CJK>
+0x8C77 0x8A63 # <CJK>
+0x8C78 0x8B66 # <CJK>
+0x8C79 0x8EFD # <CJK>
+0x8C7A 0x981A # <CJK>
+0x8C7B 0x9D8F # <CJK>
+0x8C7C 0x82B8 # <CJK>
+0x8C7D 0x8FCE # <CJK>
+0x8C7E 0x9BE8 # <CJK>
+0x8C80 0x5287 # <CJK>
+0x8C81 0x621F # <CJK>
+0x8C82 0x6483 # <CJK>
+0x8C83 0x6FC0 # <CJK>
+0x8C84 0x9699 # <CJK>
+0x8C85 0x6841 # <CJK>
+0x8C86 0x5091 # <CJK>
+0x8C87 0x6B20 # <CJK>
+0x8C88 0x6C7A # <CJK>
+0x8C89 0x6F54 # <CJK>
+0x8C8A 0x7A74 # <CJK>
+0x8C8B 0x7D50 # <CJK>
+0x8C8C 0x8840 # <CJK>
+0x8C8D 0x8A23 # <CJK>
+0x8C8E 0x6708 # <CJK>
+0x8C8F 0x4EF6 # <CJK>
+0x8C90 0x5039 # <CJK>
+0x8C91 0x5026 # <CJK>
+0x8C92 0x5065 # <CJK>
+0x8C93 0x517C # <CJK>
+0x8C94 0x5238 # <CJK>
+0x8C95 0x5263 # <CJK>
+0x8C96 0x55A7 # <CJK>
+0x8C97 0x570F # <CJK>
+0x8C98 0x5805 # <CJK>
+0x8C99 0x5ACC # <CJK>
+0x8C9A 0x5EFA # <CJK>
+0x8C9B 0x61B2 # <CJK>
+0x8C9C 0x61F8 # <CJK>
+0x8C9D 0x62F3 # <CJK>
+0x8C9E 0x6372 # <CJK>
+0x8C9F 0x691C # <CJK>
+0x8CA0 0x6A29 # <CJK>
+0x8CA1 0x727D # <CJK>
+0x8CA2 0x72AC # <CJK>
+0x8CA3 0x732E # <CJK>
+0x8CA4 0x7814 # <CJK>
+0x8CA5 0x786F # <CJK>
+0x8CA6 0x7D79 # <CJK>
+0x8CA7 0x770C # <CJK>
+0x8CA8 0x80A9 # <CJK>
+0x8CA9 0x898B # <CJK>
+0x8CAA 0x8B19 # <CJK>
+0x8CAB 0x8CE2 # <CJK>
+0x8CAC 0x8ED2 # <CJK>
+0x8CAD 0x9063 # <CJK>
+0x8CAE 0x9375 # <CJK>
+0x8CAF 0x967A # <CJK>
+0x8CB0 0x9855 # <CJK>
+0x8CB1 0x9A13 # <CJK>
+0x8CB2 0x9E78 # <CJK>
+0x8CB3 0x5143 # <CJK>
+0x8CB4 0x539F # <CJK>
+0x8CB5 0x53B3 # <CJK>
+0x8CB6 0x5E7B # <CJK>
+0x8CB7 0x5F26 # <CJK>
+0x8CB8 0x6E1B # <CJK>
+0x8CB9 0x6E90 # <CJK>
+0x8CBA 0x7384 # <CJK>
+0x8CBB 0x73FE # <CJK>
+0x8CBC 0x7D43 # <CJK>
+0x8CBD 0x8237 # <CJK>
+0x8CBE 0x8A00 # <CJK>
+0x8CBF 0x8AFA # <CJK>
+0x8CC0 0x9650 # <CJK>
+0x8CC1 0x4E4E # <CJK>
+0x8CC2 0x500B # <CJK>
+0x8CC3 0x53E4 # <CJK>
+0x8CC4 0x547C # <CJK>
+0x8CC5 0x56FA # <CJK>
+0x8CC6 0x59D1 # <CJK>
+0x8CC7 0x5B64 # <CJK>
+0x8CC8 0x5DF1 # <CJK>
+0x8CC9 0x5EAB # <CJK>
+0x8CCA 0x5F27 # <CJK>
+0x8CCB 0x6238 # <CJK>
+0x8CCC 0x6545 # <CJK>
+0x8CCD 0x67AF # <CJK>
+0x8CCE 0x6E56 # <CJK>
+0x8CCF 0x72D0 # <CJK>
+0x8CD0 0x7CCA # <CJK>
+0x8CD1 0x88B4 # <CJK>
+0x8CD2 0x80A1 # <CJK>
+0x8CD3 0x80E1 # <CJK>
+0x8CD4 0x83F0 # <CJK>
+0x8CD5 0x864E # <CJK>
+0x8CD6 0x8A87 # <CJK>
+0x8CD7 0x8DE8 # <CJK>
+0x8CD8 0x9237 # <CJK>
+0x8CD9 0x96C7 # <CJK>
+0x8CDA 0x9867 # <CJK>
+0x8CDB 0x9F13 # <CJK>
+0x8CDC 0x4E94 # <CJK>
+0x8CDD 0x4E92 # <CJK>
+0x8CDE 0x4F0D # <CJK>
+0x8CDF 0x5348 # <CJK>
+0x8CE0 0x5449 # <CJK>
+0x8CE1 0x543E # <CJK>
+0x8CE2 0x5A2F # <CJK>
+0x8CE3 0x5F8C # <CJK>
+0x8CE4 0x5FA1 # <CJK>
+0x8CE5 0x609F # <CJK>
+0x8CE6 0x68A7 # <CJK>
+0x8CE7 0x6A8E # <CJK>
+0x8CE8 0x745A # <CJK>
+0x8CE9 0x7881 # <CJK>
+0x8CEA 0x8A9E # <CJK>
+0x8CEB 0x8AA4 # <CJK>
+0x8CEC 0x8B77 # <CJK>
+0x8CED 0x9190 # <CJK>
+0x8CEE 0x4E5E # <CJK>
+0x8CEF 0x9BC9 # <CJK>
+0x8CF0 0x4EA4 # <CJK>
+0x8CF1 0x4F7C # <CJK>
+0x8CF2 0x4FAF # <CJK>
+0x8CF3 0x5019 # <CJK>
+0x8CF4 0x5016 # <CJK>
+0x8CF5 0x5149 # <CJK>
+0x8CF6 0x516C # <CJK>
+0x8CF7 0x529F # <CJK>
+0x8CF8 0x52B9 # <CJK>
+0x8CF9 0x52FE # <CJK>
+0x8CFA 0x539A # <CJK>
+0x8CFB 0x53E3 # <CJK>
+0x8CFC 0x5411 # <CJK>
+0x8D40 0x540E # <CJK>
+0x8D41 0x5589 # <CJK>
+0x8D42 0x5751 # <CJK>
+0x8D43 0x57A2 # <CJK>
+0x8D44 0x597D # <CJK>
+0x8D45 0x5B54 # <CJK>
+0x8D46 0x5B5D # <CJK>
+0x8D47 0x5B8F # <CJK>
+0x8D48 0x5DE5 # <CJK>
+0x8D49 0x5DE7 # <CJK>
+0x8D4A 0x5DF7 # <CJK>
+0x8D4B 0x5E78 # <CJK>
+0x8D4C 0x5E83 # <CJK>
+0x8D4D 0x5E9A # <CJK>
+0x8D4E 0x5EB7 # <CJK>
+0x8D4F 0x5F18 # <CJK>
+0x8D50 0x6052 # <CJK>
+0x8D51 0x614C # <CJK>
+0x8D52 0x6297 # <CJK>
+0x8D53 0x62D8 # <CJK>
+0x8D54 0x63A7 # <CJK>
+0x8D55 0x653B # <CJK>
+0x8D56 0x6602 # <CJK>
+0x8D57 0x6643 # <CJK>
+0x8D58 0x66F4 # <CJK>
+0x8D59 0x676D # <CJK>
+0x8D5A 0x6821 # <CJK>
+0x8D5B 0x6897 # <CJK>
+0x8D5C 0x69CB # <CJK>
+0x8D5D 0x6C5F # <CJK>
+0x8D5E 0x6D2A # <CJK>
+0x8D5F 0x6D69 # <CJK>
+0x8D60 0x6E2F # <CJK>
+0x8D61 0x6E9D # <CJK>
+0x8D62 0x7532 # <CJK>
+0x8D63 0x7687 # <CJK>
+0x8D64 0x786C # <CJK>
+0x8D65 0x7A3F # <CJK>
+0x8D66 0x7CE0 # <CJK>
+0x8D67 0x7D05 # <CJK>
+0x8D68 0x7D18 # <CJK>
+0x8D69 0x7D5E # <CJK>
+0x8D6A 0x7DB1 # <CJK>
+0x8D6B 0x8015 # <CJK>
+0x8D6C 0x8003 # <CJK>
+0x8D6D 0x80AF # <CJK>
+0x8D6E 0x80B1 # <CJK>
+0x8D6F 0x8154 # <CJK>
+0x8D70 0x818F # <CJK>
+0x8D71 0x822A # <CJK>
+0x8D72 0x8352 # <CJK>
+0x8D73 0x884C # <CJK>
+0x8D74 0x8861 # <CJK>
+0x8D75 0x8B1B # <CJK>
+0x8D76 0x8CA2 # <CJK>
+0x8D77 0x8CFC # <CJK>
+0x8D78 0x90CA # <CJK>
+0x8D79 0x9175 # <CJK>
+0x8D7A 0x9271 # <CJK>
+0x8D7B 0x783F # <CJK>
+0x8D7C 0x92FC # <CJK>
+0x8D7D 0x95A4 # <CJK>
+0x8D7E 0x964D # <CJK>
+0x8D80 0x9805 # <CJK>
+0x8D81 0x9999 # <CJK>
+0x8D82 0x9AD8 # <CJK>
+0x8D83 0x9D3B # <CJK>
+0x8D84 0x525B # <CJK>
+0x8D85 0x52AB # <CJK>
+0x8D86 0x53F7 # <CJK>
+0x8D87 0x5408 # <CJK>
+0x8D88 0x58D5 # <CJK>
+0x8D89 0x62F7 # <CJK>
+0x8D8A 0x6FE0 # <CJK>
+0x8D8B 0x8C6A # <CJK>
+0x8D8C 0x8F5F # <CJK>
+0x8D8D 0x9EB9 # <CJK>
+0x8D8E 0x514B # <CJK>
+0x8D8F 0x523B # <CJK>
+0x8D90 0x544A # <CJK>
+0x8D91 0x56FD # <CJK>
+0x8D92 0x7A40 # <CJK>
+0x8D93 0x9177 # <CJK>
+0x8D94 0x9D60 # <CJK>
+0x8D95 0x9ED2 # <CJK>
+0x8D96 0x7344 # <CJK>
+0x8D97 0x6F09 # <CJK>
+0x8D98 0x8170 # <CJK>
+0x8D99 0x7511 # <CJK>
+0x8D9A 0x5FFD # <CJK>
+0x8D9B 0x60DA # <CJK>
+0x8D9C 0x9AA8 # <CJK>
+0x8D9D 0x72DB # <CJK>
+0x8D9E 0x8FBC # <CJK>
+0x8D9F 0x6B64 # <CJK>
+0x8DA0 0x9803 # <CJK>
+0x8DA1 0x4ECA # <CJK>
+0x8DA2 0x56F0 # <CJK>
+0x8DA3 0x5764 # <CJK>
+0x8DA4 0x58BE # <CJK>
+0x8DA5 0x5A5A # <CJK>
+0x8DA6 0x6068 # <CJK>
+0x8DA7 0x61C7 # <CJK>
+0x8DA8 0x660F # <CJK>
+0x8DA9 0x6606 # <CJK>
+0x8DAA 0x6839 # <CJK>
+0x8DAB 0x68B1 # <CJK>
+0x8DAC 0x6DF7 # <CJK>
+0x8DAD 0x75D5 # <CJK>
+0x8DAE 0x7D3A # <CJK>
+0x8DAF 0x826E # <CJK>
+0x8DB0 0x9B42 # <CJK>
+0x8DB1 0x4E9B # <CJK>
+0x8DB2 0x4F50 # <CJK>
+0x8DB3 0x53C9 # <CJK>
+0x8DB4 0x5506 # <CJK>
+0x8DB5 0x5D6F # <CJK>
+0x8DB6 0x5DE6 # <CJK>
+0x8DB7 0x5DEE # <CJK>
+0x8DB8 0x67FB # <CJK>
+0x8DB9 0x6C99 # <CJK>
+0x8DBA 0x7473 # <CJK>
+0x8DBB 0x7802 # <CJK>
+0x8DBC 0x8A50 # <CJK>
+0x8DBD 0x9396 # <CJK>
+0x8DBE 0x88DF # <CJK>
+0x8DBF 0x5750 # <CJK>
+0x8DC0 0x5EA7 # <CJK>
+0x8DC1 0x632B # <CJK>
+0x8DC2 0x50B5 # <CJK>
+0x8DC3 0x50AC # <CJK>
+0x8DC4 0x518D # <CJK>
+0x8DC5 0x6700 # <CJK>
+0x8DC6 0x54C9 # <CJK>
+0x8DC7 0x585E # <CJK>
+0x8DC8 0x59BB # <CJK>
+0x8DC9 0x5BB0 # <CJK>
+0x8DCA 0x5F69 # <CJK>
+0x8DCB 0x624D # <CJK>
+0x8DCC 0x63A1 # <CJK>
+0x8DCD 0x683D # <CJK>
+0x8DCE 0x6B73 # <CJK>
+0x8DCF 0x6E08 # <CJK>
+0x8DD0 0x707D # <CJK>
+0x8DD1 0x91C7 # <CJK>
+0x8DD2 0x7280 # <CJK>
+0x8DD3 0x7815 # <CJK>
+0x8DD4 0x7826 # <CJK>
+0x8DD5 0x796D # <CJK>
+0x8DD6 0x658E # <CJK>
+0x8DD7 0x7D30 # <CJK>
+0x8DD8 0x83DC # <CJK>
+0x8DD9 0x88C1 # <CJK>
+0x8DDA 0x8F09 # <CJK>
+0x8DDB 0x969B # <CJK>
+0x8DDC 0x5264 # <CJK>
+0x8DDD 0x5728 # <CJK>
+0x8DDE 0x6750 # <CJK>
+0x8DDF 0x7F6A # <CJK>
+0x8DE0 0x8CA1 # <CJK>
+0x8DE1 0x51B4 # <CJK>
+0x8DE2 0x5742 # <CJK>
+0x8DE3 0x962A # <CJK>
+0x8DE4 0x583A # <CJK>
+0x8DE5 0x698A # <CJK>
+0x8DE6 0x80B4 # <CJK>
+0x8DE7 0x54B2 # <CJK>
+0x8DE8 0x5D0E # <CJK>
+0x8DE9 0x57FC # <CJK>
+0x8DEA 0x7895 # <CJK>
+0x8DEB 0x9DFA # <CJK>
+0x8DEC 0x4F5C # <CJK>
+0x8DED 0x524A # <CJK>
+0x8DEE 0x548B # <CJK>
+0x8DEF 0x643E # <CJK>
+0x8DF0 0x6628 # <CJK>
+0x8DF1 0x6714 # <CJK>
+0x8DF2 0x67F5 # <CJK>
+0x8DF3 0x7A84 # <CJK>
+0x8DF4 0x7B56 # <CJK>
+0x8DF5 0x7D22 # <CJK>
+0x8DF6 0x932F # <CJK>
+0x8DF7 0x685C # <CJK>
+0x8DF8 0x9BAD # <CJK>
+0x8DF9 0x7B39 # <CJK>
+0x8DFA 0x5319 # <CJK>
+0x8DFB 0x518A # <CJK>
+0x8DFC 0x5237 # <CJK>
+0x8E40 0x5BDF # <CJK>
+0x8E41 0x62F6 # <CJK>
+0x8E42 0x64AE # <CJK>
+0x8E43 0x64E6 # <CJK>
+0x8E44 0x672D # <CJK>
+0x8E45 0x6BBA # <CJK>
+0x8E46 0x85A9 # <CJK>
+0x8E47 0x96D1 # <CJK>
+0x8E48 0x7690 # <CJK>
+0x8E49 0x9BD6 # <CJK>
+0x8E4A 0x634C # <CJK>
+0x8E4B 0x9306 # <CJK>
+0x8E4C 0x9BAB # <CJK>
+0x8E4D 0x76BF # <CJK>
+0x8E4E 0x6652 # <CJK>
+0x8E4F 0x4E09 # <CJK>
+0x8E50 0x5098 # <CJK>
+0x8E51 0x53C2 # <CJK>
+0x8E52 0x5C71 # <CJK>
+0x8E53 0x60E8 # <CJK>
+0x8E54 0x6492 # <CJK>
+0x8E55 0x6563 # <CJK>
+0x8E56 0x685F # <CJK>
+0x8E57 0x71E6 # <CJK>
+0x8E58 0x73CA # <CJK>
+0x8E59 0x7523 # <CJK>
+0x8E5A 0x7B97 # <CJK>
+0x8E5B 0x7E82 # <CJK>
+0x8E5C 0x8695 # <CJK>
+0x8E5D 0x8B83 # <CJK>
+0x8E5E 0x8CDB # <CJK>
+0x8E5F 0x9178 # <CJK>
+0x8E60 0x9910 # <CJK>
+0x8E61 0x65AC # <CJK>
+0x8E62 0x66AB # <CJK>
+0x8E63 0x6B8B # <CJK>
+0x8E64 0x4ED5 # <CJK>
+0x8E65 0x4ED4 # <CJK>
+0x8E66 0x4F3A # <CJK>
+0x8E67 0x4F7F # <CJK>
+0x8E68 0x523A # <CJK>
+0x8E69 0x53F8 # <CJK>
+0x8E6A 0x53F2 # <CJK>
+0x8E6B 0x55E3 # <CJK>
+0x8E6C 0x56DB # <CJK>
+0x8E6D 0x58EB # <CJK>
+0x8E6E 0x59CB # <CJK>
+0x8E6F 0x59C9 # <CJK>
+0x8E70 0x59FF # <CJK>
+0x8E71 0x5B50 # <CJK>
+0x8E72 0x5C4D # <CJK>
+0x8E73 0x5E02 # <CJK>
+0x8E74 0x5E2B # <CJK>
+0x8E75 0x5FD7 # <CJK>
+0x8E76 0x601D # <CJK>
+0x8E77 0x6307 # <CJK>
+0x8E78 0x652F # <CJK>
+0x8E79 0x5B5C # <CJK>
+0x8E7A 0x65AF # <CJK>
+0x8E7B 0x65BD # <CJK>
+0x8E7C 0x65E8 # <CJK>
+0x8E7D 0x679D # <CJK>
+0x8E7E 0x6B62 # <CJK>
+0x8E80 0x6B7B # <CJK>
+0x8E81 0x6C0F # <CJK>
+0x8E82 0x7345 # <CJK>
+0x8E83 0x7949 # <CJK>
+0x8E84 0x79C1 # <CJK>
+0x8E85 0x7CF8 # <CJK>
+0x8E86 0x7D19 # <CJK>
+0x8E87 0x7D2B # <CJK>
+0x8E88 0x80A2 # <CJK>
+0x8E89 0x8102 # <CJK>
+0x8E8A 0x81F3 # <CJK>
+0x8E8B 0x8996 # <CJK>
+0x8E8C 0x8A5E # <CJK>
+0x8E8D 0x8A69 # <CJK>
+0x8E8E 0x8A66 # <CJK>
+0x8E8F 0x8A8C # <CJK>
+0x8E90 0x8AEE # <CJK>
+0x8E91 0x8CC7 # <CJK>
+0x8E92 0x8CDC # <CJK>
+0x8E93 0x96CC # <CJK>
+0x8E94 0x98FC # <CJK>
+0x8E95 0x6B6F # <CJK>
+0x8E96 0x4E8B # <CJK>
+0x8E97 0x4F3C # <CJK>
+0x8E98 0x4F8D # <CJK>
+0x8E99 0x5150 # <CJK>
+0x8E9A 0x5B57 # <CJK>
+0x8E9B 0x5BFA # <CJK>
+0x8E9C 0x6148 # <CJK>
+0x8E9D 0x6301 # <CJK>
+0x8E9E 0x6642 # <CJK>
+0x8E9F 0x6B21 # <CJK>
+0x8EA0 0x6ECB # <CJK>
+0x8EA1 0x6CBB # <CJK>
+0x8EA2 0x723E # <CJK>
+0x8EA3 0x74BD # <CJK>
+0x8EA4 0x75D4 # <CJK>
+0x8EA5 0x78C1 # <CJK>
+0x8EA6 0x793A # <CJK>
+0x8EA7 0x800C # <CJK>
+0x8EA8 0x8033 # <CJK>
+0x8EA9 0x81EA # <CJK>
+0x8EAA 0x8494 # <CJK>
+0x8EAB 0x8F9E # <CJK>
+0x8EAC 0x6C50 # <CJK>
+0x8EAD 0x9E7F # <CJK>
+0x8EAE 0x5F0F # <CJK>
+0x8EAF 0x8B58 # <CJK>
+0x8EB0 0x9D2B # <CJK>
+0x8EB1 0x7AFA # <CJK>
+0x8EB2 0x8EF8 # <CJK>
+0x8EB3 0x5B8D # <CJK>
+0x8EB4 0x96EB # <CJK>
+0x8EB5 0x4E03 # <CJK>
+0x8EB6 0x53F1 # <CJK>
+0x8EB7 0x57F7 # <CJK>
+0x8EB8 0x5931 # <CJK>
+0x8EB9 0x5AC9 # <CJK>
+0x8EBA 0x5BA4 # <CJK>
+0x8EBB 0x6089 # <CJK>
+0x8EBC 0x6E7F # <CJK>
+0x8EBD 0x6F06 # <CJK>
+0x8EBE 0x75BE # <CJK>
+0x8EBF 0x8CEA # <CJK>
+0x8EC0 0x5B9F # <CJK>
+0x8EC1 0x8500 # <CJK>
+0x8EC2 0x7BE0 # <CJK>
+0x8EC3 0x5072 # <CJK>
+0x8EC4 0x67F4 # <CJK>
+0x8EC5 0x829D # <CJK>
+0x8EC6 0x5C61 # <CJK>
+0x8EC7 0x854A # <CJK>
+0x8EC8 0x7E1E # <CJK>
+0x8EC9 0x820E # <CJK>
+0x8ECA 0x5199 # <CJK>
+0x8ECB 0x5C04 # <CJK>
+0x8ECC 0x6368 # <CJK>
+0x8ECD 0x8D66 # <CJK>
+0x8ECE 0x659C # <CJK>
+0x8ECF 0x716E # <CJK>
+0x8ED0 0x793E # <CJK>
+0x8ED1 0x7D17 # <CJK>
+0x8ED2 0x8005 # <CJK>
+0x8ED3 0x8B1D # <CJK>
+0x8ED4 0x8ECA # <CJK>
+0x8ED5 0x906E # <CJK>
+0x8ED6 0x86C7 # <CJK>
+0x8ED7 0x90AA # <CJK>
+0x8ED8 0x501F # <CJK>
+0x8ED9 0x52FA # <CJK>
+0x8EDA 0x5C3A # <CJK>
+0x8EDB 0x6753 # <CJK>
+0x8EDC 0x707C # <CJK>
+0x8EDD 0x7235 # <CJK>
+0x8EDE 0x914C # <CJK>
+0x8EDF 0x91C8 # <CJK>
+0x8EE0 0x932B # <CJK>
+0x8EE1 0x82E5 # <CJK>
+0x8EE2 0x5BC2 # <CJK>
+0x8EE3 0x5F31 # <CJK>
+0x8EE4 0x60F9 # <CJK>
+0x8EE5 0x4E3B # <CJK>
+0x8EE6 0x53D6 # <CJK>
+0x8EE7 0x5B88 # <CJK>
+0x8EE8 0x624B # <CJK>
+0x8EE9 0x6731 # <CJK>
+0x8EEA 0x6B8A # <CJK>
+0x8EEB 0x72E9 # <CJK>
+0x8EEC 0x73E0 # <CJK>
+0x8EED 0x7A2E # <CJK>
+0x8EEE 0x816B # <CJK>
+0x8EEF 0x8DA3 # <CJK>
+0x8EF0 0x9152 # <CJK>
+0x8EF1 0x9996 # <CJK>
+0x8EF2 0x5112 # <CJK>
+0x8EF3 0x53D7 # <CJK>
+0x8EF4 0x546A # <CJK>
+0x8EF5 0x5BFF # <CJK>
+0x8EF6 0x6388 # <CJK>
+0x8EF7 0x6A39 # <CJK>
+0x8EF8 0x7DAC # <CJK>
+0x8EF9 0x9700 # <CJK>
+0x8EFA 0x56DA # <CJK>
+0x8EFB 0x53CE # <CJK>
+0x8EFC 0x5468 # <CJK>
+0x8F40 0x5B97 # <CJK>
+0x8F41 0x5C31 # <CJK>
+0x8F42 0x5DDE # <CJK>
+0x8F43 0x4FEE # <CJK>
+0x8F44 0x6101 # <CJK>
+0x8F45 0x62FE # <CJK>
+0x8F46 0x6D32 # <CJK>
+0x8F47 0x79C0 # <CJK>
+0x8F48 0x79CB # <CJK>
+0x8F49 0x7D42 # <CJK>
+0x8F4A 0x7E4D # <CJK>
+0x8F4B 0x7FD2 # <CJK>
+0x8F4C 0x81ED # <CJK>
+0x8F4D 0x821F # <CJK>
+0x8F4E 0x8490 # <CJK>
+0x8F4F 0x8846 # <CJK>
+0x8F50 0x8972 # <CJK>
+0x8F51 0x8B90 # <CJK>
+0x8F52 0x8E74 # <CJK>
+0x8F53 0x8F2F # <CJK>
+0x8F54 0x9031 # <CJK>
+0x8F55 0x914B # <CJK>
+0x8F56 0x916C # <CJK>
+0x8F57 0x96C6 # <CJK>
+0x8F58 0x919C # <CJK>
+0x8F59 0x4EC0 # <CJK>
+0x8F5A 0x4F4F # <CJK>
+0x8F5B 0x5145 # <CJK>
+0x8F5C 0x5341 # <CJK>
+0x8F5D 0x5F93 # <CJK>
+0x8F5E 0x620E # <CJK>
+0x8F5F 0x67D4 # <CJK>
+0x8F60 0x6C41 # <CJK>
+0x8F61 0x6E0B # <CJK>
+0x8F62 0x7363 # <CJK>
+0x8F63 0x7E26 # <CJK>
+0x8F64 0x91CD # <CJK>
+0x8F65 0x9283 # <CJK>
+0x8F66 0x53D4 # <CJK>
+0x8F67 0x5919 # <CJK>
+0x8F68 0x5BBF # <CJK>
+0x8F69 0x6DD1 # <CJK>
+0x8F6A 0x795D # <CJK>
+0x8F6B 0x7E2E # <CJK>
+0x8F6C 0x7C9B # <CJK>
+0x8F6D 0x587E # <CJK>
+0x8F6E 0x719F # <CJK>
+0x8F6F 0x51FA # <CJK>
+0x8F70 0x8853 # <CJK>
+0x8F71 0x8FF0 # <CJK>
+0x8F72 0x4FCA # <CJK>
+0x8F73 0x5CFB # <CJK>
+0x8F74 0x6625 # <CJK>
+0x8F75 0x77AC # <CJK>
+0x8F76 0x7AE3 # <CJK>
+0x8F77 0x821C # <CJK>
+0x8F78 0x99FF # <CJK>
+0x8F79 0x51C6 # <CJK>
+0x8F7A 0x5FAA # <CJK>
+0x8F7B 0x65EC # <CJK>
+0x8F7C 0x696F # <CJK>
+0x8F7D 0x6B89 # <CJK>
+0x8F7E 0x6DF3 # <CJK>
+0x8F80 0x6E96 # <CJK>
+0x8F81 0x6F64 # <CJK>
+0x8F82 0x76FE # <CJK>
+0x8F83 0x7D14 # <CJK>
+0x8F84 0x5DE1 # <CJK>
+0x8F85 0x9075 # <CJK>
+0x8F86 0x9187 # <CJK>
+0x8F87 0x9806 # <CJK>
+0x8F88 0x51E6 # <CJK>
+0x8F89 0x521D # <CJK>
+0x8F8A 0x6240 # <CJK>
+0x8F8B 0x6691 # <CJK>
+0x8F8C 0x66D9 # <CJK>
+0x8F8D 0x6E1A # <CJK>
+0x8F8E 0x5EB6 # <CJK>
+0x8F8F 0x7DD2 # <CJK>
+0x8F90 0x7F72 # <CJK>
+0x8F91 0x66F8 # <CJK>
+0x8F92 0x85AF # <CJK>
+0x8F93 0x85F7 # <CJK>
+0x8F94 0x8AF8 # <CJK>
+0x8F95 0x52A9 # <CJK>
+0x8F96 0x53D9 # <CJK>
+0x8F97 0x5973 # <CJK>
+0x8F98 0x5E8F # <CJK>
+0x8F99 0x5F90 # <CJK>
+0x8F9A 0x6055 # <CJK>
+0x8F9B 0x92E4 # <CJK>
+0x8F9C 0x9664 # <CJK>
+0x8F9D 0x50B7 # <CJK>
+0x8F9E 0x511F # <CJK>
+0x8F9F 0x52DD # <CJK>
+0x8FA0 0x5320 # <CJK>
+0x8FA1 0x5347 # <CJK>
+0x8FA2 0x53EC # <CJK>
+0x8FA3 0x54E8 # <CJK>
+0x8FA4 0x5546 # <CJK>
+0x8FA5 0x5531 # <CJK>
+0x8FA6 0x5617 # <CJK>
+0x8FA7 0x5968 # <CJK>
+0x8FA8 0x59BE # <CJK>
+0x8FA9 0x5A3C # <CJK>
+0x8FAA 0x5BB5 # <CJK>
+0x8FAB 0x5C06 # <CJK>
+0x8FAC 0x5C0F # <CJK>
+0x8FAD 0x5C11 # <CJK>
+0x8FAE 0x5C1A # <CJK>
+0x8FAF 0x5E84 # <CJK>
+0x8FB0 0x5E8A # <CJK>
+0x8FB1 0x5EE0 # <CJK>
+0x8FB2 0x5F70 # <CJK>
+0x8FB3 0x627F # <CJK>
+0x8FB4 0x6284 # <CJK>
+0x8FB5 0x62DB # <CJK>
+0x8FB6 0x638C # <CJK>
+0x8FB7 0x6377 # <CJK>
+0x8FB8 0x6607 # <CJK>
+0x8FB9 0x660C # <CJK>
+0x8FBA 0x662D # <CJK>
+0x8FBB 0x6676 # <CJK>
+0x8FBC 0x677E # <CJK>
+0x8FBD 0x68A2 # <CJK>
+0x8FBE 0x6A1F # <CJK>
+0x8FBF 0x6A35 # <CJK>
+0x8FC0 0x6CBC # <CJK>
+0x8FC1 0x6D88 # <CJK>
+0x8FC2 0x6E09 # <CJK>
+0x8FC3 0x6E58 # <CJK>
+0x8FC4 0x713C # <CJK>
+0x8FC5 0x7126 # <CJK>
+0x8FC6 0x7167 # <CJK>
+0x8FC7 0x75C7 # <CJK>
+0x8FC8 0x7701 # <CJK>
+0x8FC9 0x785D # <CJK>
+0x8FCA 0x7901 # <CJK>
+0x8FCB 0x7965 # <CJK>
+0x8FCC 0x79F0 # <CJK>
+0x8FCD 0x7AE0 # <CJK>
+0x8FCE 0x7B11 # <CJK>
+0x8FCF 0x7CA7 # <CJK>
+0x8FD0 0x7D39 # <CJK>
+0x8FD1 0x8096 # <CJK>
+0x8FD2 0x83D6 # <CJK>
+0x8FD3 0x848B # <CJK>
+0x8FD4 0x8549 # <CJK>
+0x8FD5 0x885D # <CJK>
+0x8FD6 0x88F3 # <CJK>
+0x8FD7 0x8A1F # <CJK>
+0x8FD8 0x8A3C # <CJK>
+0x8FD9 0x8A54 # <CJK>
+0x8FDA 0x8A73 # <CJK>
+0x8FDB 0x8C61 # <CJK>
+0x8FDC 0x8CDE # <CJK>
+0x8FDD 0x91A4 # <CJK>
+0x8FDE 0x9266 # <CJK>
+0x8FDF 0x937E # <CJK>
+0x8FE0 0x9418 # <CJK>
+0x8FE1 0x969C # <CJK>
+0x8FE2 0x9798 # <CJK>
+0x8FE3 0x4E0A # <CJK>
+0x8FE4 0x4E08 # <CJK>
+0x8FE5 0x4E1E # <CJK>
+0x8FE6 0x4E57 # <CJK>
+0x8FE7 0x5197 # <CJK>
+0x8FE8 0x5270 # <CJK>
+0x8FE9 0x57CE # <CJK>
+0x8FEA 0x5834 # <CJK>
+0x8FEB 0x58CC # <CJK>
+0x8FEC 0x5B22 # <CJK>
+0x8FED 0x5E38 # <CJK>
+0x8FEE 0x60C5 # <CJK>
+0x8FEF 0x64FE # <CJK>
+0x8FF0 0x6761 # <CJK>
+0x8FF1 0x6756 # <CJK>
+0x8FF2 0x6D44 # <CJK>
+0x8FF3 0x72B6 # <CJK>
+0x8FF4 0x7573 # <CJK>
+0x8FF5 0x7A63 # <CJK>
+0x8FF6 0x84B8 # <CJK>
+0x8FF7 0x8B72 # <CJK>
+0x8FF8 0x91B8 # <CJK>
+0x8FF9 0x9320 # <CJK>
+0x8FFA 0x5631 # <CJK>
+0x8FFB 0x57F4 # <CJK>
+0x8FFC 0x98FE # <CJK>
+0x9040 0x62ED # <CJK>
+0x9041 0x690D # <CJK>
+0x9042 0x6B96 # <CJK>
+0x9043 0x71ED # <CJK>
+0x9044 0x7E54 # <CJK>
+0x9045 0x8077 # <CJK>
+0x9046 0x8272 # <CJK>
+0x9047 0x89E6 # <CJK>
+0x9048 0x98DF # <CJK>
+0x9049 0x8755 # <CJK>
+0x904A 0x8FB1 # <CJK>
+0x904B 0x5C3B # <CJK>
+0x904C 0x4F38 # <CJK>
+0x904D 0x4FE1 # <CJK>
+0x904E 0x4FB5 # <CJK>
+0x904F 0x5507 # <CJK>
+0x9050 0x5A20 # <CJK>
+0x9051 0x5BDD # <CJK>
+0x9052 0x5BE9 # <CJK>
+0x9053 0x5FC3 # <CJK>
+0x9054 0x614E # <CJK>
+0x9055 0x632F # <CJK>
+0x9056 0x65B0 # <CJK>
+0x9057 0x664B # <CJK>
+0x9058 0x68EE # <CJK>
+0x9059 0x699B # <CJK>
+0x905A 0x6D78 # <CJK>
+0x905B 0x6DF1 # <CJK>
+0x905C 0x7533 # <CJK>
+0x905D 0x75B9 # <CJK>
+0x905E 0x771F # <CJK>
+0x905F 0x795E # <CJK>
+0x9060 0x79E6 # <CJK>
+0x9061 0x7D33 # <CJK>
+0x9062 0x81E3 # <CJK>
+0x9063 0x82AF # <CJK>
+0x9064 0x85AA # <CJK>
+0x9065 0x89AA # <CJK>
+0x9066 0x8A3A # <CJK>
+0x9067 0x8EAB # <CJK>
+0x9068 0x8F9B # <CJK>
+0x9069 0x9032 # <CJK>
+0x906A 0x91DD # <CJK>
+0x906B 0x9707 # <CJK>
+0x906C 0x4EBA # <CJK>
+0x906D 0x4EC1 # <CJK>
+0x906E 0x5203 # <CJK>
+0x906F 0x5875 # <CJK>
+0x9070 0x58EC # <CJK>
+0x9071 0x5C0B # <CJK>
+0x9072 0x751A # <CJK>
+0x9073 0x5C3D # <CJK>
+0x9074 0x814E # <CJK>
+0x9075 0x8A0A # <CJK>
+0x9076 0x8FC5 # <CJK>
+0x9077 0x9663 # <CJK>
+0x9078 0x976D # <CJK>
+0x9079 0x7B25 # <CJK>
+0x907A 0x8ACF # <CJK>
+0x907B 0x9808 # <CJK>
+0x907C 0x9162 # <CJK>
+0x907D 0x56F3 # <CJK>
+0x907E 0x53A8 # <CJK>
+0x9080 0x9017 # <CJK>
+0x9081 0x5439 # <CJK>
+0x9082 0x5782 # <CJK>
+0x9083 0x5E25 # <CJK>
+0x9084 0x63A8 # <CJK>
+0x9085 0x6C34 # <CJK>
+0x9086 0x708A # <CJK>
+0x9087 0x7761 # <CJK>
+0x9088 0x7C8B # <CJK>
+0x9089 0x7FE0 # <CJK>
+0x908A 0x8870 # <CJK>
+0x908B 0x9042 # <CJK>
+0x908C 0x9154 # <CJK>
+0x908D 0x9310 # <CJK>
+0x908E 0x9318 # <CJK>
+0x908F 0x968F # <CJK>
+0x9090 0x745E # <CJK>
+0x9091 0x9AC4 # <CJK>
+0x9092 0x5D07 # <CJK>
+0x9093 0x5D69 # <CJK>
+0x9094 0x6570 # <CJK>
+0x9095 0x67A2 # <CJK>
+0x9096 0x8DA8 # <CJK>
+0x9097 0x96DB # <CJK>
+0x9098 0x636E # <CJK>
+0x9099 0x6749 # <CJK>
+0x909A 0x6919 # <CJK>
+0x909B 0x83C5 # <CJK>
+0x909C 0x9817 # <CJK>
+0x909D 0x96C0 # <CJK>
+0x909E 0x88FE # <CJK>
+0x909F 0x6F84 # <CJK>
+0x90A0 0x647A # <CJK>
+0x90A1 0x5BF8 # <CJK>
+0x90A2 0x4E16 # <CJK>
+0x90A3 0x702C # <CJK>
+0x90A4 0x755D # <CJK>
+0x90A5 0x662F # <CJK>
+0x90A6 0x51C4 # <CJK>
+0x90A7 0x5236 # <CJK>
+0x90A8 0x52E2 # <CJK>
+0x90A9 0x59D3 # <CJK>
+0x90AA 0x5F81 # <CJK>
+0x90AB 0x6027 # <CJK>
+0x90AC 0x6210 # <CJK>
+0x90AD 0x653F # <CJK>
+0x90AE 0x6574 # <CJK>
+0x90AF 0x661F # <CJK>
+0x90B0 0x6674 # <CJK>
+0x90B1 0x68F2 # <CJK>
+0x90B2 0x6816 # <CJK>
+0x90B3 0x6B63 # <CJK>
+0x90B4 0x6E05 # <CJK>
+0x90B5 0x7272 # <CJK>
+0x90B6 0x751F # <CJK>
+0x90B7 0x76DB # <CJK>
+0x90B8 0x7CBE # <CJK>
+0x90B9 0x8056 # <CJK>
+0x90BA 0x58F0 # <CJK>
+0x90BB 0x88FD # <CJK>
+0x90BC 0x897F # <CJK>
+0x90BD 0x8AA0 # <CJK>
+0x90BE 0x8A93 # <CJK>
+0x90BF 0x8ACB # <CJK>
+0x90C0 0x901D # <CJK>
+0x90C1 0x9192 # <CJK>
+0x90C2 0x9752 # <CJK>
+0x90C3 0x9759 # <CJK>
+0x90C4 0x6589 # <CJK>
+0x90C5 0x7A0E # <CJK>
+0x90C6 0x8106 # <CJK>
+0x90C7 0x96BB # <CJK>
+0x90C8 0x5E2D # <CJK>
+0x90C9 0x60DC # <CJK>
+0x90CA 0x621A # <CJK>
+0x90CB 0x65A5 # <CJK>
+0x90CC 0x6614 # <CJK>
+0x90CD 0x6790 # <CJK>
+0x90CE 0x77F3 # <CJK>
+0x90CF 0x7A4D # <CJK>
+0x90D0 0x7C4D # <CJK>
+0x90D1 0x7E3E # <CJK>
+0x90D2 0x810A # <CJK>
+0x90D3 0x8CAC # <CJK>
+0x90D4 0x8D64 # <CJK>
+0x90D5 0x8DE1 # <CJK>
+0x90D6 0x8E5F # <CJK>
+0x90D7 0x78A9 # <CJK>
+0x90D8 0x5207 # <CJK>
+0x90D9 0x62D9 # <CJK>
+0x90DA 0x63A5 # <CJK>
+0x90DB 0x6442 # <CJK>
+0x90DC 0x6298 # <CJK>
+0x90DD 0x8A2D # <CJK>
+0x90DE 0x7A83 # <CJK>
+0x90DF 0x7BC0 # <CJK>
+0x90E0 0x8AAC # <CJK>
+0x90E1 0x96EA # <CJK>
+0x90E2 0x7D76 # <CJK>
+0x90E3 0x820C # <CJK>
+0x90E4 0x8749 # <CJK>
+0x90E5 0x4ED9 # <CJK>
+0x90E6 0x5148 # <CJK>
+0x90E7 0x5343 # <CJK>
+0x90E8 0x5360 # <CJK>
+0x90E9 0x5BA3 # <CJK>
+0x90EA 0x5C02 # <CJK>
+0x90EB 0x5C16 # <CJK>
+0x90EC 0x5DDD # <CJK>
+0x90ED 0x6226 # <CJK>
+0x90EE 0x6247 # <CJK>
+0x90EF 0x64B0 # <CJK>
+0x90F0 0x6813 # <CJK>
+0x90F1 0x6834 # <CJK>
+0x90F2 0x6CC9 # <CJK>
+0x90F3 0x6D45 # <CJK>
+0x90F4 0x6D17 # <CJK>
+0x90F5 0x67D3 # <CJK>
+0x90F6 0x6F5C # <CJK>
+0x90F7 0x714E # <CJK>
+0x90F8 0x717D # <CJK>
+0x90F9 0x65CB # <CJK>
+0x90FA 0x7A7F # <CJK>
+0x90FB 0x7BAD # <CJK>
+0x90FC 0x7DDA # <CJK>
+0x9140 0x7E4A # <CJK>
+0x9141 0x7FA8 # <CJK>
+0x9142 0x817A # <CJK>
+0x9143 0x821B # <CJK>
+0x9144 0x8239 # <CJK>
+0x9145 0x85A6 # <CJK>
+0x9146 0x8A6E # <CJK>
+0x9147 0x8CCE # <CJK>
+0x9148 0x8DF5 # <CJK>
+0x9149 0x9078 # <CJK>
+0x914A 0x9077 # <CJK>
+0x914B 0x92AD # <CJK>
+0x914C 0x9291 # <CJK>
+0x914D 0x9583 # <CJK>
+0x914E 0x9BAE # <CJK>
+0x914F 0x524D # <CJK>
+0x9150 0x5584 # <CJK>
+0x9151 0x6F38 # <CJK>
+0x9152 0x7136 # <CJK>
+0x9153 0x5168 # <CJK>
+0x9154 0x7985 # <CJK>
+0x9155 0x7E55 # <CJK>
+0x9156 0x81B3 # <CJK>
+0x9157 0x7CCE # <CJK>
+0x9158 0x564C # <CJK>
+0x9159 0x5851 # <CJK>
+0x915A 0x5CA8 # <CJK>
+0x915B 0x63AA # <CJK>
+0x915C 0x66FE # <CJK>
+0x915D 0x66FD # <CJK>
+0x915E 0x695A # <CJK>
+0x915F 0x72D9 # <CJK>
+0x9160 0x758F # <CJK>
+0x9161 0x758E # <CJK>
+0x9162 0x790E # <CJK>
+0x9163 0x7956 # <CJK>
+0x9164 0x79DF # <CJK>
+0x9165 0x7C97 # <CJK>
+0x9166 0x7D20 # <CJK>
+0x9167 0x7D44 # <CJK>
+0x9168 0x8607 # <CJK>
+0x9169 0x8A34 # <CJK>
+0x916A 0x963B # <CJK>
+0x916B 0x9061 # <CJK>
+0x916C 0x9F20 # <CJK>
+0x916D 0x50E7 # <CJK>
+0x916E 0x5275 # <CJK>
+0x916F 0x53CC # <CJK>
+0x9170 0x53E2 # <CJK>
+0x9171 0x5009 # <CJK>
+0x9172 0x55AA # <CJK>
+0x9173 0x58EE # <CJK>
+0x9174 0x594F # <CJK>
+0x9175 0x723D # <CJK>
+0x9176 0x5B8B # <CJK>
+0x9177 0x5C64 # <CJK>
+0x9178 0x531D # <CJK>
+0x9179 0x60E3 # <CJK>
+0x917A 0x60F3 # <CJK>
+0x917B 0x635C # <CJK>
+0x917C 0x6383 # <CJK>
+0x917D 0x633F # <CJK>
+0x917E 0x63BB # <CJK>
+0x9180 0x64CD # <CJK>
+0x9181 0x65E9 # <CJK>
+0x9182 0x66F9 # <CJK>
+0x9183 0x5DE3 # <CJK>
+0x9184 0x69CD # <CJK>
+0x9185 0x69FD # <CJK>
+0x9186 0x6F15 # <CJK>
+0x9187 0x71E5 # <CJK>
+0x9188 0x4E89 # <CJK>
+0x9189 0x75E9 # <CJK>
+0x918A 0x76F8 # <CJK>
+0x918B 0x7A93 # <CJK>
+0x918C 0x7CDF # <CJK>
+0x918D 0x7DCF # <CJK>
+0x918E 0x7D9C # <CJK>
+0x918F 0x8061 # <CJK>
+0x9190 0x8349 # <CJK>
+0x9191 0x8358 # <CJK>
+0x9192 0x846C # <CJK>
+0x9193 0x84BC # <CJK>
+0x9194 0x85FB # <CJK>
+0x9195 0x88C5 # <CJK>
+0x9196 0x8D70 # <CJK>
+0x9197 0x9001 # <CJK>
+0x9198 0x906D # <CJK>
+0x9199 0x9397 # <CJK>
+0x919A 0x971C # <CJK>
+0x919B 0x9A12 # <CJK>
+0x919C 0x50CF # <CJK>
+0x919D 0x5897 # <CJK>
+0x919E 0x618E # <CJK>
+0x919F 0x81D3 # <CJK>
+0x91A0 0x8535 # <CJK>
+0x91A1 0x8D08 # <CJK>
+0x91A2 0x9020 # <CJK>
+0x91A3 0x4FC3 # <CJK>
+0x91A4 0x5074 # <CJK>
+0x91A5 0x5247 # <CJK>
+0x91A6 0x5373 # <CJK>
+0x91A7 0x606F # <CJK>
+0x91A8 0x6349 # <CJK>
+0x91A9 0x675F # <CJK>
+0x91AA 0x6E2C # <CJK>
+0x91AB 0x8DB3 # <CJK>
+0x91AC 0x901F # <CJK>
+0x91AD 0x4FD7 # <CJK>
+0x91AE 0x5C5E # <CJK>
+0x91AF 0x8CCA # <CJK>
+0x91B0 0x65CF # <CJK>
+0x91B1 0x7D9A # <CJK>
+0x91B2 0x5352 # <CJK>
+0x91B3 0x8896 # <CJK>
+0x91B4 0x5176 # <CJK>
+0x91B5 0x63C3 # <CJK>
+0x91B6 0x5B58 # <CJK>
+0x91B7 0x5B6B # <CJK>
+0x91B8 0x5C0A # <CJK>
+0x91B9 0x640D # <CJK>
+0x91BA 0x6751 # <CJK>
+0x91BB 0x905C # <CJK>
+0x91BC 0x4ED6 # <CJK>
+0x91BD 0x591A # <CJK>
+0x91BE 0x592A # <CJK>
+0x91BF 0x6C70 # <CJK>
+0x91C0 0x8A51 # <CJK>
+0x91C1 0x553E # <CJK>
+0x91C2 0x5815 # <CJK>
+0x91C3 0x59A5 # <CJK>
+0x91C4 0x60F0 # <CJK>
+0x91C5 0x6253 # <CJK>
+0x91C6 0x67C1 # <CJK>
+0x91C7 0x8235 # <CJK>
+0x91C8 0x6955 # <CJK>
+0x91C9 0x9640 # <CJK>
+0x91CA 0x99C4 # <CJK>
+0x91CB 0x9A28 # <CJK>
+0x91CC 0x4F53 # <CJK>
+0x91CD 0x5806 # <CJK>
+0x91CE 0x5BFE # <CJK>
+0x91CF 0x8010 # <CJK>
+0x91D0 0x5CB1 # <CJK>
+0x91D1 0x5E2F # <CJK>
+0x91D2 0x5F85 # <CJK>
+0x91D3 0x6020 # <CJK>
+0x91D4 0x614B # <CJK>
+0x91D5 0x6234 # <CJK>
+0x91D6 0x66FF # <CJK>
+0x91D7 0x6CF0 # <CJK>
+0x91D8 0x6EDE # <CJK>
+0x91D9 0x80CE # <CJK>
+0x91DA 0x817F # <CJK>
+0x91DB 0x82D4 # <CJK>
+0x91DC 0x888B # <CJK>
+0x91DD 0x8CB8 # <CJK>
+0x91DE 0x9000 # <CJK>
+0x91DF 0x902E # <CJK>
+0x91E0 0x968A # <CJK>
+0x91E1 0x9EDB # <CJK>
+0x91E2 0x9BDB # <CJK>
+0x91E3 0x4EE3 # <CJK>
+0x91E4 0x53F0 # <CJK>
+0x91E5 0x5927 # <CJK>
+0x91E6 0x7B2C # <CJK>
+0x91E7 0x918D # <CJK>
+0x91E8 0x984C # <CJK>
+0x91E9 0x9DF9 # <CJK>
+0x91EA 0x6EDD # <CJK>
+0x91EB 0x7027 # <CJK>
+0x91EC 0x5353 # <CJK>
+0x91ED 0x5544 # <CJK>
+0x91EE 0x5B85 # <CJK>
+0x91EF 0x6258 # <CJK>
+0x91F0 0x629E # <CJK>
+0x91F1 0x62D3 # <CJK>
+0x91F2 0x6CA2 # <CJK>
+0x91F3 0x6FEF # <CJK>
+0x91F4 0x7422 # <CJK>
+0x91F5 0x8A17 # <CJK>
+0x91F6 0x9438 # <CJK>
+0x91F7 0x6FC1 # <CJK>
+0x91F8 0x8AFE # <CJK>
+0x91F9 0x8338 # <CJK>
+0x91FA 0x51E7 # <CJK>
+0x91FB 0x86F8 # <CJK>
+0x91FC 0x53EA # <CJK>
+0x9240 0x53E9 # <CJK>
+0x9241 0x4F46 # <CJK>
+0x9242 0x9054 # <CJK>
+0x9243 0x8FB0 # <CJK>
+0x9244 0x596A # <CJK>
+0x9245 0x8131 # <CJK>
+0x9246 0x5DFD # <CJK>
+0x9247 0x7AEA # <CJK>
+0x9248 0x8FBF # <CJK>
+0x9249 0x68DA # <CJK>
+0x924A 0x8C37 # <CJK>
+0x924B 0x72F8 # <CJK>
+0x924C 0x9C48 # <CJK>
+0x924D 0x6A3D # <CJK>
+0x924E 0x8AB0 # <CJK>
+0x924F 0x4E39 # <CJK>
+0x9250 0x5358 # <CJK>
+0x9251 0x5606 # <CJK>
+0x9252 0x5766 # <CJK>
+0x9253 0x62C5 # <CJK>
+0x9254 0x63A2 # <CJK>
+0x9255 0x65E6 # <CJK>
+0x9256 0x6B4E # <CJK>
+0x9257 0x6DE1 # <CJK>
+0x9258 0x6E5B # <CJK>
+0x9259 0x70AD # <CJK>
+0x925A 0x77ED # <CJK>
+0x925B 0x7AEF # <CJK>
+0x925C 0x7BAA # <CJK>
+0x925D 0x7DBB # <CJK>
+0x925E 0x803D # <CJK>
+0x925F 0x80C6 # <CJK>
+0x9260 0x86CB # <CJK>
+0x9261 0x8A95 # <CJK>
+0x9262 0x935B # <CJK>
+0x9263 0x56E3 # <CJK>
+0x9264 0x58C7 # <CJK>
+0x9265 0x5F3E # <CJK>
+0x9266 0x65AD # <CJK>
+0x9267 0x6696 # <CJK>
+0x9268 0x6A80 # <CJK>
+0x9269 0x6BB5 # <CJK>
+0x926A 0x7537 # <CJK>
+0x926B 0x8AC7 # <CJK>
+0x926C 0x5024 # <CJK>
+0x926D 0x77E5 # <CJK>
+0x926E 0x5730 # <CJK>
+0x926F 0x5F1B # <CJK>
+0x9270 0x6065 # <CJK>
+0x9271 0x667A # <CJK>
+0x9272 0x6C60 # <CJK>
+0x9273 0x75F4 # <CJK>
+0x9274 0x7A1A # <CJK>
+0x9275 0x7F6E # <CJK>
+0x9276 0x81F4 # <CJK>
+0x9277 0x8718 # <CJK>
+0x9278 0x9045 # <CJK>
+0x9279 0x99B3 # <CJK>
+0x927A 0x7BC9 # <CJK>
+0x927B 0x755C # <CJK>
+0x927C 0x7AF9 # <CJK>
+0x927D 0x7B51 # <CJK>
+0x927E 0x84C4 # <CJK>
+0x9280 0x9010 # <CJK>
+0x9281 0x79E9 # <CJK>
+0x9282 0x7A92 # <CJK>
+0x9283 0x8336 # <CJK>
+0x9284 0x5AE1 # <CJK>
+0x9285 0x7740 # <CJK>
+0x9286 0x4E2D # <CJK>
+0x9287 0x4EF2 # <CJK>
+0x9288 0x5B99 # <CJK>
+0x9289 0x5FE0 # <CJK>
+0x928A 0x62BD # <CJK>
+0x928B 0x663C # <CJK>
+0x928C 0x67F1 # <CJK>
+0x928D 0x6CE8 # <CJK>
+0x928E 0x866B # <CJK>
+0x928F 0x8877 # <CJK>
+0x9290 0x8A3B # <CJK>
+0x9291 0x914E # <CJK>
+0x9292 0x92F3 # <CJK>
+0x9293 0x99D0 # <CJK>
+0x9294 0x6A17 # <CJK>
+0x9295 0x7026 # <CJK>
+0x9296 0x732A # <CJK>
+0x9297 0x82E7 # <CJK>
+0x9298 0x8457 # <CJK>
+0x9299 0x8CAF # <CJK>
+0x929A 0x4E01 # <CJK>
+0x929B 0x5146 # <CJK>
+0x929C 0x51CB # <CJK>
+0x929D 0x558B # <CJK>
+0x929E 0x5BF5 # <CJK>
+0x929F 0x5E16 # <CJK>
+0x92A0 0x5E33 # <CJK>
+0x92A1 0x5E81 # <CJK>
+0x92A2 0x5F14 # <CJK>
+0x92A3 0x5F35 # <CJK>
+0x92A4 0x5F6B # <CJK>
+0x92A5 0x5FB4 # <CJK>
+0x92A6 0x61F2 # <CJK>
+0x92A7 0x6311 # <CJK>
+0x92A8 0x66A2 # <CJK>
+0x92A9 0x671D # <CJK>
+0x92AA 0x6F6E # <CJK>
+0x92AB 0x7252 # <CJK>
+0x92AC 0x753A # <CJK>
+0x92AD 0x773A # <CJK>
+0x92AE 0x8074 # <CJK>
+0x92AF 0x8139 # <CJK>
+0x92B0 0x8178 # <CJK>
+0x92B1 0x8776 # <CJK>
+0x92B2 0x8ABF # <CJK>
+0x92B3 0x8ADC # <CJK>
+0x92B4 0x8D85 # <CJK>
+0x92B5 0x8DF3 # <CJK>
+0x92B6 0x929A # <CJK>
+0x92B7 0x9577 # <CJK>
+0x92B8 0x9802 # <CJK>
+0x92B9 0x9CE5 # <CJK>
+0x92BA 0x52C5 # <CJK>
+0x92BB 0x6357 # <CJK>
+0x92BC 0x76F4 # <CJK>
+0x92BD 0x6715 # <CJK>
+0x92BE 0x6C88 # <CJK>
+0x92BF 0x73CD # <CJK>
+0x92C0 0x8CC3 # <CJK>
+0x92C1 0x93AE # <CJK>
+0x92C2 0x9673 # <CJK>
+0x92C3 0x6D25 # <CJK>
+0x92C4 0x589C # <CJK>
+0x92C5 0x690E # <CJK>
+0x92C6 0x69CC # <CJK>
+0x92C7 0x8FFD # <CJK>
+0x92C8 0x939A # <CJK>
+0x92C9 0x75DB # <CJK>
+0x92CA 0x901A # <CJK>
+0x92CB 0x585A # <CJK>
+0x92CC 0x6802 # <CJK>
+0x92CD 0x63B4 # <CJK>
+0x92CE 0x69FB # <CJK>
+0x92CF 0x4F43 # <CJK>
+0x92D0 0x6F2C # <CJK>
+0x92D1 0x67D8 # <CJK>
+0x92D2 0x8FBB # <CJK>
+0x92D3 0x8526 # <CJK>
+0x92D4 0x7DB4 # <CJK>
+0x92D5 0x9354 # <CJK>
+0x92D6 0x693F # <CJK>
+0x92D7 0x6F70 # <CJK>
+0x92D8 0x576A # <CJK>
+0x92D9 0x58F7 # <CJK>
+0x92DA 0x5B2C # <CJK>
+0x92DB 0x7D2C # <CJK>
+0x92DC 0x722A # <CJK>
+0x92DD 0x540A # <CJK>
+0x92DE 0x91E3 # <CJK>
+0x92DF 0x9DB4 # <CJK>
+0x92E0 0x4EAD # <CJK>
+0x92E1 0x4F4E # <CJK>
+0x92E2 0x505C # <CJK>
+0x92E3 0x5075 # <CJK>
+0x92E4 0x5243 # <CJK>
+0x92E5 0x8C9E # <CJK>
+0x92E6 0x5448 # <CJK>
+0x92E7 0x5824 # <CJK>
+0x92E8 0x5B9A # <CJK>
+0x92E9 0x5E1D # <CJK>
+0x92EA 0x5E95 # <CJK>
+0x92EB 0x5EAD # <CJK>
+0x92EC 0x5EF7 # <CJK>
+0x92ED 0x5F1F # <CJK>
+0x92EE 0x608C # <CJK>
+0x92EF 0x62B5 # <CJK>
+0x92F0 0x633A # <CJK>
+0x92F1 0x63D0 # <CJK>
+0x92F2 0x68AF # <CJK>
+0x92F3 0x6C40 # <CJK>
+0x92F4 0x7887 # <CJK>
+0x92F5 0x798E # <CJK>
+0x92F6 0x7A0B # <CJK>
+0x92F7 0x7DE0 # <CJK>
+0x92F8 0x8247 # <CJK>
+0x92F9 0x8A02 # <CJK>
+0x92FA 0x8AE6 # <CJK>
+0x92FB 0x8E44 # <CJK>
+0x92FC 0x9013 # <CJK>
+0x9340 0x90B8 # <CJK>
+0x9341 0x912D # <CJK>
+0x9342 0x91D8 # <CJK>
+0x9343 0x9F0E # <CJK>
+0x9344 0x6CE5 # <CJK>
+0x9345 0x6458 # <CJK>
+0x9346 0x64E2 # <CJK>
+0x9347 0x6575 # <CJK>
+0x9348 0x6EF4 # <CJK>
+0x9349 0x7684 # <CJK>
+0x934A 0x7B1B # <CJK>
+0x934B 0x9069 # <CJK>
+0x934C 0x93D1 # <CJK>
+0x934D 0x6EBA # <CJK>
+0x934E 0x54F2 # <CJK>
+0x934F 0x5FB9 # <CJK>
+0x9350 0x64A4 # <CJK>
+0x9351 0x8F4D # <CJK>
+0x9352 0x8FED # <CJK>
+0x9353 0x9244 # <CJK>
+0x9354 0x5178 # <CJK>
+0x9355 0x586B # <CJK>
+0x9356 0x5929 # <CJK>
+0x9357 0x5C55 # <CJK>
+0x9358 0x5E97 # <CJK>
+0x9359 0x6DFB # <CJK>
+0x935A 0x7E8F # <CJK>
+0x935B 0x751C # <CJK>
+0x935C 0x8CBC # <CJK>
+0x935D 0x8EE2 # <CJK>
+0x935E 0x985B # <CJK>
+0x935F 0x70B9 # <CJK>
+0x9360 0x4F1D # <CJK>
+0x9361 0x6BBF # <CJK>
+0x9362 0x6FB1 # <CJK>
+0x9363 0x7530 # <CJK>
+0x9364 0x96FB # <CJK>
+0x9365 0x514E # <CJK>
+0x9366 0x5410 # <CJK>
+0x9367 0x5835 # <CJK>
+0x9368 0x5857 # <CJK>
+0x9369 0x59AC # <CJK>
+0x936A 0x5C60 # <CJK>
+0x936B 0x5F92 # <CJK>
+0x936C 0x6597 # <CJK>
+0x936D 0x675C # <CJK>
+0x936E 0x6E21 # <CJK>
+0x936F 0x767B # <CJK>
+0x9370 0x83DF # <CJK>
+0x9371 0x8CED # <CJK>
+0x9372 0x9014 # <CJK>
+0x9373 0x90FD # <CJK>
+0x9374 0x934D # <CJK>
+0x9375 0x7825 # <CJK>
+0x9376 0x783A # <CJK>
+0x9377 0x52AA # <CJK>
+0x9378 0x5EA6 # <CJK>
+0x9379 0x571F # <CJK>
+0x937A 0x5974 # <CJK>
+0x937B 0x6012 # <CJK>
+0x937C 0x5012 # <CJK>
+0x937D 0x515A # <CJK>
+0x937E 0x51AC # <CJK>
+0x9380 0x51CD # <CJK>
+0x9381 0x5200 # <CJK>
+0x9382 0x5510 # <CJK>
+0x9383 0x5854 # <CJK>
+0x9384 0x5858 # <CJK>
+0x9385 0x5957 # <CJK>
+0x9386 0x5B95 # <CJK>
+0x9387 0x5CF6 # <CJK>
+0x9388 0x5D8B # <CJK>
+0x9389 0x60BC # <CJK>
+0x938A 0x6295 # <CJK>
+0x938B 0x642D # <CJK>
+0x938C 0x6771 # <CJK>
+0x938D 0x6843 # <CJK>
+0x938E 0x68BC # <CJK>
+0x938F 0x68DF # <CJK>
+0x9390 0x76D7 # <CJK>
+0x9391 0x6DD8 # <CJK>
+0x9392 0x6E6F # <CJK>
+0x9393 0x6D9B # <CJK>
+0x9394 0x706F # <CJK>
+0x9395 0x71C8 # <CJK>
+0x9396 0x5F53 # <CJK>
+0x9397 0x75D8 # <CJK>
+0x9398 0x7977 # <CJK>
+0x9399 0x7B49 # <CJK>
+0x939A 0x7B54 # <CJK>
+0x939B 0x7B52 # <CJK>
+0x939C 0x7CD6 # <CJK>
+0x939D 0x7D71 # <CJK>
+0x939E 0x5230 # <CJK>
+0x939F 0x8463 # <CJK>
+0x93A0 0x8569 # <CJK>
+0x93A1 0x85E4 # <CJK>
+0x93A2 0x8A0E # <CJK>
+0x93A3 0x8B04 # <CJK>
+0x93A4 0x8C46 # <CJK>
+0x93A5 0x8E0F # <CJK>
+0x93A6 0x9003 # <CJK>
+0x93A7 0x900F # <CJK>
+0x93A8 0x9419 # <CJK>
+0x93A9 0x9676 # <CJK>
+0x93AA 0x982D # <CJK>
+0x93AB 0x9A30 # <CJK>
+0x93AC 0x95D8 # <CJK>
+0x93AD 0x50CD # <CJK>
+0x93AE 0x52D5 # <CJK>
+0x93AF 0x540C # <CJK>
+0x93B0 0x5802 # <CJK>
+0x93B1 0x5C0E # <CJK>
+0x93B2 0x61A7 # <CJK>
+0x93B3 0x649E # <CJK>
+0x93B4 0x6D1E # <CJK>
+0x93B5 0x77B3 # <CJK>
+0x93B6 0x7AE5 # <CJK>
+0x93B7 0x80F4 # <CJK>
+0x93B8 0x8404 # <CJK>
+0x93B9 0x9053 # <CJK>
+0x93BA 0x9285 # <CJK>
+0x93BB 0x5CE0 # <CJK>
+0x93BC 0x9D07 # <CJK>
+0x93BD 0x533F # <CJK>
+0x93BE 0x5F97 # <CJK>
+0x93BF 0x5FB3 # <CJK>
+0x93C0 0x6D9C # <CJK>
+0x93C1 0x7279 # <CJK>
+0x93C2 0x7763 # <CJK>
+0x93C3 0x79BF # <CJK>
+0x93C4 0x7BE4 # <CJK>
+0x93C5 0x6BD2 # <CJK>
+0x93C6 0x72EC # <CJK>
+0x93C7 0x8AAD # <CJK>
+0x93C8 0x6803 # <CJK>
+0x93C9 0x6A61 # <CJK>
+0x93CA 0x51F8 # <CJK>
+0x93CB 0x7A81 # <CJK>
+0x93CC 0x6934 # <CJK>
+0x93CD 0x5C4A # <CJK>
+0x93CE 0x9CF6 # <CJK>
+0x93CF 0x82EB # <CJK>
+0x93D0 0x5BC5 # <CJK>
+0x93D1 0x9149 # <CJK>
+0x93D2 0x701E # <CJK>
+0x93D3 0x5678 # <CJK>
+0x93D4 0x5C6F # <CJK>
+0x93D5 0x60C7 # <CJK>
+0x93D6 0x6566 # <CJK>
+0x93D7 0x6C8C # <CJK>
+0x93D8 0x8C5A # <CJK>
+0x93D9 0x9041 # <CJK>
+0x93DA 0x9813 # <CJK>
+0x93DB 0x5451 # <CJK>
+0x93DC 0x66C7 # <CJK>
+0x93DD 0x920D # <CJK>
+0x93DE 0x5948 # <CJK>
+0x93DF 0x90A3 # <CJK>
+0x93E0 0x5185 # <CJK>
+0x93E1 0x4E4D # <CJK>
+0x93E2 0x51EA # <CJK>
+0x93E3 0x8599 # <CJK>
+0x93E4 0x8B0E # <CJK>
+0x93E5 0x7058 # <CJK>
+0x93E6 0x637A # <CJK>
+0x93E7 0x934B # <CJK>
+0x93E8 0x6962 # <CJK>
+0x93E9 0x99B4 # <CJK>
+0x93EA 0x7E04 # <CJK>
+0x93EB 0x7577 # <CJK>
+0x93EC 0x5357 # <CJK>
+0x93ED 0x6960 # <CJK>
+0x93EE 0x8EDF # <CJK>
+0x93EF 0x96E3 # <CJK>
+0x93F0 0x6C5D # <CJK>
+0x93F1 0x4E8C # <CJK>
+0x93F2 0x5C3C # <CJK>
+0x93F3 0x5F10 # <CJK>
+0x93F4 0x8FE9 # <CJK>
+0x93F5 0x5302 # <CJK>
+0x93F6 0x8CD1 # <CJK>
+0x93F7 0x8089 # <CJK>
+0x93F8 0x8679 # <CJK>
+0x93F9 0x5EFF # <CJK>
+0x93FA 0x65E5 # <CJK>
+0x93FB 0x4E73 # <CJK>
+0x93FC 0x5165 # <CJK>
+0x9440 0x5982 # <CJK>
+0x9441 0x5C3F # <CJK>
+0x9442 0x97EE # <CJK>
+0x9443 0x4EFB # <CJK>
+0x9444 0x598A # <CJK>
+0x9445 0x5FCD # <CJK>
+0x9446 0x8A8D # <CJK>
+0x9447 0x6FE1 # <CJK>
+0x9448 0x79B0 # <CJK>
+0x9449 0x7962 # <CJK>
+0x944A 0x5BE7 # <CJK>
+0x944B 0x8471 # <CJK>
+0x944C 0x732B # <CJK>
+0x944D 0x71B1 # <CJK>
+0x944E 0x5E74 # <CJK>
+0x944F 0x5FF5 # <CJK>
+0x9450 0x637B # <CJK>
+0x9451 0x649A # <CJK>
+0x9452 0x71C3 # <CJK>
+0x9453 0x7C98 # <CJK>
+0x9454 0x4E43 # <CJK>
+0x9455 0x5EFC # <CJK>
+0x9456 0x4E4B # <CJK>
+0x9457 0x57DC # <CJK>
+0x9458 0x56A2 # <CJK>
+0x9459 0x60A9 # <CJK>
+0x945A 0x6FC3 # <CJK>
+0x945B 0x7D0D # <CJK>
+0x945C 0x80FD # <CJK>
+0x945D 0x8133 # <CJK>
+0x945E 0x81BF # <CJK>
+0x945F 0x8FB2 # <CJK>
+0x9460 0x8997 # <CJK>
+0x9461 0x86A4 # <CJK>
+0x9462 0x5DF4 # <CJK>
+0x9463 0x628A # <CJK>
+0x9464 0x64AD # <CJK>
+0x9465 0x8987 # <CJK>
+0x9466 0x6777 # <CJK>
+0x9467 0x6CE2 # <CJK>
+0x9468 0x6D3E # <CJK>
+0x9469 0x7436 # <CJK>
+0x946A 0x7834 # <CJK>
+0x946B 0x5A46 # <CJK>
+0x946C 0x7F75 # <CJK>
+0x946D 0x82AD # <CJK>
+0x946E 0x99AC # <CJK>
+0x946F 0x4FF3 # <CJK>
+0x9470 0x5EC3 # <CJK>
+0x9471 0x62DD # <CJK>
+0x9472 0x6392 # <CJK>
+0x9473 0x6557 # <CJK>
+0x9474 0x676F # <CJK>
+0x9475 0x76C3 # <CJK>
+0x9476 0x724C # <CJK>
+0x9477 0x80CC # <CJK>
+0x9478 0x80BA # <CJK>
+0x9479 0x8F29 # <CJK>
+0x947A 0x914D # <CJK>
+0x947B 0x500D # <CJK>
+0x947C 0x57F9 # <CJK>
+0x947D 0x5A92 # <CJK>
+0x947E 0x6885 # <CJK>
+0x9480 0x6973 # <CJK>
+0x9481 0x7164 # <CJK>
+0x9482 0x72FD # <CJK>
+0x9483 0x8CB7 # <CJK>
+0x9484 0x58F2 # <CJK>
+0x9485 0x8CE0 # <CJK>
+0x9486 0x966A # <CJK>
+0x9487 0x9019 # <CJK>
+0x9488 0x877F # <CJK>
+0x9489 0x79E4 # <CJK>
+0x948A 0x77E7 # <CJK>
+0x948B 0x8429 # <CJK>
+0x948C 0x4F2F # <CJK>
+0x948D 0x5265 # <CJK>
+0x948E 0x535A # <CJK>
+0x948F 0x62CD # <CJK>
+0x9490 0x67CF # <CJK>
+0x9491 0x6CCA # <CJK>
+0x9492 0x767D # <CJK>
+0x9493 0x7B94 # <CJK>
+0x9494 0x7C95 # <CJK>
+0x9495 0x8236 # <CJK>
+0x9496 0x8584 # <CJK>
+0x9497 0x8FEB # <CJK>
+0x9498 0x66DD # <CJK>
+0x9499 0x6F20 # <CJK>
+0x949A 0x7206 # <CJK>
+0x949B 0x7E1B # <CJK>
+0x949C 0x83AB # <CJK>
+0x949D 0x99C1 # <CJK>
+0x949E 0x9EA6 # <CJK>
+0x949F 0x51FD # <CJK>
+0x94A0 0x7BB1 # <CJK>
+0x94A1 0x7872 # <CJK>
+0x94A2 0x7BB8 # <CJK>
+0x94A3 0x8087 # <CJK>
+0x94A4 0x7B48 # <CJK>
+0x94A5 0x6AE8 # <CJK>
+0x94A6 0x5E61 # <CJK>
+0x94A7 0x808C # <CJK>
+0x94A8 0x7551 # <CJK>
+0x94A9 0x7560 # <CJK>
+0x94AA 0x516B # <CJK>
+0x94AB 0x9262 # <CJK>
+0x94AC 0x6E8C # <CJK>
+0x94AD 0x767A # <CJK>
+0x94AE 0x9197 # <CJK>
+0x94AF 0x9AEA # <CJK>
+0x94B0 0x4F10 # <CJK>
+0x94B1 0x7F70 # <CJK>
+0x94B2 0x629C # <CJK>
+0x94B3 0x7B4F # <CJK>
+0x94B4 0x95A5 # <CJK>
+0x94B5 0x9CE9 # <CJK>
+0x94B6 0x567A # <CJK>
+0x94B7 0x5859 # <CJK>
+0x94B8 0x86E4 # <CJK>
+0x94B9 0x96BC # <CJK>
+0x94BA 0x4F34 # <CJK>
+0x94BB 0x5224 # <CJK>
+0x94BC 0x534A # <CJK>
+0x94BD 0x53CD # <CJK>
+0x94BE 0x53DB # <CJK>
+0x94BF 0x5E06 # <CJK>
+0x94C0 0x642C # <CJK>
+0x94C1 0x6591 # <CJK>
+0x94C2 0x677F # <CJK>
+0x94C3 0x6C3E # <CJK>
+0x94C4 0x6C4E # <CJK>
+0x94C5 0x7248 # <CJK>
+0x94C6 0x72AF # <CJK>
+0x94C7 0x73ED # <CJK>
+0x94C8 0x7554 # <CJK>
+0x94C9 0x7E41 # <CJK>
+0x94CA 0x822C # <CJK>
+0x94CB 0x85E9 # <CJK>
+0x94CC 0x8CA9 # <CJK>
+0x94CD 0x7BC4 # <CJK>
+0x94CE 0x91C6 # <CJK>
+0x94CF 0x7169 # <CJK>
+0x94D0 0x9812 # <CJK>
+0x94D1 0x98EF # <CJK>
+0x94D2 0x633D # <CJK>
+0x94D3 0x6669 # <CJK>
+0x94D4 0x756A # <CJK>
+0x94D5 0x76E4 # <CJK>
+0x94D6 0x78D0 # <CJK>
+0x94D7 0x8543 # <CJK>
+0x94D8 0x86EE # <CJK>
+0x94D9 0x532A # <CJK>
+0x94DA 0x5351 # <CJK>
+0x94DB 0x5426 # <CJK>
+0x94DC 0x5983 # <CJK>
+0x94DD 0x5E87 # <CJK>
+0x94DE 0x5F7C # <CJK>
+0x94DF 0x60B2 # <CJK>
+0x94E0 0x6249 # <CJK>
+0x94E1 0x6279 # <CJK>
+0x94E2 0x62AB # <CJK>
+0x94E3 0x6590 # <CJK>
+0x94E4 0x6BD4 # <CJK>
+0x94E5 0x6CCC # <CJK>
+0x94E6 0x75B2 # <CJK>
+0x94E7 0x76AE # <CJK>
+0x94E8 0x7891 # <CJK>
+0x94E9 0x79D8 # <CJK>
+0x94EA 0x7DCB # <CJK>
+0x94EB 0x7F77 # <CJK>
+0x94EC 0x80A5 # <CJK>
+0x94ED 0x88AB # <CJK>
+0x94EE 0x8AB9 # <CJK>
+0x94EF 0x8CBB # <CJK>
+0x94F0 0x907F # <CJK>
+0x94F1 0x975E # <CJK>
+0x94F2 0x98DB # <CJK>
+0x94F3 0x6A0B # <CJK>
+0x94F4 0x7C38 # <CJK>
+0x94F5 0x5099 # <CJK>
+0x94F6 0x5C3E # <CJK>
+0x94F7 0x5FAE # <CJK>
+0x94F8 0x6787 # <CJK>
+0x94F9 0x6BD8 # <CJK>
+0x94FA 0x7435 # <CJK>
+0x94FB 0x7709 # <CJK>
+0x94FC 0x7F8E # <CJK>
+0x9540 0x9F3B # <CJK>
+0x9541 0x67CA # <CJK>
+0x9542 0x7A17 # <CJK>
+0x9543 0x5339 # <CJK>
+0x9544 0x758B # <CJK>
+0x9545 0x9AED # <CJK>
+0x9546 0x5F66 # <CJK>
+0x9547 0x819D # <CJK>
+0x9548 0x83F1 # <CJK>
+0x9549 0x8098 # <CJK>
+0x954A 0x5F3C # <CJK>
+0x954B 0x5FC5 # <CJK>
+0x954C 0x7562 # <CJK>
+0x954D 0x7B46 # <CJK>
+0x954E 0x903C # <CJK>
+0x954F 0x6867 # <CJK>
+0x9550 0x59EB # <CJK>
+0x9551 0x5A9B # <CJK>
+0x9552 0x7D10 # <CJK>
+0x9553 0x767E # <CJK>
+0x9554 0x8B2C # <CJK>
+0x9555 0x4FF5 # <CJK>
+0x9556 0x5F6A # <CJK>
+0x9557 0x6A19 # <CJK>
+0x9558 0x6C37 # <CJK>
+0x9559 0x6F02 # <CJK>
+0x955A 0x74E2 # <CJK>
+0x955B 0x7968 # <CJK>
+0x955C 0x8868 # <CJK>
+0x955D 0x8A55 # <CJK>
+0x955E 0x8C79 # <CJK>
+0x955F 0x5EDF # <CJK>
+0x9560 0x63CF # <CJK>
+0x9561 0x75C5 # <CJK>
+0x9562 0x79D2 # <CJK>
+0x9563 0x82D7 # <CJK>
+0x9564 0x9328 # <CJK>
+0x9565 0x92F2 # <CJK>
+0x9566 0x849C # <CJK>
+0x9567 0x86ED # <CJK>
+0x9568 0x9C2D # <CJK>
+0x9569 0x54C1 # <CJK>
+0x956A 0x5F6C # <CJK>
+0x956B 0x658C # <CJK>
+0x956C 0x6D5C # <CJK>
+0x956D 0x7015 # <CJK>
+0x956E 0x8CA7 # <CJK>
+0x956F 0x8CD3 # <CJK>
+0x9570 0x983B # <CJK>
+0x9571 0x654F # <CJK>
+0x9572 0x74F6 # <CJK>
+0x9573 0x4E0D # <CJK>
+0x9574 0x4ED8 # <CJK>
+0x9575 0x57E0 # <CJK>
+0x9576 0x592B # <CJK>
+0x9577 0x5A66 # <CJK>
+0x9578 0x5BCC # <CJK>
+0x9579 0x51A8 # <CJK>
+0x957A 0x5E03 # <CJK>
+0x957B 0x5E9C # <CJK>
+0x957C 0x6016 # <CJK>
+0x957D 0x6276 # <CJK>
+0x957E 0x6577 # <CJK>
+0x9580 0x65A7 # <CJK>
+0x9581 0x666E # <CJK>
+0x9582 0x6D6E # <CJK>
+0x9583 0x7236 # <CJK>
+0x9584 0x7B26 # <CJK>
+0x9585 0x8150 # <CJK>
+0x9586 0x819A # <CJK>
+0x9587 0x8299 # <CJK>
+0x9588 0x8B5C # <CJK>
+0x9589 0x8CA0 # <CJK>
+0x958A 0x8CE6 # <CJK>
+0x958B 0x8D74 # <CJK>
+0x958C 0x961C # <CJK>
+0x958D 0x9644 # <CJK>
+0x958E 0x4FAE # <CJK>
+0x958F 0x64AB # <CJK>
+0x9590 0x6B66 # <CJK>
+0x9591 0x821E # <CJK>
+0x9592 0x8461 # <CJK>
+0x9593 0x856A # <CJK>
+0x9594 0x90E8 # <CJK>
+0x9595 0x5C01 # <CJK>
+0x9596 0x6953 # <CJK>
+0x9597 0x98A8 # <CJK>
+0x9598 0x847A # <CJK>
+0x9599 0x8557 # <CJK>
+0x959A 0x4F0F # <CJK>
+0x959B 0x526F # <CJK>
+0x959C 0x5FA9 # <CJK>
+0x959D 0x5E45 # <CJK>
+0x959E 0x670D # <CJK>
+0x959F 0x798F # <CJK>
+0x95A0 0x8179 # <CJK>
+0x95A1 0x8907 # <CJK>
+0x95A2 0x8986 # <CJK>
+0x95A3 0x6DF5 # <CJK>
+0x95A4 0x5F17 # <CJK>
+0x95A5 0x6255 # <CJK>
+0x95A6 0x6CB8 # <CJK>
+0x95A7 0x4ECF # <CJK>
+0x95A8 0x7269 # <CJK>
+0x95A9 0x9B92 # <CJK>
+0x95AA 0x5206 # <CJK>
+0x95AB 0x543B # <CJK>
+0x95AC 0x5674 # <CJK>
+0x95AD 0x58B3 # <CJK>
+0x95AE 0x61A4 # <CJK>
+0x95AF 0x626E # <CJK>
+0x95B0 0x711A # <CJK>
+0x95B1 0x596E # <CJK>
+0x95B2 0x7C89 # <CJK>
+0x95B3 0x7CDE # <CJK>
+0x95B4 0x7D1B # <CJK>
+0x95B5 0x96F0 # <CJK>
+0x95B6 0x6587 # <CJK>
+0x95B7 0x805E # <CJK>
+0x95B8 0x4E19 # <CJK>
+0x95B9 0x4F75 # <CJK>
+0x95BA 0x5175 # <CJK>
+0x95BB 0x5840 # <CJK>
+0x95BC 0x5E63 # <CJK>
+0x95BD 0x5E73 # <CJK>
+0x95BE 0x5F0A # <CJK>
+0x95BF 0x67C4 # <CJK>
+0x95C0 0x4E26 # <CJK>
+0x95C1 0x853D # <CJK>
+0x95C2 0x9589 # <CJK>
+0x95C3 0x965B # <CJK>
+0x95C4 0x7C73 # <CJK>
+0x95C5 0x9801 # <CJK>
+0x95C6 0x50FB # <CJK>
+0x95C7 0x58C1 # <CJK>
+0x95C8 0x7656 # <CJK>
+0x95C9 0x78A7 # <CJK>
+0x95CA 0x5225 # <CJK>
+0x95CB 0x77A5 # <CJK>
+0x95CC 0x8511 # <CJK>
+0x95CD 0x7B86 # <CJK>
+0x95CE 0x504F # <CJK>
+0x95CF 0x5909 # <CJK>
+0x95D0 0x7247 # <CJK>
+0x95D1 0x7BC7 # <CJK>
+0x95D2 0x7DE8 # <CJK>
+0x95D3 0x8FBA # <CJK>
+0x95D4 0x8FD4 # <CJK>
+0x95D5 0x904D # <CJK>
+0x95D6 0x4FBF # <CJK>
+0x95D7 0x52C9 # <CJK>
+0x95D8 0x5A29 # <CJK>
+0x95D9 0x5F01 # <CJK>
+0x95DA 0x97AD # <CJK>
+0x95DB 0x4FDD # <CJK>
+0x95DC 0x8217 # <CJK>
+0x95DD 0x92EA # <CJK>
+0x95DE 0x5703 # <CJK>
+0x95DF 0x6355 # <CJK>
+0x95E0 0x6B69 # <CJK>
+0x95E1 0x752B # <CJK>
+0x95E2 0x88DC # <CJK>
+0x95E3 0x8F14 # <CJK>
+0x95E4 0x7A42 # <CJK>
+0x95E5 0x52DF # <CJK>
+0x95E6 0x5893 # <CJK>
+0x95E7 0x6155 # <CJK>
+0x95E8 0x620A # <CJK>
+0x95E9 0x66AE # <CJK>
+0x95EA 0x6BCD # <CJK>
+0x95EB 0x7C3F # <CJK>
+0x95EC 0x83E9 # <CJK>
+0x95ED 0x5023 # <CJK>
+0x95EE 0x4FF8 # <CJK>
+0x95EF 0x5305 # <CJK>
+0x95F0 0x5446 # <CJK>
+0x95F1 0x5831 # <CJK>
+0x95F2 0x5949 # <CJK>
+0x95F3 0x5B9D # <CJK>
+0x95F4 0x5CF0 # <CJK>
+0x95F5 0x5CEF # <CJK>
+0x95F6 0x5D29 # <CJK>
+0x95F7 0x5E96 # <CJK>
+0x95F8 0x62B1 # <CJK>
+0x95F9 0x6367 # <CJK>
+0x95FA 0x653E # <CJK>
+0x95FB 0x65B9 # <CJK>
+0x95FC 0x670B # <CJK>
+0x9640 0x6CD5 # <CJK>
+0x9641 0x6CE1 # <CJK>
+0x9642 0x70F9 # <CJK>
+0x9643 0x7832 # <CJK>
+0x9644 0x7E2B # <CJK>
+0x9645 0x80DE # <CJK>
+0x9646 0x82B3 # <CJK>
+0x9647 0x840C # <CJK>
+0x9648 0x84EC # <CJK>
+0x9649 0x8702 # <CJK>
+0x964A 0x8912 # <CJK>
+0x964B 0x8A2A # <CJK>
+0x964C 0x8C4A # <CJK>
+0x964D 0x90A6 # <CJK>
+0x964E 0x92D2 # <CJK>
+0x964F 0x98FD # <CJK>
+0x9650 0x9CF3 # <CJK>
+0x9651 0x9D6C # <CJK>
+0x9652 0x4E4F # <CJK>
+0x9653 0x4EA1 # <CJK>
+0x9654 0x508D # <CJK>
+0x9655 0x5256 # <CJK>
+0x9656 0x574A # <CJK>
+0x9657 0x59A8 # <CJK>
+0x9658 0x5E3D # <CJK>
+0x9659 0x5FD8 # <CJK>
+0x965A 0x5FD9 # <CJK>
+0x965B 0x623F # <CJK>
+0x965C 0x66B4 # <CJK>
+0x965D 0x671B # <CJK>
+0x965E 0x67D0 # <CJK>
+0x965F 0x68D2 # <CJK>
+0x9660 0x5192 # <CJK>
+0x9661 0x7D21 # <CJK>
+0x9662 0x80AA # <CJK>
+0x9663 0x81A8 # <CJK>
+0x9664 0x8B00 # <CJK>
+0x9665 0x8C8C # <CJK>
+0x9666 0x8CBF # <CJK>
+0x9667 0x927E # <CJK>
+0x9668 0x9632 # <CJK>
+0x9669 0x5420 # <CJK>
+0x966A 0x982C # <CJK>
+0x966B 0x5317 # <CJK>
+0x966C 0x50D5 # <CJK>
+0x966D 0x535C # <CJK>
+0x966E 0x58A8 # <CJK>
+0x966F 0x64B2 # <CJK>
+0x9670 0x6734 # <CJK>
+0x9671 0x7267 # <CJK>
+0x9672 0x7766 # <CJK>
+0x9673 0x7A46 # <CJK>
+0x9674 0x91E6 # <CJK>
+0x9675 0x52C3 # <CJK>
+0x9676 0x6CA1 # <CJK>
+0x9677 0x6B86 # <CJK>
+0x9678 0x5800 # <CJK>
+0x9679 0x5E4C # <CJK>
+0x967A 0x5954 # <CJK>
+0x967B 0x672C # <CJK>
+0x967C 0x7FFB # <CJK>
+0x967D 0x51E1 # <CJK>
+0x967E 0x76C6 # <CJK>
+0x9680 0x6469 # <CJK>
+0x9681 0x78E8 # <CJK>
+0x9682 0x9B54 # <CJK>
+0x9683 0x9EBB # <CJK>
+0x9684 0x57CB # <CJK>
+0x9685 0x59B9 # <CJK>
+0x9686 0x6627 # <CJK>
+0x9687 0x679A # <CJK>
+0x9688 0x6BCE # <CJK>
+0x9689 0x54E9 # <CJK>
+0x968A 0x69D9 # <CJK>
+0x968B 0x5E55 # <CJK>
+0x968C 0x819C # <CJK>
+0x968D 0x6795 # <CJK>
+0x968E 0x9BAA # <CJK>
+0x968F 0x67FE # <CJK>
+0x9690 0x9C52 # <CJK>
+0x9691 0x685D # <CJK>
+0x9692 0x4EA6 # <CJK>
+0x9693 0x4FE3 # <CJK>
+0x9694 0x53C8 # <CJK>
+0x9695 0x62B9 # <CJK>
+0x9696 0x672B # <CJK>
+0x9697 0x6CAB # <CJK>
+0x9698 0x8FC4 # <CJK>
+0x9699 0x4FAD # <CJK>
+0x969A 0x7E6D # <CJK>
+0x969B 0x9EBF # <CJK>
+0x969C 0x4E07 # <CJK>
+0x969D 0x6162 # <CJK>
+0x969E 0x6E80 # <CJK>
+0x969F 0x6F2B # <CJK>
+0x96A0 0x8513 # <CJK>
+0x96A1 0x5473 # <CJK>
+0x96A2 0x672A # <CJK>
+0x96A3 0x9B45 # <CJK>
+0x96A4 0x5DF3 # <CJK>
+0x96A5 0x7B95 # <CJK>
+0x96A6 0x5CAC # <CJK>
+0x96A7 0x5BC6 # <CJK>
+0x96A8 0x871C # <CJK>
+0x96A9 0x6E4A # <CJK>
+0x96AA 0x84D1 # <CJK>
+0x96AB 0x7A14 # <CJK>
+0x96AC 0x8108 # <CJK>
+0x96AD 0x5999 # <CJK>
+0x96AE 0x7C8D # <CJK>
+0x96AF 0x6C11 # <CJK>
+0x96B0 0x7720 # <CJK>
+0x96B1 0x52D9 # <CJK>
+0x96B2 0x5922 # <CJK>
+0x96B3 0x7121 # <CJK>
+0x96B4 0x725F # <CJK>
+0x96B5 0x77DB # <CJK>
+0x96B6 0x9727 # <CJK>
+0x96B7 0x9D61 # <CJK>
+0x96B8 0x690B # <CJK>
+0x96B9 0x5A7F # <CJK>
+0x96BA 0x5A18 # <CJK>
+0x96BB 0x51A5 # <CJK>
+0x96BC 0x540D # <CJK>
+0x96BD 0x547D # <CJK>
+0x96BE 0x660E # <CJK>
+0x96BF 0x76DF # <CJK>
+0x96C0 0x8FF7 # <CJK>
+0x96C1 0x9298 # <CJK>
+0x96C2 0x9CF4 # <CJK>
+0x96C3 0x59EA # <CJK>
+0x96C4 0x725D # <CJK>
+0x96C5 0x6EC5 # <CJK>
+0x96C6 0x514D # <CJK>
+0x96C7 0x68C9 # <CJK>
+0x96C8 0x7DBF # <CJK>
+0x96C9 0x7DEC # <CJK>
+0x96CA 0x9762 # <CJK>
+0x96CB 0x9EBA # <CJK>
+0x96CC 0x6478 # <CJK>
+0x96CD 0x6A21 # <CJK>
+0x96CE 0x8302 # <CJK>
+0x96CF 0x5984 # <CJK>
+0x96D0 0x5B5F # <CJK>
+0x96D1 0x6BDB # <CJK>
+0x96D2 0x731B # <CJK>
+0x96D3 0x76F2 # <CJK>
+0x96D4 0x7DB2 # <CJK>
+0x96D5 0x8017 # <CJK>
+0x96D6 0x8499 # <CJK>
+0x96D7 0x5132 # <CJK>
+0x96D8 0x6728 # <CJK>
+0x96D9 0x9ED9 # <CJK>
+0x96DA 0x76EE # <CJK>
+0x96DB 0x6762 # <CJK>
+0x96DC 0x52FF # <CJK>
+0x96DD 0x9905 # <CJK>
+0x96DE 0x5C24 # <CJK>
+0x96DF 0x623B # <CJK>
+0x96E0 0x7C7E # <CJK>
+0x96E1 0x8CB0 # <CJK>
+0x96E2 0x554F # <CJK>
+0x96E3 0x60B6 # <CJK>
+0x96E4 0x7D0B # <CJK>
+0x96E5 0x9580 # <CJK>
+0x96E6 0x5301 # <CJK>
+0x96E7 0x4E5F # <CJK>
+0x96E8 0x51B6 # <CJK>
+0x96E9 0x591C # <CJK>
+0x96EA 0x723A # <CJK>
+0x96EB 0x8036 # <CJK>
+0x96EC 0x91CE # <CJK>
+0x96ED 0x5F25 # <CJK>
+0x96EE 0x77E2 # <CJK>
+0x96EF 0x5384 # <CJK>
+0x96F0 0x5F79 # <CJK>
+0x96F1 0x7D04 # <CJK>
+0x96F2 0x85AC # <CJK>
+0x96F3 0x8A33 # <CJK>
+0x96F4 0x8E8D # <CJK>
+0x96F5 0x9756 # <CJK>
+0x96F6 0x67F3 # <CJK>
+0x96F7 0x85AE # <CJK>
+0x96F8 0x9453 # <CJK>
+0x96F9 0x6109 # <CJK>
+0x96FA 0x6108 # <CJK>
+0x96FB 0x6CB9 # <CJK>
+0x96FC 0x7652 # <CJK>
+0x9740 0x8AED # <CJK>
+0x9741 0x8F38 # <CJK>
+0x9742 0x552F # <CJK>
+0x9743 0x4F51 # <CJK>
+0x9744 0x512A # <CJK>
+0x9745 0x52C7 # <CJK>
+0x9746 0x53CB # <CJK>
+0x9747 0x5BA5 # <CJK>
+0x9748 0x5E7D # <CJK>
+0x9749 0x60A0 # <CJK>
+0x974A 0x6182 # <CJK>
+0x974B 0x63D6 # <CJK>
+0x974C 0x6709 # <CJK>
+0x974D 0x67DA # <CJK>
+0x974E 0x6E67 # <CJK>
+0x974F 0x6D8C # <CJK>
+0x9750 0x7336 # <CJK>
+0x9751 0x7337 # <CJK>
+0x9752 0x7531 # <CJK>
+0x9753 0x7950 # <CJK>
+0x9754 0x88D5 # <CJK>
+0x9755 0x8A98 # <CJK>
+0x9756 0x904A # <CJK>
+0x9757 0x9091 # <CJK>
+0x9758 0x90F5 # <CJK>
+0x9759 0x96C4 # <CJK>
+0x975A 0x878D # <CJK>
+0x975B 0x5915 # <CJK>
+0x975C 0x4E88 # <CJK>
+0x975D 0x4F59 # <CJK>
+0x975E 0x4E0E # <CJK>
+0x975F 0x8A89 # <CJK>
+0x9760 0x8F3F # <CJK>
+0x9761 0x9810 # <CJK>
+0x9762 0x50AD # <CJK>
+0x9763 0x5E7C # <CJK>
+0x9764 0x5996 # <CJK>
+0x9765 0x5BB9 # <CJK>
+0x9766 0x5EB8 # <CJK>
+0x9767 0x63DA # <CJK>
+0x9768 0x63FA # <CJK>
+0x9769 0x64C1 # <CJK>
+0x976A 0x66DC # <CJK>
+0x976B 0x694A # <CJK>
+0x976C 0x69D8 # <CJK>
+0x976D 0x6D0B # <CJK>
+0x976E 0x6EB6 # <CJK>
+0x976F 0x7194 # <CJK>
+0x9770 0x7528 # <CJK>
+0x9771 0x7AAF # <CJK>
+0x9772 0x7F8A # <CJK>
+0x9773 0x8000 # <CJK>
+0x9774 0x8449 # <CJK>
+0x9775 0x84C9 # <CJK>
+0x9776 0x8981 # <CJK>
+0x9777 0x8B21 # <CJK>
+0x9778 0x8E0A # <CJK>
+0x9779 0x9065 # <CJK>
+0x977A 0x967D # <CJK>
+0x977B 0x990A # <CJK>
+0x977C 0x617E # <CJK>
+0x977D 0x6291 # <CJK>
+0x977E 0x6B32 # <CJK>
+0x9780 0x6C83 # <CJK>
+0x9781 0x6D74 # <CJK>
+0x9782 0x7FCC # <CJK>
+0x9783 0x7FFC # <CJK>
+0x9784 0x6DC0 # <CJK>
+0x9785 0x7F85 # <CJK>
+0x9786 0x87BA # <CJK>
+0x9787 0x88F8 # <CJK>
+0x9788 0x6765 # <CJK>
+0x9789 0x83B1 # <CJK>
+0x978A 0x983C # <CJK>
+0x978B 0x96F7 # <CJK>
+0x978C 0x6D1B # <CJK>
+0x978D 0x7D61 # <CJK>
+0x978E 0x843D # <CJK>
+0x978F 0x916A # <CJK>
+0x9790 0x4E71 # <CJK>
+0x9791 0x5375 # <CJK>
+0x9792 0x5D50 # <CJK>
+0x9793 0x6B04 # <CJK>
+0x9794 0x6FEB # <CJK>
+0x9795 0x85CD # <CJK>
+0x9796 0x862D # <CJK>
+0x9797 0x89A7 # <CJK>
+0x9798 0x5229 # <CJK>
+0x9799 0x540F # <CJK>
+0x979A 0x5C65 # <CJK>
+0x979B 0x674E # <CJK>
+0x979C 0x68A8 # <CJK>
+0x979D 0x7406 # <CJK>
+0x979E 0x7483 # <CJK>
+0x979F 0x75E2 # <CJK>
+0x97A0 0x88CF # <CJK>
+0x97A1 0x88E1 # <CJK>
+0x97A2 0x91CC # <CJK>
+0x97A3 0x96E2 # <CJK>
+0x97A4 0x9678 # <CJK>
+0x97A5 0x5F8B # <CJK>
+0x97A6 0x7387 # <CJK>
+0x97A7 0x7ACB # <CJK>
+0x97A8 0x844E # <CJK>
+0x97A9 0x63A0 # <CJK>
+0x97AA 0x7565 # <CJK>
+0x97AB 0x5289 # <CJK>
+0x97AC 0x6D41 # <CJK>
+0x97AD 0x6E9C # <CJK>
+0x97AE 0x7409 # <CJK>
+0x97AF 0x7559 # <CJK>
+0x97B0 0x786B # <CJK>
+0x97B1 0x7C92 # <CJK>
+0x97B2 0x9686 # <CJK>
+0x97B3 0x7ADC # <CJK>
+0x97B4 0x9F8D # <CJK>
+0x97B5 0x4FB6 # <CJK>
+0x97B6 0x616E # <CJK>
+0x97B7 0x65C5 # <CJK>
+0x97B8 0x865C # <CJK>
+0x97B9 0x4E86 # <CJK>
+0x97BA 0x4EAE # <CJK>
+0x97BB 0x50DA # <CJK>
+0x97BC 0x4E21 # <CJK>
+0x97BD 0x51CC # <CJK>
+0x97BE 0x5BEE # <CJK>
+0x97BF 0x6599 # <CJK>
+0x97C0 0x6881 # <CJK>
+0x97C1 0x6DBC # <CJK>
+0x97C2 0x731F # <CJK>
+0x97C3 0x7642 # <CJK>
+0x97C4 0x77AD # <CJK>
+0x97C5 0x7A1C # <CJK>
+0x97C6 0x7CE7 # <CJK>
+0x97C7 0x826F # <CJK>
+0x97C8 0x8AD2 # <CJK>
+0x97C9 0x907C # <CJK>
+0x97CA 0x91CF # <CJK>
+0x97CB 0x9675 # <CJK>
+0x97CC 0x9818 # <CJK>
+0x97CD 0x529B # <CJK>
+0x97CE 0x7DD1 # <CJK>
+0x97CF 0x502B # <CJK>
+0x97D0 0x5398 # <CJK>
+0x97D1 0x6797 # <CJK>
+0x97D2 0x6DCB # <CJK>
+0x97D3 0x71D0 # <CJK>
+0x97D4 0x7433 # <CJK>
+0x97D5 0x81E8 # <CJK>
+0x97D6 0x8F2A # <CJK>
+0x97D7 0x96A3 # <CJK>
+0x97D8 0x9C57 # <CJK>
+0x97D9 0x9E9F # <CJK>
+0x97DA 0x7460 # <CJK>
+0x97DB 0x5841 # <CJK>
+0x97DC 0x6D99 # <CJK>
+0x97DD 0x7D2F # <CJK>
+0x97DE 0x985E # <CJK>
+0x97DF 0x4EE4 # <CJK>
+0x97E0 0x4F36 # <CJK>
+0x97E1 0x4F8B # <CJK>
+0x97E2 0x51B7 # <CJK>
+0x97E3 0x52B1 # <CJK>
+0x97E4 0x5DBA # <CJK>
+0x97E5 0x601C # <CJK>
+0x97E6 0x73B2 # <CJK>
+0x97E7 0x793C # <CJK>
+0x97E8 0x82D3 # <CJK>
+0x97E9 0x9234 # <CJK>
+0x97EA 0x96B7 # <CJK>
+0x97EB 0x96F6 # <CJK>
+0x97EC 0x970A # <CJK>
+0x97ED 0x9E97 # <CJK>
+0x97EE 0x9F62 # <CJK>
+0x97EF 0x66A6 # <CJK>
+0x97F0 0x6B74 # <CJK>
+0x97F1 0x5217 # <CJK>
+0x97F2 0x52A3 # <CJK>
+0x97F3 0x70C8 # <CJK>
+0x97F4 0x88C2 # <CJK>
+0x97F5 0x5EC9 # <CJK>
+0x97F6 0x604B # <CJK>
+0x97F7 0x6190 # <CJK>
+0x97F8 0x6F23 # <CJK>
+0x97F9 0x7149 # <CJK>
+0x97FA 0x7C3E # <CJK>
+0x97FB 0x7DF4 # <CJK>
+0x97FC 0x806F # <CJK>
+0x9840 0x84EE # <CJK>
+0x9841 0x9023 # <CJK>
+0x9842 0x932C # <CJK>
+0x9843 0x5442 # <CJK>
+0x9844 0x9B6F # <CJK>
+0x9845 0x6AD3 # <CJK>
+0x9846 0x7089 # <CJK>
+0x9847 0x8CC2 # <CJK>
+0x9848 0x8DEF # <CJK>
+0x9849 0x9732 # <CJK>
+0x984A 0x52B4 # <CJK>
+0x984B 0x5A41 # <CJK>
+0x984C 0x5ECA # <CJK>
+0x984D 0x5F04 # <CJK>
+0x984E 0x6717 # <CJK>
+0x984F 0x697C # <CJK>
+0x9850 0x6994 # <CJK>
+0x9851 0x6D6A # <CJK>
+0x9852 0x6F0F # <CJK>
+0x9853 0x7262 # <CJK>
+0x9854 0x72FC # <CJK>
+0x9855 0x7BED # <CJK>
+0x9856 0x8001 # <CJK>
+0x9857 0x807E # <CJK>
+0x9858 0x874B # <CJK>
+0x9859 0x90CE # <CJK>
+0x985A 0x516D # <CJK>
+0x985B 0x9E93 # <CJK>
+0x985C 0x7984 # <CJK>
+0x985D 0x808B # <CJK>
+0x985E 0x9332 # <CJK>
+0x985F 0x8AD6 # <CJK>
+0x9860 0x502D # <CJK>
+0x9861 0x548C # <CJK>
+0x9862 0x8A71 # <CJK>
+0x9863 0x6B6A # <CJK>
+0x9864 0x8CC4 # <CJK>
+0x9865 0x8107 # <CJK>
+0x9866 0x60D1 # <CJK>
+0x9867 0x67A0 # <CJK>
+0x9868 0x9DF2 # <CJK>
+0x9869 0x4E99 # <CJK>
+0x986A 0x4E98 # <CJK>
+0x986B 0x9C10 # <CJK>
+0x986C 0x8A6B # <CJK>
+0x986D 0x85C1 # <CJK>
+0x986E 0x8568 # <CJK>
+0x986F 0x6900 # <CJK>
+0x9870 0x6E7E # <CJK>
+0x9871 0x7897 # <CJK>
+0x9872 0x8155 # <CJK>
+0x989F 0x5F0C # <CJK>
+0x98A0 0x4E10 # <CJK>
+0x98A1 0x4E15 # <CJK>
+0x98A2 0x4E2A # <CJK>
+0x98A3 0x4E31 # <CJK>
+0x98A4 0x4E36 # <CJK>
+0x98A5 0x4E3C # <CJK>
+0x98A6 0x4E3F # <CJK>
+0x98A7 0x4E42 # <CJK>
+0x98A8 0x4E56 # <CJK>
+0x98A9 0x4E58 # <CJK>
+0x98AA 0x4E82 # <CJK>
+0x98AB 0x4E85 # <CJK>
+0x98AC 0x8C6B # <CJK>
+0x98AD 0x4E8A # <CJK>
+0x98AE 0x8212 # <CJK>
+0x98AF 0x5F0D # <CJK>
+0x98B0 0x4E8E # <CJK>
+0x98B1 0x4E9E # <CJK>
+0x98B2 0x4E9F # <CJK>
+0x98B3 0x4EA0 # <CJK>
+0x98B4 0x4EA2 # <CJK>
+0x98B5 0x4EB0 # <CJK>
+0x98B6 0x4EB3 # <CJK>
+0x98B7 0x4EB6 # <CJK>
+0x98B8 0x4ECE # <CJK>
+0x98B9 0x4ECD # <CJK>
+0x98BA 0x4EC4 # <CJK>
+0x98BB 0x4EC6 # <CJK>
+0x98BC 0x4EC2 # <CJK>
+0x98BD 0x4ED7 # <CJK>
+0x98BE 0x4EDE # <CJK>
+0x98BF 0x4EED # <CJK>
+0x98C0 0x4EDF # <CJK>
+0x98C1 0x4EF7 # <CJK>
+0x98C2 0x4F09 # <CJK>
+0x98C3 0x4F5A # <CJK>
+0x98C4 0x4F30 # <CJK>
+0x98C5 0x4F5B # <CJK>
+0x98C6 0x4F5D # <CJK>
+0x98C7 0x4F57 # <CJK>
+0x98C8 0x4F47 # <CJK>
+0x98C9 0x4F76 # <CJK>
+0x98CA 0x4F88 # <CJK>
+0x98CB 0x4F8F # <CJK>
+0x98CC 0x4F98 # <CJK>
+0x98CD 0x4F7B # <CJK>
+0x98CE 0x4F69 # <CJK>
+0x98CF 0x4F70 # <CJK>
+0x98D0 0x4F91 # <CJK>
+0x98D1 0x4F6F # <CJK>
+0x98D2 0x4F86 # <CJK>
+0x98D3 0x4F96 # <CJK>
+0x98D4 0x5118 # <CJK>
+0x98D5 0x4FD4 # <CJK>
+0x98D6 0x4FDF # <CJK>
+0x98D7 0x4FCE # <CJK>
+0x98D8 0x4FD8 # <CJK>
+0x98D9 0x4FDB # <CJK>
+0x98DA 0x4FD1 # <CJK>
+0x98DB 0x4FDA # <CJK>
+0x98DC 0x4FD0 # <CJK>
+0x98DD 0x4FE4 # <CJK>
+0x98DE 0x4FE5 # <CJK>
+0x98DF 0x501A # <CJK>
+0x98E0 0x5028 # <CJK>
+0x98E1 0x5014 # <CJK>
+0x98E2 0x502A # <CJK>
+0x98E3 0x5025 # <CJK>
+0x98E4 0x5005 # <CJK>
+0x98E5 0x4F1C # <CJK>
+0x98E6 0x4FF6 # <CJK>
+0x98E7 0x5021 # <CJK>
+0x98E8 0x5029 # <CJK>
+0x98E9 0x502C # <CJK>
+0x98EA 0x4FFE # <CJK>
+0x98EB 0x4FEF # <CJK>
+0x98EC 0x5011 # <CJK>
+0x98ED 0x5006 # <CJK>
+0x98EE 0x5043 # <CJK>
+0x98EF 0x5047 # <CJK>
+0x98F0 0x6703 # <CJK>
+0x98F1 0x5055 # <CJK>
+0x98F2 0x5050 # <CJK>
+0x98F3 0x5048 # <CJK>
+0x98F4 0x505A # <CJK>
+0x98F5 0x5056 # <CJK>
+0x98F6 0x506C # <CJK>
+0x98F7 0x5078 # <CJK>
+0x98F8 0x5080 # <CJK>
+0x98F9 0x509A # <CJK>
+0x98FA 0x5085 # <CJK>
+0x98FB 0x50B4 # <CJK>
+0x98FC 0x50B2 # <CJK>
+0x9940 0x50C9 # <CJK>
+0x9941 0x50CA # <CJK>
+0x9942 0x50B3 # <CJK>
+0x9943 0x50C2 # <CJK>
+0x9944 0x50D6 # <CJK>
+0x9945 0x50DE # <CJK>
+0x9946 0x50E5 # <CJK>
+0x9947 0x50ED # <CJK>
+0x9948 0x50E3 # <CJK>
+0x9949 0x50EE # <CJK>
+0x994A 0x50F9 # <CJK>
+0x994B 0x50F5 # <CJK>
+0x994C 0x5109 # <CJK>
+0x994D 0x5101 # <CJK>
+0x994E 0x5102 # <CJK>
+0x994F 0x5116 # <CJK>
+0x9950 0x5115 # <CJK>
+0x9951 0x5114 # <CJK>
+0x9952 0x511A # <CJK>
+0x9953 0x5121 # <CJK>
+0x9954 0x513A # <CJK>
+0x9955 0x5137 # <CJK>
+0x9956 0x513C # <CJK>
+0x9957 0x513B # <CJK>
+0x9958 0x513F # <CJK>
+0x9959 0x5140 # <CJK>
+0x995A 0x5152 # <CJK>
+0x995B 0x514C # <CJK>
+0x995C 0x5154 # <CJK>
+0x995D 0x5162 # <CJK>
+0x995E 0x7AF8 # <CJK>
+0x995F 0x5169 # <CJK>
+0x9960 0x516A # <CJK>
+0x9961 0x516E # <CJK>
+0x9962 0x5180 # <CJK>
+0x9963 0x5182 # <CJK>
+0x9964 0x56D8 # <CJK>
+0x9965 0x518C # <CJK>
+0x9966 0x5189 # <CJK>
+0x9967 0x518F # <CJK>
+0x9968 0x5191 # <CJK>
+0x9969 0x5193 # <CJK>
+0x996A 0x5195 # <CJK>
+0x996B 0x5196 # <CJK>
+0x996C 0x51A4 # <CJK>
+0x996D 0x51A6 # <CJK>
+0x996E 0x51A2 # <CJK>
+0x996F 0x51A9 # <CJK>
+0x9970 0x51AA # <CJK>
+0x9971 0x51AB # <CJK>
+0x9972 0x51B3 # <CJK>
+0x9973 0x51B1 # <CJK>
+0x9974 0x51B2 # <CJK>
+0x9975 0x51B0 # <CJK>
+0x9976 0x51B5 # <CJK>
+0x9977 0x51BD # <CJK>
+0x9978 0x51C5 # <CJK>
+0x9979 0x51C9 # <CJK>
+0x997A 0x51DB # <CJK>
+0x997B 0x51E0 # <CJK>
+0x997C 0x8655 # <CJK>
+0x997D 0x51E9 # <CJK>
+0x997E 0x51ED # <CJK>
+0x9980 0x51F0 # <CJK>
+0x9981 0x51F5 # <CJK>
+0x9982 0x51FE # <CJK>
+0x9983 0x5204 # <CJK>
+0x9984 0x520B # <CJK>
+0x9985 0x5214 # <CJK>
+0x9986 0x520E # <CJK>
+0x9987 0x5227 # <CJK>
+0x9988 0x522A # <CJK>
+0x9989 0x522E # <CJK>
+0x998A 0x5233 # <CJK>
+0x998B 0x5239 # <CJK>
+0x998C 0x524F # <CJK>
+0x998D 0x5244 # <CJK>
+0x998E 0x524B # <CJK>
+0x998F 0x524C # <CJK>
+0x9990 0x525E # <CJK>
+0x9991 0x5254 # <CJK>
+0x9992 0x526A # <CJK>
+0x9993 0x5274 # <CJK>
+0x9994 0x5269 # <CJK>
+0x9995 0x5273 # <CJK>
+0x9996 0x527F # <CJK>
+0x9997 0x527D # <CJK>
+0x9998 0x528D # <CJK>
+0x9999 0x5294 # <CJK>
+0x999A 0x5292 # <CJK>
+0x999B 0x5271 # <CJK>
+0x999C 0x5288 # <CJK>
+0x999D 0x5291 # <CJK>
+0x999E 0x8FA8 # <CJK>
+0x999F 0x8FA7 # <CJK>
+0x99A0 0x52AC # <CJK>
+0x99A1 0x52AD # <CJK>
+0x99A2 0x52BC # <CJK>
+0x99A3 0x52B5 # <CJK>
+0x99A4 0x52C1 # <CJK>
+0x99A5 0x52CD # <CJK>
+0x99A6 0x52D7 # <CJK>
+0x99A7 0x52DE # <CJK>
+0x99A8 0x52E3 # <CJK>
+0x99A9 0x52E6 # <CJK>
+0x99AA 0x98ED # <CJK>
+0x99AB 0x52E0 # <CJK>
+0x99AC 0x52F3 # <CJK>
+0x99AD 0x52F5 # <CJK>
+0x99AE 0x52F8 # <CJK>
+0x99AF 0x52F9 # <CJK>
+0x99B0 0x5306 # <CJK>
+0x99B1 0x5308 # <CJK>
+0x99B2 0x7538 # <CJK>
+0x99B3 0x530D # <CJK>
+0x99B4 0x5310 # <CJK>
+0x99B5 0x530F # <CJK>
+0x99B6 0x5315 # <CJK>
+0x99B7 0x531A # <CJK>
+0x99B8 0x5323 # <CJK>
+0x99B9 0x532F # <CJK>
+0x99BA 0x5331 # <CJK>
+0x99BB 0x5333 # <CJK>
+0x99BC 0x5338 # <CJK>
+0x99BD 0x5340 # <CJK>
+0x99BE 0x5346 # <CJK>
+0x99BF 0x5345 # <CJK>
+0x99C0 0x4E17 # <CJK>
+0x99C1 0x5349 # <CJK>
+0x99C2 0x534D # <CJK>
+0x99C3 0x51D6 # <CJK>
+0x99C4 0x535E # <CJK>
+0x99C5 0x5369 # <CJK>
+0x99C6 0x536E # <CJK>
+0x99C7 0x5918 # <CJK>
+0x99C8 0x537B # <CJK>
+0x99C9 0x5377 # <CJK>
+0x99CA 0x5382 # <CJK>
+0x99CB 0x5396 # <CJK>
+0x99CC 0x53A0 # <CJK>
+0x99CD 0x53A6 # <CJK>
+0x99CE 0x53A5 # <CJK>
+0x99CF 0x53AE # <CJK>
+0x99D0 0x53B0 # <CJK>
+0x99D1 0x53B6 # <CJK>
+0x99D2 0x53C3 # <CJK>
+0x99D3 0x7C12 # <CJK>
+0x99D4 0x96D9 # <CJK>
+0x99D5 0x53DF # <CJK>
+0x99D6 0x66FC # <CJK>
+0x99D7 0x71EE # <CJK>
+0x99D8 0x53EE # <CJK>
+0x99D9 0x53E8 # <CJK>
+0x99DA 0x53ED # <CJK>
+0x99DB 0x53FA # <CJK>
+0x99DC 0x5401 # <CJK>
+0x99DD 0x543D # <CJK>
+0x99DE 0x5440 # <CJK>
+0x99DF 0x542C # <CJK>
+0x99E0 0x542D # <CJK>
+0x99E1 0x543C # <CJK>
+0x99E2 0x542E # <CJK>
+0x99E3 0x5436 # <CJK>
+0x99E4 0x5429 # <CJK>
+0x99E5 0x541D # <CJK>
+0x99E6 0x544E # <CJK>
+0x99E7 0x548F # <CJK>
+0x99E8 0x5475 # <CJK>
+0x99E9 0x548E # <CJK>
+0x99EA 0x545F # <CJK>
+0x99EB 0x5471 # <CJK>
+0x99EC 0x5477 # <CJK>
+0x99ED 0x5470 # <CJK>
+0x99EE 0x5492 # <CJK>
+0x99EF 0x547B # <CJK>
+0x99F0 0x5480 # <CJK>
+0x99F1 0x5476 # <CJK>
+0x99F2 0x5484 # <CJK>
+0x99F3 0x5490 # <CJK>
+0x99F4 0x5486 # <CJK>
+0x99F5 0x54C7 # <CJK>
+0x99F6 0x54A2 # <CJK>
+0x99F7 0x54B8 # <CJK>
+0x99F8 0x54A5 # <CJK>
+0x99F9 0x54AC # <CJK>
+0x99FA 0x54C4 # <CJK>
+0x99FB 0x54C8 # <CJK>
+0x99FC 0x54A8 # <CJK>
+0x9A40 0x54AB # <CJK>
+0x9A41 0x54C2 # <CJK>
+0x9A42 0x54A4 # <CJK>
+0x9A43 0x54BE # <CJK>
+0x9A44 0x54BC # <CJK>
+0x9A45 0x54D8 # <CJK>
+0x9A46 0x54E5 # <CJK>
+0x9A47 0x54E6 # <CJK>
+0x9A48 0x550F # <CJK>
+0x9A49 0x5514 # <CJK>
+0x9A4A 0x54FD # <CJK>
+0x9A4B 0x54EE # <CJK>
+0x9A4C 0x54ED # <CJK>
+0x9A4D 0x54FA # <CJK>
+0x9A4E 0x54E2 # <CJK>
+0x9A4F 0x5539 # <CJK>
+0x9A50 0x5540 # <CJK>
+0x9A51 0x5563 # <CJK>
+0x9A52 0x554C # <CJK>
+0x9A53 0x552E # <CJK>
+0x9A54 0x555C # <CJK>
+0x9A55 0x5545 # <CJK>
+0x9A56 0x5556 # <CJK>
+0x9A57 0x5557 # <CJK>
+0x9A58 0x5538 # <CJK>
+0x9A59 0x5533 # <CJK>
+0x9A5A 0x555D # <CJK>
+0x9A5B 0x5599 # <CJK>
+0x9A5C 0x5580 # <CJK>
+0x9A5D 0x54AF # <CJK>
+0x9A5E 0x558A # <CJK>
+0x9A5F 0x559F # <CJK>
+0x9A60 0x557B # <CJK>
+0x9A61 0x557E # <CJK>
+0x9A62 0x5598 # <CJK>
+0x9A63 0x559E # <CJK>
+0x9A64 0x55AE # <CJK>
+0x9A65 0x557C # <CJK>
+0x9A66 0x5583 # <CJK>
+0x9A67 0x55A9 # <CJK>
+0x9A68 0x5587 # <CJK>
+0x9A69 0x55A8 # <CJK>
+0x9A6A 0x55DA # <CJK>
+0x9A6B 0x55C5 # <CJK>
+0x9A6C 0x55DF # <CJK>
+0x9A6D 0x55C4 # <CJK>
+0x9A6E 0x55DC # <CJK>
+0x9A6F 0x55E4 # <CJK>
+0x9A70 0x55D4 # <CJK>
+0x9A71 0x5614 # <CJK>
+0x9A72 0x55F7 # <CJK>
+0x9A73 0x5616 # <CJK>
+0x9A74 0x55FE # <CJK>
+0x9A75 0x55FD # <CJK>
+0x9A76 0x561B # <CJK>
+0x9A77 0x55F9 # <CJK>
+0x9A78 0x564E # <CJK>
+0x9A79 0x5650 # <CJK>
+0x9A7A 0x71DF # <CJK>
+0x9A7B 0x5634 # <CJK>
+0x9A7C 0x5636 # <CJK>
+0x9A7D 0x5632 # <CJK>
+0x9A7E 0x5638 # <CJK>
+0x9A80 0x566B # <CJK>
+0x9A81 0x5664 # <CJK>
+0x9A82 0x562F # <CJK>
+0x9A83 0x566C # <CJK>
+0x9A84 0x566A # <CJK>
+0x9A85 0x5686 # <CJK>
+0x9A86 0x5680 # <CJK>
+0x9A87 0x568A # <CJK>
+0x9A88 0x56A0 # <CJK>
+0x9A89 0x5694 # <CJK>
+0x9A8A 0x568F # <CJK>
+0x9A8B 0x56A5 # <CJK>
+0x9A8C 0x56AE # <CJK>
+0x9A8D 0x56B6 # <CJK>
+0x9A8E 0x56B4 # <CJK>
+0x9A8F 0x56C2 # <CJK>
+0x9A90 0x56BC # <CJK>
+0x9A91 0x56C1 # <CJK>
+0x9A92 0x56C3 # <CJK>
+0x9A93 0x56C0 # <CJK>
+0x9A94 0x56C8 # <CJK>
+0x9A95 0x56CE # <CJK>
+0x9A96 0x56D1 # <CJK>
+0x9A97 0x56D3 # <CJK>
+0x9A98 0x56D7 # <CJK>
+0x9A99 0x56EE # <CJK>
+0x9A9A 0x56F9 # <CJK>
+0x9A9B 0x5700 # <CJK>
+0x9A9C 0x56FF # <CJK>
+0x9A9D 0x5704 # <CJK>
+0x9A9E 0x5709 # <CJK>
+0x9A9F 0x5708 # <CJK>
+0x9AA0 0x570B # <CJK>
+0x9AA1 0x570D # <CJK>
+0x9AA2 0x5713 # <CJK>
+0x9AA3 0x5718 # <CJK>
+0x9AA4 0x5716 # <CJK>
+0x9AA5 0x55C7 # <CJK>
+0x9AA6 0x571C # <CJK>
+0x9AA7 0x5726 # <CJK>
+0x9AA8 0x5737 # <CJK>
+0x9AA9 0x5738 # <CJK>
+0x9AAA 0x574E # <CJK>
+0x9AAB 0x573B # <CJK>
+0x9AAC 0x5740 # <CJK>
+0x9AAD 0x574F # <CJK>
+0x9AAE 0x5769 # <CJK>
+0x9AAF 0x57C0 # <CJK>
+0x9AB0 0x5788 # <CJK>
+0x9AB1 0x5761 # <CJK>
+0x9AB2 0x577F # <CJK>
+0x9AB3 0x5789 # <CJK>
+0x9AB4 0x5793 # <CJK>
+0x9AB5 0x57A0 # <CJK>
+0x9AB6 0x57B3 # <CJK>
+0x9AB7 0x57A4 # <CJK>
+0x9AB8 0x57AA # <CJK>
+0x9AB9 0x57B0 # <CJK>
+0x9ABA 0x57C3 # <CJK>
+0x9ABB 0x57C6 # <CJK>
+0x9ABC 0x57D4 # <CJK>
+0x9ABD 0x57D2 # <CJK>
+0x9ABE 0x57D3 # <CJK>
+0x9ABF 0x580A # <CJK>
+0x9AC0 0x57D6 # <CJK>
+0x9AC1 0x57E3 # <CJK>
+0x9AC2 0x580B # <CJK>
+0x9AC3 0x5819 # <CJK>
+0x9AC4 0x581D # <CJK>
+0x9AC5 0x5872 # <CJK>
+0x9AC6 0x5821 # <CJK>
+0x9AC7 0x5862 # <CJK>
+0x9AC8 0x584B # <CJK>
+0x9AC9 0x5870 # <CJK>
+0x9ACA 0x6BC0 # <CJK>
+0x9ACB 0x5852 # <CJK>
+0x9ACC 0x583D # <CJK>
+0x9ACD 0x5879 # <CJK>
+0x9ACE 0x5885 # <CJK>
+0x9ACF 0x58B9 # <CJK>
+0x9AD0 0x589F # <CJK>
+0x9AD1 0x58AB # <CJK>
+0x9AD2 0x58BA # <CJK>
+0x9AD3 0x58DE # <CJK>
+0x9AD4 0x58BB # <CJK>
+0x9AD5 0x58B8 # <CJK>
+0x9AD6 0x58AE # <CJK>
+0x9AD7 0x58C5 # <CJK>
+0x9AD8 0x58D3 # <CJK>
+0x9AD9 0x58D1 # <CJK>
+0x9ADA 0x58D7 # <CJK>
+0x9ADB 0x58D9 # <CJK>
+0x9ADC 0x58D8 # <CJK>
+0x9ADD 0x58E5 # <CJK>
+0x9ADE 0x58DC # <CJK>
+0x9ADF 0x58E4 # <CJK>
+0x9AE0 0x58DF # <CJK>
+0x9AE1 0x58EF # <CJK>
+0x9AE2 0x58FA # <CJK>
+0x9AE3 0x58F9 # <CJK>
+0x9AE4 0x58FB # <CJK>
+0x9AE5 0x58FC # <CJK>
+0x9AE6 0x58FD # <CJK>
+0x9AE7 0x5902 # <CJK>
+0x9AE8 0x590A # <CJK>
+0x9AE9 0x5910 # <CJK>
+0x9AEA 0x591B # <CJK>
+0x9AEB 0x68A6 # <CJK>
+0x9AEC 0x5925 # <CJK>
+0x9AED 0x592C # <CJK>
+0x9AEE 0x592D # <CJK>
+0x9AEF 0x5932 # <CJK>
+0x9AF0 0x5938 # <CJK>
+0x9AF1 0x593E # <CJK>
+0x9AF2 0x7AD2 # <CJK>
+0x9AF3 0x5955 # <CJK>
+0x9AF4 0x5950 # <CJK>
+0x9AF5 0x594E # <CJK>
+0x9AF6 0x595A # <CJK>
+0x9AF7 0x5958 # <CJK>
+0x9AF8 0x5962 # <CJK>
+0x9AF9 0x5960 # <CJK>
+0x9AFA 0x5967 # <CJK>
+0x9AFB 0x596C # <CJK>
+0x9AFC 0x5969 # <CJK>
+0x9B40 0x5978 # <CJK>
+0x9B41 0x5981 # <CJK>
+0x9B42 0x599D # <CJK>
+0x9B43 0x4F5E # <CJK>
+0x9B44 0x4FAB # <CJK>
+0x9B45 0x59A3 # <CJK>
+0x9B46 0x59B2 # <CJK>
+0x9B47 0x59C6 # <CJK>
+0x9B48 0x59E8 # <CJK>
+0x9B49 0x59DC # <CJK>
+0x9B4A 0x598D # <CJK>
+0x9B4B 0x59D9 # <CJK>
+0x9B4C 0x59DA # <CJK>
+0x9B4D 0x5A25 # <CJK>
+0x9B4E 0x5A1F # <CJK>
+0x9B4F 0x5A11 # <CJK>
+0x9B50 0x5A1C # <CJK>
+0x9B51 0x5A09 # <CJK>
+0x9B52 0x5A1A # <CJK>
+0x9B53 0x5A40 # <CJK>
+0x9B54 0x5A6C # <CJK>
+0x9B55 0x5A49 # <CJK>
+0x9B56 0x5A35 # <CJK>
+0x9B57 0x5A36 # <CJK>
+0x9B58 0x5A62 # <CJK>
+0x9B59 0x5A6A # <CJK>
+0x9B5A 0x5A9A # <CJK>
+0x9B5B 0x5ABC # <CJK>
+0x9B5C 0x5ABE # <CJK>
+0x9B5D 0x5ACB # <CJK>
+0x9B5E 0x5AC2 # <CJK>
+0x9B5F 0x5ABD # <CJK>
+0x9B60 0x5AE3 # <CJK>
+0x9B61 0x5AD7 # <CJK>
+0x9B62 0x5AE6 # <CJK>
+0x9B63 0x5AE9 # <CJK>
+0x9B64 0x5AD6 # <CJK>
+0x9B65 0x5AFA # <CJK>
+0x9B66 0x5AFB # <CJK>
+0x9B67 0x5B0C # <CJK>
+0x9B68 0x5B0B # <CJK>
+0x9B69 0x5B16 # <CJK>
+0x9B6A 0x5B32 # <CJK>
+0x9B6B 0x5AD0 # <CJK>
+0x9B6C 0x5B2A # <CJK>
+0x9B6D 0x5B36 # <CJK>
+0x9B6E 0x5B3E # <CJK>
+0x9B6F 0x5B43 # <CJK>
+0x9B70 0x5B45 # <CJK>
+0x9B71 0x5B40 # <CJK>
+0x9B72 0x5B51 # <CJK>
+0x9B73 0x5B55 # <CJK>
+0x9B74 0x5B5A # <CJK>
+0x9B75 0x5B5B # <CJK>
+0x9B76 0x5B65 # <CJK>
+0x9B77 0x5B69 # <CJK>
+0x9B78 0x5B70 # <CJK>
+0x9B79 0x5B73 # <CJK>
+0x9B7A 0x5B75 # <CJK>
+0x9B7B 0x5B78 # <CJK>
+0x9B7C 0x6588 # <CJK>
+0x9B7D 0x5B7A # <CJK>
+0x9B7E 0x5B80 # <CJK>
+0x9B80 0x5B83 # <CJK>
+0x9B81 0x5BA6 # <CJK>
+0x9B82 0x5BB8 # <CJK>
+0x9B83 0x5BC3 # <CJK>
+0x9B84 0x5BC7 # <CJK>
+0x9B85 0x5BC9 # <CJK>
+0x9B86 0x5BD4 # <CJK>
+0x9B87 0x5BD0 # <CJK>
+0x9B88 0x5BE4 # <CJK>
+0x9B89 0x5BE6 # <CJK>
+0x9B8A 0x5BE2 # <CJK>
+0x9B8B 0x5BDE # <CJK>
+0x9B8C 0x5BE5 # <CJK>
+0x9B8D 0x5BEB # <CJK>
+0x9B8E 0x5BF0 # <CJK>
+0x9B8F 0x5BF6 # <CJK>
+0x9B90 0x5BF3 # <CJK>
+0x9B91 0x5C05 # <CJK>
+0x9B92 0x5C07 # <CJK>
+0x9B93 0x5C08 # <CJK>
+0x9B94 0x5C0D # <CJK>
+0x9B95 0x5C13 # <CJK>
+0x9B96 0x5C20 # <CJK>
+0x9B97 0x5C22 # <CJK>
+0x9B98 0x5C28 # <CJK>
+0x9B99 0x5C38 # <CJK>
+0x9B9A 0x5C39 # <CJK>
+0x9B9B 0x5C41 # <CJK>
+0x9B9C 0x5C46 # <CJK>
+0x9B9D 0x5C4E # <CJK>
+0x9B9E 0x5C53 # <CJK>
+0x9B9F 0x5C50 # <CJK>
+0x9BA0 0x5C4F # <CJK>
+0x9BA1 0x5B71 # <CJK>
+0x9BA2 0x5C6C # <CJK>
+0x9BA3 0x5C6E # <CJK>
+0x9BA4 0x4E62 # <CJK>
+0x9BA5 0x5C76 # <CJK>
+0x9BA6 0x5C79 # <CJK>
+0x9BA7 0x5C8C # <CJK>
+0x9BA8 0x5C91 # <CJK>
+0x9BA9 0x5C94 # <CJK>
+0x9BAA 0x599B # <CJK>
+0x9BAB 0x5CAB # <CJK>
+0x9BAC 0x5CBB # <CJK>
+0x9BAD 0x5CB6 # <CJK>
+0x9BAE 0x5CBC # <CJK>
+0x9BAF 0x5CB7 # <CJK>
+0x9BB0 0x5CC5 # <CJK>
+0x9BB1 0x5CBE # <CJK>
+0x9BB2 0x5CC7 # <CJK>
+0x9BB3 0x5CD9 # <CJK>
+0x9BB4 0x5CE9 # <CJK>
+0x9BB5 0x5CFD # <CJK>
+0x9BB6 0x5CFA # <CJK>
+0x9BB7 0x5CED # <CJK>
+0x9BB8 0x5D8C # <CJK>
+0x9BB9 0x5CEA # <CJK>
+0x9BBA 0x5D0B # <CJK>
+0x9BBB 0x5D15 # <CJK>
+0x9BBC 0x5D17 # <CJK>
+0x9BBD 0x5D5C # <CJK>
+0x9BBE 0x5D1F # <CJK>
+0x9BBF 0x5D1B # <CJK>
+0x9BC0 0x5D11 # <CJK>
+0x9BC1 0x5D14 # <CJK>
+0x9BC2 0x5D22 # <CJK>
+0x9BC3 0x5D1A # <CJK>
+0x9BC4 0x5D19 # <CJK>
+0x9BC5 0x5D18 # <CJK>
+0x9BC6 0x5D4C # <CJK>
+0x9BC7 0x5D52 # <CJK>
+0x9BC8 0x5D4E # <CJK>
+0x9BC9 0x5D4B # <CJK>
+0x9BCA 0x5D6C # <CJK>
+0x9BCB 0x5D73 # <CJK>
+0x9BCC 0x5D76 # <CJK>
+0x9BCD 0x5D87 # <CJK>
+0x9BCE 0x5D84 # <CJK>
+0x9BCF 0x5D82 # <CJK>
+0x9BD0 0x5DA2 # <CJK>
+0x9BD1 0x5D9D # <CJK>
+0x9BD2 0x5DAC # <CJK>
+0x9BD3 0x5DAE # <CJK>
+0x9BD4 0x5DBD # <CJK>
+0x9BD5 0x5D90 # <CJK>
+0x9BD6 0x5DB7 # <CJK>
+0x9BD7 0x5DBC # <CJK>
+0x9BD8 0x5DC9 # <CJK>
+0x9BD9 0x5DCD # <CJK>
+0x9BDA 0x5DD3 # <CJK>
+0x9BDB 0x5DD2 # <CJK>
+0x9BDC 0x5DD6 # <CJK>
+0x9BDD 0x5DDB # <CJK>
+0x9BDE 0x5DEB # <CJK>
+0x9BDF 0x5DF2 # <CJK>
+0x9BE0 0x5DF5 # <CJK>
+0x9BE1 0x5E0B # <CJK>
+0x9BE2 0x5E1A # <CJK>
+0x9BE3 0x5E19 # <CJK>
+0x9BE4 0x5E11 # <CJK>
+0x9BE5 0x5E1B # <CJK>
+0x9BE6 0x5E36 # <CJK>
+0x9BE7 0x5E37 # <CJK>
+0x9BE8 0x5E44 # <CJK>
+0x9BE9 0x5E43 # <CJK>
+0x9BEA 0x5E40 # <CJK>
+0x9BEB 0x5E4E # <CJK>
+0x9BEC 0x5E57 # <CJK>
+0x9BED 0x5E54 # <CJK>
+0x9BEE 0x5E5F # <CJK>
+0x9BEF 0x5E62 # <CJK>
+0x9BF0 0x5E64 # <CJK>
+0x9BF1 0x5E47 # <CJK>
+0x9BF2 0x5E75 # <CJK>
+0x9BF3 0x5E76 # <CJK>
+0x9BF4 0x5E7A # <CJK>
+0x9BF5 0x9EBC # <CJK>
+0x9BF6 0x5E7F # <CJK>
+0x9BF7 0x5EA0 # <CJK>
+0x9BF8 0x5EC1 # <CJK>
+0x9BF9 0x5EC2 # <CJK>
+0x9BFA 0x5EC8 # <CJK>
+0x9BFB 0x5ED0 # <CJK>
+0x9BFC 0x5ECF # <CJK>
+0x9C40 0x5ED6 # <CJK>
+0x9C41 0x5EE3 # <CJK>
+0x9C42 0x5EDD # <CJK>
+0x9C43 0x5EDA # <CJK>
+0x9C44 0x5EDB # <CJK>
+0x9C45 0x5EE2 # <CJK>
+0x9C46 0x5EE1 # <CJK>
+0x9C47 0x5EE8 # <CJK>
+0x9C48 0x5EE9 # <CJK>
+0x9C49 0x5EEC # <CJK>
+0x9C4A 0x5EF1 # <CJK>
+0x9C4B 0x5EF3 # <CJK>
+0x9C4C 0x5EF0 # <CJK>
+0x9C4D 0x5EF4 # <CJK>
+0x9C4E 0x5EF8 # <CJK>
+0x9C4F 0x5EFE # <CJK>
+0x9C50 0x5F03 # <CJK>
+0x9C51 0x5F09 # <CJK>
+0x9C52 0x5F5D # <CJK>
+0x9C53 0x5F5C # <CJK>
+0x9C54 0x5F0B # <CJK>
+0x9C55 0x5F11 # <CJK>
+0x9C56 0x5F16 # <CJK>
+0x9C57 0x5F29 # <CJK>
+0x9C58 0x5F2D # <CJK>
+0x9C59 0x5F38 # <CJK>
+0x9C5A 0x5F41 # <CJK>
+0x9C5B 0x5F48 # <CJK>
+0x9C5C 0x5F4C # <CJK>
+0x9C5D 0x5F4E # <CJK>
+0x9C5E 0x5F2F # <CJK>
+0x9C5F 0x5F51 # <CJK>
+0x9C60 0x5F56 # <CJK>
+0x9C61 0x5F57 # <CJK>
+0x9C62 0x5F59 # <CJK>
+0x9C63 0x5F61 # <CJK>
+0x9C64 0x5F6D # <CJK>
+0x9C65 0x5F73 # <CJK>
+0x9C66 0x5F77 # <CJK>
+0x9C67 0x5F83 # <CJK>
+0x9C68 0x5F82 # <CJK>
+0x9C69 0x5F7F # <CJK>
+0x9C6A 0x5F8A # <CJK>
+0x9C6B 0x5F88 # <CJK>
+0x9C6C 0x5F91 # <CJK>
+0x9C6D 0x5F87 # <CJK>
+0x9C6E 0x5F9E # <CJK>
+0x9C6F 0x5F99 # <CJK>
+0x9C70 0x5F98 # <CJK>
+0x9C71 0x5FA0 # <CJK>
+0x9C72 0x5FA8 # <CJK>
+0x9C73 0x5FAD # <CJK>
+0x9C74 0x5FBC # <CJK>
+0x9C75 0x5FD6 # <CJK>
+0x9C76 0x5FFB # <CJK>
+0x9C77 0x5FE4 # <CJK>
+0x9C78 0x5FF8 # <CJK>
+0x9C79 0x5FF1 # <CJK>
+0x9C7A 0x5FDD # <CJK>
+0x9C7B 0x60B3 # <CJK>
+0x9C7C 0x5FFF # <CJK>
+0x9C7D 0x6021 # <CJK>
+0x9C7E 0x6060 # <CJK>
+0x9C80 0x6019 # <CJK>
+0x9C81 0x6010 # <CJK>
+0x9C82 0x6029 # <CJK>
+0x9C83 0x600E # <CJK>
+0x9C84 0x6031 # <CJK>
+0x9C85 0x601B # <CJK>
+0x9C86 0x6015 # <CJK>
+0x9C87 0x602B # <CJK>
+0x9C88 0x6026 # <CJK>
+0x9C89 0x600F # <CJK>
+0x9C8A 0x603A # <CJK>
+0x9C8B 0x605A # <CJK>
+0x9C8C 0x6041 # <CJK>
+0x9C8D 0x606A # <CJK>
+0x9C8E 0x6077 # <CJK>
+0x9C8F 0x605F # <CJK>
+0x9C90 0x604A # <CJK>
+0x9C91 0x6046 # <CJK>
+0x9C92 0x604D # <CJK>
+0x9C93 0x6063 # <CJK>
+0x9C94 0x6043 # <CJK>
+0x9C95 0x6064 # <CJK>
+0x9C96 0x6042 # <CJK>
+0x9C97 0x606C # <CJK>
+0x9C98 0x606B # <CJK>
+0x9C99 0x6059 # <CJK>
+0x9C9A 0x6081 # <CJK>
+0x9C9B 0x608D # <CJK>
+0x9C9C 0x60E7 # <CJK>
+0x9C9D 0x6083 # <CJK>
+0x9C9E 0x609A # <CJK>
+0x9C9F 0x6084 # <CJK>
+0x9CA0 0x609B # <CJK>
+0x9CA1 0x6096 # <CJK>
+0x9CA2 0x6097 # <CJK>
+0x9CA3 0x6092 # <CJK>
+0x9CA4 0x60A7 # <CJK>
+0x9CA5 0x608B # <CJK>
+0x9CA6 0x60E1 # <CJK>
+0x9CA7 0x60B8 # <CJK>
+0x9CA8 0x60E0 # <CJK>
+0x9CA9 0x60D3 # <CJK>
+0x9CAA 0x60B4 # <CJK>
+0x9CAB 0x5FF0 # <CJK>
+0x9CAC 0x60BD # <CJK>
+0x9CAD 0x60C6 # <CJK>
+0x9CAE 0x60B5 # <CJK>
+0x9CAF 0x60D8 # <CJK>
+0x9CB0 0x614D # <CJK>
+0x9CB1 0x6115 # <CJK>
+0x9CB2 0x6106 # <CJK>
+0x9CB3 0x60F6 # <CJK>
+0x9CB4 0x60F7 # <CJK>
+0x9CB5 0x6100 # <CJK>
+0x9CB6 0x60F4 # <CJK>
+0x9CB7 0x60FA # <CJK>
+0x9CB8 0x6103 # <CJK>
+0x9CB9 0x6121 # <CJK>
+0x9CBA 0x60FB # <CJK>
+0x9CBB 0x60F1 # <CJK>
+0x9CBC 0x610D # <CJK>
+0x9CBD 0x610E # <CJK>
+0x9CBE 0x6147 # <CJK>
+0x9CBF 0x613E # <CJK>
+0x9CC0 0x6128 # <CJK>
+0x9CC1 0x6127 # <CJK>
+0x9CC2 0x614A # <CJK>
+0x9CC3 0x613F # <CJK>
+0x9CC4 0x613C # <CJK>
+0x9CC5 0x612C # <CJK>
+0x9CC6 0x6134 # <CJK>
+0x9CC7 0x613D # <CJK>
+0x9CC8 0x6142 # <CJK>
+0x9CC9 0x6144 # <CJK>
+0x9CCA 0x6173 # <CJK>
+0x9CCB 0x6177 # <CJK>
+0x9CCC 0x6158 # <CJK>
+0x9CCD 0x6159 # <CJK>
+0x9CCE 0x615A # <CJK>
+0x9CCF 0x616B # <CJK>
+0x9CD0 0x6174 # <CJK>
+0x9CD1 0x616F # <CJK>
+0x9CD2 0x6165 # <CJK>
+0x9CD3 0x6171 # <CJK>
+0x9CD4 0x615F # <CJK>
+0x9CD5 0x615D # <CJK>
+0x9CD6 0x6153 # <CJK>
+0x9CD7 0x6175 # <CJK>
+0x9CD8 0x6199 # <CJK>
+0x9CD9 0x6196 # <CJK>
+0x9CDA 0x6187 # <CJK>
+0x9CDB 0x61AC # <CJK>
+0x9CDC 0x6194 # <CJK>
+0x9CDD 0x619A # <CJK>
+0x9CDE 0x618A # <CJK>
+0x9CDF 0x6191 # <CJK>
+0x9CE0 0x61AB # <CJK>
+0x9CE1 0x61AE # <CJK>
+0x9CE2 0x61CC # <CJK>
+0x9CE3 0x61CA # <CJK>
+0x9CE4 0x61C9 # <CJK>
+0x9CE5 0x61F7 # <CJK>
+0x9CE6 0x61C8 # <CJK>
+0x9CE7 0x61C3 # <CJK>
+0x9CE8 0x61C6 # <CJK>
+0x9CE9 0x61BA # <CJK>
+0x9CEA 0x61CB # <CJK>
+0x9CEB 0x7F79 # <CJK>
+0x9CEC 0x61CD # <CJK>
+0x9CED 0x61E6 # <CJK>
+0x9CEE 0x61E3 # <CJK>
+0x9CEF 0x61F6 # <CJK>
+0x9CF0 0x61FA # <CJK>
+0x9CF1 0x61F4 # <CJK>
+0x9CF2 0x61FF # <CJK>
+0x9CF3 0x61FD # <CJK>
+0x9CF4 0x61FC # <CJK>
+0x9CF5 0x61FE # <CJK>
+0x9CF6 0x6200 # <CJK>
+0x9CF7 0x6208 # <CJK>
+0x9CF8 0x6209 # <CJK>
+0x9CF9 0x620D # <CJK>
+0x9CFA 0x620C # <CJK>
+0x9CFB 0x6214 # <CJK>
+0x9CFC 0x621B # <CJK>
+0x9D40 0x621E # <CJK>
+0x9D41 0x6221 # <CJK>
+0x9D42 0x622A # <CJK>
+0x9D43 0x622E # <CJK>
+0x9D44 0x6230 # <CJK>
+0x9D45 0x6232 # <CJK>
+0x9D46 0x6233 # <CJK>
+0x9D47 0x6241 # <CJK>
+0x9D48 0x624E # <CJK>
+0x9D49 0x625E # <CJK>
+0x9D4A 0x6263 # <CJK>
+0x9D4B 0x625B # <CJK>
+0x9D4C 0x6260 # <CJK>
+0x9D4D 0x6268 # <CJK>
+0x9D4E 0x627C # <CJK>
+0x9D4F 0x6282 # <CJK>
+0x9D50 0x6289 # <CJK>
+0x9D51 0x627E # <CJK>
+0x9D52 0x6292 # <CJK>
+0x9D53 0x6293 # <CJK>
+0x9D54 0x6296 # <CJK>
+0x9D55 0x62D4 # <CJK>
+0x9D56 0x6283 # <CJK>
+0x9D57 0x6294 # <CJK>
+0x9D58 0x62D7 # <CJK>
+0x9D59 0x62D1 # <CJK>
+0x9D5A 0x62BB # <CJK>
+0x9D5B 0x62CF # <CJK>
+0x9D5C 0x62FF # <CJK>
+0x9D5D 0x62C6 # <CJK>
+0x9D5E 0x64D4 # <CJK>
+0x9D5F 0x62C8 # <CJK>
+0x9D60 0x62DC # <CJK>
+0x9D61 0x62CC # <CJK>
+0x9D62 0x62CA # <CJK>
+0x9D63 0x62C2 # <CJK>
+0x9D64 0x62C7 # <CJK>
+0x9D65 0x629B # <CJK>
+0x9D66 0x62C9 # <CJK>
+0x9D67 0x630C # <CJK>
+0x9D68 0x62EE # <CJK>
+0x9D69 0x62F1 # <CJK>
+0x9D6A 0x6327 # <CJK>
+0x9D6B 0x6302 # <CJK>
+0x9D6C 0x6308 # <CJK>
+0x9D6D 0x62EF # <CJK>
+0x9D6E 0x62F5 # <CJK>
+0x9D6F 0x6350 # <CJK>
+0x9D70 0x633E # <CJK>
+0x9D71 0x634D # <CJK>
+0x9D72 0x641C # <CJK>
+0x9D73 0x634F # <CJK>
+0x9D74 0x6396 # <CJK>
+0x9D75 0x638E # <CJK>
+0x9D76 0x6380 # <CJK>
+0x9D77 0x63AB # <CJK>
+0x9D78 0x6376 # <CJK>
+0x9D79 0x63A3 # <CJK>
+0x9D7A 0x638F # <CJK>
+0x9D7B 0x6389 # <CJK>
+0x9D7C 0x639F # <CJK>
+0x9D7D 0x63B5 # <CJK>
+0x9D7E 0x636B # <CJK>
+0x9D80 0x6369 # <CJK>
+0x9D81 0x63BE # <CJK>
+0x9D82 0x63E9 # <CJK>
+0x9D83 0x63C0 # <CJK>
+0x9D84 0x63C6 # <CJK>
+0x9D85 0x63E3 # <CJK>
+0x9D86 0x63C9 # <CJK>
+0x9D87 0x63D2 # <CJK>
+0x9D88 0x63F6 # <CJK>
+0x9D89 0x63C4 # <CJK>
+0x9D8A 0x6416 # <CJK>
+0x9D8B 0x6434 # <CJK>
+0x9D8C 0x6406 # <CJK>
+0x9D8D 0x6413 # <CJK>
+0x9D8E 0x6426 # <CJK>
+0x9D8F 0x6436 # <CJK>
+0x9D90 0x651D # <CJK>
+0x9D91 0x6417 # <CJK>
+0x9D92 0x6428 # <CJK>
+0x9D93 0x640F # <CJK>
+0x9D94 0x6467 # <CJK>
+0x9D95 0x646F # <CJK>
+0x9D96 0x6476 # <CJK>
+0x9D97 0x644E # <CJK>
+0x9D98 0x652A # <CJK>
+0x9D99 0x6495 # <CJK>
+0x9D9A 0x6493 # <CJK>
+0x9D9B 0x64A5 # <CJK>
+0x9D9C 0x64A9 # <CJK>
+0x9D9D 0x6488 # <CJK>
+0x9D9E 0x64BC # <CJK>
+0x9D9F 0x64DA # <CJK>
+0x9DA0 0x64D2 # <CJK>
+0x9DA1 0x64C5 # <CJK>
+0x9DA2 0x64C7 # <CJK>
+0x9DA3 0x64BB # <CJK>
+0x9DA4 0x64D8 # <CJK>
+0x9DA5 0x64C2 # <CJK>
+0x9DA6 0x64F1 # <CJK>
+0x9DA7 0x64E7 # <CJK>
+0x9DA8 0x8209 # <CJK>
+0x9DA9 0x64E0 # <CJK>
+0x9DAA 0x64E1 # <CJK>
+0x9DAB 0x62AC # <CJK>
+0x9DAC 0x64E3 # <CJK>
+0x9DAD 0x64EF # <CJK>
+0x9DAE 0x652C # <CJK>
+0x9DAF 0x64F6 # <CJK>
+0x9DB0 0x64F4 # <CJK>
+0x9DB1 0x64F2 # <CJK>
+0x9DB2 0x64FA # <CJK>
+0x9DB3 0x6500 # <CJK>
+0x9DB4 0x64FD # <CJK>
+0x9DB5 0x6518 # <CJK>
+0x9DB6 0x651C # <CJK>
+0x9DB7 0x6505 # <CJK>
+0x9DB8 0x6524 # <CJK>
+0x9DB9 0x6523 # <CJK>
+0x9DBA 0x652B # <CJK>
+0x9DBB 0x6534 # <CJK>
+0x9DBC 0x6535 # <CJK>
+0x9DBD 0x6537 # <CJK>
+0x9DBE 0x6536 # <CJK>
+0x9DBF 0x6538 # <CJK>
+0x9DC0 0x754B # <CJK>
+0x9DC1 0x6548 # <CJK>
+0x9DC2 0x6556 # <CJK>
+0x9DC3 0x6555 # <CJK>
+0x9DC4 0x654D # <CJK>
+0x9DC5 0x6558 # <CJK>
+0x9DC6 0x655E # <CJK>
+0x9DC7 0x655D # <CJK>
+0x9DC8 0x6572 # <CJK>
+0x9DC9 0x6578 # <CJK>
+0x9DCA 0x6582 # <CJK>
+0x9DCB 0x6583 # <CJK>
+0x9DCC 0x8B8A # <CJK>
+0x9DCD 0x659B # <CJK>
+0x9DCE 0x659F # <CJK>
+0x9DCF 0x65AB # <CJK>
+0x9DD0 0x65B7 # <CJK>
+0x9DD1 0x65C3 # <CJK>
+0x9DD2 0x65C6 # <CJK>
+0x9DD3 0x65C1 # <CJK>
+0x9DD4 0x65C4 # <CJK>
+0x9DD5 0x65CC # <CJK>
+0x9DD6 0x65D2 # <CJK>
+0x9DD7 0x65DB # <CJK>
+0x9DD8 0x65D9 # <CJK>
+0x9DD9 0x65E0 # <CJK>
+0x9DDA 0x65E1 # <CJK>
+0x9DDB 0x65F1 # <CJK>
+0x9DDC 0x6772 # <CJK>
+0x9DDD 0x660A # <CJK>
+0x9DDE 0x6603 # <CJK>
+0x9DDF 0x65FB # <CJK>
+0x9DE0 0x6773 # <CJK>
+0x9DE1 0x6635 # <CJK>
+0x9DE2 0x6636 # <CJK>
+0x9DE3 0x6634 # <CJK>
+0x9DE4 0x661C # <CJK>
+0x9DE5 0x664F # <CJK>
+0x9DE6 0x6644 # <CJK>
+0x9DE7 0x6649 # <CJK>
+0x9DE8 0x6641 # <CJK>
+0x9DE9 0x665E # <CJK>
+0x9DEA 0x665D # <CJK>
+0x9DEB 0x6664 # <CJK>
+0x9DEC 0x6667 # <CJK>
+0x9DED 0x6668 # <CJK>
+0x9DEE 0x665F # <CJK>
+0x9DEF 0x6662 # <CJK>
+0x9DF0 0x6670 # <CJK>
+0x9DF1 0x6683 # <CJK>
+0x9DF2 0x6688 # <CJK>
+0x9DF3 0x668E # <CJK>
+0x9DF4 0x6689 # <CJK>
+0x9DF5 0x6684 # <CJK>
+0x9DF6 0x6698 # <CJK>
+0x9DF7 0x669D # <CJK>
+0x9DF8 0x66C1 # <CJK>
+0x9DF9 0x66B9 # <CJK>
+0x9DFA 0x66C9 # <CJK>
+0x9DFB 0x66BE # <CJK>
+0x9DFC 0x66BC # <CJK>
+0x9E40 0x66C4 # <CJK>
+0x9E41 0x66B8 # <CJK>
+0x9E42 0x66D6 # <CJK>
+0x9E43 0x66DA # <CJK>
+0x9E44 0x66E0 # <CJK>
+0x9E45 0x663F # <CJK>
+0x9E46 0x66E6 # <CJK>
+0x9E47 0x66E9 # <CJK>
+0x9E48 0x66F0 # <CJK>
+0x9E49 0x66F5 # <CJK>
+0x9E4A 0x66F7 # <CJK>
+0x9E4B 0x670F # <CJK>
+0x9E4C 0x6716 # <CJK>
+0x9E4D 0x671E # <CJK>
+0x9E4E 0x6726 # <CJK>
+0x9E4F 0x6727 # <CJK>
+0x9E50 0x9738 # <CJK>
+0x9E51 0x672E # <CJK>
+0x9E52 0x673F # <CJK>
+0x9E53 0x6736 # <CJK>
+0x9E54 0x6741 # <CJK>
+0x9E55 0x6738 # <CJK>
+0x9E56 0x6737 # <CJK>
+0x9E57 0x6746 # <CJK>
+0x9E58 0x675E # <CJK>
+0x9E59 0x6760 # <CJK>
+0x9E5A 0x6759 # <CJK>
+0x9E5B 0x6763 # <CJK>
+0x9E5C 0x6764 # <CJK>
+0x9E5D 0x6789 # <CJK>
+0x9E5E 0x6770 # <CJK>
+0x9E5F 0x67A9 # <CJK>
+0x9E60 0x677C # <CJK>
+0x9E61 0x676A # <CJK>
+0x9E62 0x678C # <CJK>
+0x9E63 0x678B # <CJK>
+0x9E64 0x67A6 # <CJK>
+0x9E65 0x67A1 # <CJK>
+0x9E66 0x6785 # <CJK>
+0x9E67 0x67B7 # <CJK>
+0x9E68 0x67EF # <CJK>
+0x9E69 0x67B4 # <CJK>
+0x9E6A 0x67EC # <CJK>
+0x9E6B 0x67B3 # <CJK>
+0x9E6C 0x67E9 # <CJK>
+0x9E6D 0x67B8 # <CJK>
+0x9E6E 0x67E4 # <CJK>
+0x9E6F 0x67DE # <CJK>
+0x9E70 0x67DD # <CJK>
+0x9E71 0x67E2 # <CJK>
+0x9E72 0x67EE # <CJK>
+0x9E73 0x67B9 # <CJK>
+0x9E74 0x67CE # <CJK>
+0x9E75 0x67C6 # <CJK>
+0x9E76 0x67E7 # <CJK>
+0x9E77 0x6A9C # <CJK>
+0x9E78 0x681E # <CJK>
+0x9E79 0x6846 # <CJK>
+0x9E7A 0x6829 # <CJK>
+0x9E7B 0x6840 # <CJK>
+0x9E7C 0x684D # <CJK>
+0x9E7D 0x6832 # <CJK>
+0x9E7E 0x684E # <CJK>
+0x9E80 0x68B3 # <CJK>
+0x9E81 0x682B # <CJK>
+0x9E82 0x6859 # <CJK>
+0x9E83 0x6863 # <CJK>
+0x9E84 0x6877 # <CJK>
+0x9E85 0x687F # <CJK>
+0x9E86 0x689F # <CJK>
+0x9E87 0x688F # <CJK>
+0x9E88 0x68AD # <CJK>
+0x9E89 0x6894 # <CJK>
+0x9E8A 0x689D # <CJK>
+0x9E8B 0x689B # <CJK>
+0x9E8C 0x6883 # <CJK>
+0x9E8D 0x6AAE # <CJK>
+0x9E8E 0x68B9 # <CJK>
+0x9E8F 0x6874 # <CJK>
+0x9E90 0x68B5 # <CJK>
+0x9E91 0x68A0 # <CJK>
+0x9E92 0x68BA # <CJK>
+0x9E93 0x690F # <CJK>
+0x9E94 0x688D # <CJK>
+0x9E95 0x687E # <CJK>
+0x9E96 0x6901 # <CJK>
+0x9E97 0x68CA # <CJK>
+0x9E98 0x6908 # <CJK>
+0x9E99 0x68D8 # <CJK>
+0x9E9A 0x6922 # <CJK>
+0x9E9B 0x6926 # <CJK>
+0x9E9C 0x68E1 # <CJK>
+0x9E9D 0x690C # <CJK>
+0x9E9E 0x68CD # <CJK>
+0x9E9F 0x68D4 # <CJK>
+0x9EA0 0x68E7 # <CJK>
+0x9EA1 0x68D5 # <CJK>
+0x9EA2 0x6936 # <CJK>
+0x9EA3 0x6912 # <CJK>
+0x9EA4 0x6904 # <CJK>
+0x9EA5 0x68D7 # <CJK>
+0x9EA6 0x68E3 # <CJK>
+0x9EA7 0x6925 # <CJK>
+0x9EA8 0x68F9 # <CJK>
+0x9EA9 0x68E0 # <CJK>
+0x9EAA 0x68EF # <CJK>
+0x9EAB 0x6928 # <CJK>
+0x9EAC 0x692A # <CJK>
+0x9EAD 0x691A # <CJK>
+0x9EAE 0x6923 # <CJK>
+0x9EAF 0x6921 # <CJK>
+0x9EB0 0x68C6 # <CJK>
+0x9EB1 0x6979 # <CJK>
+0x9EB2 0x6977 # <CJK>
+0x9EB3 0x695C # <CJK>
+0x9EB4 0x6978 # <CJK>
+0x9EB5 0x696B # <CJK>
+0x9EB6 0x6954 # <CJK>
+0x9EB7 0x697E # <CJK>
+0x9EB8 0x696E # <CJK>
+0x9EB9 0x6939 # <CJK>
+0x9EBA 0x6974 # <CJK>
+0x9EBB 0x693D # <CJK>
+0x9EBC 0x6959 # <CJK>
+0x9EBD 0x6930 # <CJK>
+0x9EBE 0x6961 # <CJK>
+0x9EBF 0x695E # <CJK>
+0x9EC0 0x695D # <CJK>
+0x9EC1 0x6981 # <CJK>
+0x9EC2 0x696A # <CJK>
+0x9EC3 0x69B2 # <CJK>
+0x9EC4 0x69AE # <CJK>
+0x9EC5 0x69D0 # <CJK>
+0x9EC6 0x69BF # <CJK>
+0x9EC7 0x69C1 # <CJK>
+0x9EC8 0x69D3 # <CJK>
+0x9EC9 0x69BE # <CJK>
+0x9ECA 0x69CE # <CJK>
+0x9ECB 0x5BE8 # <CJK>
+0x9ECC 0x69CA # <CJK>
+0x9ECD 0x69DD # <CJK>
+0x9ECE 0x69BB # <CJK>
+0x9ECF 0x69C3 # <CJK>
+0x9ED0 0x69A7 # <CJK>
+0x9ED1 0x6A2E # <CJK>
+0x9ED2 0x6991 # <CJK>
+0x9ED3 0x69A0 # <CJK>
+0x9ED4 0x699C # <CJK>
+0x9ED5 0x6995 # <CJK>
+0x9ED6 0x69B4 # <CJK>
+0x9ED7 0x69DE # <CJK>
+0x9ED8 0x69E8 # <CJK>
+0x9ED9 0x6A02 # <CJK>
+0x9EDA 0x6A1B # <CJK>
+0x9EDB 0x69FF # <CJK>
+0x9EDC 0x6B0A # <CJK>
+0x9EDD 0x69F9 # <CJK>
+0x9EDE 0x69F2 # <CJK>
+0x9EDF 0x69E7 # <CJK>
+0x9EE0 0x6A05 # <CJK>
+0x9EE1 0x69B1 # <CJK>
+0x9EE2 0x6A1E # <CJK>
+0x9EE3 0x69ED # <CJK>
+0x9EE4 0x6A14 # <CJK>
+0x9EE5 0x69EB # <CJK>
+0x9EE6 0x6A0A # <CJK>
+0x9EE7 0x6A12 # <CJK>
+0x9EE8 0x6AC1 # <CJK>
+0x9EE9 0x6A23 # <CJK>
+0x9EEA 0x6A13 # <CJK>
+0x9EEB 0x6A44 # <CJK>
+0x9EEC 0x6A0C # <CJK>
+0x9EED 0x6A72 # <CJK>
+0x9EEE 0x6A36 # <CJK>
+0x9EEF 0x6A78 # <CJK>
+0x9EF0 0x6A47 # <CJK>
+0x9EF1 0x6A62 # <CJK>
+0x9EF2 0x6A59 # <CJK>
+0x9EF3 0x6A66 # <CJK>
+0x9EF4 0x6A48 # <CJK>
+0x9EF5 0x6A38 # <CJK>
+0x9EF6 0x6A22 # <CJK>
+0x9EF7 0x6A90 # <CJK>
+0x9EF8 0x6A8D # <CJK>
+0x9EF9 0x6AA0 # <CJK>
+0x9EFA 0x6A84 # <CJK>
+0x9EFB 0x6AA2 # <CJK>
+0x9EFC 0x6AA3 # <CJK>
+0x9F40 0x6A97 # <CJK>
+0x9F41 0x8617 # <CJK>
+0x9F42 0x6ABB # <CJK>
+0x9F43 0x6AC3 # <CJK>
+0x9F44 0x6AC2 # <CJK>
+0x9F45 0x6AB8 # <CJK>
+0x9F46 0x6AB3 # <CJK>
+0x9F47 0x6AAC # <CJK>
+0x9F48 0x6ADE # <CJK>
+0x9F49 0x6AD1 # <CJK>
+0x9F4A 0x6ADF # <CJK>
+0x9F4B 0x6AAA # <CJK>
+0x9F4C 0x6ADA # <CJK>
+0x9F4D 0x6AEA # <CJK>
+0x9F4E 0x6AFB # <CJK>
+0x9F4F 0x6B05 # <CJK>
+0x9F50 0x8616 # <CJK>
+0x9F51 0x6AFA # <CJK>
+0x9F52 0x6B12 # <CJK>
+0x9F53 0x6B16 # <CJK>
+0x9F54 0x9B31 # <CJK>
+0x9F55 0x6B1F # <CJK>
+0x9F56 0x6B38 # <CJK>
+0x9F57 0x6B37 # <CJK>
+0x9F58 0x76DC # <CJK>
+0x9F59 0x6B39 # <CJK>
+0x9F5A 0x98EE # <CJK>
+0x9F5B 0x6B47 # <CJK>
+0x9F5C 0x6B43 # <CJK>
+0x9F5D 0x6B49 # <CJK>
+0x9F5E 0x6B50 # <CJK>
+0x9F5F 0x6B59 # <CJK>
+0x9F60 0x6B54 # <CJK>
+0x9F61 0x6B5B # <CJK>
+0x9F62 0x6B5F # <CJK>
+0x9F63 0x6B61 # <CJK>
+0x9F64 0x6B78 # <CJK>
+0x9F65 0x6B79 # <CJK>
+0x9F66 0x6B7F # <CJK>
+0x9F67 0x6B80 # <CJK>
+0x9F68 0x6B84 # <CJK>
+0x9F69 0x6B83 # <CJK>
+0x9F6A 0x6B8D # <CJK>
+0x9F6B 0x6B98 # <CJK>
+0x9F6C 0x6B95 # <CJK>
+0x9F6D 0x6B9E # <CJK>
+0x9F6E 0x6BA4 # <CJK>
+0x9F6F 0x6BAA # <CJK>
+0x9F70 0x6BAB # <CJK>
+0x9F71 0x6BAF # <CJK>
+0x9F72 0x6BB2 # <CJK>
+0x9F73 0x6BB1 # <CJK>
+0x9F74 0x6BB3 # <CJK>
+0x9F75 0x6BB7 # <CJK>
+0x9F76 0x6BBC # <CJK>
+0x9F77 0x6BC6 # <CJK>
+0x9F78 0x6BCB # <CJK>
+0x9F79 0x6BD3 # <CJK>
+0x9F7A 0x6BDF # <CJK>
+0x9F7B 0x6BEC # <CJK>
+0x9F7C 0x6BEB # <CJK>
+0x9F7D 0x6BF3 # <CJK>
+0x9F7E 0x6BEF # <CJK>
+0x9F80 0x9EBE # <CJK>
+0x9F81 0x6C08 # <CJK>
+0x9F82 0x6C13 # <CJK>
+0x9F83 0x6C14 # <CJK>
+0x9F84 0x6C1B # <CJK>
+0x9F85 0x6C24 # <CJK>
+0x9F86 0x6C23 # <CJK>
+0x9F87 0x6C5E # <CJK>
+0x9F88 0x6C55 # <CJK>
+0x9F89 0x6C62 # <CJK>
+0x9F8A 0x6C6A # <CJK>
+0x9F8B 0x6C82 # <CJK>
+0x9F8C 0x6C8D # <CJK>
+0x9F8D 0x6C9A # <CJK>
+0x9F8E 0x6C81 # <CJK>
+0x9F8F 0x6C9B # <CJK>
+0x9F90 0x6C7E # <CJK>
+0x9F91 0x6C68 # <CJK>
+0x9F92 0x6C73 # <CJK>
+0x9F93 0x6C92 # <CJK>
+0x9F94 0x6C90 # <CJK>
+0x9F95 0x6CC4 # <CJK>
+0x9F96 0x6CF1 # <CJK>
+0x9F97 0x6CD3 # <CJK>
+0x9F98 0x6CBD # <CJK>
+0x9F99 0x6CD7 # <CJK>
+0x9F9A 0x6CC5 # <CJK>
+0x9F9B 0x6CDD # <CJK>
+0x9F9C 0x6CAE # <CJK>
+0x9F9D 0x6CB1 # <CJK>
+0x9F9E 0x6CBE # <CJK>
+0x9F9F 0x6CBA # <CJK>
+0x9FA0 0x6CDB # <CJK>
+0x9FA1 0x6CEF # <CJK>
+0x9FA2 0x6CD9 # <CJK>
+0x9FA3 0x6CEA # <CJK>
+0x9FA4 0x6D1F # <CJK>
+0x9FA5 0x884D # <CJK>
+0x9FA6 0x6D36 # <CJK>
+0x9FA7 0x6D2B # <CJK>
+0x9FA8 0x6D3D # <CJK>
+0x9FA9 0x6D38 # <CJK>
+0x9FAA 0x6D19 # <CJK>
+0x9FAB 0x6D35 # <CJK>
+0x9FAC 0x6D33 # <CJK>
+0x9FAD 0x6D12 # <CJK>
+0x9FAE 0x6D0C # <CJK>
+0x9FAF 0x6D63 # <CJK>
+0x9FB0 0x6D93 # <CJK>
+0x9FB1 0x6D64 # <CJK>
+0x9FB2 0x6D5A # <CJK>
+0x9FB3 0x6D79 # <CJK>
+0x9FB4 0x6D59 # <CJK>
+0x9FB5 0x6D8E # <CJK>
+0x9FB6 0x6D95 # <CJK>
+0x9FB7 0x6FE4 # <CJK>
+0x9FB8 0x6D85 # <CJK>
+0x9FB9 0x6DF9 # <CJK>
+0x9FBA 0x6E15 # <CJK>
+0x9FBB 0x6E0A # <CJK>
+0x9FBC 0x6DB5 # <CJK>
+0x9FBD 0x6DC7 # <CJK>
+0x9FBE 0x6DE6 # <CJK>
+0x9FBF 0x6DB8 # <CJK>
+0x9FC0 0x6DC6 # <CJK>
+0x9FC1 0x6DEC # <CJK>
+0x9FC2 0x6DDE # <CJK>
+0x9FC3 0x6DCC # <CJK>
+0x9FC4 0x6DE8 # <CJK>
+0x9FC5 0x6DD2 # <CJK>
+0x9FC6 0x6DC5 # <CJK>
+0x9FC7 0x6DFA # <CJK>
+0x9FC8 0x6DD9 # <CJK>
+0x9FC9 0x6DE4 # <CJK>
+0x9FCA 0x6DD5 # <CJK>
+0x9FCB 0x6DEA # <CJK>
+0x9FCC 0x6DEE # <CJK>
+0x9FCD 0x6E2D # <CJK>
+0x9FCE 0x6E6E # <CJK>
+0x9FCF 0x6E2E # <CJK>
+0x9FD0 0x6E19 # <CJK>
+0x9FD1 0x6E72 # <CJK>
+0x9FD2 0x6E5F # <CJK>
+0x9FD3 0x6E3E # <CJK>
+0x9FD4 0x6E23 # <CJK>
+0x9FD5 0x6E6B # <CJK>
+0x9FD6 0x6E2B # <CJK>
+0x9FD7 0x6E76 # <CJK>
+0x9FD8 0x6E4D # <CJK>
+0x9FD9 0x6E1F # <CJK>
+0x9FDA 0x6E43 # <CJK>
+0x9FDB 0x6E3A # <CJK>
+0x9FDC 0x6E4E # <CJK>
+0x9FDD 0x6E24 # <CJK>
+0x9FDE 0x6EFF # <CJK>
+0x9FDF 0x6E1D # <CJK>
+0x9FE0 0x6E38 # <CJK>
+0x9FE1 0x6E82 # <CJK>
+0x9FE2 0x6EAA # <CJK>
+0x9FE3 0x6E98 # <CJK>
+0x9FE4 0x6EC9 # <CJK>
+0x9FE5 0x6EB7 # <CJK>
+0x9FE6 0x6ED3 # <CJK>
+0x9FE7 0x6EBD # <CJK>
+0x9FE8 0x6EAF # <CJK>
+0x9FE9 0x6EC4 # <CJK>
+0x9FEA 0x6EB2 # <CJK>
+0x9FEB 0x6ED4 # <CJK>
+0x9FEC 0x6ED5 # <CJK>
+0x9FED 0x6E8F # <CJK>
+0x9FEE 0x6EA5 # <CJK>
+0x9FEF 0x6EC2 # <CJK>
+0x9FF0 0x6E9F # <CJK>
+0x9FF1 0x6F41 # <CJK>
+0x9FF2 0x6F11 # <CJK>
+0x9FF3 0x704C # <CJK>
+0x9FF4 0x6EEC # <CJK>
+0x9FF5 0x6EF8 # <CJK>
+0x9FF6 0x6EFE # <CJK>
+0x9FF7 0x6F3F # <CJK>
+0x9FF8 0x6EF2 # <CJK>
+0x9FF9 0x6F31 # <CJK>
+0x9FFA 0x6EEF # <CJK>
+0x9FFB 0x6F32 # <CJK>
+0x9FFC 0x6ECC # <CJK>
+#
+0xE040 0x6F3E # <CJK>
+0xE041 0x6F13 # <CJK>
+0xE042 0x6EF7 # <CJK>
+0xE043 0x6F86 # <CJK>
+0xE044 0x6F7A # <CJK>
+0xE045 0x6F78 # <CJK>
+0xE046 0x6F81 # <CJK>
+0xE047 0x6F80 # <CJK>
+0xE048 0x6F6F # <CJK>
+0xE049 0x6F5B # <CJK>
+0xE04A 0x6FF3 # <CJK>
+0xE04B 0x6F6D # <CJK>
+0xE04C 0x6F82 # <CJK>
+0xE04D 0x6F7C # <CJK>
+0xE04E 0x6F58 # <CJK>
+0xE04F 0x6F8E # <CJK>
+0xE050 0x6F91 # <CJK>
+0xE051 0x6FC2 # <CJK>
+0xE052 0x6F66 # <CJK>
+0xE053 0x6FB3 # <CJK>
+0xE054 0x6FA3 # <CJK>
+0xE055 0x6FA1 # <CJK>
+0xE056 0x6FA4 # <CJK>
+0xE057 0x6FB9 # <CJK>
+0xE058 0x6FC6 # <CJK>
+0xE059 0x6FAA # <CJK>
+0xE05A 0x6FDF # <CJK>
+0xE05B 0x6FD5 # <CJK>
+0xE05C 0x6FEC # <CJK>
+0xE05D 0x6FD4 # <CJK>
+0xE05E 0x6FD8 # <CJK>
+0xE05F 0x6FF1 # <CJK>
+0xE060 0x6FEE # <CJK>
+0xE061 0x6FDB # <CJK>
+0xE062 0x7009 # <CJK>
+0xE063 0x700B # <CJK>
+0xE064 0x6FFA # <CJK>
+0xE065 0x7011 # <CJK>
+0xE066 0x7001 # <CJK>
+0xE067 0x700F # <CJK>
+0xE068 0x6FFE # <CJK>
+0xE069 0x701B # <CJK>
+0xE06A 0x701A # <CJK>
+0xE06B 0x6F74 # <CJK>
+0xE06C 0x701D # <CJK>
+0xE06D 0x7018 # <CJK>
+0xE06E 0x701F # <CJK>
+0xE06F 0x7030 # <CJK>
+0xE070 0x703E # <CJK>
+0xE071 0x7032 # <CJK>
+0xE072 0x7051 # <CJK>
+0xE073 0x7063 # <CJK>
+0xE074 0x7099 # <CJK>
+0xE075 0x7092 # <CJK>
+0xE076 0x70AF # <CJK>
+0xE077 0x70F1 # <CJK>
+0xE078 0x70AC # <CJK>
+0xE079 0x70B8 # <CJK>
+0xE07A 0x70B3 # <CJK>
+0xE07B 0x70AE # <CJK>
+0xE07C 0x70DF # <CJK>
+0xE07D 0x70CB # <CJK>
+0xE07E 0x70DD # <CJK>
+0xE080 0x70D9 # <CJK>
+0xE081 0x7109 # <CJK>
+0xE082 0x70FD # <CJK>
+0xE083 0x711C # <CJK>
+0xE084 0x7119 # <CJK>
+0xE085 0x7165 # <CJK>
+0xE086 0x7155 # <CJK>
+0xE087 0x7188 # <CJK>
+0xE088 0x7166 # <CJK>
+0xE089 0x7162 # <CJK>
+0xE08A 0x714C # <CJK>
+0xE08B 0x7156 # <CJK>
+0xE08C 0x716C # <CJK>
+0xE08D 0x718F # <CJK>
+0xE08E 0x71FB # <CJK>
+0xE08F 0x7184 # <CJK>
+0xE090 0x7195 # <CJK>
+0xE091 0x71A8 # <CJK>
+0xE092 0x71AC # <CJK>
+0xE093 0x71D7 # <CJK>
+0xE094 0x71B9 # <CJK>
+0xE095 0x71BE # <CJK>
+0xE096 0x71D2 # <CJK>
+0xE097 0x71C9 # <CJK>
+0xE098 0x71D4 # <CJK>
+0xE099 0x71CE # <CJK>
+0xE09A 0x71E0 # <CJK>
+0xE09B 0x71EC # <CJK>
+0xE09C 0x71E7 # <CJK>
+0xE09D 0x71F5 # <CJK>
+0xE09E 0x71FC # <CJK>
+0xE09F 0x71F9 # <CJK>
+0xE0A0 0x71FF # <CJK>
+0xE0A1 0x720D # <CJK>
+0xE0A2 0x7210 # <CJK>
+0xE0A3 0x721B # <CJK>
+0xE0A4 0x7228 # <CJK>
+0xE0A5 0x722D # <CJK>
+0xE0A6 0x722C # <CJK>
+0xE0A7 0x7230 # <CJK>
+0xE0A8 0x7232 # <CJK>
+0xE0A9 0x723B # <CJK>
+0xE0AA 0x723C # <CJK>
+0xE0AB 0x723F # <CJK>
+0xE0AC 0x7240 # <CJK>
+0xE0AD 0x7246 # <CJK>
+0xE0AE 0x724B # <CJK>
+0xE0AF 0x7258 # <CJK>
+0xE0B0 0x7274 # <CJK>
+0xE0B1 0x727E # <CJK>
+0xE0B2 0x7282 # <CJK>
+0xE0B3 0x7281 # <CJK>
+0xE0B4 0x7287 # <CJK>
+0xE0B5 0x7292 # <CJK>
+0xE0B6 0x7296 # <CJK>
+0xE0B7 0x72A2 # <CJK>
+0xE0B8 0x72A7 # <CJK>
+0xE0B9 0x72B9 # <CJK>
+0xE0BA 0x72B2 # <CJK>
+0xE0BB 0x72C3 # <CJK>
+0xE0BC 0x72C6 # <CJK>
+0xE0BD 0x72C4 # <CJK>
+0xE0BE 0x72CE # <CJK>
+0xE0BF 0x72D2 # <CJK>
+0xE0C0 0x72E2 # <CJK>
+0xE0C1 0x72E0 # <CJK>
+0xE0C2 0x72E1 # <CJK>
+0xE0C3 0x72F9 # <CJK>
+0xE0C4 0x72F7 # <CJK>
+0xE0C5 0x500F # <CJK>
+0xE0C6 0x7317 # <CJK>
+0xE0C7 0x730A # <CJK>
+0xE0C8 0x731C # <CJK>
+0xE0C9 0x7316 # <CJK>
+0xE0CA 0x731D # <CJK>
+0xE0CB 0x7334 # <CJK>
+0xE0CC 0x732F # <CJK>
+0xE0CD 0x7329 # <CJK>
+0xE0CE 0x7325 # <CJK>
+0xE0CF 0x733E # <CJK>
+0xE0D0 0x734E # <CJK>
+0xE0D1 0x734F # <CJK>
+0xE0D2 0x9ED8 # <CJK>
+0xE0D3 0x7357 # <CJK>
+0xE0D4 0x736A # <CJK>
+0xE0D5 0x7368 # <CJK>
+0xE0D6 0x7370 # <CJK>
+0xE0D7 0x7378 # <CJK>
+0xE0D8 0x7375 # <CJK>
+0xE0D9 0x737B # <CJK>
+0xE0DA 0x737A # <CJK>
+0xE0DB 0x73C8 # <CJK>
+0xE0DC 0x73B3 # <CJK>
+0xE0DD 0x73CE # <CJK>
+0xE0DE 0x73BB # <CJK>
+0xE0DF 0x73C0 # <CJK>
+0xE0E0 0x73E5 # <CJK>
+0xE0E1 0x73EE # <CJK>
+0xE0E2 0x73DE # <CJK>
+0xE0E3 0x74A2 # <CJK>
+0xE0E4 0x7405 # <CJK>
+0xE0E5 0x746F # <CJK>
+0xE0E6 0x7425 # <CJK>
+0xE0E7 0x73F8 # <CJK>
+0xE0E8 0x7432 # <CJK>
+0xE0E9 0x743A # <CJK>
+0xE0EA 0x7455 # <CJK>
+0xE0EB 0x743F # <CJK>
+0xE0EC 0x745F # <CJK>
+0xE0ED 0x7459 # <CJK>
+0xE0EE 0x7441 # <CJK>
+0xE0EF 0x745C # <CJK>
+0xE0F0 0x7469 # <CJK>
+0xE0F1 0x7470 # <CJK>
+0xE0F2 0x7463 # <CJK>
+0xE0F3 0x746A # <CJK>
+0xE0F4 0x7476 # <CJK>
+0xE0F5 0x747E # <CJK>
+0xE0F6 0x748B # <CJK>
+0xE0F7 0x749E # <CJK>
+0xE0F8 0x74A7 # <CJK>
+0xE0F9 0x74CA # <CJK>
+0xE0FA 0x74CF # <CJK>
+0xE0FB 0x74D4 # <CJK>
+0xE0FC 0x73F1 # <CJK>
+0xE140 0x74E0 # <CJK>
+0xE141 0x74E3 # <CJK>
+0xE142 0x74E7 # <CJK>
+0xE143 0x74E9 # <CJK>
+0xE144 0x74EE # <CJK>
+0xE145 0x74F2 # <CJK>
+0xE146 0x74F0 # <CJK>
+0xE147 0x74F1 # <CJK>
+0xE148 0x74F8 # <CJK>
+0xE149 0x74F7 # <CJK>
+0xE14A 0x7504 # <CJK>
+0xE14B 0x7503 # <CJK>
+0xE14C 0x7505 # <CJK>
+0xE14D 0x750C # <CJK>
+0xE14E 0x750E # <CJK>
+0xE14F 0x750D # <CJK>
+0xE150 0x7515 # <CJK>
+0xE151 0x7513 # <CJK>
+0xE152 0x751E # <CJK>
+0xE153 0x7526 # <CJK>
+0xE154 0x752C # <CJK>
+0xE155 0x753C # <CJK>
+0xE156 0x7544 # <CJK>
+0xE157 0x754D # <CJK>
+0xE158 0x754A # <CJK>
+0xE159 0x7549 # <CJK>
+0xE15A 0x755B # <CJK>
+0xE15B 0x7546 # <CJK>
+0xE15C 0x755A # <CJK>
+0xE15D 0x7569 # <CJK>
+0xE15E 0x7564 # <CJK>
+0xE15F 0x7567 # <CJK>
+0xE160 0x756B # <CJK>
+0xE161 0x756D # <CJK>
+0xE162 0x7578 # <CJK>
+0xE163 0x7576 # <CJK>
+0xE164 0x7586 # <CJK>
+0xE165 0x7587 # <CJK>
+0xE166 0x7574 # <CJK>
+0xE167 0x758A # <CJK>
+0xE168 0x7589 # <CJK>
+0xE169 0x7582 # <CJK>
+0xE16A 0x7594 # <CJK>
+0xE16B 0x759A # <CJK>
+0xE16C 0x759D # <CJK>
+0xE16D 0x75A5 # <CJK>
+0xE16E 0x75A3 # <CJK>
+0xE16F 0x75C2 # <CJK>
+0xE170 0x75B3 # <CJK>
+0xE171 0x75C3 # <CJK>
+0xE172 0x75B5 # <CJK>
+0xE173 0x75BD # <CJK>
+0xE174 0x75B8 # <CJK>
+0xE175 0x75BC # <CJK>
+0xE176 0x75B1 # <CJK>
+0xE177 0x75CD # <CJK>
+0xE178 0x75CA # <CJK>
+0xE179 0x75D2 # <CJK>
+0xE17A 0x75D9 # <CJK>
+0xE17B 0x75E3 # <CJK>
+0xE17C 0x75DE # <CJK>
+0xE17D 0x75FE # <CJK>
+0xE17E 0x75FF # <CJK>
+0xE180 0x75FC # <CJK>
+0xE181 0x7601 # <CJK>
+0xE182 0x75F0 # <CJK>
+0xE183 0x75FA # <CJK>
+0xE184 0x75F2 # <CJK>
+0xE185 0x75F3 # <CJK>
+0xE186 0x760B # <CJK>
+0xE187 0x760D # <CJK>
+0xE188 0x7609 # <CJK>
+0xE189 0x761F # <CJK>
+0xE18A 0x7627 # <CJK>
+0xE18B 0x7620 # <CJK>
+0xE18C 0x7621 # <CJK>
+0xE18D 0x7622 # <CJK>
+0xE18E 0x7624 # <CJK>
+0xE18F 0x7634 # <CJK>
+0xE190 0x7630 # <CJK>
+0xE191 0x763B # <CJK>
+0xE192 0x7647 # <CJK>
+0xE193 0x7648 # <CJK>
+0xE194 0x7646 # <CJK>
+0xE195 0x765C # <CJK>
+0xE196 0x7658 # <CJK>
+0xE197 0x7661 # <CJK>
+0xE198 0x7662 # <CJK>
+0xE199 0x7668 # <CJK>
+0xE19A 0x7669 # <CJK>
+0xE19B 0x766A # <CJK>
+0xE19C 0x7667 # <CJK>
+0xE19D 0x766C # <CJK>
+0xE19E 0x7670 # <CJK>
+0xE19F 0x7672 # <CJK>
+0xE1A0 0x7676 # <CJK>
+0xE1A1 0x7678 # <CJK>
+0xE1A2 0x767C # <CJK>
+0xE1A3 0x7680 # <CJK>
+0xE1A4 0x7683 # <CJK>
+0xE1A5 0x7688 # <CJK>
+0xE1A6 0x768B # <CJK>
+0xE1A7 0x768E # <CJK>
+0xE1A8 0x7696 # <CJK>
+0xE1A9 0x7693 # <CJK>
+0xE1AA 0x7699 # <CJK>
+0xE1AB 0x769A # <CJK>
+0xE1AC 0x76B0 # <CJK>
+0xE1AD 0x76B4 # <CJK>
+0xE1AE 0x76B8 # <CJK>
+0xE1AF 0x76B9 # <CJK>
+0xE1B0 0x76BA # <CJK>
+0xE1B1 0x76C2 # <CJK>
+0xE1B2 0x76CD # <CJK>
+0xE1B3 0x76D6 # <CJK>
+0xE1B4 0x76D2 # <CJK>
+0xE1B5 0x76DE # <CJK>
+0xE1B6 0x76E1 # <CJK>
+0xE1B7 0x76E5 # <CJK>
+0xE1B8 0x76E7 # <CJK>
+0xE1B9 0x76EA # <CJK>
+0xE1BA 0x862F # <CJK>
+0xE1BB 0x76FB # <CJK>
+0xE1BC 0x7708 # <CJK>
+0xE1BD 0x7707 # <CJK>
+0xE1BE 0x7704 # <CJK>
+0xE1BF 0x7729 # <CJK>
+0xE1C0 0x7724 # <CJK>
+0xE1C1 0x771E # <CJK>
+0xE1C2 0x7725 # <CJK>
+0xE1C3 0x7726 # <CJK>
+0xE1C4 0x771B # <CJK>
+0xE1C5 0x7737 # <CJK>
+0xE1C6 0x7738 # <CJK>
+0xE1C7 0x7747 # <CJK>
+0xE1C8 0x775A # <CJK>
+0xE1C9 0x7768 # <CJK>
+0xE1CA 0x776B # <CJK>
+0xE1CB 0x775B # <CJK>
+0xE1CC 0x7765 # <CJK>
+0xE1CD 0x777F # <CJK>
+0xE1CE 0x777E # <CJK>
+0xE1CF 0x7779 # <CJK>
+0xE1D0 0x778E # <CJK>
+0xE1D1 0x778B # <CJK>
+0xE1D2 0x7791 # <CJK>
+0xE1D3 0x77A0 # <CJK>
+0xE1D4 0x779E # <CJK>
+0xE1D5 0x77B0 # <CJK>
+0xE1D6 0x77B6 # <CJK>
+0xE1D7 0x77B9 # <CJK>
+0xE1D8 0x77BF # <CJK>
+0xE1D9 0x77BC # <CJK>
+0xE1DA 0x77BD # <CJK>
+0xE1DB 0x77BB # <CJK>
+0xE1DC 0x77C7 # <CJK>
+0xE1DD 0x77CD # <CJK>
+0xE1DE 0x77D7 # <CJK>
+0xE1DF 0x77DA # <CJK>
+0xE1E0 0x77DC # <CJK>
+0xE1E1 0x77E3 # <CJK>
+0xE1E2 0x77EE # <CJK>
+0xE1E3 0x77FC # <CJK>
+0xE1E4 0x780C # <CJK>
+0xE1E5 0x7812 # <CJK>
+0xE1E6 0x7926 # <CJK>
+0xE1E7 0x7820 # <CJK>
+0xE1E8 0x792A # <CJK>
+0xE1E9 0x7845 # <CJK>
+0xE1EA 0x788E # <CJK>
+0xE1EB 0x7874 # <CJK>
+0xE1EC 0x7886 # <CJK>
+0xE1ED 0x787C # <CJK>
+0xE1EE 0x789A # <CJK>
+0xE1EF 0x788C # <CJK>
+0xE1F0 0x78A3 # <CJK>
+0xE1F1 0x78B5 # <CJK>
+0xE1F2 0x78AA # <CJK>
+0xE1F3 0x78AF # <CJK>
+0xE1F4 0x78D1 # <CJK>
+0xE1F5 0x78C6 # <CJK>
+0xE1F6 0x78CB # <CJK>
+0xE1F7 0x78D4 # <CJK>
+0xE1F8 0x78BE # <CJK>
+0xE1F9 0x78BC # <CJK>
+0xE1FA 0x78C5 # <CJK>
+0xE1FB 0x78CA # <CJK>
+0xE1FC 0x78EC # <CJK>
+0xE240 0x78E7 # <CJK>
+0xE241 0x78DA # <CJK>
+0xE242 0x78FD # <CJK>
+0xE243 0x78F4 # <CJK>
+0xE244 0x7907 # <CJK>
+0xE245 0x7912 # <CJK>
+0xE246 0x7911 # <CJK>
+0xE247 0x7919 # <CJK>
+0xE248 0x792C # <CJK>
+0xE249 0x792B # <CJK>
+0xE24A 0x7940 # <CJK>
+0xE24B 0x7960 # <CJK>
+0xE24C 0x7957 # <CJK>
+0xE24D 0x795F # <CJK>
+0xE24E 0x795A # <CJK>
+0xE24F 0x7955 # <CJK>
+0xE250 0x7953 # <CJK>
+0xE251 0x797A # <CJK>
+0xE252 0x797F # <CJK>
+0xE253 0x798A # <CJK>
+0xE254 0x799D # <CJK>
+0xE255 0x79A7 # <CJK>
+0xE256 0x9F4B # <CJK>
+0xE257 0x79AA # <CJK>
+0xE258 0x79AE # <CJK>
+0xE259 0x79B3 # <CJK>
+0xE25A 0x79B9 # <CJK>
+0xE25B 0x79BA # <CJK>
+0xE25C 0x79C9 # <CJK>
+0xE25D 0x79D5 # <CJK>
+0xE25E 0x79E7 # <CJK>
+0xE25F 0x79EC # <CJK>
+0xE260 0x79E1 # <CJK>
+0xE261 0x79E3 # <CJK>
+0xE262 0x7A08 # <CJK>
+0xE263 0x7A0D # <CJK>
+0xE264 0x7A18 # <CJK>
+0xE265 0x7A19 # <CJK>
+0xE266 0x7A20 # <CJK>
+0xE267 0x7A1F # <CJK>
+0xE268 0x7980 # <CJK>
+0xE269 0x7A31 # <CJK>
+0xE26A 0x7A3B # <CJK>
+0xE26B 0x7A3E # <CJK>
+0xE26C 0x7A37 # <CJK>
+0xE26D 0x7A43 # <CJK>
+0xE26E 0x7A57 # <CJK>
+0xE26F 0x7A49 # <CJK>
+0xE270 0x7A61 # <CJK>
+0xE271 0x7A62 # <CJK>
+0xE272 0x7A69 # <CJK>
+0xE273 0x9F9D # <CJK>
+0xE274 0x7A70 # <CJK>
+0xE275 0x7A79 # <CJK>
+0xE276 0x7A7D # <CJK>
+0xE277 0x7A88 # <CJK>
+0xE278 0x7A97 # <CJK>
+0xE279 0x7A95 # <CJK>
+0xE27A 0x7A98 # <CJK>
+0xE27B 0x7A96 # <CJK>
+0xE27C 0x7AA9 # <CJK>
+0xE27D 0x7AC8 # <CJK>
+0xE27E 0x7AB0 # <CJK>
+0xE280 0x7AB6 # <CJK>
+0xE281 0x7AC5 # <CJK>
+0xE282 0x7AC4 # <CJK>
+0xE283 0x7ABF # <CJK>
+0xE284 0x9083 # <CJK>
+0xE285 0x7AC7 # <CJK>
+0xE286 0x7ACA # <CJK>
+0xE287 0x7ACD # <CJK>
+0xE288 0x7ACF # <CJK>
+0xE289 0x7AD5 # <CJK>
+0xE28A 0x7AD3 # <CJK>
+0xE28B 0x7AD9 # <CJK>
+0xE28C 0x7ADA # <CJK>
+0xE28D 0x7ADD # <CJK>
+0xE28E 0x7AE1 # <CJK>
+0xE28F 0x7AE2 # <CJK>
+0xE290 0x7AE6 # <CJK>
+0xE291 0x7AED # <CJK>
+0xE292 0x7AF0 # <CJK>
+0xE293 0x7B02 # <CJK>
+0xE294 0x7B0F # <CJK>
+0xE295 0x7B0A # <CJK>
+0xE296 0x7B06 # <CJK>
+0xE297 0x7B33 # <CJK>
+0xE298 0x7B18 # <CJK>
+0xE299 0x7B19 # <CJK>
+0xE29A 0x7B1E # <CJK>
+0xE29B 0x7B35 # <CJK>
+0xE29C 0x7B28 # <CJK>
+0xE29D 0x7B36 # <CJK>
+0xE29E 0x7B50 # <CJK>
+0xE29F 0x7B7A # <CJK>
+0xE2A0 0x7B04 # <CJK>
+0xE2A1 0x7B4D # <CJK>
+0xE2A2 0x7B0B # <CJK>
+0xE2A3 0x7B4C # <CJK>
+0xE2A4 0x7B45 # <CJK>
+0xE2A5 0x7B75 # <CJK>
+0xE2A6 0x7B65 # <CJK>
+0xE2A7 0x7B74 # <CJK>
+0xE2A8 0x7B67 # <CJK>
+0xE2A9 0x7B70 # <CJK>
+0xE2AA 0x7B71 # <CJK>
+0xE2AB 0x7B6C # <CJK>
+0xE2AC 0x7B6E # <CJK>
+0xE2AD 0x7B9D # <CJK>
+0xE2AE 0x7B98 # <CJK>
+0xE2AF 0x7B9F # <CJK>
+0xE2B0 0x7B8D # <CJK>
+0xE2B1 0x7B9C # <CJK>
+0xE2B2 0x7B9A # <CJK>
+0xE2B3 0x7B8B # <CJK>
+0xE2B4 0x7B92 # <CJK>
+0xE2B5 0x7B8F # <CJK>
+0xE2B6 0x7B5D # <CJK>
+0xE2B7 0x7B99 # <CJK>
+0xE2B8 0x7BCB # <CJK>
+0xE2B9 0x7BC1 # <CJK>
+0xE2BA 0x7BCC # <CJK>
+0xE2BB 0x7BCF # <CJK>
+0xE2BC 0x7BB4 # <CJK>
+0xE2BD 0x7BC6 # <CJK>
+0xE2BE 0x7BDD # <CJK>
+0xE2BF 0x7BE9 # <CJK>
+0xE2C0 0x7C11 # <CJK>
+0xE2C1 0x7C14 # <CJK>
+0xE2C2 0x7BE6 # <CJK>
+0xE2C3 0x7BE5 # <CJK>
+0xE2C4 0x7C60 # <CJK>
+0xE2C5 0x7C00 # <CJK>
+0xE2C6 0x7C07 # <CJK>
+0xE2C7 0x7C13 # <CJK>
+0xE2C8 0x7BF3 # <CJK>
+0xE2C9 0x7BF7 # <CJK>
+0xE2CA 0x7C17 # <CJK>
+0xE2CB 0x7C0D # <CJK>
+0xE2CC 0x7BF6 # <CJK>
+0xE2CD 0x7C23 # <CJK>
+0xE2CE 0x7C27 # <CJK>
+0xE2CF 0x7C2A # <CJK>
+0xE2D0 0x7C1F # <CJK>
+0xE2D1 0x7C37 # <CJK>
+0xE2D2 0x7C2B # <CJK>
+0xE2D3 0x7C3D # <CJK>
+0xE2D4 0x7C4C # <CJK>
+0xE2D5 0x7C43 # <CJK>
+0xE2D6 0x7C54 # <CJK>
+0xE2D7 0x7C4F # <CJK>
+0xE2D8 0x7C40 # <CJK>
+0xE2D9 0x7C50 # <CJK>
+0xE2DA 0x7C58 # <CJK>
+0xE2DB 0x7C5F # <CJK>
+0xE2DC 0x7C64 # <CJK>
+0xE2DD 0x7C56 # <CJK>
+0xE2DE 0x7C65 # <CJK>
+0xE2DF 0x7C6C # <CJK>
+0xE2E0 0x7C75 # <CJK>
+0xE2E1 0x7C83 # <CJK>
+0xE2E2 0x7C90 # <CJK>
+0xE2E3 0x7CA4 # <CJK>
+0xE2E4 0x7CAD # <CJK>
+0xE2E5 0x7CA2 # <CJK>
+0xE2E6 0x7CAB # <CJK>
+0xE2E7 0x7CA1 # <CJK>
+0xE2E8 0x7CA8 # <CJK>
+0xE2E9 0x7CB3 # <CJK>
+0xE2EA 0x7CB2 # <CJK>
+0xE2EB 0x7CB1 # <CJK>
+0xE2EC 0x7CAE # <CJK>
+0xE2ED 0x7CB9 # <CJK>
+0xE2EE 0x7CBD # <CJK>
+0xE2EF 0x7CC0 # <CJK>
+0xE2F0 0x7CC5 # <CJK>
+0xE2F1 0x7CC2 # <CJK>
+0xE2F2 0x7CD8 # <CJK>
+0xE2F3 0x7CD2 # <CJK>
+0xE2F4 0x7CDC # <CJK>
+0xE2F5 0x7CE2 # <CJK>
+0xE2F6 0x9B3B # <CJK>
+0xE2F7 0x7CEF # <CJK>
+0xE2F8 0x7CF2 # <CJK>
+0xE2F9 0x7CF4 # <CJK>
+0xE2FA 0x7CF6 # <CJK>
+0xE2FB 0x7CFA # <CJK>
+0xE2FC 0x7D06 # <CJK>
+0xE340 0x7D02 # <CJK>
+0xE341 0x7D1C # <CJK>
+0xE342 0x7D15 # <CJK>
+0xE343 0x7D0A # <CJK>
+0xE344 0x7D45 # <CJK>
+0xE345 0x7D4B # <CJK>
+0xE346 0x7D2E # <CJK>
+0xE347 0x7D32 # <CJK>
+0xE348 0x7D3F # <CJK>
+0xE349 0x7D35 # <CJK>
+0xE34A 0x7D46 # <CJK>
+0xE34B 0x7D73 # <CJK>
+0xE34C 0x7D56 # <CJK>
+0xE34D 0x7D4E # <CJK>
+0xE34E 0x7D72 # <CJK>
+0xE34F 0x7D68 # <CJK>
+0xE350 0x7D6E # <CJK>
+0xE351 0x7D4F # <CJK>
+0xE352 0x7D63 # <CJK>
+0xE353 0x7D93 # <CJK>
+0xE354 0x7D89 # <CJK>
+0xE355 0x7D5B # <CJK>
+0xE356 0x7D8F # <CJK>
+0xE357 0x7D7D # <CJK>
+0xE358 0x7D9B # <CJK>
+0xE359 0x7DBA # <CJK>
+0xE35A 0x7DAE # <CJK>
+0xE35B 0x7DA3 # <CJK>
+0xE35C 0x7DB5 # <CJK>
+0xE35D 0x7DC7 # <CJK>
+0xE35E 0x7DBD # <CJK>
+0xE35F 0x7DAB # <CJK>
+0xE360 0x7E3D # <CJK>
+0xE361 0x7DA2 # <CJK>
+0xE362 0x7DAF # <CJK>
+0xE363 0x7DDC # <CJK>
+0xE364 0x7DB8 # <CJK>
+0xE365 0x7D9F # <CJK>
+0xE366 0x7DB0 # <CJK>
+0xE367 0x7DD8 # <CJK>
+0xE368 0x7DDD # <CJK>
+0xE369 0x7DE4 # <CJK>
+0xE36A 0x7DDE # <CJK>
+0xE36B 0x7DFB # <CJK>
+0xE36C 0x7DF2 # <CJK>
+0xE36D 0x7DE1 # <CJK>
+0xE36E 0x7E05 # <CJK>
+0xE36F 0x7E0A # <CJK>
+0xE370 0x7E23 # <CJK>
+0xE371 0x7E21 # <CJK>
+0xE372 0x7E12 # <CJK>
+0xE373 0x7E31 # <CJK>
+0xE374 0x7E1F # <CJK>
+0xE375 0x7E09 # <CJK>
+0xE376 0x7E0B # <CJK>
+0xE377 0x7E22 # <CJK>
+0xE378 0x7E46 # <CJK>
+0xE379 0x7E66 # <CJK>
+0xE37A 0x7E3B # <CJK>
+0xE37B 0x7E35 # <CJK>
+0xE37C 0x7E39 # <CJK>
+0xE37D 0x7E43 # <CJK>
+0xE37E 0x7E37 # <CJK>
+0xE380 0x7E32 # <CJK>
+0xE381 0x7E3A # <CJK>
+0xE382 0x7E67 # <CJK>
+0xE383 0x7E5D # <CJK>
+0xE384 0x7E56 # <CJK>
+0xE385 0x7E5E # <CJK>
+0xE386 0x7E59 # <CJK>
+0xE387 0x7E5A # <CJK>
+0xE388 0x7E79 # <CJK>
+0xE389 0x7E6A # <CJK>
+0xE38A 0x7E69 # <CJK>
+0xE38B 0x7E7C # <CJK>
+0xE38C 0x7E7B # <CJK>
+0xE38D 0x7E83 # <CJK>
+0xE38E 0x7DD5 # <CJK>
+0xE38F 0x7E7D # <CJK>
+0xE390 0x8FAE # <CJK>
+0xE391 0x7E7F # <CJK>
+0xE392 0x7E88 # <CJK>
+0xE393 0x7E89 # <CJK>
+0xE394 0x7E8C # <CJK>
+0xE395 0x7E92 # <CJK>
+0xE396 0x7E90 # <CJK>
+0xE397 0x7E93 # <CJK>
+0xE398 0x7E94 # <CJK>
+0xE399 0x7E96 # <CJK>
+0xE39A 0x7E8E # <CJK>
+0xE39B 0x7E9B # <CJK>
+0xE39C 0x7E9C # <CJK>
+0xE39D 0x7F38 # <CJK>
+0xE39E 0x7F3A # <CJK>
+0xE39F 0x7F45 # <CJK>
+0xE3A0 0x7F4C # <CJK>
+0xE3A1 0x7F4D # <CJK>
+0xE3A2 0x7F4E # <CJK>
+0xE3A3 0x7F50 # <CJK>
+0xE3A4 0x7F51 # <CJK>
+0xE3A5 0x7F55 # <CJK>
+0xE3A6 0x7F54 # <CJK>
+0xE3A7 0x7F58 # <CJK>
+0xE3A8 0x7F5F # <CJK>
+0xE3A9 0x7F60 # <CJK>
+0xE3AA 0x7F68 # <CJK>
+0xE3AB 0x7F69 # <CJK>
+0xE3AC 0x7F67 # <CJK>
+0xE3AD 0x7F78 # <CJK>
+0xE3AE 0x7F82 # <CJK>
+0xE3AF 0x7F86 # <CJK>
+0xE3B0 0x7F83 # <CJK>
+0xE3B1 0x7F88 # <CJK>
+0xE3B2 0x7F87 # <CJK>
+0xE3B3 0x7F8C # <CJK>
+0xE3B4 0x7F94 # <CJK>
+0xE3B5 0x7F9E # <CJK>
+0xE3B6 0x7F9D # <CJK>
+0xE3B7 0x7F9A # <CJK>
+0xE3B8 0x7FA3 # <CJK>
+0xE3B9 0x7FAF # <CJK>
+0xE3BA 0x7FB2 # <CJK>
+0xE3BB 0x7FB9 # <CJK>
+0xE3BC 0x7FAE # <CJK>
+0xE3BD 0x7FB6 # <CJK>
+0xE3BE 0x7FB8 # <CJK>
+0xE3BF 0x8B71 # <CJK>
+0xE3C0 0x7FC5 # <CJK>
+0xE3C1 0x7FC6 # <CJK>
+0xE3C2 0x7FCA # <CJK>
+0xE3C3 0x7FD5 # <CJK>
+0xE3C4 0x7FD4 # <CJK>
+0xE3C5 0x7FE1 # <CJK>
+0xE3C6 0x7FE6 # <CJK>
+0xE3C7 0x7FE9 # <CJK>
+0xE3C8 0x7FF3 # <CJK>
+0xE3C9 0x7FF9 # <CJK>
+0xE3CA 0x98DC # <CJK>
+0xE3CB 0x8006 # <CJK>
+0xE3CC 0x8004 # <CJK>
+0xE3CD 0x800B # <CJK>
+0xE3CE 0x8012 # <CJK>
+0xE3CF 0x8018 # <CJK>
+0xE3D0 0x8019 # <CJK>
+0xE3D1 0x801C # <CJK>
+0xE3D2 0x8021 # <CJK>
+0xE3D3 0x8028 # <CJK>
+0xE3D4 0x803F # <CJK>
+0xE3D5 0x803B # <CJK>
+0xE3D6 0x804A # <CJK>
+0xE3D7 0x8046 # <CJK>
+0xE3D8 0x8052 # <CJK>
+0xE3D9 0x8058 # <CJK>
+0xE3DA 0x805A # <CJK>
+0xE3DB 0x805F # <CJK>
+0xE3DC 0x8062 # <CJK>
+0xE3DD 0x8068 # <CJK>
+0xE3DE 0x8073 # <CJK>
+0xE3DF 0x8072 # <CJK>
+0xE3E0 0x8070 # <CJK>
+0xE3E1 0x8076 # <CJK>
+0xE3E2 0x8079 # <CJK>
+0xE3E3 0x807D # <CJK>
+0xE3E4 0x807F # <CJK>
+0xE3E5 0x8084 # <CJK>
+0xE3E6 0x8086 # <CJK>
+0xE3E7 0x8085 # <CJK>
+0xE3E8 0x809B # <CJK>
+0xE3E9 0x8093 # <CJK>
+0xE3EA 0x809A # <CJK>
+0xE3EB 0x80AD # <CJK>
+0xE3EC 0x5190 # <CJK>
+0xE3ED 0x80AC # <CJK>
+0xE3EE 0x80DB # <CJK>
+0xE3EF 0x80E5 # <CJK>
+0xE3F0 0x80D9 # <CJK>
+0xE3F1 0x80DD # <CJK>
+0xE3F2 0x80C4 # <CJK>
+0xE3F3 0x80DA # <CJK>
+0xE3F4 0x80D6 # <CJK>
+0xE3F5 0x8109 # <CJK>
+0xE3F6 0x80EF # <CJK>
+0xE3F7 0x80F1 # <CJK>
+0xE3F8 0x811B # <CJK>
+0xE3F9 0x8129 # <CJK>
+0xE3FA 0x8123 # <CJK>
+0xE3FB 0x812F # <CJK>
+0xE3FC 0x814B # <CJK>
+0xE440 0x968B # <CJK>
+0xE441 0x8146 # <CJK>
+0xE442 0x813E # <CJK>
+0xE443 0x8153 # <CJK>
+0xE444 0x8151 # <CJK>
+0xE445 0x80FC # <CJK>
+0xE446 0x8171 # <CJK>
+0xE447 0x816E # <CJK>
+0xE448 0x8165 # <CJK>
+0xE449 0x8166 # <CJK>
+0xE44A 0x8174 # <CJK>
+0xE44B 0x8183 # <CJK>
+0xE44C 0x8188 # <CJK>
+0xE44D 0x818A # <CJK>
+0xE44E 0x8180 # <CJK>
+0xE44F 0x8182 # <CJK>
+0xE450 0x81A0 # <CJK>
+0xE451 0x8195 # <CJK>
+0xE452 0x81A4 # <CJK>
+0xE453 0x81A3 # <CJK>
+0xE454 0x815F # <CJK>
+0xE455 0x8193 # <CJK>
+0xE456 0x81A9 # <CJK>
+0xE457 0x81B0 # <CJK>
+0xE458 0x81B5 # <CJK>
+0xE459 0x81BE # <CJK>
+0xE45A 0x81B8 # <CJK>
+0xE45B 0x81BD # <CJK>
+0xE45C 0x81C0 # <CJK>
+0xE45D 0x81C2 # <CJK>
+0xE45E 0x81BA # <CJK>
+0xE45F 0x81C9 # <CJK>
+0xE460 0x81CD # <CJK>
+0xE461 0x81D1 # <CJK>
+0xE462 0x81D9 # <CJK>
+0xE463 0x81D8 # <CJK>
+0xE464 0x81C8 # <CJK>
+0xE465 0x81DA # <CJK>
+0xE466 0x81DF # <CJK>
+0xE467 0x81E0 # <CJK>
+0xE468 0x81E7 # <CJK>
+0xE469 0x81FA # <CJK>
+0xE46A 0x81FB # <CJK>
+0xE46B 0x81FE # <CJK>
+0xE46C 0x8201 # <CJK>
+0xE46D 0x8202 # <CJK>
+0xE46E 0x8205 # <CJK>
+0xE46F 0x8207 # <CJK>
+0xE470 0x820A # <CJK>
+0xE471 0x820D # <CJK>
+0xE472 0x8210 # <CJK>
+0xE473 0x8216 # <CJK>
+0xE474 0x8229 # <CJK>
+0xE475 0x822B # <CJK>
+0xE476 0x8238 # <CJK>
+0xE477 0x8233 # <CJK>
+0xE478 0x8240 # <CJK>
+0xE479 0x8259 # <CJK>
+0xE47A 0x8258 # <CJK>
+0xE47B 0x825D # <CJK>
+0xE47C 0x825A # <CJK>
+0xE47D 0x825F # <CJK>
+0xE47E 0x8264 # <CJK>
+0xE480 0x8262 # <CJK>
+0xE481 0x8268 # <CJK>
+0xE482 0x826A # <CJK>
+0xE483 0x826B # <CJK>
+0xE484 0x822E # <CJK>
+0xE485 0x8271 # <CJK>
+0xE486 0x8277 # <CJK>
+0xE487 0x8278 # <CJK>
+0xE488 0x827E # <CJK>
+0xE489 0x828D # <CJK>
+0xE48A 0x8292 # <CJK>
+0xE48B 0x82AB # <CJK>
+0xE48C 0x829F # <CJK>
+0xE48D 0x82BB # <CJK>
+0xE48E 0x82AC # <CJK>
+0xE48F 0x82E1 # <CJK>
+0xE490 0x82E3 # <CJK>
+0xE491 0x82DF # <CJK>
+0xE492 0x82D2 # <CJK>
+0xE493 0x82F4 # <CJK>
+0xE494 0x82F3 # <CJK>
+0xE495 0x82FA # <CJK>
+0xE496 0x8393 # <CJK>
+0xE497 0x8303 # <CJK>
+0xE498 0x82FB # <CJK>
+0xE499 0x82F9 # <CJK>
+0xE49A 0x82DE # <CJK>
+0xE49B 0x8306 # <CJK>
+0xE49C 0x82DC # <CJK>
+0xE49D 0x8309 # <CJK>
+0xE49E 0x82D9 # <CJK>
+0xE49F 0x8335 # <CJK>
+0xE4A0 0x8334 # <CJK>
+0xE4A1 0x8316 # <CJK>
+0xE4A2 0x8332 # <CJK>
+0xE4A3 0x8331 # <CJK>
+0xE4A4 0x8340 # <CJK>
+0xE4A5 0x8339 # <CJK>
+0xE4A6 0x8350 # <CJK>
+0xE4A7 0x8345 # <CJK>
+0xE4A8 0x832F # <CJK>
+0xE4A9 0x832B # <CJK>
+0xE4AA 0x8317 # <CJK>
+0xE4AB 0x8318 # <CJK>
+0xE4AC 0x8385 # <CJK>
+0xE4AD 0x839A # <CJK>
+0xE4AE 0x83AA # <CJK>
+0xE4AF 0x839F # <CJK>
+0xE4B0 0x83A2 # <CJK>
+0xE4B1 0x8396 # <CJK>
+0xE4B2 0x8323 # <CJK>
+0xE4B3 0x838E # <CJK>
+0xE4B4 0x8387 # <CJK>
+0xE4B5 0x838A # <CJK>
+0xE4B6 0x837C # <CJK>
+0xE4B7 0x83B5 # <CJK>
+0xE4B8 0x8373 # <CJK>
+0xE4B9 0x8375 # <CJK>
+0xE4BA 0x83A0 # <CJK>
+0xE4BB 0x8389 # <CJK>
+0xE4BC 0x83A8 # <CJK>
+0xE4BD 0x83F4 # <CJK>
+0xE4BE 0x8413 # <CJK>
+0xE4BF 0x83EB # <CJK>
+0xE4C0 0x83CE # <CJK>
+0xE4C1 0x83FD # <CJK>
+0xE4C2 0x8403 # <CJK>
+0xE4C3 0x83D8 # <CJK>
+0xE4C4 0x840B # <CJK>
+0xE4C5 0x83C1 # <CJK>
+0xE4C6 0x83F7 # <CJK>
+0xE4C7 0x8407 # <CJK>
+0xE4C8 0x83E0 # <CJK>
+0xE4C9 0x83F2 # <CJK>
+0xE4CA 0x840D # <CJK>
+0xE4CB 0x8422 # <CJK>
+0xE4CC 0x8420 # <CJK>
+0xE4CD 0x83BD # <CJK>
+0xE4CE 0x8438 # <CJK>
+0xE4CF 0x8506 # <CJK>
+0xE4D0 0x83FB # <CJK>
+0xE4D1 0x846D # <CJK>
+0xE4D2 0x842A # <CJK>
+0xE4D3 0x843C # <CJK>
+0xE4D4 0x855A # <CJK>
+0xE4D5 0x8484 # <CJK>
+0xE4D6 0x8477 # <CJK>
+0xE4D7 0x846B # <CJK>
+0xE4D8 0x84AD # <CJK>
+0xE4D9 0x846E # <CJK>
+0xE4DA 0x8482 # <CJK>
+0xE4DB 0x8469 # <CJK>
+0xE4DC 0x8446 # <CJK>
+0xE4DD 0x842C # <CJK>
+0xE4DE 0x846F # <CJK>
+0xE4DF 0x8479 # <CJK>
+0xE4E0 0x8435 # <CJK>
+0xE4E1 0x84CA # <CJK>
+0xE4E2 0x8462 # <CJK>
+0xE4E3 0x84B9 # <CJK>
+0xE4E4 0x84BF # <CJK>
+0xE4E5 0x849F # <CJK>
+0xE4E6 0x84D9 # <CJK>
+0xE4E7 0x84CD # <CJK>
+0xE4E8 0x84BB # <CJK>
+0xE4E9 0x84DA # <CJK>
+0xE4EA 0x84D0 # <CJK>
+0xE4EB 0x84C1 # <CJK>
+0xE4EC 0x84C6 # <CJK>
+0xE4ED 0x84D6 # <CJK>
+0xE4EE 0x84A1 # <CJK>
+0xE4EF 0x8521 # <CJK>
+0xE4F0 0x84FF # <CJK>
+0xE4F1 0x84F4 # <CJK>
+0xE4F2 0x8517 # <CJK>
+0xE4F3 0x8518 # <CJK>
+0xE4F4 0x852C # <CJK>
+0xE4F5 0x851F # <CJK>
+0xE4F6 0x8515 # <CJK>
+0xE4F7 0x8514 # <CJK>
+0xE4F8 0x84FC # <CJK>
+0xE4F9 0x8540 # <CJK>
+0xE4FA 0x8563 # <CJK>
+0xE4FB 0x8558 # <CJK>
+0xE4FC 0x8548 # <CJK>
+0xE540 0x8541 # <CJK>
+0xE541 0x8602 # <CJK>
+0xE542 0x854B # <CJK>
+0xE543 0x8555 # <CJK>
+0xE544 0x8580 # <CJK>
+0xE545 0x85A4 # <CJK>
+0xE546 0x8588 # <CJK>
+0xE547 0x8591 # <CJK>
+0xE548 0x858A # <CJK>
+0xE549 0x85A8 # <CJK>
+0xE54A 0x856D # <CJK>
+0xE54B 0x8594 # <CJK>
+0xE54C 0x859B # <CJK>
+0xE54D 0x85EA # <CJK>
+0xE54E 0x8587 # <CJK>
+0xE54F 0x859C # <CJK>
+0xE550 0x8577 # <CJK>
+0xE551 0x857E # <CJK>
+0xE552 0x8590 # <CJK>
+0xE553 0x85C9 # <CJK>
+0xE554 0x85BA # <CJK>
+0xE555 0x85CF # <CJK>
+0xE556 0x85B9 # <CJK>
+0xE557 0x85D0 # <CJK>
+0xE558 0x85D5 # <CJK>
+0xE559 0x85DD # <CJK>
+0xE55A 0x85E5 # <CJK>
+0xE55B 0x85DC # <CJK>
+0xE55C 0x85F9 # <CJK>
+0xE55D 0x860A # <CJK>
+0xE55E 0x8613 # <CJK>
+0xE55F 0x860B # <CJK>
+0xE560 0x85FE # <CJK>
+0xE561 0x85FA # <CJK>
+0xE562 0x8606 # <CJK>
+0xE563 0x8622 # <CJK>
+0xE564 0x861A # <CJK>
+0xE565 0x8630 # <CJK>
+0xE566 0x863F # <CJK>
+0xE567 0x864D # <CJK>
+0xE568 0x4E55 # <CJK>
+0xE569 0x8654 # <CJK>
+0xE56A 0x865F # <CJK>
+0xE56B 0x8667 # <CJK>
+0xE56C 0x8671 # <CJK>
+0xE56D 0x8693 # <CJK>
+0xE56E 0x86A3 # <CJK>
+0xE56F 0x86A9 # <CJK>
+0xE570 0x86AA # <CJK>
+0xE571 0x868B # <CJK>
+0xE572 0x868C # <CJK>
+0xE573 0x86B6 # <CJK>
+0xE574 0x86AF # <CJK>
+0xE575 0x86C4 # <CJK>
+0xE576 0x86C6 # <CJK>
+0xE577 0x86B0 # <CJK>
+0xE578 0x86C9 # <CJK>
+0xE579 0x8823 # <CJK>
+0xE57A 0x86AB # <CJK>
+0xE57B 0x86D4 # <CJK>
+0xE57C 0x86DE # <CJK>
+0xE57D 0x86E9 # <CJK>
+0xE57E 0x86EC # <CJK>
+0xE580 0x86DF # <CJK>
+0xE581 0x86DB # <CJK>
+0xE582 0x86EF # <CJK>
+0xE583 0x8712 # <CJK>
+0xE584 0x8706 # <CJK>
+0xE585 0x8708 # <CJK>
+0xE586 0x8700 # <CJK>
+0xE587 0x8703 # <CJK>
+0xE588 0x86FB # <CJK>
+0xE589 0x8711 # <CJK>
+0xE58A 0x8709 # <CJK>
+0xE58B 0x870D # <CJK>
+0xE58C 0x86F9 # <CJK>
+0xE58D 0x870A # <CJK>
+0xE58E 0x8734 # <CJK>
+0xE58F 0x873F # <CJK>
+0xE590 0x8737 # <CJK>
+0xE591 0x873B # <CJK>
+0xE592 0x8725 # <CJK>
+0xE593 0x8729 # <CJK>
+0xE594 0x871A # <CJK>
+0xE595 0x8760 # <CJK>
+0xE596 0x875F # <CJK>
+0xE597 0x8778 # <CJK>
+0xE598 0x874C # <CJK>
+0xE599 0x874E # <CJK>
+0xE59A 0x8774 # <CJK>
+0xE59B 0x8757 # <CJK>
+0xE59C 0x8768 # <CJK>
+0xE59D 0x876E # <CJK>
+0xE59E 0x8759 # <CJK>
+0xE59F 0x8753 # <CJK>
+0xE5A0 0x8763 # <CJK>
+0xE5A1 0x876A # <CJK>
+0xE5A2 0x8805 # <CJK>
+0xE5A3 0x87A2 # <CJK>
+0xE5A4 0x879F # <CJK>
+0xE5A5 0x8782 # <CJK>
+0xE5A6 0x87AF # <CJK>
+0xE5A7 0x87CB # <CJK>
+0xE5A8 0x87BD # <CJK>
+0xE5A9 0x87C0 # <CJK>
+0xE5AA 0x87D0 # <CJK>
+0xE5AB 0x96D6 # <CJK>
+0xE5AC 0x87AB # <CJK>
+0xE5AD 0x87C4 # <CJK>
+0xE5AE 0x87B3 # <CJK>
+0xE5AF 0x87C7 # <CJK>
+0xE5B0 0x87C6 # <CJK>
+0xE5B1 0x87BB # <CJK>
+0xE5B2 0x87EF # <CJK>
+0xE5B3 0x87F2 # <CJK>
+0xE5B4 0x87E0 # <CJK>
+0xE5B5 0x880F # <CJK>
+0xE5B6 0x880D # <CJK>
+0xE5B7 0x87FE # <CJK>
+0xE5B8 0x87F6 # <CJK>
+0xE5B9 0x87F7 # <CJK>
+0xE5BA 0x880E # <CJK>
+0xE5BB 0x87D2 # <CJK>
+0xE5BC 0x8811 # <CJK>
+0xE5BD 0x8816 # <CJK>
+0xE5BE 0x8815 # <CJK>
+0xE5BF 0x8822 # <CJK>
+0xE5C0 0x8821 # <CJK>
+0xE5C1 0x8831 # <CJK>
+0xE5C2 0x8836 # <CJK>
+0xE5C3 0x8839 # <CJK>
+0xE5C4 0x8827 # <CJK>
+0xE5C5 0x883B # <CJK>
+0xE5C6 0x8844 # <CJK>
+0xE5C7 0x8842 # <CJK>
+0xE5C8 0x8852 # <CJK>
+0xE5C9 0x8859 # <CJK>
+0xE5CA 0x885E # <CJK>
+0xE5CB 0x8862 # <CJK>
+0xE5CC 0x886B # <CJK>
+0xE5CD 0x8881 # <CJK>
+0xE5CE 0x887E # <CJK>
+0xE5CF 0x889E # <CJK>
+0xE5D0 0x8875 # <CJK>
+0xE5D1 0x887D # <CJK>
+0xE5D2 0x88B5 # <CJK>
+0xE5D3 0x8872 # <CJK>
+0xE5D4 0x8882 # <CJK>
+0xE5D5 0x8897 # <CJK>
+0xE5D6 0x8892 # <CJK>
+0xE5D7 0x88AE # <CJK>
+0xE5D8 0x8899 # <CJK>
+0xE5D9 0x88A2 # <CJK>
+0xE5DA 0x888D # <CJK>
+0xE5DB 0x88A4 # <CJK>
+0xE5DC 0x88B0 # <CJK>
+0xE5DD 0x88BF # <CJK>
+0xE5DE 0x88B1 # <CJK>
+0xE5DF 0x88C3 # <CJK>
+0xE5E0 0x88C4 # <CJK>
+0xE5E1 0x88D4 # <CJK>
+0xE5E2 0x88D8 # <CJK>
+0xE5E3 0x88D9 # <CJK>
+0xE5E4 0x88DD # <CJK>
+0xE5E5 0x88F9 # <CJK>
+0xE5E6 0x8902 # <CJK>
+0xE5E7 0x88FC # <CJK>
+0xE5E8 0x88F4 # <CJK>
+0xE5E9 0x88E8 # <CJK>
+0xE5EA 0x88F2 # <CJK>
+0xE5EB 0x8904 # <CJK>
+0xE5EC 0x890C # <CJK>
+0xE5ED 0x890A # <CJK>
+0xE5EE 0x8913 # <CJK>
+0xE5EF 0x8943 # <CJK>
+0xE5F0 0x891E # <CJK>
+0xE5F1 0x8925 # <CJK>
+0xE5F2 0x892A # <CJK>
+0xE5F3 0x892B # <CJK>
+0xE5F4 0x8941 # <CJK>
+0xE5F5 0x8944 # <CJK>
+0xE5F6 0x893B # <CJK>
+0xE5F7 0x8936 # <CJK>
+0xE5F8 0x8938 # <CJK>
+0xE5F9 0x894C # <CJK>
+0xE5FA 0x891D # <CJK>
+0xE5FB 0x8960 # <CJK>
+0xE5FC 0x895E # <CJK>
+0xE640 0x8966 # <CJK>
+0xE641 0x8964 # <CJK>
+0xE642 0x896D # <CJK>
+0xE643 0x896A # <CJK>
+0xE644 0x896F # <CJK>
+0xE645 0x8974 # <CJK>
+0xE646 0x8977 # <CJK>
+0xE647 0x897E # <CJK>
+0xE648 0x8983 # <CJK>
+0xE649 0x8988 # <CJK>
+0xE64A 0x898A # <CJK>
+0xE64B 0x8993 # <CJK>
+0xE64C 0x8998 # <CJK>
+0xE64D 0x89A1 # <CJK>
+0xE64E 0x89A9 # <CJK>
+0xE64F 0x89A6 # <CJK>
+0xE650 0x89AC # <CJK>
+0xE651 0x89AF # <CJK>
+0xE652 0x89B2 # <CJK>
+0xE653 0x89BA # <CJK>
+0xE654 0x89BD # <CJK>
+0xE655 0x89BF # <CJK>
+0xE656 0x89C0 # <CJK>
+0xE657 0x89DA # <CJK>
+0xE658 0x89DC # <CJK>
+0xE659 0x89DD # <CJK>
+0xE65A 0x89E7 # <CJK>
+0xE65B 0x89F4 # <CJK>
+0xE65C 0x89F8 # <CJK>
+0xE65D 0x8A03 # <CJK>
+0xE65E 0x8A16 # <CJK>
+0xE65F 0x8A10 # <CJK>
+0xE660 0x8A0C # <CJK>
+0xE661 0x8A1B # <CJK>
+0xE662 0x8A1D # <CJK>
+0xE663 0x8A25 # <CJK>
+0xE664 0x8A36 # <CJK>
+0xE665 0x8A41 # <CJK>
+0xE666 0x8A5B # <CJK>
+0xE667 0x8A52 # <CJK>
+0xE668 0x8A46 # <CJK>
+0xE669 0x8A48 # <CJK>
+0xE66A 0x8A7C # <CJK>
+0xE66B 0x8A6D # <CJK>
+0xE66C 0x8A6C # <CJK>
+0xE66D 0x8A62 # <CJK>
+0xE66E 0x8A85 # <CJK>
+0xE66F 0x8A82 # <CJK>
+0xE670 0x8A84 # <CJK>
+0xE671 0x8AA8 # <CJK>
+0xE672 0x8AA1 # <CJK>
+0xE673 0x8A91 # <CJK>
+0xE674 0x8AA5 # <CJK>
+0xE675 0x8AA6 # <CJK>
+0xE676 0x8A9A # <CJK>
+0xE677 0x8AA3 # <CJK>
+0xE678 0x8AC4 # <CJK>
+0xE679 0x8ACD # <CJK>
+0xE67A 0x8AC2 # <CJK>
+0xE67B 0x8ADA # <CJK>
+0xE67C 0x8AEB # <CJK>
+0xE67D 0x8AF3 # <CJK>
+0xE67E 0x8AE7 # <CJK>
+0xE680 0x8AE4 # <CJK>
+0xE681 0x8AF1 # <CJK>
+0xE682 0x8B14 # <CJK>
+0xE683 0x8AE0 # <CJK>
+0xE684 0x8AE2 # <CJK>
+0xE685 0x8AF7 # <CJK>
+0xE686 0x8ADE # <CJK>
+0xE687 0x8ADB # <CJK>
+0xE688 0x8B0C # <CJK>
+0xE689 0x8B07 # <CJK>
+0xE68A 0x8B1A # <CJK>
+0xE68B 0x8AE1 # <CJK>
+0xE68C 0x8B16 # <CJK>
+0xE68D 0x8B10 # <CJK>
+0xE68E 0x8B17 # <CJK>
+0xE68F 0x8B20 # <CJK>
+0xE690 0x8B33 # <CJK>
+0xE691 0x97AB # <CJK>
+0xE692 0x8B26 # <CJK>
+0xE693 0x8B2B # <CJK>
+0xE694 0x8B3E # <CJK>
+0xE695 0x8B28 # <CJK>
+0xE696 0x8B41 # <CJK>
+0xE697 0x8B4C # <CJK>
+0xE698 0x8B4F # <CJK>
+0xE699 0x8B4E # <CJK>
+0xE69A 0x8B49 # <CJK>
+0xE69B 0x8B56 # <CJK>
+0xE69C 0x8B5B # <CJK>
+0xE69D 0x8B5A # <CJK>
+0xE69E 0x8B6B # <CJK>
+0xE69F 0x8B5F # <CJK>
+0xE6A0 0x8B6C # <CJK>
+0xE6A1 0x8B6F # <CJK>
+0xE6A2 0x8B74 # <CJK>
+0xE6A3 0x8B7D # <CJK>
+0xE6A4 0x8B80 # <CJK>
+0xE6A5 0x8B8C # <CJK>
+0xE6A6 0x8B8E # <CJK>
+0xE6A7 0x8B92 # <CJK>
+0xE6A8 0x8B93 # <CJK>
+0xE6A9 0x8B96 # <CJK>
+0xE6AA 0x8B99 # <CJK>
+0xE6AB 0x8B9A # <CJK>
+0xE6AC 0x8C3A # <CJK>
+0xE6AD 0x8C41 # <CJK>
+0xE6AE 0x8C3F # <CJK>
+0xE6AF 0x8C48 # <CJK>
+0xE6B0 0x8C4C # <CJK>
+0xE6B1 0x8C4E # <CJK>
+0xE6B2 0x8C50 # <CJK>
+0xE6B3 0x8C55 # <CJK>
+0xE6B4 0x8C62 # <CJK>
+0xE6B5 0x8C6C # <CJK>
+0xE6B6 0x8C78 # <CJK>
+0xE6B7 0x8C7A # <CJK>
+0xE6B8 0x8C82 # <CJK>
+0xE6B9 0x8C89 # <CJK>
+0xE6BA 0x8C85 # <CJK>
+0xE6BB 0x8C8A # <CJK>
+0xE6BC 0x8C8D # <CJK>
+0xE6BD 0x8C8E # <CJK>
+0xE6BE 0x8C94 # <CJK>
+0xE6BF 0x8C7C # <CJK>
+0xE6C0 0x8C98 # <CJK>
+0xE6C1 0x621D # <CJK>
+0xE6C2 0x8CAD # <CJK>
+0xE6C3 0x8CAA # <CJK>
+0xE6C4 0x8CBD # <CJK>
+0xE6C5 0x8CB2 # <CJK>
+0xE6C6 0x8CB3 # <CJK>
+0xE6C7 0x8CAE # <CJK>
+0xE6C8 0x8CB6 # <CJK>
+0xE6C9 0x8CC8 # <CJK>
+0xE6CA 0x8CC1 # <CJK>
+0xE6CB 0x8CE4 # <CJK>
+0xE6CC 0x8CE3 # <CJK>
+0xE6CD 0x8CDA # <CJK>
+0xE6CE 0x8CFD # <CJK>
+0xE6CF 0x8CFA # <CJK>
+0xE6D0 0x8CFB # <CJK>
+0xE6D1 0x8D04 # <CJK>
+0xE6D2 0x8D05 # <CJK>
+0xE6D3 0x8D0A # <CJK>
+0xE6D4 0x8D07 # <CJK>
+0xE6D5 0x8D0F # <CJK>
+0xE6D6 0x8D0D # <CJK>
+0xE6D7 0x8D10 # <CJK>
+0xE6D8 0x9F4E # <CJK>
+0xE6D9 0x8D13 # <CJK>
+0xE6DA 0x8CCD # <CJK>
+0xE6DB 0x8D14 # <CJK>
+0xE6DC 0x8D16 # <CJK>
+0xE6DD 0x8D67 # <CJK>
+0xE6DE 0x8D6D # <CJK>
+0xE6DF 0x8D71 # <CJK>
+0xE6E0 0x8D73 # <CJK>
+0xE6E1 0x8D81 # <CJK>
+0xE6E2 0x8D99 # <CJK>
+0xE6E3 0x8DC2 # <CJK>
+0xE6E4 0x8DBE # <CJK>
+0xE6E5 0x8DBA # <CJK>
+0xE6E6 0x8DCF # <CJK>
+0xE6E7 0x8DDA # <CJK>
+0xE6E8 0x8DD6 # <CJK>
+0xE6E9 0x8DCC # <CJK>
+0xE6EA 0x8DDB # <CJK>
+0xE6EB 0x8DCB # <CJK>
+0xE6EC 0x8DEA # <CJK>
+0xE6ED 0x8DEB # <CJK>
+0xE6EE 0x8DDF # <CJK>
+0xE6EF 0x8DE3 # <CJK>
+0xE6F0 0x8DFC # <CJK>
+0xE6F1 0x8E08 # <CJK>
+0xE6F2 0x8E09 # <CJK>
+0xE6F3 0x8DFF # <CJK>
+0xE6F4 0x8E1D # <CJK>
+0xE6F5 0x8E1E # <CJK>
+0xE6F6 0x8E10 # <CJK>
+0xE6F7 0x8E1F # <CJK>
+0xE6F8 0x8E42 # <CJK>
+0xE6F9 0x8E35 # <CJK>
+0xE6FA 0x8E30 # <CJK>
+0xE6FB 0x8E34 # <CJK>
+0xE6FC 0x8E4A # <CJK>
+0xE740 0x8E47 # <CJK>
+0xE741 0x8E49 # <CJK>
+0xE742 0x8E4C # <CJK>
+0xE743 0x8E50 # <CJK>
+0xE744 0x8E48 # <CJK>
+0xE745 0x8E59 # <CJK>
+0xE746 0x8E64 # <CJK>
+0xE747 0x8E60 # <CJK>
+0xE748 0x8E2A # <CJK>
+0xE749 0x8E63 # <CJK>
+0xE74A 0x8E55 # <CJK>
+0xE74B 0x8E76 # <CJK>
+0xE74C 0x8E72 # <CJK>
+0xE74D 0x8E7C # <CJK>
+0xE74E 0x8E81 # <CJK>
+0xE74F 0x8E87 # <CJK>
+0xE750 0x8E85 # <CJK>
+0xE751 0x8E84 # <CJK>
+0xE752 0x8E8B # <CJK>
+0xE753 0x8E8A # <CJK>
+0xE754 0x8E93 # <CJK>
+0xE755 0x8E91 # <CJK>
+0xE756 0x8E94 # <CJK>
+0xE757 0x8E99 # <CJK>
+0xE758 0x8EAA # <CJK>
+0xE759 0x8EA1 # <CJK>
+0xE75A 0x8EAC # <CJK>
+0xE75B 0x8EB0 # <CJK>
+0xE75C 0x8EC6 # <CJK>
+0xE75D 0x8EB1 # <CJK>
+0xE75E 0x8EBE # <CJK>
+0xE75F 0x8EC5 # <CJK>
+0xE760 0x8EC8 # <CJK>
+0xE761 0x8ECB # <CJK>
+0xE762 0x8EDB # <CJK>
+0xE763 0x8EE3 # <CJK>
+0xE764 0x8EFC # <CJK>
+0xE765 0x8EFB # <CJK>
+0xE766 0x8EEB # <CJK>
+0xE767 0x8EFE # <CJK>
+0xE768 0x8F0A # <CJK>
+0xE769 0x8F05 # <CJK>
+0xE76A 0x8F15 # <CJK>
+0xE76B 0x8F12 # <CJK>
+0xE76C 0x8F19 # <CJK>
+0xE76D 0x8F13 # <CJK>
+0xE76E 0x8F1C # <CJK>
+0xE76F 0x8F1F # <CJK>
+0xE770 0x8F1B # <CJK>
+0xE771 0x8F0C # <CJK>
+0xE772 0x8F26 # <CJK>
+0xE773 0x8F33 # <CJK>
+0xE774 0x8F3B # <CJK>
+0xE775 0x8F39 # <CJK>
+0xE776 0x8F45 # <CJK>
+0xE777 0x8F42 # <CJK>
+0xE778 0x8F3E # <CJK>
+0xE779 0x8F4C # <CJK>
+0xE77A 0x8F49 # <CJK>
+0xE77B 0x8F46 # <CJK>
+0xE77C 0x8F4E # <CJK>
+0xE77D 0x8F57 # <CJK>
+0xE77E 0x8F5C # <CJK>
+0xE780 0x8F62 # <CJK>
+0xE781 0x8F63 # <CJK>
+0xE782 0x8F64 # <CJK>
+0xE783 0x8F9C # <CJK>
+0xE784 0x8F9F # <CJK>
+0xE785 0x8FA3 # <CJK>
+0xE786 0x8FAD # <CJK>
+0xE787 0x8FAF # <CJK>
+0xE788 0x8FB7 # <CJK>
+0xE789 0x8FDA # <CJK>
+0xE78A 0x8FE5 # <CJK>
+0xE78B 0x8FE2 # <CJK>
+0xE78C 0x8FEA # <CJK>
+0xE78D 0x8FEF # <CJK>
+0xE78E 0x9087 # <CJK>
+0xE78F 0x8FF4 # <CJK>
+0xE790 0x9005 # <CJK>
+0xE791 0x8FF9 # <CJK>
+0xE792 0x8FFA # <CJK>
+0xE793 0x9011 # <CJK>
+0xE794 0x9015 # <CJK>
+0xE795 0x9021 # <CJK>
+0xE796 0x900D # <CJK>
+0xE797 0x901E # <CJK>
+0xE798 0x9016 # <CJK>
+0xE799 0x900B # <CJK>
+0xE79A 0x9027 # <CJK>
+0xE79B 0x9036 # <CJK>
+0xE79C 0x9035 # <CJK>
+0xE79D 0x9039 # <CJK>
+0xE79E 0x8FF8 # <CJK>
+0xE79F 0x904F # <CJK>
+0xE7A0 0x9050 # <CJK>
+0xE7A1 0x9051 # <CJK>
+0xE7A2 0x9052 # <CJK>
+0xE7A3 0x900E # <CJK>
+0xE7A4 0x9049 # <CJK>
+0xE7A5 0x903E # <CJK>
+0xE7A6 0x9056 # <CJK>
+0xE7A7 0x9058 # <CJK>
+0xE7A8 0x905E # <CJK>
+0xE7A9 0x9068 # <CJK>
+0xE7AA 0x906F # <CJK>
+0xE7AB 0x9076 # <CJK>
+0xE7AC 0x96A8 # <CJK>
+0xE7AD 0x9072 # <CJK>
+0xE7AE 0x9082 # <CJK>
+0xE7AF 0x907D # <CJK>
+0xE7B0 0x9081 # <CJK>
+0xE7B1 0x9080 # <CJK>
+0xE7B2 0x908A # <CJK>
+0xE7B3 0x9089 # <CJK>
+0xE7B4 0x908F # <CJK>
+0xE7B5 0x90A8 # <CJK>
+0xE7B6 0x90AF # <CJK>
+0xE7B7 0x90B1 # <CJK>
+0xE7B8 0x90B5 # <CJK>
+0xE7B9 0x90E2 # <CJK>
+0xE7BA 0x90E4 # <CJK>
+0xE7BB 0x6248 # <CJK>
+0xE7BC 0x90DB # <CJK>
+0xE7BD 0x9102 # <CJK>
+0xE7BE 0x9112 # <CJK>
+0xE7BF 0x9119 # <CJK>
+0xE7C0 0x9132 # <CJK>
+0xE7C1 0x9130 # <CJK>
+0xE7C2 0x914A # <CJK>
+0xE7C3 0x9156 # <CJK>
+0xE7C4 0x9158 # <CJK>
+0xE7C5 0x9163 # <CJK>
+0xE7C6 0x9165 # <CJK>
+0xE7C7 0x9169 # <CJK>
+0xE7C8 0x9173 # <CJK>
+0xE7C9 0x9172 # <CJK>
+0xE7CA 0x918B # <CJK>
+0xE7CB 0x9189 # <CJK>
+0xE7CC 0x9182 # <CJK>
+0xE7CD 0x91A2 # <CJK>
+0xE7CE 0x91AB # <CJK>
+0xE7CF 0x91AF # <CJK>
+0xE7D0 0x91AA # <CJK>
+0xE7D1 0x91B5 # <CJK>
+0xE7D2 0x91B4 # <CJK>
+0xE7D3 0x91BA # <CJK>
+0xE7D4 0x91C0 # <CJK>
+0xE7D5 0x91C1 # <CJK>
+0xE7D6 0x91C9 # <CJK>
+0xE7D7 0x91CB # <CJK>
+0xE7D8 0x91D0 # <CJK>
+0xE7D9 0x91D6 # <CJK>
+0xE7DA 0x91DF # <CJK>
+0xE7DB 0x91E1 # <CJK>
+0xE7DC 0x91DB # <CJK>
+0xE7DD 0x91FC # <CJK>
+0xE7DE 0x91F5 # <CJK>
+0xE7DF 0x91F6 # <CJK>
+0xE7E0 0x921E # <CJK>
+0xE7E1 0x91FF # <CJK>
+0xE7E2 0x9214 # <CJK>
+0xE7E3 0x922C # <CJK>
+0xE7E4 0x9215 # <CJK>
+0xE7E5 0x9211 # <CJK>
+0xE7E6 0x925E # <CJK>
+0xE7E7 0x9257 # <CJK>
+0xE7E8 0x9245 # <CJK>
+0xE7E9 0x9249 # <CJK>
+0xE7EA 0x9264 # <CJK>
+0xE7EB 0x9248 # <CJK>
+0xE7EC 0x9295 # <CJK>
+0xE7ED 0x923F # <CJK>
+0xE7EE 0x924B # <CJK>
+0xE7EF 0x9250 # <CJK>
+0xE7F0 0x929C # <CJK>
+0xE7F1 0x9296 # <CJK>
+0xE7F2 0x9293 # <CJK>
+0xE7F3 0x929B # <CJK>
+0xE7F4 0x925A # <CJK>
+0xE7F5 0x92CF # <CJK>
+0xE7F6 0x92B9 # <CJK>
+0xE7F7 0x92B7 # <CJK>
+0xE7F8 0x92E9 # <CJK>
+0xE7F9 0x930F # <CJK>
+0xE7FA 0x92FA # <CJK>
+0xE7FB 0x9344 # <CJK>
+0xE7FC 0x932E # <CJK>
+0xE840 0x9319 # <CJK>
+0xE841 0x9322 # <CJK>
+0xE842 0x931A # <CJK>
+0xE843 0x9323 # <CJK>
+0xE844 0x933A # <CJK>
+0xE845 0x9335 # <CJK>
+0xE846 0x933B # <CJK>
+0xE847 0x935C # <CJK>
+0xE848 0x9360 # <CJK>
+0xE849 0x937C # <CJK>
+0xE84A 0x936E # <CJK>
+0xE84B 0x9356 # <CJK>
+0xE84C 0x93B0 # <CJK>
+0xE84D 0x93AC # <CJK>
+0xE84E 0x93AD # <CJK>
+0xE84F 0x9394 # <CJK>
+0xE850 0x93B9 # <CJK>
+0xE851 0x93D6 # <CJK>
+0xE852 0x93D7 # <CJK>
+0xE853 0x93E8 # <CJK>
+0xE854 0x93E5 # <CJK>
+0xE855 0x93D8 # <CJK>
+0xE856 0x93C3 # <CJK>
+0xE857 0x93DD # <CJK>
+0xE858 0x93D0 # <CJK>
+0xE859 0x93C8 # <CJK>
+0xE85A 0x93E4 # <CJK>
+0xE85B 0x941A # <CJK>
+0xE85C 0x9414 # <CJK>
+0xE85D 0x9413 # <CJK>
+0xE85E 0x9403 # <CJK>
+0xE85F 0x9407 # <CJK>
+0xE860 0x9410 # <CJK>
+0xE861 0x9436 # <CJK>
+0xE862 0x942B # <CJK>
+0xE863 0x9435 # <CJK>
+0xE864 0x9421 # <CJK>
+0xE865 0x943A # <CJK>
+0xE866 0x9441 # <CJK>
+0xE867 0x9452 # <CJK>
+0xE868 0x9444 # <CJK>
+0xE869 0x945B # <CJK>
+0xE86A 0x9460 # <CJK>
+0xE86B 0x9462 # <CJK>
+0xE86C 0x945E # <CJK>
+0xE86D 0x946A # <CJK>
+0xE86E 0x9229 # <CJK>
+0xE86F 0x9470 # <CJK>
+0xE870 0x9475 # <CJK>
+0xE871 0x9477 # <CJK>
+0xE872 0x947D # <CJK>
+0xE873 0x945A # <CJK>
+0xE874 0x947C # <CJK>
+0xE875 0x947E # <CJK>
+0xE876 0x9481 # <CJK>
+0xE877 0x947F # <CJK>
+0xE878 0x9582 # <CJK>
+0xE879 0x9587 # <CJK>
+0xE87A 0x958A # <CJK>
+0xE87B 0x9594 # <CJK>
+0xE87C 0x9596 # <CJK>
+0xE87D 0x9598 # <CJK>
+0xE87E 0x9599 # <CJK>
+0xE880 0x95A0 # <CJK>
+0xE881 0x95A8 # <CJK>
+0xE882 0x95A7 # <CJK>
+0xE883 0x95AD # <CJK>
+0xE884 0x95BC # <CJK>
+0xE885 0x95BB # <CJK>
+0xE886 0x95B9 # <CJK>
+0xE887 0x95BE # <CJK>
+0xE888 0x95CA # <CJK>
+0xE889 0x6FF6 # <CJK>
+0xE88A 0x95C3 # <CJK>
+0xE88B 0x95CD # <CJK>
+0xE88C 0x95CC # <CJK>
+0xE88D 0x95D5 # <CJK>
+0xE88E 0x95D4 # <CJK>
+0xE88F 0x95D6 # <CJK>
+0xE890 0x95DC # <CJK>
+0xE891 0x95E1 # <CJK>
+0xE892 0x95E5 # <CJK>
+0xE893 0x95E2 # <CJK>
+0xE894 0x9621 # <CJK>
+0xE895 0x9628 # <CJK>
+0xE896 0x962E # <CJK>
+0xE897 0x962F # <CJK>
+0xE898 0x9642 # <CJK>
+0xE899 0x964C # <CJK>
+0xE89A 0x964F # <CJK>
+0xE89B 0x964B # <CJK>
+0xE89C 0x9677 # <CJK>
+0xE89D 0x965C # <CJK>
+0xE89E 0x965E # <CJK>
+0xE89F 0x965D # <CJK>
+0xE8A0 0x965F # <CJK>
+0xE8A1 0x9666 # <CJK>
+0xE8A2 0x9672 # <CJK>
+0xE8A3 0x966C # <CJK>
+0xE8A4 0x968D # <CJK>
+0xE8A5 0x9698 # <CJK>
+0xE8A6 0x9695 # <CJK>
+0xE8A7 0x9697 # <CJK>
+0xE8A8 0x96AA # <CJK>
+0xE8A9 0x96A7 # <CJK>
+0xE8AA 0x96B1 # <CJK>
+0xE8AB 0x96B2 # <CJK>
+0xE8AC 0x96B0 # <CJK>
+0xE8AD 0x96B4 # <CJK>
+0xE8AE 0x96B6 # <CJK>
+0xE8AF 0x96B8 # <CJK>
+0xE8B0 0x96B9 # <CJK>
+0xE8B1 0x96CE # <CJK>
+0xE8B2 0x96CB # <CJK>
+0xE8B3 0x96C9 # <CJK>
+0xE8B4 0x96CD # <CJK>
+0xE8B5 0x894D # <CJK>
+0xE8B6 0x96DC # <CJK>
+0xE8B7 0x970D # <CJK>
+0xE8B8 0x96D5 # <CJK>
+0xE8B9 0x96F9 # <CJK>
+0xE8BA 0x9704 # <CJK>
+0xE8BB 0x9706 # <CJK>
+0xE8BC 0x9708 # <CJK>
+0xE8BD 0x9713 # <CJK>
+0xE8BE 0x970E # <CJK>
+0xE8BF 0x9711 # <CJK>
+0xE8C0 0x970F # <CJK>
+0xE8C1 0x9716 # <CJK>
+0xE8C2 0x9719 # <CJK>
+0xE8C3 0x9724 # <CJK>
+0xE8C4 0x972A # <CJK>
+0xE8C5 0x9730 # <CJK>
+0xE8C6 0x9739 # <CJK>
+0xE8C7 0x973D # <CJK>
+0xE8C8 0x973E # <CJK>
+0xE8C9 0x9744 # <CJK>
+0xE8CA 0x9746 # <CJK>
+0xE8CB 0x9748 # <CJK>
+0xE8CC 0x9742 # <CJK>
+0xE8CD 0x9749 # <CJK>
+0xE8CE 0x975C # <CJK>
+0xE8CF 0x9760 # <CJK>
+0xE8D0 0x9764 # <CJK>
+0xE8D1 0x9766 # <CJK>
+0xE8D2 0x9768 # <CJK>
+0xE8D3 0x52D2 # <CJK>
+0xE8D4 0x976B # <CJK>
+0xE8D5 0x9771 # <CJK>
+0xE8D6 0x9779 # <CJK>
+0xE8D7 0x9785 # <CJK>
+0xE8D8 0x977C # <CJK>
+0xE8D9 0x9781 # <CJK>
+0xE8DA 0x977A # <CJK>
+0xE8DB 0x9786 # <CJK>
+0xE8DC 0x978B # <CJK>
+0xE8DD 0x978F # <CJK>
+0xE8DE 0x9790 # <CJK>
+0xE8DF 0x979C # <CJK>
+0xE8E0 0x97A8 # <CJK>
+0xE8E1 0x97A6 # <CJK>
+0xE8E2 0x97A3 # <CJK>
+0xE8E3 0x97B3 # <CJK>
+0xE8E4 0x97B4 # <CJK>
+0xE8E5 0x97C3 # <CJK>
+0xE8E6 0x97C6 # <CJK>
+0xE8E7 0x97C8 # <CJK>
+0xE8E8 0x97CB # <CJK>
+0xE8E9 0x97DC # <CJK>
+0xE8EA 0x97ED # <CJK>
+0xE8EB 0x9F4F # <CJK>
+0xE8EC 0x97F2 # <CJK>
+0xE8ED 0x7ADF # <CJK>
+0xE8EE 0x97F6 # <CJK>
+0xE8EF 0x97F5 # <CJK>
+0xE8F0 0x980F # <CJK>
+0xE8F1 0x980C # <CJK>
+0xE8F2 0x9838 # <CJK>
+0xE8F3 0x9824 # <CJK>
+0xE8F4 0x9821 # <CJK>
+0xE8F5 0x9837 # <CJK>
+0xE8F6 0x983D # <CJK>
+0xE8F7 0x9846 # <CJK>
+0xE8F8 0x984F # <CJK>
+0xE8F9 0x984B # <CJK>
+0xE8FA 0x986B # <CJK>
+0xE8FB 0x986F # <CJK>
+0xE8FC 0x9870 # <CJK>
+0xE940 0x9871 # <CJK>
+0xE941 0x9874 # <CJK>
+0xE942 0x9873 # <CJK>
+0xE943 0x98AA # <CJK>
+0xE944 0x98AF # <CJK>
+0xE945 0x98B1 # <CJK>
+0xE946 0x98B6 # <CJK>
+0xE947 0x98C4 # <CJK>
+0xE948 0x98C3 # <CJK>
+0xE949 0x98C6 # <CJK>
+0xE94A 0x98E9 # <CJK>
+0xE94B 0x98EB # <CJK>
+0xE94C 0x9903 # <CJK>
+0xE94D 0x9909 # <CJK>
+0xE94E 0x9912 # <CJK>
+0xE94F 0x9914 # <CJK>
+0xE950 0x9918 # <CJK>
+0xE951 0x9921 # <CJK>
+0xE952 0x991D # <CJK>
+0xE953 0x991E # <CJK>
+0xE954 0x9924 # <CJK>
+0xE955 0x9920 # <CJK>
+0xE956 0x992C # <CJK>
+0xE957 0x992E # <CJK>
+0xE958 0x993D # <CJK>
+0xE959 0x993E # <CJK>
+0xE95A 0x9942 # <CJK>
+0xE95B 0x9949 # <CJK>
+0xE95C 0x9945 # <CJK>
+0xE95D 0x9950 # <CJK>
+0xE95E 0x994B # <CJK>
+0xE95F 0x9951 # <CJK>
+0xE960 0x9952 # <CJK>
+0xE961 0x994C # <CJK>
+0xE962 0x9955 # <CJK>
+0xE963 0x9997 # <CJK>
+0xE964 0x9998 # <CJK>
+0xE965 0x99A5 # <CJK>
+0xE966 0x99AD # <CJK>
+0xE967 0x99AE # <CJK>
+0xE968 0x99BC # <CJK>
+0xE969 0x99DF # <CJK>
+0xE96A 0x99DB # <CJK>
+0xE96B 0x99DD # <CJK>
+0xE96C 0x99D8 # <CJK>
+0xE96D 0x99D1 # <CJK>
+0xE96E 0x99ED # <CJK>
+0xE96F 0x99EE # <CJK>
+0xE970 0x99F1 # <CJK>
+0xE971 0x99F2 # <CJK>
+0xE972 0x99FB # <CJK>
+0xE973 0x99F8 # <CJK>
+0xE974 0x9A01 # <CJK>
+0xE975 0x9A0F # <CJK>
+0xE976 0x9A05 # <CJK>
+0xE977 0x99E2 # <CJK>
+0xE978 0x9A19 # <CJK>
+0xE979 0x9A2B # <CJK>
+0xE97A 0x9A37 # <CJK>
+0xE97B 0x9A45 # <CJK>
+0xE97C 0x9A42 # <CJK>
+0xE97D 0x9A40 # <CJK>
+0xE97E 0x9A43 # <CJK>
+0xE980 0x9A3E # <CJK>
+0xE981 0x9A55 # <CJK>
+0xE982 0x9A4D # <CJK>
+0xE983 0x9A5B # <CJK>
+0xE984 0x9A57 # <CJK>
+0xE985 0x9A5F # <CJK>
+0xE986 0x9A62 # <CJK>
+0xE987 0x9A65 # <CJK>
+0xE988 0x9A64 # <CJK>
+0xE989 0x9A69 # <CJK>
+0xE98A 0x9A6B # <CJK>
+0xE98B 0x9A6A # <CJK>
+0xE98C 0x9AAD # <CJK>
+0xE98D 0x9AB0 # <CJK>
+0xE98E 0x9ABC # <CJK>
+0xE98F 0x9AC0 # <CJK>
+0xE990 0x9ACF # <CJK>
+0xE991 0x9AD1 # <CJK>
+0xE992 0x9AD3 # <CJK>
+0xE993 0x9AD4 # <CJK>
+0xE994 0x9ADE # <CJK>
+0xE995 0x9ADF # <CJK>
+0xE996 0x9AE2 # <CJK>
+0xE997 0x9AE3 # <CJK>
+0xE998 0x9AE6 # <CJK>
+0xE999 0x9AEF # <CJK>
+0xE99A 0x9AEB # <CJK>
+0xE99B 0x9AEE # <CJK>
+0xE99C 0x9AF4 # <CJK>
+0xE99D 0x9AF1 # <CJK>
+0xE99E 0x9AF7 # <CJK>
+0xE99F 0x9AFB # <CJK>
+0xE9A0 0x9B06 # <CJK>
+0xE9A1 0x9B18 # <CJK>
+0xE9A2 0x9B1A # <CJK>
+0xE9A3 0x9B1F # <CJK>
+0xE9A4 0x9B22 # <CJK>
+0xE9A5 0x9B23 # <CJK>
+0xE9A6 0x9B25 # <CJK>
+0xE9A7 0x9B27 # <CJK>
+0xE9A8 0x9B28 # <CJK>
+0xE9A9 0x9B29 # <CJK>
+0xE9AA 0x9B2A # <CJK>
+0xE9AB 0x9B2E # <CJK>
+0xE9AC 0x9B2F # <CJK>
+0xE9AD 0x9B32 # <CJK>
+0xE9AE 0x9B44 # <CJK>
+0xE9AF 0x9B43 # <CJK>
+0xE9B0 0x9B4F # <CJK>
+0xE9B1 0x9B4D # <CJK>
+0xE9B2 0x9B4E # <CJK>
+0xE9B3 0x9B51 # <CJK>
+0xE9B4 0x9B58 # <CJK>
+0xE9B5 0x9B74 # <CJK>
+0xE9B6 0x9B93 # <CJK>
+0xE9B7 0x9B83 # <CJK>
+0xE9B8 0x9B91 # <CJK>
+0xE9B9 0x9B96 # <CJK>
+0xE9BA 0x9B97 # <CJK>
+0xE9BB 0x9B9F # <CJK>
+0xE9BC 0x9BA0 # <CJK>
+0xE9BD 0x9BA8 # <CJK>
+0xE9BE 0x9BB4 # <CJK>
+0xE9BF 0x9BC0 # <CJK>
+0xE9C0 0x9BCA # <CJK>
+0xE9C1 0x9BB9 # <CJK>
+0xE9C2 0x9BC6 # <CJK>
+0xE9C3 0x9BCF # <CJK>
+0xE9C4 0x9BD1 # <CJK>
+0xE9C5 0x9BD2 # <CJK>
+0xE9C6 0x9BE3 # <CJK>
+0xE9C7 0x9BE2 # <CJK>
+0xE9C8 0x9BE4 # <CJK>
+0xE9C9 0x9BD4 # <CJK>
+0xE9CA 0x9BE1 # <CJK>
+0xE9CB 0x9C3A # <CJK>
+0xE9CC 0x9BF2 # <CJK>
+0xE9CD 0x9BF1 # <CJK>
+0xE9CE 0x9BF0 # <CJK>
+0xE9CF 0x9C15 # <CJK>
+0xE9D0 0x9C14 # <CJK>
+0xE9D1 0x9C09 # <CJK>
+0xE9D2 0x9C13 # <CJK>
+0xE9D3 0x9C0C # <CJK>
+0xE9D4 0x9C06 # <CJK>
+0xE9D5 0x9C08 # <CJK>
+0xE9D6 0x9C12 # <CJK>
+0xE9D7 0x9C0A # <CJK>
+0xE9D8 0x9C04 # <CJK>
+0xE9D9 0x9C2E # <CJK>
+0xE9DA 0x9C1B # <CJK>
+0xE9DB 0x9C25 # <CJK>
+0xE9DC 0x9C24 # <CJK>
+0xE9DD 0x9C21 # <CJK>
+0xE9DE 0x9C30 # <CJK>
+0xE9DF 0x9C47 # <CJK>
+0xE9E0 0x9C32 # <CJK>
+0xE9E1 0x9C46 # <CJK>
+0xE9E2 0x9C3E # <CJK>
+0xE9E3 0x9C5A # <CJK>
+0xE9E4 0x9C60 # <CJK>
+0xE9E5 0x9C67 # <CJK>
+0xE9E6 0x9C76 # <CJK>
+0xE9E7 0x9C78 # <CJK>
+0xE9E8 0x9CE7 # <CJK>
+0xE9E9 0x9CEC # <CJK>
+0xE9EA 0x9CF0 # <CJK>
+0xE9EB 0x9D09 # <CJK>
+0xE9EC 0x9D08 # <CJK>
+0xE9ED 0x9CEB # <CJK>
+0xE9EE 0x9D03 # <CJK>
+0xE9EF 0x9D06 # <CJK>
+0xE9F0 0x9D2A # <CJK>
+0xE9F1 0x9D26 # <CJK>
+0xE9F2 0x9DAF # <CJK>
+0xE9F3 0x9D23 # <CJK>
+0xE9F4 0x9D1F # <CJK>
+0xE9F5 0x9D44 # <CJK>
+0xE9F6 0x9D15 # <CJK>
+0xE9F7 0x9D12 # <CJK>
+0xE9F8 0x9D41 # <CJK>
+0xE9F9 0x9D3F # <CJK>
+0xE9FA 0x9D3E # <CJK>
+0xE9FB 0x9D46 # <CJK>
+0xE9FC 0x9D48 # <CJK>
+0xEA40 0x9D5D # <CJK>
+0xEA41 0x9D5E # <CJK>
+0xEA42 0x9D64 # <CJK>
+0xEA43 0x9D51 # <CJK>
+0xEA44 0x9D50 # <CJK>
+0xEA45 0x9D59 # <CJK>
+0xEA46 0x9D72 # <CJK>
+0xEA47 0x9D89 # <CJK>
+0xEA48 0x9D87 # <CJK>
+0xEA49 0x9DAB # <CJK>
+0xEA4A 0x9D6F # <CJK>
+0xEA4B 0x9D7A # <CJK>
+0xEA4C 0x9D9A # <CJK>
+0xEA4D 0x9DA4 # <CJK>
+0xEA4E 0x9DA9 # <CJK>
+0xEA4F 0x9DB2 # <CJK>
+0xEA50 0x9DC4 # <CJK>
+0xEA51 0x9DC1 # <CJK>
+0xEA52 0x9DBB # <CJK>
+0xEA53 0x9DB8 # <CJK>
+0xEA54 0x9DBA # <CJK>
+0xEA55 0x9DC6 # <CJK>
+0xEA56 0x9DCF # <CJK>
+0xEA57 0x9DC2 # <CJK>
+0xEA58 0x9DD9 # <CJK>
+0xEA59 0x9DD3 # <CJK>
+0xEA5A 0x9DF8 # <CJK>
+0xEA5B 0x9DE6 # <CJK>
+0xEA5C 0x9DED # <CJK>
+0xEA5D 0x9DEF # <CJK>
+0xEA5E 0x9DFD # <CJK>
+0xEA5F 0x9E1A # <CJK>
+0xEA60 0x9E1B # <CJK>
+0xEA61 0x9E1E # <CJK>
+0xEA62 0x9E75 # <CJK>
+0xEA63 0x9E79 # <CJK>
+0xEA64 0x9E7D # <CJK>
+0xEA65 0x9E81 # <CJK>
+0xEA66 0x9E88 # <CJK>
+0xEA67 0x9E8B # <CJK>
+0xEA68 0x9E8C # <CJK>
+0xEA69 0x9E92 # <CJK>
+0xEA6A 0x9E95 # <CJK>
+0xEA6B 0x9E91 # <CJK>
+0xEA6C 0x9E9D # <CJK>
+0xEA6D 0x9EA5 # <CJK>
+0xEA6E 0x9EA9 # <CJK>
+0xEA6F 0x9EB8 # <CJK>
+0xEA70 0x9EAA # <CJK>
+0xEA71 0x9EAD # <CJK>
+0xEA72 0x9761 # <CJK>
+0xEA73 0x9ECC # <CJK>
+0xEA74 0x9ECE # <CJK>
+0xEA75 0x9ECF # <CJK>
+0xEA76 0x9ED0 # <CJK>
+0xEA77 0x9ED4 # <CJK>
+0xEA78 0x9EDC # <CJK>
+0xEA79 0x9EDE # <CJK>
+0xEA7A 0x9EDD # <CJK>
+0xEA7B 0x9EE0 # <CJK>
+0xEA7C 0x9EE5 # <CJK>
+0xEA7D 0x9EE8 # <CJK>
+0xEA7E 0x9EEF # <CJK>
+0xEA80 0x9EF4 # <CJK>
+0xEA81 0x9EF6 # <CJK>
+0xEA82 0x9EF7 # <CJK>
+0xEA83 0x9EF9 # <CJK>
+0xEA84 0x9EFB # <CJK>
+0xEA85 0x9EFC # <CJK>
+0xEA86 0x9EFD # <CJK>
+0xEA87 0x9F07 # <CJK>
+0xEA88 0x9F08 # <CJK>
+0xEA89 0x76B7 # <CJK>
+0xEA8A 0x9F15 # <CJK>
+0xEA8B 0x9F21 # <CJK>
+0xEA8C 0x9F2C # <CJK>
+0xEA8D 0x9F3E # <CJK>
+0xEA8E 0x9F4A # <CJK>
+0xEA8F 0x9F52 # <CJK>
+0xEA90 0x9F54 # <CJK>
+0xEA91 0x9F63 # <CJK>
+0xEA92 0x9F5F # <CJK>
+0xEA93 0x9F60 # <CJK>
+0xEA94 0x9F61 # <CJK>
+0xEA95 0x9F66 # <CJK>
+0xEA96 0x9F67 # <CJK>
+0xEA97 0x9F6C # <CJK>
+0xEA98 0x9F6A # <CJK>
+0xEA99 0x9F77 # <CJK>
+0xEA9A 0x9F72 # <CJK>
+0xEA9B 0x9F76 # <CJK>
+0xEA9C 0x9F95 # <CJK>
+0xEA9D 0x9F9C # <CJK>
+0xEA9E 0x9FA0 # <CJK>
+0xEA9F 0x582F # <CJK>
+0xEAA0 0x69C7 # <CJK>
+0xEAA1 0x9059 # <CJK>
+0xEAA2 0x7464 # <CJK>
+0xEAA3 0x51DC # <CJK>
+0xEAA4 0x7199 # <CJK>
+
+# Apple additions - vertical forms
+0xEB41 0x3001+0xF87E # vertical form for IDEOGRAPHIC COMMA
+0xEB42 0x3002+0xF87E # vertical form for IDEOGRAPHIC FULL STOP
+0xEB50 0xFFE3+0xF87E # vertical form for FULLWIDTH MACRON
+0xEB51 0xFE33 # PRESENTATION FORM FOR VERTICAL LOW LINE, U+FF3F
+0xEB5B 0x30FC+0xF87E # vertical form for KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xEB5C 0xFE31 # PRESENTATION FORM FOR VERTICAL EM DASH, U+2014
+0xEB5D 0x2010+0xF87E # vertical form for HYPHEN
+0xEB60 0x301C+0xF87E # vertical form for WAVE DASH
+0xEB61 0x2016+0xF87E # vertical form for DOUBLE VERTICAL LINE
+0xEB62 0xFF5C+0xF87E # vertical form for FULLWIDTH VERTICAL LINE
+0xEB63 0x2026+0xF87E # vertical form for HORIZONTAL ELLIPSIS
+0xEB64 0xFE30 # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER, U+2025
+0xEB69 0xFE35 # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS, U+FF08
+0xEB6A 0xFE36 # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS, U+FF09
+0xEB6B 0xFE39 # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET, U+3014
+0xEB6C 0xFE3A # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET, U+3015
+0xEB6D 0xFF3B+0xF87E # vertical form for FULLWIDTH LEFT SQUARE BRACKET # or for Unicode 4.0, 0xFE47 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+0xEB6E 0xFF3D+0xF87E # vertical form for FULLWIDTH RIGHT SQUARE BRACKET # or for Unicode 4.0, 0xFE48 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+0xEB6F 0xFE37 # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET, U+FF5B
+0xEB70 0xFE38 # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET, U+FF5D
+0xEB71 0xFE3F # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET, U+3008
+0xEB72 0xFE40 # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET, U+3009
+0xEB73 0xFE3D # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET, U+300A
+0xEB74 0xFE3E # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET, U+300B
+0xEB75 0xFE41 # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET, U+300C
+0xEB76 0xFE42 # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET, U+300D
+0xEB77 0xFE43 # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET, U+300E
+0xEB78 0xFE44 # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET, U+300F
+0xEB79 0xFE3B # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET, U+3010
+0xEB7A 0xFE3C # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET, U+3011
+0xEB81 0xFF1D+0xF87E # vertical form for FULLWIDTH EQUALS SIGN
+0xEC9F 0x3041+0xF87E # vertical form for HIRAGANA LETTER SMALL A
+0xECA1 0x3043+0xF87E # vertical form for HIRAGANA LETTER SMALL I
+0xECA3 0x3045+0xF87E # vertical form for HIRAGANA LETTER SMALL U
+0xECA5 0x3047+0xF87E # vertical form for HIRAGANA LETTER SMALL E
+0xECA7 0x3049+0xF87E # vertical form for HIRAGANA LETTER SMALL O
+0xECC1 0x3063+0xF87E # vertical form for HIRAGANA LETTER SMALL TU
+0xECE1 0x3083+0xF87E # vertical form for HIRAGANA LETTER SMALL YA
+0xECE3 0x3085+0xF87E # vertical form for HIRAGANA LETTER SMALL YU
+0xECE5 0x3087+0xF87E # vertical form for HIRAGANA LETTER SMALL YO
+0xECEC 0x308E+0xF87E # vertical form for HIRAGANA LETTER SMALL WA
+0xED40 0x30A1+0xF87E # vertical form for KATAKANA LETTER SMALL A
+0xED42 0x30A3+0xF87E # vertical form for KATAKANA LETTER SMALL I
+0xED44 0x30A5+0xF87E # vertical form for KATAKANA LETTER SMALL U
+0xED46 0x30A7+0xF87E # vertical form for KATAKANA LETTER SMALL E
+0xED48 0x30A9+0xF87E # vertical form for KATAKANA LETTER SMALL O
+0xED62 0x30C3+0xF87E # vertical form for KATAKANA LETTER SMALL TU
+0xED83 0x30E3+0xF87E # vertical form for KATAKANA LETTER SMALL YA
+0xED85 0x30E5+0xF87E # vertical form for KATAKANA LETTER SMALL YU
+0xED87 0x30E7+0xF87E # vertical form for KATAKANA LETTER SMALL YO
+0xED8E 0x30EE+0xF87E # vertical form for KATAKANA LETTER SMALL WA
+0xED95 0x30F5+0xF87E # vertical form for KATAKANA LETTER SMALL KA
+0xED96 0x30F6+0xF87E # vertical form for KATAKANA LETTER SMALL KE
diff --git a/ext/mbstring/tests/data/SHIFTJIS.txt b/ext/mbstring/tests/data/SHIFTJIS.txt
new file mode 100644
index 0000000000..757d5a1099
--- /dev/null
+++ b/ext/mbstring/tests/data/SHIFTJIS.txt
@@ -0,0 +1,7097 @@
+# SHIFTJIS.TXT
+# Date: 2015-12-02 23:52:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: Shift-JIS to Unicode
+# Unicode version: 1.1
+# Table version: 2.0
+# Table format: Format A
+# Date: 2011 October 14 (header updated: 2015 December 02)
+#
+# General notes:
+#
+#
+# This table contains one set of mappings from Shift-JIS into Unicode.
+# Note that these data are *possible* mappings only and may not be the
+# same as those used by actual products, nor may they be the best suited
+# for all uses. For more information on the mappings between various code
+# pages incorporating the repertoire of Shift-JIS and Unicode, consult the
+# VENDORS mapping data.
+#
+#
+# Format: Three tab-separated columns
+# Column #1 is the shift-JIS code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+# The official names for Unicode characters U+4E00
+# to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX",
+# where XXXX is the code point. Including all these
+# names in this file increases its size substantially
+# and needlessly. The token "<CJK>" is used for the
+# name of these characters. If necessary, it can be
+# expanded algorithmically by a parser or editor.
+#
+# The entries are ordered by their Shift-JIS codes as follows:
+# Single-byte characters precede double-byte characters
+# The single-byte and double-byte blocks are in ascending
+# hexadecimal order
+# There is an alternative order some people might be preferred,
+# where all the entries are in order of the top (or only) byte.
+# This alternate order can be generated from the one given here
+# by a simple sort.
+#
+# Revision History:
+#
+# [v2.0, 2015 December 02]
+# updates to copyright notice and terms of use
+# no changes to character mappings
+#
+# [v1.0, 2011 October 14]
+# Updated terms of use to current wording.
+# Updated contact information.
+# No changes to the mapping data.
+#
+# [v0.9, 8 March 1994]
+# First release.
+#
+# Use the Unicode reporting form <http://www.unicode.org/reporting.html>
+# for any questions or comments or to report errors in the data.
+#
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x00A5 # YEN SIGN
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x203E # OVERLINE
+0x8140 0x3000 # IDEOGRAPHIC SPACE
+0x8141 0x3001 # IDEOGRAPHIC COMMA
+0x8142 0x3002 # IDEOGRAPHIC FULL STOP
+0x8143 0xFF0C # FULLWIDTH COMMA
+0x8144 0xFF0E # FULLWIDTH FULL STOP
+0x8145 0x30FB # KATAKANA MIDDLE DOT
+0x8146 0xFF1A # FULLWIDTH COLON
+0x8147 0xFF1B # FULLWIDTH SEMICOLON
+0x8148 0xFF1F # FULLWIDTH QUESTION MARK
+0x8149 0xFF01 # FULLWIDTH EXCLAMATION MARK
+0x814A 0x309B # KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B 0x309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C 0x00B4 # ACUTE ACCENT
+0x814D 0xFF40 # FULLWIDTH GRAVE ACCENT
+0x814E 0x00A8 # DIAERESIS
+0x814F 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT
+0x8150 0xFFE3 # FULLWIDTH MACRON
+0x8151 0xFF3F # FULLWIDTH LOW LINE
+0x8152 0x30FD # KATAKANA ITERATION MARK
+0x8153 0x30FE # KATAKANA VOICED ITERATION MARK
+0x8154 0x309D # HIRAGANA ITERATION MARK
+0x8155 0x309E # HIRAGANA VOICED ITERATION MARK
+0x8156 0x3003 # DITTO MARK
+0x8157 0x4EDD # <CJK>
+0x8158 0x3005 # IDEOGRAPHIC ITERATION MARK
+0x8159 0x3006 # IDEOGRAPHIC CLOSING MARK
+0x815A 0x3007 # IDEOGRAPHIC NUMBER ZERO
+0x815B 0x30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C 0x2015 # HORIZONTAL BAR
+0x815D 0x2010 # HYPHEN
+0x815E 0xFF0F # FULLWIDTH SOLIDUS
+0x815F 0x005C # REVERSE SOLIDUS
+0x8160 0x301C # WAVE DASH
+0x8161 0x2016 # DOUBLE VERTICAL LINE
+0x8162 0xFF5C # FULLWIDTH VERTICAL LINE
+0x8163 0x2026 # HORIZONTAL ELLIPSIS
+0x8164 0x2025 # TWO DOT LEADER
+0x8165 0x2018 # LEFT SINGLE QUOTATION MARK
+0x8166 0x2019 # RIGHT SINGLE QUOTATION MARK
+0x8167 0x201C # LEFT DOUBLE QUOTATION MARK
+0x8168 0x201D # RIGHT DOUBLE QUOTATION MARK
+0x8169 0xFF08 # FULLWIDTH LEFT PARENTHESIS
+0x816A 0xFF09 # FULLWIDTH RIGHT PARENTHESIS
+0x816B 0x3014 # LEFT TORTOISE SHELL BRACKET
+0x816C 0x3015 # RIGHT TORTOISE SHELL BRACKET
+0x816D 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET
+0x816E 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET
+0x816F 0xFF5B # FULLWIDTH LEFT CURLY BRACKET
+0x8170 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET
+0x8171 0x3008 # LEFT ANGLE BRACKET
+0x8172 0x3009 # RIGHT ANGLE BRACKET
+0x8173 0x300A # LEFT DOUBLE ANGLE BRACKET
+0x8174 0x300B # RIGHT DOUBLE ANGLE BRACKET
+0x8175 0x300C # LEFT CORNER BRACKET
+0x8176 0x300D # RIGHT CORNER BRACKET
+0x8177 0x300E # LEFT WHITE CORNER BRACKET
+0x8178 0x300F # RIGHT WHITE CORNER BRACKET
+0x8179 0x3010 # LEFT BLACK LENTICULAR BRACKET
+0x817A 0x3011 # RIGHT BLACK LENTICULAR BRACKET
+0x817B 0xFF0B # FULLWIDTH PLUS SIGN
+0x817C 0x2212 # MINUS SIGN
+0x817D 0x00B1 # PLUS-MINUS SIGN
+0x817E 0x00D7 # MULTIPLICATION SIGN
+0x8180 0x00F7 # DIVISION SIGN
+0x8181 0xFF1D # FULLWIDTH EQUALS SIGN
+0x8182 0x2260 # NOT EQUAL TO
+0x8183 0xFF1C # FULLWIDTH LESS-THAN SIGN
+0x8184 0xFF1E # FULLWIDTH GREATER-THAN SIGN
+0x8185 0x2266 # LESS-THAN OVER EQUAL TO
+0x8186 0x2267 # GREATER-THAN OVER EQUAL TO
+0x8187 0x221E # INFINITY
+0x8188 0x2234 # THEREFORE
+0x8189 0x2642 # MALE SIGN
+0x818A 0x2640 # FEMALE SIGN
+0x818B 0x00B0 # DEGREE SIGN
+0x818C 0x2032 # PRIME
+0x818D 0x2033 # DOUBLE PRIME
+0x818E 0x2103 # DEGREE CELSIUS
+0x818F 0xFFE5 # FULLWIDTH YEN SIGN
+0x8190 0xFF04 # FULLWIDTH DOLLAR SIGN
+0x8191 0x00A2 # CENT SIGN
+0x8192 0x00A3 # POUND SIGN
+0x8193 0xFF05 # FULLWIDTH PERCENT SIGN
+0x8194 0xFF03 # FULLWIDTH NUMBER SIGN
+0x8195 0xFF06 # FULLWIDTH AMPERSAND
+0x8196 0xFF0A # FULLWIDTH ASTERISK
+0x8197 0xFF20 # FULLWIDTH COMMERCIAL AT
+0x8198 0x00A7 # SECTION SIGN
+0x8199 0x2606 # WHITE STAR
+0x819A 0x2605 # BLACK STAR
+0x819B 0x25CB # WHITE CIRCLE
+0x819C 0x25CF # BLACK CIRCLE
+0x819D 0x25CE # BULLSEYE
+0x819E 0x25C7 # WHITE DIAMOND
+0x819F 0x25C6 # BLACK DIAMOND
+0x81A0 0x25A1 # WHITE SQUARE
+0x81A1 0x25A0 # BLACK SQUARE
+0x81A2 0x25B3 # WHITE UP-POINTING TRIANGLE
+0x81A3 0x25B2 # BLACK UP-POINTING TRIANGLE
+0x81A4 0x25BD # WHITE DOWN-POINTING TRIANGLE
+0x81A5 0x25BC # BLACK DOWN-POINTING TRIANGLE
+0x81A6 0x203B # REFERENCE MARK
+0x81A7 0x3012 # POSTAL MARK
+0x81A8 0x2192 # RIGHTWARDS ARROW
+0x81A9 0x2190 # LEFTWARDS ARROW
+0x81AA 0x2191 # UPWARDS ARROW
+0x81AB 0x2193 # DOWNWARDS ARROW
+0x81AC 0x3013 # GETA MARK
+0x81B8 0x2208 # ELEMENT OF
+0x81B9 0x220B # CONTAINS AS MEMBER
+0x81BA 0x2286 # SUBSET OF OR EQUAL TO
+0x81BB 0x2287 # SUPERSET OF OR EQUAL TO
+0x81BC 0x2282 # SUBSET OF
+0x81BD 0x2283 # SUPERSET OF
+0x81BE 0x222A # UNION
+0x81BF 0x2229 # INTERSECTION
+0x81C8 0x2227 # LOGICAL AND
+0x81C9 0x2228 # LOGICAL OR
+0x81CA 0x00AC # NOT SIGN
+0x81CB 0x21D2 # RIGHTWARDS DOUBLE ARROW
+0x81CC 0x21D4 # LEFT RIGHT DOUBLE ARROW
+0x81CD 0x2200 # FOR ALL
+0x81CE 0x2203 # THERE EXISTS
+0x81DA 0x2220 # ANGLE
+0x81DB 0x22A5 # UP TACK
+0x81DC 0x2312 # ARC
+0x81DD 0x2202 # PARTIAL DIFFERENTIAL
+0x81DE 0x2207 # NABLA
+0x81DF 0x2261 # IDENTICAL TO
+0x81E0 0x2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x81E1 0x226A # MUCH LESS-THAN
+0x81E2 0x226B # MUCH GREATER-THAN
+0x81E3 0x221A # SQUARE ROOT
+0x81E4 0x223D # REVERSED TILDE
+0x81E5 0x221D # PROPORTIONAL TO
+0x81E6 0x2235 # BECAUSE
+0x81E7 0x222B # INTEGRAL
+0x81E8 0x222C # DOUBLE INTEGRAL
+0x81F0 0x212B # ANGSTROM SIGN
+0x81F1 0x2030 # PER MILLE SIGN
+0x81F2 0x266F # MUSIC SHARP SIGN
+0x81F3 0x266D # MUSIC FLAT SIGN
+0x81F4 0x266A # EIGHTH NOTE
+0x81F5 0x2020 # DAGGER
+0x81F6 0x2021 # DOUBLE DAGGER
+0x81F7 0x00B6 # PILCROW SIGN
+0x81FC 0x25EF # LARGE CIRCLE
+0x824F 0xFF10 # FULLWIDTH DIGIT ZERO
+0x8250 0xFF11 # FULLWIDTH DIGIT ONE
+0x8251 0xFF12 # FULLWIDTH DIGIT TWO
+0x8252 0xFF13 # FULLWIDTH DIGIT THREE
+0x8253 0xFF14 # FULLWIDTH DIGIT FOUR
+0x8254 0xFF15 # FULLWIDTH DIGIT FIVE
+0x8255 0xFF16 # FULLWIDTH DIGIT SIX
+0x8256 0xFF17 # FULLWIDTH DIGIT SEVEN
+0x8257 0xFF18 # FULLWIDTH DIGIT EIGHT
+0x8258 0xFF19 # FULLWIDTH DIGIT NINE
+0x8260 0xFF21 # FULLWIDTH LATIN CAPITAL LETTER A
+0x8261 0xFF22 # FULLWIDTH LATIN CAPITAL LETTER B
+0x8262 0xFF23 # FULLWIDTH LATIN CAPITAL LETTER C
+0x8263 0xFF24 # FULLWIDTH LATIN CAPITAL LETTER D
+0x8264 0xFF25 # FULLWIDTH LATIN CAPITAL LETTER E
+0x8265 0xFF26 # FULLWIDTH LATIN CAPITAL LETTER F
+0x8266 0xFF27 # FULLWIDTH LATIN CAPITAL LETTER G
+0x8267 0xFF28 # FULLWIDTH LATIN CAPITAL LETTER H
+0x8268 0xFF29 # FULLWIDTH LATIN CAPITAL LETTER I
+0x8269 0xFF2A # FULLWIDTH LATIN CAPITAL LETTER J
+0x826A 0xFF2B # FULLWIDTH LATIN CAPITAL LETTER K
+0x826B 0xFF2C # FULLWIDTH LATIN CAPITAL LETTER L
+0x826C 0xFF2D # FULLWIDTH LATIN CAPITAL LETTER M
+0x826D 0xFF2E # FULLWIDTH LATIN CAPITAL LETTER N
+0x826E 0xFF2F # FULLWIDTH LATIN CAPITAL LETTER O
+0x826F 0xFF30 # FULLWIDTH LATIN CAPITAL LETTER P
+0x8270 0xFF31 # FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271 0xFF32 # FULLWIDTH LATIN CAPITAL LETTER R
+0x8272 0xFF33 # FULLWIDTH LATIN CAPITAL LETTER S
+0x8273 0xFF34 # FULLWIDTH LATIN CAPITAL LETTER T
+0x8274 0xFF35 # FULLWIDTH LATIN CAPITAL LETTER U
+0x8275 0xFF36 # FULLWIDTH LATIN CAPITAL LETTER V
+0x8276 0xFF37 # FULLWIDTH LATIN CAPITAL LETTER W
+0x8277 0xFF38 # FULLWIDTH LATIN CAPITAL LETTER X
+0x8278 0xFF39 # FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279 0xFF3A # FULLWIDTH LATIN CAPITAL LETTER Z
+0x8281 0xFF41 # FULLWIDTH LATIN SMALL LETTER A
+0x8282 0xFF42 # FULLWIDTH LATIN SMALL LETTER B
+0x8283 0xFF43 # FULLWIDTH LATIN SMALL LETTER C
+0x8284 0xFF44 # FULLWIDTH LATIN SMALL LETTER D
+0x8285 0xFF45 # FULLWIDTH LATIN SMALL LETTER E
+0x8286 0xFF46 # FULLWIDTH LATIN SMALL LETTER F
+0x8287 0xFF47 # FULLWIDTH LATIN SMALL LETTER G
+0x8288 0xFF48 # FULLWIDTH LATIN SMALL LETTER H
+0x8289 0xFF49 # FULLWIDTH LATIN SMALL LETTER I
+0x828A 0xFF4A # FULLWIDTH LATIN SMALL LETTER J
+0x828B 0xFF4B # FULLWIDTH LATIN SMALL LETTER K
+0x828C 0xFF4C # FULLWIDTH LATIN SMALL LETTER L
+0x828D 0xFF4D # FULLWIDTH LATIN SMALL LETTER M
+0x828E 0xFF4E # FULLWIDTH LATIN SMALL LETTER N
+0x828F 0xFF4F # FULLWIDTH LATIN SMALL LETTER O
+0x8290 0xFF50 # FULLWIDTH LATIN SMALL LETTER P
+0x8291 0xFF51 # FULLWIDTH LATIN SMALL LETTER Q
+0x8292 0xFF52 # FULLWIDTH LATIN SMALL LETTER R
+0x8293 0xFF53 # FULLWIDTH LATIN SMALL LETTER S
+0x8294 0xFF54 # FULLWIDTH LATIN SMALL LETTER T
+0x8295 0xFF55 # FULLWIDTH LATIN SMALL LETTER U
+0x8296 0xFF56 # FULLWIDTH LATIN SMALL LETTER V
+0x8297 0xFF57 # FULLWIDTH LATIN SMALL LETTER W
+0x8298 0xFF58 # FULLWIDTH LATIN SMALL LETTER X
+0x8299 0xFF59 # FULLWIDTH LATIN SMALL LETTER Y
+0x829A 0xFF5A # FULLWIDTH LATIN SMALL LETTER Z
+0x829F 0x3041 # HIRAGANA LETTER SMALL A
+0x82A0 0x3042 # HIRAGANA LETTER A
+0x82A1 0x3043 # HIRAGANA LETTER SMALL I
+0x82A2 0x3044 # HIRAGANA LETTER I
+0x82A3 0x3045 # HIRAGANA LETTER SMALL U
+0x82A4 0x3046 # HIRAGANA LETTER U
+0x82A5 0x3047 # HIRAGANA LETTER SMALL E
+0x82A6 0x3048 # HIRAGANA LETTER E
+0x82A7 0x3049 # HIRAGANA LETTER SMALL O
+0x82A8 0x304A # HIRAGANA LETTER O
+0x82A9 0x304B # HIRAGANA LETTER KA
+0x82AA 0x304C # HIRAGANA LETTER GA
+0x82AB 0x304D # HIRAGANA LETTER KI
+0x82AC 0x304E # HIRAGANA LETTER GI
+0x82AD 0x304F # HIRAGANA LETTER KU
+0x82AE 0x3050 # HIRAGANA LETTER GU
+0x82AF 0x3051 # HIRAGANA LETTER KE
+0x82B0 0x3052 # HIRAGANA LETTER GE
+0x82B1 0x3053 # HIRAGANA LETTER KO
+0x82B2 0x3054 # HIRAGANA LETTER GO
+0x82B3 0x3055 # HIRAGANA LETTER SA
+0x82B4 0x3056 # HIRAGANA LETTER ZA
+0x82B5 0x3057 # HIRAGANA LETTER SI
+0x82B6 0x3058 # HIRAGANA LETTER ZI
+0x82B7 0x3059 # HIRAGANA LETTER SU
+0x82B8 0x305A # HIRAGANA LETTER ZU
+0x82B9 0x305B # HIRAGANA LETTER SE
+0x82BA 0x305C # HIRAGANA LETTER ZE
+0x82BB 0x305D # HIRAGANA LETTER SO
+0x82BC 0x305E # HIRAGANA LETTER ZO
+0x82BD 0x305F # HIRAGANA LETTER TA
+0x82BE 0x3060 # HIRAGANA LETTER DA
+0x82BF 0x3061 # HIRAGANA LETTER TI
+0x82C0 0x3062 # HIRAGANA LETTER DI
+0x82C1 0x3063 # HIRAGANA LETTER SMALL TU
+0x82C2 0x3064 # HIRAGANA LETTER TU
+0x82C3 0x3065 # HIRAGANA LETTER DU
+0x82C4 0x3066 # HIRAGANA LETTER TE
+0x82C5 0x3067 # HIRAGANA LETTER DE
+0x82C6 0x3068 # HIRAGANA LETTER TO
+0x82C7 0x3069 # HIRAGANA LETTER DO
+0x82C8 0x306A # HIRAGANA LETTER NA
+0x82C9 0x306B # HIRAGANA LETTER NI
+0x82CA 0x306C # HIRAGANA LETTER NU
+0x82CB 0x306D # HIRAGANA LETTER NE
+0x82CC 0x306E # HIRAGANA LETTER NO
+0x82CD 0x306F # HIRAGANA LETTER HA
+0x82CE 0x3070 # HIRAGANA LETTER BA
+0x82CF 0x3071 # HIRAGANA LETTER PA
+0x82D0 0x3072 # HIRAGANA LETTER HI
+0x82D1 0x3073 # HIRAGANA LETTER BI
+0x82D2 0x3074 # HIRAGANA LETTER PI
+0x82D3 0x3075 # HIRAGANA LETTER HU
+0x82D4 0x3076 # HIRAGANA LETTER BU
+0x82D5 0x3077 # HIRAGANA LETTER PU
+0x82D6 0x3078 # HIRAGANA LETTER HE
+0x82D7 0x3079 # HIRAGANA LETTER BE
+0x82D8 0x307A # HIRAGANA LETTER PE
+0x82D9 0x307B # HIRAGANA LETTER HO
+0x82DA 0x307C # HIRAGANA LETTER BO
+0x82DB 0x307D # HIRAGANA LETTER PO
+0x82DC 0x307E # HIRAGANA LETTER MA
+0x82DD 0x307F # HIRAGANA LETTER MI
+0x82DE 0x3080 # HIRAGANA LETTER MU
+0x82DF 0x3081 # HIRAGANA LETTER ME
+0x82E0 0x3082 # HIRAGANA LETTER MO
+0x82E1 0x3083 # HIRAGANA LETTER SMALL YA
+0x82E2 0x3084 # HIRAGANA LETTER YA
+0x82E3 0x3085 # HIRAGANA LETTER SMALL YU
+0x82E4 0x3086 # HIRAGANA LETTER YU
+0x82E5 0x3087 # HIRAGANA LETTER SMALL YO
+0x82E6 0x3088 # HIRAGANA LETTER YO
+0x82E7 0x3089 # HIRAGANA LETTER RA
+0x82E8 0x308A # HIRAGANA LETTER RI
+0x82E9 0x308B # HIRAGANA LETTER RU
+0x82EA 0x308C # HIRAGANA LETTER RE
+0x82EB 0x308D # HIRAGANA LETTER RO
+0x82EC 0x308E # HIRAGANA LETTER SMALL WA
+0x82ED 0x308F # HIRAGANA LETTER WA
+0x82EE 0x3090 # HIRAGANA LETTER WI
+0x82EF 0x3091 # HIRAGANA LETTER WE
+0x82F0 0x3092 # HIRAGANA LETTER WO
+0x82F1 0x3093 # HIRAGANA LETTER N
+0x8340 0x30A1 # KATAKANA LETTER SMALL A
+0x8341 0x30A2 # KATAKANA LETTER A
+0x8342 0x30A3 # KATAKANA LETTER SMALL I
+0x8343 0x30A4 # KATAKANA LETTER I
+0x8344 0x30A5 # KATAKANA LETTER SMALL U
+0x8345 0x30A6 # KATAKANA LETTER U
+0x8346 0x30A7 # KATAKANA LETTER SMALL E
+0x8347 0x30A8 # KATAKANA LETTER E
+0x8348 0x30A9 # KATAKANA LETTER SMALL O
+0x8349 0x30AA # KATAKANA LETTER O
+0x834A 0x30AB # KATAKANA LETTER KA
+0x834B 0x30AC # KATAKANA LETTER GA
+0x834C 0x30AD # KATAKANA LETTER KI
+0x834D 0x30AE # KATAKANA LETTER GI
+0x834E 0x30AF # KATAKANA LETTER KU
+0x834F 0x30B0 # KATAKANA LETTER GU
+0x8350 0x30B1 # KATAKANA LETTER KE
+0x8351 0x30B2 # KATAKANA LETTER GE
+0x8352 0x30B3 # KATAKANA LETTER KO
+0x8353 0x30B4 # KATAKANA LETTER GO
+0x8354 0x30B5 # KATAKANA LETTER SA
+0x8355 0x30B6 # KATAKANA LETTER ZA
+0x8356 0x30B7 # KATAKANA LETTER SI
+0x8357 0x30B8 # KATAKANA LETTER ZI
+0x8358 0x30B9 # KATAKANA LETTER SU
+0x8359 0x30BA # KATAKANA LETTER ZU
+0x835A 0x30BB # KATAKANA LETTER SE
+0x835B 0x30BC # KATAKANA LETTER ZE
+0x835C 0x30BD # KATAKANA LETTER SO
+0x835D 0x30BE # KATAKANA LETTER ZO
+0x835E 0x30BF # KATAKANA LETTER TA
+0x835F 0x30C0 # KATAKANA LETTER DA
+0x8360 0x30C1 # KATAKANA LETTER TI
+0x8361 0x30C2 # KATAKANA LETTER DI
+0x8362 0x30C3 # KATAKANA LETTER SMALL TU
+0x8363 0x30C4 # KATAKANA LETTER TU
+0x8364 0x30C5 # KATAKANA LETTER DU
+0x8365 0x30C6 # KATAKANA LETTER TE
+0x8366 0x30C7 # KATAKANA LETTER DE
+0x8367 0x30C8 # KATAKANA LETTER TO
+0x8368 0x30C9 # KATAKANA LETTER DO
+0x8369 0x30CA # KATAKANA LETTER NA
+0x836A 0x30CB # KATAKANA LETTER NI
+0x836B 0x30CC # KATAKANA LETTER NU
+0x836C 0x30CD # KATAKANA LETTER NE
+0x836D 0x30CE # KATAKANA LETTER NO
+0x836E 0x30CF # KATAKANA LETTER HA
+0x836F 0x30D0 # KATAKANA LETTER BA
+0x8370 0x30D1 # KATAKANA LETTER PA
+0x8371 0x30D2 # KATAKANA LETTER HI
+0x8372 0x30D3 # KATAKANA LETTER BI
+0x8373 0x30D4 # KATAKANA LETTER PI
+0x8374 0x30D5 # KATAKANA LETTER HU
+0x8375 0x30D6 # KATAKANA LETTER BU
+0x8376 0x30D7 # KATAKANA LETTER PU
+0x8377 0x30D8 # KATAKANA LETTER HE
+0x8378 0x30D9 # KATAKANA LETTER BE
+0x8379 0x30DA # KATAKANA LETTER PE
+0x837A 0x30DB # KATAKANA LETTER HO
+0x837B 0x30DC # KATAKANA LETTER BO
+0x837C 0x30DD # KATAKANA LETTER PO
+0x837D 0x30DE # KATAKANA LETTER MA
+0x837E 0x30DF # KATAKANA LETTER MI
+0x8380 0x30E0 # KATAKANA LETTER MU
+0x8381 0x30E1 # KATAKANA LETTER ME
+0x8382 0x30E2 # KATAKANA LETTER MO
+0x8383 0x30E3 # KATAKANA LETTER SMALL YA
+0x8384 0x30E4 # KATAKANA LETTER YA
+0x8385 0x30E5 # KATAKANA LETTER SMALL YU
+0x8386 0x30E6 # KATAKANA LETTER YU
+0x8387 0x30E7 # KATAKANA LETTER SMALL YO
+0x8388 0x30E8 # KATAKANA LETTER YO
+0x8389 0x30E9 # KATAKANA LETTER RA
+0x838A 0x30EA # KATAKANA LETTER RI
+0x838B 0x30EB # KATAKANA LETTER RU
+0x838C 0x30EC # KATAKANA LETTER RE
+0x838D 0x30ED # KATAKANA LETTER RO
+0x838E 0x30EE # KATAKANA LETTER SMALL WA
+0x838F 0x30EF # KATAKANA LETTER WA
+0x8390 0x30F0 # KATAKANA LETTER WI
+0x8391 0x30F1 # KATAKANA LETTER WE
+0x8392 0x30F2 # KATAKANA LETTER WO
+0x8393 0x30F3 # KATAKANA LETTER N
+0x8394 0x30F4 # KATAKANA LETTER VU
+0x8395 0x30F5 # KATAKANA LETTER SMALL KA
+0x8396 0x30F6 # KATAKANA LETTER SMALL KE
+0x839F 0x0391 # GREEK CAPITAL LETTER ALPHA
+0x83A0 0x0392 # GREEK CAPITAL LETTER BETA
+0x83A1 0x0393 # GREEK CAPITAL LETTER GAMMA
+0x83A2 0x0394 # GREEK CAPITAL LETTER DELTA
+0x83A3 0x0395 # GREEK CAPITAL LETTER EPSILON
+0x83A4 0x0396 # GREEK CAPITAL LETTER ZETA
+0x83A5 0x0397 # GREEK CAPITAL LETTER ETA
+0x83A6 0x0398 # GREEK CAPITAL LETTER THETA
+0x83A7 0x0399 # GREEK CAPITAL LETTER IOTA
+0x83A8 0x039A # GREEK CAPITAL LETTER KAPPA
+0x83A9 0x039B # GREEK CAPITAL LETTER LAMDA
+0x83AA 0x039C # GREEK CAPITAL LETTER MU
+0x83AB 0x039D # GREEK CAPITAL LETTER NU
+0x83AC 0x039E # GREEK CAPITAL LETTER XI
+0x83AD 0x039F # GREEK CAPITAL LETTER OMICRON
+0x83AE 0x03A0 # GREEK CAPITAL LETTER PI
+0x83AF 0x03A1 # GREEK CAPITAL LETTER RHO
+0x83B0 0x03A3 # GREEK CAPITAL LETTER SIGMA
+0x83B1 0x03A4 # GREEK CAPITAL LETTER TAU
+0x83B2 0x03A5 # GREEK CAPITAL LETTER UPSILON
+0x83B3 0x03A6 # GREEK CAPITAL LETTER PHI
+0x83B4 0x03A7 # GREEK CAPITAL LETTER CHI
+0x83B5 0x03A8 # GREEK CAPITAL LETTER PSI
+0x83B6 0x03A9 # GREEK CAPITAL LETTER OMEGA
+0x83BF 0x03B1 # GREEK SMALL LETTER ALPHA
+0x83C0 0x03B2 # GREEK SMALL LETTER BETA
+0x83C1 0x03B3 # GREEK SMALL LETTER GAMMA
+0x83C2 0x03B4 # GREEK SMALL LETTER DELTA
+0x83C3 0x03B5 # GREEK SMALL LETTER EPSILON
+0x83C4 0x03B6 # GREEK SMALL LETTER ZETA
+0x83C5 0x03B7 # GREEK SMALL LETTER ETA
+0x83C6 0x03B8 # GREEK SMALL LETTER THETA
+0x83C7 0x03B9 # GREEK SMALL LETTER IOTA
+0x83C8 0x03BA # GREEK SMALL LETTER KAPPA
+0x83C9 0x03BB # GREEK SMALL LETTER LAMDA
+0x83CA 0x03BC # GREEK SMALL LETTER MU
+0x83CB 0x03BD # GREEK SMALL LETTER NU
+0x83CC 0x03BE # GREEK SMALL LETTER XI
+0x83CD 0x03BF # GREEK SMALL LETTER OMICRON
+0x83CE 0x03C0 # GREEK SMALL LETTER PI
+0x83CF 0x03C1 # GREEK SMALL LETTER RHO
+0x83D0 0x03C3 # GREEK SMALL LETTER SIGMA
+0x83D1 0x03C4 # GREEK SMALL LETTER TAU
+0x83D2 0x03C5 # GREEK SMALL LETTER UPSILON
+0x83D3 0x03C6 # GREEK SMALL LETTER PHI
+0x83D4 0x03C7 # GREEK SMALL LETTER CHI
+0x83D5 0x03C8 # GREEK SMALL LETTER PSI
+0x83D6 0x03C9 # GREEK SMALL LETTER OMEGA
+0x8440 0x0410 # CYRILLIC CAPITAL LETTER A
+0x8441 0x0411 # CYRILLIC CAPITAL LETTER BE
+0x8442 0x0412 # CYRILLIC CAPITAL LETTER VE
+0x8443 0x0413 # CYRILLIC CAPITAL LETTER GHE
+0x8444 0x0414 # CYRILLIC CAPITAL LETTER DE
+0x8445 0x0415 # CYRILLIC CAPITAL LETTER IE
+0x8446 0x0401 # CYRILLIC CAPITAL LETTER IO
+0x8447 0x0416 # CYRILLIC CAPITAL LETTER ZHE
+0x8448 0x0417 # CYRILLIC CAPITAL LETTER ZE
+0x8449 0x0418 # CYRILLIC CAPITAL LETTER I
+0x844A 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
+0x844B 0x041A # CYRILLIC CAPITAL LETTER KA
+0x844C 0x041B # CYRILLIC CAPITAL LETTER EL
+0x844D 0x041C # CYRILLIC CAPITAL LETTER EM
+0x844E 0x041D # CYRILLIC CAPITAL LETTER EN
+0x844F 0x041E # CYRILLIC CAPITAL LETTER O
+0x8450 0x041F # CYRILLIC CAPITAL LETTER PE
+0x8451 0x0420 # CYRILLIC CAPITAL LETTER ER
+0x8452 0x0421 # CYRILLIC CAPITAL LETTER ES
+0x8453 0x0422 # CYRILLIC CAPITAL LETTER TE
+0x8454 0x0423 # CYRILLIC CAPITAL LETTER U
+0x8455 0x0424 # CYRILLIC CAPITAL LETTER EF
+0x8456 0x0425 # CYRILLIC CAPITAL LETTER HA
+0x8457 0x0426 # CYRILLIC CAPITAL LETTER TSE
+0x8458 0x0427 # CYRILLIC CAPITAL LETTER CHE
+0x8459 0x0428 # CYRILLIC CAPITAL LETTER SHA
+0x845A 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
+0x845B 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C 0x042B # CYRILLIC CAPITAL LETTER YERU
+0x845D 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E 0x042D # CYRILLIC CAPITAL LETTER E
+0x845F 0x042E # CYRILLIC CAPITAL LETTER YU
+0x8460 0x042F # CYRILLIC CAPITAL LETTER YA
+0x8470 0x0430 # CYRILLIC SMALL LETTER A
+0x8471 0x0431 # CYRILLIC SMALL LETTER BE
+0x8472 0x0432 # CYRILLIC SMALL LETTER VE
+0x8473 0x0433 # CYRILLIC SMALL LETTER GHE
+0x8474 0x0434 # CYRILLIC SMALL LETTER DE
+0x8475 0x0435 # CYRILLIC SMALL LETTER IE
+0x8476 0x0451 # CYRILLIC SMALL LETTER IO
+0x8477 0x0436 # CYRILLIC SMALL LETTER ZHE
+0x8478 0x0437 # CYRILLIC SMALL LETTER ZE
+0x8479 0x0438 # CYRILLIC SMALL LETTER I
+0x847A 0x0439 # CYRILLIC SMALL LETTER SHORT I
+0x847B 0x043A # CYRILLIC SMALL LETTER KA
+0x847C 0x043B # CYRILLIC SMALL LETTER EL
+0x847D 0x043C # CYRILLIC SMALL LETTER EM
+0x847E 0x043D # CYRILLIC SMALL LETTER EN
+0x8480 0x043E # CYRILLIC SMALL LETTER O
+0x8481 0x043F # CYRILLIC SMALL LETTER PE
+0x8482 0x0440 # CYRILLIC SMALL LETTER ER
+0x8483 0x0441 # CYRILLIC SMALL LETTER ES
+0x8484 0x0442 # CYRILLIC SMALL LETTER TE
+0x8485 0x0443 # CYRILLIC SMALL LETTER U
+0x8486 0x0444 # CYRILLIC SMALL LETTER EF
+0x8487 0x0445 # CYRILLIC SMALL LETTER HA
+0x8488 0x0446 # CYRILLIC SMALL LETTER TSE
+0x8489 0x0447 # CYRILLIC SMALL LETTER CHE
+0x848A 0x0448 # CYRILLIC SMALL LETTER SHA
+0x848B 0x0449 # CYRILLIC SMALL LETTER SHCHA
+0x848C 0x044A # CYRILLIC SMALL LETTER HARD SIGN
+0x848D 0x044B # CYRILLIC SMALL LETTER YERU
+0x848E 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
+0x848F 0x044D # CYRILLIC SMALL LETTER E
+0x8490 0x044E # CYRILLIC SMALL LETTER YU
+0x8491 0x044F # CYRILLIC SMALL LETTER YA
+0x849F 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
+0x84A0 0x2502 # BOX DRAWINGS LIGHT VERTICAL
+0x84A1 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x84A2 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84A3 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
+0x84A4 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
+0x84A5 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x84A6 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x84A7 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x84A8 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x84A9 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x84AA 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL
+0x84AB 0x2503 # BOX DRAWINGS HEAVY VERTICAL
+0x84AC 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT
+0x84AD 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT
+0x84AE 0x251B # BOX DRAWINGS HEAVY UP AND LEFT
+0x84AF 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT
+0x84B0 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+0x84B1 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+0x84B2 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+0x84B3 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+0x84B4 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+0x84B5 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+0x84B6 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+0x84B7 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+0x84B8 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+0x84B9 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+0x84BA 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+0x84BB 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+0x84BC 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+0x84BD 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+0x84BE 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+0x889F 0x4E9C # <CJK>
+0x88A0 0x5516 # <CJK>
+0x88A1 0x5A03 # <CJK>
+0x88A2 0x963F # <CJK>
+0x88A3 0x54C0 # <CJK>
+0x88A4 0x611B # <CJK>
+0x88A5 0x6328 # <CJK>
+0x88A6 0x59F6 # <CJK>
+0x88A7 0x9022 # <CJK>
+0x88A8 0x8475 # <CJK>
+0x88A9 0x831C # <CJK>
+0x88AA 0x7A50 # <CJK>
+0x88AB 0x60AA # <CJK>
+0x88AC 0x63E1 # <CJK>
+0x88AD 0x6E25 # <CJK>
+0x88AE 0x65ED # <CJK>
+0x88AF 0x8466 # <CJK>
+0x88B0 0x82A6 # <CJK>
+0x88B1 0x9BF5 # <CJK>
+0x88B2 0x6893 # <CJK>
+0x88B3 0x5727 # <CJK>
+0x88B4 0x65A1 # <CJK>
+0x88B5 0x6271 # <CJK>
+0x88B6 0x5B9B # <CJK>
+0x88B7 0x59D0 # <CJK>
+0x88B8 0x867B # <CJK>
+0x88B9 0x98F4 # <CJK>
+0x88BA 0x7D62 # <CJK>
+0x88BB 0x7DBE # <CJK>
+0x88BC 0x9B8E # <CJK>
+0x88BD 0x6216 # <CJK>
+0x88BE 0x7C9F # <CJK>
+0x88BF 0x88B7 # <CJK>
+0x88C0 0x5B89 # <CJK>
+0x88C1 0x5EB5 # <CJK>
+0x88C2 0x6309 # <CJK>
+0x88C3 0x6697 # <CJK>
+0x88C4 0x6848 # <CJK>
+0x88C5 0x95C7 # <CJK>
+0x88C6 0x978D # <CJK>
+0x88C7 0x674F # <CJK>
+0x88C8 0x4EE5 # <CJK>
+0x88C9 0x4F0A # <CJK>
+0x88CA 0x4F4D # <CJK>
+0x88CB 0x4F9D # <CJK>
+0x88CC 0x5049 # <CJK>
+0x88CD 0x56F2 # <CJK>
+0x88CE 0x5937 # <CJK>
+0x88CF 0x59D4 # <CJK>
+0x88D0 0x5A01 # <CJK>
+0x88D1 0x5C09 # <CJK>
+0x88D2 0x60DF # <CJK>
+0x88D3 0x610F # <CJK>
+0x88D4 0x6170 # <CJK>
+0x88D5 0x6613 # <CJK>
+0x88D6 0x6905 # <CJK>
+0x88D7 0x70BA # <CJK>
+0x88D8 0x754F # <CJK>
+0x88D9 0x7570 # <CJK>
+0x88DA 0x79FB # <CJK>
+0x88DB 0x7DAD # <CJK>
+0x88DC 0x7DEF # <CJK>
+0x88DD 0x80C3 # <CJK>
+0x88DE 0x840E # <CJK>
+0x88DF 0x8863 # <CJK>
+0x88E0 0x8B02 # <CJK>
+0x88E1 0x9055 # <CJK>
+0x88E2 0x907A # <CJK>
+0x88E3 0x533B # <CJK>
+0x88E4 0x4E95 # <CJK>
+0x88E5 0x4EA5 # <CJK>
+0x88E6 0x57DF # <CJK>
+0x88E7 0x80B2 # <CJK>
+0x88E8 0x90C1 # <CJK>
+0x88E9 0x78EF # <CJK>
+0x88EA 0x4E00 # <CJK>
+0x88EB 0x58F1 # <CJK>
+0x88EC 0x6EA2 # <CJK>
+0x88ED 0x9038 # <CJK>
+0x88EE 0x7A32 # <CJK>
+0x88EF 0x8328 # <CJK>
+0x88F0 0x828B # <CJK>
+0x88F1 0x9C2F # <CJK>
+0x88F2 0x5141 # <CJK>
+0x88F3 0x5370 # <CJK>
+0x88F4 0x54BD # <CJK>
+0x88F5 0x54E1 # <CJK>
+0x88F6 0x56E0 # <CJK>
+0x88F7 0x59FB # <CJK>
+0x88F8 0x5F15 # <CJK>
+0x88F9 0x98F2 # <CJK>
+0x88FA 0x6DEB # <CJK>
+0x88FB 0x80E4 # <CJK>
+0x88FC 0x852D # <CJK>
+0x8940 0x9662 # <CJK>
+0x8941 0x9670 # <CJK>
+0x8942 0x96A0 # <CJK>
+0x8943 0x97FB # <CJK>
+0x8944 0x540B # <CJK>
+0x8945 0x53F3 # <CJK>
+0x8946 0x5B87 # <CJK>
+0x8947 0x70CF # <CJK>
+0x8948 0x7FBD # <CJK>
+0x8949 0x8FC2 # <CJK>
+0x894A 0x96E8 # <CJK>
+0x894B 0x536F # <CJK>
+0x894C 0x9D5C # <CJK>
+0x894D 0x7ABA # <CJK>
+0x894E 0x4E11 # <CJK>
+0x894F 0x7893 # <CJK>
+0x8950 0x81FC # <CJK>
+0x8951 0x6E26 # <CJK>
+0x8952 0x5618 # <CJK>
+0x8953 0x5504 # <CJK>
+0x8954 0x6B1D # <CJK>
+0x8955 0x851A # <CJK>
+0x8956 0x9C3B # <CJK>
+0x8957 0x59E5 # <CJK>
+0x8958 0x53A9 # <CJK>
+0x8959 0x6D66 # <CJK>
+0x895A 0x74DC # <CJK>
+0x895B 0x958F # <CJK>
+0x895C 0x5642 # <CJK>
+0x895D 0x4E91 # <CJK>
+0x895E 0x904B # <CJK>
+0x895F 0x96F2 # <CJK>
+0x8960 0x834F # <CJK>
+0x8961 0x990C # <CJK>
+0x8962 0x53E1 # <CJK>
+0x8963 0x55B6 # <CJK>
+0x8964 0x5B30 # <CJK>
+0x8965 0x5F71 # <CJK>
+0x8966 0x6620 # <CJK>
+0x8967 0x66F3 # <CJK>
+0x8968 0x6804 # <CJK>
+0x8969 0x6C38 # <CJK>
+0x896A 0x6CF3 # <CJK>
+0x896B 0x6D29 # <CJK>
+0x896C 0x745B # <CJK>
+0x896D 0x76C8 # <CJK>
+0x896E 0x7A4E # <CJK>
+0x896F 0x9834 # <CJK>
+0x8970 0x82F1 # <CJK>
+0x8971 0x885B # <CJK>
+0x8972 0x8A60 # <CJK>
+0x8973 0x92ED # <CJK>
+0x8974 0x6DB2 # <CJK>
+0x8975 0x75AB # <CJK>
+0x8976 0x76CA # <CJK>
+0x8977 0x99C5 # <CJK>
+0x8978 0x60A6 # <CJK>
+0x8979 0x8B01 # <CJK>
+0x897A 0x8D8A # <CJK>
+0x897B 0x95B2 # <CJK>
+0x897C 0x698E # <CJK>
+0x897D 0x53AD # <CJK>
+0x897E 0x5186 # <CJK>
+0x8980 0x5712 # <CJK>
+0x8981 0x5830 # <CJK>
+0x8982 0x5944 # <CJK>
+0x8983 0x5BB4 # <CJK>
+0x8984 0x5EF6 # <CJK>
+0x8985 0x6028 # <CJK>
+0x8986 0x63A9 # <CJK>
+0x8987 0x63F4 # <CJK>
+0x8988 0x6CBF # <CJK>
+0x8989 0x6F14 # <CJK>
+0x898A 0x708E # <CJK>
+0x898B 0x7114 # <CJK>
+0x898C 0x7159 # <CJK>
+0x898D 0x71D5 # <CJK>
+0x898E 0x733F # <CJK>
+0x898F 0x7E01 # <CJK>
+0x8990 0x8276 # <CJK>
+0x8991 0x82D1 # <CJK>
+0x8992 0x8597 # <CJK>
+0x8993 0x9060 # <CJK>
+0x8994 0x925B # <CJK>
+0x8995 0x9D1B # <CJK>
+0x8996 0x5869 # <CJK>
+0x8997 0x65BC # <CJK>
+0x8998 0x6C5A # <CJK>
+0x8999 0x7525 # <CJK>
+0x899A 0x51F9 # <CJK>
+0x899B 0x592E # <CJK>
+0x899C 0x5965 # <CJK>
+0x899D 0x5F80 # <CJK>
+0x899E 0x5FDC # <CJK>
+0x899F 0x62BC # <CJK>
+0x89A0 0x65FA # <CJK>
+0x89A1 0x6A2A # <CJK>
+0x89A2 0x6B27 # <CJK>
+0x89A3 0x6BB4 # <CJK>
+0x89A4 0x738B # <CJK>
+0x89A5 0x7FC1 # <CJK>
+0x89A6 0x8956 # <CJK>
+0x89A7 0x9D2C # <CJK>
+0x89A8 0x9D0E # <CJK>
+0x89A9 0x9EC4 # <CJK>
+0x89AA 0x5CA1 # <CJK>
+0x89AB 0x6C96 # <CJK>
+0x89AC 0x837B # <CJK>
+0x89AD 0x5104 # <CJK>
+0x89AE 0x5C4B # <CJK>
+0x89AF 0x61B6 # <CJK>
+0x89B0 0x81C6 # <CJK>
+0x89B1 0x6876 # <CJK>
+0x89B2 0x7261 # <CJK>
+0x89B3 0x4E59 # <CJK>
+0x89B4 0x4FFA # <CJK>
+0x89B5 0x5378 # <CJK>
+0x89B6 0x6069 # <CJK>
+0x89B7 0x6E29 # <CJK>
+0x89B8 0x7A4F # <CJK>
+0x89B9 0x97F3 # <CJK>
+0x89BA 0x4E0B # <CJK>
+0x89BB 0x5316 # <CJK>
+0x89BC 0x4EEE # <CJK>
+0x89BD 0x4F55 # <CJK>
+0x89BE 0x4F3D # <CJK>
+0x89BF 0x4FA1 # <CJK>
+0x89C0 0x4F73 # <CJK>
+0x89C1 0x52A0 # <CJK>
+0x89C2 0x53EF # <CJK>
+0x89C3 0x5609 # <CJK>
+0x89C4 0x590F # <CJK>
+0x89C5 0x5AC1 # <CJK>
+0x89C6 0x5BB6 # <CJK>
+0x89C7 0x5BE1 # <CJK>
+0x89C8 0x79D1 # <CJK>
+0x89C9 0x6687 # <CJK>
+0x89CA 0x679C # <CJK>
+0x89CB 0x67B6 # <CJK>
+0x89CC 0x6B4C # <CJK>
+0x89CD 0x6CB3 # <CJK>
+0x89CE 0x706B # <CJK>
+0x89CF 0x73C2 # <CJK>
+0x89D0 0x798D # <CJK>
+0x89D1 0x79BE # <CJK>
+0x89D2 0x7A3C # <CJK>
+0x89D3 0x7B87 # <CJK>
+0x89D4 0x82B1 # <CJK>
+0x89D5 0x82DB # <CJK>
+0x89D6 0x8304 # <CJK>
+0x89D7 0x8377 # <CJK>
+0x89D8 0x83EF # <CJK>
+0x89D9 0x83D3 # <CJK>
+0x89DA 0x8766 # <CJK>
+0x89DB 0x8AB2 # <CJK>
+0x89DC 0x5629 # <CJK>
+0x89DD 0x8CA8 # <CJK>
+0x89DE 0x8FE6 # <CJK>
+0x89DF 0x904E # <CJK>
+0x89E0 0x971E # <CJK>
+0x89E1 0x868A # <CJK>
+0x89E2 0x4FC4 # <CJK>
+0x89E3 0x5CE8 # <CJK>
+0x89E4 0x6211 # <CJK>
+0x89E5 0x7259 # <CJK>
+0x89E6 0x753B # <CJK>
+0x89E7 0x81E5 # <CJK>
+0x89E8 0x82BD # <CJK>
+0x89E9 0x86FE # <CJK>
+0x89EA 0x8CC0 # <CJK>
+0x89EB 0x96C5 # <CJK>
+0x89EC 0x9913 # <CJK>
+0x89ED 0x99D5 # <CJK>
+0x89EE 0x4ECB # <CJK>
+0x89EF 0x4F1A # <CJK>
+0x89F0 0x89E3 # <CJK>
+0x89F1 0x56DE # <CJK>
+0x89F2 0x584A # <CJK>
+0x89F3 0x58CA # <CJK>
+0x89F4 0x5EFB # <CJK>
+0x89F5 0x5FEB # <CJK>
+0x89F6 0x602A # <CJK>
+0x89F7 0x6094 # <CJK>
+0x89F8 0x6062 # <CJK>
+0x89F9 0x61D0 # <CJK>
+0x89FA 0x6212 # <CJK>
+0x89FB 0x62D0 # <CJK>
+0x89FC 0x6539 # <CJK>
+0x8A40 0x9B41 # <CJK>
+0x8A41 0x6666 # <CJK>
+0x8A42 0x68B0 # <CJK>
+0x8A43 0x6D77 # <CJK>
+0x8A44 0x7070 # <CJK>
+0x8A45 0x754C # <CJK>
+0x8A46 0x7686 # <CJK>
+0x8A47 0x7D75 # <CJK>
+0x8A48 0x82A5 # <CJK>
+0x8A49 0x87F9 # <CJK>
+0x8A4A 0x958B # <CJK>
+0x8A4B 0x968E # <CJK>
+0x8A4C 0x8C9D # <CJK>
+0x8A4D 0x51F1 # <CJK>
+0x8A4E 0x52BE # <CJK>
+0x8A4F 0x5916 # <CJK>
+0x8A50 0x54B3 # <CJK>
+0x8A51 0x5BB3 # <CJK>
+0x8A52 0x5D16 # <CJK>
+0x8A53 0x6168 # <CJK>
+0x8A54 0x6982 # <CJK>
+0x8A55 0x6DAF # <CJK>
+0x8A56 0x788D # <CJK>
+0x8A57 0x84CB # <CJK>
+0x8A58 0x8857 # <CJK>
+0x8A59 0x8A72 # <CJK>
+0x8A5A 0x93A7 # <CJK>
+0x8A5B 0x9AB8 # <CJK>
+0x8A5C 0x6D6C # <CJK>
+0x8A5D 0x99A8 # <CJK>
+0x8A5E 0x86D9 # <CJK>
+0x8A5F 0x57A3 # <CJK>
+0x8A60 0x67FF # <CJK>
+0x8A61 0x86CE # <CJK>
+0x8A62 0x920E # <CJK>
+0x8A63 0x5283 # <CJK>
+0x8A64 0x5687 # <CJK>
+0x8A65 0x5404 # <CJK>
+0x8A66 0x5ED3 # <CJK>
+0x8A67 0x62E1 # <CJK>
+0x8A68 0x64B9 # <CJK>
+0x8A69 0x683C # <CJK>
+0x8A6A 0x6838 # <CJK>
+0x8A6B 0x6BBB # <CJK>
+0x8A6C 0x7372 # <CJK>
+0x8A6D 0x78BA # <CJK>
+0x8A6E 0x7A6B # <CJK>
+0x8A6F 0x899A # <CJK>
+0x8A70 0x89D2 # <CJK>
+0x8A71 0x8D6B # <CJK>
+0x8A72 0x8F03 # <CJK>
+0x8A73 0x90ED # <CJK>
+0x8A74 0x95A3 # <CJK>
+0x8A75 0x9694 # <CJK>
+0x8A76 0x9769 # <CJK>
+0x8A77 0x5B66 # <CJK>
+0x8A78 0x5CB3 # <CJK>
+0x8A79 0x697D # <CJK>
+0x8A7A 0x984D # <CJK>
+0x8A7B 0x984E # <CJK>
+0x8A7C 0x639B # <CJK>
+0x8A7D 0x7B20 # <CJK>
+0x8A7E 0x6A2B # <CJK>
+0x8A80 0x6A7F # <CJK>
+0x8A81 0x68B6 # <CJK>
+0x8A82 0x9C0D # <CJK>
+0x8A83 0x6F5F # <CJK>
+0x8A84 0x5272 # <CJK>
+0x8A85 0x559D # <CJK>
+0x8A86 0x6070 # <CJK>
+0x8A87 0x62EC # <CJK>
+0x8A88 0x6D3B # <CJK>
+0x8A89 0x6E07 # <CJK>
+0x8A8A 0x6ED1 # <CJK>
+0x8A8B 0x845B # <CJK>
+0x8A8C 0x8910 # <CJK>
+0x8A8D 0x8F44 # <CJK>
+0x8A8E 0x4E14 # <CJK>
+0x8A8F 0x9C39 # <CJK>
+0x8A90 0x53F6 # <CJK>
+0x8A91 0x691B # <CJK>
+0x8A92 0x6A3A # <CJK>
+0x8A93 0x9784 # <CJK>
+0x8A94 0x682A # <CJK>
+0x8A95 0x515C # <CJK>
+0x8A96 0x7AC3 # <CJK>
+0x8A97 0x84B2 # <CJK>
+0x8A98 0x91DC # <CJK>
+0x8A99 0x938C # <CJK>
+0x8A9A 0x565B # <CJK>
+0x8A9B 0x9D28 # <CJK>
+0x8A9C 0x6822 # <CJK>
+0x8A9D 0x8305 # <CJK>
+0x8A9E 0x8431 # <CJK>
+0x8A9F 0x7CA5 # <CJK>
+0x8AA0 0x5208 # <CJK>
+0x8AA1 0x82C5 # <CJK>
+0x8AA2 0x74E6 # <CJK>
+0x8AA3 0x4E7E # <CJK>
+0x8AA4 0x4F83 # <CJK>
+0x8AA5 0x51A0 # <CJK>
+0x8AA6 0x5BD2 # <CJK>
+0x8AA7 0x520A # <CJK>
+0x8AA8 0x52D8 # <CJK>
+0x8AA9 0x52E7 # <CJK>
+0x8AAA 0x5DFB # <CJK>
+0x8AAB 0x559A # <CJK>
+0x8AAC 0x582A # <CJK>
+0x8AAD 0x59E6 # <CJK>
+0x8AAE 0x5B8C # <CJK>
+0x8AAF 0x5B98 # <CJK>
+0x8AB0 0x5BDB # <CJK>
+0x8AB1 0x5E72 # <CJK>
+0x8AB2 0x5E79 # <CJK>
+0x8AB3 0x60A3 # <CJK>
+0x8AB4 0x611F # <CJK>
+0x8AB5 0x6163 # <CJK>
+0x8AB6 0x61BE # <CJK>
+0x8AB7 0x63DB # <CJK>
+0x8AB8 0x6562 # <CJK>
+0x8AB9 0x67D1 # <CJK>
+0x8ABA 0x6853 # <CJK>
+0x8ABB 0x68FA # <CJK>
+0x8ABC 0x6B3E # <CJK>
+0x8ABD 0x6B53 # <CJK>
+0x8ABE 0x6C57 # <CJK>
+0x8ABF 0x6F22 # <CJK>
+0x8AC0 0x6F97 # <CJK>
+0x8AC1 0x6F45 # <CJK>
+0x8AC2 0x74B0 # <CJK>
+0x8AC3 0x7518 # <CJK>
+0x8AC4 0x76E3 # <CJK>
+0x8AC5 0x770B # <CJK>
+0x8AC6 0x7AFF # <CJK>
+0x8AC7 0x7BA1 # <CJK>
+0x8AC8 0x7C21 # <CJK>
+0x8AC9 0x7DE9 # <CJK>
+0x8ACA 0x7F36 # <CJK>
+0x8ACB 0x7FF0 # <CJK>
+0x8ACC 0x809D # <CJK>
+0x8ACD 0x8266 # <CJK>
+0x8ACE 0x839E # <CJK>
+0x8ACF 0x89B3 # <CJK>
+0x8AD0 0x8ACC # <CJK>
+0x8AD1 0x8CAB # <CJK>
+0x8AD2 0x9084 # <CJK>
+0x8AD3 0x9451 # <CJK>
+0x8AD4 0x9593 # <CJK>
+0x8AD5 0x9591 # <CJK>
+0x8AD6 0x95A2 # <CJK>
+0x8AD7 0x9665 # <CJK>
+0x8AD8 0x97D3 # <CJK>
+0x8AD9 0x9928 # <CJK>
+0x8ADA 0x8218 # <CJK>
+0x8ADB 0x4E38 # <CJK>
+0x8ADC 0x542B # <CJK>
+0x8ADD 0x5CB8 # <CJK>
+0x8ADE 0x5DCC # <CJK>
+0x8ADF 0x73A9 # <CJK>
+0x8AE0 0x764C # <CJK>
+0x8AE1 0x773C # <CJK>
+0x8AE2 0x5CA9 # <CJK>
+0x8AE3 0x7FEB # <CJK>
+0x8AE4 0x8D0B # <CJK>
+0x8AE5 0x96C1 # <CJK>
+0x8AE6 0x9811 # <CJK>
+0x8AE7 0x9854 # <CJK>
+0x8AE8 0x9858 # <CJK>
+0x8AE9 0x4F01 # <CJK>
+0x8AEA 0x4F0E # <CJK>
+0x8AEB 0x5371 # <CJK>
+0x8AEC 0x559C # <CJK>
+0x8AED 0x5668 # <CJK>
+0x8AEE 0x57FA # <CJK>
+0x8AEF 0x5947 # <CJK>
+0x8AF0 0x5B09 # <CJK>
+0x8AF1 0x5BC4 # <CJK>
+0x8AF2 0x5C90 # <CJK>
+0x8AF3 0x5E0C # <CJK>
+0x8AF4 0x5E7E # <CJK>
+0x8AF5 0x5FCC # <CJK>
+0x8AF6 0x63EE # <CJK>
+0x8AF7 0x673A # <CJK>
+0x8AF8 0x65D7 # <CJK>
+0x8AF9 0x65E2 # <CJK>
+0x8AFA 0x671F # <CJK>
+0x8AFB 0x68CB # <CJK>
+0x8AFC 0x68C4 # <CJK>
+0x8B40 0x6A5F # <CJK>
+0x8B41 0x5E30 # <CJK>
+0x8B42 0x6BC5 # <CJK>
+0x8B43 0x6C17 # <CJK>
+0x8B44 0x6C7D # <CJK>
+0x8B45 0x757F # <CJK>
+0x8B46 0x7948 # <CJK>
+0x8B47 0x5B63 # <CJK>
+0x8B48 0x7A00 # <CJK>
+0x8B49 0x7D00 # <CJK>
+0x8B4A 0x5FBD # <CJK>
+0x8B4B 0x898F # <CJK>
+0x8B4C 0x8A18 # <CJK>
+0x8B4D 0x8CB4 # <CJK>
+0x8B4E 0x8D77 # <CJK>
+0x8B4F 0x8ECC # <CJK>
+0x8B50 0x8F1D # <CJK>
+0x8B51 0x98E2 # <CJK>
+0x8B52 0x9A0E # <CJK>
+0x8B53 0x9B3C # <CJK>
+0x8B54 0x4E80 # <CJK>
+0x8B55 0x507D # <CJK>
+0x8B56 0x5100 # <CJK>
+0x8B57 0x5993 # <CJK>
+0x8B58 0x5B9C # <CJK>
+0x8B59 0x622F # <CJK>
+0x8B5A 0x6280 # <CJK>
+0x8B5B 0x64EC # <CJK>
+0x8B5C 0x6B3A # <CJK>
+0x8B5D 0x72A0 # <CJK>
+0x8B5E 0x7591 # <CJK>
+0x8B5F 0x7947 # <CJK>
+0x8B60 0x7FA9 # <CJK>
+0x8B61 0x87FB # <CJK>
+0x8B62 0x8ABC # <CJK>
+0x8B63 0x8B70 # <CJK>
+0x8B64 0x63AC # <CJK>
+0x8B65 0x83CA # <CJK>
+0x8B66 0x97A0 # <CJK>
+0x8B67 0x5409 # <CJK>
+0x8B68 0x5403 # <CJK>
+0x8B69 0x55AB # <CJK>
+0x8B6A 0x6854 # <CJK>
+0x8B6B 0x6A58 # <CJK>
+0x8B6C 0x8A70 # <CJK>
+0x8B6D 0x7827 # <CJK>
+0x8B6E 0x6775 # <CJK>
+0x8B6F 0x9ECD # <CJK>
+0x8B70 0x5374 # <CJK>
+0x8B71 0x5BA2 # <CJK>
+0x8B72 0x811A # <CJK>
+0x8B73 0x8650 # <CJK>
+0x8B74 0x9006 # <CJK>
+0x8B75 0x4E18 # <CJK>
+0x8B76 0x4E45 # <CJK>
+0x8B77 0x4EC7 # <CJK>
+0x8B78 0x4F11 # <CJK>
+0x8B79 0x53CA # <CJK>
+0x8B7A 0x5438 # <CJK>
+0x8B7B 0x5BAE # <CJK>
+0x8B7C 0x5F13 # <CJK>
+0x8B7D 0x6025 # <CJK>
+0x8B7E 0x6551 # <CJK>
+0x8B80 0x673D # <CJK>
+0x8B81 0x6C42 # <CJK>
+0x8B82 0x6C72 # <CJK>
+0x8B83 0x6CE3 # <CJK>
+0x8B84 0x7078 # <CJK>
+0x8B85 0x7403 # <CJK>
+0x8B86 0x7A76 # <CJK>
+0x8B87 0x7AAE # <CJK>
+0x8B88 0x7B08 # <CJK>
+0x8B89 0x7D1A # <CJK>
+0x8B8A 0x7CFE # <CJK>
+0x8B8B 0x7D66 # <CJK>
+0x8B8C 0x65E7 # <CJK>
+0x8B8D 0x725B # <CJK>
+0x8B8E 0x53BB # <CJK>
+0x8B8F 0x5C45 # <CJK>
+0x8B90 0x5DE8 # <CJK>
+0x8B91 0x62D2 # <CJK>
+0x8B92 0x62E0 # <CJK>
+0x8B93 0x6319 # <CJK>
+0x8B94 0x6E20 # <CJK>
+0x8B95 0x865A # <CJK>
+0x8B96 0x8A31 # <CJK>
+0x8B97 0x8DDD # <CJK>
+0x8B98 0x92F8 # <CJK>
+0x8B99 0x6F01 # <CJK>
+0x8B9A 0x79A6 # <CJK>
+0x8B9B 0x9B5A # <CJK>
+0x8B9C 0x4EA8 # <CJK>
+0x8B9D 0x4EAB # <CJK>
+0x8B9E 0x4EAC # <CJK>
+0x8B9F 0x4F9B # <CJK>
+0x8BA0 0x4FA0 # <CJK>
+0x8BA1 0x50D1 # <CJK>
+0x8BA2 0x5147 # <CJK>
+0x8BA3 0x7AF6 # <CJK>
+0x8BA4 0x5171 # <CJK>
+0x8BA5 0x51F6 # <CJK>
+0x8BA6 0x5354 # <CJK>
+0x8BA7 0x5321 # <CJK>
+0x8BA8 0x537F # <CJK>
+0x8BA9 0x53EB # <CJK>
+0x8BAA 0x55AC # <CJK>
+0x8BAB 0x5883 # <CJK>
+0x8BAC 0x5CE1 # <CJK>
+0x8BAD 0x5F37 # <CJK>
+0x8BAE 0x5F4A # <CJK>
+0x8BAF 0x602F # <CJK>
+0x8BB0 0x6050 # <CJK>
+0x8BB1 0x606D # <CJK>
+0x8BB2 0x631F # <CJK>
+0x8BB3 0x6559 # <CJK>
+0x8BB4 0x6A4B # <CJK>
+0x8BB5 0x6CC1 # <CJK>
+0x8BB6 0x72C2 # <CJK>
+0x8BB7 0x72ED # <CJK>
+0x8BB8 0x77EF # <CJK>
+0x8BB9 0x80F8 # <CJK>
+0x8BBA 0x8105 # <CJK>
+0x8BBB 0x8208 # <CJK>
+0x8BBC 0x854E # <CJK>
+0x8BBD 0x90F7 # <CJK>
+0x8BBE 0x93E1 # <CJK>
+0x8BBF 0x97FF # <CJK>
+0x8BC0 0x9957 # <CJK>
+0x8BC1 0x9A5A # <CJK>
+0x8BC2 0x4EF0 # <CJK>
+0x8BC3 0x51DD # <CJK>
+0x8BC4 0x5C2D # <CJK>
+0x8BC5 0x6681 # <CJK>
+0x8BC6 0x696D # <CJK>
+0x8BC7 0x5C40 # <CJK>
+0x8BC8 0x66F2 # <CJK>
+0x8BC9 0x6975 # <CJK>
+0x8BCA 0x7389 # <CJK>
+0x8BCB 0x6850 # <CJK>
+0x8BCC 0x7C81 # <CJK>
+0x8BCD 0x50C5 # <CJK>
+0x8BCE 0x52E4 # <CJK>
+0x8BCF 0x5747 # <CJK>
+0x8BD0 0x5DFE # <CJK>
+0x8BD1 0x9326 # <CJK>
+0x8BD2 0x65A4 # <CJK>
+0x8BD3 0x6B23 # <CJK>
+0x8BD4 0x6B3D # <CJK>
+0x8BD5 0x7434 # <CJK>
+0x8BD6 0x7981 # <CJK>
+0x8BD7 0x79BD # <CJK>
+0x8BD8 0x7B4B # <CJK>
+0x8BD9 0x7DCA # <CJK>
+0x8BDA 0x82B9 # <CJK>
+0x8BDB 0x83CC # <CJK>
+0x8BDC 0x887F # <CJK>
+0x8BDD 0x895F # <CJK>
+0x8BDE 0x8B39 # <CJK>
+0x8BDF 0x8FD1 # <CJK>
+0x8BE0 0x91D1 # <CJK>
+0x8BE1 0x541F # <CJK>
+0x8BE2 0x9280 # <CJK>
+0x8BE3 0x4E5D # <CJK>
+0x8BE4 0x5036 # <CJK>
+0x8BE5 0x53E5 # <CJK>
+0x8BE6 0x533A # <CJK>
+0x8BE7 0x72D7 # <CJK>
+0x8BE8 0x7396 # <CJK>
+0x8BE9 0x77E9 # <CJK>
+0x8BEA 0x82E6 # <CJK>
+0x8BEB 0x8EAF # <CJK>
+0x8BEC 0x99C6 # <CJK>
+0x8BED 0x99C8 # <CJK>
+0x8BEE 0x99D2 # <CJK>
+0x8BEF 0x5177 # <CJK>
+0x8BF0 0x611A # <CJK>
+0x8BF1 0x865E # <CJK>
+0x8BF2 0x55B0 # <CJK>
+0x8BF3 0x7A7A # <CJK>
+0x8BF4 0x5076 # <CJK>
+0x8BF5 0x5BD3 # <CJK>
+0x8BF6 0x9047 # <CJK>
+0x8BF7 0x9685 # <CJK>
+0x8BF8 0x4E32 # <CJK>
+0x8BF9 0x6ADB # <CJK>
+0x8BFA 0x91E7 # <CJK>
+0x8BFB 0x5C51 # <CJK>
+0x8BFC 0x5C48 # <CJK>
+0x8C40 0x6398 # <CJK>
+0x8C41 0x7A9F # <CJK>
+0x8C42 0x6C93 # <CJK>
+0x8C43 0x9774 # <CJK>
+0x8C44 0x8F61 # <CJK>
+0x8C45 0x7AAA # <CJK>
+0x8C46 0x718A # <CJK>
+0x8C47 0x9688 # <CJK>
+0x8C48 0x7C82 # <CJK>
+0x8C49 0x6817 # <CJK>
+0x8C4A 0x7E70 # <CJK>
+0x8C4B 0x6851 # <CJK>
+0x8C4C 0x936C # <CJK>
+0x8C4D 0x52F2 # <CJK>
+0x8C4E 0x541B # <CJK>
+0x8C4F 0x85AB # <CJK>
+0x8C50 0x8A13 # <CJK>
+0x8C51 0x7FA4 # <CJK>
+0x8C52 0x8ECD # <CJK>
+0x8C53 0x90E1 # <CJK>
+0x8C54 0x5366 # <CJK>
+0x8C55 0x8888 # <CJK>
+0x8C56 0x7941 # <CJK>
+0x8C57 0x4FC2 # <CJK>
+0x8C58 0x50BE # <CJK>
+0x8C59 0x5211 # <CJK>
+0x8C5A 0x5144 # <CJK>
+0x8C5B 0x5553 # <CJK>
+0x8C5C 0x572D # <CJK>
+0x8C5D 0x73EA # <CJK>
+0x8C5E 0x578B # <CJK>
+0x8C5F 0x5951 # <CJK>
+0x8C60 0x5F62 # <CJK>
+0x8C61 0x5F84 # <CJK>
+0x8C62 0x6075 # <CJK>
+0x8C63 0x6176 # <CJK>
+0x8C64 0x6167 # <CJK>
+0x8C65 0x61A9 # <CJK>
+0x8C66 0x63B2 # <CJK>
+0x8C67 0x643A # <CJK>
+0x8C68 0x656C # <CJK>
+0x8C69 0x666F # <CJK>
+0x8C6A 0x6842 # <CJK>
+0x8C6B 0x6E13 # <CJK>
+0x8C6C 0x7566 # <CJK>
+0x8C6D 0x7A3D # <CJK>
+0x8C6E 0x7CFB # <CJK>
+0x8C6F 0x7D4C # <CJK>
+0x8C70 0x7D99 # <CJK>
+0x8C71 0x7E4B # <CJK>
+0x8C72 0x7F6B # <CJK>
+0x8C73 0x830E # <CJK>
+0x8C74 0x834A # <CJK>
+0x8C75 0x86CD # <CJK>
+0x8C76 0x8A08 # <CJK>
+0x8C77 0x8A63 # <CJK>
+0x8C78 0x8B66 # <CJK>
+0x8C79 0x8EFD # <CJK>
+0x8C7A 0x981A # <CJK>
+0x8C7B 0x9D8F # <CJK>
+0x8C7C 0x82B8 # <CJK>
+0x8C7D 0x8FCE # <CJK>
+0x8C7E 0x9BE8 # <CJK>
+0x8C80 0x5287 # <CJK>
+0x8C81 0x621F # <CJK>
+0x8C82 0x6483 # <CJK>
+0x8C83 0x6FC0 # <CJK>
+0x8C84 0x9699 # <CJK>
+0x8C85 0x6841 # <CJK>
+0x8C86 0x5091 # <CJK>
+0x8C87 0x6B20 # <CJK>
+0x8C88 0x6C7A # <CJK>
+0x8C89 0x6F54 # <CJK>
+0x8C8A 0x7A74 # <CJK>
+0x8C8B 0x7D50 # <CJK>
+0x8C8C 0x8840 # <CJK>
+0x8C8D 0x8A23 # <CJK>
+0x8C8E 0x6708 # <CJK>
+0x8C8F 0x4EF6 # <CJK>
+0x8C90 0x5039 # <CJK>
+0x8C91 0x5026 # <CJK>
+0x8C92 0x5065 # <CJK>
+0x8C93 0x517C # <CJK>
+0x8C94 0x5238 # <CJK>
+0x8C95 0x5263 # <CJK>
+0x8C96 0x55A7 # <CJK>
+0x8C97 0x570F # <CJK>
+0x8C98 0x5805 # <CJK>
+0x8C99 0x5ACC # <CJK>
+0x8C9A 0x5EFA # <CJK>
+0x8C9B 0x61B2 # <CJK>
+0x8C9C 0x61F8 # <CJK>
+0x8C9D 0x62F3 # <CJK>
+0x8C9E 0x6372 # <CJK>
+0x8C9F 0x691C # <CJK>
+0x8CA0 0x6A29 # <CJK>
+0x8CA1 0x727D # <CJK>
+0x8CA2 0x72AC # <CJK>
+0x8CA3 0x732E # <CJK>
+0x8CA4 0x7814 # <CJK>
+0x8CA5 0x786F # <CJK>
+0x8CA6 0x7D79 # <CJK>
+0x8CA7 0x770C # <CJK>
+0x8CA8 0x80A9 # <CJK>
+0x8CA9 0x898B # <CJK>
+0x8CAA 0x8B19 # <CJK>
+0x8CAB 0x8CE2 # <CJK>
+0x8CAC 0x8ED2 # <CJK>
+0x8CAD 0x9063 # <CJK>
+0x8CAE 0x9375 # <CJK>
+0x8CAF 0x967A # <CJK>
+0x8CB0 0x9855 # <CJK>
+0x8CB1 0x9A13 # <CJK>
+0x8CB2 0x9E78 # <CJK>
+0x8CB3 0x5143 # <CJK>
+0x8CB4 0x539F # <CJK>
+0x8CB5 0x53B3 # <CJK>
+0x8CB6 0x5E7B # <CJK>
+0x8CB7 0x5F26 # <CJK>
+0x8CB8 0x6E1B # <CJK>
+0x8CB9 0x6E90 # <CJK>
+0x8CBA 0x7384 # <CJK>
+0x8CBB 0x73FE # <CJK>
+0x8CBC 0x7D43 # <CJK>
+0x8CBD 0x8237 # <CJK>
+0x8CBE 0x8A00 # <CJK>
+0x8CBF 0x8AFA # <CJK>
+0x8CC0 0x9650 # <CJK>
+0x8CC1 0x4E4E # <CJK>
+0x8CC2 0x500B # <CJK>
+0x8CC3 0x53E4 # <CJK>
+0x8CC4 0x547C # <CJK>
+0x8CC5 0x56FA # <CJK>
+0x8CC6 0x59D1 # <CJK>
+0x8CC7 0x5B64 # <CJK>
+0x8CC8 0x5DF1 # <CJK>
+0x8CC9 0x5EAB # <CJK>
+0x8CCA 0x5F27 # <CJK>
+0x8CCB 0x6238 # <CJK>
+0x8CCC 0x6545 # <CJK>
+0x8CCD 0x67AF # <CJK>
+0x8CCE 0x6E56 # <CJK>
+0x8CCF 0x72D0 # <CJK>
+0x8CD0 0x7CCA # <CJK>
+0x8CD1 0x88B4 # <CJK>
+0x8CD2 0x80A1 # <CJK>
+0x8CD3 0x80E1 # <CJK>
+0x8CD4 0x83F0 # <CJK>
+0x8CD5 0x864E # <CJK>
+0x8CD6 0x8A87 # <CJK>
+0x8CD7 0x8DE8 # <CJK>
+0x8CD8 0x9237 # <CJK>
+0x8CD9 0x96C7 # <CJK>
+0x8CDA 0x9867 # <CJK>
+0x8CDB 0x9F13 # <CJK>
+0x8CDC 0x4E94 # <CJK>
+0x8CDD 0x4E92 # <CJK>
+0x8CDE 0x4F0D # <CJK>
+0x8CDF 0x5348 # <CJK>
+0x8CE0 0x5449 # <CJK>
+0x8CE1 0x543E # <CJK>
+0x8CE2 0x5A2F # <CJK>
+0x8CE3 0x5F8C # <CJK>
+0x8CE4 0x5FA1 # <CJK>
+0x8CE5 0x609F # <CJK>
+0x8CE6 0x68A7 # <CJK>
+0x8CE7 0x6A8E # <CJK>
+0x8CE8 0x745A # <CJK>
+0x8CE9 0x7881 # <CJK>
+0x8CEA 0x8A9E # <CJK>
+0x8CEB 0x8AA4 # <CJK>
+0x8CEC 0x8B77 # <CJK>
+0x8CED 0x9190 # <CJK>
+0x8CEE 0x4E5E # <CJK>
+0x8CEF 0x9BC9 # <CJK>
+0x8CF0 0x4EA4 # <CJK>
+0x8CF1 0x4F7C # <CJK>
+0x8CF2 0x4FAF # <CJK>
+0x8CF3 0x5019 # <CJK>
+0x8CF4 0x5016 # <CJK>
+0x8CF5 0x5149 # <CJK>
+0x8CF6 0x516C # <CJK>
+0x8CF7 0x529F # <CJK>
+0x8CF8 0x52B9 # <CJK>
+0x8CF9 0x52FE # <CJK>
+0x8CFA 0x539A # <CJK>
+0x8CFB 0x53E3 # <CJK>
+0x8CFC 0x5411 # <CJK>
+0x8D40 0x540E # <CJK>
+0x8D41 0x5589 # <CJK>
+0x8D42 0x5751 # <CJK>
+0x8D43 0x57A2 # <CJK>
+0x8D44 0x597D # <CJK>
+0x8D45 0x5B54 # <CJK>
+0x8D46 0x5B5D # <CJK>
+0x8D47 0x5B8F # <CJK>
+0x8D48 0x5DE5 # <CJK>
+0x8D49 0x5DE7 # <CJK>
+0x8D4A 0x5DF7 # <CJK>
+0x8D4B 0x5E78 # <CJK>
+0x8D4C 0x5E83 # <CJK>
+0x8D4D 0x5E9A # <CJK>
+0x8D4E 0x5EB7 # <CJK>
+0x8D4F 0x5F18 # <CJK>
+0x8D50 0x6052 # <CJK>
+0x8D51 0x614C # <CJK>
+0x8D52 0x6297 # <CJK>
+0x8D53 0x62D8 # <CJK>
+0x8D54 0x63A7 # <CJK>
+0x8D55 0x653B # <CJK>
+0x8D56 0x6602 # <CJK>
+0x8D57 0x6643 # <CJK>
+0x8D58 0x66F4 # <CJK>
+0x8D59 0x676D # <CJK>
+0x8D5A 0x6821 # <CJK>
+0x8D5B 0x6897 # <CJK>
+0x8D5C 0x69CB # <CJK>
+0x8D5D 0x6C5F # <CJK>
+0x8D5E 0x6D2A # <CJK>
+0x8D5F 0x6D69 # <CJK>
+0x8D60 0x6E2F # <CJK>
+0x8D61 0x6E9D # <CJK>
+0x8D62 0x7532 # <CJK>
+0x8D63 0x7687 # <CJK>
+0x8D64 0x786C # <CJK>
+0x8D65 0x7A3F # <CJK>
+0x8D66 0x7CE0 # <CJK>
+0x8D67 0x7D05 # <CJK>
+0x8D68 0x7D18 # <CJK>
+0x8D69 0x7D5E # <CJK>
+0x8D6A 0x7DB1 # <CJK>
+0x8D6B 0x8015 # <CJK>
+0x8D6C 0x8003 # <CJK>
+0x8D6D 0x80AF # <CJK>
+0x8D6E 0x80B1 # <CJK>
+0x8D6F 0x8154 # <CJK>
+0x8D70 0x818F # <CJK>
+0x8D71 0x822A # <CJK>
+0x8D72 0x8352 # <CJK>
+0x8D73 0x884C # <CJK>
+0x8D74 0x8861 # <CJK>
+0x8D75 0x8B1B # <CJK>
+0x8D76 0x8CA2 # <CJK>
+0x8D77 0x8CFC # <CJK>
+0x8D78 0x90CA # <CJK>
+0x8D79 0x9175 # <CJK>
+0x8D7A 0x9271 # <CJK>
+0x8D7B 0x783F # <CJK>
+0x8D7C 0x92FC # <CJK>
+0x8D7D 0x95A4 # <CJK>
+0x8D7E 0x964D # <CJK>
+0x8D80 0x9805 # <CJK>
+0x8D81 0x9999 # <CJK>
+0x8D82 0x9AD8 # <CJK>
+0x8D83 0x9D3B # <CJK>
+0x8D84 0x525B # <CJK>
+0x8D85 0x52AB # <CJK>
+0x8D86 0x53F7 # <CJK>
+0x8D87 0x5408 # <CJK>
+0x8D88 0x58D5 # <CJK>
+0x8D89 0x62F7 # <CJK>
+0x8D8A 0x6FE0 # <CJK>
+0x8D8B 0x8C6A # <CJK>
+0x8D8C 0x8F5F # <CJK>
+0x8D8D 0x9EB9 # <CJK>
+0x8D8E 0x514B # <CJK>
+0x8D8F 0x523B # <CJK>
+0x8D90 0x544A # <CJK>
+0x8D91 0x56FD # <CJK>
+0x8D92 0x7A40 # <CJK>
+0x8D93 0x9177 # <CJK>
+0x8D94 0x9D60 # <CJK>
+0x8D95 0x9ED2 # <CJK>
+0x8D96 0x7344 # <CJK>
+0x8D97 0x6F09 # <CJK>
+0x8D98 0x8170 # <CJK>
+0x8D99 0x7511 # <CJK>
+0x8D9A 0x5FFD # <CJK>
+0x8D9B 0x60DA # <CJK>
+0x8D9C 0x9AA8 # <CJK>
+0x8D9D 0x72DB # <CJK>
+0x8D9E 0x8FBC # <CJK>
+0x8D9F 0x6B64 # <CJK>
+0x8DA0 0x9803 # <CJK>
+0x8DA1 0x4ECA # <CJK>
+0x8DA2 0x56F0 # <CJK>
+0x8DA3 0x5764 # <CJK>
+0x8DA4 0x58BE # <CJK>
+0x8DA5 0x5A5A # <CJK>
+0x8DA6 0x6068 # <CJK>
+0x8DA7 0x61C7 # <CJK>
+0x8DA8 0x660F # <CJK>
+0x8DA9 0x6606 # <CJK>
+0x8DAA 0x6839 # <CJK>
+0x8DAB 0x68B1 # <CJK>
+0x8DAC 0x6DF7 # <CJK>
+0x8DAD 0x75D5 # <CJK>
+0x8DAE 0x7D3A # <CJK>
+0x8DAF 0x826E # <CJK>
+0x8DB0 0x9B42 # <CJK>
+0x8DB1 0x4E9B # <CJK>
+0x8DB2 0x4F50 # <CJK>
+0x8DB3 0x53C9 # <CJK>
+0x8DB4 0x5506 # <CJK>
+0x8DB5 0x5D6F # <CJK>
+0x8DB6 0x5DE6 # <CJK>
+0x8DB7 0x5DEE # <CJK>
+0x8DB8 0x67FB # <CJK>
+0x8DB9 0x6C99 # <CJK>
+0x8DBA 0x7473 # <CJK>
+0x8DBB 0x7802 # <CJK>
+0x8DBC 0x8A50 # <CJK>
+0x8DBD 0x9396 # <CJK>
+0x8DBE 0x88DF # <CJK>
+0x8DBF 0x5750 # <CJK>
+0x8DC0 0x5EA7 # <CJK>
+0x8DC1 0x632B # <CJK>
+0x8DC2 0x50B5 # <CJK>
+0x8DC3 0x50AC # <CJK>
+0x8DC4 0x518D # <CJK>
+0x8DC5 0x6700 # <CJK>
+0x8DC6 0x54C9 # <CJK>
+0x8DC7 0x585E # <CJK>
+0x8DC8 0x59BB # <CJK>
+0x8DC9 0x5BB0 # <CJK>
+0x8DCA 0x5F69 # <CJK>
+0x8DCB 0x624D # <CJK>
+0x8DCC 0x63A1 # <CJK>
+0x8DCD 0x683D # <CJK>
+0x8DCE 0x6B73 # <CJK>
+0x8DCF 0x6E08 # <CJK>
+0x8DD0 0x707D # <CJK>
+0x8DD1 0x91C7 # <CJK>
+0x8DD2 0x7280 # <CJK>
+0x8DD3 0x7815 # <CJK>
+0x8DD4 0x7826 # <CJK>
+0x8DD5 0x796D # <CJK>
+0x8DD6 0x658E # <CJK>
+0x8DD7 0x7D30 # <CJK>
+0x8DD8 0x83DC # <CJK>
+0x8DD9 0x88C1 # <CJK>
+0x8DDA 0x8F09 # <CJK>
+0x8DDB 0x969B # <CJK>
+0x8DDC 0x5264 # <CJK>
+0x8DDD 0x5728 # <CJK>
+0x8DDE 0x6750 # <CJK>
+0x8DDF 0x7F6A # <CJK>
+0x8DE0 0x8CA1 # <CJK>
+0x8DE1 0x51B4 # <CJK>
+0x8DE2 0x5742 # <CJK>
+0x8DE3 0x962A # <CJK>
+0x8DE4 0x583A # <CJK>
+0x8DE5 0x698A # <CJK>
+0x8DE6 0x80B4 # <CJK>
+0x8DE7 0x54B2 # <CJK>
+0x8DE8 0x5D0E # <CJK>
+0x8DE9 0x57FC # <CJK>
+0x8DEA 0x7895 # <CJK>
+0x8DEB 0x9DFA # <CJK>
+0x8DEC 0x4F5C # <CJK>
+0x8DED 0x524A # <CJK>
+0x8DEE 0x548B # <CJK>
+0x8DEF 0x643E # <CJK>
+0x8DF0 0x6628 # <CJK>
+0x8DF1 0x6714 # <CJK>
+0x8DF2 0x67F5 # <CJK>
+0x8DF3 0x7A84 # <CJK>
+0x8DF4 0x7B56 # <CJK>
+0x8DF5 0x7D22 # <CJK>
+0x8DF6 0x932F # <CJK>
+0x8DF7 0x685C # <CJK>
+0x8DF8 0x9BAD # <CJK>
+0x8DF9 0x7B39 # <CJK>
+0x8DFA 0x5319 # <CJK>
+0x8DFB 0x518A # <CJK>
+0x8DFC 0x5237 # <CJK>
+0x8E40 0x5BDF # <CJK>
+0x8E41 0x62F6 # <CJK>
+0x8E42 0x64AE # <CJK>
+0x8E43 0x64E6 # <CJK>
+0x8E44 0x672D # <CJK>
+0x8E45 0x6BBA # <CJK>
+0x8E46 0x85A9 # <CJK>
+0x8E47 0x96D1 # <CJK>
+0x8E48 0x7690 # <CJK>
+0x8E49 0x9BD6 # <CJK>
+0x8E4A 0x634C # <CJK>
+0x8E4B 0x9306 # <CJK>
+0x8E4C 0x9BAB # <CJK>
+0x8E4D 0x76BF # <CJK>
+0x8E4E 0x6652 # <CJK>
+0x8E4F 0x4E09 # <CJK>
+0x8E50 0x5098 # <CJK>
+0x8E51 0x53C2 # <CJK>
+0x8E52 0x5C71 # <CJK>
+0x8E53 0x60E8 # <CJK>
+0x8E54 0x6492 # <CJK>
+0x8E55 0x6563 # <CJK>
+0x8E56 0x685F # <CJK>
+0x8E57 0x71E6 # <CJK>
+0x8E58 0x73CA # <CJK>
+0x8E59 0x7523 # <CJK>
+0x8E5A 0x7B97 # <CJK>
+0x8E5B 0x7E82 # <CJK>
+0x8E5C 0x8695 # <CJK>
+0x8E5D 0x8B83 # <CJK>
+0x8E5E 0x8CDB # <CJK>
+0x8E5F 0x9178 # <CJK>
+0x8E60 0x9910 # <CJK>
+0x8E61 0x65AC # <CJK>
+0x8E62 0x66AB # <CJK>
+0x8E63 0x6B8B # <CJK>
+0x8E64 0x4ED5 # <CJK>
+0x8E65 0x4ED4 # <CJK>
+0x8E66 0x4F3A # <CJK>
+0x8E67 0x4F7F # <CJK>
+0x8E68 0x523A # <CJK>
+0x8E69 0x53F8 # <CJK>
+0x8E6A 0x53F2 # <CJK>
+0x8E6B 0x55E3 # <CJK>
+0x8E6C 0x56DB # <CJK>
+0x8E6D 0x58EB # <CJK>
+0x8E6E 0x59CB # <CJK>
+0x8E6F 0x59C9 # <CJK>
+0x8E70 0x59FF # <CJK>
+0x8E71 0x5B50 # <CJK>
+0x8E72 0x5C4D # <CJK>
+0x8E73 0x5E02 # <CJK>
+0x8E74 0x5E2B # <CJK>
+0x8E75 0x5FD7 # <CJK>
+0x8E76 0x601D # <CJK>
+0x8E77 0x6307 # <CJK>
+0x8E78 0x652F # <CJK>
+0x8E79 0x5B5C # <CJK>
+0x8E7A 0x65AF # <CJK>
+0x8E7B 0x65BD # <CJK>
+0x8E7C 0x65E8 # <CJK>
+0x8E7D 0x679D # <CJK>
+0x8E7E 0x6B62 # <CJK>
+0x8E80 0x6B7B # <CJK>
+0x8E81 0x6C0F # <CJK>
+0x8E82 0x7345 # <CJK>
+0x8E83 0x7949 # <CJK>
+0x8E84 0x79C1 # <CJK>
+0x8E85 0x7CF8 # <CJK>
+0x8E86 0x7D19 # <CJK>
+0x8E87 0x7D2B # <CJK>
+0x8E88 0x80A2 # <CJK>
+0x8E89 0x8102 # <CJK>
+0x8E8A 0x81F3 # <CJK>
+0x8E8B 0x8996 # <CJK>
+0x8E8C 0x8A5E # <CJK>
+0x8E8D 0x8A69 # <CJK>
+0x8E8E 0x8A66 # <CJK>
+0x8E8F 0x8A8C # <CJK>
+0x8E90 0x8AEE # <CJK>
+0x8E91 0x8CC7 # <CJK>
+0x8E92 0x8CDC # <CJK>
+0x8E93 0x96CC # <CJK>
+0x8E94 0x98FC # <CJK>
+0x8E95 0x6B6F # <CJK>
+0x8E96 0x4E8B # <CJK>
+0x8E97 0x4F3C # <CJK>
+0x8E98 0x4F8D # <CJK>
+0x8E99 0x5150 # <CJK>
+0x8E9A 0x5B57 # <CJK>
+0x8E9B 0x5BFA # <CJK>
+0x8E9C 0x6148 # <CJK>
+0x8E9D 0x6301 # <CJK>
+0x8E9E 0x6642 # <CJK>
+0x8E9F 0x6B21 # <CJK>
+0x8EA0 0x6ECB # <CJK>
+0x8EA1 0x6CBB # <CJK>
+0x8EA2 0x723E # <CJK>
+0x8EA3 0x74BD # <CJK>
+0x8EA4 0x75D4 # <CJK>
+0x8EA5 0x78C1 # <CJK>
+0x8EA6 0x793A # <CJK>
+0x8EA7 0x800C # <CJK>
+0x8EA8 0x8033 # <CJK>
+0x8EA9 0x81EA # <CJK>
+0x8EAA 0x8494 # <CJK>
+0x8EAB 0x8F9E # <CJK>
+0x8EAC 0x6C50 # <CJK>
+0x8EAD 0x9E7F # <CJK>
+0x8EAE 0x5F0F # <CJK>
+0x8EAF 0x8B58 # <CJK>
+0x8EB0 0x9D2B # <CJK>
+0x8EB1 0x7AFA # <CJK>
+0x8EB2 0x8EF8 # <CJK>
+0x8EB3 0x5B8D # <CJK>
+0x8EB4 0x96EB # <CJK>
+0x8EB5 0x4E03 # <CJK>
+0x8EB6 0x53F1 # <CJK>
+0x8EB7 0x57F7 # <CJK>
+0x8EB8 0x5931 # <CJK>
+0x8EB9 0x5AC9 # <CJK>
+0x8EBA 0x5BA4 # <CJK>
+0x8EBB 0x6089 # <CJK>
+0x8EBC 0x6E7F # <CJK>
+0x8EBD 0x6F06 # <CJK>
+0x8EBE 0x75BE # <CJK>
+0x8EBF 0x8CEA # <CJK>
+0x8EC0 0x5B9F # <CJK>
+0x8EC1 0x8500 # <CJK>
+0x8EC2 0x7BE0 # <CJK>
+0x8EC3 0x5072 # <CJK>
+0x8EC4 0x67F4 # <CJK>
+0x8EC5 0x829D # <CJK>
+0x8EC6 0x5C61 # <CJK>
+0x8EC7 0x854A # <CJK>
+0x8EC8 0x7E1E # <CJK>
+0x8EC9 0x820E # <CJK>
+0x8ECA 0x5199 # <CJK>
+0x8ECB 0x5C04 # <CJK>
+0x8ECC 0x6368 # <CJK>
+0x8ECD 0x8D66 # <CJK>
+0x8ECE 0x659C # <CJK>
+0x8ECF 0x716E # <CJK>
+0x8ED0 0x793E # <CJK>
+0x8ED1 0x7D17 # <CJK>
+0x8ED2 0x8005 # <CJK>
+0x8ED3 0x8B1D # <CJK>
+0x8ED4 0x8ECA # <CJK>
+0x8ED5 0x906E # <CJK>
+0x8ED6 0x86C7 # <CJK>
+0x8ED7 0x90AA # <CJK>
+0x8ED8 0x501F # <CJK>
+0x8ED9 0x52FA # <CJK>
+0x8EDA 0x5C3A # <CJK>
+0x8EDB 0x6753 # <CJK>
+0x8EDC 0x707C # <CJK>
+0x8EDD 0x7235 # <CJK>
+0x8EDE 0x914C # <CJK>
+0x8EDF 0x91C8 # <CJK>
+0x8EE0 0x932B # <CJK>
+0x8EE1 0x82E5 # <CJK>
+0x8EE2 0x5BC2 # <CJK>
+0x8EE3 0x5F31 # <CJK>
+0x8EE4 0x60F9 # <CJK>
+0x8EE5 0x4E3B # <CJK>
+0x8EE6 0x53D6 # <CJK>
+0x8EE7 0x5B88 # <CJK>
+0x8EE8 0x624B # <CJK>
+0x8EE9 0x6731 # <CJK>
+0x8EEA 0x6B8A # <CJK>
+0x8EEB 0x72E9 # <CJK>
+0x8EEC 0x73E0 # <CJK>
+0x8EED 0x7A2E # <CJK>
+0x8EEE 0x816B # <CJK>
+0x8EEF 0x8DA3 # <CJK>
+0x8EF0 0x9152 # <CJK>
+0x8EF1 0x9996 # <CJK>
+0x8EF2 0x5112 # <CJK>
+0x8EF3 0x53D7 # <CJK>
+0x8EF4 0x546A # <CJK>
+0x8EF5 0x5BFF # <CJK>
+0x8EF6 0x6388 # <CJK>
+0x8EF7 0x6A39 # <CJK>
+0x8EF8 0x7DAC # <CJK>
+0x8EF9 0x9700 # <CJK>
+0x8EFA 0x56DA # <CJK>
+0x8EFB 0x53CE # <CJK>
+0x8EFC 0x5468 # <CJK>
+0x8F40 0x5B97 # <CJK>
+0x8F41 0x5C31 # <CJK>
+0x8F42 0x5DDE # <CJK>
+0x8F43 0x4FEE # <CJK>
+0x8F44 0x6101 # <CJK>
+0x8F45 0x62FE # <CJK>
+0x8F46 0x6D32 # <CJK>
+0x8F47 0x79C0 # <CJK>
+0x8F48 0x79CB # <CJK>
+0x8F49 0x7D42 # <CJK>
+0x8F4A 0x7E4D # <CJK>
+0x8F4B 0x7FD2 # <CJK>
+0x8F4C 0x81ED # <CJK>
+0x8F4D 0x821F # <CJK>
+0x8F4E 0x8490 # <CJK>
+0x8F4F 0x8846 # <CJK>
+0x8F50 0x8972 # <CJK>
+0x8F51 0x8B90 # <CJK>
+0x8F52 0x8E74 # <CJK>
+0x8F53 0x8F2F # <CJK>
+0x8F54 0x9031 # <CJK>
+0x8F55 0x914B # <CJK>
+0x8F56 0x916C # <CJK>
+0x8F57 0x96C6 # <CJK>
+0x8F58 0x919C # <CJK>
+0x8F59 0x4EC0 # <CJK>
+0x8F5A 0x4F4F # <CJK>
+0x8F5B 0x5145 # <CJK>
+0x8F5C 0x5341 # <CJK>
+0x8F5D 0x5F93 # <CJK>
+0x8F5E 0x620E # <CJK>
+0x8F5F 0x67D4 # <CJK>
+0x8F60 0x6C41 # <CJK>
+0x8F61 0x6E0B # <CJK>
+0x8F62 0x7363 # <CJK>
+0x8F63 0x7E26 # <CJK>
+0x8F64 0x91CD # <CJK>
+0x8F65 0x9283 # <CJK>
+0x8F66 0x53D4 # <CJK>
+0x8F67 0x5919 # <CJK>
+0x8F68 0x5BBF # <CJK>
+0x8F69 0x6DD1 # <CJK>
+0x8F6A 0x795D # <CJK>
+0x8F6B 0x7E2E # <CJK>
+0x8F6C 0x7C9B # <CJK>
+0x8F6D 0x587E # <CJK>
+0x8F6E 0x719F # <CJK>
+0x8F6F 0x51FA # <CJK>
+0x8F70 0x8853 # <CJK>
+0x8F71 0x8FF0 # <CJK>
+0x8F72 0x4FCA # <CJK>
+0x8F73 0x5CFB # <CJK>
+0x8F74 0x6625 # <CJK>
+0x8F75 0x77AC # <CJK>
+0x8F76 0x7AE3 # <CJK>
+0x8F77 0x821C # <CJK>
+0x8F78 0x99FF # <CJK>
+0x8F79 0x51C6 # <CJK>
+0x8F7A 0x5FAA # <CJK>
+0x8F7B 0x65EC # <CJK>
+0x8F7C 0x696F # <CJK>
+0x8F7D 0x6B89 # <CJK>
+0x8F7E 0x6DF3 # <CJK>
+0x8F80 0x6E96 # <CJK>
+0x8F81 0x6F64 # <CJK>
+0x8F82 0x76FE # <CJK>
+0x8F83 0x7D14 # <CJK>
+0x8F84 0x5DE1 # <CJK>
+0x8F85 0x9075 # <CJK>
+0x8F86 0x9187 # <CJK>
+0x8F87 0x9806 # <CJK>
+0x8F88 0x51E6 # <CJK>
+0x8F89 0x521D # <CJK>
+0x8F8A 0x6240 # <CJK>
+0x8F8B 0x6691 # <CJK>
+0x8F8C 0x66D9 # <CJK>
+0x8F8D 0x6E1A # <CJK>
+0x8F8E 0x5EB6 # <CJK>
+0x8F8F 0x7DD2 # <CJK>
+0x8F90 0x7F72 # <CJK>
+0x8F91 0x66F8 # <CJK>
+0x8F92 0x85AF # <CJK>
+0x8F93 0x85F7 # <CJK>
+0x8F94 0x8AF8 # <CJK>
+0x8F95 0x52A9 # <CJK>
+0x8F96 0x53D9 # <CJK>
+0x8F97 0x5973 # <CJK>
+0x8F98 0x5E8F # <CJK>
+0x8F99 0x5F90 # <CJK>
+0x8F9A 0x6055 # <CJK>
+0x8F9B 0x92E4 # <CJK>
+0x8F9C 0x9664 # <CJK>
+0x8F9D 0x50B7 # <CJK>
+0x8F9E 0x511F # <CJK>
+0x8F9F 0x52DD # <CJK>
+0x8FA0 0x5320 # <CJK>
+0x8FA1 0x5347 # <CJK>
+0x8FA2 0x53EC # <CJK>
+0x8FA3 0x54E8 # <CJK>
+0x8FA4 0x5546 # <CJK>
+0x8FA5 0x5531 # <CJK>
+0x8FA6 0x5617 # <CJK>
+0x8FA7 0x5968 # <CJK>
+0x8FA8 0x59BE # <CJK>
+0x8FA9 0x5A3C # <CJK>
+0x8FAA 0x5BB5 # <CJK>
+0x8FAB 0x5C06 # <CJK>
+0x8FAC 0x5C0F # <CJK>
+0x8FAD 0x5C11 # <CJK>
+0x8FAE 0x5C1A # <CJK>
+0x8FAF 0x5E84 # <CJK>
+0x8FB0 0x5E8A # <CJK>
+0x8FB1 0x5EE0 # <CJK>
+0x8FB2 0x5F70 # <CJK>
+0x8FB3 0x627F # <CJK>
+0x8FB4 0x6284 # <CJK>
+0x8FB5 0x62DB # <CJK>
+0x8FB6 0x638C # <CJK>
+0x8FB7 0x6377 # <CJK>
+0x8FB8 0x6607 # <CJK>
+0x8FB9 0x660C # <CJK>
+0x8FBA 0x662D # <CJK>
+0x8FBB 0x6676 # <CJK>
+0x8FBC 0x677E # <CJK>
+0x8FBD 0x68A2 # <CJK>
+0x8FBE 0x6A1F # <CJK>
+0x8FBF 0x6A35 # <CJK>
+0x8FC0 0x6CBC # <CJK>
+0x8FC1 0x6D88 # <CJK>
+0x8FC2 0x6E09 # <CJK>
+0x8FC3 0x6E58 # <CJK>
+0x8FC4 0x713C # <CJK>
+0x8FC5 0x7126 # <CJK>
+0x8FC6 0x7167 # <CJK>
+0x8FC7 0x75C7 # <CJK>
+0x8FC8 0x7701 # <CJK>
+0x8FC9 0x785D # <CJK>
+0x8FCA 0x7901 # <CJK>
+0x8FCB 0x7965 # <CJK>
+0x8FCC 0x79F0 # <CJK>
+0x8FCD 0x7AE0 # <CJK>
+0x8FCE 0x7B11 # <CJK>
+0x8FCF 0x7CA7 # <CJK>
+0x8FD0 0x7D39 # <CJK>
+0x8FD1 0x8096 # <CJK>
+0x8FD2 0x83D6 # <CJK>
+0x8FD3 0x848B # <CJK>
+0x8FD4 0x8549 # <CJK>
+0x8FD5 0x885D # <CJK>
+0x8FD6 0x88F3 # <CJK>
+0x8FD7 0x8A1F # <CJK>
+0x8FD8 0x8A3C # <CJK>
+0x8FD9 0x8A54 # <CJK>
+0x8FDA 0x8A73 # <CJK>
+0x8FDB 0x8C61 # <CJK>
+0x8FDC 0x8CDE # <CJK>
+0x8FDD 0x91A4 # <CJK>
+0x8FDE 0x9266 # <CJK>
+0x8FDF 0x937E # <CJK>
+0x8FE0 0x9418 # <CJK>
+0x8FE1 0x969C # <CJK>
+0x8FE2 0x9798 # <CJK>
+0x8FE3 0x4E0A # <CJK>
+0x8FE4 0x4E08 # <CJK>
+0x8FE5 0x4E1E # <CJK>
+0x8FE6 0x4E57 # <CJK>
+0x8FE7 0x5197 # <CJK>
+0x8FE8 0x5270 # <CJK>
+0x8FE9 0x57CE # <CJK>
+0x8FEA 0x5834 # <CJK>
+0x8FEB 0x58CC # <CJK>
+0x8FEC 0x5B22 # <CJK>
+0x8FED 0x5E38 # <CJK>
+0x8FEE 0x60C5 # <CJK>
+0x8FEF 0x64FE # <CJK>
+0x8FF0 0x6761 # <CJK>
+0x8FF1 0x6756 # <CJK>
+0x8FF2 0x6D44 # <CJK>
+0x8FF3 0x72B6 # <CJK>
+0x8FF4 0x7573 # <CJK>
+0x8FF5 0x7A63 # <CJK>
+0x8FF6 0x84B8 # <CJK>
+0x8FF7 0x8B72 # <CJK>
+0x8FF8 0x91B8 # <CJK>
+0x8FF9 0x9320 # <CJK>
+0x8FFA 0x5631 # <CJK>
+0x8FFB 0x57F4 # <CJK>
+0x8FFC 0x98FE # <CJK>
+0x9040 0x62ED # <CJK>
+0x9041 0x690D # <CJK>
+0x9042 0x6B96 # <CJK>
+0x9043 0x71ED # <CJK>
+0x9044 0x7E54 # <CJK>
+0x9045 0x8077 # <CJK>
+0x9046 0x8272 # <CJK>
+0x9047 0x89E6 # <CJK>
+0x9048 0x98DF # <CJK>
+0x9049 0x8755 # <CJK>
+0x904A 0x8FB1 # <CJK>
+0x904B 0x5C3B # <CJK>
+0x904C 0x4F38 # <CJK>
+0x904D 0x4FE1 # <CJK>
+0x904E 0x4FB5 # <CJK>
+0x904F 0x5507 # <CJK>
+0x9050 0x5A20 # <CJK>
+0x9051 0x5BDD # <CJK>
+0x9052 0x5BE9 # <CJK>
+0x9053 0x5FC3 # <CJK>
+0x9054 0x614E # <CJK>
+0x9055 0x632F # <CJK>
+0x9056 0x65B0 # <CJK>
+0x9057 0x664B # <CJK>
+0x9058 0x68EE # <CJK>
+0x9059 0x699B # <CJK>
+0x905A 0x6D78 # <CJK>
+0x905B 0x6DF1 # <CJK>
+0x905C 0x7533 # <CJK>
+0x905D 0x75B9 # <CJK>
+0x905E 0x771F # <CJK>
+0x905F 0x795E # <CJK>
+0x9060 0x79E6 # <CJK>
+0x9061 0x7D33 # <CJK>
+0x9062 0x81E3 # <CJK>
+0x9063 0x82AF # <CJK>
+0x9064 0x85AA # <CJK>
+0x9065 0x89AA # <CJK>
+0x9066 0x8A3A # <CJK>
+0x9067 0x8EAB # <CJK>
+0x9068 0x8F9B # <CJK>
+0x9069 0x9032 # <CJK>
+0x906A 0x91DD # <CJK>
+0x906B 0x9707 # <CJK>
+0x906C 0x4EBA # <CJK>
+0x906D 0x4EC1 # <CJK>
+0x906E 0x5203 # <CJK>
+0x906F 0x5875 # <CJK>
+0x9070 0x58EC # <CJK>
+0x9071 0x5C0B # <CJK>
+0x9072 0x751A # <CJK>
+0x9073 0x5C3D # <CJK>
+0x9074 0x814E # <CJK>
+0x9075 0x8A0A # <CJK>
+0x9076 0x8FC5 # <CJK>
+0x9077 0x9663 # <CJK>
+0x9078 0x976D # <CJK>
+0x9079 0x7B25 # <CJK>
+0x907A 0x8ACF # <CJK>
+0x907B 0x9808 # <CJK>
+0x907C 0x9162 # <CJK>
+0x907D 0x56F3 # <CJK>
+0x907E 0x53A8 # <CJK>
+0x9080 0x9017 # <CJK>
+0x9081 0x5439 # <CJK>
+0x9082 0x5782 # <CJK>
+0x9083 0x5E25 # <CJK>
+0x9084 0x63A8 # <CJK>
+0x9085 0x6C34 # <CJK>
+0x9086 0x708A # <CJK>
+0x9087 0x7761 # <CJK>
+0x9088 0x7C8B # <CJK>
+0x9089 0x7FE0 # <CJK>
+0x908A 0x8870 # <CJK>
+0x908B 0x9042 # <CJK>
+0x908C 0x9154 # <CJK>
+0x908D 0x9310 # <CJK>
+0x908E 0x9318 # <CJK>
+0x908F 0x968F # <CJK>
+0x9090 0x745E # <CJK>
+0x9091 0x9AC4 # <CJK>
+0x9092 0x5D07 # <CJK>
+0x9093 0x5D69 # <CJK>
+0x9094 0x6570 # <CJK>
+0x9095 0x67A2 # <CJK>
+0x9096 0x8DA8 # <CJK>
+0x9097 0x96DB # <CJK>
+0x9098 0x636E # <CJK>
+0x9099 0x6749 # <CJK>
+0x909A 0x6919 # <CJK>
+0x909B 0x83C5 # <CJK>
+0x909C 0x9817 # <CJK>
+0x909D 0x96C0 # <CJK>
+0x909E 0x88FE # <CJK>
+0x909F 0x6F84 # <CJK>
+0x90A0 0x647A # <CJK>
+0x90A1 0x5BF8 # <CJK>
+0x90A2 0x4E16 # <CJK>
+0x90A3 0x702C # <CJK>
+0x90A4 0x755D # <CJK>
+0x90A5 0x662F # <CJK>
+0x90A6 0x51C4 # <CJK>
+0x90A7 0x5236 # <CJK>
+0x90A8 0x52E2 # <CJK>
+0x90A9 0x59D3 # <CJK>
+0x90AA 0x5F81 # <CJK>
+0x90AB 0x6027 # <CJK>
+0x90AC 0x6210 # <CJK>
+0x90AD 0x653F # <CJK>
+0x90AE 0x6574 # <CJK>
+0x90AF 0x661F # <CJK>
+0x90B0 0x6674 # <CJK>
+0x90B1 0x68F2 # <CJK>
+0x90B2 0x6816 # <CJK>
+0x90B3 0x6B63 # <CJK>
+0x90B4 0x6E05 # <CJK>
+0x90B5 0x7272 # <CJK>
+0x90B6 0x751F # <CJK>
+0x90B7 0x76DB # <CJK>
+0x90B8 0x7CBE # <CJK>
+0x90B9 0x8056 # <CJK>
+0x90BA 0x58F0 # <CJK>
+0x90BB 0x88FD # <CJK>
+0x90BC 0x897F # <CJK>
+0x90BD 0x8AA0 # <CJK>
+0x90BE 0x8A93 # <CJK>
+0x90BF 0x8ACB # <CJK>
+0x90C0 0x901D # <CJK>
+0x90C1 0x9192 # <CJK>
+0x90C2 0x9752 # <CJK>
+0x90C3 0x9759 # <CJK>
+0x90C4 0x6589 # <CJK>
+0x90C5 0x7A0E # <CJK>
+0x90C6 0x8106 # <CJK>
+0x90C7 0x96BB # <CJK>
+0x90C8 0x5E2D # <CJK>
+0x90C9 0x60DC # <CJK>
+0x90CA 0x621A # <CJK>
+0x90CB 0x65A5 # <CJK>
+0x90CC 0x6614 # <CJK>
+0x90CD 0x6790 # <CJK>
+0x90CE 0x77F3 # <CJK>
+0x90CF 0x7A4D # <CJK>
+0x90D0 0x7C4D # <CJK>
+0x90D1 0x7E3E # <CJK>
+0x90D2 0x810A # <CJK>
+0x90D3 0x8CAC # <CJK>
+0x90D4 0x8D64 # <CJK>
+0x90D5 0x8DE1 # <CJK>
+0x90D6 0x8E5F # <CJK>
+0x90D7 0x78A9 # <CJK>
+0x90D8 0x5207 # <CJK>
+0x90D9 0x62D9 # <CJK>
+0x90DA 0x63A5 # <CJK>
+0x90DB 0x6442 # <CJK>
+0x90DC 0x6298 # <CJK>
+0x90DD 0x8A2D # <CJK>
+0x90DE 0x7A83 # <CJK>
+0x90DF 0x7BC0 # <CJK>
+0x90E0 0x8AAC # <CJK>
+0x90E1 0x96EA # <CJK>
+0x90E2 0x7D76 # <CJK>
+0x90E3 0x820C # <CJK>
+0x90E4 0x8749 # <CJK>
+0x90E5 0x4ED9 # <CJK>
+0x90E6 0x5148 # <CJK>
+0x90E7 0x5343 # <CJK>
+0x90E8 0x5360 # <CJK>
+0x90E9 0x5BA3 # <CJK>
+0x90EA 0x5C02 # <CJK>
+0x90EB 0x5C16 # <CJK>
+0x90EC 0x5DDD # <CJK>
+0x90ED 0x6226 # <CJK>
+0x90EE 0x6247 # <CJK>
+0x90EF 0x64B0 # <CJK>
+0x90F0 0x6813 # <CJK>
+0x90F1 0x6834 # <CJK>
+0x90F2 0x6CC9 # <CJK>
+0x90F3 0x6D45 # <CJK>
+0x90F4 0x6D17 # <CJK>
+0x90F5 0x67D3 # <CJK>
+0x90F6 0x6F5C # <CJK>
+0x90F7 0x714E # <CJK>
+0x90F8 0x717D # <CJK>
+0x90F9 0x65CB # <CJK>
+0x90FA 0x7A7F # <CJK>
+0x90FB 0x7BAD # <CJK>
+0x90FC 0x7DDA # <CJK>
+0x9140 0x7E4A # <CJK>
+0x9141 0x7FA8 # <CJK>
+0x9142 0x817A # <CJK>
+0x9143 0x821B # <CJK>
+0x9144 0x8239 # <CJK>
+0x9145 0x85A6 # <CJK>
+0x9146 0x8A6E # <CJK>
+0x9147 0x8CCE # <CJK>
+0x9148 0x8DF5 # <CJK>
+0x9149 0x9078 # <CJK>
+0x914A 0x9077 # <CJK>
+0x914B 0x92AD # <CJK>
+0x914C 0x9291 # <CJK>
+0x914D 0x9583 # <CJK>
+0x914E 0x9BAE # <CJK>
+0x914F 0x524D # <CJK>
+0x9150 0x5584 # <CJK>
+0x9151 0x6F38 # <CJK>
+0x9152 0x7136 # <CJK>
+0x9153 0x5168 # <CJK>
+0x9154 0x7985 # <CJK>
+0x9155 0x7E55 # <CJK>
+0x9156 0x81B3 # <CJK>
+0x9157 0x7CCE # <CJK>
+0x9158 0x564C # <CJK>
+0x9159 0x5851 # <CJK>
+0x915A 0x5CA8 # <CJK>
+0x915B 0x63AA # <CJK>
+0x915C 0x66FE # <CJK>
+0x915D 0x66FD # <CJK>
+0x915E 0x695A # <CJK>
+0x915F 0x72D9 # <CJK>
+0x9160 0x758F # <CJK>
+0x9161 0x758E # <CJK>
+0x9162 0x790E # <CJK>
+0x9163 0x7956 # <CJK>
+0x9164 0x79DF # <CJK>
+0x9165 0x7C97 # <CJK>
+0x9166 0x7D20 # <CJK>
+0x9167 0x7D44 # <CJK>
+0x9168 0x8607 # <CJK>
+0x9169 0x8A34 # <CJK>
+0x916A 0x963B # <CJK>
+0x916B 0x9061 # <CJK>
+0x916C 0x9F20 # <CJK>
+0x916D 0x50E7 # <CJK>
+0x916E 0x5275 # <CJK>
+0x916F 0x53CC # <CJK>
+0x9170 0x53E2 # <CJK>
+0x9171 0x5009 # <CJK>
+0x9172 0x55AA # <CJK>
+0x9173 0x58EE # <CJK>
+0x9174 0x594F # <CJK>
+0x9175 0x723D # <CJK>
+0x9176 0x5B8B # <CJK>
+0x9177 0x5C64 # <CJK>
+0x9178 0x531D # <CJK>
+0x9179 0x60E3 # <CJK>
+0x917A 0x60F3 # <CJK>
+0x917B 0x635C # <CJK>
+0x917C 0x6383 # <CJK>
+0x917D 0x633F # <CJK>
+0x917E 0x63BB # <CJK>
+0x9180 0x64CD # <CJK>
+0x9181 0x65E9 # <CJK>
+0x9182 0x66F9 # <CJK>
+0x9183 0x5DE3 # <CJK>
+0x9184 0x69CD # <CJK>
+0x9185 0x69FD # <CJK>
+0x9186 0x6F15 # <CJK>
+0x9187 0x71E5 # <CJK>
+0x9188 0x4E89 # <CJK>
+0x9189 0x75E9 # <CJK>
+0x918A 0x76F8 # <CJK>
+0x918B 0x7A93 # <CJK>
+0x918C 0x7CDF # <CJK>
+0x918D 0x7DCF # <CJK>
+0x918E 0x7D9C # <CJK>
+0x918F 0x8061 # <CJK>
+0x9190 0x8349 # <CJK>
+0x9191 0x8358 # <CJK>
+0x9192 0x846C # <CJK>
+0x9193 0x84BC # <CJK>
+0x9194 0x85FB # <CJK>
+0x9195 0x88C5 # <CJK>
+0x9196 0x8D70 # <CJK>
+0x9197 0x9001 # <CJK>
+0x9198 0x906D # <CJK>
+0x9199 0x9397 # <CJK>
+0x919A 0x971C # <CJK>
+0x919B 0x9A12 # <CJK>
+0x919C 0x50CF # <CJK>
+0x919D 0x5897 # <CJK>
+0x919E 0x618E # <CJK>
+0x919F 0x81D3 # <CJK>
+0x91A0 0x8535 # <CJK>
+0x91A1 0x8D08 # <CJK>
+0x91A2 0x9020 # <CJK>
+0x91A3 0x4FC3 # <CJK>
+0x91A4 0x5074 # <CJK>
+0x91A5 0x5247 # <CJK>
+0x91A6 0x5373 # <CJK>
+0x91A7 0x606F # <CJK>
+0x91A8 0x6349 # <CJK>
+0x91A9 0x675F # <CJK>
+0x91AA 0x6E2C # <CJK>
+0x91AB 0x8DB3 # <CJK>
+0x91AC 0x901F # <CJK>
+0x91AD 0x4FD7 # <CJK>
+0x91AE 0x5C5E # <CJK>
+0x91AF 0x8CCA # <CJK>
+0x91B0 0x65CF # <CJK>
+0x91B1 0x7D9A # <CJK>
+0x91B2 0x5352 # <CJK>
+0x91B3 0x8896 # <CJK>
+0x91B4 0x5176 # <CJK>
+0x91B5 0x63C3 # <CJK>
+0x91B6 0x5B58 # <CJK>
+0x91B7 0x5B6B # <CJK>
+0x91B8 0x5C0A # <CJK>
+0x91B9 0x640D # <CJK>
+0x91BA 0x6751 # <CJK>
+0x91BB 0x905C # <CJK>
+0x91BC 0x4ED6 # <CJK>
+0x91BD 0x591A # <CJK>
+0x91BE 0x592A # <CJK>
+0x91BF 0x6C70 # <CJK>
+0x91C0 0x8A51 # <CJK>
+0x91C1 0x553E # <CJK>
+0x91C2 0x5815 # <CJK>
+0x91C3 0x59A5 # <CJK>
+0x91C4 0x60F0 # <CJK>
+0x91C5 0x6253 # <CJK>
+0x91C6 0x67C1 # <CJK>
+0x91C7 0x8235 # <CJK>
+0x91C8 0x6955 # <CJK>
+0x91C9 0x9640 # <CJK>
+0x91CA 0x99C4 # <CJK>
+0x91CB 0x9A28 # <CJK>
+0x91CC 0x4F53 # <CJK>
+0x91CD 0x5806 # <CJK>
+0x91CE 0x5BFE # <CJK>
+0x91CF 0x8010 # <CJK>
+0x91D0 0x5CB1 # <CJK>
+0x91D1 0x5E2F # <CJK>
+0x91D2 0x5F85 # <CJK>
+0x91D3 0x6020 # <CJK>
+0x91D4 0x614B # <CJK>
+0x91D5 0x6234 # <CJK>
+0x91D6 0x66FF # <CJK>
+0x91D7 0x6CF0 # <CJK>
+0x91D8 0x6EDE # <CJK>
+0x91D9 0x80CE # <CJK>
+0x91DA 0x817F # <CJK>
+0x91DB 0x82D4 # <CJK>
+0x91DC 0x888B # <CJK>
+0x91DD 0x8CB8 # <CJK>
+0x91DE 0x9000 # <CJK>
+0x91DF 0x902E # <CJK>
+0x91E0 0x968A # <CJK>
+0x91E1 0x9EDB # <CJK>
+0x91E2 0x9BDB # <CJK>
+0x91E3 0x4EE3 # <CJK>
+0x91E4 0x53F0 # <CJK>
+0x91E5 0x5927 # <CJK>
+0x91E6 0x7B2C # <CJK>
+0x91E7 0x918D # <CJK>
+0x91E8 0x984C # <CJK>
+0x91E9 0x9DF9 # <CJK>
+0x91EA 0x6EDD # <CJK>
+0x91EB 0x7027 # <CJK>
+0x91EC 0x5353 # <CJK>
+0x91ED 0x5544 # <CJK>
+0x91EE 0x5B85 # <CJK>
+0x91EF 0x6258 # <CJK>
+0x91F0 0x629E # <CJK>
+0x91F1 0x62D3 # <CJK>
+0x91F2 0x6CA2 # <CJK>
+0x91F3 0x6FEF # <CJK>
+0x91F4 0x7422 # <CJK>
+0x91F5 0x8A17 # <CJK>
+0x91F6 0x9438 # <CJK>
+0x91F7 0x6FC1 # <CJK>
+0x91F8 0x8AFE # <CJK>
+0x91F9 0x8338 # <CJK>
+0x91FA 0x51E7 # <CJK>
+0x91FB 0x86F8 # <CJK>
+0x91FC 0x53EA # <CJK>
+0x9240 0x53E9 # <CJK>
+0x9241 0x4F46 # <CJK>
+0x9242 0x9054 # <CJK>
+0x9243 0x8FB0 # <CJK>
+0x9244 0x596A # <CJK>
+0x9245 0x8131 # <CJK>
+0x9246 0x5DFD # <CJK>
+0x9247 0x7AEA # <CJK>
+0x9248 0x8FBF # <CJK>
+0x9249 0x68DA # <CJK>
+0x924A 0x8C37 # <CJK>
+0x924B 0x72F8 # <CJK>
+0x924C 0x9C48 # <CJK>
+0x924D 0x6A3D # <CJK>
+0x924E 0x8AB0 # <CJK>
+0x924F 0x4E39 # <CJK>
+0x9250 0x5358 # <CJK>
+0x9251 0x5606 # <CJK>
+0x9252 0x5766 # <CJK>
+0x9253 0x62C5 # <CJK>
+0x9254 0x63A2 # <CJK>
+0x9255 0x65E6 # <CJK>
+0x9256 0x6B4E # <CJK>
+0x9257 0x6DE1 # <CJK>
+0x9258 0x6E5B # <CJK>
+0x9259 0x70AD # <CJK>
+0x925A 0x77ED # <CJK>
+0x925B 0x7AEF # <CJK>
+0x925C 0x7BAA # <CJK>
+0x925D 0x7DBB # <CJK>
+0x925E 0x803D # <CJK>
+0x925F 0x80C6 # <CJK>
+0x9260 0x86CB # <CJK>
+0x9261 0x8A95 # <CJK>
+0x9262 0x935B # <CJK>
+0x9263 0x56E3 # <CJK>
+0x9264 0x58C7 # <CJK>
+0x9265 0x5F3E # <CJK>
+0x9266 0x65AD # <CJK>
+0x9267 0x6696 # <CJK>
+0x9268 0x6A80 # <CJK>
+0x9269 0x6BB5 # <CJK>
+0x926A 0x7537 # <CJK>
+0x926B 0x8AC7 # <CJK>
+0x926C 0x5024 # <CJK>
+0x926D 0x77E5 # <CJK>
+0x926E 0x5730 # <CJK>
+0x926F 0x5F1B # <CJK>
+0x9270 0x6065 # <CJK>
+0x9271 0x667A # <CJK>
+0x9272 0x6C60 # <CJK>
+0x9273 0x75F4 # <CJK>
+0x9274 0x7A1A # <CJK>
+0x9275 0x7F6E # <CJK>
+0x9276 0x81F4 # <CJK>
+0x9277 0x8718 # <CJK>
+0x9278 0x9045 # <CJK>
+0x9279 0x99B3 # <CJK>
+0x927A 0x7BC9 # <CJK>
+0x927B 0x755C # <CJK>
+0x927C 0x7AF9 # <CJK>
+0x927D 0x7B51 # <CJK>
+0x927E 0x84C4 # <CJK>
+0x9280 0x9010 # <CJK>
+0x9281 0x79E9 # <CJK>
+0x9282 0x7A92 # <CJK>
+0x9283 0x8336 # <CJK>
+0x9284 0x5AE1 # <CJK>
+0x9285 0x7740 # <CJK>
+0x9286 0x4E2D # <CJK>
+0x9287 0x4EF2 # <CJK>
+0x9288 0x5B99 # <CJK>
+0x9289 0x5FE0 # <CJK>
+0x928A 0x62BD # <CJK>
+0x928B 0x663C # <CJK>
+0x928C 0x67F1 # <CJK>
+0x928D 0x6CE8 # <CJK>
+0x928E 0x866B # <CJK>
+0x928F 0x8877 # <CJK>
+0x9290 0x8A3B # <CJK>
+0x9291 0x914E # <CJK>
+0x9292 0x92F3 # <CJK>
+0x9293 0x99D0 # <CJK>
+0x9294 0x6A17 # <CJK>
+0x9295 0x7026 # <CJK>
+0x9296 0x732A # <CJK>
+0x9297 0x82E7 # <CJK>
+0x9298 0x8457 # <CJK>
+0x9299 0x8CAF # <CJK>
+0x929A 0x4E01 # <CJK>
+0x929B 0x5146 # <CJK>
+0x929C 0x51CB # <CJK>
+0x929D 0x558B # <CJK>
+0x929E 0x5BF5 # <CJK>
+0x929F 0x5E16 # <CJK>
+0x92A0 0x5E33 # <CJK>
+0x92A1 0x5E81 # <CJK>
+0x92A2 0x5F14 # <CJK>
+0x92A3 0x5F35 # <CJK>
+0x92A4 0x5F6B # <CJK>
+0x92A5 0x5FB4 # <CJK>
+0x92A6 0x61F2 # <CJK>
+0x92A7 0x6311 # <CJK>
+0x92A8 0x66A2 # <CJK>
+0x92A9 0x671D # <CJK>
+0x92AA 0x6F6E # <CJK>
+0x92AB 0x7252 # <CJK>
+0x92AC 0x753A # <CJK>
+0x92AD 0x773A # <CJK>
+0x92AE 0x8074 # <CJK>
+0x92AF 0x8139 # <CJK>
+0x92B0 0x8178 # <CJK>
+0x92B1 0x8776 # <CJK>
+0x92B2 0x8ABF # <CJK>
+0x92B3 0x8ADC # <CJK>
+0x92B4 0x8D85 # <CJK>
+0x92B5 0x8DF3 # <CJK>
+0x92B6 0x929A # <CJK>
+0x92B7 0x9577 # <CJK>
+0x92B8 0x9802 # <CJK>
+0x92B9 0x9CE5 # <CJK>
+0x92BA 0x52C5 # <CJK>
+0x92BB 0x6357 # <CJK>
+0x92BC 0x76F4 # <CJK>
+0x92BD 0x6715 # <CJK>
+0x92BE 0x6C88 # <CJK>
+0x92BF 0x73CD # <CJK>
+0x92C0 0x8CC3 # <CJK>
+0x92C1 0x93AE # <CJK>
+0x92C2 0x9673 # <CJK>
+0x92C3 0x6D25 # <CJK>
+0x92C4 0x589C # <CJK>
+0x92C5 0x690E # <CJK>
+0x92C6 0x69CC # <CJK>
+0x92C7 0x8FFD # <CJK>
+0x92C8 0x939A # <CJK>
+0x92C9 0x75DB # <CJK>
+0x92CA 0x901A # <CJK>
+0x92CB 0x585A # <CJK>
+0x92CC 0x6802 # <CJK>
+0x92CD 0x63B4 # <CJK>
+0x92CE 0x69FB # <CJK>
+0x92CF 0x4F43 # <CJK>
+0x92D0 0x6F2C # <CJK>
+0x92D1 0x67D8 # <CJK>
+0x92D2 0x8FBB # <CJK>
+0x92D3 0x8526 # <CJK>
+0x92D4 0x7DB4 # <CJK>
+0x92D5 0x9354 # <CJK>
+0x92D6 0x693F # <CJK>
+0x92D7 0x6F70 # <CJK>
+0x92D8 0x576A # <CJK>
+0x92D9 0x58F7 # <CJK>
+0x92DA 0x5B2C # <CJK>
+0x92DB 0x7D2C # <CJK>
+0x92DC 0x722A # <CJK>
+0x92DD 0x540A # <CJK>
+0x92DE 0x91E3 # <CJK>
+0x92DF 0x9DB4 # <CJK>
+0x92E0 0x4EAD # <CJK>
+0x92E1 0x4F4E # <CJK>
+0x92E2 0x505C # <CJK>
+0x92E3 0x5075 # <CJK>
+0x92E4 0x5243 # <CJK>
+0x92E5 0x8C9E # <CJK>
+0x92E6 0x5448 # <CJK>
+0x92E7 0x5824 # <CJK>
+0x92E8 0x5B9A # <CJK>
+0x92E9 0x5E1D # <CJK>
+0x92EA 0x5E95 # <CJK>
+0x92EB 0x5EAD # <CJK>
+0x92EC 0x5EF7 # <CJK>
+0x92ED 0x5F1F # <CJK>
+0x92EE 0x608C # <CJK>
+0x92EF 0x62B5 # <CJK>
+0x92F0 0x633A # <CJK>
+0x92F1 0x63D0 # <CJK>
+0x92F2 0x68AF # <CJK>
+0x92F3 0x6C40 # <CJK>
+0x92F4 0x7887 # <CJK>
+0x92F5 0x798E # <CJK>
+0x92F6 0x7A0B # <CJK>
+0x92F7 0x7DE0 # <CJK>
+0x92F8 0x8247 # <CJK>
+0x92F9 0x8A02 # <CJK>
+0x92FA 0x8AE6 # <CJK>
+0x92FB 0x8E44 # <CJK>
+0x92FC 0x9013 # <CJK>
+0x9340 0x90B8 # <CJK>
+0x9341 0x912D # <CJK>
+0x9342 0x91D8 # <CJK>
+0x9343 0x9F0E # <CJK>
+0x9344 0x6CE5 # <CJK>
+0x9345 0x6458 # <CJK>
+0x9346 0x64E2 # <CJK>
+0x9347 0x6575 # <CJK>
+0x9348 0x6EF4 # <CJK>
+0x9349 0x7684 # <CJK>
+0x934A 0x7B1B # <CJK>
+0x934B 0x9069 # <CJK>
+0x934C 0x93D1 # <CJK>
+0x934D 0x6EBA # <CJK>
+0x934E 0x54F2 # <CJK>
+0x934F 0x5FB9 # <CJK>
+0x9350 0x64A4 # <CJK>
+0x9351 0x8F4D # <CJK>
+0x9352 0x8FED # <CJK>
+0x9353 0x9244 # <CJK>
+0x9354 0x5178 # <CJK>
+0x9355 0x586B # <CJK>
+0x9356 0x5929 # <CJK>
+0x9357 0x5C55 # <CJK>
+0x9358 0x5E97 # <CJK>
+0x9359 0x6DFB # <CJK>
+0x935A 0x7E8F # <CJK>
+0x935B 0x751C # <CJK>
+0x935C 0x8CBC # <CJK>
+0x935D 0x8EE2 # <CJK>
+0x935E 0x985B # <CJK>
+0x935F 0x70B9 # <CJK>
+0x9360 0x4F1D # <CJK>
+0x9361 0x6BBF # <CJK>
+0x9362 0x6FB1 # <CJK>
+0x9363 0x7530 # <CJK>
+0x9364 0x96FB # <CJK>
+0x9365 0x514E # <CJK>
+0x9366 0x5410 # <CJK>
+0x9367 0x5835 # <CJK>
+0x9368 0x5857 # <CJK>
+0x9369 0x59AC # <CJK>
+0x936A 0x5C60 # <CJK>
+0x936B 0x5F92 # <CJK>
+0x936C 0x6597 # <CJK>
+0x936D 0x675C # <CJK>
+0x936E 0x6E21 # <CJK>
+0x936F 0x767B # <CJK>
+0x9370 0x83DF # <CJK>
+0x9371 0x8CED # <CJK>
+0x9372 0x9014 # <CJK>
+0x9373 0x90FD # <CJK>
+0x9374 0x934D # <CJK>
+0x9375 0x7825 # <CJK>
+0x9376 0x783A # <CJK>
+0x9377 0x52AA # <CJK>
+0x9378 0x5EA6 # <CJK>
+0x9379 0x571F # <CJK>
+0x937A 0x5974 # <CJK>
+0x937B 0x6012 # <CJK>
+0x937C 0x5012 # <CJK>
+0x937D 0x515A # <CJK>
+0x937E 0x51AC # <CJK>
+0x9380 0x51CD # <CJK>
+0x9381 0x5200 # <CJK>
+0x9382 0x5510 # <CJK>
+0x9383 0x5854 # <CJK>
+0x9384 0x5858 # <CJK>
+0x9385 0x5957 # <CJK>
+0x9386 0x5B95 # <CJK>
+0x9387 0x5CF6 # <CJK>
+0x9388 0x5D8B # <CJK>
+0x9389 0x60BC # <CJK>
+0x938A 0x6295 # <CJK>
+0x938B 0x642D # <CJK>
+0x938C 0x6771 # <CJK>
+0x938D 0x6843 # <CJK>
+0x938E 0x68BC # <CJK>
+0x938F 0x68DF # <CJK>
+0x9390 0x76D7 # <CJK>
+0x9391 0x6DD8 # <CJK>
+0x9392 0x6E6F # <CJK>
+0x9393 0x6D9B # <CJK>
+0x9394 0x706F # <CJK>
+0x9395 0x71C8 # <CJK>
+0x9396 0x5F53 # <CJK>
+0x9397 0x75D8 # <CJK>
+0x9398 0x7977 # <CJK>
+0x9399 0x7B49 # <CJK>
+0x939A 0x7B54 # <CJK>
+0x939B 0x7B52 # <CJK>
+0x939C 0x7CD6 # <CJK>
+0x939D 0x7D71 # <CJK>
+0x939E 0x5230 # <CJK>
+0x939F 0x8463 # <CJK>
+0x93A0 0x8569 # <CJK>
+0x93A1 0x85E4 # <CJK>
+0x93A2 0x8A0E # <CJK>
+0x93A3 0x8B04 # <CJK>
+0x93A4 0x8C46 # <CJK>
+0x93A5 0x8E0F # <CJK>
+0x93A6 0x9003 # <CJK>
+0x93A7 0x900F # <CJK>
+0x93A8 0x9419 # <CJK>
+0x93A9 0x9676 # <CJK>
+0x93AA 0x982D # <CJK>
+0x93AB 0x9A30 # <CJK>
+0x93AC 0x95D8 # <CJK>
+0x93AD 0x50CD # <CJK>
+0x93AE 0x52D5 # <CJK>
+0x93AF 0x540C # <CJK>
+0x93B0 0x5802 # <CJK>
+0x93B1 0x5C0E # <CJK>
+0x93B2 0x61A7 # <CJK>
+0x93B3 0x649E # <CJK>
+0x93B4 0x6D1E # <CJK>
+0x93B5 0x77B3 # <CJK>
+0x93B6 0x7AE5 # <CJK>
+0x93B7 0x80F4 # <CJK>
+0x93B8 0x8404 # <CJK>
+0x93B9 0x9053 # <CJK>
+0x93BA 0x9285 # <CJK>
+0x93BB 0x5CE0 # <CJK>
+0x93BC 0x9D07 # <CJK>
+0x93BD 0x533F # <CJK>
+0x93BE 0x5F97 # <CJK>
+0x93BF 0x5FB3 # <CJK>
+0x93C0 0x6D9C # <CJK>
+0x93C1 0x7279 # <CJK>
+0x93C2 0x7763 # <CJK>
+0x93C3 0x79BF # <CJK>
+0x93C4 0x7BE4 # <CJK>
+0x93C5 0x6BD2 # <CJK>
+0x93C6 0x72EC # <CJK>
+0x93C7 0x8AAD # <CJK>
+0x93C8 0x6803 # <CJK>
+0x93C9 0x6A61 # <CJK>
+0x93CA 0x51F8 # <CJK>
+0x93CB 0x7A81 # <CJK>
+0x93CC 0x6934 # <CJK>
+0x93CD 0x5C4A # <CJK>
+0x93CE 0x9CF6 # <CJK>
+0x93CF 0x82EB # <CJK>
+0x93D0 0x5BC5 # <CJK>
+0x93D1 0x9149 # <CJK>
+0x93D2 0x701E # <CJK>
+0x93D3 0x5678 # <CJK>
+0x93D4 0x5C6F # <CJK>
+0x93D5 0x60C7 # <CJK>
+0x93D6 0x6566 # <CJK>
+0x93D7 0x6C8C # <CJK>
+0x93D8 0x8C5A # <CJK>
+0x93D9 0x9041 # <CJK>
+0x93DA 0x9813 # <CJK>
+0x93DB 0x5451 # <CJK>
+0x93DC 0x66C7 # <CJK>
+0x93DD 0x920D # <CJK>
+0x93DE 0x5948 # <CJK>
+0x93DF 0x90A3 # <CJK>
+0x93E0 0x5185 # <CJK>
+0x93E1 0x4E4D # <CJK>
+0x93E2 0x51EA # <CJK>
+0x93E3 0x8599 # <CJK>
+0x93E4 0x8B0E # <CJK>
+0x93E5 0x7058 # <CJK>
+0x93E6 0x637A # <CJK>
+0x93E7 0x934B # <CJK>
+0x93E8 0x6962 # <CJK>
+0x93E9 0x99B4 # <CJK>
+0x93EA 0x7E04 # <CJK>
+0x93EB 0x7577 # <CJK>
+0x93EC 0x5357 # <CJK>
+0x93ED 0x6960 # <CJK>
+0x93EE 0x8EDF # <CJK>
+0x93EF 0x96E3 # <CJK>
+0x93F0 0x6C5D # <CJK>
+0x93F1 0x4E8C # <CJK>
+0x93F2 0x5C3C # <CJK>
+0x93F3 0x5F10 # <CJK>
+0x93F4 0x8FE9 # <CJK>
+0x93F5 0x5302 # <CJK>
+0x93F6 0x8CD1 # <CJK>
+0x93F7 0x8089 # <CJK>
+0x93F8 0x8679 # <CJK>
+0x93F9 0x5EFF # <CJK>
+0x93FA 0x65E5 # <CJK>
+0x93FB 0x4E73 # <CJK>
+0x93FC 0x5165 # <CJK>
+0x9440 0x5982 # <CJK>
+0x9441 0x5C3F # <CJK>
+0x9442 0x97EE # <CJK>
+0x9443 0x4EFB # <CJK>
+0x9444 0x598A # <CJK>
+0x9445 0x5FCD # <CJK>
+0x9446 0x8A8D # <CJK>
+0x9447 0x6FE1 # <CJK>
+0x9448 0x79B0 # <CJK>
+0x9449 0x7962 # <CJK>
+0x944A 0x5BE7 # <CJK>
+0x944B 0x8471 # <CJK>
+0x944C 0x732B # <CJK>
+0x944D 0x71B1 # <CJK>
+0x944E 0x5E74 # <CJK>
+0x944F 0x5FF5 # <CJK>
+0x9450 0x637B # <CJK>
+0x9451 0x649A # <CJK>
+0x9452 0x71C3 # <CJK>
+0x9453 0x7C98 # <CJK>
+0x9454 0x4E43 # <CJK>
+0x9455 0x5EFC # <CJK>
+0x9456 0x4E4B # <CJK>
+0x9457 0x57DC # <CJK>
+0x9458 0x56A2 # <CJK>
+0x9459 0x60A9 # <CJK>
+0x945A 0x6FC3 # <CJK>
+0x945B 0x7D0D # <CJK>
+0x945C 0x80FD # <CJK>
+0x945D 0x8133 # <CJK>
+0x945E 0x81BF # <CJK>
+0x945F 0x8FB2 # <CJK>
+0x9460 0x8997 # <CJK>
+0x9461 0x86A4 # <CJK>
+0x9462 0x5DF4 # <CJK>
+0x9463 0x628A # <CJK>
+0x9464 0x64AD # <CJK>
+0x9465 0x8987 # <CJK>
+0x9466 0x6777 # <CJK>
+0x9467 0x6CE2 # <CJK>
+0x9468 0x6D3E # <CJK>
+0x9469 0x7436 # <CJK>
+0x946A 0x7834 # <CJK>
+0x946B 0x5A46 # <CJK>
+0x946C 0x7F75 # <CJK>
+0x946D 0x82AD # <CJK>
+0x946E 0x99AC # <CJK>
+0x946F 0x4FF3 # <CJK>
+0x9470 0x5EC3 # <CJK>
+0x9471 0x62DD # <CJK>
+0x9472 0x6392 # <CJK>
+0x9473 0x6557 # <CJK>
+0x9474 0x676F # <CJK>
+0x9475 0x76C3 # <CJK>
+0x9476 0x724C # <CJK>
+0x9477 0x80CC # <CJK>
+0x9478 0x80BA # <CJK>
+0x9479 0x8F29 # <CJK>
+0x947A 0x914D # <CJK>
+0x947B 0x500D # <CJK>
+0x947C 0x57F9 # <CJK>
+0x947D 0x5A92 # <CJK>
+0x947E 0x6885 # <CJK>
+0x9480 0x6973 # <CJK>
+0x9481 0x7164 # <CJK>
+0x9482 0x72FD # <CJK>
+0x9483 0x8CB7 # <CJK>
+0x9484 0x58F2 # <CJK>
+0x9485 0x8CE0 # <CJK>
+0x9486 0x966A # <CJK>
+0x9487 0x9019 # <CJK>
+0x9488 0x877F # <CJK>
+0x9489 0x79E4 # <CJK>
+0x948A 0x77E7 # <CJK>
+0x948B 0x8429 # <CJK>
+0x948C 0x4F2F # <CJK>
+0x948D 0x5265 # <CJK>
+0x948E 0x535A # <CJK>
+0x948F 0x62CD # <CJK>
+0x9490 0x67CF # <CJK>
+0x9491 0x6CCA # <CJK>
+0x9492 0x767D # <CJK>
+0x9493 0x7B94 # <CJK>
+0x9494 0x7C95 # <CJK>
+0x9495 0x8236 # <CJK>
+0x9496 0x8584 # <CJK>
+0x9497 0x8FEB # <CJK>
+0x9498 0x66DD # <CJK>
+0x9499 0x6F20 # <CJK>
+0x949A 0x7206 # <CJK>
+0x949B 0x7E1B # <CJK>
+0x949C 0x83AB # <CJK>
+0x949D 0x99C1 # <CJK>
+0x949E 0x9EA6 # <CJK>
+0x949F 0x51FD # <CJK>
+0x94A0 0x7BB1 # <CJK>
+0x94A1 0x7872 # <CJK>
+0x94A2 0x7BB8 # <CJK>
+0x94A3 0x8087 # <CJK>
+0x94A4 0x7B48 # <CJK>
+0x94A5 0x6AE8 # <CJK>
+0x94A6 0x5E61 # <CJK>
+0x94A7 0x808C # <CJK>
+0x94A8 0x7551 # <CJK>
+0x94A9 0x7560 # <CJK>
+0x94AA 0x516B # <CJK>
+0x94AB 0x9262 # <CJK>
+0x94AC 0x6E8C # <CJK>
+0x94AD 0x767A # <CJK>
+0x94AE 0x9197 # <CJK>
+0x94AF 0x9AEA # <CJK>
+0x94B0 0x4F10 # <CJK>
+0x94B1 0x7F70 # <CJK>
+0x94B2 0x629C # <CJK>
+0x94B3 0x7B4F # <CJK>
+0x94B4 0x95A5 # <CJK>
+0x94B5 0x9CE9 # <CJK>
+0x94B6 0x567A # <CJK>
+0x94B7 0x5859 # <CJK>
+0x94B8 0x86E4 # <CJK>
+0x94B9 0x96BC # <CJK>
+0x94BA 0x4F34 # <CJK>
+0x94BB 0x5224 # <CJK>
+0x94BC 0x534A # <CJK>
+0x94BD 0x53CD # <CJK>
+0x94BE 0x53DB # <CJK>
+0x94BF 0x5E06 # <CJK>
+0x94C0 0x642C # <CJK>
+0x94C1 0x6591 # <CJK>
+0x94C2 0x677F # <CJK>
+0x94C3 0x6C3E # <CJK>
+0x94C4 0x6C4E # <CJK>
+0x94C5 0x7248 # <CJK>
+0x94C6 0x72AF # <CJK>
+0x94C7 0x73ED # <CJK>
+0x94C8 0x7554 # <CJK>
+0x94C9 0x7E41 # <CJK>
+0x94CA 0x822C # <CJK>
+0x94CB 0x85E9 # <CJK>
+0x94CC 0x8CA9 # <CJK>
+0x94CD 0x7BC4 # <CJK>
+0x94CE 0x91C6 # <CJK>
+0x94CF 0x7169 # <CJK>
+0x94D0 0x9812 # <CJK>
+0x94D1 0x98EF # <CJK>
+0x94D2 0x633D # <CJK>
+0x94D3 0x6669 # <CJK>
+0x94D4 0x756A # <CJK>
+0x94D5 0x76E4 # <CJK>
+0x94D6 0x78D0 # <CJK>
+0x94D7 0x8543 # <CJK>
+0x94D8 0x86EE # <CJK>
+0x94D9 0x532A # <CJK>
+0x94DA 0x5351 # <CJK>
+0x94DB 0x5426 # <CJK>
+0x94DC 0x5983 # <CJK>
+0x94DD 0x5E87 # <CJK>
+0x94DE 0x5F7C # <CJK>
+0x94DF 0x60B2 # <CJK>
+0x94E0 0x6249 # <CJK>
+0x94E1 0x6279 # <CJK>
+0x94E2 0x62AB # <CJK>
+0x94E3 0x6590 # <CJK>
+0x94E4 0x6BD4 # <CJK>
+0x94E5 0x6CCC # <CJK>
+0x94E6 0x75B2 # <CJK>
+0x94E7 0x76AE # <CJK>
+0x94E8 0x7891 # <CJK>
+0x94E9 0x79D8 # <CJK>
+0x94EA 0x7DCB # <CJK>
+0x94EB 0x7F77 # <CJK>
+0x94EC 0x80A5 # <CJK>
+0x94ED 0x88AB # <CJK>
+0x94EE 0x8AB9 # <CJK>
+0x94EF 0x8CBB # <CJK>
+0x94F0 0x907F # <CJK>
+0x94F1 0x975E # <CJK>
+0x94F2 0x98DB # <CJK>
+0x94F3 0x6A0B # <CJK>
+0x94F4 0x7C38 # <CJK>
+0x94F5 0x5099 # <CJK>
+0x94F6 0x5C3E # <CJK>
+0x94F7 0x5FAE # <CJK>
+0x94F8 0x6787 # <CJK>
+0x94F9 0x6BD8 # <CJK>
+0x94FA 0x7435 # <CJK>
+0x94FB 0x7709 # <CJK>
+0x94FC 0x7F8E # <CJK>
+0x9540 0x9F3B # <CJK>
+0x9541 0x67CA # <CJK>
+0x9542 0x7A17 # <CJK>
+0x9543 0x5339 # <CJK>
+0x9544 0x758B # <CJK>
+0x9545 0x9AED # <CJK>
+0x9546 0x5F66 # <CJK>
+0x9547 0x819D # <CJK>
+0x9548 0x83F1 # <CJK>
+0x9549 0x8098 # <CJK>
+0x954A 0x5F3C # <CJK>
+0x954B 0x5FC5 # <CJK>
+0x954C 0x7562 # <CJK>
+0x954D 0x7B46 # <CJK>
+0x954E 0x903C # <CJK>
+0x954F 0x6867 # <CJK>
+0x9550 0x59EB # <CJK>
+0x9551 0x5A9B # <CJK>
+0x9552 0x7D10 # <CJK>
+0x9553 0x767E # <CJK>
+0x9554 0x8B2C # <CJK>
+0x9555 0x4FF5 # <CJK>
+0x9556 0x5F6A # <CJK>
+0x9557 0x6A19 # <CJK>
+0x9558 0x6C37 # <CJK>
+0x9559 0x6F02 # <CJK>
+0x955A 0x74E2 # <CJK>
+0x955B 0x7968 # <CJK>
+0x955C 0x8868 # <CJK>
+0x955D 0x8A55 # <CJK>
+0x955E 0x8C79 # <CJK>
+0x955F 0x5EDF # <CJK>
+0x9560 0x63CF # <CJK>
+0x9561 0x75C5 # <CJK>
+0x9562 0x79D2 # <CJK>
+0x9563 0x82D7 # <CJK>
+0x9564 0x9328 # <CJK>
+0x9565 0x92F2 # <CJK>
+0x9566 0x849C # <CJK>
+0x9567 0x86ED # <CJK>
+0x9568 0x9C2D # <CJK>
+0x9569 0x54C1 # <CJK>
+0x956A 0x5F6C # <CJK>
+0x956B 0x658C # <CJK>
+0x956C 0x6D5C # <CJK>
+0x956D 0x7015 # <CJK>
+0x956E 0x8CA7 # <CJK>
+0x956F 0x8CD3 # <CJK>
+0x9570 0x983B # <CJK>
+0x9571 0x654F # <CJK>
+0x9572 0x74F6 # <CJK>
+0x9573 0x4E0D # <CJK>
+0x9574 0x4ED8 # <CJK>
+0x9575 0x57E0 # <CJK>
+0x9576 0x592B # <CJK>
+0x9577 0x5A66 # <CJK>
+0x9578 0x5BCC # <CJK>
+0x9579 0x51A8 # <CJK>
+0x957A 0x5E03 # <CJK>
+0x957B 0x5E9C # <CJK>
+0x957C 0x6016 # <CJK>
+0x957D 0x6276 # <CJK>
+0x957E 0x6577 # <CJK>
+0x9580 0x65A7 # <CJK>
+0x9581 0x666E # <CJK>
+0x9582 0x6D6E # <CJK>
+0x9583 0x7236 # <CJK>
+0x9584 0x7B26 # <CJK>
+0x9585 0x8150 # <CJK>
+0x9586 0x819A # <CJK>
+0x9587 0x8299 # <CJK>
+0x9588 0x8B5C # <CJK>
+0x9589 0x8CA0 # <CJK>
+0x958A 0x8CE6 # <CJK>
+0x958B 0x8D74 # <CJK>
+0x958C 0x961C # <CJK>
+0x958D 0x9644 # <CJK>
+0x958E 0x4FAE # <CJK>
+0x958F 0x64AB # <CJK>
+0x9590 0x6B66 # <CJK>
+0x9591 0x821E # <CJK>
+0x9592 0x8461 # <CJK>
+0x9593 0x856A # <CJK>
+0x9594 0x90E8 # <CJK>
+0x9595 0x5C01 # <CJK>
+0x9596 0x6953 # <CJK>
+0x9597 0x98A8 # <CJK>
+0x9598 0x847A # <CJK>
+0x9599 0x8557 # <CJK>
+0x959A 0x4F0F # <CJK>
+0x959B 0x526F # <CJK>
+0x959C 0x5FA9 # <CJK>
+0x959D 0x5E45 # <CJK>
+0x959E 0x670D # <CJK>
+0x959F 0x798F # <CJK>
+0x95A0 0x8179 # <CJK>
+0x95A1 0x8907 # <CJK>
+0x95A2 0x8986 # <CJK>
+0x95A3 0x6DF5 # <CJK>
+0x95A4 0x5F17 # <CJK>
+0x95A5 0x6255 # <CJK>
+0x95A6 0x6CB8 # <CJK>
+0x95A7 0x4ECF # <CJK>
+0x95A8 0x7269 # <CJK>
+0x95A9 0x9B92 # <CJK>
+0x95AA 0x5206 # <CJK>
+0x95AB 0x543B # <CJK>
+0x95AC 0x5674 # <CJK>
+0x95AD 0x58B3 # <CJK>
+0x95AE 0x61A4 # <CJK>
+0x95AF 0x626E # <CJK>
+0x95B0 0x711A # <CJK>
+0x95B1 0x596E # <CJK>
+0x95B2 0x7C89 # <CJK>
+0x95B3 0x7CDE # <CJK>
+0x95B4 0x7D1B # <CJK>
+0x95B5 0x96F0 # <CJK>
+0x95B6 0x6587 # <CJK>
+0x95B7 0x805E # <CJK>
+0x95B8 0x4E19 # <CJK>
+0x95B9 0x4F75 # <CJK>
+0x95BA 0x5175 # <CJK>
+0x95BB 0x5840 # <CJK>
+0x95BC 0x5E63 # <CJK>
+0x95BD 0x5E73 # <CJK>
+0x95BE 0x5F0A # <CJK>
+0x95BF 0x67C4 # <CJK>
+0x95C0 0x4E26 # <CJK>
+0x95C1 0x853D # <CJK>
+0x95C2 0x9589 # <CJK>
+0x95C3 0x965B # <CJK>
+0x95C4 0x7C73 # <CJK>
+0x95C5 0x9801 # <CJK>
+0x95C6 0x50FB # <CJK>
+0x95C7 0x58C1 # <CJK>
+0x95C8 0x7656 # <CJK>
+0x95C9 0x78A7 # <CJK>
+0x95CA 0x5225 # <CJK>
+0x95CB 0x77A5 # <CJK>
+0x95CC 0x8511 # <CJK>
+0x95CD 0x7B86 # <CJK>
+0x95CE 0x504F # <CJK>
+0x95CF 0x5909 # <CJK>
+0x95D0 0x7247 # <CJK>
+0x95D1 0x7BC7 # <CJK>
+0x95D2 0x7DE8 # <CJK>
+0x95D3 0x8FBA # <CJK>
+0x95D4 0x8FD4 # <CJK>
+0x95D5 0x904D # <CJK>
+0x95D6 0x4FBF # <CJK>
+0x95D7 0x52C9 # <CJK>
+0x95D8 0x5A29 # <CJK>
+0x95D9 0x5F01 # <CJK>
+0x95DA 0x97AD # <CJK>
+0x95DB 0x4FDD # <CJK>
+0x95DC 0x8217 # <CJK>
+0x95DD 0x92EA # <CJK>
+0x95DE 0x5703 # <CJK>
+0x95DF 0x6355 # <CJK>
+0x95E0 0x6B69 # <CJK>
+0x95E1 0x752B # <CJK>
+0x95E2 0x88DC # <CJK>
+0x95E3 0x8F14 # <CJK>
+0x95E4 0x7A42 # <CJK>
+0x95E5 0x52DF # <CJK>
+0x95E6 0x5893 # <CJK>
+0x95E7 0x6155 # <CJK>
+0x95E8 0x620A # <CJK>
+0x95E9 0x66AE # <CJK>
+0x95EA 0x6BCD # <CJK>
+0x95EB 0x7C3F # <CJK>
+0x95EC 0x83E9 # <CJK>
+0x95ED 0x5023 # <CJK>
+0x95EE 0x4FF8 # <CJK>
+0x95EF 0x5305 # <CJK>
+0x95F0 0x5446 # <CJK>
+0x95F1 0x5831 # <CJK>
+0x95F2 0x5949 # <CJK>
+0x95F3 0x5B9D # <CJK>
+0x95F4 0x5CF0 # <CJK>
+0x95F5 0x5CEF # <CJK>
+0x95F6 0x5D29 # <CJK>
+0x95F7 0x5E96 # <CJK>
+0x95F8 0x62B1 # <CJK>
+0x95F9 0x6367 # <CJK>
+0x95FA 0x653E # <CJK>
+0x95FB 0x65B9 # <CJK>
+0x95FC 0x670B # <CJK>
+0x9640 0x6CD5 # <CJK>
+0x9641 0x6CE1 # <CJK>
+0x9642 0x70F9 # <CJK>
+0x9643 0x7832 # <CJK>
+0x9644 0x7E2B # <CJK>
+0x9645 0x80DE # <CJK>
+0x9646 0x82B3 # <CJK>
+0x9647 0x840C # <CJK>
+0x9648 0x84EC # <CJK>
+0x9649 0x8702 # <CJK>
+0x964A 0x8912 # <CJK>
+0x964B 0x8A2A # <CJK>
+0x964C 0x8C4A # <CJK>
+0x964D 0x90A6 # <CJK>
+0x964E 0x92D2 # <CJK>
+0x964F 0x98FD # <CJK>
+0x9650 0x9CF3 # <CJK>
+0x9651 0x9D6C # <CJK>
+0x9652 0x4E4F # <CJK>
+0x9653 0x4EA1 # <CJK>
+0x9654 0x508D # <CJK>
+0x9655 0x5256 # <CJK>
+0x9656 0x574A # <CJK>
+0x9657 0x59A8 # <CJK>
+0x9658 0x5E3D # <CJK>
+0x9659 0x5FD8 # <CJK>
+0x965A 0x5FD9 # <CJK>
+0x965B 0x623F # <CJK>
+0x965C 0x66B4 # <CJK>
+0x965D 0x671B # <CJK>
+0x965E 0x67D0 # <CJK>
+0x965F 0x68D2 # <CJK>
+0x9660 0x5192 # <CJK>
+0x9661 0x7D21 # <CJK>
+0x9662 0x80AA # <CJK>
+0x9663 0x81A8 # <CJK>
+0x9664 0x8B00 # <CJK>
+0x9665 0x8C8C # <CJK>
+0x9666 0x8CBF # <CJK>
+0x9667 0x927E # <CJK>
+0x9668 0x9632 # <CJK>
+0x9669 0x5420 # <CJK>
+0x966A 0x982C # <CJK>
+0x966B 0x5317 # <CJK>
+0x966C 0x50D5 # <CJK>
+0x966D 0x535C # <CJK>
+0x966E 0x58A8 # <CJK>
+0x966F 0x64B2 # <CJK>
+0x9670 0x6734 # <CJK>
+0x9671 0x7267 # <CJK>
+0x9672 0x7766 # <CJK>
+0x9673 0x7A46 # <CJK>
+0x9674 0x91E6 # <CJK>
+0x9675 0x52C3 # <CJK>
+0x9676 0x6CA1 # <CJK>
+0x9677 0x6B86 # <CJK>
+0x9678 0x5800 # <CJK>
+0x9679 0x5E4C # <CJK>
+0x967A 0x5954 # <CJK>
+0x967B 0x672C # <CJK>
+0x967C 0x7FFB # <CJK>
+0x967D 0x51E1 # <CJK>
+0x967E 0x76C6 # <CJK>
+0x9680 0x6469 # <CJK>
+0x9681 0x78E8 # <CJK>
+0x9682 0x9B54 # <CJK>
+0x9683 0x9EBB # <CJK>
+0x9684 0x57CB # <CJK>
+0x9685 0x59B9 # <CJK>
+0x9686 0x6627 # <CJK>
+0x9687 0x679A # <CJK>
+0x9688 0x6BCE # <CJK>
+0x9689 0x54E9 # <CJK>
+0x968A 0x69D9 # <CJK>
+0x968B 0x5E55 # <CJK>
+0x968C 0x819C # <CJK>
+0x968D 0x6795 # <CJK>
+0x968E 0x9BAA # <CJK>
+0x968F 0x67FE # <CJK>
+0x9690 0x9C52 # <CJK>
+0x9691 0x685D # <CJK>
+0x9692 0x4EA6 # <CJK>
+0x9693 0x4FE3 # <CJK>
+0x9694 0x53C8 # <CJK>
+0x9695 0x62B9 # <CJK>
+0x9696 0x672B # <CJK>
+0x9697 0x6CAB # <CJK>
+0x9698 0x8FC4 # <CJK>
+0x9699 0x4FAD # <CJK>
+0x969A 0x7E6D # <CJK>
+0x969B 0x9EBF # <CJK>
+0x969C 0x4E07 # <CJK>
+0x969D 0x6162 # <CJK>
+0x969E 0x6E80 # <CJK>
+0x969F 0x6F2B # <CJK>
+0x96A0 0x8513 # <CJK>
+0x96A1 0x5473 # <CJK>
+0x96A2 0x672A # <CJK>
+0x96A3 0x9B45 # <CJK>
+0x96A4 0x5DF3 # <CJK>
+0x96A5 0x7B95 # <CJK>
+0x96A6 0x5CAC # <CJK>
+0x96A7 0x5BC6 # <CJK>
+0x96A8 0x871C # <CJK>
+0x96A9 0x6E4A # <CJK>
+0x96AA 0x84D1 # <CJK>
+0x96AB 0x7A14 # <CJK>
+0x96AC 0x8108 # <CJK>
+0x96AD 0x5999 # <CJK>
+0x96AE 0x7C8D # <CJK>
+0x96AF 0x6C11 # <CJK>
+0x96B0 0x7720 # <CJK>
+0x96B1 0x52D9 # <CJK>
+0x96B2 0x5922 # <CJK>
+0x96B3 0x7121 # <CJK>
+0x96B4 0x725F # <CJK>
+0x96B5 0x77DB # <CJK>
+0x96B6 0x9727 # <CJK>
+0x96B7 0x9D61 # <CJK>
+0x96B8 0x690B # <CJK>
+0x96B9 0x5A7F # <CJK>
+0x96BA 0x5A18 # <CJK>
+0x96BB 0x51A5 # <CJK>
+0x96BC 0x540D # <CJK>
+0x96BD 0x547D # <CJK>
+0x96BE 0x660E # <CJK>
+0x96BF 0x76DF # <CJK>
+0x96C0 0x8FF7 # <CJK>
+0x96C1 0x9298 # <CJK>
+0x96C2 0x9CF4 # <CJK>
+0x96C3 0x59EA # <CJK>
+0x96C4 0x725D # <CJK>
+0x96C5 0x6EC5 # <CJK>
+0x96C6 0x514D # <CJK>
+0x96C7 0x68C9 # <CJK>
+0x96C8 0x7DBF # <CJK>
+0x96C9 0x7DEC # <CJK>
+0x96CA 0x9762 # <CJK>
+0x96CB 0x9EBA # <CJK>
+0x96CC 0x6478 # <CJK>
+0x96CD 0x6A21 # <CJK>
+0x96CE 0x8302 # <CJK>
+0x96CF 0x5984 # <CJK>
+0x96D0 0x5B5F # <CJK>
+0x96D1 0x6BDB # <CJK>
+0x96D2 0x731B # <CJK>
+0x96D3 0x76F2 # <CJK>
+0x96D4 0x7DB2 # <CJK>
+0x96D5 0x8017 # <CJK>
+0x96D6 0x8499 # <CJK>
+0x96D7 0x5132 # <CJK>
+0x96D8 0x6728 # <CJK>
+0x96D9 0x9ED9 # <CJK>
+0x96DA 0x76EE # <CJK>
+0x96DB 0x6762 # <CJK>
+0x96DC 0x52FF # <CJK>
+0x96DD 0x9905 # <CJK>
+0x96DE 0x5C24 # <CJK>
+0x96DF 0x623B # <CJK>
+0x96E0 0x7C7E # <CJK>
+0x96E1 0x8CB0 # <CJK>
+0x96E2 0x554F # <CJK>
+0x96E3 0x60B6 # <CJK>
+0x96E4 0x7D0B # <CJK>
+0x96E5 0x9580 # <CJK>
+0x96E6 0x5301 # <CJK>
+0x96E7 0x4E5F # <CJK>
+0x96E8 0x51B6 # <CJK>
+0x96E9 0x591C # <CJK>
+0x96EA 0x723A # <CJK>
+0x96EB 0x8036 # <CJK>
+0x96EC 0x91CE # <CJK>
+0x96ED 0x5F25 # <CJK>
+0x96EE 0x77E2 # <CJK>
+0x96EF 0x5384 # <CJK>
+0x96F0 0x5F79 # <CJK>
+0x96F1 0x7D04 # <CJK>
+0x96F2 0x85AC # <CJK>
+0x96F3 0x8A33 # <CJK>
+0x96F4 0x8E8D # <CJK>
+0x96F5 0x9756 # <CJK>
+0x96F6 0x67F3 # <CJK>
+0x96F7 0x85AE # <CJK>
+0x96F8 0x9453 # <CJK>
+0x96F9 0x6109 # <CJK>
+0x96FA 0x6108 # <CJK>
+0x96FB 0x6CB9 # <CJK>
+0x96FC 0x7652 # <CJK>
+0x9740 0x8AED # <CJK>
+0x9741 0x8F38 # <CJK>
+0x9742 0x552F # <CJK>
+0x9743 0x4F51 # <CJK>
+0x9744 0x512A # <CJK>
+0x9745 0x52C7 # <CJK>
+0x9746 0x53CB # <CJK>
+0x9747 0x5BA5 # <CJK>
+0x9748 0x5E7D # <CJK>
+0x9749 0x60A0 # <CJK>
+0x974A 0x6182 # <CJK>
+0x974B 0x63D6 # <CJK>
+0x974C 0x6709 # <CJK>
+0x974D 0x67DA # <CJK>
+0x974E 0x6E67 # <CJK>
+0x974F 0x6D8C # <CJK>
+0x9750 0x7336 # <CJK>
+0x9751 0x7337 # <CJK>
+0x9752 0x7531 # <CJK>
+0x9753 0x7950 # <CJK>
+0x9754 0x88D5 # <CJK>
+0x9755 0x8A98 # <CJK>
+0x9756 0x904A # <CJK>
+0x9757 0x9091 # <CJK>
+0x9758 0x90F5 # <CJK>
+0x9759 0x96C4 # <CJK>
+0x975A 0x878D # <CJK>
+0x975B 0x5915 # <CJK>
+0x975C 0x4E88 # <CJK>
+0x975D 0x4F59 # <CJK>
+0x975E 0x4E0E # <CJK>
+0x975F 0x8A89 # <CJK>
+0x9760 0x8F3F # <CJK>
+0x9761 0x9810 # <CJK>
+0x9762 0x50AD # <CJK>
+0x9763 0x5E7C # <CJK>
+0x9764 0x5996 # <CJK>
+0x9765 0x5BB9 # <CJK>
+0x9766 0x5EB8 # <CJK>
+0x9767 0x63DA # <CJK>
+0x9768 0x63FA # <CJK>
+0x9769 0x64C1 # <CJK>
+0x976A 0x66DC # <CJK>
+0x976B 0x694A # <CJK>
+0x976C 0x69D8 # <CJK>
+0x976D 0x6D0B # <CJK>
+0x976E 0x6EB6 # <CJK>
+0x976F 0x7194 # <CJK>
+0x9770 0x7528 # <CJK>
+0x9771 0x7AAF # <CJK>
+0x9772 0x7F8A # <CJK>
+0x9773 0x8000 # <CJK>
+0x9774 0x8449 # <CJK>
+0x9775 0x84C9 # <CJK>
+0x9776 0x8981 # <CJK>
+0x9777 0x8B21 # <CJK>
+0x9778 0x8E0A # <CJK>
+0x9779 0x9065 # <CJK>
+0x977A 0x967D # <CJK>
+0x977B 0x990A # <CJK>
+0x977C 0x617E # <CJK>
+0x977D 0x6291 # <CJK>
+0x977E 0x6B32 # <CJK>
+0x9780 0x6C83 # <CJK>
+0x9781 0x6D74 # <CJK>
+0x9782 0x7FCC # <CJK>
+0x9783 0x7FFC # <CJK>
+0x9784 0x6DC0 # <CJK>
+0x9785 0x7F85 # <CJK>
+0x9786 0x87BA # <CJK>
+0x9787 0x88F8 # <CJK>
+0x9788 0x6765 # <CJK>
+0x9789 0x83B1 # <CJK>
+0x978A 0x983C # <CJK>
+0x978B 0x96F7 # <CJK>
+0x978C 0x6D1B # <CJK>
+0x978D 0x7D61 # <CJK>
+0x978E 0x843D # <CJK>
+0x978F 0x916A # <CJK>
+0x9790 0x4E71 # <CJK>
+0x9791 0x5375 # <CJK>
+0x9792 0x5D50 # <CJK>
+0x9793 0x6B04 # <CJK>
+0x9794 0x6FEB # <CJK>
+0x9795 0x85CD # <CJK>
+0x9796 0x862D # <CJK>
+0x9797 0x89A7 # <CJK>
+0x9798 0x5229 # <CJK>
+0x9799 0x540F # <CJK>
+0x979A 0x5C65 # <CJK>
+0x979B 0x674E # <CJK>
+0x979C 0x68A8 # <CJK>
+0x979D 0x7406 # <CJK>
+0x979E 0x7483 # <CJK>
+0x979F 0x75E2 # <CJK>
+0x97A0 0x88CF # <CJK>
+0x97A1 0x88E1 # <CJK>
+0x97A2 0x91CC # <CJK>
+0x97A3 0x96E2 # <CJK>
+0x97A4 0x9678 # <CJK>
+0x97A5 0x5F8B # <CJK>
+0x97A6 0x7387 # <CJK>
+0x97A7 0x7ACB # <CJK>
+0x97A8 0x844E # <CJK>
+0x97A9 0x63A0 # <CJK>
+0x97AA 0x7565 # <CJK>
+0x97AB 0x5289 # <CJK>
+0x97AC 0x6D41 # <CJK>
+0x97AD 0x6E9C # <CJK>
+0x97AE 0x7409 # <CJK>
+0x97AF 0x7559 # <CJK>
+0x97B0 0x786B # <CJK>
+0x97B1 0x7C92 # <CJK>
+0x97B2 0x9686 # <CJK>
+0x97B3 0x7ADC # <CJK>
+0x97B4 0x9F8D # <CJK>
+0x97B5 0x4FB6 # <CJK>
+0x97B6 0x616E # <CJK>
+0x97B7 0x65C5 # <CJK>
+0x97B8 0x865C # <CJK>
+0x97B9 0x4E86 # <CJK>
+0x97BA 0x4EAE # <CJK>
+0x97BB 0x50DA # <CJK>
+0x97BC 0x4E21 # <CJK>
+0x97BD 0x51CC # <CJK>
+0x97BE 0x5BEE # <CJK>
+0x97BF 0x6599 # <CJK>
+0x97C0 0x6881 # <CJK>
+0x97C1 0x6DBC # <CJK>
+0x97C2 0x731F # <CJK>
+0x97C3 0x7642 # <CJK>
+0x97C4 0x77AD # <CJK>
+0x97C5 0x7A1C # <CJK>
+0x97C6 0x7CE7 # <CJK>
+0x97C7 0x826F # <CJK>
+0x97C8 0x8AD2 # <CJK>
+0x97C9 0x907C # <CJK>
+0x97CA 0x91CF # <CJK>
+0x97CB 0x9675 # <CJK>
+0x97CC 0x9818 # <CJK>
+0x97CD 0x529B # <CJK>
+0x97CE 0x7DD1 # <CJK>
+0x97CF 0x502B # <CJK>
+0x97D0 0x5398 # <CJK>
+0x97D1 0x6797 # <CJK>
+0x97D2 0x6DCB # <CJK>
+0x97D3 0x71D0 # <CJK>
+0x97D4 0x7433 # <CJK>
+0x97D5 0x81E8 # <CJK>
+0x97D6 0x8F2A # <CJK>
+0x97D7 0x96A3 # <CJK>
+0x97D8 0x9C57 # <CJK>
+0x97D9 0x9E9F # <CJK>
+0x97DA 0x7460 # <CJK>
+0x97DB 0x5841 # <CJK>
+0x97DC 0x6D99 # <CJK>
+0x97DD 0x7D2F # <CJK>
+0x97DE 0x985E # <CJK>
+0x97DF 0x4EE4 # <CJK>
+0x97E0 0x4F36 # <CJK>
+0x97E1 0x4F8B # <CJK>
+0x97E2 0x51B7 # <CJK>
+0x97E3 0x52B1 # <CJK>
+0x97E4 0x5DBA # <CJK>
+0x97E5 0x601C # <CJK>
+0x97E6 0x73B2 # <CJK>
+0x97E7 0x793C # <CJK>
+0x97E8 0x82D3 # <CJK>
+0x97E9 0x9234 # <CJK>
+0x97EA 0x96B7 # <CJK>
+0x97EB 0x96F6 # <CJK>
+0x97EC 0x970A # <CJK>
+0x97ED 0x9E97 # <CJK>
+0x97EE 0x9F62 # <CJK>
+0x97EF 0x66A6 # <CJK>
+0x97F0 0x6B74 # <CJK>
+0x97F1 0x5217 # <CJK>
+0x97F2 0x52A3 # <CJK>
+0x97F3 0x70C8 # <CJK>
+0x97F4 0x88C2 # <CJK>
+0x97F5 0x5EC9 # <CJK>
+0x97F6 0x604B # <CJK>
+0x97F7 0x6190 # <CJK>
+0x97F8 0x6F23 # <CJK>
+0x97F9 0x7149 # <CJK>
+0x97FA 0x7C3E # <CJK>
+0x97FB 0x7DF4 # <CJK>
+0x97FC 0x806F # <CJK>
+0x9840 0x84EE # <CJK>
+0x9841 0x9023 # <CJK>
+0x9842 0x932C # <CJK>
+0x9843 0x5442 # <CJK>
+0x9844 0x9B6F # <CJK>
+0x9845 0x6AD3 # <CJK>
+0x9846 0x7089 # <CJK>
+0x9847 0x8CC2 # <CJK>
+0x9848 0x8DEF # <CJK>
+0x9849 0x9732 # <CJK>
+0x984A 0x52B4 # <CJK>
+0x984B 0x5A41 # <CJK>
+0x984C 0x5ECA # <CJK>
+0x984D 0x5F04 # <CJK>
+0x984E 0x6717 # <CJK>
+0x984F 0x697C # <CJK>
+0x9850 0x6994 # <CJK>
+0x9851 0x6D6A # <CJK>
+0x9852 0x6F0F # <CJK>
+0x9853 0x7262 # <CJK>
+0x9854 0x72FC # <CJK>
+0x9855 0x7BED # <CJK>
+0x9856 0x8001 # <CJK>
+0x9857 0x807E # <CJK>
+0x9858 0x874B # <CJK>
+0x9859 0x90CE # <CJK>
+0x985A 0x516D # <CJK>
+0x985B 0x9E93 # <CJK>
+0x985C 0x7984 # <CJK>
+0x985D 0x808B # <CJK>
+0x985E 0x9332 # <CJK>
+0x985F 0x8AD6 # <CJK>
+0x9860 0x502D # <CJK>
+0x9861 0x548C # <CJK>
+0x9862 0x8A71 # <CJK>
+0x9863 0x6B6A # <CJK>
+0x9864 0x8CC4 # <CJK>
+0x9865 0x8107 # <CJK>
+0x9866 0x60D1 # <CJK>
+0x9867 0x67A0 # <CJK>
+0x9868 0x9DF2 # <CJK>
+0x9869 0x4E99 # <CJK>
+0x986A 0x4E98 # <CJK>
+0x986B 0x9C10 # <CJK>
+0x986C 0x8A6B # <CJK>
+0x986D 0x85C1 # <CJK>
+0x986E 0x8568 # <CJK>
+0x986F 0x6900 # <CJK>
+0x9870 0x6E7E # <CJK>
+0x9871 0x7897 # <CJK>
+0x9872 0x8155 # <CJK>
+0x989F 0x5F0C # <CJK>
+0x98A0 0x4E10 # <CJK>
+0x98A1 0x4E15 # <CJK>
+0x98A2 0x4E2A # <CJK>
+0x98A3 0x4E31 # <CJK>
+0x98A4 0x4E36 # <CJK>
+0x98A5 0x4E3C # <CJK>
+0x98A6 0x4E3F # <CJK>
+0x98A7 0x4E42 # <CJK>
+0x98A8 0x4E56 # <CJK>
+0x98A9 0x4E58 # <CJK>
+0x98AA 0x4E82 # <CJK>
+0x98AB 0x4E85 # <CJK>
+0x98AC 0x8C6B # <CJK>
+0x98AD 0x4E8A # <CJK>
+0x98AE 0x8212 # <CJK>
+0x98AF 0x5F0D # <CJK>
+0x98B0 0x4E8E # <CJK>
+0x98B1 0x4E9E # <CJK>
+0x98B2 0x4E9F # <CJK>
+0x98B3 0x4EA0 # <CJK>
+0x98B4 0x4EA2 # <CJK>
+0x98B5 0x4EB0 # <CJK>
+0x98B6 0x4EB3 # <CJK>
+0x98B7 0x4EB6 # <CJK>
+0x98B8 0x4ECE # <CJK>
+0x98B9 0x4ECD # <CJK>
+0x98BA 0x4EC4 # <CJK>
+0x98BB 0x4EC6 # <CJK>
+0x98BC 0x4EC2 # <CJK>
+0x98BD 0x4ED7 # <CJK>
+0x98BE 0x4EDE # <CJK>
+0x98BF 0x4EED # <CJK>
+0x98C0 0x4EDF # <CJK>
+0x98C1 0x4EF7 # <CJK>
+0x98C2 0x4F09 # <CJK>
+0x98C3 0x4F5A # <CJK>
+0x98C4 0x4F30 # <CJK>
+0x98C5 0x4F5B # <CJK>
+0x98C6 0x4F5D # <CJK>
+0x98C7 0x4F57 # <CJK>
+0x98C8 0x4F47 # <CJK>
+0x98C9 0x4F76 # <CJK>
+0x98CA 0x4F88 # <CJK>
+0x98CB 0x4F8F # <CJK>
+0x98CC 0x4F98 # <CJK>
+0x98CD 0x4F7B # <CJK>
+0x98CE 0x4F69 # <CJK>
+0x98CF 0x4F70 # <CJK>
+0x98D0 0x4F91 # <CJK>
+0x98D1 0x4F6F # <CJK>
+0x98D2 0x4F86 # <CJK>
+0x98D3 0x4F96 # <CJK>
+0x98D4 0x5118 # <CJK>
+0x98D5 0x4FD4 # <CJK>
+0x98D6 0x4FDF # <CJK>
+0x98D7 0x4FCE # <CJK>
+0x98D8 0x4FD8 # <CJK>
+0x98D9 0x4FDB # <CJK>
+0x98DA 0x4FD1 # <CJK>
+0x98DB 0x4FDA # <CJK>
+0x98DC 0x4FD0 # <CJK>
+0x98DD 0x4FE4 # <CJK>
+0x98DE 0x4FE5 # <CJK>
+0x98DF 0x501A # <CJK>
+0x98E0 0x5028 # <CJK>
+0x98E1 0x5014 # <CJK>
+0x98E2 0x502A # <CJK>
+0x98E3 0x5025 # <CJK>
+0x98E4 0x5005 # <CJK>
+0x98E5 0x4F1C # <CJK>
+0x98E6 0x4FF6 # <CJK>
+0x98E7 0x5021 # <CJK>
+0x98E8 0x5029 # <CJK>
+0x98E9 0x502C # <CJK>
+0x98EA 0x4FFE # <CJK>
+0x98EB 0x4FEF # <CJK>
+0x98EC 0x5011 # <CJK>
+0x98ED 0x5006 # <CJK>
+0x98EE 0x5043 # <CJK>
+0x98EF 0x5047 # <CJK>
+0x98F0 0x6703 # <CJK>
+0x98F1 0x5055 # <CJK>
+0x98F2 0x5050 # <CJK>
+0x98F3 0x5048 # <CJK>
+0x98F4 0x505A # <CJK>
+0x98F5 0x5056 # <CJK>
+0x98F6 0x506C # <CJK>
+0x98F7 0x5078 # <CJK>
+0x98F8 0x5080 # <CJK>
+0x98F9 0x509A # <CJK>
+0x98FA 0x5085 # <CJK>
+0x98FB 0x50B4 # <CJK>
+0x98FC 0x50B2 # <CJK>
+0x9940 0x50C9 # <CJK>
+0x9941 0x50CA # <CJK>
+0x9942 0x50B3 # <CJK>
+0x9943 0x50C2 # <CJK>
+0x9944 0x50D6 # <CJK>
+0x9945 0x50DE # <CJK>
+0x9946 0x50E5 # <CJK>
+0x9947 0x50ED # <CJK>
+0x9948 0x50E3 # <CJK>
+0x9949 0x50EE # <CJK>
+0x994A 0x50F9 # <CJK>
+0x994B 0x50F5 # <CJK>
+0x994C 0x5109 # <CJK>
+0x994D 0x5101 # <CJK>
+0x994E 0x5102 # <CJK>
+0x994F 0x5116 # <CJK>
+0x9950 0x5115 # <CJK>
+0x9951 0x5114 # <CJK>
+0x9952 0x511A # <CJK>
+0x9953 0x5121 # <CJK>
+0x9954 0x513A # <CJK>
+0x9955 0x5137 # <CJK>
+0x9956 0x513C # <CJK>
+0x9957 0x513B # <CJK>
+0x9958 0x513F # <CJK>
+0x9959 0x5140 # <CJK>
+0x995A 0x5152 # <CJK>
+0x995B 0x514C # <CJK>
+0x995C 0x5154 # <CJK>
+0x995D 0x5162 # <CJK>
+0x995E 0x7AF8 # <CJK>
+0x995F 0x5169 # <CJK>
+0x9960 0x516A # <CJK>
+0x9961 0x516E # <CJK>
+0x9962 0x5180 # <CJK>
+0x9963 0x5182 # <CJK>
+0x9964 0x56D8 # <CJK>
+0x9965 0x518C # <CJK>
+0x9966 0x5189 # <CJK>
+0x9967 0x518F # <CJK>
+0x9968 0x5191 # <CJK>
+0x9969 0x5193 # <CJK>
+0x996A 0x5195 # <CJK>
+0x996B 0x5196 # <CJK>
+0x996C 0x51A4 # <CJK>
+0x996D 0x51A6 # <CJK>
+0x996E 0x51A2 # <CJK>
+0x996F 0x51A9 # <CJK>
+0x9970 0x51AA # <CJK>
+0x9971 0x51AB # <CJK>
+0x9972 0x51B3 # <CJK>
+0x9973 0x51B1 # <CJK>
+0x9974 0x51B2 # <CJK>
+0x9975 0x51B0 # <CJK>
+0x9976 0x51B5 # <CJK>
+0x9977 0x51BD # <CJK>
+0x9978 0x51C5 # <CJK>
+0x9979 0x51C9 # <CJK>
+0x997A 0x51DB # <CJK>
+0x997B 0x51E0 # <CJK>
+0x997C 0x8655 # <CJK>
+0x997D 0x51E9 # <CJK>
+0x997E 0x51ED # <CJK>
+0x9980 0x51F0 # <CJK>
+0x9981 0x51F5 # <CJK>
+0x9982 0x51FE # <CJK>
+0x9983 0x5204 # <CJK>
+0x9984 0x520B # <CJK>
+0x9985 0x5214 # <CJK>
+0x9986 0x520E # <CJK>
+0x9987 0x5227 # <CJK>
+0x9988 0x522A # <CJK>
+0x9989 0x522E # <CJK>
+0x998A 0x5233 # <CJK>
+0x998B 0x5239 # <CJK>
+0x998C 0x524F # <CJK>
+0x998D 0x5244 # <CJK>
+0x998E 0x524B # <CJK>
+0x998F 0x524C # <CJK>
+0x9990 0x525E # <CJK>
+0x9991 0x5254 # <CJK>
+0x9992 0x526A # <CJK>
+0x9993 0x5274 # <CJK>
+0x9994 0x5269 # <CJK>
+0x9995 0x5273 # <CJK>
+0x9996 0x527F # <CJK>
+0x9997 0x527D # <CJK>
+0x9998 0x528D # <CJK>
+0x9999 0x5294 # <CJK>
+0x999A 0x5292 # <CJK>
+0x999B 0x5271 # <CJK>
+0x999C 0x5288 # <CJK>
+0x999D 0x5291 # <CJK>
+0x999E 0x8FA8 # <CJK>
+0x999F 0x8FA7 # <CJK>
+0x99A0 0x52AC # <CJK>
+0x99A1 0x52AD # <CJK>
+0x99A2 0x52BC # <CJK>
+0x99A3 0x52B5 # <CJK>
+0x99A4 0x52C1 # <CJK>
+0x99A5 0x52CD # <CJK>
+0x99A6 0x52D7 # <CJK>
+0x99A7 0x52DE # <CJK>
+0x99A8 0x52E3 # <CJK>
+0x99A9 0x52E6 # <CJK>
+0x99AA 0x98ED # <CJK>
+0x99AB 0x52E0 # <CJK>
+0x99AC 0x52F3 # <CJK>
+0x99AD 0x52F5 # <CJK>
+0x99AE 0x52F8 # <CJK>
+0x99AF 0x52F9 # <CJK>
+0x99B0 0x5306 # <CJK>
+0x99B1 0x5308 # <CJK>
+0x99B2 0x7538 # <CJK>
+0x99B3 0x530D # <CJK>
+0x99B4 0x5310 # <CJK>
+0x99B5 0x530F # <CJK>
+0x99B6 0x5315 # <CJK>
+0x99B7 0x531A # <CJK>
+0x99B8 0x5323 # <CJK>
+0x99B9 0x532F # <CJK>
+0x99BA 0x5331 # <CJK>
+0x99BB 0x5333 # <CJK>
+0x99BC 0x5338 # <CJK>
+0x99BD 0x5340 # <CJK>
+0x99BE 0x5346 # <CJK>
+0x99BF 0x5345 # <CJK>
+0x99C0 0x4E17 # <CJK>
+0x99C1 0x5349 # <CJK>
+0x99C2 0x534D # <CJK>
+0x99C3 0x51D6 # <CJK>
+0x99C4 0x535E # <CJK>
+0x99C5 0x5369 # <CJK>
+0x99C6 0x536E # <CJK>
+0x99C7 0x5918 # <CJK>
+0x99C8 0x537B # <CJK>
+0x99C9 0x5377 # <CJK>
+0x99CA 0x5382 # <CJK>
+0x99CB 0x5396 # <CJK>
+0x99CC 0x53A0 # <CJK>
+0x99CD 0x53A6 # <CJK>
+0x99CE 0x53A5 # <CJK>
+0x99CF 0x53AE # <CJK>
+0x99D0 0x53B0 # <CJK>
+0x99D1 0x53B6 # <CJK>
+0x99D2 0x53C3 # <CJK>
+0x99D3 0x7C12 # <CJK>
+0x99D4 0x96D9 # <CJK>
+0x99D5 0x53DF # <CJK>
+0x99D6 0x66FC # <CJK>
+0x99D7 0x71EE # <CJK>
+0x99D8 0x53EE # <CJK>
+0x99D9 0x53E8 # <CJK>
+0x99DA 0x53ED # <CJK>
+0x99DB 0x53FA # <CJK>
+0x99DC 0x5401 # <CJK>
+0x99DD 0x543D # <CJK>
+0x99DE 0x5440 # <CJK>
+0x99DF 0x542C # <CJK>
+0x99E0 0x542D # <CJK>
+0x99E1 0x543C # <CJK>
+0x99E2 0x542E # <CJK>
+0x99E3 0x5436 # <CJK>
+0x99E4 0x5429 # <CJK>
+0x99E5 0x541D # <CJK>
+0x99E6 0x544E # <CJK>
+0x99E7 0x548F # <CJK>
+0x99E8 0x5475 # <CJK>
+0x99E9 0x548E # <CJK>
+0x99EA 0x545F # <CJK>
+0x99EB 0x5471 # <CJK>
+0x99EC 0x5477 # <CJK>
+0x99ED 0x5470 # <CJK>
+0x99EE 0x5492 # <CJK>
+0x99EF 0x547B # <CJK>
+0x99F0 0x5480 # <CJK>
+0x99F1 0x5476 # <CJK>
+0x99F2 0x5484 # <CJK>
+0x99F3 0x5490 # <CJK>
+0x99F4 0x5486 # <CJK>
+0x99F5 0x54C7 # <CJK>
+0x99F6 0x54A2 # <CJK>
+0x99F7 0x54B8 # <CJK>
+0x99F8 0x54A5 # <CJK>
+0x99F9 0x54AC # <CJK>
+0x99FA 0x54C4 # <CJK>
+0x99FB 0x54C8 # <CJK>
+0x99FC 0x54A8 # <CJK>
+0x9A40 0x54AB # <CJK>
+0x9A41 0x54C2 # <CJK>
+0x9A42 0x54A4 # <CJK>
+0x9A43 0x54BE # <CJK>
+0x9A44 0x54BC # <CJK>
+0x9A45 0x54D8 # <CJK>
+0x9A46 0x54E5 # <CJK>
+0x9A47 0x54E6 # <CJK>
+0x9A48 0x550F # <CJK>
+0x9A49 0x5514 # <CJK>
+0x9A4A 0x54FD # <CJK>
+0x9A4B 0x54EE # <CJK>
+0x9A4C 0x54ED # <CJK>
+0x9A4D 0x54FA # <CJK>
+0x9A4E 0x54E2 # <CJK>
+0x9A4F 0x5539 # <CJK>
+0x9A50 0x5540 # <CJK>
+0x9A51 0x5563 # <CJK>
+0x9A52 0x554C # <CJK>
+0x9A53 0x552E # <CJK>
+0x9A54 0x555C # <CJK>
+0x9A55 0x5545 # <CJK>
+0x9A56 0x5556 # <CJK>
+0x9A57 0x5557 # <CJK>
+0x9A58 0x5538 # <CJK>
+0x9A59 0x5533 # <CJK>
+0x9A5A 0x555D # <CJK>
+0x9A5B 0x5599 # <CJK>
+0x9A5C 0x5580 # <CJK>
+0x9A5D 0x54AF # <CJK>
+0x9A5E 0x558A # <CJK>
+0x9A5F 0x559F # <CJK>
+0x9A60 0x557B # <CJK>
+0x9A61 0x557E # <CJK>
+0x9A62 0x5598 # <CJK>
+0x9A63 0x559E # <CJK>
+0x9A64 0x55AE # <CJK>
+0x9A65 0x557C # <CJK>
+0x9A66 0x5583 # <CJK>
+0x9A67 0x55A9 # <CJK>
+0x9A68 0x5587 # <CJK>
+0x9A69 0x55A8 # <CJK>
+0x9A6A 0x55DA # <CJK>
+0x9A6B 0x55C5 # <CJK>
+0x9A6C 0x55DF # <CJK>
+0x9A6D 0x55C4 # <CJK>
+0x9A6E 0x55DC # <CJK>
+0x9A6F 0x55E4 # <CJK>
+0x9A70 0x55D4 # <CJK>
+0x9A71 0x5614 # <CJK>
+0x9A72 0x55F7 # <CJK>
+0x9A73 0x5616 # <CJK>
+0x9A74 0x55FE # <CJK>
+0x9A75 0x55FD # <CJK>
+0x9A76 0x561B # <CJK>
+0x9A77 0x55F9 # <CJK>
+0x9A78 0x564E # <CJK>
+0x9A79 0x5650 # <CJK>
+0x9A7A 0x71DF # <CJK>
+0x9A7B 0x5634 # <CJK>
+0x9A7C 0x5636 # <CJK>
+0x9A7D 0x5632 # <CJK>
+0x9A7E 0x5638 # <CJK>
+0x9A80 0x566B # <CJK>
+0x9A81 0x5664 # <CJK>
+0x9A82 0x562F # <CJK>
+0x9A83 0x566C # <CJK>
+0x9A84 0x566A # <CJK>
+0x9A85 0x5686 # <CJK>
+0x9A86 0x5680 # <CJK>
+0x9A87 0x568A # <CJK>
+0x9A88 0x56A0 # <CJK>
+0x9A89 0x5694 # <CJK>
+0x9A8A 0x568F # <CJK>
+0x9A8B 0x56A5 # <CJK>
+0x9A8C 0x56AE # <CJK>
+0x9A8D 0x56B6 # <CJK>
+0x9A8E 0x56B4 # <CJK>
+0x9A8F 0x56C2 # <CJK>
+0x9A90 0x56BC # <CJK>
+0x9A91 0x56C1 # <CJK>
+0x9A92 0x56C3 # <CJK>
+0x9A93 0x56C0 # <CJK>
+0x9A94 0x56C8 # <CJK>
+0x9A95 0x56CE # <CJK>
+0x9A96 0x56D1 # <CJK>
+0x9A97 0x56D3 # <CJK>
+0x9A98 0x56D7 # <CJK>
+0x9A99 0x56EE # <CJK>
+0x9A9A 0x56F9 # <CJK>
+0x9A9B 0x5700 # <CJK>
+0x9A9C 0x56FF # <CJK>
+0x9A9D 0x5704 # <CJK>
+0x9A9E 0x5709 # <CJK>
+0x9A9F 0x5708 # <CJK>
+0x9AA0 0x570B # <CJK>
+0x9AA1 0x570D # <CJK>
+0x9AA2 0x5713 # <CJK>
+0x9AA3 0x5718 # <CJK>
+0x9AA4 0x5716 # <CJK>
+0x9AA5 0x55C7 # <CJK>
+0x9AA6 0x571C # <CJK>
+0x9AA7 0x5726 # <CJK>
+0x9AA8 0x5737 # <CJK>
+0x9AA9 0x5738 # <CJK>
+0x9AAA 0x574E # <CJK>
+0x9AAB 0x573B # <CJK>
+0x9AAC 0x5740 # <CJK>
+0x9AAD 0x574F # <CJK>
+0x9AAE 0x5769 # <CJK>
+0x9AAF 0x57C0 # <CJK>
+0x9AB0 0x5788 # <CJK>
+0x9AB1 0x5761 # <CJK>
+0x9AB2 0x577F # <CJK>
+0x9AB3 0x5789 # <CJK>
+0x9AB4 0x5793 # <CJK>
+0x9AB5 0x57A0 # <CJK>
+0x9AB6 0x57B3 # <CJK>
+0x9AB7 0x57A4 # <CJK>
+0x9AB8 0x57AA # <CJK>
+0x9AB9 0x57B0 # <CJK>
+0x9ABA 0x57C3 # <CJK>
+0x9ABB 0x57C6 # <CJK>
+0x9ABC 0x57D4 # <CJK>
+0x9ABD 0x57D2 # <CJK>
+0x9ABE 0x57D3 # <CJK>
+0x9ABF 0x580A # <CJK>
+0x9AC0 0x57D6 # <CJK>
+0x9AC1 0x57E3 # <CJK>
+0x9AC2 0x580B # <CJK>
+0x9AC3 0x5819 # <CJK>
+0x9AC4 0x581D # <CJK>
+0x9AC5 0x5872 # <CJK>
+0x9AC6 0x5821 # <CJK>
+0x9AC7 0x5862 # <CJK>
+0x9AC8 0x584B # <CJK>
+0x9AC9 0x5870 # <CJK>
+0x9ACA 0x6BC0 # <CJK>
+0x9ACB 0x5852 # <CJK>
+0x9ACC 0x583D # <CJK>
+0x9ACD 0x5879 # <CJK>
+0x9ACE 0x5885 # <CJK>
+0x9ACF 0x58B9 # <CJK>
+0x9AD0 0x589F # <CJK>
+0x9AD1 0x58AB # <CJK>
+0x9AD2 0x58BA # <CJK>
+0x9AD3 0x58DE # <CJK>
+0x9AD4 0x58BB # <CJK>
+0x9AD5 0x58B8 # <CJK>
+0x9AD6 0x58AE # <CJK>
+0x9AD7 0x58C5 # <CJK>
+0x9AD8 0x58D3 # <CJK>
+0x9AD9 0x58D1 # <CJK>
+0x9ADA 0x58D7 # <CJK>
+0x9ADB 0x58D9 # <CJK>
+0x9ADC 0x58D8 # <CJK>
+0x9ADD 0x58E5 # <CJK>
+0x9ADE 0x58DC # <CJK>
+0x9ADF 0x58E4 # <CJK>
+0x9AE0 0x58DF # <CJK>
+0x9AE1 0x58EF # <CJK>
+0x9AE2 0x58FA # <CJK>
+0x9AE3 0x58F9 # <CJK>
+0x9AE4 0x58FB # <CJK>
+0x9AE5 0x58FC # <CJK>
+0x9AE6 0x58FD # <CJK>
+0x9AE7 0x5902 # <CJK>
+0x9AE8 0x590A # <CJK>
+0x9AE9 0x5910 # <CJK>
+0x9AEA 0x591B # <CJK>
+0x9AEB 0x68A6 # <CJK>
+0x9AEC 0x5925 # <CJK>
+0x9AED 0x592C # <CJK>
+0x9AEE 0x592D # <CJK>
+0x9AEF 0x5932 # <CJK>
+0x9AF0 0x5938 # <CJK>
+0x9AF1 0x593E # <CJK>
+0x9AF2 0x7AD2 # <CJK>
+0x9AF3 0x5955 # <CJK>
+0x9AF4 0x5950 # <CJK>
+0x9AF5 0x594E # <CJK>
+0x9AF6 0x595A # <CJK>
+0x9AF7 0x5958 # <CJK>
+0x9AF8 0x5962 # <CJK>
+0x9AF9 0x5960 # <CJK>
+0x9AFA 0x5967 # <CJK>
+0x9AFB 0x596C # <CJK>
+0x9AFC 0x5969 # <CJK>
+0x9B40 0x5978 # <CJK>
+0x9B41 0x5981 # <CJK>
+0x9B42 0x599D # <CJK>
+0x9B43 0x4F5E # <CJK>
+0x9B44 0x4FAB # <CJK>
+0x9B45 0x59A3 # <CJK>
+0x9B46 0x59B2 # <CJK>
+0x9B47 0x59C6 # <CJK>
+0x9B48 0x59E8 # <CJK>
+0x9B49 0x59DC # <CJK>
+0x9B4A 0x598D # <CJK>
+0x9B4B 0x59D9 # <CJK>
+0x9B4C 0x59DA # <CJK>
+0x9B4D 0x5A25 # <CJK>
+0x9B4E 0x5A1F # <CJK>
+0x9B4F 0x5A11 # <CJK>
+0x9B50 0x5A1C # <CJK>
+0x9B51 0x5A09 # <CJK>
+0x9B52 0x5A1A # <CJK>
+0x9B53 0x5A40 # <CJK>
+0x9B54 0x5A6C # <CJK>
+0x9B55 0x5A49 # <CJK>
+0x9B56 0x5A35 # <CJK>
+0x9B57 0x5A36 # <CJK>
+0x9B58 0x5A62 # <CJK>
+0x9B59 0x5A6A # <CJK>
+0x9B5A 0x5A9A # <CJK>
+0x9B5B 0x5ABC # <CJK>
+0x9B5C 0x5ABE # <CJK>
+0x9B5D 0x5ACB # <CJK>
+0x9B5E 0x5AC2 # <CJK>
+0x9B5F 0x5ABD # <CJK>
+0x9B60 0x5AE3 # <CJK>
+0x9B61 0x5AD7 # <CJK>
+0x9B62 0x5AE6 # <CJK>
+0x9B63 0x5AE9 # <CJK>
+0x9B64 0x5AD6 # <CJK>
+0x9B65 0x5AFA # <CJK>
+0x9B66 0x5AFB # <CJK>
+0x9B67 0x5B0C # <CJK>
+0x9B68 0x5B0B # <CJK>
+0x9B69 0x5B16 # <CJK>
+0x9B6A 0x5B32 # <CJK>
+0x9B6B 0x5AD0 # <CJK>
+0x9B6C 0x5B2A # <CJK>
+0x9B6D 0x5B36 # <CJK>
+0x9B6E 0x5B3E # <CJK>
+0x9B6F 0x5B43 # <CJK>
+0x9B70 0x5B45 # <CJK>
+0x9B71 0x5B40 # <CJK>
+0x9B72 0x5B51 # <CJK>
+0x9B73 0x5B55 # <CJK>
+0x9B74 0x5B5A # <CJK>
+0x9B75 0x5B5B # <CJK>
+0x9B76 0x5B65 # <CJK>
+0x9B77 0x5B69 # <CJK>
+0x9B78 0x5B70 # <CJK>
+0x9B79 0x5B73 # <CJK>
+0x9B7A 0x5B75 # <CJK>
+0x9B7B 0x5B78 # <CJK>
+0x9B7C 0x6588 # <CJK>
+0x9B7D 0x5B7A # <CJK>
+0x9B7E 0x5B80 # <CJK>
+0x9B80 0x5B83 # <CJK>
+0x9B81 0x5BA6 # <CJK>
+0x9B82 0x5BB8 # <CJK>
+0x9B83 0x5BC3 # <CJK>
+0x9B84 0x5BC7 # <CJK>
+0x9B85 0x5BC9 # <CJK>
+0x9B86 0x5BD4 # <CJK>
+0x9B87 0x5BD0 # <CJK>
+0x9B88 0x5BE4 # <CJK>
+0x9B89 0x5BE6 # <CJK>
+0x9B8A 0x5BE2 # <CJK>
+0x9B8B 0x5BDE # <CJK>
+0x9B8C 0x5BE5 # <CJK>
+0x9B8D 0x5BEB # <CJK>
+0x9B8E 0x5BF0 # <CJK>
+0x9B8F 0x5BF6 # <CJK>
+0x9B90 0x5BF3 # <CJK>
+0x9B91 0x5C05 # <CJK>
+0x9B92 0x5C07 # <CJK>
+0x9B93 0x5C08 # <CJK>
+0x9B94 0x5C0D # <CJK>
+0x9B95 0x5C13 # <CJK>
+0x9B96 0x5C20 # <CJK>
+0x9B97 0x5C22 # <CJK>
+0x9B98 0x5C28 # <CJK>
+0x9B99 0x5C38 # <CJK>
+0x9B9A 0x5C39 # <CJK>
+0x9B9B 0x5C41 # <CJK>
+0x9B9C 0x5C46 # <CJK>
+0x9B9D 0x5C4E # <CJK>
+0x9B9E 0x5C53 # <CJK>
+0x9B9F 0x5C50 # <CJK>
+0x9BA0 0x5C4F # <CJK>
+0x9BA1 0x5B71 # <CJK>
+0x9BA2 0x5C6C # <CJK>
+0x9BA3 0x5C6E # <CJK>
+0x9BA4 0x4E62 # <CJK>
+0x9BA5 0x5C76 # <CJK>
+0x9BA6 0x5C79 # <CJK>
+0x9BA7 0x5C8C # <CJK>
+0x9BA8 0x5C91 # <CJK>
+0x9BA9 0x5C94 # <CJK>
+0x9BAA 0x599B # <CJK>
+0x9BAB 0x5CAB # <CJK>
+0x9BAC 0x5CBB # <CJK>
+0x9BAD 0x5CB6 # <CJK>
+0x9BAE 0x5CBC # <CJK>
+0x9BAF 0x5CB7 # <CJK>
+0x9BB0 0x5CC5 # <CJK>
+0x9BB1 0x5CBE # <CJK>
+0x9BB2 0x5CC7 # <CJK>
+0x9BB3 0x5CD9 # <CJK>
+0x9BB4 0x5CE9 # <CJK>
+0x9BB5 0x5CFD # <CJK>
+0x9BB6 0x5CFA # <CJK>
+0x9BB7 0x5CED # <CJK>
+0x9BB8 0x5D8C # <CJK>
+0x9BB9 0x5CEA # <CJK>
+0x9BBA 0x5D0B # <CJK>
+0x9BBB 0x5D15 # <CJK>
+0x9BBC 0x5D17 # <CJK>
+0x9BBD 0x5D5C # <CJK>
+0x9BBE 0x5D1F # <CJK>
+0x9BBF 0x5D1B # <CJK>
+0x9BC0 0x5D11 # <CJK>
+0x9BC1 0x5D14 # <CJK>
+0x9BC2 0x5D22 # <CJK>
+0x9BC3 0x5D1A # <CJK>
+0x9BC4 0x5D19 # <CJK>
+0x9BC5 0x5D18 # <CJK>
+0x9BC6 0x5D4C # <CJK>
+0x9BC7 0x5D52 # <CJK>
+0x9BC8 0x5D4E # <CJK>
+0x9BC9 0x5D4B # <CJK>
+0x9BCA 0x5D6C # <CJK>
+0x9BCB 0x5D73 # <CJK>
+0x9BCC 0x5D76 # <CJK>
+0x9BCD 0x5D87 # <CJK>
+0x9BCE 0x5D84 # <CJK>
+0x9BCF 0x5D82 # <CJK>
+0x9BD0 0x5DA2 # <CJK>
+0x9BD1 0x5D9D # <CJK>
+0x9BD2 0x5DAC # <CJK>
+0x9BD3 0x5DAE # <CJK>
+0x9BD4 0x5DBD # <CJK>
+0x9BD5 0x5D90 # <CJK>
+0x9BD6 0x5DB7 # <CJK>
+0x9BD7 0x5DBC # <CJK>
+0x9BD8 0x5DC9 # <CJK>
+0x9BD9 0x5DCD # <CJK>
+0x9BDA 0x5DD3 # <CJK>
+0x9BDB 0x5DD2 # <CJK>
+0x9BDC 0x5DD6 # <CJK>
+0x9BDD 0x5DDB # <CJK>
+0x9BDE 0x5DEB # <CJK>
+0x9BDF 0x5DF2 # <CJK>
+0x9BE0 0x5DF5 # <CJK>
+0x9BE1 0x5E0B # <CJK>
+0x9BE2 0x5E1A # <CJK>
+0x9BE3 0x5E19 # <CJK>
+0x9BE4 0x5E11 # <CJK>
+0x9BE5 0x5E1B # <CJK>
+0x9BE6 0x5E36 # <CJK>
+0x9BE7 0x5E37 # <CJK>
+0x9BE8 0x5E44 # <CJK>
+0x9BE9 0x5E43 # <CJK>
+0x9BEA 0x5E40 # <CJK>
+0x9BEB 0x5E4E # <CJK>
+0x9BEC 0x5E57 # <CJK>
+0x9BED 0x5E54 # <CJK>
+0x9BEE 0x5E5F # <CJK>
+0x9BEF 0x5E62 # <CJK>
+0x9BF0 0x5E64 # <CJK>
+0x9BF1 0x5E47 # <CJK>
+0x9BF2 0x5E75 # <CJK>
+0x9BF3 0x5E76 # <CJK>
+0x9BF4 0x5E7A # <CJK>
+0x9BF5 0x9EBC # <CJK>
+0x9BF6 0x5E7F # <CJK>
+0x9BF7 0x5EA0 # <CJK>
+0x9BF8 0x5EC1 # <CJK>
+0x9BF9 0x5EC2 # <CJK>
+0x9BFA 0x5EC8 # <CJK>
+0x9BFB 0x5ED0 # <CJK>
+0x9BFC 0x5ECF # <CJK>
+0x9C40 0x5ED6 # <CJK>
+0x9C41 0x5EE3 # <CJK>
+0x9C42 0x5EDD # <CJK>
+0x9C43 0x5EDA # <CJK>
+0x9C44 0x5EDB # <CJK>
+0x9C45 0x5EE2 # <CJK>
+0x9C46 0x5EE1 # <CJK>
+0x9C47 0x5EE8 # <CJK>
+0x9C48 0x5EE9 # <CJK>
+0x9C49 0x5EEC # <CJK>
+0x9C4A 0x5EF1 # <CJK>
+0x9C4B 0x5EF3 # <CJK>
+0x9C4C 0x5EF0 # <CJK>
+0x9C4D 0x5EF4 # <CJK>
+0x9C4E 0x5EF8 # <CJK>
+0x9C4F 0x5EFE # <CJK>
+0x9C50 0x5F03 # <CJK>
+0x9C51 0x5F09 # <CJK>
+0x9C52 0x5F5D # <CJK>
+0x9C53 0x5F5C # <CJK>
+0x9C54 0x5F0B # <CJK>
+0x9C55 0x5F11 # <CJK>
+0x9C56 0x5F16 # <CJK>
+0x9C57 0x5F29 # <CJK>
+0x9C58 0x5F2D # <CJK>
+0x9C59 0x5F38 # <CJK>
+0x9C5A 0x5F41 # <CJK>
+0x9C5B 0x5F48 # <CJK>
+0x9C5C 0x5F4C # <CJK>
+0x9C5D 0x5F4E # <CJK>
+0x9C5E 0x5F2F # <CJK>
+0x9C5F 0x5F51 # <CJK>
+0x9C60 0x5F56 # <CJK>
+0x9C61 0x5F57 # <CJK>
+0x9C62 0x5F59 # <CJK>
+0x9C63 0x5F61 # <CJK>
+0x9C64 0x5F6D # <CJK>
+0x9C65 0x5F73 # <CJK>
+0x9C66 0x5F77 # <CJK>
+0x9C67 0x5F83 # <CJK>
+0x9C68 0x5F82 # <CJK>
+0x9C69 0x5F7F # <CJK>
+0x9C6A 0x5F8A # <CJK>
+0x9C6B 0x5F88 # <CJK>
+0x9C6C 0x5F91 # <CJK>
+0x9C6D 0x5F87 # <CJK>
+0x9C6E 0x5F9E # <CJK>
+0x9C6F 0x5F99 # <CJK>
+0x9C70 0x5F98 # <CJK>
+0x9C71 0x5FA0 # <CJK>
+0x9C72 0x5FA8 # <CJK>
+0x9C73 0x5FAD # <CJK>
+0x9C74 0x5FBC # <CJK>
+0x9C75 0x5FD6 # <CJK>
+0x9C76 0x5FFB # <CJK>
+0x9C77 0x5FE4 # <CJK>
+0x9C78 0x5FF8 # <CJK>
+0x9C79 0x5FF1 # <CJK>
+0x9C7A 0x5FDD # <CJK>
+0x9C7B 0x60B3 # <CJK>
+0x9C7C 0x5FFF # <CJK>
+0x9C7D 0x6021 # <CJK>
+0x9C7E 0x6060 # <CJK>
+0x9C80 0x6019 # <CJK>
+0x9C81 0x6010 # <CJK>
+0x9C82 0x6029 # <CJK>
+0x9C83 0x600E # <CJK>
+0x9C84 0x6031 # <CJK>
+0x9C85 0x601B # <CJK>
+0x9C86 0x6015 # <CJK>
+0x9C87 0x602B # <CJK>
+0x9C88 0x6026 # <CJK>
+0x9C89 0x600F # <CJK>
+0x9C8A 0x603A # <CJK>
+0x9C8B 0x605A # <CJK>
+0x9C8C 0x6041 # <CJK>
+0x9C8D 0x606A # <CJK>
+0x9C8E 0x6077 # <CJK>
+0x9C8F 0x605F # <CJK>
+0x9C90 0x604A # <CJK>
+0x9C91 0x6046 # <CJK>
+0x9C92 0x604D # <CJK>
+0x9C93 0x6063 # <CJK>
+0x9C94 0x6043 # <CJK>
+0x9C95 0x6064 # <CJK>
+0x9C96 0x6042 # <CJK>
+0x9C97 0x606C # <CJK>
+0x9C98 0x606B # <CJK>
+0x9C99 0x6059 # <CJK>
+0x9C9A 0x6081 # <CJK>
+0x9C9B 0x608D # <CJK>
+0x9C9C 0x60E7 # <CJK>
+0x9C9D 0x6083 # <CJK>
+0x9C9E 0x609A # <CJK>
+0x9C9F 0x6084 # <CJK>
+0x9CA0 0x609B # <CJK>
+0x9CA1 0x6096 # <CJK>
+0x9CA2 0x6097 # <CJK>
+0x9CA3 0x6092 # <CJK>
+0x9CA4 0x60A7 # <CJK>
+0x9CA5 0x608B # <CJK>
+0x9CA6 0x60E1 # <CJK>
+0x9CA7 0x60B8 # <CJK>
+0x9CA8 0x60E0 # <CJK>
+0x9CA9 0x60D3 # <CJK>
+0x9CAA 0x60B4 # <CJK>
+0x9CAB 0x5FF0 # <CJK>
+0x9CAC 0x60BD # <CJK>
+0x9CAD 0x60C6 # <CJK>
+0x9CAE 0x60B5 # <CJK>
+0x9CAF 0x60D8 # <CJK>
+0x9CB0 0x614D # <CJK>
+0x9CB1 0x6115 # <CJK>
+0x9CB2 0x6106 # <CJK>
+0x9CB3 0x60F6 # <CJK>
+0x9CB4 0x60F7 # <CJK>
+0x9CB5 0x6100 # <CJK>
+0x9CB6 0x60F4 # <CJK>
+0x9CB7 0x60FA # <CJK>
+0x9CB8 0x6103 # <CJK>
+0x9CB9 0x6121 # <CJK>
+0x9CBA 0x60FB # <CJK>
+0x9CBB 0x60F1 # <CJK>
+0x9CBC 0x610D # <CJK>
+0x9CBD 0x610E # <CJK>
+0x9CBE 0x6147 # <CJK>
+0x9CBF 0x613E # <CJK>
+0x9CC0 0x6128 # <CJK>
+0x9CC1 0x6127 # <CJK>
+0x9CC2 0x614A # <CJK>
+0x9CC3 0x613F # <CJK>
+0x9CC4 0x613C # <CJK>
+0x9CC5 0x612C # <CJK>
+0x9CC6 0x6134 # <CJK>
+0x9CC7 0x613D # <CJK>
+0x9CC8 0x6142 # <CJK>
+0x9CC9 0x6144 # <CJK>
+0x9CCA 0x6173 # <CJK>
+0x9CCB 0x6177 # <CJK>
+0x9CCC 0x6158 # <CJK>
+0x9CCD 0x6159 # <CJK>
+0x9CCE 0x615A # <CJK>
+0x9CCF 0x616B # <CJK>
+0x9CD0 0x6174 # <CJK>
+0x9CD1 0x616F # <CJK>
+0x9CD2 0x6165 # <CJK>
+0x9CD3 0x6171 # <CJK>
+0x9CD4 0x615F # <CJK>
+0x9CD5 0x615D # <CJK>
+0x9CD6 0x6153 # <CJK>
+0x9CD7 0x6175 # <CJK>
+0x9CD8 0x6199 # <CJK>
+0x9CD9 0x6196 # <CJK>
+0x9CDA 0x6187 # <CJK>
+0x9CDB 0x61AC # <CJK>
+0x9CDC 0x6194 # <CJK>
+0x9CDD 0x619A # <CJK>
+0x9CDE 0x618A # <CJK>
+0x9CDF 0x6191 # <CJK>
+0x9CE0 0x61AB # <CJK>
+0x9CE1 0x61AE # <CJK>
+0x9CE2 0x61CC # <CJK>
+0x9CE3 0x61CA # <CJK>
+0x9CE4 0x61C9 # <CJK>
+0x9CE5 0x61F7 # <CJK>
+0x9CE6 0x61C8 # <CJK>
+0x9CE7 0x61C3 # <CJK>
+0x9CE8 0x61C6 # <CJK>
+0x9CE9 0x61BA # <CJK>
+0x9CEA 0x61CB # <CJK>
+0x9CEB 0x7F79 # <CJK>
+0x9CEC 0x61CD # <CJK>
+0x9CED 0x61E6 # <CJK>
+0x9CEE 0x61E3 # <CJK>
+0x9CEF 0x61F6 # <CJK>
+0x9CF0 0x61FA # <CJK>
+0x9CF1 0x61F4 # <CJK>
+0x9CF2 0x61FF # <CJK>
+0x9CF3 0x61FD # <CJK>
+0x9CF4 0x61FC # <CJK>
+0x9CF5 0x61FE # <CJK>
+0x9CF6 0x6200 # <CJK>
+0x9CF7 0x6208 # <CJK>
+0x9CF8 0x6209 # <CJK>
+0x9CF9 0x620D # <CJK>
+0x9CFA 0x620C # <CJK>
+0x9CFB 0x6214 # <CJK>
+0x9CFC 0x621B # <CJK>
+0x9D40 0x621E # <CJK>
+0x9D41 0x6221 # <CJK>
+0x9D42 0x622A # <CJK>
+0x9D43 0x622E # <CJK>
+0x9D44 0x6230 # <CJK>
+0x9D45 0x6232 # <CJK>
+0x9D46 0x6233 # <CJK>
+0x9D47 0x6241 # <CJK>
+0x9D48 0x624E # <CJK>
+0x9D49 0x625E # <CJK>
+0x9D4A 0x6263 # <CJK>
+0x9D4B 0x625B # <CJK>
+0x9D4C 0x6260 # <CJK>
+0x9D4D 0x6268 # <CJK>
+0x9D4E 0x627C # <CJK>
+0x9D4F 0x6282 # <CJK>
+0x9D50 0x6289 # <CJK>
+0x9D51 0x627E # <CJK>
+0x9D52 0x6292 # <CJK>
+0x9D53 0x6293 # <CJK>
+0x9D54 0x6296 # <CJK>
+0x9D55 0x62D4 # <CJK>
+0x9D56 0x6283 # <CJK>
+0x9D57 0x6294 # <CJK>
+0x9D58 0x62D7 # <CJK>
+0x9D59 0x62D1 # <CJK>
+0x9D5A 0x62BB # <CJK>
+0x9D5B 0x62CF # <CJK>
+0x9D5C 0x62FF # <CJK>
+0x9D5D 0x62C6 # <CJK>
+0x9D5E 0x64D4 # <CJK>
+0x9D5F 0x62C8 # <CJK>
+0x9D60 0x62DC # <CJK>
+0x9D61 0x62CC # <CJK>
+0x9D62 0x62CA # <CJK>
+0x9D63 0x62C2 # <CJK>
+0x9D64 0x62C7 # <CJK>
+0x9D65 0x629B # <CJK>
+0x9D66 0x62C9 # <CJK>
+0x9D67 0x630C # <CJK>
+0x9D68 0x62EE # <CJK>
+0x9D69 0x62F1 # <CJK>
+0x9D6A 0x6327 # <CJK>
+0x9D6B 0x6302 # <CJK>
+0x9D6C 0x6308 # <CJK>
+0x9D6D 0x62EF # <CJK>
+0x9D6E 0x62F5 # <CJK>
+0x9D6F 0x6350 # <CJK>
+0x9D70 0x633E # <CJK>
+0x9D71 0x634D # <CJK>
+0x9D72 0x641C # <CJK>
+0x9D73 0x634F # <CJK>
+0x9D74 0x6396 # <CJK>
+0x9D75 0x638E # <CJK>
+0x9D76 0x6380 # <CJK>
+0x9D77 0x63AB # <CJK>
+0x9D78 0x6376 # <CJK>
+0x9D79 0x63A3 # <CJK>
+0x9D7A 0x638F # <CJK>
+0x9D7B 0x6389 # <CJK>
+0x9D7C 0x639F # <CJK>
+0x9D7D 0x63B5 # <CJK>
+0x9D7E 0x636B # <CJK>
+0x9D80 0x6369 # <CJK>
+0x9D81 0x63BE # <CJK>
+0x9D82 0x63E9 # <CJK>
+0x9D83 0x63C0 # <CJK>
+0x9D84 0x63C6 # <CJK>
+0x9D85 0x63E3 # <CJK>
+0x9D86 0x63C9 # <CJK>
+0x9D87 0x63D2 # <CJK>
+0x9D88 0x63F6 # <CJK>
+0x9D89 0x63C4 # <CJK>
+0x9D8A 0x6416 # <CJK>
+0x9D8B 0x6434 # <CJK>
+0x9D8C 0x6406 # <CJK>
+0x9D8D 0x6413 # <CJK>
+0x9D8E 0x6426 # <CJK>
+0x9D8F 0x6436 # <CJK>
+0x9D90 0x651D # <CJK>
+0x9D91 0x6417 # <CJK>
+0x9D92 0x6428 # <CJK>
+0x9D93 0x640F # <CJK>
+0x9D94 0x6467 # <CJK>
+0x9D95 0x646F # <CJK>
+0x9D96 0x6476 # <CJK>
+0x9D97 0x644E # <CJK>
+0x9D98 0x652A # <CJK>
+0x9D99 0x6495 # <CJK>
+0x9D9A 0x6493 # <CJK>
+0x9D9B 0x64A5 # <CJK>
+0x9D9C 0x64A9 # <CJK>
+0x9D9D 0x6488 # <CJK>
+0x9D9E 0x64BC # <CJK>
+0x9D9F 0x64DA # <CJK>
+0x9DA0 0x64D2 # <CJK>
+0x9DA1 0x64C5 # <CJK>
+0x9DA2 0x64C7 # <CJK>
+0x9DA3 0x64BB # <CJK>
+0x9DA4 0x64D8 # <CJK>
+0x9DA5 0x64C2 # <CJK>
+0x9DA6 0x64F1 # <CJK>
+0x9DA7 0x64E7 # <CJK>
+0x9DA8 0x8209 # <CJK>
+0x9DA9 0x64E0 # <CJK>
+0x9DAA 0x64E1 # <CJK>
+0x9DAB 0x62AC # <CJK>
+0x9DAC 0x64E3 # <CJK>
+0x9DAD 0x64EF # <CJK>
+0x9DAE 0x652C # <CJK>
+0x9DAF 0x64F6 # <CJK>
+0x9DB0 0x64F4 # <CJK>
+0x9DB1 0x64F2 # <CJK>
+0x9DB2 0x64FA # <CJK>
+0x9DB3 0x6500 # <CJK>
+0x9DB4 0x64FD # <CJK>
+0x9DB5 0x6518 # <CJK>
+0x9DB6 0x651C # <CJK>
+0x9DB7 0x6505 # <CJK>
+0x9DB8 0x6524 # <CJK>
+0x9DB9 0x6523 # <CJK>
+0x9DBA 0x652B # <CJK>
+0x9DBB 0x6534 # <CJK>
+0x9DBC 0x6535 # <CJK>
+0x9DBD 0x6537 # <CJK>
+0x9DBE 0x6536 # <CJK>
+0x9DBF 0x6538 # <CJK>
+0x9DC0 0x754B # <CJK>
+0x9DC1 0x6548 # <CJK>
+0x9DC2 0x6556 # <CJK>
+0x9DC3 0x6555 # <CJK>
+0x9DC4 0x654D # <CJK>
+0x9DC5 0x6558 # <CJK>
+0x9DC6 0x655E # <CJK>
+0x9DC7 0x655D # <CJK>
+0x9DC8 0x6572 # <CJK>
+0x9DC9 0x6578 # <CJK>
+0x9DCA 0x6582 # <CJK>
+0x9DCB 0x6583 # <CJK>
+0x9DCC 0x8B8A # <CJK>
+0x9DCD 0x659B # <CJK>
+0x9DCE 0x659F # <CJK>
+0x9DCF 0x65AB # <CJK>
+0x9DD0 0x65B7 # <CJK>
+0x9DD1 0x65C3 # <CJK>
+0x9DD2 0x65C6 # <CJK>
+0x9DD3 0x65C1 # <CJK>
+0x9DD4 0x65C4 # <CJK>
+0x9DD5 0x65CC # <CJK>
+0x9DD6 0x65D2 # <CJK>
+0x9DD7 0x65DB # <CJK>
+0x9DD8 0x65D9 # <CJK>
+0x9DD9 0x65E0 # <CJK>
+0x9DDA 0x65E1 # <CJK>
+0x9DDB 0x65F1 # <CJK>
+0x9DDC 0x6772 # <CJK>
+0x9DDD 0x660A # <CJK>
+0x9DDE 0x6603 # <CJK>
+0x9DDF 0x65FB # <CJK>
+0x9DE0 0x6773 # <CJK>
+0x9DE1 0x6635 # <CJK>
+0x9DE2 0x6636 # <CJK>
+0x9DE3 0x6634 # <CJK>
+0x9DE4 0x661C # <CJK>
+0x9DE5 0x664F # <CJK>
+0x9DE6 0x6644 # <CJK>
+0x9DE7 0x6649 # <CJK>
+0x9DE8 0x6641 # <CJK>
+0x9DE9 0x665E # <CJK>
+0x9DEA 0x665D # <CJK>
+0x9DEB 0x6664 # <CJK>
+0x9DEC 0x6667 # <CJK>
+0x9DED 0x6668 # <CJK>
+0x9DEE 0x665F # <CJK>
+0x9DEF 0x6662 # <CJK>
+0x9DF0 0x6670 # <CJK>
+0x9DF1 0x6683 # <CJK>
+0x9DF2 0x6688 # <CJK>
+0x9DF3 0x668E # <CJK>
+0x9DF4 0x6689 # <CJK>
+0x9DF5 0x6684 # <CJK>
+0x9DF6 0x6698 # <CJK>
+0x9DF7 0x669D # <CJK>
+0x9DF8 0x66C1 # <CJK>
+0x9DF9 0x66B9 # <CJK>
+0x9DFA 0x66C9 # <CJK>
+0x9DFB 0x66BE # <CJK>
+0x9DFC 0x66BC # <CJK>
+0x9E40 0x66C4 # <CJK>
+0x9E41 0x66B8 # <CJK>
+0x9E42 0x66D6 # <CJK>
+0x9E43 0x66DA # <CJK>
+0x9E44 0x66E0 # <CJK>
+0x9E45 0x663F # <CJK>
+0x9E46 0x66E6 # <CJK>
+0x9E47 0x66E9 # <CJK>
+0x9E48 0x66F0 # <CJK>
+0x9E49 0x66F5 # <CJK>
+0x9E4A 0x66F7 # <CJK>
+0x9E4B 0x670F # <CJK>
+0x9E4C 0x6716 # <CJK>
+0x9E4D 0x671E # <CJK>
+0x9E4E 0x6726 # <CJK>
+0x9E4F 0x6727 # <CJK>
+0x9E50 0x9738 # <CJK>
+0x9E51 0x672E # <CJK>
+0x9E52 0x673F # <CJK>
+0x9E53 0x6736 # <CJK>
+0x9E54 0x6741 # <CJK>
+0x9E55 0x6738 # <CJK>
+0x9E56 0x6737 # <CJK>
+0x9E57 0x6746 # <CJK>
+0x9E58 0x675E # <CJK>
+0x9E59 0x6760 # <CJK>
+0x9E5A 0x6759 # <CJK>
+0x9E5B 0x6763 # <CJK>
+0x9E5C 0x6764 # <CJK>
+0x9E5D 0x6789 # <CJK>
+0x9E5E 0x6770 # <CJK>
+0x9E5F 0x67A9 # <CJK>
+0x9E60 0x677C # <CJK>
+0x9E61 0x676A # <CJK>
+0x9E62 0x678C # <CJK>
+0x9E63 0x678B # <CJK>
+0x9E64 0x67A6 # <CJK>
+0x9E65 0x67A1 # <CJK>
+0x9E66 0x6785 # <CJK>
+0x9E67 0x67B7 # <CJK>
+0x9E68 0x67EF # <CJK>
+0x9E69 0x67B4 # <CJK>
+0x9E6A 0x67EC # <CJK>
+0x9E6B 0x67B3 # <CJK>
+0x9E6C 0x67E9 # <CJK>
+0x9E6D 0x67B8 # <CJK>
+0x9E6E 0x67E4 # <CJK>
+0x9E6F 0x67DE # <CJK>
+0x9E70 0x67DD # <CJK>
+0x9E71 0x67E2 # <CJK>
+0x9E72 0x67EE # <CJK>
+0x9E73 0x67B9 # <CJK>
+0x9E74 0x67CE # <CJK>
+0x9E75 0x67C6 # <CJK>
+0x9E76 0x67E7 # <CJK>
+0x9E77 0x6A9C # <CJK>
+0x9E78 0x681E # <CJK>
+0x9E79 0x6846 # <CJK>
+0x9E7A 0x6829 # <CJK>
+0x9E7B 0x6840 # <CJK>
+0x9E7C 0x684D # <CJK>
+0x9E7D 0x6832 # <CJK>
+0x9E7E 0x684E # <CJK>
+0x9E80 0x68B3 # <CJK>
+0x9E81 0x682B # <CJK>
+0x9E82 0x6859 # <CJK>
+0x9E83 0x6863 # <CJK>
+0x9E84 0x6877 # <CJK>
+0x9E85 0x687F # <CJK>
+0x9E86 0x689F # <CJK>
+0x9E87 0x688F # <CJK>
+0x9E88 0x68AD # <CJK>
+0x9E89 0x6894 # <CJK>
+0x9E8A 0x689D # <CJK>
+0x9E8B 0x689B # <CJK>
+0x9E8C 0x6883 # <CJK>
+0x9E8D 0x6AAE # <CJK>
+0x9E8E 0x68B9 # <CJK>
+0x9E8F 0x6874 # <CJK>
+0x9E90 0x68B5 # <CJK>
+0x9E91 0x68A0 # <CJK>
+0x9E92 0x68BA # <CJK>
+0x9E93 0x690F # <CJK>
+0x9E94 0x688D # <CJK>
+0x9E95 0x687E # <CJK>
+0x9E96 0x6901 # <CJK>
+0x9E97 0x68CA # <CJK>
+0x9E98 0x6908 # <CJK>
+0x9E99 0x68D8 # <CJK>
+0x9E9A 0x6922 # <CJK>
+0x9E9B 0x6926 # <CJK>
+0x9E9C 0x68E1 # <CJK>
+0x9E9D 0x690C # <CJK>
+0x9E9E 0x68CD # <CJK>
+0x9E9F 0x68D4 # <CJK>
+0x9EA0 0x68E7 # <CJK>
+0x9EA1 0x68D5 # <CJK>
+0x9EA2 0x6936 # <CJK>
+0x9EA3 0x6912 # <CJK>
+0x9EA4 0x6904 # <CJK>
+0x9EA5 0x68D7 # <CJK>
+0x9EA6 0x68E3 # <CJK>
+0x9EA7 0x6925 # <CJK>
+0x9EA8 0x68F9 # <CJK>
+0x9EA9 0x68E0 # <CJK>
+0x9EAA 0x68EF # <CJK>
+0x9EAB 0x6928 # <CJK>
+0x9EAC 0x692A # <CJK>
+0x9EAD 0x691A # <CJK>
+0x9EAE 0x6923 # <CJK>
+0x9EAF 0x6921 # <CJK>
+0x9EB0 0x68C6 # <CJK>
+0x9EB1 0x6979 # <CJK>
+0x9EB2 0x6977 # <CJK>
+0x9EB3 0x695C # <CJK>
+0x9EB4 0x6978 # <CJK>
+0x9EB5 0x696B # <CJK>
+0x9EB6 0x6954 # <CJK>
+0x9EB7 0x697E # <CJK>
+0x9EB8 0x696E # <CJK>
+0x9EB9 0x6939 # <CJK>
+0x9EBA 0x6974 # <CJK>
+0x9EBB 0x693D # <CJK>
+0x9EBC 0x6959 # <CJK>
+0x9EBD 0x6930 # <CJK>
+0x9EBE 0x6961 # <CJK>
+0x9EBF 0x695E # <CJK>
+0x9EC0 0x695D # <CJK>
+0x9EC1 0x6981 # <CJK>
+0x9EC2 0x696A # <CJK>
+0x9EC3 0x69B2 # <CJK>
+0x9EC4 0x69AE # <CJK>
+0x9EC5 0x69D0 # <CJK>
+0x9EC6 0x69BF # <CJK>
+0x9EC7 0x69C1 # <CJK>
+0x9EC8 0x69D3 # <CJK>
+0x9EC9 0x69BE # <CJK>
+0x9ECA 0x69CE # <CJK>
+0x9ECB 0x5BE8 # <CJK>
+0x9ECC 0x69CA # <CJK>
+0x9ECD 0x69DD # <CJK>
+0x9ECE 0x69BB # <CJK>
+0x9ECF 0x69C3 # <CJK>
+0x9ED0 0x69A7 # <CJK>
+0x9ED1 0x6A2E # <CJK>
+0x9ED2 0x6991 # <CJK>
+0x9ED3 0x69A0 # <CJK>
+0x9ED4 0x699C # <CJK>
+0x9ED5 0x6995 # <CJK>
+0x9ED6 0x69B4 # <CJK>
+0x9ED7 0x69DE # <CJK>
+0x9ED8 0x69E8 # <CJK>
+0x9ED9 0x6A02 # <CJK>
+0x9EDA 0x6A1B # <CJK>
+0x9EDB 0x69FF # <CJK>
+0x9EDC 0x6B0A # <CJK>
+0x9EDD 0x69F9 # <CJK>
+0x9EDE 0x69F2 # <CJK>
+0x9EDF 0x69E7 # <CJK>
+0x9EE0 0x6A05 # <CJK>
+0x9EE1 0x69B1 # <CJK>
+0x9EE2 0x6A1E # <CJK>
+0x9EE3 0x69ED # <CJK>
+0x9EE4 0x6A14 # <CJK>
+0x9EE5 0x69EB # <CJK>
+0x9EE6 0x6A0A # <CJK>
+0x9EE7 0x6A12 # <CJK>
+0x9EE8 0x6AC1 # <CJK>
+0x9EE9 0x6A23 # <CJK>
+0x9EEA 0x6A13 # <CJK>
+0x9EEB 0x6A44 # <CJK>
+0x9EEC 0x6A0C # <CJK>
+0x9EED 0x6A72 # <CJK>
+0x9EEE 0x6A36 # <CJK>
+0x9EEF 0x6A78 # <CJK>
+0x9EF0 0x6A47 # <CJK>
+0x9EF1 0x6A62 # <CJK>
+0x9EF2 0x6A59 # <CJK>
+0x9EF3 0x6A66 # <CJK>
+0x9EF4 0x6A48 # <CJK>
+0x9EF5 0x6A38 # <CJK>
+0x9EF6 0x6A22 # <CJK>
+0x9EF7 0x6A90 # <CJK>
+0x9EF8 0x6A8D # <CJK>
+0x9EF9 0x6AA0 # <CJK>
+0x9EFA 0x6A84 # <CJK>
+0x9EFB 0x6AA2 # <CJK>
+0x9EFC 0x6AA3 # <CJK>
+0x9F40 0x6A97 # <CJK>
+0x9F41 0x8617 # <CJK>
+0x9F42 0x6ABB # <CJK>
+0x9F43 0x6AC3 # <CJK>
+0x9F44 0x6AC2 # <CJK>
+0x9F45 0x6AB8 # <CJK>
+0x9F46 0x6AB3 # <CJK>
+0x9F47 0x6AAC # <CJK>
+0x9F48 0x6ADE # <CJK>
+0x9F49 0x6AD1 # <CJK>
+0x9F4A 0x6ADF # <CJK>
+0x9F4B 0x6AAA # <CJK>
+0x9F4C 0x6ADA # <CJK>
+0x9F4D 0x6AEA # <CJK>
+0x9F4E 0x6AFB # <CJK>
+0x9F4F 0x6B05 # <CJK>
+0x9F50 0x8616 # <CJK>
+0x9F51 0x6AFA # <CJK>
+0x9F52 0x6B12 # <CJK>
+0x9F53 0x6B16 # <CJK>
+0x9F54 0x9B31 # <CJK>
+0x9F55 0x6B1F # <CJK>
+0x9F56 0x6B38 # <CJK>
+0x9F57 0x6B37 # <CJK>
+0x9F58 0x76DC # <CJK>
+0x9F59 0x6B39 # <CJK>
+0x9F5A 0x98EE # <CJK>
+0x9F5B 0x6B47 # <CJK>
+0x9F5C 0x6B43 # <CJK>
+0x9F5D 0x6B49 # <CJK>
+0x9F5E 0x6B50 # <CJK>
+0x9F5F 0x6B59 # <CJK>
+0x9F60 0x6B54 # <CJK>
+0x9F61 0x6B5B # <CJK>
+0x9F62 0x6B5F # <CJK>
+0x9F63 0x6B61 # <CJK>
+0x9F64 0x6B78 # <CJK>
+0x9F65 0x6B79 # <CJK>
+0x9F66 0x6B7F # <CJK>
+0x9F67 0x6B80 # <CJK>
+0x9F68 0x6B84 # <CJK>
+0x9F69 0x6B83 # <CJK>
+0x9F6A 0x6B8D # <CJK>
+0x9F6B 0x6B98 # <CJK>
+0x9F6C 0x6B95 # <CJK>
+0x9F6D 0x6B9E # <CJK>
+0x9F6E 0x6BA4 # <CJK>
+0x9F6F 0x6BAA # <CJK>
+0x9F70 0x6BAB # <CJK>
+0x9F71 0x6BAF # <CJK>
+0x9F72 0x6BB2 # <CJK>
+0x9F73 0x6BB1 # <CJK>
+0x9F74 0x6BB3 # <CJK>
+0x9F75 0x6BB7 # <CJK>
+0x9F76 0x6BBC # <CJK>
+0x9F77 0x6BC6 # <CJK>
+0x9F78 0x6BCB # <CJK>
+0x9F79 0x6BD3 # <CJK>
+0x9F7A 0x6BDF # <CJK>
+0x9F7B 0x6BEC # <CJK>
+0x9F7C 0x6BEB # <CJK>
+0x9F7D 0x6BF3 # <CJK>
+0x9F7E 0x6BEF # <CJK>
+0x9F80 0x9EBE # <CJK>
+0x9F81 0x6C08 # <CJK>
+0x9F82 0x6C13 # <CJK>
+0x9F83 0x6C14 # <CJK>
+0x9F84 0x6C1B # <CJK>
+0x9F85 0x6C24 # <CJK>
+0x9F86 0x6C23 # <CJK>
+0x9F87 0x6C5E # <CJK>
+0x9F88 0x6C55 # <CJK>
+0x9F89 0x6C62 # <CJK>
+0x9F8A 0x6C6A # <CJK>
+0x9F8B 0x6C82 # <CJK>
+0x9F8C 0x6C8D # <CJK>
+0x9F8D 0x6C9A # <CJK>
+0x9F8E 0x6C81 # <CJK>
+0x9F8F 0x6C9B # <CJK>
+0x9F90 0x6C7E # <CJK>
+0x9F91 0x6C68 # <CJK>
+0x9F92 0x6C73 # <CJK>
+0x9F93 0x6C92 # <CJK>
+0x9F94 0x6C90 # <CJK>
+0x9F95 0x6CC4 # <CJK>
+0x9F96 0x6CF1 # <CJK>
+0x9F97 0x6CD3 # <CJK>
+0x9F98 0x6CBD # <CJK>
+0x9F99 0x6CD7 # <CJK>
+0x9F9A 0x6CC5 # <CJK>
+0x9F9B 0x6CDD # <CJK>
+0x9F9C 0x6CAE # <CJK>
+0x9F9D 0x6CB1 # <CJK>
+0x9F9E 0x6CBE # <CJK>
+0x9F9F 0x6CBA # <CJK>
+0x9FA0 0x6CDB # <CJK>
+0x9FA1 0x6CEF # <CJK>
+0x9FA2 0x6CD9 # <CJK>
+0x9FA3 0x6CEA # <CJK>
+0x9FA4 0x6D1F # <CJK>
+0x9FA5 0x884D # <CJK>
+0x9FA6 0x6D36 # <CJK>
+0x9FA7 0x6D2B # <CJK>
+0x9FA8 0x6D3D # <CJK>
+0x9FA9 0x6D38 # <CJK>
+0x9FAA 0x6D19 # <CJK>
+0x9FAB 0x6D35 # <CJK>
+0x9FAC 0x6D33 # <CJK>
+0x9FAD 0x6D12 # <CJK>
+0x9FAE 0x6D0C # <CJK>
+0x9FAF 0x6D63 # <CJK>
+0x9FB0 0x6D93 # <CJK>
+0x9FB1 0x6D64 # <CJK>
+0x9FB2 0x6D5A # <CJK>
+0x9FB3 0x6D79 # <CJK>
+0x9FB4 0x6D59 # <CJK>
+0x9FB5 0x6D8E # <CJK>
+0x9FB6 0x6D95 # <CJK>
+0x9FB7 0x6FE4 # <CJK>
+0x9FB8 0x6D85 # <CJK>
+0x9FB9 0x6DF9 # <CJK>
+0x9FBA 0x6E15 # <CJK>
+0x9FBB 0x6E0A # <CJK>
+0x9FBC 0x6DB5 # <CJK>
+0x9FBD 0x6DC7 # <CJK>
+0x9FBE 0x6DE6 # <CJK>
+0x9FBF 0x6DB8 # <CJK>
+0x9FC0 0x6DC6 # <CJK>
+0x9FC1 0x6DEC # <CJK>
+0x9FC2 0x6DDE # <CJK>
+0x9FC3 0x6DCC # <CJK>
+0x9FC4 0x6DE8 # <CJK>
+0x9FC5 0x6DD2 # <CJK>
+0x9FC6 0x6DC5 # <CJK>
+0x9FC7 0x6DFA # <CJK>
+0x9FC8 0x6DD9 # <CJK>
+0x9FC9 0x6DE4 # <CJK>
+0x9FCA 0x6DD5 # <CJK>
+0x9FCB 0x6DEA # <CJK>
+0x9FCC 0x6DEE # <CJK>
+0x9FCD 0x6E2D # <CJK>
+0x9FCE 0x6E6E # <CJK>
+0x9FCF 0x6E2E # <CJK>
+0x9FD0 0x6E19 # <CJK>
+0x9FD1 0x6E72 # <CJK>
+0x9FD2 0x6E5F # <CJK>
+0x9FD3 0x6E3E # <CJK>
+0x9FD4 0x6E23 # <CJK>
+0x9FD5 0x6E6B # <CJK>
+0x9FD6 0x6E2B # <CJK>
+0x9FD7 0x6E76 # <CJK>
+0x9FD8 0x6E4D # <CJK>
+0x9FD9 0x6E1F # <CJK>
+0x9FDA 0x6E43 # <CJK>
+0x9FDB 0x6E3A # <CJK>
+0x9FDC 0x6E4E # <CJK>
+0x9FDD 0x6E24 # <CJK>
+0x9FDE 0x6EFF # <CJK>
+0x9FDF 0x6E1D # <CJK>
+0x9FE0 0x6E38 # <CJK>
+0x9FE1 0x6E82 # <CJK>
+0x9FE2 0x6EAA # <CJK>
+0x9FE3 0x6E98 # <CJK>
+0x9FE4 0x6EC9 # <CJK>
+0x9FE5 0x6EB7 # <CJK>
+0x9FE6 0x6ED3 # <CJK>
+0x9FE7 0x6EBD # <CJK>
+0x9FE8 0x6EAF # <CJK>
+0x9FE9 0x6EC4 # <CJK>
+0x9FEA 0x6EB2 # <CJK>
+0x9FEB 0x6ED4 # <CJK>
+0x9FEC 0x6ED5 # <CJK>
+0x9FED 0x6E8F # <CJK>
+0x9FEE 0x6EA5 # <CJK>
+0x9FEF 0x6EC2 # <CJK>
+0x9FF0 0x6E9F # <CJK>
+0x9FF1 0x6F41 # <CJK>
+0x9FF2 0x6F11 # <CJK>
+0x9FF3 0x704C # <CJK>
+0x9FF4 0x6EEC # <CJK>
+0x9FF5 0x6EF8 # <CJK>
+0x9FF6 0x6EFE # <CJK>
+0x9FF7 0x6F3F # <CJK>
+0x9FF8 0x6EF2 # <CJK>
+0x9FF9 0x6F31 # <CJK>
+0x9FFA 0x6EEF # <CJK>
+0x9FFB 0x6F32 # <CJK>
+0x9FFC 0x6ECC # <CJK>
+0xA1 0xFF61 # HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2 0xFF62 # HALFWIDTH LEFT CORNER BRACKET
+0xA3 0xFF63 # HALFWIDTH RIGHT CORNER BRACKET
+0xA4 0xFF64 # HALFWIDTH IDEOGRAPHIC COMMA
+0xA5 0xFF65 # HALFWIDTH KATAKANA MIDDLE DOT
+0xA6 0xFF66 # HALFWIDTH KATAKANA LETTER WO
+0xA7 0xFF67 # HALFWIDTH KATAKANA LETTER SMALL A
+0xA8 0xFF68 # HALFWIDTH KATAKANA LETTER SMALL I
+0xA9 0xFF69 # HALFWIDTH KATAKANA LETTER SMALL U
+0xAA 0xFF6A # HALFWIDTH KATAKANA LETTER SMALL E
+0xAB 0xFF6B # HALFWIDTH KATAKANA LETTER SMALL O
+0xAC 0xFF6C # HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD 0xFF6D # HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE 0xFF6E # HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF 0xFF6F # HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0 0xFF70 # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1 0xFF71 # HALFWIDTH KATAKANA LETTER A
+0xB2 0xFF72 # HALFWIDTH KATAKANA LETTER I
+0xB3 0xFF73 # HALFWIDTH KATAKANA LETTER U
+0xB4 0xFF74 # HALFWIDTH KATAKANA LETTER E
+0xB5 0xFF75 # HALFWIDTH KATAKANA LETTER O
+0xB6 0xFF76 # HALFWIDTH KATAKANA LETTER KA
+0xB7 0xFF77 # HALFWIDTH KATAKANA LETTER KI
+0xB8 0xFF78 # HALFWIDTH KATAKANA LETTER KU
+0xB9 0xFF79 # HALFWIDTH KATAKANA LETTER KE
+0xBA 0xFF7A # HALFWIDTH KATAKANA LETTER KO
+0xBB 0xFF7B # HALFWIDTH KATAKANA LETTER SA
+0xBC 0xFF7C # HALFWIDTH KATAKANA LETTER SI
+0xBD 0xFF7D # HALFWIDTH KATAKANA LETTER SU
+0xBE 0xFF7E # HALFWIDTH KATAKANA LETTER SE
+0xBF 0xFF7F # HALFWIDTH KATAKANA LETTER SO
+0xC0 0xFF80 # HALFWIDTH KATAKANA LETTER TA
+0xC1 0xFF81 # HALFWIDTH KATAKANA LETTER TI
+0xC2 0xFF82 # HALFWIDTH KATAKANA LETTER TU
+0xC3 0xFF83 # HALFWIDTH KATAKANA LETTER TE
+0xC4 0xFF84 # HALFWIDTH KATAKANA LETTER TO
+0xC5 0xFF85 # HALFWIDTH KATAKANA LETTER NA
+0xC6 0xFF86 # HALFWIDTH KATAKANA LETTER NI
+0xC7 0xFF87 # HALFWIDTH KATAKANA LETTER NU
+0xC8 0xFF88 # HALFWIDTH KATAKANA LETTER NE
+0xC9 0xFF89 # HALFWIDTH KATAKANA LETTER NO
+0xCA 0xFF8A # HALFWIDTH KATAKANA LETTER HA
+0xCB 0xFF8B # HALFWIDTH KATAKANA LETTER HI
+0xCC 0xFF8C # HALFWIDTH KATAKANA LETTER HU
+0xCD 0xFF8D # HALFWIDTH KATAKANA LETTER HE
+0xCE 0xFF8E # HALFWIDTH KATAKANA LETTER HO
+0xCF 0xFF8F # HALFWIDTH KATAKANA LETTER MA
+0xD0 0xFF90 # HALFWIDTH KATAKANA LETTER MI
+0xD1 0xFF91 # HALFWIDTH KATAKANA LETTER MU
+0xD2 0xFF92 # HALFWIDTH KATAKANA LETTER ME
+0xD3 0xFF93 # HALFWIDTH KATAKANA LETTER MO
+0xD4 0xFF94 # HALFWIDTH KATAKANA LETTER YA
+0xD5 0xFF95 # HALFWIDTH KATAKANA LETTER YU
+0xD6 0xFF96 # HALFWIDTH KATAKANA LETTER YO
+0xD7 0xFF97 # HALFWIDTH KATAKANA LETTER RA
+0xD8 0xFF98 # HALFWIDTH KATAKANA LETTER RI
+0xD9 0xFF99 # HALFWIDTH KATAKANA LETTER RU
+0xDA 0xFF9A # HALFWIDTH KATAKANA LETTER RE
+0xDB 0xFF9B # HALFWIDTH KATAKANA LETTER RO
+0xDC 0xFF9C # HALFWIDTH KATAKANA LETTER WA
+0xDD 0xFF9D # HALFWIDTH KATAKANA LETTER N
+0xDE 0xFF9E # HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF 0xFF9F # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+0xE040 0x6F3E # <CJK>
+0xE041 0x6F13 # <CJK>
+0xE042 0x6EF7 # <CJK>
+0xE043 0x6F86 # <CJK>
+0xE044 0x6F7A # <CJK>
+0xE045 0x6F78 # <CJK>
+0xE046 0x6F81 # <CJK>
+0xE047 0x6F80 # <CJK>
+0xE048 0x6F6F # <CJK>
+0xE049 0x6F5B # <CJK>
+0xE04A 0x6FF3 # <CJK>
+0xE04B 0x6F6D # <CJK>
+0xE04C 0x6F82 # <CJK>
+0xE04D 0x6F7C # <CJK>
+0xE04E 0x6F58 # <CJK>
+0xE04F 0x6F8E # <CJK>
+0xE050 0x6F91 # <CJK>
+0xE051 0x6FC2 # <CJK>
+0xE052 0x6F66 # <CJK>
+0xE053 0x6FB3 # <CJK>
+0xE054 0x6FA3 # <CJK>
+0xE055 0x6FA1 # <CJK>
+0xE056 0x6FA4 # <CJK>
+0xE057 0x6FB9 # <CJK>
+0xE058 0x6FC6 # <CJK>
+0xE059 0x6FAA # <CJK>
+0xE05A 0x6FDF # <CJK>
+0xE05B 0x6FD5 # <CJK>
+0xE05C 0x6FEC # <CJK>
+0xE05D 0x6FD4 # <CJK>
+0xE05E 0x6FD8 # <CJK>
+0xE05F 0x6FF1 # <CJK>
+0xE060 0x6FEE # <CJK>
+0xE061 0x6FDB # <CJK>
+0xE062 0x7009 # <CJK>
+0xE063 0x700B # <CJK>
+0xE064 0x6FFA # <CJK>
+0xE065 0x7011 # <CJK>
+0xE066 0x7001 # <CJK>
+0xE067 0x700F # <CJK>
+0xE068 0x6FFE # <CJK>
+0xE069 0x701B # <CJK>
+0xE06A 0x701A # <CJK>
+0xE06B 0x6F74 # <CJK>
+0xE06C 0x701D # <CJK>
+0xE06D 0x7018 # <CJK>
+0xE06E 0x701F # <CJK>
+0xE06F 0x7030 # <CJK>
+0xE070 0x703E # <CJK>
+0xE071 0x7032 # <CJK>
+0xE072 0x7051 # <CJK>
+0xE073 0x7063 # <CJK>
+0xE074 0x7099 # <CJK>
+0xE075 0x7092 # <CJK>
+0xE076 0x70AF # <CJK>
+0xE077 0x70F1 # <CJK>
+0xE078 0x70AC # <CJK>
+0xE079 0x70B8 # <CJK>
+0xE07A 0x70B3 # <CJK>
+0xE07B 0x70AE # <CJK>
+0xE07C 0x70DF # <CJK>
+0xE07D 0x70CB # <CJK>
+0xE07E 0x70DD # <CJK>
+0xE080 0x70D9 # <CJK>
+0xE081 0x7109 # <CJK>
+0xE082 0x70FD # <CJK>
+0xE083 0x711C # <CJK>
+0xE084 0x7119 # <CJK>
+0xE085 0x7165 # <CJK>
+0xE086 0x7155 # <CJK>
+0xE087 0x7188 # <CJK>
+0xE088 0x7166 # <CJK>
+0xE089 0x7162 # <CJK>
+0xE08A 0x714C # <CJK>
+0xE08B 0x7156 # <CJK>
+0xE08C 0x716C # <CJK>
+0xE08D 0x718F # <CJK>
+0xE08E 0x71FB # <CJK>
+0xE08F 0x7184 # <CJK>
+0xE090 0x7195 # <CJK>
+0xE091 0x71A8 # <CJK>
+0xE092 0x71AC # <CJK>
+0xE093 0x71D7 # <CJK>
+0xE094 0x71B9 # <CJK>
+0xE095 0x71BE # <CJK>
+0xE096 0x71D2 # <CJK>
+0xE097 0x71C9 # <CJK>
+0xE098 0x71D4 # <CJK>
+0xE099 0x71CE # <CJK>
+0xE09A 0x71E0 # <CJK>
+0xE09B 0x71EC # <CJK>
+0xE09C 0x71E7 # <CJK>
+0xE09D 0x71F5 # <CJK>
+0xE09E 0x71FC # <CJK>
+0xE09F 0x71F9 # <CJK>
+0xE0A0 0x71FF # <CJK>
+0xE0A1 0x720D # <CJK>
+0xE0A2 0x7210 # <CJK>
+0xE0A3 0x721B # <CJK>
+0xE0A4 0x7228 # <CJK>
+0xE0A5 0x722D # <CJK>
+0xE0A6 0x722C # <CJK>
+0xE0A7 0x7230 # <CJK>
+0xE0A8 0x7232 # <CJK>
+0xE0A9 0x723B # <CJK>
+0xE0AA 0x723C # <CJK>
+0xE0AB 0x723F # <CJK>
+0xE0AC 0x7240 # <CJK>
+0xE0AD 0x7246 # <CJK>
+0xE0AE 0x724B # <CJK>
+0xE0AF 0x7258 # <CJK>
+0xE0B0 0x7274 # <CJK>
+0xE0B1 0x727E # <CJK>
+0xE0B2 0x7282 # <CJK>
+0xE0B3 0x7281 # <CJK>
+0xE0B4 0x7287 # <CJK>
+0xE0B5 0x7292 # <CJK>
+0xE0B6 0x7296 # <CJK>
+0xE0B7 0x72A2 # <CJK>
+0xE0B8 0x72A7 # <CJK>
+0xE0B9 0x72B9 # <CJK>
+0xE0BA 0x72B2 # <CJK>
+0xE0BB 0x72C3 # <CJK>
+0xE0BC 0x72C6 # <CJK>
+0xE0BD 0x72C4 # <CJK>
+0xE0BE 0x72CE # <CJK>
+0xE0BF 0x72D2 # <CJK>
+0xE0C0 0x72E2 # <CJK>
+0xE0C1 0x72E0 # <CJK>
+0xE0C2 0x72E1 # <CJK>
+0xE0C3 0x72F9 # <CJK>
+0xE0C4 0x72F7 # <CJK>
+0xE0C5 0x500F # <CJK>
+0xE0C6 0x7317 # <CJK>
+0xE0C7 0x730A # <CJK>
+0xE0C8 0x731C # <CJK>
+0xE0C9 0x7316 # <CJK>
+0xE0CA 0x731D # <CJK>
+0xE0CB 0x7334 # <CJK>
+0xE0CC 0x732F # <CJK>
+0xE0CD 0x7329 # <CJK>
+0xE0CE 0x7325 # <CJK>
+0xE0CF 0x733E # <CJK>
+0xE0D0 0x734E # <CJK>
+0xE0D1 0x734F # <CJK>
+0xE0D2 0x9ED8 # <CJK>
+0xE0D3 0x7357 # <CJK>
+0xE0D4 0x736A # <CJK>
+0xE0D5 0x7368 # <CJK>
+0xE0D6 0x7370 # <CJK>
+0xE0D7 0x7378 # <CJK>
+0xE0D8 0x7375 # <CJK>
+0xE0D9 0x737B # <CJK>
+0xE0DA 0x737A # <CJK>
+0xE0DB 0x73C8 # <CJK>
+0xE0DC 0x73B3 # <CJK>
+0xE0DD 0x73CE # <CJK>
+0xE0DE 0x73BB # <CJK>
+0xE0DF 0x73C0 # <CJK>
+0xE0E0 0x73E5 # <CJK>
+0xE0E1 0x73EE # <CJK>
+0xE0E2 0x73DE # <CJK>
+0xE0E3 0x74A2 # <CJK>
+0xE0E4 0x7405 # <CJK>
+0xE0E5 0x746F # <CJK>
+0xE0E6 0x7425 # <CJK>
+0xE0E7 0x73F8 # <CJK>
+0xE0E8 0x7432 # <CJK>
+0xE0E9 0x743A # <CJK>
+0xE0EA 0x7455 # <CJK>
+0xE0EB 0x743F # <CJK>
+0xE0EC 0x745F # <CJK>
+0xE0ED 0x7459 # <CJK>
+0xE0EE 0x7441 # <CJK>
+0xE0EF 0x745C # <CJK>
+0xE0F0 0x7469 # <CJK>
+0xE0F1 0x7470 # <CJK>
+0xE0F2 0x7463 # <CJK>
+0xE0F3 0x746A # <CJK>
+0xE0F4 0x7476 # <CJK>
+0xE0F5 0x747E # <CJK>
+0xE0F6 0x748B # <CJK>
+0xE0F7 0x749E # <CJK>
+0xE0F8 0x74A7 # <CJK>
+0xE0F9 0x74CA # <CJK>
+0xE0FA 0x74CF # <CJK>
+0xE0FB 0x74D4 # <CJK>
+0xE0FC 0x73F1 # <CJK>
+0xE140 0x74E0 # <CJK>
+0xE141 0x74E3 # <CJK>
+0xE142 0x74E7 # <CJK>
+0xE143 0x74E9 # <CJK>
+0xE144 0x74EE # <CJK>
+0xE145 0x74F2 # <CJK>
+0xE146 0x74F0 # <CJK>
+0xE147 0x74F1 # <CJK>
+0xE148 0x74F8 # <CJK>
+0xE149 0x74F7 # <CJK>
+0xE14A 0x7504 # <CJK>
+0xE14B 0x7503 # <CJK>
+0xE14C 0x7505 # <CJK>
+0xE14D 0x750C # <CJK>
+0xE14E 0x750E # <CJK>
+0xE14F 0x750D # <CJK>
+0xE150 0x7515 # <CJK>
+0xE151 0x7513 # <CJK>
+0xE152 0x751E # <CJK>
+0xE153 0x7526 # <CJK>
+0xE154 0x752C # <CJK>
+0xE155 0x753C # <CJK>
+0xE156 0x7544 # <CJK>
+0xE157 0x754D # <CJK>
+0xE158 0x754A # <CJK>
+0xE159 0x7549 # <CJK>
+0xE15A 0x755B # <CJK>
+0xE15B 0x7546 # <CJK>
+0xE15C 0x755A # <CJK>
+0xE15D 0x7569 # <CJK>
+0xE15E 0x7564 # <CJK>
+0xE15F 0x7567 # <CJK>
+0xE160 0x756B # <CJK>
+0xE161 0x756D # <CJK>
+0xE162 0x7578 # <CJK>
+0xE163 0x7576 # <CJK>
+0xE164 0x7586 # <CJK>
+0xE165 0x7587 # <CJK>
+0xE166 0x7574 # <CJK>
+0xE167 0x758A # <CJK>
+0xE168 0x7589 # <CJK>
+0xE169 0x7582 # <CJK>
+0xE16A 0x7594 # <CJK>
+0xE16B 0x759A # <CJK>
+0xE16C 0x759D # <CJK>
+0xE16D 0x75A5 # <CJK>
+0xE16E 0x75A3 # <CJK>
+0xE16F 0x75C2 # <CJK>
+0xE170 0x75B3 # <CJK>
+0xE171 0x75C3 # <CJK>
+0xE172 0x75B5 # <CJK>
+0xE173 0x75BD # <CJK>
+0xE174 0x75B8 # <CJK>
+0xE175 0x75BC # <CJK>
+0xE176 0x75B1 # <CJK>
+0xE177 0x75CD # <CJK>
+0xE178 0x75CA # <CJK>
+0xE179 0x75D2 # <CJK>
+0xE17A 0x75D9 # <CJK>
+0xE17B 0x75E3 # <CJK>
+0xE17C 0x75DE # <CJK>
+0xE17D 0x75FE # <CJK>
+0xE17E 0x75FF # <CJK>
+0xE180 0x75FC # <CJK>
+0xE181 0x7601 # <CJK>
+0xE182 0x75F0 # <CJK>
+0xE183 0x75FA # <CJK>
+0xE184 0x75F2 # <CJK>
+0xE185 0x75F3 # <CJK>
+0xE186 0x760B # <CJK>
+0xE187 0x760D # <CJK>
+0xE188 0x7609 # <CJK>
+0xE189 0x761F # <CJK>
+0xE18A 0x7627 # <CJK>
+0xE18B 0x7620 # <CJK>
+0xE18C 0x7621 # <CJK>
+0xE18D 0x7622 # <CJK>
+0xE18E 0x7624 # <CJK>
+0xE18F 0x7634 # <CJK>
+0xE190 0x7630 # <CJK>
+0xE191 0x763B # <CJK>
+0xE192 0x7647 # <CJK>
+0xE193 0x7648 # <CJK>
+0xE194 0x7646 # <CJK>
+0xE195 0x765C # <CJK>
+0xE196 0x7658 # <CJK>
+0xE197 0x7661 # <CJK>
+0xE198 0x7662 # <CJK>
+0xE199 0x7668 # <CJK>
+0xE19A 0x7669 # <CJK>
+0xE19B 0x766A # <CJK>
+0xE19C 0x7667 # <CJK>
+0xE19D 0x766C # <CJK>
+0xE19E 0x7670 # <CJK>
+0xE19F 0x7672 # <CJK>
+0xE1A0 0x7676 # <CJK>
+0xE1A1 0x7678 # <CJK>
+0xE1A2 0x767C # <CJK>
+0xE1A3 0x7680 # <CJK>
+0xE1A4 0x7683 # <CJK>
+0xE1A5 0x7688 # <CJK>
+0xE1A6 0x768B # <CJK>
+0xE1A7 0x768E # <CJK>
+0xE1A8 0x7696 # <CJK>
+0xE1A9 0x7693 # <CJK>
+0xE1AA 0x7699 # <CJK>
+0xE1AB 0x769A # <CJK>
+0xE1AC 0x76B0 # <CJK>
+0xE1AD 0x76B4 # <CJK>
+0xE1AE 0x76B8 # <CJK>
+0xE1AF 0x76B9 # <CJK>
+0xE1B0 0x76BA # <CJK>
+0xE1B1 0x76C2 # <CJK>
+0xE1B2 0x76CD # <CJK>
+0xE1B3 0x76D6 # <CJK>
+0xE1B4 0x76D2 # <CJK>
+0xE1B5 0x76DE # <CJK>
+0xE1B6 0x76E1 # <CJK>
+0xE1B7 0x76E5 # <CJK>
+0xE1B8 0x76E7 # <CJK>
+0xE1B9 0x76EA # <CJK>
+0xE1BA 0x862F # <CJK>
+0xE1BB 0x76FB # <CJK>
+0xE1BC 0x7708 # <CJK>
+0xE1BD 0x7707 # <CJK>
+0xE1BE 0x7704 # <CJK>
+0xE1BF 0x7729 # <CJK>
+0xE1C0 0x7724 # <CJK>
+0xE1C1 0x771E # <CJK>
+0xE1C2 0x7725 # <CJK>
+0xE1C3 0x7726 # <CJK>
+0xE1C4 0x771B # <CJK>
+0xE1C5 0x7737 # <CJK>
+0xE1C6 0x7738 # <CJK>
+0xE1C7 0x7747 # <CJK>
+0xE1C8 0x775A # <CJK>
+0xE1C9 0x7768 # <CJK>
+0xE1CA 0x776B # <CJK>
+0xE1CB 0x775B # <CJK>
+0xE1CC 0x7765 # <CJK>
+0xE1CD 0x777F # <CJK>
+0xE1CE 0x777E # <CJK>
+0xE1CF 0x7779 # <CJK>
+0xE1D0 0x778E # <CJK>
+0xE1D1 0x778B # <CJK>
+0xE1D2 0x7791 # <CJK>
+0xE1D3 0x77A0 # <CJK>
+0xE1D4 0x779E # <CJK>
+0xE1D5 0x77B0 # <CJK>
+0xE1D6 0x77B6 # <CJK>
+0xE1D7 0x77B9 # <CJK>
+0xE1D8 0x77BF # <CJK>
+0xE1D9 0x77BC # <CJK>
+0xE1DA 0x77BD # <CJK>
+0xE1DB 0x77BB # <CJK>
+0xE1DC 0x77C7 # <CJK>
+0xE1DD 0x77CD # <CJK>
+0xE1DE 0x77D7 # <CJK>
+0xE1DF 0x77DA # <CJK>
+0xE1E0 0x77DC # <CJK>
+0xE1E1 0x77E3 # <CJK>
+0xE1E2 0x77EE # <CJK>
+0xE1E3 0x77FC # <CJK>
+0xE1E4 0x780C # <CJK>
+0xE1E5 0x7812 # <CJK>
+0xE1E6 0x7926 # <CJK>
+0xE1E7 0x7820 # <CJK>
+0xE1E8 0x792A # <CJK>
+0xE1E9 0x7845 # <CJK>
+0xE1EA 0x788E # <CJK>
+0xE1EB 0x7874 # <CJK>
+0xE1EC 0x7886 # <CJK>
+0xE1ED 0x787C # <CJK>
+0xE1EE 0x789A # <CJK>
+0xE1EF 0x788C # <CJK>
+0xE1F0 0x78A3 # <CJK>
+0xE1F1 0x78B5 # <CJK>
+0xE1F2 0x78AA # <CJK>
+0xE1F3 0x78AF # <CJK>
+0xE1F4 0x78D1 # <CJK>
+0xE1F5 0x78C6 # <CJK>
+0xE1F6 0x78CB # <CJK>
+0xE1F7 0x78D4 # <CJK>
+0xE1F8 0x78BE # <CJK>
+0xE1F9 0x78BC # <CJK>
+0xE1FA 0x78C5 # <CJK>
+0xE1FB 0x78CA # <CJK>
+0xE1FC 0x78EC # <CJK>
+0xE240 0x78E7 # <CJK>
+0xE241 0x78DA # <CJK>
+0xE242 0x78FD # <CJK>
+0xE243 0x78F4 # <CJK>
+0xE244 0x7907 # <CJK>
+0xE245 0x7912 # <CJK>
+0xE246 0x7911 # <CJK>
+0xE247 0x7919 # <CJK>
+0xE248 0x792C # <CJK>
+0xE249 0x792B # <CJK>
+0xE24A 0x7940 # <CJK>
+0xE24B 0x7960 # <CJK>
+0xE24C 0x7957 # <CJK>
+0xE24D 0x795F # <CJK>
+0xE24E 0x795A # <CJK>
+0xE24F 0x7955 # <CJK>
+0xE250 0x7953 # <CJK>
+0xE251 0x797A # <CJK>
+0xE252 0x797F # <CJK>
+0xE253 0x798A # <CJK>
+0xE254 0x799D # <CJK>
+0xE255 0x79A7 # <CJK>
+0xE256 0x9F4B # <CJK>
+0xE257 0x79AA # <CJK>
+0xE258 0x79AE # <CJK>
+0xE259 0x79B3 # <CJK>
+0xE25A 0x79B9 # <CJK>
+0xE25B 0x79BA # <CJK>
+0xE25C 0x79C9 # <CJK>
+0xE25D 0x79D5 # <CJK>
+0xE25E 0x79E7 # <CJK>
+0xE25F 0x79EC # <CJK>
+0xE260 0x79E1 # <CJK>
+0xE261 0x79E3 # <CJK>
+0xE262 0x7A08 # <CJK>
+0xE263 0x7A0D # <CJK>
+0xE264 0x7A18 # <CJK>
+0xE265 0x7A19 # <CJK>
+0xE266 0x7A20 # <CJK>
+0xE267 0x7A1F # <CJK>
+0xE268 0x7980 # <CJK>
+0xE269 0x7A31 # <CJK>
+0xE26A 0x7A3B # <CJK>
+0xE26B 0x7A3E # <CJK>
+0xE26C 0x7A37 # <CJK>
+0xE26D 0x7A43 # <CJK>
+0xE26E 0x7A57 # <CJK>
+0xE26F 0x7A49 # <CJK>
+0xE270 0x7A61 # <CJK>
+0xE271 0x7A62 # <CJK>
+0xE272 0x7A69 # <CJK>
+0xE273 0x9F9D # <CJK>
+0xE274 0x7A70 # <CJK>
+0xE275 0x7A79 # <CJK>
+0xE276 0x7A7D # <CJK>
+0xE277 0x7A88 # <CJK>
+0xE278 0x7A97 # <CJK>
+0xE279 0x7A95 # <CJK>
+0xE27A 0x7A98 # <CJK>
+0xE27B 0x7A96 # <CJK>
+0xE27C 0x7AA9 # <CJK>
+0xE27D 0x7AC8 # <CJK>
+0xE27E 0x7AB0 # <CJK>
+0xE280 0x7AB6 # <CJK>
+0xE281 0x7AC5 # <CJK>
+0xE282 0x7AC4 # <CJK>
+0xE283 0x7ABF # <CJK>
+0xE284 0x9083 # <CJK>
+0xE285 0x7AC7 # <CJK>
+0xE286 0x7ACA # <CJK>
+0xE287 0x7ACD # <CJK>
+0xE288 0x7ACF # <CJK>
+0xE289 0x7AD5 # <CJK>
+0xE28A 0x7AD3 # <CJK>
+0xE28B 0x7AD9 # <CJK>
+0xE28C 0x7ADA # <CJK>
+0xE28D 0x7ADD # <CJK>
+0xE28E 0x7AE1 # <CJK>
+0xE28F 0x7AE2 # <CJK>
+0xE290 0x7AE6 # <CJK>
+0xE291 0x7AED # <CJK>
+0xE292 0x7AF0 # <CJK>
+0xE293 0x7B02 # <CJK>
+0xE294 0x7B0F # <CJK>
+0xE295 0x7B0A # <CJK>
+0xE296 0x7B06 # <CJK>
+0xE297 0x7B33 # <CJK>
+0xE298 0x7B18 # <CJK>
+0xE299 0x7B19 # <CJK>
+0xE29A 0x7B1E # <CJK>
+0xE29B 0x7B35 # <CJK>
+0xE29C 0x7B28 # <CJK>
+0xE29D 0x7B36 # <CJK>
+0xE29E 0x7B50 # <CJK>
+0xE29F 0x7B7A # <CJK>
+0xE2A0 0x7B04 # <CJK>
+0xE2A1 0x7B4D # <CJK>
+0xE2A2 0x7B0B # <CJK>
+0xE2A3 0x7B4C # <CJK>
+0xE2A4 0x7B45 # <CJK>
+0xE2A5 0x7B75 # <CJK>
+0xE2A6 0x7B65 # <CJK>
+0xE2A7 0x7B74 # <CJK>
+0xE2A8 0x7B67 # <CJK>
+0xE2A9 0x7B70 # <CJK>
+0xE2AA 0x7B71 # <CJK>
+0xE2AB 0x7B6C # <CJK>
+0xE2AC 0x7B6E # <CJK>
+0xE2AD 0x7B9D # <CJK>
+0xE2AE 0x7B98 # <CJK>
+0xE2AF 0x7B9F # <CJK>
+0xE2B0 0x7B8D # <CJK>
+0xE2B1 0x7B9C # <CJK>
+0xE2B2 0x7B9A # <CJK>
+0xE2B3 0x7B8B # <CJK>
+0xE2B4 0x7B92 # <CJK>
+0xE2B5 0x7B8F # <CJK>
+0xE2B6 0x7B5D # <CJK>
+0xE2B7 0x7B99 # <CJK>
+0xE2B8 0x7BCB # <CJK>
+0xE2B9 0x7BC1 # <CJK>
+0xE2BA 0x7BCC # <CJK>
+0xE2BB 0x7BCF # <CJK>
+0xE2BC 0x7BB4 # <CJK>
+0xE2BD 0x7BC6 # <CJK>
+0xE2BE 0x7BDD # <CJK>
+0xE2BF 0x7BE9 # <CJK>
+0xE2C0 0x7C11 # <CJK>
+0xE2C1 0x7C14 # <CJK>
+0xE2C2 0x7BE6 # <CJK>
+0xE2C3 0x7BE5 # <CJK>
+0xE2C4 0x7C60 # <CJK>
+0xE2C5 0x7C00 # <CJK>
+0xE2C6 0x7C07 # <CJK>
+0xE2C7 0x7C13 # <CJK>
+0xE2C8 0x7BF3 # <CJK>
+0xE2C9 0x7BF7 # <CJK>
+0xE2CA 0x7C17 # <CJK>
+0xE2CB 0x7C0D # <CJK>
+0xE2CC 0x7BF6 # <CJK>
+0xE2CD 0x7C23 # <CJK>
+0xE2CE 0x7C27 # <CJK>
+0xE2CF 0x7C2A # <CJK>
+0xE2D0 0x7C1F # <CJK>
+0xE2D1 0x7C37 # <CJK>
+0xE2D2 0x7C2B # <CJK>
+0xE2D3 0x7C3D # <CJK>
+0xE2D4 0x7C4C # <CJK>
+0xE2D5 0x7C43 # <CJK>
+0xE2D6 0x7C54 # <CJK>
+0xE2D7 0x7C4F # <CJK>
+0xE2D8 0x7C40 # <CJK>
+0xE2D9 0x7C50 # <CJK>
+0xE2DA 0x7C58 # <CJK>
+0xE2DB 0x7C5F # <CJK>
+0xE2DC 0x7C64 # <CJK>
+0xE2DD 0x7C56 # <CJK>
+0xE2DE 0x7C65 # <CJK>
+0xE2DF 0x7C6C # <CJK>
+0xE2E0 0x7C75 # <CJK>
+0xE2E1 0x7C83 # <CJK>
+0xE2E2 0x7C90 # <CJK>
+0xE2E3 0x7CA4 # <CJK>
+0xE2E4 0x7CAD # <CJK>
+0xE2E5 0x7CA2 # <CJK>
+0xE2E6 0x7CAB # <CJK>
+0xE2E7 0x7CA1 # <CJK>
+0xE2E8 0x7CA8 # <CJK>
+0xE2E9 0x7CB3 # <CJK>
+0xE2EA 0x7CB2 # <CJK>
+0xE2EB 0x7CB1 # <CJK>
+0xE2EC 0x7CAE # <CJK>
+0xE2ED 0x7CB9 # <CJK>
+0xE2EE 0x7CBD # <CJK>
+0xE2EF 0x7CC0 # <CJK>
+0xE2F0 0x7CC5 # <CJK>
+0xE2F1 0x7CC2 # <CJK>
+0xE2F2 0x7CD8 # <CJK>
+0xE2F3 0x7CD2 # <CJK>
+0xE2F4 0x7CDC # <CJK>
+0xE2F5 0x7CE2 # <CJK>
+0xE2F6 0x9B3B # <CJK>
+0xE2F7 0x7CEF # <CJK>
+0xE2F8 0x7CF2 # <CJK>
+0xE2F9 0x7CF4 # <CJK>
+0xE2FA 0x7CF6 # <CJK>
+0xE2FB 0x7CFA # <CJK>
+0xE2FC 0x7D06 # <CJK>
+0xE340 0x7D02 # <CJK>
+0xE341 0x7D1C # <CJK>
+0xE342 0x7D15 # <CJK>
+0xE343 0x7D0A # <CJK>
+0xE344 0x7D45 # <CJK>
+0xE345 0x7D4B # <CJK>
+0xE346 0x7D2E # <CJK>
+0xE347 0x7D32 # <CJK>
+0xE348 0x7D3F # <CJK>
+0xE349 0x7D35 # <CJK>
+0xE34A 0x7D46 # <CJK>
+0xE34B 0x7D73 # <CJK>
+0xE34C 0x7D56 # <CJK>
+0xE34D 0x7D4E # <CJK>
+0xE34E 0x7D72 # <CJK>
+0xE34F 0x7D68 # <CJK>
+0xE350 0x7D6E # <CJK>
+0xE351 0x7D4F # <CJK>
+0xE352 0x7D63 # <CJK>
+0xE353 0x7D93 # <CJK>
+0xE354 0x7D89 # <CJK>
+0xE355 0x7D5B # <CJK>
+0xE356 0x7D8F # <CJK>
+0xE357 0x7D7D # <CJK>
+0xE358 0x7D9B # <CJK>
+0xE359 0x7DBA # <CJK>
+0xE35A 0x7DAE # <CJK>
+0xE35B 0x7DA3 # <CJK>
+0xE35C 0x7DB5 # <CJK>
+0xE35D 0x7DC7 # <CJK>
+0xE35E 0x7DBD # <CJK>
+0xE35F 0x7DAB # <CJK>
+0xE360 0x7E3D # <CJK>
+0xE361 0x7DA2 # <CJK>
+0xE362 0x7DAF # <CJK>
+0xE363 0x7DDC # <CJK>
+0xE364 0x7DB8 # <CJK>
+0xE365 0x7D9F # <CJK>
+0xE366 0x7DB0 # <CJK>
+0xE367 0x7DD8 # <CJK>
+0xE368 0x7DDD # <CJK>
+0xE369 0x7DE4 # <CJK>
+0xE36A 0x7DDE # <CJK>
+0xE36B 0x7DFB # <CJK>
+0xE36C 0x7DF2 # <CJK>
+0xE36D 0x7DE1 # <CJK>
+0xE36E 0x7E05 # <CJK>
+0xE36F 0x7E0A # <CJK>
+0xE370 0x7E23 # <CJK>
+0xE371 0x7E21 # <CJK>
+0xE372 0x7E12 # <CJK>
+0xE373 0x7E31 # <CJK>
+0xE374 0x7E1F # <CJK>
+0xE375 0x7E09 # <CJK>
+0xE376 0x7E0B # <CJK>
+0xE377 0x7E22 # <CJK>
+0xE378 0x7E46 # <CJK>
+0xE379 0x7E66 # <CJK>
+0xE37A 0x7E3B # <CJK>
+0xE37B 0x7E35 # <CJK>
+0xE37C 0x7E39 # <CJK>
+0xE37D 0x7E43 # <CJK>
+0xE37E 0x7E37 # <CJK>
+0xE380 0x7E32 # <CJK>
+0xE381 0x7E3A # <CJK>
+0xE382 0x7E67 # <CJK>
+0xE383 0x7E5D # <CJK>
+0xE384 0x7E56 # <CJK>
+0xE385 0x7E5E # <CJK>
+0xE386 0x7E59 # <CJK>
+0xE387 0x7E5A # <CJK>
+0xE388 0x7E79 # <CJK>
+0xE389 0x7E6A # <CJK>
+0xE38A 0x7E69 # <CJK>
+0xE38B 0x7E7C # <CJK>
+0xE38C 0x7E7B # <CJK>
+0xE38D 0x7E83 # <CJK>
+0xE38E 0x7DD5 # <CJK>
+0xE38F 0x7E7D # <CJK>
+0xE390 0x8FAE # <CJK>
+0xE391 0x7E7F # <CJK>
+0xE392 0x7E88 # <CJK>
+0xE393 0x7E89 # <CJK>
+0xE394 0x7E8C # <CJK>
+0xE395 0x7E92 # <CJK>
+0xE396 0x7E90 # <CJK>
+0xE397 0x7E93 # <CJK>
+0xE398 0x7E94 # <CJK>
+0xE399 0x7E96 # <CJK>
+0xE39A 0x7E8E # <CJK>
+0xE39B 0x7E9B # <CJK>
+0xE39C 0x7E9C # <CJK>
+0xE39D 0x7F38 # <CJK>
+0xE39E 0x7F3A # <CJK>
+0xE39F 0x7F45 # <CJK>
+0xE3A0 0x7F4C # <CJK>
+0xE3A1 0x7F4D # <CJK>
+0xE3A2 0x7F4E # <CJK>
+0xE3A3 0x7F50 # <CJK>
+0xE3A4 0x7F51 # <CJK>
+0xE3A5 0x7F55 # <CJK>
+0xE3A6 0x7F54 # <CJK>
+0xE3A7 0x7F58 # <CJK>
+0xE3A8 0x7F5F # <CJK>
+0xE3A9 0x7F60 # <CJK>
+0xE3AA 0x7F68 # <CJK>
+0xE3AB 0x7F69 # <CJK>
+0xE3AC 0x7F67 # <CJK>
+0xE3AD 0x7F78 # <CJK>
+0xE3AE 0x7F82 # <CJK>
+0xE3AF 0x7F86 # <CJK>
+0xE3B0 0x7F83 # <CJK>
+0xE3B1 0x7F88 # <CJK>
+0xE3B2 0x7F87 # <CJK>
+0xE3B3 0x7F8C # <CJK>
+0xE3B4 0x7F94 # <CJK>
+0xE3B5 0x7F9E # <CJK>
+0xE3B6 0x7F9D # <CJK>
+0xE3B7 0x7F9A # <CJK>
+0xE3B8 0x7FA3 # <CJK>
+0xE3B9 0x7FAF # <CJK>
+0xE3BA 0x7FB2 # <CJK>
+0xE3BB 0x7FB9 # <CJK>
+0xE3BC 0x7FAE # <CJK>
+0xE3BD 0x7FB6 # <CJK>
+0xE3BE 0x7FB8 # <CJK>
+0xE3BF 0x8B71 # <CJK>
+0xE3C0 0x7FC5 # <CJK>
+0xE3C1 0x7FC6 # <CJK>
+0xE3C2 0x7FCA # <CJK>
+0xE3C3 0x7FD5 # <CJK>
+0xE3C4 0x7FD4 # <CJK>
+0xE3C5 0x7FE1 # <CJK>
+0xE3C6 0x7FE6 # <CJK>
+0xE3C7 0x7FE9 # <CJK>
+0xE3C8 0x7FF3 # <CJK>
+0xE3C9 0x7FF9 # <CJK>
+0xE3CA 0x98DC # <CJK>
+0xE3CB 0x8006 # <CJK>
+0xE3CC 0x8004 # <CJK>
+0xE3CD 0x800B # <CJK>
+0xE3CE 0x8012 # <CJK>
+0xE3CF 0x8018 # <CJK>
+0xE3D0 0x8019 # <CJK>
+0xE3D1 0x801C # <CJK>
+0xE3D2 0x8021 # <CJK>
+0xE3D3 0x8028 # <CJK>
+0xE3D4 0x803F # <CJK>
+0xE3D5 0x803B # <CJK>
+0xE3D6 0x804A # <CJK>
+0xE3D7 0x8046 # <CJK>
+0xE3D8 0x8052 # <CJK>
+0xE3D9 0x8058 # <CJK>
+0xE3DA 0x805A # <CJK>
+0xE3DB 0x805F # <CJK>
+0xE3DC 0x8062 # <CJK>
+0xE3DD 0x8068 # <CJK>
+0xE3DE 0x8073 # <CJK>
+0xE3DF 0x8072 # <CJK>
+0xE3E0 0x8070 # <CJK>
+0xE3E1 0x8076 # <CJK>
+0xE3E2 0x8079 # <CJK>
+0xE3E3 0x807D # <CJK>
+0xE3E4 0x807F # <CJK>
+0xE3E5 0x8084 # <CJK>
+0xE3E6 0x8086 # <CJK>
+0xE3E7 0x8085 # <CJK>
+0xE3E8 0x809B # <CJK>
+0xE3E9 0x8093 # <CJK>
+0xE3EA 0x809A # <CJK>
+0xE3EB 0x80AD # <CJK>
+0xE3EC 0x5190 # <CJK>
+0xE3ED 0x80AC # <CJK>
+0xE3EE 0x80DB # <CJK>
+0xE3EF 0x80E5 # <CJK>
+0xE3F0 0x80D9 # <CJK>
+0xE3F1 0x80DD # <CJK>
+0xE3F2 0x80C4 # <CJK>
+0xE3F3 0x80DA # <CJK>
+0xE3F4 0x80D6 # <CJK>
+0xE3F5 0x8109 # <CJK>
+0xE3F6 0x80EF # <CJK>
+0xE3F7 0x80F1 # <CJK>
+0xE3F8 0x811B # <CJK>
+0xE3F9 0x8129 # <CJK>
+0xE3FA 0x8123 # <CJK>
+0xE3FB 0x812F # <CJK>
+0xE3FC 0x814B # <CJK>
+0xE440 0x968B # <CJK>
+0xE441 0x8146 # <CJK>
+0xE442 0x813E # <CJK>
+0xE443 0x8153 # <CJK>
+0xE444 0x8151 # <CJK>
+0xE445 0x80FC # <CJK>
+0xE446 0x8171 # <CJK>
+0xE447 0x816E # <CJK>
+0xE448 0x8165 # <CJK>
+0xE449 0x8166 # <CJK>
+0xE44A 0x8174 # <CJK>
+0xE44B 0x8183 # <CJK>
+0xE44C 0x8188 # <CJK>
+0xE44D 0x818A # <CJK>
+0xE44E 0x8180 # <CJK>
+0xE44F 0x8182 # <CJK>
+0xE450 0x81A0 # <CJK>
+0xE451 0x8195 # <CJK>
+0xE452 0x81A4 # <CJK>
+0xE453 0x81A3 # <CJK>
+0xE454 0x815F # <CJK>
+0xE455 0x8193 # <CJK>
+0xE456 0x81A9 # <CJK>
+0xE457 0x81B0 # <CJK>
+0xE458 0x81B5 # <CJK>
+0xE459 0x81BE # <CJK>
+0xE45A 0x81B8 # <CJK>
+0xE45B 0x81BD # <CJK>
+0xE45C 0x81C0 # <CJK>
+0xE45D 0x81C2 # <CJK>
+0xE45E 0x81BA # <CJK>
+0xE45F 0x81C9 # <CJK>
+0xE460 0x81CD # <CJK>
+0xE461 0x81D1 # <CJK>
+0xE462 0x81D9 # <CJK>
+0xE463 0x81D8 # <CJK>
+0xE464 0x81C8 # <CJK>
+0xE465 0x81DA # <CJK>
+0xE466 0x81DF # <CJK>
+0xE467 0x81E0 # <CJK>
+0xE468 0x81E7 # <CJK>
+0xE469 0x81FA # <CJK>
+0xE46A 0x81FB # <CJK>
+0xE46B 0x81FE # <CJK>
+0xE46C 0x8201 # <CJK>
+0xE46D 0x8202 # <CJK>
+0xE46E 0x8205 # <CJK>
+0xE46F 0x8207 # <CJK>
+0xE470 0x820A # <CJK>
+0xE471 0x820D # <CJK>
+0xE472 0x8210 # <CJK>
+0xE473 0x8216 # <CJK>
+0xE474 0x8229 # <CJK>
+0xE475 0x822B # <CJK>
+0xE476 0x8238 # <CJK>
+0xE477 0x8233 # <CJK>
+0xE478 0x8240 # <CJK>
+0xE479 0x8259 # <CJK>
+0xE47A 0x8258 # <CJK>
+0xE47B 0x825D # <CJK>
+0xE47C 0x825A # <CJK>
+0xE47D 0x825F # <CJK>
+0xE47E 0x8264 # <CJK>
+0xE480 0x8262 # <CJK>
+0xE481 0x8268 # <CJK>
+0xE482 0x826A # <CJK>
+0xE483 0x826B # <CJK>
+0xE484 0x822E # <CJK>
+0xE485 0x8271 # <CJK>
+0xE486 0x8277 # <CJK>
+0xE487 0x8278 # <CJK>
+0xE488 0x827E # <CJK>
+0xE489 0x828D # <CJK>
+0xE48A 0x8292 # <CJK>
+0xE48B 0x82AB # <CJK>
+0xE48C 0x829F # <CJK>
+0xE48D 0x82BB # <CJK>
+0xE48E 0x82AC # <CJK>
+0xE48F 0x82E1 # <CJK>
+0xE490 0x82E3 # <CJK>
+0xE491 0x82DF # <CJK>
+0xE492 0x82D2 # <CJK>
+0xE493 0x82F4 # <CJK>
+0xE494 0x82F3 # <CJK>
+0xE495 0x82FA # <CJK>
+0xE496 0x8393 # <CJK>
+0xE497 0x8303 # <CJK>
+0xE498 0x82FB # <CJK>
+0xE499 0x82F9 # <CJK>
+0xE49A 0x82DE # <CJK>
+0xE49B 0x8306 # <CJK>
+0xE49C 0x82DC # <CJK>
+0xE49D 0x8309 # <CJK>
+0xE49E 0x82D9 # <CJK>
+0xE49F 0x8335 # <CJK>
+0xE4A0 0x8334 # <CJK>
+0xE4A1 0x8316 # <CJK>
+0xE4A2 0x8332 # <CJK>
+0xE4A3 0x8331 # <CJK>
+0xE4A4 0x8340 # <CJK>
+0xE4A5 0x8339 # <CJK>
+0xE4A6 0x8350 # <CJK>
+0xE4A7 0x8345 # <CJK>
+0xE4A8 0x832F # <CJK>
+0xE4A9 0x832B # <CJK>
+0xE4AA 0x8317 # <CJK>
+0xE4AB 0x8318 # <CJK>
+0xE4AC 0x8385 # <CJK>
+0xE4AD 0x839A # <CJK>
+0xE4AE 0x83AA # <CJK>
+0xE4AF 0x839F # <CJK>
+0xE4B0 0x83A2 # <CJK>
+0xE4B1 0x8396 # <CJK>
+0xE4B2 0x8323 # <CJK>
+0xE4B3 0x838E # <CJK>
+0xE4B4 0x8387 # <CJK>
+0xE4B5 0x838A # <CJK>
+0xE4B6 0x837C # <CJK>
+0xE4B7 0x83B5 # <CJK>
+0xE4B8 0x8373 # <CJK>
+0xE4B9 0x8375 # <CJK>
+0xE4BA 0x83A0 # <CJK>
+0xE4BB 0x8389 # <CJK>
+0xE4BC 0x83A8 # <CJK>
+0xE4BD 0x83F4 # <CJK>
+0xE4BE 0x8413 # <CJK>
+0xE4BF 0x83EB # <CJK>
+0xE4C0 0x83CE # <CJK>
+0xE4C1 0x83FD # <CJK>
+0xE4C2 0x8403 # <CJK>
+0xE4C3 0x83D8 # <CJK>
+0xE4C4 0x840B # <CJK>
+0xE4C5 0x83C1 # <CJK>
+0xE4C6 0x83F7 # <CJK>
+0xE4C7 0x8407 # <CJK>
+0xE4C8 0x83E0 # <CJK>
+0xE4C9 0x83F2 # <CJK>
+0xE4CA 0x840D # <CJK>
+0xE4CB 0x8422 # <CJK>
+0xE4CC 0x8420 # <CJK>
+0xE4CD 0x83BD # <CJK>
+0xE4CE 0x8438 # <CJK>
+0xE4CF 0x8506 # <CJK>
+0xE4D0 0x83FB # <CJK>
+0xE4D1 0x846D # <CJK>
+0xE4D2 0x842A # <CJK>
+0xE4D3 0x843C # <CJK>
+0xE4D4 0x855A # <CJK>
+0xE4D5 0x8484 # <CJK>
+0xE4D6 0x8477 # <CJK>
+0xE4D7 0x846B # <CJK>
+0xE4D8 0x84AD # <CJK>
+0xE4D9 0x846E # <CJK>
+0xE4DA 0x8482 # <CJK>
+0xE4DB 0x8469 # <CJK>
+0xE4DC 0x8446 # <CJK>
+0xE4DD 0x842C # <CJK>
+0xE4DE 0x846F # <CJK>
+0xE4DF 0x8479 # <CJK>
+0xE4E0 0x8435 # <CJK>
+0xE4E1 0x84CA # <CJK>
+0xE4E2 0x8462 # <CJK>
+0xE4E3 0x84B9 # <CJK>
+0xE4E4 0x84BF # <CJK>
+0xE4E5 0x849F # <CJK>
+0xE4E6 0x84D9 # <CJK>
+0xE4E7 0x84CD # <CJK>
+0xE4E8 0x84BB # <CJK>
+0xE4E9 0x84DA # <CJK>
+0xE4EA 0x84D0 # <CJK>
+0xE4EB 0x84C1 # <CJK>
+0xE4EC 0x84C6 # <CJK>
+0xE4ED 0x84D6 # <CJK>
+0xE4EE 0x84A1 # <CJK>
+0xE4EF 0x8521 # <CJK>
+0xE4F0 0x84FF # <CJK>
+0xE4F1 0x84F4 # <CJK>
+0xE4F2 0x8517 # <CJK>
+0xE4F3 0x8518 # <CJK>
+0xE4F4 0x852C # <CJK>
+0xE4F5 0x851F # <CJK>
+0xE4F6 0x8515 # <CJK>
+0xE4F7 0x8514 # <CJK>
+0xE4F8 0x84FC # <CJK>
+0xE4F9 0x8540 # <CJK>
+0xE4FA 0x8563 # <CJK>
+0xE4FB 0x8558 # <CJK>
+0xE4FC 0x8548 # <CJK>
+0xE540 0x8541 # <CJK>
+0xE541 0x8602 # <CJK>
+0xE542 0x854B # <CJK>
+0xE543 0x8555 # <CJK>
+0xE544 0x8580 # <CJK>
+0xE545 0x85A4 # <CJK>
+0xE546 0x8588 # <CJK>
+0xE547 0x8591 # <CJK>
+0xE548 0x858A # <CJK>
+0xE549 0x85A8 # <CJK>
+0xE54A 0x856D # <CJK>
+0xE54B 0x8594 # <CJK>
+0xE54C 0x859B # <CJK>
+0xE54D 0x85EA # <CJK>
+0xE54E 0x8587 # <CJK>
+0xE54F 0x859C # <CJK>
+0xE550 0x8577 # <CJK>
+0xE551 0x857E # <CJK>
+0xE552 0x8590 # <CJK>
+0xE553 0x85C9 # <CJK>
+0xE554 0x85BA # <CJK>
+0xE555 0x85CF # <CJK>
+0xE556 0x85B9 # <CJK>
+0xE557 0x85D0 # <CJK>
+0xE558 0x85D5 # <CJK>
+0xE559 0x85DD # <CJK>
+0xE55A 0x85E5 # <CJK>
+0xE55B 0x85DC # <CJK>
+0xE55C 0x85F9 # <CJK>
+0xE55D 0x860A # <CJK>
+0xE55E 0x8613 # <CJK>
+0xE55F 0x860B # <CJK>
+0xE560 0x85FE # <CJK>
+0xE561 0x85FA # <CJK>
+0xE562 0x8606 # <CJK>
+0xE563 0x8622 # <CJK>
+0xE564 0x861A # <CJK>
+0xE565 0x8630 # <CJK>
+0xE566 0x863F # <CJK>
+0xE567 0x864D # <CJK>
+0xE568 0x4E55 # <CJK>
+0xE569 0x8654 # <CJK>
+0xE56A 0x865F # <CJK>
+0xE56B 0x8667 # <CJK>
+0xE56C 0x8671 # <CJK>
+0xE56D 0x8693 # <CJK>
+0xE56E 0x86A3 # <CJK>
+0xE56F 0x86A9 # <CJK>
+0xE570 0x86AA # <CJK>
+0xE571 0x868B # <CJK>
+0xE572 0x868C # <CJK>
+0xE573 0x86B6 # <CJK>
+0xE574 0x86AF # <CJK>
+0xE575 0x86C4 # <CJK>
+0xE576 0x86C6 # <CJK>
+0xE577 0x86B0 # <CJK>
+0xE578 0x86C9 # <CJK>
+0xE579 0x8823 # <CJK>
+0xE57A 0x86AB # <CJK>
+0xE57B 0x86D4 # <CJK>
+0xE57C 0x86DE # <CJK>
+0xE57D 0x86E9 # <CJK>
+0xE57E 0x86EC # <CJK>
+0xE580 0x86DF # <CJK>
+0xE581 0x86DB # <CJK>
+0xE582 0x86EF # <CJK>
+0xE583 0x8712 # <CJK>
+0xE584 0x8706 # <CJK>
+0xE585 0x8708 # <CJK>
+0xE586 0x8700 # <CJK>
+0xE587 0x8703 # <CJK>
+0xE588 0x86FB # <CJK>
+0xE589 0x8711 # <CJK>
+0xE58A 0x8709 # <CJK>
+0xE58B 0x870D # <CJK>
+0xE58C 0x86F9 # <CJK>
+0xE58D 0x870A # <CJK>
+0xE58E 0x8734 # <CJK>
+0xE58F 0x873F # <CJK>
+0xE590 0x8737 # <CJK>
+0xE591 0x873B # <CJK>
+0xE592 0x8725 # <CJK>
+0xE593 0x8729 # <CJK>
+0xE594 0x871A # <CJK>
+0xE595 0x8760 # <CJK>
+0xE596 0x875F # <CJK>
+0xE597 0x8778 # <CJK>
+0xE598 0x874C # <CJK>
+0xE599 0x874E # <CJK>
+0xE59A 0x8774 # <CJK>
+0xE59B 0x8757 # <CJK>
+0xE59C 0x8768 # <CJK>
+0xE59D 0x876E # <CJK>
+0xE59E 0x8759 # <CJK>
+0xE59F 0x8753 # <CJK>
+0xE5A0 0x8763 # <CJK>
+0xE5A1 0x876A # <CJK>
+0xE5A2 0x8805 # <CJK>
+0xE5A3 0x87A2 # <CJK>
+0xE5A4 0x879F # <CJK>
+0xE5A5 0x8782 # <CJK>
+0xE5A6 0x87AF # <CJK>
+0xE5A7 0x87CB # <CJK>
+0xE5A8 0x87BD # <CJK>
+0xE5A9 0x87C0 # <CJK>
+0xE5AA 0x87D0 # <CJK>
+0xE5AB 0x96D6 # <CJK>
+0xE5AC 0x87AB # <CJK>
+0xE5AD 0x87C4 # <CJK>
+0xE5AE 0x87B3 # <CJK>
+0xE5AF 0x87C7 # <CJK>
+0xE5B0 0x87C6 # <CJK>
+0xE5B1 0x87BB # <CJK>
+0xE5B2 0x87EF # <CJK>
+0xE5B3 0x87F2 # <CJK>
+0xE5B4 0x87E0 # <CJK>
+0xE5B5 0x880F # <CJK>
+0xE5B6 0x880D # <CJK>
+0xE5B7 0x87FE # <CJK>
+0xE5B8 0x87F6 # <CJK>
+0xE5B9 0x87F7 # <CJK>
+0xE5BA 0x880E # <CJK>
+0xE5BB 0x87D2 # <CJK>
+0xE5BC 0x8811 # <CJK>
+0xE5BD 0x8816 # <CJK>
+0xE5BE 0x8815 # <CJK>
+0xE5BF 0x8822 # <CJK>
+0xE5C0 0x8821 # <CJK>
+0xE5C1 0x8831 # <CJK>
+0xE5C2 0x8836 # <CJK>
+0xE5C3 0x8839 # <CJK>
+0xE5C4 0x8827 # <CJK>
+0xE5C5 0x883B # <CJK>
+0xE5C6 0x8844 # <CJK>
+0xE5C7 0x8842 # <CJK>
+0xE5C8 0x8852 # <CJK>
+0xE5C9 0x8859 # <CJK>
+0xE5CA 0x885E # <CJK>
+0xE5CB 0x8862 # <CJK>
+0xE5CC 0x886B # <CJK>
+0xE5CD 0x8881 # <CJK>
+0xE5CE 0x887E # <CJK>
+0xE5CF 0x889E # <CJK>
+0xE5D0 0x8875 # <CJK>
+0xE5D1 0x887D # <CJK>
+0xE5D2 0x88B5 # <CJK>
+0xE5D3 0x8872 # <CJK>
+0xE5D4 0x8882 # <CJK>
+0xE5D5 0x8897 # <CJK>
+0xE5D6 0x8892 # <CJK>
+0xE5D7 0x88AE # <CJK>
+0xE5D8 0x8899 # <CJK>
+0xE5D9 0x88A2 # <CJK>
+0xE5DA 0x888D # <CJK>
+0xE5DB 0x88A4 # <CJK>
+0xE5DC 0x88B0 # <CJK>
+0xE5DD 0x88BF # <CJK>
+0xE5DE 0x88B1 # <CJK>
+0xE5DF 0x88C3 # <CJK>
+0xE5E0 0x88C4 # <CJK>
+0xE5E1 0x88D4 # <CJK>
+0xE5E2 0x88D8 # <CJK>
+0xE5E3 0x88D9 # <CJK>
+0xE5E4 0x88DD # <CJK>
+0xE5E5 0x88F9 # <CJK>
+0xE5E6 0x8902 # <CJK>
+0xE5E7 0x88FC # <CJK>
+0xE5E8 0x88F4 # <CJK>
+0xE5E9 0x88E8 # <CJK>
+0xE5EA 0x88F2 # <CJK>
+0xE5EB 0x8904 # <CJK>
+0xE5EC 0x890C # <CJK>
+0xE5ED 0x890A # <CJK>
+0xE5EE 0x8913 # <CJK>
+0xE5EF 0x8943 # <CJK>
+0xE5F0 0x891E # <CJK>
+0xE5F1 0x8925 # <CJK>
+0xE5F2 0x892A # <CJK>
+0xE5F3 0x892B # <CJK>
+0xE5F4 0x8941 # <CJK>
+0xE5F5 0x8944 # <CJK>
+0xE5F6 0x893B # <CJK>
+0xE5F7 0x8936 # <CJK>
+0xE5F8 0x8938 # <CJK>
+0xE5F9 0x894C # <CJK>
+0xE5FA 0x891D # <CJK>
+0xE5FB 0x8960 # <CJK>
+0xE5FC 0x895E # <CJK>
+0xE640 0x8966 # <CJK>
+0xE641 0x8964 # <CJK>
+0xE642 0x896D # <CJK>
+0xE643 0x896A # <CJK>
+0xE644 0x896F # <CJK>
+0xE645 0x8974 # <CJK>
+0xE646 0x8977 # <CJK>
+0xE647 0x897E # <CJK>
+0xE648 0x8983 # <CJK>
+0xE649 0x8988 # <CJK>
+0xE64A 0x898A # <CJK>
+0xE64B 0x8993 # <CJK>
+0xE64C 0x8998 # <CJK>
+0xE64D 0x89A1 # <CJK>
+0xE64E 0x89A9 # <CJK>
+0xE64F 0x89A6 # <CJK>
+0xE650 0x89AC # <CJK>
+0xE651 0x89AF # <CJK>
+0xE652 0x89B2 # <CJK>
+0xE653 0x89BA # <CJK>
+0xE654 0x89BD # <CJK>
+0xE655 0x89BF # <CJK>
+0xE656 0x89C0 # <CJK>
+0xE657 0x89DA # <CJK>
+0xE658 0x89DC # <CJK>
+0xE659 0x89DD # <CJK>
+0xE65A 0x89E7 # <CJK>
+0xE65B 0x89F4 # <CJK>
+0xE65C 0x89F8 # <CJK>
+0xE65D 0x8A03 # <CJK>
+0xE65E 0x8A16 # <CJK>
+0xE65F 0x8A10 # <CJK>
+0xE660 0x8A0C # <CJK>
+0xE661 0x8A1B # <CJK>
+0xE662 0x8A1D # <CJK>
+0xE663 0x8A25 # <CJK>
+0xE664 0x8A36 # <CJK>
+0xE665 0x8A41 # <CJK>
+0xE666 0x8A5B # <CJK>
+0xE667 0x8A52 # <CJK>
+0xE668 0x8A46 # <CJK>
+0xE669 0x8A48 # <CJK>
+0xE66A 0x8A7C # <CJK>
+0xE66B 0x8A6D # <CJK>
+0xE66C 0x8A6C # <CJK>
+0xE66D 0x8A62 # <CJK>
+0xE66E 0x8A85 # <CJK>
+0xE66F 0x8A82 # <CJK>
+0xE670 0x8A84 # <CJK>
+0xE671 0x8AA8 # <CJK>
+0xE672 0x8AA1 # <CJK>
+0xE673 0x8A91 # <CJK>
+0xE674 0x8AA5 # <CJK>
+0xE675 0x8AA6 # <CJK>
+0xE676 0x8A9A # <CJK>
+0xE677 0x8AA3 # <CJK>
+0xE678 0x8AC4 # <CJK>
+0xE679 0x8ACD # <CJK>
+0xE67A 0x8AC2 # <CJK>
+0xE67B 0x8ADA # <CJK>
+0xE67C 0x8AEB # <CJK>
+0xE67D 0x8AF3 # <CJK>
+0xE67E 0x8AE7 # <CJK>
+0xE680 0x8AE4 # <CJK>
+0xE681 0x8AF1 # <CJK>
+0xE682 0x8B14 # <CJK>
+0xE683 0x8AE0 # <CJK>
+0xE684 0x8AE2 # <CJK>
+0xE685 0x8AF7 # <CJK>
+0xE686 0x8ADE # <CJK>
+0xE687 0x8ADB # <CJK>
+0xE688 0x8B0C # <CJK>
+0xE689 0x8B07 # <CJK>
+0xE68A 0x8B1A # <CJK>
+0xE68B 0x8AE1 # <CJK>
+0xE68C 0x8B16 # <CJK>
+0xE68D 0x8B10 # <CJK>
+0xE68E 0x8B17 # <CJK>
+0xE68F 0x8B20 # <CJK>
+0xE690 0x8B33 # <CJK>
+0xE691 0x97AB # <CJK>
+0xE692 0x8B26 # <CJK>
+0xE693 0x8B2B # <CJK>
+0xE694 0x8B3E # <CJK>
+0xE695 0x8B28 # <CJK>
+0xE696 0x8B41 # <CJK>
+0xE697 0x8B4C # <CJK>
+0xE698 0x8B4F # <CJK>
+0xE699 0x8B4E # <CJK>
+0xE69A 0x8B49 # <CJK>
+0xE69B 0x8B56 # <CJK>
+0xE69C 0x8B5B # <CJK>
+0xE69D 0x8B5A # <CJK>
+0xE69E 0x8B6B # <CJK>
+0xE69F 0x8B5F # <CJK>
+0xE6A0 0x8B6C # <CJK>
+0xE6A1 0x8B6F # <CJK>
+0xE6A2 0x8B74 # <CJK>
+0xE6A3 0x8B7D # <CJK>
+0xE6A4 0x8B80 # <CJK>
+0xE6A5 0x8B8C # <CJK>
+0xE6A6 0x8B8E # <CJK>
+0xE6A7 0x8B92 # <CJK>
+0xE6A8 0x8B93 # <CJK>
+0xE6A9 0x8B96 # <CJK>
+0xE6AA 0x8B99 # <CJK>
+0xE6AB 0x8B9A # <CJK>
+0xE6AC 0x8C3A # <CJK>
+0xE6AD 0x8C41 # <CJK>
+0xE6AE 0x8C3F # <CJK>
+0xE6AF 0x8C48 # <CJK>
+0xE6B0 0x8C4C # <CJK>
+0xE6B1 0x8C4E # <CJK>
+0xE6B2 0x8C50 # <CJK>
+0xE6B3 0x8C55 # <CJK>
+0xE6B4 0x8C62 # <CJK>
+0xE6B5 0x8C6C # <CJK>
+0xE6B6 0x8C78 # <CJK>
+0xE6B7 0x8C7A # <CJK>
+0xE6B8 0x8C82 # <CJK>
+0xE6B9 0x8C89 # <CJK>
+0xE6BA 0x8C85 # <CJK>
+0xE6BB 0x8C8A # <CJK>
+0xE6BC 0x8C8D # <CJK>
+0xE6BD 0x8C8E # <CJK>
+0xE6BE 0x8C94 # <CJK>
+0xE6BF 0x8C7C # <CJK>
+0xE6C0 0x8C98 # <CJK>
+0xE6C1 0x621D # <CJK>
+0xE6C2 0x8CAD # <CJK>
+0xE6C3 0x8CAA # <CJK>
+0xE6C4 0x8CBD # <CJK>
+0xE6C5 0x8CB2 # <CJK>
+0xE6C6 0x8CB3 # <CJK>
+0xE6C7 0x8CAE # <CJK>
+0xE6C8 0x8CB6 # <CJK>
+0xE6C9 0x8CC8 # <CJK>
+0xE6CA 0x8CC1 # <CJK>
+0xE6CB 0x8CE4 # <CJK>
+0xE6CC 0x8CE3 # <CJK>
+0xE6CD 0x8CDA # <CJK>
+0xE6CE 0x8CFD # <CJK>
+0xE6CF 0x8CFA # <CJK>
+0xE6D0 0x8CFB # <CJK>
+0xE6D1 0x8D04 # <CJK>
+0xE6D2 0x8D05 # <CJK>
+0xE6D3 0x8D0A # <CJK>
+0xE6D4 0x8D07 # <CJK>
+0xE6D5 0x8D0F # <CJK>
+0xE6D6 0x8D0D # <CJK>
+0xE6D7 0x8D10 # <CJK>
+0xE6D8 0x9F4E # <CJK>
+0xE6D9 0x8D13 # <CJK>
+0xE6DA 0x8CCD # <CJK>
+0xE6DB 0x8D14 # <CJK>
+0xE6DC 0x8D16 # <CJK>
+0xE6DD 0x8D67 # <CJK>
+0xE6DE 0x8D6D # <CJK>
+0xE6DF 0x8D71 # <CJK>
+0xE6E0 0x8D73 # <CJK>
+0xE6E1 0x8D81 # <CJK>
+0xE6E2 0x8D99 # <CJK>
+0xE6E3 0x8DC2 # <CJK>
+0xE6E4 0x8DBE # <CJK>
+0xE6E5 0x8DBA # <CJK>
+0xE6E6 0x8DCF # <CJK>
+0xE6E7 0x8DDA # <CJK>
+0xE6E8 0x8DD6 # <CJK>
+0xE6E9 0x8DCC # <CJK>
+0xE6EA 0x8DDB # <CJK>
+0xE6EB 0x8DCB # <CJK>
+0xE6EC 0x8DEA # <CJK>
+0xE6ED 0x8DEB # <CJK>
+0xE6EE 0x8DDF # <CJK>
+0xE6EF 0x8DE3 # <CJK>
+0xE6F0 0x8DFC # <CJK>
+0xE6F1 0x8E08 # <CJK>
+0xE6F2 0x8E09 # <CJK>
+0xE6F3 0x8DFF # <CJK>
+0xE6F4 0x8E1D # <CJK>
+0xE6F5 0x8E1E # <CJK>
+0xE6F6 0x8E10 # <CJK>
+0xE6F7 0x8E1F # <CJK>
+0xE6F8 0x8E42 # <CJK>
+0xE6F9 0x8E35 # <CJK>
+0xE6FA 0x8E30 # <CJK>
+0xE6FB 0x8E34 # <CJK>
+0xE6FC 0x8E4A # <CJK>
+0xE740 0x8E47 # <CJK>
+0xE741 0x8E49 # <CJK>
+0xE742 0x8E4C # <CJK>
+0xE743 0x8E50 # <CJK>
+0xE744 0x8E48 # <CJK>
+0xE745 0x8E59 # <CJK>
+0xE746 0x8E64 # <CJK>
+0xE747 0x8E60 # <CJK>
+0xE748 0x8E2A # <CJK>
+0xE749 0x8E63 # <CJK>
+0xE74A 0x8E55 # <CJK>
+0xE74B 0x8E76 # <CJK>
+0xE74C 0x8E72 # <CJK>
+0xE74D 0x8E7C # <CJK>
+0xE74E 0x8E81 # <CJK>
+0xE74F 0x8E87 # <CJK>
+0xE750 0x8E85 # <CJK>
+0xE751 0x8E84 # <CJK>
+0xE752 0x8E8B # <CJK>
+0xE753 0x8E8A # <CJK>
+0xE754 0x8E93 # <CJK>
+0xE755 0x8E91 # <CJK>
+0xE756 0x8E94 # <CJK>
+0xE757 0x8E99 # <CJK>
+0xE758 0x8EAA # <CJK>
+0xE759 0x8EA1 # <CJK>
+0xE75A 0x8EAC # <CJK>
+0xE75B 0x8EB0 # <CJK>
+0xE75C 0x8EC6 # <CJK>
+0xE75D 0x8EB1 # <CJK>
+0xE75E 0x8EBE # <CJK>
+0xE75F 0x8EC5 # <CJK>
+0xE760 0x8EC8 # <CJK>
+0xE761 0x8ECB # <CJK>
+0xE762 0x8EDB # <CJK>
+0xE763 0x8EE3 # <CJK>
+0xE764 0x8EFC # <CJK>
+0xE765 0x8EFB # <CJK>
+0xE766 0x8EEB # <CJK>
+0xE767 0x8EFE # <CJK>
+0xE768 0x8F0A # <CJK>
+0xE769 0x8F05 # <CJK>
+0xE76A 0x8F15 # <CJK>
+0xE76B 0x8F12 # <CJK>
+0xE76C 0x8F19 # <CJK>
+0xE76D 0x8F13 # <CJK>
+0xE76E 0x8F1C # <CJK>
+0xE76F 0x8F1F # <CJK>
+0xE770 0x8F1B # <CJK>
+0xE771 0x8F0C # <CJK>
+0xE772 0x8F26 # <CJK>
+0xE773 0x8F33 # <CJK>
+0xE774 0x8F3B # <CJK>
+0xE775 0x8F39 # <CJK>
+0xE776 0x8F45 # <CJK>
+0xE777 0x8F42 # <CJK>
+0xE778 0x8F3E # <CJK>
+0xE779 0x8F4C # <CJK>
+0xE77A 0x8F49 # <CJK>
+0xE77B 0x8F46 # <CJK>
+0xE77C 0x8F4E # <CJK>
+0xE77D 0x8F57 # <CJK>
+0xE77E 0x8F5C # <CJK>
+0xE780 0x8F62 # <CJK>
+0xE781 0x8F63 # <CJK>
+0xE782 0x8F64 # <CJK>
+0xE783 0x8F9C # <CJK>
+0xE784 0x8F9F # <CJK>
+0xE785 0x8FA3 # <CJK>
+0xE786 0x8FAD # <CJK>
+0xE787 0x8FAF # <CJK>
+0xE788 0x8FB7 # <CJK>
+0xE789 0x8FDA # <CJK>
+0xE78A 0x8FE5 # <CJK>
+0xE78B 0x8FE2 # <CJK>
+0xE78C 0x8FEA # <CJK>
+0xE78D 0x8FEF # <CJK>
+0xE78E 0x9087 # <CJK>
+0xE78F 0x8FF4 # <CJK>
+0xE790 0x9005 # <CJK>
+0xE791 0x8FF9 # <CJK>
+0xE792 0x8FFA # <CJK>
+0xE793 0x9011 # <CJK>
+0xE794 0x9015 # <CJK>
+0xE795 0x9021 # <CJK>
+0xE796 0x900D # <CJK>
+0xE797 0x901E # <CJK>
+0xE798 0x9016 # <CJK>
+0xE799 0x900B # <CJK>
+0xE79A 0x9027 # <CJK>
+0xE79B 0x9036 # <CJK>
+0xE79C 0x9035 # <CJK>
+0xE79D 0x9039 # <CJK>
+0xE79E 0x8FF8 # <CJK>
+0xE79F 0x904F # <CJK>
+0xE7A0 0x9050 # <CJK>
+0xE7A1 0x9051 # <CJK>
+0xE7A2 0x9052 # <CJK>
+0xE7A3 0x900E # <CJK>
+0xE7A4 0x9049 # <CJK>
+0xE7A5 0x903E # <CJK>
+0xE7A6 0x9056 # <CJK>
+0xE7A7 0x9058 # <CJK>
+0xE7A8 0x905E # <CJK>
+0xE7A9 0x9068 # <CJK>
+0xE7AA 0x906F # <CJK>
+0xE7AB 0x9076 # <CJK>
+0xE7AC 0x96A8 # <CJK>
+0xE7AD 0x9072 # <CJK>
+0xE7AE 0x9082 # <CJK>
+0xE7AF 0x907D # <CJK>
+0xE7B0 0x9081 # <CJK>
+0xE7B1 0x9080 # <CJK>
+0xE7B2 0x908A # <CJK>
+0xE7B3 0x9089 # <CJK>
+0xE7B4 0x908F # <CJK>
+0xE7B5 0x90A8 # <CJK>
+0xE7B6 0x90AF # <CJK>
+0xE7B7 0x90B1 # <CJK>
+0xE7B8 0x90B5 # <CJK>
+0xE7B9 0x90E2 # <CJK>
+0xE7BA 0x90E4 # <CJK>
+0xE7BB 0x6248 # <CJK>
+0xE7BC 0x90DB # <CJK>
+0xE7BD 0x9102 # <CJK>
+0xE7BE 0x9112 # <CJK>
+0xE7BF 0x9119 # <CJK>
+0xE7C0 0x9132 # <CJK>
+0xE7C1 0x9130 # <CJK>
+0xE7C2 0x914A # <CJK>
+0xE7C3 0x9156 # <CJK>
+0xE7C4 0x9158 # <CJK>
+0xE7C5 0x9163 # <CJK>
+0xE7C6 0x9165 # <CJK>
+0xE7C7 0x9169 # <CJK>
+0xE7C8 0x9173 # <CJK>
+0xE7C9 0x9172 # <CJK>
+0xE7CA 0x918B # <CJK>
+0xE7CB 0x9189 # <CJK>
+0xE7CC 0x9182 # <CJK>
+0xE7CD 0x91A2 # <CJK>
+0xE7CE 0x91AB # <CJK>
+0xE7CF 0x91AF # <CJK>
+0xE7D0 0x91AA # <CJK>
+0xE7D1 0x91B5 # <CJK>
+0xE7D2 0x91B4 # <CJK>
+0xE7D3 0x91BA # <CJK>
+0xE7D4 0x91C0 # <CJK>
+0xE7D5 0x91C1 # <CJK>
+0xE7D6 0x91C9 # <CJK>
+0xE7D7 0x91CB # <CJK>
+0xE7D8 0x91D0 # <CJK>
+0xE7D9 0x91D6 # <CJK>
+0xE7DA 0x91DF # <CJK>
+0xE7DB 0x91E1 # <CJK>
+0xE7DC 0x91DB # <CJK>
+0xE7DD 0x91FC # <CJK>
+0xE7DE 0x91F5 # <CJK>
+0xE7DF 0x91F6 # <CJK>
+0xE7E0 0x921E # <CJK>
+0xE7E1 0x91FF # <CJK>
+0xE7E2 0x9214 # <CJK>
+0xE7E3 0x922C # <CJK>
+0xE7E4 0x9215 # <CJK>
+0xE7E5 0x9211 # <CJK>
+0xE7E6 0x925E # <CJK>
+0xE7E7 0x9257 # <CJK>
+0xE7E8 0x9245 # <CJK>
+0xE7E9 0x9249 # <CJK>
+0xE7EA 0x9264 # <CJK>
+0xE7EB 0x9248 # <CJK>
+0xE7EC 0x9295 # <CJK>
+0xE7ED 0x923F # <CJK>
+0xE7EE 0x924B # <CJK>
+0xE7EF 0x9250 # <CJK>
+0xE7F0 0x929C # <CJK>
+0xE7F1 0x9296 # <CJK>
+0xE7F2 0x9293 # <CJK>
+0xE7F3 0x929B # <CJK>
+0xE7F4 0x925A # <CJK>
+0xE7F5 0x92CF # <CJK>
+0xE7F6 0x92B9 # <CJK>
+0xE7F7 0x92B7 # <CJK>
+0xE7F8 0x92E9 # <CJK>
+0xE7F9 0x930F # <CJK>
+0xE7FA 0x92FA # <CJK>
+0xE7FB 0x9344 # <CJK>
+0xE7FC 0x932E # <CJK>
+0xE840 0x9319 # <CJK>
+0xE841 0x9322 # <CJK>
+0xE842 0x931A # <CJK>
+0xE843 0x9323 # <CJK>
+0xE844 0x933A # <CJK>
+0xE845 0x9335 # <CJK>
+0xE846 0x933B # <CJK>
+0xE847 0x935C # <CJK>
+0xE848 0x9360 # <CJK>
+0xE849 0x937C # <CJK>
+0xE84A 0x936E # <CJK>
+0xE84B 0x9356 # <CJK>
+0xE84C 0x93B0 # <CJK>
+0xE84D 0x93AC # <CJK>
+0xE84E 0x93AD # <CJK>
+0xE84F 0x9394 # <CJK>
+0xE850 0x93B9 # <CJK>
+0xE851 0x93D6 # <CJK>
+0xE852 0x93D7 # <CJK>
+0xE853 0x93E8 # <CJK>
+0xE854 0x93E5 # <CJK>
+0xE855 0x93D8 # <CJK>
+0xE856 0x93C3 # <CJK>
+0xE857 0x93DD # <CJK>
+0xE858 0x93D0 # <CJK>
+0xE859 0x93C8 # <CJK>
+0xE85A 0x93E4 # <CJK>
+0xE85B 0x941A # <CJK>
+0xE85C 0x9414 # <CJK>
+0xE85D 0x9413 # <CJK>
+0xE85E 0x9403 # <CJK>
+0xE85F 0x9407 # <CJK>
+0xE860 0x9410 # <CJK>
+0xE861 0x9436 # <CJK>
+0xE862 0x942B # <CJK>
+0xE863 0x9435 # <CJK>
+0xE864 0x9421 # <CJK>
+0xE865 0x943A # <CJK>
+0xE866 0x9441 # <CJK>
+0xE867 0x9452 # <CJK>
+0xE868 0x9444 # <CJK>
+0xE869 0x945B # <CJK>
+0xE86A 0x9460 # <CJK>
+0xE86B 0x9462 # <CJK>
+0xE86C 0x945E # <CJK>
+0xE86D 0x946A # <CJK>
+0xE86E 0x9229 # <CJK>
+0xE86F 0x9470 # <CJK>
+0xE870 0x9475 # <CJK>
+0xE871 0x9477 # <CJK>
+0xE872 0x947D # <CJK>
+0xE873 0x945A # <CJK>
+0xE874 0x947C # <CJK>
+0xE875 0x947E # <CJK>
+0xE876 0x9481 # <CJK>
+0xE877 0x947F # <CJK>
+0xE878 0x9582 # <CJK>
+0xE879 0x9587 # <CJK>
+0xE87A 0x958A # <CJK>
+0xE87B 0x9594 # <CJK>
+0xE87C 0x9596 # <CJK>
+0xE87D 0x9598 # <CJK>
+0xE87E 0x9599 # <CJK>
+0xE880 0x95A0 # <CJK>
+0xE881 0x95A8 # <CJK>
+0xE882 0x95A7 # <CJK>
+0xE883 0x95AD # <CJK>
+0xE884 0x95BC # <CJK>
+0xE885 0x95BB # <CJK>
+0xE886 0x95B9 # <CJK>
+0xE887 0x95BE # <CJK>
+0xE888 0x95CA # <CJK>
+0xE889 0x6FF6 # <CJK>
+0xE88A 0x95C3 # <CJK>
+0xE88B 0x95CD # <CJK>
+0xE88C 0x95CC # <CJK>
+0xE88D 0x95D5 # <CJK>
+0xE88E 0x95D4 # <CJK>
+0xE88F 0x95D6 # <CJK>
+0xE890 0x95DC # <CJK>
+0xE891 0x95E1 # <CJK>
+0xE892 0x95E5 # <CJK>
+0xE893 0x95E2 # <CJK>
+0xE894 0x9621 # <CJK>
+0xE895 0x9628 # <CJK>
+0xE896 0x962E # <CJK>
+0xE897 0x962F # <CJK>
+0xE898 0x9642 # <CJK>
+0xE899 0x964C # <CJK>
+0xE89A 0x964F # <CJK>
+0xE89B 0x964B # <CJK>
+0xE89C 0x9677 # <CJK>
+0xE89D 0x965C # <CJK>
+0xE89E 0x965E # <CJK>
+0xE89F 0x965D # <CJK>
+0xE8A0 0x965F # <CJK>
+0xE8A1 0x9666 # <CJK>
+0xE8A2 0x9672 # <CJK>
+0xE8A3 0x966C # <CJK>
+0xE8A4 0x968D # <CJK>
+0xE8A5 0x9698 # <CJK>
+0xE8A6 0x9695 # <CJK>
+0xE8A7 0x9697 # <CJK>
+0xE8A8 0x96AA # <CJK>
+0xE8A9 0x96A7 # <CJK>
+0xE8AA 0x96B1 # <CJK>
+0xE8AB 0x96B2 # <CJK>
+0xE8AC 0x96B0 # <CJK>
+0xE8AD 0x96B4 # <CJK>
+0xE8AE 0x96B6 # <CJK>
+0xE8AF 0x96B8 # <CJK>
+0xE8B0 0x96B9 # <CJK>
+0xE8B1 0x96CE # <CJK>
+0xE8B2 0x96CB # <CJK>
+0xE8B3 0x96C9 # <CJK>
+0xE8B4 0x96CD # <CJK>
+0xE8B5 0x894D # <CJK>
+0xE8B6 0x96DC # <CJK>
+0xE8B7 0x970D # <CJK>
+0xE8B8 0x96D5 # <CJK>
+0xE8B9 0x96F9 # <CJK>
+0xE8BA 0x9704 # <CJK>
+0xE8BB 0x9706 # <CJK>
+0xE8BC 0x9708 # <CJK>
+0xE8BD 0x9713 # <CJK>
+0xE8BE 0x970E # <CJK>
+0xE8BF 0x9711 # <CJK>
+0xE8C0 0x970F # <CJK>
+0xE8C1 0x9716 # <CJK>
+0xE8C2 0x9719 # <CJK>
+0xE8C3 0x9724 # <CJK>
+0xE8C4 0x972A # <CJK>
+0xE8C5 0x9730 # <CJK>
+0xE8C6 0x9739 # <CJK>
+0xE8C7 0x973D # <CJK>
+0xE8C8 0x973E # <CJK>
+0xE8C9 0x9744 # <CJK>
+0xE8CA 0x9746 # <CJK>
+0xE8CB 0x9748 # <CJK>
+0xE8CC 0x9742 # <CJK>
+0xE8CD 0x9749 # <CJK>
+0xE8CE 0x975C # <CJK>
+0xE8CF 0x9760 # <CJK>
+0xE8D0 0x9764 # <CJK>
+0xE8D1 0x9766 # <CJK>
+0xE8D2 0x9768 # <CJK>
+0xE8D3 0x52D2 # <CJK>
+0xE8D4 0x976B # <CJK>
+0xE8D5 0x9771 # <CJK>
+0xE8D6 0x9779 # <CJK>
+0xE8D7 0x9785 # <CJK>
+0xE8D8 0x977C # <CJK>
+0xE8D9 0x9781 # <CJK>
+0xE8DA 0x977A # <CJK>
+0xE8DB 0x9786 # <CJK>
+0xE8DC 0x978B # <CJK>
+0xE8DD 0x978F # <CJK>
+0xE8DE 0x9790 # <CJK>
+0xE8DF 0x979C # <CJK>
+0xE8E0 0x97A8 # <CJK>
+0xE8E1 0x97A6 # <CJK>
+0xE8E2 0x97A3 # <CJK>
+0xE8E3 0x97B3 # <CJK>
+0xE8E4 0x97B4 # <CJK>
+0xE8E5 0x97C3 # <CJK>
+0xE8E6 0x97C6 # <CJK>
+0xE8E7 0x97C8 # <CJK>
+0xE8E8 0x97CB # <CJK>
+0xE8E9 0x97DC # <CJK>
+0xE8EA 0x97ED # <CJK>
+0xE8EB 0x9F4F # <CJK>
+0xE8EC 0x97F2 # <CJK>
+0xE8ED 0x7ADF # <CJK>
+0xE8EE 0x97F6 # <CJK>
+0xE8EF 0x97F5 # <CJK>
+0xE8F0 0x980F # <CJK>
+0xE8F1 0x980C # <CJK>
+0xE8F2 0x9838 # <CJK>
+0xE8F3 0x9824 # <CJK>
+0xE8F4 0x9821 # <CJK>
+0xE8F5 0x9837 # <CJK>
+0xE8F6 0x983D # <CJK>
+0xE8F7 0x9846 # <CJK>
+0xE8F8 0x984F # <CJK>
+0xE8F9 0x984B # <CJK>
+0xE8FA 0x986B # <CJK>
+0xE8FB 0x986F # <CJK>
+0xE8FC 0x9870 # <CJK>
+0xE940 0x9871 # <CJK>
+0xE941 0x9874 # <CJK>
+0xE942 0x9873 # <CJK>
+0xE943 0x98AA # <CJK>
+0xE944 0x98AF # <CJK>
+0xE945 0x98B1 # <CJK>
+0xE946 0x98B6 # <CJK>
+0xE947 0x98C4 # <CJK>
+0xE948 0x98C3 # <CJK>
+0xE949 0x98C6 # <CJK>
+0xE94A 0x98E9 # <CJK>
+0xE94B 0x98EB # <CJK>
+0xE94C 0x9903 # <CJK>
+0xE94D 0x9909 # <CJK>
+0xE94E 0x9912 # <CJK>
+0xE94F 0x9914 # <CJK>
+0xE950 0x9918 # <CJK>
+0xE951 0x9921 # <CJK>
+0xE952 0x991D # <CJK>
+0xE953 0x991E # <CJK>
+0xE954 0x9924 # <CJK>
+0xE955 0x9920 # <CJK>
+0xE956 0x992C # <CJK>
+0xE957 0x992E # <CJK>
+0xE958 0x993D # <CJK>
+0xE959 0x993E # <CJK>
+0xE95A 0x9942 # <CJK>
+0xE95B 0x9949 # <CJK>
+0xE95C 0x9945 # <CJK>
+0xE95D 0x9950 # <CJK>
+0xE95E 0x994B # <CJK>
+0xE95F 0x9951 # <CJK>
+0xE960 0x9952 # <CJK>
+0xE961 0x994C # <CJK>
+0xE962 0x9955 # <CJK>
+0xE963 0x9997 # <CJK>
+0xE964 0x9998 # <CJK>
+0xE965 0x99A5 # <CJK>
+0xE966 0x99AD # <CJK>
+0xE967 0x99AE # <CJK>
+0xE968 0x99BC # <CJK>
+0xE969 0x99DF # <CJK>
+0xE96A 0x99DB # <CJK>
+0xE96B 0x99DD # <CJK>
+0xE96C 0x99D8 # <CJK>
+0xE96D 0x99D1 # <CJK>
+0xE96E 0x99ED # <CJK>
+0xE96F 0x99EE # <CJK>
+0xE970 0x99F1 # <CJK>
+0xE971 0x99F2 # <CJK>
+0xE972 0x99FB # <CJK>
+0xE973 0x99F8 # <CJK>
+0xE974 0x9A01 # <CJK>
+0xE975 0x9A0F # <CJK>
+0xE976 0x9A05 # <CJK>
+0xE977 0x99E2 # <CJK>
+0xE978 0x9A19 # <CJK>
+0xE979 0x9A2B # <CJK>
+0xE97A 0x9A37 # <CJK>
+0xE97B 0x9A45 # <CJK>
+0xE97C 0x9A42 # <CJK>
+0xE97D 0x9A40 # <CJK>
+0xE97E 0x9A43 # <CJK>
+0xE980 0x9A3E # <CJK>
+0xE981 0x9A55 # <CJK>
+0xE982 0x9A4D # <CJK>
+0xE983 0x9A5B # <CJK>
+0xE984 0x9A57 # <CJK>
+0xE985 0x9A5F # <CJK>
+0xE986 0x9A62 # <CJK>
+0xE987 0x9A65 # <CJK>
+0xE988 0x9A64 # <CJK>
+0xE989 0x9A69 # <CJK>
+0xE98A 0x9A6B # <CJK>
+0xE98B 0x9A6A # <CJK>
+0xE98C 0x9AAD # <CJK>
+0xE98D 0x9AB0 # <CJK>
+0xE98E 0x9ABC # <CJK>
+0xE98F 0x9AC0 # <CJK>
+0xE990 0x9ACF # <CJK>
+0xE991 0x9AD1 # <CJK>
+0xE992 0x9AD3 # <CJK>
+0xE993 0x9AD4 # <CJK>
+0xE994 0x9ADE # <CJK>
+0xE995 0x9ADF # <CJK>
+0xE996 0x9AE2 # <CJK>
+0xE997 0x9AE3 # <CJK>
+0xE998 0x9AE6 # <CJK>
+0xE999 0x9AEF # <CJK>
+0xE99A 0x9AEB # <CJK>
+0xE99B 0x9AEE # <CJK>
+0xE99C 0x9AF4 # <CJK>
+0xE99D 0x9AF1 # <CJK>
+0xE99E 0x9AF7 # <CJK>
+0xE99F 0x9AFB # <CJK>
+0xE9A0 0x9B06 # <CJK>
+0xE9A1 0x9B18 # <CJK>
+0xE9A2 0x9B1A # <CJK>
+0xE9A3 0x9B1F # <CJK>
+0xE9A4 0x9B22 # <CJK>
+0xE9A5 0x9B23 # <CJK>
+0xE9A6 0x9B25 # <CJK>
+0xE9A7 0x9B27 # <CJK>
+0xE9A8 0x9B28 # <CJK>
+0xE9A9 0x9B29 # <CJK>
+0xE9AA 0x9B2A # <CJK>
+0xE9AB 0x9B2E # <CJK>
+0xE9AC 0x9B2F # <CJK>
+0xE9AD 0x9B32 # <CJK>
+0xE9AE 0x9B44 # <CJK>
+0xE9AF 0x9B43 # <CJK>
+0xE9B0 0x9B4F # <CJK>
+0xE9B1 0x9B4D # <CJK>
+0xE9B2 0x9B4E # <CJK>
+0xE9B3 0x9B51 # <CJK>
+0xE9B4 0x9B58 # <CJK>
+0xE9B5 0x9B74 # <CJK>
+0xE9B6 0x9B93 # <CJK>
+0xE9B7 0x9B83 # <CJK>
+0xE9B8 0x9B91 # <CJK>
+0xE9B9 0x9B96 # <CJK>
+0xE9BA 0x9B97 # <CJK>
+0xE9BB 0x9B9F # <CJK>
+0xE9BC 0x9BA0 # <CJK>
+0xE9BD 0x9BA8 # <CJK>
+0xE9BE 0x9BB4 # <CJK>
+0xE9BF 0x9BC0 # <CJK>
+0xE9C0 0x9BCA # <CJK>
+0xE9C1 0x9BB9 # <CJK>
+0xE9C2 0x9BC6 # <CJK>
+0xE9C3 0x9BCF # <CJK>
+0xE9C4 0x9BD1 # <CJK>
+0xE9C5 0x9BD2 # <CJK>
+0xE9C6 0x9BE3 # <CJK>
+0xE9C7 0x9BE2 # <CJK>
+0xE9C8 0x9BE4 # <CJK>
+0xE9C9 0x9BD4 # <CJK>
+0xE9CA 0x9BE1 # <CJK>
+0xE9CB 0x9C3A # <CJK>
+0xE9CC 0x9BF2 # <CJK>
+0xE9CD 0x9BF1 # <CJK>
+0xE9CE 0x9BF0 # <CJK>
+0xE9CF 0x9C15 # <CJK>
+0xE9D0 0x9C14 # <CJK>
+0xE9D1 0x9C09 # <CJK>
+0xE9D2 0x9C13 # <CJK>
+0xE9D3 0x9C0C # <CJK>
+0xE9D4 0x9C06 # <CJK>
+0xE9D5 0x9C08 # <CJK>
+0xE9D6 0x9C12 # <CJK>
+0xE9D7 0x9C0A # <CJK>
+0xE9D8 0x9C04 # <CJK>
+0xE9D9 0x9C2E # <CJK>
+0xE9DA 0x9C1B # <CJK>
+0xE9DB 0x9C25 # <CJK>
+0xE9DC 0x9C24 # <CJK>
+0xE9DD 0x9C21 # <CJK>
+0xE9DE 0x9C30 # <CJK>
+0xE9DF 0x9C47 # <CJK>
+0xE9E0 0x9C32 # <CJK>
+0xE9E1 0x9C46 # <CJK>
+0xE9E2 0x9C3E # <CJK>
+0xE9E3 0x9C5A # <CJK>
+0xE9E4 0x9C60 # <CJK>
+0xE9E5 0x9C67 # <CJK>
+0xE9E6 0x9C76 # <CJK>
+0xE9E7 0x9C78 # <CJK>
+0xE9E8 0x9CE7 # <CJK>
+0xE9E9 0x9CEC # <CJK>
+0xE9EA 0x9CF0 # <CJK>
+0xE9EB 0x9D09 # <CJK>
+0xE9EC 0x9D08 # <CJK>
+0xE9ED 0x9CEB # <CJK>
+0xE9EE 0x9D03 # <CJK>
+0xE9EF 0x9D06 # <CJK>
+0xE9F0 0x9D2A # <CJK>
+0xE9F1 0x9D26 # <CJK>
+0xE9F2 0x9DAF # <CJK>
+0xE9F3 0x9D23 # <CJK>
+0xE9F4 0x9D1F # <CJK>
+0xE9F5 0x9D44 # <CJK>
+0xE9F6 0x9D15 # <CJK>
+0xE9F7 0x9D12 # <CJK>
+0xE9F8 0x9D41 # <CJK>
+0xE9F9 0x9D3F # <CJK>
+0xE9FA 0x9D3E # <CJK>
+0xE9FB 0x9D46 # <CJK>
+0xE9FC 0x9D48 # <CJK>
+0xEA40 0x9D5D # <CJK>
+0xEA41 0x9D5E # <CJK>
+0xEA42 0x9D64 # <CJK>
+0xEA43 0x9D51 # <CJK>
+0xEA44 0x9D50 # <CJK>
+0xEA45 0x9D59 # <CJK>
+0xEA46 0x9D72 # <CJK>
+0xEA47 0x9D89 # <CJK>
+0xEA48 0x9D87 # <CJK>
+0xEA49 0x9DAB # <CJK>
+0xEA4A 0x9D6F # <CJK>
+0xEA4B 0x9D7A # <CJK>
+0xEA4C 0x9D9A # <CJK>
+0xEA4D 0x9DA4 # <CJK>
+0xEA4E 0x9DA9 # <CJK>
+0xEA4F 0x9DB2 # <CJK>
+0xEA50 0x9DC4 # <CJK>
+0xEA51 0x9DC1 # <CJK>
+0xEA52 0x9DBB # <CJK>
+0xEA53 0x9DB8 # <CJK>
+0xEA54 0x9DBA # <CJK>
+0xEA55 0x9DC6 # <CJK>
+0xEA56 0x9DCF # <CJK>
+0xEA57 0x9DC2 # <CJK>
+0xEA58 0x9DD9 # <CJK>
+0xEA59 0x9DD3 # <CJK>
+0xEA5A 0x9DF8 # <CJK>
+0xEA5B 0x9DE6 # <CJK>
+0xEA5C 0x9DED # <CJK>
+0xEA5D 0x9DEF # <CJK>
+0xEA5E 0x9DFD # <CJK>
+0xEA5F 0x9E1A # <CJK>
+0xEA60 0x9E1B # <CJK>
+0xEA61 0x9E1E # <CJK>
+0xEA62 0x9E75 # <CJK>
+0xEA63 0x9E79 # <CJK>
+0xEA64 0x9E7D # <CJK>
+0xEA65 0x9E81 # <CJK>
+0xEA66 0x9E88 # <CJK>
+0xEA67 0x9E8B # <CJK>
+0xEA68 0x9E8C # <CJK>
+0xEA69 0x9E92 # <CJK>
+0xEA6A 0x9E95 # <CJK>
+0xEA6B 0x9E91 # <CJK>
+0xEA6C 0x9E9D # <CJK>
+0xEA6D 0x9EA5 # <CJK>
+0xEA6E 0x9EA9 # <CJK>
+0xEA6F 0x9EB8 # <CJK>
+0xEA70 0x9EAA # <CJK>
+0xEA71 0x9EAD # <CJK>
+0xEA72 0x9761 # <CJK>
+0xEA73 0x9ECC # <CJK>
+0xEA74 0x9ECE # <CJK>
+0xEA75 0x9ECF # <CJK>
+0xEA76 0x9ED0 # <CJK>
+0xEA77 0x9ED4 # <CJK>
+0xEA78 0x9EDC # <CJK>
+0xEA79 0x9EDE # <CJK>
+0xEA7A 0x9EDD # <CJK>
+0xEA7B 0x9EE0 # <CJK>
+0xEA7C 0x9EE5 # <CJK>
+0xEA7D 0x9EE8 # <CJK>
+0xEA7E 0x9EEF # <CJK>
+0xEA80 0x9EF4 # <CJK>
+0xEA81 0x9EF6 # <CJK>
+0xEA82 0x9EF7 # <CJK>
+0xEA83 0x9EF9 # <CJK>
+0xEA84 0x9EFB # <CJK>
+0xEA85 0x9EFC # <CJK>
+0xEA86 0x9EFD # <CJK>
+0xEA87 0x9F07 # <CJK>
+0xEA88 0x9F08 # <CJK>
+0xEA89 0x76B7 # <CJK>
+0xEA8A 0x9F15 # <CJK>
+0xEA8B 0x9F21 # <CJK>
+0xEA8C 0x9F2C # <CJK>
+0xEA8D 0x9F3E # <CJK>
+0xEA8E 0x9F4A # <CJK>
+0xEA8F 0x9F52 # <CJK>
+0xEA90 0x9F54 # <CJK>
+0xEA91 0x9F63 # <CJK>
+0xEA92 0x9F5F # <CJK>
+0xEA93 0x9F60 # <CJK>
+0xEA94 0x9F61 # <CJK>
+0xEA95 0x9F66 # <CJK>
+0xEA96 0x9F67 # <CJK>
+0xEA97 0x9F6C # <CJK>
+0xEA98 0x9F6A # <CJK>
+0xEA99 0x9F77 # <CJK>
+0xEA9A 0x9F72 # <CJK>
+0xEA9B 0x9F76 # <CJK>
+0xEA9C 0x9F95 # <CJK>
+0xEA9D 0x9F9C # <CJK>
+0xEA9E 0x9FA0 # <CJK>
+0xEA9F 0x582F # <CJK>
+0xEAA0 0x69C7 # <CJK>
+0xEAA1 0x9059 # <CJK>
+0xEAA2 0x7464 # <CJK>
+0xEAA3 0x51DC # <CJK>
+0xEAA4 0x7199 # <CJK>
diff --git a/ext/mbstring/tests/data/SJIS-2004.txt b/ext/mbstring/tests/data/SJIS-2004.txt
new file mode 100644
index 0000000000..2db475d088
--- /dev/null
+++ b/ext/mbstring/tests/data/SJIS-2004.txt
@@ -0,0 +1,11549 @@
+## Shift_JIS-2004 (JIS X 0213:2004 Appendix 1) vs Unicode mapping table
+##
+## Date: 3 May 2009
+## License:
+## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
+## Copyright (C) 2001 I'O, All Rights Reserved.
+## Copyright (C) 2006, 2009 Project X0213, All Rights Reserved.
+## You can use, modify, distribute this table freely.
+## Note:
+## [1983] JIS codepoint defined by JIS X 0208-1983
+## [1990] JIS codepoint defined by JIS X 0208-1990
+## [2000] JIS codepoint defined by JIS X 0213:2000
+## [2004] JIS codepoint defined by JIS X 0213:2004
+## [Unicode3.1] UCS codepoint defined by Unicode 3.1
+## [Unicode3.2] UCS codepoint defined by Unicode 3.2
+## Fullwidth UCS fullwidth form (U+Fxxx)
+## Windows Windows (CP932) mapping
+## Some 0213 character can't represent by one UCS character.
+## In this table, such characters are described as 'U+xxxx+xxxx'.
+##
+## JIS Unicode Name Note
+0x00 U+0000 # <control>
+0x01 U+0001 # <control>
+0x02 U+0002 # <control>
+0x03 U+0003 # <control>
+0x04 U+0004 # <control>
+0x05 U+0005 # <control>
+0x06 U+0006 # <control>
+0x07 U+0007 # <control>
+0x08 U+0008 # <control>
+0x09 U+0009 # <control>
+0x0A U+000A # <control>
+0x0B U+000B # <control>
+0x0C U+000C # <control>
+0x0D U+000D # <control>
+0x0E U+000E # <control>
+0x0F U+000F # <control>
+0x10 U+0010 # <control>
+0x11 U+0011 # <control>
+0x12 U+0012 # <control>
+0x13 U+0013 # <control>
+0x14 U+0014 # <control>
+0x15 U+0015 # <control>
+0x16 U+0016 # <control>
+0x17 U+0017 # <control>
+0x18 U+0018 # <control>
+0x19 U+0019 # <control>
+0x1A U+001A # <control>
+0x1B U+001B # <control>
+0x1C U+001C # <control>
+0x1D U+001D # <control>
+0x1E U+001E # <control>
+0x1F U+001F # <control>
+0x20 U+0020 # SPACE
+0x21 U+0021 # EXCLAMATION MARK
+0x22 U+0022 # QUOTATION MARK
+0x23 U+0023 # NUMBER SIGN
+0x24 U+0024 # DOLLAR SIGN
+0x25 U+0025 # PERCENT SIGN
+0x26 U+0026 # AMPERSAND
+0x27 U+0027 # APOSTROPHE
+0x28 U+0028 # LEFT PARENTHESIS
+0x29 U+0029 # RIGHT PARENTHESIS
+0x2A U+002A # ASTERISK
+0x2B U+002B # PLUS SIGN
+0x2C U+002C # COMMA
+0x2D U+002D # HYPHEN-MINUS
+0x2E U+002E # FULL STOP
+0x2F U+002F # SOLIDUS
+0x30 U+0030 # DIGIT ZERO
+0x31 U+0031 # DIGIT ONE
+0x32 U+0032 # DIGIT TWO
+0x33 U+0033 # DIGIT THREE
+0x34 U+0034 # DIGIT FOUR
+0x35 U+0035 # DIGIT FIVE
+0x36 U+0036 # DIGIT SIX
+0x37 U+0037 # DIGIT SEVEN
+0x38 U+0038 # DIGIT EIGHT
+0x39 U+0039 # DIGIT NINE
+0x3A U+003A # COLON
+0x3B U+003B # SEMICOLON
+0x3C U+003C # LESS-THAN SIGN
+0x3D U+003D # EQUALS SIGN
+0x3E U+003E # GREATER-THAN SIGN
+0x3F U+003F # QUESTION MARK
+0x40 U+0040 # COMMERCIAL AT
+0x41 U+0041 # LATIN CAPITAL LETTER A
+0x42 U+0042 # LATIN CAPITAL LETTER B
+0x43 U+0043 # LATIN CAPITAL LETTER C
+0x44 U+0044 # LATIN CAPITAL LETTER D
+0x45 U+0045 # LATIN CAPITAL LETTER E
+0x46 U+0046 # LATIN CAPITAL LETTER F
+0x47 U+0047 # LATIN CAPITAL LETTER G
+0x48 U+0048 # LATIN CAPITAL LETTER H
+0x49 U+0049 # LATIN CAPITAL LETTER I
+0x4A U+004A # LATIN CAPITAL LETTER J
+0x4B U+004B # LATIN CAPITAL LETTER K
+0x4C U+004C # LATIN CAPITAL LETTER L
+0x4D U+004D # LATIN CAPITAL LETTER M
+0x4E U+004E # LATIN CAPITAL LETTER N
+0x4F U+004F # LATIN CAPITAL LETTER O
+0x50 U+0050 # LATIN CAPITAL LETTER P
+0x51 U+0051 # LATIN CAPITAL LETTER Q
+0x52 U+0052 # LATIN CAPITAL LETTER R
+0x53 U+0053 # LATIN CAPITAL LETTER S
+0x54 U+0054 # LATIN CAPITAL LETTER T
+0x55 U+0055 # LATIN CAPITAL LETTER U
+0x56 U+0056 # LATIN CAPITAL LETTER V
+0x57 U+0057 # LATIN CAPITAL LETTER W
+0x58 U+0058 # LATIN CAPITAL LETTER X
+0x59 U+0059 # LATIN CAPITAL LETTER Y
+0x5A U+005A # LATIN CAPITAL LETTER Z
+0x5B U+005B # LEFT SQUARE BRACKET
+0x5C U+00A5 # YEN SIGN
+0x5D U+005D # RIGHT SQUARE BRACKET
+0x5E U+005E # CIRCUMFLEX ACCENT
+0x5F U+005F # LOW LINE
+0x60 U+0060 # GRAVE ACCENT
+0x61 U+0061 # LATIN SMALL LETTER A
+0x62 U+0062 # LATIN SMALL LETTER B
+0x63 U+0063 # LATIN SMALL LETTER C
+0x64 U+0064 # LATIN SMALL LETTER D
+0x65 U+0065 # LATIN SMALL LETTER E
+0x66 U+0066 # LATIN SMALL LETTER F
+0x67 U+0067 # LATIN SMALL LETTER G
+0x68 U+0068 # LATIN SMALL LETTER H
+0x69 U+0069 # LATIN SMALL LETTER I
+0x6A U+006A # LATIN SMALL LETTER J
+0x6B U+006B # LATIN SMALL LETTER K
+0x6C U+006C # LATIN SMALL LETTER L
+0x6D U+006D # LATIN SMALL LETTER M
+0x6E U+006E # LATIN SMALL LETTER N
+0x6F U+006F # LATIN SMALL LETTER O
+0x70 U+0070 # LATIN SMALL LETTER P
+0x71 U+0071 # LATIN SMALL LETTER Q
+0x72 U+0072 # LATIN SMALL LETTER R
+0x73 U+0073 # LATIN SMALL LETTER S
+0x74 U+0074 # LATIN SMALL LETTER T
+0x75 U+0075 # LATIN SMALL LETTER U
+0x76 U+0076 # LATIN SMALL LETTER V
+0x77 U+0077 # LATIN SMALL LETTER W
+0x78 U+0078 # LATIN SMALL LETTER X
+0x79 U+0079 # LATIN SMALL LETTER Y
+0x7A U+007A # LATIN SMALL LETTER Z
+0x7B U+007B # LEFT CURLY BRACKET
+0x7C U+007C # VERTICAL LINE
+0x7D U+007D # RIGHT CURLY BRACKET
+0x7E U+203E # OVERLINE
+0x7F U+007F # <control>
+0x80 # <reserved>
+0x81 # <doublebytes>
+0x82 # <doublebytes>
+0x83 # <doublebytes>
+0x84 # <doublebytes>
+0x85 # <doublebytes>
+0x86 # <doublebytes>
+0x87 # <doublebytes>
+0x88 # <doublebytes>
+0x89 # <doublebytes>
+0x8A # <doublebytes>
+0x8B # <doublebytes>
+0x8C # <doublebytes>
+0x8D # <doublebytes>
+0x8E # <doublebytes>
+0x8F # <doublebytes>
+0x90 # <doublebytes>
+0x91 # <doublebytes>
+0x92 # <doublebytes>
+0x93 # <doublebytes>
+0x94 # <doublebytes>
+0x95 # <doublebytes>
+0x96 # <doublebytes>
+0x97 # <doublebytes>
+0x98 # <doublebytes>
+0x99 # <doublebytes>
+0x9A # <doublebytes>
+0x9B # <doublebytes>
+0x9C # <doublebytes>
+0x9D # <doublebytes>
+0x9E # <doublebytes>
+0x9F # <doublebytes>
+0xA0 # <reserved>
+0xA1 U+FF61 # HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2 U+FF62 # HALFWIDTH LEFT CORNER BRACKET
+0xA3 U+FF63 # HALFWIDTH RIGHT CORNER BRACKET
+0xA4 U+FF64 # HALFWIDTH IDEOGRAPHIC COMMA
+0xA5 U+FF65 # HALFWIDTH KATAKANA MIDDLE DOT
+0xA6 U+FF66 # HALFWIDTH KATAKANA LETTER WO
+0xA7 U+FF67 # HALFWIDTH KATAKANA LETTER SMALL A
+0xA8 U+FF68 # HALFWIDTH KATAKANA LETTER SMALL I
+0xA9 U+FF69 # HALFWIDTH KATAKANA LETTER SMALL U
+0xAA U+FF6A # HALFWIDTH KATAKANA LETTER SMALL E
+0xAB U+FF6B # HALFWIDTH KATAKANA LETTER SMALL O
+0xAC U+FF6C # HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD U+FF6D # HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE U+FF6E # HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF U+FF6F # HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0 U+FF70 # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1 U+FF71 # HALFWIDTH KATAKANA LETTER A
+0xB2 U+FF72 # HALFWIDTH KATAKANA LETTER I
+0xB3 U+FF73 # HALFWIDTH KATAKANA LETTER U
+0xB4 U+FF74 # HALFWIDTH KATAKANA LETTER E
+0xB5 U+FF75 # HALFWIDTH KATAKANA LETTER O
+0xB6 U+FF76 # HALFWIDTH KATAKANA LETTER KA
+0xB7 U+FF77 # HALFWIDTH KATAKANA LETTER KI
+0xB8 U+FF78 # HALFWIDTH KATAKANA LETTER KU
+0xB9 U+FF79 # HALFWIDTH KATAKANA LETTER KE
+0xBA U+FF7A # HALFWIDTH KATAKANA LETTER KO
+0xBB U+FF7B # HALFWIDTH KATAKANA LETTER SA
+0xBC U+FF7C # HALFWIDTH KATAKANA LETTER SI
+0xBD U+FF7D # HALFWIDTH KATAKANA LETTER SU
+0xBE U+FF7E # HALFWIDTH KATAKANA LETTER SE
+0xBF U+FF7F # HALFWIDTH KATAKANA LETTER SO
+0xC0 U+FF80 # HALFWIDTH KATAKANA LETTER TA
+0xC1 U+FF81 # HALFWIDTH KATAKANA LETTER TI
+0xC2 U+FF82 # HALFWIDTH KATAKANA LETTER TU
+0xC3 U+FF83 # HALFWIDTH KATAKANA LETTER TE
+0xC4 U+FF84 # HALFWIDTH KATAKANA LETTER TO
+0xC5 U+FF85 # HALFWIDTH KATAKANA LETTER NA
+0xC6 U+FF86 # HALFWIDTH KATAKANA LETTER NI
+0xC7 U+FF87 # HALFWIDTH KATAKANA LETTER NU
+0xC8 U+FF88 # HALFWIDTH KATAKANA LETTER NE
+0xC9 U+FF89 # HALFWIDTH KATAKANA LETTER NO
+0xCA U+FF8A # HALFWIDTH KATAKANA LETTER HA
+0xCB U+FF8B # HALFWIDTH KATAKANA LETTER HI
+0xCC U+FF8C # HALFWIDTH KATAKANA LETTER HU
+0xCD U+FF8D # HALFWIDTH KATAKANA LETTER HE
+0xCE U+FF8E # HALFWIDTH KATAKANA LETTER HO
+0xCF U+FF8F # HALFWIDTH KATAKANA LETTER MA
+0xD0 U+FF90 # HALFWIDTH KATAKANA LETTER MI
+0xD1 U+FF91 # HALFWIDTH KATAKANA LETTER MU
+0xD2 U+FF92 # HALFWIDTH KATAKANA LETTER ME
+0xD3 U+FF93 # HALFWIDTH KATAKANA LETTER MO
+0xD4 U+FF94 # HALFWIDTH KATAKANA LETTER YA
+0xD5 U+FF95 # HALFWIDTH KATAKANA LETTER YU
+0xD6 U+FF96 # HALFWIDTH KATAKANA LETTER YO
+0xD7 U+FF97 # HALFWIDTH KATAKANA LETTER RA
+0xD8 U+FF98 # HALFWIDTH KATAKANA LETTER RI
+0xD9 U+FF99 # HALFWIDTH KATAKANA LETTER RU
+0xDA U+FF9A # HALFWIDTH KATAKANA LETTER RE
+0xDB U+FF9B # HALFWIDTH KATAKANA LETTER RO
+0xDC U+FF9C # HALFWIDTH KATAKANA LETTER WA
+0xDD U+FF9D # HALFWIDTH KATAKANA LETTER N
+0xDE U+FF9E # HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF U+FF9F # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+0xE0 # <doublebytes>
+0xE1 # <doublebytes>
+0xE2 # <doublebytes>
+0xE3 # <doublebytes>
+0xE4 # <doublebytes>
+0xE5 # <doublebytes>
+0xE6 # <doublebytes>
+0xE7 # <doublebytes>
+0xE8 # <doublebytes>
+0xE9 # <doublebytes>
+0xEA # <doublebytes>
+0xEB # <doublebytes>
+0xEC # <doublebytes>
+0xED # <doublebytes>
+0xEE # <doublebytes>
+0xEF # <doublebytes>
+0xF0 # <doublebytes>
+0xF1 # <doublebytes>
+0xF2 # <doublebytes>
+0xF3 # <doublebytes>
+0xF4 # <doublebytes>
+0xF5 # <doublebytes>
+0xF6 # <doublebytes>
+0xF7 # <doublebytes>
+0xF8 # <doublebytes>
+0xF9 # <doublebytes>
+0xFA # <doublebytes>
+0xFB # <doublebytes>
+0xFC # <doublebytes>
+0xFD # <reserved>
+0xFE # <reserved>
+0xFF # <reserved>
+0x8140 U+3000 # IDEOGRAPHIC SPACE
+0x8141 U+3001 # IDEOGRAPHIC COMMA
+0x8142 U+3002 # IDEOGRAPHIC FULL STOP
+0x8143 U+FF0C # FULLWIDTH COMMA
+0x8144 U+FF0E # FULLWIDTH FULL STOP
+0x8145 U+30FB # KATAKANA MIDDLE DOT
+0x8146 U+FF1A # FULLWIDTH COLON
+0x8147 U+FF1B # FULLWIDTH SEMICOLON
+0x8148 U+FF1F # FULLWIDTH QUESTION MARK
+0x8149 U+FF01 # FULLWIDTH EXCLAMATION MARK
+0x814A U+309B # KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B U+309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C U+00B4 # ACUTE ACCENT
+0x814D U+FF40 # FULLWIDTH GRAVE ACCENT
+0x814E U+00A8 # DIAERESIS
+0x814F U+FF3E # FULLWIDTH CIRCUMFLEX ACCENT
+0x8150 U+FFE3 # FULLWIDTH MACRON
+0x8151 U+FF3F # FULLWIDTH LOW LINE
+0x8152 U+30FD # KATAKANA ITERATION MARK
+0x8153 U+30FE # KATAKANA VOICED ITERATION MARK
+0x8154 U+309D # HIRAGANA ITERATION MARK
+0x8155 U+309E # HIRAGANA VOICED ITERATION MARK
+0x8156 U+3003 # DITTO MARK
+0x8157 U+4EDD # <cjk>
+0x8158 U+3005 # IDEOGRAPHIC ITERATION MARK
+0x8159 U+3006 # IDEOGRAPHIC CLOSING MARK
+0x815A U+3007 # IDEOGRAPHIC NUMBER ZERO
+0x815B U+30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C U+2014 # EM DASH Windows: U+2015
+0x815D U+2010 # HYPHEN
+0x815E U+FF0F # FULLWIDTH SOLIDUS
+0x815F U+005C # REVERSE SOLIDUS Fullwidth: U+FF3C
+0x8160 U+301C # WAVE DASH Windows: U+FF5E
+0x8161 U+2016 # DOUBLE VERTICAL LINE Windows: U+2225
+0x8162 U+FF5C # FULLWIDTH VERTICAL LINE
+0x8163 U+2026 # HORIZONTAL ELLIPSIS
+0x8164 U+2025 # TWO DOT LEADER
+0x8165 U+2018 # LEFT SINGLE QUOTATION MARK
+0x8166 U+2019 # RIGHT SINGLE QUOTATION MARK
+0x8167 U+201C # LEFT DOUBLE QUOTATION MARK
+0x8168 U+201D # RIGHT DOUBLE QUOTATION MARK
+0x8169 U+FF08 # FULLWIDTH LEFT PARENTHESIS
+0x816A U+FF09 # FULLWIDTH RIGHT PARENTHESIS
+0x816B U+3014 # LEFT TORTOISE SHELL BRACKET
+0x816C U+3015 # RIGHT TORTOISE SHELL BRACKET
+0x816D U+FF3B # FULLWIDTH LEFT SQUARE BRACKET
+0x816E U+FF3D # FULLWIDTH RIGHT SQUARE BRACKET
+0x816F U+FF5B # FULLWIDTH LEFT CURLY BRACKET
+0x8170 U+FF5D # FULLWIDTH RIGHT CURLY BRACKET
+0x8171 U+3008 # LEFT ANGLE BRACKET
+0x8172 U+3009 # RIGHT ANGLE BRACKET
+0x8173 U+300A # LEFT DOUBLE ANGLE BRACKET
+0x8174 U+300B # RIGHT DOUBLE ANGLE BRACKET
+0x8175 U+300C # LEFT CORNER BRACKET
+0x8176 U+300D # RIGHT CORNER BRACKET
+0x8177 U+300E # LEFT WHITE CORNER BRACKET
+0x8178 U+300F # RIGHT WHITE CORNER BRACKET
+0x8179 U+3010 # LEFT BLACK LENTICULAR BRACKET
+0x817A U+3011 # RIGHT BLACK LENTICULAR BRACKET
+0x817B U+FF0B # FULLWIDTH PLUS SIGN
+0x817C U+2212 # MINUS SIGN Windows: U+FF0D
+0x817D U+00B1 # PLUS-MINUS SIGN
+0x817E U+00D7 # MULTIPLICATION SIGN
+0x8180 U+00F7 # DIVISION SIGN
+0x8181 U+FF1D # FULLWIDTH EQUALS SIGN
+0x8182 U+2260 # NOT EQUAL TO
+0x8183 U+FF1C # FULLWIDTH LESS-THAN SIGN
+0x8184 U+FF1E # FULLWIDTH GREATER-THAN SIGN
+0x8185 U+2266 # LESS-THAN OVER EQUAL TO
+0x8186 U+2267 # GREATER-THAN OVER EQUAL TO
+0x8187 U+221E # INFINITY
+0x8188 U+2234 # THEREFORE
+0x8189 U+2642 # MALE SIGN
+0x818A U+2640 # FEMALE SIGN
+0x818B U+00B0 # DEGREE SIGN
+0x818C U+2032 # PRIME
+0x818D U+2033 # DOUBLE PRIME
+0x818E U+2103 # DEGREE CELSIUS
+0x818F U+FFE5 # FULLWIDTH YEN SIGN
+0x8190 U+FF04 # FULLWIDTH DOLLAR SIGN
+0x8191 U+00A2 # CENT SIGN Windows: U+FFE0
+0x8192 U+00A3 # POUND SIGN Windows: U+FFE1
+0x8193 U+FF05 # FULLWIDTH PERCENT SIGN
+0x8194 U+FF03 # FULLWIDTH NUMBER SIGN
+0x8195 U+FF06 # FULLWIDTH AMPERSAND
+0x8196 U+FF0A # FULLWIDTH ASTERISK
+0x8197 U+FF20 # FULLWIDTH COMMERCIAL AT
+0x8198 U+00A7 # SECTION SIGN
+0x8199 U+2606 # WHITE STAR
+0x819A U+2605 # BLACK STAR
+0x819B U+25CB # WHITE CIRCLE
+0x819C U+25CF # BLACK CIRCLE
+0x819D U+25CE # BULLSEYE
+0x819E U+25C7 # WHITE DIAMOND
+0x819F U+25C6 # BLACK DIAMOND
+0x81A0 U+25A1 # WHITE SQUARE
+0x81A1 U+25A0 # BLACK SQUARE
+0x81A2 U+25B3 # WHITE UP-POINTING TRIANGLE
+0x81A3 U+25B2 # BLACK UP-POINTING TRIANGLE
+0x81A4 U+25BD # WHITE DOWN-POINTING TRIANGLE
+0x81A5 U+25BC # BLACK DOWN-POINTING TRIANGLE
+0x81A6 U+203B # REFERENCE MARK
+0x81A7 U+3012 # POSTAL MARK
+0x81A8 U+2192 # RIGHTWARDS ARROW
+0x81A9 U+2190 # LEFTWARDS ARROW
+0x81AA U+2191 # UPWARDS ARROW
+0x81AB U+2193 # DOWNWARDS ARROW
+0x81AC U+3013 # GETA MARK
+0x81AD U+FF07 # FULLWIDTH APOSTROPHE [2000]
+0x81AE U+FF02 # FULLWIDTH QUOTATION MARK [2000]
+0x81AF U+FF0D # FULLWIDTH HYPHEN-MINUS [2000]
+0x81B0 U+007E # TILDE [2000] Fullwidth: U+FF5E
+0x81B1 U+3033 # VERTICAL KANA REPEAT MARK UPPER HALF [2000]
+0x81B2 U+3034 # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF [2000]
+0x81B3 U+3035 # VERTICAL KANA REPEAT MARK LOWER HALF [2000]
+0x81B4 U+303B # VERTICAL IDEOGRAPHIC ITERATION MARK [2000] [Unicode3.2]
+0x81B5 U+303C # MASU MARK [2000] [Unicode3.2]
+0x81B6 U+30FF # KATAKANA DIGRAPH KOTO [2000] [Unicode3.2]
+0x81B7 U+309F # HIRAGANA DIGRAPH YORI [2000] [Unicode3.2]
+0x81B8 U+2208 # ELEMENT OF [1983]
+0x81B9 U+220B # CONTAINS AS MEMBER [1983]
+0x81BA U+2286 # SUBSET OF OR EQUAL TO [1983]
+0x81BB U+2287 # SUPERSET OF OR EQUAL TO [1983]
+0x81BC U+2282 # SUBSET OF [1983]
+0x81BD U+2283 # SUPERSET OF [1983]
+0x81BE U+222A # UNION [1983]
+0x81BF U+2229 # INTERSECTION [1983]
+0x81C0 U+2284 # NOT A SUBSET OF [2000]
+0x81C1 U+2285 # NOT A SUPERSET OF [2000]
+0x81C2 U+228A # SUBSET OF WITH NOT EQUAL TO [2000]
+0x81C3 U+228B # SUPERSET OF WITH NOT EQUAL TO [2000]
+0x81C4 U+2209 # NOT AN ELEMENT OF [2000]
+0x81C5 U+2205 # EMPTY SET [2000]
+0x81C6 U+2305 # PROJECTIVE [2000]
+0x81C7 U+2306 # PERSPECTIVE [2000]
+0x81C8 U+2227 # LOGICAL AND [1983]
+0x81C9 U+2228 # LOGICAL OR [1983]
+0x81CA U+00AC # NOT SIGN [1983] Windows: U+FFE2
+0x81CB U+21D2 # RIGHTWARDS DOUBLE ARROW [1983]
+0x81CC U+21D4 # LEFT RIGHT DOUBLE ARROW [1983]
+0x81CD U+2200 # FOR ALL [1983]
+0x81CE U+2203 # THERE EXISTS [1983]
+0x81CF U+2295 # CIRCLED PLUS [2000]
+0x81D0 U+2296 # CIRCLED MINUS [2000]
+0x81D1 U+2297 # CIRCLED TIMES [2000]
+0x81D2 U+2225 # PARALLEL TO [2000]
+0x81D3 U+2226 # NOT PARALLEL TO [2000]
+0x81D4 U+FF5F # FULLWIDTH LEFT WHITE PARENTHESIS [2000] [Unicode3.2]
+0x81D5 U+FF60 # FULLWIDTH RIGHT WHITE PARENTHESIS [2000] [Unicode3.2]
+0x81D6 U+3018 # LEFT WHITE TORTOISE SHELL BRACKET [2000]
+0x81D7 U+3019 # RIGHT WHITE TORTOISE SHELL BRACKET [2000]
+0x81D8 U+3016 # LEFT WHITE LENTICULAR BRACKET [2000]
+0x81D9 U+3017 # RIGHT WHITE LENTICULAR BRACKET [2000]
+0x81DA U+2220 # ANGLE [1983]
+0x81DB U+22A5 # UP TACK [1983]
+0x81DC U+2312 # ARC [1983]
+0x81DD U+2202 # PARTIAL DIFFERENTIAL [1983]
+0x81DE U+2207 # NABLA [1983]
+0x81DF U+2261 # IDENTICAL TO [1983]
+0x81E0 U+2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF [1983]
+0x81E1 U+226A # MUCH LESS-THAN [1983]
+0x81E2 U+226B # MUCH GREATER-THAN [1983]
+0x81E3 U+221A # SQUARE ROOT [1983]
+0x81E4 U+223D # REVERSED TILDE [1983]
+0x81E5 U+221D # PROPORTIONAL TO [1983]
+0x81E6 U+2235 # BECAUSE [1983]
+0x81E7 U+222B # INTEGRAL [1983]
+0x81E8 U+222C # DOUBLE INTEGRAL [1983]
+0x81E9 U+2262 # NOT IDENTICAL TO [2000]
+0x81EA U+2243 # ASYMPTOTICALLY EQUAL TO [2000]
+0x81EB U+2245 # APPROXIMATELY EQUAL TO [2000]
+0x81EC U+2248 # ALMOST EQUAL TO [2000]
+0x81ED U+2276 # LESS-THAN OR GREATER-THAN [2000]
+0x81EE U+2277 # GREATER-THAN OR LESS-THAN [2000]
+0x81EF U+2194 # LEFT RIGHT ARROW [2000]
+0x81F0 U+212B # ANGSTROM SIGN [1983]
+0x81F1 U+2030 # PER MILLE SIGN [1983]
+0x81F2 U+266F # MUSIC SHARP SIGN [1983]
+0x81F3 U+266D # MUSIC FLAT SIGN [1983]
+0x81F4 U+266A # EIGHTH NOTE [1983]
+0x81F5 U+2020 # DAGGER [1983]
+0x81F6 U+2021 # DOUBLE DAGGER [1983]
+0x81F7 U+00B6 # PILCROW SIGN [1983]
+0x81F8 U+266E # MUSIC NATURAL SIGN [2000]
+0x81F9 U+266B # BEAMED EIGHTH NOTES [2000]
+0x81FA U+266C # BEAMED SIXTEENTH NOTES [2000]
+0x81FB U+2669 # QUARTER NOTE [2000]
+0x81FC U+25EF # LARGE CIRCLE [1983]
+0x8240 U+25B7 # WHITE RIGHT-POINTING TRIANGLE [2000]
+0x8241 U+25B6 # BLACK RIGHT-POINTING TRIANGLE [2000]
+0x8242 U+25C1 # WHITE LEFT-POINTING TRIANGLE [2000]
+0x8243 U+25C0 # BLACK LEFT-POINTING TRIANGLE [2000]
+0x8244 U+2197 # NORTH EAST ARROW [2000]
+0x8245 U+2198 # SOUTH EAST ARROW [2000]
+0x8246 U+2196 # NORTH WEST ARROW [2000]
+0x8247 U+2199 # SOUTH WEST ARROW [2000]
+0x8248 U+21C4 # RIGHTWARDS ARROW OVER LEFTWARDS ARROW [2000]
+0x8249 U+21E8 # RIGHTWARDS WHITE ARROW [2000]
+0x824A U+21E6 # LEFTWARDS WHITE ARROW [2000]
+0x824B U+21E7 # UPWARDS WHITE ARROW [2000]
+0x824C U+21E9 # DOWNWARDS WHITE ARROW [2000]
+0x824D U+2934 # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS [2000] [Unicode3.2]
+0x824E U+2935 # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS [2000] [Unicode3.2]
+0x824F U+FF10 # FULLWIDTH DIGIT ZERO
+0x8250 U+FF11 # FULLWIDTH DIGIT ONE
+0x8251 U+FF12 # FULLWIDTH DIGIT TWO
+0x8252 U+FF13 # FULLWIDTH DIGIT THREE
+0x8253 U+FF14 # FULLWIDTH DIGIT FOUR
+0x8254 U+FF15 # FULLWIDTH DIGIT FIVE
+0x8255 U+FF16 # FULLWIDTH DIGIT SIX
+0x8256 U+FF17 # FULLWIDTH DIGIT SEVEN
+0x8257 U+FF18 # FULLWIDTH DIGIT EIGHT
+0x8258 U+FF19 # FULLWIDTH DIGIT NINE
+0x8259 U+29BF # CIRCLED BULLET [2000] [Unicode3.2]
+0x825A U+25C9 # FISHEYE [2000]
+0x825B U+303D # PART ALTERNATION MARK [2000] [Unicode3.2]
+0x825C U+FE46 # WHITE SESAME DOT [2000] [Unicode3.2]
+0x825D U+FE45 # SESAME DOT [2000] [Unicode3.2]
+0x825E U+25E6 # WHITE BULLET [2000]
+0x825F U+2022 # BULLET [2000]
+0x8260 U+FF21 # FULLWIDTH LATIN CAPITAL LETTER A
+0x8261 U+FF22 # FULLWIDTH LATIN CAPITAL LETTER B
+0x8262 U+FF23 # FULLWIDTH LATIN CAPITAL LETTER C
+0x8263 U+FF24 # FULLWIDTH LATIN CAPITAL LETTER D
+0x8264 U+FF25 # FULLWIDTH LATIN CAPITAL LETTER E
+0x8265 U+FF26 # FULLWIDTH LATIN CAPITAL LETTER F
+0x8266 U+FF27 # FULLWIDTH LATIN CAPITAL LETTER G
+0x8267 U+FF28 # FULLWIDTH LATIN CAPITAL LETTER H
+0x8268 U+FF29 # FULLWIDTH LATIN CAPITAL LETTER I
+0x8269 U+FF2A # FULLWIDTH LATIN CAPITAL LETTER J
+0x826A U+FF2B # FULLWIDTH LATIN CAPITAL LETTER K
+0x826B U+FF2C # FULLWIDTH LATIN CAPITAL LETTER L
+0x826C U+FF2D # FULLWIDTH LATIN CAPITAL LETTER M
+0x826D U+FF2E # FULLWIDTH LATIN CAPITAL LETTER N
+0x826E U+FF2F # FULLWIDTH LATIN CAPITAL LETTER O
+0x826F U+FF30 # FULLWIDTH LATIN CAPITAL LETTER P
+0x8270 U+FF31 # FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271 U+FF32 # FULLWIDTH LATIN CAPITAL LETTER R
+0x8272 U+FF33 # FULLWIDTH LATIN CAPITAL LETTER S
+0x8273 U+FF34 # FULLWIDTH LATIN CAPITAL LETTER T
+0x8274 U+FF35 # FULLWIDTH LATIN CAPITAL LETTER U
+0x8275 U+FF36 # FULLWIDTH LATIN CAPITAL LETTER V
+0x8276 U+FF37 # FULLWIDTH LATIN CAPITAL LETTER W
+0x8277 U+FF38 # FULLWIDTH LATIN CAPITAL LETTER X
+0x8278 U+FF39 # FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279 U+FF3A # FULLWIDTH LATIN CAPITAL LETTER Z
+0x827A U+2213 # MINUS-OR-PLUS SIGN [2000]
+0x827B U+2135 # ALEF SYMBOL [2000]
+0x827C U+210F # PLANCK CONSTANT OVER TWO PI [2000]
+0x827D U+33CB # SQUARE HP [2000]
+0x827E U+2113 # SCRIPT SMALL L [2000]
+0x8280 U+2127 # INVERTED OHM SIGN [2000]
+0x8281 U+FF41 # FULLWIDTH LATIN SMALL LETTER A
+0x8282 U+FF42 # FULLWIDTH LATIN SMALL LETTER B
+0x8283 U+FF43 # FULLWIDTH LATIN SMALL LETTER C
+0x8284 U+FF44 # FULLWIDTH LATIN SMALL LETTER D
+0x8285 U+FF45 # FULLWIDTH LATIN SMALL LETTER E
+0x8286 U+FF46 # FULLWIDTH LATIN SMALL LETTER F
+0x8287 U+FF47 # FULLWIDTH LATIN SMALL LETTER G
+0x8288 U+FF48 # FULLWIDTH LATIN SMALL LETTER H
+0x8289 U+FF49 # FULLWIDTH LATIN SMALL LETTER I
+0x828A U+FF4A # FULLWIDTH LATIN SMALL LETTER J
+0x828B U+FF4B # FULLWIDTH LATIN SMALL LETTER K
+0x828C U+FF4C # FULLWIDTH LATIN SMALL LETTER L
+0x828D U+FF4D # FULLWIDTH LATIN SMALL LETTER M
+0x828E U+FF4E # FULLWIDTH LATIN SMALL LETTER N
+0x828F U+FF4F # FULLWIDTH LATIN SMALL LETTER O
+0x8290 U+FF50 # FULLWIDTH LATIN SMALL LETTER P
+0x8291 U+FF51 # FULLWIDTH LATIN SMALL LETTER Q
+0x8292 U+FF52 # FULLWIDTH LATIN SMALL LETTER R
+0x8293 U+FF53 # FULLWIDTH LATIN SMALL LETTER S
+0x8294 U+FF54 # FULLWIDTH LATIN SMALL LETTER T
+0x8295 U+FF55 # FULLWIDTH LATIN SMALL LETTER U
+0x8296 U+FF56 # FULLWIDTH LATIN SMALL LETTER V
+0x8297 U+FF57 # FULLWIDTH LATIN SMALL LETTER W
+0x8298 U+FF58 # FULLWIDTH LATIN SMALL LETTER X
+0x8299 U+FF59 # FULLWIDTH LATIN SMALL LETTER Y
+0x829A U+FF5A # FULLWIDTH LATIN SMALL LETTER Z
+0x829B U+30A0 # KATAKANA-HIRAGANA DOUBLE HYPHEN [2000] [Unicode3.2]
+0x829C U+2013 # EN DASH [2000]
+0x829D U+29FA # DOUBLE PLUS [2000] [Unicode3.2]
+0x829E U+29FB # TRIPLE PLUS [2000] [Unicode3.2]
+0x829F U+3041 # HIRAGANA LETTER SMALL A
+0x82A0 U+3042 # HIRAGANA LETTER A
+0x82A1 U+3043 # HIRAGANA LETTER SMALL I
+0x82A2 U+3044 # HIRAGANA LETTER I
+0x82A3 U+3045 # HIRAGANA LETTER SMALL U
+0x82A4 U+3046 # HIRAGANA LETTER U
+0x82A5 U+3047 # HIRAGANA LETTER SMALL E
+0x82A6 U+3048 # HIRAGANA LETTER E
+0x82A7 U+3049 # HIRAGANA LETTER SMALL O
+0x82A8 U+304A # HIRAGANA LETTER O
+0x82A9 U+304B # HIRAGANA LETTER KA
+0x82AA U+304C # HIRAGANA LETTER GA
+0x82AB U+304D # HIRAGANA LETTER KI
+0x82AC U+304E # HIRAGANA LETTER GI
+0x82AD U+304F # HIRAGANA LETTER KU
+0x82AE U+3050 # HIRAGANA LETTER GU
+0x82AF U+3051 # HIRAGANA LETTER KE
+0x82B0 U+3052 # HIRAGANA LETTER GE
+0x82B1 U+3053 # HIRAGANA LETTER KO
+0x82B2 U+3054 # HIRAGANA LETTER GO
+0x82B3 U+3055 # HIRAGANA LETTER SA
+0x82B4 U+3056 # HIRAGANA LETTER ZA
+0x82B5 U+3057 # HIRAGANA LETTER SI
+0x82B6 U+3058 # HIRAGANA LETTER ZI
+0x82B7 U+3059 # HIRAGANA LETTER SU
+0x82B8 U+305A # HIRAGANA LETTER ZU
+0x82B9 U+305B # HIRAGANA LETTER SE
+0x82BA U+305C # HIRAGANA LETTER ZE
+0x82BB U+305D # HIRAGANA LETTER SO
+0x82BC U+305E # HIRAGANA LETTER ZO
+0x82BD U+305F # HIRAGANA LETTER TA
+0x82BE U+3060 # HIRAGANA LETTER DA
+0x82BF U+3061 # HIRAGANA LETTER TI
+0x82C0 U+3062 # HIRAGANA LETTER DI
+0x82C1 U+3063 # HIRAGANA LETTER SMALL TU
+0x82C2 U+3064 # HIRAGANA LETTER TU
+0x82C3 U+3065 # HIRAGANA LETTER DU
+0x82C4 U+3066 # HIRAGANA LETTER TE
+0x82C5 U+3067 # HIRAGANA LETTER DE
+0x82C6 U+3068 # HIRAGANA LETTER TO
+0x82C7 U+3069 # HIRAGANA LETTER DO
+0x82C8 U+306A # HIRAGANA LETTER NA
+0x82C9 U+306B # HIRAGANA LETTER NI
+0x82CA U+306C # HIRAGANA LETTER NU
+0x82CB U+306D # HIRAGANA LETTER NE
+0x82CC U+306E # HIRAGANA LETTER NO
+0x82CD U+306F # HIRAGANA LETTER HA
+0x82CE U+3070 # HIRAGANA LETTER BA
+0x82CF U+3071 # HIRAGANA LETTER PA
+0x82D0 U+3072 # HIRAGANA LETTER HI
+0x82D1 U+3073 # HIRAGANA LETTER BI
+0x82D2 U+3074 # HIRAGANA LETTER PI
+0x82D3 U+3075 # HIRAGANA LETTER HU
+0x82D4 U+3076 # HIRAGANA LETTER BU
+0x82D5 U+3077 # HIRAGANA LETTER PU
+0x82D6 U+3078 # HIRAGANA LETTER HE
+0x82D7 U+3079 # HIRAGANA LETTER BE
+0x82D8 U+307A # HIRAGANA LETTER PE
+0x82D9 U+307B # HIRAGANA LETTER HO
+0x82DA U+307C # HIRAGANA LETTER BO
+0x82DB U+307D # HIRAGANA LETTER PO
+0x82DC U+307E # HIRAGANA LETTER MA
+0x82DD U+307F # HIRAGANA LETTER MI
+0x82DE U+3080 # HIRAGANA LETTER MU
+0x82DF U+3081 # HIRAGANA LETTER ME
+0x82E0 U+3082 # HIRAGANA LETTER MO
+0x82E1 U+3083 # HIRAGANA LETTER SMALL YA
+0x82E2 U+3084 # HIRAGANA LETTER YA
+0x82E3 U+3085 # HIRAGANA LETTER SMALL YU
+0x82E4 U+3086 # HIRAGANA LETTER YU
+0x82E5 U+3087 # HIRAGANA LETTER SMALL YO
+0x82E6 U+3088 # HIRAGANA LETTER YO
+0x82E7 U+3089 # HIRAGANA LETTER RA
+0x82E8 U+308A # HIRAGANA LETTER RI
+0x82E9 U+308B # HIRAGANA LETTER RU
+0x82EA U+308C # HIRAGANA LETTER RE
+0x82EB U+308D # HIRAGANA LETTER RO
+0x82EC U+308E # HIRAGANA LETTER SMALL WA
+0x82ED U+308F # HIRAGANA LETTER WA
+0x82EE U+3090 # HIRAGANA LETTER WI
+0x82EF U+3091 # HIRAGANA LETTER WE
+0x82F0 U+3092 # HIRAGANA LETTER WO
+0x82F1 U+3093 # HIRAGANA LETTER N
+0x82F2 U+3094 # HIRAGANA LETTER VU [2000]
+0x82F3 U+3095 # HIRAGANA LETTER SMALL KA [2000] [Unicode3.2]
+0x82F4 U+3096 # HIRAGANA LETTER SMALL KE [2000] [Unicode3.2]
+0x82F5 U+304B+309A # [2000]
+0x82F6 U+304D+309A # [2000]
+0x82F7 U+304F+309A # [2000]
+0x82F8 U+3051+309A # [2000]
+0x82F9 U+3053+309A # [2000]
+0x82FA # <reserved>
+0x82FB # <reserved>
+0x82FC # <reserved>
+0x8340 U+30A1 # KATAKANA LETTER SMALL A
+0x8341 U+30A2 # KATAKANA LETTER A
+0x8342 U+30A3 # KATAKANA LETTER SMALL I
+0x8343 U+30A4 # KATAKANA LETTER I
+0x8344 U+30A5 # KATAKANA LETTER SMALL U
+0x8345 U+30A6 # KATAKANA LETTER U
+0x8346 U+30A7 # KATAKANA LETTER SMALL E
+0x8347 U+30A8 # KATAKANA LETTER E
+0x8348 U+30A9 # KATAKANA LETTER SMALL O
+0x8349 U+30AA # KATAKANA LETTER O
+0x834A U+30AB # KATAKANA LETTER KA
+0x834B U+30AC # KATAKANA LETTER GA
+0x834C U+30AD # KATAKANA LETTER KI
+0x834D U+30AE # KATAKANA LETTER GI
+0x834E U+30AF # KATAKANA LETTER KU
+0x834F U+30B0 # KATAKANA LETTER GU
+0x8350 U+30B1 # KATAKANA LETTER KE
+0x8351 U+30B2 # KATAKANA LETTER GE
+0x8352 U+30B3 # KATAKANA LETTER KO
+0x8353 U+30B4 # KATAKANA LETTER GO
+0x8354 U+30B5 # KATAKANA LETTER SA
+0x8355 U+30B6 # KATAKANA LETTER ZA
+0x8356 U+30B7 # KATAKANA LETTER SI
+0x8357 U+30B8 # KATAKANA LETTER ZI
+0x8358 U+30B9 # KATAKANA LETTER SU
+0x8359 U+30BA # KATAKANA LETTER ZU
+0x835A U+30BB # KATAKANA LETTER SE
+0x835B U+30BC # KATAKANA LETTER ZE
+0x835C U+30BD # KATAKANA LETTER SO
+0x835D U+30BE # KATAKANA LETTER ZO
+0x835E U+30BF # KATAKANA LETTER TA
+0x835F U+30C0 # KATAKANA LETTER DA
+0x8360 U+30C1 # KATAKANA LETTER TI
+0x8361 U+30C2 # KATAKANA LETTER DI
+0x8362 U+30C3 # KATAKANA LETTER SMALL TU
+0x8363 U+30C4 # KATAKANA LETTER TU
+0x8364 U+30C5 # KATAKANA LETTER DU
+0x8365 U+30C6 # KATAKANA LETTER TE
+0x8366 U+30C7 # KATAKANA LETTER DE
+0x8367 U+30C8 # KATAKANA LETTER TO
+0x8368 U+30C9 # KATAKANA LETTER DO
+0x8369 U+30CA # KATAKANA LETTER NA
+0x836A U+30CB # KATAKANA LETTER NI
+0x836B U+30CC # KATAKANA LETTER NU
+0x836C U+30CD # KATAKANA LETTER NE
+0x836D U+30CE # KATAKANA LETTER NO
+0x836E U+30CF # KATAKANA LETTER HA
+0x836F U+30D0 # KATAKANA LETTER BA
+0x8370 U+30D1 # KATAKANA LETTER PA
+0x8371 U+30D2 # KATAKANA LETTER HI
+0x8372 U+30D3 # KATAKANA LETTER BI
+0x8373 U+30D4 # KATAKANA LETTER PI
+0x8374 U+30D5 # KATAKANA LETTER HU
+0x8375 U+30D6 # KATAKANA LETTER BU
+0x8376 U+30D7 # KATAKANA LETTER PU
+0x8377 U+30D8 # KATAKANA LETTER HE
+0x8378 U+30D9 # KATAKANA LETTER BE
+0x8379 U+30DA # KATAKANA LETTER PE
+0x837A U+30DB # KATAKANA LETTER HO
+0x837B U+30DC # KATAKANA LETTER BO
+0x837C U+30DD # KATAKANA LETTER PO
+0x837D U+30DE # KATAKANA LETTER MA
+0x837E U+30DF # KATAKANA LETTER MI
+0x8380 U+30E0 # KATAKANA LETTER MU
+0x8381 U+30E1 # KATAKANA LETTER ME
+0x8382 U+30E2 # KATAKANA LETTER MO
+0x8383 U+30E3 # KATAKANA LETTER SMALL YA
+0x8384 U+30E4 # KATAKANA LETTER YA
+0x8385 U+30E5 # KATAKANA LETTER SMALL YU
+0x8386 U+30E6 # KATAKANA LETTER YU
+0x8387 U+30E7 # KATAKANA LETTER SMALL YO
+0x8388 U+30E8 # KATAKANA LETTER YO
+0x8389 U+30E9 # KATAKANA LETTER RA
+0x838A U+30EA # KATAKANA LETTER RI
+0x838B U+30EB # KATAKANA LETTER RU
+0x838C U+30EC # KATAKANA LETTER RE
+0x838D U+30ED # KATAKANA LETTER RO
+0x838E U+30EE # KATAKANA LETTER SMALL WA
+0x838F U+30EF # KATAKANA LETTER WA
+0x8390 U+30F0 # KATAKANA LETTER WI
+0x8391 U+30F1 # KATAKANA LETTER WE
+0x8392 U+30F2 # KATAKANA LETTER WO
+0x8393 U+30F3 # KATAKANA LETTER N
+0x8394 U+30F4 # KATAKANA LETTER VU
+0x8395 U+30F5 # KATAKANA LETTER SMALL KA
+0x8396 U+30F6 # KATAKANA LETTER SMALL KE
+0x8397 U+30AB+309A # [2000]
+0x8398 U+30AD+309A # [2000]
+0x8399 U+30AF+309A # [2000]
+0x839A U+30B1+309A # [2000]
+0x839B U+30B3+309A # [2000]
+0x839C U+30BB+309A # [2000]
+0x839D U+30C4+309A # [2000]
+0x839E U+30C8+309A # [2000]
+0x839F U+0391 # GREEK CAPITAL LETTER ALPHA
+0x83A0 U+0392 # GREEK CAPITAL LETTER BETA
+0x83A1 U+0393 # GREEK CAPITAL LETTER GAMMA
+0x83A2 U+0394 # GREEK CAPITAL LETTER DELTA
+0x83A3 U+0395 # GREEK CAPITAL LETTER EPSILON
+0x83A4 U+0396 # GREEK CAPITAL LETTER ZETA
+0x83A5 U+0397 # GREEK CAPITAL LETTER ETA
+0x83A6 U+0398 # GREEK CAPITAL LETTER THETA
+0x83A7 U+0399 # GREEK CAPITAL LETTER IOTA
+0x83A8 U+039A # GREEK CAPITAL LETTER KAPPA
+0x83A9 U+039B # GREEK CAPITAL LETTER LAMDA
+0x83AA U+039C # GREEK CAPITAL LETTER MU
+0x83AB U+039D # GREEK CAPITAL LETTER NU
+0x83AC U+039E # GREEK CAPITAL LETTER XI
+0x83AD U+039F # GREEK CAPITAL LETTER OMICRON
+0x83AE U+03A0 # GREEK CAPITAL LETTER PI
+0x83AF U+03A1 # GREEK CAPITAL LETTER RHO
+0x83B0 U+03A3 # GREEK CAPITAL LETTER SIGMA
+0x83B1 U+03A4 # GREEK CAPITAL LETTER TAU
+0x83B2 U+03A5 # GREEK CAPITAL LETTER UPSILON
+0x83B3 U+03A6 # GREEK CAPITAL LETTER PHI
+0x83B4 U+03A7 # GREEK CAPITAL LETTER CHI
+0x83B5 U+03A8 # GREEK CAPITAL LETTER PSI
+0x83B6 U+03A9 # GREEK CAPITAL LETTER OMEGA
+0x83B7 U+2664 # WHITE SPADE SUIT [2000]
+0x83B8 U+2660 # BLACK SPADE SUIT [2000]
+0x83B9 U+2662 # WHITE DIAMOND SUIT [2000]
+0x83BA U+2666 # BLACK DIAMOND SUIT [2000]
+0x83BB U+2661 # WHITE HEART SUIT [2000]
+0x83BC U+2665 # BLACK HEART SUIT [2000]
+0x83BD U+2667 # WHITE CLUB SUIT [2000]
+0x83BE U+2663 # BLACK CLUB SUIT [2000]
+0x83BF U+03B1 # GREEK SMALL LETTER ALPHA
+0x83C0 U+03B2 # GREEK SMALL LETTER BETA
+0x83C1 U+03B3 # GREEK SMALL LETTER GAMMA
+0x83C2 U+03B4 # GREEK SMALL LETTER DELTA
+0x83C3 U+03B5 # GREEK SMALL LETTER EPSILON
+0x83C4 U+03B6 # GREEK SMALL LETTER ZETA
+0x83C5 U+03B7 # GREEK SMALL LETTER ETA
+0x83C6 U+03B8 # GREEK SMALL LETTER THETA
+0x83C7 U+03B9 # GREEK SMALL LETTER IOTA
+0x83C8 U+03BA # GREEK SMALL LETTER KAPPA
+0x83C9 U+03BB # GREEK SMALL LETTER LAMDA
+0x83CA U+03BC # GREEK SMALL LETTER MU
+0x83CB U+03BD # GREEK SMALL LETTER NU
+0x83CC U+03BE # GREEK SMALL LETTER XI
+0x83CD U+03BF # GREEK SMALL LETTER OMICRON
+0x83CE U+03C0 # GREEK SMALL LETTER PI
+0x83CF U+03C1 # GREEK SMALL LETTER RHO
+0x83D0 U+03C3 # GREEK SMALL LETTER SIGMA
+0x83D1 U+03C4 # GREEK SMALL LETTER TAU
+0x83D2 U+03C5 # GREEK SMALL LETTER UPSILON
+0x83D3 U+03C6 # GREEK SMALL LETTER PHI
+0x83D4 U+03C7 # GREEK SMALL LETTER CHI
+0x83D5 U+03C8 # GREEK SMALL LETTER PSI
+0x83D6 U+03C9 # GREEK SMALL LETTER OMEGA
+0x83D7 U+03C2 # GREEK SMALL LETTER FINAL SIGMA [2000]
+0x83D8 U+24F5 # DOUBLE CIRCLED DIGIT ONE [2000] [Unicode3.2]
+0x83D9 U+24F6 # DOUBLE CIRCLED DIGIT TWO [2000] [Unicode3.2]
+0x83DA U+24F7 # DOUBLE CIRCLED DIGIT THREE [2000] [Unicode3.2]
+0x83DB U+24F8 # DOUBLE CIRCLED DIGIT FOUR [2000] [Unicode3.2]
+0x83DC U+24F9 # DOUBLE CIRCLED DIGIT FIVE [2000] [Unicode3.2]
+0x83DD U+24FA # DOUBLE CIRCLED DIGIT SIX [2000] [Unicode3.2]
+0x83DE U+24FB # DOUBLE CIRCLED DIGIT SEVEN [2000] [Unicode3.2]
+0x83DF U+24FC # DOUBLE CIRCLED DIGIT EIGHT [2000] [Unicode3.2]
+0x83E0 U+24FD # DOUBLE CIRCLED DIGIT NINE [2000] [Unicode3.2]
+0x83E1 U+24FE # DOUBLE CIRCLED NUMBER TEN [2000] [Unicode3.2]
+0x83E2 U+2616 # WHITE SHOGI PIECE [2000] [Unicode3.2]
+0x83E3 U+2617 # BLACK SHOGI PIECE [2000] [Unicode3.2]
+0x83E4 U+3020 # POSTAL MARK FACE [2000]
+0x83E5 U+260E # BLACK TELEPHONE [2000]
+0x83E6 U+2600 # BLACK SUN WITH RAYS [2000]
+0x83E7 U+2601 # CLOUD [2000]
+0x83E8 U+2602 # UMBRELLA [2000]
+0x83E9 U+2603 # SNOWMAN [2000]
+0x83EA U+2668 # HOT SPRINGS [2000]
+0x83EB U+25B1 # WHITE PARALLELOGRAM [2000]
+0x83EC U+31F0 # KATAKANA LETTER SMALL KU [2000] [Unicode3.2]
+0x83ED U+31F1 # KATAKANA LETTER SMALL SI [2000] [Unicode3.2]
+0x83EE U+31F2 # KATAKANA LETTER SMALL SU [2000] [Unicode3.2]
+0x83EF U+31F3 # KATAKANA LETTER SMALL TO [2000] [Unicode3.2]
+0x83F0 U+31F4 # KATAKANA LETTER SMALL NU [2000] [Unicode3.2]
+0x83F1 U+31F5 # KATAKANA LETTER SMALL HA [2000] [Unicode3.2]
+0x83F2 U+31F6 # KATAKANA LETTER SMALL HI [2000] [Unicode3.2]
+0x83F3 U+31F7 # KATAKANA LETTER SMALL HU [2000] [Unicode3.2]
+0x83F4 U+31F8 # KATAKANA LETTER SMALL HE [2000] [Unicode3.2]
+0x83F5 U+31F9 # KATAKANA LETTER SMALL HO [2000] [Unicode3.2]
+0x83F6 U+31F7+309A # [2000]
+0x83F7 U+31FA # KATAKANA LETTER SMALL MU [2000] [Unicode3.2]
+0x83F8 U+31FB # KATAKANA LETTER SMALL RA [2000] [Unicode3.2]
+0x83F9 U+31FC # KATAKANA LETTER SMALL RI [2000] [Unicode3.2]
+0x83FA U+31FD # KATAKANA LETTER SMALL RU [2000] [Unicode3.2]
+0x83FB U+31FE # KATAKANA LETTER SMALL RE [2000] [Unicode3.2]
+0x83FC U+31FF # KATAKANA LETTER SMALL RO [2000] [Unicode3.2]
+0x8440 U+0410 # CYRILLIC CAPITAL LETTER A
+0x8441 U+0411 # CYRILLIC CAPITAL LETTER BE
+0x8442 U+0412 # CYRILLIC CAPITAL LETTER VE
+0x8443 U+0413 # CYRILLIC CAPITAL LETTER GHE
+0x8444 U+0414 # CYRILLIC CAPITAL LETTER DE
+0x8445 U+0415 # CYRILLIC CAPITAL LETTER IE
+0x8446 U+0401 # CYRILLIC CAPITAL LETTER IO
+0x8447 U+0416 # CYRILLIC CAPITAL LETTER ZHE
+0x8448 U+0417 # CYRILLIC CAPITAL LETTER ZE
+0x8449 U+0418 # CYRILLIC CAPITAL LETTER I
+0x844A U+0419 # CYRILLIC CAPITAL LETTER SHORT I
+0x844B U+041A # CYRILLIC CAPITAL LETTER KA
+0x844C U+041B # CYRILLIC CAPITAL LETTER EL
+0x844D U+041C # CYRILLIC CAPITAL LETTER EM
+0x844E U+041D # CYRILLIC CAPITAL LETTER EN
+0x844F U+041E # CYRILLIC CAPITAL LETTER O
+0x8450 U+041F # CYRILLIC CAPITAL LETTER PE
+0x8451 U+0420 # CYRILLIC CAPITAL LETTER ER
+0x8452 U+0421 # CYRILLIC CAPITAL LETTER ES
+0x8453 U+0422 # CYRILLIC CAPITAL LETTER TE
+0x8454 U+0423 # CYRILLIC CAPITAL LETTER U
+0x8455 U+0424 # CYRILLIC CAPITAL LETTER EF
+0x8456 U+0425 # CYRILLIC CAPITAL LETTER HA
+0x8457 U+0426 # CYRILLIC CAPITAL LETTER TSE
+0x8458 U+0427 # CYRILLIC CAPITAL LETTER CHE
+0x8459 U+0428 # CYRILLIC CAPITAL LETTER SHA
+0x845A U+0429 # CYRILLIC CAPITAL LETTER SHCHA
+0x845B U+042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C U+042B # CYRILLIC CAPITAL LETTER YERU
+0x845D U+042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E U+042D # CYRILLIC CAPITAL LETTER E
+0x845F U+042E # CYRILLIC CAPITAL LETTER YU
+0x8460 U+042F # CYRILLIC CAPITAL LETTER YA
+0x8461 U+23BE # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT [2000] [Unicode3.2]
+0x8462 U+23BF # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT [2000] [Unicode3.2]
+0x8463 U+23C0 # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE [2000] [Unicode3.2]
+0x8464 U+23C1 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2]
+0x8465 U+23C2 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2]
+0x8466 U+23C3 # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE [2000] [Unicode3.2]
+0x8467 U+23C4 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2]
+0x8468 U+23C5 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2]
+0x8469 U+23C6 # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE [2000] [Unicode3.2]
+0x846A U+23C7 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE [2000] [Unicode3.2]
+0x846B U+23C8 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE [2000] [Unicode3.2]
+0x846C U+23C9 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL [2000] [Unicode3.2]
+0x846D U+23CA # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL [2000] [Unicode3.2]
+0x846E U+23CB # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT [2000] [Unicode3.2]
+0x846F U+23CC # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT [2000] [Unicode3.2]
+0x8470 U+0430 # CYRILLIC SMALL LETTER A
+0x8471 U+0431 # CYRILLIC SMALL LETTER BE
+0x8472 U+0432 # CYRILLIC SMALL LETTER VE
+0x8473 U+0433 # CYRILLIC SMALL LETTER GHE
+0x8474 U+0434 # CYRILLIC SMALL LETTER DE
+0x8475 U+0435 # CYRILLIC SMALL LETTER IE
+0x8476 U+0451 # CYRILLIC SMALL LETTER IO
+0x8477 U+0436 # CYRILLIC SMALL LETTER ZHE
+0x8478 U+0437 # CYRILLIC SMALL LETTER ZE
+0x8479 U+0438 # CYRILLIC SMALL LETTER I
+0x847A U+0439 # CYRILLIC SMALL LETTER SHORT I
+0x847B U+043A # CYRILLIC SMALL LETTER KA
+0x847C U+043B # CYRILLIC SMALL LETTER EL
+0x847D U+043C # CYRILLIC SMALL LETTER EM
+0x847E U+043D # CYRILLIC SMALL LETTER EN
+0x8480 U+043E # CYRILLIC SMALL LETTER O
+0x8481 U+043F # CYRILLIC SMALL LETTER PE
+0x8482 U+0440 # CYRILLIC SMALL LETTER ER
+0x8483 U+0441 # CYRILLIC SMALL LETTER ES
+0x8484 U+0442 # CYRILLIC SMALL LETTER TE
+0x8485 U+0443 # CYRILLIC SMALL LETTER U
+0x8486 U+0444 # CYRILLIC SMALL LETTER EF
+0x8487 U+0445 # CYRILLIC SMALL LETTER HA
+0x8488 U+0446 # CYRILLIC SMALL LETTER TSE
+0x8489 U+0447 # CYRILLIC SMALL LETTER CHE
+0x848A U+0448 # CYRILLIC SMALL LETTER SHA
+0x848B U+0449 # CYRILLIC SMALL LETTER SHCHA
+0x848C U+044A # CYRILLIC SMALL LETTER HARD SIGN
+0x848D U+044B # CYRILLIC SMALL LETTER YERU
+0x848E U+044C # CYRILLIC SMALL LETTER SOFT SIGN
+0x848F U+044D # CYRILLIC SMALL LETTER E
+0x8490 U+044E # CYRILLIC SMALL LETTER YU
+0x8491 U+044F # CYRILLIC SMALL LETTER YA
+0x8492 U+30F7 # KATAKANA LETTER VA [2000]
+0x8493 U+30F8 # KATAKANA LETTER VI [2000]
+0x8494 U+30F9 # KATAKANA LETTER VE [2000]
+0x8495 U+30FA # KATAKANA LETTER VO [2000]
+0x8496 U+22DA # LESS-THAN EQUAL TO OR GREATER-THAN [2000]
+0x8497 U+22DB # GREATER-THAN EQUAL TO OR LESS-THAN [2000]
+0x8498 U+2153 # VULGAR FRACTION ONE THIRD [2000]
+0x8499 U+2154 # VULGAR FRACTION TWO THIRDS [2000]
+0x849A U+2155 # VULGAR FRACTION ONE FIFTH [2000]
+0x849B U+2713 # CHECK MARK [2000]
+0x849C U+2318 # PLACE OF INTEREST SIGN [2000]
+0x849D U+2423 # OPEN BOX [2000]
+0x849E U+23CE # RETURN SYMBOL [2000] [Unicode3.2]
+0x849F U+2500 # BOX DRAWINGS LIGHT HORIZONTAL [1983]
+0x84A0 U+2502 # BOX DRAWINGS LIGHT VERTICAL [1983]
+0x84A1 U+250C # BOX DRAWINGS LIGHT DOWN AND RIGHT [1983]
+0x84A2 U+2510 # BOX DRAWINGS LIGHT DOWN AND LEFT [1983]
+0x84A3 U+2518 # BOX DRAWINGS LIGHT UP AND LEFT [1983]
+0x84A4 U+2514 # BOX DRAWINGS LIGHT UP AND RIGHT [1983]
+0x84A5 U+251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT [1983]
+0x84A6 U+252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL [1983]
+0x84A7 U+2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT [1983]
+0x84A8 U+2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL [1983]
+0x84A9 U+253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL [1983]
+0x84AA U+2501 # BOX DRAWINGS HEAVY HORIZONTAL [1983]
+0x84AB U+2503 # BOX DRAWINGS HEAVY VERTICAL [1983]
+0x84AC U+250F # BOX DRAWINGS HEAVY DOWN AND RIGHT [1983]
+0x84AD U+2513 # BOX DRAWINGS HEAVY DOWN AND LEFT [1983]
+0x84AE U+251B # BOX DRAWINGS HEAVY UP AND LEFT [1983]
+0x84AF U+2517 # BOX DRAWINGS HEAVY UP AND RIGHT [1983]
+0x84B0 U+2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT [1983]
+0x84B1 U+2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL [1983]
+0x84B2 U+252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT [1983]
+0x84B3 U+253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL [1983]
+0x84B4 U+254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL [1983]
+0x84B5 U+2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT [1983]
+0x84B6 U+252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY [1983]
+0x84B7 U+2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT [1983]
+0x84B8 U+2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY [1983]
+0x84B9 U+253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY [1983]
+0x84BA U+251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY [1983]
+0x84BB U+2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT [1983]
+0x84BC U+2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY [1983]
+0x84BD U+2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT [1983]
+0x84BE U+2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT [1983]
+0x84BF U+3251 # CIRCLED NUMBER TWENTY ONE [2000] [Unicode3.2]
+0x84C0 U+3252 # CIRCLED NUMBER TWENTY TWO [2000] [Unicode3.2]
+0x84C1 U+3253 # CIRCLED NUMBER TWENTY THREE [2000] [Unicode3.2]
+0x84C2 U+3254 # CIRCLED NUMBER TWENTY FOUR [2000] [Unicode3.2]
+0x84C3 U+3255 # CIRCLED NUMBER TWENTY FIVE [2000] [Unicode3.2]
+0x84C4 U+3256 # CIRCLED NUMBER TWENTY SIX [2000] [Unicode3.2]
+0x84C5 U+3257 # CIRCLED NUMBER TWENTY SEVEN [2000] [Unicode3.2]
+0x84C6 U+3258 # CIRCLED NUMBER TWENTY EIGHT [2000] [Unicode3.2]
+0x84C7 U+3259 # CIRCLED NUMBER TWENTY NINE [2000] [Unicode3.2]
+0x84C8 U+325A # CIRCLED NUMBER THIRTY [2000] [Unicode3.2]
+0x84C9 U+325B # CIRCLED NUMBER THIRTY ONE [2000] [Unicode3.2]
+0x84CA U+325C # CIRCLED NUMBER THIRTY TWO [2000] [Unicode3.2]
+0x84CB U+325D # CIRCLED NUMBER THIRTY THREE [2000] [Unicode3.2]
+0x84CC U+325E # CIRCLED NUMBER THIRTY FOUR [2000] [Unicode3.2]
+0x84CD U+325F # CIRCLED NUMBER THIRTY FIVE [2000] [Unicode3.2]
+0x84CE U+32B1 # CIRCLED NUMBER THIRTY SIX [2000] [Unicode3.2]
+0x84CF U+32B2 # CIRCLED NUMBER THIRTY SEVEN [2000] [Unicode3.2]
+0x84D0 U+32B3 # CIRCLED NUMBER THIRTY EIGHT [2000] [Unicode3.2]
+0x84D1 U+32B4 # CIRCLED NUMBER THIRTY NINE [2000] [Unicode3.2]
+0x84D2 U+32B5 # CIRCLED NUMBER FORTY [2000] [Unicode3.2]
+0x84D3 U+32B6 # CIRCLED NUMBER FORTY ONE [2000] [Unicode3.2]
+0x84D4 U+32B7 # CIRCLED NUMBER FORTY TWO [2000] [Unicode3.2]
+0x84D5 U+32B8 # CIRCLED NUMBER FORTY THREE [2000] [Unicode3.2]
+0x84D6 U+32B9 # CIRCLED NUMBER FORTY FOUR [2000] [Unicode3.2]
+0x84D7 U+32BA # CIRCLED NUMBER FORTY FIVE [2000] [Unicode3.2]
+0x84D8 U+32BB # CIRCLED NUMBER FORTY SIX [2000] [Unicode3.2]
+0x84D9 U+32BC # CIRCLED NUMBER FORTY SEVEN [2000] [Unicode3.2]
+0x84DA U+32BD # CIRCLED NUMBER FORTY EIGHT [2000] [Unicode3.2]
+0x84DB U+32BE # CIRCLED NUMBER FORTY NINE [2000] [Unicode3.2]
+0x84DC U+32BF # CIRCLED NUMBER FIFTY [2000] [Unicode3.2]
+0x84DD # <reserved>
+0x84DE # <reserved>
+0x84DF # <reserved>
+0x84E0 # <reserved>
+0x84E1 # <reserved>
+0x84E2 # <reserved>
+0x84E3 # <reserved>
+0x84E4 # <reserved>
+0x84E5 U+25D0 # CIRCLE WITH LEFT HALF BLACK [2000]
+0x84E6 U+25D1 # CIRCLE WITH RIGHT HALF BLACK [2000]
+0x84E7 U+25D2 # CIRCLE WITH LOWER HALF BLACK [2000]
+0x84E8 U+25D3 # CIRCLE WITH UPPER HALF BLACK [2000]
+0x84E9 U+203C # DOUBLE EXCLAMATION MARK [2000]
+0x84EA U+2047 # DOUBLE QUESTION MARK [2000] [Unicode3.2]
+0x84EB U+2048 # QUESTION EXCLAMATION MARK [2000]
+0x84EC U+2049 # EXCLAMATION QUESTION MARK [2000]
+0x84ED U+01CD # LATIN CAPITAL LETTER A WITH CARON [2000]
+0x84EE U+01CE # LATIN SMALL LETTER A WITH CARON [2000]
+0x84EF U+01D0 # LATIN SMALL LETTER I WITH CARON [2000]
+0x84F0 U+1E3E # LATIN CAPITAL LETTER M WITH ACUTE [2000]
+0x84F1 U+1E3F # LATIN SMALL LETTER M WITH ACUTE [2000]
+0x84F2 U+01F8 # LATIN CAPITAL LETTER N WITH GRAVE [2000]
+0x84F3 U+01F9 # LATIN SMALL LETTER N WITH GRAVE [2000]
+0x84F4 U+01D1 # LATIN CAPITAL LETTER O WITH CARON [2000]
+0x84F5 U+01D2 # LATIN SMALL LETTER O WITH CARON [2000]
+0x84F6 U+01D4 # LATIN SMALL LETTER U WITH CARON [2000]
+0x84F7 U+01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON [2000]
+0x84F8 U+01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE [2000]
+0x84F9 U+01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON [2000]
+0x84FA U+01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE [2000]
+0x84FB # <reserved>
+0x84FC # <reserved>
+0x8540 U+20AC # EURO SIGN [2000]
+0x8541 U+00A0 # NO-BREAK SPACE [2000]
+0x8542 U+00A1 # INVERTED EXCLAMATION MARK [2000]
+0x8543 U+00A4 # CURRENCY SIGN [2000]
+0x8544 U+00A6 # BROKEN BAR [2000]
+0x8545 U+00A9 # COPYRIGHT SIGN [2000]
+0x8546 U+00AA # FEMININE ORDINAL INDICATOR [2000]
+0x8547 U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK [2000]
+0x8548 U+00AD # SOFT HYPHEN [2000]
+0x8549 U+00AE # REGISTERED SIGN [2000]
+0x854A U+00AF # MACRON [2000]
+0x854B U+00B2 # SUPERSCRIPT TWO [2000]
+0x854C U+00B3 # SUPERSCRIPT THREE [2000]
+0x854D U+00B7 # MIDDLE DOT [2000]
+0x854E U+00B8 # CEDILLA [2000]
+0x854F U+00B9 # SUPERSCRIPT ONE [2000]
+0x8550 U+00BA # MASCULINE ORDINAL INDICATOR [2000]
+0x8551 U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK [2000]
+0x8552 U+00BC # VULGAR FRACTION ONE QUARTER [2000]
+0x8553 U+00BD # VULGAR FRACTION ONE HALF [2000]
+0x8554 U+00BE # VULGAR FRACTION THREE QUARTERS [2000]
+0x8555 U+00BF # INVERTED QUESTION MARK [2000]
+0x8556 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE [2000]
+0x8557 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE [2000]
+0x8558 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX [2000]
+0x8559 U+00C3 # LATIN CAPITAL LETTER A WITH TILDE [2000]
+0x855A U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS [2000]
+0x855B U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE [2000]
+0x855C U+00C6 # LATIN CAPITAL LETTER AE [2000]
+0x855D U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA [2000]
+0x855E U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE [2000]
+0x855F U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE [2000]
+0x8560 U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX [2000]
+0x8561 U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS [2000]
+0x8562 U+00CC # LATIN CAPITAL LETTER I WITH GRAVE [2000]
+0x8563 U+00CD # LATIN CAPITAL LETTER I WITH ACUTE [2000]
+0x8564 U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX [2000]
+0x8565 U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS [2000]
+0x8566 U+00D0 # LATIN CAPITAL LETTER ETH [2000]
+0x8567 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE [2000]
+0x8568 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE [2000]
+0x8569 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE [2000]
+0x856A U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX [2000]
+0x856B U+00D5 # LATIN CAPITAL LETTER O WITH TILDE [2000]
+0x856C U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS [2000]
+0x856D U+00D8 # LATIN CAPITAL LETTER O WITH STROKE [2000]
+0x856E U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE [2000]
+0x856F U+00DA # LATIN CAPITAL LETTER U WITH ACUTE [2000]
+0x8570 U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX [2000]
+0x8571 U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS [2000]
+0x8572 U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE [2000]
+0x8573 U+00DE # LATIN CAPITAL LETTER THORN [2000]
+0x8574 U+00DF # LATIN SMALL LETTER SHARP S [2000]
+0x8575 U+00E0 # LATIN SMALL LETTER A WITH GRAVE [2000]
+0x8576 U+00E1 # LATIN SMALL LETTER A WITH ACUTE [2000]
+0x8577 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX [2000]
+0x8578 U+00E3 # LATIN SMALL LETTER A WITH TILDE [2000]
+0x8579 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS [2000]
+0x857A U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE [2000]
+0x857B U+00E6 # LATIN SMALL LETTER AE [2000]
+0x857C U+00E7 # LATIN SMALL LETTER C WITH CEDILLA [2000]
+0x857D U+00E8 # LATIN SMALL LETTER E WITH GRAVE [2000]
+0x857E U+00E9 # LATIN SMALL LETTER E WITH ACUTE [2000]
+0x8580 U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX [2000]
+0x8581 U+00EB # LATIN SMALL LETTER E WITH DIAERESIS [2000]
+0x8582 U+00EC # LATIN SMALL LETTER I WITH GRAVE [2000]
+0x8583 U+00ED # LATIN SMALL LETTER I WITH ACUTE [2000]
+0x8584 U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX [2000]
+0x8585 U+00EF # LATIN SMALL LETTER I WITH DIAERESIS [2000]
+0x8586 U+00F0 # LATIN SMALL LETTER ETH [2000]
+0x8587 U+00F1 # LATIN SMALL LETTER N WITH TILDE [2000]
+0x8588 U+00F2 # LATIN SMALL LETTER O WITH GRAVE [2000]
+0x8589 U+00F3 # LATIN SMALL LETTER O WITH ACUTE [2000]
+0x858A U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX [2000]
+0x858B U+00F5 # LATIN SMALL LETTER O WITH TILDE [2000]
+0x858C U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS [2000]
+0x858D U+00F8 # LATIN SMALL LETTER O WITH STROKE [2000]
+0x858E U+00F9 # LATIN SMALL LETTER U WITH GRAVE [2000]
+0x858F U+00FA # LATIN SMALL LETTER U WITH ACUTE [2000]
+0x8590 U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX [2000]
+0x8591 U+00FC # LATIN SMALL LETTER U WITH DIAERESIS [2000]
+0x8592 U+00FD # LATIN SMALL LETTER Y WITH ACUTE [2000]
+0x8593 U+00FE # LATIN SMALL LETTER THORN [2000]
+0x8594 U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS [2000]
+0x8595 U+0100 # LATIN CAPITAL LETTER A WITH MACRON [2000]
+0x8596 U+012A # LATIN CAPITAL LETTER I WITH MACRON [2000]
+0x8597 U+016A # LATIN CAPITAL LETTER U WITH MACRON [2000]
+0x8598 U+0112 # LATIN CAPITAL LETTER E WITH MACRON [2000]
+0x8599 U+014C # LATIN CAPITAL LETTER O WITH MACRON [2000]
+0x859A U+0101 # LATIN SMALL LETTER A WITH MACRON [2000]
+0x859B U+012B # LATIN SMALL LETTER I WITH MACRON [2000]
+0x859C U+016B # LATIN SMALL LETTER U WITH MACRON [2000]
+0x859D U+0113 # LATIN SMALL LETTER E WITH MACRON [2000]
+0x859E U+014D # LATIN SMALL LETTER O WITH MACRON [2000]
+0x859F U+0104 # LATIN CAPITAL LETTER A WITH OGONEK [2000]
+0x85A0 U+02D8 # BREVE [2000]
+0x85A1 U+0141 # LATIN CAPITAL LETTER L WITH STROKE [2000]
+0x85A2 U+013D # LATIN CAPITAL LETTER L WITH CARON [2000]
+0x85A3 U+015A # LATIN CAPITAL LETTER S WITH ACUTE [2000]
+0x85A4 U+0160 # LATIN CAPITAL LETTER S WITH CARON [2000]
+0x85A5 U+015E # LATIN CAPITAL LETTER S WITH CEDILLA [2000]
+0x85A6 U+0164 # LATIN CAPITAL LETTER T WITH CARON [2000]
+0x85A7 U+0179 # LATIN CAPITAL LETTER Z WITH ACUTE [2000]
+0x85A8 U+017D # LATIN CAPITAL LETTER Z WITH CARON [2000]
+0x85A9 U+017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE [2000]
+0x85AA U+0105 # LATIN SMALL LETTER A WITH OGONEK [2000]
+0x85AB U+02DB # OGONEK [2000]
+0x85AC U+0142 # LATIN SMALL LETTER L WITH STROKE [2000]
+0x85AD U+013E # LATIN SMALL LETTER L WITH CARON [2000]
+0x85AE U+015B # LATIN SMALL LETTER S WITH ACUTE [2000]
+0x85AF U+02C7 # CARON [2000]
+0x85B0 U+0161 # LATIN SMALL LETTER S WITH CARON [2000]
+0x85B1 U+015F # LATIN SMALL LETTER S WITH CEDILLA [2000]
+0x85B2 U+0165 # LATIN SMALL LETTER T WITH CARON [2000]
+0x85B3 U+017A # LATIN SMALL LETTER Z WITH ACUTE [2000]
+0x85B4 U+02DD # DOUBLE ACUTE ACCENT [2000]
+0x85B5 U+017E # LATIN SMALL LETTER Z WITH CARON [2000]
+0x85B6 U+017C # LATIN SMALL LETTER Z WITH DOT ABOVE [2000]
+0x85B7 U+0154 # LATIN CAPITAL LETTER R WITH ACUTE [2000]
+0x85B8 U+0102 # LATIN CAPITAL LETTER A WITH BREVE [2000]
+0x85B9 U+0139 # LATIN CAPITAL LETTER L WITH ACUTE [2000]
+0x85BA U+0106 # LATIN CAPITAL LETTER C WITH ACUTE [2000]
+0x85BB U+010C # LATIN CAPITAL LETTER C WITH CARON [2000]
+0x85BC U+0118 # LATIN CAPITAL LETTER E WITH OGONEK [2000]
+0x85BD U+011A # LATIN CAPITAL LETTER E WITH CARON [2000]
+0x85BE U+010E # LATIN CAPITAL LETTER D WITH CARON [2000]
+0x85BF U+0143 # LATIN CAPITAL LETTER N WITH ACUTE [2000]
+0x85C0 U+0147 # LATIN CAPITAL LETTER N WITH CARON [2000]
+0x85C1 U+0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE [2000]
+0x85C2 U+0158 # LATIN CAPITAL LETTER R WITH CARON [2000]
+0x85C3 U+016E # LATIN CAPITAL LETTER U WITH RING ABOVE [2000]
+0x85C4 U+0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE [2000]
+0x85C5 U+0162 # LATIN CAPITAL LETTER T WITH CEDILLA [2000]
+0x85C6 U+0155 # LATIN SMALL LETTER R WITH ACUTE [2000]
+0x85C7 U+0103 # LATIN SMALL LETTER A WITH BREVE [2000]
+0x85C8 U+013A # LATIN SMALL LETTER L WITH ACUTE [2000]
+0x85C9 U+0107 # LATIN SMALL LETTER C WITH ACUTE [2000]
+0x85CA U+010D # LATIN SMALL LETTER C WITH CARON [2000]
+0x85CB U+0119 # LATIN SMALL LETTER E WITH OGONEK [2000]
+0x85CC U+011B # LATIN SMALL LETTER E WITH CARON [2000]
+0x85CD U+010F # LATIN SMALL LETTER D WITH CARON [2000]
+0x85CE U+0111 # LATIN SMALL LETTER D WITH STROKE [2000]
+0x85CF U+0144 # LATIN SMALL LETTER N WITH ACUTE [2000]
+0x85D0 U+0148 # LATIN SMALL LETTER N WITH CARON [2000]
+0x85D1 U+0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE [2000]
+0x85D2 U+0159 # LATIN SMALL LETTER R WITH CARON [2000]
+0x85D3 U+016F # LATIN SMALL LETTER U WITH RING ABOVE [2000]
+0x85D4 U+0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE [2000]
+0x85D5 U+0163 # LATIN SMALL LETTER T WITH CEDILLA [2000]
+0x85D6 U+02D9 # DOT ABOVE [2000]
+0x85D7 U+0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX [2000]
+0x85D8 U+011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX [2000]
+0x85D9 U+0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX [2000]
+0x85DA U+0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX [2000]
+0x85DB U+015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX [2000]
+0x85DC U+016C # LATIN CAPITAL LETTER U WITH BREVE [2000]
+0x85DD U+0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX [2000]
+0x85DE U+011D # LATIN SMALL LETTER G WITH CIRCUMFLEX [2000]
+0x85DF U+0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX [2000]
+0x85E0 U+0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX [2000]
+0x85E1 U+015D # LATIN SMALL LETTER S WITH CIRCUMFLEX [2000]
+0x85E2 U+016D # LATIN SMALL LETTER U WITH BREVE [2000]
+0x85E3 U+0271 # LATIN SMALL LETTER M WITH HOOK [2000]
+0x85E4 U+028B # LATIN SMALL LETTER V WITH HOOK [2000]
+0x85E5 U+027E # LATIN SMALL LETTER R WITH FISHHOOK [2000]
+0x85E6 U+0283 # LATIN SMALL LETTER ESH [2000]
+0x85E7 U+0292 # LATIN SMALL LETTER EZH [2000]
+0x85E8 U+026C # LATIN SMALL LETTER L WITH BELT [2000]
+0x85E9 U+026E # LATIN SMALL LETTER LEZH [2000]
+0x85EA U+0279 # LATIN SMALL LETTER TURNED R [2000]
+0x85EB U+0288 # LATIN SMALL LETTER T WITH RETROFLEX HOOK [2000]
+0x85EC U+0256 # LATIN SMALL LETTER D WITH TAIL [2000]
+0x85ED U+0273 # LATIN SMALL LETTER N WITH RETROFLEX HOOK [2000]
+0x85EE U+027D # LATIN SMALL LETTER R WITH TAIL [2000]
+0x85EF U+0282 # LATIN SMALL LETTER S WITH HOOK [2000]
+0x85F0 U+0290 # LATIN SMALL LETTER Z WITH RETROFLEX HOOK [2000]
+0x85F1 U+027B # LATIN SMALL LETTER TURNED R WITH HOOK [2000]
+0x85F2 U+026D # LATIN SMALL LETTER L WITH RETROFLEX HOOK [2000]
+0x85F3 U+025F # LATIN SMALL LETTER DOTLESS J WITH STROKE [2000]
+0x85F4 U+0272 # LATIN SMALL LETTER N WITH LEFT HOOK [2000]
+0x85F5 U+029D # LATIN SMALL LETTER J WITH CROSSED-TAIL [2000]
+0x85F6 U+028E # LATIN SMALL LETTER TURNED Y [2000]
+0x85F7 U+0261 # LATIN SMALL LETTER SCRIPT G [2000]
+0x85F8 U+014B # LATIN SMALL LETTER ENG [2000]
+0x85F9 U+0270 # LATIN SMALL LETTER TURNED M WITH LONG LEG [2000]
+0x85FA U+0281 # LATIN LETTER SMALL CAPITAL INVERTED R [2000]
+0x85FB U+0127 # LATIN SMALL LETTER H WITH STROKE [2000]
+0x85FC U+0295 # LATIN LETTER PHARYNGEAL VOICED FRICATIVE [2000]
+0x8640 U+0294 # LATIN LETTER GLOTTAL STOP [2000]
+0x8641 U+0266 # LATIN SMALL LETTER H WITH HOOK [2000]
+0x8642 U+0298 # LATIN LETTER BILABIAL CLICK [2000]
+0x8643 U+01C2 # LATIN LETTER ALVEOLAR CLICK [2000]
+0x8644 U+0253 # LATIN SMALL LETTER B WITH HOOK [2000]
+0x8645 U+0257 # LATIN SMALL LETTER D WITH HOOK [2000]
+0x8646 U+0284 # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK [2000]
+0x8647 U+0260 # LATIN SMALL LETTER G WITH HOOK [2000]
+0x8648 U+0193 # LATIN CAPITAL LETTER G WITH HOOK [2000]
+0x8649 U+0153 # LATIN SMALL LIGATURE OE [2000]
+0x864A U+0152 # LATIN CAPITAL LIGATURE OE [2000]
+0x864B U+0268 # LATIN SMALL LETTER I WITH STROKE [2000]
+0x864C U+0289 # LATIN SMALL LETTER U BAR [2000]
+0x864D U+0258 # LATIN SMALL LETTER REVERSED E [2000]
+0x864E U+0275 # LATIN SMALL LETTER BARRED O [2000]
+0x864F U+0259 # LATIN SMALL LETTER SCHWA [2000]
+0x8650 U+025C # LATIN SMALL LETTER REVERSED OPEN E [2000]
+0x8651 U+025E # LATIN SMALL LETTER CLOSED REVERSED OPEN E [2000]
+0x8652 U+0250 # LATIN SMALL LETTER TURNED A [2000]
+0x8653 U+026F # LATIN SMALL LETTER TURNED M [2000]
+0x8654 U+028A # LATIN SMALL LETTER UPSILON [2000]
+0x8655 U+0264 # LATIN SMALL LETTER RAMS HORN [2000]
+0x8656 U+028C # LATIN SMALL LETTER TURNED V [2000]
+0x8657 U+0254 # LATIN SMALL LETTER OPEN O [2000]
+0x8658 U+0251 # LATIN SMALL LETTER ALPHA [2000]
+0x8659 U+0252 # LATIN SMALL LETTER TURNED ALPHA [2000]
+0x865A U+028D # LATIN SMALL LETTER TURNED W [2000]
+0x865B U+0265 # LATIN SMALL LETTER TURNED H [2000]
+0x865C U+02A2 # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE [2000]
+0x865D U+02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE [2000]
+0x865E U+0255 # LATIN SMALL LETTER C WITH CURL [2000]
+0x865F U+0291 # LATIN SMALL LETTER Z WITH CURL [2000]
+0x8660 U+027A # LATIN SMALL LETTER TURNED R WITH LONG LEG [2000]
+0x8661 U+0267 # LATIN SMALL LETTER HENG WITH HOOK [2000]
+0x8662 U+025A # LATIN SMALL LETTER SCHWA WITH HOOK [2000]
+0x8663 U+00E6+0300 # [2000]
+0x8664 U+01FD # LATIN SMALL LETTER AE WITH ACUTE [2000]
+0x8665 U+1F70 # GREEK SMALL LETTER ALPHA WITH VARIA [2000]
+0x8666 U+1F71 # GREEK SMALL LETTER ALPHA WITH OXIA [2000]
+0x8667 U+0254+0300 # [2000]
+0x8668 U+0254+0301 # [2000]
+0x8669 U+028C+0300 # [2000]
+0x866A U+028C+0301 # [2000]
+0x866B U+0259+0300 # [2000]
+0x866C U+0259+0301 # [2000]
+0x866D U+025A+0300 # [2000]
+0x866E U+025A+0301 # [2000]
+0x866F U+1F72 # GREEK SMALL LETTER EPSILON WITH VARIA [2000]
+0x8670 U+1F73 # GREEK SMALL LETTER EPSILON WITH OXIA [2000]
+0x8671 U+0361 # COMBINING DOUBLE INVERTED BREVE [2000]
+0x8672 U+02C8 # MODIFIER LETTER VERTICAL LINE [2000]
+0x8673 U+02CC # MODIFIER LETTER LOW VERTICAL LINE [2000]
+0x8674 U+02D0 # MODIFIER LETTER TRIANGULAR COLON [2000]
+0x8675 U+02D1 # MODIFIER LETTER HALF TRIANGULAR COLON [2000]
+0x8676 U+0306 # COMBINING BREVE [2000]
+0x8677 U+203F # UNDERTIE [2000]
+0x8678 U+030B # COMBINING DOUBLE ACUTE ACCENT [2000]
+0x8679 U+0301 # COMBINING ACUTE ACCENT [2000]
+0x867A U+0304 # COMBINING MACRON [2000]
+0x867B U+0300 # COMBINING GRAVE ACCENT [2000]
+0x867C U+030F # COMBINING DOUBLE GRAVE ACCENT [2000]
+0x867D U+030C # COMBINING CARON [2000]
+0x867E U+0302 # COMBINING CIRCUMFLEX ACCENT [2000]
+0x8680 U+02E5 # MODIFIER LETTER EXTRA-HIGH TONE BAR [2000]
+0x8681 U+02E6 # MODIFIER LETTER HIGH TONE BAR [2000]
+0x8682 U+02E7 # MODIFIER LETTER MID TONE BAR [2000]
+0x8683 U+02E8 # MODIFIER LETTER LOW TONE BAR [2000]
+0x8684 U+02E9 # MODIFIER LETTER EXTRA-LOW TONE BAR [2000]
+0x8685 U+02E9+02E5 # [2000]
+0x8686 U+02E5+02E9 # [2000]
+0x8687 U+0325 # COMBINING RING BELOW [2000]
+0x8688 U+032C # COMBINING CARON BELOW [2000]
+0x8689 U+0339 # COMBINING RIGHT HALF RING BELOW [2000]
+0x868A U+031C # COMBINING LEFT HALF RING BELOW [2000]
+0x868B U+031F # COMBINING PLUS SIGN BELOW [2000]
+0x868C U+0320 # COMBINING MINUS SIGN BELOW [2000]
+0x868D U+0308 # COMBINING DIAERESIS [2000]
+0x868E U+033D # COMBINING X ABOVE [2000]
+0x868F U+0329 # COMBINING VERTICAL LINE BELOW [2000]
+0x8690 U+032F # COMBINING INVERTED BREVE BELOW [2000]
+0x8691 U+02DE # MODIFIER LETTER RHOTIC HOOK [2000]
+0x8692 U+0324 # COMBINING DIAERESIS BELOW [2000]
+0x8693 U+0330 # COMBINING TILDE BELOW [2000]
+0x8694 U+033C # COMBINING SEAGULL BELOW [2000]
+0x8695 U+0334 # COMBINING TILDE OVERLAY [2000]
+0x8696 U+031D # COMBINING UP TACK BELOW [2000]
+0x8697 U+031E # COMBINING DOWN TACK BELOW [2000]
+0x8698 U+0318 # COMBINING LEFT TACK BELOW [2000]
+0x8699 U+0319 # COMBINING RIGHT TACK BELOW [2000]
+0x869A U+032A # COMBINING BRIDGE BELOW [2000]
+0x869B U+033A # COMBINING INVERTED BRIDGE BELOW [2000]
+0x869C U+033B # COMBINING SQUARE BELOW [2000]
+0x869D U+0303 # COMBINING TILDE [2000]
+0x869E U+031A # COMBINING LEFT ANGLE ABOVE [2000]
+0x869F U+2776 # DINGBAT NEGATIVE CIRCLED DIGIT ONE [2000]
+0x86A0 U+2777 # DINGBAT NEGATIVE CIRCLED DIGIT TWO [2000]
+0x86A1 U+2778 # DINGBAT NEGATIVE CIRCLED DIGIT THREE [2000]
+0x86A2 U+2779 # DINGBAT NEGATIVE CIRCLED DIGIT FOUR [2000]
+0x86A3 U+277A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE [2000]
+0x86A4 U+277B # DINGBAT NEGATIVE CIRCLED DIGIT SIX [2000]
+0x86A5 U+277C # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN [2000]
+0x86A6 U+277D # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT [2000]
+0x86A7 U+277E # DINGBAT NEGATIVE CIRCLED DIGIT NINE [2000]
+0x86A8 U+277F # DINGBAT NEGATIVE CIRCLED NUMBER TEN [2000]
+0x86A9 U+24EB # NEGATIVE CIRCLED NUMBER ELEVEN [2000] [Unicode3.2]
+0x86AA U+24EC # NEGATIVE CIRCLED NUMBER TWELVE [2000] [Unicode3.2]
+0x86AB U+24ED # NEGATIVE CIRCLED NUMBER THIRTEEN [2000] [Unicode3.2]
+0x86AC U+24EE # NEGATIVE CIRCLED NUMBER FOURTEEN [2000] [Unicode3.2]
+0x86AD U+24EF # NEGATIVE CIRCLED NUMBER FIFTEEN [2000] [Unicode3.2]
+0x86AE U+24F0 # NEGATIVE CIRCLED NUMBER SIXTEEN [2000] [Unicode3.2]
+0x86AF U+24F1 # NEGATIVE CIRCLED NUMBER SEVENTEEN [2000] [Unicode3.2]
+0x86B0 U+24F2 # NEGATIVE CIRCLED NUMBER EIGHTEEN [2000] [Unicode3.2]
+0x86B1 U+24F3 # NEGATIVE CIRCLED NUMBER NINETEEN [2000] [Unicode3.2]
+0x86B2 U+24F4 # NEGATIVE CIRCLED NUMBER TWENTY [2000] [Unicode3.2]
+0x86B3 U+2170 # SMALL ROMAN NUMERAL ONE [2000]
+0x86B4 U+2171 # SMALL ROMAN NUMERAL TWO [2000]
+0x86B5 U+2172 # SMALL ROMAN NUMERAL THREE [2000]
+0x86B6 U+2173 # SMALL ROMAN NUMERAL FOUR [2000]
+0x86B7 U+2174 # SMALL ROMAN NUMERAL FIVE [2000]
+0x86B8 U+2175 # SMALL ROMAN NUMERAL SIX [2000]
+0x86B9 U+2176 # SMALL ROMAN NUMERAL SEVEN [2000]
+0x86BA U+2177 # SMALL ROMAN NUMERAL EIGHT [2000]
+0x86BB U+2178 # SMALL ROMAN NUMERAL NINE [2000]
+0x86BC U+2179 # SMALL ROMAN NUMERAL TEN [2000]
+0x86BD U+217A # SMALL ROMAN NUMERAL ELEVEN [2000]
+0x86BE U+217B # SMALL ROMAN NUMERAL TWELVE [2000]
+0x86BF U+24D0 # CIRCLED LATIN SMALL LETTER A [2000]
+0x86C0 U+24D1 # CIRCLED LATIN SMALL LETTER B [2000]
+0x86C1 U+24D2 # CIRCLED LATIN SMALL LETTER C [2000]
+0x86C2 U+24D3 # CIRCLED LATIN SMALL LETTER D [2000]
+0x86C3 U+24D4 # CIRCLED LATIN SMALL LETTER E [2000]
+0x86C4 U+24D5 # CIRCLED LATIN SMALL LETTER F [2000]
+0x86C5 U+24D6 # CIRCLED LATIN SMALL LETTER G [2000]
+0x86C6 U+24D7 # CIRCLED LATIN SMALL LETTER H [2000]
+0x86C7 U+24D8 # CIRCLED LATIN SMALL LETTER I [2000]
+0x86C8 U+24D9 # CIRCLED LATIN SMALL LETTER J [2000]
+0x86C9 U+24DA # CIRCLED LATIN SMALL LETTER K [2000]
+0x86CA U+24DB # CIRCLED LATIN SMALL LETTER L [2000]
+0x86CB U+24DC # CIRCLED LATIN SMALL LETTER M [2000]
+0x86CC U+24DD # CIRCLED LATIN SMALL LETTER N [2000]
+0x86CD U+24DE # CIRCLED LATIN SMALL LETTER O [2000]
+0x86CE U+24DF # CIRCLED LATIN SMALL LETTER P [2000]
+0x86CF U+24E0 # CIRCLED LATIN SMALL LETTER Q [2000]
+0x86D0 U+24E1 # CIRCLED LATIN SMALL LETTER R [2000]
+0x86D1 U+24E2 # CIRCLED LATIN SMALL LETTER S [2000]
+0x86D2 U+24E3 # CIRCLED LATIN SMALL LETTER T [2000]
+0x86D3 U+24E4 # CIRCLED LATIN SMALL LETTER U [2000]
+0x86D4 U+24E5 # CIRCLED LATIN SMALL LETTER V [2000]
+0x86D5 U+24E6 # CIRCLED LATIN SMALL LETTER W [2000]
+0x86D6 U+24E7 # CIRCLED LATIN SMALL LETTER X [2000]
+0x86D7 U+24E8 # CIRCLED LATIN SMALL LETTER Y [2000]
+0x86D8 U+24E9 # CIRCLED LATIN SMALL LETTER Z [2000]
+0x86D9 U+32D0 # CIRCLED KATAKANA A [2000]
+0x86DA U+32D1 # CIRCLED KATAKANA I [2000]
+0x86DB U+32D2 # CIRCLED KATAKANA U [2000]
+0x86DC U+32D3 # CIRCLED KATAKANA E [2000]
+0x86DD U+32D4 # CIRCLED KATAKANA O [2000]
+0x86DE U+32D5 # CIRCLED KATAKANA KA [2000]
+0x86DF U+32D6 # CIRCLED KATAKANA KI [2000]
+0x86E0 U+32D7 # CIRCLED KATAKANA KU [2000]
+0x86E1 U+32D8 # CIRCLED KATAKANA KE [2000]
+0x86E2 U+32D9 # CIRCLED KATAKANA KO [2000]
+0x86E3 U+32DA # CIRCLED KATAKANA SA [2000]
+0x86E4 U+32DB # CIRCLED KATAKANA SI [2000]
+0x86E5 U+32DC # CIRCLED KATAKANA SU [2000]
+0x86E6 U+32DD # CIRCLED KATAKANA SE [2000]
+0x86E7 U+32DE # CIRCLED KATAKANA SO [2000]
+0x86E8 U+32DF # CIRCLED KATAKANA TA [2000]
+0x86E9 U+32E0 # CIRCLED KATAKANA TI [2000]
+0x86EA U+32E1 # CIRCLED KATAKANA TU [2000]
+0x86EB U+32E2 # CIRCLED KATAKANA TE [2000]
+0x86EC U+32E3 # CIRCLED KATAKANA TO [2000]
+0x86ED U+32FA # CIRCLED KATAKANA RO [2000]
+0x86EE U+32E9 # CIRCLED KATAKANA HA [2000]
+0x86EF U+32E5 # CIRCLED KATAKANA NI [2000]
+0x86F0 U+32ED # CIRCLED KATAKANA HO [2000]
+0x86F1 U+32EC # CIRCLED KATAKANA HE [2000]
+0x86F2 # <reserved>
+0x86F3 # <reserved>
+0x86F4 # <reserved>
+0x86F5 # <reserved>
+0x86F6 # <reserved>
+0x86F7 # <reserved>
+0x86F8 # <reserved>
+0x86F9 # <reserved>
+0x86FA # <reserved>
+0x86FB U+2051 # TWO ASTERISKS ALIGNED VERTICALLY [2000] [Unicode3.2]
+0x86FC U+2042 # ASTERISM [2000]
+0x8740 U+2460 # CIRCLED DIGIT ONE [2000]
+0x8741 U+2461 # CIRCLED DIGIT TWO [2000]
+0x8742 U+2462 # CIRCLED DIGIT THREE [2000]
+0x8743 U+2463 # CIRCLED DIGIT FOUR [2000]
+0x8744 U+2464 # CIRCLED DIGIT FIVE [2000]
+0x8745 U+2465 # CIRCLED DIGIT SIX [2000]
+0x8746 U+2466 # CIRCLED DIGIT SEVEN [2000]
+0x8747 U+2467 # CIRCLED DIGIT EIGHT [2000]
+0x8748 U+2468 # CIRCLED DIGIT NINE [2000]
+0x8749 U+2469 # CIRCLED NUMBER TEN [2000]
+0x874A U+246A # CIRCLED NUMBER ELEVEN [2000]
+0x874B U+246B # CIRCLED NUMBER TWELVE [2000]
+0x874C U+246C # CIRCLED NUMBER THIRTEEN [2000]
+0x874D U+246D # CIRCLED NUMBER FOURTEEN [2000]
+0x874E U+246E # CIRCLED NUMBER FIFTEEN [2000]
+0x874F U+246F # CIRCLED NUMBER SIXTEEN [2000]
+0x8750 U+2470 # CIRCLED NUMBER SEVENTEEN [2000]
+0x8751 U+2471 # CIRCLED NUMBER EIGHTEEN [2000]
+0x8752 U+2472 # CIRCLED NUMBER NINETEEN [2000]
+0x8753 U+2473 # CIRCLED NUMBER TWENTY [2000]
+0x8754 U+2160 # ROMAN NUMERAL ONE [2000]
+0x8755 U+2161 # ROMAN NUMERAL TWO [2000]
+0x8756 U+2162 # ROMAN NUMERAL THREE [2000]
+0x8757 U+2163 # ROMAN NUMERAL FOUR [2000]
+0x8758 U+2164 # ROMAN NUMERAL FIVE [2000]
+0x8759 U+2165 # ROMAN NUMERAL SIX [2000]
+0x875A U+2166 # ROMAN NUMERAL SEVEN [2000]
+0x875B U+2167 # ROMAN NUMERAL EIGHT [2000]
+0x875C U+2168 # ROMAN NUMERAL NINE [2000]
+0x875D U+2169 # ROMAN NUMERAL TEN [2000]
+0x875E U+216A # ROMAN NUMERAL ELEVEN [2000]
+0x875F U+3349 # SQUARE MIRI [2000]
+0x8760 U+3314 # SQUARE KIRO [2000]
+0x8761 U+3322 # SQUARE SENTI [2000]
+0x8762 U+334D # SQUARE MEETORU [2000]
+0x8763 U+3318 # SQUARE GURAMU [2000]
+0x8764 U+3327 # SQUARE TON [2000]
+0x8765 U+3303 # SQUARE AARU [2000]
+0x8766 U+3336 # SQUARE HEKUTAARU [2000]
+0x8767 U+3351 # SQUARE RITTORU [2000]
+0x8768 U+3357 # SQUARE WATTO [2000]
+0x8769 U+330D # SQUARE KARORII [2000]
+0x876A U+3326 # SQUARE DORU [2000]
+0x876B U+3323 # SQUARE SENTO [2000]
+0x876C U+332B # SQUARE PAASENTO [2000]
+0x876D U+334A # SQUARE MIRIBAARU [2000]
+0x876E U+333B # SQUARE PEEZI [2000]
+0x876F U+339C # SQUARE MM [2000]
+0x8770 U+339D # SQUARE CM [2000]
+0x8771 U+339E # SQUARE KM [2000]
+0x8772 U+338E # SQUARE MG [2000]
+0x8773 U+338F # SQUARE KG [2000]
+0x8774 U+33C4 # SQUARE CC [2000]
+0x8775 U+33A1 # SQUARE M SQUARED [2000]
+0x8776 U+216B # ROMAN NUMERAL TWELVE [2000]
+0x8777 # <reserved>
+0x8778 # <reserved>
+0x8779 # <reserved>
+0x877A # <reserved>
+0x877B # <reserved>
+0x877C # <reserved>
+0x877D # <reserved>
+0x877E U+337B # SQUARE ERA NAME HEISEI [2000]
+0x8780 U+301D # REVERSED DOUBLE PRIME QUOTATION MARK [2000]
+0x8781 U+301F # LOW DOUBLE PRIME QUOTATION MARK [2000]
+0x8782 U+2116 # NUMERO SIGN [2000]
+0x8783 U+33CD # SQUARE KK [2000]
+0x8784 U+2121 # TELEPHONE SIGN [2000]
+0x8785 U+32A4 # CIRCLED IDEOGRAPH HIGH [2000]
+0x8786 U+32A5 # CIRCLED IDEOGRAPH CENTRE [2000]
+0x8787 U+32A6 # CIRCLED IDEOGRAPH LOW [2000]
+0x8788 U+32A7 # CIRCLED IDEOGRAPH LEFT [2000]
+0x8789 U+32A8 # CIRCLED IDEOGRAPH RIGHT [2000]
+0x878A U+3231 # PARENTHESIZED IDEOGRAPH STOCK [2000]
+0x878B U+3232 # PARENTHESIZED IDEOGRAPH HAVE [2000]
+0x878C U+3239 # PARENTHESIZED IDEOGRAPH REPRESENT [2000]
+0x878D U+337E # SQUARE ERA NAME MEIZI [2000]
+0x878E U+337D # SQUARE ERA NAME TAISYOU [2000]
+0x878F U+337C # SQUARE ERA NAME SYOUWA [2000]
+0x8790 # <reserved> Windows: U+2252
+0x8791 # <reserved> Windows: U+2261
+0x8792 # <reserved> Windows: U+222B
+0x8793 U+222E # CONTOUR INTEGRAL [2000]
+0x8794 # <reserved> Windows: U+2211
+0x8795 # <reserved> Windows: U+221A
+0x8796 # <reserved> Windows: U+22A5
+0x8797 # <reserved> Windows: U+2220
+0x8798 U+221F # RIGHT ANGLE [2000]
+0x8799 U+22BF # RIGHT TRIANGLE [2000]
+0x879A # <reserved> Windows: U+2235
+0x879B # <reserved> Windows: U+2229
+0x879C # <reserved> Windows: U+222A
+0x879D U+2756 # BLACK DIAMOND MINUS WHITE X [2000]
+0x879E U+261E # WHITE RIGHT POINTING INDEX [2000]
+0x879F U+4FF1 # <cjk> [2004]
+0x87A0 U+2000B # <cjk> [2000] [Unicode3.1]
+0x87A1 U+3402 # <cjk> [2000]
+0x87A2 U+4E28 # <cjk> [2000]
+0x87A3 U+4E2F # <cjk> [2000]
+0x87A4 U+4E30 # <cjk> [2000]
+0x87A5 U+4E8D # <cjk> [2000]
+0x87A6 U+4EE1 # <cjk> [2000]
+0x87A7 U+4EFD # <cjk> [2000]
+0x87A8 U+4EFF # <cjk> [2000]
+0x87A9 U+4F03 # <cjk> [2000]
+0x87AA U+4F0B # <cjk> [2000]
+0x87AB U+4F60 # <cjk> [2000]
+0x87AC U+4F48 # <cjk> [2000]
+0x87AD U+4F49 # <cjk> [2000]
+0x87AE U+4F56 # <cjk> [2000]
+0x87AF U+4F5F # <cjk> [2000]
+0x87B0 U+4F6A # <cjk> [2000]
+0x87B1 U+4F6C # <cjk> [2000]
+0x87B2 U+4F7E # <cjk> [2000]
+0x87B3 U+4F8A # <cjk> [2000]
+0x87B4 U+4F94 # <cjk> [2000]
+0x87B5 U+4F97 # <cjk> [2000]
+0x87B6 U+FA30 # CJK COMPATIBILITY IDEOGRAPH-FA30 [2000] [Unicode3.2]
+0x87B7 U+4FC9 # <cjk> [2000]
+0x87B8 U+4FE0 # <cjk> [2000]
+0x87B9 U+5001 # <cjk> [2000]
+0x87BA U+5002 # <cjk> [2000]
+0x87BB U+500E # <cjk> [2000]
+0x87BC U+5018 # <cjk> [2000]
+0x87BD U+5027 # <cjk> [2000]
+0x87BE U+502E # <cjk> [2000]
+0x87BF U+5040 # <cjk> [2000]
+0x87C0 U+503B # <cjk> [2000]
+0x87C1 U+5041 # <cjk> [2000]
+0x87C2 U+5094 # <cjk> [2000]
+0x87C3 U+50CC # <cjk> [2000]
+0x87C4 U+50F2 # <cjk> [2000]
+0x87C5 U+50D0 # <cjk> [2000]
+0x87C6 U+50E6 # <cjk> [2000]
+0x87C7 U+FA31 # CJK COMPATIBILITY IDEOGRAPH-FA31 [2000] [Unicode3.2]
+0x87C8 U+5106 # <cjk> [2000]
+0x87C9 U+5103 # <cjk> [2000]
+0x87CA U+510B # <cjk> [2000]
+0x87CB U+511E # <cjk> [2000]
+0x87CC U+5135 # <cjk> [2000]
+0x87CD U+514A # <cjk> [2000]
+0x87CE U+FA32 # CJK COMPATIBILITY IDEOGRAPH-FA32 [2000] [Unicode3.2]
+0x87CF U+5155 # <cjk> [2000]
+0x87D0 U+5157 # <cjk> [2000]
+0x87D1 U+34B5 # <cjk> [2000]
+0x87D2 U+519D # <cjk> [2000]
+0x87D3 U+51C3 # <cjk> [2000]
+0x87D4 U+51CA # <cjk> [2000]
+0x87D5 U+51DE # <cjk> [2000]
+0x87D6 U+51E2 # <cjk> [2000]
+0x87D7 U+51EE # <cjk> [2000]
+0x87D8 U+5201 # <cjk> [2000]
+0x87D9 U+34DB # <cjk> [2000]
+0x87DA U+5213 # <cjk> [2000]
+0x87DB U+5215 # <cjk> [2000]
+0x87DC U+5249 # <cjk> [2000]
+0x87DD U+5257 # <cjk> [2000]
+0x87DE U+5261 # <cjk> [2000]
+0x87DF U+5293 # <cjk> [2000]
+0x87E0 U+52C8 # <cjk> [2000]
+0x87E1 U+FA33 # CJK COMPATIBILITY IDEOGRAPH-FA33 [2000] [Unicode3.2]
+0x87E2 U+52CC # <cjk> [2000]
+0x87E3 U+52D0 # <cjk> [2000]
+0x87E4 U+52D6 # <cjk> [2000]
+0x87E5 U+52DB # <cjk> [2000]
+0x87E6 U+FA34 # CJK COMPATIBILITY IDEOGRAPH-FA34 [2000] [Unicode3.2]
+0x87E7 U+52F0 # <cjk> [2000]
+0x87E8 U+52FB # <cjk> [2000]
+0x87E9 U+5300 # <cjk> [2000]
+0x87EA U+5307 # <cjk> [2000]
+0x87EB U+531C # <cjk> [2000]
+0x87EC U+FA35 # CJK COMPATIBILITY IDEOGRAPH-FA35 [2000] [Unicode3.2]
+0x87ED U+5361 # <cjk> [2000]
+0x87EE U+5363 # <cjk> [2000]
+0x87EF U+537D # <cjk> [2000]
+0x87F0 U+5393 # <cjk> [2000]
+0x87F1 U+539D # <cjk> [2000]
+0x87F2 U+53B2 # <cjk> [2000]
+0x87F3 U+5412 # <cjk> [2000]
+0x87F4 U+5427 # <cjk> [2000]
+0x87F5 U+544D # <cjk> [2000]
+0x87F6 U+549C # <cjk> [2000]
+0x87F7 U+546B # <cjk> [2000]
+0x87F8 U+5474 # <cjk> [2000]
+0x87F9 U+547F # <cjk> [2000]
+0x87FA U+5488 # <cjk> [2000]
+0x87FB U+5496 # <cjk> [2000]
+0x87FC U+54A1 # <cjk> [2000]
+0x8840 U+54A9 # <cjk> [2000]
+0x8841 U+54C6 # <cjk> [2000]
+0x8842 U+54FF # <cjk> [2000]
+0x8843 U+550E # <cjk> [2000]
+0x8844 U+552B # <cjk> [2000]
+0x8845 U+5535 # <cjk> [2000]
+0x8846 U+5550 # <cjk> [2000]
+0x8847 U+555E # <cjk> [2000]
+0x8848 U+5581 # <cjk> [2000]
+0x8849 U+5586 # <cjk> [2000]
+0x884A U+558E # <cjk> [2000]
+0x884B U+FA36 # CJK COMPATIBILITY IDEOGRAPH-FA36 [2000] [Unicode3.2]
+0x884C U+55AD # <cjk> [2000]
+0x884D U+55CE # <cjk> [2000]
+0x884E U+FA37 # CJK COMPATIBILITY IDEOGRAPH-FA37 [2000] [Unicode3.2]
+0x884F U+5608 # <cjk> [2000]
+0x8850 U+560E # <cjk> [2000]
+0x8851 U+563B # <cjk> [2000]
+0x8852 U+5649 # <cjk> [2000]
+0x8853 U+5676 # <cjk> [2000]
+0x8854 U+5666 # <cjk> [2000]
+0x8855 U+FA38 # CJK COMPATIBILITY IDEOGRAPH-FA38 [2000] [Unicode3.2]
+0x8856 U+566F # <cjk> [2000]
+0x8857 U+5671 # <cjk> [2000]
+0x8858 U+5672 # <cjk> [2000]
+0x8859 U+5699 # <cjk> [2000]
+0x885A U+569E # <cjk> [2000]
+0x885B U+56A9 # <cjk> [2000]
+0x885C U+56AC # <cjk> [2000]
+0x885D U+56B3 # <cjk> [2000]
+0x885E U+56C9 # <cjk> [2000]
+0x885F U+56CA # <cjk> [2000]
+0x8860 U+570A # <cjk> [2000]
+0x8861 U+2123D # <cjk> [2000] [Unicode3.1]
+0x8862 U+5721 # <cjk> [2000]
+0x8863 U+572F # <cjk> [2000]
+0x8864 U+5733 # <cjk> [2000]
+0x8865 U+5734 # <cjk> [2000]
+0x8866 U+5770 # <cjk> [2000]
+0x8867 U+5777 # <cjk> [2000]
+0x8868 U+577C # <cjk> [2000]
+0x8869 U+579C # <cjk> [2000]
+0x886A U+FA0F # CJK COMPATIBILITY IDEOGRAPH-FA0F [2000]
+0x886B U+2131B # <cjk> [2000] [Unicode3.1]
+0x886C U+57B8 # <cjk> [2000]
+0x886D U+57C7 # <cjk> [2000]
+0x886E U+57C8 # <cjk> [2000]
+0x886F U+57CF # <cjk> [2000]
+0x8870 U+57E4 # <cjk> [2000]
+0x8871 U+57ED # <cjk> [2000]
+0x8872 U+57F5 # <cjk> [2000]
+0x8873 U+57F6 # <cjk> [2000]
+0x8874 U+57FF # <cjk> [2000]
+0x8875 U+5809 # <cjk> [2000]
+0x8876 U+FA10 # CJK COMPATIBILITY IDEOGRAPH-FA10 [2000]
+0x8877 U+5861 # <cjk> [2000]
+0x8878 U+5864 # <cjk> [2000]
+0x8879 U+FA39 # CJK COMPATIBILITY IDEOGRAPH-FA39 [2000] [Unicode3.2]
+0x887A U+587C # <cjk> [2000]
+0x887B U+5889 # <cjk> [2000]
+0x887C U+589E # <cjk> [2000]
+0x887D U+FA3A # CJK COMPATIBILITY IDEOGRAPH-FA3A [2000] [Unicode3.2]
+0x887E U+58A9 # <cjk> [2000]
+0x8880 U+2146E # <cjk> [2000] [Unicode3.1]
+0x8881 U+58D2 # <cjk> [2000]
+0x8882 U+58CE # <cjk> [2000]
+0x8883 U+58D4 # <cjk> [2000]
+0x8884 U+58DA # <cjk> [2000]
+0x8885 U+58E0 # <cjk> [2000]
+0x8886 U+58E9 # <cjk> [2000]
+0x8887 U+590C # <cjk> [2000]
+0x8888 U+8641 # <cjk> [2000]
+0x8889 U+595D # <cjk> [2000]
+0x888A U+596D # <cjk> [2000]
+0x888B U+598B # <cjk> [2000]
+0x888C U+5992 # <cjk> [2000]
+0x888D U+59A4 # <cjk> [2000]
+0x888E U+59C3 # <cjk> [2000]
+0x888F U+59D2 # <cjk> [2000]
+0x8890 U+59DD # <cjk> [2000]
+0x8891 U+5A13 # <cjk> [2000]
+0x8892 U+5A23 # <cjk> [2000]
+0x8893 U+5A67 # <cjk> [2000]
+0x8894 U+5A6D # <cjk> [2000]
+0x8895 U+5A77 # <cjk> [2000]
+0x8896 U+5A7E # <cjk> [2000]
+0x8897 U+5A84 # <cjk> [2000]
+0x8898 U+5A9E # <cjk> [2000]
+0x8899 U+5AA7 # <cjk> [2000]
+0x889A U+5AC4 # <cjk> [2000]
+0x889B U+218BD # <cjk> [2000] [Unicode3.1]
+0x889C U+5B19 # <cjk> [2000]
+0x889D U+5B25 # <cjk> [2000]
+0x889E U+525D # <cjk> [2004]
+0x889F U+4E9C # <cjk>
+0x88A0 U+5516 # <cjk>
+0x88A1 U+5A03 # <cjk>
+0x88A2 U+963F # <cjk>
+0x88A3 U+54C0 # <cjk>
+0x88A4 U+611B # <cjk>
+0x88A5 U+6328 # <cjk>
+0x88A6 U+59F6 # <cjk>
+0x88A7 U+9022 # <cjk>
+0x88A8 U+8475 # <cjk>
+0x88A9 U+831C # <cjk>
+0x88AA U+7A50 # <cjk>
+0x88AB U+60AA # <cjk>
+0x88AC U+63E1 # <cjk>
+0x88AD U+6E25 # <cjk>
+0x88AE U+65ED # <cjk>
+0x88AF U+8466 # <cjk>
+0x88B0 U+82A6 # <cjk>
+0x88B1 U+9BF5 # <cjk>
+0x88B2 U+6893 # <cjk>
+0x88B3 U+5727 # <cjk>
+0x88B4 U+65A1 # <cjk>
+0x88B5 U+6271 # <cjk>
+0x88B6 U+5B9B # <cjk>
+0x88B7 U+59D0 # <cjk>
+0x88B8 U+867B # <cjk>
+0x88B9 U+98F4 # <cjk>
+0x88BA U+7D62 # <cjk>
+0x88BB U+7DBE # <cjk>
+0x88BC U+9B8E # <cjk>
+0x88BD U+6216 # <cjk>
+0x88BE U+7C9F # <cjk>
+0x88BF U+88B7 # <cjk>
+0x88C0 U+5B89 # <cjk>
+0x88C1 U+5EB5 # <cjk>
+0x88C2 U+6309 # <cjk>
+0x88C3 U+6697 # <cjk>
+0x88C4 U+6848 # <cjk>
+0x88C5 U+95C7 # <cjk>
+0x88C6 U+978D # <cjk>
+0x88C7 U+674F # <cjk>
+0x88C8 U+4EE5 # <cjk>
+0x88C9 U+4F0A # <cjk>
+0x88CA U+4F4D # <cjk>
+0x88CB U+4F9D # <cjk>
+0x88CC U+5049 # <cjk>
+0x88CD U+56F2 # <cjk>
+0x88CE U+5937 # <cjk>
+0x88CF U+59D4 # <cjk>
+0x88D0 U+5A01 # <cjk>
+0x88D1 U+5C09 # <cjk>
+0x88D2 U+60DF # <cjk>
+0x88D3 U+610F # <cjk>
+0x88D4 U+6170 # <cjk>
+0x88D5 U+6613 # <cjk>
+0x88D6 U+6905 # <cjk>
+0x88D7 U+70BA # <cjk>
+0x88D8 U+754F # <cjk>
+0x88D9 U+7570 # <cjk>
+0x88DA U+79FB # <cjk>
+0x88DB U+7DAD # <cjk>
+0x88DC U+7DEF # <cjk>
+0x88DD U+80C3 # <cjk>
+0x88DE U+840E # <cjk>
+0x88DF U+8863 # <cjk>
+0x88E0 U+8B02 # <cjk>
+0x88E1 U+9055 # <cjk>
+0x88E2 U+907A # <cjk>
+0x88E3 U+533B # <cjk>
+0x88E4 U+4E95 # <cjk>
+0x88E5 U+4EA5 # <cjk>
+0x88E6 U+57DF # <cjk>
+0x88E7 U+80B2 # <cjk>
+0x88E8 U+90C1 # <cjk>
+0x88E9 U+78EF # <cjk>
+0x88EA U+4E00 # <cjk>
+0x88EB U+58F1 # <cjk>
+0x88EC U+6EA2 # <cjk>
+0x88ED U+9038 # <cjk>
+0x88EE U+7A32 # <cjk>
+0x88EF U+8328 # <cjk>
+0x88F0 U+828B # <cjk>
+0x88F1 U+9C2F # <cjk>
+0x88F2 U+5141 # <cjk>
+0x88F3 U+5370 # <cjk>
+0x88F4 U+54BD # <cjk>
+0x88F5 U+54E1 # <cjk>
+0x88F6 U+56E0 # <cjk>
+0x88F7 U+59FB # <cjk>
+0x88F8 U+5F15 # <cjk>
+0x88F9 U+98F2 # <cjk>
+0x88FA U+6DEB # <cjk>
+0x88FB U+80E4 # <cjk>
+0x88FC U+852D # <cjk>
+0x8940 U+9662 # <cjk>
+0x8941 U+9670 # <cjk>
+0x8942 U+96A0 # <cjk>
+0x8943 U+97FB # <cjk>
+0x8944 U+540B # <cjk>
+0x8945 U+53F3 # <cjk>
+0x8946 U+5B87 # <cjk>
+0x8947 U+70CF # <cjk>
+0x8948 U+7FBD # <cjk>
+0x8949 U+8FC2 # <cjk>
+0x894A U+96E8 # <cjk>
+0x894B U+536F # <cjk>
+0x894C U+9D5C # <cjk>
+0x894D U+7ABA # <cjk>
+0x894E U+4E11 # <cjk>
+0x894F U+7893 # <cjk>
+0x8950 U+81FC # <cjk>
+0x8951 U+6E26 # <cjk>
+0x8952 U+5618 # <cjk>
+0x8953 U+5504 # <cjk>
+0x8954 U+6B1D # <cjk>
+0x8955 U+851A # <cjk>
+0x8956 U+9C3B # <cjk>
+0x8957 U+59E5 # <cjk>
+0x8958 U+53A9 # <cjk>
+0x8959 U+6D66 # <cjk>
+0x895A U+74DC # <cjk>
+0x895B U+958F # <cjk>
+0x895C U+5642 # <cjk>
+0x895D U+4E91 # <cjk>
+0x895E U+904B # <cjk>
+0x895F U+96F2 # <cjk>
+0x8960 U+834F # <cjk>
+0x8961 U+990C # <cjk>
+0x8962 U+53E1 # <cjk>
+0x8963 U+55B6 # <cjk>
+0x8964 U+5B30 # <cjk>
+0x8965 U+5F71 # <cjk>
+0x8966 U+6620 # <cjk>
+0x8967 U+66F3 # <cjk>
+0x8968 U+6804 # <cjk>
+0x8969 U+6C38 # <cjk>
+0x896A U+6CF3 # <cjk>
+0x896B U+6D29 # <cjk>
+0x896C U+745B # <cjk>
+0x896D U+76C8 # <cjk>
+0x896E U+7A4E # <cjk>
+0x896F U+9834 # <cjk>
+0x8970 U+82F1 # <cjk>
+0x8971 U+885B # <cjk>
+0x8972 U+8A60 # <cjk>
+0x8973 U+92ED # <cjk>
+0x8974 U+6DB2 # <cjk>
+0x8975 U+75AB # <cjk>
+0x8976 U+76CA # <cjk>
+0x8977 U+99C5 # <cjk>
+0x8978 U+60A6 # <cjk>
+0x8979 U+8B01 # <cjk>
+0x897A U+8D8A # <cjk>
+0x897B U+95B2 # <cjk>
+0x897C U+698E # <cjk>
+0x897D U+53AD # <cjk>
+0x897E U+5186 # <cjk>
+0x8980 U+5712 # <cjk>
+0x8981 U+5830 # <cjk>
+0x8982 U+5944 # <cjk>
+0x8983 U+5BB4 # <cjk>
+0x8984 U+5EF6 # <cjk>
+0x8985 U+6028 # <cjk>
+0x8986 U+63A9 # <cjk>
+0x8987 U+63F4 # <cjk>
+0x8988 U+6CBF # <cjk>
+0x8989 U+6F14 # <cjk>
+0x898A U+708E # <cjk>
+0x898B U+7114 # <cjk>
+0x898C U+7159 # <cjk>
+0x898D U+71D5 # <cjk>
+0x898E U+733F # <cjk>
+0x898F U+7E01 # <cjk>
+0x8990 U+8276 # <cjk>
+0x8991 U+82D1 # <cjk>
+0x8992 U+8597 # <cjk>
+0x8993 U+9060 # <cjk>
+0x8994 U+925B # <cjk>
+0x8995 U+9D1B # <cjk>
+0x8996 U+5869 # <cjk>
+0x8997 U+65BC # <cjk>
+0x8998 U+6C5A # <cjk>
+0x8999 U+7525 # <cjk>
+0x899A U+51F9 # <cjk>
+0x899B U+592E # <cjk>
+0x899C U+5965 # <cjk>
+0x899D U+5F80 # <cjk>
+0x899E U+5FDC # <cjk>
+0x899F U+62BC # <cjk>
+0x89A0 U+65FA # <cjk>
+0x89A1 U+6A2A # <cjk>
+0x89A2 U+6B27 # <cjk>
+0x89A3 U+6BB4 # <cjk>
+0x89A4 U+738B # <cjk>
+0x89A5 U+7FC1 # <cjk>
+0x89A6 U+8956 # <cjk>
+0x89A7 U+9D2C # <cjk>
+0x89A8 U+9D0E # <cjk>
+0x89A9 U+9EC4 # <cjk>
+0x89AA U+5CA1 # <cjk>
+0x89AB U+6C96 # <cjk>
+0x89AC U+837B # <cjk>
+0x89AD U+5104 # <cjk>
+0x89AE U+5C4B # <cjk>
+0x89AF U+61B6 # <cjk>
+0x89B0 U+81C6 # <cjk>
+0x89B1 U+6876 # <cjk>
+0x89B2 U+7261 # <cjk>
+0x89B3 U+4E59 # <cjk>
+0x89B4 U+4FFA # <cjk>
+0x89B5 U+5378 # <cjk>
+0x89B6 U+6069 # <cjk>
+0x89B7 U+6E29 # <cjk>
+0x89B8 U+7A4F # <cjk>
+0x89B9 U+97F3 # <cjk>
+0x89BA U+4E0B # <cjk>
+0x89BB U+5316 # <cjk>
+0x89BC U+4EEE # <cjk>
+0x89BD U+4F55 # <cjk>
+0x89BE U+4F3D # <cjk>
+0x89BF U+4FA1 # <cjk>
+0x89C0 U+4F73 # <cjk>
+0x89C1 U+52A0 # <cjk>
+0x89C2 U+53EF # <cjk>
+0x89C3 U+5609 # <cjk>
+0x89C4 U+590F # <cjk>
+0x89C5 U+5AC1 # <cjk>
+0x89C6 U+5BB6 # <cjk>
+0x89C7 U+5BE1 # <cjk>
+0x89C8 U+79D1 # <cjk>
+0x89C9 U+6687 # <cjk>
+0x89CA U+679C # <cjk>
+0x89CB U+67B6 # <cjk>
+0x89CC U+6B4C # <cjk>
+0x89CD U+6CB3 # <cjk>
+0x89CE U+706B # <cjk>
+0x89CF U+73C2 # <cjk>
+0x89D0 U+798D # <cjk>
+0x89D1 U+79BE # <cjk>
+0x89D2 U+7A3C # <cjk>
+0x89D3 U+7B87 # <cjk>
+0x89D4 U+82B1 # <cjk>
+0x89D5 U+82DB # <cjk>
+0x89D6 U+8304 # <cjk>
+0x89D7 U+8377 # <cjk>
+0x89D8 U+83EF # <cjk>
+0x89D9 U+83D3 # <cjk>
+0x89DA U+8766 # <cjk>
+0x89DB U+8AB2 # <cjk>
+0x89DC U+5629 # <cjk>
+0x89DD U+8CA8 # <cjk>
+0x89DE U+8FE6 # <cjk>
+0x89DF U+904E # <cjk>
+0x89E0 U+971E # <cjk>
+0x89E1 U+868A # <cjk>
+0x89E2 U+4FC4 # <cjk>
+0x89E3 U+5CE8 # <cjk>
+0x89E4 U+6211 # <cjk>
+0x89E5 U+7259 # <cjk>
+0x89E6 U+753B # <cjk>
+0x89E7 U+81E5 # <cjk>
+0x89E8 U+82BD # <cjk>
+0x89E9 U+86FE # <cjk>
+0x89EA U+8CC0 # <cjk>
+0x89EB U+96C5 # <cjk>
+0x89EC U+9913 # <cjk>
+0x89ED U+99D5 # <cjk>
+0x89EE U+4ECB # <cjk>
+0x89EF U+4F1A # <cjk>
+0x89F0 U+89E3 # <cjk>
+0x89F1 U+56DE # <cjk>
+0x89F2 U+584A # <cjk>
+0x89F3 U+58CA # <cjk>
+0x89F4 U+5EFB # <cjk>
+0x89F5 U+5FEB # <cjk>
+0x89F6 U+602A # <cjk>
+0x89F7 U+6094 # <cjk>
+0x89F8 U+6062 # <cjk>
+0x89F9 U+61D0 # <cjk>
+0x89FA U+6212 # <cjk>
+0x89FB U+62D0 # <cjk>
+0x89FC U+6539 # <cjk>
+0x8A40 U+9B41 # <cjk>
+0x8A41 U+6666 # <cjk>
+0x8A42 U+68B0 # <cjk>
+0x8A43 U+6D77 # <cjk>
+0x8A44 U+7070 # <cjk>
+0x8A45 U+754C # <cjk>
+0x8A46 U+7686 # <cjk>
+0x8A47 U+7D75 # <cjk>
+0x8A48 U+82A5 # <cjk>
+0x8A49 U+87F9 # <cjk>
+0x8A4A U+958B # <cjk>
+0x8A4B U+968E # <cjk>
+0x8A4C U+8C9D # <cjk>
+0x8A4D U+51F1 # <cjk>
+0x8A4E U+52BE # <cjk>
+0x8A4F U+5916 # <cjk>
+0x8A50 U+54B3 # <cjk>
+0x8A51 U+5BB3 # <cjk>
+0x8A52 U+5D16 # <cjk>
+0x8A53 U+6168 # <cjk>
+0x8A54 U+6982 # <cjk>
+0x8A55 U+6DAF # <cjk>
+0x8A56 U+788D # <cjk>
+0x8A57 U+84CB # <cjk>
+0x8A58 U+8857 # <cjk>
+0x8A59 U+8A72 # <cjk>
+0x8A5A U+93A7 # <cjk>
+0x8A5B U+9AB8 # <cjk>
+0x8A5C U+6D6C # <cjk>
+0x8A5D U+99A8 # <cjk>
+0x8A5E U+86D9 # <cjk>
+0x8A5F U+57A3 # <cjk>
+0x8A60 U+67FF # <cjk>
+0x8A61 U+86CE # <cjk>
+0x8A62 U+920E # <cjk>
+0x8A63 U+5283 # <cjk>
+0x8A64 U+5687 # <cjk>
+0x8A65 U+5404 # <cjk>
+0x8A66 U+5ED3 # <cjk>
+0x8A67 U+62E1 # <cjk>
+0x8A68 U+64B9 # <cjk>
+0x8A69 U+683C # <cjk>
+0x8A6A U+6838 # <cjk>
+0x8A6B U+6BBB # <cjk>
+0x8A6C U+7372 # <cjk>
+0x8A6D U+78BA # <cjk>
+0x8A6E U+7A6B # <cjk>
+0x8A6F U+899A # <cjk>
+0x8A70 U+89D2 # <cjk>
+0x8A71 U+8D6B # <cjk>
+0x8A72 U+8F03 # <cjk>
+0x8A73 U+90ED # <cjk>
+0x8A74 U+95A3 # <cjk>
+0x8A75 U+9694 # <cjk>
+0x8A76 U+9769 # <cjk>
+0x8A77 U+5B66 # <cjk>
+0x8A78 U+5CB3 # <cjk>
+0x8A79 U+697D # <cjk>
+0x8A7A U+984D # <cjk>
+0x8A7B U+984E # <cjk>
+0x8A7C U+639B # <cjk>
+0x8A7D U+7B20 # <cjk>
+0x8A7E U+6A2B # <cjk>
+0x8A80 U+6A7F # <cjk>
+0x8A81 U+68B6 # <cjk>
+0x8A82 U+9C0D # <cjk>
+0x8A83 U+6F5F # <cjk>
+0x8A84 U+5272 # <cjk>
+0x8A85 U+559D # <cjk>
+0x8A86 U+6070 # <cjk>
+0x8A87 U+62EC # <cjk>
+0x8A88 U+6D3B # <cjk>
+0x8A89 U+6E07 # <cjk>
+0x8A8A U+6ED1 # <cjk>
+0x8A8B U+845B # <cjk>
+0x8A8C U+8910 # <cjk>
+0x8A8D U+8F44 # <cjk>
+0x8A8E U+4E14 # <cjk>
+0x8A8F U+9C39 # <cjk>
+0x8A90 U+53F6 # <cjk>
+0x8A91 U+691B # <cjk>
+0x8A92 U+6A3A # <cjk>
+0x8A93 U+9784 # <cjk>
+0x8A94 U+682A # <cjk>
+0x8A95 U+515C # <cjk>
+0x8A96 U+7AC3 # <cjk>
+0x8A97 U+84B2 # <cjk>
+0x8A98 U+91DC # <cjk>
+0x8A99 U+938C # <cjk>
+0x8A9A U+565B # <cjk>
+0x8A9B U+9D28 # <cjk>
+0x8A9C U+6822 # <cjk>
+0x8A9D U+8305 # <cjk>
+0x8A9E U+8431 # <cjk>
+0x8A9F U+7CA5 # <cjk>
+0x8AA0 U+5208 # <cjk>
+0x8AA1 U+82C5 # <cjk>
+0x8AA2 U+74E6 # <cjk>
+0x8AA3 U+4E7E # <cjk>
+0x8AA4 U+4F83 # <cjk>
+0x8AA5 U+51A0 # <cjk>
+0x8AA6 U+5BD2 # <cjk>
+0x8AA7 U+520A # <cjk>
+0x8AA8 U+52D8 # <cjk>
+0x8AA9 U+52E7 # <cjk>
+0x8AAA U+5DFB # <cjk>
+0x8AAB U+559A # <cjk>
+0x8AAC U+582A # <cjk>
+0x8AAD U+59E6 # <cjk>
+0x8AAE U+5B8C # <cjk>
+0x8AAF U+5B98 # <cjk>
+0x8AB0 U+5BDB # <cjk>
+0x8AB1 U+5E72 # <cjk>
+0x8AB2 U+5E79 # <cjk>
+0x8AB3 U+60A3 # <cjk>
+0x8AB4 U+611F # <cjk>
+0x8AB5 U+6163 # <cjk>
+0x8AB6 U+61BE # <cjk>
+0x8AB7 U+63DB # <cjk>
+0x8AB8 U+6562 # <cjk>
+0x8AB9 U+67D1 # <cjk>
+0x8ABA U+6853 # <cjk>
+0x8ABB U+68FA # <cjk>
+0x8ABC U+6B3E # <cjk>
+0x8ABD U+6B53 # <cjk>
+0x8ABE U+6C57 # <cjk>
+0x8ABF U+6F22 # <cjk>
+0x8AC0 U+6F97 # <cjk>
+0x8AC1 U+6F45 # <cjk>
+0x8AC2 U+74B0 # <cjk>
+0x8AC3 U+7518 # <cjk>
+0x8AC4 U+76E3 # <cjk>
+0x8AC5 U+770B # <cjk>
+0x8AC6 U+7AFF # <cjk>
+0x8AC7 U+7BA1 # <cjk>
+0x8AC8 U+7C21 # <cjk>
+0x8AC9 U+7DE9 # <cjk>
+0x8ACA U+7F36 # <cjk>
+0x8ACB U+7FF0 # <cjk>
+0x8ACC U+809D # <cjk>
+0x8ACD U+8266 # <cjk>
+0x8ACE U+839E # <cjk>
+0x8ACF U+89B3 # <cjk>
+0x8AD0 U+8ACC # <cjk>
+0x8AD1 U+8CAB # <cjk>
+0x8AD2 U+9084 # <cjk>
+0x8AD3 U+9451 # <cjk>
+0x8AD4 U+9593 # <cjk>
+0x8AD5 U+9591 # <cjk>
+0x8AD6 U+95A2 # <cjk>
+0x8AD7 U+9665 # <cjk>
+0x8AD8 U+97D3 # <cjk>
+0x8AD9 U+9928 # <cjk>
+0x8ADA U+8218 # <cjk>
+0x8ADB U+4E38 # <cjk>
+0x8ADC U+542B # <cjk>
+0x8ADD U+5CB8 # <cjk>
+0x8ADE U+5DCC # <cjk>
+0x8ADF U+73A9 # <cjk>
+0x8AE0 U+764C # <cjk>
+0x8AE1 U+773C # <cjk>
+0x8AE2 U+5CA9 # <cjk>
+0x8AE3 U+7FEB # <cjk>
+0x8AE4 U+8D0B # <cjk>
+0x8AE5 U+96C1 # <cjk>
+0x8AE6 U+9811 # <cjk>
+0x8AE7 U+9854 # <cjk>
+0x8AE8 U+9858 # <cjk>
+0x8AE9 U+4F01 # <cjk>
+0x8AEA U+4F0E # <cjk>
+0x8AEB U+5371 # <cjk>
+0x8AEC U+559C # <cjk>
+0x8AED U+5668 # <cjk>
+0x8AEE U+57FA # <cjk>
+0x8AEF U+5947 # <cjk>
+0x8AF0 U+5B09 # <cjk>
+0x8AF1 U+5BC4 # <cjk>
+0x8AF2 U+5C90 # <cjk>
+0x8AF3 U+5E0C # <cjk>
+0x8AF4 U+5E7E # <cjk>
+0x8AF5 U+5FCC # <cjk>
+0x8AF6 U+63EE # <cjk>
+0x8AF7 U+673A # <cjk>
+0x8AF8 U+65D7 # <cjk>
+0x8AF9 U+65E2 # <cjk>
+0x8AFA U+671F # <cjk>
+0x8AFB U+68CB # <cjk>
+0x8AFC U+68C4 # <cjk>
+0x8B40 U+6A5F # <cjk>
+0x8B41 U+5E30 # <cjk>
+0x8B42 U+6BC5 # <cjk>
+0x8B43 U+6C17 # <cjk>
+0x8B44 U+6C7D # <cjk>
+0x8B45 U+757F # <cjk>
+0x8B46 U+7948 # <cjk>
+0x8B47 U+5B63 # <cjk>
+0x8B48 U+7A00 # <cjk>
+0x8B49 U+7D00 # <cjk>
+0x8B4A U+5FBD # <cjk>
+0x8B4B U+898F # <cjk>
+0x8B4C U+8A18 # <cjk>
+0x8B4D U+8CB4 # <cjk>
+0x8B4E U+8D77 # <cjk>
+0x8B4F U+8ECC # <cjk>
+0x8B50 U+8F1D # <cjk>
+0x8B51 U+98E2 # <cjk>
+0x8B52 U+9A0E # <cjk>
+0x8B53 U+9B3C # <cjk>
+0x8B54 U+4E80 # <cjk>
+0x8B55 U+507D # <cjk>
+0x8B56 U+5100 # <cjk>
+0x8B57 U+5993 # <cjk>
+0x8B58 U+5B9C # <cjk>
+0x8B59 U+622F # <cjk>
+0x8B5A U+6280 # <cjk>
+0x8B5B U+64EC # <cjk>
+0x8B5C U+6B3A # <cjk>
+0x8B5D U+72A0 # <cjk>
+0x8B5E U+7591 # <cjk>
+0x8B5F U+7947 # <cjk>
+0x8B60 U+7FA9 # <cjk>
+0x8B61 U+87FB # <cjk>
+0x8B62 U+8ABC # <cjk>
+0x8B63 U+8B70 # <cjk>
+0x8B64 U+63AC # <cjk>
+0x8B65 U+83CA # <cjk>
+0x8B66 U+97A0 # <cjk>
+0x8B67 U+5409 # <cjk>
+0x8B68 U+5403 # <cjk>
+0x8B69 U+55AB # <cjk>
+0x8B6A U+6854 # <cjk>
+0x8B6B U+6A58 # <cjk>
+0x8B6C U+8A70 # <cjk>
+0x8B6D U+7827 # <cjk>
+0x8B6E U+6775 # <cjk>
+0x8B6F U+9ECD # <cjk>
+0x8B70 U+5374 # <cjk>
+0x8B71 U+5BA2 # <cjk>
+0x8B72 U+811A # <cjk>
+0x8B73 U+8650 # <cjk>
+0x8B74 U+9006 # <cjk>
+0x8B75 U+4E18 # <cjk>
+0x8B76 U+4E45 # <cjk>
+0x8B77 U+4EC7 # <cjk>
+0x8B78 U+4F11 # <cjk>
+0x8B79 U+53CA # <cjk>
+0x8B7A U+5438 # <cjk>
+0x8B7B U+5BAE # <cjk>
+0x8B7C U+5F13 # <cjk>
+0x8B7D U+6025 # <cjk>
+0x8B7E U+6551 # <cjk>
+0x8B80 U+673D # <cjk>
+0x8B81 U+6C42 # <cjk>
+0x8B82 U+6C72 # <cjk>
+0x8B83 U+6CE3 # <cjk>
+0x8B84 U+7078 # <cjk>
+0x8B85 U+7403 # <cjk>
+0x8B86 U+7A76 # <cjk>
+0x8B87 U+7AAE # <cjk>
+0x8B88 U+7B08 # <cjk>
+0x8B89 U+7D1A # <cjk>
+0x8B8A U+7CFE # <cjk>
+0x8B8B U+7D66 # <cjk>
+0x8B8C U+65E7 # <cjk>
+0x8B8D U+725B # <cjk>
+0x8B8E U+53BB # <cjk>
+0x8B8F U+5C45 # <cjk>
+0x8B90 U+5DE8 # <cjk>
+0x8B91 U+62D2 # <cjk>
+0x8B92 U+62E0 # <cjk>
+0x8B93 U+6319 # <cjk>
+0x8B94 U+6E20 # <cjk>
+0x8B95 U+865A # <cjk>
+0x8B96 U+8A31 # <cjk>
+0x8B97 U+8DDD # <cjk>
+0x8B98 U+92F8 # <cjk>
+0x8B99 U+6F01 # <cjk>
+0x8B9A U+79A6 # <cjk>
+0x8B9B U+9B5A # <cjk>
+0x8B9C U+4EA8 # <cjk>
+0x8B9D U+4EAB # <cjk>
+0x8B9E U+4EAC # <cjk>
+0x8B9F U+4F9B # <cjk>
+0x8BA0 U+4FA0 # <cjk>
+0x8BA1 U+50D1 # <cjk>
+0x8BA2 U+5147 # <cjk>
+0x8BA3 U+7AF6 # <cjk>
+0x8BA4 U+5171 # <cjk>
+0x8BA5 U+51F6 # <cjk>
+0x8BA6 U+5354 # <cjk>
+0x8BA7 U+5321 # <cjk>
+0x8BA8 U+537F # <cjk>
+0x8BA9 U+53EB # <cjk>
+0x8BAA U+55AC # <cjk>
+0x8BAB U+5883 # <cjk>
+0x8BAC U+5CE1 # <cjk>
+0x8BAD U+5F37 # <cjk>
+0x8BAE U+5F4A # <cjk>
+0x8BAF U+602F # <cjk>
+0x8BB0 U+6050 # <cjk>
+0x8BB1 U+606D # <cjk>
+0x8BB2 U+631F # <cjk>
+0x8BB3 U+6559 # <cjk>
+0x8BB4 U+6A4B # <cjk>
+0x8BB5 U+6CC1 # <cjk>
+0x8BB6 U+72C2 # <cjk>
+0x8BB7 U+72ED # <cjk>
+0x8BB8 U+77EF # <cjk>
+0x8BB9 U+80F8 # <cjk>
+0x8BBA U+8105 # <cjk>
+0x8BBB U+8208 # <cjk>
+0x8BBC U+854E # <cjk>
+0x8BBD U+90F7 # <cjk>
+0x8BBE U+93E1 # <cjk>
+0x8BBF U+97FF # <cjk>
+0x8BC0 U+9957 # <cjk>
+0x8BC1 U+9A5A # <cjk>
+0x8BC2 U+4EF0 # <cjk>
+0x8BC3 U+51DD # <cjk>
+0x8BC4 U+5C2D # <cjk>
+0x8BC5 U+6681 # <cjk>
+0x8BC6 U+696D # <cjk>
+0x8BC7 U+5C40 # <cjk>
+0x8BC8 U+66F2 # <cjk>
+0x8BC9 U+6975 # <cjk>
+0x8BCA U+7389 # <cjk>
+0x8BCB U+6850 # <cjk>
+0x8BCC U+7C81 # <cjk>
+0x8BCD U+50C5 # <cjk>
+0x8BCE U+52E4 # <cjk>
+0x8BCF U+5747 # <cjk>
+0x8BD0 U+5DFE # <cjk>
+0x8BD1 U+9326 # <cjk>
+0x8BD2 U+65A4 # <cjk>
+0x8BD3 U+6B23 # <cjk>
+0x8BD4 U+6B3D # <cjk>
+0x8BD5 U+7434 # <cjk>
+0x8BD6 U+7981 # <cjk>
+0x8BD7 U+79BD # <cjk>
+0x8BD8 U+7B4B # <cjk>
+0x8BD9 U+7DCA # <cjk>
+0x8BDA U+82B9 # <cjk>
+0x8BDB U+83CC # <cjk>
+0x8BDC U+887F # <cjk>
+0x8BDD U+895F # <cjk>
+0x8BDE U+8B39 # <cjk>
+0x8BDF U+8FD1 # <cjk>
+0x8BE0 U+91D1 # <cjk>
+0x8BE1 U+541F # <cjk>
+0x8BE2 U+9280 # <cjk>
+0x8BE3 U+4E5D # <cjk>
+0x8BE4 U+5036 # <cjk>
+0x8BE5 U+53E5 # <cjk>
+0x8BE6 U+533A # <cjk>
+0x8BE7 U+72D7 # <cjk>
+0x8BE8 U+7396 # <cjk>
+0x8BE9 U+77E9 # <cjk>
+0x8BEA U+82E6 # <cjk>
+0x8BEB U+8EAF # <cjk>
+0x8BEC U+99C6 # <cjk>
+0x8BED U+99C8 # <cjk>
+0x8BEE U+99D2 # <cjk>
+0x8BEF U+5177 # <cjk>
+0x8BF0 U+611A # <cjk>
+0x8BF1 U+865E # <cjk>
+0x8BF2 U+55B0 # <cjk>
+0x8BF3 U+7A7A # <cjk>
+0x8BF4 U+5076 # <cjk>
+0x8BF5 U+5BD3 # <cjk>
+0x8BF6 U+9047 # <cjk>
+0x8BF7 U+9685 # <cjk>
+0x8BF8 U+4E32 # <cjk>
+0x8BF9 U+6ADB # <cjk>
+0x8BFA U+91E7 # <cjk>
+0x8BFB U+5C51 # <cjk>
+0x8BFC U+5C48 # <cjk>
+0x8C40 U+6398 # <cjk>
+0x8C41 U+7A9F # <cjk>
+0x8C42 U+6C93 # <cjk>
+0x8C43 U+9774 # <cjk>
+0x8C44 U+8F61 # <cjk>
+0x8C45 U+7AAA # <cjk>
+0x8C46 U+718A # <cjk>
+0x8C47 U+9688 # <cjk>
+0x8C48 U+7C82 # <cjk>
+0x8C49 U+6817 # <cjk>
+0x8C4A U+7E70 # <cjk>
+0x8C4B U+6851 # <cjk>
+0x8C4C U+936C # <cjk>
+0x8C4D U+52F2 # <cjk>
+0x8C4E U+541B # <cjk>
+0x8C4F U+85AB # <cjk>
+0x8C50 U+8A13 # <cjk>
+0x8C51 U+7FA4 # <cjk>
+0x8C52 U+8ECD # <cjk>
+0x8C53 U+90E1 # <cjk>
+0x8C54 U+5366 # <cjk>
+0x8C55 U+8888 # <cjk>
+0x8C56 U+7941 # <cjk>
+0x8C57 U+4FC2 # <cjk>
+0x8C58 U+50BE # <cjk>
+0x8C59 U+5211 # <cjk>
+0x8C5A U+5144 # <cjk>
+0x8C5B U+5553 # <cjk>
+0x8C5C U+572D # <cjk>
+0x8C5D U+73EA # <cjk>
+0x8C5E U+578B # <cjk>
+0x8C5F U+5951 # <cjk>
+0x8C60 U+5F62 # <cjk>
+0x8C61 U+5F84 # <cjk>
+0x8C62 U+6075 # <cjk>
+0x8C63 U+6176 # <cjk>
+0x8C64 U+6167 # <cjk>
+0x8C65 U+61A9 # <cjk>
+0x8C66 U+63B2 # <cjk>
+0x8C67 U+643A # <cjk>
+0x8C68 U+656C # <cjk>
+0x8C69 U+666F # <cjk>
+0x8C6A U+6842 # <cjk>
+0x8C6B U+6E13 # <cjk>
+0x8C6C U+7566 # <cjk>
+0x8C6D U+7A3D # <cjk>
+0x8C6E U+7CFB # <cjk>
+0x8C6F U+7D4C # <cjk>
+0x8C70 U+7D99 # <cjk>
+0x8C71 U+7E4B # <cjk>
+0x8C72 U+7F6B # <cjk>
+0x8C73 U+830E # <cjk>
+0x8C74 U+834A # <cjk>
+0x8C75 U+86CD # <cjk>
+0x8C76 U+8A08 # <cjk>
+0x8C77 U+8A63 # <cjk>
+0x8C78 U+8B66 # <cjk>
+0x8C79 U+8EFD # <cjk>
+0x8C7A U+981A # <cjk>
+0x8C7B U+9D8F # <cjk>
+0x8C7C U+82B8 # <cjk>
+0x8C7D U+8FCE # <cjk>
+0x8C7E U+9BE8 # <cjk>
+0x8C80 U+5287 # <cjk>
+0x8C81 U+621F # <cjk>
+0x8C82 U+6483 # <cjk>
+0x8C83 U+6FC0 # <cjk>
+0x8C84 U+9699 # <cjk>
+0x8C85 U+6841 # <cjk>
+0x8C86 U+5091 # <cjk>
+0x8C87 U+6B20 # <cjk>
+0x8C88 U+6C7A # <cjk>
+0x8C89 U+6F54 # <cjk>
+0x8C8A U+7A74 # <cjk>
+0x8C8B U+7D50 # <cjk>
+0x8C8C U+8840 # <cjk>
+0x8C8D U+8A23 # <cjk>
+0x8C8E U+6708 # <cjk>
+0x8C8F U+4EF6 # <cjk>
+0x8C90 U+5039 # <cjk>
+0x8C91 U+5026 # <cjk>
+0x8C92 U+5065 # <cjk>
+0x8C93 U+517C # <cjk>
+0x8C94 U+5238 # <cjk>
+0x8C95 U+5263 # <cjk>
+0x8C96 U+55A7 # <cjk>
+0x8C97 U+570F # <cjk>
+0x8C98 U+5805 # <cjk>
+0x8C99 U+5ACC # <cjk>
+0x8C9A U+5EFA # <cjk>
+0x8C9B U+61B2 # <cjk>
+0x8C9C U+61F8 # <cjk>
+0x8C9D U+62F3 # <cjk>
+0x8C9E U+6372 # <cjk>
+0x8C9F U+691C # <cjk>
+0x8CA0 U+6A29 # <cjk>
+0x8CA1 U+727D # <cjk>
+0x8CA2 U+72AC # <cjk>
+0x8CA3 U+732E # <cjk>
+0x8CA4 U+7814 # <cjk>
+0x8CA5 U+786F # <cjk>
+0x8CA6 U+7D79 # <cjk>
+0x8CA7 U+770C # <cjk>
+0x8CA8 U+80A9 # <cjk>
+0x8CA9 U+898B # <cjk>
+0x8CAA U+8B19 # <cjk>
+0x8CAB U+8CE2 # <cjk>
+0x8CAC U+8ED2 # <cjk>
+0x8CAD U+9063 # <cjk>
+0x8CAE U+9375 # <cjk>
+0x8CAF U+967A # <cjk>
+0x8CB0 U+9855 # <cjk>
+0x8CB1 U+9A13 # <cjk>
+0x8CB2 U+9E78 # <cjk>
+0x8CB3 U+5143 # <cjk>
+0x8CB4 U+539F # <cjk>
+0x8CB5 U+53B3 # <cjk>
+0x8CB6 U+5E7B # <cjk>
+0x8CB7 U+5F26 # <cjk>
+0x8CB8 U+6E1B # <cjk>
+0x8CB9 U+6E90 # <cjk>
+0x8CBA U+7384 # <cjk>
+0x8CBB U+73FE # <cjk>
+0x8CBC U+7D43 # <cjk>
+0x8CBD U+8237 # <cjk>
+0x8CBE U+8A00 # <cjk>
+0x8CBF U+8AFA # <cjk>
+0x8CC0 U+9650 # <cjk>
+0x8CC1 U+4E4E # <cjk>
+0x8CC2 U+500B # <cjk>
+0x8CC3 U+53E4 # <cjk>
+0x8CC4 U+547C # <cjk>
+0x8CC5 U+56FA # <cjk>
+0x8CC6 U+59D1 # <cjk>
+0x8CC7 U+5B64 # <cjk>
+0x8CC8 U+5DF1 # <cjk>
+0x8CC9 U+5EAB # <cjk>
+0x8CCA U+5F27 # <cjk>
+0x8CCB U+6238 # <cjk>
+0x8CCC U+6545 # <cjk>
+0x8CCD U+67AF # <cjk>
+0x8CCE U+6E56 # <cjk>
+0x8CCF U+72D0 # <cjk>
+0x8CD0 U+7CCA # <cjk>
+0x8CD1 U+88B4 # <cjk>
+0x8CD2 U+80A1 # <cjk>
+0x8CD3 U+80E1 # <cjk>
+0x8CD4 U+83F0 # <cjk>
+0x8CD5 U+864E # <cjk>
+0x8CD6 U+8A87 # <cjk>
+0x8CD7 U+8DE8 # <cjk>
+0x8CD8 U+9237 # <cjk>
+0x8CD9 U+96C7 # <cjk>
+0x8CDA U+9867 # <cjk>
+0x8CDB U+9F13 # <cjk>
+0x8CDC U+4E94 # <cjk>
+0x8CDD U+4E92 # <cjk>
+0x8CDE U+4F0D # <cjk>
+0x8CDF U+5348 # <cjk>
+0x8CE0 U+5449 # <cjk>
+0x8CE1 U+543E # <cjk>
+0x8CE2 U+5A2F # <cjk>
+0x8CE3 U+5F8C # <cjk>
+0x8CE4 U+5FA1 # <cjk>
+0x8CE5 U+609F # <cjk>
+0x8CE6 U+68A7 # <cjk>
+0x8CE7 U+6A8E # <cjk>
+0x8CE8 U+745A # <cjk>
+0x8CE9 U+7881 # <cjk>
+0x8CEA U+8A9E # <cjk>
+0x8CEB U+8AA4 # <cjk>
+0x8CEC U+8B77 # <cjk>
+0x8CED U+9190 # <cjk>
+0x8CEE U+4E5E # <cjk>
+0x8CEF U+9BC9 # <cjk>
+0x8CF0 U+4EA4 # <cjk>
+0x8CF1 U+4F7C # <cjk>
+0x8CF2 U+4FAF # <cjk>
+0x8CF3 U+5019 # <cjk>
+0x8CF4 U+5016 # <cjk>
+0x8CF5 U+5149 # <cjk>
+0x8CF6 U+516C # <cjk>
+0x8CF7 U+529F # <cjk>
+0x8CF8 U+52B9 # <cjk>
+0x8CF9 U+52FE # <cjk>
+0x8CFA U+539A # <cjk>
+0x8CFB U+53E3 # <cjk>
+0x8CFC U+5411 # <cjk>
+0x8D40 U+540E # <cjk>
+0x8D41 U+5589 # <cjk>
+0x8D42 U+5751 # <cjk>
+0x8D43 U+57A2 # <cjk>
+0x8D44 U+597D # <cjk>
+0x8D45 U+5B54 # <cjk>
+0x8D46 U+5B5D # <cjk>
+0x8D47 U+5B8F # <cjk>
+0x8D48 U+5DE5 # <cjk>
+0x8D49 U+5DE7 # <cjk>
+0x8D4A U+5DF7 # <cjk>
+0x8D4B U+5E78 # <cjk>
+0x8D4C U+5E83 # <cjk>
+0x8D4D U+5E9A # <cjk>
+0x8D4E U+5EB7 # <cjk>
+0x8D4F U+5F18 # <cjk>
+0x8D50 U+6052 # <cjk>
+0x8D51 U+614C # <cjk>
+0x8D52 U+6297 # <cjk>
+0x8D53 U+62D8 # <cjk>
+0x8D54 U+63A7 # <cjk>
+0x8D55 U+653B # <cjk>
+0x8D56 U+6602 # <cjk>
+0x8D57 U+6643 # <cjk>
+0x8D58 U+66F4 # <cjk>
+0x8D59 U+676D # <cjk>
+0x8D5A U+6821 # <cjk>
+0x8D5B U+6897 # <cjk>
+0x8D5C U+69CB # <cjk>
+0x8D5D U+6C5F # <cjk>
+0x8D5E U+6D2A # <cjk>
+0x8D5F U+6D69 # <cjk>
+0x8D60 U+6E2F # <cjk>
+0x8D61 U+6E9D # <cjk>
+0x8D62 U+7532 # <cjk>
+0x8D63 U+7687 # <cjk>
+0x8D64 U+786C # <cjk>
+0x8D65 U+7A3F # <cjk>
+0x8D66 U+7CE0 # <cjk>
+0x8D67 U+7D05 # <cjk>
+0x8D68 U+7D18 # <cjk>
+0x8D69 U+7D5E # <cjk>
+0x8D6A U+7DB1 # <cjk>
+0x8D6B U+8015 # <cjk>
+0x8D6C U+8003 # <cjk>
+0x8D6D U+80AF # <cjk>
+0x8D6E U+80B1 # <cjk>
+0x8D6F U+8154 # <cjk>
+0x8D70 U+818F # <cjk>
+0x8D71 U+822A # <cjk>
+0x8D72 U+8352 # <cjk>
+0x8D73 U+884C # <cjk>
+0x8D74 U+8861 # <cjk>
+0x8D75 U+8B1B # <cjk>
+0x8D76 U+8CA2 # <cjk>
+0x8D77 U+8CFC # <cjk>
+0x8D78 U+90CA # <cjk>
+0x8D79 U+9175 # <cjk>
+0x8D7A U+9271 # <cjk>
+0x8D7B U+783F # <cjk>
+0x8D7C U+92FC # <cjk>
+0x8D7D U+95A4 # <cjk>
+0x8D7E U+964D # <cjk>
+0x8D80 U+9805 # <cjk>
+0x8D81 U+9999 # <cjk>
+0x8D82 U+9AD8 # <cjk>
+0x8D83 U+9D3B # <cjk>
+0x8D84 U+525B # <cjk>
+0x8D85 U+52AB # <cjk>
+0x8D86 U+53F7 # <cjk>
+0x8D87 U+5408 # <cjk>
+0x8D88 U+58D5 # <cjk>
+0x8D89 U+62F7 # <cjk>
+0x8D8A U+6FE0 # <cjk>
+0x8D8B U+8C6A # <cjk>
+0x8D8C U+8F5F # <cjk>
+0x8D8D U+9EB9 # <cjk>
+0x8D8E U+514B # <cjk>
+0x8D8F U+523B # <cjk>
+0x8D90 U+544A # <cjk>
+0x8D91 U+56FD # <cjk>
+0x8D92 U+7A40 # <cjk>
+0x8D93 U+9177 # <cjk>
+0x8D94 U+9D60 # <cjk>
+0x8D95 U+9ED2 # <cjk>
+0x8D96 U+7344 # <cjk>
+0x8D97 U+6F09 # <cjk>
+0x8D98 U+8170 # <cjk>
+0x8D99 U+7511 # <cjk>
+0x8D9A U+5FFD # <cjk>
+0x8D9B U+60DA # <cjk>
+0x8D9C U+9AA8 # <cjk>
+0x8D9D U+72DB # <cjk>
+0x8D9E U+8FBC # <cjk>
+0x8D9F U+6B64 # <cjk>
+0x8DA0 U+9803 # <cjk>
+0x8DA1 U+4ECA # <cjk>
+0x8DA2 U+56F0 # <cjk>
+0x8DA3 U+5764 # <cjk>
+0x8DA4 U+58BE # <cjk>
+0x8DA5 U+5A5A # <cjk>
+0x8DA6 U+6068 # <cjk>
+0x8DA7 U+61C7 # <cjk>
+0x8DA8 U+660F # <cjk>
+0x8DA9 U+6606 # <cjk>
+0x8DAA U+6839 # <cjk>
+0x8DAB U+68B1 # <cjk>
+0x8DAC U+6DF7 # <cjk>
+0x8DAD U+75D5 # <cjk>
+0x8DAE U+7D3A # <cjk>
+0x8DAF U+826E # <cjk>
+0x8DB0 U+9B42 # <cjk>
+0x8DB1 U+4E9B # <cjk>
+0x8DB2 U+4F50 # <cjk>
+0x8DB3 U+53C9 # <cjk>
+0x8DB4 U+5506 # <cjk>
+0x8DB5 U+5D6F # <cjk>
+0x8DB6 U+5DE6 # <cjk>
+0x8DB7 U+5DEE # <cjk>
+0x8DB8 U+67FB # <cjk>
+0x8DB9 U+6C99 # <cjk>
+0x8DBA U+7473 # <cjk>
+0x8DBB U+7802 # <cjk>
+0x8DBC U+8A50 # <cjk>
+0x8DBD U+9396 # <cjk>
+0x8DBE U+88DF # <cjk>
+0x8DBF U+5750 # <cjk>
+0x8DC0 U+5EA7 # <cjk>
+0x8DC1 U+632B # <cjk>
+0x8DC2 U+50B5 # <cjk>
+0x8DC3 U+50AC # <cjk>
+0x8DC4 U+518D # <cjk>
+0x8DC5 U+6700 # <cjk>
+0x8DC6 U+54C9 # <cjk>
+0x8DC7 U+585E # <cjk>
+0x8DC8 U+59BB # <cjk>
+0x8DC9 U+5BB0 # <cjk>
+0x8DCA U+5F69 # <cjk>
+0x8DCB U+624D # <cjk>
+0x8DCC U+63A1 # <cjk>
+0x8DCD U+683D # <cjk>
+0x8DCE U+6B73 # <cjk>
+0x8DCF U+6E08 # <cjk>
+0x8DD0 U+707D # <cjk>
+0x8DD1 U+91C7 # <cjk>
+0x8DD2 U+7280 # <cjk>
+0x8DD3 U+7815 # <cjk>
+0x8DD4 U+7826 # <cjk>
+0x8DD5 U+796D # <cjk>
+0x8DD6 U+658E # <cjk>
+0x8DD7 U+7D30 # <cjk>
+0x8DD8 U+83DC # <cjk>
+0x8DD9 U+88C1 # <cjk>
+0x8DDA U+8F09 # <cjk>
+0x8DDB U+969B # <cjk>
+0x8DDC U+5264 # <cjk>
+0x8DDD U+5728 # <cjk>
+0x8DDE U+6750 # <cjk>
+0x8DDF U+7F6A # <cjk>
+0x8DE0 U+8CA1 # <cjk>
+0x8DE1 U+51B4 # <cjk>
+0x8DE2 U+5742 # <cjk>
+0x8DE3 U+962A # <cjk>
+0x8DE4 U+583A # <cjk>
+0x8DE5 U+698A # <cjk>
+0x8DE6 U+80B4 # <cjk>
+0x8DE7 U+54B2 # <cjk>
+0x8DE8 U+5D0E # <cjk>
+0x8DE9 U+57FC # <cjk>
+0x8DEA U+7895 # <cjk>
+0x8DEB U+9DFA # <cjk>
+0x8DEC U+4F5C # <cjk>
+0x8DED U+524A # <cjk>
+0x8DEE U+548B # <cjk>
+0x8DEF U+643E # <cjk>
+0x8DF0 U+6628 # <cjk>
+0x8DF1 U+6714 # <cjk>
+0x8DF2 U+67F5 # <cjk>
+0x8DF3 U+7A84 # <cjk>
+0x8DF4 U+7B56 # <cjk>
+0x8DF5 U+7D22 # <cjk>
+0x8DF6 U+932F # <cjk>
+0x8DF7 U+685C # <cjk>
+0x8DF8 U+9BAD # <cjk>
+0x8DF9 U+7B39 # <cjk>
+0x8DFA U+5319 # <cjk>
+0x8DFB U+518A # <cjk>
+0x8DFC U+5237 # <cjk>
+0x8E40 U+5BDF # <cjk>
+0x8E41 U+62F6 # <cjk>
+0x8E42 U+64AE # <cjk>
+0x8E43 U+64E6 # <cjk>
+0x8E44 U+672D # <cjk>
+0x8E45 U+6BBA # <cjk>
+0x8E46 U+85A9 # <cjk>
+0x8E47 U+96D1 # <cjk>
+0x8E48 U+7690 # <cjk>
+0x8E49 U+9BD6 # <cjk>
+0x8E4A U+634C # <cjk>
+0x8E4B U+9306 # <cjk>
+0x8E4C U+9BAB # <cjk>
+0x8E4D U+76BF # <cjk>
+0x8E4E U+6652 # <cjk>
+0x8E4F U+4E09 # <cjk>
+0x8E50 U+5098 # <cjk>
+0x8E51 U+53C2 # <cjk>
+0x8E52 U+5C71 # <cjk>
+0x8E53 U+60E8 # <cjk>
+0x8E54 U+6492 # <cjk>
+0x8E55 U+6563 # <cjk>
+0x8E56 U+685F # <cjk>
+0x8E57 U+71E6 # <cjk>
+0x8E58 U+73CA # <cjk>
+0x8E59 U+7523 # <cjk>
+0x8E5A U+7B97 # <cjk>
+0x8E5B U+7E82 # <cjk>
+0x8E5C U+8695 # <cjk>
+0x8E5D U+8B83 # <cjk>
+0x8E5E U+8CDB # <cjk>
+0x8E5F U+9178 # <cjk>
+0x8E60 U+9910 # <cjk>
+0x8E61 U+65AC # <cjk>
+0x8E62 U+66AB # <cjk>
+0x8E63 U+6B8B # <cjk>
+0x8E64 U+4ED5 # <cjk>
+0x8E65 U+4ED4 # <cjk>
+0x8E66 U+4F3A # <cjk>
+0x8E67 U+4F7F # <cjk>
+0x8E68 U+523A # <cjk>
+0x8E69 U+53F8 # <cjk>
+0x8E6A U+53F2 # <cjk>
+0x8E6B U+55E3 # <cjk>
+0x8E6C U+56DB # <cjk>
+0x8E6D U+58EB # <cjk>
+0x8E6E U+59CB # <cjk>
+0x8E6F U+59C9 # <cjk>
+0x8E70 U+59FF # <cjk>
+0x8E71 U+5B50 # <cjk>
+0x8E72 U+5C4D # <cjk>
+0x8E73 U+5E02 # <cjk>
+0x8E74 U+5E2B # <cjk>
+0x8E75 U+5FD7 # <cjk>
+0x8E76 U+601D # <cjk>
+0x8E77 U+6307 # <cjk>
+0x8E78 U+652F # <cjk>
+0x8E79 U+5B5C # <cjk>
+0x8E7A U+65AF # <cjk>
+0x8E7B U+65BD # <cjk>
+0x8E7C U+65E8 # <cjk>
+0x8E7D U+679D # <cjk>
+0x8E7E U+6B62 # <cjk>
+0x8E80 U+6B7B # <cjk>
+0x8E81 U+6C0F # <cjk>
+0x8E82 U+7345 # <cjk>
+0x8E83 U+7949 # <cjk>
+0x8E84 U+79C1 # <cjk>
+0x8E85 U+7CF8 # <cjk>
+0x8E86 U+7D19 # <cjk>
+0x8E87 U+7D2B # <cjk>
+0x8E88 U+80A2 # <cjk>
+0x8E89 U+8102 # <cjk>
+0x8E8A U+81F3 # <cjk>
+0x8E8B U+8996 # <cjk>
+0x8E8C U+8A5E # <cjk>
+0x8E8D U+8A69 # <cjk>
+0x8E8E U+8A66 # <cjk>
+0x8E8F U+8A8C # <cjk>
+0x8E90 U+8AEE # <cjk>
+0x8E91 U+8CC7 # <cjk>
+0x8E92 U+8CDC # <cjk>
+0x8E93 U+96CC # <cjk>
+0x8E94 U+98FC # <cjk>
+0x8E95 U+6B6F # <cjk>
+0x8E96 U+4E8B # <cjk>
+0x8E97 U+4F3C # <cjk>
+0x8E98 U+4F8D # <cjk>
+0x8E99 U+5150 # <cjk>
+0x8E9A U+5B57 # <cjk>
+0x8E9B U+5BFA # <cjk>
+0x8E9C U+6148 # <cjk>
+0x8E9D U+6301 # <cjk>
+0x8E9E U+6642 # <cjk>
+0x8E9F U+6B21 # <cjk>
+0x8EA0 U+6ECB # <cjk>
+0x8EA1 U+6CBB # <cjk>
+0x8EA2 U+723E # <cjk>
+0x8EA3 U+74BD # <cjk>
+0x8EA4 U+75D4 # <cjk>
+0x8EA5 U+78C1 # <cjk>
+0x8EA6 U+793A # <cjk>
+0x8EA7 U+800C # <cjk>
+0x8EA8 U+8033 # <cjk>
+0x8EA9 U+81EA # <cjk>
+0x8EAA U+8494 # <cjk>
+0x8EAB U+8F9E # <cjk>
+0x8EAC U+6C50 # <cjk>
+0x8EAD U+9E7F # <cjk>
+0x8EAE U+5F0F # <cjk>
+0x8EAF U+8B58 # <cjk>
+0x8EB0 U+9D2B # <cjk>
+0x8EB1 U+7AFA # <cjk>
+0x8EB2 U+8EF8 # <cjk>
+0x8EB3 U+5B8D # <cjk>
+0x8EB4 U+96EB # <cjk>
+0x8EB5 U+4E03 # <cjk>
+0x8EB6 U+53F1 # <cjk>
+0x8EB7 U+57F7 # <cjk>
+0x8EB8 U+5931 # <cjk>
+0x8EB9 U+5AC9 # <cjk>
+0x8EBA U+5BA4 # <cjk>
+0x8EBB U+6089 # <cjk>
+0x8EBC U+6E7F # <cjk>
+0x8EBD U+6F06 # <cjk>
+0x8EBE U+75BE # <cjk>
+0x8EBF U+8CEA # <cjk>
+0x8EC0 U+5B9F # <cjk>
+0x8EC1 U+8500 # <cjk>
+0x8EC2 U+7BE0 # <cjk>
+0x8EC3 U+5072 # <cjk>
+0x8EC4 U+67F4 # <cjk>
+0x8EC5 U+829D # <cjk>
+0x8EC6 U+5C61 # <cjk>
+0x8EC7 U+854A # <cjk>
+0x8EC8 U+7E1E # <cjk>
+0x8EC9 U+820E # <cjk>
+0x8ECA U+5199 # <cjk>
+0x8ECB U+5C04 # <cjk>
+0x8ECC U+6368 # <cjk>
+0x8ECD U+8D66 # <cjk>
+0x8ECE U+659C # <cjk>
+0x8ECF U+716E # <cjk>
+0x8ED0 U+793E # <cjk>
+0x8ED1 U+7D17 # <cjk>
+0x8ED2 U+8005 # <cjk>
+0x8ED3 U+8B1D # <cjk>
+0x8ED4 U+8ECA # <cjk>
+0x8ED5 U+906E # <cjk>
+0x8ED6 U+86C7 # <cjk>
+0x8ED7 U+90AA # <cjk>
+0x8ED8 U+501F # <cjk>
+0x8ED9 U+52FA # <cjk>
+0x8EDA U+5C3A # <cjk>
+0x8EDB U+6753 # <cjk>
+0x8EDC U+707C # <cjk>
+0x8EDD U+7235 # <cjk>
+0x8EDE U+914C # <cjk>
+0x8EDF U+91C8 # <cjk>
+0x8EE0 U+932B # <cjk>
+0x8EE1 U+82E5 # <cjk>
+0x8EE2 U+5BC2 # <cjk>
+0x8EE3 U+5F31 # <cjk>
+0x8EE4 U+60F9 # <cjk>
+0x8EE5 U+4E3B # <cjk>
+0x8EE6 U+53D6 # <cjk>
+0x8EE7 U+5B88 # <cjk>
+0x8EE8 U+624B # <cjk>
+0x8EE9 U+6731 # <cjk>
+0x8EEA U+6B8A # <cjk>
+0x8EEB U+72E9 # <cjk>
+0x8EEC U+73E0 # <cjk>
+0x8EED U+7A2E # <cjk>
+0x8EEE U+816B # <cjk>
+0x8EEF U+8DA3 # <cjk>
+0x8EF0 U+9152 # <cjk>
+0x8EF1 U+9996 # <cjk>
+0x8EF2 U+5112 # <cjk>
+0x8EF3 U+53D7 # <cjk>
+0x8EF4 U+546A # <cjk>
+0x8EF5 U+5BFF # <cjk>
+0x8EF6 U+6388 # <cjk>
+0x8EF7 U+6A39 # <cjk>
+0x8EF8 U+7DAC # <cjk>
+0x8EF9 U+9700 # <cjk>
+0x8EFA U+56DA # <cjk>
+0x8EFB U+53CE # <cjk>
+0x8EFC U+5468 # <cjk>
+0x8F40 U+5B97 # <cjk>
+0x8F41 U+5C31 # <cjk>
+0x8F42 U+5DDE # <cjk>
+0x8F43 U+4FEE # <cjk>
+0x8F44 U+6101 # <cjk>
+0x8F45 U+62FE # <cjk>
+0x8F46 U+6D32 # <cjk>
+0x8F47 U+79C0 # <cjk>
+0x8F48 U+79CB # <cjk>
+0x8F49 U+7D42 # <cjk>
+0x8F4A U+7E4D # <cjk>
+0x8F4B U+7FD2 # <cjk>
+0x8F4C U+81ED # <cjk>
+0x8F4D U+821F # <cjk>
+0x8F4E U+8490 # <cjk>
+0x8F4F U+8846 # <cjk>
+0x8F50 U+8972 # <cjk>
+0x8F51 U+8B90 # <cjk>
+0x8F52 U+8E74 # <cjk>
+0x8F53 U+8F2F # <cjk>
+0x8F54 U+9031 # <cjk>
+0x8F55 U+914B # <cjk>
+0x8F56 U+916C # <cjk>
+0x8F57 U+96C6 # <cjk>
+0x8F58 U+919C # <cjk>
+0x8F59 U+4EC0 # <cjk>
+0x8F5A U+4F4F # <cjk>
+0x8F5B U+5145 # <cjk>
+0x8F5C U+5341 # <cjk>
+0x8F5D U+5F93 # <cjk>
+0x8F5E U+620E # <cjk>
+0x8F5F U+67D4 # <cjk>
+0x8F60 U+6C41 # <cjk>
+0x8F61 U+6E0B # <cjk>
+0x8F62 U+7363 # <cjk>
+0x8F63 U+7E26 # <cjk>
+0x8F64 U+91CD # <cjk>
+0x8F65 U+9283 # <cjk>
+0x8F66 U+53D4 # <cjk>
+0x8F67 U+5919 # <cjk>
+0x8F68 U+5BBF # <cjk>
+0x8F69 U+6DD1 # <cjk>
+0x8F6A U+795D # <cjk>
+0x8F6B U+7E2E # <cjk>
+0x8F6C U+7C9B # <cjk>
+0x8F6D U+587E # <cjk>
+0x8F6E U+719F # <cjk>
+0x8F6F U+51FA # <cjk>
+0x8F70 U+8853 # <cjk>
+0x8F71 U+8FF0 # <cjk>
+0x8F72 U+4FCA # <cjk>
+0x8F73 U+5CFB # <cjk>
+0x8F74 U+6625 # <cjk>
+0x8F75 U+77AC # <cjk>
+0x8F76 U+7AE3 # <cjk>
+0x8F77 U+821C # <cjk>
+0x8F78 U+99FF # <cjk>
+0x8F79 U+51C6 # <cjk>
+0x8F7A U+5FAA # <cjk>
+0x8F7B U+65EC # <cjk>
+0x8F7C U+696F # <cjk>
+0x8F7D U+6B89 # <cjk>
+0x8F7E U+6DF3 # <cjk>
+0x8F80 U+6E96 # <cjk>
+0x8F81 U+6F64 # <cjk>
+0x8F82 U+76FE # <cjk>
+0x8F83 U+7D14 # <cjk>
+0x8F84 U+5DE1 # <cjk>
+0x8F85 U+9075 # <cjk>
+0x8F86 U+9187 # <cjk>
+0x8F87 U+9806 # <cjk>
+0x8F88 U+51E6 # <cjk>
+0x8F89 U+521D # <cjk>
+0x8F8A U+6240 # <cjk>
+0x8F8B U+6691 # <cjk>
+0x8F8C U+66D9 # <cjk>
+0x8F8D U+6E1A # <cjk>
+0x8F8E U+5EB6 # <cjk>
+0x8F8F U+7DD2 # <cjk>
+0x8F90 U+7F72 # <cjk>
+0x8F91 U+66F8 # <cjk>
+0x8F92 U+85AF # <cjk>
+0x8F93 U+85F7 # <cjk>
+0x8F94 U+8AF8 # <cjk>
+0x8F95 U+52A9 # <cjk>
+0x8F96 U+53D9 # <cjk>
+0x8F97 U+5973 # <cjk>
+0x8F98 U+5E8F # <cjk>
+0x8F99 U+5F90 # <cjk>
+0x8F9A U+6055 # <cjk>
+0x8F9B U+92E4 # <cjk>
+0x8F9C U+9664 # <cjk>
+0x8F9D U+50B7 # <cjk>
+0x8F9E U+511F # <cjk>
+0x8F9F U+52DD # <cjk>
+0x8FA0 U+5320 # <cjk>
+0x8FA1 U+5347 # <cjk>
+0x8FA2 U+53EC # <cjk>
+0x8FA3 U+54E8 # <cjk>
+0x8FA4 U+5546 # <cjk>
+0x8FA5 U+5531 # <cjk>
+0x8FA6 U+5617 # <cjk>
+0x8FA7 U+5968 # <cjk>
+0x8FA8 U+59BE # <cjk>
+0x8FA9 U+5A3C # <cjk>
+0x8FAA U+5BB5 # <cjk>
+0x8FAB U+5C06 # <cjk>
+0x8FAC U+5C0F # <cjk>
+0x8FAD U+5C11 # <cjk>
+0x8FAE U+5C1A # <cjk>
+0x8FAF U+5E84 # <cjk>
+0x8FB0 U+5E8A # <cjk>
+0x8FB1 U+5EE0 # <cjk>
+0x8FB2 U+5F70 # <cjk>
+0x8FB3 U+627F # <cjk>
+0x8FB4 U+6284 # <cjk>
+0x8FB5 U+62DB # <cjk>
+0x8FB6 U+638C # <cjk>
+0x8FB7 U+6377 # <cjk>
+0x8FB8 U+6607 # <cjk>
+0x8FB9 U+660C # <cjk>
+0x8FBA U+662D # <cjk>
+0x8FBB U+6676 # <cjk>
+0x8FBC U+677E # <cjk>
+0x8FBD U+68A2 # <cjk>
+0x8FBE U+6A1F # <cjk>
+0x8FBF U+6A35 # <cjk>
+0x8FC0 U+6CBC # <cjk>
+0x8FC1 U+6D88 # <cjk>
+0x8FC2 U+6E09 # <cjk>
+0x8FC3 U+6E58 # <cjk>
+0x8FC4 U+713C # <cjk>
+0x8FC5 U+7126 # <cjk>
+0x8FC6 U+7167 # <cjk>
+0x8FC7 U+75C7 # <cjk>
+0x8FC8 U+7701 # <cjk>
+0x8FC9 U+785D # <cjk>
+0x8FCA U+7901 # <cjk>
+0x8FCB U+7965 # <cjk>
+0x8FCC U+79F0 # <cjk>
+0x8FCD U+7AE0 # <cjk>
+0x8FCE U+7B11 # <cjk>
+0x8FCF U+7CA7 # <cjk>
+0x8FD0 U+7D39 # <cjk>
+0x8FD1 U+8096 # <cjk>
+0x8FD2 U+83D6 # <cjk>
+0x8FD3 U+848B # <cjk>
+0x8FD4 U+8549 # <cjk>
+0x8FD5 U+885D # <cjk>
+0x8FD6 U+88F3 # <cjk>
+0x8FD7 U+8A1F # <cjk>
+0x8FD8 U+8A3C # <cjk>
+0x8FD9 U+8A54 # <cjk>
+0x8FDA U+8A73 # <cjk>
+0x8FDB U+8C61 # <cjk>
+0x8FDC U+8CDE # <cjk>
+0x8FDD U+91A4 # <cjk>
+0x8FDE U+9266 # <cjk>
+0x8FDF U+937E # <cjk>
+0x8FE0 U+9418 # <cjk>
+0x8FE1 U+969C # <cjk>
+0x8FE2 U+9798 # <cjk>
+0x8FE3 U+4E0A # <cjk>
+0x8FE4 U+4E08 # <cjk>
+0x8FE5 U+4E1E # <cjk>
+0x8FE6 U+4E57 # <cjk>
+0x8FE7 U+5197 # <cjk>
+0x8FE8 U+5270 # <cjk>
+0x8FE9 U+57CE # <cjk>
+0x8FEA U+5834 # <cjk>
+0x8FEB U+58CC # <cjk>
+0x8FEC U+5B22 # <cjk>
+0x8FED U+5E38 # <cjk>
+0x8FEE U+60C5 # <cjk>
+0x8FEF U+64FE # <cjk>
+0x8FF0 U+6761 # <cjk>
+0x8FF1 U+6756 # <cjk>
+0x8FF2 U+6D44 # <cjk>
+0x8FF3 U+72B6 # <cjk>
+0x8FF4 U+7573 # <cjk>
+0x8FF5 U+7A63 # <cjk>
+0x8FF6 U+84B8 # <cjk>
+0x8FF7 U+8B72 # <cjk>
+0x8FF8 U+91B8 # <cjk>
+0x8FF9 U+9320 # <cjk>
+0x8FFA U+5631 # <cjk>
+0x8FFB U+57F4 # <cjk>
+0x8FFC U+98FE # <cjk>
+0x9040 U+62ED # <cjk>
+0x9041 U+690D # <cjk>
+0x9042 U+6B96 # <cjk>
+0x9043 U+71ED # <cjk>
+0x9044 U+7E54 # <cjk>
+0x9045 U+8077 # <cjk>
+0x9046 U+8272 # <cjk>
+0x9047 U+89E6 # <cjk>
+0x9048 U+98DF # <cjk>
+0x9049 U+8755 # <cjk>
+0x904A U+8FB1 # <cjk>
+0x904B U+5C3B # <cjk>
+0x904C U+4F38 # <cjk>
+0x904D U+4FE1 # <cjk>
+0x904E U+4FB5 # <cjk>
+0x904F U+5507 # <cjk>
+0x9050 U+5A20 # <cjk>
+0x9051 U+5BDD # <cjk>
+0x9052 U+5BE9 # <cjk>
+0x9053 U+5FC3 # <cjk>
+0x9054 U+614E # <cjk>
+0x9055 U+632F # <cjk>
+0x9056 U+65B0 # <cjk>
+0x9057 U+664B # <cjk>
+0x9058 U+68EE # <cjk>
+0x9059 U+699B # <cjk>
+0x905A U+6D78 # <cjk>
+0x905B U+6DF1 # <cjk>
+0x905C U+7533 # <cjk>
+0x905D U+75B9 # <cjk>
+0x905E U+771F # <cjk>
+0x905F U+795E # <cjk>
+0x9060 U+79E6 # <cjk>
+0x9061 U+7D33 # <cjk>
+0x9062 U+81E3 # <cjk>
+0x9063 U+82AF # <cjk>
+0x9064 U+85AA # <cjk>
+0x9065 U+89AA # <cjk>
+0x9066 U+8A3A # <cjk>
+0x9067 U+8EAB # <cjk>
+0x9068 U+8F9B # <cjk>
+0x9069 U+9032 # <cjk>
+0x906A U+91DD # <cjk>
+0x906B U+9707 # <cjk>
+0x906C U+4EBA # <cjk>
+0x906D U+4EC1 # <cjk>
+0x906E U+5203 # <cjk>
+0x906F U+5875 # <cjk>
+0x9070 U+58EC # <cjk>
+0x9071 U+5C0B # <cjk>
+0x9072 U+751A # <cjk>
+0x9073 U+5C3D # <cjk>
+0x9074 U+814E # <cjk>
+0x9075 U+8A0A # <cjk>
+0x9076 U+8FC5 # <cjk>
+0x9077 U+9663 # <cjk>
+0x9078 U+976D # <cjk>
+0x9079 U+7B25 # <cjk>
+0x907A U+8ACF # <cjk>
+0x907B U+9808 # <cjk>
+0x907C U+9162 # <cjk>
+0x907D U+56F3 # <cjk>
+0x907E U+53A8 # <cjk>
+0x9080 U+9017 # <cjk>
+0x9081 U+5439 # <cjk>
+0x9082 U+5782 # <cjk>
+0x9083 U+5E25 # <cjk>
+0x9084 U+63A8 # <cjk>
+0x9085 U+6C34 # <cjk>
+0x9086 U+708A # <cjk>
+0x9087 U+7761 # <cjk>
+0x9088 U+7C8B # <cjk>
+0x9089 U+7FE0 # <cjk>
+0x908A U+8870 # <cjk>
+0x908B U+9042 # <cjk>
+0x908C U+9154 # <cjk>
+0x908D U+9310 # <cjk>
+0x908E U+9318 # <cjk>
+0x908F U+968F # <cjk>
+0x9090 U+745E # <cjk>
+0x9091 U+9AC4 # <cjk>
+0x9092 U+5D07 # <cjk>
+0x9093 U+5D69 # <cjk>
+0x9094 U+6570 # <cjk>
+0x9095 U+67A2 # <cjk>
+0x9096 U+8DA8 # <cjk>
+0x9097 U+96DB # <cjk>
+0x9098 U+636E # <cjk>
+0x9099 U+6749 # <cjk>
+0x909A U+6919 # <cjk>
+0x909B U+83C5 # <cjk>
+0x909C U+9817 # <cjk>
+0x909D U+96C0 # <cjk>
+0x909E U+88FE # <cjk>
+0x909F U+6F84 # <cjk>
+0x90A0 U+647A # <cjk>
+0x90A1 U+5BF8 # <cjk>
+0x90A2 U+4E16 # <cjk>
+0x90A3 U+702C # <cjk>
+0x90A4 U+755D # <cjk>
+0x90A5 U+662F # <cjk>
+0x90A6 U+51C4 # <cjk>
+0x90A7 U+5236 # <cjk>
+0x90A8 U+52E2 # <cjk>
+0x90A9 U+59D3 # <cjk>
+0x90AA U+5F81 # <cjk>
+0x90AB U+6027 # <cjk>
+0x90AC U+6210 # <cjk>
+0x90AD U+653F # <cjk>
+0x90AE U+6574 # <cjk>
+0x90AF U+661F # <cjk>
+0x90B0 U+6674 # <cjk>
+0x90B1 U+68F2 # <cjk>
+0x90B2 U+6816 # <cjk>
+0x90B3 U+6B63 # <cjk>
+0x90B4 U+6E05 # <cjk>
+0x90B5 U+7272 # <cjk>
+0x90B6 U+751F # <cjk>
+0x90B7 U+76DB # <cjk>
+0x90B8 U+7CBE # <cjk>
+0x90B9 U+8056 # <cjk>
+0x90BA U+58F0 # <cjk>
+0x90BB U+88FD # <cjk>
+0x90BC U+897F # <cjk>
+0x90BD U+8AA0 # <cjk>
+0x90BE U+8A93 # <cjk>
+0x90BF U+8ACB # <cjk>
+0x90C0 U+901D # <cjk>
+0x90C1 U+9192 # <cjk>
+0x90C2 U+9752 # <cjk>
+0x90C3 U+9759 # <cjk>
+0x90C4 U+6589 # <cjk>
+0x90C5 U+7A0E # <cjk>
+0x90C6 U+8106 # <cjk>
+0x90C7 U+96BB # <cjk>
+0x90C8 U+5E2D # <cjk>
+0x90C9 U+60DC # <cjk>
+0x90CA U+621A # <cjk>
+0x90CB U+65A5 # <cjk>
+0x90CC U+6614 # <cjk>
+0x90CD U+6790 # <cjk>
+0x90CE U+77F3 # <cjk>
+0x90CF U+7A4D # <cjk>
+0x90D0 U+7C4D # <cjk>
+0x90D1 U+7E3E # <cjk>
+0x90D2 U+810A # <cjk>
+0x90D3 U+8CAC # <cjk>
+0x90D4 U+8D64 # <cjk>
+0x90D5 U+8DE1 # <cjk>
+0x90D6 U+8E5F # <cjk>
+0x90D7 U+78A9 # <cjk>
+0x90D8 U+5207 # <cjk>
+0x90D9 U+62D9 # <cjk>
+0x90DA U+63A5 # <cjk>
+0x90DB U+6442 # <cjk>
+0x90DC U+6298 # <cjk>
+0x90DD U+8A2D # <cjk>
+0x90DE U+7A83 # <cjk>
+0x90DF U+7BC0 # <cjk>
+0x90E0 U+8AAC # <cjk>
+0x90E1 U+96EA # <cjk>
+0x90E2 U+7D76 # <cjk>
+0x90E3 U+820C # <cjk>
+0x90E4 U+8749 # <cjk>
+0x90E5 U+4ED9 # <cjk>
+0x90E6 U+5148 # <cjk>
+0x90E7 U+5343 # <cjk>
+0x90E8 U+5360 # <cjk>
+0x90E9 U+5BA3 # <cjk>
+0x90EA U+5C02 # <cjk>
+0x90EB U+5C16 # <cjk>
+0x90EC U+5DDD # <cjk>
+0x90ED U+6226 # <cjk>
+0x90EE U+6247 # <cjk>
+0x90EF U+64B0 # <cjk>
+0x90F0 U+6813 # <cjk>
+0x90F1 U+6834 # <cjk>
+0x90F2 U+6CC9 # <cjk>
+0x90F3 U+6D45 # <cjk>
+0x90F4 U+6D17 # <cjk>
+0x90F5 U+67D3 # <cjk>
+0x90F6 U+6F5C # <cjk>
+0x90F7 U+714E # <cjk>
+0x90F8 U+717D # <cjk>
+0x90F9 U+65CB # <cjk>
+0x90FA U+7A7F # <cjk>
+0x90FB U+7BAD # <cjk>
+0x90FC U+7DDA # <cjk>
+0x9140 U+7E4A # <cjk>
+0x9141 U+7FA8 # <cjk>
+0x9142 U+817A # <cjk>
+0x9143 U+821B # <cjk>
+0x9144 U+8239 # <cjk>
+0x9145 U+85A6 # <cjk>
+0x9146 U+8A6E # <cjk>
+0x9147 U+8CCE # <cjk>
+0x9148 U+8DF5 # <cjk>
+0x9149 U+9078 # <cjk>
+0x914A U+9077 # <cjk>
+0x914B U+92AD # <cjk>
+0x914C U+9291 # <cjk>
+0x914D U+9583 # <cjk>
+0x914E U+9BAE # <cjk>
+0x914F U+524D # <cjk>
+0x9150 U+5584 # <cjk>
+0x9151 U+6F38 # <cjk>
+0x9152 U+7136 # <cjk>
+0x9153 U+5168 # <cjk>
+0x9154 U+7985 # <cjk>
+0x9155 U+7E55 # <cjk>
+0x9156 U+81B3 # <cjk>
+0x9157 U+7CCE # <cjk>
+0x9158 U+564C # <cjk>
+0x9159 U+5851 # <cjk>
+0x915A U+5CA8 # <cjk>
+0x915B U+63AA # <cjk>
+0x915C U+66FE # <cjk>
+0x915D U+66FD # <cjk>
+0x915E U+695A # <cjk>
+0x915F U+72D9 # <cjk>
+0x9160 U+758F # <cjk>
+0x9161 U+758E # <cjk>
+0x9162 U+790E # <cjk>
+0x9163 U+7956 # <cjk>
+0x9164 U+79DF # <cjk>
+0x9165 U+7C97 # <cjk>
+0x9166 U+7D20 # <cjk>
+0x9167 U+7D44 # <cjk>
+0x9168 U+8607 # <cjk>
+0x9169 U+8A34 # <cjk>
+0x916A U+963B # <cjk>
+0x916B U+9061 # <cjk>
+0x916C U+9F20 # <cjk>
+0x916D U+50E7 # <cjk>
+0x916E U+5275 # <cjk>
+0x916F U+53CC # <cjk>
+0x9170 U+53E2 # <cjk>
+0x9171 U+5009 # <cjk>
+0x9172 U+55AA # <cjk>
+0x9173 U+58EE # <cjk>
+0x9174 U+594F # <cjk>
+0x9175 U+723D # <cjk>
+0x9176 U+5B8B # <cjk>
+0x9177 U+5C64 # <cjk>
+0x9178 U+531D # <cjk>
+0x9179 U+60E3 # <cjk>
+0x917A U+60F3 # <cjk>
+0x917B U+635C # <cjk>
+0x917C U+6383 # <cjk>
+0x917D U+633F # <cjk>
+0x917E U+63BB # <cjk>
+0x9180 U+64CD # <cjk>
+0x9181 U+65E9 # <cjk>
+0x9182 U+66F9 # <cjk>
+0x9183 U+5DE3 # <cjk>
+0x9184 U+69CD # <cjk>
+0x9185 U+69FD # <cjk>
+0x9186 U+6F15 # <cjk>
+0x9187 U+71E5 # <cjk>
+0x9188 U+4E89 # <cjk>
+0x9189 U+75E9 # <cjk>
+0x918A U+76F8 # <cjk>
+0x918B U+7A93 # <cjk>
+0x918C U+7CDF # <cjk>
+0x918D U+7DCF # <cjk>
+0x918E U+7D9C # <cjk>
+0x918F U+8061 # <cjk>
+0x9190 U+8349 # <cjk>
+0x9191 U+8358 # <cjk>
+0x9192 U+846C # <cjk>
+0x9193 U+84BC # <cjk>
+0x9194 U+85FB # <cjk>
+0x9195 U+88C5 # <cjk>
+0x9196 U+8D70 # <cjk>
+0x9197 U+9001 # <cjk>
+0x9198 U+906D # <cjk>
+0x9199 U+9397 # <cjk>
+0x919A U+971C # <cjk>
+0x919B U+9A12 # <cjk>
+0x919C U+50CF # <cjk>
+0x919D U+5897 # <cjk>
+0x919E U+618E # <cjk>
+0x919F U+81D3 # <cjk>
+0x91A0 U+8535 # <cjk>
+0x91A1 U+8D08 # <cjk>
+0x91A2 U+9020 # <cjk>
+0x91A3 U+4FC3 # <cjk>
+0x91A4 U+5074 # <cjk>
+0x91A5 U+5247 # <cjk>
+0x91A6 U+5373 # <cjk>
+0x91A7 U+606F # <cjk>
+0x91A8 U+6349 # <cjk>
+0x91A9 U+675F # <cjk>
+0x91AA U+6E2C # <cjk>
+0x91AB U+8DB3 # <cjk>
+0x91AC U+901F # <cjk>
+0x91AD U+4FD7 # <cjk>
+0x91AE U+5C5E # <cjk>
+0x91AF U+8CCA # <cjk>
+0x91B0 U+65CF # <cjk>
+0x91B1 U+7D9A # <cjk>
+0x91B2 U+5352 # <cjk>
+0x91B3 U+8896 # <cjk>
+0x91B4 U+5176 # <cjk>
+0x91B5 U+63C3 # <cjk>
+0x91B6 U+5B58 # <cjk>
+0x91B7 U+5B6B # <cjk>
+0x91B8 U+5C0A # <cjk>
+0x91B9 U+640D # <cjk>
+0x91BA U+6751 # <cjk>
+0x91BB U+905C # <cjk>
+0x91BC U+4ED6 # <cjk>
+0x91BD U+591A # <cjk>
+0x91BE U+592A # <cjk>
+0x91BF U+6C70 # <cjk>
+0x91C0 U+8A51 # <cjk>
+0x91C1 U+553E # <cjk>
+0x91C2 U+5815 # <cjk>
+0x91C3 U+59A5 # <cjk>
+0x91C4 U+60F0 # <cjk>
+0x91C5 U+6253 # <cjk>
+0x91C6 U+67C1 # <cjk>
+0x91C7 U+8235 # <cjk>
+0x91C8 U+6955 # <cjk>
+0x91C9 U+9640 # <cjk>
+0x91CA U+99C4 # <cjk>
+0x91CB U+9A28 # <cjk>
+0x91CC U+4F53 # <cjk>
+0x91CD U+5806 # <cjk>
+0x91CE U+5BFE # <cjk>
+0x91CF U+8010 # <cjk>
+0x91D0 U+5CB1 # <cjk>
+0x91D1 U+5E2F # <cjk>
+0x91D2 U+5F85 # <cjk>
+0x91D3 U+6020 # <cjk>
+0x91D4 U+614B # <cjk>
+0x91D5 U+6234 # <cjk>
+0x91D6 U+66FF # <cjk>
+0x91D7 U+6CF0 # <cjk>
+0x91D8 U+6EDE # <cjk>
+0x91D9 U+80CE # <cjk>
+0x91DA U+817F # <cjk>
+0x91DB U+82D4 # <cjk>
+0x91DC U+888B # <cjk>
+0x91DD U+8CB8 # <cjk>
+0x91DE U+9000 # <cjk>
+0x91DF U+902E # <cjk>
+0x91E0 U+968A # <cjk>
+0x91E1 U+9EDB # <cjk>
+0x91E2 U+9BDB # <cjk>
+0x91E3 U+4EE3 # <cjk>
+0x91E4 U+53F0 # <cjk>
+0x91E5 U+5927 # <cjk>
+0x91E6 U+7B2C # <cjk>
+0x91E7 U+918D # <cjk>
+0x91E8 U+984C # <cjk>
+0x91E9 U+9DF9 # <cjk>
+0x91EA U+6EDD # <cjk>
+0x91EB U+7027 # <cjk>
+0x91EC U+5353 # <cjk>
+0x91ED U+5544 # <cjk>
+0x91EE U+5B85 # <cjk>
+0x91EF U+6258 # <cjk>
+0x91F0 U+629E # <cjk>
+0x91F1 U+62D3 # <cjk>
+0x91F2 U+6CA2 # <cjk>
+0x91F3 U+6FEF # <cjk>
+0x91F4 U+7422 # <cjk>
+0x91F5 U+8A17 # <cjk>
+0x91F6 U+9438 # <cjk>
+0x91F7 U+6FC1 # <cjk>
+0x91F8 U+8AFE # <cjk>
+0x91F9 U+8338 # <cjk>
+0x91FA U+51E7 # <cjk>
+0x91FB U+86F8 # <cjk>
+0x91FC U+53EA # <cjk>
+0x9240 U+53E9 # <cjk>
+0x9241 U+4F46 # <cjk>
+0x9242 U+9054 # <cjk>
+0x9243 U+8FB0 # <cjk>
+0x9244 U+596A # <cjk>
+0x9245 U+8131 # <cjk>
+0x9246 U+5DFD # <cjk>
+0x9247 U+7AEA # <cjk>
+0x9248 U+8FBF # <cjk>
+0x9249 U+68DA # <cjk>
+0x924A U+8C37 # <cjk>
+0x924B U+72F8 # <cjk>
+0x924C U+9C48 # <cjk>
+0x924D U+6A3D # <cjk>
+0x924E U+8AB0 # <cjk>
+0x924F U+4E39 # <cjk>
+0x9250 U+5358 # <cjk>
+0x9251 U+5606 # <cjk>
+0x9252 U+5766 # <cjk>
+0x9253 U+62C5 # <cjk>
+0x9254 U+63A2 # <cjk>
+0x9255 U+65E6 # <cjk>
+0x9256 U+6B4E # <cjk>
+0x9257 U+6DE1 # <cjk>
+0x9258 U+6E5B # <cjk>
+0x9259 U+70AD # <cjk>
+0x925A U+77ED # <cjk>
+0x925B U+7AEF # <cjk>
+0x925C U+7BAA # <cjk>
+0x925D U+7DBB # <cjk>
+0x925E U+803D # <cjk>
+0x925F U+80C6 # <cjk>
+0x9260 U+86CB # <cjk>
+0x9261 U+8A95 # <cjk>
+0x9262 U+935B # <cjk>
+0x9263 U+56E3 # <cjk>
+0x9264 U+58C7 # <cjk>
+0x9265 U+5F3E # <cjk>
+0x9266 U+65AD # <cjk>
+0x9267 U+6696 # <cjk>
+0x9268 U+6A80 # <cjk>
+0x9269 U+6BB5 # <cjk>
+0x926A U+7537 # <cjk>
+0x926B U+8AC7 # <cjk>
+0x926C U+5024 # <cjk>
+0x926D U+77E5 # <cjk>
+0x926E U+5730 # <cjk>
+0x926F U+5F1B # <cjk>
+0x9270 U+6065 # <cjk>
+0x9271 U+667A # <cjk>
+0x9272 U+6C60 # <cjk>
+0x9273 U+75F4 # <cjk>
+0x9274 U+7A1A # <cjk>
+0x9275 U+7F6E # <cjk>
+0x9276 U+81F4 # <cjk>
+0x9277 U+8718 # <cjk>
+0x9278 U+9045 # <cjk>
+0x9279 U+99B3 # <cjk>
+0x927A U+7BC9 # <cjk>
+0x927B U+755C # <cjk>
+0x927C U+7AF9 # <cjk>
+0x927D U+7B51 # <cjk>
+0x927E U+84C4 # <cjk>
+0x9280 U+9010 # <cjk>
+0x9281 U+79E9 # <cjk>
+0x9282 U+7A92 # <cjk>
+0x9283 U+8336 # <cjk>
+0x9284 U+5AE1 # <cjk>
+0x9285 U+7740 # <cjk>
+0x9286 U+4E2D # <cjk>
+0x9287 U+4EF2 # <cjk>
+0x9288 U+5B99 # <cjk>
+0x9289 U+5FE0 # <cjk>
+0x928A U+62BD # <cjk>
+0x928B U+663C # <cjk>
+0x928C U+67F1 # <cjk>
+0x928D U+6CE8 # <cjk>
+0x928E U+866B # <cjk>
+0x928F U+8877 # <cjk>
+0x9290 U+8A3B # <cjk>
+0x9291 U+914E # <cjk>
+0x9292 U+92F3 # <cjk>
+0x9293 U+99D0 # <cjk>
+0x9294 U+6A17 # <cjk>
+0x9295 U+7026 # <cjk>
+0x9296 U+732A # <cjk>
+0x9297 U+82E7 # <cjk>
+0x9298 U+8457 # <cjk>
+0x9299 U+8CAF # <cjk>
+0x929A U+4E01 # <cjk>
+0x929B U+5146 # <cjk>
+0x929C U+51CB # <cjk>
+0x929D U+558B # <cjk>
+0x929E U+5BF5 # <cjk>
+0x929F U+5E16 # <cjk>
+0x92A0 U+5E33 # <cjk>
+0x92A1 U+5E81 # <cjk>
+0x92A2 U+5F14 # <cjk>
+0x92A3 U+5F35 # <cjk>
+0x92A4 U+5F6B # <cjk>
+0x92A5 U+5FB4 # <cjk>
+0x92A6 U+61F2 # <cjk>
+0x92A7 U+6311 # <cjk>
+0x92A8 U+66A2 # <cjk>
+0x92A9 U+671D # <cjk>
+0x92AA U+6F6E # <cjk>
+0x92AB U+7252 # <cjk>
+0x92AC U+753A # <cjk>
+0x92AD U+773A # <cjk>
+0x92AE U+8074 # <cjk>
+0x92AF U+8139 # <cjk>
+0x92B0 U+8178 # <cjk>
+0x92B1 U+8776 # <cjk>
+0x92B2 U+8ABF # <cjk>
+0x92B3 U+8ADC # <cjk>
+0x92B4 U+8D85 # <cjk>
+0x92B5 U+8DF3 # <cjk>
+0x92B6 U+929A # <cjk>
+0x92B7 U+9577 # <cjk>
+0x92B8 U+9802 # <cjk>
+0x92B9 U+9CE5 # <cjk>
+0x92BA U+52C5 # <cjk>
+0x92BB U+6357 # <cjk>
+0x92BC U+76F4 # <cjk>
+0x92BD U+6715 # <cjk>
+0x92BE U+6C88 # <cjk>
+0x92BF U+73CD # <cjk>
+0x92C0 U+8CC3 # <cjk>
+0x92C1 U+93AE # <cjk>
+0x92C2 U+9673 # <cjk>
+0x92C3 U+6D25 # <cjk>
+0x92C4 U+589C # <cjk>
+0x92C5 U+690E # <cjk>
+0x92C6 U+69CC # <cjk>
+0x92C7 U+8FFD # <cjk>
+0x92C8 U+939A # <cjk>
+0x92C9 U+75DB # <cjk>
+0x92CA U+901A # <cjk>
+0x92CB U+585A # <cjk>
+0x92CC U+6802 # <cjk>
+0x92CD U+63B4 # <cjk>
+0x92CE U+69FB # <cjk>
+0x92CF U+4F43 # <cjk>
+0x92D0 U+6F2C # <cjk>
+0x92D1 U+67D8 # <cjk>
+0x92D2 U+8FBB # <cjk>
+0x92D3 U+8526 # <cjk>
+0x92D4 U+7DB4 # <cjk>
+0x92D5 U+9354 # <cjk>
+0x92D6 U+693F # <cjk>
+0x92D7 U+6F70 # <cjk>
+0x92D8 U+576A # <cjk>
+0x92D9 U+58F7 # <cjk>
+0x92DA U+5B2C # <cjk>
+0x92DB U+7D2C # <cjk>
+0x92DC U+722A # <cjk>
+0x92DD U+540A # <cjk>
+0x92DE U+91E3 # <cjk>
+0x92DF U+9DB4 # <cjk>
+0x92E0 U+4EAD # <cjk>
+0x92E1 U+4F4E # <cjk>
+0x92E2 U+505C # <cjk>
+0x92E3 U+5075 # <cjk>
+0x92E4 U+5243 # <cjk>
+0x92E5 U+8C9E # <cjk>
+0x92E6 U+5448 # <cjk>
+0x92E7 U+5824 # <cjk>
+0x92E8 U+5B9A # <cjk>
+0x92E9 U+5E1D # <cjk>
+0x92EA U+5E95 # <cjk>
+0x92EB U+5EAD # <cjk>
+0x92EC U+5EF7 # <cjk>
+0x92ED U+5F1F # <cjk>
+0x92EE U+608C # <cjk>
+0x92EF U+62B5 # <cjk>
+0x92F0 U+633A # <cjk>
+0x92F1 U+63D0 # <cjk>
+0x92F2 U+68AF # <cjk>
+0x92F3 U+6C40 # <cjk>
+0x92F4 U+7887 # <cjk>
+0x92F5 U+798E # <cjk>
+0x92F6 U+7A0B # <cjk>
+0x92F7 U+7DE0 # <cjk>
+0x92F8 U+8247 # <cjk>
+0x92F9 U+8A02 # <cjk>
+0x92FA U+8AE6 # <cjk>
+0x92FB U+8E44 # <cjk>
+0x92FC U+9013 # <cjk>
+0x9340 U+90B8 # <cjk>
+0x9341 U+912D # <cjk>
+0x9342 U+91D8 # <cjk>
+0x9343 U+9F0E # <cjk>
+0x9344 U+6CE5 # <cjk>
+0x9345 U+6458 # <cjk>
+0x9346 U+64E2 # <cjk>
+0x9347 U+6575 # <cjk>
+0x9348 U+6EF4 # <cjk>
+0x9349 U+7684 # <cjk>
+0x934A U+7B1B # <cjk>
+0x934B U+9069 # <cjk>
+0x934C U+93D1 # <cjk>
+0x934D U+6EBA # <cjk>
+0x934E U+54F2 # <cjk>
+0x934F U+5FB9 # <cjk>
+0x9350 U+64A4 # <cjk>
+0x9351 U+8F4D # <cjk>
+0x9352 U+8FED # <cjk>
+0x9353 U+9244 # <cjk>
+0x9354 U+5178 # <cjk>
+0x9355 U+586B # <cjk>
+0x9356 U+5929 # <cjk>
+0x9357 U+5C55 # <cjk>
+0x9358 U+5E97 # <cjk>
+0x9359 U+6DFB # <cjk>
+0x935A U+7E8F # <cjk>
+0x935B U+751C # <cjk>
+0x935C U+8CBC # <cjk>
+0x935D U+8EE2 # <cjk>
+0x935E U+985B # <cjk>
+0x935F U+70B9 # <cjk>
+0x9360 U+4F1D # <cjk>
+0x9361 U+6BBF # <cjk>
+0x9362 U+6FB1 # <cjk>
+0x9363 U+7530 # <cjk>
+0x9364 U+96FB # <cjk>
+0x9365 U+514E # <cjk>
+0x9366 U+5410 # <cjk>
+0x9367 U+5835 # <cjk>
+0x9368 U+5857 # <cjk>
+0x9369 U+59AC # <cjk>
+0x936A U+5C60 # <cjk>
+0x936B U+5F92 # <cjk>
+0x936C U+6597 # <cjk>
+0x936D U+675C # <cjk>
+0x936E U+6E21 # <cjk>
+0x936F U+767B # <cjk>
+0x9370 U+83DF # <cjk>
+0x9371 U+8CED # <cjk>
+0x9372 U+9014 # <cjk>
+0x9373 U+90FD # <cjk>
+0x9374 U+934D # <cjk>
+0x9375 U+7825 # <cjk>
+0x9376 U+783A # <cjk>
+0x9377 U+52AA # <cjk>
+0x9378 U+5EA6 # <cjk>
+0x9379 U+571F # <cjk>
+0x937A U+5974 # <cjk>
+0x937B U+6012 # <cjk>
+0x937C U+5012 # <cjk>
+0x937D U+515A # <cjk>
+0x937E U+51AC # <cjk>
+0x9380 U+51CD # <cjk>
+0x9381 U+5200 # <cjk>
+0x9382 U+5510 # <cjk>
+0x9383 U+5854 # <cjk>
+0x9384 U+5858 # <cjk>
+0x9385 U+5957 # <cjk>
+0x9386 U+5B95 # <cjk>
+0x9387 U+5CF6 # <cjk>
+0x9388 U+5D8B # <cjk>
+0x9389 U+60BC # <cjk>
+0x938A U+6295 # <cjk>
+0x938B U+642D # <cjk>
+0x938C U+6771 # <cjk>
+0x938D U+6843 # <cjk>
+0x938E U+68BC # <cjk>
+0x938F U+68DF # <cjk>
+0x9390 U+76D7 # <cjk>
+0x9391 U+6DD8 # <cjk>
+0x9392 U+6E6F # <cjk>
+0x9393 U+6D9B # <cjk>
+0x9394 U+706F # <cjk>
+0x9395 U+71C8 # <cjk>
+0x9396 U+5F53 # <cjk>
+0x9397 U+75D8 # <cjk>
+0x9398 U+7977 # <cjk>
+0x9399 U+7B49 # <cjk>
+0x939A U+7B54 # <cjk>
+0x939B U+7B52 # <cjk>
+0x939C U+7CD6 # <cjk>
+0x939D U+7D71 # <cjk>
+0x939E U+5230 # <cjk>
+0x939F U+8463 # <cjk>
+0x93A0 U+8569 # <cjk>
+0x93A1 U+85E4 # <cjk>
+0x93A2 U+8A0E # <cjk>
+0x93A3 U+8B04 # <cjk>
+0x93A4 U+8C46 # <cjk>
+0x93A5 U+8E0F # <cjk>
+0x93A6 U+9003 # <cjk>
+0x93A7 U+900F # <cjk>
+0x93A8 U+9419 # <cjk>
+0x93A9 U+9676 # <cjk>
+0x93AA U+982D # <cjk>
+0x93AB U+9A30 # <cjk>
+0x93AC U+95D8 # <cjk>
+0x93AD U+50CD # <cjk>
+0x93AE U+52D5 # <cjk>
+0x93AF U+540C # <cjk>
+0x93B0 U+5802 # <cjk>
+0x93B1 U+5C0E # <cjk>
+0x93B2 U+61A7 # <cjk>
+0x93B3 U+649E # <cjk>
+0x93B4 U+6D1E # <cjk>
+0x93B5 U+77B3 # <cjk>
+0x93B6 U+7AE5 # <cjk>
+0x93B7 U+80F4 # <cjk>
+0x93B8 U+8404 # <cjk>
+0x93B9 U+9053 # <cjk>
+0x93BA U+9285 # <cjk>
+0x93BB U+5CE0 # <cjk>
+0x93BC U+9D07 # <cjk>
+0x93BD U+533F # <cjk>
+0x93BE U+5F97 # <cjk>
+0x93BF U+5FB3 # <cjk>
+0x93C0 U+6D9C # <cjk>
+0x93C1 U+7279 # <cjk>
+0x93C2 U+7763 # <cjk>
+0x93C3 U+79BF # <cjk>
+0x93C4 U+7BE4 # <cjk>
+0x93C5 U+6BD2 # <cjk>
+0x93C6 U+72EC # <cjk>
+0x93C7 U+8AAD # <cjk>
+0x93C8 U+6803 # <cjk>
+0x93C9 U+6A61 # <cjk>
+0x93CA U+51F8 # <cjk>
+0x93CB U+7A81 # <cjk>
+0x93CC U+6934 # <cjk>
+0x93CD U+5C4A # <cjk>
+0x93CE U+9CF6 # <cjk>
+0x93CF U+82EB # <cjk>
+0x93D0 U+5BC5 # <cjk>
+0x93D1 U+9149 # <cjk>
+0x93D2 U+701E # <cjk>
+0x93D3 U+5678 # <cjk>
+0x93D4 U+5C6F # <cjk>
+0x93D5 U+60C7 # <cjk>
+0x93D6 U+6566 # <cjk>
+0x93D7 U+6C8C # <cjk>
+0x93D8 U+8C5A # <cjk>
+0x93D9 U+9041 # <cjk>
+0x93DA U+9813 # <cjk>
+0x93DB U+5451 # <cjk>
+0x93DC U+66C7 # <cjk>
+0x93DD U+920D # <cjk>
+0x93DE U+5948 # <cjk>
+0x93DF U+90A3 # <cjk>
+0x93E0 U+5185 # <cjk>
+0x93E1 U+4E4D # <cjk>
+0x93E2 U+51EA # <cjk>
+0x93E3 U+8599 # <cjk>
+0x93E4 U+8B0E # <cjk>
+0x93E5 U+7058 # <cjk>
+0x93E6 U+637A # <cjk>
+0x93E7 U+934B # <cjk>
+0x93E8 U+6962 # <cjk>
+0x93E9 U+99B4 # <cjk>
+0x93EA U+7E04 # <cjk>
+0x93EB U+7577 # <cjk>
+0x93EC U+5357 # <cjk>
+0x93ED U+6960 # <cjk>
+0x93EE U+8EDF # <cjk>
+0x93EF U+96E3 # <cjk>
+0x93F0 U+6C5D # <cjk>
+0x93F1 U+4E8C # <cjk>
+0x93F2 U+5C3C # <cjk>
+0x93F3 U+5F10 # <cjk>
+0x93F4 U+8FE9 # <cjk>
+0x93F5 U+5302 # <cjk>
+0x93F6 U+8CD1 # <cjk>
+0x93F7 U+8089 # <cjk>
+0x93F8 U+8679 # <cjk>
+0x93F9 U+5EFF # <cjk>
+0x93FA U+65E5 # <cjk>
+0x93FB U+4E73 # <cjk>
+0x93FC U+5165 # <cjk>
+0x9440 U+5982 # <cjk>
+0x9441 U+5C3F # <cjk>
+0x9442 U+97EE # <cjk>
+0x9443 U+4EFB # <cjk>
+0x9444 U+598A # <cjk>
+0x9445 U+5FCD # <cjk>
+0x9446 U+8A8D # <cjk>
+0x9447 U+6FE1 # <cjk>
+0x9448 U+79B0 # <cjk>
+0x9449 U+7962 # <cjk>
+0x944A U+5BE7 # <cjk>
+0x944B U+8471 # <cjk>
+0x944C U+732B # <cjk>
+0x944D U+71B1 # <cjk>
+0x944E U+5E74 # <cjk>
+0x944F U+5FF5 # <cjk>
+0x9450 U+637B # <cjk>
+0x9451 U+649A # <cjk>
+0x9452 U+71C3 # <cjk>
+0x9453 U+7C98 # <cjk>
+0x9454 U+4E43 # <cjk>
+0x9455 U+5EFC # <cjk>
+0x9456 U+4E4B # <cjk>
+0x9457 U+57DC # <cjk>
+0x9458 U+56A2 # <cjk>
+0x9459 U+60A9 # <cjk>
+0x945A U+6FC3 # <cjk>
+0x945B U+7D0D # <cjk>
+0x945C U+80FD # <cjk>
+0x945D U+8133 # <cjk>
+0x945E U+81BF # <cjk>
+0x945F U+8FB2 # <cjk>
+0x9460 U+8997 # <cjk>
+0x9461 U+86A4 # <cjk>
+0x9462 U+5DF4 # <cjk>
+0x9463 U+628A # <cjk>
+0x9464 U+64AD # <cjk>
+0x9465 U+8987 # <cjk>
+0x9466 U+6777 # <cjk>
+0x9467 U+6CE2 # <cjk>
+0x9468 U+6D3E # <cjk>
+0x9469 U+7436 # <cjk>
+0x946A U+7834 # <cjk>
+0x946B U+5A46 # <cjk>
+0x946C U+7F75 # <cjk>
+0x946D U+82AD # <cjk>
+0x946E U+99AC # <cjk>
+0x946F U+4FF3 # <cjk>
+0x9470 U+5EC3 # <cjk>
+0x9471 U+62DD # <cjk>
+0x9472 U+6392 # <cjk>
+0x9473 U+6557 # <cjk>
+0x9474 U+676F # <cjk>
+0x9475 U+76C3 # <cjk>
+0x9476 U+724C # <cjk>
+0x9477 U+80CC # <cjk>
+0x9478 U+80BA # <cjk>
+0x9479 U+8F29 # <cjk>
+0x947A U+914D # <cjk>
+0x947B U+500D # <cjk>
+0x947C U+57F9 # <cjk>
+0x947D U+5A92 # <cjk>
+0x947E U+6885 # <cjk>
+0x9480 U+6973 # <cjk>
+0x9481 U+7164 # <cjk>
+0x9482 U+72FD # <cjk>
+0x9483 U+8CB7 # <cjk>
+0x9484 U+58F2 # <cjk>
+0x9485 U+8CE0 # <cjk>
+0x9486 U+966A # <cjk>
+0x9487 U+9019 # <cjk>
+0x9488 U+877F # <cjk>
+0x9489 U+79E4 # <cjk>
+0x948A U+77E7 # <cjk>
+0x948B U+8429 # <cjk>
+0x948C U+4F2F # <cjk>
+0x948D U+5265 # <cjk>
+0x948E U+535A # <cjk>
+0x948F U+62CD # <cjk>
+0x9490 U+67CF # <cjk>
+0x9491 U+6CCA # <cjk>
+0x9492 U+767D # <cjk>
+0x9493 U+7B94 # <cjk>
+0x9494 U+7C95 # <cjk>
+0x9495 U+8236 # <cjk>
+0x9496 U+8584 # <cjk>
+0x9497 U+8FEB # <cjk>
+0x9498 U+66DD # <cjk>
+0x9499 U+6F20 # <cjk>
+0x949A U+7206 # <cjk>
+0x949B U+7E1B # <cjk>
+0x949C U+83AB # <cjk>
+0x949D U+99C1 # <cjk>
+0x949E U+9EA6 # <cjk>
+0x949F U+51FD # <cjk>
+0x94A0 U+7BB1 # <cjk>
+0x94A1 U+7872 # <cjk>
+0x94A2 U+7BB8 # <cjk>
+0x94A3 U+8087 # <cjk>
+0x94A4 U+7B48 # <cjk>
+0x94A5 U+6AE8 # <cjk>
+0x94A6 U+5E61 # <cjk>
+0x94A7 U+808C # <cjk>
+0x94A8 U+7551 # <cjk>
+0x94A9 U+7560 # <cjk>
+0x94AA U+516B # <cjk>
+0x94AB U+9262 # <cjk>
+0x94AC U+6E8C # <cjk>
+0x94AD U+767A # <cjk>
+0x94AE U+9197 # <cjk>
+0x94AF U+9AEA # <cjk>
+0x94B0 U+4F10 # <cjk>
+0x94B1 U+7F70 # <cjk>
+0x94B2 U+629C # <cjk>
+0x94B3 U+7B4F # <cjk>
+0x94B4 U+95A5 # <cjk>
+0x94B5 U+9CE9 # <cjk>
+0x94B6 U+567A # <cjk>
+0x94B7 U+5859 # <cjk>
+0x94B8 U+86E4 # <cjk>
+0x94B9 U+96BC # <cjk>
+0x94BA U+4F34 # <cjk>
+0x94BB U+5224 # <cjk>
+0x94BC U+534A # <cjk>
+0x94BD U+53CD # <cjk>
+0x94BE U+53DB # <cjk>
+0x94BF U+5E06 # <cjk>
+0x94C0 U+642C # <cjk>
+0x94C1 U+6591 # <cjk>
+0x94C2 U+677F # <cjk>
+0x94C3 U+6C3E # <cjk>
+0x94C4 U+6C4E # <cjk>
+0x94C5 U+7248 # <cjk>
+0x94C6 U+72AF # <cjk>
+0x94C7 U+73ED # <cjk>
+0x94C8 U+7554 # <cjk>
+0x94C9 U+7E41 # <cjk>
+0x94CA U+822C # <cjk>
+0x94CB U+85E9 # <cjk>
+0x94CC U+8CA9 # <cjk>
+0x94CD U+7BC4 # <cjk>
+0x94CE U+91C6 # <cjk>
+0x94CF U+7169 # <cjk>
+0x94D0 U+9812 # <cjk>
+0x94D1 U+98EF # <cjk>
+0x94D2 U+633D # <cjk>
+0x94D3 U+6669 # <cjk>
+0x94D4 U+756A # <cjk>
+0x94D5 U+76E4 # <cjk>
+0x94D6 U+78D0 # <cjk>
+0x94D7 U+8543 # <cjk>
+0x94D8 U+86EE # <cjk>
+0x94D9 U+532A # <cjk>
+0x94DA U+5351 # <cjk>
+0x94DB U+5426 # <cjk>
+0x94DC U+5983 # <cjk>
+0x94DD U+5E87 # <cjk>
+0x94DE U+5F7C # <cjk>
+0x94DF U+60B2 # <cjk>
+0x94E0 U+6249 # <cjk>
+0x94E1 U+6279 # <cjk>
+0x94E2 U+62AB # <cjk>
+0x94E3 U+6590 # <cjk>
+0x94E4 U+6BD4 # <cjk>
+0x94E5 U+6CCC # <cjk>
+0x94E6 U+75B2 # <cjk>
+0x94E7 U+76AE # <cjk>
+0x94E8 U+7891 # <cjk>
+0x94E9 U+79D8 # <cjk>
+0x94EA U+7DCB # <cjk>
+0x94EB U+7F77 # <cjk>
+0x94EC U+80A5 # <cjk>
+0x94ED U+88AB # <cjk>
+0x94EE U+8AB9 # <cjk>
+0x94EF U+8CBB # <cjk>
+0x94F0 U+907F # <cjk>
+0x94F1 U+975E # <cjk>
+0x94F2 U+98DB # <cjk>
+0x94F3 U+6A0B # <cjk>
+0x94F4 U+7C38 # <cjk>
+0x94F5 U+5099 # <cjk>
+0x94F6 U+5C3E # <cjk>
+0x94F7 U+5FAE # <cjk>
+0x94F8 U+6787 # <cjk>
+0x94F9 U+6BD8 # <cjk>
+0x94FA U+7435 # <cjk>
+0x94FB U+7709 # <cjk>
+0x94FC U+7F8E # <cjk>
+0x9540 U+9F3B # <cjk>
+0x9541 U+67CA # <cjk>
+0x9542 U+7A17 # <cjk>
+0x9543 U+5339 # <cjk>
+0x9544 U+758B # <cjk>
+0x9545 U+9AED # <cjk>
+0x9546 U+5F66 # <cjk>
+0x9547 U+819D # <cjk>
+0x9548 U+83F1 # <cjk>
+0x9549 U+8098 # <cjk>
+0x954A U+5F3C # <cjk>
+0x954B U+5FC5 # <cjk>
+0x954C U+7562 # <cjk>
+0x954D U+7B46 # <cjk>
+0x954E U+903C # <cjk>
+0x954F U+6867 # <cjk>
+0x9550 U+59EB # <cjk>
+0x9551 U+5A9B # <cjk>
+0x9552 U+7D10 # <cjk>
+0x9553 U+767E # <cjk>
+0x9554 U+8B2C # <cjk>
+0x9555 U+4FF5 # <cjk>
+0x9556 U+5F6A # <cjk>
+0x9557 U+6A19 # <cjk>
+0x9558 U+6C37 # <cjk>
+0x9559 U+6F02 # <cjk>
+0x955A U+74E2 # <cjk>
+0x955B U+7968 # <cjk>
+0x955C U+8868 # <cjk>
+0x955D U+8A55 # <cjk>
+0x955E U+8C79 # <cjk>
+0x955F U+5EDF # <cjk>
+0x9560 U+63CF # <cjk>
+0x9561 U+75C5 # <cjk>
+0x9562 U+79D2 # <cjk>
+0x9563 U+82D7 # <cjk>
+0x9564 U+9328 # <cjk>
+0x9565 U+92F2 # <cjk>
+0x9566 U+849C # <cjk>
+0x9567 U+86ED # <cjk>
+0x9568 U+9C2D # <cjk>
+0x9569 U+54C1 # <cjk>
+0x956A U+5F6C # <cjk>
+0x956B U+658C # <cjk>
+0x956C U+6D5C # <cjk>
+0x956D U+7015 # <cjk>
+0x956E U+8CA7 # <cjk>
+0x956F U+8CD3 # <cjk>
+0x9570 U+983B # <cjk>
+0x9571 U+654F # <cjk>
+0x9572 U+74F6 # <cjk>
+0x9573 U+4E0D # <cjk>
+0x9574 U+4ED8 # <cjk>
+0x9575 U+57E0 # <cjk>
+0x9576 U+592B # <cjk>
+0x9577 U+5A66 # <cjk>
+0x9578 U+5BCC # <cjk>
+0x9579 U+51A8 # <cjk>
+0x957A U+5E03 # <cjk>
+0x957B U+5E9C # <cjk>
+0x957C U+6016 # <cjk>
+0x957D U+6276 # <cjk>
+0x957E U+6577 # <cjk>
+0x9580 U+65A7 # <cjk>
+0x9581 U+666E # <cjk>
+0x9582 U+6D6E # <cjk>
+0x9583 U+7236 # <cjk>
+0x9584 U+7B26 # <cjk>
+0x9585 U+8150 # <cjk>
+0x9586 U+819A # <cjk>
+0x9587 U+8299 # <cjk>
+0x9588 U+8B5C # <cjk>
+0x9589 U+8CA0 # <cjk>
+0x958A U+8CE6 # <cjk>
+0x958B U+8D74 # <cjk>
+0x958C U+961C # <cjk>
+0x958D U+9644 # <cjk>
+0x958E U+4FAE # <cjk>
+0x958F U+64AB # <cjk>
+0x9590 U+6B66 # <cjk>
+0x9591 U+821E # <cjk>
+0x9592 U+8461 # <cjk>
+0x9593 U+856A # <cjk>
+0x9594 U+90E8 # <cjk>
+0x9595 U+5C01 # <cjk>
+0x9596 U+6953 # <cjk>
+0x9597 U+98A8 # <cjk>
+0x9598 U+847A # <cjk>
+0x9599 U+8557 # <cjk>
+0x959A U+4F0F # <cjk>
+0x959B U+526F # <cjk>
+0x959C U+5FA9 # <cjk>
+0x959D U+5E45 # <cjk>
+0x959E U+670D # <cjk>
+0x959F U+798F # <cjk>
+0x95A0 U+8179 # <cjk>
+0x95A1 U+8907 # <cjk>
+0x95A2 U+8986 # <cjk>
+0x95A3 U+6DF5 # <cjk>
+0x95A4 U+5F17 # <cjk>
+0x95A5 U+6255 # <cjk>
+0x95A6 U+6CB8 # <cjk>
+0x95A7 U+4ECF # <cjk>
+0x95A8 U+7269 # <cjk>
+0x95A9 U+9B92 # <cjk>
+0x95AA U+5206 # <cjk>
+0x95AB U+543B # <cjk>
+0x95AC U+5674 # <cjk>
+0x95AD U+58B3 # <cjk>
+0x95AE U+61A4 # <cjk>
+0x95AF U+626E # <cjk>
+0x95B0 U+711A # <cjk>
+0x95B1 U+596E # <cjk>
+0x95B2 U+7C89 # <cjk>
+0x95B3 U+7CDE # <cjk>
+0x95B4 U+7D1B # <cjk>
+0x95B5 U+96F0 # <cjk>
+0x95B6 U+6587 # <cjk>
+0x95B7 U+805E # <cjk>
+0x95B8 U+4E19 # <cjk>
+0x95B9 U+4F75 # <cjk>
+0x95BA U+5175 # <cjk>
+0x95BB U+5840 # <cjk>
+0x95BC U+5E63 # <cjk>
+0x95BD U+5E73 # <cjk>
+0x95BE U+5F0A # <cjk>
+0x95BF U+67C4 # <cjk>
+0x95C0 U+4E26 # <cjk>
+0x95C1 U+853D # <cjk>
+0x95C2 U+9589 # <cjk>
+0x95C3 U+965B # <cjk>
+0x95C4 U+7C73 # <cjk>
+0x95C5 U+9801 # <cjk>
+0x95C6 U+50FB # <cjk>
+0x95C7 U+58C1 # <cjk>
+0x95C8 U+7656 # <cjk>
+0x95C9 U+78A7 # <cjk>
+0x95CA U+5225 # <cjk>
+0x95CB U+77A5 # <cjk>
+0x95CC U+8511 # <cjk>
+0x95CD U+7B86 # <cjk>
+0x95CE U+504F # <cjk>
+0x95CF U+5909 # <cjk>
+0x95D0 U+7247 # <cjk>
+0x95D1 U+7BC7 # <cjk>
+0x95D2 U+7DE8 # <cjk>
+0x95D3 U+8FBA # <cjk>
+0x95D4 U+8FD4 # <cjk>
+0x95D5 U+904D # <cjk>
+0x95D6 U+4FBF # <cjk>
+0x95D7 U+52C9 # <cjk>
+0x95D8 U+5A29 # <cjk>
+0x95D9 U+5F01 # <cjk>
+0x95DA U+97AD # <cjk>
+0x95DB U+4FDD # <cjk>
+0x95DC U+8217 # <cjk>
+0x95DD U+92EA # <cjk>
+0x95DE U+5703 # <cjk>
+0x95DF U+6355 # <cjk>
+0x95E0 U+6B69 # <cjk>
+0x95E1 U+752B # <cjk>
+0x95E2 U+88DC # <cjk>
+0x95E3 U+8F14 # <cjk>
+0x95E4 U+7A42 # <cjk>
+0x95E5 U+52DF # <cjk>
+0x95E6 U+5893 # <cjk>
+0x95E7 U+6155 # <cjk>
+0x95E8 U+620A # <cjk>
+0x95E9 U+66AE # <cjk>
+0x95EA U+6BCD # <cjk>
+0x95EB U+7C3F # <cjk>
+0x95EC U+83E9 # <cjk>
+0x95ED U+5023 # <cjk>
+0x95EE U+4FF8 # <cjk>
+0x95EF U+5305 # <cjk>
+0x95F0 U+5446 # <cjk>
+0x95F1 U+5831 # <cjk>
+0x95F2 U+5949 # <cjk>
+0x95F3 U+5B9D # <cjk>
+0x95F4 U+5CF0 # <cjk>
+0x95F5 U+5CEF # <cjk>
+0x95F6 U+5D29 # <cjk>
+0x95F7 U+5E96 # <cjk>
+0x95F8 U+62B1 # <cjk>
+0x95F9 U+6367 # <cjk>
+0x95FA U+653E # <cjk>
+0x95FB U+65B9 # <cjk>
+0x95FC U+670B # <cjk>
+0x9640 U+6CD5 # <cjk>
+0x9641 U+6CE1 # <cjk>
+0x9642 U+70F9 # <cjk>
+0x9643 U+7832 # <cjk>
+0x9644 U+7E2B # <cjk>
+0x9645 U+80DE # <cjk>
+0x9646 U+82B3 # <cjk>
+0x9647 U+840C # <cjk>
+0x9648 U+84EC # <cjk>
+0x9649 U+8702 # <cjk>
+0x964A U+8912 # <cjk>
+0x964B U+8A2A # <cjk>
+0x964C U+8C4A # <cjk>
+0x964D U+90A6 # <cjk>
+0x964E U+92D2 # <cjk>
+0x964F U+98FD # <cjk>
+0x9650 U+9CF3 # <cjk>
+0x9651 U+9D6C # <cjk>
+0x9652 U+4E4F # <cjk>
+0x9653 U+4EA1 # <cjk>
+0x9654 U+508D # <cjk>
+0x9655 U+5256 # <cjk>
+0x9656 U+574A # <cjk>
+0x9657 U+59A8 # <cjk>
+0x9658 U+5E3D # <cjk>
+0x9659 U+5FD8 # <cjk>
+0x965A U+5FD9 # <cjk>
+0x965B U+623F # <cjk>
+0x965C U+66B4 # <cjk>
+0x965D U+671B # <cjk>
+0x965E U+67D0 # <cjk>
+0x965F U+68D2 # <cjk>
+0x9660 U+5192 # <cjk>
+0x9661 U+7D21 # <cjk>
+0x9662 U+80AA # <cjk>
+0x9663 U+81A8 # <cjk>
+0x9664 U+8B00 # <cjk>
+0x9665 U+8C8C # <cjk>
+0x9666 U+8CBF # <cjk>
+0x9667 U+927E # <cjk>
+0x9668 U+9632 # <cjk>
+0x9669 U+5420 # <cjk>
+0x966A U+982C # <cjk>
+0x966B U+5317 # <cjk>
+0x966C U+50D5 # <cjk>
+0x966D U+535C # <cjk>
+0x966E U+58A8 # <cjk>
+0x966F U+64B2 # <cjk>
+0x9670 U+6734 # <cjk>
+0x9671 U+7267 # <cjk>
+0x9672 U+7766 # <cjk>
+0x9673 U+7A46 # <cjk>
+0x9674 U+91E6 # <cjk>
+0x9675 U+52C3 # <cjk>
+0x9676 U+6CA1 # <cjk>
+0x9677 U+6B86 # <cjk>
+0x9678 U+5800 # <cjk>
+0x9679 U+5E4C # <cjk>
+0x967A U+5954 # <cjk>
+0x967B U+672C # <cjk>
+0x967C U+7FFB # <cjk>
+0x967D U+51E1 # <cjk>
+0x967E U+76C6 # <cjk>
+0x9680 U+6469 # <cjk>
+0x9681 U+78E8 # <cjk>
+0x9682 U+9B54 # <cjk>
+0x9683 U+9EBB # <cjk>
+0x9684 U+57CB # <cjk>
+0x9685 U+59B9 # <cjk>
+0x9686 U+6627 # <cjk>
+0x9687 U+679A # <cjk>
+0x9688 U+6BCE # <cjk>
+0x9689 U+54E9 # <cjk>
+0x968A U+69D9 # <cjk>
+0x968B U+5E55 # <cjk>
+0x968C U+819C # <cjk>
+0x968D U+6795 # <cjk>
+0x968E U+9BAA # <cjk>
+0x968F U+67FE # <cjk>
+0x9690 U+9C52 # <cjk>
+0x9691 U+685D # <cjk>
+0x9692 U+4EA6 # <cjk>
+0x9693 U+4FE3 # <cjk>
+0x9694 U+53C8 # <cjk>
+0x9695 U+62B9 # <cjk>
+0x9696 U+672B # <cjk>
+0x9697 U+6CAB # <cjk>
+0x9698 U+8FC4 # <cjk>
+0x9699 U+4FAD # <cjk>
+0x969A U+7E6D # <cjk>
+0x969B U+9EBF # <cjk>
+0x969C U+4E07 # <cjk>
+0x969D U+6162 # <cjk>
+0x969E U+6E80 # <cjk>
+0x969F U+6F2B # <cjk>
+0x96A0 U+8513 # <cjk>
+0x96A1 U+5473 # <cjk>
+0x96A2 U+672A # <cjk>
+0x96A3 U+9B45 # <cjk>
+0x96A4 U+5DF3 # <cjk>
+0x96A5 U+7B95 # <cjk>
+0x96A6 U+5CAC # <cjk>
+0x96A7 U+5BC6 # <cjk>
+0x96A8 U+871C # <cjk>
+0x96A9 U+6E4A # <cjk>
+0x96AA U+84D1 # <cjk>
+0x96AB U+7A14 # <cjk>
+0x96AC U+8108 # <cjk>
+0x96AD U+5999 # <cjk>
+0x96AE U+7C8D # <cjk>
+0x96AF U+6C11 # <cjk>
+0x96B0 U+7720 # <cjk>
+0x96B1 U+52D9 # <cjk>
+0x96B2 U+5922 # <cjk>
+0x96B3 U+7121 # <cjk>
+0x96B4 U+725F # <cjk>
+0x96B5 U+77DB # <cjk>
+0x96B6 U+9727 # <cjk>
+0x96B7 U+9D61 # <cjk>
+0x96B8 U+690B # <cjk>
+0x96B9 U+5A7F # <cjk>
+0x96BA U+5A18 # <cjk>
+0x96BB U+51A5 # <cjk>
+0x96BC U+540D # <cjk>
+0x96BD U+547D # <cjk>
+0x96BE U+660E # <cjk>
+0x96BF U+76DF # <cjk>
+0x96C0 U+8FF7 # <cjk>
+0x96C1 U+9298 # <cjk>
+0x96C2 U+9CF4 # <cjk>
+0x96C3 U+59EA # <cjk>
+0x96C4 U+725D # <cjk>
+0x96C5 U+6EC5 # <cjk>
+0x96C6 U+514D # <cjk>
+0x96C7 U+68C9 # <cjk>
+0x96C8 U+7DBF # <cjk>
+0x96C9 U+7DEC # <cjk>
+0x96CA U+9762 # <cjk>
+0x96CB U+9EBA # <cjk>
+0x96CC U+6478 # <cjk>
+0x96CD U+6A21 # <cjk>
+0x96CE U+8302 # <cjk>
+0x96CF U+5984 # <cjk>
+0x96D0 U+5B5F # <cjk>
+0x96D1 U+6BDB # <cjk>
+0x96D2 U+731B # <cjk>
+0x96D3 U+76F2 # <cjk>
+0x96D4 U+7DB2 # <cjk>
+0x96D5 U+8017 # <cjk>
+0x96D6 U+8499 # <cjk>
+0x96D7 U+5132 # <cjk>
+0x96D8 U+6728 # <cjk>
+0x96D9 U+9ED9 # <cjk>
+0x96DA U+76EE # <cjk>
+0x96DB U+6762 # <cjk>
+0x96DC U+52FF # <cjk>
+0x96DD U+9905 # <cjk>
+0x96DE U+5C24 # <cjk>
+0x96DF U+623B # <cjk>
+0x96E0 U+7C7E # <cjk>
+0x96E1 U+8CB0 # <cjk>
+0x96E2 U+554F # <cjk>
+0x96E3 U+60B6 # <cjk>
+0x96E4 U+7D0B # <cjk>
+0x96E5 U+9580 # <cjk>
+0x96E6 U+5301 # <cjk>
+0x96E7 U+4E5F # <cjk>
+0x96E8 U+51B6 # <cjk>
+0x96E9 U+591C # <cjk>
+0x96EA U+723A # <cjk>
+0x96EB U+8036 # <cjk>
+0x96EC U+91CE # <cjk>
+0x96ED U+5F25 # <cjk>
+0x96EE U+77E2 # <cjk>
+0x96EF U+5384 # <cjk>
+0x96F0 U+5F79 # <cjk>
+0x96F1 U+7D04 # <cjk>
+0x96F2 U+85AC # <cjk>
+0x96F3 U+8A33 # <cjk>
+0x96F4 U+8E8D # <cjk>
+0x96F5 U+9756 # <cjk>
+0x96F6 U+67F3 # <cjk>
+0x96F7 U+85AE # <cjk>
+0x96F8 U+9453 # <cjk>
+0x96F9 U+6109 # <cjk>
+0x96FA U+6108 # <cjk>
+0x96FB U+6CB9 # <cjk>
+0x96FC U+7652 # <cjk>
+0x9740 U+8AED # <cjk>
+0x9741 U+8F38 # <cjk>
+0x9742 U+552F # <cjk>
+0x9743 U+4F51 # <cjk>
+0x9744 U+512A # <cjk>
+0x9745 U+52C7 # <cjk>
+0x9746 U+53CB # <cjk>
+0x9747 U+5BA5 # <cjk>
+0x9748 U+5E7D # <cjk>
+0x9749 U+60A0 # <cjk>
+0x974A U+6182 # <cjk>
+0x974B U+63D6 # <cjk>
+0x974C U+6709 # <cjk>
+0x974D U+67DA # <cjk>
+0x974E U+6E67 # <cjk>
+0x974F U+6D8C # <cjk>
+0x9750 U+7336 # <cjk>
+0x9751 U+7337 # <cjk>
+0x9752 U+7531 # <cjk>
+0x9753 U+7950 # <cjk>
+0x9754 U+88D5 # <cjk>
+0x9755 U+8A98 # <cjk>
+0x9756 U+904A # <cjk>
+0x9757 U+9091 # <cjk>
+0x9758 U+90F5 # <cjk>
+0x9759 U+96C4 # <cjk>
+0x975A U+878D # <cjk>
+0x975B U+5915 # <cjk>
+0x975C U+4E88 # <cjk>
+0x975D U+4F59 # <cjk>
+0x975E U+4E0E # <cjk>
+0x975F U+8A89 # <cjk>
+0x9760 U+8F3F # <cjk>
+0x9761 U+9810 # <cjk>
+0x9762 U+50AD # <cjk>
+0x9763 U+5E7C # <cjk>
+0x9764 U+5996 # <cjk>
+0x9765 U+5BB9 # <cjk>
+0x9766 U+5EB8 # <cjk>
+0x9767 U+63DA # <cjk>
+0x9768 U+63FA # <cjk>
+0x9769 U+64C1 # <cjk>
+0x976A U+66DC # <cjk>
+0x976B U+694A # <cjk>
+0x976C U+69D8 # <cjk>
+0x976D U+6D0B # <cjk>
+0x976E U+6EB6 # <cjk>
+0x976F U+7194 # <cjk>
+0x9770 U+7528 # <cjk>
+0x9771 U+7AAF # <cjk>
+0x9772 U+7F8A # <cjk>
+0x9773 U+8000 # <cjk>
+0x9774 U+8449 # <cjk>
+0x9775 U+84C9 # <cjk>
+0x9776 U+8981 # <cjk>
+0x9777 U+8B21 # <cjk>
+0x9778 U+8E0A # <cjk>
+0x9779 U+9065 # <cjk>
+0x977A U+967D # <cjk>
+0x977B U+990A # <cjk>
+0x977C U+617E # <cjk>
+0x977D U+6291 # <cjk>
+0x977E U+6B32 # <cjk>
+0x9780 U+6C83 # <cjk>
+0x9781 U+6D74 # <cjk>
+0x9782 U+7FCC # <cjk>
+0x9783 U+7FFC # <cjk>
+0x9784 U+6DC0 # <cjk>
+0x9785 U+7F85 # <cjk>
+0x9786 U+87BA # <cjk>
+0x9787 U+88F8 # <cjk>
+0x9788 U+6765 # <cjk>
+0x9789 U+83B1 # <cjk>
+0x978A U+983C # <cjk>
+0x978B U+96F7 # <cjk>
+0x978C U+6D1B # <cjk>
+0x978D U+7D61 # <cjk>
+0x978E U+843D # <cjk>
+0x978F U+916A # <cjk>
+0x9790 U+4E71 # <cjk>
+0x9791 U+5375 # <cjk>
+0x9792 U+5D50 # <cjk>
+0x9793 U+6B04 # <cjk>
+0x9794 U+6FEB # <cjk>
+0x9795 U+85CD # <cjk>
+0x9796 U+862D # <cjk>
+0x9797 U+89A7 # <cjk>
+0x9798 U+5229 # <cjk>
+0x9799 U+540F # <cjk>
+0x979A U+5C65 # <cjk>
+0x979B U+674E # <cjk>
+0x979C U+68A8 # <cjk>
+0x979D U+7406 # <cjk>
+0x979E U+7483 # <cjk>
+0x979F U+75E2 # <cjk>
+0x97A0 U+88CF # <cjk>
+0x97A1 U+88E1 # <cjk>
+0x97A2 U+91CC # <cjk>
+0x97A3 U+96E2 # <cjk>
+0x97A4 U+9678 # <cjk>
+0x97A5 U+5F8B # <cjk>
+0x97A6 U+7387 # <cjk>
+0x97A7 U+7ACB # <cjk>
+0x97A8 U+844E # <cjk>
+0x97A9 U+63A0 # <cjk>
+0x97AA U+7565 # <cjk>
+0x97AB U+5289 # <cjk>
+0x97AC U+6D41 # <cjk>
+0x97AD U+6E9C # <cjk>
+0x97AE U+7409 # <cjk>
+0x97AF U+7559 # <cjk>
+0x97B0 U+786B # <cjk>
+0x97B1 U+7C92 # <cjk>
+0x97B2 U+9686 # <cjk>
+0x97B3 U+7ADC # <cjk>
+0x97B4 U+9F8D # <cjk>
+0x97B5 U+4FB6 # <cjk>
+0x97B6 U+616E # <cjk>
+0x97B7 U+65C5 # <cjk>
+0x97B8 U+865C # <cjk>
+0x97B9 U+4E86 # <cjk>
+0x97BA U+4EAE # <cjk>
+0x97BB U+50DA # <cjk>
+0x97BC U+4E21 # <cjk>
+0x97BD U+51CC # <cjk>
+0x97BE U+5BEE # <cjk>
+0x97BF U+6599 # <cjk>
+0x97C0 U+6881 # <cjk>
+0x97C1 U+6DBC # <cjk>
+0x97C2 U+731F # <cjk>
+0x97C3 U+7642 # <cjk>
+0x97C4 U+77AD # <cjk>
+0x97C5 U+7A1C # <cjk>
+0x97C6 U+7CE7 # <cjk>
+0x97C7 U+826F # <cjk>
+0x97C8 U+8AD2 # <cjk>
+0x97C9 U+907C # <cjk>
+0x97CA U+91CF # <cjk>
+0x97CB U+9675 # <cjk>
+0x97CC U+9818 # <cjk>
+0x97CD U+529B # <cjk>
+0x97CE U+7DD1 # <cjk>
+0x97CF U+502B # <cjk>
+0x97D0 U+5398 # <cjk>
+0x97D1 U+6797 # <cjk>
+0x97D2 U+6DCB # <cjk>
+0x97D3 U+71D0 # <cjk>
+0x97D4 U+7433 # <cjk>
+0x97D5 U+81E8 # <cjk>
+0x97D6 U+8F2A # <cjk>
+0x97D7 U+96A3 # <cjk>
+0x97D8 U+9C57 # <cjk>
+0x97D9 U+9E9F # <cjk>
+0x97DA U+7460 # <cjk>
+0x97DB U+5841 # <cjk>
+0x97DC U+6D99 # <cjk>
+0x97DD U+7D2F # <cjk>
+0x97DE U+985E # <cjk>
+0x97DF U+4EE4 # <cjk>
+0x97E0 U+4F36 # <cjk>
+0x97E1 U+4F8B # <cjk>
+0x97E2 U+51B7 # <cjk>
+0x97E3 U+52B1 # <cjk>
+0x97E4 U+5DBA # <cjk>
+0x97E5 U+601C # <cjk>
+0x97E6 U+73B2 # <cjk>
+0x97E7 U+793C # <cjk>
+0x97E8 U+82D3 # <cjk>
+0x97E9 U+9234 # <cjk>
+0x97EA U+96B7 # <cjk>
+0x97EB U+96F6 # <cjk>
+0x97EC U+970A # <cjk>
+0x97ED U+9E97 # <cjk>
+0x97EE U+9F62 # <cjk>
+0x97EF U+66A6 # <cjk>
+0x97F0 U+6B74 # <cjk>
+0x97F1 U+5217 # <cjk>
+0x97F2 U+52A3 # <cjk>
+0x97F3 U+70C8 # <cjk>
+0x97F4 U+88C2 # <cjk>
+0x97F5 U+5EC9 # <cjk>
+0x97F6 U+604B # <cjk>
+0x97F7 U+6190 # <cjk>
+0x97F8 U+6F23 # <cjk>
+0x97F9 U+7149 # <cjk>
+0x97FA U+7C3E # <cjk>
+0x97FB U+7DF4 # <cjk>
+0x97FC U+806F # <cjk>
+0x9840 U+84EE # <cjk>
+0x9841 U+9023 # <cjk>
+0x9842 U+932C # <cjk>
+0x9843 U+5442 # <cjk>
+0x9844 U+9B6F # <cjk>
+0x9845 U+6AD3 # <cjk>
+0x9846 U+7089 # <cjk>
+0x9847 U+8CC2 # <cjk>
+0x9848 U+8DEF # <cjk>
+0x9849 U+9732 # <cjk>
+0x984A U+52B4 # <cjk>
+0x984B U+5A41 # <cjk>
+0x984C U+5ECA # <cjk>
+0x984D U+5F04 # <cjk>
+0x984E U+6717 # <cjk>
+0x984F U+697C # <cjk>
+0x9850 U+6994 # <cjk>
+0x9851 U+6D6A # <cjk>
+0x9852 U+6F0F # <cjk>
+0x9853 U+7262 # <cjk>
+0x9854 U+72FC # <cjk>
+0x9855 U+7BED # <cjk>
+0x9856 U+8001 # <cjk>
+0x9857 U+807E # <cjk>
+0x9858 U+874B # <cjk>
+0x9859 U+90CE # <cjk>
+0x985A U+516D # <cjk>
+0x985B U+9E93 # <cjk>
+0x985C U+7984 # <cjk>
+0x985D U+808B # <cjk>
+0x985E U+9332 # <cjk>
+0x985F U+8AD6 # <cjk>
+0x9860 U+502D # <cjk>
+0x9861 U+548C # <cjk>
+0x9862 U+8A71 # <cjk>
+0x9863 U+6B6A # <cjk>
+0x9864 U+8CC4 # <cjk>
+0x9865 U+8107 # <cjk>
+0x9866 U+60D1 # <cjk>
+0x9867 U+67A0 # <cjk>
+0x9868 U+9DF2 # <cjk>
+0x9869 U+4E99 # <cjk>
+0x986A U+4E98 # <cjk>
+0x986B U+9C10 # <cjk>
+0x986C U+8A6B # <cjk>
+0x986D U+85C1 # <cjk>
+0x986E U+8568 # <cjk>
+0x986F U+6900 # <cjk>
+0x9870 U+6E7E # <cjk>
+0x9871 U+7897 # <cjk>
+0x9872 U+8155 # <cjk>
+0x9873 U+20B9F # <cjk> [2004] [Unicode3.1]
+0x9874 U+5B41 # <cjk> [2000]
+0x9875 U+5B56 # <cjk> [2000]
+0x9876 U+5B7D # <cjk> [2000]
+0x9877 U+5B93 # <cjk> [2000]
+0x9878 U+5BD8 # <cjk> [2000]
+0x9879 U+5BEC # <cjk> [2000]
+0x987A U+5C12 # <cjk> [2000]
+0x987B U+5C1E # <cjk> [2000]
+0x987C U+5C23 # <cjk> [2000]
+0x987D U+5C2B # <cjk> [2000]
+0x987E U+378D # <cjk> [2000]
+0x9880 U+5C62 # <cjk> [2000]
+0x9881 U+FA3B # CJK COMPATIBILITY IDEOGRAPH-FA3B [2000] [Unicode3.2]
+0x9882 U+FA3C # CJK COMPATIBILITY IDEOGRAPH-FA3C [2000] [Unicode3.2]
+0x9883 U+216B4 # <cjk> [2000] [Unicode3.1]
+0x9884 U+5C7A # <cjk> [2000]
+0x9885 U+5C8F # <cjk> [2000]
+0x9886 U+5C9F # <cjk> [2000]
+0x9887 U+5CA3 # <cjk> [2000]
+0x9888 U+5CAA # <cjk> [2000]
+0x9889 U+5CBA # <cjk> [2000]
+0x988A U+5CCB # <cjk> [2000]
+0x988B U+5CD0 # <cjk> [2000]
+0x988C U+5CD2 # <cjk> [2000]
+0x988D U+5CF4 # <cjk> [2000]
+0x988E U+21E34 # <cjk> [2000] [Unicode3.1]
+0x988F U+37E2 # <cjk> [2000]
+0x9890 U+5D0D # <cjk> [2000]
+0x9891 U+5D27 # <cjk> [2000]
+0x9892 U+FA11 # CJK COMPATIBILITY IDEOGRAPH-FA11 [2000]
+0x9893 U+5D46 # <cjk> [2000]
+0x9894 U+5D47 # <cjk> [2000]
+0x9895 U+5D53 # <cjk> [2000]
+0x9896 U+5D4A # <cjk> [2000]
+0x9897 U+5D6D # <cjk> [2000]
+0x9898 U+5D81 # <cjk> [2000]
+0x9899 U+5DA0 # <cjk> [2000]
+0x989A U+5DA4 # <cjk> [2000]
+0x989B U+5DA7 # <cjk> [2000]
+0x989C U+5DB8 # <cjk> [2000]
+0x989D U+5DCB # <cjk> [2000]
+0x989E U+541E # <cjk> [2004]
+0x989F U+5F0C # <cjk>
+0x98A0 U+4E10 # <cjk>
+0x98A1 U+4E15 # <cjk>
+0x98A2 U+4E2A # <cjk>
+0x98A3 U+4E31 # <cjk>
+0x98A4 U+4E36 # <cjk>
+0x98A5 U+4E3C # <cjk>
+0x98A6 U+4E3F # <cjk>
+0x98A7 U+4E42 # <cjk>
+0x98A8 U+4E56 # <cjk>
+0x98A9 U+4E58 # <cjk>
+0x98AA U+4E82 # <cjk>
+0x98AB U+4E85 # <cjk>
+0x98AC U+8C6B # <cjk>
+0x98AD U+4E8A # <cjk>
+0x98AE U+8212 # <cjk>
+0x98AF U+5F0D # <cjk>
+0x98B0 U+4E8E # <cjk>
+0x98B1 U+4E9E # <cjk>
+0x98B2 U+4E9F # <cjk>
+0x98B3 U+4EA0 # <cjk>
+0x98B4 U+4EA2 # <cjk>
+0x98B5 U+4EB0 # <cjk>
+0x98B6 U+4EB3 # <cjk>
+0x98B7 U+4EB6 # <cjk>
+0x98B8 U+4ECE # <cjk>
+0x98B9 U+4ECD # <cjk>
+0x98BA U+4EC4 # <cjk>
+0x98BB U+4EC6 # <cjk>
+0x98BC U+4EC2 # <cjk>
+0x98BD U+4ED7 # <cjk>
+0x98BE U+4EDE # <cjk>
+0x98BF U+4EED # <cjk>
+0x98C0 U+4EDF # <cjk>
+0x98C1 U+4EF7 # <cjk>
+0x98C2 U+4F09 # <cjk>
+0x98C3 U+4F5A # <cjk>
+0x98C4 U+4F30 # <cjk>
+0x98C5 U+4F5B # <cjk>
+0x98C6 U+4F5D # <cjk>
+0x98C7 U+4F57 # <cjk>
+0x98C8 U+4F47 # <cjk>
+0x98C9 U+4F76 # <cjk>
+0x98CA U+4F88 # <cjk>
+0x98CB U+4F8F # <cjk>
+0x98CC U+4F98 # <cjk>
+0x98CD U+4F7B # <cjk>
+0x98CE U+4F69 # <cjk>
+0x98CF U+4F70 # <cjk>
+0x98D0 U+4F91 # <cjk>
+0x98D1 U+4F6F # <cjk>
+0x98D2 U+4F86 # <cjk>
+0x98D3 U+4F96 # <cjk>
+0x98D4 U+5118 # <cjk>
+0x98D5 U+4FD4 # <cjk>
+0x98D6 U+4FDF # <cjk>
+0x98D7 U+4FCE # <cjk>
+0x98D8 U+4FD8 # <cjk>
+0x98D9 U+4FDB # <cjk>
+0x98DA U+4FD1 # <cjk>
+0x98DB U+4FDA # <cjk>
+0x98DC U+4FD0 # <cjk>
+0x98DD U+4FE4 # <cjk>
+0x98DE U+4FE5 # <cjk>
+0x98DF U+501A # <cjk>
+0x98E0 U+5028 # <cjk>
+0x98E1 U+5014 # <cjk>
+0x98E2 U+502A # <cjk>
+0x98E3 U+5025 # <cjk>
+0x98E4 U+5005 # <cjk>
+0x98E5 U+4F1C # <cjk>
+0x98E6 U+4FF6 # <cjk>
+0x98E7 U+5021 # <cjk>
+0x98E8 U+5029 # <cjk>
+0x98E9 U+502C # <cjk>
+0x98EA U+4FFE # <cjk>
+0x98EB U+4FEF # <cjk>
+0x98EC U+5011 # <cjk>
+0x98ED U+5006 # <cjk>
+0x98EE U+5043 # <cjk>
+0x98EF U+5047 # <cjk>
+0x98F0 U+6703 # <cjk>
+0x98F1 U+5055 # <cjk>
+0x98F2 U+5050 # <cjk>
+0x98F3 U+5048 # <cjk>
+0x98F4 U+505A # <cjk>
+0x98F5 U+5056 # <cjk>
+0x98F6 U+506C # <cjk>
+0x98F7 U+5078 # <cjk>
+0x98F8 U+5080 # <cjk>
+0x98F9 U+509A # <cjk>
+0x98FA U+5085 # <cjk>
+0x98FB U+50B4 # <cjk>
+0x98FC U+50B2 # <cjk>
+0x9940 U+50C9 # <cjk>
+0x9941 U+50CA # <cjk>
+0x9942 U+50B3 # <cjk>
+0x9943 U+50C2 # <cjk>
+0x9944 U+50D6 # <cjk>
+0x9945 U+50DE # <cjk>
+0x9946 U+50E5 # <cjk>
+0x9947 U+50ED # <cjk>
+0x9948 U+50E3 # <cjk>
+0x9949 U+50EE # <cjk>
+0x994A U+50F9 # <cjk>
+0x994B U+50F5 # <cjk>
+0x994C U+5109 # <cjk>
+0x994D U+5101 # <cjk>
+0x994E U+5102 # <cjk>
+0x994F U+5116 # <cjk>
+0x9950 U+5115 # <cjk>
+0x9951 U+5114 # <cjk>
+0x9952 U+511A # <cjk>
+0x9953 U+5121 # <cjk>
+0x9954 U+513A # <cjk>
+0x9955 U+5137 # <cjk>
+0x9956 U+513C # <cjk>
+0x9957 U+513B # <cjk>
+0x9958 U+513F # <cjk>
+0x9959 U+5140 # <cjk>
+0x995A U+5152 # <cjk>
+0x995B U+514C # <cjk>
+0x995C U+5154 # <cjk>
+0x995D U+5162 # <cjk>
+0x995E U+7AF8 # <cjk>
+0x995F U+5169 # <cjk>
+0x9960 U+516A # <cjk>
+0x9961 U+516E # <cjk>
+0x9962 U+5180 # <cjk>
+0x9963 U+5182 # <cjk>
+0x9964 U+56D8 # <cjk>
+0x9965 U+518C # <cjk>
+0x9966 U+5189 # <cjk>
+0x9967 U+518F # <cjk>
+0x9968 U+5191 # <cjk>
+0x9969 U+5193 # <cjk>
+0x996A U+5195 # <cjk>
+0x996B U+5196 # <cjk>
+0x996C U+51A4 # <cjk>
+0x996D U+51A6 # <cjk>
+0x996E U+51A2 # <cjk>
+0x996F U+51A9 # <cjk>
+0x9970 U+51AA # <cjk>
+0x9971 U+51AB # <cjk>
+0x9972 U+51B3 # <cjk>
+0x9973 U+51B1 # <cjk>
+0x9974 U+51B2 # <cjk>
+0x9975 U+51B0 # <cjk>
+0x9976 U+51B5 # <cjk>
+0x9977 U+51BD # <cjk>
+0x9978 U+51C5 # <cjk>
+0x9979 U+51C9 # <cjk>
+0x997A U+51DB # <cjk>
+0x997B U+51E0 # <cjk>
+0x997C U+8655 # <cjk>
+0x997D U+51E9 # <cjk>
+0x997E U+51ED # <cjk>
+0x9980 U+51F0 # <cjk>
+0x9981 U+51F5 # <cjk>
+0x9982 U+51FE # <cjk>
+0x9983 U+5204 # <cjk>
+0x9984 U+520B # <cjk>
+0x9985 U+5214 # <cjk>
+0x9986 U+520E # <cjk>
+0x9987 U+5227 # <cjk>
+0x9988 U+522A # <cjk>
+0x9989 U+522E # <cjk>
+0x998A U+5233 # <cjk>
+0x998B U+5239 # <cjk>
+0x998C U+524F # <cjk>
+0x998D U+5244 # <cjk>
+0x998E U+524B # <cjk>
+0x998F U+524C # <cjk>
+0x9990 U+525E # <cjk>
+0x9991 U+5254 # <cjk>
+0x9992 U+526A # <cjk>
+0x9993 U+5274 # <cjk>
+0x9994 U+5269 # <cjk>
+0x9995 U+5273 # <cjk>
+0x9996 U+527F # <cjk>
+0x9997 U+527D # <cjk>
+0x9998 U+528D # <cjk>
+0x9999 U+5294 # <cjk>
+0x999A U+5292 # <cjk>
+0x999B U+5271 # <cjk>
+0x999C U+5288 # <cjk>
+0x999D U+5291 # <cjk>
+0x999E U+8FA8 # <cjk>
+0x999F U+8FA7 # <cjk>
+0x99A0 U+52AC # <cjk>
+0x99A1 U+52AD # <cjk>
+0x99A2 U+52BC # <cjk>
+0x99A3 U+52B5 # <cjk>
+0x99A4 U+52C1 # <cjk>
+0x99A5 U+52CD # <cjk>
+0x99A6 U+52D7 # <cjk>
+0x99A7 U+52DE # <cjk>
+0x99A8 U+52E3 # <cjk>
+0x99A9 U+52E6 # <cjk>
+0x99AA U+98ED # <cjk>
+0x99AB U+52E0 # <cjk>
+0x99AC U+52F3 # <cjk>
+0x99AD U+52F5 # <cjk>
+0x99AE U+52F8 # <cjk>
+0x99AF U+52F9 # <cjk>
+0x99B0 U+5306 # <cjk>
+0x99B1 U+5308 # <cjk>
+0x99B2 U+7538 # <cjk>
+0x99B3 U+530D # <cjk>
+0x99B4 U+5310 # <cjk>
+0x99B5 U+530F # <cjk>
+0x99B6 U+5315 # <cjk>
+0x99B7 U+531A # <cjk>
+0x99B8 U+5323 # <cjk>
+0x99B9 U+532F # <cjk>
+0x99BA U+5331 # <cjk>
+0x99BB U+5333 # <cjk>
+0x99BC U+5338 # <cjk>
+0x99BD U+5340 # <cjk>
+0x99BE U+5346 # <cjk>
+0x99BF U+5345 # <cjk>
+0x99C0 U+4E17 # <cjk>
+0x99C1 U+5349 # <cjk>
+0x99C2 U+534D # <cjk>
+0x99C3 U+51D6 # <cjk>
+0x99C4 U+535E # <cjk>
+0x99C5 U+5369 # <cjk>
+0x99C6 U+536E # <cjk>
+0x99C7 U+5918 # <cjk>
+0x99C8 U+537B # <cjk>
+0x99C9 U+5377 # <cjk>
+0x99CA U+5382 # <cjk>
+0x99CB U+5396 # <cjk>
+0x99CC U+53A0 # <cjk>
+0x99CD U+53A6 # <cjk>
+0x99CE U+53A5 # <cjk>
+0x99CF U+53AE # <cjk>
+0x99D0 U+53B0 # <cjk>
+0x99D1 U+53B6 # <cjk>
+0x99D2 U+53C3 # <cjk>
+0x99D3 U+7C12 # <cjk>
+0x99D4 U+96D9 # <cjk>
+0x99D5 U+53DF # <cjk>
+0x99D6 U+66FC # <cjk>
+0x99D7 U+71EE # <cjk>
+0x99D8 U+53EE # <cjk>
+0x99D9 U+53E8 # <cjk>
+0x99DA U+53ED # <cjk>
+0x99DB U+53FA # <cjk>
+0x99DC U+5401 # <cjk>
+0x99DD U+543D # <cjk>
+0x99DE U+5440 # <cjk>
+0x99DF U+542C # <cjk>
+0x99E0 U+542D # <cjk>
+0x99E1 U+543C # <cjk>
+0x99E2 U+542E # <cjk>
+0x99E3 U+5436 # <cjk>
+0x99E4 U+5429 # <cjk>
+0x99E5 U+541D # <cjk>
+0x99E6 U+544E # <cjk>
+0x99E7 U+548F # <cjk>
+0x99E8 U+5475 # <cjk>
+0x99E9 U+548E # <cjk>
+0x99EA U+545F # <cjk>
+0x99EB U+5471 # <cjk>
+0x99EC U+5477 # <cjk>
+0x99ED U+5470 # <cjk>
+0x99EE U+5492 # <cjk>
+0x99EF U+547B # <cjk>
+0x99F0 U+5480 # <cjk>
+0x99F1 U+5476 # <cjk>
+0x99F2 U+5484 # <cjk>
+0x99F3 U+5490 # <cjk>
+0x99F4 U+5486 # <cjk>
+0x99F5 U+54C7 # <cjk>
+0x99F6 U+54A2 # <cjk>
+0x99F7 U+54B8 # <cjk>
+0x99F8 U+54A5 # <cjk>
+0x99F9 U+54AC # <cjk>
+0x99FA U+54C4 # <cjk>
+0x99FB U+54C8 # <cjk>
+0x99FC U+54A8 # <cjk>
+0x9A40 U+54AB # <cjk>
+0x9A41 U+54C2 # <cjk>
+0x9A42 U+54A4 # <cjk>
+0x9A43 U+54BE # <cjk>
+0x9A44 U+54BC # <cjk>
+0x9A45 U+54D8 # <cjk>
+0x9A46 U+54E5 # <cjk>
+0x9A47 U+54E6 # <cjk>
+0x9A48 U+550F # <cjk>
+0x9A49 U+5514 # <cjk>
+0x9A4A U+54FD # <cjk>
+0x9A4B U+54EE # <cjk>
+0x9A4C U+54ED # <cjk>
+0x9A4D U+54FA # <cjk>
+0x9A4E U+54E2 # <cjk>
+0x9A4F U+5539 # <cjk>
+0x9A50 U+5540 # <cjk>
+0x9A51 U+5563 # <cjk>
+0x9A52 U+554C # <cjk>
+0x9A53 U+552E # <cjk>
+0x9A54 U+555C # <cjk>
+0x9A55 U+5545 # <cjk>
+0x9A56 U+5556 # <cjk>
+0x9A57 U+5557 # <cjk>
+0x9A58 U+5538 # <cjk>
+0x9A59 U+5533 # <cjk>
+0x9A5A U+555D # <cjk>
+0x9A5B U+5599 # <cjk>
+0x9A5C U+5580 # <cjk>
+0x9A5D U+54AF # <cjk>
+0x9A5E U+558A # <cjk>
+0x9A5F U+559F # <cjk>
+0x9A60 U+557B # <cjk>
+0x9A61 U+557E # <cjk>
+0x9A62 U+5598 # <cjk>
+0x9A63 U+559E # <cjk>
+0x9A64 U+55AE # <cjk>
+0x9A65 U+557C # <cjk>
+0x9A66 U+5583 # <cjk>
+0x9A67 U+55A9 # <cjk>
+0x9A68 U+5587 # <cjk>
+0x9A69 U+55A8 # <cjk>
+0x9A6A U+55DA # <cjk>
+0x9A6B U+55C5 # <cjk>
+0x9A6C U+55DF # <cjk>
+0x9A6D U+55C4 # <cjk>
+0x9A6E U+55DC # <cjk>
+0x9A6F U+55E4 # <cjk>
+0x9A70 U+55D4 # <cjk>
+0x9A71 U+5614 # <cjk>
+0x9A72 U+55F7 # <cjk>
+0x9A73 U+5616 # <cjk>
+0x9A74 U+55FE # <cjk>
+0x9A75 U+55FD # <cjk>
+0x9A76 U+561B # <cjk>
+0x9A77 U+55F9 # <cjk>
+0x9A78 U+564E # <cjk>
+0x9A79 U+5650 # <cjk>
+0x9A7A U+71DF # <cjk>
+0x9A7B U+5634 # <cjk>
+0x9A7C U+5636 # <cjk>
+0x9A7D U+5632 # <cjk>
+0x9A7E U+5638 # <cjk>
+0x9A80 U+566B # <cjk>
+0x9A81 U+5664 # <cjk>
+0x9A82 U+562F # <cjk>
+0x9A83 U+566C # <cjk>
+0x9A84 U+566A # <cjk>
+0x9A85 U+5686 # <cjk>
+0x9A86 U+5680 # <cjk>
+0x9A87 U+568A # <cjk>
+0x9A88 U+56A0 # <cjk>
+0x9A89 U+5694 # <cjk>
+0x9A8A U+568F # <cjk>
+0x9A8B U+56A5 # <cjk>
+0x9A8C U+56AE # <cjk>
+0x9A8D U+56B6 # <cjk>
+0x9A8E U+56B4 # <cjk>
+0x9A8F U+56C2 # <cjk>
+0x9A90 U+56BC # <cjk>
+0x9A91 U+56C1 # <cjk>
+0x9A92 U+56C3 # <cjk>
+0x9A93 U+56C0 # <cjk>
+0x9A94 U+56C8 # <cjk>
+0x9A95 U+56CE # <cjk>
+0x9A96 U+56D1 # <cjk>
+0x9A97 U+56D3 # <cjk>
+0x9A98 U+56D7 # <cjk>
+0x9A99 U+56EE # <cjk>
+0x9A9A U+56F9 # <cjk>
+0x9A9B U+5700 # <cjk>
+0x9A9C U+56FF # <cjk>
+0x9A9D U+5704 # <cjk>
+0x9A9E U+5709 # <cjk>
+0x9A9F U+5708 # <cjk>
+0x9AA0 U+570B # <cjk>
+0x9AA1 U+570D # <cjk>
+0x9AA2 U+5713 # <cjk>
+0x9AA3 U+5718 # <cjk>
+0x9AA4 U+5716 # <cjk>
+0x9AA5 U+55C7 # <cjk>
+0x9AA6 U+571C # <cjk>
+0x9AA7 U+5726 # <cjk>
+0x9AA8 U+5737 # <cjk>
+0x9AA9 U+5738 # <cjk>
+0x9AAA U+574E # <cjk>
+0x9AAB U+573B # <cjk>
+0x9AAC U+5740 # <cjk>
+0x9AAD U+574F # <cjk>
+0x9AAE U+5769 # <cjk>
+0x9AAF U+57C0 # <cjk>
+0x9AB0 U+5788 # <cjk>
+0x9AB1 U+5761 # <cjk>
+0x9AB2 U+577F # <cjk>
+0x9AB3 U+5789 # <cjk>
+0x9AB4 U+5793 # <cjk>
+0x9AB5 U+57A0 # <cjk>
+0x9AB6 U+57B3 # <cjk>
+0x9AB7 U+57A4 # <cjk>
+0x9AB8 U+57AA # <cjk>
+0x9AB9 U+57B0 # <cjk>
+0x9ABA U+57C3 # <cjk>
+0x9ABB U+57C6 # <cjk>
+0x9ABC U+57D4 # <cjk>
+0x9ABD U+57D2 # <cjk>
+0x9ABE U+57D3 # <cjk>
+0x9ABF U+580A # <cjk>
+0x9AC0 U+57D6 # <cjk>
+0x9AC1 U+57E3 # <cjk>
+0x9AC2 U+580B # <cjk>
+0x9AC3 U+5819 # <cjk>
+0x9AC4 U+581D # <cjk>
+0x9AC5 U+5872 # <cjk>
+0x9AC6 U+5821 # <cjk>
+0x9AC7 U+5862 # <cjk>
+0x9AC8 U+584B # <cjk>
+0x9AC9 U+5870 # <cjk>
+0x9ACA U+6BC0 # <cjk>
+0x9ACB U+5852 # <cjk>
+0x9ACC U+583D # <cjk>
+0x9ACD U+5879 # <cjk>
+0x9ACE U+5885 # <cjk>
+0x9ACF U+58B9 # <cjk>
+0x9AD0 U+589F # <cjk>
+0x9AD1 U+58AB # <cjk>
+0x9AD2 U+58BA # <cjk>
+0x9AD3 U+58DE # <cjk>
+0x9AD4 U+58BB # <cjk>
+0x9AD5 U+58B8 # <cjk>
+0x9AD6 U+58AE # <cjk>
+0x9AD7 U+58C5 # <cjk>
+0x9AD8 U+58D3 # <cjk>
+0x9AD9 U+58D1 # <cjk>
+0x9ADA U+58D7 # <cjk>
+0x9ADB U+58D9 # <cjk>
+0x9ADC U+58D8 # <cjk>
+0x9ADD U+58E5 # <cjk>
+0x9ADE U+58DC # <cjk>
+0x9ADF U+58E4 # <cjk>
+0x9AE0 U+58DF # <cjk>
+0x9AE1 U+58EF # <cjk>
+0x9AE2 U+58FA # <cjk>
+0x9AE3 U+58F9 # <cjk>
+0x9AE4 U+58FB # <cjk>
+0x9AE5 U+58FC # <cjk>
+0x9AE6 U+58FD # <cjk>
+0x9AE7 U+5902 # <cjk>
+0x9AE8 U+590A # <cjk>
+0x9AE9 U+5910 # <cjk>
+0x9AEA U+591B # <cjk>
+0x9AEB U+68A6 # <cjk>
+0x9AEC U+5925 # <cjk>
+0x9AED U+592C # <cjk>
+0x9AEE U+592D # <cjk>
+0x9AEF U+5932 # <cjk>
+0x9AF0 U+5938 # <cjk>
+0x9AF1 U+593E # <cjk>
+0x9AF2 U+7AD2 # <cjk>
+0x9AF3 U+5955 # <cjk>
+0x9AF4 U+5950 # <cjk>
+0x9AF5 U+594E # <cjk>
+0x9AF6 U+595A # <cjk>
+0x9AF7 U+5958 # <cjk>
+0x9AF8 U+5962 # <cjk>
+0x9AF9 U+5960 # <cjk>
+0x9AFA U+5967 # <cjk>
+0x9AFB U+596C # <cjk>
+0x9AFC U+5969 # <cjk>
+0x9B40 U+5978 # <cjk>
+0x9B41 U+5981 # <cjk>
+0x9B42 U+599D # <cjk>
+0x9B43 U+4F5E # <cjk>
+0x9B44 U+4FAB # <cjk>
+0x9B45 U+59A3 # <cjk>
+0x9B46 U+59B2 # <cjk>
+0x9B47 U+59C6 # <cjk>
+0x9B48 U+59E8 # <cjk>
+0x9B49 U+59DC # <cjk>
+0x9B4A U+598D # <cjk>
+0x9B4B U+59D9 # <cjk>
+0x9B4C U+59DA # <cjk>
+0x9B4D U+5A25 # <cjk>
+0x9B4E U+5A1F # <cjk>
+0x9B4F U+5A11 # <cjk>
+0x9B50 U+5A1C # <cjk>
+0x9B51 U+5A09 # <cjk>
+0x9B52 U+5A1A # <cjk>
+0x9B53 U+5A40 # <cjk>
+0x9B54 U+5A6C # <cjk>
+0x9B55 U+5A49 # <cjk>
+0x9B56 U+5A35 # <cjk>
+0x9B57 U+5A36 # <cjk>
+0x9B58 U+5A62 # <cjk>
+0x9B59 U+5A6A # <cjk>
+0x9B5A U+5A9A # <cjk>
+0x9B5B U+5ABC # <cjk>
+0x9B5C U+5ABE # <cjk>
+0x9B5D U+5ACB # <cjk>
+0x9B5E U+5AC2 # <cjk>
+0x9B5F U+5ABD # <cjk>
+0x9B60 U+5AE3 # <cjk>
+0x9B61 U+5AD7 # <cjk>
+0x9B62 U+5AE6 # <cjk>
+0x9B63 U+5AE9 # <cjk>
+0x9B64 U+5AD6 # <cjk>
+0x9B65 U+5AFA # <cjk>
+0x9B66 U+5AFB # <cjk>
+0x9B67 U+5B0C # <cjk>
+0x9B68 U+5B0B # <cjk>
+0x9B69 U+5B16 # <cjk>
+0x9B6A U+5B32 # <cjk>
+0x9B6B U+5AD0 # <cjk>
+0x9B6C U+5B2A # <cjk>
+0x9B6D U+5B36 # <cjk>
+0x9B6E U+5B3E # <cjk>
+0x9B6F U+5B43 # <cjk>
+0x9B70 U+5B45 # <cjk>
+0x9B71 U+5B40 # <cjk>
+0x9B72 U+5B51 # <cjk>
+0x9B73 U+5B55 # <cjk>
+0x9B74 U+5B5A # <cjk>
+0x9B75 U+5B5B # <cjk>
+0x9B76 U+5B65 # <cjk>
+0x9B77 U+5B69 # <cjk>
+0x9B78 U+5B70 # <cjk>
+0x9B79 U+5B73 # <cjk>
+0x9B7A U+5B75 # <cjk>
+0x9B7B U+5B78 # <cjk>
+0x9B7C U+6588 # <cjk>
+0x9B7D U+5B7A # <cjk>
+0x9B7E U+5B80 # <cjk>
+0x9B80 U+5B83 # <cjk>
+0x9B81 U+5BA6 # <cjk>
+0x9B82 U+5BB8 # <cjk>
+0x9B83 U+5BC3 # <cjk>
+0x9B84 U+5BC7 # <cjk>
+0x9B85 U+5BC9 # <cjk>
+0x9B86 U+5BD4 # <cjk>
+0x9B87 U+5BD0 # <cjk>
+0x9B88 U+5BE4 # <cjk>
+0x9B89 U+5BE6 # <cjk>
+0x9B8A U+5BE2 # <cjk>
+0x9B8B U+5BDE # <cjk>
+0x9B8C U+5BE5 # <cjk>
+0x9B8D U+5BEB # <cjk>
+0x9B8E U+5BF0 # <cjk>
+0x9B8F U+5BF6 # <cjk>
+0x9B90 U+5BF3 # <cjk>
+0x9B91 U+5C05 # <cjk>
+0x9B92 U+5C07 # <cjk>
+0x9B93 U+5C08 # <cjk>
+0x9B94 U+5C0D # <cjk>
+0x9B95 U+5C13 # <cjk>
+0x9B96 U+5C20 # <cjk>
+0x9B97 U+5C22 # <cjk>
+0x9B98 U+5C28 # <cjk>
+0x9B99 U+5C38 # <cjk>
+0x9B9A U+5C39 # <cjk>
+0x9B9B U+5C41 # <cjk>
+0x9B9C U+5C46 # <cjk>
+0x9B9D U+5C4E # <cjk>
+0x9B9E U+5C53 # <cjk>
+0x9B9F U+5C50 # <cjk>
+0x9BA0 U+5C4F # <cjk>
+0x9BA1 U+5B71 # <cjk>
+0x9BA2 U+5C6C # <cjk>
+0x9BA3 U+5C6E # <cjk>
+0x9BA4 U+4E62 # <cjk>
+0x9BA5 U+5C76 # <cjk>
+0x9BA6 U+5C79 # <cjk>
+0x9BA7 U+5C8C # <cjk>
+0x9BA8 U+5C91 # <cjk>
+0x9BA9 U+5C94 # <cjk>
+0x9BAA U+599B # <cjk>
+0x9BAB U+5CAB # <cjk>
+0x9BAC U+5CBB # <cjk>
+0x9BAD U+5CB6 # <cjk>
+0x9BAE U+5CBC # <cjk>
+0x9BAF U+5CB7 # <cjk>
+0x9BB0 U+5CC5 # <cjk>
+0x9BB1 U+5CBE # <cjk>
+0x9BB2 U+5CC7 # <cjk>
+0x9BB3 U+5CD9 # <cjk>
+0x9BB4 U+5CE9 # <cjk>
+0x9BB5 U+5CFD # <cjk>
+0x9BB6 U+5CFA # <cjk>
+0x9BB7 U+5CED # <cjk>
+0x9BB8 U+5D8C # <cjk>
+0x9BB9 U+5CEA # <cjk>
+0x9BBA U+5D0B # <cjk>
+0x9BBB U+5D15 # <cjk>
+0x9BBC U+5D17 # <cjk>
+0x9BBD U+5D5C # <cjk>
+0x9BBE U+5D1F # <cjk>
+0x9BBF U+5D1B # <cjk>
+0x9BC0 U+5D11 # <cjk>
+0x9BC1 U+5D14 # <cjk>
+0x9BC2 U+5D22 # <cjk>
+0x9BC3 U+5D1A # <cjk>
+0x9BC4 U+5D19 # <cjk>
+0x9BC5 U+5D18 # <cjk>
+0x9BC6 U+5D4C # <cjk>
+0x9BC7 U+5D52 # <cjk>
+0x9BC8 U+5D4E # <cjk>
+0x9BC9 U+5D4B # <cjk>
+0x9BCA U+5D6C # <cjk>
+0x9BCB U+5D73 # <cjk>
+0x9BCC U+5D76 # <cjk>
+0x9BCD U+5D87 # <cjk>
+0x9BCE U+5D84 # <cjk>
+0x9BCF U+5D82 # <cjk>
+0x9BD0 U+5DA2 # <cjk>
+0x9BD1 U+5D9D # <cjk>
+0x9BD2 U+5DAC # <cjk>
+0x9BD3 U+5DAE # <cjk>
+0x9BD4 U+5DBD # <cjk>
+0x9BD5 U+5D90 # <cjk>
+0x9BD6 U+5DB7 # <cjk>
+0x9BD7 U+5DBC # <cjk>
+0x9BD8 U+5DC9 # <cjk>
+0x9BD9 U+5DCD # <cjk>
+0x9BDA U+5DD3 # <cjk>
+0x9BDB U+5DD2 # <cjk>
+0x9BDC U+5DD6 # <cjk>
+0x9BDD U+5DDB # <cjk>
+0x9BDE U+5DEB # <cjk>
+0x9BDF U+5DF2 # <cjk>
+0x9BE0 U+5DF5 # <cjk>
+0x9BE1 U+5E0B # <cjk>
+0x9BE2 U+5E1A # <cjk>
+0x9BE3 U+5E19 # <cjk>
+0x9BE4 U+5E11 # <cjk>
+0x9BE5 U+5E1B # <cjk>
+0x9BE6 U+5E36 # <cjk>
+0x9BE7 U+5E37 # <cjk>
+0x9BE8 U+5E44 # <cjk>
+0x9BE9 U+5E43 # <cjk>
+0x9BEA U+5E40 # <cjk>
+0x9BEB U+5E4E # <cjk>
+0x9BEC U+5E57 # <cjk>
+0x9BED U+5E54 # <cjk>
+0x9BEE U+5E5F # <cjk>
+0x9BEF U+5E62 # <cjk>
+0x9BF0 U+5E64 # <cjk>
+0x9BF1 U+5E47 # <cjk>
+0x9BF2 U+5E75 # <cjk>
+0x9BF3 U+5E76 # <cjk>
+0x9BF4 U+5E7A # <cjk>
+0x9BF5 U+9EBC # <cjk>
+0x9BF6 U+5E7F # <cjk>
+0x9BF7 U+5EA0 # <cjk>
+0x9BF8 U+5EC1 # <cjk>
+0x9BF9 U+5EC2 # <cjk>
+0x9BFA U+5EC8 # <cjk>
+0x9BFB U+5ED0 # <cjk>
+0x9BFC U+5ECF # <cjk>
+0x9C40 U+5ED6 # <cjk>
+0x9C41 U+5EE3 # <cjk>
+0x9C42 U+5EDD # <cjk>
+0x9C43 U+5EDA # <cjk>
+0x9C44 U+5EDB # <cjk>
+0x9C45 U+5EE2 # <cjk>
+0x9C46 U+5EE1 # <cjk>
+0x9C47 U+5EE8 # <cjk>
+0x9C48 U+5EE9 # <cjk>
+0x9C49 U+5EEC # <cjk>
+0x9C4A U+5EF1 # <cjk>
+0x9C4B U+5EF3 # <cjk>
+0x9C4C U+5EF0 # <cjk>
+0x9C4D U+5EF4 # <cjk>
+0x9C4E U+5EF8 # <cjk>
+0x9C4F U+5EFE # <cjk>
+0x9C50 U+5F03 # <cjk>
+0x9C51 U+5F09 # <cjk>
+0x9C52 U+5F5D # <cjk>
+0x9C53 U+5F5C # <cjk>
+0x9C54 U+5F0B # <cjk>
+0x9C55 U+5F11 # <cjk>
+0x9C56 U+5F16 # <cjk>
+0x9C57 U+5F29 # <cjk>
+0x9C58 U+5F2D # <cjk>
+0x9C59 U+5F38 # <cjk>
+0x9C5A U+5F41 # <cjk>
+0x9C5B U+5F48 # <cjk>
+0x9C5C U+5F4C # <cjk>
+0x9C5D U+5F4E # <cjk>
+0x9C5E U+5F2F # <cjk>
+0x9C5F U+5F51 # <cjk>
+0x9C60 U+5F56 # <cjk>
+0x9C61 U+5F57 # <cjk>
+0x9C62 U+5F59 # <cjk>
+0x9C63 U+5F61 # <cjk>
+0x9C64 U+5F6D # <cjk>
+0x9C65 U+5F73 # <cjk>
+0x9C66 U+5F77 # <cjk>
+0x9C67 U+5F83 # <cjk>
+0x9C68 U+5F82 # <cjk>
+0x9C69 U+5F7F # <cjk>
+0x9C6A U+5F8A # <cjk>
+0x9C6B U+5F88 # <cjk>
+0x9C6C U+5F91 # <cjk>
+0x9C6D U+5F87 # <cjk>
+0x9C6E U+5F9E # <cjk>
+0x9C6F U+5F99 # <cjk>
+0x9C70 U+5F98 # <cjk>
+0x9C71 U+5FA0 # <cjk>
+0x9C72 U+5FA8 # <cjk>
+0x9C73 U+5FAD # <cjk>
+0x9C74 U+5FBC # <cjk>
+0x9C75 U+5FD6 # <cjk>
+0x9C76 U+5FFB # <cjk>
+0x9C77 U+5FE4 # <cjk>
+0x9C78 U+5FF8 # <cjk>
+0x9C79 U+5FF1 # <cjk>
+0x9C7A U+5FDD # <cjk>
+0x9C7B U+60B3 # <cjk>
+0x9C7C U+5FFF # <cjk>
+0x9C7D U+6021 # <cjk>
+0x9C7E U+6060 # <cjk>
+0x9C80 U+6019 # <cjk>
+0x9C81 U+6010 # <cjk>
+0x9C82 U+6029 # <cjk>
+0x9C83 U+600E # <cjk>
+0x9C84 U+6031 # <cjk>
+0x9C85 U+601B # <cjk>
+0x9C86 U+6015 # <cjk>
+0x9C87 U+602B # <cjk>
+0x9C88 U+6026 # <cjk>
+0x9C89 U+600F # <cjk>
+0x9C8A U+603A # <cjk>
+0x9C8B U+605A # <cjk>
+0x9C8C U+6041 # <cjk>
+0x9C8D U+606A # <cjk>
+0x9C8E U+6077 # <cjk>
+0x9C8F U+605F # <cjk>
+0x9C90 U+604A # <cjk>
+0x9C91 U+6046 # <cjk>
+0x9C92 U+604D # <cjk>
+0x9C93 U+6063 # <cjk>
+0x9C94 U+6043 # <cjk>
+0x9C95 U+6064 # <cjk>
+0x9C96 U+6042 # <cjk>
+0x9C97 U+606C # <cjk>
+0x9C98 U+606B # <cjk>
+0x9C99 U+6059 # <cjk>
+0x9C9A U+6081 # <cjk>
+0x9C9B U+608D # <cjk>
+0x9C9C U+60E7 # <cjk>
+0x9C9D U+6083 # <cjk>
+0x9C9E U+609A # <cjk>
+0x9C9F U+6084 # <cjk>
+0x9CA0 U+609B # <cjk>
+0x9CA1 U+6096 # <cjk>
+0x9CA2 U+6097 # <cjk>
+0x9CA3 U+6092 # <cjk>
+0x9CA4 U+60A7 # <cjk>
+0x9CA5 U+608B # <cjk>
+0x9CA6 U+60E1 # <cjk>
+0x9CA7 U+60B8 # <cjk>
+0x9CA8 U+60E0 # <cjk>
+0x9CA9 U+60D3 # <cjk>
+0x9CAA U+60B4 # <cjk>
+0x9CAB U+5FF0 # <cjk>
+0x9CAC U+60BD # <cjk>
+0x9CAD U+60C6 # <cjk>
+0x9CAE U+60B5 # <cjk>
+0x9CAF U+60D8 # <cjk>
+0x9CB0 U+614D # <cjk>
+0x9CB1 U+6115 # <cjk>
+0x9CB2 U+6106 # <cjk>
+0x9CB3 U+60F6 # <cjk>
+0x9CB4 U+60F7 # <cjk>
+0x9CB5 U+6100 # <cjk>
+0x9CB6 U+60F4 # <cjk>
+0x9CB7 U+60FA # <cjk>
+0x9CB8 U+6103 # <cjk>
+0x9CB9 U+6121 # <cjk>
+0x9CBA U+60FB # <cjk>
+0x9CBB U+60F1 # <cjk>
+0x9CBC U+610D # <cjk>
+0x9CBD U+610E # <cjk>
+0x9CBE U+6147 # <cjk>
+0x9CBF U+613E # <cjk>
+0x9CC0 U+6128 # <cjk>
+0x9CC1 U+6127 # <cjk>
+0x9CC2 U+614A # <cjk>
+0x9CC3 U+613F # <cjk>
+0x9CC4 U+613C # <cjk>
+0x9CC5 U+612C # <cjk>
+0x9CC6 U+6134 # <cjk>
+0x9CC7 U+613D # <cjk>
+0x9CC8 U+6142 # <cjk>
+0x9CC9 U+6144 # <cjk>
+0x9CCA U+6173 # <cjk>
+0x9CCB U+6177 # <cjk>
+0x9CCC U+6158 # <cjk>
+0x9CCD U+6159 # <cjk>
+0x9CCE U+615A # <cjk>
+0x9CCF U+616B # <cjk>
+0x9CD0 U+6174 # <cjk>
+0x9CD1 U+616F # <cjk>
+0x9CD2 U+6165 # <cjk>
+0x9CD3 U+6171 # <cjk>
+0x9CD4 U+615F # <cjk>
+0x9CD5 U+615D # <cjk>
+0x9CD6 U+6153 # <cjk>
+0x9CD7 U+6175 # <cjk>
+0x9CD8 U+6199 # <cjk>
+0x9CD9 U+6196 # <cjk>
+0x9CDA U+6187 # <cjk>
+0x9CDB U+61AC # <cjk>
+0x9CDC U+6194 # <cjk>
+0x9CDD U+619A # <cjk>
+0x9CDE U+618A # <cjk>
+0x9CDF U+6191 # <cjk>
+0x9CE0 U+61AB # <cjk>
+0x9CE1 U+61AE # <cjk>
+0x9CE2 U+61CC # <cjk>
+0x9CE3 U+61CA # <cjk>
+0x9CE4 U+61C9 # <cjk>
+0x9CE5 U+61F7 # <cjk>
+0x9CE6 U+61C8 # <cjk>
+0x9CE7 U+61C3 # <cjk>
+0x9CE8 U+61C6 # <cjk>
+0x9CE9 U+61BA # <cjk>
+0x9CEA U+61CB # <cjk>
+0x9CEB U+7F79 # <cjk>
+0x9CEC U+61CD # <cjk>
+0x9CED U+61E6 # <cjk>
+0x9CEE U+61E3 # <cjk>
+0x9CEF U+61F6 # <cjk>
+0x9CF0 U+61FA # <cjk>
+0x9CF1 U+61F4 # <cjk>
+0x9CF2 U+61FF # <cjk>
+0x9CF3 U+61FD # <cjk>
+0x9CF4 U+61FC # <cjk>
+0x9CF5 U+61FE # <cjk>
+0x9CF6 U+6200 # <cjk>
+0x9CF7 U+6208 # <cjk>
+0x9CF8 U+6209 # <cjk>
+0x9CF9 U+620D # <cjk>
+0x9CFA U+620C # <cjk>
+0x9CFB U+6214 # <cjk>
+0x9CFC U+621B # <cjk>
+0x9D40 U+621E # <cjk>
+0x9D41 U+6221 # <cjk>
+0x9D42 U+622A # <cjk>
+0x9D43 U+622E # <cjk>
+0x9D44 U+6230 # <cjk>
+0x9D45 U+6232 # <cjk>
+0x9D46 U+6233 # <cjk>
+0x9D47 U+6241 # <cjk>
+0x9D48 U+624E # <cjk>
+0x9D49 U+625E # <cjk>
+0x9D4A U+6263 # <cjk>
+0x9D4B U+625B # <cjk>
+0x9D4C U+6260 # <cjk>
+0x9D4D U+6268 # <cjk>
+0x9D4E U+627C # <cjk>
+0x9D4F U+6282 # <cjk>
+0x9D50 U+6289 # <cjk>
+0x9D51 U+627E # <cjk>
+0x9D52 U+6292 # <cjk>
+0x9D53 U+6293 # <cjk>
+0x9D54 U+6296 # <cjk>
+0x9D55 U+62D4 # <cjk>
+0x9D56 U+6283 # <cjk>
+0x9D57 U+6294 # <cjk>
+0x9D58 U+62D7 # <cjk>
+0x9D59 U+62D1 # <cjk>
+0x9D5A U+62BB # <cjk>
+0x9D5B U+62CF # <cjk>
+0x9D5C U+62FF # <cjk>
+0x9D5D U+62C6 # <cjk>
+0x9D5E U+64D4 # <cjk>
+0x9D5F U+62C8 # <cjk>
+0x9D60 U+62DC # <cjk>
+0x9D61 U+62CC # <cjk>
+0x9D62 U+62CA # <cjk>
+0x9D63 U+62C2 # <cjk>
+0x9D64 U+62C7 # <cjk>
+0x9D65 U+629B # <cjk>
+0x9D66 U+62C9 # <cjk>
+0x9D67 U+630C # <cjk>
+0x9D68 U+62EE # <cjk>
+0x9D69 U+62F1 # <cjk>
+0x9D6A U+6327 # <cjk>
+0x9D6B U+6302 # <cjk>
+0x9D6C U+6308 # <cjk>
+0x9D6D U+62EF # <cjk>
+0x9D6E U+62F5 # <cjk>
+0x9D6F U+6350 # <cjk>
+0x9D70 U+633E # <cjk>
+0x9D71 U+634D # <cjk>
+0x9D72 U+641C # <cjk>
+0x9D73 U+634F # <cjk>
+0x9D74 U+6396 # <cjk>
+0x9D75 U+638E # <cjk>
+0x9D76 U+6380 # <cjk>
+0x9D77 U+63AB # <cjk>
+0x9D78 U+6376 # <cjk>
+0x9D79 U+63A3 # <cjk>
+0x9D7A U+638F # <cjk>
+0x9D7B U+6389 # <cjk>
+0x9D7C U+639F # <cjk>
+0x9D7D U+63B5 # <cjk>
+0x9D7E U+636B # <cjk>
+0x9D80 U+6369 # <cjk>
+0x9D81 U+63BE # <cjk>
+0x9D82 U+63E9 # <cjk>
+0x9D83 U+63C0 # <cjk>
+0x9D84 U+63C6 # <cjk>
+0x9D85 U+63E3 # <cjk>
+0x9D86 U+63C9 # <cjk>
+0x9D87 U+63D2 # <cjk>
+0x9D88 U+63F6 # <cjk>
+0x9D89 U+63C4 # <cjk>
+0x9D8A U+6416 # <cjk>
+0x9D8B U+6434 # <cjk>
+0x9D8C U+6406 # <cjk>
+0x9D8D U+6413 # <cjk>
+0x9D8E U+6426 # <cjk>
+0x9D8F U+6436 # <cjk>
+0x9D90 U+651D # <cjk>
+0x9D91 U+6417 # <cjk>
+0x9D92 U+6428 # <cjk>
+0x9D93 U+640F # <cjk>
+0x9D94 U+6467 # <cjk>
+0x9D95 U+646F # <cjk>
+0x9D96 U+6476 # <cjk>
+0x9D97 U+644E # <cjk>
+0x9D98 U+652A # <cjk>
+0x9D99 U+6495 # <cjk>
+0x9D9A U+6493 # <cjk>
+0x9D9B U+64A5 # <cjk>
+0x9D9C U+64A9 # <cjk>
+0x9D9D U+6488 # <cjk>
+0x9D9E U+64BC # <cjk>
+0x9D9F U+64DA # <cjk>
+0x9DA0 U+64D2 # <cjk>
+0x9DA1 U+64C5 # <cjk>
+0x9DA2 U+64C7 # <cjk>
+0x9DA3 U+64BB # <cjk>
+0x9DA4 U+64D8 # <cjk>
+0x9DA5 U+64C2 # <cjk>
+0x9DA6 U+64F1 # <cjk>
+0x9DA7 U+64E7 # <cjk>
+0x9DA8 U+8209 # <cjk>
+0x9DA9 U+64E0 # <cjk>
+0x9DAA U+64E1 # <cjk>
+0x9DAB U+62AC # <cjk>
+0x9DAC U+64E3 # <cjk>
+0x9DAD U+64EF # <cjk>
+0x9DAE U+652C # <cjk>
+0x9DAF U+64F6 # <cjk>
+0x9DB0 U+64F4 # <cjk>
+0x9DB1 U+64F2 # <cjk>
+0x9DB2 U+64FA # <cjk>
+0x9DB3 U+6500 # <cjk>
+0x9DB4 U+64FD # <cjk>
+0x9DB5 U+6518 # <cjk>
+0x9DB6 U+651C # <cjk>
+0x9DB7 U+6505 # <cjk>
+0x9DB8 U+6524 # <cjk>
+0x9DB9 U+6523 # <cjk>
+0x9DBA U+652B # <cjk>
+0x9DBB U+6534 # <cjk>
+0x9DBC U+6535 # <cjk>
+0x9DBD U+6537 # <cjk>
+0x9DBE U+6536 # <cjk>
+0x9DBF U+6538 # <cjk>
+0x9DC0 U+754B # <cjk>
+0x9DC1 U+6548 # <cjk>
+0x9DC2 U+6556 # <cjk>
+0x9DC3 U+6555 # <cjk>
+0x9DC4 U+654D # <cjk>
+0x9DC5 U+6558 # <cjk>
+0x9DC6 U+655E # <cjk>
+0x9DC7 U+655D # <cjk>
+0x9DC8 U+6572 # <cjk>
+0x9DC9 U+6578 # <cjk>
+0x9DCA U+6582 # <cjk>
+0x9DCB U+6583 # <cjk>
+0x9DCC U+8B8A # <cjk>
+0x9DCD U+659B # <cjk>
+0x9DCE U+659F # <cjk>
+0x9DCF U+65AB # <cjk>
+0x9DD0 U+65B7 # <cjk>
+0x9DD1 U+65C3 # <cjk>
+0x9DD2 U+65C6 # <cjk>
+0x9DD3 U+65C1 # <cjk>
+0x9DD4 U+65C4 # <cjk>
+0x9DD5 U+65CC # <cjk>
+0x9DD6 U+65D2 # <cjk>
+0x9DD7 U+65DB # <cjk>
+0x9DD8 U+65D9 # <cjk>
+0x9DD9 U+65E0 # <cjk>
+0x9DDA U+65E1 # <cjk>
+0x9DDB U+65F1 # <cjk>
+0x9DDC U+6772 # <cjk>
+0x9DDD U+660A # <cjk>
+0x9DDE U+6603 # <cjk>
+0x9DDF U+65FB # <cjk>
+0x9DE0 U+6773 # <cjk>
+0x9DE1 U+6635 # <cjk>
+0x9DE2 U+6636 # <cjk>
+0x9DE3 U+6634 # <cjk>
+0x9DE4 U+661C # <cjk>
+0x9DE5 U+664F # <cjk>
+0x9DE6 U+6644 # <cjk>
+0x9DE7 U+6649 # <cjk>
+0x9DE8 U+6641 # <cjk>
+0x9DE9 U+665E # <cjk>
+0x9DEA U+665D # <cjk>
+0x9DEB U+6664 # <cjk>
+0x9DEC U+6667 # <cjk>
+0x9DED U+6668 # <cjk>
+0x9DEE U+665F # <cjk>
+0x9DEF U+6662 # <cjk>
+0x9DF0 U+6670 # <cjk>
+0x9DF1 U+6683 # <cjk>
+0x9DF2 U+6688 # <cjk>
+0x9DF3 U+668E # <cjk>
+0x9DF4 U+6689 # <cjk>
+0x9DF5 U+6684 # <cjk>
+0x9DF6 U+6698 # <cjk>
+0x9DF7 U+669D # <cjk>
+0x9DF8 U+66C1 # <cjk>
+0x9DF9 U+66B9 # <cjk>
+0x9DFA U+66C9 # <cjk>
+0x9DFB U+66BE # <cjk>
+0x9DFC U+66BC # <cjk>
+0x9E40 U+66C4 # <cjk>
+0x9E41 U+66B8 # <cjk>
+0x9E42 U+66D6 # <cjk>
+0x9E43 U+66DA # <cjk>
+0x9E44 U+66E0 # <cjk>
+0x9E45 U+663F # <cjk>
+0x9E46 U+66E6 # <cjk>
+0x9E47 U+66E9 # <cjk>
+0x9E48 U+66F0 # <cjk>
+0x9E49 U+66F5 # <cjk>
+0x9E4A U+66F7 # <cjk>
+0x9E4B U+670F # <cjk>
+0x9E4C U+6716 # <cjk>
+0x9E4D U+671E # <cjk>
+0x9E4E U+6726 # <cjk>
+0x9E4F U+6727 # <cjk>
+0x9E50 U+9738 # <cjk>
+0x9E51 U+672E # <cjk>
+0x9E52 U+673F # <cjk>
+0x9E53 U+6736 # <cjk>
+0x9E54 U+6741 # <cjk>
+0x9E55 U+6738 # <cjk>
+0x9E56 U+6737 # <cjk>
+0x9E57 U+6746 # <cjk>
+0x9E58 U+675E # <cjk>
+0x9E59 U+6760 # <cjk>
+0x9E5A U+6759 # <cjk>
+0x9E5B U+6763 # <cjk>
+0x9E5C U+6764 # <cjk>
+0x9E5D U+6789 # <cjk>
+0x9E5E U+6770 # <cjk>
+0x9E5F U+67A9 # <cjk>
+0x9E60 U+677C # <cjk>
+0x9E61 U+676A # <cjk>
+0x9E62 U+678C # <cjk>
+0x9E63 U+678B # <cjk>
+0x9E64 U+67A6 # <cjk>
+0x9E65 U+67A1 # <cjk>
+0x9E66 U+6785 # <cjk>
+0x9E67 U+67B7 # <cjk>
+0x9E68 U+67EF # <cjk>
+0x9E69 U+67B4 # <cjk>
+0x9E6A U+67EC # <cjk>
+0x9E6B U+67B3 # <cjk>
+0x9E6C U+67E9 # <cjk>
+0x9E6D U+67B8 # <cjk>
+0x9E6E U+67E4 # <cjk>
+0x9E6F U+67DE # <cjk>
+0x9E70 U+67DD # <cjk>
+0x9E71 U+67E2 # <cjk>
+0x9E72 U+67EE # <cjk>
+0x9E73 U+67B9 # <cjk>
+0x9E74 U+67CE # <cjk>
+0x9E75 U+67C6 # <cjk>
+0x9E76 U+67E7 # <cjk>
+0x9E77 U+6A9C # <cjk>
+0x9E78 U+681E # <cjk>
+0x9E79 U+6846 # <cjk>
+0x9E7A U+6829 # <cjk>
+0x9E7B U+6840 # <cjk>
+0x9E7C U+684D # <cjk>
+0x9E7D U+6832 # <cjk>
+0x9E7E U+684E # <cjk>
+0x9E80 U+68B3 # <cjk>
+0x9E81 U+682B # <cjk>
+0x9E82 U+6859 # <cjk>
+0x9E83 U+6863 # <cjk>
+0x9E84 U+6877 # <cjk>
+0x9E85 U+687F # <cjk>
+0x9E86 U+689F # <cjk>
+0x9E87 U+688F # <cjk>
+0x9E88 U+68AD # <cjk>
+0x9E89 U+6894 # <cjk>
+0x9E8A U+689D # <cjk>
+0x9E8B U+689B # <cjk>
+0x9E8C U+6883 # <cjk>
+0x9E8D U+6AAE # <cjk>
+0x9E8E U+68B9 # <cjk>
+0x9E8F U+6874 # <cjk>
+0x9E90 U+68B5 # <cjk>
+0x9E91 U+68A0 # <cjk>
+0x9E92 U+68BA # <cjk>
+0x9E93 U+690F # <cjk>
+0x9E94 U+688D # <cjk>
+0x9E95 U+687E # <cjk>
+0x9E96 U+6901 # <cjk>
+0x9E97 U+68CA # <cjk>
+0x9E98 U+6908 # <cjk>
+0x9E99 U+68D8 # <cjk>
+0x9E9A U+6922 # <cjk>
+0x9E9B U+6926 # <cjk>
+0x9E9C U+68E1 # <cjk>
+0x9E9D U+690C # <cjk>
+0x9E9E U+68CD # <cjk>
+0x9E9F U+68D4 # <cjk>
+0x9EA0 U+68E7 # <cjk>
+0x9EA1 U+68D5 # <cjk>
+0x9EA2 U+6936 # <cjk>
+0x9EA3 U+6912 # <cjk>
+0x9EA4 U+6904 # <cjk>
+0x9EA5 U+68D7 # <cjk>
+0x9EA6 U+68E3 # <cjk>
+0x9EA7 U+6925 # <cjk>
+0x9EA8 U+68F9 # <cjk>
+0x9EA9 U+68E0 # <cjk>
+0x9EAA U+68EF # <cjk>
+0x9EAB U+6928 # <cjk>
+0x9EAC U+692A # <cjk>
+0x9EAD U+691A # <cjk>
+0x9EAE U+6923 # <cjk>
+0x9EAF U+6921 # <cjk>
+0x9EB0 U+68C6 # <cjk>
+0x9EB1 U+6979 # <cjk>
+0x9EB2 U+6977 # <cjk>
+0x9EB3 U+695C # <cjk>
+0x9EB4 U+6978 # <cjk>
+0x9EB5 U+696B # <cjk>
+0x9EB6 U+6954 # <cjk>
+0x9EB7 U+697E # <cjk>
+0x9EB8 U+696E # <cjk>
+0x9EB9 U+6939 # <cjk>
+0x9EBA U+6974 # <cjk>
+0x9EBB U+693D # <cjk>
+0x9EBC U+6959 # <cjk>
+0x9EBD U+6930 # <cjk>
+0x9EBE U+6961 # <cjk>
+0x9EBF U+695E # <cjk>
+0x9EC0 U+695D # <cjk>
+0x9EC1 U+6981 # <cjk>
+0x9EC2 U+696A # <cjk>
+0x9EC3 U+69B2 # <cjk>
+0x9EC4 U+69AE # <cjk>
+0x9EC5 U+69D0 # <cjk>
+0x9EC6 U+69BF # <cjk>
+0x9EC7 U+69C1 # <cjk>
+0x9EC8 U+69D3 # <cjk>
+0x9EC9 U+69BE # <cjk>
+0x9ECA U+69CE # <cjk>
+0x9ECB U+5BE8 # <cjk>
+0x9ECC U+69CA # <cjk>
+0x9ECD U+69DD # <cjk>
+0x9ECE U+69BB # <cjk>
+0x9ECF U+69C3 # <cjk>
+0x9ED0 U+69A7 # <cjk>
+0x9ED1 U+6A2E # <cjk>
+0x9ED2 U+6991 # <cjk>
+0x9ED3 U+69A0 # <cjk>
+0x9ED4 U+699C # <cjk>
+0x9ED5 U+6995 # <cjk>
+0x9ED6 U+69B4 # <cjk>
+0x9ED7 U+69DE # <cjk>
+0x9ED8 U+69E8 # <cjk>
+0x9ED9 U+6A02 # <cjk>
+0x9EDA U+6A1B # <cjk>
+0x9EDB U+69FF # <cjk>
+0x9EDC U+6B0A # <cjk>
+0x9EDD U+69F9 # <cjk>
+0x9EDE U+69F2 # <cjk>
+0x9EDF U+69E7 # <cjk>
+0x9EE0 U+6A05 # <cjk>
+0x9EE1 U+69B1 # <cjk>
+0x9EE2 U+6A1E # <cjk>
+0x9EE3 U+69ED # <cjk>
+0x9EE4 U+6A14 # <cjk>
+0x9EE5 U+69EB # <cjk>
+0x9EE6 U+6A0A # <cjk>
+0x9EE7 U+6A12 # <cjk>
+0x9EE8 U+6AC1 # <cjk>
+0x9EE9 U+6A23 # <cjk>
+0x9EEA U+6A13 # <cjk>
+0x9EEB U+6A44 # <cjk>
+0x9EEC U+6A0C # <cjk>
+0x9EED U+6A72 # <cjk>
+0x9EEE U+6A36 # <cjk>
+0x9EEF U+6A78 # <cjk>
+0x9EF0 U+6A47 # <cjk>
+0x9EF1 U+6A62 # <cjk>
+0x9EF2 U+6A59 # <cjk>
+0x9EF3 U+6A66 # <cjk>
+0x9EF4 U+6A48 # <cjk>
+0x9EF5 U+6A38 # <cjk>
+0x9EF6 U+6A22 # <cjk>
+0x9EF7 U+6A90 # <cjk>
+0x9EF8 U+6A8D # <cjk>
+0x9EF9 U+6AA0 # <cjk>
+0x9EFA U+6A84 # <cjk>
+0x9EFB U+6AA2 # <cjk>
+0x9EFC U+6AA3 # <cjk>
+0x9F40 U+6A97 # <cjk>
+0x9F41 U+8617 # <cjk>
+0x9F42 U+6ABB # <cjk>
+0x9F43 U+6AC3 # <cjk>
+0x9F44 U+6AC2 # <cjk>
+0x9F45 U+6AB8 # <cjk>
+0x9F46 U+6AB3 # <cjk>
+0x9F47 U+6AAC # <cjk>
+0x9F48 U+6ADE # <cjk>
+0x9F49 U+6AD1 # <cjk>
+0x9F4A U+6ADF # <cjk>
+0x9F4B U+6AAA # <cjk>
+0x9F4C U+6ADA # <cjk>
+0x9F4D U+6AEA # <cjk>
+0x9F4E U+6AFB # <cjk>
+0x9F4F U+6B05 # <cjk>
+0x9F50 U+8616 # <cjk>
+0x9F51 U+6AFA # <cjk>
+0x9F52 U+6B12 # <cjk>
+0x9F53 U+6B16 # <cjk>
+0x9F54 U+9B31 # <cjk>
+0x9F55 U+6B1F # <cjk>
+0x9F56 U+6B38 # <cjk>
+0x9F57 U+6B37 # <cjk>
+0x9F58 U+76DC # <cjk>
+0x9F59 U+6B39 # <cjk>
+0x9F5A U+98EE # <cjk>
+0x9F5B U+6B47 # <cjk>
+0x9F5C U+6B43 # <cjk>
+0x9F5D U+6B49 # <cjk>
+0x9F5E U+6B50 # <cjk>
+0x9F5F U+6B59 # <cjk>
+0x9F60 U+6B54 # <cjk>
+0x9F61 U+6B5B # <cjk>
+0x9F62 U+6B5F # <cjk>
+0x9F63 U+6B61 # <cjk>
+0x9F64 U+6B78 # <cjk>
+0x9F65 U+6B79 # <cjk>
+0x9F66 U+6B7F # <cjk>
+0x9F67 U+6B80 # <cjk>
+0x9F68 U+6B84 # <cjk>
+0x9F69 U+6B83 # <cjk>
+0x9F6A U+6B8D # <cjk>
+0x9F6B U+6B98 # <cjk>
+0x9F6C U+6B95 # <cjk>
+0x9F6D U+6B9E # <cjk>
+0x9F6E U+6BA4 # <cjk>
+0x9F6F U+6BAA # <cjk>
+0x9F70 U+6BAB # <cjk>
+0x9F71 U+6BAF # <cjk>
+0x9F72 U+6BB2 # <cjk>
+0x9F73 U+6BB1 # <cjk>
+0x9F74 U+6BB3 # <cjk>
+0x9F75 U+6BB7 # <cjk>
+0x9F76 U+6BBC # <cjk>
+0x9F77 U+6BC6 # <cjk>
+0x9F78 U+6BCB # <cjk>
+0x9F79 U+6BD3 # <cjk>
+0x9F7A U+6BDF # <cjk>
+0x9F7B U+6BEC # <cjk>
+0x9F7C U+6BEB # <cjk>
+0x9F7D U+6BF3 # <cjk>
+0x9F7E U+6BEF # <cjk>
+0x9F80 U+9EBE # <cjk>
+0x9F81 U+6C08 # <cjk>
+0x9F82 U+6C13 # <cjk>
+0x9F83 U+6C14 # <cjk>
+0x9F84 U+6C1B # <cjk>
+0x9F85 U+6C24 # <cjk>
+0x9F86 U+6C23 # <cjk>
+0x9F87 U+6C5E # <cjk>
+0x9F88 U+6C55 # <cjk>
+0x9F89 U+6C62 # <cjk>
+0x9F8A U+6C6A # <cjk>
+0x9F8B U+6C82 # <cjk>
+0x9F8C U+6C8D # <cjk>
+0x9F8D U+6C9A # <cjk>
+0x9F8E U+6C81 # <cjk>
+0x9F8F U+6C9B # <cjk>
+0x9F90 U+6C7E # <cjk>
+0x9F91 U+6C68 # <cjk>
+0x9F92 U+6C73 # <cjk>
+0x9F93 U+6C92 # <cjk>
+0x9F94 U+6C90 # <cjk>
+0x9F95 U+6CC4 # <cjk>
+0x9F96 U+6CF1 # <cjk>
+0x9F97 U+6CD3 # <cjk>
+0x9F98 U+6CBD # <cjk>
+0x9F99 U+6CD7 # <cjk>
+0x9F9A U+6CC5 # <cjk>
+0x9F9B U+6CDD # <cjk>
+0x9F9C U+6CAE # <cjk>
+0x9F9D U+6CB1 # <cjk>
+0x9F9E U+6CBE # <cjk>
+0x9F9F U+6CBA # <cjk>
+0x9FA0 U+6CDB # <cjk>
+0x9FA1 U+6CEF # <cjk>
+0x9FA2 U+6CD9 # <cjk>
+0x9FA3 U+6CEA # <cjk>
+0x9FA4 U+6D1F # <cjk>
+0x9FA5 U+884D # <cjk>
+0x9FA6 U+6D36 # <cjk>
+0x9FA7 U+6D2B # <cjk>
+0x9FA8 U+6D3D # <cjk>
+0x9FA9 U+6D38 # <cjk>
+0x9FAA U+6D19 # <cjk>
+0x9FAB U+6D35 # <cjk>
+0x9FAC U+6D33 # <cjk>
+0x9FAD U+6D12 # <cjk>
+0x9FAE U+6D0C # <cjk>
+0x9FAF U+6D63 # <cjk>
+0x9FB0 U+6D93 # <cjk>
+0x9FB1 U+6D64 # <cjk>
+0x9FB2 U+6D5A # <cjk>
+0x9FB3 U+6D79 # <cjk>
+0x9FB4 U+6D59 # <cjk>
+0x9FB5 U+6D8E # <cjk>
+0x9FB6 U+6D95 # <cjk>
+0x9FB7 U+6FE4 # <cjk>
+0x9FB8 U+6D85 # <cjk>
+0x9FB9 U+6DF9 # <cjk>
+0x9FBA U+6E15 # <cjk>
+0x9FBB U+6E0A # <cjk>
+0x9FBC U+6DB5 # <cjk>
+0x9FBD U+6DC7 # <cjk>
+0x9FBE U+6DE6 # <cjk>
+0x9FBF U+6DB8 # <cjk>
+0x9FC0 U+6DC6 # <cjk>
+0x9FC1 U+6DEC # <cjk>
+0x9FC2 U+6DDE # <cjk>
+0x9FC3 U+6DCC # <cjk>
+0x9FC4 U+6DE8 # <cjk>
+0x9FC5 U+6DD2 # <cjk>
+0x9FC6 U+6DC5 # <cjk>
+0x9FC7 U+6DFA # <cjk>
+0x9FC8 U+6DD9 # <cjk>
+0x9FC9 U+6DE4 # <cjk>
+0x9FCA U+6DD5 # <cjk>
+0x9FCB U+6DEA # <cjk>
+0x9FCC U+6DEE # <cjk>
+0x9FCD U+6E2D # <cjk>
+0x9FCE U+6E6E # <cjk>
+0x9FCF U+6E2E # <cjk>
+0x9FD0 U+6E19 # <cjk>
+0x9FD1 U+6E72 # <cjk>
+0x9FD2 U+6E5F # <cjk>
+0x9FD3 U+6E3E # <cjk>
+0x9FD4 U+6E23 # <cjk>
+0x9FD5 U+6E6B # <cjk>
+0x9FD6 U+6E2B # <cjk>
+0x9FD7 U+6E76 # <cjk>
+0x9FD8 U+6E4D # <cjk>
+0x9FD9 U+6E1F # <cjk>
+0x9FDA U+6E43 # <cjk>
+0x9FDB U+6E3A # <cjk>
+0x9FDC U+6E4E # <cjk>
+0x9FDD U+6E24 # <cjk>
+0x9FDE U+6EFF # <cjk>
+0x9FDF U+6E1D # <cjk>
+0x9FE0 U+6E38 # <cjk>
+0x9FE1 U+6E82 # <cjk>
+0x9FE2 U+6EAA # <cjk>
+0x9FE3 U+6E98 # <cjk>
+0x9FE4 U+6EC9 # <cjk>
+0x9FE5 U+6EB7 # <cjk>
+0x9FE6 U+6ED3 # <cjk>
+0x9FE7 U+6EBD # <cjk>
+0x9FE8 U+6EAF # <cjk>
+0x9FE9 U+6EC4 # <cjk>
+0x9FEA U+6EB2 # <cjk>
+0x9FEB U+6ED4 # <cjk>
+0x9FEC U+6ED5 # <cjk>
+0x9FED U+6E8F # <cjk>
+0x9FEE U+6EA5 # <cjk>
+0x9FEF U+6EC2 # <cjk>
+0x9FF0 U+6E9F # <cjk>
+0x9FF1 U+6F41 # <cjk>
+0x9FF2 U+6F11 # <cjk>
+0x9FF3 U+704C # <cjk>
+0x9FF4 U+6EEC # <cjk>
+0x9FF5 U+6EF8 # <cjk>
+0x9FF6 U+6EFE # <cjk>
+0x9FF7 U+6F3F # <cjk>
+0x9FF8 U+6EF2 # <cjk>
+0x9FF9 U+6F31 # <cjk>
+0x9FFA U+6EEF # <cjk>
+0x9FFB U+6F32 # <cjk>
+0x9FFC U+6ECC # <cjk>
+0xE040 U+6F3E # <cjk>
+0xE041 U+6F13 # <cjk>
+0xE042 U+6EF7 # <cjk>
+0xE043 U+6F86 # <cjk>
+0xE044 U+6F7A # <cjk>
+0xE045 U+6F78 # <cjk>
+0xE046 U+6F81 # <cjk>
+0xE047 U+6F80 # <cjk>
+0xE048 U+6F6F # <cjk>
+0xE049 U+6F5B # <cjk>
+0xE04A U+6FF3 # <cjk>
+0xE04B U+6F6D # <cjk>
+0xE04C U+6F82 # <cjk>
+0xE04D U+6F7C # <cjk>
+0xE04E U+6F58 # <cjk>
+0xE04F U+6F8E # <cjk>
+0xE050 U+6F91 # <cjk>
+0xE051 U+6FC2 # <cjk>
+0xE052 U+6F66 # <cjk>
+0xE053 U+6FB3 # <cjk>
+0xE054 U+6FA3 # <cjk>
+0xE055 U+6FA1 # <cjk>
+0xE056 U+6FA4 # <cjk>
+0xE057 U+6FB9 # <cjk>
+0xE058 U+6FC6 # <cjk>
+0xE059 U+6FAA # <cjk>
+0xE05A U+6FDF # <cjk>
+0xE05B U+6FD5 # <cjk>
+0xE05C U+6FEC # <cjk>
+0xE05D U+6FD4 # <cjk>
+0xE05E U+6FD8 # <cjk>
+0xE05F U+6FF1 # <cjk>
+0xE060 U+6FEE # <cjk>
+0xE061 U+6FDB # <cjk>
+0xE062 U+7009 # <cjk>
+0xE063 U+700B # <cjk>
+0xE064 U+6FFA # <cjk>
+0xE065 U+7011 # <cjk>
+0xE066 U+7001 # <cjk>
+0xE067 U+700F # <cjk>
+0xE068 U+6FFE # <cjk>
+0xE069 U+701B # <cjk>
+0xE06A U+701A # <cjk>
+0xE06B U+6F74 # <cjk>
+0xE06C U+701D # <cjk>
+0xE06D U+7018 # <cjk>
+0xE06E U+701F # <cjk>
+0xE06F U+7030 # <cjk>
+0xE070 U+703E # <cjk>
+0xE071 U+7032 # <cjk>
+0xE072 U+7051 # <cjk>
+0xE073 U+7063 # <cjk>
+0xE074 U+7099 # <cjk>
+0xE075 U+7092 # <cjk>
+0xE076 U+70AF # <cjk>
+0xE077 U+70F1 # <cjk>
+0xE078 U+70AC # <cjk>
+0xE079 U+70B8 # <cjk>
+0xE07A U+70B3 # <cjk>
+0xE07B U+70AE # <cjk>
+0xE07C U+70DF # <cjk>
+0xE07D U+70CB # <cjk>
+0xE07E U+70DD # <cjk>
+0xE080 U+70D9 # <cjk>
+0xE081 U+7109 # <cjk>
+0xE082 U+70FD # <cjk>
+0xE083 U+711C # <cjk>
+0xE084 U+7119 # <cjk>
+0xE085 U+7165 # <cjk>
+0xE086 U+7155 # <cjk>
+0xE087 U+7188 # <cjk>
+0xE088 U+7166 # <cjk>
+0xE089 U+7162 # <cjk>
+0xE08A U+714C # <cjk>
+0xE08B U+7156 # <cjk>
+0xE08C U+716C # <cjk>
+0xE08D U+718F # <cjk>
+0xE08E U+71FB # <cjk>
+0xE08F U+7184 # <cjk>
+0xE090 U+7195 # <cjk>
+0xE091 U+71A8 # <cjk>
+0xE092 U+71AC # <cjk>
+0xE093 U+71D7 # <cjk>
+0xE094 U+71B9 # <cjk>
+0xE095 U+71BE # <cjk>
+0xE096 U+71D2 # <cjk>
+0xE097 U+71C9 # <cjk>
+0xE098 U+71D4 # <cjk>
+0xE099 U+71CE # <cjk>
+0xE09A U+71E0 # <cjk>
+0xE09B U+71EC # <cjk>
+0xE09C U+71E7 # <cjk>
+0xE09D U+71F5 # <cjk>
+0xE09E U+71FC # <cjk>
+0xE09F U+71F9 # <cjk>
+0xE0A0 U+71FF # <cjk>
+0xE0A1 U+720D # <cjk>
+0xE0A2 U+7210 # <cjk>
+0xE0A3 U+721B # <cjk>
+0xE0A4 U+7228 # <cjk>
+0xE0A5 U+722D # <cjk>
+0xE0A6 U+722C # <cjk>
+0xE0A7 U+7230 # <cjk>
+0xE0A8 U+7232 # <cjk>
+0xE0A9 U+723B # <cjk>
+0xE0AA U+723C # <cjk>
+0xE0AB U+723F # <cjk>
+0xE0AC U+7240 # <cjk>
+0xE0AD U+7246 # <cjk>
+0xE0AE U+724B # <cjk>
+0xE0AF U+7258 # <cjk>
+0xE0B0 U+7274 # <cjk>
+0xE0B1 U+727E # <cjk>
+0xE0B2 U+7282 # <cjk>
+0xE0B3 U+7281 # <cjk>
+0xE0B4 U+7287 # <cjk>
+0xE0B5 U+7292 # <cjk>
+0xE0B6 U+7296 # <cjk>
+0xE0B7 U+72A2 # <cjk>
+0xE0B8 U+72A7 # <cjk>
+0xE0B9 U+72B9 # <cjk>
+0xE0BA U+72B2 # <cjk>
+0xE0BB U+72C3 # <cjk>
+0xE0BC U+72C6 # <cjk>
+0xE0BD U+72C4 # <cjk>
+0xE0BE U+72CE # <cjk>
+0xE0BF U+72D2 # <cjk>
+0xE0C0 U+72E2 # <cjk>
+0xE0C1 U+72E0 # <cjk>
+0xE0C2 U+72E1 # <cjk>
+0xE0C3 U+72F9 # <cjk>
+0xE0C4 U+72F7 # <cjk>
+0xE0C5 U+500F # <cjk>
+0xE0C6 U+7317 # <cjk>
+0xE0C7 U+730A # <cjk>
+0xE0C8 U+731C # <cjk>
+0xE0C9 U+7316 # <cjk>
+0xE0CA U+731D # <cjk>
+0xE0CB U+7334 # <cjk>
+0xE0CC U+732F # <cjk>
+0xE0CD U+7329 # <cjk>
+0xE0CE U+7325 # <cjk>
+0xE0CF U+733E # <cjk>
+0xE0D0 U+734E # <cjk>
+0xE0D1 U+734F # <cjk>
+0xE0D2 U+9ED8 # <cjk>
+0xE0D3 U+7357 # <cjk>
+0xE0D4 U+736A # <cjk>
+0xE0D5 U+7368 # <cjk>
+0xE0D6 U+7370 # <cjk>
+0xE0D7 U+7378 # <cjk>
+0xE0D8 U+7375 # <cjk>
+0xE0D9 U+737B # <cjk>
+0xE0DA U+737A # <cjk>
+0xE0DB U+73C8 # <cjk>
+0xE0DC U+73B3 # <cjk>
+0xE0DD U+73CE # <cjk>
+0xE0DE U+73BB # <cjk>
+0xE0DF U+73C0 # <cjk>
+0xE0E0 U+73E5 # <cjk>
+0xE0E1 U+73EE # <cjk>
+0xE0E2 U+73DE # <cjk>
+0xE0E3 U+74A2 # <cjk>
+0xE0E4 U+7405 # <cjk>
+0xE0E5 U+746F # <cjk>
+0xE0E6 U+7425 # <cjk>
+0xE0E7 U+73F8 # <cjk>
+0xE0E8 U+7432 # <cjk>
+0xE0E9 U+743A # <cjk>
+0xE0EA U+7455 # <cjk>
+0xE0EB U+743F # <cjk>
+0xE0EC U+745F # <cjk>
+0xE0ED U+7459 # <cjk>
+0xE0EE U+7441 # <cjk>
+0xE0EF U+745C # <cjk>
+0xE0F0 U+7469 # <cjk>
+0xE0F1 U+7470 # <cjk>
+0xE0F2 U+7463 # <cjk>
+0xE0F3 U+746A # <cjk>
+0xE0F4 U+7476 # <cjk>
+0xE0F5 U+747E # <cjk>
+0xE0F6 U+748B # <cjk>
+0xE0F7 U+749E # <cjk>
+0xE0F8 U+74A7 # <cjk>
+0xE0F9 U+74CA # <cjk>
+0xE0FA U+74CF # <cjk>
+0xE0FB U+74D4 # <cjk>
+0xE0FC U+73F1 # <cjk>
+0xE140 U+74E0 # <cjk>
+0xE141 U+74E3 # <cjk>
+0xE142 U+74E7 # <cjk>
+0xE143 U+74E9 # <cjk>
+0xE144 U+74EE # <cjk>
+0xE145 U+74F2 # <cjk>
+0xE146 U+74F0 # <cjk>
+0xE147 U+74F1 # <cjk>
+0xE148 U+74F8 # <cjk>
+0xE149 U+74F7 # <cjk>
+0xE14A U+7504 # <cjk>
+0xE14B U+7503 # <cjk>
+0xE14C U+7505 # <cjk>
+0xE14D U+750C # <cjk>
+0xE14E U+750E # <cjk>
+0xE14F U+750D # <cjk>
+0xE150 U+7515 # <cjk>
+0xE151 U+7513 # <cjk>
+0xE152 U+751E # <cjk>
+0xE153 U+7526 # <cjk>
+0xE154 U+752C # <cjk>
+0xE155 U+753C # <cjk>
+0xE156 U+7544 # <cjk>
+0xE157 U+754D # <cjk>
+0xE158 U+754A # <cjk>
+0xE159 U+7549 # <cjk>
+0xE15A U+755B # <cjk>
+0xE15B U+7546 # <cjk>
+0xE15C U+755A # <cjk>
+0xE15D U+7569 # <cjk>
+0xE15E U+7564 # <cjk>
+0xE15F U+7567 # <cjk>
+0xE160 U+756B # <cjk>
+0xE161 U+756D # <cjk>
+0xE162 U+7578 # <cjk>
+0xE163 U+7576 # <cjk>
+0xE164 U+7586 # <cjk>
+0xE165 U+7587 # <cjk>
+0xE166 U+7574 # <cjk>
+0xE167 U+758A # <cjk>
+0xE168 U+7589 # <cjk>
+0xE169 U+7582 # <cjk>
+0xE16A U+7594 # <cjk>
+0xE16B U+759A # <cjk>
+0xE16C U+759D # <cjk>
+0xE16D U+75A5 # <cjk>
+0xE16E U+75A3 # <cjk>
+0xE16F U+75C2 # <cjk>
+0xE170 U+75B3 # <cjk>
+0xE171 U+75C3 # <cjk>
+0xE172 U+75B5 # <cjk>
+0xE173 U+75BD # <cjk>
+0xE174 U+75B8 # <cjk>
+0xE175 U+75BC # <cjk>
+0xE176 U+75B1 # <cjk>
+0xE177 U+75CD # <cjk>
+0xE178 U+75CA # <cjk>
+0xE179 U+75D2 # <cjk>
+0xE17A U+75D9 # <cjk>
+0xE17B U+75E3 # <cjk>
+0xE17C U+75DE # <cjk>
+0xE17D U+75FE # <cjk>
+0xE17E U+75FF # <cjk>
+0xE180 U+75FC # <cjk>
+0xE181 U+7601 # <cjk>
+0xE182 U+75F0 # <cjk>
+0xE183 U+75FA # <cjk>
+0xE184 U+75F2 # <cjk>
+0xE185 U+75F3 # <cjk>
+0xE186 U+760B # <cjk>
+0xE187 U+760D # <cjk>
+0xE188 U+7609 # <cjk>
+0xE189 U+761F # <cjk>
+0xE18A U+7627 # <cjk>
+0xE18B U+7620 # <cjk>
+0xE18C U+7621 # <cjk>
+0xE18D U+7622 # <cjk>
+0xE18E U+7624 # <cjk>
+0xE18F U+7634 # <cjk>
+0xE190 U+7630 # <cjk>
+0xE191 U+763B # <cjk>
+0xE192 U+7647 # <cjk>
+0xE193 U+7648 # <cjk>
+0xE194 U+7646 # <cjk>
+0xE195 U+765C # <cjk>
+0xE196 U+7658 # <cjk>
+0xE197 U+7661 # <cjk>
+0xE198 U+7662 # <cjk>
+0xE199 U+7668 # <cjk>
+0xE19A U+7669 # <cjk>
+0xE19B U+766A # <cjk>
+0xE19C U+7667 # <cjk>
+0xE19D U+766C # <cjk>
+0xE19E U+7670 # <cjk>
+0xE19F U+7672 # <cjk>
+0xE1A0 U+7676 # <cjk>
+0xE1A1 U+7678 # <cjk>
+0xE1A2 U+767C # <cjk>
+0xE1A3 U+7680 # <cjk>
+0xE1A4 U+7683 # <cjk>
+0xE1A5 U+7688 # <cjk>
+0xE1A6 U+768B # <cjk>
+0xE1A7 U+768E # <cjk>
+0xE1A8 U+7696 # <cjk>
+0xE1A9 U+7693 # <cjk>
+0xE1AA U+7699 # <cjk>
+0xE1AB U+769A # <cjk>
+0xE1AC U+76B0 # <cjk>
+0xE1AD U+76B4 # <cjk>
+0xE1AE U+76B8 # <cjk>
+0xE1AF U+76B9 # <cjk>
+0xE1B0 U+76BA # <cjk>
+0xE1B1 U+76C2 # <cjk>
+0xE1B2 U+76CD # <cjk>
+0xE1B3 U+76D6 # <cjk>
+0xE1B4 U+76D2 # <cjk>
+0xE1B5 U+76DE # <cjk>
+0xE1B6 U+76E1 # <cjk>
+0xE1B7 U+76E5 # <cjk>
+0xE1B8 U+76E7 # <cjk>
+0xE1B9 U+76EA # <cjk>
+0xE1BA U+862F # <cjk>
+0xE1BB U+76FB # <cjk>
+0xE1BC U+7708 # <cjk>
+0xE1BD U+7707 # <cjk>
+0xE1BE U+7704 # <cjk>
+0xE1BF U+7729 # <cjk>
+0xE1C0 U+7724 # <cjk>
+0xE1C1 U+771E # <cjk>
+0xE1C2 U+7725 # <cjk>
+0xE1C3 U+7726 # <cjk>
+0xE1C4 U+771B # <cjk>
+0xE1C5 U+7737 # <cjk>
+0xE1C6 U+7738 # <cjk>
+0xE1C7 U+7747 # <cjk>
+0xE1C8 U+775A # <cjk>
+0xE1C9 U+7768 # <cjk>
+0xE1CA U+776B # <cjk>
+0xE1CB U+775B # <cjk>
+0xE1CC U+7765 # <cjk>
+0xE1CD U+777F # <cjk>
+0xE1CE U+777E # <cjk>
+0xE1CF U+7779 # <cjk>
+0xE1D0 U+778E # <cjk>
+0xE1D1 U+778B # <cjk>
+0xE1D2 U+7791 # <cjk>
+0xE1D3 U+77A0 # <cjk>
+0xE1D4 U+779E # <cjk>
+0xE1D5 U+77B0 # <cjk>
+0xE1D6 U+77B6 # <cjk>
+0xE1D7 U+77B9 # <cjk>
+0xE1D8 U+77BF # <cjk>
+0xE1D9 U+77BC # <cjk>
+0xE1DA U+77BD # <cjk>
+0xE1DB U+77BB # <cjk>
+0xE1DC U+77C7 # <cjk>
+0xE1DD U+77CD # <cjk>
+0xE1DE U+77D7 # <cjk>
+0xE1DF U+77DA # <cjk>
+0xE1E0 U+77DC # <cjk>
+0xE1E1 U+77E3 # <cjk>
+0xE1E2 U+77EE # <cjk>
+0xE1E3 U+77FC # <cjk>
+0xE1E4 U+780C # <cjk>
+0xE1E5 U+7812 # <cjk>
+0xE1E6 U+7926 # <cjk>
+0xE1E7 U+7820 # <cjk>
+0xE1E8 U+792A # <cjk>
+0xE1E9 U+7845 # <cjk>
+0xE1EA U+788E # <cjk>
+0xE1EB U+7874 # <cjk>
+0xE1EC U+7886 # <cjk>
+0xE1ED U+787C # <cjk>
+0xE1EE U+789A # <cjk>
+0xE1EF U+788C # <cjk>
+0xE1F0 U+78A3 # <cjk>
+0xE1F1 U+78B5 # <cjk>
+0xE1F2 U+78AA # <cjk>
+0xE1F3 U+78AF # <cjk>
+0xE1F4 U+78D1 # <cjk>
+0xE1F5 U+78C6 # <cjk>
+0xE1F6 U+78CB # <cjk>
+0xE1F7 U+78D4 # <cjk>
+0xE1F8 U+78BE # <cjk>
+0xE1F9 U+78BC # <cjk>
+0xE1FA U+78C5 # <cjk>
+0xE1FB U+78CA # <cjk>
+0xE1FC U+78EC # <cjk>
+0xE240 U+78E7 # <cjk>
+0xE241 U+78DA # <cjk>
+0xE242 U+78FD # <cjk>
+0xE243 U+78F4 # <cjk>
+0xE244 U+7907 # <cjk>
+0xE245 U+7912 # <cjk>
+0xE246 U+7911 # <cjk>
+0xE247 U+7919 # <cjk>
+0xE248 U+792C # <cjk>
+0xE249 U+792B # <cjk>
+0xE24A U+7940 # <cjk>
+0xE24B U+7960 # <cjk>
+0xE24C U+7957 # <cjk>
+0xE24D U+795F # <cjk>
+0xE24E U+795A # <cjk>
+0xE24F U+7955 # <cjk>
+0xE250 U+7953 # <cjk>
+0xE251 U+797A # <cjk>
+0xE252 U+797F # <cjk>
+0xE253 U+798A # <cjk>
+0xE254 U+799D # <cjk>
+0xE255 U+79A7 # <cjk>
+0xE256 U+9F4B # <cjk>
+0xE257 U+79AA # <cjk>
+0xE258 U+79AE # <cjk>
+0xE259 U+79B3 # <cjk>
+0xE25A U+79B9 # <cjk>
+0xE25B U+79BA # <cjk>
+0xE25C U+79C9 # <cjk>
+0xE25D U+79D5 # <cjk>
+0xE25E U+79E7 # <cjk>
+0xE25F U+79EC # <cjk>
+0xE260 U+79E1 # <cjk>
+0xE261 U+79E3 # <cjk>
+0xE262 U+7A08 # <cjk>
+0xE263 U+7A0D # <cjk>
+0xE264 U+7A18 # <cjk>
+0xE265 U+7A19 # <cjk>
+0xE266 U+7A20 # <cjk>
+0xE267 U+7A1F # <cjk>
+0xE268 U+7980 # <cjk>
+0xE269 U+7A31 # <cjk>
+0xE26A U+7A3B # <cjk>
+0xE26B U+7A3E # <cjk>
+0xE26C U+7A37 # <cjk>
+0xE26D U+7A43 # <cjk>
+0xE26E U+7A57 # <cjk>
+0xE26F U+7A49 # <cjk>
+0xE270 U+7A61 # <cjk>
+0xE271 U+7A62 # <cjk>
+0xE272 U+7A69 # <cjk>
+0xE273 U+9F9D # <cjk>
+0xE274 U+7A70 # <cjk>
+0xE275 U+7A79 # <cjk>
+0xE276 U+7A7D # <cjk>
+0xE277 U+7A88 # <cjk>
+0xE278 U+7A97 # <cjk>
+0xE279 U+7A95 # <cjk>
+0xE27A U+7A98 # <cjk>
+0xE27B U+7A96 # <cjk>
+0xE27C U+7AA9 # <cjk>
+0xE27D U+7AC8 # <cjk>
+0xE27E U+7AB0 # <cjk>
+0xE280 U+7AB6 # <cjk>
+0xE281 U+7AC5 # <cjk>
+0xE282 U+7AC4 # <cjk>
+0xE283 U+7ABF # <cjk>
+0xE284 U+9083 # <cjk>
+0xE285 U+7AC7 # <cjk>
+0xE286 U+7ACA # <cjk>
+0xE287 U+7ACD # <cjk>
+0xE288 U+7ACF # <cjk>
+0xE289 U+7AD5 # <cjk>
+0xE28A U+7AD3 # <cjk>
+0xE28B U+7AD9 # <cjk>
+0xE28C U+7ADA # <cjk>
+0xE28D U+7ADD # <cjk>
+0xE28E U+7AE1 # <cjk>
+0xE28F U+7AE2 # <cjk>
+0xE290 U+7AE6 # <cjk>
+0xE291 U+7AED # <cjk>
+0xE292 U+7AF0 # <cjk>
+0xE293 U+7B02 # <cjk>
+0xE294 U+7B0F # <cjk>
+0xE295 U+7B0A # <cjk>
+0xE296 U+7B06 # <cjk>
+0xE297 U+7B33 # <cjk>
+0xE298 U+7B18 # <cjk>
+0xE299 U+7B19 # <cjk>
+0xE29A U+7B1E # <cjk>
+0xE29B U+7B35 # <cjk>
+0xE29C U+7B28 # <cjk>
+0xE29D U+7B36 # <cjk>
+0xE29E U+7B50 # <cjk>
+0xE29F U+7B7A # <cjk>
+0xE2A0 U+7B04 # <cjk>
+0xE2A1 U+7B4D # <cjk>
+0xE2A2 U+7B0B # <cjk>
+0xE2A3 U+7B4C # <cjk>
+0xE2A4 U+7B45 # <cjk>
+0xE2A5 U+7B75 # <cjk>
+0xE2A6 U+7B65 # <cjk>
+0xE2A7 U+7B74 # <cjk>
+0xE2A8 U+7B67 # <cjk>
+0xE2A9 U+7B70 # <cjk>
+0xE2AA U+7B71 # <cjk>
+0xE2AB U+7B6C # <cjk>
+0xE2AC U+7B6E # <cjk>
+0xE2AD U+7B9D # <cjk>
+0xE2AE U+7B98 # <cjk>
+0xE2AF U+7B9F # <cjk>
+0xE2B0 U+7B8D # <cjk>
+0xE2B1 U+7B9C # <cjk>
+0xE2B2 U+7B9A # <cjk>
+0xE2B3 U+7B8B # <cjk>
+0xE2B4 U+7B92 # <cjk>
+0xE2B5 U+7B8F # <cjk>
+0xE2B6 U+7B5D # <cjk>
+0xE2B7 U+7B99 # <cjk>
+0xE2B8 U+7BCB # <cjk>
+0xE2B9 U+7BC1 # <cjk>
+0xE2BA U+7BCC # <cjk>
+0xE2BB U+7BCF # <cjk>
+0xE2BC U+7BB4 # <cjk>
+0xE2BD U+7BC6 # <cjk>
+0xE2BE U+7BDD # <cjk>
+0xE2BF U+7BE9 # <cjk>
+0xE2C0 U+7C11 # <cjk>
+0xE2C1 U+7C14 # <cjk>
+0xE2C2 U+7BE6 # <cjk>
+0xE2C3 U+7BE5 # <cjk>
+0xE2C4 U+7C60 # <cjk>
+0xE2C5 U+7C00 # <cjk>
+0xE2C6 U+7C07 # <cjk>
+0xE2C7 U+7C13 # <cjk>
+0xE2C8 U+7BF3 # <cjk>
+0xE2C9 U+7BF7 # <cjk>
+0xE2CA U+7C17 # <cjk>
+0xE2CB U+7C0D # <cjk>
+0xE2CC U+7BF6 # <cjk>
+0xE2CD U+7C23 # <cjk>
+0xE2CE U+7C27 # <cjk>
+0xE2CF U+7C2A # <cjk>
+0xE2D0 U+7C1F # <cjk>
+0xE2D1 U+7C37 # <cjk>
+0xE2D2 U+7C2B # <cjk>
+0xE2D3 U+7C3D # <cjk>
+0xE2D4 U+7C4C # <cjk>
+0xE2D5 U+7C43 # <cjk>
+0xE2D6 U+7C54 # <cjk>
+0xE2D7 U+7C4F # <cjk>
+0xE2D8 U+7C40 # <cjk>
+0xE2D9 U+7C50 # <cjk>
+0xE2DA U+7C58 # <cjk>
+0xE2DB U+7C5F # <cjk>
+0xE2DC U+7C64 # <cjk>
+0xE2DD U+7C56 # <cjk>
+0xE2DE U+7C65 # <cjk>
+0xE2DF U+7C6C # <cjk>
+0xE2E0 U+7C75 # <cjk>
+0xE2E1 U+7C83 # <cjk>
+0xE2E2 U+7C90 # <cjk>
+0xE2E3 U+7CA4 # <cjk>
+0xE2E4 U+7CAD # <cjk>
+0xE2E5 U+7CA2 # <cjk>
+0xE2E6 U+7CAB # <cjk>
+0xE2E7 U+7CA1 # <cjk>
+0xE2E8 U+7CA8 # <cjk>
+0xE2E9 U+7CB3 # <cjk>
+0xE2EA U+7CB2 # <cjk>
+0xE2EB U+7CB1 # <cjk>
+0xE2EC U+7CAE # <cjk>
+0xE2ED U+7CB9 # <cjk>
+0xE2EE U+7CBD # <cjk>
+0xE2EF U+7CC0 # <cjk>
+0xE2F0 U+7CC5 # <cjk>
+0xE2F1 U+7CC2 # <cjk>
+0xE2F2 U+7CD8 # <cjk>
+0xE2F3 U+7CD2 # <cjk>
+0xE2F4 U+7CDC # <cjk>
+0xE2F5 U+7CE2 # <cjk>
+0xE2F6 U+9B3B # <cjk>
+0xE2F7 U+7CEF # <cjk>
+0xE2F8 U+7CF2 # <cjk>
+0xE2F9 U+7CF4 # <cjk>
+0xE2FA U+7CF6 # <cjk>
+0xE2FB U+7CFA # <cjk>
+0xE2FC U+7D06 # <cjk>
+0xE340 U+7D02 # <cjk>
+0xE341 U+7D1C # <cjk>
+0xE342 U+7D15 # <cjk>
+0xE343 U+7D0A # <cjk>
+0xE344 U+7D45 # <cjk>
+0xE345 U+7D4B # <cjk>
+0xE346 U+7D2E # <cjk>
+0xE347 U+7D32 # <cjk>
+0xE348 U+7D3F # <cjk>
+0xE349 U+7D35 # <cjk>
+0xE34A U+7D46 # <cjk>
+0xE34B U+7D73 # <cjk>
+0xE34C U+7D56 # <cjk>
+0xE34D U+7D4E # <cjk>
+0xE34E U+7D72 # <cjk>
+0xE34F U+7D68 # <cjk>
+0xE350 U+7D6E # <cjk>
+0xE351 U+7D4F # <cjk>
+0xE352 U+7D63 # <cjk>
+0xE353 U+7D93 # <cjk>
+0xE354 U+7D89 # <cjk>
+0xE355 U+7D5B # <cjk>
+0xE356 U+7D8F # <cjk>
+0xE357 U+7D7D # <cjk>
+0xE358 U+7D9B # <cjk>
+0xE359 U+7DBA # <cjk>
+0xE35A U+7DAE # <cjk>
+0xE35B U+7DA3 # <cjk>
+0xE35C U+7DB5 # <cjk>
+0xE35D U+7DC7 # <cjk>
+0xE35E U+7DBD # <cjk>
+0xE35F U+7DAB # <cjk>
+0xE360 U+7E3D # <cjk>
+0xE361 U+7DA2 # <cjk>
+0xE362 U+7DAF # <cjk>
+0xE363 U+7DDC # <cjk>
+0xE364 U+7DB8 # <cjk>
+0xE365 U+7D9F # <cjk>
+0xE366 U+7DB0 # <cjk>
+0xE367 U+7DD8 # <cjk>
+0xE368 U+7DDD # <cjk>
+0xE369 U+7DE4 # <cjk>
+0xE36A U+7DDE # <cjk>
+0xE36B U+7DFB # <cjk>
+0xE36C U+7DF2 # <cjk>
+0xE36D U+7DE1 # <cjk>
+0xE36E U+7E05 # <cjk>
+0xE36F U+7E0A # <cjk>
+0xE370 U+7E23 # <cjk>
+0xE371 U+7E21 # <cjk>
+0xE372 U+7E12 # <cjk>
+0xE373 U+7E31 # <cjk>
+0xE374 U+7E1F # <cjk>
+0xE375 U+7E09 # <cjk>
+0xE376 U+7E0B # <cjk>
+0xE377 U+7E22 # <cjk>
+0xE378 U+7E46 # <cjk>
+0xE379 U+7E66 # <cjk>
+0xE37A U+7E3B # <cjk>
+0xE37B U+7E35 # <cjk>
+0xE37C U+7E39 # <cjk>
+0xE37D U+7E43 # <cjk>
+0xE37E U+7E37 # <cjk>
+0xE380 U+7E32 # <cjk>
+0xE381 U+7E3A # <cjk>
+0xE382 U+7E67 # <cjk>
+0xE383 U+7E5D # <cjk>
+0xE384 U+7E56 # <cjk>
+0xE385 U+7E5E # <cjk>
+0xE386 U+7E59 # <cjk>
+0xE387 U+7E5A # <cjk>
+0xE388 U+7E79 # <cjk>
+0xE389 U+7E6A # <cjk>
+0xE38A U+7E69 # <cjk>
+0xE38B U+7E7C # <cjk>
+0xE38C U+7E7B # <cjk>
+0xE38D U+7E83 # <cjk>
+0xE38E U+7DD5 # <cjk>
+0xE38F U+7E7D # <cjk>
+0xE390 U+8FAE # <cjk>
+0xE391 U+7E7F # <cjk>
+0xE392 U+7E88 # <cjk>
+0xE393 U+7E89 # <cjk>
+0xE394 U+7E8C # <cjk>
+0xE395 U+7E92 # <cjk>
+0xE396 U+7E90 # <cjk>
+0xE397 U+7E93 # <cjk>
+0xE398 U+7E94 # <cjk>
+0xE399 U+7E96 # <cjk>
+0xE39A U+7E8E # <cjk>
+0xE39B U+7E9B # <cjk>
+0xE39C U+7E9C # <cjk>
+0xE39D U+7F38 # <cjk>
+0xE39E U+7F3A # <cjk>
+0xE39F U+7F45 # <cjk>
+0xE3A0 U+7F4C # <cjk>
+0xE3A1 U+7F4D # <cjk>
+0xE3A2 U+7F4E # <cjk>
+0xE3A3 U+7F50 # <cjk>
+0xE3A4 U+7F51 # <cjk>
+0xE3A5 U+7F55 # <cjk>
+0xE3A6 U+7F54 # <cjk>
+0xE3A7 U+7F58 # <cjk>
+0xE3A8 U+7F5F # <cjk>
+0xE3A9 U+7F60 # <cjk>
+0xE3AA U+7F68 # <cjk>
+0xE3AB U+7F69 # <cjk>
+0xE3AC U+7F67 # <cjk>
+0xE3AD U+7F78 # <cjk>
+0xE3AE U+7F82 # <cjk>
+0xE3AF U+7F86 # <cjk>
+0xE3B0 U+7F83 # <cjk>
+0xE3B1 U+7F88 # <cjk>
+0xE3B2 U+7F87 # <cjk>
+0xE3B3 U+7F8C # <cjk>
+0xE3B4 U+7F94 # <cjk>
+0xE3B5 U+7F9E # <cjk>
+0xE3B6 U+7F9D # <cjk>
+0xE3B7 U+7F9A # <cjk>
+0xE3B8 U+7FA3 # <cjk>
+0xE3B9 U+7FAF # <cjk>
+0xE3BA U+7FB2 # <cjk>
+0xE3BB U+7FB9 # <cjk>
+0xE3BC U+7FAE # <cjk>
+0xE3BD U+7FB6 # <cjk>
+0xE3BE U+7FB8 # <cjk>
+0xE3BF U+8B71 # <cjk>
+0xE3C0 U+7FC5 # <cjk>
+0xE3C1 U+7FC6 # <cjk>
+0xE3C2 U+7FCA # <cjk>
+0xE3C3 U+7FD5 # <cjk>
+0xE3C4 U+7FD4 # <cjk>
+0xE3C5 U+7FE1 # <cjk>
+0xE3C6 U+7FE6 # <cjk>
+0xE3C7 U+7FE9 # <cjk>
+0xE3C8 U+7FF3 # <cjk>
+0xE3C9 U+7FF9 # <cjk>
+0xE3CA U+98DC # <cjk>
+0xE3CB U+8006 # <cjk>
+0xE3CC U+8004 # <cjk>
+0xE3CD U+800B # <cjk>
+0xE3CE U+8012 # <cjk>
+0xE3CF U+8018 # <cjk>
+0xE3D0 U+8019 # <cjk>
+0xE3D1 U+801C # <cjk>
+0xE3D2 U+8021 # <cjk>
+0xE3D3 U+8028 # <cjk>
+0xE3D4 U+803F # <cjk>
+0xE3D5 U+803B # <cjk>
+0xE3D6 U+804A # <cjk>
+0xE3D7 U+8046 # <cjk>
+0xE3D8 U+8052 # <cjk>
+0xE3D9 U+8058 # <cjk>
+0xE3DA U+805A # <cjk>
+0xE3DB U+805F # <cjk>
+0xE3DC U+8062 # <cjk>
+0xE3DD U+8068 # <cjk>
+0xE3DE U+8073 # <cjk>
+0xE3DF U+8072 # <cjk>
+0xE3E0 U+8070 # <cjk>
+0xE3E1 U+8076 # <cjk>
+0xE3E2 U+8079 # <cjk>
+0xE3E3 U+807D # <cjk>
+0xE3E4 U+807F # <cjk>
+0xE3E5 U+8084 # <cjk>
+0xE3E6 U+8086 # <cjk>
+0xE3E7 U+8085 # <cjk>
+0xE3E8 U+809B # <cjk>
+0xE3E9 U+8093 # <cjk>
+0xE3EA U+809A # <cjk>
+0xE3EB U+80AD # <cjk>
+0xE3EC U+5190 # <cjk>
+0xE3ED U+80AC # <cjk>
+0xE3EE U+80DB # <cjk>
+0xE3EF U+80E5 # <cjk>
+0xE3F0 U+80D9 # <cjk>
+0xE3F1 U+80DD # <cjk>
+0xE3F2 U+80C4 # <cjk>
+0xE3F3 U+80DA # <cjk>
+0xE3F4 U+80D6 # <cjk>
+0xE3F5 U+8109 # <cjk>
+0xE3F6 U+80EF # <cjk>
+0xE3F7 U+80F1 # <cjk>
+0xE3F8 U+811B # <cjk>
+0xE3F9 U+8129 # <cjk>
+0xE3FA U+8123 # <cjk>
+0xE3FB U+812F # <cjk>
+0xE3FC U+814B # <cjk>
+0xE440 U+968B # <cjk>
+0xE441 U+8146 # <cjk>
+0xE442 U+813E # <cjk>
+0xE443 U+8153 # <cjk>
+0xE444 U+8151 # <cjk>
+0xE445 U+80FC # <cjk>
+0xE446 U+8171 # <cjk>
+0xE447 U+816E # <cjk>
+0xE448 U+8165 # <cjk>
+0xE449 U+8166 # <cjk>
+0xE44A U+8174 # <cjk>
+0xE44B U+8183 # <cjk>
+0xE44C U+8188 # <cjk>
+0xE44D U+818A # <cjk>
+0xE44E U+8180 # <cjk>
+0xE44F U+8182 # <cjk>
+0xE450 U+81A0 # <cjk>
+0xE451 U+8195 # <cjk>
+0xE452 U+81A4 # <cjk>
+0xE453 U+81A3 # <cjk>
+0xE454 U+815F # <cjk>
+0xE455 U+8193 # <cjk>
+0xE456 U+81A9 # <cjk>
+0xE457 U+81B0 # <cjk>
+0xE458 U+81B5 # <cjk>
+0xE459 U+81BE # <cjk>
+0xE45A U+81B8 # <cjk>
+0xE45B U+81BD # <cjk>
+0xE45C U+81C0 # <cjk>
+0xE45D U+81C2 # <cjk>
+0xE45E U+81BA # <cjk>
+0xE45F U+81C9 # <cjk>
+0xE460 U+81CD # <cjk>
+0xE461 U+81D1 # <cjk>
+0xE462 U+81D9 # <cjk>
+0xE463 U+81D8 # <cjk>
+0xE464 U+81C8 # <cjk>
+0xE465 U+81DA # <cjk>
+0xE466 U+81DF # <cjk>
+0xE467 U+81E0 # <cjk>
+0xE468 U+81E7 # <cjk>
+0xE469 U+81FA # <cjk>
+0xE46A U+81FB # <cjk>
+0xE46B U+81FE # <cjk>
+0xE46C U+8201 # <cjk>
+0xE46D U+8202 # <cjk>
+0xE46E U+8205 # <cjk>
+0xE46F U+8207 # <cjk>
+0xE470 U+820A # <cjk>
+0xE471 U+820D # <cjk>
+0xE472 U+8210 # <cjk>
+0xE473 U+8216 # <cjk>
+0xE474 U+8229 # <cjk>
+0xE475 U+822B # <cjk>
+0xE476 U+8238 # <cjk>
+0xE477 U+8233 # <cjk>
+0xE478 U+8240 # <cjk>
+0xE479 U+8259 # <cjk>
+0xE47A U+8258 # <cjk>
+0xE47B U+825D # <cjk>
+0xE47C U+825A # <cjk>
+0xE47D U+825F # <cjk>
+0xE47E U+8264 # <cjk>
+0xE480 U+8262 # <cjk>
+0xE481 U+8268 # <cjk>
+0xE482 U+826A # <cjk>
+0xE483 U+826B # <cjk>
+0xE484 U+822E # <cjk>
+0xE485 U+8271 # <cjk>
+0xE486 U+8277 # <cjk>
+0xE487 U+8278 # <cjk>
+0xE488 U+827E # <cjk>
+0xE489 U+828D # <cjk>
+0xE48A U+8292 # <cjk>
+0xE48B U+82AB # <cjk>
+0xE48C U+829F # <cjk>
+0xE48D U+82BB # <cjk>
+0xE48E U+82AC # <cjk>
+0xE48F U+82E1 # <cjk>
+0xE490 U+82E3 # <cjk>
+0xE491 U+82DF # <cjk>
+0xE492 U+82D2 # <cjk>
+0xE493 U+82F4 # <cjk>
+0xE494 U+82F3 # <cjk>
+0xE495 U+82FA # <cjk>
+0xE496 U+8393 # <cjk>
+0xE497 U+8303 # <cjk>
+0xE498 U+82FB # <cjk>
+0xE499 U+82F9 # <cjk>
+0xE49A U+82DE # <cjk>
+0xE49B U+8306 # <cjk>
+0xE49C U+82DC # <cjk>
+0xE49D U+8309 # <cjk>
+0xE49E U+82D9 # <cjk>
+0xE49F U+8335 # <cjk>
+0xE4A0 U+8334 # <cjk>
+0xE4A1 U+8316 # <cjk>
+0xE4A2 U+8332 # <cjk>
+0xE4A3 U+8331 # <cjk>
+0xE4A4 U+8340 # <cjk>
+0xE4A5 U+8339 # <cjk>
+0xE4A6 U+8350 # <cjk>
+0xE4A7 U+8345 # <cjk>
+0xE4A8 U+832F # <cjk>
+0xE4A9 U+832B # <cjk>
+0xE4AA U+8317 # <cjk>
+0xE4AB U+8318 # <cjk>
+0xE4AC U+8385 # <cjk>
+0xE4AD U+839A # <cjk>
+0xE4AE U+83AA # <cjk>
+0xE4AF U+839F # <cjk>
+0xE4B0 U+83A2 # <cjk>
+0xE4B1 U+8396 # <cjk>
+0xE4B2 U+8323 # <cjk>
+0xE4B3 U+838E # <cjk>
+0xE4B4 U+8387 # <cjk>
+0xE4B5 U+838A # <cjk>
+0xE4B6 U+837C # <cjk>
+0xE4B7 U+83B5 # <cjk>
+0xE4B8 U+8373 # <cjk>
+0xE4B9 U+8375 # <cjk>
+0xE4BA U+83A0 # <cjk>
+0xE4BB U+8389 # <cjk>
+0xE4BC U+83A8 # <cjk>
+0xE4BD U+83F4 # <cjk>
+0xE4BE U+8413 # <cjk>
+0xE4BF U+83EB # <cjk>
+0xE4C0 U+83CE # <cjk>
+0xE4C1 U+83FD # <cjk>
+0xE4C2 U+8403 # <cjk>
+0xE4C3 U+83D8 # <cjk>
+0xE4C4 U+840B # <cjk>
+0xE4C5 U+83C1 # <cjk>
+0xE4C6 U+83F7 # <cjk>
+0xE4C7 U+8407 # <cjk>
+0xE4C8 U+83E0 # <cjk>
+0xE4C9 U+83F2 # <cjk>
+0xE4CA U+840D # <cjk>
+0xE4CB U+8422 # <cjk>
+0xE4CC U+8420 # <cjk>
+0xE4CD U+83BD # <cjk>
+0xE4CE U+8438 # <cjk>
+0xE4CF U+8506 # <cjk>
+0xE4D0 U+83FB # <cjk>
+0xE4D1 U+846D # <cjk>
+0xE4D2 U+842A # <cjk>
+0xE4D3 U+843C # <cjk>
+0xE4D4 U+855A # <cjk>
+0xE4D5 U+8484 # <cjk>
+0xE4D6 U+8477 # <cjk>
+0xE4D7 U+846B # <cjk>
+0xE4D8 U+84AD # <cjk>
+0xE4D9 U+846E # <cjk>
+0xE4DA U+8482 # <cjk>
+0xE4DB U+8469 # <cjk>
+0xE4DC U+8446 # <cjk>
+0xE4DD U+842C # <cjk>
+0xE4DE U+846F # <cjk>
+0xE4DF U+8479 # <cjk>
+0xE4E0 U+8435 # <cjk>
+0xE4E1 U+84CA # <cjk>
+0xE4E2 U+8462 # <cjk>
+0xE4E3 U+84B9 # <cjk>
+0xE4E4 U+84BF # <cjk>
+0xE4E5 U+849F # <cjk>
+0xE4E6 U+84D9 # <cjk>
+0xE4E7 U+84CD # <cjk>
+0xE4E8 U+84BB # <cjk>
+0xE4E9 U+84DA # <cjk>
+0xE4EA U+84D0 # <cjk>
+0xE4EB U+84C1 # <cjk>
+0xE4EC U+84C6 # <cjk>
+0xE4ED U+84D6 # <cjk>
+0xE4EE U+84A1 # <cjk>
+0xE4EF U+8521 # <cjk>
+0xE4F0 U+84FF # <cjk>
+0xE4F1 U+84F4 # <cjk>
+0xE4F2 U+8517 # <cjk>
+0xE4F3 U+8518 # <cjk>
+0xE4F4 U+852C # <cjk>
+0xE4F5 U+851F # <cjk>
+0xE4F6 U+8515 # <cjk>
+0xE4F7 U+8514 # <cjk>
+0xE4F8 U+84FC # <cjk>
+0xE4F9 U+8540 # <cjk>
+0xE4FA U+8563 # <cjk>
+0xE4FB U+8558 # <cjk>
+0xE4FC U+8548 # <cjk>
+0xE540 U+8541 # <cjk>
+0xE541 U+8602 # <cjk>
+0xE542 U+854B # <cjk>
+0xE543 U+8555 # <cjk>
+0xE544 U+8580 # <cjk>
+0xE545 U+85A4 # <cjk>
+0xE546 U+8588 # <cjk>
+0xE547 U+8591 # <cjk>
+0xE548 U+858A # <cjk>
+0xE549 U+85A8 # <cjk>
+0xE54A U+856D # <cjk>
+0xE54B U+8594 # <cjk>
+0xE54C U+859B # <cjk>
+0xE54D U+85EA # <cjk>
+0xE54E U+8587 # <cjk>
+0xE54F U+859C # <cjk>
+0xE550 U+8577 # <cjk>
+0xE551 U+857E # <cjk>
+0xE552 U+8590 # <cjk>
+0xE553 U+85C9 # <cjk>
+0xE554 U+85BA # <cjk>
+0xE555 U+85CF # <cjk>
+0xE556 U+85B9 # <cjk>
+0xE557 U+85D0 # <cjk>
+0xE558 U+85D5 # <cjk>
+0xE559 U+85DD # <cjk>
+0xE55A U+85E5 # <cjk>
+0xE55B U+85DC # <cjk>
+0xE55C U+85F9 # <cjk>
+0xE55D U+860A # <cjk>
+0xE55E U+8613 # <cjk>
+0xE55F U+860B # <cjk>
+0xE560 U+85FE # <cjk>
+0xE561 U+85FA # <cjk>
+0xE562 U+8606 # <cjk>
+0xE563 U+8622 # <cjk>
+0xE564 U+861A # <cjk>
+0xE565 U+8630 # <cjk>
+0xE566 U+863F # <cjk>
+0xE567 U+864D # <cjk>
+0xE568 U+4E55 # <cjk>
+0xE569 U+8654 # <cjk>
+0xE56A U+865F # <cjk>
+0xE56B U+8667 # <cjk>
+0xE56C U+8671 # <cjk>
+0xE56D U+8693 # <cjk>
+0xE56E U+86A3 # <cjk>
+0xE56F U+86A9 # <cjk>
+0xE570 U+86AA # <cjk>
+0xE571 U+868B # <cjk>
+0xE572 U+868C # <cjk>
+0xE573 U+86B6 # <cjk>
+0xE574 U+86AF # <cjk>
+0xE575 U+86C4 # <cjk>
+0xE576 U+86C6 # <cjk>
+0xE577 U+86B0 # <cjk>
+0xE578 U+86C9 # <cjk>
+0xE579 U+8823 # <cjk>
+0xE57A U+86AB # <cjk>
+0xE57B U+86D4 # <cjk>
+0xE57C U+86DE # <cjk>
+0xE57D U+86E9 # <cjk>
+0xE57E U+86EC # <cjk>
+0xE580 U+86DF # <cjk>
+0xE581 U+86DB # <cjk>
+0xE582 U+86EF # <cjk>
+0xE583 U+8712 # <cjk>
+0xE584 U+8706 # <cjk>
+0xE585 U+8708 # <cjk>
+0xE586 U+8700 # <cjk>
+0xE587 U+8703 # <cjk>
+0xE588 U+86FB # <cjk>
+0xE589 U+8711 # <cjk>
+0xE58A U+8709 # <cjk>
+0xE58B U+870D # <cjk>
+0xE58C U+86F9 # <cjk>
+0xE58D U+870A # <cjk>
+0xE58E U+8734 # <cjk>
+0xE58F U+873F # <cjk>
+0xE590 U+8737 # <cjk>
+0xE591 U+873B # <cjk>
+0xE592 U+8725 # <cjk>
+0xE593 U+8729 # <cjk>
+0xE594 U+871A # <cjk>
+0xE595 U+8760 # <cjk>
+0xE596 U+875F # <cjk>
+0xE597 U+8778 # <cjk>
+0xE598 U+874C # <cjk>
+0xE599 U+874E # <cjk>
+0xE59A U+8774 # <cjk>
+0xE59B U+8757 # <cjk>
+0xE59C U+8768 # <cjk>
+0xE59D U+876E # <cjk>
+0xE59E U+8759 # <cjk>
+0xE59F U+8753 # <cjk>
+0xE5A0 U+8763 # <cjk>
+0xE5A1 U+876A # <cjk>
+0xE5A2 U+8805 # <cjk>
+0xE5A3 U+87A2 # <cjk>
+0xE5A4 U+879F # <cjk>
+0xE5A5 U+8782 # <cjk>
+0xE5A6 U+87AF # <cjk>
+0xE5A7 U+87CB # <cjk>
+0xE5A8 U+87BD # <cjk>
+0xE5A9 U+87C0 # <cjk>
+0xE5AA U+87D0 # <cjk>
+0xE5AB U+96D6 # <cjk>
+0xE5AC U+87AB # <cjk>
+0xE5AD U+87C4 # <cjk>
+0xE5AE U+87B3 # <cjk>
+0xE5AF U+87C7 # <cjk>
+0xE5B0 U+87C6 # <cjk>
+0xE5B1 U+87BB # <cjk>
+0xE5B2 U+87EF # <cjk>
+0xE5B3 U+87F2 # <cjk>
+0xE5B4 U+87E0 # <cjk>
+0xE5B5 U+880F # <cjk>
+0xE5B6 U+880D # <cjk>
+0xE5B7 U+87FE # <cjk>
+0xE5B8 U+87F6 # <cjk>
+0xE5B9 U+87F7 # <cjk>
+0xE5BA U+880E # <cjk>
+0xE5BB U+87D2 # <cjk>
+0xE5BC U+8811 # <cjk>
+0xE5BD U+8816 # <cjk>
+0xE5BE U+8815 # <cjk>
+0xE5BF U+8822 # <cjk>
+0xE5C0 U+8821 # <cjk>
+0xE5C1 U+8831 # <cjk>
+0xE5C2 U+8836 # <cjk>
+0xE5C3 U+8839 # <cjk>
+0xE5C4 U+8827 # <cjk>
+0xE5C5 U+883B # <cjk>
+0xE5C6 U+8844 # <cjk>
+0xE5C7 U+8842 # <cjk>
+0xE5C8 U+8852 # <cjk>
+0xE5C9 U+8859 # <cjk>
+0xE5CA U+885E # <cjk>
+0xE5CB U+8862 # <cjk>
+0xE5CC U+886B # <cjk>
+0xE5CD U+8881 # <cjk>
+0xE5CE U+887E # <cjk>
+0xE5CF U+889E # <cjk>
+0xE5D0 U+8875 # <cjk>
+0xE5D1 U+887D # <cjk>
+0xE5D2 U+88B5 # <cjk>
+0xE5D3 U+8872 # <cjk>
+0xE5D4 U+8882 # <cjk>
+0xE5D5 U+8897 # <cjk>
+0xE5D6 U+8892 # <cjk>
+0xE5D7 U+88AE # <cjk>
+0xE5D8 U+8899 # <cjk>
+0xE5D9 U+88A2 # <cjk>
+0xE5DA U+888D # <cjk>
+0xE5DB U+88A4 # <cjk>
+0xE5DC U+88B0 # <cjk>
+0xE5DD U+88BF # <cjk>
+0xE5DE U+88B1 # <cjk>
+0xE5DF U+88C3 # <cjk>
+0xE5E0 U+88C4 # <cjk>
+0xE5E1 U+88D4 # <cjk>
+0xE5E2 U+88D8 # <cjk>
+0xE5E3 U+88D9 # <cjk>
+0xE5E4 U+88DD # <cjk>
+0xE5E5 U+88F9 # <cjk>
+0xE5E6 U+8902 # <cjk>
+0xE5E7 U+88FC # <cjk>
+0xE5E8 U+88F4 # <cjk>
+0xE5E9 U+88E8 # <cjk>
+0xE5EA U+88F2 # <cjk>
+0xE5EB U+8904 # <cjk>
+0xE5EC U+890C # <cjk>
+0xE5ED U+890A # <cjk>
+0xE5EE U+8913 # <cjk>
+0xE5EF U+8943 # <cjk>
+0xE5F0 U+891E # <cjk>
+0xE5F1 U+8925 # <cjk>
+0xE5F2 U+892A # <cjk>
+0xE5F3 U+892B # <cjk>
+0xE5F4 U+8941 # <cjk>
+0xE5F5 U+8944 # <cjk>
+0xE5F6 U+893B # <cjk>
+0xE5F7 U+8936 # <cjk>
+0xE5F8 U+8938 # <cjk>
+0xE5F9 U+894C # <cjk>
+0xE5FA U+891D # <cjk>
+0xE5FB U+8960 # <cjk>
+0xE5FC U+895E # <cjk>
+0xE640 U+8966 # <cjk>
+0xE641 U+8964 # <cjk>
+0xE642 U+896D # <cjk>
+0xE643 U+896A # <cjk>
+0xE644 U+896F # <cjk>
+0xE645 U+8974 # <cjk>
+0xE646 U+8977 # <cjk>
+0xE647 U+897E # <cjk>
+0xE648 U+8983 # <cjk>
+0xE649 U+8988 # <cjk>
+0xE64A U+898A # <cjk>
+0xE64B U+8993 # <cjk>
+0xE64C U+8998 # <cjk>
+0xE64D U+89A1 # <cjk>
+0xE64E U+89A9 # <cjk>
+0xE64F U+89A6 # <cjk>
+0xE650 U+89AC # <cjk>
+0xE651 U+89AF # <cjk>
+0xE652 U+89B2 # <cjk>
+0xE653 U+89BA # <cjk>
+0xE654 U+89BD # <cjk>
+0xE655 U+89BF # <cjk>
+0xE656 U+89C0 # <cjk>
+0xE657 U+89DA # <cjk>
+0xE658 U+89DC # <cjk>
+0xE659 U+89DD # <cjk>
+0xE65A U+89E7 # <cjk>
+0xE65B U+89F4 # <cjk>
+0xE65C U+89F8 # <cjk>
+0xE65D U+8A03 # <cjk>
+0xE65E U+8A16 # <cjk>
+0xE65F U+8A10 # <cjk>
+0xE660 U+8A0C # <cjk>
+0xE661 U+8A1B # <cjk>
+0xE662 U+8A1D # <cjk>
+0xE663 U+8A25 # <cjk>
+0xE664 U+8A36 # <cjk>
+0xE665 U+8A41 # <cjk>
+0xE666 U+8A5B # <cjk>
+0xE667 U+8A52 # <cjk>
+0xE668 U+8A46 # <cjk>
+0xE669 U+8A48 # <cjk>
+0xE66A U+8A7C # <cjk>
+0xE66B U+8A6D # <cjk>
+0xE66C U+8A6C # <cjk>
+0xE66D U+8A62 # <cjk>
+0xE66E U+8A85 # <cjk>
+0xE66F U+8A82 # <cjk>
+0xE670 U+8A84 # <cjk>
+0xE671 U+8AA8 # <cjk>
+0xE672 U+8AA1 # <cjk>
+0xE673 U+8A91 # <cjk>
+0xE674 U+8AA5 # <cjk>
+0xE675 U+8AA6 # <cjk>
+0xE676 U+8A9A # <cjk>
+0xE677 U+8AA3 # <cjk>
+0xE678 U+8AC4 # <cjk>
+0xE679 U+8ACD # <cjk>
+0xE67A U+8AC2 # <cjk>
+0xE67B U+8ADA # <cjk>
+0xE67C U+8AEB # <cjk>
+0xE67D U+8AF3 # <cjk>
+0xE67E U+8AE7 # <cjk>
+0xE680 U+8AE4 # <cjk>
+0xE681 U+8AF1 # <cjk>
+0xE682 U+8B14 # <cjk>
+0xE683 U+8AE0 # <cjk>
+0xE684 U+8AE2 # <cjk>
+0xE685 U+8AF7 # <cjk>
+0xE686 U+8ADE # <cjk>
+0xE687 U+8ADB # <cjk>
+0xE688 U+8B0C # <cjk>
+0xE689 U+8B07 # <cjk>
+0xE68A U+8B1A # <cjk>
+0xE68B U+8AE1 # <cjk>
+0xE68C U+8B16 # <cjk>
+0xE68D U+8B10 # <cjk>
+0xE68E U+8B17 # <cjk>
+0xE68F U+8B20 # <cjk>
+0xE690 U+8B33 # <cjk>
+0xE691 U+97AB # <cjk>
+0xE692 U+8B26 # <cjk>
+0xE693 U+8B2B # <cjk>
+0xE694 U+8B3E # <cjk>
+0xE695 U+8B28 # <cjk>
+0xE696 U+8B41 # <cjk>
+0xE697 U+8B4C # <cjk>
+0xE698 U+8B4F # <cjk>
+0xE699 U+8B4E # <cjk>
+0xE69A U+8B49 # <cjk>
+0xE69B U+8B56 # <cjk>
+0xE69C U+8B5B # <cjk>
+0xE69D U+8B5A # <cjk>
+0xE69E U+8B6B # <cjk>
+0xE69F U+8B5F # <cjk>
+0xE6A0 U+8B6C # <cjk>
+0xE6A1 U+8B6F # <cjk>
+0xE6A2 U+8B74 # <cjk>
+0xE6A3 U+8B7D # <cjk>
+0xE6A4 U+8B80 # <cjk>
+0xE6A5 U+8B8C # <cjk>
+0xE6A6 U+8B8E # <cjk>
+0xE6A7 U+8B92 # <cjk>
+0xE6A8 U+8B93 # <cjk>
+0xE6A9 U+8B96 # <cjk>
+0xE6AA U+8B99 # <cjk>
+0xE6AB U+8B9A # <cjk>
+0xE6AC U+8C3A # <cjk>
+0xE6AD U+8C41 # <cjk>
+0xE6AE U+8C3F # <cjk>
+0xE6AF U+8C48 # <cjk>
+0xE6B0 U+8C4C # <cjk>
+0xE6B1 U+8C4E # <cjk>
+0xE6B2 U+8C50 # <cjk>
+0xE6B3 U+8C55 # <cjk>
+0xE6B4 U+8C62 # <cjk>
+0xE6B5 U+8C6C # <cjk>
+0xE6B6 U+8C78 # <cjk>
+0xE6B7 U+8C7A # <cjk>
+0xE6B8 U+8C82 # <cjk>
+0xE6B9 U+8C89 # <cjk>
+0xE6BA U+8C85 # <cjk>
+0xE6BB U+8C8A # <cjk>
+0xE6BC U+8C8D # <cjk>
+0xE6BD U+8C8E # <cjk>
+0xE6BE U+8C94 # <cjk>
+0xE6BF U+8C7C # <cjk>
+0xE6C0 U+8C98 # <cjk>
+0xE6C1 U+621D # <cjk>
+0xE6C2 U+8CAD # <cjk>
+0xE6C3 U+8CAA # <cjk>
+0xE6C4 U+8CBD # <cjk>
+0xE6C5 U+8CB2 # <cjk>
+0xE6C6 U+8CB3 # <cjk>
+0xE6C7 U+8CAE # <cjk>
+0xE6C8 U+8CB6 # <cjk>
+0xE6C9 U+8CC8 # <cjk>
+0xE6CA U+8CC1 # <cjk>
+0xE6CB U+8CE4 # <cjk>
+0xE6CC U+8CE3 # <cjk>
+0xE6CD U+8CDA # <cjk>
+0xE6CE U+8CFD # <cjk>
+0xE6CF U+8CFA # <cjk>
+0xE6D0 U+8CFB # <cjk>
+0xE6D1 U+8D04 # <cjk>
+0xE6D2 U+8D05 # <cjk>
+0xE6D3 U+8D0A # <cjk>
+0xE6D4 U+8D07 # <cjk>
+0xE6D5 U+8D0F # <cjk>
+0xE6D6 U+8D0D # <cjk>
+0xE6D7 U+8D10 # <cjk>
+0xE6D8 U+9F4E # <cjk>
+0xE6D9 U+8D13 # <cjk>
+0xE6DA U+8CCD # <cjk>
+0xE6DB U+8D14 # <cjk>
+0xE6DC U+8D16 # <cjk>
+0xE6DD U+8D67 # <cjk>
+0xE6DE U+8D6D # <cjk>
+0xE6DF U+8D71 # <cjk>
+0xE6E0 U+8D73 # <cjk>
+0xE6E1 U+8D81 # <cjk>
+0xE6E2 U+8D99 # <cjk>
+0xE6E3 U+8DC2 # <cjk>
+0xE6E4 U+8DBE # <cjk>
+0xE6E5 U+8DBA # <cjk>
+0xE6E6 U+8DCF # <cjk>
+0xE6E7 U+8DDA # <cjk>
+0xE6E8 U+8DD6 # <cjk>
+0xE6E9 U+8DCC # <cjk>
+0xE6EA U+8DDB # <cjk>
+0xE6EB U+8DCB # <cjk>
+0xE6EC U+8DEA # <cjk>
+0xE6ED U+8DEB # <cjk>
+0xE6EE U+8DDF # <cjk>
+0xE6EF U+8DE3 # <cjk>
+0xE6F0 U+8DFC # <cjk>
+0xE6F1 U+8E08 # <cjk>
+0xE6F2 U+8E09 # <cjk>
+0xE6F3 U+8DFF # <cjk>
+0xE6F4 U+8E1D # <cjk>
+0xE6F5 U+8E1E # <cjk>
+0xE6F6 U+8E10 # <cjk>
+0xE6F7 U+8E1F # <cjk>
+0xE6F8 U+8E42 # <cjk>
+0xE6F9 U+8E35 # <cjk>
+0xE6FA U+8E30 # <cjk>
+0xE6FB U+8E34 # <cjk>
+0xE6FC U+8E4A # <cjk>
+0xE740 U+8E47 # <cjk>
+0xE741 U+8E49 # <cjk>
+0xE742 U+8E4C # <cjk>
+0xE743 U+8E50 # <cjk>
+0xE744 U+8E48 # <cjk>
+0xE745 U+8E59 # <cjk>
+0xE746 U+8E64 # <cjk>
+0xE747 U+8E60 # <cjk>
+0xE748 U+8E2A # <cjk>
+0xE749 U+8E63 # <cjk>
+0xE74A U+8E55 # <cjk>
+0xE74B U+8E76 # <cjk>
+0xE74C U+8E72 # <cjk>
+0xE74D U+8E7C # <cjk>
+0xE74E U+8E81 # <cjk>
+0xE74F U+8E87 # <cjk>
+0xE750 U+8E85 # <cjk>
+0xE751 U+8E84 # <cjk>
+0xE752 U+8E8B # <cjk>
+0xE753 U+8E8A # <cjk>
+0xE754 U+8E93 # <cjk>
+0xE755 U+8E91 # <cjk>
+0xE756 U+8E94 # <cjk>
+0xE757 U+8E99 # <cjk>
+0xE758 U+8EAA # <cjk>
+0xE759 U+8EA1 # <cjk>
+0xE75A U+8EAC # <cjk>
+0xE75B U+8EB0 # <cjk>
+0xE75C U+8EC6 # <cjk>
+0xE75D U+8EB1 # <cjk>
+0xE75E U+8EBE # <cjk>
+0xE75F U+8EC5 # <cjk>
+0xE760 U+8EC8 # <cjk>
+0xE761 U+8ECB # <cjk>
+0xE762 U+8EDB # <cjk>
+0xE763 U+8EE3 # <cjk>
+0xE764 U+8EFC # <cjk>
+0xE765 U+8EFB # <cjk>
+0xE766 U+8EEB # <cjk>
+0xE767 U+8EFE # <cjk>
+0xE768 U+8F0A # <cjk>
+0xE769 U+8F05 # <cjk>
+0xE76A U+8F15 # <cjk>
+0xE76B U+8F12 # <cjk>
+0xE76C U+8F19 # <cjk>
+0xE76D U+8F13 # <cjk>
+0xE76E U+8F1C # <cjk>
+0xE76F U+8F1F # <cjk>
+0xE770 U+8F1B # <cjk>
+0xE771 U+8F0C # <cjk>
+0xE772 U+8F26 # <cjk>
+0xE773 U+8F33 # <cjk>
+0xE774 U+8F3B # <cjk>
+0xE775 U+8F39 # <cjk>
+0xE776 U+8F45 # <cjk>
+0xE777 U+8F42 # <cjk>
+0xE778 U+8F3E # <cjk>
+0xE779 U+8F4C # <cjk>
+0xE77A U+8F49 # <cjk>
+0xE77B U+8F46 # <cjk>
+0xE77C U+8F4E # <cjk>
+0xE77D U+8F57 # <cjk>
+0xE77E U+8F5C # <cjk>
+0xE780 U+8F62 # <cjk>
+0xE781 U+8F63 # <cjk>
+0xE782 U+8F64 # <cjk>
+0xE783 U+8F9C # <cjk>
+0xE784 U+8F9F # <cjk>
+0xE785 U+8FA3 # <cjk>
+0xE786 U+8FAD # <cjk>
+0xE787 U+8FAF # <cjk>
+0xE788 U+8FB7 # <cjk>
+0xE789 U+8FDA # <cjk>
+0xE78A U+8FE5 # <cjk>
+0xE78B U+8FE2 # <cjk>
+0xE78C U+8FEA # <cjk>
+0xE78D U+8FEF # <cjk>
+0xE78E U+9087 # <cjk>
+0xE78F U+8FF4 # <cjk>
+0xE790 U+9005 # <cjk>
+0xE791 U+8FF9 # <cjk>
+0xE792 U+8FFA # <cjk>
+0xE793 U+9011 # <cjk>
+0xE794 U+9015 # <cjk>
+0xE795 U+9021 # <cjk>
+0xE796 U+900D # <cjk>
+0xE797 U+901E # <cjk>
+0xE798 U+9016 # <cjk>
+0xE799 U+900B # <cjk>
+0xE79A U+9027 # <cjk>
+0xE79B U+9036 # <cjk>
+0xE79C U+9035 # <cjk>
+0xE79D U+9039 # <cjk>
+0xE79E U+8FF8 # <cjk>
+0xE79F U+904F # <cjk>
+0xE7A0 U+9050 # <cjk>
+0xE7A1 U+9051 # <cjk>
+0xE7A2 U+9052 # <cjk>
+0xE7A3 U+900E # <cjk>
+0xE7A4 U+9049 # <cjk>
+0xE7A5 U+903E # <cjk>
+0xE7A6 U+9056 # <cjk>
+0xE7A7 U+9058 # <cjk>
+0xE7A8 U+905E # <cjk>
+0xE7A9 U+9068 # <cjk>
+0xE7AA U+906F # <cjk>
+0xE7AB U+9076 # <cjk>
+0xE7AC U+96A8 # <cjk>
+0xE7AD U+9072 # <cjk>
+0xE7AE U+9082 # <cjk>
+0xE7AF U+907D # <cjk>
+0xE7B0 U+9081 # <cjk>
+0xE7B1 U+9080 # <cjk>
+0xE7B2 U+908A # <cjk>
+0xE7B3 U+9089 # <cjk>
+0xE7B4 U+908F # <cjk>
+0xE7B5 U+90A8 # <cjk>
+0xE7B6 U+90AF # <cjk>
+0xE7B7 U+90B1 # <cjk>
+0xE7B8 U+90B5 # <cjk>
+0xE7B9 U+90E2 # <cjk>
+0xE7BA U+90E4 # <cjk>
+0xE7BB U+6248 # <cjk>
+0xE7BC U+90DB # <cjk>
+0xE7BD U+9102 # <cjk>
+0xE7BE U+9112 # <cjk>
+0xE7BF U+9119 # <cjk>
+0xE7C0 U+9132 # <cjk>
+0xE7C1 U+9130 # <cjk>
+0xE7C2 U+914A # <cjk>
+0xE7C3 U+9156 # <cjk>
+0xE7C4 U+9158 # <cjk>
+0xE7C5 U+9163 # <cjk>
+0xE7C6 U+9165 # <cjk>
+0xE7C7 U+9169 # <cjk>
+0xE7C8 U+9173 # <cjk>
+0xE7C9 U+9172 # <cjk>
+0xE7CA U+918B # <cjk>
+0xE7CB U+9189 # <cjk>
+0xE7CC U+9182 # <cjk>
+0xE7CD U+91A2 # <cjk>
+0xE7CE U+91AB # <cjk>
+0xE7CF U+91AF # <cjk>
+0xE7D0 U+91AA # <cjk>
+0xE7D1 U+91B5 # <cjk>
+0xE7D2 U+91B4 # <cjk>
+0xE7D3 U+91BA # <cjk>
+0xE7D4 U+91C0 # <cjk>
+0xE7D5 U+91C1 # <cjk>
+0xE7D6 U+91C9 # <cjk>
+0xE7D7 U+91CB # <cjk>
+0xE7D8 U+91D0 # <cjk>
+0xE7D9 U+91D6 # <cjk>
+0xE7DA U+91DF # <cjk>
+0xE7DB U+91E1 # <cjk>
+0xE7DC U+91DB # <cjk>
+0xE7DD U+91FC # <cjk>
+0xE7DE U+91F5 # <cjk>
+0xE7DF U+91F6 # <cjk>
+0xE7E0 U+921E # <cjk>
+0xE7E1 U+91FF # <cjk>
+0xE7E2 U+9214 # <cjk>
+0xE7E3 U+922C # <cjk>
+0xE7E4 U+9215 # <cjk>
+0xE7E5 U+9211 # <cjk>
+0xE7E6 U+925E # <cjk>
+0xE7E7 U+9257 # <cjk>
+0xE7E8 U+9245 # <cjk>
+0xE7E9 U+9249 # <cjk>
+0xE7EA U+9264 # <cjk>
+0xE7EB U+9248 # <cjk>
+0xE7EC U+9295 # <cjk>
+0xE7ED U+923F # <cjk>
+0xE7EE U+924B # <cjk>
+0xE7EF U+9250 # <cjk>
+0xE7F0 U+929C # <cjk>
+0xE7F1 U+9296 # <cjk>
+0xE7F2 U+9293 # <cjk>
+0xE7F3 U+929B # <cjk>
+0xE7F4 U+925A # <cjk>
+0xE7F5 U+92CF # <cjk>
+0xE7F6 U+92B9 # <cjk>
+0xE7F7 U+92B7 # <cjk>
+0xE7F8 U+92E9 # <cjk>
+0xE7F9 U+930F # <cjk>
+0xE7FA U+92FA # <cjk>
+0xE7FB U+9344 # <cjk>
+0xE7FC U+932E # <cjk>
+0xE840 U+9319 # <cjk>
+0xE841 U+9322 # <cjk>
+0xE842 U+931A # <cjk>
+0xE843 U+9323 # <cjk>
+0xE844 U+933A # <cjk>
+0xE845 U+9335 # <cjk>
+0xE846 U+933B # <cjk>
+0xE847 U+935C # <cjk>
+0xE848 U+9360 # <cjk>
+0xE849 U+937C # <cjk>
+0xE84A U+936E # <cjk>
+0xE84B U+9356 # <cjk>
+0xE84C U+93B0 # <cjk>
+0xE84D U+93AC # <cjk>
+0xE84E U+93AD # <cjk>
+0xE84F U+9394 # <cjk>
+0xE850 U+93B9 # <cjk>
+0xE851 U+93D6 # <cjk>
+0xE852 U+93D7 # <cjk>
+0xE853 U+93E8 # <cjk>
+0xE854 U+93E5 # <cjk>
+0xE855 U+93D8 # <cjk>
+0xE856 U+93C3 # <cjk>
+0xE857 U+93DD # <cjk>
+0xE858 U+93D0 # <cjk>
+0xE859 U+93C8 # <cjk>
+0xE85A U+93E4 # <cjk>
+0xE85B U+941A # <cjk>
+0xE85C U+9414 # <cjk>
+0xE85D U+9413 # <cjk>
+0xE85E U+9403 # <cjk>
+0xE85F U+9407 # <cjk>
+0xE860 U+9410 # <cjk>
+0xE861 U+9436 # <cjk>
+0xE862 U+942B # <cjk>
+0xE863 U+9435 # <cjk>
+0xE864 U+9421 # <cjk>
+0xE865 U+943A # <cjk>
+0xE866 U+9441 # <cjk>
+0xE867 U+9452 # <cjk>
+0xE868 U+9444 # <cjk>
+0xE869 U+945B # <cjk>
+0xE86A U+9460 # <cjk>
+0xE86B U+9462 # <cjk>
+0xE86C U+945E # <cjk>
+0xE86D U+946A # <cjk>
+0xE86E U+9229 # <cjk>
+0xE86F U+9470 # <cjk>
+0xE870 U+9475 # <cjk>
+0xE871 U+9477 # <cjk>
+0xE872 U+947D # <cjk>
+0xE873 U+945A # <cjk>
+0xE874 U+947C # <cjk>
+0xE875 U+947E # <cjk>
+0xE876 U+9481 # <cjk>
+0xE877 U+947F # <cjk>
+0xE878 U+9582 # <cjk>
+0xE879 U+9587 # <cjk>
+0xE87A U+958A # <cjk>
+0xE87B U+9594 # <cjk>
+0xE87C U+9596 # <cjk>
+0xE87D U+9598 # <cjk>
+0xE87E U+9599 # <cjk>
+0xE880 U+95A0 # <cjk>
+0xE881 U+95A8 # <cjk>
+0xE882 U+95A7 # <cjk>
+0xE883 U+95AD # <cjk>
+0xE884 U+95BC # <cjk>
+0xE885 U+95BB # <cjk>
+0xE886 U+95B9 # <cjk>
+0xE887 U+95BE # <cjk>
+0xE888 U+95CA # <cjk>
+0xE889 U+6FF6 # <cjk>
+0xE88A U+95C3 # <cjk>
+0xE88B U+95CD # <cjk>
+0xE88C U+95CC # <cjk>
+0xE88D U+95D5 # <cjk>
+0xE88E U+95D4 # <cjk>
+0xE88F U+95D6 # <cjk>
+0xE890 U+95DC # <cjk>
+0xE891 U+95E1 # <cjk>
+0xE892 U+95E5 # <cjk>
+0xE893 U+95E2 # <cjk>
+0xE894 U+9621 # <cjk>
+0xE895 U+9628 # <cjk>
+0xE896 U+962E # <cjk>
+0xE897 U+962F # <cjk>
+0xE898 U+9642 # <cjk>
+0xE899 U+964C # <cjk>
+0xE89A U+964F # <cjk>
+0xE89B U+964B # <cjk>
+0xE89C U+9677 # <cjk>
+0xE89D U+965C # <cjk>
+0xE89E U+965E # <cjk>
+0xE89F U+965D # <cjk>
+0xE8A0 U+965F # <cjk>
+0xE8A1 U+9666 # <cjk>
+0xE8A2 U+9672 # <cjk>
+0xE8A3 U+966C # <cjk>
+0xE8A4 U+968D # <cjk>
+0xE8A5 U+9698 # <cjk>
+0xE8A6 U+9695 # <cjk>
+0xE8A7 U+9697 # <cjk>
+0xE8A8 U+96AA # <cjk>
+0xE8A9 U+96A7 # <cjk>
+0xE8AA U+96B1 # <cjk>
+0xE8AB U+96B2 # <cjk>
+0xE8AC U+96B0 # <cjk>
+0xE8AD U+96B4 # <cjk>
+0xE8AE U+96B6 # <cjk>
+0xE8AF U+96B8 # <cjk>
+0xE8B0 U+96B9 # <cjk>
+0xE8B1 U+96CE # <cjk>
+0xE8B2 U+96CB # <cjk>
+0xE8B3 U+96C9 # <cjk>
+0xE8B4 U+96CD # <cjk>
+0xE8B5 U+894D # <cjk>
+0xE8B6 U+96DC # <cjk>
+0xE8B7 U+970D # <cjk>
+0xE8B8 U+96D5 # <cjk>
+0xE8B9 U+96F9 # <cjk>
+0xE8BA U+9704 # <cjk>
+0xE8BB U+9706 # <cjk>
+0xE8BC U+9708 # <cjk>
+0xE8BD U+9713 # <cjk>
+0xE8BE U+970E # <cjk>
+0xE8BF U+9711 # <cjk>
+0xE8C0 U+970F # <cjk>
+0xE8C1 U+9716 # <cjk>
+0xE8C2 U+9719 # <cjk>
+0xE8C3 U+9724 # <cjk>
+0xE8C4 U+972A # <cjk>
+0xE8C5 U+9730 # <cjk>
+0xE8C6 U+9739 # <cjk>
+0xE8C7 U+973D # <cjk>
+0xE8C8 U+973E # <cjk>
+0xE8C9 U+9744 # <cjk>
+0xE8CA U+9746 # <cjk>
+0xE8CB U+9748 # <cjk>
+0xE8CC U+9742 # <cjk>
+0xE8CD U+9749 # <cjk>
+0xE8CE U+975C # <cjk>
+0xE8CF U+9760 # <cjk>
+0xE8D0 U+9764 # <cjk>
+0xE8D1 U+9766 # <cjk>
+0xE8D2 U+9768 # <cjk>
+0xE8D3 U+52D2 # <cjk>
+0xE8D4 U+976B # <cjk>
+0xE8D5 U+9771 # <cjk>
+0xE8D6 U+9779 # <cjk>
+0xE8D7 U+9785 # <cjk>
+0xE8D8 U+977C # <cjk>
+0xE8D9 U+9781 # <cjk>
+0xE8DA U+977A # <cjk>
+0xE8DB U+9786 # <cjk>
+0xE8DC U+978B # <cjk>
+0xE8DD U+978F # <cjk>
+0xE8DE U+9790 # <cjk>
+0xE8DF U+979C # <cjk>
+0xE8E0 U+97A8 # <cjk>
+0xE8E1 U+97A6 # <cjk>
+0xE8E2 U+97A3 # <cjk>
+0xE8E3 U+97B3 # <cjk>
+0xE8E4 U+97B4 # <cjk>
+0xE8E5 U+97C3 # <cjk>
+0xE8E6 U+97C6 # <cjk>
+0xE8E7 U+97C8 # <cjk>
+0xE8E8 U+97CB # <cjk>
+0xE8E9 U+97DC # <cjk>
+0xE8EA U+97ED # <cjk>
+0xE8EB U+9F4F # <cjk>
+0xE8EC U+97F2 # <cjk>
+0xE8ED U+7ADF # <cjk>
+0xE8EE U+97F6 # <cjk>
+0xE8EF U+97F5 # <cjk>
+0xE8F0 U+980F # <cjk>
+0xE8F1 U+980C # <cjk>
+0xE8F2 U+9838 # <cjk>
+0xE8F3 U+9824 # <cjk>
+0xE8F4 U+9821 # <cjk>
+0xE8F5 U+9837 # <cjk>
+0xE8F6 U+983D # <cjk>
+0xE8F7 U+9846 # <cjk>
+0xE8F8 U+984F # <cjk>
+0xE8F9 U+984B # <cjk>
+0xE8FA U+986B # <cjk>
+0xE8FB U+986F # <cjk>
+0xE8FC U+9870 # <cjk>
+0xE940 U+9871 # <cjk>
+0xE941 U+9874 # <cjk>
+0xE942 U+9873 # <cjk>
+0xE943 U+98AA # <cjk>
+0xE944 U+98AF # <cjk>
+0xE945 U+98B1 # <cjk>
+0xE946 U+98B6 # <cjk>
+0xE947 U+98C4 # <cjk>
+0xE948 U+98C3 # <cjk>
+0xE949 U+98C6 # <cjk>
+0xE94A U+98E9 # <cjk>
+0xE94B U+98EB # <cjk>
+0xE94C U+9903 # <cjk>
+0xE94D U+9909 # <cjk>
+0xE94E U+9912 # <cjk>
+0xE94F U+9914 # <cjk>
+0xE950 U+9918 # <cjk>
+0xE951 U+9921 # <cjk>
+0xE952 U+991D # <cjk>
+0xE953 U+991E # <cjk>
+0xE954 U+9924 # <cjk>
+0xE955 U+9920 # <cjk>
+0xE956 U+992C # <cjk>
+0xE957 U+992E # <cjk>
+0xE958 U+993D # <cjk>
+0xE959 U+993E # <cjk>
+0xE95A U+9942 # <cjk>
+0xE95B U+9949 # <cjk>
+0xE95C U+9945 # <cjk>
+0xE95D U+9950 # <cjk>
+0xE95E U+994B # <cjk>
+0xE95F U+9951 # <cjk>
+0xE960 U+9952 # <cjk>
+0xE961 U+994C # <cjk>
+0xE962 U+9955 # <cjk>
+0xE963 U+9997 # <cjk>
+0xE964 U+9998 # <cjk>
+0xE965 U+99A5 # <cjk>
+0xE966 U+99AD # <cjk>
+0xE967 U+99AE # <cjk>
+0xE968 U+99BC # <cjk>
+0xE969 U+99DF # <cjk>
+0xE96A U+99DB # <cjk>
+0xE96B U+99DD # <cjk>
+0xE96C U+99D8 # <cjk>
+0xE96D U+99D1 # <cjk>
+0xE96E U+99ED # <cjk>
+0xE96F U+99EE # <cjk>
+0xE970 U+99F1 # <cjk>
+0xE971 U+99F2 # <cjk>
+0xE972 U+99FB # <cjk>
+0xE973 U+99F8 # <cjk>
+0xE974 U+9A01 # <cjk>
+0xE975 U+9A0F # <cjk>
+0xE976 U+9A05 # <cjk>
+0xE977 U+99E2 # <cjk>
+0xE978 U+9A19 # <cjk>
+0xE979 U+9A2B # <cjk>
+0xE97A U+9A37 # <cjk>
+0xE97B U+9A45 # <cjk>
+0xE97C U+9A42 # <cjk>
+0xE97D U+9A40 # <cjk>
+0xE97E U+9A43 # <cjk>
+0xE980 U+9A3E # <cjk>
+0xE981 U+9A55 # <cjk>
+0xE982 U+9A4D # <cjk>
+0xE983 U+9A5B # <cjk>
+0xE984 U+9A57 # <cjk>
+0xE985 U+9A5F # <cjk>
+0xE986 U+9A62 # <cjk>
+0xE987 U+9A65 # <cjk>
+0xE988 U+9A64 # <cjk>
+0xE989 U+9A69 # <cjk>
+0xE98A U+9A6B # <cjk>
+0xE98B U+9A6A # <cjk>
+0xE98C U+9AAD # <cjk>
+0xE98D U+9AB0 # <cjk>
+0xE98E U+9ABC # <cjk>
+0xE98F U+9AC0 # <cjk>
+0xE990 U+9ACF # <cjk>
+0xE991 U+9AD1 # <cjk>
+0xE992 U+9AD3 # <cjk>
+0xE993 U+9AD4 # <cjk>
+0xE994 U+9ADE # <cjk>
+0xE995 U+9ADF # <cjk>
+0xE996 U+9AE2 # <cjk>
+0xE997 U+9AE3 # <cjk>
+0xE998 U+9AE6 # <cjk>
+0xE999 U+9AEF # <cjk>
+0xE99A U+9AEB # <cjk>
+0xE99B U+9AEE # <cjk>
+0xE99C U+9AF4 # <cjk>
+0xE99D U+9AF1 # <cjk>
+0xE99E U+9AF7 # <cjk>
+0xE99F U+9AFB # <cjk>
+0xE9A0 U+9B06 # <cjk>
+0xE9A1 U+9B18 # <cjk>
+0xE9A2 U+9B1A # <cjk>
+0xE9A3 U+9B1F # <cjk>
+0xE9A4 U+9B22 # <cjk>
+0xE9A5 U+9B23 # <cjk>
+0xE9A6 U+9B25 # <cjk>
+0xE9A7 U+9B27 # <cjk>
+0xE9A8 U+9B28 # <cjk>
+0xE9A9 U+9B29 # <cjk>
+0xE9AA U+9B2A # <cjk>
+0xE9AB U+9B2E # <cjk>
+0xE9AC U+9B2F # <cjk>
+0xE9AD U+9B32 # <cjk>
+0xE9AE U+9B44 # <cjk>
+0xE9AF U+9B43 # <cjk>
+0xE9B0 U+9B4F # <cjk>
+0xE9B1 U+9B4D # <cjk>
+0xE9B2 U+9B4E # <cjk>
+0xE9B3 U+9B51 # <cjk>
+0xE9B4 U+9B58 # <cjk>
+0xE9B5 U+9B74 # <cjk>
+0xE9B6 U+9B93 # <cjk>
+0xE9B7 U+9B83 # <cjk>
+0xE9B8 U+9B91 # <cjk>
+0xE9B9 U+9B96 # <cjk>
+0xE9BA U+9B97 # <cjk>
+0xE9BB U+9B9F # <cjk>
+0xE9BC U+9BA0 # <cjk>
+0xE9BD U+9BA8 # <cjk>
+0xE9BE U+9BB4 # <cjk>
+0xE9BF U+9BC0 # <cjk>
+0xE9C0 U+9BCA # <cjk>
+0xE9C1 U+9BB9 # <cjk>
+0xE9C2 U+9BC6 # <cjk>
+0xE9C3 U+9BCF # <cjk>
+0xE9C4 U+9BD1 # <cjk>
+0xE9C5 U+9BD2 # <cjk>
+0xE9C6 U+9BE3 # <cjk>
+0xE9C7 U+9BE2 # <cjk>
+0xE9C8 U+9BE4 # <cjk>
+0xE9C9 U+9BD4 # <cjk>
+0xE9CA U+9BE1 # <cjk>
+0xE9CB U+9C3A # <cjk>
+0xE9CC U+9BF2 # <cjk>
+0xE9CD U+9BF1 # <cjk>
+0xE9CE U+9BF0 # <cjk>
+0xE9CF U+9C15 # <cjk>
+0xE9D0 U+9C14 # <cjk>
+0xE9D1 U+9C09 # <cjk>
+0xE9D2 U+9C13 # <cjk>
+0xE9D3 U+9C0C # <cjk>
+0xE9D4 U+9C06 # <cjk>
+0xE9D5 U+9C08 # <cjk>
+0xE9D6 U+9C12 # <cjk>
+0xE9D7 U+9C0A # <cjk>
+0xE9D8 U+9C04 # <cjk>
+0xE9D9 U+9C2E # <cjk>
+0xE9DA U+9C1B # <cjk>
+0xE9DB U+9C25 # <cjk>
+0xE9DC U+9C24 # <cjk>
+0xE9DD U+9C21 # <cjk>
+0xE9DE U+9C30 # <cjk>
+0xE9DF U+9C47 # <cjk>
+0xE9E0 U+9C32 # <cjk>
+0xE9E1 U+9C46 # <cjk>
+0xE9E2 U+9C3E # <cjk>
+0xE9E3 U+9C5A # <cjk>
+0xE9E4 U+9C60 # <cjk>
+0xE9E5 U+9C67 # <cjk>
+0xE9E6 U+9C76 # <cjk>
+0xE9E7 U+9C78 # <cjk>
+0xE9E8 U+9CE7 # <cjk>
+0xE9E9 U+9CEC # <cjk>
+0xE9EA U+9CF0 # <cjk>
+0xE9EB U+9D09 # <cjk>
+0xE9EC U+9D08 # <cjk>
+0xE9ED U+9CEB # <cjk>
+0xE9EE U+9D03 # <cjk>
+0xE9EF U+9D06 # <cjk>
+0xE9F0 U+9D2A # <cjk>
+0xE9F1 U+9D26 # <cjk>
+0xE9F2 U+9DAF # <cjk>
+0xE9F3 U+9D23 # <cjk>
+0xE9F4 U+9D1F # <cjk>
+0xE9F5 U+9D44 # <cjk>
+0xE9F6 U+9D15 # <cjk>
+0xE9F7 U+9D12 # <cjk>
+0xE9F8 U+9D41 # <cjk>
+0xE9F9 U+9D3F # <cjk>
+0xE9FA U+9D3E # <cjk>
+0xE9FB U+9D46 # <cjk>
+0xE9FC U+9D48 # <cjk>
+0xEA40 U+9D5D # <cjk>
+0xEA41 U+9D5E # <cjk>
+0xEA42 U+9D64 # <cjk>
+0xEA43 U+9D51 # <cjk>
+0xEA44 U+9D50 # <cjk>
+0xEA45 U+9D59 # <cjk>
+0xEA46 U+9D72 # <cjk>
+0xEA47 U+9D89 # <cjk>
+0xEA48 U+9D87 # <cjk>
+0xEA49 U+9DAB # <cjk>
+0xEA4A U+9D6F # <cjk>
+0xEA4B U+9D7A # <cjk>
+0xEA4C U+9D9A # <cjk>
+0xEA4D U+9DA4 # <cjk>
+0xEA4E U+9DA9 # <cjk>
+0xEA4F U+9DB2 # <cjk>
+0xEA50 U+9DC4 # <cjk>
+0xEA51 U+9DC1 # <cjk>
+0xEA52 U+9DBB # <cjk>
+0xEA53 U+9DB8 # <cjk>
+0xEA54 U+9DBA # <cjk>
+0xEA55 U+9DC6 # <cjk>
+0xEA56 U+9DCF # <cjk>
+0xEA57 U+9DC2 # <cjk>
+0xEA58 U+9DD9 # <cjk>
+0xEA59 U+9DD3 # <cjk>
+0xEA5A U+9DF8 # <cjk>
+0xEA5B U+9DE6 # <cjk>
+0xEA5C U+9DED # <cjk>
+0xEA5D U+9DEF # <cjk>
+0xEA5E U+9DFD # <cjk>
+0xEA5F U+9E1A # <cjk>
+0xEA60 U+9E1B # <cjk>
+0xEA61 U+9E1E # <cjk>
+0xEA62 U+9E75 # <cjk>
+0xEA63 U+9E79 # <cjk>
+0xEA64 U+9E7D # <cjk>
+0xEA65 U+9E81 # <cjk>
+0xEA66 U+9E88 # <cjk>
+0xEA67 U+9E8B # <cjk>
+0xEA68 U+9E8C # <cjk>
+0xEA69 U+9E92 # <cjk>
+0xEA6A U+9E95 # <cjk>
+0xEA6B U+9E91 # <cjk>
+0xEA6C U+9E9D # <cjk>
+0xEA6D U+9EA5 # <cjk>
+0xEA6E U+9EA9 # <cjk>
+0xEA6F U+9EB8 # <cjk>
+0xEA70 U+9EAA # <cjk>
+0xEA71 U+9EAD # <cjk>
+0xEA72 U+9761 # <cjk>
+0xEA73 U+9ECC # <cjk>
+0xEA74 U+9ECE # <cjk>
+0xEA75 U+9ECF # <cjk>
+0xEA76 U+9ED0 # <cjk>
+0xEA77 U+9ED4 # <cjk>
+0xEA78 U+9EDC # <cjk>
+0xEA79 U+9EDE # <cjk>
+0xEA7A U+9EDD # <cjk>
+0xEA7B U+9EE0 # <cjk>
+0xEA7C U+9EE5 # <cjk>
+0xEA7D U+9EE8 # <cjk>
+0xEA7E U+9EEF # <cjk>
+0xEA80 U+9EF4 # <cjk>
+0xEA81 U+9EF6 # <cjk>
+0xEA82 U+9EF7 # <cjk>
+0xEA83 U+9EF9 # <cjk>
+0xEA84 U+9EFB # <cjk>
+0xEA85 U+9EFC # <cjk>
+0xEA86 U+9EFD # <cjk>
+0xEA87 U+9F07 # <cjk>
+0xEA88 U+9F08 # <cjk>
+0xEA89 U+76B7 # <cjk>
+0xEA8A U+9F15 # <cjk>
+0xEA8B U+9F21 # <cjk>
+0xEA8C U+9F2C # <cjk>
+0xEA8D U+9F3E # <cjk>
+0xEA8E U+9F4A # <cjk>
+0xEA8F U+9F52 # <cjk>
+0xEA90 U+9F54 # <cjk>
+0xEA91 U+9F63 # <cjk>
+0xEA92 U+9F5F # <cjk>
+0xEA93 U+9F60 # <cjk>
+0xEA94 U+9F61 # <cjk>
+0xEA95 U+9F66 # <cjk>
+0xEA96 U+9F67 # <cjk>
+0xEA97 U+9F6C # <cjk>
+0xEA98 U+9F6A # <cjk>
+0xEA99 U+9F77 # <cjk>
+0xEA9A U+9F72 # <cjk>
+0xEA9B U+9F76 # <cjk>
+0xEA9C U+9F95 # <cjk>
+0xEA9D U+9F9C # <cjk>
+0xEA9E U+9FA0 # <cjk>
+0xEA9F U+582F # <cjk> [1983]
+0xEAA0 U+69C7 # <cjk> [1983]
+0xEAA1 U+9059 # <cjk> [1983]
+0xEAA2 U+7464 # <cjk> [1983]
+0xEAA3 U+51DC # <cjk> [1990]
+0xEAA4 U+7199 # <cjk> [1990]
+0xEAA5 U+5653 # <cjk> [2004]
+0xEAA6 U+5DE2 # <cjk> [2000]
+0xEAA7 U+5E14 # <cjk> [2000]
+0xEAA8 U+5E18 # <cjk> [2000]
+0xEAA9 U+5E58 # <cjk> [2000]
+0xEAAA U+5E5E # <cjk> [2000]
+0xEAAB U+5EBE # <cjk> [2000]
+0xEAAC U+F928 # CJK COMPATIBILITY IDEOGRAPH-F928 [2000]
+0xEAAD U+5ECB # <cjk> [2000]
+0xEAAE U+5EF9 # <cjk> [2000]
+0xEAAF U+5F00 # <cjk> [2000]
+0xEAB0 U+5F02 # <cjk> [2000]
+0xEAB1 U+5F07 # <cjk> [2000]
+0xEAB2 U+5F1D # <cjk> [2000]
+0xEAB3 U+5F23 # <cjk> [2000]
+0xEAB4 U+5F34 # <cjk> [2000]
+0xEAB5 U+5F36 # <cjk> [2000]
+0xEAB6 U+5F3D # <cjk> [2000]
+0xEAB7 U+5F40 # <cjk> [2000]
+0xEAB8 U+5F45 # <cjk> [2000]
+0xEAB9 U+5F54 # <cjk> [2000]
+0xEABA U+5F58 # <cjk> [2000]
+0xEABB U+5F64 # <cjk> [2000]
+0xEABC U+5F67 # <cjk> [2000]
+0xEABD U+5F7D # <cjk> [2000]
+0xEABE U+5F89 # <cjk> [2000]
+0xEABF U+5F9C # <cjk> [2000]
+0xEAC0 U+5FA7 # <cjk> [2000]
+0xEAC1 U+5FAF # <cjk> [2000]
+0xEAC2 U+5FB5 # <cjk> [2000]
+0xEAC3 U+5FB7 # <cjk> [2000]
+0xEAC4 U+5FC9 # <cjk> [2000]
+0xEAC5 U+5FDE # <cjk> [2000]
+0xEAC6 U+5FE1 # <cjk> [2000]
+0xEAC7 U+5FE9 # <cjk> [2000]
+0xEAC8 U+600D # <cjk> [2000]
+0xEAC9 U+6014 # <cjk> [2000]
+0xEACA U+6018 # <cjk> [2000]
+0xEACB U+6033 # <cjk> [2000]
+0xEACC U+6035 # <cjk> [2000]
+0xEACD U+6047 # <cjk> [2000]
+0xEACE U+FA3D # CJK COMPATIBILITY IDEOGRAPH-FA3D [2000] [Unicode3.2]
+0xEACF U+609D # <cjk> [2000]
+0xEAD0 U+609E # <cjk> [2000]
+0xEAD1 U+60CB # <cjk> [2000]
+0xEAD2 U+60D4 # <cjk> [2000]
+0xEAD3 U+60D5 # <cjk> [2000]
+0xEAD4 U+60DD # <cjk> [2000]
+0xEAD5 U+60F8 # <cjk> [2000]
+0xEAD6 U+611C # <cjk> [2000]
+0xEAD7 U+612B # <cjk> [2000]
+0xEAD8 U+6130 # <cjk> [2000]
+0xEAD9 U+6137 # <cjk> [2000]
+0xEADA U+FA3E # CJK COMPATIBILITY IDEOGRAPH-FA3E [2000] [Unicode3.2]
+0xEADB U+618D # <cjk> [2000]
+0xEADC U+FA3F # CJK COMPATIBILITY IDEOGRAPH-FA3F [2000] [Unicode3.2]
+0xEADD U+61BC # <cjk> [2000]
+0xEADE U+61B9 # <cjk> [2000]
+0xEADF U+FA40 # CJK COMPATIBILITY IDEOGRAPH-FA40 [2000] [Unicode3.2]
+0xEAE0 U+6222 # <cjk> [2000]
+0xEAE1 U+623E # <cjk> [2000]
+0xEAE2 U+6243 # <cjk> [2000]
+0xEAE3 U+6256 # <cjk> [2000]
+0xEAE4 U+625A # <cjk> [2000]
+0xEAE5 U+626F # <cjk> [2000]
+0xEAE6 U+6285 # <cjk> [2000]
+0xEAE7 U+62C4 # <cjk> [2000]
+0xEAE8 U+62D6 # <cjk> [2000]
+0xEAE9 U+62FC # <cjk> [2000]
+0xEAEA U+630A # <cjk> [2000]
+0xEAEB U+6318 # <cjk> [2000]
+0xEAEC U+6339 # <cjk> [2000]
+0xEAED U+6343 # <cjk> [2000]
+0xEAEE U+6365 # <cjk> [2000]
+0xEAEF U+637C # <cjk> [2000]
+0xEAF0 U+63E5 # <cjk> [2000]
+0xEAF1 U+63ED # <cjk> [2000]
+0xEAF2 U+63F5 # <cjk> [2000]
+0xEAF3 U+6410 # <cjk> [2000]
+0xEAF4 U+6414 # <cjk> [2000]
+0xEAF5 U+6422 # <cjk> [2000]
+0xEAF6 U+6479 # <cjk> [2000]
+0xEAF7 U+6451 # <cjk> [2000]
+0xEAF8 U+6460 # <cjk> [2000]
+0xEAF9 U+646D # <cjk> [2000]
+0xEAFA U+64CE # <cjk> [2000]
+0xEAFB U+64BE # <cjk> [2000]
+0xEAFC U+64BF # <cjk> [2000]
+0xEB40 U+64C4 # <cjk> [2000]
+0xEB41 U+64CA # <cjk> [2000]
+0xEB42 U+64D0 # <cjk> [2000]
+0xEB43 U+64F7 # <cjk> [2000]
+0xEB44 U+64FB # <cjk> [2000]
+0xEB45 U+6522 # <cjk> [2000]
+0xEB46 U+6529 # <cjk> [2000]
+0xEB47 U+FA41 # CJK COMPATIBILITY IDEOGRAPH-FA41 [2000] [Unicode3.2]
+0xEB48 U+6567 # <cjk> [2000]
+0xEB49 U+659D # <cjk> [2000]
+0xEB4A U+FA42 # CJK COMPATIBILITY IDEOGRAPH-FA42 [2000] [Unicode3.2]
+0xEB4B U+6600 # <cjk> [2000]
+0xEB4C U+6609 # <cjk> [2000]
+0xEB4D U+6615 # <cjk> [2000]
+0xEB4E U+661E # <cjk> [2000]
+0xEB4F U+663A # <cjk> [2000]
+0xEB50 U+6622 # <cjk> [2000]
+0xEB51 U+6624 # <cjk> [2000]
+0xEB52 U+662B # <cjk> [2000]
+0xEB53 U+6630 # <cjk> [2000]
+0xEB54 U+6631 # <cjk> [2000]
+0xEB55 U+6633 # <cjk> [2000]
+0xEB56 U+66FB # <cjk> [2000]
+0xEB57 U+6648 # <cjk> [2000]
+0xEB58 U+664C # <cjk> [2000]
+0xEB59 U+231C4 # <cjk> [2000] [Unicode3.1]
+0xEB5A U+6659 # <cjk> [2000]
+0xEB5B U+665A # <cjk> [2000]
+0xEB5C U+6661 # <cjk> [2000]
+0xEB5D U+6665 # <cjk> [2000]
+0xEB5E U+6673 # <cjk> [2000]
+0xEB5F U+6677 # <cjk> [2000]
+0xEB60 U+6678 # <cjk> [2000]
+0xEB61 U+668D # <cjk> [2000]
+0xEB62 U+FA43 # CJK COMPATIBILITY IDEOGRAPH-FA43 [2000] [Unicode3.2]
+0xEB63 U+66A0 # <cjk> [2000]
+0xEB64 U+66B2 # <cjk> [2000]
+0xEB65 U+66BB # <cjk> [2000]
+0xEB66 U+66C6 # <cjk> [2000]
+0xEB67 U+66C8 # <cjk> [2000]
+0xEB68 U+3B22 # <cjk> [2000]
+0xEB69 U+66DB # <cjk> [2000]
+0xEB6A U+66E8 # <cjk> [2000]
+0xEB6B U+66FA # <cjk> [2000]
+0xEB6C U+6713 # <cjk> [2000]
+0xEB6D U+F929 # CJK COMPATIBILITY IDEOGRAPH-F929 [2000]
+0xEB6E U+6733 # <cjk> [2000]
+0xEB6F U+6766 # <cjk> [2000]
+0xEB70 U+6747 # <cjk> [2000]
+0xEB71 U+6748 # <cjk> [2000]
+0xEB72 U+677B # <cjk> [2000]
+0xEB73 U+6781 # <cjk> [2000]
+0xEB74 U+6793 # <cjk> [2000]
+0xEB75 U+6798 # <cjk> [2000]
+0xEB76 U+679B # <cjk> [2000]
+0xEB77 U+67BB # <cjk> [2000]
+0xEB78 U+67F9 # <cjk> [2000]
+0xEB79 U+67C0 # <cjk> [2000]
+0xEB7A U+67D7 # <cjk> [2000]
+0xEB7B U+67FC # <cjk> [2000]
+0xEB7C U+6801 # <cjk> [2000]
+0xEB7D U+6852 # <cjk> [2000]
+0xEB7E U+681D # <cjk> [2000]
+0xEB80 U+682C # <cjk> [2000]
+0xEB81 U+6831 # <cjk> [2000]
+0xEB82 U+685B # <cjk> [2000]
+0xEB83 U+6872 # <cjk> [2000]
+0xEB84 U+6875 # <cjk> [2000]
+0xEB85 U+FA44 # CJK COMPATIBILITY IDEOGRAPH-FA44 [2000] [Unicode3.2]
+0xEB86 U+68A3 # <cjk> [2000]
+0xEB87 U+68A5 # <cjk> [2000]
+0xEB88 U+68B2 # <cjk> [2000]
+0xEB89 U+68C8 # <cjk> [2000]
+0xEB8A U+68D0 # <cjk> [2000]
+0xEB8B U+68E8 # <cjk> [2000]
+0xEB8C U+68ED # <cjk> [2000]
+0xEB8D U+68F0 # <cjk> [2000]
+0xEB8E U+68F1 # <cjk> [2000]
+0xEB8F U+68FC # <cjk> [2000]
+0xEB90 U+690A # <cjk> [2000]
+0xEB91 U+6949 # <cjk> [2000]
+0xEB92 U+235C4 # <cjk> [2000] [Unicode3.1]
+0xEB93 U+6935 # <cjk> [2000]
+0xEB94 U+6942 # <cjk> [2000]
+0xEB95 U+6957 # <cjk> [2000]
+0xEB96 U+6963 # <cjk> [2000]
+0xEB97 U+6964 # <cjk> [2000]
+0xEB98 U+6968 # <cjk> [2000]
+0xEB99 U+6980 # <cjk> [2000]
+0xEB9A U+FA14 # CJK COMPATIBILITY IDEOGRAPH-FA14 [2000]
+0xEB9B U+69A5 # <cjk> [2000]
+0xEB9C U+69AD # <cjk> [2000]
+0xEB9D U+69CF # <cjk> [2000]
+0xEB9E U+3BB6 # <cjk> [2000]
+0xEB9F U+3BC3 # <cjk> [2000]
+0xEBA0 U+69E2 # <cjk> [2000]
+0xEBA1 U+69E9 # <cjk> [2000]
+0xEBA2 U+69EA # <cjk> [2000]
+0xEBA3 U+69F5 # <cjk> [2000]
+0xEBA4 U+69F6 # <cjk> [2000]
+0xEBA5 U+6A0F # <cjk> [2000]
+0xEBA6 U+6A15 # <cjk> [2000]
+0xEBA7 U+2373F # <cjk> [2000] [Unicode3.1]
+0xEBA8 U+6A3B # <cjk> [2000]
+0xEBA9 U+6A3E # <cjk> [2000]
+0xEBAA U+6A45 # <cjk> [2000]
+0xEBAB U+6A50 # <cjk> [2000]
+0xEBAC U+6A56 # <cjk> [2000]
+0xEBAD U+6A5B # <cjk> [2000]
+0xEBAE U+6A6B # <cjk> [2000]
+0xEBAF U+6A73 # <cjk> [2000]
+0xEBB0 U+23763 # <cjk> [2000] [Unicode3.1]
+0xEBB1 U+6A89 # <cjk> [2000]
+0xEBB2 U+6A94 # <cjk> [2000]
+0xEBB3 U+6A9D # <cjk> [2000]
+0xEBB4 U+6A9E # <cjk> [2000]
+0xEBB5 U+6AA5 # <cjk> [2000]
+0xEBB6 U+6AE4 # <cjk> [2000]
+0xEBB7 U+6AE7 # <cjk> [2000]
+0xEBB8 U+3C0F # <cjk> [2000]
+0xEBB9 U+F91D # CJK COMPATIBILITY IDEOGRAPH-F91D [2000]
+0xEBBA U+6B1B # <cjk> [2000]
+0xEBBB U+6B1E # <cjk> [2000]
+0xEBBC U+6B2C # <cjk> [2000]
+0xEBBD U+6B35 # <cjk> [2000]
+0xEBBE U+6B46 # <cjk> [2000]
+0xEBBF U+6B56 # <cjk> [2000]
+0xEBC0 U+6B60 # <cjk> [2000]
+0xEBC1 U+6B65 # <cjk> [2000]
+0xEBC2 U+6B67 # <cjk> [2000]
+0xEBC3 U+6B77 # <cjk> [2000]
+0xEBC4 U+6B82 # <cjk> [2000]
+0xEBC5 U+6BA9 # <cjk> [2000]
+0xEBC6 U+6BAD # <cjk> [2000]
+0xEBC7 U+F970 # CJK COMPATIBILITY IDEOGRAPH-F970 [2000]
+0xEBC8 U+6BCF # <cjk> [2000]
+0xEBC9 U+6BD6 # <cjk> [2000]
+0xEBCA U+6BD7 # <cjk> [2000]
+0xEBCB U+6BFF # <cjk> [2000]
+0xEBCC U+6C05 # <cjk> [2000]
+0xEBCD U+6C10 # <cjk> [2000]
+0xEBCE U+6C33 # <cjk> [2000]
+0xEBCF U+6C59 # <cjk> [2000]
+0xEBD0 U+6C5C # <cjk> [2000]
+0xEBD1 U+6CAA # <cjk> [2000]
+0xEBD2 U+6C74 # <cjk> [2000]
+0xEBD3 U+6C76 # <cjk> [2000]
+0xEBD4 U+6C85 # <cjk> [2000]
+0xEBD5 U+6C86 # <cjk> [2000]
+0xEBD6 U+6C98 # <cjk> [2000]
+0xEBD7 U+6C9C # <cjk> [2000]
+0xEBD8 U+6CFB # <cjk> [2000]
+0xEBD9 U+6CC6 # <cjk> [2000]
+0xEBDA U+6CD4 # <cjk> [2000]
+0xEBDB U+6CE0 # <cjk> [2000]
+0xEBDC U+6CEB # <cjk> [2000]
+0xEBDD U+6CEE # <cjk> [2000]
+0xEBDE U+23CFE # <cjk> [2000] [Unicode3.1]
+0xEBDF U+6D04 # <cjk> [2000]
+0xEBE0 U+6D0E # <cjk> [2000]
+0xEBE1 U+6D2E # <cjk> [2000]
+0xEBE2 U+6D31 # <cjk> [2000]
+0xEBE3 U+6D39 # <cjk> [2000]
+0xEBE4 U+6D3F # <cjk> [2000]
+0xEBE5 U+6D58 # <cjk> [2000]
+0xEBE6 U+6D65 # <cjk> [2000]
+0xEBE7 U+FA45 # CJK COMPATIBILITY IDEOGRAPH-FA45 [2000] [Unicode3.2]
+0xEBE8 U+6D82 # <cjk> [2000]
+0xEBE9 U+6D87 # <cjk> [2000]
+0xEBEA U+6D89 # <cjk> [2000]
+0xEBEB U+6D94 # <cjk> [2000]
+0xEBEC U+6DAA # <cjk> [2000]
+0xEBED U+6DAC # <cjk> [2000]
+0xEBEE U+6DBF # <cjk> [2000]
+0xEBEF U+6DC4 # <cjk> [2000]
+0xEBF0 U+6DD6 # <cjk> [2000]
+0xEBF1 U+6DDA # <cjk> [2000]
+0xEBF2 U+6DDB # <cjk> [2000]
+0xEBF3 U+6DDD # <cjk> [2000]
+0xEBF4 U+6DFC # <cjk> [2000]
+0xEBF5 U+FA46 # CJK COMPATIBILITY IDEOGRAPH-FA46 [2000] [Unicode3.2]
+0xEBF6 U+6E34 # <cjk> [2000]
+0xEBF7 U+6E44 # <cjk> [2000]
+0xEBF8 U+6E5C # <cjk> [2000]
+0xEBF9 U+6E5E # <cjk> [2000]
+0xEBFA U+6EAB # <cjk> [2000]
+0xEBFB U+6EB1 # <cjk> [2000]
+0xEBFC U+6EC1 # <cjk> [2000]
+0xEC40 U+6EC7 # <cjk> [2000]
+0xEC41 U+6ECE # <cjk> [2000]
+0xEC42 U+6F10 # <cjk> [2000]
+0xEC43 U+6F1A # <cjk> [2000]
+0xEC44 U+FA47 # CJK COMPATIBILITY IDEOGRAPH-FA47 [2000] [Unicode3.2]
+0xEC45 U+6F2A # <cjk> [2000]
+0xEC46 U+6F2F # <cjk> [2000]
+0xEC47 U+6F33 # <cjk> [2000]
+0xEC48 U+6F51 # <cjk> [2000]
+0xEC49 U+6F59 # <cjk> [2000]
+0xEC4A U+6F5E # <cjk> [2000]
+0xEC4B U+6F61 # <cjk> [2000]
+0xEC4C U+6F62 # <cjk> [2000]
+0xEC4D U+6F7E # <cjk> [2000]
+0xEC4E U+6F88 # <cjk> [2000]
+0xEC4F U+6F8C # <cjk> [2000]
+0xEC50 U+6F8D # <cjk> [2000]
+0xEC51 U+6F94 # <cjk> [2000]
+0xEC52 U+6FA0 # <cjk> [2000]
+0xEC53 U+6FA7 # <cjk> [2000]
+0xEC54 U+6FB6 # <cjk> [2000]
+0xEC55 U+6FBC # <cjk> [2000]
+0xEC56 U+6FC7 # <cjk> [2000]
+0xEC57 U+6FCA # <cjk> [2000]
+0xEC58 U+6FF9 # <cjk> [2000]
+0xEC59 U+6FF0 # <cjk> [2000]
+0xEC5A U+6FF5 # <cjk> [2000]
+0xEC5B U+7005 # <cjk> [2000]
+0xEC5C U+7006 # <cjk> [2000]
+0xEC5D U+7028 # <cjk> [2000]
+0xEC5E U+704A # <cjk> [2000]
+0xEC5F U+705D # <cjk> [2000]
+0xEC60 U+705E # <cjk> [2000]
+0xEC61 U+704E # <cjk> [2000]
+0xEC62 U+7064 # <cjk> [2000]
+0xEC63 U+7075 # <cjk> [2000]
+0xEC64 U+7085 # <cjk> [2000]
+0xEC65 U+70A4 # <cjk> [2000]
+0xEC66 U+70AB # <cjk> [2000]
+0xEC67 U+70B7 # <cjk> [2000]
+0xEC68 U+70D4 # <cjk> [2000]
+0xEC69 U+70D8 # <cjk> [2000]
+0xEC6A U+70E4 # <cjk> [2000]
+0xEC6B U+710F # <cjk> [2000]
+0xEC6C U+712B # <cjk> [2000]
+0xEC6D U+711E # <cjk> [2000]
+0xEC6E U+7120 # <cjk> [2000]
+0xEC6F U+712E # <cjk> [2000]
+0xEC70 U+7130 # <cjk> [2000]
+0xEC71 U+7146 # <cjk> [2000]
+0xEC72 U+7147 # <cjk> [2000]
+0xEC73 U+7151 # <cjk> [2000]
+0xEC74 U+FA48 # CJK COMPATIBILITY IDEOGRAPH-FA48 [2000] [Unicode3.2]
+0xEC75 U+7152 # <cjk> [2000]
+0xEC76 U+715C # <cjk> [2000]
+0xEC77 U+7160 # <cjk> [2000]
+0xEC78 U+7168 # <cjk> [2000]
+0xEC79 U+FA15 # CJK COMPATIBILITY IDEOGRAPH-FA15 [2000]
+0xEC7A U+7185 # <cjk> [2000]
+0xEC7B U+7187 # <cjk> [2000]
+0xEC7C U+7192 # <cjk> [2000]
+0xEC7D U+71C1 # <cjk> [2000]
+0xEC7E U+71BA # <cjk> [2000]
+0xEC80 U+71C4 # <cjk> [2000]
+0xEC81 U+71FE # <cjk> [2000]
+0xEC82 U+7200 # <cjk> [2000]
+0xEC83 U+7215 # <cjk> [2000]
+0xEC84 U+7255 # <cjk> [2000]
+0xEC85 U+7256 # <cjk> [2000]
+0xEC86 U+3E3F # <cjk> [2000]
+0xEC87 U+728D # <cjk> [2000]
+0xEC88 U+729B # <cjk> [2000]
+0xEC89 U+72BE # <cjk> [2000]
+0xEC8A U+72C0 # <cjk> [2000]
+0xEC8B U+72FB # <cjk> [2000]
+0xEC8C U+247F1 # <cjk> [2000] [Unicode3.1]
+0xEC8D U+7327 # <cjk> [2000]
+0xEC8E U+7328 # <cjk> [2000]
+0xEC8F U+FA16 # CJK COMPATIBILITY IDEOGRAPH-FA16 [2000]
+0xEC90 U+7350 # <cjk> [2000]
+0xEC91 U+7366 # <cjk> [2000]
+0xEC92 U+737C # <cjk> [2000]
+0xEC93 U+7395 # <cjk> [2000]
+0xEC94 U+739F # <cjk> [2000]
+0xEC95 U+73A0 # <cjk> [2000]
+0xEC96 U+73A2 # <cjk> [2000]
+0xEC97 U+73A6 # <cjk> [2000]
+0xEC98 U+73AB # <cjk> [2000]
+0xEC99 U+73C9 # <cjk> [2000]
+0xEC9A U+73CF # <cjk> [2000]
+0xEC9B U+73D6 # <cjk> [2000]
+0xEC9C U+73D9 # <cjk> [2000]
+0xEC9D U+73E3 # <cjk> [2000]
+0xEC9E U+73E9 # <cjk> [2000]
+0xEC9F U+7407 # <cjk> [2000]
+0xECA0 U+740A # <cjk> [2000]
+0xECA1 U+741A # <cjk> [2000]
+0xECA2 U+741B # <cjk> [2000]
+0xECA3 U+FA4A # CJK COMPATIBILITY IDEOGRAPH-FA4A [2000] [Unicode3.2]
+0xECA4 U+7426 # <cjk> [2000]
+0xECA5 U+7428 # <cjk> [2000]
+0xECA6 U+742A # <cjk> [2000]
+0xECA7 U+742B # <cjk> [2000]
+0xECA8 U+742C # <cjk> [2000]
+0xECA9 U+742E # <cjk> [2000]
+0xECAA U+742F # <cjk> [2000]
+0xECAB U+7430 # <cjk> [2000]
+0xECAC U+7444 # <cjk> [2000]
+0xECAD U+7446 # <cjk> [2000]
+0xECAE U+7447 # <cjk> [2000]
+0xECAF U+744B # <cjk> [2000]
+0xECB0 U+7457 # <cjk> [2000]
+0xECB1 U+7462 # <cjk> [2000]
+0xECB2 U+746B # <cjk> [2000]
+0xECB3 U+746D # <cjk> [2000]
+0xECB4 U+7486 # <cjk> [2000]
+0xECB5 U+7487 # <cjk> [2000]
+0xECB6 U+7489 # <cjk> [2000]
+0xECB7 U+7498 # <cjk> [2000]
+0xECB8 U+749C # <cjk> [2000]
+0xECB9 U+749F # <cjk> [2000]
+0xECBA U+74A3 # <cjk> [2000]
+0xECBB U+7490 # <cjk> [2000]
+0xECBC U+74A6 # <cjk> [2000]
+0xECBD U+74A8 # <cjk> [2000]
+0xECBE U+74A9 # <cjk> [2000]
+0xECBF U+74B5 # <cjk> [2000]
+0xECC0 U+74BF # <cjk> [2000]
+0xECC1 U+74C8 # <cjk> [2000]
+0xECC2 U+74C9 # <cjk> [2000]
+0xECC3 U+74DA # <cjk> [2000]
+0xECC4 U+74FF # <cjk> [2000]
+0xECC5 U+7501 # <cjk> [2000]
+0xECC6 U+7517 # <cjk> [2000]
+0xECC7 U+752F # <cjk> [2000]
+0xECC8 U+756F # <cjk> [2000]
+0xECC9 U+7579 # <cjk> [2000]
+0xECCA U+7592 # <cjk> [2000]
+0xECCB U+3F72 # <cjk> [2000]
+0xECCC U+75CE # <cjk> [2000]
+0xECCD U+75E4 # <cjk> [2000]
+0xECCE U+7600 # <cjk> [2000]
+0xECCF U+7602 # <cjk> [2000]
+0xECD0 U+7608 # <cjk> [2000]
+0xECD1 U+7615 # <cjk> [2000]
+0xECD2 U+7616 # <cjk> [2000]
+0xECD3 U+7619 # <cjk> [2000]
+0xECD4 U+761E # <cjk> [2000]
+0xECD5 U+762D # <cjk> [2000]
+0xECD6 U+7635 # <cjk> [2000]
+0xECD7 U+7643 # <cjk> [2000]
+0xECD8 U+764B # <cjk> [2000]
+0xECD9 U+7664 # <cjk> [2000]
+0xECDA U+7665 # <cjk> [2000]
+0xECDB U+766D # <cjk> [2000]
+0xECDC U+766F # <cjk> [2000]
+0xECDD U+7671 # <cjk> [2000]
+0xECDE U+7681 # <cjk> [2000]
+0xECDF U+769B # <cjk> [2000]
+0xECE0 U+769D # <cjk> [2000]
+0xECE1 U+769E # <cjk> [2000]
+0xECE2 U+76A6 # <cjk> [2000]
+0xECE3 U+76AA # <cjk> [2000]
+0xECE4 U+76B6 # <cjk> [2000]
+0xECE5 U+76C5 # <cjk> [2000]
+0xECE6 U+76CC # <cjk> [2000]
+0xECE7 U+76CE # <cjk> [2000]
+0xECE8 U+76D4 # <cjk> [2000]
+0xECE9 U+76E6 # <cjk> [2000]
+0xECEA U+76F1 # <cjk> [2000]
+0xECEB U+76FC # <cjk> [2000]
+0xECEC U+770A # <cjk> [2000]
+0xECED U+7719 # <cjk> [2000]
+0xECEE U+7734 # <cjk> [2000]
+0xECEF U+7736 # <cjk> [2000]
+0xECF0 U+7746 # <cjk> [2000]
+0xECF1 U+774D # <cjk> [2000]
+0xECF2 U+774E # <cjk> [2000]
+0xECF3 U+775C # <cjk> [2000]
+0xECF4 U+775F # <cjk> [2000]
+0xECF5 U+7762 # <cjk> [2000]
+0xECF6 U+777A # <cjk> [2000]
+0xECF7 U+7780 # <cjk> [2000]
+0xECF8 U+7794 # <cjk> [2000]
+0xECF9 U+77AA # <cjk> [2000]
+0xECFA U+77E0 # <cjk> [2000]
+0xECFB U+782D # <cjk> [2000]
+0xECFC U+2548E # <cjk> [2000] [Unicode3.1]
+0xED40 U+7843 # <cjk> [2000]
+0xED41 U+784E # <cjk> [2000]
+0xED42 U+784F # <cjk> [2000]
+0xED43 U+7851 # <cjk> [2000]
+0xED44 U+7868 # <cjk> [2000]
+0xED45 U+786E # <cjk> [2000]
+0xED46 U+FA4B # CJK COMPATIBILITY IDEOGRAPH-FA4B [2000] [Unicode3.2]
+0xED47 U+78B0 # <cjk> [2000]
+0xED48 U+2550E # <cjk> [2000] [Unicode3.1]
+0xED49 U+78AD # <cjk> [2000]
+0xED4A U+78E4 # <cjk> [2000]
+0xED4B U+78F2 # <cjk> [2000]
+0xED4C U+7900 # <cjk> [2000]
+0xED4D U+78F7 # <cjk> [2000]
+0xED4E U+791C # <cjk> [2000]
+0xED4F U+792E # <cjk> [2000]
+0xED50 U+7931 # <cjk> [2000]
+0xED51 U+7934 # <cjk> [2000]
+0xED52 U+FA4C # CJK COMPATIBILITY IDEOGRAPH-FA4C [2000] [Unicode3.2]
+0xED53 U+FA4D # CJK COMPATIBILITY IDEOGRAPH-FA4D [2000] [Unicode3.2]
+0xED54 U+7945 # <cjk> [2000]
+0xED55 U+7946 # <cjk> [2000]
+0xED56 U+FA4E # CJK COMPATIBILITY IDEOGRAPH-FA4E [2000] [Unicode3.2]
+0xED57 U+FA4F # CJK COMPATIBILITY IDEOGRAPH-FA4F [2000] [Unicode3.2]
+0xED58 U+FA50 # CJK COMPATIBILITY IDEOGRAPH-FA50 [2000] [Unicode3.2]
+0xED59 U+795C # <cjk> [2000]
+0xED5A U+FA51 # CJK COMPATIBILITY IDEOGRAPH-FA51 [2000] [Unicode3.2]
+0xED5B U+FA19 # CJK COMPATIBILITY IDEOGRAPH-FA19 [2000]
+0xED5C U+FA1A # CJK COMPATIBILITY IDEOGRAPH-FA1A [2000]
+0xED5D U+7979 # <cjk> [2000]
+0xED5E U+FA52 # CJK COMPATIBILITY IDEOGRAPH-FA52 [2000] [Unicode3.2]
+0xED5F U+FA53 # CJK COMPATIBILITY IDEOGRAPH-FA53 [2000] [Unicode3.2]
+0xED60 U+FA1B # CJK COMPATIBILITY IDEOGRAPH-FA1B [2000]
+0xED61 U+7998 # <cjk> [2000]
+0xED62 U+79B1 # <cjk> [2000]
+0xED63 U+79B8 # <cjk> [2000]
+0xED64 U+79C8 # <cjk> [2000]
+0xED65 U+79CA # <cjk> [2000]
+0xED66 U+25771 # <cjk> [2000] [Unicode3.1]
+0xED67 U+79D4 # <cjk> [2000]
+0xED68 U+79DE # <cjk> [2000]
+0xED69 U+79EB # <cjk> [2000]
+0xED6A U+79ED # <cjk> [2000]
+0xED6B U+7A03 # <cjk> [2000]
+0xED6C U+FA54 # CJK COMPATIBILITY IDEOGRAPH-FA54 [2000] [Unicode3.2]
+0xED6D U+7A39 # <cjk> [2000]
+0xED6E U+7A5D # <cjk> [2000]
+0xED6F U+7A6D # <cjk> [2000]
+0xED70 U+FA55 # CJK COMPATIBILITY IDEOGRAPH-FA55 [2000] [Unicode3.2]
+0xED71 U+7A85 # <cjk> [2000]
+0xED72 U+7AA0 # <cjk> [2000]
+0xED73 U+259C4 # <cjk> [2000] [Unicode3.1]
+0xED74 U+7AB3 # <cjk> [2000]
+0xED75 U+7ABB # <cjk> [2000]
+0xED76 U+7ACE # <cjk> [2000]
+0xED77 U+7AEB # <cjk> [2000]
+0xED78 U+7AFD # <cjk> [2000]
+0xED79 U+7B12 # <cjk> [2000]
+0xED7A U+7B2D # <cjk> [2000]
+0xED7B U+7B3B # <cjk> [2000]
+0xED7C U+7B47 # <cjk> [2000]
+0xED7D U+7B4E # <cjk> [2000]
+0xED7E U+7B60 # <cjk> [2000]
+0xED80 U+7B6D # <cjk> [2000]
+0xED81 U+7B6F # <cjk> [2000]
+0xED82 U+7B72 # <cjk> [2000]
+0xED83 U+7B9E # <cjk> [2000]
+0xED84 U+FA56 # CJK COMPATIBILITY IDEOGRAPH-FA56 [2000] [Unicode3.2]
+0xED85 U+7BD7 # <cjk> [2000]
+0xED86 U+7BD9 # <cjk> [2000]
+0xED87 U+7C01 # <cjk> [2000]
+0xED88 U+7C31 # <cjk> [2000]
+0xED89 U+7C1E # <cjk> [2000]
+0xED8A U+7C20 # <cjk> [2000]
+0xED8B U+7C33 # <cjk> [2000]
+0xED8C U+7C36 # <cjk> [2000]
+0xED8D U+4264 # <cjk> [2000]
+0xED8E U+25DA1 # <cjk> [2000] [Unicode3.1]
+0xED8F U+7C59 # <cjk> [2000]
+0xED90 U+7C6D # <cjk> [2000]
+0xED91 U+7C79 # <cjk> [2000]
+0xED92 U+7C8F # <cjk> [2000]
+0xED93 U+7C94 # <cjk> [2000]
+0xED94 U+7CA0 # <cjk> [2000]
+0xED95 U+7CBC # <cjk> [2000]
+0xED96 U+7CD5 # <cjk> [2000]
+0xED97 U+7CD9 # <cjk> [2000]
+0xED98 U+7CDD # <cjk> [2000]
+0xED99 U+7D07 # <cjk> [2000]
+0xED9A U+7D08 # <cjk> [2000]
+0xED9B U+7D13 # <cjk> [2000]
+0xED9C U+7D1D # <cjk> [2000]
+0xED9D U+7D23 # <cjk> [2000]
+0xED9E U+7D31 # <cjk> [2000]
+0xED9F U+7D41 # <cjk> [2000]
+0xEDA0 U+7D48 # <cjk> [2000]
+0xEDA1 U+7D53 # <cjk> [2000]
+0xEDA2 U+7D5C # <cjk> [2000]
+0xEDA3 U+7D7A # <cjk> [2000]
+0xEDA4 U+7D83 # <cjk> [2000]
+0xEDA5 U+7D8B # <cjk> [2000]
+0xEDA6 U+7DA0 # <cjk> [2000]
+0xEDA7 U+7DA6 # <cjk> [2000]
+0xEDA8 U+7DC2 # <cjk> [2000]
+0xEDA9 U+7DCC # <cjk> [2000]
+0xEDAA U+7DD6 # <cjk> [2000]
+0xEDAB U+7DE3 # <cjk> [2000]
+0xEDAC U+FA57 # CJK COMPATIBILITY IDEOGRAPH-FA57 [2000] [Unicode3.2]
+0xEDAD U+7E28 # <cjk> [2000]
+0xEDAE U+7E08 # <cjk> [2000]
+0xEDAF U+7E11 # <cjk> [2000]
+0xEDB0 U+7E15 # <cjk> [2000]
+0xEDB1 U+FA59 # CJK COMPATIBILITY IDEOGRAPH-FA59 [2000] [Unicode3.2]
+0xEDB2 U+7E47 # <cjk> [2000]
+0xEDB3 U+7E52 # <cjk> [2000]
+0xEDB4 U+7E61 # <cjk> [2000]
+0xEDB5 U+7E8A # <cjk> [2000]
+0xEDB6 U+7E8D # <cjk> [2000]
+0xEDB7 U+7F47 # <cjk> [2000]
+0xEDB8 U+FA5A # CJK COMPATIBILITY IDEOGRAPH-FA5A [2000] [Unicode3.2]
+0xEDB9 U+7F91 # <cjk> [2000]
+0xEDBA U+7F97 # <cjk> [2000]
+0xEDBB U+7FBF # <cjk> [2000]
+0xEDBC U+7FCE # <cjk> [2000]
+0xEDBD U+7FDB # <cjk> [2000]
+0xEDBE U+7FDF # <cjk> [2000]
+0xEDBF U+7FEC # <cjk> [2000]
+0xEDC0 U+7FEE # <cjk> [2000]
+0xEDC1 U+7FFA # <cjk> [2000]
+0xEDC2 U+FA5B # CJK COMPATIBILITY IDEOGRAPH-FA5B [2000] [Unicode3.2]
+0xEDC3 U+8014 # <cjk> [2000]
+0xEDC4 U+8026 # <cjk> [2000]
+0xEDC5 U+8035 # <cjk> [2000]
+0xEDC6 U+8037 # <cjk> [2000]
+0xEDC7 U+803C # <cjk> [2000]
+0xEDC8 U+80CA # <cjk> [2000]
+0xEDC9 U+80D7 # <cjk> [2000]
+0xEDCA U+80E0 # <cjk> [2000]
+0xEDCB U+80F3 # <cjk> [2000]
+0xEDCC U+8118 # <cjk> [2000]
+0xEDCD U+814A # <cjk> [2000]
+0xEDCE U+8160 # <cjk> [2000]
+0xEDCF U+8167 # <cjk> [2000]
+0xEDD0 U+8168 # <cjk> [2000]
+0xEDD1 U+816D # <cjk> [2000]
+0xEDD2 U+81BB # <cjk> [2000]
+0xEDD3 U+81CA # <cjk> [2000]
+0xEDD4 U+81CF # <cjk> [2000]
+0xEDD5 U+81D7 # <cjk> [2000]
+0xEDD6 U+FA5C # CJK COMPATIBILITY IDEOGRAPH-FA5C [2000] [Unicode3.2]
+0xEDD7 U+4453 # <cjk> [2000]
+0xEDD8 U+445B # <cjk> [2000]
+0xEDD9 U+8260 # <cjk> [2000]
+0xEDDA U+8274 # <cjk> [2000]
+0xEDDB U+26AFF # <cjk> [2000] [Unicode3.1]
+0xEDDC U+828E # <cjk> [2000]
+0xEDDD U+82A1 # <cjk> [2000]
+0xEDDE U+82A3 # <cjk> [2000]
+0xEDDF U+82A4 # <cjk> [2000]
+0xEDE0 U+82A9 # <cjk> [2000]
+0xEDE1 U+82AE # <cjk> [2000]
+0xEDE2 U+82B7 # <cjk> [2000]
+0xEDE3 U+82BE # <cjk> [2000]
+0xEDE4 U+82BF # <cjk> [2000]
+0xEDE5 U+82C6 # <cjk> [2000]
+0xEDE6 U+82D5 # <cjk> [2000]
+0xEDE7 U+82FD # <cjk> [2000]
+0xEDE8 U+82FE # <cjk> [2000]
+0xEDE9 U+8300 # <cjk> [2000]
+0xEDEA U+8301 # <cjk> [2000]
+0xEDEB U+8362 # <cjk> [2000]
+0xEDEC U+8322 # <cjk> [2000]
+0xEDED U+832D # <cjk> [2000]
+0xEDEE U+833A # <cjk> [2000]
+0xEDEF U+8343 # <cjk> [2000]
+0xEDF0 U+8347 # <cjk> [2000]
+0xEDF1 U+8351 # <cjk> [2000]
+0xEDF2 U+8355 # <cjk> [2000]
+0xEDF3 U+837D # <cjk> [2000]
+0xEDF4 U+8386 # <cjk> [2000]
+0xEDF5 U+8392 # <cjk> [2000]
+0xEDF6 U+8398 # <cjk> [2000]
+0xEDF7 U+83A7 # <cjk> [2000]
+0xEDF8 U+83A9 # <cjk> [2000]
+0xEDF9 U+83BF # <cjk> [2000]
+0xEDFA U+83C0 # <cjk> [2000]
+0xEDFB U+83C7 # <cjk> [2000]
+0xEDFC U+83CF # <cjk> [2000]
+0xEE40 U+83D1 # <cjk> [2000]
+0xEE41 U+83E1 # <cjk> [2000]
+0xEE42 U+83EA # <cjk> [2000]
+0xEE43 U+8401 # <cjk> [2000]
+0xEE44 U+8406 # <cjk> [2000]
+0xEE45 U+840A # <cjk> [2000]
+0xEE46 U+FA5F # CJK COMPATIBILITY IDEOGRAPH-FA5F [2000] [Unicode3.2]
+0xEE47 U+8448 # <cjk> [2000]
+0xEE48 U+845F # <cjk> [2000]
+0xEE49 U+8470 # <cjk> [2000]
+0xEE4A U+8473 # <cjk> [2000]
+0xEE4B U+8485 # <cjk> [2000]
+0xEE4C U+849E # <cjk> [2000]
+0xEE4D U+84AF # <cjk> [2000]
+0xEE4E U+84B4 # <cjk> [2000]
+0xEE4F U+84BA # <cjk> [2000]
+0xEE50 U+84C0 # <cjk> [2000]
+0xEE51 U+84C2 # <cjk> [2000]
+0xEE52 U+26E40 # <cjk> [2000] [Unicode3.1]
+0xEE53 U+8532 # <cjk> [2000]
+0xEE54 U+851E # <cjk> [2000]
+0xEE55 U+8523 # <cjk> [2000]
+0xEE56 U+852F # <cjk> [2000]
+0xEE57 U+8559 # <cjk> [2000]
+0xEE58 U+8564 # <cjk> [2000]
+0xEE59 U+FA1F # CJK COMPATIBILITY IDEOGRAPH-FA1F [2000]
+0xEE5A U+85AD # <cjk> [2000]
+0xEE5B U+857A # <cjk> [2000]
+0xEE5C U+858C # <cjk> [2000]
+0xEE5D U+858F # <cjk> [2000]
+0xEE5E U+85A2 # <cjk> [2000]
+0xEE5F U+85B0 # <cjk> [2000]
+0xEE60 U+85CB # <cjk> [2000]
+0xEE61 U+85CE # <cjk> [2000]
+0xEE62 U+85ED # <cjk> [2000]
+0xEE63 U+8612 # <cjk> [2000]
+0xEE64 U+85FF # <cjk> [2000]
+0xEE65 U+8604 # <cjk> [2000]
+0xEE66 U+8605 # <cjk> [2000]
+0xEE67 U+8610 # <cjk> [2000]
+0xEE68 U+270F4 # <cjk> [2000] [Unicode3.1]
+0xEE69 U+8618 # <cjk> [2000]
+0xEE6A U+8629 # <cjk> [2000]
+0xEE6B U+8638 # <cjk> [2000]
+0xEE6C U+8657 # <cjk> [2000]
+0xEE6D U+865B # <cjk> [2000]
+0xEE6E U+F936 # CJK COMPATIBILITY IDEOGRAPH-F936 [2000]
+0xEE6F U+8662 # <cjk> [2000]
+0xEE70 U+459D # <cjk> [2000]
+0xEE71 U+866C # <cjk> [2000]
+0xEE72 U+8675 # <cjk> [2000]
+0xEE73 U+8698 # <cjk> [2000]
+0xEE74 U+86B8 # <cjk> [2000]
+0xEE75 U+86FA # <cjk> [2000]
+0xEE76 U+86FC # <cjk> [2000]
+0xEE77 U+86FD # <cjk> [2000]
+0xEE78 U+870B # <cjk> [2000]
+0xEE79 U+8771 # <cjk> [2000]
+0xEE7A U+8787 # <cjk> [2000]
+0xEE7B U+8788 # <cjk> [2000]
+0xEE7C U+87AC # <cjk> [2000]
+0xEE7D U+87AD # <cjk> [2000]
+0xEE7E U+87B5 # <cjk> [2000]
+0xEE80 U+45EA # <cjk> [2000]
+0xEE81 U+87D6 # <cjk> [2000]
+0xEE82 U+87EC # <cjk> [2000]
+0xEE83 U+8806 # <cjk> [2000]
+0xEE84 U+880A # <cjk> [2000]
+0xEE85 U+8810 # <cjk> [2000]
+0xEE86 U+8814 # <cjk> [2000]
+0xEE87 U+881F # <cjk> [2000]
+0xEE88 U+8898 # <cjk> [2000]
+0xEE89 U+88AA # <cjk> [2000]
+0xEE8A U+88CA # <cjk> [2000]
+0xEE8B U+88CE # <cjk> [2000]
+0xEE8C U+27684 # <cjk> [2000] [Unicode3.1]
+0xEE8D U+88F5 # <cjk> [2000]
+0xEE8E U+891C # <cjk> [2000]
+0xEE8F U+FA60 # CJK COMPATIBILITY IDEOGRAPH-FA60 [2000] [Unicode3.2]
+0xEE90 U+8918 # <cjk> [2000]
+0xEE91 U+8919 # <cjk> [2000]
+0xEE92 U+891A # <cjk> [2000]
+0xEE93 U+8927 # <cjk> [2000]
+0xEE94 U+8930 # <cjk> [2000]
+0xEE95 U+8932 # <cjk> [2000]
+0xEE96 U+8939 # <cjk> [2000]
+0xEE97 U+8940 # <cjk> [2000]
+0xEE98 U+8994 # <cjk> [2000]
+0xEE99 U+FA61 # CJK COMPATIBILITY IDEOGRAPH-FA61 [2000] [Unicode3.2]
+0xEE9A U+89D4 # <cjk> [2000]
+0xEE9B U+89E5 # <cjk> [2000]
+0xEE9C U+89F6 # <cjk> [2000]
+0xEE9D U+8A12 # <cjk> [2000]
+0xEE9E U+8A15 # <cjk> [2000]
+0xEE9F U+8A22 # <cjk> [2000]
+0xEEA0 U+8A37 # <cjk> [2000]
+0xEEA1 U+8A47 # <cjk> [2000]
+0xEEA2 U+8A4E # <cjk> [2000]
+0xEEA3 U+8A5D # <cjk> [2000]
+0xEEA4 U+8A61 # <cjk> [2000]
+0xEEA5 U+8A75 # <cjk> [2000]
+0xEEA6 U+8A79 # <cjk> [2000]
+0xEEA7 U+8AA7 # <cjk> [2000]
+0xEEA8 U+8AD0 # <cjk> [2000]
+0xEEA9 U+8ADF # <cjk> [2000]
+0xEEAA U+8AF4 # <cjk> [2000]
+0xEEAB U+8AF6 # <cjk> [2000]
+0xEEAC U+FA22 # CJK COMPATIBILITY IDEOGRAPH-FA22 [2000]
+0xEEAD U+FA62 # CJK COMPATIBILITY IDEOGRAPH-FA62 [2000] [Unicode3.2]
+0xEEAE U+FA63 # CJK COMPATIBILITY IDEOGRAPH-FA63 [2000] [Unicode3.2]
+0xEEAF U+8B46 # <cjk> [2000]
+0xEEB0 U+8B54 # <cjk> [2000]
+0xEEB1 U+8B59 # <cjk> [2000]
+0xEEB2 U+8B69 # <cjk> [2000]
+0xEEB3 U+8B9D # <cjk> [2000]
+0xEEB4 U+8C49 # <cjk> [2000]
+0xEEB5 U+8C68 # <cjk> [2000]
+0xEEB6 U+FA64 # CJK COMPATIBILITY IDEOGRAPH-FA64 [2000] [Unicode3.2]
+0xEEB7 U+8CE1 # <cjk> [2000]
+0xEEB8 U+8CF4 # <cjk> [2000]
+0xEEB9 U+8CF8 # <cjk> [2000]
+0xEEBA U+8CFE # <cjk> [2000]
+0xEEBB U+FA65 # CJK COMPATIBILITY IDEOGRAPH-FA65 [2000] [Unicode3.2]
+0xEEBC U+8D12 # <cjk> [2000]
+0xEEBD U+8D1B # <cjk> [2000]
+0xEEBE U+8DAF # <cjk> [2000]
+0xEEBF U+8DCE # <cjk> [2000]
+0xEEC0 U+8DD1 # <cjk> [2000]
+0xEEC1 U+8DD7 # <cjk> [2000]
+0xEEC2 U+8E20 # <cjk> [2000]
+0xEEC3 U+8E23 # <cjk> [2000]
+0xEEC4 U+8E3D # <cjk> [2000]
+0xEEC5 U+8E70 # <cjk> [2000]
+0xEEC6 U+8E7B # <cjk> [2000]
+0xEEC7 U+28277 # <cjk> [2000] [Unicode3.1]
+0xEEC8 U+8EC0 # <cjk> [2000]
+0xEEC9 U+4844 # <cjk> [2000]
+0xEECA U+8EFA # <cjk> [2000]
+0xEECB U+8F1E # <cjk> [2000]
+0xEECC U+8F2D # <cjk> [2000]
+0xEECD U+8F36 # <cjk> [2000]
+0xEECE U+8F54 # <cjk> [2000]
+0xEECF U+283CD # <cjk> [2000] [Unicode3.1]
+0xEED0 U+8FA6 # <cjk> [2000]
+0xEED1 U+8FB5 # <cjk> [2000]
+0xEED2 U+8FE4 # <cjk> [2000]
+0xEED3 U+8FE8 # <cjk> [2000]
+0xEED4 U+8FEE # <cjk> [2000]
+0xEED5 U+9008 # <cjk> [2000]
+0xEED6 U+902D # <cjk> [2000]
+0xEED7 U+FA67 # CJK COMPATIBILITY IDEOGRAPH-FA67 [2000] [Unicode3.2]
+0xEED8 U+9088 # <cjk> [2000]
+0xEED9 U+9095 # <cjk> [2000]
+0xEEDA U+9097 # <cjk> [2000]
+0xEEDB U+9099 # <cjk> [2000]
+0xEEDC U+909B # <cjk> [2000]
+0xEEDD U+90A2 # <cjk> [2000]
+0xEEDE U+90B3 # <cjk> [2000]
+0xEEDF U+90BE # <cjk> [2000]
+0xEEE0 U+90C4 # <cjk> [2000]
+0xEEE1 U+90C5 # <cjk> [2000]
+0xEEE2 U+90C7 # <cjk> [2000]
+0xEEE3 U+90D7 # <cjk> [2000]
+0xEEE4 U+90DD # <cjk> [2000]
+0xEEE5 U+90DE # <cjk> [2000]
+0xEEE6 U+90EF # <cjk> [2000]
+0xEEE7 U+90F4 # <cjk> [2000]
+0xEEE8 U+FA26 # CJK COMPATIBILITY IDEOGRAPH-FA26 [2000]
+0xEEE9 U+9114 # <cjk> [2000]
+0xEEEA U+9115 # <cjk> [2000]
+0xEEEB U+9116 # <cjk> [2000]
+0xEEEC U+9122 # <cjk> [2000]
+0xEEED U+9123 # <cjk> [2000]
+0xEEEE U+9127 # <cjk> [2000]
+0xEEEF U+912F # <cjk> [2000]
+0xEEF0 U+9131 # <cjk> [2000]
+0xEEF1 U+9134 # <cjk> [2000]
+0xEEF2 U+913D # <cjk> [2000]
+0xEEF3 U+9148 # <cjk> [2000]
+0xEEF4 U+915B # <cjk> [2000]
+0xEEF5 U+9183 # <cjk> [2000]
+0xEEF6 U+919E # <cjk> [2000]
+0xEEF7 U+91AC # <cjk> [2000]
+0xEEF8 U+91B1 # <cjk> [2000]
+0xEEF9 U+91BC # <cjk> [2000]
+0xEEFA U+91D7 # <cjk> [2000]
+0xEEFB U+91FB # <cjk> [2000]
+0xEEFC U+91E4 # <cjk> [2000]
+0xEF40 U+91E5 # <cjk> [2000]
+0xEF41 U+91ED # <cjk> [2000]
+0xEF42 U+91F1 # <cjk> [2000]
+0xEF43 U+9207 # <cjk> [2000]
+0xEF44 U+9210 # <cjk> [2000]
+0xEF45 U+9238 # <cjk> [2000]
+0xEF46 U+9239 # <cjk> [2000]
+0xEF47 U+923A # <cjk> [2000]
+0xEF48 U+923C # <cjk> [2000]
+0xEF49 U+9240 # <cjk> [2000]
+0xEF4A U+9243 # <cjk> [2000]
+0xEF4B U+924F # <cjk> [2000]
+0xEF4C U+9278 # <cjk> [2000]
+0xEF4D U+9288 # <cjk> [2000]
+0xEF4E U+92C2 # <cjk> [2000]
+0xEF4F U+92CB # <cjk> [2000]
+0xEF50 U+92CC # <cjk> [2000]
+0xEF51 U+92D3 # <cjk> [2000]
+0xEF52 U+92E0 # <cjk> [2000]
+0xEF53 U+92FF # <cjk> [2000]
+0xEF54 U+9304 # <cjk> [2000]
+0xEF55 U+931F # <cjk> [2000]
+0xEF56 U+9321 # <cjk> [2000]
+0xEF57 U+9325 # <cjk> [2000]
+0xEF58 U+9348 # <cjk> [2000]
+0xEF59 U+9349 # <cjk> [2000]
+0xEF5A U+934A # <cjk> [2000]
+0xEF5B U+9364 # <cjk> [2000]
+0xEF5C U+9365 # <cjk> [2000]
+0xEF5D U+936A # <cjk> [2000]
+0xEF5E U+9370 # <cjk> [2000]
+0xEF5F U+939B # <cjk> [2000]
+0xEF60 U+93A3 # <cjk> [2000]
+0xEF61 U+93BA # <cjk> [2000]
+0xEF62 U+93C6 # <cjk> [2000]
+0xEF63 U+93DE # <cjk> [2000]
+0xEF64 U+93DF # <cjk> [2000]
+0xEF65 U+9404 # <cjk> [2000]
+0xEF66 U+93FD # <cjk> [2000]
+0xEF67 U+9433 # <cjk> [2000]
+0xEF68 U+944A # <cjk> [2000]
+0xEF69 U+9463 # <cjk> [2000]
+0xEF6A U+946B # <cjk> [2000]
+0xEF6B U+9471 # <cjk> [2000]
+0xEF6C U+9472 # <cjk> [2000]
+0xEF6D U+958E # <cjk> [2000]
+0xEF6E U+959F # <cjk> [2000]
+0xEF6F U+95A6 # <cjk> [2000]
+0xEF70 U+95A9 # <cjk> [2000]
+0xEF71 U+95AC # <cjk> [2000]
+0xEF72 U+95B6 # <cjk> [2000]
+0xEF73 U+95BD # <cjk> [2000]
+0xEF74 U+95CB # <cjk> [2000]
+0xEF75 U+95D0 # <cjk> [2000]
+0xEF76 U+95D3 # <cjk> [2000]
+0xEF77 U+49B0 # <cjk> [2000]
+0xEF78 U+95DA # <cjk> [2000]
+0xEF79 U+95DE # <cjk> [2000]
+0xEF7A U+9658 # <cjk> [2000]
+0xEF7B U+9684 # <cjk> [2000]
+0xEF7C U+F9DC # CJK COMPATIBILITY IDEOGRAPH-F9DC [2000]
+0xEF7D U+969D # <cjk> [2000]
+0xEF7E U+96A4 # <cjk> [2000]
+0xEF80 U+96A5 # <cjk> [2000]
+0xEF81 U+96D2 # <cjk> [2000]
+0xEF82 U+96DE # <cjk> [2000]
+0xEF83 U+FA68 # CJK COMPATIBILITY IDEOGRAPH-FA68 [2000] [Unicode3.2]
+0xEF84 U+96E9 # <cjk> [2000]
+0xEF85 U+96EF # <cjk> [2000]
+0xEF86 U+9733 # <cjk> [2000]
+0xEF87 U+973B # <cjk> [2000]
+0xEF88 U+974D # <cjk> [2000]
+0xEF89 U+974E # <cjk> [2000]
+0xEF8A U+974F # <cjk> [2000]
+0xEF8B U+975A # <cjk> [2000]
+0xEF8C U+976E # <cjk> [2000]
+0xEF8D U+9773 # <cjk> [2000]
+0xEF8E U+9795 # <cjk> [2000]
+0xEF8F U+97AE # <cjk> [2000]
+0xEF90 U+97BA # <cjk> [2000]
+0xEF91 U+97C1 # <cjk> [2000]
+0xEF92 U+97C9 # <cjk> [2000]
+0xEF93 U+97DE # <cjk> [2000]
+0xEF94 U+97DB # <cjk> [2000]
+0xEF95 U+97F4 # <cjk> [2000]
+0xEF96 U+FA69 # CJK COMPATIBILITY IDEOGRAPH-FA69 [2000] [Unicode3.2]
+0xEF97 U+980A # <cjk> [2000]
+0xEF98 U+981E # <cjk> [2000]
+0xEF99 U+982B # <cjk> [2000]
+0xEF9A U+9830 # <cjk> [2000]
+0xEF9B U+FA6A # CJK COMPATIBILITY IDEOGRAPH-FA6A [2000] [Unicode3.2]
+0xEF9C U+9852 # <cjk> [2000]
+0xEF9D U+9853 # <cjk> [2000]
+0xEF9E U+9856 # <cjk> [2000]
+0xEF9F U+9857 # <cjk> [2000]
+0xEFA0 U+9859 # <cjk> [2000]
+0xEFA1 U+985A # <cjk> [2000]
+0xEFA2 U+F9D0 # CJK COMPATIBILITY IDEOGRAPH-F9D0 [2000]
+0xEFA3 U+9865 # <cjk> [2000]
+0xEFA4 U+986C # <cjk> [2000]
+0xEFA5 U+98BA # <cjk> [2000]
+0xEFA6 U+98C8 # <cjk> [2000]
+0xEFA7 U+98E7 # <cjk> [2000]
+0xEFA8 U+9958 # <cjk> [2000]
+0xEFA9 U+999E # <cjk> [2000]
+0xEFAA U+9A02 # <cjk> [2000]
+0xEFAB U+9A03 # <cjk> [2000]
+0xEFAC U+9A24 # <cjk> [2000]
+0xEFAD U+9A2D # <cjk> [2000]
+0xEFAE U+9A2E # <cjk> [2000]
+0xEFAF U+9A38 # <cjk> [2000]
+0xEFB0 U+9A4A # <cjk> [2000]
+0xEFB1 U+9A4E # <cjk> [2000]
+0xEFB2 U+9A52 # <cjk> [2000]
+0xEFB3 U+9AB6 # <cjk> [2000]
+0xEFB4 U+9AC1 # <cjk> [2000]
+0xEFB5 U+9AC3 # <cjk> [2000]
+0xEFB6 U+9ACE # <cjk> [2000]
+0xEFB7 U+9AD6 # <cjk> [2000]
+0xEFB8 U+9AF9 # <cjk> [2000]
+0xEFB9 U+9B02 # <cjk> [2000]
+0xEFBA U+9B08 # <cjk> [2000]
+0xEFBB U+9B20 # <cjk> [2000]
+0xEFBC U+4C17 # <cjk> [2000]
+0xEFBD U+9B2D # <cjk> [2000]
+0xEFBE U+9B5E # <cjk> [2000]
+0xEFBF U+9B79 # <cjk> [2000]
+0xEFC0 U+9B66 # <cjk> [2000]
+0xEFC1 U+9B72 # <cjk> [2000]
+0xEFC2 U+9B75 # <cjk> [2000]
+0xEFC3 U+9B84 # <cjk> [2000]
+0xEFC4 U+9B8A # <cjk> [2000]
+0xEFC5 U+9B8F # <cjk> [2000]
+0xEFC6 U+9B9E # <cjk> [2000]
+0xEFC7 U+9BA7 # <cjk> [2000]
+0xEFC8 U+9BC1 # <cjk> [2000]
+0xEFC9 U+9BCE # <cjk> [2000]
+0xEFCA U+9BE5 # <cjk> [2000]
+0xEFCB U+9BF8 # <cjk> [2000]
+0xEFCC U+9BFD # <cjk> [2000]
+0xEFCD U+9C00 # <cjk> [2000]
+0xEFCE U+9C23 # <cjk> [2000]
+0xEFCF U+9C41 # <cjk> [2000]
+0xEFD0 U+9C4F # <cjk> [2000]
+0xEFD1 U+9C50 # <cjk> [2000]
+0xEFD2 U+9C53 # <cjk> [2000]
+0xEFD3 U+9C63 # <cjk> [2000]
+0xEFD4 U+9C65 # <cjk> [2000]
+0xEFD5 U+9C77 # <cjk> [2000]
+0xEFD6 U+9D1D # <cjk> [2000]
+0xEFD7 U+9D1E # <cjk> [2000]
+0xEFD8 U+9D43 # <cjk> [2000]
+0xEFD9 U+9D47 # <cjk> [2000]
+0xEFDA U+9D52 # <cjk> [2000]
+0xEFDB U+9D63 # <cjk> [2000]
+0xEFDC U+9D70 # <cjk> [2000]
+0xEFDD U+9D7C # <cjk> [2000]
+0xEFDE U+9D8A # <cjk> [2000]
+0xEFDF U+9D96 # <cjk> [2000]
+0xEFE0 U+9DC0 # <cjk> [2000]
+0xEFE1 U+9DAC # <cjk> [2000]
+0xEFE2 U+9DBC # <cjk> [2000]
+0xEFE3 U+9DD7 # <cjk> [2000]
+0xEFE4 U+2A190 # <cjk> [2000] [Unicode3.1]
+0xEFE5 U+9DE7 # <cjk> [2000]
+0xEFE6 U+9E07 # <cjk> [2000]
+0xEFE7 U+9E15 # <cjk> [2000]
+0xEFE8 U+9E7C # <cjk> [2000]
+0xEFE9 U+9E9E # <cjk> [2000]
+0xEFEA U+9EA4 # <cjk> [2000]
+0xEFEB U+9EAC # <cjk> [2000]
+0xEFEC U+9EAF # <cjk> [2000]
+0xEFED U+9EB4 # <cjk> [2000]
+0xEFEE U+9EB5 # <cjk> [2000]
+0xEFEF U+9EC3 # <cjk> [2000]
+0xEFF0 U+9ED1 # <cjk> [2000]
+0xEFF1 U+9F10 # <cjk> [2000]
+0xEFF2 U+9F39 # <cjk> [2000]
+0xEFF3 U+9F57 # <cjk> [2000]
+0xEFF4 U+9F90 # <cjk> [2000]
+0xEFF5 U+9F94 # <cjk> [2000]
+0xEFF6 U+9F97 # <cjk> [2000]
+0xEFF7 U+9FA2 # <cjk> [2000]
+0xEFF8 U+59F8 # <cjk> [2004]
+0xEFF9 U+5C5B # <cjk> [2004]
+0xEFFA U+5E77 # <cjk> [2004]
+0xEFFB U+7626 # <cjk> [2004]
+0xEFFC U+7E6B # <cjk> [2004]
+0xF040 U+20089 # <cjk> [2000] [Unicode3.1]
+0xF041 U+4E02 # <cjk> [2000]
+0xF042 U+4E0F # <cjk> [2000]
+0xF043 U+4E12 # <cjk> [2000]
+0xF044 U+4E29 # <cjk> [2000]
+0xF045 U+4E2B # <cjk> [2000]
+0xF046 U+4E2E # <cjk> [2000]
+0xF047 U+4E40 # <cjk> [2000]
+0xF048 U+4E47 # <cjk> [2000]
+0xF049 U+4E48 # <cjk> [2000]
+0xF04A U+200A2 # <cjk> [2000] [Unicode3.1]
+0xF04B U+4E51 # <cjk> [2000]
+0xF04C U+3406 # <cjk> [2000]
+0xF04D U+200A4 # <cjk> [2000] [Unicode3.1]
+0xF04E U+4E5A # <cjk> [2000]
+0xF04F U+4E69 # <cjk> [2000]
+0xF050 U+4E9D # <cjk> [2000]
+0xF051 U+342C # <cjk> [2000]
+0xF052 U+342E # <cjk> [2000]
+0xF053 U+4EB9 # <cjk> [2000]
+0xF054 U+4EBB # <cjk> [2000]
+0xF055 U+201A2 # <cjk> [2000] [Unicode3.1]
+0xF056 U+4EBC # <cjk> [2000]
+0xF057 U+4EC3 # <cjk> [2000]
+0xF058 U+4EC8 # <cjk> [2000]
+0xF059 U+4ED0 # <cjk> [2000]
+0xF05A U+4EEB # <cjk> [2000]
+0xF05B U+4EDA # <cjk> [2000]
+0xF05C U+4EF1 # <cjk> [2000]
+0xF05D U+4EF5 # <cjk> [2000]
+0xF05E U+4F00 # <cjk> [2000]
+0xF05F U+4F16 # <cjk> [2000]
+0xF060 U+4F64 # <cjk> [2000]
+0xF061 U+4F37 # <cjk> [2000]
+0xF062 U+4F3E # <cjk> [2000]
+0xF063 U+4F54 # <cjk> [2000]
+0xF064 U+4F58 # <cjk> [2000]
+0xF065 U+20213 # <cjk> [2000] [Unicode3.1]
+0xF066 U+4F77 # <cjk> [2000]
+0xF067 U+4F78 # <cjk> [2000]
+0xF068 U+4F7A # <cjk> [2000]
+0xF069 U+4F7D # <cjk> [2000]
+0xF06A U+4F82 # <cjk> [2000]
+0xF06B U+4F85 # <cjk> [2000]
+0xF06C U+4F92 # <cjk> [2000]
+0xF06D U+4F9A # <cjk> [2000]
+0xF06E U+4FE6 # <cjk> [2000]
+0xF06F U+4FB2 # <cjk> [2000]
+0xF070 U+4FBE # <cjk> [2000]
+0xF071 U+4FC5 # <cjk> [2000]
+0xF072 U+4FCB # <cjk> [2000]
+0xF073 U+4FCF # <cjk> [2000]
+0xF074 U+4FD2 # <cjk> [2000]
+0xF075 U+346A # <cjk> [2000]
+0xF076 U+4FF2 # <cjk> [2000]
+0xF077 U+5000 # <cjk> [2000]
+0xF078 U+5010 # <cjk> [2000]
+0xF079 U+5013 # <cjk> [2000]
+0xF07A U+501C # <cjk> [2000]
+0xF07B U+501E # <cjk> [2000]
+0xF07C U+5022 # <cjk> [2000]
+0xF07D U+3468 # <cjk> [2000]
+0xF07E U+5042 # <cjk> [2000]
+0xF080 U+5046 # <cjk> [2000]
+0xF081 U+504E # <cjk> [2000]
+0xF082 U+5053 # <cjk> [2000]
+0xF083 U+5057 # <cjk> [2000]
+0xF084 U+5063 # <cjk> [2000]
+0xF085 U+5066 # <cjk> [2000]
+0xF086 U+506A # <cjk> [2000]
+0xF087 U+5070 # <cjk> [2000]
+0xF088 U+50A3 # <cjk> [2000]
+0xF089 U+5088 # <cjk> [2000]
+0xF08A U+5092 # <cjk> [2000]
+0xF08B U+5093 # <cjk> [2000]
+0xF08C U+5095 # <cjk> [2000]
+0xF08D U+5096 # <cjk> [2000]
+0xF08E U+509C # <cjk> [2000]
+0xF08F U+50AA # <cjk> [2000]
+0xF090 U+2032B # <cjk> [2000] [Unicode3.1]
+0xF091 U+50B1 # <cjk> [2000]
+0xF092 U+50BA # <cjk> [2000]
+0xF093 U+50BB # <cjk> [2000]
+0xF094 U+50C4 # <cjk> [2000]
+0xF095 U+50C7 # <cjk> [2000]
+0xF096 U+50F3 # <cjk> [2000]
+0xF097 U+20381 # <cjk> [2000] [Unicode3.1]
+0xF098 U+50CE # <cjk> [2000]
+0xF099 U+20371 # <cjk> [2000] [Unicode3.1]
+0xF09A U+50D4 # <cjk> [2000]
+0xF09B U+50D9 # <cjk> [2000]
+0xF09C U+50E1 # <cjk> [2000]
+0xF09D U+50E9 # <cjk> [2000]
+0xF09E U+3492 # <cjk> [2000]
+0xF140 U+5108 # <cjk> [2000]
+0xF141 U+203F9 # <cjk> [2000] [Unicode3.1]
+0xF142 U+5117 # <cjk> [2000]
+0xF143 U+511B # <cjk> [2000]
+0xF144 U+2044A # <cjk> [2000] [Unicode3.1]
+0xF145 U+5160 # <cjk> [2000]
+0xF146 U+20509 # <cjk> [2000] [Unicode3.1]
+0xF147 U+5173 # <cjk> [2000]
+0xF148 U+5183 # <cjk> [2000]
+0xF149 U+518B # <cjk> [2000]
+0xF14A U+34BC # <cjk> [2000]
+0xF14B U+5198 # <cjk> [2000]
+0xF14C U+51A3 # <cjk> [2000]
+0xF14D U+51AD # <cjk> [2000]
+0xF14E U+34C7 # <cjk> [2000]
+0xF14F U+51BC # <cjk> [2000]
+0xF150 U+205D6 # <cjk> [2000] [Unicode3.1]
+0xF151 U+20628 # <cjk> [2000] [Unicode3.1]
+0xF152 U+51F3 # <cjk> [2000]
+0xF153 U+51F4 # <cjk> [2000]
+0xF154 U+5202 # <cjk> [2000]
+0xF155 U+5212 # <cjk> [2000]
+0xF156 U+5216 # <cjk> [2000]
+0xF157 U+2074F # <cjk> [2000] [Unicode3.1]
+0xF158 U+5255 # <cjk> [2000]
+0xF159 U+525C # <cjk> [2000]
+0xF15A U+526C # <cjk> [2000]
+0xF15B U+5277 # <cjk> [2000]
+0xF15C U+5284 # <cjk> [2000]
+0xF15D U+5282 # <cjk> [2000]
+0xF15E U+20807 # <cjk> [2000] [Unicode3.1]
+0xF15F U+5298 # <cjk> [2000]
+0xF160 U+2083A # <cjk> [2000] [Unicode3.1]
+0xF161 U+52A4 # <cjk> [2000]
+0xF162 U+52A6 # <cjk> [2000]
+0xF163 U+52AF # <cjk> [2000]
+0xF164 U+52BA # <cjk> [2000]
+0xF165 U+52BB # <cjk> [2000]
+0xF166 U+52CA # <cjk> [2000]
+0xF167 U+351F # <cjk> [2000]
+0xF168 U+52D1 # <cjk> [2000]
+0xF169 U+208B9 # <cjk> [2000] [Unicode3.1]
+0xF16A U+52F7 # <cjk> [2000]
+0xF16B U+530A # <cjk> [2000]
+0xF16C U+530B # <cjk> [2000]
+0xF16D U+5324 # <cjk> [2000]
+0xF16E U+5335 # <cjk> [2000]
+0xF16F U+533E # <cjk> [2000]
+0xF170 U+5342 # <cjk> [2000]
+0xF171 U+2097C # <cjk> [2000] [Unicode3.1]
+0xF172 U+2099D # <cjk> [2000] [Unicode3.1]
+0xF173 U+5367 # <cjk> [2000]
+0xF174 U+536C # <cjk> [2000]
+0xF175 U+537A # <cjk> [2000]
+0xF176 U+53A4 # <cjk> [2000]
+0xF177 U+53B4 # <cjk> [2000]
+0xF178 U+20AD3 # <cjk> [2000] [Unicode3.1]
+0xF179 U+53B7 # <cjk> [2000]
+0xF17A U+53C0 # <cjk> [2000]
+0xF17B U+20B1D # <cjk> [2000] [Unicode3.1]
+0xF17C U+355D # <cjk> [2000]
+0xF17D U+355E # <cjk> [2000]
+0xF17E U+53D5 # <cjk> [2000]
+0xF180 U+53DA # <cjk> [2000]
+0xF181 U+3563 # <cjk> [2000]
+0xF182 U+53F4 # <cjk> [2000]
+0xF183 U+53F5 # <cjk> [2000]
+0xF184 U+5455 # <cjk> [2000]
+0xF185 U+5424 # <cjk> [2000]
+0xF186 U+5428 # <cjk> [2000]
+0xF187 U+356E # <cjk> [2000]
+0xF188 U+5443 # <cjk> [2000]
+0xF189 U+5462 # <cjk> [2000]
+0xF18A U+5466 # <cjk> [2000]
+0xF18B U+546C # <cjk> [2000]
+0xF18C U+548A # <cjk> [2000]
+0xF18D U+548D # <cjk> [2000]
+0xF18E U+5495 # <cjk> [2000]
+0xF18F U+54A0 # <cjk> [2000]
+0xF190 U+54A6 # <cjk> [2000]
+0xF191 U+54AD # <cjk> [2000]
+0xF192 U+54AE # <cjk> [2000]
+0xF193 U+54B7 # <cjk> [2000]
+0xF194 U+54BA # <cjk> [2000]
+0xF195 U+54BF # <cjk> [2000]
+0xF196 U+54C3 # <cjk> [2000]
+0xF197 U+20D45 # <cjk> [2000] [Unicode3.1]
+0xF198 U+54EC # <cjk> [2000]
+0xF199 U+54EF # <cjk> [2000]
+0xF19A U+54F1 # <cjk> [2000]
+0xF19B U+54F3 # <cjk> [2000]
+0xF19C U+5500 # <cjk> [2000]
+0xF19D U+5501 # <cjk> [2000]
+0xF19E U+5509 # <cjk> [2000]
+0xF19F U+553C # <cjk> [2000]
+0xF1A0 U+5541 # <cjk> [2000]
+0xF1A1 U+35A6 # <cjk> [2000]
+0xF1A2 U+5547 # <cjk> [2000]
+0xF1A3 U+554A # <cjk> [2000]
+0xF1A4 U+35A8 # <cjk> [2000]
+0xF1A5 U+5560 # <cjk> [2000]
+0xF1A6 U+5561 # <cjk> [2000]
+0xF1A7 U+5564 # <cjk> [2000]
+0xF1A8 U+20DE1 # <cjk> [2000] [Unicode3.1]
+0xF1A9 U+557D # <cjk> [2000]
+0xF1AA U+5582 # <cjk> [2000]
+0xF1AB U+5588 # <cjk> [2000]
+0xF1AC U+5591 # <cjk> [2000]
+0xF1AD U+35C5 # <cjk> [2000]
+0xF1AE U+55D2 # <cjk> [2000]
+0xF1AF U+20E95 # <cjk> [2000] [Unicode3.1]
+0xF1B0 U+20E6D # <cjk> [2000] [Unicode3.1]
+0xF1B1 U+55BF # <cjk> [2000]
+0xF1B2 U+55C9 # <cjk> [2000]
+0xF1B3 U+55CC # <cjk> [2000]
+0xF1B4 U+55D1 # <cjk> [2000]
+0xF1B5 U+55DD # <cjk> [2000]
+0xF1B6 U+35DA # <cjk> [2000]
+0xF1B7 U+55E2 # <cjk> [2000]
+0xF1B8 U+20E64 # <cjk> [2000] [Unicode3.1]
+0xF1B9 U+55E9 # <cjk> [2000]
+0xF1BA U+5628 # <cjk> [2000]
+0xF1BB U+20F5F # <cjk> [2000] [Unicode3.1]
+0xF1BC U+5607 # <cjk> [2000]
+0xF1BD U+5610 # <cjk> [2000]
+0xF1BE U+5630 # <cjk> [2000]
+0xF1BF U+5637 # <cjk> [2000]
+0xF1C0 U+35F4 # <cjk> [2000]
+0xF1C1 U+563D # <cjk> [2000]
+0xF1C2 U+563F # <cjk> [2000]
+0xF1C3 U+5640 # <cjk> [2000]
+0xF1C4 U+5647 # <cjk> [2000]
+0xF1C5 U+565E # <cjk> [2000]
+0xF1C6 U+5660 # <cjk> [2000]
+0xF1C7 U+566D # <cjk> [2000]
+0xF1C8 U+3605 # <cjk> [2000]
+0xF1C9 U+5688 # <cjk> [2000]
+0xF1CA U+568C # <cjk> [2000]
+0xF1CB U+5695 # <cjk> [2000]
+0xF1CC U+569A # <cjk> [2000]
+0xF1CD U+569D # <cjk> [2000]
+0xF1CE U+56A8 # <cjk> [2000]
+0xF1CF U+56AD # <cjk> [2000]
+0xF1D0 U+56B2 # <cjk> [2000]
+0xF1D1 U+56C5 # <cjk> [2000]
+0xF1D2 U+56CD # <cjk> [2000]
+0xF1D3 U+56DF # <cjk> [2000]
+0xF1D4 U+56E8 # <cjk> [2000]
+0xF1D5 U+56F6 # <cjk> [2000]
+0xF1D6 U+56F7 # <cjk> [2000]
+0xF1D7 U+21201 # <cjk> [2000] [Unicode3.1]
+0xF1D8 U+5715 # <cjk> [2000]
+0xF1D9 U+5723 # <cjk> [2000]
+0xF1DA U+21255 # <cjk> [2000] [Unicode3.1]
+0xF1DB U+5729 # <cjk> [2000]
+0xF1DC U+2127B # <cjk> [2000] [Unicode3.1]
+0xF1DD U+5745 # <cjk> [2000]
+0xF1DE U+5746 # <cjk> [2000]
+0xF1DF U+574C # <cjk> [2000]
+0xF1E0 U+574D # <cjk> [2000]
+0xF1E1 U+21274 # <cjk> [2000] [Unicode3.1]
+0xF1E2 U+5768 # <cjk> [2000]
+0xF1E3 U+576F # <cjk> [2000]
+0xF1E4 U+5773 # <cjk> [2000]
+0xF1E5 U+5774 # <cjk> [2000]
+0xF1E6 U+5775 # <cjk> [2000]
+0xF1E7 U+577B # <cjk> [2000]
+0xF1E8 U+212E4 # <cjk> [2000] [Unicode3.1]
+0xF1E9 U+212D7 # <cjk> [2000] [Unicode3.1]
+0xF1EA U+57AC # <cjk> [2000]
+0xF1EB U+579A # <cjk> [2000]
+0xF1EC U+579D # <cjk> [2000]
+0xF1ED U+579E # <cjk> [2000]
+0xF1EE U+57A8 # <cjk> [2000]
+0xF1EF U+57D7 # <cjk> [2000]
+0xF1F0 U+212FD # <cjk> [2000] [Unicode3.1]
+0xF1F1 U+57CC # <cjk> [2000]
+0xF1F2 U+21336 # <cjk> [2000] [Unicode3.1]
+0xF1F3 U+21344 # <cjk> [2000] [Unicode3.1]
+0xF1F4 U+57DE # <cjk> [2000]
+0xF1F5 U+57E6 # <cjk> [2000]
+0xF1F6 U+57F0 # <cjk> [2000]
+0xF1F7 U+364A # <cjk> [2000]
+0xF1F8 U+57F8 # <cjk> [2000]
+0xF1F9 U+57FB # <cjk> [2000]
+0xF1FA U+57FD # <cjk> [2000]
+0xF1FB U+5804 # <cjk> [2000]
+0xF1FC U+581E # <cjk> [2000]
+0xF240 U+5820 # <cjk> [2000]
+0xF241 U+5827 # <cjk> [2000]
+0xF242 U+5832 # <cjk> [2000]
+0xF243 U+5839 # <cjk> [2000]
+0xF244 U+213C4 # <cjk> [2000] [Unicode3.1]
+0xF245 U+5849 # <cjk> [2000]
+0xF246 U+584C # <cjk> [2000]
+0xF247 U+5867 # <cjk> [2000]
+0xF248 U+588A # <cjk> [2000]
+0xF249 U+588B # <cjk> [2000]
+0xF24A U+588D # <cjk> [2000]
+0xF24B U+588F # <cjk> [2000]
+0xF24C U+5890 # <cjk> [2000]
+0xF24D U+5894 # <cjk> [2000]
+0xF24E U+589D # <cjk> [2000]
+0xF24F U+58AA # <cjk> [2000]
+0xF250 U+58B1 # <cjk> [2000]
+0xF251 U+2146D # <cjk> [2000] [Unicode3.1]
+0xF252 U+58C3 # <cjk> [2000]
+0xF253 U+58CD # <cjk> [2000]
+0xF254 U+58E2 # <cjk> [2000]
+0xF255 U+58F3 # <cjk> [2000]
+0xF256 U+58F4 # <cjk> [2000]
+0xF257 U+5905 # <cjk> [2000]
+0xF258 U+5906 # <cjk> [2000]
+0xF259 U+590B # <cjk> [2000]
+0xF25A U+590D # <cjk> [2000]
+0xF25B U+5914 # <cjk> [2000]
+0xF25C U+5924 # <cjk> [2000]
+0xF25D U+215D7 # <cjk> [2000] [Unicode3.1]
+0xF25E U+3691 # <cjk> [2000]
+0xF25F U+593D # <cjk> [2000]
+0xF260 U+3699 # <cjk> [2000]
+0xF261 U+5946 # <cjk> [2000]
+0xF262 U+3696 # <cjk> [2000]
+0xF263 U+26C29 # <cjk> [2000] [Unicode3.1]
+0xF264 U+595B # <cjk> [2000]
+0xF265 U+595F # <cjk> [2000]
+0xF266 U+21647 # <cjk> [2000] [Unicode3.1]
+0xF267 U+5975 # <cjk> [2000]
+0xF268 U+5976 # <cjk> [2000]
+0xF269 U+597C # <cjk> [2000]
+0xF26A U+599F # <cjk> [2000]
+0xF26B U+59AE # <cjk> [2000]
+0xF26C U+59BC # <cjk> [2000]
+0xF26D U+59C8 # <cjk> [2000]
+0xF26E U+59CD # <cjk> [2000]
+0xF26F U+59DE # <cjk> [2000]
+0xF270 U+59E3 # <cjk> [2000]
+0xF271 U+59E4 # <cjk> [2000]
+0xF272 U+59E7 # <cjk> [2000]
+0xF273 U+59EE # <cjk> [2000]
+0xF274 U+21706 # <cjk> [2000] [Unicode3.1]
+0xF275 U+21742 # <cjk> [2000] [Unicode3.1]
+0xF276 U+36CF # <cjk> [2000]
+0xF277 U+5A0C # <cjk> [2000]
+0xF278 U+5A0D # <cjk> [2000]
+0xF279 U+5A17 # <cjk> [2000]
+0xF27A U+5A27 # <cjk> [2000]
+0xF27B U+5A2D # <cjk> [2000]
+0xF27C U+5A55 # <cjk> [2000]
+0xF27D U+5A65 # <cjk> [2000]
+0xF27E U+5A7A # <cjk> [2000]
+0xF280 U+5A8B # <cjk> [2000]
+0xF281 U+5A9C # <cjk> [2000]
+0xF282 U+5A9F # <cjk> [2000]
+0xF283 U+5AA0 # <cjk> [2000]
+0xF284 U+5AA2 # <cjk> [2000]
+0xF285 U+5AB1 # <cjk> [2000]
+0xF286 U+5AB3 # <cjk> [2000]
+0xF287 U+5AB5 # <cjk> [2000]
+0xF288 U+5ABA # <cjk> [2000]
+0xF289 U+5ABF # <cjk> [2000]
+0xF28A U+5ADA # <cjk> [2000]
+0xF28B U+5ADC # <cjk> [2000]
+0xF28C U+5AE0 # <cjk> [2000]
+0xF28D U+5AE5 # <cjk> [2000]
+0xF28E U+5AF0 # <cjk> [2000]
+0xF28F U+5AEE # <cjk> [2000]
+0xF290 U+5AF5 # <cjk> [2000]
+0xF291 U+5B00 # <cjk> [2000]
+0xF292 U+5B08 # <cjk> [2000]
+0xF293 U+5B17 # <cjk> [2000]
+0xF294 U+5B34 # <cjk> [2000]
+0xF295 U+5B2D # <cjk> [2000]
+0xF296 U+5B4C # <cjk> [2000]
+0xF297 U+5B52 # <cjk> [2000]
+0xF298 U+5B68 # <cjk> [2000]
+0xF299 U+5B6F # <cjk> [2000]
+0xF29A U+5B7C # <cjk> [2000]
+0xF29B U+5B7F # <cjk> [2000]
+0xF29C U+5B81 # <cjk> [2000]
+0xF29D U+5B84 # <cjk> [2000]
+0xF29E U+219C3 # <cjk> [2000] [Unicode3.1]
+0xF09F U+5B96 # <cjk> [2000]
+0xF0A0 U+5BAC # <cjk> [2000]
+0xF0A1 U+3761 # <cjk> [2000]
+0xF0A2 U+5BC0 # <cjk> [2000]
+0xF0A3 U+3762 # <cjk> [2000]
+0xF0A4 U+5BCE # <cjk> [2000]
+0xF0A5 U+5BD6 # <cjk> [2000]
+0xF0A6 U+376C # <cjk> [2000]
+0xF0A7 U+376B # <cjk> [2000]
+0xF0A8 U+5BF1 # <cjk> [2000]
+0xF0A9 U+5BFD # <cjk> [2000]
+0xF0AA U+3775 # <cjk> [2000]
+0xF0AB U+5C03 # <cjk> [2000]
+0xF0AC U+5C29 # <cjk> [2000]
+0xF0AD U+5C30 # <cjk> [2000]
+0xF0AE U+21C56 # <cjk> [2000] [Unicode3.1]
+0xF0AF U+5C5F # <cjk> [2000]
+0xF0B0 U+5C63 # <cjk> [2000]
+0xF0B1 U+5C67 # <cjk> [2000]
+0xF0B2 U+5C68 # <cjk> [2000]
+0xF0B3 U+5C69 # <cjk> [2000]
+0xF0B4 U+5C70 # <cjk> [2000]
+0xF0B5 U+21D2D # <cjk> [2000] [Unicode3.1]
+0xF0B6 U+21D45 # <cjk> [2000] [Unicode3.1]
+0xF0B7 U+5C7C # <cjk> [2000]
+0xF0B8 U+21D78 # <cjk> [2000] [Unicode3.1]
+0xF0B9 U+21D62 # <cjk> [2000] [Unicode3.1]
+0xF0BA U+5C88 # <cjk> [2000]
+0xF0BB U+5C8A # <cjk> [2000]
+0xF0BC U+37C1 # <cjk> [2000]
+0xF0BD U+21DA1 # <cjk> [2000] [Unicode3.1]
+0xF0BE U+21D9C # <cjk> [2000] [Unicode3.1]
+0xF0BF U+5CA0 # <cjk> [2000]
+0xF0C0 U+5CA2 # <cjk> [2000]
+0xF0C1 U+5CA6 # <cjk> [2000]
+0xF0C2 U+5CA7 # <cjk> [2000]
+0xF0C3 U+21D92 # <cjk> [2000] [Unicode3.1]
+0xF0C4 U+5CAD # <cjk> [2000]
+0xF0C5 U+5CB5 # <cjk> [2000]
+0xF0C6 U+21DB7 # <cjk> [2000] [Unicode3.1]
+0xF0C7 U+5CC9 # <cjk> [2000]
+0xF0C8 U+21DE0 # <cjk> [2000] [Unicode3.1]
+0xF0C9 U+21E33 # <cjk> [2000] [Unicode3.1]
+0xF0CA U+5D06 # <cjk> [2000]
+0xF0CB U+5D10 # <cjk> [2000]
+0xF0CC U+5D2B # <cjk> [2000]
+0xF0CD U+5D1D # <cjk> [2000]
+0xF0CE U+5D20 # <cjk> [2000]
+0xF0CF U+5D24 # <cjk> [2000]
+0xF0D0 U+5D26 # <cjk> [2000]
+0xF0D1 U+5D31 # <cjk> [2000]
+0xF0D2 U+5D39 # <cjk> [2000]
+0xF0D3 U+5D42 # <cjk> [2000]
+0xF0D4 U+37E8 # <cjk> [2000]
+0xF0D5 U+5D61 # <cjk> [2000]
+0xF0D6 U+5D6A # <cjk> [2000]
+0xF0D7 U+37F4 # <cjk> [2000]
+0xF0D8 U+5D70 # <cjk> [2000]
+0xF0D9 U+21F1E # <cjk> [2000] [Unicode3.1]
+0xF0DA U+37FD # <cjk> [2000]
+0xF0DB U+5D88 # <cjk> [2000]
+0xF0DC U+3800 # <cjk> [2000]
+0xF0DD U+5D92 # <cjk> [2000]
+0xF0DE U+5D94 # <cjk> [2000]
+0xF0DF U+5D97 # <cjk> [2000]
+0xF0E0 U+5D99 # <cjk> [2000]
+0xF0E1 U+5DB0 # <cjk> [2000]
+0xF0E2 U+5DB2 # <cjk> [2000]
+0xF0E3 U+5DB4 # <cjk> [2000]
+0xF0E4 U+21F76 # <cjk> [2000] [Unicode3.1]
+0xF0E5 U+5DB9 # <cjk> [2000]
+0xF0E6 U+5DD1 # <cjk> [2000]
+0xF0E7 U+5DD7 # <cjk> [2000]
+0xF0E8 U+5DD8 # <cjk> [2000]
+0xF0E9 U+5DE0 # <cjk> [2000]
+0xF0EA U+21FFA # <cjk> [2000] [Unicode3.1]
+0xF0EB U+5DE4 # <cjk> [2000]
+0xF0EC U+5DE9 # <cjk> [2000]
+0xF0ED U+382F # <cjk> [2000]
+0xF0EE U+5E00 # <cjk> [2000]
+0xF0EF U+3836 # <cjk> [2000]
+0xF0F0 U+5E12 # <cjk> [2000]
+0xF0F1 U+5E15 # <cjk> [2000]
+0xF0F2 U+3840 # <cjk> [2000]
+0xF0F3 U+5E1F # <cjk> [2000]
+0xF0F4 U+5E2E # <cjk> [2000]
+0xF0F5 U+5E3E # <cjk> [2000]
+0xF0F6 U+5E49 # <cjk> [2000]
+0xF0F7 U+385C # <cjk> [2000]
+0xF0F8 U+5E56 # <cjk> [2000]
+0xF0F9 U+3861 # <cjk> [2000]
+0xF0FA U+5E6B # <cjk> [2000]
+0xF0FB U+5E6C # <cjk> [2000]
+0xF0FC U+5E6D # <cjk> [2000]
+0xF29F U+5E6E # <cjk> [2000]
+0xF2A0 U+2217B # <cjk> [2000] [Unicode3.1]
+0xF2A1 U+5EA5 # <cjk> [2000]
+0xF2A2 U+5EAA # <cjk> [2000]
+0xF2A3 U+5EAC # <cjk> [2000]
+0xF2A4 U+5EB9 # <cjk> [2000]
+0xF2A5 U+5EBF # <cjk> [2000]
+0xF2A6 U+5EC6 # <cjk> [2000]
+0xF2A7 U+5ED2 # <cjk> [2000]
+0xF2A8 U+5ED9 # <cjk> [2000]
+0xF2A9 U+2231E # <cjk> [2000] [Unicode3.1]
+0xF2AA U+5EFD # <cjk> [2000]
+0xF2AB U+5F08 # <cjk> [2000]
+0xF2AC U+5F0E # <cjk> [2000]
+0xF2AD U+5F1C # <cjk> [2000]
+0xF2AE U+223AD # <cjk> [2000] [Unicode3.1]
+0xF2AF U+5F1E # <cjk> [2000]
+0xF2B0 U+5F47 # <cjk> [2000]
+0xF2B1 U+5F63 # <cjk> [2000]
+0xF2B2 U+5F72 # <cjk> [2000]
+0xF2B3 U+5F7E # <cjk> [2000]
+0xF2B4 U+5F8F # <cjk> [2000]
+0xF2B5 U+5FA2 # <cjk> [2000]
+0xF2B6 U+5FA4 # <cjk> [2000]
+0xF2B7 U+5FB8 # <cjk> [2000]
+0xF2B8 U+5FC4 # <cjk> [2000]
+0xF2B9 U+38FA # <cjk> [2000]
+0xF2BA U+5FC7 # <cjk> [2000]
+0xF2BB U+5FCB # <cjk> [2000]
+0xF2BC U+5FD2 # <cjk> [2000]
+0xF2BD U+5FD3 # <cjk> [2000]
+0xF2BE U+5FD4 # <cjk> [2000]
+0xF2BF U+5FE2 # <cjk> [2000]
+0xF2C0 U+5FEE # <cjk> [2000]
+0xF2C1 U+5FEF # <cjk> [2000]
+0xF2C2 U+5FF3 # <cjk> [2000]
+0xF2C3 U+5FFC # <cjk> [2000]
+0xF2C4 U+3917 # <cjk> [2000]
+0xF2C5 U+6017 # <cjk> [2000]
+0xF2C6 U+6022 # <cjk> [2000]
+0xF2C7 U+6024 # <cjk> [2000]
+0xF2C8 U+391A # <cjk> [2000]
+0xF2C9 U+604C # <cjk> [2000]
+0xF2CA U+607F # <cjk> [2000]
+0xF2CB U+608A # <cjk> [2000]
+0xF2CC U+6095 # <cjk> [2000]
+0xF2CD U+60A8 # <cjk> [2000]
+0xF2CE U+226F3 # <cjk> [2000] [Unicode3.1]
+0xF2CF U+60B0 # <cjk> [2000]
+0xF2D0 U+60B1 # <cjk> [2000]
+0xF2D1 U+60BE # <cjk> [2000]
+0xF2D2 U+60C8 # <cjk> [2000]
+0xF2D3 U+60D9 # <cjk> [2000]
+0xF2D4 U+60DB # <cjk> [2000]
+0xF2D5 U+60EE # <cjk> [2000]
+0xF2D6 U+60F2 # <cjk> [2000]
+0xF2D7 U+60F5 # <cjk> [2000]
+0xF2D8 U+6110 # <cjk> [2000]
+0xF2D9 U+6112 # <cjk> [2000]
+0xF2DA U+6113 # <cjk> [2000]
+0xF2DB U+6119 # <cjk> [2000]
+0xF2DC U+611E # <cjk> [2000]
+0xF2DD U+613A # <cjk> [2000]
+0xF2DE U+396F # <cjk> [2000]
+0xF2DF U+6141 # <cjk> [2000]
+0xF2E0 U+6146 # <cjk> [2000]
+0xF2E1 U+6160 # <cjk> [2000]
+0xF2E2 U+617C # <cjk> [2000]
+0xF2E3 U+2285B # <cjk> [2000] [Unicode3.1]
+0xF2E4 U+6192 # <cjk> [2000]
+0xF2E5 U+6193 # <cjk> [2000]
+0xF2E6 U+6197 # <cjk> [2000]
+0xF2E7 U+6198 # <cjk> [2000]
+0xF2E8 U+61A5 # <cjk> [2000]
+0xF2E9 U+61A8 # <cjk> [2000]
+0xF2EA U+61AD # <cjk> [2000]
+0xF2EB U+228AB # <cjk> [2000] [Unicode3.1]
+0xF2EC U+61D5 # <cjk> [2000]
+0xF2ED U+61DD # <cjk> [2000]
+0xF2EE U+61DF # <cjk> [2000]
+0xF2EF U+61F5 # <cjk> [2000]
+0xF2F0 U+2298F # <cjk> [2000] [Unicode3.1]
+0xF2F1 U+6215 # <cjk> [2000]
+0xF2F2 U+6223 # <cjk> [2000]
+0xF2F3 U+6229 # <cjk> [2000]
+0xF2F4 U+6246 # <cjk> [2000]
+0xF2F5 U+624C # <cjk> [2000]
+0xF2F6 U+6251 # <cjk> [2000]
+0xF2F7 U+6252 # <cjk> [2000]
+0xF2F8 U+6261 # <cjk> [2000]
+0xF2F9 U+6264 # <cjk> [2000]
+0xF2FA U+627B # <cjk> [2000]
+0xF2FB U+626D # <cjk> [2000]
+0xF2FC U+6273 # <cjk> [2000]
+0xF340 U+6299 # <cjk> [2000]
+0xF341 U+62A6 # <cjk> [2000]
+0xF342 U+62D5 # <cjk> [2000]
+0xF343 U+22AB8 # <cjk> [2000] [Unicode3.1]
+0xF344 U+62FD # <cjk> [2000]
+0xF345 U+6303 # <cjk> [2000]
+0xF346 U+630D # <cjk> [2000]
+0xF347 U+6310 # <cjk> [2000]
+0xF348 U+22B4F # <cjk> [2000] [Unicode3.1]
+0xF349 U+22B50 # <cjk> [2000] [Unicode3.1]
+0xF34A U+6332 # <cjk> [2000]
+0xF34B U+6335 # <cjk> [2000]
+0xF34C U+633B # <cjk> [2000]
+0xF34D U+633C # <cjk> [2000]
+0xF34E U+6341 # <cjk> [2000]
+0xF34F U+6344 # <cjk> [2000]
+0xF350 U+634E # <cjk> [2000]
+0xF351 U+22B46 # <cjk> [2000] [Unicode3.1]
+0xF352 U+6359 # <cjk> [2000]
+0xF353 U+22C1D # <cjk> [2000] [Unicode3.1]
+0xF354 U+22BA6 # <cjk> [2000] [Unicode3.1]
+0xF355 U+636C # <cjk> [2000]
+0xF356 U+6384 # <cjk> [2000]
+0xF357 U+6399 # <cjk> [2000]
+0xF358 U+22C24 # <cjk> [2000] [Unicode3.1]
+0xF359 U+6394 # <cjk> [2000]
+0xF35A U+63BD # <cjk> [2000]
+0xF35B U+63F7 # <cjk> [2000]
+0xF35C U+63D4 # <cjk> [2000]
+0xF35D U+63D5 # <cjk> [2000]
+0xF35E U+63DC # <cjk> [2000]
+0xF35F U+63E0 # <cjk> [2000]
+0xF360 U+63EB # <cjk> [2000]
+0xF361 U+63EC # <cjk> [2000]
+0xF362 U+63F2 # <cjk> [2000]
+0xF363 U+6409 # <cjk> [2000]
+0xF364 U+641E # <cjk> [2000]
+0xF365 U+6425 # <cjk> [2000]
+0xF366 U+6429 # <cjk> [2000]
+0xF367 U+642F # <cjk> [2000]
+0xF368 U+645A # <cjk> [2000]
+0xF369 U+645B # <cjk> [2000]
+0xF36A U+645D # <cjk> [2000]
+0xF36B U+6473 # <cjk> [2000]
+0xF36C U+647D # <cjk> [2000]
+0xF36D U+6487 # <cjk> [2000]
+0xF36E U+6491 # <cjk> [2000]
+0xF36F U+649D # <cjk> [2000]
+0xF370 U+649F # <cjk> [2000]
+0xF371 U+64CB # <cjk> [2000]
+0xF372 U+64CC # <cjk> [2000]
+0xF373 U+64D5 # <cjk> [2000]
+0xF374 U+64D7 # <cjk> [2000]
+0xF375 U+22DE1 # <cjk> [2000] [Unicode3.1]
+0xF376 U+64E4 # <cjk> [2000]
+0xF377 U+64E5 # <cjk> [2000]
+0xF378 U+64FF # <cjk> [2000]
+0xF379 U+6504 # <cjk> [2000]
+0xF37A U+3A6E # <cjk> [2000]
+0xF37B U+650F # <cjk> [2000]
+0xF37C U+6514 # <cjk> [2000]
+0xF37D U+6516 # <cjk> [2000]
+0xF37E U+3A73 # <cjk> [2000]
+0xF380 U+651E # <cjk> [2000]
+0xF381 U+6532 # <cjk> [2000]
+0xF382 U+6544 # <cjk> [2000]
+0xF383 U+6554 # <cjk> [2000]
+0xF384 U+656B # <cjk> [2000]
+0xF385 U+657A # <cjk> [2000]
+0xF386 U+6581 # <cjk> [2000]
+0xF387 U+6584 # <cjk> [2000]
+0xF388 U+6585 # <cjk> [2000]
+0xF389 U+658A # <cjk> [2000]
+0xF38A U+65B2 # <cjk> [2000]
+0xF38B U+65B5 # <cjk> [2000]
+0xF38C U+65B8 # <cjk> [2000]
+0xF38D U+65BF # <cjk> [2000]
+0xF38E U+65C2 # <cjk> [2000]
+0xF38F U+65C9 # <cjk> [2000]
+0xF390 U+65D4 # <cjk> [2000]
+0xF391 U+3AD6 # <cjk> [2000]
+0xF392 U+65F2 # <cjk> [2000]
+0xF393 U+65F9 # <cjk> [2000]
+0xF394 U+65FC # <cjk> [2000]
+0xF395 U+6604 # <cjk> [2000]
+0xF396 U+6608 # <cjk> [2000]
+0xF397 U+6621 # <cjk> [2000]
+0xF398 U+662A # <cjk> [2000]
+0xF399 U+6645 # <cjk> [2000]
+0xF39A U+6651 # <cjk> [2000]
+0xF39B U+664E # <cjk> [2000]
+0xF39C U+3AEA # <cjk> [2000]
+0xF39D U+231C3 # <cjk> [2000] [Unicode3.1]
+0xF39E U+6657 # <cjk> [2000]
+0xF39F U+665B # <cjk> [2000]
+0xF3A0 U+6663 # <cjk> [2000]
+0xF3A1 U+231F5 # <cjk> [2000] [Unicode3.1]
+0xF3A2 U+231B6 # <cjk> [2000] [Unicode3.1]
+0xF3A3 U+666A # <cjk> [2000]
+0xF3A4 U+666B # <cjk> [2000]
+0xF3A5 U+666C # <cjk> [2000]
+0xF3A6 U+666D # <cjk> [2000]
+0xF3A7 U+667B # <cjk> [2000]
+0xF3A8 U+6680 # <cjk> [2000]
+0xF3A9 U+6690 # <cjk> [2000]
+0xF3AA U+6692 # <cjk> [2000]
+0xF3AB U+6699 # <cjk> [2000]
+0xF3AC U+3B0E # <cjk> [2000]
+0xF3AD U+66AD # <cjk> [2000]
+0xF3AE U+66B1 # <cjk> [2000]
+0xF3AF U+66B5 # <cjk> [2000]
+0xF3B0 U+3B1A # <cjk> [2000]
+0xF3B1 U+66BF # <cjk> [2000]
+0xF3B2 U+3B1C # <cjk> [2000]
+0xF3B3 U+66EC # <cjk> [2000]
+0xF3B4 U+3AD7 # <cjk> [2000]
+0xF3B5 U+6701 # <cjk> [2000]
+0xF3B6 U+6705 # <cjk> [2000]
+0xF3B7 U+6712 # <cjk> [2000]
+0xF3B8 U+23372 # <cjk> [2000] [Unicode3.1]
+0xF3B9 U+6719 # <cjk> [2000]
+0xF3BA U+233D3 # <cjk> [2000] [Unicode3.1]
+0xF3BB U+233D2 # <cjk> [2000] [Unicode3.1]
+0xF3BC U+674C # <cjk> [2000]
+0xF3BD U+674D # <cjk> [2000]
+0xF3BE U+6754 # <cjk> [2000]
+0xF3BF U+675D # <cjk> [2000]
+0xF3C0 U+233D0 # <cjk> [2000] [Unicode3.1]
+0xF3C1 U+233E4 # <cjk> [2000] [Unicode3.1]
+0xF3C2 U+233D5 # <cjk> [2000] [Unicode3.1]
+0xF3C3 U+6774 # <cjk> [2000]
+0xF3C4 U+6776 # <cjk> [2000]
+0xF3C5 U+233DA # <cjk> [2000] [Unicode3.1]
+0xF3C6 U+6792 # <cjk> [2000]
+0xF3C7 U+233DF # <cjk> [2000] [Unicode3.1]
+0xF3C8 U+8363 # <cjk> [2000]
+0xF3C9 U+6810 # <cjk> [2000]
+0xF3CA U+67B0 # <cjk> [2000]
+0xF3CB U+67B2 # <cjk> [2000]
+0xF3CC U+67C3 # <cjk> [2000]
+0xF3CD U+67C8 # <cjk> [2000]
+0xF3CE U+67D2 # <cjk> [2000]
+0xF3CF U+67D9 # <cjk> [2000]
+0xF3D0 U+67DB # <cjk> [2000]
+0xF3D1 U+67F0 # <cjk> [2000]
+0xF3D2 U+67F7 # <cjk> [2000]
+0xF3D3 U+2344A # <cjk> [2000] [Unicode3.1]
+0xF3D4 U+23451 # <cjk> [2000] [Unicode3.1]
+0xF3D5 U+2344B # <cjk> [2000] [Unicode3.1]
+0xF3D6 U+6818 # <cjk> [2000]
+0xF3D7 U+681F # <cjk> [2000]
+0xF3D8 U+682D # <cjk> [2000]
+0xF3D9 U+23465 # <cjk> [2000] [Unicode3.1]
+0xF3DA U+6833 # <cjk> [2000]
+0xF3DB U+683B # <cjk> [2000]
+0xF3DC U+683E # <cjk> [2000]
+0xF3DD U+6844 # <cjk> [2000]
+0xF3DE U+6845 # <cjk> [2000]
+0xF3DF U+6849 # <cjk> [2000]
+0xF3E0 U+684C # <cjk> [2000]
+0xF3E1 U+6855 # <cjk> [2000]
+0xF3E2 U+6857 # <cjk> [2000]
+0xF3E3 U+3B77 # <cjk> [2000]
+0xF3E4 U+686B # <cjk> [2000]
+0xF3E5 U+686E # <cjk> [2000]
+0xF3E6 U+687A # <cjk> [2000]
+0xF3E7 U+687C # <cjk> [2000]
+0xF3E8 U+6882 # <cjk> [2000]
+0xF3E9 U+6890 # <cjk> [2000]
+0xF3EA U+6896 # <cjk> [2000]
+0xF3EB U+3B6D # <cjk> [2000]
+0xF3EC U+6898 # <cjk> [2000]
+0xF3ED U+6899 # <cjk> [2000]
+0xF3EE U+689A # <cjk> [2000]
+0xF3EF U+689C # <cjk> [2000]
+0xF3F0 U+68AA # <cjk> [2000]
+0xF3F1 U+68AB # <cjk> [2000]
+0xF3F2 U+68B4 # <cjk> [2000]
+0xF3F3 U+68BB # <cjk> [2000]
+0xF3F4 U+68FB # <cjk> [2000]
+0xF3F5 U+234E4 # <cjk> [2000] [Unicode3.1]
+0xF3F6 U+2355A # <cjk> [2000] [Unicode3.1]
+0xF3F7 U+FA13 # CJK COMPATIBILITY IDEOGRAPH-FA13 [2000]
+0xF3F8 U+68C3 # <cjk> [2000]
+0xF3F9 U+68C5 # <cjk> [2000]
+0xF3FA U+68CC # <cjk> [2000]
+0xF3FB U+68CF # <cjk> [2000]
+0xF3FC U+68D6 # <cjk> [2000]
+0xF440 U+68D9 # <cjk> [2000]
+0xF441 U+68E4 # <cjk> [2000]
+0xF442 U+68E5 # <cjk> [2000]
+0xF443 U+68EC # <cjk> [2000]
+0xF444 U+68F7 # <cjk> [2000]
+0xF445 U+6903 # <cjk> [2000]
+0xF446 U+6907 # <cjk> [2000]
+0xF447 U+3B87 # <cjk> [2000]
+0xF448 U+3B88 # <cjk> [2000]
+0xF449 U+23594 # <cjk> [2000] [Unicode3.1]
+0xF44A U+693B # <cjk> [2000]
+0xF44B U+3B8D # <cjk> [2000]
+0xF44C U+6946 # <cjk> [2000]
+0xF44D U+6969 # <cjk> [2000]
+0xF44E U+696C # <cjk> [2000]
+0xF44F U+6972 # <cjk> [2000]
+0xF450 U+697A # <cjk> [2000]
+0xF451 U+697F # <cjk> [2000]
+0xF452 U+6992 # <cjk> [2000]
+0xF453 U+3BA4 # <cjk> [2000]
+0xF454 U+6996 # <cjk> [2000]
+0xF455 U+6998 # <cjk> [2000]
+0xF456 U+69A6 # <cjk> [2000]
+0xF457 U+69B0 # <cjk> [2000]
+0xF458 U+69B7 # <cjk> [2000]
+0xF459 U+69BA # <cjk> [2000]
+0xF45A U+69BC # <cjk> [2000]
+0xF45B U+69C0 # <cjk> [2000]
+0xF45C U+69D1 # <cjk> [2000]
+0xF45D U+69D6 # <cjk> [2000]
+0xF45E U+23639 # <cjk> [2000] [Unicode3.1]
+0xF45F U+23647 # <cjk> [2000] [Unicode3.1]
+0xF460 U+6A30 # <cjk> [2000]
+0xF461 U+23638 # <cjk> [2000] [Unicode3.1]
+0xF462 U+2363A # <cjk> [2000] [Unicode3.1]
+0xF463 U+69E3 # <cjk> [2000]
+0xF464 U+69EE # <cjk> [2000]
+0xF465 U+69EF # <cjk> [2000]
+0xF466 U+69F3 # <cjk> [2000]
+0xF467 U+3BCD # <cjk> [2000]
+0xF468 U+69F4 # <cjk> [2000]
+0xF469 U+69FE # <cjk> [2000]
+0xF46A U+6A11 # <cjk> [2000]
+0xF46B U+6A1A # <cjk> [2000]
+0xF46C U+6A1D # <cjk> [2000]
+0xF46D U+2371C # <cjk> [2000] [Unicode3.1]
+0xF46E U+6A32 # <cjk> [2000]
+0xF46F U+6A33 # <cjk> [2000]
+0xF470 U+6A34 # <cjk> [2000]
+0xF471 U+6A3F # <cjk> [2000]
+0xF472 U+6A46 # <cjk> [2000]
+0xF473 U+6A49 # <cjk> [2000]
+0xF474 U+6A7A # <cjk> [2000]
+0xF475 U+6A4E # <cjk> [2000]
+0xF476 U+6A52 # <cjk> [2000]
+0xF477 U+6A64 # <cjk> [2000]
+0xF478 U+2370C # <cjk> [2000] [Unicode3.1]
+0xF479 U+6A7E # <cjk> [2000]
+0xF47A U+6A83 # <cjk> [2000]
+0xF47B U+6A8B # <cjk> [2000]
+0xF47C U+3BF0 # <cjk> [2000]
+0xF47D U+6A91 # <cjk> [2000]
+0xF47E U+6A9F # <cjk> [2000]
+0xF480 U+6AA1 # <cjk> [2000]
+0xF481 U+23764 # <cjk> [2000] [Unicode3.1]
+0xF482 U+6AAB # <cjk> [2000]
+0xF483 U+6ABD # <cjk> [2000]
+0xF484 U+6AC6 # <cjk> [2000]
+0xF485 U+6AD4 # <cjk> [2000]
+0xF486 U+6AD0 # <cjk> [2000]
+0xF487 U+6ADC # <cjk> [2000]
+0xF488 U+6ADD # <cjk> [2000]
+0xF489 U+237FF # <cjk> [2000] [Unicode3.1]
+0xF48A U+237E7 # <cjk> [2000] [Unicode3.1]
+0xF48B U+6AEC # <cjk> [2000]
+0xF48C U+6AF1 # <cjk> [2000]
+0xF48D U+6AF2 # <cjk> [2000]
+0xF48E U+6AF3 # <cjk> [2000]
+0xF48F U+6AFD # <cjk> [2000]
+0xF490 U+23824 # <cjk> [2000] [Unicode3.1]
+0xF491 U+6B0B # <cjk> [2000]
+0xF492 U+6B0F # <cjk> [2000]
+0xF493 U+6B10 # <cjk> [2000]
+0xF494 U+6B11 # <cjk> [2000]
+0xF495 U+2383D # <cjk> [2000] [Unicode3.1]
+0xF496 U+6B17 # <cjk> [2000]
+0xF497 U+3C26 # <cjk> [2000]
+0xF498 U+6B2F # <cjk> [2000]
+0xF499 U+6B4A # <cjk> [2000]
+0xF49A U+6B58 # <cjk> [2000]
+0xF49B U+6B6C # <cjk> [2000]
+0xF49C U+6B75 # <cjk> [2000]
+0xF49D U+6B7A # <cjk> [2000]
+0xF49E U+6B81 # <cjk> [2000]
+0xF49F U+6B9B # <cjk> [2000]
+0xF4A0 U+6BAE # <cjk> [2000]
+0xF4A1 U+23A98 # <cjk> [2000] [Unicode3.1]
+0xF4A2 U+6BBD # <cjk> [2000]
+0xF4A3 U+6BBE # <cjk> [2000]
+0xF4A4 U+6BC7 # <cjk> [2000]
+0xF4A5 U+6BC8 # <cjk> [2000]
+0xF4A6 U+6BC9 # <cjk> [2000]
+0xF4A7 U+6BDA # <cjk> [2000]
+0xF4A8 U+6BE6 # <cjk> [2000]
+0xF4A9 U+6BE7 # <cjk> [2000]
+0xF4AA U+6BEE # <cjk> [2000]
+0xF4AB U+6BF1 # <cjk> [2000]
+0xF4AC U+6C02 # <cjk> [2000]
+0xF4AD U+6C0A # <cjk> [2000]
+0xF4AE U+6C0E # <cjk> [2000]
+0xF4AF U+6C35 # <cjk> [2000]
+0xF4B0 U+6C36 # <cjk> [2000]
+0xF4B1 U+6C3A # <cjk> [2000]
+0xF4B2 U+23C7F # <cjk> [2000] [Unicode3.1]
+0xF4B3 U+6C3F # <cjk> [2000]
+0xF4B4 U+6C4D # <cjk> [2000]
+0xF4B5 U+6C5B # <cjk> [2000]
+0xF4B6 U+6C6D # <cjk> [2000]
+0xF4B7 U+6C84 # <cjk> [2000]
+0xF4B8 U+6C89 # <cjk> [2000]
+0xF4B9 U+3CC3 # <cjk> [2000]
+0xF4BA U+6C94 # <cjk> [2000]
+0xF4BB U+6C95 # <cjk> [2000]
+0xF4BC U+6C97 # <cjk> [2000]
+0xF4BD U+6CAD # <cjk> [2000]
+0xF4BE U+6CC2 # <cjk> [2000]
+0xF4BF U+6CD0 # <cjk> [2000]
+0xF4C0 U+3CD2 # <cjk> [2000]
+0xF4C1 U+6CD6 # <cjk> [2000]
+0xF4C2 U+6CDA # <cjk> [2000]
+0xF4C3 U+6CDC # <cjk> [2000]
+0xF4C4 U+6CE9 # <cjk> [2000]
+0xF4C5 U+6CEC # <cjk> [2000]
+0xF4C6 U+6CED # <cjk> [2000]
+0xF4C7 U+23D00 # <cjk> [2000] [Unicode3.1]
+0xF4C8 U+6D00 # <cjk> [2000]
+0xF4C9 U+6D0A # <cjk> [2000]
+0xF4CA U+6D24 # <cjk> [2000]
+0xF4CB U+6D26 # <cjk> [2000]
+0xF4CC U+6D27 # <cjk> [2000]
+0xF4CD U+6C67 # <cjk> [2000]
+0xF4CE U+6D2F # <cjk> [2000]
+0xF4CF U+6D3C # <cjk> [2000]
+0xF4D0 U+6D5B # <cjk> [2000]
+0xF4D1 U+6D5E # <cjk> [2000]
+0xF4D2 U+6D60 # <cjk> [2000]
+0xF4D3 U+6D70 # <cjk> [2000]
+0xF4D4 U+6D80 # <cjk> [2000]
+0xF4D5 U+6D81 # <cjk> [2000]
+0xF4D6 U+6D8A # <cjk> [2000]
+0xF4D7 U+6D8D # <cjk> [2000]
+0xF4D8 U+6D91 # <cjk> [2000]
+0xF4D9 U+6D98 # <cjk> [2000]
+0xF4DA U+23D40 # <cjk> [2000] [Unicode3.1]
+0xF4DB U+6E17 # <cjk> [2000]
+0xF4DC U+23DFA # <cjk> [2000] [Unicode3.1]
+0xF4DD U+23DF9 # <cjk> [2000] [Unicode3.1]
+0xF4DE U+23DD3 # <cjk> [2000] [Unicode3.1]
+0xF4DF U+6DAB # <cjk> [2000]
+0xF4E0 U+6DAE # <cjk> [2000]
+0xF4E1 U+6DB4 # <cjk> [2000]
+0xF4E2 U+6DC2 # <cjk> [2000]
+0xF4E3 U+6D34 # <cjk> [2000]
+0xF4E4 U+6DC8 # <cjk> [2000]
+0xF4E5 U+6DCE # <cjk> [2000]
+0xF4E6 U+6DCF # <cjk> [2000]
+0xF4E7 U+6DD0 # <cjk> [2000]
+0xF4E8 U+6DDF # <cjk> [2000]
+0xF4E9 U+6DE9 # <cjk> [2000]
+0xF4EA U+6DF6 # <cjk> [2000]
+0xF4EB U+6E36 # <cjk> [2000]
+0xF4EC U+6E1E # <cjk> [2000]
+0xF4ED U+6E22 # <cjk> [2000]
+0xF4EE U+6E27 # <cjk> [2000]
+0xF4EF U+3D11 # <cjk> [2000]
+0xF4F0 U+6E32 # <cjk> [2000]
+0xF4F1 U+6E3C # <cjk> [2000]
+0xF4F2 U+6E48 # <cjk> [2000]
+0xF4F3 U+6E49 # <cjk> [2000]
+0xF4F4 U+6E4B # <cjk> [2000]
+0xF4F5 U+6E4C # <cjk> [2000]
+0xF4F6 U+6E4F # <cjk> [2000]
+0xF4F7 U+6E51 # <cjk> [2000]
+0xF4F8 U+6E53 # <cjk> [2000]
+0xF4F9 U+6E54 # <cjk> [2000]
+0xF4FA U+6E57 # <cjk> [2000]
+0xF4FB U+6E63 # <cjk> [2000]
+0xF4FC U+3D1E # <cjk> [2000]
+0xF540 U+6E93 # <cjk> [2000]
+0xF541 U+6EA7 # <cjk> [2000]
+0xF542 U+6EB4 # <cjk> [2000]
+0xF543 U+6EBF # <cjk> [2000]
+0xF544 U+6EC3 # <cjk> [2000]
+0xF545 U+6ECA # <cjk> [2000]
+0xF546 U+6ED9 # <cjk> [2000]
+0xF547 U+6F35 # <cjk> [2000]
+0xF548 U+6EEB # <cjk> [2000]
+0xF549 U+6EF9 # <cjk> [2000]
+0xF54A U+6EFB # <cjk> [2000]
+0xF54B U+6F0A # <cjk> [2000]
+0xF54C U+6F0C # <cjk> [2000]
+0xF54D U+6F18 # <cjk> [2000]
+0xF54E U+6F25 # <cjk> [2000]
+0xF54F U+6F36 # <cjk> [2000]
+0xF550 U+6F3C # <cjk> [2000]
+0xF551 U+23F7E # <cjk> [2000] [Unicode3.1]
+0xF552 U+6F52 # <cjk> [2000]
+0xF553 U+6F57 # <cjk> [2000]
+0xF554 U+6F5A # <cjk> [2000]
+0xF555 U+6F60 # <cjk> [2000]
+0xF556 U+6F68 # <cjk> [2000]
+0xF557 U+6F98 # <cjk> [2000]
+0xF558 U+6F7D # <cjk> [2000]
+0xF559 U+6F90 # <cjk> [2000]
+0xF55A U+6F96 # <cjk> [2000]
+0xF55B U+6FBE # <cjk> [2000]
+0xF55C U+6F9F # <cjk> [2000]
+0xF55D U+6FA5 # <cjk> [2000]
+0xF55E U+6FAF # <cjk> [2000]
+0xF55F U+3D64 # <cjk> [2000]
+0xF560 U+6FB5 # <cjk> [2000]
+0xF561 U+6FC8 # <cjk> [2000]
+0xF562 U+6FC9 # <cjk> [2000]
+0xF563 U+6FDA # <cjk> [2000]
+0xF564 U+6FDE # <cjk> [2000]
+0xF565 U+6FE9 # <cjk> [2000]
+0xF566 U+24096 # <cjk> [2000] [Unicode3.1]
+0xF567 U+6FFC # <cjk> [2000]
+0xF568 U+7000 # <cjk> [2000]
+0xF569 U+7007 # <cjk> [2000]
+0xF56A U+700A # <cjk> [2000]
+0xF56B U+7023 # <cjk> [2000]
+0xF56C U+24103 # <cjk> [2000] [Unicode3.1]
+0xF56D U+7039 # <cjk> [2000]
+0xF56E U+703A # <cjk> [2000]
+0xF56F U+703C # <cjk> [2000]
+0xF570 U+7043 # <cjk> [2000]
+0xF571 U+7047 # <cjk> [2000]
+0xF572 U+704B # <cjk> [2000]
+0xF573 U+3D9A # <cjk> [2000]
+0xF574 U+7054 # <cjk> [2000]
+0xF575 U+7065 # <cjk> [2000]
+0xF576 U+7069 # <cjk> [2000]
+0xF577 U+706C # <cjk> [2000]
+0xF578 U+706E # <cjk> [2000]
+0xF579 U+7076 # <cjk> [2000]
+0xF57A U+707E # <cjk> [2000]
+0xF57B U+7081 # <cjk> [2000]
+0xF57C U+7086 # <cjk> [2000]
+0xF57D U+7095 # <cjk> [2000]
+0xF57E U+7097 # <cjk> [2000]
+0xF580 U+70BB # <cjk> [2000]
+0xF581 U+241C6 # <cjk> [2000] [Unicode3.1]
+0xF582 U+709F # <cjk> [2000]
+0xF583 U+70B1 # <cjk> [2000]
+0xF584 U+241FE # <cjk> [2000] [Unicode3.1]
+0xF585 U+70EC # <cjk> [2000]
+0xF586 U+70CA # <cjk> [2000]
+0xF587 U+70D1 # <cjk> [2000]
+0xF588 U+70D3 # <cjk> [2000]
+0xF589 U+70DC # <cjk> [2000]
+0xF58A U+7103 # <cjk> [2000]
+0xF58B U+7104 # <cjk> [2000]
+0xF58C U+7106 # <cjk> [2000]
+0xF58D U+7107 # <cjk> [2000]
+0xF58E U+7108 # <cjk> [2000]
+0xF58F U+710C # <cjk> [2000]
+0xF590 U+3DC0 # <cjk> [2000]
+0xF591 U+712F # <cjk> [2000]
+0xF592 U+7131 # <cjk> [2000]
+0xF593 U+7150 # <cjk> [2000]
+0xF594 U+714A # <cjk> [2000]
+0xF595 U+7153 # <cjk> [2000]
+0xF596 U+715E # <cjk> [2000]
+0xF597 U+3DD4 # <cjk> [2000]
+0xF598 U+7196 # <cjk> [2000]
+0xF599 U+7180 # <cjk> [2000]
+0xF59A U+719B # <cjk> [2000]
+0xF59B U+71A0 # <cjk> [2000]
+0xF59C U+71A2 # <cjk> [2000]
+0xF59D U+71AE # <cjk> [2000]
+0xF59E U+71AF # <cjk> [2000]
+0xF59F U+71B3 # <cjk> [2000]
+0xF5A0 U+243BC # <cjk> [2000] [Unicode3.1]
+0xF5A1 U+71CB # <cjk> [2000]
+0xF5A2 U+71D3 # <cjk> [2000]
+0xF5A3 U+71D9 # <cjk> [2000]
+0xF5A4 U+71DC # <cjk> [2000]
+0xF5A5 U+7207 # <cjk> [2000]
+0xF5A6 U+3E05 # <cjk> [2000]
+0xF5A7 U+FA49 # CJK COMPATIBILITY IDEOGRAPH-FA49 [2000] [Unicode3.2]
+0xF5A8 U+722B # <cjk> [2000]
+0xF5A9 U+7234 # <cjk> [2000]
+0xF5AA U+7238 # <cjk> [2000]
+0xF5AB U+7239 # <cjk> [2000]
+0xF5AC U+4E2C # <cjk> [2000]
+0xF5AD U+7242 # <cjk> [2000]
+0xF5AE U+7253 # <cjk> [2000]
+0xF5AF U+7257 # <cjk> [2000]
+0xF5B0 U+7263 # <cjk> [2000]
+0xF5B1 U+24629 # <cjk> [2000] [Unicode3.1]
+0xF5B2 U+726E # <cjk> [2000]
+0xF5B3 U+726F # <cjk> [2000]
+0xF5B4 U+7278 # <cjk> [2000]
+0xF5B5 U+727F # <cjk> [2000]
+0xF5B6 U+728E # <cjk> [2000]
+0xF5B7 U+246A5 # <cjk> [2000] [Unicode3.1]
+0xF5B8 U+72AD # <cjk> [2000]
+0xF5B9 U+72AE # <cjk> [2000]
+0xF5BA U+72B0 # <cjk> [2000]
+0xF5BB U+72B1 # <cjk> [2000]
+0xF5BC U+72C1 # <cjk> [2000]
+0xF5BD U+3E60 # <cjk> [2000]
+0xF5BE U+72CC # <cjk> [2000]
+0xF5BF U+3E66 # <cjk> [2000]
+0xF5C0 U+3E68 # <cjk> [2000]
+0xF5C1 U+72F3 # <cjk> [2000]
+0xF5C2 U+72FA # <cjk> [2000]
+0xF5C3 U+7307 # <cjk> [2000]
+0xF5C4 U+7312 # <cjk> [2000]
+0xF5C5 U+7318 # <cjk> [2000]
+0xF5C6 U+7319 # <cjk> [2000]
+0xF5C7 U+3E83 # <cjk> [2000]
+0xF5C8 U+7339 # <cjk> [2000]
+0xF5C9 U+732C # <cjk> [2000]
+0xF5CA U+7331 # <cjk> [2000]
+0xF5CB U+7333 # <cjk> [2000]
+0xF5CC U+733D # <cjk> [2000]
+0xF5CD U+7352 # <cjk> [2000]
+0xF5CE U+3E94 # <cjk> [2000]
+0xF5CF U+736B # <cjk> [2000]
+0xF5D0 U+736C # <cjk> [2000]
+0xF5D1 U+24896 # <cjk> [2000] [Unicode3.1]
+0xF5D2 U+736E # <cjk> [2000]
+0xF5D3 U+736F # <cjk> [2000]
+0xF5D4 U+7371 # <cjk> [2000]
+0xF5D5 U+7377 # <cjk> [2000]
+0xF5D6 U+7381 # <cjk> [2000]
+0xF5D7 U+7385 # <cjk> [2000]
+0xF5D8 U+738A # <cjk> [2000]
+0xF5D9 U+7394 # <cjk> [2000]
+0xF5DA U+7398 # <cjk> [2000]
+0xF5DB U+739C # <cjk> [2000]
+0xF5DC U+739E # <cjk> [2000]
+0xF5DD U+73A5 # <cjk> [2000]
+0xF5DE U+73A8 # <cjk> [2000]
+0xF5DF U+73B5 # <cjk> [2000]
+0xF5E0 U+73B7 # <cjk> [2000]
+0xF5E1 U+73B9 # <cjk> [2000]
+0xF5E2 U+73BC # <cjk> [2000]
+0xF5E3 U+73BF # <cjk> [2000]
+0xF5E4 U+73C5 # <cjk> [2000]
+0xF5E5 U+73CB # <cjk> [2000]
+0xF5E6 U+73E1 # <cjk> [2000]
+0xF5E7 U+73E7 # <cjk> [2000]
+0xF5E8 U+73F9 # <cjk> [2000]
+0xF5E9 U+7413 # <cjk> [2000]
+0xF5EA U+73FA # <cjk> [2000]
+0xF5EB U+7401 # <cjk> [2000]
+0xF5EC U+7424 # <cjk> [2000]
+0xF5ED U+7431 # <cjk> [2000]
+0xF5EE U+7439 # <cjk> [2000]
+0xF5EF U+7453 # <cjk> [2000]
+0xF5F0 U+7440 # <cjk> [2000]
+0xF5F1 U+7443 # <cjk> [2000]
+0xF5F2 U+744D # <cjk> [2000]
+0xF5F3 U+7452 # <cjk> [2000]
+0xF5F4 U+745D # <cjk> [2000]
+0xF5F5 U+7471 # <cjk> [2000]
+0xF5F6 U+7481 # <cjk> [2000]
+0xF5F7 U+7485 # <cjk> [2000]
+0xF5F8 U+7488 # <cjk> [2000]
+0xF5F9 U+24A4D # <cjk> [2000] [Unicode3.1]
+0xF5FA U+7492 # <cjk> [2000]
+0xF5FB U+7497 # <cjk> [2000]
+0xF5FC U+7499 # <cjk> [2000]
+0xF640 U+74A0 # <cjk> [2000]
+0xF641 U+74A1 # <cjk> [2000]
+0xF642 U+74A5 # <cjk> [2000]
+0xF643 U+74AA # <cjk> [2000]
+0xF644 U+74AB # <cjk> [2000]
+0xF645 U+74B9 # <cjk> [2000]
+0xF646 U+74BB # <cjk> [2000]
+0xF647 U+74BA # <cjk> [2000]
+0xF648 U+74D6 # <cjk> [2000]
+0xF649 U+74D8 # <cjk> [2000]
+0xF64A U+74DE # <cjk> [2000]
+0xF64B U+74EF # <cjk> [2000]
+0xF64C U+74EB # <cjk> [2000]
+0xF64D U+24B56 # <cjk> [2000] [Unicode3.1]
+0xF64E U+74FA # <cjk> [2000]
+0xF64F U+24B6F # <cjk> [2000] [Unicode3.1]
+0xF650 U+7520 # <cjk> [2000]
+0xF651 U+7524 # <cjk> [2000]
+0xF652 U+752A # <cjk> [2000]
+0xF653 U+3F57 # <cjk> [2000]
+0xF654 U+24C16 # <cjk> [2000] [Unicode3.1]
+0xF655 U+753D # <cjk> [2000]
+0xF656 U+753E # <cjk> [2000]
+0xF657 U+7540 # <cjk> [2000]
+0xF658 U+7548 # <cjk> [2000]
+0xF659 U+754E # <cjk> [2000]
+0xF65A U+7550 # <cjk> [2000]
+0xF65B U+7552 # <cjk> [2000]
+0xF65C U+756C # <cjk> [2000]
+0xF65D U+7572 # <cjk> [2000]
+0xF65E U+7571 # <cjk> [2000]
+0xF65F U+757A # <cjk> [2000]
+0xF660 U+757D # <cjk> [2000]
+0xF661 U+757E # <cjk> [2000]
+0xF662 U+7581 # <cjk> [2000]
+0xF663 U+24D14 # <cjk> [2000] [Unicode3.1]
+0xF664 U+758C # <cjk> [2000]
+0xF665 U+3F75 # <cjk> [2000]
+0xF666 U+75A2 # <cjk> [2000]
+0xF667 U+3F77 # <cjk> [2000]
+0xF668 U+75B0 # <cjk> [2000]
+0xF669 U+75B7 # <cjk> [2000]
+0xF66A U+75BF # <cjk> [2000]
+0xF66B U+75C0 # <cjk> [2000]
+0xF66C U+75C6 # <cjk> [2000]
+0xF66D U+75CF # <cjk> [2000]
+0xF66E U+75D3 # <cjk> [2000]
+0xF66F U+75DD # <cjk> [2000]
+0xF670 U+75DF # <cjk> [2000]
+0xF671 U+75E0 # <cjk> [2000]
+0xF672 U+75E7 # <cjk> [2000]
+0xF673 U+75EC # <cjk> [2000]
+0xF674 U+75EE # <cjk> [2000]
+0xF675 U+75F1 # <cjk> [2000]
+0xF676 U+75F9 # <cjk> [2000]
+0xF677 U+7603 # <cjk> [2000]
+0xF678 U+7618 # <cjk> [2000]
+0xF679 U+7607 # <cjk> [2000]
+0xF67A U+760F # <cjk> [2000]
+0xF67B U+3FAE # <cjk> [2000]
+0xF67C U+24E0E # <cjk> [2000] [Unicode3.1]
+0xF67D U+7613 # <cjk> [2000]
+0xF67E U+761B # <cjk> [2000]
+0xF680 U+761C # <cjk> [2000]
+0xF681 U+24E37 # <cjk> [2000] [Unicode3.1]
+0xF682 U+7625 # <cjk> [2000]
+0xF683 U+7628 # <cjk> [2000]
+0xF684 U+763C # <cjk> [2000]
+0xF685 U+7633 # <cjk> [2000]
+0xF686 U+24E6A # <cjk> [2000] [Unicode3.1]
+0xF687 U+3FC9 # <cjk> [2000]
+0xF688 U+7641 # <cjk> [2000]
+0xF689 U+24E8B # <cjk> [2000] [Unicode3.1]
+0xF68A U+7649 # <cjk> [2000]
+0xF68B U+7655 # <cjk> [2000]
+0xF68C U+3FD7 # <cjk> [2000]
+0xF68D U+766E # <cjk> [2000]
+0xF68E U+7695 # <cjk> [2000]
+0xF68F U+769C # <cjk> [2000]
+0xF690 U+76A1 # <cjk> [2000]
+0xF691 U+76A0 # <cjk> [2000]
+0xF692 U+76A7 # <cjk> [2000]
+0xF693 U+76A8 # <cjk> [2000]
+0xF694 U+76AF # <cjk> [2000]
+0xF695 U+2504A # <cjk> [2000] [Unicode3.1]
+0xF696 U+76C9 # <cjk> [2000]
+0xF697 U+25055 # <cjk> [2000] [Unicode3.1]
+0xF698 U+76E8 # <cjk> [2000]
+0xF699 U+76EC # <cjk> [2000]
+0xF69A U+25122 # <cjk> [2000] [Unicode3.1]
+0xF69B U+7717 # <cjk> [2000]
+0xF69C U+771A # <cjk> [2000]
+0xF69D U+772D # <cjk> [2000]
+0xF69E U+7735 # <cjk> [2000]
+0xF69F U+251A9 # <cjk> [2000] [Unicode3.1]
+0xF6A0 U+4039 # <cjk> [2000]
+0xF6A1 U+251E5 # <cjk> [2000] [Unicode3.1]
+0xF6A2 U+251CD # <cjk> [2000] [Unicode3.1]
+0xF6A3 U+7758 # <cjk> [2000]
+0xF6A4 U+7760 # <cjk> [2000]
+0xF6A5 U+776A # <cjk> [2000]
+0xF6A6 U+2521E # <cjk> [2000] [Unicode3.1]
+0xF6A7 U+7772 # <cjk> [2000]
+0xF6A8 U+777C # <cjk> [2000]
+0xF6A9 U+777D # <cjk> [2000]
+0xF6AA U+2524C # <cjk> [2000] [Unicode3.1]
+0xF6AB U+4058 # <cjk> [2000]
+0xF6AC U+779A # <cjk> [2000]
+0xF6AD U+779F # <cjk> [2000]
+0xF6AE U+77A2 # <cjk> [2000]
+0xF6AF U+77A4 # <cjk> [2000]
+0xF6B0 U+77A9 # <cjk> [2000]
+0xF6B1 U+77DE # <cjk> [2000]
+0xF6B2 U+77DF # <cjk> [2000]
+0xF6B3 U+77E4 # <cjk> [2000]
+0xF6B4 U+77E6 # <cjk> [2000]
+0xF6B5 U+77EA # <cjk> [2000]
+0xF6B6 U+77EC # <cjk> [2000]
+0xF6B7 U+4093 # <cjk> [2000]
+0xF6B8 U+77F0 # <cjk> [2000]
+0xF6B9 U+77F4 # <cjk> [2000]
+0xF6BA U+77FB # <cjk> [2000]
+0xF6BB U+2542E # <cjk> [2000] [Unicode3.1]
+0xF6BC U+7805 # <cjk> [2000]
+0xF6BD U+7806 # <cjk> [2000]
+0xF6BE U+7809 # <cjk> [2000]
+0xF6BF U+780D # <cjk> [2000]
+0xF6C0 U+7819 # <cjk> [2000]
+0xF6C1 U+7821 # <cjk> [2000]
+0xF6C2 U+782C # <cjk> [2000]
+0xF6C3 U+7847 # <cjk> [2000]
+0xF6C4 U+7864 # <cjk> [2000]
+0xF6C5 U+786A # <cjk> [2000]
+0xF6C6 U+254D9 # <cjk> [2000] [Unicode3.1]
+0xF6C7 U+788A # <cjk> [2000]
+0xF6C8 U+7894 # <cjk> [2000]
+0xF6C9 U+78A4 # <cjk> [2000]
+0xF6CA U+789D # <cjk> [2000]
+0xF6CB U+789E # <cjk> [2000]
+0xF6CC U+789F # <cjk> [2000]
+0xF6CD U+78BB # <cjk> [2000]
+0xF6CE U+78C8 # <cjk> [2000]
+0xF6CF U+78CC # <cjk> [2000]
+0xF6D0 U+78CE # <cjk> [2000]
+0xF6D1 U+78D5 # <cjk> [2000]
+0xF6D2 U+78E0 # <cjk> [2000]
+0xF6D3 U+78E1 # <cjk> [2000]
+0xF6D4 U+78E6 # <cjk> [2000]
+0xF6D5 U+78F9 # <cjk> [2000]
+0xF6D6 U+78FA # <cjk> [2000]
+0xF6D7 U+78FB # <cjk> [2000]
+0xF6D8 U+78FE # <cjk> [2000]
+0xF6D9 U+255A7 # <cjk> [2000] [Unicode3.1]
+0xF6DA U+7910 # <cjk> [2000]
+0xF6DB U+791B # <cjk> [2000]
+0xF6DC U+7930 # <cjk> [2000]
+0xF6DD U+7925 # <cjk> [2000]
+0xF6DE U+793B # <cjk> [2000]
+0xF6DF U+794A # <cjk> [2000]
+0xF6E0 U+7958 # <cjk> [2000]
+0xF6E1 U+795B # <cjk> [2000]
+0xF6E2 U+4105 # <cjk> [2000]
+0xF6E3 U+7967 # <cjk> [2000]
+0xF6E4 U+7972 # <cjk> [2000]
+0xF6E5 U+7994 # <cjk> [2000]
+0xF6E6 U+7995 # <cjk> [2000]
+0xF6E7 U+7996 # <cjk> [2000]
+0xF6E8 U+799B # <cjk> [2000]
+0xF6E9 U+79A1 # <cjk> [2000]
+0xF6EA U+79A9 # <cjk> [2000]
+0xF6EB U+79B4 # <cjk> [2000]
+0xF6EC U+79BB # <cjk> [2000]
+0xF6ED U+79C2 # <cjk> [2000]
+0xF6EE U+79C7 # <cjk> [2000]
+0xF6EF U+79CC # <cjk> [2000]
+0xF6F0 U+79CD # <cjk> [2000]
+0xF6F1 U+79D6 # <cjk> [2000]
+0xF6F2 U+4148 # <cjk> [2000]
+0xF6F3 U+257A9 # <cjk> [2000] [Unicode3.1]
+0xF6F4 U+257B4 # <cjk> [2000] [Unicode3.1]
+0xF6F5 U+414F # <cjk> [2000]
+0xF6F6 U+7A0A # <cjk> [2000]
+0xF6F7 U+7A11 # <cjk> [2000]
+0xF6F8 U+7A15 # <cjk> [2000]
+0xF6F9 U+7A1B # <cjk> [2000]
+0xF6FA U+7A1E # <cjk> [2000]
+0xF6FB U+4163 # <cjk> [2000]
+0xF6FC U+7A2D # <cjk> [2000]
+0xF740 U+7A38 # <cjk> [2000]
+0xF741 U+7A47 # <cjk> [2000]
+0xF742 U+7A4C # <cjk> [2000]
+0xF743 U+7A56 # <cjk> [2000]
+0xF744 U+7A59 # <cjk> [2000]
+0xF745 U+7A5C # <cjk> [2000]
+0xF746 U+7A5F # <cjk> [2000]
+0xF747 U+7A60 # <cjk> [2000]
+0xF748 U+7A67 # <cjk> [2000]
+0xF749 U+7A6A # <cjk> [2000]
+0xF74A U+7A75 # <cjk> [2000]
+0xF74B U+7A78 # <cjk> [2000]
+0xF74C U+7A82 # <cjk> [2000]
+0xF74D U+7A8A # <cjk> [2000]
+0xF74E U+7A90 # <cjk> [2000]
+0xF74F U+7AA3 # <cjk> [2000]
+0xF750 U+7AAC # <cjk> [2000]
+0xF751 U+259D4 # <cjk> [2000] [Unicode3.1]
+0xF752 U+41B4 # <cjk> [2000]
+0xF753 U+7AB9 # <cjk> [2000]
+0xF754 U+7ABC # <cjk> [2000]
+0xF755 U+7ABE # <cjk> [2000]
+0xF756 U+41BF # <cjk> [2000]
+0xF757 U+7ACC # <cjk> [2000]
+0xF758 U+7AD1 # <cjk> [2000]
+0xF759 U+7AE7 # <cjk> [2000]
+0xF75A U+7AE8 # <cjk> [2000]
+0xF75B U+7AF4 # <cjk> [2000]
+0xF75C U+25AE4 # <cjk> [2000] [Unicode3.1]
+0xF75D U+25AE3 # <cjk> [2000] [Unicode3.1]
+0xF75E U+7B07 # <cjk> [2000]
+0xF75F U+25AF1 # <cjk> [2000] [Unicode3.1]
+0xF760 U+7B3D # <cjk> [2000]
+0xF761 U+7B27 # <cjk> [2000]
+0xF762 U+7B2A # <cjk> [2000]
+0xF763 U+7B2E # <cjk> [2000]
+0xF764 U+7B2F # <cjk> [2000]
+0xF765 U+7B31 # <cjk> [2000]
+0xF766 U+41E6 # <cjk> [2000]
+0xF767 U+41F3 # <cjk> [2000]
+0xF768 U+7B7F # <cjk> [2000]
+0xF769 U+7B41 # <cjk> [2000]
+0xF76A U+41EE # <cjk> [2000]
+0xF76B U+7B55 # <cjk> [2000]
+0xF76C U+7B79 # <cjk> [2000]
+0xF76D U+7B64 # <cjk> [2000]
+0xF76E U+7B66 # <cjk> [2000]
+0xF76F U+7B69 # <cjk> [2000]
+0xF770 U+7B73 # <cjk> [2000]
+0xF771 U+25BB2 # <cjk> [2000] [Unicode3.1]
+0xF772 U+4207 # <cjk> [2000]
+0xF773 U+7B90 # <cjk> [2000]
+0xF774 U+7B91 # <cjk> [2000]
+0xF775 U+7B9B # <cjk> [2000]
+0xF776 U+420E # <cjk> [2000]
+0xF777 U+7BAF # <cjk> [2000]
+0xF778 U+7BB5 # <cjk> [2000]
+0xF779 U+7BBC # <cjk> [2000]
+0xF77A U+7BC5 # <cjk> [2000]
+0xF77B U+7BCA # <cjk> [2000]
+0xF77C U+25C4B # <cjk> [2000] [Unicode3.1]
+0xF77D U+25C64 # <cjk> [2000] [Unicode3.1]
+0xF77E U+7BD4 # <cjk> [2000]
+0xF780 U+7BD6 # <cjk> [2000]
+0xF781 U+7BDA # <cjk> [2000]
+0xF782 U+7BEA # <cjk> [2000]
+0xF783 U+7BF0 # <cjk> [2000]
+0xF784 U+7C03 # <cjk> [2000]
+0xF785 U+7C0B # <cjk> [2000]
+0xF786 U+7C0E # <cjk> [2000]
+0xF787 U+7C0F # <cjk> [2000]
+0xF788 U+7C26 # <cjk> [2000]
+0xF789 U+7C45 # <cjk> [2000]
+0xF78A U+7C4A # <cjk> [2000]
+0xF78B U+7C51 # <cjk> [2000]
+0xF78C U+7C57 # <cjk> [2000]
+0xF78D U+7C5E # <cjk> [2000]
+0xF78E U+7C61 # <cjk> [2000]
+0xF78F U+7C69 # <cjk> [2000]
+0xF790 U+7C6E # <cjk> [2000]
+0xF791 U+7C6F # <cjk> [2000]
+0xF792 U+7C70 # <cjk> [2000]
+0xF793 U+25E2E # <cjk> [2000] [Unicode3.1]
+0xF794 U+25E56 # <cjk> [2000] [Unicode3.1]
+0xF795 U+25E65 # <cjk> [2000] [Unicode3.1]
+0xF796 U+7CA6 # <cjk> [2000]
+0xF797 U+25E62 # <cjk> [2000] [Unicode3.1]
+0xF798 U+7CB6 # <cjk> [2000]
+0xF799 U+7CB7 # <cjk> [2000]
+0xF79A U+7CBF # <cjk> [2000]
+0xF79B U+25ED8 # <cjk> [2000] [Unicode3.1]
+0xF79C U+7CC4 # <cjk> [2000]
+0xF79D U+25EC2 # <cjk> [2000] [Unicode3.1]
+0xF79E U+7CC8 # <cjk> [2000]
+0xF79F U+7CCD # <cjk> [2000]
+0xF7A0 U+25EE8 # <cjk> [2000] [Unicode3.1]
+0xF7A1 U+7CD7 # <cjk> [2000]
+0xF7A2 U+25F23 # <cjk> [2000] [Unicode3.1]
+0xF7A3 U+7CE6 # <cjk> [2000]
+0xF7A4 U+7CEB # <cjk> [2000]
+0xF7A5 U+25F5C # <cjk> [2000] [Unicode3.1]
+0xF7A6 U+7CF5 # <cjk> [2000]
+0xF7A7 U+7D03 # <cjk> [2000]
+0xF7A8 U+7D09 # <cjk> [2000]
+0xF7A9 U+42C6 # <cjk> [2000]
+0xF7AA U+7D12 # <cjk> [2000]
+0xF7AB U+7D1E # <cjk> [2000]
+0xF7AC U+25FE0 # <cjk> [2000] [Unicode3.1]
+0xF7AD U+25FD4 # <cjk> [2000] [Unicode3.1]
+0xF7AE U+7D3D # <cjk> [2000]
+0xF7AF U+7D3E # <cjk> [2000]
+0xF7B0 U+7D40 # <cjk> [2000]
+0xF7B1 U+7D47 # <cjk> [2000]
+0xF7B2 U+2600C # <cjk> [2000] [Unicode3.1]
+0xF7B3 U+25FFB # <cjk> [2000] [Unicode3.1]
+0xF7B4 U+42D6 # <cjk> [2000]
+0xF7B5 U+7D59 # <cjk> [2000]
+0xF7B6 U+7D5A # <cjk> [2000]
+0xF7B7 U+7D6A # <cjk> [2000]
+0xF7B8 U+7D70 # <cjk> [2000]
+0xF7B9 U+42DD # <cjk> [2000]
+0xF7BA U+7D7F # <cjk> [2000]
+0xF7BB U+26017 # <cjk> [2000] [Unicode3.1]
+0xF7BC U+7D86 # <cjk> [2000]
+0xF7BD U+7D88 # <cjk> [2000]
+0xF7BE U+7D8C # <cjk> [2000]
+0xF7BF U+7D97 # <cjk> [2000]
+0xF7C0 U+26060 # <cjk> [2000] [Unicode3.1]
+0xF7C1 U+7D9D # <cjk> [2000]
+0xF7C2 U+7DA7 # <cjk> [2000]
+0xF7C3 U+7DAA # <cjk> [2000]
+0xF7C4 U+7DB6 # <cjk> [2000]
+0xF7C5 U+7DB7 # <cjk> [2000]
+0xF7C6 U+7DC0 # <cjk> [2000]
+0xF7C7 U+7DD7 # <cjk> [2000]
+0xF7C8 U+7DD9 # <cjk> [2000]
+0xF7C9 U+7DE6 # <cjk> [2000]
+0xF7CA U+7DF1 # <cjk> [2000]
+0xF7CB U+7DF9 # <cjk> [2000]
+0xF7CC U+4302 # <cjk> [2000]
+0xF7CD U+260ED # <cjk> [2000] [Unicode3.1]
+0xF7CE U+FA58 # CJK COMPATIBILITY IDEOGRAPH-FA58 [2000] [Unicode3.2]
+0xF7CF U+7E10 # <cjk> [2000]
+0xF7D0 U+7E17 # <cjk> [2000]
+0xF7D1 U+7E1D # <cjk> [2000]
+0xF7D2 U+7E20 # <cjk> [2000]
+0xF7D3 U+7E27 # <cjk> [2000]
+0xF7D4 U+7E2C # <cjk> [2000]
+0xF7D5 U+7E45 # <cjk> [2000]
+0xF7D6 U+7E73 # <cjk> [2000]
+0xF7D7 U+7E75 # <cjk> [2000]
+0xF7D8 U+7E7E # <cjk> [2000]
+0xF7D9 U+7E86 # <cjk> [2000]
+0xF7DA U+7E87 # <cjk> [2000]
+0xF7DB U+432B # <cjk> [2000]
+0xF7DC U+7E91 # <cjk> [2000]
+0xF7DD U+7E98 # <cjk> [2000]
+0xF7DE U+7E9A # <cjk> [2000]
+0xF7DF U+4343 # <cjk> [2000]
+0xF7E0 U+7F3C # <cjk> [2000]
+0xF7E1 U+7F3B # <cjk> [2000]
+0xF7E2 U+7F3E # <cjk> [2000]
+0xF7E3 U+7F43 # <cjk> [2000]
+0xF7E4 U+7F44 # <cjk> [2000]
+0xF7E5 U+7F4F # <cjk> [2000]
+0xF7E6 U+34C1 # <cjk> [2000]
+0xF7E7 U+26270 # <cjk> [2000] [Unicode3.1]
+0xF7E8 U+7F52 # <cjk> [2000]
+0xF7E9 U+26286 # <cjk> [2000] [Unicode3.1]
+0xF7EA U+7F61 # <cjk> [2000]
+0xF7EB U+7F63 # <cjk> [2000]
+0xF7EC U+7F64 # <cjk> [2000]
+0xF7ED U+7F6D # <cjk> [2000]
+0xF7EE U+7F7D # <cjk> [2000]
+0xF7EF U+7F7E # <cjk> [2000]
+0xF7F0 U+2634C # <cjk> [2000] [Unicode3.1]
+0xF7F1 U+7F90 # <cjk> [2000]
+0xF7F2 U+517B # <cjk> [2000]
+0xF7F3 U+23D0E # <cjk> [2000] [Unicode3.1]
+0xF7F4 U+7F96 # <cjk> [2000]
+0xF7F5 U+7F9C # <cjk> [2000]
+0xF7F6 U+7FAD # <cjk> [2000]
+0xF7F7 U+26402 # <cjk> [2000] [Unicode3.1]
+0xF7F8 U+7FC3 # <cjk> [2000]
+0xF7F9 U+7FCF # <cjk> [2000]
+0xF7FA U+7FE3 # <cjk> [2000]
+0xF7FB U+7FE5 # <cjk> [2000]
+0xF7FC U+7FEF # <cjk> [2000]
+0xF840 U+7FF2 # <cjk> [2000]
+0xF841 U+8002 # <cjk> [2000]
+0xF842 U+800A # <cjk> [2000]
+0xF843 U+8008 # <cjk> [2000]
+0xF844 U+800E # <cjk> [2000]
+0xF845 U+8011 # <cjk> [2000]
+0xF846 U+8016 # <cjk> [2000]
+0xF847 U+8024 # <cjk> [2000]
+0xF848 U+802C # <cjk> [2000]
+0xF849 U+8030 # <cjk> [2000]
+0xF84A U+8043 # <cjk> [2000]
+0xF84B U+8066 # <cjk> [2000]
+0xF84C U+8071 # <cjk> [2000]
+0xF84D U+8075 # <cjk> [2000]
+0xF84E U+807B # <cjk> [2000]
+0xF84F U+8099 # <cjk> [2000]
+0xF850 U+809C # <cjk> [2000]
+0xF851 U+80A4 # <cjk> [2000]
+0xF852 U+80A7 # <cjk> [2000]
+0xF853 U+80B8 # <cjk> [2000]
+0xF854 U+2667E # <cjk> [2000] [Unicode3.1]
+0xF855 U+80C5 # <cjk> [2000]
+0xF856 U+80D5 # <cjk> [2000]
+0xF857 U+80D8 # <cjk> [2000]
+0xF858 U+80E6 # <cjk> [2000]
+0xF859 U+266B0 # <cjk> [2000] [Unicode3.1]
+0xF85A U+810D # <cjk> [2000]
+0xF85B U+80F5 # <cjk> [2000]
+0xF85C U+80FB # <cjk> [2000]
+0xF85D U+43EE # <cjk> [2000]
+0xF85E U+8135 # <cjk> [2000]
+0xF85F U+8116 # <cjk> [2000]
+0xF860 U+811E # <cjk> [2000]
+0xF861 U+43F0 # <cjk> [2000]
+0xF862 U+8124 # <cjk> [2000]
+0xF863 U+8127 # <cjk> [2000]
+0xF864 U+812C # <cjk> [2000]
+0xF865 U+2671D # <cjk> [2000] [Unicode3.1]
+0xF866 U+813D # <cjk> [2000]
+0xF867 U+4408 # <cjk> [2000]
+0xF868 U+8169 # <cjk> [2000]
+0xF869 U+4417 # <cjk> [2000]
+0xF86A U+8181 # <cjk> [2000]
+0xF86B U+441C # <cjk> [2000]
+0xF86C U+8184 # <cjk> [2000]
+0xF86D U+8185 # <cjk> [2000]
+0xF86E U+4422 # <cjk> [2000]
+0xF86F U+8198 # <cjk> [2000]
+0xF870 U+81B2 # <cjk> [2000]
+0xF871 U+81C1 # <cjk> [2000]
+0xF872 U+81C3 # <cjk> [2000]
+0xF873 U+81D6 # <cjk> [2000]
+0xF874 U+81DB # <cjk> [2000]
+0xF875 U+268DD # <cjk> [2000] [Unicode3.1]
+0xF876 U+81E4 # <cjk> [2000]
+0xF877 U+268EA # <cjk> [2000] [Unicode3.1]
+0xF878 U+81EC # <cjk> [2000]
+0xF879 U+26951 # <cjk> [2000] [Unicode3.1]
+0xF87A U+81FD # <cjk> [2000]
+0xF87B U+81FF # <cjk> [2000]
+0xF87C U+2696F # <cjk> [2000] [Unicode3.1]
+0xF87D U+8204 # <cjk> [2000]
+0xF87E U+269DD # <cjk> [2000] [Unicode3.1]
+0xF880 U+8219 # <cjk> [2000]
+0xF881 U+8221 # <cjk> [2000]
+0xF882 U+8222 # <cjk> [2000]
+0xF883 U+26A1E # <cjk> [2000] [Unicode3.1]
+0xF884 U+8232 # <cjk> [2000]
+0xF885 U+8234 # <cjk> [2000]
+0xF886 U+823C # <cjk> [2000]
+0xF887 U+8246 # <cjk> [2000]
+0xF888 U+8249 # <cjk> [2000]
+0xF889 U+8245 # <cjk> [2000]
+0xF88A U+26A58 # <cjk> [2000] [Unicode3.1]
+0xF88B U+824B # <cjk> [2000]
+0xF88C U+4476 # <cjk> [2000]
+0xF88D U+824F # <cjk> [2000]
+0xF88E U+447A # <cjk> [2000]
+0xF88F U+8257 # <cjk> [2000]
+0xF890 U+26A8C # <cjk> [2000] [Unicode3.1]
+0xF891 U+825C # <cjk> [2000]
+0xF892 U+8263 # <cjk> [2000]
+0xF893 U+26AB7 # <cjk> [2000] [Unicode3.1]
+0xF894 U+FA5D # CJK COMPATIBILITY IDEOGRAPH-FA5D [2000] [Unicode3.2]
+0xF895 U+FA5E # CJK COMPATIBILITY IDEOGRAPH-FA5E [2000] [Unicode3.2]
+0xF896 U+8279 # <cjk> [2000]
+0xF897 U+4491 # <cjk> [2000]
+0xF898 U+827D # <cjk> [2000]
+0xF899 U+827F # <cjk> [2000]
+0xF89A U+8283 # <cjk> [2000]
+0xF89B U+828A # <cjk> [2000]
+0xF89C U+8293 # <cjk> [2000]
+0xF89D U+82A7 # <cjk> [2000]
+0xF89E U+82A8 # <cjk> [2000]
+0xF89F U+82B2 # <cjk> [2000]
+0xF8A0 U+82B4 # <cjk> [2000]
+0xF8A1 U+82BA # <cjk> [2000]
+0xF8A2 U+82BC # <cjk> [2000]
+0xF8A3 U+82E2 # <cjk> [2000]
+0xF8A4 U+82E8 # <cjk> [2000]
+0xF8A5 U+82F7 # <cjk> [2000]
+0xF8A6 U+8307 # <cjk> [2000]
+0xF8A7 U+8308 # <cjk> [2000]
+0xF8A8 U+830C # <cjk> [2000]
+0xF8A9 U+8354 # <cjk> [2000]
+0xF8AA U+831B # <cjk> [2000]
+0xF8AB U+831D # <cjk> [2000]
+0xF8AC U+8330 # <cjk> [2000]
+0xF8AD U+833C # <cjk> [2000]
+0xF8AE U+8344 # <cjk> [2000]
+0xF8AF U+8357 # <cjk> [2000]
+0xF8B0 U+44BE # <cjk> [2000]
+0xF8B1 U+837F # <cjk> [2000]
+0xF8B2 U+44D4 # <cjk> [2000]
+0xF8B3 U+44B3 # <cjk> [2000]
+0xF8B4 U+838D # <cjk> [2000]
+0xF8B5 U+8394 # <cjk> [2000]
+0xF8B6 U+8395 # <cjk> [2000]
+0xF8B7 U+839B # <cjk> [2000]
+0xF8B8 U+839D # <cjk> [2000]
+0xF8B9 U+83C9 # <cjk> [2000]
+0xF8BA U+83D0 # <cjk> [2000]
+0xF8BB U+83D4 # <cjk> [2000]
+0xF8BC U+83DD # <cjk> [2000]
+0xF8BD U+83E5 # <cjk> [2000]
+0xF8BE U+83F9 # <cjk> [2000]
+0xF8BF U+840F # <cjk> [2000]
+0xF8C0 U+8411 # <cjk> [2000]
+0xF8C1 U+8415 # <cjk> [2000]
+0xF8C2 U+26C73 # <cjk> [2000] [Unicode3.1]
+0xF8C3 U+8417 # <cjk> [2000]
+0xF8C4 U+8439 # <cjk> [2000]
+0xF8C5 U+844A # <cjk> [2000]
+0xF8C6 U+844F # <cjk> [2000]
+0xF8C7 U+8451 # <cjk> [2000]
+0xF8C8 U+8452 # <cjk> [2000]
+0xF8C9 U+8459 # <cjk> [2000]
+0xF8CA U+845A # <cjk> [2000]
+0xF8CB U+845C # <cjk> [2000]
+0xF8CC U+26CDD # <cjk> [2000] [Unicode3.1]
+0xF8CD U+8465 # <cjk> [2000]
+0xF8CE U+8476 # <cjk> [2000]
+0xF8CF U+8478 # <cjk> [2000]
+0xF8D0 U+847C # <cjk> [2000]
+0xF8D1 U+8481 # <cjk> [2000]
+0xF8D2 U+450D # <cjk> [2000]
+0xF8D3 U+84DC # <cjk> [2000]
+0xF8D4 U+8497 # <cjk> [2000]
+0xF8D5 U+84A6 # <cjk> [2000]
+0xF8D6 U+84BE # <cjk> [2000]
+0xF8D7 U+4508 # <cjk> [2000]
+0xF8D8 U+84CE # <cjk> [2000]
+0xF8D9 U+84CF # <cjk> [2000]
+0xF8DA U+84D3 # <cjk> [2000]
+0xF8DB U+26E65 # <cjk> [2000] [Unicode3.1]
+0xF8DC U+84E7 # <cjk> [2000]
+0xF8DD U+84EA # <cjk> [2000]
+0xF8DE U+84EF # <cjk> [2000]
+0xF8DF U+84F0 # <cjk> [2000]
+0xF8E0 U+84F1 # <cjk> [2000]
+0xF8E1 U+84FA # <cjk> [2000]
+0xF8E2 U+84FD # <cjk> [2000]
+0xF8E3 U+850C # <cjk> [2000]
+0xF8E4 U+851B # <cjk> [2000]
+0xF8E5 U+8524 # <cjk> [2000]
+0xF8E6 U+8525 # <cjk> [2000]
+0xF8E7 U+852B # <cjk> [2000]
+0xF8E8 U+8534 # <cjk> [2000]
+0xF8E9 U+854F # <cjk> [2000]
+0xF8EA U+856F # <cjk> [2000]
+0xF8EB U+4525 # <cjk> [2000]
+0xF8EC U+4543 # <cjk> [2000]
+0xF8ED U+853E # <cjk> [2000]
+0xF8EE U+8551 # <cjk> [2000]
+0xF8EF U+8553 # <cjk> [2000]
+0xF8F0 U+855E # <cjk> [2000]
+0xF8F1 U+8561 # <cjk> [2000]
+0xF8F2 U+8562 # <cjk> [2000]
+0xF8F3 U+26F94 # <cjk> [2000] [Unicode3.1]
+0xF8F4 U+857B # <cjk> [2000]
+0xF8F5 U+857D # <cjk> [2000]
+0xF8F6 U+857F # <cjk> [2000]
+0xF8F7 U+8581 # <cjk> [2000]
+0xF8F8 U+8586 # <cjk> [2000]
+0xF8F9 U+8593 # <cjk> [2000]
+0xF8FA U+859D # <cjk> [2000]
+0xF8FB U+859F # <cjk> [2000]
+0xF8FC U+26FF8 # <cjk> [2000] [Unicode3.1]
+0xF940 U+26FF6 # <cjk> [2000] [Unicode3.1]
+0xF941 U+26FF7 # <cjk> [2000] [Unicode3.1]
+0xF942 U+85B7 # <cjk> [2000]
+0xF943 U+85BC # <cjk> [2000]
+0xF944 U+85C7 # <cjk> [2000]
+0xF945 U+85CA # <cjk> [2000]
+0xF946 U+85D8 # <cjk> [2000]
+0xF947 U+85D9 # <cjk> [2000]
+0xF948 U+85DF # <cjk> [2000]
+0xF949 U+85E1 # <cjk> [2000]
+0xF94A U+85E6 # <cjk> [2000]
+0xF94B U+85F6 # <cjk> [2000]
+0xF94C U+8600 # <cjk> [2000]
+0xF94D U+8611 # <cjk> [2000]
+0xF94E U+861E # <cjk> [2000]
+0xF94F U+8621 # <cjk> [2000]
+0xF950 U+8624 # <cjk> [2000]
+0xF951 U+8627 # <cjk> [2000]
+0xF952 U+2710D # <cjk> [2000] [Unicode3.1]
+0xF953 U+8639 # <cjk> [2000]
+0xF954 U+863C # <cjk> [2000]
+0xF955 U+27139 # <cjk> [2000] [Unicode3.1]
+0xF956 U+8640 # <cjk> [2000]
+0xF957 U+FA20 # CJK COMPATIBILITY IDEOGRAPH-FA20 [2000]
+0xF958 U+8653 # <cjk> [2000]
+0xF959 U+8656 # <cjk> [2000]
+0xF95A U+866F # <cjk> [2000]
+0xF95B U+8677 # <cjk> [2000]
+0xF95C U+867A # <cjk> [2000]
+0xF95D U+8687 # <cjk> [2000]
+0xF95E U+8689 # <cjk> [2000]
+0xF95F U+868D # <cjk> [2000]
+0xF960 U+8691 # <cjk> [2000]
+0xF961 U+869C # <cjk> [2000]
+0xF962 U+869D # <cjk> [2000]
+0xF963 U+86A8 # <cjk> [2000]
+0xF964 U+FA21 # CJK COMPATIBILITY IDEOGRAPH-FA21 [2000]
+0xF965 U+86B1 # <cjk> [2000]
+0xF966 U+86B3 # <cjk> [2000]
+0xF967 U+86C1 # <cjk> [2000]
+0xF968 U+86C3 # <cjk> [2000]
+0xF969 U+86D1 # <cjk> [2000]
+0xF96A U+86D5 # <cjk> [2000]
+0xF96B U+86D7 # <cjk> [2000]
+0xF96C U+86E3 # <cjk> [2000]
+0xF96D U+86E6 # <cjk> [2000]
+0xF96E U+45B8 # <cjk> [2000]
+0xF96F U+8705 # <cjk> [2000]
+0xF970 U+8707 # <cjk> [2000]
+0xF971 U+870E # <cjk> [2000]
+0xF972 U+8710 # <cjk> [2000]
+0xF973 U+8713 # <cjk> [2000]
+0xF974 U+8719 # <cjk> [2000]
+0xF975 U+871F # <cjk> [2000]
+0xF976 U+8721 # <cjk> [2000]
+0xF977 U+8723 # <cjk> [2000]
+0xF978 U+8731 # <cjk> [2000]
+0xF979 U+873A # <cjk> [2000]
+0xF97A U+873E # <cjk> [2000]
+0xF97B U+8740 # <cjk> [2000]
+0xF97C U+8743 # <cjk> [2000]
+0xF97D U+8751 # <cjk> [2000]
+0xF97E U+8758 # <cjk> [2000]
+0xF980 U+8764 # <cjk> [2000]
+0xF981 U+8765 # <cjk> [2000]
+0xF982 U+8772 # <cjk> [2000]
+0xF983 U+877C # <cjk> [2000]
+0xF984 U+273DB # <cjk> [2000] [Unicode3.1]
+0xF985 U+273DA # <cjk> [2000] [Unicode3.1]
+0xF986 U+87A7 # <cjk> [2000]
+0xF987 U+8789 # <cjk> [2000]
+0xF988 U+878B # <cjk> [2000]
+0xF989 U+8793 # <cjk> [2000]
+0xF98A U+87A0 # <cjk> [2000]
+0xF98B U+273FE # <cjk> [2000] [Unicode3.1]
+0xF98C U+45E5 # <cjk> [2000]
+0xF98D U+87BE # <cjk> [2000]
+0xF98E U+27410 # <cjk> [2000] [Unicode3.1]
+0xF98F U+87C1 # <cjk> [2000]
+0xF990 U+87CE # <cjk> [2000]
+0xF991 U+87F5 # <cjk> [2000]
+0xF992 U+87DF # <cjk> [2000]
+0xF993 U+27449 # <cjk> [2000] [Unicode3.1]
+0xF994 U+87E3 # <cjk> [2000]
+0xF995 U+87E5 # <cjk> [2000]
+0xF996 U+87E6 # <cjk> [2000]
+0xF997 U+87EA # <cjk> [2000]
+0xF998 U+87EB # <cjk> [2000]
+0xF999 U+87ED # <cjk> [2000]
+0xF99A U+8801 # <cjk> [2000]
+0xF99B U+8803 # <cjk> [2000]
+0xF99C U+880B # <cjk> [2000]
+0xF99D U+8813 # <cjk> [2000]
+0xF99E U+8828 # <cjk> [2000]
+0xF99F U+882E # <cjk> [2000]
+0xF9A0 U+8832 # <cjk> [2000]
+0xF9A1 U+883C # <cjk> [2000]
+0xF9A2 U+460F # <cjk> [2000]
+0xF9A3 U+884A # <cjk> [2000]
+0xF9A4 U+8858 # <cjk> [2000]
+0xF9A5 U+885F # <cjk> [2000]
+0xF9A6 U+8864 # <cjk> [2000]
+0xF9A7 U+27615 # <cjk> [2000] [Unicode3.1]
+0xF9A8 U+27614 # <cjk> [2000] [Unicode3.1]
+0xF9A9 U+8869 # <cjk> [2000]
+0xF9AA U+27631 # <cjk> [2000] [Unicode3.1]
+0xF9AB U+886F # <cjk> [2000]
+0xF9AC U+88A0 # <cjk> [2000]
+0xF9AD U+88BC # <cjk> [2000]
+0xF9AE U+88BD # <cjk> [2000]
+0xF9AF U+88BE # <cjk> [2000]
+0xF9B0 U+88C0 # <cjk> [2000]
+0xF9B1 U+88D2 # <cjk> [2000]
+0xF9B2 U+27693 # <cjk> [2000] [Unicode3.1]
+0xF9B3 U+88D1 # <cjk> [2000]
+0xF9B4 U+88D3 # <cjk> [2000]
+0xF9B5 U+88DB # <cjk> [2000]
+0xF9B6 U+88F0 # <cjk> [2000]
+0xF9B7 U+88F1 # <cjk> [2000]
+0xF9B8 U+4641 # <cjk> [2000]
+0xF9B9 U+8901 # <cjk> [2000]
+0xF9BA U+2770E # <cjk> [2000] [Unicode3.1]
+0xF9BB U+8937 # <cjk> [2000]
+0xF9BC U+27723 # <cjk> [2000] [Unicode3.1]
+0xF9BD U+8942 # <cjk> [2000]
+0xF9BE U+8945 # <cjk> [2000]
+0xF9BF U+8949 # <cjk> [2000]
+0xF9C0 U+27752 # <cjk> [2000] [Unicode3.1]
+0xF9C1 U+4665 # <cjk> [2000]
+0xF9C2 U+8962 # <cjk> [2000]
+0xF9C3 U+8980 # <cjk> [2000]
+0xF9C4 U+8989 # <cjk> [2000]
+0xF9C5 U+8990 # <cjk> [2000]
+0xF9C6 U+899F # <cjk> [2000]
+0xF9C7 U+89B0 # <cjk> [2000]
+0xF9C8 U+89B7 # <cjk> [2000]
+0xF9C9 U+89D6 # <cjk> [2000]
+0xF9CA U+89D8 # <cjk> [2000]
+0xF9CB U+89EB # <cjk> [2000]
+0xF9CC U+46A1 # <cjk> [2000]
+0xF9CD U+89F1 # <cjk> [2000]
+0xF9CE U+89F3 # <cjk> [2000]
+0xF9CF U+89FD # <cjk> [2000]
+0xF9D0 U+89FF # <cjk> [2000]
+0xF9D1 U+46AF # <cjk> [2000]
+0xF9D2 U+8A11 # <cjk> [2000]
+0xF9D3 U+8A14 # <cjk> [2000]
+0xF9D4 U+27985 # <cjk> [2000] [Unicode3.1]
+0xF9D5 U+8A21 # <cjk> [2000]
+0xF9D6 U+8A35 # <cjk> [2000]
+0xF9D7 U+8A3E # <cjk> [2000]
+0xF9D8 U+8A45 # <cjk> [2000]
+0xF9D9 U+8A4D # <cjk> [2000]
+0xF9DA U+8A58 # <cjk> [2000]
+0xF9DB U+8AAE # <cjk> [2000]
+0xF9DC U+8A90 # <cjk> [2000]
+0xF9DD U+8AB7 # <cjk> [2000]
+0xF9DE U+8ABE # <cjk> [2000]
+0xF9DF U+8AD7 # <cjk> [2000]
+0xF9E0 U+8AFC # <cjk> [2000]
+0xF9E1 U+27A84 # <cjk> [2000] [Unicode3.1]
+0xF9E2 U+8B0A # <cjk> [2000]
+0xF9E3 U+8B05 # <cjk> [2000]
+0xF9E4 U+8B0D # <cjk> [2000]
+0xF9E5 U+8B1C # <cjk> [2000]
+0xF9E6 U+8B1F # <cjk> [2000]
+0xF9E7 U+8B2D # <cjk> [2000]
+0xF9E8 U+8B43 # <cjk> [2000]
+0xF9E9 U+470C # <cjk> [2000]
+0xF9EA U+8B51 # <cjk> [2000]
+0xF9EB U+8B5E # <cjk> [2000]
+0xF9EC U+8B76 # <cjk> [2000]
+0xF9ED U+8B7F # <cjk> [2000]
+0xF9EE U+8B81 # <cjk> [2000]
+0xF9EF U+8B8B # <cjk> [2000]
+0xF9F0 U+8B94 # <cjk> [2000]
+0xF9F1 U+8B95 # <cjk> [2000]
+0xF9F2 U+8B9C # <cjk> [2000]
+0xF9F3 U+8B9E # <cjk> [2000]
+0xF9F4 U+8C39 # <cjk> [2000]
+0xF9F5 U+27BB3 # <cjk> [2000] [Unicode3.1]
+0xF9F6 U+8C3D # <cjk> [2000]
+0xF9F7 U+27BBE # <cjk> [2000] [Unicode3.1]
+0xF9F8 U+27BC7 # <cjk> [2000] [Unicode3.1]
+0xF9F9 U+8C45 # <cjk> [2000]
+0xF9FA U+8C47 # <cjk> [2000]
+0xF9FB U+8C4F # <cjk> [2000]
+0xF9FC U+8C54 # <cjk> [2000]
+0xFA40 U+8C57 # <cjk> [2000]
+0xFA41 U+8C69 # <cjk> [2000]
+0xFA42 U+8C6D # <cjk> [2000]
+0xFA43 U+8C73 # <cjk> [2000]
+0xFA44 U+27CB8 # <cjk> [2000] [Unicode3.1]
+0xFA45 U+8C93 # <cjk> [2000]
+0xFA46 U+8C92 # <cjk> [2000]
+0xFA47 U+8C99 # <cjk> [2000]
+0xFA48 U+4764 # <cjk> [2000]
+0xFA49 U+8C9B # <cjk> [2000]
+0xFA4A U+8CA4 # <cjk> [2000]
+0xFA4B U+8CD6 # <cjk> [2000]
+0xFA4C U+8CD5 # <cjk> [2000]
+0xFA4D U+8CD9 # <cjk> [2000]
+0xFA4E U+27DA0 # <cjk> [2000] [Unicode3.1]
+0xFA4F U+8CF0 # <cjk> [2000]
+0xFA50 U+8CF1 # <cjk> [2000]
+0xFA51 U+27E10 # <cjk> [2000] [Unicode3.1]
+0xFA52 U+8D09 # <cjk> [2000]
+0xFA53 U+8D0E # <cjk> [2000]
+0xFA54 U+8D6C # <cjk> [2000]
+0xFA55 U+8D84 # <cjk> [2000]
+0xFA56 U+8D95 # <cjk> [2000]
+0xFA57 U+8DA6 # <cjk> [2000]
+0xFA58 U+27FB7 # <cjk> [2000] [Unicode3.1]
+0xFA59 U+8DC6 # <cjk> [2000]
+0xFA5A U+8DC8 # <cjk> [2000]
+0xFA5B U+8DD9 # <cjk> [2000]
+0xFA5C U+8DEC # <cjk> [2000]
+0xFA5D U+8E0C # <cjk> [2000]
+0xFA5E U+47FD # <cjk> [2000]
+0xFA5F U+8DFD # <cjk> [2000]
+0xFA60 U+8E06 # <cjk> [2000]
+0xFA61 U+2808A # <cjk> [2000] [Unicode3.1]
+0xFA62 U+8E14 # <cjk> [2000]
+0xFA63 U+8E16 # <cjk> [2000]
+0xFA64 U+8E21 # <cjk> [2000]
+0xFA65 U+8E22 # <cjk> [2000]
+0xFA66 U+8E27 # <cjk> [2000]
+0xFA67 U+280BB # <cjk> [2000] [Unicode3.1]
+0xFA68 U+4816 # <cjk> [2000]
+0xFA69 U+8E36 # <cjk> [2000]
+0xFA6A U+8E39 # <cjk> [2000]
+0xFA6B U+8E4B # <cjk> [2000]
+0xFA6C U+8E54 # <cjk> [2000]
+0xFA6D U+8E62 # <cjk> [2000]
+0xFA6E U+8E6C # <cjk> [2000]
+0xFA6F U+8E6D # <cjk> [2000]
+0xFA70 U+8E6F # <cjk> [2000]
+0xFA71 U+8E98 # <cjk> [2000]
+0xFA72 U+8E9E # <cjk> [2000]
+0xFA73 U+8EAE # <cjk> [2000]
+0xFA74 U+8EB3 # <cjk> [2000]
+0xFA75 U+8EB5 # <cjk> [2000]
+0xFA76 U+8EB6 # <cjk> [2000]
+0xFA77 U+8EBB # <cjk> [2000]
+0xFA78 U+28282 # <cjk> [2000] [Unicode3.1]
+0xFA79 U+8ED1 # <cjk> [2000]
+0xFA7A U+8ED4 # <cjk> [2000]
+0xFA7B U+484E # <cjk> [2000]
+0xFA7C U+8EF9 # <cjk> [2000]
+0xFA7D U+282F3 # <cjk> [2000] [Unicode3.1]
+0xFA7E U+8F00 # <cjk> [2000]
+0xFA80 U+8F08 # <cjk> [2000]
+0xFA81 U+8F17 # <cjk> [2000]
+0xFA82 U+8F2B # <cjk> [2000]
+0xFA83 U+8F40 # <cjk> [2000]
+0xFA84 U+8F4A # <cjk> [2000]
+0xFA85 U+8F58 # <cjk> [2000]
+0xFA86 U+2840C # <cjk> [2000] [Unicode3.1]
+0xFA87 U+8FA4 # <cjk> [2000]
+0xFA88 U+8FB4 # <cjk> [2000]
+0xFA89 U+FA66 # CJK COMPATIBILITY IDEOGRAPH-FA66 [2000] [Unicode3.2]
+0xFA8A U+8FB6 # <cjk> [2000]
+0xFA8B U+28455 # <cjk> [2000] [Unicode3.1]
+0xFA8C U+8FC1 # <cjk> [2000]
+0xFA8D U+8FC6 # <cjk> [2000]
+0xFA8E U+FA24 # CJK COMPATIBILITY IDEOGRAPH-FA24 [2000]
+0xFA8F U+8FCA # <cjk> [2000]
+0xFA90 U+8FCD # <cjk> [2000]
+0xFA91 U+8FD3 # <cjk> [2000]
+0xFA92 U+8FD5 # <cjk> [2000]
+0xFA93 U+8FE0 # <cjk> [2000]
+0xFA94 U+8FF1 # <cjk> [2000]
+0xFA95 U+8FF5 # <cjk> [2000]
+0xFA96 U+8FFB # <cjk> [2000]
+0xFA97 U+9002 # <cjk> [2000]
+0xFA98 U+900C # <cjk> [2000]
+0xFA99 U+9037 # <cjk> [2000]
+0xFA9A U+2856B # <cjk> [2000] [Unicode3.1]
+0xFA9B U+9043 # <cjk> [2000]
+0xFA9C U+9044 # <cjk> [2000]
+0xFA9D U+905D # <cjk> [2000]
+0xFA9E U+285C8 # <cjk> [2000] [Unicode3.1]
+0xFA9F U+285C9 # <cjk> [2000] [Unicode3.1]
+0xFAA0 U+9085 # <cjk> [2000]
+0xFAA1 U+908C # <cjk> [2000]
+0xFAA2 U+9090 # <cjk> [2000]
+0xFAA3 U+961D # <cjk> [2000]
+0xFAA4 U+90A1 # <cjk> [2000]
+0xFAA5 U+48B5 # <cjk> [2000]
+0xFAA6 U+90B0 # <cjk> [2000]
+0xFAA7 U+90B6 # <cjk> [2000]
+0xFAA8 U+90C3 # <cjk> [2000]
+0xFAA9 U+90C8 # <cjk> [2000]
+0xFAAA U+286D7 # <cjk> [2000] [Unicode3.1]
+0xFAAB U+90DC # <cjk> [2000]
+0xFAAC U+90DF # <cjk> [2000]
+0xFAAD U+286FA # <cjk> [2000] [Unicode3.1]
+0xFAAE U+90F6 # <cjk> [2000]
+0xFAAF U+90F2 # <cjk> [2000]
+0xFAB0 U+9100 # <cjk> [2000]
+0xFAB1 U+90EB # <cjk> [2000]
+0xFAB2 U+90FE # <cjk> [2000]
+0xFAB3 U+90FF # <cjk> [2000]
+0xFAB4 U+9104 # <cjk> [2000]
+0xFAB5 U+9106 # <cjk> [2000]
+0xFAB6 U+9118 # <cjk> [2000]
+0xFAB7 U+911C # <cjk> [2000]
+0xFAB8 U+911E # <cjk> [2000]
+0xFAB9 U+9137 # <cjk> [2000]
+0xFABA U+9139 # <cjk> [2000]
+0xFABB U+913A # <cjk> [2000]
+0xFABC U+9146 # <cjk> [2000]
+0xFABD U+9147 # <cjk> [2000]
+0xFABE U+9157 # <cjk> [2000]
+0xFABF U+9159 # <cjk> [2000]
+0xFAC0 U+9161 # <cjk> [2000]
+0xFAC1 U+9164 # <cjk> [2000]
+0xFAC2 U+9174 # <cjk> [2000]
+0xFAC3 U+9179 # <cjk> [2000]
+0xFAC4 U+9185 # <cjk> [2000]
+0xFAC5 U+918E # <cjk> [2000]
+0xFAC6 U+91A8 # <cjk> [2000]
+0xFAC7 U+91AE # <cjk> [2000]
+0xFAC8 U+91B3 # <cjk> [2000]
+0xFAC9 U+91B6 # <cjk> [2000]
+0xFACA U+91C3 # <cjk> [2000]
+0xFACB U+91C4 # <cjk> [2000]
+0xFACC U+91DA # <cjk> [2000]
+0xFACD U+28949 # <cjk> [2000] [Unicode3.1]
+0xFACE U+28946 # <cjk> [2000] [Unicode3.1]
+0xFACF U+91EC # <cjk> [2000]
+0xFAD0 U+91EE # <cjk> [2000]
+0xFAD1 U+9201 # <cjk> [2000]
+0xFAD2 U+920A # <cjk> [2000]
+0xFAD3 U+9216 # <cjk> [2000]
+0xFAD4 U+9217 # <cjk> [2000]
+0xFAD5 U+2896B # <cjk> [2000] [Unicode3.1]
+0xFAD6 U+9233 # <cjk> [2000]
+0xFAD7 U+9242 # <cjk> [2000]
+0xFAD8 U+9247 # <cjk> [2000]
+0xFAD9 U+924A # <cjk> [2000]
+0xFADA U+924E # <cjk> [2000]
+0xFADB U+9251 # <cjk> [2000]
+0xFADC U+9256 # <cjk> [2000]
+0xFADD U+9259 # <cjk> [2000]
+0xFADE U+9260 # <cjk> [2000]
+0xFADF U+9261 # <cjk> [2000]
+0xFAE0 U+9265 # <cjk> [2000]
+0xFAE1 U+9267 # <cjk> [2000]
+0xFAE2 U+9268 # <cjk> [2000]
+0xFAE3 U+28987 # <cjk> [2000] [Unicode3.1]
+0xFAE4 U+28988 # <cjk> [2000] [Unicode3.1]
+0xFAE5 U+927C # <cjk> [2000]
+0xFAE6 U+927D # <cjk> [2000]
+0xFAE7 U+927F # <cjk> [2000]
+0xFAE8 U+9289 # <cjk> [2000]
+0xFAE9 U+928D # <cjk> [2000]
+0xFAEA U+9297 # <cjk> [2000]
+0xFAEB U+9299 # <cjk> [2000]
+0xFAEC U+929F # <cjk> [2000]
+0xFAED U+92A7 # <cjk> [2000]
+0xFAEE U+92AB # <cjk> [2000]
+0xFAEF U+289BA # <cjk> [2000] [Unicode3.1]
+0xFAF0 U+289BB # <cjk> [2000] [Unicode3.1]
+0xFAF1 U+92B2 # <cjk> [2000]
+0xFAF2 U+92BF # <cjk> [2000]
+0xFAF3 U+92C0 # <cjk> [2000]
+0xFAF4 U+92C6 # <cjk> [2000]
+0xFAF5 U+92CE # <cjk> [2000]
+0xFAF6 U+92D0 # <cjk> [2000]
+0xFAF7 U+92D7 # <cjk> [2000]
+0xFAF8 U+92D9 # <cjk> [2000]
+0xFAF9 U+92E5 # <cjk> [2000]
+0xFAFA U+92E7 # <cjk> [2000]
+0xFAFB U+9311 # <cjk> [2000]
+0xFAFC U+28A1E # <cjk> [2000] [Unicode3.1]
+0xFB40 U+28A29 # <cjk> [2000] [Unicode3.1]
+0xFB41 U+92F7 # <cjk> [2000]
+0xFB42 U+92F9 # <cjk> [2000]
+0xFB43 U+92FB # <cjk> [2000]
+0xFB44 U+9302 # <cjk> [2000]
+0xFB45 U+930D # <cjk> [2000]
+0xFB46 U+9315 # <cjk> [2000]
+0xFB47 U+931D # <cjk> [2000]
+0xFB48 U+931E # <cjk> [2000]
+0xFB49 U+9327 # <cjk> [2000]
+0xFB4A U+9329 # <cjk> [2000]
+0xFB4B U+28A71 # <cjk> [2000] [Unicode3.1]
+0xFB4C U+28A43 # <cjk> [2000] [Unicode3.1]
+0xFB4D U+9347 # <cjk> [2000]
+0xFB4E U+9351 # <cjk> [2000]
+0xFB4F U+9357 # <cjk> [2000]
+0xFB50 U+935A # <cjk> [2000]
+0xFB51 U+936B # <cjk> [2000]
+0xFB52 U+9371 # <cjk> [2000]
+0xFB53 U+9373 # <cjk> [2000]
+0xFB54 U+93A1 # <cjk> [2000]
+0xFB55 U+28A99 # <cjk> [2000] [Unicode3.1]
+0xFB56 U+28ACD # <cjk> [2000] [Unicode3.1]
+0xFB57 U+9388 # <cjk> [2000]
+0xFB58 U+938B # <cjk> [2000]
+0xFB59 U+938F # <cjk> [2000]
+0xFB5A U+939E # <cjk> [2000]
+0xFB5B U+93F5 # <cjk> [2000]
+0xFB5C U+28AE4 # <cjk> [2000] [Unicode3.1]
+0xFB5D U+28ADD # <cjk> [2000] [Unicode3.1]
+0xFB5E U+93F1 # <cjk> [2000]
+0xFB5F U+93C1 # <cjk> [2000]
+0xFB60 U+93C7 # <cjk> [2000]
+0xFB61 U+93DC # <cjk> [2000]
+0xFB62 U+93E2 # <cjk> [2000]
+0xFB63 U+93E7 # <cjk> [2000]
+0xFB64 U+9409 # <cjk> [2000]
+0xFB65 U+940F # <cjk> [2000]
+0xFB66 U+9416 # <cjk> [2000]
+0xFB67 U+9417 # <cjk> [2000]
+0xFB68 U+93FB # <cjk> [2000]
+0xFB69 U+9432 # <cjk> [2000]
+0xFB6A U+9434 # <cjk> [2000]
+0xFB6B U+943B # <cjk> [2000]
+0xFB6C U+9445 # <cjk> [2000]
+0xFB6D U+28BC1 # <cjk> [2000] [Unicode3.1]
+0xFB6E U+28BEF # <cjk> [2000] [Unicode3.1]
+0xFB6F U+946D # <cjk> [2000]
+0xFB70 U+946F # <cjk> [2000]
+0xFB71 U+9578 # <cjk> [2000]
+0xFB72 U+9579 # <cjk> [2000]
+0xFB73 U+9586 # <cjk> [2000]
+0xFB74 U+958C # <cjk> [2000]
+0xFB75 U+958D # <cjk> [2000]
+0xFB76 U+28D10 # <cjk> [2000] [Unicode3.1]
+0xFB77 U+95AB # <cjk> [2000]
+0xFB78 U+95B4 # <cjk> [2000]
+0xFB79 U+28D71 # <cjk> [2000] [Unicode3.1]
+0xFB7A U+95C8 # <cjk> [2000]
+0xFB7B U+28DFB # <cjk> [2000] [Unicode3.1]
+0xFB7C U+28E1F # <cjk> [2000] [Unicode3.1]
+0xFB7D U+962C # <cjk> [2000]
+0xFB7E U+9633 # <cjk> [2000]
+0xFB80 U+9634 # <cjk> [2000]
+0xFB81 U+28E36 # <cjk> [2000] [Unicode3.1]
+0xFB82 U+963C # <cjk> [2000]
+0xFB83 U+9641 # <cjk> [2000]
+0xFB84 U+9661 # <cjk> [2000]
+0xFB85 U+28E89 # <cjk> [2000] [Unicode3.1]
+0xFB86 U+9682 # <cjk> [2000]
+0xFB87 U+28EEB # <cjk> [2000] [Unicode3.1]
+0xFB88 U+969A # <cjk> [2000]
+0xFB89 U+28F32 # <cjk> [2000] [Unicode3.1]
+0xFB8A U+49E7 # <cjk> [2000]
+0xFB8B U+96A9 # <cjk> [2000]
+0xFB8C U+96AF # <cjk> [2000]
+0xFB8D U+96B3 # <cjk> [2000]
+0xFB8E U+96BA # <cjk> [2000]
+0xFB8F U+96BD # <cjk> [2000]
+0xFB90 U+49FA # <cjk> [2000]
+0xFB91 U+28FF8 # <cjk> [2000] [Unicode3.1]
+0xFB92 U+96D8 # <cjk> [2000]
+0xFB93 U+96DA # <cjk> [2000]
+0xFB94 U+96DD # <cjk> [2000]
+0xFB95 U+4A04 # <cjk> [2000]
+0xFB96 U+9714 # <cjk> [2000]
+0xFB97 U+9723 # <cjk> [2000]
+0xFB98 U+4A29 # <cjk> [2000]
+0xFB99 U+9736 # <cjk> [2000]
+0xFB9A U+9741 # <cjk> [2000]
+0xFB9B U+9747 # <cjk> [2000]
+0xFB9C U+9755 # <cjk> [2000]
+0xFB9D U+9757 # <cjk> [2000]
+0xFB9E U+975B # <cjk> [2000]
+0xFB9F U+976A # <cjk> [2000]
+0xFBA0 U+292A0 # <cjk> [2000] [Unicode3.1]
+0xFBA1 U+292B1 # <cjk> [2000] [Unicode3.1]
+0xFBA2 U+9796 # <cjk> [2000]
+0xFBA3 U+979A # <cjk> [2000]
+0xFBA4 U+979E # <cjk> [2000]
+0xFBA5 U+97A2 # <cjk> [2000]
+0xFBA6 U+97B1 # <cjk> [2000]
+0xFBA7 U+97B2 # <cjk> [2000]
+0xFBA8 U+97BE # <cjk> [2000]
+0xFBA9 U+97CC # <cjk> [2000]
+0xFBAA U+97D1 # <cjk> [2000]
+0xFBAB U+97D4 # <cjk> [2000]
+0xFBAC U+97D8 # <cjk> [2000]
+0xFBAD U+97D9 # <cjk> [2000]
+0xFBAE U+97E1 # <cjk> [2000]
+0xFBAF U+97F1 # <cjk> [2000]
+0xFBB0 U+9804 # <cjk> [2000]
+0xFBB1 U+980D # <cjk> [2000]
+0xFBB2 U+980E # <cjk> [2000]
+0xFBB3 U+9814 # <cjk> [2000]
+0xFBB4 U+9816 # <cjk> [2000]
+0xFBB5 U+4ABC # <cjk> [2000]
+0xFBB6 U+29490 # <cjk> [2000] [Unicode3.1]
+0xFBB7 U+9823 # <cjk> [2000]
+0xFBB8 U+9832 # <cjk> [2000]
+0xFBB9 U+9833 # <cjk> [2000]
+0xFBBA U+9825 # <cjk> [2000]
+0xFBBB U+9847 # <cjk> [2000]
+0xFBBC U+9866 # <cjk> [2000]
+0xFBBD U+98AB # <cjk> [2000]
+0xFBBE U+98AD # <cjk> [2000]
+0xFBBF U+98B0 # <cjk> [2000]
+0xFBC0 U+295CF # <cjk> [2000] [Unicode3.1]
+0xFBC1 U+98B7 # <cjk> [2000]
+0xFBC2 U+98B8 # <cjk> [2000]
+0xFBC3 U+98BB # <cjk> [2000]
+0xFBC4 U+98BC # <cjk> [2000]
+0xFBC5 U+98BF # <cjk> [2000]
+0xFBC6 U+98C2 # <cjk> [2000]
+0xFBC7 U+98C7 # <cjk> [2000]
+0xFBC8 U+98CB # <cjk> [2000]
+0xFBC9 U+98E0 # <cjk> [2000]
+0xFBCA U+2967F # <cjk> [2000] [Unicode3.1]
+0xFBCB U+98E1 # <cjk> [2000]
+0xFBCC U+98E3 # <cjk> [2000]
+0xFBCD U+98E5 # <cjk> [2000]
+0xFBCE U+98EA # <cjk> [2000]
+0xFBCF U+98F0 # <cjk> [2000]
+0xFBD0 U+98F1 # <cjk> [2000]
+0xFBD1 U+98F3 # <cjk> [2000]
+0xFBD2 U+9908 # <cjk> [2000]
+0xFBD3 U+4B3B # <cjk> [2000]
+0xFBD4 U+296F0 # <cjk> [2000] [Unicode3.1]
+0xFBD5 U+9916 # <cjk> [2000]
+0xFBD6 U+9917 # <cjk> [2000]
+0xFBD7 U+29719 # <cjk> [2000] [Unicode3.1]
+0xFBD8 U+991A # <cjk> [2000]
+0xFBD9 U+991B # <cjk> [2000]
+0xFBDA U+991C # <cjk> [2000]
+0xFBDB U+29750 # <cjk> [2000] [Unicode3.1]
+0xFBDC U+9931 # <cjk> [2000]
+0xFBDD U+9932 # <cjk> [2000]
+0xFBDE U+9933 # <cjk> [2000]
+0xFBDF U+993A # <cjk> [2000]
+0xFBE0 U+993B # <cjk> [2000]
+0xFBE1 U+993C # <cjk> [2000]
+0xFBE2 U+9940 # <cjk> [2000]
+0xFBE3 U+9941 # <cjk> [2000]
+0xFBE4 U+9946 # <cjk> [2000]
+0xFBE5 U+994D # <cjk> [2000]
+0xFBE6 U+994E # <cjk> [2000]
+0xFBE7 U+995C # <cjk> [2000]
+0xFBE8 U+995F # <cjk> [2000]
+0xFBE9 U+9960 # <cjk> [2000]
+0xFBEA U+99A3 # <cjk> [2000]
+0xFBEB U+99A6 # <cjk> [2000]
+0xFBEC U+99B9 # <cjk> [2000]
+0xFBED U+99BD # <cjk> [2000]
+0xFBEE U+99BF # <cjk> [2000]
+0xFBEF U+99C3 # <cjk> [2000]
+0xFBF0 U+99C9 # <cjk> [2000]
+0xFBF1 U+99D4 # <cjk> [2000]
+0xFBF2 U+99D9 # <cjk> [2000]
+0xFBF3 U+99DE # <cjk> [2000]
+0xFBF4 U+298C6 # <cjk> [2000] [Unicode3.1]
+0xFBF5 U+99F0 # <cjk> [2000]
+0xFBF6 U+99F9 # <cjk> [2000]
+0xFBF7 U+99FC # <cjk> [2000]
+0xFBF8 U+9A0A # <cjk> [2000]
+0xFBF9 U+9A11 # <cjk> [2000]
+0xFBFA U+9A16 # <cjk> [2000]
+0xFBFB U+9A1A # <cjk> [2000]
+0xFBFC U+9A20 # <cjk> [2000]
+0xFC40 U+9A31 # <cjk> [2000]
+0xFC41 U+9A36 # <cjk> [2000]
+0xFC42 U+9A44 # <cjk> [2000]
+0xFC43 U+9A4C # <cjk> [2000]
+0xFC44 U+9A58 # <cjk> [2000]
+0xFC45 U+4BC2 # <cjk> [2000]
+0xFC46 U+9AAF # <cjk> [2000]
+0xFC47 U+4BCA # <cjk> [2000]
+0xFC48 U+9AB7 # <cjk> [2000]
+0xFC49 U+4BD2 # <cjk> [2000]
+0xFC4A U+9AB9 # <cjk> [2000]
+0xFC4B U+29A72 # <cjk> [2000] [Unicode3.1]
+0xFC4C U+9AC6 # <cjk> [2000]
+0xFC4D U+9AD0 # <cjk> [2000]
+0xFC4E U+9AD2 # <cjk> [2000]
+0xFC4F U+9AD5 # <cjk> [2000]
+0xFC50 U+4BE8 # <cjk> [2000]
+0xFC51 U+9ADC # <cjk> [2000]
+0xFC52 U+9AE0 # <cjk> [2000]
+0xFC53 U+9AE5 # <cjk> [2000]
+0xFC54 U+9AE9 # <cjk> [2000]
+0xFC55 U+9B03 # <cjk> [2000]
+0xFC56 U+9B0C # <cjk> [2000]
+0xFC57 U+9B10 # <cjk> [2000]
+0xFC58 U+9B12 # <cjk> [2000]
+0xFC59 U+9B16 # <cjk> [2000]
+0xFC5A U+9B1C # <cjk> [2000]
+0xFC5B U+9B2B # <cjk> [2000]
+0xFC5C U+9B33 # <cjk> [2000]
+0xFC5D U+9B3D # <cjk> [2000]
+0xFC5E U+4C20 # <cjk> [2000]
+0xFC5F U+9B4B # <cjk> [2000]
+0xFC60 U+9B63 # <cjk> [2000]
+0xFC61 U+9B65 # <cjk> [2000]
+0xFC62 U+9B6B # <cjk> [2000]
+0xFC63 U+9B6C # <cjk> [2000]
+0xFC64 U+9B73 # <cjk> [2000]
+0xFC65 U+9B76 # <cjk> [2000]
+0xFC66 U+9B77 # <cjk> [2000]
+0xFC67 U+9BA6 # <cjk> [2000]
+0xFC68 U+9BAC # <cjk> [2000]
+0xFC69 U+9BB1 # <cjk> [2000]
+0xFC6A U+29DDB # <cjk> [2000] [Unicode3.1]
+0xFC6B U+29E3D # <cjk> [2000] [Unicode3.1]
+0xFC6C U+9BB2 # <cjk> [2000]
+0xFC6D U+9BB8 # <cjk> [2000]
+0xFC6E U+9BBE # <cjk> [2000]
+0xFC6F U+9BC7 # <cjk> [2000]
+0xFC70 U+9BF3 # <cjk> [2000]
+0xFC71 U+9BD8 # <cjk> [2000]
+0xFC72 U+9BDD # <cjk> [2000]
+0xFC73 U+9BE7 # <cjk> [2000]
+0xFC74 U+9BEA # <cjk> [2000]
+0xFC75 U+9BEB # <cjk> [2000]
+0xFC76 U+9BEF # <cjk> [2000]
+0xFC77 U+9BEE # <cjk> [2000]
+0xFC78 U+29E15 # <cjk> [2000] [Unicode3.1]
+0xFC79 U+9BFA # <cjk> [2000]
+0xFC7A U+29E8A # <cjk> [2000] [Unicode3.1]
+0xFC7B U+9BF7 # <cjk> [2000]
+0xFC7C U+29E49 # <cjk> [2000] [Unicode3.1]
+0xFC7D U+9C16 # <cjk> [2000]
+0xFC7E U+9C18 # <cjk> [2000]
+0xFC80 U+9C19 # <cjk> [2000]
+0xFC81 U+9C1A # <cjk> [2000]
+0xFC82 U+9C1D # <cjk> [2000]
+0xFC83 U+9C22 # <cjk> [2000]
+0xFC84 U+9C27 # <cjk> [2000]
+0xFC85 U+9C29 # <cjk> [2000]
+0xFC86 U+9C2A # <cjk> [2000]
+0xFC87 U+29EC4 # <cjk> [2000] [Unicode3.1]
+0xFC88 U+9C31 # <cjk> [2000]
+0xFC89 U+9C36 # <cjk> [2000]
+0xFC8A U+9C37 # <cjk> [2000]
+0xFC8B U+9C45 # <cjk> [2000]
+0xFC8C U+9C5C # <cjk> [2000]
+0xFC8D U+29EE9 # <cjk> [2000] [Unicode3.1]
+0xFC8E U+9C49 # <cjk> [2000]
+0xFC8F U+9C4A # <cjk> [2000]
+0xFC90 U+29EDB # <cjk> [2000] [Unicode3.1]
+0xFC91 U+9C54 # <cjk> [2000]
+0xFC92 U+9C58 # <cjk> [2000]
+0xFC93 U+9C5B # <cjk> [2000]
+0xFC94 U+9C5D # <cjk> [2000]
+0xFC95 U+9C5F # <cjk> [2000]
+0xFC96 U+9C69 # <cjk> [2000]
+0xFC97 U+9C6A # <cjk> [2000]
+0xFC98 U+9C6B # <cjk> [2000]
+0xFC99 U+9C6D # <cjk> [2000]
+0xFC9A U+9C6E # <cjk> [2000]
+0xFC9B U+9C70 # <cjk> [2000]
+0xFC9C U+9C72 # <cjk> [2000]
+0xFC9D U+9C75 # <cjk> [2000]
+0xFC9E U+9C7A # <cjk> [2000]
+0xFC9F U+9CE6 # <cjk> [2000]
+0xFCA0 U+9CF2 # <cjk> [2000]
+0xFCA1 U+9D0B # <cjk> [2000]
+0xFCA2 U+9D02 # <cjk> [2000]
+0xFCA3 U+29FCE # <cjk> [2000] [Unicode3.1]
+0xFCA4 U+9D11 # <cjk> [2000]
+0xFCA5 U+9D17 # <cjk> [2000]
+0xFCA6 U+9D18 # <cjk> [2000]
+0xFCA7 U+2A02F # <cjk> [2000] [Unicode3.1]
+0xFCA8 U+4CC4 # <cjk> [2000]
+0xFCA9 U+2A01A # <cjk> [2000] [Unicode3.1]
+0xFCAA U+9D32 # <cjk> [2000]
+0xFCAB U+4CD1 # <cjk> [2000]
+0xFCAC U+9D42 # <cjk> [2000]
+0xFCAD U+9D4A # <cjk> [2000]
+0xFCAE U+9D5F # <cjk> [2000]
+0xFCAF U+9D62 # <cjk> [2000]
+0xFCB0 U+2A0F9 # <cjk> [2000] [Unicode3.1]
+0xFCB1 U+9D69 # <cjk> [2000]
+0xFCB2 U+9D6B # <cjk> [2000]
+0xFCB3 U+2A082 # <cjk> [2000] [Unicode3.1]
+0xFCB4 U+9D73 # <cjk> [2000]
+0xFCB5 U+9D76 # <cjk> [2000]
+0xFCB6 U+9D77 # <cjk> [2000]
+0xFCB7 U+9D7E # <cjk> [2000]
+0xFCB8 U+9D84 # <cjk> [2000]
+0xFCB9 U+9D8D # <cjk> [2000]
+0xFCBA U+9D99 # <cjk> [2000]
+0xFCBB U+9DA1 # <cjk> [2000]
+0xFCBC U+9DBF # <cjk> [2000]
+0xFCBD U+9DB5 # <cjk> [2000]
+0xFCBE U+9DB9 # <cjk> [2000]
+0xFCBF U+9DBD # <cjk> [2000]
+0xFCC0 U+9DC3 # <cjk> [2000]
+0xFCC1 U+9DC7 # <cjk> [2000]
+0xFCC2 U+9DC9 # <cjk> [2000]
+0xFCC3 U+9DD6 # <cjk> [2000]
+0xFCC4 U+9DDA # <cjk> [2000]
+0xFCC5 U+9DDF # <cjk> [2000]
+0xFCC6 U+9DE0 # <cjk> [2000]
+0xFCC7 U+9DE3 # <cjk> [2000]
+0xFCC8 U+9DF4 # <cjk> [2000]
+0xFCC9 U+4D07 # <cjk> [2000]
+0xFCCA U+9E0A # <cjk> [2000]
+0xFCCB U+9E02 # <cjk> [2000]
+0xFCCC U+9E0D # <cjk> [2000]
+0xFCCD U+9E19 # <cjk> [2000]
+0xFCCE U+9E1C # <cjk> [2000]
+0xFCCF U+9E1D # <cjk> [2000]
+0xFCD0 U+9E7B # <cjk> [2000]
+0xFCD1 U+22218 # <cjk> [2000] [Unicode3.1]
+0xFCD2 U+9E80 # <cjk> [2000]
+0xFCD3 U+9E85 # <cjk> [2000]
+0xFCD4 U+9E9B # <cjk> [2000]
+0xFCD5 U+9EA8 # <cjk> [2000]
+0xFCD6 U+2A38C # <cjk> [2000] [Unicode3.1]
+0xFCD7 U+9EBD # <cjk> [2000]
+0xFCD8 U+2A437 # <cjk> [2000] [Unicode3.1]
+0xFCD9 U+9EDF # <cjk> [2000]
+0xFCDA U+9EE7 # <cjk> [2000]
+0xFCDB U+9EEE # <cjk> [2000]
+0xFCDC U+9EFF # <cjk> [2000]
+0xFCDD U+9F02 # <cjk> [2000]
+0xFCDE U+4D77 # <cjk> [2000]
+0xFCDF U+9F03 # <cjk> [2000]
+0xFCE0 U+9F17 # <cjk> [2000]
+0xFCE1 U+9F19 # <cjk> [2000]
+0xFCE2 U+9F2F # <cjk> [2000]
+0xFCE3 U+9F37 # <cjk> [2000]
+0xFCE4 U+9F3A # <cjk> [2000]
+0xFCE5 U+9F3D # <cjk> [2000]
+0xFCE6 U+9F41 # <cjk> [2000]
+0xFCE7 U+9F45 # <cjk> [2000]
+0xFCE8 U+9F46 # <cjk> [2000]
+0xFCE9 U+9F53 # <cjk> [2000]
+0xFCEA U+9F55 # <cjk> [2000]
+0xFCEB U+9F58 # <cjk> [2000]
+0xFCEC U+2A5F1 # <cjk> [2000] [Unicode3.1]
+0xFCED U+9F5D # <cjk> [2000]
+0xFCEE U+2A602 # <cjk> [2000] [Unicode3.1]
+0xFCEF U+9F69 # <cjk> [2000]
+0xFCF0 U+2A61A # <cjk> [2000] [Unicode3.1]
+0xFCF1 U+9F6D # <cjk> [2000]
+0xFCF2 U+9F70 # <cjk> [2000]
+0xFCF3 U+9F75 # <cjk> [2000]
+0xFCF4 U+2A6B2 # <cjk> [2000] [Unicode3.1]
diff --git a/ext/mbstring/tests/encoding_tests.inc b/ext/mbstring/tests/encoding_tests.inc
new file mode 100644
index 0000000000..2993640c19
--- /dev/null
+++ b/ext/mbstring/tests/encoding_tests.inc
@@ -0,0 +1,225 @@
+<?php
+
+// Common code for tests which focus on conversion and verification of text
+// in some specific encoding
+
+// Read a file with one character and its equivalent Unicode codepoint on each
+// line, delimited by tabs
+function readConversionTable($path, &$from, &$to, $utf32 = false) {
+ $from = array();
+ $to = array();
+
+ $fp = fopen($path, 'r+');
+ while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+ if (sscanf($line, "0x%x\t0x%x", $char, $codepoint) == 2) {
+ $codepoint = $utf32 ? pack('N', $codepoint) : pack('n', $codepoint);
+ if ($char <= 0xFF)
+ $char = chr($char); // hex codes must not have leading zero bytes
+ else if ($char <= 0xFFFF)
+ $char = pack('n', $char);
+ else if ($char <= 0xFFFFFF)
+ $char = chr($char >> 16) . pack('n', $char & 0xFFFF);
+ else
+ $char = pack('N', $char);
+ $from[$char] = $codepoint;
+ $to[$codepoint] = $char;
+ }
+ }
+}
+
+function dbgPrint($str) {
+ $result = '';
+ if (mb_check_encoding($str, 'ASCII'))
+ $result .= '"' . $str . '" ';
+ return $result . "(" . bin2hex($str) . ")";
+}
+
+function identifyValidString($goodString, $encoding) {
+ $result = mb_check_encoding($goodString, $encoding);
+ if (!$result)
+ die("mb_check_encoding failed on good $encoding string: " . dbgPrint($goodString));
+}
+
+function identifyInvalidString($badString, $encoding) {
+ $result = mb_check_encoding($badString, $encoding);
+ if ($result)
+ die("mb_check_encoding passed on bad $encoding string: " . dbgPrint($badString));
+}
+
+function testConversion($fromString, $toString, $fromEncoding, $toEncoding) {
+ $result = mb_convert_encoding($fromString, $toEncoding, $fromEncoding);
+ if ($result !== $toString)
+ die("mb_convert_encoding not working on $fromEncoding input: " . dbgPrint($fromString) . "\nExpected $toEncoding: " . dbgPrint($toString) . "\nActually got: " . dbgPrint($result));
+}
+
+function testValidConversion($fromString, $toString, $fromEncoding, $toEncoding) {
+ $illegalChars = mb_get_info('illegal_chars');
+ testConversion($fromString, $toString, $fromEncoding, $toEncoding);
+ if (mb_get_info('illegal_chars') !== $illegalChars)
+ die("mb_convert_encoding incremented illegal_chars on valid $fromEncoding string: " . dbgPrint($fromString) . " when converting to $toEncoding");
+}
+
+function convertValidString($fromString, $toString, $fromEncoding, $toEncoding, $bothWays = true) {
+ testValidConversion($fromString, $toString, $fromEncoding, $toEncoding);
+ if ($bothWays)
+ testValidConversion($toString, $fromString, $toEncoding, $fromEncoding);
+}
+
+function convertInvalidString($fromString, $toString, $fromEncoding, $toEncoding) {
+ $illegalChars = mb_get_info('illegal_chars');
+ testConversion($fromString, $toString, $fromEncoding, $toEncoding);
+ if (mb_get_info('illegal_chars') <= $illegalChars)
+ die("mb_convert_encoding did not increment illegal_chars on invalid $fromEncoding string: " . dbgPrint($fromString) . " when converting to $toEncoding");
+}
+
+function testValidString($fromString, $toString, $fromEncoding, $toEncoding, $bothWays = true) {
+ identifyValidString($fromString, $fromEncoding);
+ convertValidString($fromString, $toString, $fromEncoding, $toEncoding, $bothWays);
+}
+
+function testInvalidString($fromString, $toString, $fromEncoding, $toEncoding) {
+ identifyInvalidString($fromString, $fromEncoding);
+ convertInvalidString($fromString, $toString, $fromEncoding, $toEncoding);
+}
+
+// Only for encodings where valid characters can be concatenated together in any
+// way, without any escape sequences
+function testAllValidChars($charMap, $fromEncoding, $toEncoding, $bothWays = true) {
+ $goodChars = array_keys($charMap);
+ shuffle($goodChars);
+ while (!empty($goodChars)) {
+ $length = min(rand(5,10), count($goodChars));
+ $fromString = $toString = '';
+ while ($length--) {
+ $goodChar = array_pop($goodChars);
+ $fromString .= $goodChar;
+ $toString .= $charMap[$goodChar];
+ }
+
+ testValidString($fromString, $toString, $fromEncoding, $toEncoding, $bothWays);
+ }
+}
+
+function testAllInvalidChars($badChars, $charMap, $fromEncoding, $toEncoding, $replacement) {
+ $badChars = array_keys($badChars);
+ $goodChars = array();
+ while (!empty($badChars)) {
+ if (empty($goodChars)) {
+ $goodChars = array_keys($charMap);
+ shuffle($goodChars);
+ }
+ $goodChar = array_pop($goodChars);
+ $fromString = array_pop($badChars) . $goodChar;
+ $toString = $replacement . $charMap[$goodChar];
+
+ testInvalidString($fromString, $toString, $fromEncoding, $toEncoding);
+ }
+}
+
+function convertAllInvalidChars($badChars, $charMap, $fromEncoding, $toEncoding, $replacement) {
+ $badChars = array_keys($badChars);
+ $goodChars = array();
+ while (!empty($badChars)) {
+ if (empty($goodChars)) {
+ $goodChars = array_keys($charMap);
+ shuffle($goodChars);
+ }
+ $goodChar = array_pop($goodChars);
+ $fromString = array_pop($badChars) . $goodChar;
+ $toString = $replacement . $charMap[$goodChar];
+
+ convertInvalidString($fromString, $toString, $fromEncoding, $toEncoding);
+ }
+}
+
+function testTruncatedChars($truncated, $fromEncoding, $toEncoding, $replacement) {
+ $truncatedChars = array_keys($truncated);
+ foreach ($truncatedChars as $truncatedChar) {
+ testInvalidString($truncatedChar, $replacement, $fromEncoding, $toEncoding);
+ }
+}
+
+// For variable-width encodings, where we have an exhaustive list of
+// all valid characters of any width
+//
+// `$startBytes` maps from first-byte values to the corresponding character length
+// (For encodings where the first byte can tell you the length of a multi-byte
+// character)
+// Note that `$startBytes` can be partial!
+function findInvalidChars($valid, &$invalid, &$truncated, $startBytes = array()) {
+ $invalid = array();
+ $truncated = array();
+ $prefixes = array(); /* All sequences which are not (but can start) a valid character */
+
+ foreach ($valid as $char => $unicode) {
+ for ($len = 1; $len < strlen($char); $len++)
+ $prefixes[substr($char, 0, $len)] = true;
+ }
+
+ $varLength = function($prefix) use($valid, $prefixes, &$invalid, &$truncated, &$varLength) {
+ for ($byte = 0; $byte < 256; $byte++) {
+ $str = $prefix . chr($byte);
+ if (!isset($valid[$str])) {
+ if (isset($prefixes[$str])) {
+ $truncated[$str] = true;
+ $varLength($str);
+ } else {
+ $invalid[$str] = true;
+ }
+ }
+ }
+ };
+
+ $fixedLength = function($prefix, $remaining) use($valid, $prefixes, &$invalid, &$truncated, &$fixedLength) {
+ if ($remaining == 0) {
+ if (!isset($valid[$prefix]))
+ $invalid[$prefix] = true;
+ } else if ($remaining == 1) {
+ $truncated[$prefix] = true;
+ for ($i = 0; $i < 256; $i++) {
+ $str = $prefix . chr($i);
+ if (!isset($valid[$str]))
+ $invalid[$str] = true;
+ }
+ } else {
+ $truncated[$prefix] = true;
+ for ($i = 0; $i < 256; $i++)
+ $fixedLength($prefix . chr($i), $remaining - 1);
+ }
+ };
+
+ for ($byte = 0; $byte < 256; $byte++) {
+ if (isset($startBytes[$byte])) {
+ $fixedLength(chr($byte), $startBytes[$byte] - 1);
+ } else {
+ $str = chr($byte);
+ if (!isset($valid[$str])) {
+ if (isset($prefixes[$str])) {
+ $truncated[$str] = true;
+ $varLength($str);
+ } else {
+ $invalid[$str] = true;
+ }
+ }
+ }
+ }
+}
+
+function testEncodingFromUTF16ConversionTable($path, $encoding, $replacement = '%', $startBytes = array()) {
+ srand(1000); // Make results consistent
+ mb_substitute_character(0x25); // '%'
+ readConversionTable($path, $toUnicode, $fromUnicode);
+
+ findInvalidChars($toUnicode, $invalid, $truncated, $startBytes);
+ testAllValidChars($toUnicode, $encoding, 'UTF-16BE');
+ testAllInvalidChars($invalid, $toUnicode, $encoding, 'UTF-16BE', "\x00%");
+ testTruncatedChars($truncated, $encoding, 'UTF-16BE', "\x00%");
+ echo "Tested $encoding -> UTF-16BE\n";
+
+ findInvalidChars($fromUnicode, $invalid, $unused, array_fill_keys(range(0,0xFF), 2));
+ convertAllInvalidChars($invalid, $fromUnicode, 'UTF-16BE', $encoding, $replacement);
+ echo "Tested UTF-16BE -> $encoding\n";
+}
+?>
diff --git a/ext/mbstring/tests/eucjp_encoding.phpt b/ext/mbstring/tests/eucjp_encoding.phpt
new file mode 100644
index 0000000000..3a90431e4a
--- /dev/null
+++ b/ext/mbstring/tests/eucjp_encoding.phpt
@@ -0,0 +1,84 @@
+--TEST--
+Exhaustive test of EUC-JP encoding verification and conversion
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+srand(555); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in the table of all characters in EUC-JP */
+readConversionTable(__DIR__ . '/data/EUC-JP.txt', $validChars, $fromUnicode, true);
+
+/* The JIS X 0208 character set does not have a single, straightforward
+ * mapping to the Unicode character set */
+
+/* Kuten code 0x2140 (EUC-JP 0xA1C0) is a backslash; this can be mapped to
+ * 0x005C for an ordinary backslash, or 0xFF3C for a _fullwidth_ one
+ * We go with fullwidth */
+$validChars["\xA1\xC0"] = "\x00\x00\xFF\x3C";
+$fromUnicode["\x00\x00\xFF\x3C"] = "\xA1\xC0";
+
+/* Unicode has both halfwidth and fullwidth NOT SIGN; convert both of them
+ * to JIS X 0208 NOT SIGN */
+$fromUnicode["\x00\x00\xFF\xE2"] = "\xA2\xCC";
+/* Likewise for fullwidth and halfwidth POUND SIGN */
+$fromUnicode["\x00\x00\xFF\xE1"] = "\xA1\xF2";
+/* Likewise for fullwidth and halfwidth CENT SIGN */
+$fromUnicode["\x00\x00\xFF\xE0"] = "\xA1\xF1";
+/* Convert Unicode FULLWIDTH TILDE to JIS X 0208 WAVE DASH */
+$fromUnicode["\x00\x00\xFF\x5E"] = "\xA1\xC1";
+/* Convert Unicode FULLWIDTH HYPHEN-MINUS to JIS X 0208 MINUS SIGN */
+$fromUnicode["\x00\x00\xFF\x0D"] = "\xA1\xDD";
+/* Convert Unicode PARALLEL TO to JIS X 0208 DOUBLE VERTICAL LINE */
+$fromUnicode["\x00\x00\x22\x25"] = "\xA1\xC2";
+
+/* Unicode 0x007E (tilde) can be represented in two different ways in EUC-JP
+ * When converting Unicode to EUC-JP, use the simpler representation */
+$fromUnicode["\x00\x00\x00\x7E"] = "\x7E";
+/* Likewise with 0x005C */
+$fromUnicode["\x00\x00\x00\x5C"] = "\x5C";
+
+/* U+203E is OVERLINE; convert to FULLWIDTH MACRON */
+$fromUnicode["\x00\x00\x20\x3E"] = "\xA1\xB1";
+
+findInvalidChars($validChars, $invalidChars, $truncated, array_fill_keys(range(0xA1, 0xFE), 2) + array(0x8E => 2, 0x8F => 3));
+
+/* In the JIS X 0212 character set, kuten code 0x2237 (EUC-JP 0x8FA2B7)
+ * is an ordinary tilde character
+ * This mapping is not reversible, because ASCII 0x7E also represents
+ * the same character */
+unset($validChars["\x8F\xA2\xB7"]);
+
+testAllValidChars($validChars, 'EUC-JP', 'UTF-32BE');
+echo "Encoding verification and conversion work for all valid characters\n";
+
+testAllInvalidChars($invalidChars, $validChars, 'EUC-JP', 'UTF-32BE', "\x00\x00\x00%");
+testTruncatedChars($truncated, 'EUC-JP', 'UTF-32BE', "\x00\x00\x00%");
+echo "Encoding verification and conversion work for all invalid characters\n";
+
+testValidString("\x8F\xA2\xB7", "\x00\x00\x00~", 'EUC-JP', 'UTF-32BE', false);
+echo "Irreversible mapping of 0x8FA2B7 follows JIS X 0212 correctly\n";
+
+testAllValidChars($fromUnicode, 'UTF-32BE', 'EUC-JP', false);
+echo "Unicode -> EUC-JP conversion works on all valid characters\n";
+
+$invalidChars = array();
+for ($cp = 0; $cp <= 0xFFFF; $cp++) {
+ $char = pack('N', $cp);
+ if (!isset($fromUnicode[$char]))
+ $invalidChars[$char] = true;
+}
+convertAllInvalidChars($invalidChars, $fromUnicode, 'UTF-32BE', 'EUC-JP', '%');
+echo "Unicode -> EUC-JP conversion works on all invalid characters\n";
+?>
+--EXPECT--
+Encoding verification and conversion work for all valid characters
+Encoding verification and conversion work for all invalid characters
+Irreversible mapping of 0x8FA2B7 follows JIS X 0212 correctly
+Unicode -> EUC-JP conversion works on all valid characters
+Unicode -> EUC-JP conversion works on all invalid characters
diff --git a/ext/mbstring/tests/illformed_utf_sequences.phpt b/ext/mbstring/tests/illformed_utf_sequences.phpt
index 3b7d431a0e..8f3b97e8ec 100644
--- a/ext/mbstring/tests/illformed_utf_sequences.phpt
+++ b/ext/mbstring/tests/illformed_utf_sequences.phpt
@@ -4,12 +4,9 @@ Unicode standard conformance test (ill-formed UTF sequences.)
<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
--FILE--
<?php
-function chk_enc($str, $n, $enc = "UTF-8", $with_bom = false) {
+function chk_enc($str, $n, $enc = "UTF-8") {
$src = bin2hex(mb_convert_encoding($str, "UCS-4BE", $enc));
$dst = str_repeat("0000fffd", $n);
- if ($with_bom) {
- $dst = "0000feff" . $dst;
- }
if ($dst == $src) {
return false;
} else {
@@ -129,7 +126,7 @@ $out = '';
$cnt = 0;
for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
$s = chk_enc("\x00\x00\xfe\xff". pack('C4', $i >> 24, ($i >> 16) & 0xff, ($i >> 8) & 0xff, $i & 0xff),
- 1, "UTF-32", true);
+ 1, "UTF-32");
if ($s === false) {
$cnt++;
} else {
@@ -137,13 +134,13 @@ for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
}
}
var_dump($cnt);
-var_dump(str_replace("0000feff","",$out));
+var_dump($out);
$out = '';
$cnt = 0;
for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
$s = chk_enc("\xff\xfe\x00\x00". pack('C4', $i & 0xff, ($i >> 8) & 0xff, ($i >> 16) & 0xff, ($i >> 24) & 0xff),
- 1, "UTF-32", true);
+ 1, "UTF-32");
if ($s === false) {
$cnt++;
} else {
@@ -151,7 +148,7 @@ for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
}
}
var_dump($cnt);
-var_dump(str_replace("0000feff","",$out));
+var_dump($out);
?>
--EXPECT--
@@ -199,10 +196,10 @@ bool(false)
string(8) "0010ffff"
bool(false)
string(8) "0010ffff"
-string(16) "0000feff0000fffd"
-string(16) "0000feff0010ffff"
-string(16) "0000feff0000fffd"
-string(16) "0000feff0010ffff"
+string(8) "0000fffd"
+string(8) "0010ffff"
+string(8) "0000fffd"
+string(8) "0010ffff"
UTF-32 and surrogates area
int(2048)
string(16) "0000d7ff0000e000"
diff --git a/ext/mbstring/tests/ini_mbstring_invalid.phpt b/ext/mbstring/tests/ini_mbstring_invalid.phpt
index 0bd10988d1..5166758b1f 100644
--- a/ext/mbstring/tests/ini_mbstring_invalid.phpt
+++ b/ext/mbstring/tests/ini_mbstring_invalid.phpt
@@ -10,7 +10,6 @@ mbstring.http_input=UTF-8,HTTP_INPUT,ASCII
mbstring.http_output=HTTP_OUTPUT
mbstring.http_output_conv_mimetypes=UNKNOWN_MIME_TYPE_OUTPUT
mbstring.substitute_character=U+3000,NON_EXISTING_CHARACTER,JIS+7E7E
-mbstring.func_overload=BOOL_OVERLOAD
mbstring.encoding_translation=BOOL_TRANSLATION
mbstring.strict_detection=BOOL_STRICT_DETECTION
--FILE--
diff --git a/ext/mbstring/tests/iso2022jp_2004_encoding.phpt b/ext/mbstring/tests/iso2022jp_2004_encoding.phpt
new file mode 100644
index 0000000000..b2096cd849
--- /dev/null
+++ b/ext/mbstring/tests/iso2022jp_2004_encoding.phpt
@@ -0,0 +1,329 @@
+--TEST--
+Exhaustive test of ISO-2022-JP-2004 encoding verification and conversion
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+srand(111); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in table of all characters in JISX-0208 charset */
+$jisx0208Chars = array(); /* JISX0208 -> UTF-16BE */
+$fp = fopen(__DIR__ . '/data/JISX0208.txt', 'r+');
+while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+
+ if (sscanf($line, "0x%x\t0x%x\t0x%x", $shiftJIS, $jis0208Code, $unicodeCP) == 3) {
+ $jisx0208Chars[pack('n', $jis0208Code)] = pack('n', $unicodeCP);
+ }
+}
+
+/* The JIS X 0208 character set does not have a single, straightforward
+ * mapping to the Unicode character set
+ * mbstring converts one character differently from the mappings in
+ * data/JISX0208.txt, which comes from the Unicode Consortium */
+
+/* 0x2140 is a backslash; this can be mapped to 0x005C for an ordinary
+ * backslash, or 0xFF3C for a _fullwidth_ one */
+$jisx0208Chars["\x21\x40"] = "\xFF\x3C";
+
+/* Single bytes from 0x0-0x20 are allowed */
+for ($i = 0; $i <= 0x20; $i++) {
+ if ($i != 0x1B)
+ $jisx0208Chars[chr($i)] = "\x00" . chr($i);
+}
+/* As is 0x7F */
+$jisx0208Chars["\x7F"] = "\x00\x7F";
+
+/* Now read table of JISX-0213:2004 plane 1 and JISX-0213:2000 plane 2 chars */
+$jisx0213_2004_1Chars = array();
+$jisx0213_2000_2Chars = array();
+$fp = fopen(__DIR__ . '/data/ISO-2022-JP-2004-JISX0213.txt', 'r+');
+while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+
+ $cp2 = null;
+ if (sscanf($line, "%d-%x\tU+%x+%x", $type, $bytes, $cp1, $cp2) >= 3) {
+ if ($cp1 <= 0xFFFF)
+ $unicode = pack('n', $cp1);
+ else
+ $unicode = mb_convert_encoding(pack('N', $cp1), 'UTF-16BE', 'UTF-32BE');
+ if ($cp2)
+ $unicode .= pack('n', $cp2);
+
+ if ($type == 3)
+ $jisx0213_2004_1Chars[pack('n', $bytes)] = $unicode;
+ else if ($type == 4)
+ $jisx0213_2000_2Chars[pack('n', $bytes)] = $unicode;
+ }
+}
+
+/* JISX 0213 plane 1 0x2131 is an overline; Unicode has a halfwidth overline
+ * at 0x203E and a fullwidth overline at 0xFFE3
+ * We'll use the fullwidth version when converting JISX 0213 to Unicode */
+$jisx0213_2004_1Chars["\x21\x31"] = "\xFF\xE3";
+/* Same deal with the Yen sign; use the fullwidth one */
+$jisx0213_2004_1Chars["\x21\x6F"] = "\xFF\xE5";
+
+/* Since JISX 0213 is an extension of JISX 0208, allow the same single-byte chars */
+for ($i = 0; $i <= 0x20; $i++) {
+ if ($i != 0x1B)
+ $jisx0213_2004_1Chars[chr($i)] = "\x00" . chr($i);
+}
+$jisx0213_2004_1Chars["\x7F"] = "\x00\x7F";
+
+for ($i = 0; $i <= 0x20; $i++) {
+ if ($i != 0x1B)
+ $jisx0213_2000_2Chars[chr($i)] = "\x00" . chr($i);
+}
+$jisx0213_2000_2Chars["\x7F"] = "\x00\x7F";
+
+function testValid($from, $to, $bothWays = true) {
+ identifyValidString($from, 'ISO-2022-JP-2004');
+ convertValidString($from, $to, 'ISO-2022-JP-2004', 'UTF-16BE', false);
+
+ if ($bothWays) {
+ /* Try going in the opposite direction too
+ * ESC ( B at the beginning of ISO-2022-JP-2004 string is redundant,
+ * since ASCII mode is the default */
+ if (substr($from, 0, 3) == "\x1B(B")
+ $from = substr($from, 3, strlen($from) - 3);
+ /* If the ISO-2022-JP-2004 string switches to a different charset, it
+ * should switch back to ASCII at the end */
+ if (strpos($from, "\x1B\$B") !== false || strpos($from, "\x1B\$(Q") !== false || strpos($from, "\x1B\$(P") !== false)
+ $from .= "\x1B(B";
+
+ convertValidString($to, $from, 'UTF-16BE', 'ISO-2022-JP-2004', false);
+ }
+}
+
+function testInvalid($from, $to) {
+ testInvalidString($from, $to, 'ISO-2022-JP-2004', 'UTF-16BE');
+}
+
+/* Try all ASCII characters */
+for ($i = 0; $i <= 0x7F; $i++) {
+ if ($i == 0x1B)
+ continue;
+ testValid(chr($i), "\x00" . chr($i));
+}
+
+/* Try all ASCII characters, with explicit ASCII escape */
+for ($i = 0; $i <= 0x7F; $i++) {
+ if ($i == 0x1B)
+ continue;
+ testValid("\x1B(B" . chr($i), "\x00" . chr($i));
+}
+
+echo "Encoding verification and conversion works for all ASCII characters\n";
+
+/* Try a bare ESC */
+identifyInvalidString("\x1B", 'ISO-2022-JP-2004');
+
+/* Try all non-ASCII, non-ESC single bytes */
+for ($i = 0x80; $i <= 0xFF; $i++) {
+ testInvalid(chr($i), "\x00%");
+}
+
+echo "Encoding verification and conversion rejects all invalid single bytes\n";
+
+/* All valid JISX0208 characters */
+foreach ($jisx0208Chars as $jisx0208 => $utf16BE) {
+ /* Since JIS X 0213 charset is a superset of JIS X 0208, we don't bother
+ * using JIS X 0208 when converting Unicode to ISO-2022-JP-2004
+ * Therefore, don't test conversion in both directions here */
+ testValid("\x1B\$B" . $jisx0208, $utf16BE, false);
+}
+
+/* All invalid 1-byte JISX0208 characters */
+for ($i = 0; $i < 256; $i++) {
+ if ($i == 0x1B)
+ continue;
+ if ($i >= 0x21 && $i <= 0x7E)
+ continue;
+ $testString = chr($i);
+ if (!isset($jisx0208Chars[$testString])) {
+ testInvalid("\x1B\$B" . $testString, "\x00%");
+ }
+}
+
+/* All invalid 2-byte JISX0208 characters */
+for ($i = 0x21; $i <= 0x7E; $i++) {
+ for ($j = 0; $j < 256; $j++) {
+ $testString = chr($i) . chr($j);
+ if (!isset($jisx0208Chars[$testString])) {
+ testInvalid("\x1B\$B" . $testString, "\x00%");
+ }
+ }
+}
+
+echo "Encoding verification and conversion work on JISX-0208 characters\n";
+
+/* All JISX0213 plane 1 characters */
+foreach ($jisx0213_2004_1Chars as $jisx0213_2004 => $utf16BE) {
+ /* For single bytes, don't try conversion in both directions */
+ testValid("\x1B$(Q" . $jisx0213_2004, $utf16BE, $utf16BE > "\x01\x00");
+}
+
+/* All invalid 2-byte JISX0213 plane 1 characters */
+for ($i = 0x21; $i <= 0x7E; $i++) {
+ for ($j = 0; $j < 256; $j++) {
+ $testString = chr($i) . chr($j);
+ if (!isset($jisx0213_2004_1Chars[$testString])) {
+ testInvalid("\x1B$(Q" . $testString, "\x00%");
+ }
+ }
+}
+
+echo "Encoding verification and conversion work on JISX-0213:2004 plane 1 characters\n";
+
+/* All JISX0213 plane 2 characters */
+foreach ($jisx0213_2000_2Chars as $jisx0213_2000 => $utf16BE) {
+ /* For single bytes, don't try conversion in both directions */
+ testValid("\x1B$(P" . $jisx0213_2000, $utf16BE, $utf16BE > "\x01\x00");
+}
+
+/* All invalid 2-byte JISX0213 plane 2 characters */
+for ($i = 0x21; $i <= 0x7E; $i++) {
+ for ($j = 0; $j < 256; $j++) {
+ $testString = chr($i) . chr($j);
+ if (!isset($jisx0213_2000_2Chars[$testString])) {
+ testInvalid("\x1B$(P" . $testString, "\x00%");
+ }
+ }
+}
+
+echo "Encoding verification and conversion work on JISX-0213:2000 plane 2 characters\n";
+
+/* All possible escape sequences */
+$validEscapes = ["\x1B\$B" => true, "\x1B(B" => true, "\x1B$(Q" => true, "\x1B$(P" => true];
+for ($i = 0; $i <= 0xFF; $i++) {
+ for ($j = 0; $j <= 0xFF; $j++) {
+ $escapeSequence = "\x1B" . chr($i) . chr($j);
+ if (isset($validEscapes[$escapeSequence])) {
+ testValid($escapeSequence, "", false);
+ } else {
+ identifyInvalidString($escapeSequence, 'ISO-2022-JP-2004');
+ }
+ }
+}
+
+echo "All escape sequences work as expected\n";
+
+identifyInvalidString("\x1B$", 'ISO-2022-JP-2004');
+identifyInvalidString("\x1B(", 'ISO-2022-JP-2004');
+identifyInvalidString("\x1B$(", 'ISO-2022-JP-2004');
+
+echo "All incomplete escape sequences are rejected\n";
+
+/* Try all combinations of 2 different charsets in the same string */
+$ascii = "\x1B(Ba";
+$jisx0208 = "\x1B\$B" . array_keys($jisx0208Chars)[rand(0,1000)];
+$jisx0213_1 = "\x1B$(Q" . array_keys($jisx0213_2004_1Chars)[rand(0,1000)];
+$jisx0213_2 = "\x1B$(P" . array_keys($jisx0213_2000_2Chars)[rand(0,1000)];
+$differentCharsets = [$ascii, $jisx0208, $jisx0213_1, $jisx0213_2];
+foreach ($differentCharsets as $a) {
+ foreach ($differentCharsets as $b) {
+ identifyValidString($a . $b, 'ISO-2022-JP-2004');
+ }
+}
+
+/* Try redundant escape sequences (switching mode but including any characters
+ * in the new mode) */
+$ascii_Esc = "\x1B(B";
+$jisx0208_Esc = "\x1B\$B";
+$jisx0213_1_Esc = "\x1B$(Q";
+$jisx0213_2_Esc = "\x1B$(P";
+$differentCharsets = [$ascii_Esc, $jisx0208_Esc, $jisx0213_1_Esc, $jisx0213_2_Esc];
+foreach ($differentCharsets as $a) {
+ foreach ($differentCharsets as $b) {
+ testValid($a . $b, "", false);
+ }
+}
+
+echo "Combining multiple charsets in the same string works as expected\n";
+
+/* Try ending in the middle of a JISX0208 character */
+testInvalid(substr($jisx0208, 0, strlen($jisx0208) - 1), "\x00%");
+
+/* Try ending in the middle of a JISX0213 plane 1 character */
+testInvalid(substr($jisx0213_1, 0, strlen($jisx0213_1) - 1), "\x00%");
+
+/* Try ending in the middle of a JISX0213 plane 2 character */
+testInvalid(substr($jisx0213_2, 0, strlen($jisx0213_2) - 1), "\x00%");
+
+echo "Strings with truncated multi-byte characters are rejected\n";
+
+/* We have tried converting all kinds of strings with single characters;
+ * now try some random examples of strings with multiple characters */
+$jisx0208 = array_keys($jisx0208Chars);
+shuffle($jisx0208);
+$jisx0213_1 = array_keys($jisx0213_2004_1Chars);
+shuffle($jisx0213_1);
+$jisx0213_2 = array_keys($jisx0213_2000_2Chars);
+shuffle($jisx0213_2);
+
+for ($i = 0; $i < 100; $i++) {
+ $size = rand(5,20);
+ $testString = '';
+ $convertsTo = '';
+
+ /* Build a string from a random combination of characters in the supported
+ * character sets */
+ while ($size--) {
+ $type = rand(0,4);
+ $chars = rand(0,10);
+ if ($type == 0) { /* ASCII */
+ $testString .= "\x1B(B";
+ while ($chars--) {
+ $ascii = chr(rand(0x20, 0x7E));
+ $testString .= $ascii;
+ $convertsTo .= "\x00" . $ascii;
+ }
+ } else if ($type == 1) { /* JIS X 0208 */
+ $testString .= "\x1B\$B";
+ while ($chars--) {
+ $jis = array_pop($jisx0208);
+ $testString .= $jis;
+ $convertsTo .= $jisx0208Chars[$jis];
+ }
+ } else if ($type == 2) { /* JIS X 0213:2004 plane 1 */
+ $testString .= "\x1B$(Q";
+ while ($chars--) {
+ $jis = array_pop($jisx0213_1);
+ $testString .= $jis;
+ $convertsTo .= $jisx0213_2004_1Chars[$jis];
+ }
+ } else { /* JIS X 0213:2000 plane 2 */
+ $testString .= "\x1B$(P";
+ while ($chars-- && !empty($jisx0213_2)) {
+ $jis = array_pop($jisx0213_2);
+ $testString .= $jis;
+ $convertsTo .= $jisx0213_2000_2Chars[$jis];
+ }
+ }
+ }
+
+ testValid($testString, $convertsTo, false);
+}
+
+echo "All done!\n";
+
+?>
+--EXPECT--
+Encoding verification and conversion works for all ASCII characters
+Encoding verification and conversion rejects all invalid single bytes
+Encoding verification and conversion work on JISX-0208 characters
+Encoding verification and conversion work on JISX-0213:2004 plane 1 characters
+Encoding verification and conversion work on JISX-0213:2000 plane 2 characters
+All escape sequences work as expected
+All incomplete escape sequences are rejected
+Combining multiple charsets in the same string works as expected
+Strings with truncated multi-byte characters are rejected
+All done!
diff --git a/ext/mbstring/tests/iso2022jp_encoding.phpt b/ext/mbstring/tests/iso2022jp_encoding.phpt
new file mode 100644
index 0000000000..fd1e057edf
--- /dev/null
+++ b/ext/mbstring/tests/iso2022jp_encoding.phpt
@@ -0,0 +1,195 @@
+--TEST--
+Test of ASCII and JIS X 0201/0208/0212 support in ISO-2022-JP and JIS7/8 encodings
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in table of all characters in JISX-0212 charset */
+readConversionTable(__DIR__ . '/data/JISX0212.txt', $jisx0212Chars, $unused);
+
+/* Read in table of all characters in JISX-0208 charset */
+$jisx0208Chars = array(); /* JISX0208 -> UTF-16BE */
+$fp = fopen(__DIR__ . '/data/JISX0208.txt', 'r+');
+while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+
+ if (sscanf($line, "0x%x\t0x%x\t0x%x", $shiftJIS, $jis0208Code, $unicodeCP) == 3) {
+ $jisx0208Chars[pack('n', $jis0208Code)] = pack('n', $unicodeCP);
+ }
+}
+
+/* Read in table of all characters in JISX-0201 charset */
+readConversionTable(__DIR__ . '/data/JISX0201.txt', $jisx0201Chars, $unused);
+
+/* The JIS X 0208 character set does not have a single, straightforward
+ * mapping to the Unicode character set
+ * mbstring converts one character differently from the mappings in
+ * ../docs/JISX0208.txt, which comes from the Unicode Consortium */
+
+/* 0x2140 is a backslash; this can be mapped to 0x005C for an ordinary
+ * backslash, or 0xFF3C for a _fullwidth_ one */
+$jisx0208Chars["\x21\x40"] = "\xFF\x3C";
+
+function testValid($from, $to, $encoding, $bothWays = true) {
+ identifyValidString($from, $encoding);
+ convertValidString($from, $to, $encoding, 'UTF-16BE', false);
+
+ if ($bothWays) {
+ /* An 0xF at the beginning of a JIS7 string is redundant; it switches
+ * to ASCII mode, but ASCII mode is default */
+ if ($from[0] == "\x0F")
+ $from = substr($from, 1, strlen($from) - 1);
+ /* ESC ( B at the beginning is redundant, since ASCII mode is the default */
+ if (substr($from, 0, 3) == "\x1B(B")
+ $from = substr($from, 3, strlen($from) - 3);
+ /* If the string switches to a different charset, it should switch back to
+ * ASCII at the end */
+ if (strpos($from, "\x1B\$B") !== false || strpos($from, "\x1B(J") !== false)
+ $from .= "\x1B(B";
+
+ convertValidString($to, $from, 'UTF-16BE', $encoding, false);
+ }
+}
+
+function testInvalid($from, $to, $encoding) {
+ testInvalidString($from, $to, $encoding, 'UTF-16BE');
+}
+
+for ($i = 0; $i < 0x80; $i++) {
+ if ($i == 0xE || $i == 0xF || $i == 0x1B)
+ continue;
+ testValid(chr($i), "\x00" . chr($i), 'JIS');
+ testValid("\x0F" . chr($i), "\x00" . chr($i), 'JIS'); /* 0xF is 'Shift Out' code */
+ testValid("\x1B(B" . chr($i), "\x00" . chr($i), 'JIS');
+ testValid(chr($i), "\x00" . chr($i), 'ISO-2022-JP');
+ testValid("\x1B(B" . chr($i), "\x00" . chr($i), 'ISO-2022-JP');
+}
+
+for ($i = 0x80; $i < 256; $i++) {
+ if ($i >= 0xA1 && $i <= 0xDF) // We convert single bytes from 0xA1-0xDF as JIS X 0201 kana
+ continue;
+ testInvalid(chr($i), "\x00%", 'JIS');
+ testInvalid("\x0F" . chr($i), "\x00%", 'JIS');
+ testInvalid("\x1B(B" . chr($i), "\x00%", 'JIS');
+ testInvalid(chr($i), "\x00%", 'ISO-2022-JP');
+ testInvalid("\x1B(B" . chr($i), "\x00%", 'ISO-2022-JP');
+}
+
+echo "ASCII support OK\n";
+
+/* All valid JIS X 0201 characters
+ * Those with a 1 in the high bit are JIS X 0201 kana; JIS7 encodes those
+ * with a 0 in the high bit and treats them as a separate charset
+ * (We don't test ISO-2022-JP here, as it does not support the JIS X 0201 charset) */
+foreach ($jisx0201Chars as $jisx0201 => $utf16BE) {
+ if (ord($jisx0201) >= 128) {
+ $kana = chr(ord($jisx0201) - 128);
+ testValid("\x1B(I" . $kana, $utf16BE, 'JIS', false);
+ testValid("\x0E" . $kana, $utf16BE, 'JIS', false); /* 0xE is 'Shift In' code */
+ testValid($jisx0201, $utf16BE, 'JIS', false);
+ } else {
+ testValid("\x1B(J" . $jisx0201, $utf16BE, 'JIS', $utf16BE > "\x00\x80");
+ }
+}
+
+for ($i = 0x80; $i < 256; $i++) {
+ if ($i >= 0xA1 && $i <= 0xDF)
+ continue;
+ testInvalid("\x1B(I" . chr($i), "\x00%", 'JIS');
+ testInvalid("\x1B(J" . chr($i), "\x00%", 'JIS');
+}
+
+echo "JIS X 0201 support OK\n";
+
+/* All valid JISX0208 characters */
+foreach ($jisx0208Chars as $jisx0208 => $utf16BE) {
+ testValid("\x1B\$B" . $jisx0208, $utf16BE, 'JIS');
+ testValid("\x1B\$B" . $jisx0208, $utf16BE, 'ISO-2022-JP');
+}
+
+/* All invalid 2-byte JISX0208 characters */
+for ($i = 0x21; $i <= 0x7E; $i++) {
+ for ($j = 0; $j < 256; $j++) {
+ $testString = chr($i) . chr($j);
+ if (!isset($jisx0208Chars[$testString])) {
+ testInvalid("\x1B\$B" . $testString, "\x00%", 'JIS');
+ testInvalid("\x1B\$B" . $testString, "\x00%", 'ISO-2022-JP');
+ }
+ }
+}
+
+/* Try truncated JISX0208 characters */
+for ($i = 0x21; $i <= 0x7E; $i++) {
+ testInvalid("\x1B\$B" . chr($i), "\x00%", 'JIS');
+ testInvalid("\x1B\$B" . chr($i), "\x00%", 'ISO-2022-JP');
+}
+
+echo "JIS X 0208 support OK\n";
+
+/* JIS7 supports escape to switch to JIS X 0212 charset, but ISO-2022-JP does not */
+
+/* All valid JISX0212 characters */
+foreach ($jisx0212Chars as $jisx0212 => $utf16BE) {
+ testValid("\x1B\$(D" . $jisx0212, $utf16BE, 'JIS', false);
+}
+
+/* All invalid 2-byte JISX0212 characters */
+for ($i = 0x21; $i <= 0x7E; $i++) {
+ for ($j = 0; $j < 256; $j++) {
+ $testString = chr($i) . chr($j);
+ if (!isset($jisx0212Chars[$testString])) {
+ testInvalid("\x1B\$(D" . $testString, "\x00%", 'JIS');
+ }
+ }
+}
+
+/* Try truncated JISX0212 characters */
+for ($i = 0x21; $i <= 0x7E; $i++) {
+ testInvalid("\x1B\$(D" . chr($i), "\x00%", 'JIS');
+}
+
+echo "JIS X 0212 support OK\n";
+
+/* All possible escape sequences */
+$validEscapes = ["\x1B\$@" => true, "\x1B\$B" => true, "\x1B\$(@" => true, "\x1B\$(B" => true, "\x1B\$(D" => true, "\x1B(B" => true, "\x1B(H" => true, "\x1B(J" => true, "\x1B(I" => true];
+for ($i = 0; $i <= 0xFF; $i++) {
+ for ($j = 0; $j <= 0xFF; $j++) {
+ $escapeSequence = "\x1B" . chr($i) . chr($j);
+ if ($escapeSequence === "\x1B\$(")
+ continue;
+ if (isset($validEscapes[$escapeSequence])) {
+ testValid($escapeSequence, "", 'JIS', false);
+ testValid($escapeSequence, "", 'ISO-2022-JP', false);
+ } else {
+ identifyInvalidString($escapeSequence, 'JIS');
+ identifyInvalidString($escapeSequence, 'ISO-2022-JP');
+ }
+ }
+}
+for ($i = 0; $i <= 0xFF; $i++) {
+ $escapeSequence = "\x1B\$(" . chr($i);
+ if (isset($validEscapes[$escapeSequence])) {
+ testValid($escapeSequence, "", 'JIS', false);
+ testValid($escapeSequence, "", 'ISO-2022-JP', false);
+ } else {
+ identifyInvalidString($escapeSequence, 'JIS');
+ identifyInvalidString($escapeSequence, 'ISO-2022-JP');
+ }
+}
+
+echo "All escape sequences work as expected\n";
+
+?>
+--EXPECT--
+ASCII support OK
+JIS X 0201 support OK
+JIS X 0208 support OK
+JIS X 0212 support OK
+All escape sequences work as expected
diff --git a/ext/mbstring/tests/iso8859_encodings.phpt b/ext/mbstring/tests/iso8859_encodings.phpt
new file mode 100644
index 0000000000..bbc70dfe3d
--- /dev/null
+++ b/ext/mbstring/tests/iso8859_encodings.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Exhaustive test of verification and conversion of ISO-8859-X text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+
+for ($n = 1; $n <= 16; $n++) {
+ if ($n == 11 || $n == 12)
+ continue;
+ testEncodingFromUTF16ConversionTable(__DIR__ . "/data/8859-$n.txt", "ISO-8859-{$n}");
+}
+?>
+--EXPECT--
+Tested ISO-8859-1 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-1
+Tested ISO-8859-2 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-2
+Tested ISO-8859-3 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-3
+Tested ISO-8859-4 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-4
+Tested ISO-8859-5 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-5
+Tested ISO-8859-6 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-6
+Tested ISO-8859-7 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-7
+Tested ISO-8859-8 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-8
+Tested ISO-8859-9 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-9
+Tested ISO-8859-10 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-10
+Tested ISO-8859-13 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-13
+Tested ISO-8859-14 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-14
+Tested ISO-8859-15 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-15
+Tested ISO-8859-16 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-16
diff --git a/ext/mbstring/tests/koi8r_encoding.phpt b/ext/mbstring/tests/koi8r_encoding.phpt
new file mode 100644
index 0000000000..368de514e2
--- /dev/null
+++ b/ext/mbstring/tests/koi8r_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of KOI8-R text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/KOI8-R.txt', 'KOI8-R');
+?>
+--EXPECT--
+Tested KOI8-R -> UTF-16BE
+Tested UTF-16BE -> KOI8-R
diff --git a/ext/mbstring/tests/koi8u_encoding.phpt b/ext/mbstring/tests/koi8u_encoding.phpt
new file mode 100644
index 0000000000..499009225c
--- /dev/null
+++ b/ext/mbstring/tests/koi8u_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of KOI8-U text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/KOI8-U.txt', 'KOI8-U');
+?>
+--EXPECT--
+Tested KOI8-U -> UTF-16BE
+Tested UTF-16BE -> KOI8-U
diff --git a/ext/mbstring/tests/mb_convert_encoding.phpt b/ext/mbstring/tests/mb_convert_encoding.phpt
index 1f39d21b15..5ea4440049 100644
--- a/ext/mbstring/tests/mb_convert_encoding.phpt
+++ b/ext/mbstring/tests/mb_convert_encoding.phpt
@@ -20,11 +20,11 @@ $euc_jp = 'ÆüËܸì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£';
// Note: For some reason it complains, results are different. Not researched.
echo "== BASIC TEST ==\n";
$s = $sjis;
-$s = mb_convert_encoding($s, 'EUC-JP', 'SJIS');
+$s = bin2hex(mb_convert_encoding($s, 'EUC-JP', 'SJIS'));
print("EUC-JP: $s\n"); // EUC-JP
$s = $jis;
-$s = mb_convert_encoding($s, 'EUC-JP', 'JIS');
+$s = bin2hex(mb_convert_encoding($s, 'EUC-JP', 'JIS'));
print("EUC-JP: $s\n"); // EUC-JP
$s = $euc_jp;
@@ -41,7 +41,7 @@ echo "== STRING ENCODING LIST ==\n";
$a = 'JIS,UTF-8,EUC-JP,SJIS';
$s = $jis;
-$s = mb_convert_encoding($s, 'EUC-JP', $a);
+$s = bin2hex(mb_convert_encoding($s, 'EUC-JP', $a));
print("EUC-JP: $s\n"); // EUC-JP
$s = $euc_jp;
@@ -58,7 +58,7 @@ echo "== ARRAY ENCODING LIST ==\n";
$a = array(0=>'JIS', 1=>'UTF-8', 2=>'EUC-JP', 3=>'SJIS');
$s = $jis;
-$s = mb_convert_encoding($s, 'EUC-JP', $a);
+$s = bin2hex(mb_convert_encoding($s, 'EUC-JP', $a));
print("EUC-JP: $s\n"); // EUC-JP
$s = $euc_jp;
@@ -74,7 +74,7 @@ print("JIS: ".base64_encode($s)."\n"); // JIS
echo "== DETECT ORDER ==\n";
$s = $jis;
-$s = mb_convert_encoding($s, 'EUC-JP', 'auto');
+$s = bin2hex(mb_convert_encoding($s, 'EUC-JP', 'auto'));
print("EUC-JP: $s\n"); // EUC-JP
$s = $euc_jp;
@@ -86,18 +86,18 @@ $s = mb_convert_encoding($s, 'JIS', 'auto');
print("JIS: ".base64_encode($s)."\n"); // JIS
-// Invalid(?) Parameters
+// Invalid Parameters
echo "== INVALID PARAMETER ==\n";
$s = mb_convert_encoding(1234, 'EUC-JP');
-print("INT: $s\n"); // EUC-JP
+print("INT: $s\n");
$s = mb_convert_encoding('', 'EUC-JP');
print("EUC-JP: $s\n"); // SJIS
$s = $euc_jp;
try {
- var_dump( mb_convert_encoding($s, 'BAD') );
+ var_dump(mb_convert_encoding($s, 'BAD'));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
@@ -105,20 +105,20 @@ try {
?>
--EXPECT--
== BASIC TEST ==
-EUC-JP: ÆüËܸì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£
-EUC-JP: ÆüËܸì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£
+EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3
+EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3
SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
== STRING ENCODING LIST ==
-EUC-JP: ÆüËܸì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£
+EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3
SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
== ARRAY ENCODING LIST ==
-EUC-JP: ÆüËܸì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£
+EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3
SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
== DETECT ORDER ==
-EUC-JP: ÆüËܸì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£
+EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3
SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
== INVALID PARAMETER ==
diff --git a/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt b/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt
index b3c8ba10bb..45efe28766 100644
--- a/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt
+++ b/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt
@@ -1,5 +1,7 @@
--TEST--
mb_convert_encoding() when encoding detection fails
+--INI--
+mbstring.strict_detection=1
--FILE--
<?php
diff --git a/ext/mbstring/tests/mb_detect_encoding.phpt b/ext/mbstring/tests/mb_detect_encoding.phpt
index 71c44c1642..b3db5f8825 100644
--- a/ext/mbstring/tests/mb_detect_encoding.phpt
+++ b/ext/mbstring/tests/mb_detect_encoding.phpt
@@ -41,7 +41,6 @@ echo "== ARRAY ENCODING LIST ==\n";
$a = array(0=>'UTF-8',1=>'EUC-JP', 2=>'SJIS', 3=>'JIS');
-// Note: Due to detect order, detected as UTF-8
$s = $jis;
$s = mb_detect_encoding($s, $a);
print("JIS: $s\n");
@@ -98,7 +97,7 @@ JIS: JIS
EUC-JP: EUC-JP
EUC-JP: EUC-JP
== ARRAY ENCODING LIST ==
-JIS: UTF-8
+JIS: JIS
EUC-JP: EUC-JP
SJIS: SJIS
== DETECT ORDER ==
diff --git a/ext/mbstring/tests/mb_ereg_replace_variation1.phpt b/ext/mbstring/tests/mb_ereg_replace_variation1.phpt
index 90af39cf58..dfa2e18eb0 100644
--- a/ext/mbstring/tests/mb_ereg_replace_variation1.phpt
+++ b/ext/mbstring/tests/mb_ereg_replace_variation1.phpt
@@ -16,10 +16,6 @@ $replacement = 'string_val';
$string = 'string_val';
$option = '';
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
-
// get a class
class classA
{
@@ -49,10 +45,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*10*/ NULL,
- null,
-
// boolean data
/*12*/ true,
false,
@@ -71,12 +63,6 @@ $inputs = array(
// object data
/*21*/ new classA(),
- // undefined data
-/*22*/ @$undefined_var,
-
- // unset data
-/*23*/ @$unset_var,
-
);
// loop through each element of the array for pattern
@@ -121,7 +107,7 @@ string(10) "string_val"
string(10) "string_val"
-- Iteration 10 --
-string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
+string(10) "string_val"
-- Iteration 11 --
string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
@@ -133,32 +119,20 @@ string(10) "string_val"
string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
-- Iteration 14 --
-string(10) "string_val"
+string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
-- Iteration 15 --
string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
-- Iteration 16 --
-string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
+string(10) "string_val"
-- Iteration 17 --
-string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
+string(10) "string_val"
-- Iteration 18 --
string(10) "string_val"
-- Iteration 19 --
string(10) "string_val"
-
--- Iteration 20 --
-string(10) "string_val"
-
--- Iteration 21 --
-string(10) "string_val"
-
--- Iteration 22 --
-string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
-
--- Iteration 23 --
-string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
Done
diff --git a/ext/mbstring/tests/mb_internal_encoding_variation2.phpt b/ext/mbstring/tests/mb_internal_encoding_variation2.phpt
index df38a9876b..ccf06802ba 100644
--- a/ext/mbstring/tests/mb_internal_encoding_variation2.phpt
+++ b/ext/mbstring/tests/mb_internal_encoding_variation2.phpt
@@ -50,10 +50,6 @@ $encoding = array('UCS-4', /*1*/
'ISO-8859-13',
'ISO-8859-14',
'ISO-8859-15', /*35*/
- 'byte2be',
- 'byte2le',
- 'byte4be',
- 'byte4le',
'BASE64', /*40*/
'HTML-ENTITIES',
'7bit',
@@ -263,104 +259,84 @@ string(11) "ISO-8859-15"
-- Iteration 36 --
string(11) "ISO-8859-15"
bool(true)
-string(7) "byte2be"
-
--- Iteration 37 --
-string(7) "byte2be"
-bool(true)
-string(7) "byte2le"
-
--- Iteration 38 --
-string(7) "byte2le"
-bool(true)
-string(7) "byte4be"
-
--- Iteration 39 --
-string(7) "byte4be"
-bool(true)
-string(7) "byte4le"
-
--- Iteration 40 --
-string(7) "byte4le"
-bool(true)
string(6) "BASE64"
--- Iteration 41 --
+-- Iteration 37 --
string(6) "BASE64"
bool(true)
string(13) "HTML-ENTITIES"
--- Iteration 42 --
+-- Iteration 38 --
string(13) "HTML-ENTITIES"
bool(true)
string(4) "7bit"
--- Iteration 43 --
+-- Iteration 39 --
string(4) "7bit"
bool(true)
string(4) "8bit"
--- Iteration 44 --
+-- Iteration 40 --
string(4) "8bit"
bool(true)
string(6) "EUC-CN"
--- Iteration 45 --
+-- Iteration 41 --
string(6) "EUC-CN"
bool(true)
string(5) "CP936"
--- Iteration 46 --
+-- Iteration 42 --
string(5) "CP936"
bool(true)
string(2) "HZ"
--- Iteration 47 --
+-- Iteration 43 --
string(2) "HZ"
bool(true)
string(6) "EUC-TW"
--- Iteration 48 --
+-- Iteration 44 --
string(6) "EUC-TW"
bool(true)
string(5) "CP950"
--- Iteration 49 --
+-- Iteration 45 --
string(5) "CP950"
bool(true)
string(5) "BIG-5"
--- Iteration 50 --
+-- Iteration 46 --
string(5) "BIG-5"
bool(true)
string(6) "EUC-KR"
--- Iteration 51 --
+-- Iteration 47 --
string(6) "EUC-KR"
bool(true)
string(3) "UHC"
--- Iteration 52 --
+-- Iteration 48 --
string(3) "UHC"
bool(true)
string(11) "ISO-2022-KR"
--- Iteration 53 --
+-- Iteration 49 --
string(11) "ISO-2022-KR"
bool(true)
string(12) "Windows-1251"
--- Iteration 54 --
+-- Iteration 50 --
string(12) "Windows-1251"
bool(true)
string(12) "Windows-1252"
--- Iteration 55 --
+-- Iteration 51 --
string(12) "Windows-1252"
bool(true)
string(5) "CP866"
--- Iteration 56 --
+-- Iteration 52 --
string(5) "CP866"
bool(true)
string(6) "KOI8-R"
diff --git a/ext/mbstring/tests/mb_str_functions_opt-parameter.phpt b/ext/mbstring/tests/mb_str_functions_opt-parameter.phpt
index fc99a48747..07376dc911 100644
--- a/ext/mbstring/tests/mb_str_functions_opt-parameter.phpt
+++ b/ext/mbstring/tests/mb_str_functions_opt-parameter.phpt
@@ -1,5 +1,5 @@
--TEST--
-Optional long parameter might be null
+Optional long parameter might be null (deprecated)
--SKIPIF--
<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
--FILE--
@@ -16,15 +16,32 @@ echo mb_substr('foobarbaz', 6, null, 'UTF-8') . "\n";
echo mb_strcut('foobarbaz', 6, null, 'UTF-8') . "\n";
echo mb_strimwidth('foobar', 0, 3, null, 'UTF-8') . "\n";
?>
---EXPECT--
+--EXPECTF--
+Deprecated: mb_strpos(): Passing null to parameter #3 ($offset) of type int is deprecated in %s on line %d
1
+
+Deprecated: mb_strrpos(): Passing null to parameter #3 ($offset) of type int is deprecated in %s on line %d
2
+
+Deprecated: mb_stripos(): Passing null to parameter #3 ($offset) of type int is deprecated in %s on line %d
1
+
+Deprecated: mb_strripos(): Passing null to parameter #3 ($offset) of type int is deprecated in %s on line %d
2
+
+Deprecated: mb_strstr(): Passing null to parameter #3 ($before_needle) of type bool is deprecated in %s on line %d
barbaz
+
+Deprecated: mb_strrchr(): Passing null to parameter #3 ($before_needle) of type bool is deprecated in %s on line %d
baz
+
+Deprecated: mb_stristr(): Passing null to parameter #3 ($before_needle) of type bool is deprecated in %s on line %d
barbaz
+
+Deprecated: mb_strrichr(): Passing null to parameter #3 ($before_needle) of type bool is deprecated in %s on line %d
baz
baz
baz
+
+Deprecated: mb_strimwidth(): Passing null to parameter #4 ($trim_marker) of type string is deprecated in %s on line %d
foo
diff --git a/ext/mbstring/tests/mb_str_split_jp.phpt b/ext/mbstring/tests/mb_str_split_jp.phpt
index 84f63030d6..fdf192d46f 100644
--- a/ext/mbstring/tests/mb_str_split_jp.phpt
+++ b/ext/mbstring/tests/mb_str_split_jp.phpt
@@ -4,7 +4,6 @@ mb_str_split() tests for the japanese language
<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
--INI--
output_handler=
-mbstring.func_overload=0
--FILE--
<?php
ini_set('include_path','.');
diff --git a/ext/mbstring/tests/mb_str_split_ru.phpt b/ext/mbstring/tests/mb_str_split_ru.phpt
index 75e49275d7..0f2ee30c08 100644
--- a/ext/mbstring/tests/mb_str_split_ru.phpt
+++ b/ext/mbstring/tests/mb_str_split_ru.phpt
@@ -4,7 +4,6 @@ mb_str_split() tests for the russian language
<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
--INI--
output_handler=
-mbstring.func_overload=0
--FILE--
<?php
ini_set('include_path','.');
diff --git a/ext/mbstring/tests/mb_str_split_utf8_utf16.phpt b/ext/mbstring/tests/mb_str_split_utf8_utf16.phpt
index 39bfb0175f..02d6dcb45b 100644
--- a/ext/mbstring/tests/mb_str_split_utf8_utf16.phpt
+++ b/ext/mbstring/tests/mb_str_split_utf8_utf16.phpt
@@ -4,7 +4,6 @@ mb_str_split() tests UTF-8 illegal chars & UTF-16 surrogate pairs
<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
--INI--
output_handler=
-mbstring.func_overload=0
--FILE--
<?php
ini_set('include_path','.');
diff --git a/ext/mbstring/tests/pictogram1.phpt b/ext/mbstring/tests/pictogram1.phpt
index 2c9609939a..7f82768a30 100644
--- a/ext/mbstring/tests/pictogram1.phpt
+++ b/ext/mbstring/tests/pictogram1.phpt
@@ -68,6 +68,7 @@ var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "UTF-8-
var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "UTF-8-Mobile#KDDI", "UCS-4BE")));
var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "UTF-8-Mobile#SOFTBANK", "UCS-4BE")));
+/* Chinese flag emoji */
var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "UTF-8-Mobile#DOCOMO", "UCS-4BE")));
var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "UTF-8-Mobile#KDDI", "UCS-4BE")));
var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "UTF-8-Mobile#SOFTBANK", "UCS-4BE")));
diff --git a/ext/mbstring/tests/sjis2004_encoding.phpt b/ext/mbstring/tests/sjis2004_encoding.phpt
new file mode 100644
index 0000000000..3b4299e753
--- /dev/null
+++ b/ext/mbstring/tests/sjis2004_encoding.phpt
@@ -0,0 +1,67 @@
+--TEST--
+Exhaustive test of SJIS-2004 encoding verification and conversion
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+srand(101); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in the table of all characters in SJIS-2004 */
+$validChars = array(); /* SJIS-2004 string -> UTF-32BE string */
+$fromUnicode = array(); /* UTF-16BE -> SJIS-2004 */
+$fp = fopen(__DIR__ . '/data/SJIS-2004.txt', 'r+');
+while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+
+ $codepoint2 = null;
+ if (sscanf($line, "0x%x\tU+%x+%x", $bytes, $codepoint1, $codepoint2) >= 2) {
+ $sjis = ($bytes < 256) ? chr($bytes) : pack('n', $bytes);
+ if ($codepoint2) {
+ $validChars[$sjis] = pack('NN', $codepoint1, $codepoint2);
+ } else {
+ /* Two input byte sequences can translate to either a 'halfwidth' or a
+ * 'fullwidth' version of a character; our implementation of SJIS-2004
+ * translates them to the fullwidth versions */
+ if (preg_match('/Fullwidth: U\+([0-9A-F]+)/', $line, $match))
+ $codepoint1 = hexdec($match[1]);
+ $validChars[$sjis] = pack('N', $codepoint1);
+ if ($codepoint1 <= 0xFFFF)
+ $fromUnicode[pack('n', $codepoint1)] = $sjis;
+ }
+ }
+}
+
+/* U+007E is TILDE, Shift-JIS 0x8160 is WAVE DASH */
+$fromUnicode["\x00\x7E"] = "\x81\x60";
+
+/* U+005C is backslash, Shift-JIS 0x815F is REVERSE SOLIDUS
+ * (ie. a fancy way to say "backslash") */
+$fromUnicode["\x00\x5C"] = "\x81\x5F";
+
+testAllValidChars($validChars, 'SJIS-2004', 'UTF-32BE');
+echo "SJIS-2004 verification and conversion works for all valid characters\n";
+
+findInvalidChars($validChars, $invalidChars, $truncated,
+ array_fill_keys(range(0x81, 0x9F), 2) + array_fill_keys(range(0xE0, 0xFC), 2));
+testAllInvalidChars($invalidChars, $validChars, 'SJIS-2004', 'UTF-32BE', "\x00\x00\x00%");
+testTruncatedChars($truncated, 'SJIS-2004', 'UTF-32BE', "\x00\x00\x00%");
+echo "SJIS-2004 verification and conversion rejects all invalid characters\n";
+
+testAllValidChars($fromUnicode, 'UTF-16BE', 'SJIS-2004', false);
+echo "Unicode -> SJIS-2004 conversion works on all valid characters\n";
+
+findInvalidChars($fromUnicode, $invalidChars, $unused, array_fill_keys(range(0, 0xFF), 2));
+convertAllInvalidChars($invalidChars, $fromUnicode, 'UTF-16BE', 'SJIS-2004', '%');
+echo "Unicode -> SJIS-2004 conversion works on all invalid characters\n";
+?>
+--EXPECT--
+SJIS-2004 verification and conversion works for all valid characters
+SJIS-2004 verification and conversion rejects all invalid characters
+Unicode -> SJIS-2004 conversion works on all valid characters
+Unicode -> SJIS-2004 conversion works on all invalid characters
diff --git a/ext/mbstring/tests/sjis_encoding.phpt b/ext/mbstring/tests/sjis_encoding.phpt
new file mode 100644
index 0000000000..d7d7d26457
--- /dev/null
+++ b/ext/mbstring/tests/sjis_encoding.phpt
@@ -0,0 +1,66 @@
+--TEST--
+Exhaustive test of Shift-JIS encoding verification and conversion
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+srand(999); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in the table of all characters in Shift-JIS */
+readConversionTable(__DIR__ . '/data/SHIFTJIS.txt', $validChars, $fromUnicode);
+
+for ($i = 0; $i < 0x20; $i++) {
+ $validChars[chr($i)] = "\x00" . chr($i);
+ $fromUnicode["\x00" . chr($i)] = chr($i);
+}
+
+/* U+007E is TILDE; convert to Shift-JIS 0x8160 (WAVE DASH) */
+$fromUnicode["\x00\x7E"] = "\x81\x60";
+/* DEL character */
+$validChars["\x7F"] = "\x00\x7F";
+$fromUnicode["\x00\x7F"] = "\x7F";
+/* U+00AF is MACRON; Shift-JIS 0x7E is overline */
+$fromUnicode["\x00\xAF"] = "\x7E";
+/* Use fullwidth reverse solidus, not (halfwidth) backslash (0x5C) */
+$validChars["\x81\x5F"] = "\xFF\x3C";
+$fromUnicode["\xFF\x3C"] = "\x81\x5F";
+/* Unicode has both halfwidth and fullwidth NOT SIGN; convert both of them
+ * to JIS X 0208 NOT SIGN */
+$fromUnicode["\xFF\xE2"] = "\x81\xCA";
+/* Likewise for fullwidth and halfwidth POUND SIGN */
+$fromUnicode["\xFF\xE1"] = "\x81\x92";
+/* Likewise for fullwidth and halfwidth CENT SIGN */
+$fromUnicode["\xFF\xE0"] = "\x81\x91";
+/* Convert Unicode FULLWIDTH TILDE to JIS X 0208 WAVE DASH */
+$fromUnicode["\xFF\x5E"] = "\x81\x60";
+/* Convert Unicode FULLWIDTH HYPHEN-MINUS to JIS X 0208 MINUS SIGN */
+$fromUnicode["\xFF\x0D"] = "\x81\x7C";
+/* Convert Unicode PARALLEL TO to JIS X 0208 DOUBLE VERTICAL LINE */
+$fromUnicode["\x22\x25"] = "\x81\x61";
+
+testAllValidChars($validChars, 'Shift-JIS', 'UTF-16BE');
+echo "SJIS verification and conversion works on all valid characters\n";
+
+findInvalidChars($validChars, $invalidChars, $truncated,
+ array_fill_keys(range(0x81, 0x9F), 2) + array_fill_keys(range(0xE0, 0xEF), 2));
+testAllInvalidChars($invalidChars, $validChars, 'Shift-JIS', 'UTF-16BE', "\x00%");
+testTruncatedChars($truncated, 'Shift-JIS', 'UTF-16BE', "\x00%");
+echo "SJIS verification and conversion works on all invalid characters\n";
+
+testAllValidChars($fromUnicode, 'UTF-16BE', 'Shift-JIS', false);
+echo "Unicode -> SJIS conversion works on all valid characters\n";
+
+findInvalidChars($fromUnicode, $invalidChars, $unused, array_fill_keys(range(0, 0xFF), 2));
+convertAllInvalidChars($invalidChars, $fromUnicode, 'UTF-16BE', 'Shift-JIS', '%');
+echo "Unicode -> SJIS conversion works on all invalid characters\n";
+?>
+--EXPECT--
+SJIS verification and conversion works on all valid characters
+SJIS verification and conversion works on all invalid characters
+Unicode -> SJIS conversion works on all valid characters
+Unicode -> SJIS conversion works on all invalid characters
diff --git a/ext/mbstring/tests/sjis_mobile_encodings.phpt b/ext/mbstring/tests/sjis_mobile_encodings.phpt
new file mode 100644
index 0000000000..49b5e9c093
--- /dev/null
+++ b/ext/mbstring/tests/sjis_mobile_encodings.phpt
@@ -0,0 +1,295 @@
+--TEST--
+Exhaustive test of Shift-JIS DoCoMo, KDDI, SoftBank encoding verification and conversion
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+srand(818); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in the table of all characters in Windows-932
+ * (The SJIS-Mobile encodings all use MS extensions) */
+readConversionTable(__DIR__ . '/data/CP932.txt', $sjisChars, $fromUnicode, true);
+
+/* U+301C (WAVE DASH) converts to SJIS 0x8160 (WAVE DASH) */
+$fromUnicode["\x00\x00\x30\x1C"] = "\x81\x60";
+/* U+2212 (MINUS SIGN) converts to SJIS 0x817C (FULLWIDTH HYPHEN-MINUS) */
+$fromUnicode["\x00\x00\x22\x12"] = "\x81\x7C";
+/* U+203E (OVERLINE) converts to SJIS 0x8150 (FULLWIDTH MACRON) */
+$fromUnicode["\x00\x00\x20\x3E"] = "\x81\x50";
+/* U+2016 (DOUBLE VERTICAL LINE) converts to SJIS 0x8161 (PARALLEL TO) */
+$fromUnicode["\x00\x00\x20\x16"] = "\x81\x61";
+/* U+00AF (MACRON) converts to SJIS 0x8150 (FULLWIDTH MACRON) */
+$fromUnicode["\x00\x00\x00\xAF"] = "\x81\x50";
+/* U+00AC (NOT SIGN) converts to SJIS 0x81CA (FULLWIDTH NOT SIGN) */
+$fromUnicode["\x00\x00\x00\xAC"] = "\x81\xCA";
+/* U+00A5 (YEN SIGN) converts to SJIS 0x818F (FULLWIDTH YEN SIGN) */
+$fromUnicode["\x00\x00\x00\xA5"] = "\x81\x8F";
+/* U+00A3 (POUND SIGN) converts to SJIS 0x8192 (FULLWIDTH POUND SIGN) */
+$fromUnicode["\x00\x00\x00\xA3"] = "\x81\x92";
+/* U+00A2 (CENT SIGN) converts to SJIS 0x8191 (FULLWIDTH CENT SIGN) */
+$fromUnicode["\x00\x00\x00\xA2"] = "\x81\x91";
+
+/* Aside from the characters in that table, we also support a 'user' area
+ * from 0xF040-0xF9FC, which map to Unicode 'private' codepoints 0xE000-E757 */
+$codepoint = 0xE000;
+for ($i = 0xF0; $i <= 0xF9; $i++) {
+ for ($j = 0x40; $j <= 0xFC; $j++) {
+ if ($j == 0x7F)
+ continue;
+ $utf32 = pack('N', $codepoint);
+ $cp932 = chr($i) . chr($j);
+ $sjisChars[$cp932] = $utf32;
+ $fromUnicode[$utf32] = $cp932;
+ $codepoint++;
+ }
+}
+
+$invalidCodepoints = array();
+for ($i = 0; $i <= 0xFFFF; $i++) {
+ $cp = pack('N', $i);
+ if (!isset($fromUnicode[$cp]))
+ $invalidCodepoints[$cp] = true;
+}
+
+/* Windows-932 has many cases where two different kuten codes map to the same
+ * Unicode codepoints
+ *
+ * Everything from 0xED00-0xEEFF falls in this unfortunate category
+ * (Other sequences in 0xFA00-0xFC4B map to the same codepoints.)
+ * Our implementation of CP932 prefers the F's, but for SJIS-Mobile,
+ * we prefer the E's */
+$nonInvertible = array();
+for ($i = 0xFA00; $i <= 0xFC4B; $i++) {
+ $bytes = pack('n', $i);
+ if (isset($sjisChars[$bytes])) {
+ $nonInvertible[$bytes] = $sjisChars[$bytes];
+ unset($fromUnicode[$sjisChars[$bytes]]);
+ }
+}
+
+/* Other "collisions" */
+foreach ([0x8790, 0x8791, 0x8792, 0x8795, 0x8796, 0x8797, 0x879A, 0x879B, 0x879C, 0xEEF9] as $i) {
+ $bytes = pack('n', $i);
+ $nonInvertible[$bytes] = $sjisChars[$bytes];
+ unset($fromUnicode[$sjisChars[$bytes]]);
+}
+
+$nonInvertibleSoftbank = $nonInvertible;
+$nonInvertibleDocomo = $nonInvertible;
+
+/* Now read table of vendor-specific emoji encodings */
+$docomo = $sjisChars;
+$kddi = $sjisChars;
+$softbank = $sjisChars;
+$sbEmoji = array();
+$fp = fopen(realpath(__DIR__ . '/data/EmojiSources.txt'), 'r+');
+while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+ $fields = explode(';', rtrim($line));
+ if (count($fields) >= 4) {
+ if (sscanf($fields[0], "%x %x", $cp1, $cp2) == 2) {
+ $utf32 = pack('N', $cp1) . pack('N', $cp2);
+ } else {
+ $utf32 = pack('N', hexdec($fields[0]));
+ unset($invalidCodepoints[$utf32]);
+ }
+
+ if ($fields[1])
+ $docomo[pack('n', hexdec($fields[1]))] = $utf32;
+ if ($fields[2])
+ $kddi[pack('n', hexdec($fields[2]))] = $utf32;
+ if ($fields[3]) {
+ $bytes = pack('n', hexdec($fields[3]));
+ $sbEmoji[$bytes] = $utf32;
+ unset($nonInvertibleSoftbank[$bytes]);
+ }
+ }
+}
+
+/* Other, vendor-specific emoji which do not appear in EmojiSources.txt
+ * Most of these don't exist in Unicode and have been mapped to 'private
+ * area' codepoints */
+$docomo["\xF9\x4A"] = "\x00\x0F\xEE\x16"; // PIAS PI
+$docomo["\xF9\x4B"] = "\x00\x0F\xEE\x17"; // PIAS A
+$docomo["\xF9\x4C"] = "\x00\x0F\xEE\x18"; // INVERSE TICKET
+$docomo["\xF9\x4D"] = "\x00\x0F\xEE\x19"; // KATAKANA ABBREVIATION FOR TICKET ("chi ke")
+$docomo["\xF9\x4E"] = "\x00\x0F\xEE\x1A"; // RESERVE BY PHONE
+$docomo["\xF9\x4F"] = "\x00\x0F\xEE\x1B"; // P CODE
+$docomo["\xF9\x53"] = "\x00\x0F\xEE\x1C"; // MOVIES 2
+$docomo["\xF9\x54"] = "\x00\x0F\xEE\x1D"; // PIAS PI INVERSE
+$docomo["\xF9\x58"] = "\x00\x0F\xEE\x1E"; // PIAS PI CIRCLE
+$docomo["\xF9\x59"] = "\x00\x0F\xEE\x1F"; // PIAS PI SQUARE
+$docomo["\xF9\x5A"] = "\x00\x0F\xEE\x20"; // CHECK
+$docomo["\xF9\x5F"] = "\x00\x0F\xEE\x21"; // F
+$docomo["\xF9\x60"] = "\x00\x0F\xEE\x22"; // D
+$docomo["\xF9\x61"] = "\x00\x0F\xEE\x23"; // S
+$docomo["\xF9\x62"] = "\x00\x0F\xEE\x24"; // C
+$docomo["\xF9\x63"] = "\x00\x0F\xEE\x25"; // R
+$docomo["\xF9\x64"] = "\x00\x00\x25\xEA"; // SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+$nonInvertibleDocomo["\xF9\x64"] = "\x00\x00\x25\xEA";
+$docomo["\xF9\x65"] = "\x00\x00\x25\xA0"; // BLACK SQUARE
+$nonInvertibleDocomo["\xF9\x65"] = "\x00\x00\x25\xA0";
+$docomo["\xF9\x66"] = "\x00\x00\x25\xBF"; // DOWNWARD TRIANGLE
+$nonInvertibleDocomo["\xF9\x66"] = "\x00\x00\x25\xBF";
+/* TODO: test that FEE28 converts to F966, for backwards compatibility */
+$docomo["\xF9\x67"] = "\x00\x0F\xEE\x29"; // QUADRUPLE DAGGER
+$docomo["\xF9\x68"] = "\x00\x0F\xEE\x2A"; // TRIPLE DAGGER
+$docomo["\xF9\x69"] = "\x00\x0F\xEE\x2B"; // DOUBLE DAGGER
+$docomo["\xF9\x6A"] = "\x00\x00\x20\x20"; // DAGGER
+$nonInvertibleDocomo["\xF9\x6A"] = "\x00\x00\x20\x20";
+/* TODO: test that FEE2C converts to F96A, for backwards compatibility */
+$docomo["\xF9\x6B"] = "\x00\x0F\xEE\x2D"; // I (meaning "inexpensive")
+$docomo["\xF9\x6C"] = "\x00\x0F\xEE\x2E"; // M (meaning "moderate")
+$docomo["\xF9\x6D"] = "\x00\x0F\xEE\x2F"; // E (meaning "expensive")
+$docomo["\xF9\x6E"] = "\x00\x0F\xEE\x30"; // VE (meaning "very expensive")
+$docomo["\xF9\x6F"] = "\x00\x0F\xEE\x31"; // SPHERE
+$docomo["\xF9\x70"] = "\x00\x0F\xEE\x32"; // CREDIT CARDS NOT ACCEPTED
+$docomo["\xF9\x71"] = "\x00\x0F\xEE\x33"; // CHECKBOX
+$docomo["\xF9\x75"] = "\x00\x0F\xEE\x10"; // I-MODE
+$docomo["\xF9\x76"] = "\x00\x0F\xEE\x11"; // I-MODE WITH FRAME
+$docomo["\xF9\x78"] = "\x00\x0F\xEE\x12"; // PROVIDED BY DOCOMO
+$docomo["\xF9\x79"] = "\x00\x0F\xEE\x13"; // DOCOMO POINT
+$docomo["\xF9\x84"] = "\x00\x00\x27\xBF"; // FREE DIAL; mapped to DOUBLE CURLY LOOP
+unset($invalidCodepoints["\x00\x00\x27\xBF"]);
+$docomo["\xF9\x86"] = "\x00\x0F\xE8\x2D"; // MOBILE Q
+$docomo["\xF9\xB1"] = "\x00\x0F\xEE\x14"; // I-APPLI
+$docomo["\xF9\xB2"] = "\x00\x0F\xEE\x15"; // I-APPLI WITH BORDER
+
+$kddi["\xF7\x94"] = "\x00\x0F\xEE\x40"; // EZ WEB
+$kddi["\xF7\xCF"] = "\x00\x0F\xEE\x41"; // EZ PLUS
+$kddi["\xF3\x70"] = "\x00\x0F\xEE\x42"; // EZ NAVIGATION
+$kddi["\xF4\x78"] = "\x00\x0F\xEE\x43"; // EZ MOVIE
+$kddi["\xF4\x86"] = "\x00\x0F\xEE\x44"; // CMAIL
+$kddi["\xF4\x8E"] = "\x00\x0F\xEE\x45"; // JAVA (TM)
+$kddi["\xF4\x8F"] = "\x00\x0F\xEE\x46"; // BREW
+$kddi["\xF4\x90"] = "\x00\x0F\xEE\x47"; // EZ RING MUSIC
+$kddi["\xF4\x91"] = "\x00\x0F\xEE\x48"; // EZ NAVI
+$kddi["\xF4\x92"] = "\x00\x0F\xEE\x49"; // WIN
+$kddi["\xF4\x93"] = "\x00\x0F\xEE\x4A"; // PREMIUM SIGN
+$kddi["\xF7\x48"] = "\x00\x0F\xE8\x2D"; // MOBILE Q
+$kddi["\xF7\xA3"] = "\x00\x0F\xE8\x3C"; // PDC ("personal digital cellular")
+$kddi["\xF7\xD2"] = "\x00\x0F\xEB\x89"; // OPENWAVE
+
+$sbEmoji["\xF7\xB1"] = "\x00\x00\x27\xBF"; // FREE DIAL; mapped to DOUBLE CURLY
+$sbEmoji["\xF7\xF4"] = "\x00\x0F\xEE\x77"; // J-PHONE SHOP
+$sbEmoji["\xF7\xF5"] = "\x00\x0F\xEE\x78"; // SKY WEB
+$sbEmoji["\xF7\xF6"] = "\x00\x0F\xEE\x79"; // SKY WALKER
+$sbEmoji["\xF7\xF7"] = "\x00\x0F\xEE\x7A"; // SKY MELODY
+$sbEmoji["\xF7\xF8"] = "\x00\x0F\xEE\x7B"; // J-PHONE 1
+$sbEmoji["\xF7\xF9"] = "\x00\x0F\xEE\x7C"; // J-PHONE 2
+$sbEmoji["\xF7\xFA"] = "\x00\x0F\xEE\x7D"; // J-PHONE 3
+
+/* SoftBank-specific 'JSky1', 'JSky2', 'VODAFONE1', 'VODAFONE2', etc. emoji,
+ * which are not supported by Unicode */
+for ($i = 0xFBD8; $i <= 0xFBDE; $i++) {
+ $bytes = pack('n', $i);
+ $sbEmoji[$bytes] = pack('N', 0xFEE70 + $i - 0xFBD8);
+ unset($nonInvertibleSoftbank[$bytes]);
+}
+/* SoftBank-specific emoji for Shibuya department store */
+$sbEmoji["\xFB\xAA"] = "\x00\x0F\xE4\xC5";
+unset($nonInvertibleSoftbank["\xFB\xAA"]);
+
+$softbank = array_merge($softbank, $sbEmoji);
+
+/* For Softbank, we support an alternative representation for emoji which
+ * uses sequences starting with ESC. Apparently this was used in older
+ * versions of Softbank's phones.
+ * ESC could be followed by 6 different ASCII characters, each of which
+ * represented a different ku code */
+$escCodeToKu = array('G' => 0x91, 'E' => 0x8D, 'F' => 0x8E, 'O' => 0x92, 'P' => 0x95, 'Q' => 0x96);
+$escCodeMaxTen = array('G' => 0x7A, 'E' => 0x7A, 'F' => 0x7A, 'O' => 0x6D, 'P' => 0x6C, 'Q' => 0x5E);
+
+function shiftJISEncode($ku, $ten) {
+ $ku -= 0x21;
+ $ten -= 0x21;
+ $hiBits = $ku >> 1;
+ $loBit = $ku % 2;
+ if ($hiBits < 31) {
+ $sjis = chr($hiBits + 0x81);
+ } else {
+ $sjis = chr($hiBits - 31 + 0xE0);
+ }
+ if ($loBit == 0) {
+ if ($ten < 63)
+ return $sjis . chr($ten + 0x40);
+ else
+ return $sjis . chr($ten - 63 + 0x80);
+ } else {
+ return $sjis . chr($ten + 0x9F);
+ }
+}
+
+foreach ($escCodeToKu as $char => $ku) {
+ for ($ten = 0x21; $ten <= $escCodeMaxTen[$char]; $ten++) {
+ $sjis = shiftJISEncode($ku, $ten);
+ if (isset($sbEmoji[$sjis])) {
+ $bytes = "\x1B\$" . $char . chr($ten);
+ $unicode = $softbank[$sjis];
+ $nonInvertibleSoftbank[$bytes] = $softbank[$bytes] = $unicode;
+ }
+ }
+}
+
+/* A bare ESC is not valid for Softbank, since it is used for escape sequences
+ * which represent emoji */
+unset($softbank["\x1B"]);
+
+function testSJISVariant($validChars, $nonInvertible, $encoding) {
+ global $fromUnicode, $invalidCodepoints, $escCodeToKu;
+
+ $lenTable = array_fill_keys(range(0xE0, 0xFC), 2) + array_fill_keys(range(0x81, 0x9F), 2);
+ findInvalidChars($validChars, $invalidChars, $truncated, $lenTable);
+
+ foreach ($escCodeToKu as $char => $unused) {
+ unset($invalidChars["\x1B\$" . $char . "\x0F"]);
+ unset($truncated["\x1B\$" . $char]);
+ }
+
+ $escapes = [];
+ foreach ($nonInvertible as $bytes => $unicode) {
+ unset($validChars[$bytes]);
+ if (substr($bytes, 0, 1) === "\x1B")
+ array_push($escapes, $bytes);
+ }
+ /* 0xF is used to terminate a run of emoji encoded using ESC sequence
+ * We couldn't do this earlier or `findInvalidChars` wouldn't have worked
+ * as desired */
+ foreach ($escapes as $bytes) {
+ $nonInvertible[$bytes . "\x0F"] = $nonInvertible[$bytes];
+ unset($nonInvertible[$bytes]);
+ }
+
+ testAllValidChars($validChars, $encoding, 'UTF-32BE');
+ testAllValidChars($nonInvertible, $encoding, 'UTF-32BE', false);
+ echo "$encoding verification and conversion works on all valid characters\n";
+
+ testAllInvalidChars($invalidChars, $validChars, $encoding, 'UTF-32BE', "\x00\x00\x00%");
+ testTruncatedChars($truncated, $encoding, 'UTF-32BE', "\x00\x00\x00%");
+ echo "$encoding verification and conversion works on all invalid characters\n";
+
+ convertAllInvalidChars($invalidCodepoints, $fromUnicode, 'UTF-32BE', $encoding, '%');
+ echo "Unicode -> $encoding conversion works on all invalid codepoints\n";
+}
+
+testSJISVariant($docomo, $nonInvertibleDocomo, 'SJIS-Mobile#DOCOMO');
+testSJISVariant($kddi, $nonInvertible, 'SJIS-Mobile#KDDI');
+testSJISVariant($softbank, $nonInvertibleSoftbank, 'SJIS-Mobile#SOFTBANK');
+
+?>
+--EXPECT--
+SJIS-Mobile#DOCOMO verification and conversion works on all valid characters
+SJIS-Mobile#DOCOMO verification and conversion works on all invalid characters
+Unicode -> SJIS-Mobile#DOCOMO conversion works on all invalid codepoints
+SJIS-Mobile#KDDI verification and conversion works on all valid characters
+SJIS-Mobile#KDDI verification and conversion works on all invalid characters
+Unicode -> SJIS-Mobile#KDDI conversion works on all invalid codepoints
+SJIS-Mobile#SOFTBANK verification and conversion works on all valid characters
+SJIS-Mobile#SOFTBANK verification and conversion works on all invalid characters
+Unicode -> SJIS-Mobile#SOFTBANK conversion works on all invalid codepoints
diff --git a/ext/mbstring/tests/sjismac_encoding.phpt b/ext/mbstring/tests/sjismac_encoding.phpt
new file mode 100644
index 0000000000..5803f0dc02
--- /dev/null
+++ b/ext/mbstring/tests/sjismac_encoding.phpt
@@ -0,0 +1,93 @@
+--TEST--
+Exhaustive test of MacJapanese encoding verification and conversion
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+srand(300); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in the table of all characters in MacJapanese */
+$validChars = array(); /* MacJapanese string -> UTF-32BE string */
+$fromUnicode = array(); /* UTF-16BE -> MacJapanese */
+$fp = fopen(__DIR__ . '/data/MacJapanese-SJIS.txt', 'r+');
+while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+
+ $cp1 = $cp2 = $cp3 = $cp4 = $cp5 = null;
+ if (sscanf($line, "0x%x\t0x%x+0x%x+0x%x+0x%x+0x%x", $bytes, $cp1, $cp2, $cp3, $cp4, $cp5) >= 2) {
+ if ($bytes < 256) {
+ $macJap = chr($bytes);
+ } else {
+ $macJap = pack('n', $bytes);
+ }
+
+ if ($cp5) {
+ $validChars[$macJap] = pack('NNNNN', $cp1, $cp2, $cp3, $cp4, $cp5);
+ $fromUnicode[pack('nnnnn', $cp1, $cp2, $cp3, $cp4, $cp5)] = $macJap;
+ } else if ($cp4) {
+ $validChars[$macJap] = pack('NNNN', $cp1, $cp2, $cp3, $cp4);
+ $fromUnicode[pack('nnnn', $cp1, $cp2, $cp3, $cp4)] = $macJap;
+ } else if ($cp3) {
+ $validChars[$macJap] = pack('NNN', $cp1, $cp2, $cp3);
+ $fromUnicode[pack('nnn', $cp1, $cp2, $cp3)] = $macJap;
+ } else if ($cp2) {
+ $validChars[$macJap] = pack('NN', $cp1, $cp2);
+ $fromUnicode[pack('nn', $cp1, $cp2)] = $macJap;
+ } else {
+ $validChars[$macJap] = pack('N', $cp1);
+ $fromUnicode[pack('n', $cp1)] = $macJap;
+ }
+ }
+}
+/* Although not included in the table, 0x0-0x1F and 0x7F are valid;
+ * these are 'control characters' */
+for ($i = 0; $i < 0x20; $i++) {
+ $validChars[chr($i)] = pack('N', $i);
+ $fromUnicode[pack('n', $i)] = chr($i);
+}
+$validChars["\x7F"] = pack('N', 0x7F);
+$fromUnicode["\x00\x7F"] = "\x7F";
+
+/* While Shift-JIS 0x815C normally corresponds to U+2015 (HORIZONTAL BAR),
+ * for MacJapanese we convert 0x815C to U+2014 (EM DASH)
+ * (See recommendations in JAPANESE.txt from the Unicode Consortium, under
+ * 'Unicode mapping issues', point 3)
+ * However, when converting Unicode -> MacJapanese, we accept both U+2014
+ * and U+2015 */
+$fromUnicode["\x20\x15"] = "\x81\x5C";
+
+/* Convert U+203E (OVERLINE) to 0x8150 (FULLWIDTH MACRON) */
+$fromUnicode["\x20\x3E"] = "\x81\x50";
+/* And also U+00AF (MACRON) */
+$fromUnicode["\x00\xAF"] = "\x81\x50";
+
+/* Convert U+FF5E (FULLWIDTH TILDE) to 0x8160 (WAVE DASH) */
+$fromUnicode["\xFF\x5E"] = "\x81\x60";
+
+testAllValidChars($validChars, 'SJIS-mac', 'UTF-32BE');
+echo "MacJapanese verification and conversion works on all valid characters\n";
+
+findInvalidChars($validChars, $invalidChars, $truncated,
+ array_fill_keys(range(0x81, 0x9F), 2) + array_fill_keys(range(0xE0, 0xED), 2));
+testAllInvalidChars($invalidChars, $validChars, 'SJIS-mac', 'UTF-32BE', "\x00\x00\x00%");
+testTruncatedChars($truncated, 'SJIS-mac', 'UTF-32BE', "\x00\x00\x00%");
+echo "MacJapanese verification and conversion rejects all invalid characters\n";
+
+testAllValidChars($fromUnicode, 'UTF-16BE', 'SJIS-mac', false);
+echo "Unicode -> SJIS-mac conversion works on all valid characters\n";
+
+findInvalidChars($fromUnicode, $invalidChars, $unused, array_fill_keys(range(0, 0xFF), 2));
+convertAllInvalidChars($invalidChars, $fromUnicode, 'UTF-16BE', 'SJIS-mac', '%');
+echo "Unicode -> SJIS-mac conversion works on all invalid characters\n";
+?>
+--EXPECT--
+MacJapanese verification and conversion works on all valid characters
+MacJapanese verification and conversion rejects all invalid characters
+Unicode -> SJIS-mac conversion works on all valid characters
+Unicode -> SJIS-mac conversion works on all invalid characters
diff --git a/ext/mbstring/ucgendat/ucgendat.php b/ext/mbstring/ucgendat/ucgendat.php
index 8901a587b3..d1e887589f 100755
--- a/ext/mbstring/ucgendat/ucgendat.php
+++ b/ext/mbstring/ucgendat/ucgendat.php
@@ -4,10 +4,10 @@
/**
* This is based on the ucgendat.c file from the OpenLDAP project, licensed as
* follows. This file is not necessary to build PHP. It's only necessary to
- * rebuild unicode_data.h from Unicode ucd files.
+ * rebuild unicode_data.h and eaw_width.h from Unicode ucd files.
*
* Example usage:
- * php ucgendat.php UnicodeData.txt
+ * php ucgendat.php path/to/Unicode/data/files
*/
/* Copyright 1998-2007 The OpenLDAP Foundation.
@@ -45,7 +45,7 @@
if ($argc < 2) {
echo "Usage: php ucgendata.php ./datadir\n";
echo "./datadir must contain:\n";
- echo "UnicodeData.txt, CaseFolding.txt, SpecialCasing.txt and DerivedCoreProperties.txt\n";
+ echo "UnicodeData.txt, CaseFolding.txt, SpecialCasing.txt, DerivedCoreProperties.txt, and EastAsianWidth.txt\n";
return;
}
@@ -54,8 +54,9 @@ $unicodeDataFile = $dir . '/UnicodeData.txt';
$caseFoldingFile = $dir . '/CaseFolding.txt';
$specialCasingFile = $dir . '/SpecialCasing.txt';
$derivedCorePropertiesFile = $dir . '/DerivedCoreProperties.txt';
+$eastAsianWidthFile = $dir . '/EastAsianWidth.txt';
-$files = [$unicodeDataFile, $caseFoldingFile, $specialCasingFile, $derivedCorePropertiesFile];
+$files = [$unicodeDataFile, $caseFoldingFile, $specialCasingFile, $derivedCorePropertiesFile, $eastAsianWidthFile];
foreach ($files as $file) {
if (!file_exists($file)) {
echo "File $file does not exist.\n";
@@ -72,6 +73,11 @@ parseSpecialCasing($data, file_get_contents($specialCasingFile));
parseDerivedCoreProperties($data, file_get_contents($derivedCorePropertiesFile));
file_put_contents($outputFile, generateData($data));
+$eawFile = __DIR__ . "/../libmbfl/mbfl/eaw_table.h";
+
+$eawData = parseEastAsianWidth(file_get_contents($eastAsianWidthFile));
+file_put_contents($eawFile, generateEastAsianWidthData($eawData));
+
class Range {
public $start;
public $end;
@@ -372,6 +378,43 @@ function parseDerivedCoreProperties(UnicodeData $data, string $input) : void {
}
}
+function parseEastAsianWidth(string $input) : array {
+ $wideRanges = [];
+
+ foreach (parseDataFile($input) as $fields) {
+ if ($fields[1] == 'W' || $fields[1] == 'F') {
+ if ($dotsPos = strpos($fields[0], '..')) {
+ $startCode = intval(substr($fields[0], 0, $dotsPos), 16);
+ $endCode = intval(substr($fields[0], $dotsPos + 2), 16);
+
+ if (!empty($wideRanges)) {
+ $lastRange = $wideRanges[count($wideRanges) - 1];
+ if ($startCode == $lastRange->end + 1) {
+ $lastRange->end = $endCode;
+ continue;
+ }
+ }
+
+ $wideRanges[] = new Range($startCode, $endCode);
+ } else {
+ $code = intval($fields[0], 16);
+
+ if (!empty($wideRanges)) {
+ $lastRange = $wideRanges[count($wideRanges) - 1];
+ if ($code == $lastRange->end + 1) {
+ $lastRange->end++;
+ continue;
+ }
+ }
+
+ $wideRanges[] = new Range($code, $code);
+ }
+ }
+ }
+
+ return $wideRanges;
+}
+
function formatArray(array $values, int $width, string $format) : string {
$result = '';
$i = 0;
@@ -412,7 +455,7 @@ function generatePropData(UnicodeData $data) {
$propOffsets[] = $idx;
// TODO ucgendat.c pads the prop offsets to the next multiple of 4
- // for rather debious reasons of alignment. This should probably be
+ // for rather dubious reasons of alignment. This should probably be
// dropped
while (count($propOffsets) % 4 != 0) {
$propOffsets[] = 0;
@@ -509,17 +552,17 @@ function generateCaseData(UnicodeData $data) {
function generateData(UnicodeData $data) {
$result = <<<'HEADER'
-/* This file was generated from a modified version UCData's ucgendat.
+/* This file was generated from a modified version of UCData's ucgendat.
*
* DO NOT EDIT THIS FILE!
*
- * Instead, compile ucgendat.c (bundled with PHP in ext/mbstring), download
- * the appropriate UnicodeData-x.x.x.txt and CompositionExclusions-x.x.x.txt
- * files from http://www.unicode.org/Public/ and run this program.
+ * Instead, download the appropriate UnicodeData-x.x.x.txt and
+ * CompositionExclusions-x.x.x.txt files from http://www.unicode.org/Public/
+ * and run ext/mbstring/ucgendat/ucgendat.php.
*
* More information can be found in the UCData package. Unfortunately,
* the project's page doesn't seem to be live anymore, so you can use
- * OpenLDAPs modified copy (look in libraries/liblunicode/ucdata) */
+ * OpenLDAP's modified copy (look in libraries/liblunicode/ucdata) */
HEADER;
$result .= "\n\n" . generatePropData($data);
$result .= generateCaseData($data);
@@ -646,3 +689,38 @@ function generateMPH(array $map, bool $fast) {
return $mph;
}
+
+function generateEastAsianWidthData(array $wideRanges) {
+ $result = <<<'HEADER'
+/* This file was generated by ext/mbstring/ucgendat/ucgendat.php.
+ *
+ * DO NOT EDIT THIS FILE!
+ *
+ * East Asian Width table
+ *
+ * Some characters in East Asian languages are intended to be displayed in a space
+ * which is roughly square. (This contrasts with others such as the Latin alphabet,
+ * which are taller than they are wide.) To display these East Asian characters
+ * properly, twice the horizontal space is used. This must be taken into account
+ * when doing things like wrapping text to a specific width.
+ *
+ * Each pair of numbers in the below table is a range of Unicode codepoints
+ * which should be displayed as double-width.
+ */
+
+static const struct {
+ int begin;
+ int end;
+} mbfl_eaw_table[] = {
+
+HEADER;
+
+ foreach ($wideRanges as $range) {
+ $startCode = dechex($range->start);
+ $endCode = dechex($range->end);
+ $result .= "\t{ 0x{$startCode}, 0x{$endCode} },\n";
+ }
+
+ $result .= "};\n";
+ return $result;
+}
diff --git a/ext/mbstring/unicode_data.h b/ext/mbstring/unicode_data.h
index d0bc23aa10..12ee3c7478 100644
--- a/ext/mbstring/unicode_data.h
+++ b/ext/mbstring/unicode_data.h
@@ -1,14 +1,14 @@
-/* This file was generated from a modified version UCData's ucgendat.
+/* This file was generated from a modified version of UCData's ucgendat.
*
* DO NOT EDIT THIS FILE!
*
- * Instead, compile ucgendat.c (bundled with PHP in ext/mbstring), download
- * the appropriate UnicodeData-x.x.x.txt and CompositionExclusions-x.x.x.txt
- * files from http://www.unicode.org/Public/ and run this program.
+ * Instead, download the appropriate UnicodeData-x.x.x.txt and
+ * CompositionExclusions-x.x.x.txt files from http://www.unicode.org/Public/
+ * and run ext/mbstring/ucgendat/ucgendat.php.
*
* More information can be found in the UCData package. Unfortunately,
* the project's page doesn't seem to be live anymore, so you can use
- * OpenLDAPs modified copy (look in libraries/liblunicode/ucdata) */
+ * OpenLDAP's modified copy (look in libraries/liblunicode/ucdata) */
static const unsigned short _ucprop_size = 44;
diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c
index 928ef8ea76..85847e7a3b 100644
--- a/ext/mysqli/mysqli.c
+++ b/ext/mysqli/mysqli.c
@@ -70,7 +70,7 @@ zend_class_entry *mysqli_warning_class_entry;
zend_class_entry *mysqli_exception_class_entry;
-typedef int (*mysqli_read_t)(mysqli_object *obj, zval *rv, zend_bool quiet);
+typedef int (*mysqli_read_t)(mysqli_object *obj, zval *rv, bool quiet);
typedef int (*mysqli_write_t)(mysqli_object *obj, zval *newval);
typedef struct _mysqli_prop_handler {
@@ -277,7 +277,7 @@ static void mysqli_warning_free_storage(zend_object *object)
/* }}} */
/* {{{ mysqli_read_na */
-static int mysqli_read_na(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int mysqli_read_na(mysqli_object *obj, zval *retval, bool quiet)
{
if (!quiet) {
zend_throw_error(NULL, "Cannot read property");
@@ -499,6 +499,7 @@ PHP_INI_BEGIN()
#endif
STD_PHP_INI_BOOLEAN("mysqli.reconnect", "0", PHP_INI_SYSTEM, OnUpdateLong, reconnect, zend_mysqli_globals, mysqli_globals)
STD_PHP_INI_BOOLEAN("mysqli.allow_local_infile", "0", PHP_INI_SYSTEM, OnUpdateLong, allow_local_infile, zend_mysqli_globals, mysqli_globals)
+ STD_PHP_INI_ENTRY("mysqli.local_infile_directory", NULL, PHP_INI_SYSTEM, OnUpdateString, local_infile_directory, zend_mysqli_globals, mysqli_globals)
PHP_INI_END()
/* }}} */
@@ -509,9 +510,9 @@ static PHP_GINIT_FUNCTION(mysqli)
ZEND_TSRMLS_CACHE_UPDATE();
#endif
mysqli_globals->num_links = 0;
+ mysqli_globals->max_links = -1;
mysqli_globals->num_active_persistent = 0;
mysqli_globals->num_inactive_persistent = 0;
- mysqli_globals->max_links = -1;
mysqli_globals->max_persistent = -1;
mysqli_globals->allow_persistent = 1;
mysqli_globals->default_port = 0;
@@ -520,9 +521,9 @@ static PHP_GINIT_FUNCTION(mysqli)
mysqli_globals->default_pw = NULL;
mysqli_globals->default_socket = NULL;
mysqli_globals->reconnect = 0;
- mysqli_globals->report_mode = 0;
- mysqli_globals->report_ht = 0;
+ mysqli_globals->report_mode = MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT;;
mysqli_globals->allow_local_infile = 0;
+ mysqli_globals->local_infile_directory = NULL;
mysqli_globals->rollback_on_cached_plink = FALSE;
}
/* }}} */
@@ -530,8 +531,6 @@ static PHP_GINIT_FUNCTION(mysqli)
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(mysqli)
{
- zend_class_entry *ce,cex;
-
REGISTER_INI_ENTRIES();
#ifndef MYSQLI_USE_MYSQLND
if (mysql_server_init(0, NULL, NULL)) {
@@ -564,99 +563,54 @@ PHP_MINIT_FUNCTION(mysqli)
le_pmysqli = zend_register_list_destructors_ex(NULL, php_mysqli_dtor,
"MySqli persistent connection", module_number);
- INIT_CLASS_ENTRY(cex, "mysqli_sql_exception", class_mysqli_sql_exception_methods);
- mysqli_exception_class_entry = zend_register_internal_class_ex(&cex, spl_ce_RuntimeException);
- mysqli_exception_class_entry->ce_flags |= ZEND_ACC_FINAL;
- zend_declare_property_long(mysqli_exception_class_entry, "code", sizeof("code")-1, 0, ZEND_ACC_PROTECTED);
- zend_declare_property_string(mysqli_exception_class_entry, "sqlstate", sizeof("sqlstate")-1, "00000", ZEND_ACC_PROTECTED);
+ mysqli_exception_class_entry = register_class_mysqli_sql_exception(spl_ce_RuntimeException);
- REGISTER_MYSQLI_CLASS_ENTRY("mysqli_driver", mysqli_driver_class_entry, class_mysqli_driver_methods);
- ce = mysqli_driver_class_entry;
+ mysqli_driver_class_entry = register_class_mysqli_driver();
+ mysqli_driver_class_entry->create_object = mysqli_objects_new;
zend_hash_init(&mysqli_driver_properties, 0, NULL, free_prop_handler, 1);
MYSQLI_ADD_PROPERTIES(&mysqli_driver_properties, mysqli_driver_property_entries);
- zend_declare_property_null(ce, "client_info", sizeof("client_info") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "client_version", sizeof("client_version") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "driver_version", sizeof("driver_version") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "reconnect", sizeof("reconnect") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "report_mode", sizeof("report_mode") - 1, ZEND_ACC_PUBLIC);
- ce->ce_flags |= ZEND_ACC_FINAL;
- zend_hash_add_ptr(&classes, ce->name, &mysqli_driver_properties);
-
- REGISTER_MYSQLI_CLASS_ENTRY("mysqli", mysqli_link_class_entry, class_mysqli_methods);
- ce = mysqli_link_class_entry;
+ zend_hash_add_ptr(&classes, mysqli_driver_class_entry->name, &mysqli_driver_properties);
+
+ mysqli_link_class_entry = register_class_mysqli();
+ mysqli_link_class_entry->create_object = mysqli_objects_new;
zend_hash_init(&mysqli_link_properties, 0, NULL, free_prop_handler, 1);
MYSQLI_ADD_PROPERTIES(&mysqli_link_properties, mysqli_link_property_entries);
- zend_declare_property_null(ce, "affected_rows", sizeof("affected_rows") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "client_info", sizeof("client_info") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "client_version", sizeof("client_version") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "connect_errno", sizeof("connect_errno") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "connect_error", sizeof("connect_error") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "errno", sizeof("errno") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "error", sizeof("error") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "error_list", sizeof("error_list") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "field_count", sizeof("field_count") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "host_info", sizeof("host_info") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "info", sizeof("info") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "insert_id", sizeof("insert_id") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "server_info", sizeof("server_info") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "server_version", sizeof("server_version") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "sqlstate", sizeof("sqlstate") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "protocol_version", sizeof("protocol_version") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "thread_id", sizeof("thread_id") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "warning_count", sizeof("warning_count") - 1, ZEND_ACC_PUBLIC);
- zend_hash_add_ptr(&classes, ce->name, &mysqli_link_properties);
-
- REGISTER_MYSQLI_CLASS_ENTRY("mysqli_warning", mysqli_warning_class_entry, class_mysqli_warning_methods);
- ce = mysqli_warning_class_entry;
- ce->ce_flags |= ZEND_ACC_FINAL;
+ zend_hash_add_ptr(&classes, mysqli_link_class_entry->name, &mysqli_link_properties);
+
+ mysqli_warning_class_entry = register_class_mysqli_warning();
+ mysqli_warning_class_entry->create_object = mysqli_objects_new;
zend_hash_init(&mysqli_warning_properties, 0, NULL, free_prop_handler, 1);
MYSQLI_ADD_PROPERTIES(&mysqli_warning_properties, mysqli_warning_property_entries);
- zend_declare_property_null(ce, "message", sizeof("message") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "sqlstate", sizeof("sqlstate") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "errno", sizeof("errno") - 1, ZEND_ACC_PUBLIC);
- zend_hash_add_ptr(&classes, ce->name, &mysqli_warning_properties);
+ zend_hash_add_ptr(&classes, mysqli_warning_class_entry->name, &mysqli_warning_properties);
- REGISTER_MYSQLI_CLASS_ENTRY("mysqli_result", mysqli_result_class_entry, class_mysqli_result_methods);
- ce = mysqli_result_class_entry;
+ mysqli_result_class_entry = register_class_mysqli_result(zend_ce_aggregate);
+ mysqli_result_class_entry->create_object = mysqli_objects_new;
+ mysqli_result_class_entry->get_iterator = php_mysqli_result_get_iterator;
zend_hash_init(&mysqli_result_properties, 0, NULL, free_prop_handler, 1);
MYSQLI_ADD_PROPERTIES(&mysqli_result_properties, mysqli_result_property_entries);
- zend_declare_property_null(ce, "current_field", sizeof("current_field") - 1,ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "field_count", sizeof("field_count") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "lengths", sizeof("lengths") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "num_rows", sizeof("num_rows") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "type", sizeof("type") - 1, ZEND_ACC_PUBLIC);
- mysqli_result_class_entry->get_iterator = php_mysqli_result_get_iterator;
- zend_class_implements(mysqli_result_class_entry, 1, zend_ce_aggregate);
- zend_hash_add_ptr(&classes, ce->name, &mysqli_result_properties);
+ zend_hash_add_ptr(&classes, mysqli_result_class_entry->name, &mysqli_result_properties);
- REGISTER_MYSQLI_CLASS_ENTRY("mysqli_stmt", mysqli_stmt_class_entry, class_mysqli_stmt_methods);
- ce = mysqli_stmt_class_entry;
+ mysqli_stmt_class_entry = register_class_mysqli_stmt();
+ mysqli_stmt_class_entry->create_object = mysqli_objects_new;
zend_hash_init(&mysqli_stmt_properties, 0, NULL, free_prop_handler, 1);
MYSQLI_ADD_PROPERTIES(&mysqli_stmt_properties, mysqli_stmt_property_entries);
- zend_declare_property_null(ce, "affected_rows", sizeof("affected_rows") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "insert_id", sizeof("insert_id") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "num_rows", sizeof("num_rows") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "param_count", sizeof("param_count") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "field_count", sizeof("field_count") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "errno", sizeof("errno") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "error", sizeof("error") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "error_list", sizeof("error_list") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "sqlstate", sizeof("sqlstate") - 1, ZEND_ACC_PUBLIC);
- zend_declare_property_null(ce, "id", sizeof("id") - 1, ZEND_ACC_PUBLIC);
- zend_hash_add_ptr(&classes, ce->name, &mysqli_stmt_properties);
+ zend_hash_add_ptr(&classes, mysqli_stmt_class_entry->name, &mysqli_stmt_properties);
/* mysqli_options */
REGISTER_LONG_CONSTANT("MYSQLI_READ_DEFAULT_GROUP", MYSQL_READ_DEFAULT_GROUP, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_READ_DEFAULT_FILE", MYSQL_READ_DEFAULT_FILE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_OPT_CONNECT_TIMEOUT", MYSQL_OPT_CONNECT_TIMEOUT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_OPT_LOCAL_INFILE", MYSQL_OPT_LOCAL_INFILE, CONST_CS | CONST_PERSISTENT);
+#if MYSQL_VERSION_ID >= 80021 || defined(MYSQLI_USE_MYSQLND)
+ REGISTER_LONG_CONSTANT("MYSQLI_OPT_LOAD_DATA_LOCAL_DIR", MYSQL_OPT_LOAD_DATA_LOCAL_DIR, CONST_CS | CONST_PERSISTENT);
+#endif
REGISTER_LONG_CONSTANT("MYSQLI_INIT_COMMAND", MYSQL_INIT_COMMAND, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_OPT_READ_TIMEOUT", MYSQL_OPT_READ_TIMEOUT, CONST_CS | CONST_PERSISTENT);
#ifdef MYSQLI_USE_MYSQLND
REGISTER_LONG_CONSTANT("MYSQLI_OPT_NET_CMD_BUFFER_SIZE", MYSQLND_OPT_NET_CMD_BUFFER_SIZE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_OPT_NET_READ_BUFFER_SIZE", MYSQLND_OPT_NET_READ_BUFFER_SIZE, CONST_CS | CONST_PERSISTENT);
#endif
-#ifdef MYSQLND_STRING_TO_INT_CONVERSION
+#ifdef MYSQLI_USE_MYSQLND
REGISTER_LONG_CONSTANT("MYSQLI_OPT_INT_AND_FLOAT_NATIVE", MYSQLND_OPT_INT_AND_FLOAT_NATIVE, CONST_CS | CONST_PERSISTENT);
#endif
#if MYSQL_VERSION_ID < 80000 || MYSQL_VERSION_ID >= 100000 || defined(MYSQLI_USE_MYSQLND)
@@ -805,6 +759,8 @@ PHP_MINIT_FUNCTION(mysqli)
REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_HOSTS", REFRESH_HOSTS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_STATUS", REFRESH_STATUS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_THREADS", REFRESH_THREADS, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_REPLICA", REFRESH_SLAVE, CONST_CS | CONST_PERSISTENT);
+ /* temporarily for backward compatibility */
REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_SLAVE", REFRESH_SLAVE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_MASTER", REFRESH_MASTER, CONST_CS | CONST_PERSISTENT);
#ifdef REFRESH_BACKUP_LOG
@@ -870,7 +826,7 @@ PHP_RINIT_FUNCTION(mysqli)
#endif
MyG(error_msg) = NULL;
MyG(error_no) = 0;
- MyG(report_mode) = 0;
+ MyG(report_mode) = MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT;
return SUCCESS;
}
@@ -1069,7 +1025,7 @@ void php_mysqli_fetch_into_hash_aux(zval *return_value, MYSQL_RES * result, zend
MYSQL_ROW row;
unsigned int i, num_fields;
MYSQL_FIELD *fields;
- zend_ulong *field_len;
+ unsigned long *field_len;
if (!(row = mysql_fetch_row(result))) {
RETURN_NULL();
@@ -1130,7 +1086,7 @@ void php_mysqli_fetch_into_hash_aux(zval *return_value, MYSQL_RES * result, zend
}
}
#else
- mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), return_value, MYSQLND_MYSQLI);
+ mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), return_value);
#endif
}
/* }}} */
diff --git a/ext/mysqli/mysqli.stub.php b/ext/mysqli/mysqli.stub.php
index 9326bbd915..5152e7f911 100644
--- a/ext/mysqli/mysqli.stub.php
+++ b/ext/mysqli/mysqli.stub.php
@@ -1,13 +1,60 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
final class mysqli_driver
{
+ public string $client_info;
+
+ public int $client_version;
+
+ public int $driver_version;
+
+ /** @var bool */
+ public $reconnect = false;
+
+ /** @var int */
+ public $report_mode = 0;
}
class mysqli
{
+ public int|string $affected_rows;
+
+ public string $client_info;
+
+ public int $client_version;
+
+ public int $connect_errno;
+
+ public ?string $connect_error;
+
+ public int $errno;
+
+ public string $error;
+
+ public array $error_list;
+
+ public int $field_count;
+
+ public string $host_info;
+
+ public ?string $info;
+
+ public int|string $insert_id;
+
+ public string $server_info;
+
+ public int $server_version;
+
+ public string $sqlstate;
+
+ public int $protocol_version;
+
+ public int $thread_id;
+
+ public int $warning_count;
+
public function __construct(
?string $hostname = null,
?string $username = null,
@@ -89,6 +136,7 @@ class mysqli
/**
* @return string|null
* @alias mysqli_get_client_info
+ * @deprecated 8.1.0
*/
public function get_client_info() {}
@@ -302,6 +350,16 @@ class mysqli
class mysqli_result implements IteratorAggregate
{
+ public int $current_field;
+
+ public int $field_count;
+
+ public ?array $lengths;
+
+ public int|string $num_rows;
+
+ public int $type;
+
public function __construct(mysqli $mysql, int $result_mode = MYSQLI_STORE_RESULT) {}
/**
@@ -340,13 +398,11 @@ class mysqli_result implements IteratorAggregate
*/
public function fetch_field_direct(int $index) {}
-#if defined(MYSQLI_USE_MYSQLND)
/**
* @return array
* @alias mysqli_fetch_all
*/
public function fetch_all(int $mode = MYSQLI_NUM) {}
-#endif
/**
* @return array|null|false
@@ -389,6 +445,26 @@ class mysqli_result implements IteratorAggregate
class mysqli_stmt
{
+ public int|string $affected_rows;
+
+ public int|string $insert_id;
+
+ public int|string $num_rows;
+
+ public int $param_count;
+
+ public int $field_count;
+
+ public int $errno;
+
+ public string $error;
+
+ public array $error_list;
+
+ public string $sqlstate;
+
+ public int $id;
+
public function __construct(mysqli $mysql, ?string $query = null) {}
/**
@@ -457,13 +533,13 @@ class mysqli_stmt
* @alias mysqli_stmt_more_results
*/
public function more_results() {}
+#endif
/**
* @return bool
* @alias mysqli_stmt_next_result
*/
public function next_result() {}
-#endif
/**
* @return int|string
@@ -512,6 +588,12 @@ class mysqli_stmt
final class mysqli_warning
{
+ public string $message;
+
+ public string $sqlstate;
+
+ public int $errno;
+
private function __construct() {}
public function next(): bool {}
@@ -519,6 +601,8 @@ final class mysqli_warning
final class mysqli_sql_exception extends RuntimeException
{
+ /** @var string */
+ protected $sqlstate = "00000";
}
function mysqli_affected_rows(mysqli $mysql): int|string {}
@@ -573,9 +657,7 @@ function mysqli_fetch_field_direct(mysqli_result $result, int $index): object|fa
function mysqli_fetch_lengths(mysqli_result $result): array|false {}
-#if defined(MYSQLI_USE_MYSQLND)
function mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array {}
-#endif
function mysqli_fetch_array(mysqli_result $result, int $mode = MYSQLI_BOTH): array|null|false {}
@@ -726,9 +808,9 @@ function mysqli_stmt_insert_id(mysqli_stmt $statement): int|string {}
#if defined(MYSQLI_USE_MYSQLND)
function mysqli_stmt_more_results(mysqli_stmt $statement): bool {}
+#endif
function mysqli_stmt_next_result(mysqli_stmt $statement): bool {}
-#endif
function mysqli_stmt_num_rows(mysqli_stmt $statement): int|string {}
diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c
index e8f25c310a..728e785478 100644
--- a/ext/mysqli/mysqli_api.c
+++ b/ext/mysqli/mysqli_api.c
@@ -71,7 +71,7 @@ mysqli_escape_string_for_tx_name_in_comment(const char * const name)
{
char * ret = NULL;
if (name) {
- zend_bool warned = FALSE;
+ bool warned = FALSE;
const char * p_orig = name;
char * p_copy;
p_copy = ret = emalloc(strlen(name) + 1 + 2 + 2 + 1); /* space, open, close, NullS */
@@ -107,7 +107,7 @@ mysqli_escape_string_for_tx_name_in_comment(const char * const name)
/* }}} */
/* {{{ mysqli_commit_or_rollback_libmysql */
-static int mysqli_commit_or_rollback_libmysql(MYSQL * conn, zend_bool commit, const uint32_t mode, const char * const name)
+static int mysqli_commit_or_rollback_libmysql(MYSQL * conn, bool commit, const uint32_t mode, const char * const name)
{
int ret;
smart_str tmp_str = {0};
@@ -161,7 +161,7 @@ PHP_FUNCTION(mysqli_autocommit)
{
MY_MYSQL *mysql;
zval *mysql_link;
- zend_bool automode;
+ bool automode;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ob", &mysql_link, mysqli_link_class_entry, &automode) == FAILURE) {
RETURN_THROWS();
@@ -858,12 +858,12 @@ PHP_FUNCTION(mysqli_stmt_execute)
stmt->stmt->params[i].buffer_length = Z_STRLEN_P(param);
break;
case MYSQL_TYPE_DOUBLE:
- convert_to_double_ex(param);
+ convert_to_double(param);
stmt->stmt->params[i].buffer = &Z_DVAL_P(param);
break;
case MYSQL_TYPE_LONGLONG:
case MYSQL_TYPE_LONG:
- convert_to_long_ex(param);
+ convert_to_long(param);
stmt->stmt->params[i].buffer = &Z_LVAL_P(param);
break;
default:
@@ -1057,7 +1057,7 @@ void mysqli_stmt_fetch_mysqlnd(INTERNAL_FUNCTION_PARAMETERS)
{
MY_STMT *stmt;
zval *mysql_stmt;
- zend_bool fetched_anything;
+ bool fetched_anything;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
RETURN_THROWS();
@@ -1108,7 +1108,7 @@ static void php_add_field_properties(zval *value, const MYSQL_FIELD *field)
*/
add_property_string(value, "catalog", "def");
- add_property_long(value, "max_length", field->max_length);
+ add_property_long(value, "max_length", 0);
add_property_long(value, "length", field->length);
add_property_long(value, "charsetnr", field->charsetnr);
add_property_long(value, "flags", field->flags);
@@ -1210,7 +1210,7 @@ PHP_FUNCTION(mysqli_fetch_lengths)
#ifdef MYSQLI_USE_MYSQLND
const size_t *ret;
#else
- const zend_ulong *ret;
+ const unsigned long *ret;
#endif
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
@@ -1327,6 +1327,10 @@ PHP_FUNCTION(mysqli_get_client_info)
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|O!", &mysql_link, mysqli_link_class_entry) == FAILURE) {
RETURN_THROWS();
}
+
+ if (ZEND_NUM_ARGS()) {
+ php_error_docref(NULL, E_DEPRECATED, "Passing connection object as an argument is deprecated");
+ }
}
RETURN_STRING(mysql_get_client_info());
@@ -1426,7 +1430,7 @@ PHP_FUNCTION(mysqli_info)
/* }}} */
/* {{{ php_mysqli_init() */
-void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_method)
+void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS, bool is_method)
{
MYSQLI_RESOURCE *mysqli_resource;
MY_MYSQL *mysql;
@@ -1448,7 +1452,7 @@ void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_method)
We create always persistent, as if the user want to connect
to p:somehost, we can't convert the handle then
*/
- if (!(mysql->mysql = mysqlnd_init(MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA, TRUE)))
+ if (!(mysql->mysql = mysqlnd_init(MYSQLND_CLIENT_NO_FLAG, TRUE)))
#endif
{
efree(mysql);
@@ -1565,6 +1569,7 @@ PHP_FUNCTION(mysqli_stmt_more_results)
RETURN_BOOL(mysqlnd_stmt_more_results(stmt->stmt));
}
/* }}} */
+#endif
/* {{{ read next result from multi_query */
PHP_FUNCTION(mysqli_stmt_next_result) {
@@ -1583,7 +1588,6 @@ PHP_FUNCTION(mysqli_stmt_next_result) {
RETURN_TRUE;
}
/* }}} */
-#endif
/* {{{ Get number of fields in result */
PHP_FUNCTION(mysqli_num_fields)
@@ -1627,9 +1631,7 @@ static int mysqli_options_get_option_zval_type(int option)
#ifdef MYSQLI_USE_MYSQLND
case MYSQLND_OPT_NET_CMD_BUFFER_SIZE:
case MYSQLND_OPT_NET_READ_BUFFER_SIZE:
-#ifdef MYSQLND_STRING_TO_INT_CONVERSION
case MYSQLND_OPT_INT_AND_FLOAT_NATIVE:
-#endif
#endif /* MYSQLI_USE_MYSQLND */
case MYSQL_OPT_CONNECT_TIMEOUT:
#ifdef MYSQL_REPORT_DATA_TRUNCATION
@@ -1676,6 +1678,9 @@ static int mysqli_options_get_option_zval_type(int option)
#if MYSQL_VERSION_ID > 50605 || defined(MYSQLI_USE_MYSQLND)
case MYSQL_SERVER_PUBLIC_KEY:
#endif
+#if MYSQL_VERSION_ID >= 80021 || defined(MYSQLI_USE_MYSQLND)
+ case MYSQL_OPT_LOAD_DATA_LOCAL_DIR:
+#endif
return IS_STRING;
default:
@@ -1716,7 +1721,7 @@ PHP_FUNCTION(mysqli_options)
}
break;
case IS_LONG:
- convert_to_long_ex(mysql_value);
+ convert_to_long(mysql_value);
break;
default:
break;
@@ -2506,11 +2511,7 @@ PHP_FUNCTION(mysqli_store_result)
RETURN_THROWS();
}
MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
-#ifdef MYSQLI_USE_MYSQLND
- result = flags & MYSQLI_STORE_RESULT_COPY_DATA? mysqlnd_store_result_ofs(mysql->mysql) : mysqlnd_store_result(mysql->mysql);
-#else
result = mysql_store_result(mysql->mysql);
-#endif
if (!result) {
MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
RETURN_FALSE;
diff --git a/ext/mysqli/mysqli_arginfo.h b/ext/mysqli/mysqli_arginfo.h
index c9f203a559..6dcf8bdcaf 100644
--- a/ext/mysqli/mysqli_arginfo.h
+++ b/ext/mysqli/mysqli_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 36c7ee22aa4c5bb5e0174031a3defcaaadde0dbd */
+ * Stub hash: b9583854314bc54295c1e1a4ec7f6b8c0ce6187c */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mysqli_affected_rows, 0, 1, MAY_BE_LONG|MAY_BE_STRING)
ZEND_ARG_OBJ_INFO(0, mysql, mysqli, 0)
@@ -92,12 +92,10 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mysqli_fetch_lengths, 0, 1, MAY_
ZEND_ARG_OBJ_INFO(0, result, mysqli_result, 0)
ZEND_END_ARG_INFO()
-#if defined(MYSQLI_USE_MYSQLND)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mysqli_fetch_all, 0, 1, IS_ARRAY, 0)
ZEND_ARG_OBJ_INFO(0, result, mysqli_result, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "MYSQLI_NUM")
ZEND_END_ARG_INFO()
-#endif
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mysqli_fetch_array, 0, 1, MAY_BE_ARRAY|MAY_BE_NULL|MAY_BE_FALSE)
ZEND_ARG_OBJ_INFO(0, result, mysqli_result, 0)
@@ -353,9 +351,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mysqli_stmt_more_results, 0, 1,
ZEND_END_ARG_INFO()
#endif
-#if defined(MYSQLI_USE_MYSQLND)
-#define arginfo_mysqli_stmt_next_result arginfo_mysqli_stmt_more_results
-#endif
+#define arginfo_mysqli_stmt_next_result arginfo_mysqli_stmt_execute
#define arginfo_mysqli_stmt_num_rows arginfo_mysqli_stmt_affected_rows
@@ -593,11 +589,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_result_fetch_field_direct, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, index, IS_LONG, 0)
ZEND_END_ARG_INFO()
-#if defined(MYSQLI_USE_MYSQLND)
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_result_fetch_all, 0, 0, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "MYSQLI_NUM")
ZEND_END_ARG_INFO()
-#endif
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_result_fetch_array, 0, 0, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "MYSQLI_BOTH")
@@ -658,9 +652,7 @@ ZEND_END_ARG_INFO()
#define arginfo_class_mysqli_stmt_more_results arginfo_class_mysqli_get_connection_stats
#endif
-#if defined(MYSQLI_USE_MYSQLND)
-#define arginfo_class_mysqli_stmt_next_result arginfo_class_mysqli_get_connection_stats
-#endif
+#define arginfo_class_mysqli_stmt_next_result arginfo_class_mysqli_character_set_name
#define arginfo_class_mysqli_stmt_num_rows arginfo_class_mysqli_character_set_name
@@ -707,9 +699,7 @@ ZEND_FUNCTION(mysqli_fetch_field);
ZEND_FUNCTION(mysqli_fetch_fields);
ZEND_FUNCTION(mysqli_fetch_field_direct);
ZEND_FUNCTION(mysqli_fetch_lengths);
-#if defined(MYSQLI_USE_MYSQLND)
ZEND_FUNCTION(mysqli_fetch_all);
-#endif
ZEND_FUNCTION(mysqli_fetch_array);
ZEND_FUNCTION(mysqli_fetch_assoc);
ZEND_FUNCTION(mysqli_fetch_object);
@@ -783,9 +773,7 @@ ZEND_FUNCTION(mysqli_stmt_insert_id);
#if defined(MYSQLI_USE_MYSQLND)
ZEND_FUNCTION(mysqli_stmt_more_results);
#endif
-#if defined(MYSQLI_USE_MYSQLND)
ZEND_FUNCTION(mysqli_stmt_next_result);
-#endif
ZEND_FUNCTION(mysqli_stmt_num_rows);
ZEND_FUNCTION(mysqli_stmt_param_count);
ZEND_FUNCTION(mysqli_stmt_prepare);
@@ -835,9 +823,7 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(mysqli_fetch_fields, arginfo_mysqli_fetch_fields)
ZEND_FE(mysqli_fetch_field_direct, arginfo_mysqli_fetch_field_direct)
ZEND_FE(mysqli_fetch_lengths, arginfo_mysqli_fetch_lengths)
-#if defined(MYSQLI_USE_MYSQLND)
ZEND_FE(mysqli_fetch_all, arginfo_mysqli_fetch_all)
-#endif
ZEND_FE(mysqli_fetch_array, arginfo_mysqli_fetch_array)
ZEND_FE(mysqli_fetch_assoc, arginfo_mysqli_fetch_assoc)
ZEND_FE(mysqli_fetch_object, arginfo_mysqli_fetch_object)
@@ -913,9 +899,7 @@ static const zend_function_entry ext_functions[] = {
#if defined(MYSQLI_USE_MYSQLND)
ZEND_FE(mysqli_stmt_more_results, arginfo_mysqli_stmt_more_results)
#endif
-#if defined(MYSQLI_USE_MYSQLND)
ZEND_FE(mysqli_stmt_next_result, arginfo_mysqli_stmt_next_result)
-#endif
ZEND_FE(mysqli_stmt_num_rows, arginfo_mysqli_stmt_num_rows)
ZEND_FE(mysqli_stmt_param_count, arginfo_mysqli_stmt_param_count)
ZEND_FE(mysqli_stmt_prepare, arginfo_mysqli_stmt_prepare)
@@ -954,7 +938,7 @@ static const zend_function_entry class_mysqli_methods[] = {
ZEND_ME_MAPPING(dump_debug_info, mysqli_dump_debug_info, arginfo_class_mysqli_dump_debug_info, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(debug, mysqli_debug, arginfo_class_mysqli_debug, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(get_charset, mysqli_get_charset, arginfo_class_mysqli_get_charset, ZEND_ACC_PUBLIC)
- ZEND_ME_MAPPING(get_client_info, mysqli_get_client_info, arginfo_class_mysqli_get_client_info, ZEND_ACC_PUBLIC)
+ ZEND_ME_MAPPING(get_client_info, mysqli_get_client_info, arginfo_class_mysqli_get_client_info, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED)
#if defined(MYSQLI_USE_MYSQLND)
ZEND_ME_MAPPING(get_connection_stats, mysqli_get_connection_stats, arginfo_class_mysqli_get_connection_stats, ZEND_ACC_PUBLIC)
#endif
@@ -1004,9 +988,7 @@ static const zend_function_entry class_mysqli_result_methods[] = {
ZEND_ME_MAPPING(fetch_field, mysqli_fetch_field, arginfo_class_mysqli_result_fetch_field, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(fetch_fields, mysqli_fetch_fields, arginfo_class_mysqli_result_fetch_fields, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(fetch_field_direct, mysqli_fetch_field_direct, arginfo_class_mysqli_result_fetch_field_direct, ZEND_ACC_PUBLIC)
-#if defined(MYSQLI_USE_MYSQLND)
ZEND_ME_MAPPING(fetch_all, mysqli_fetch_all, arginfo_class_mysqli_result_fetch_all, ZEND_ACC_PUBLIC)
-#endif
ZEND_ME_MAPPING(fetch_array, mysqli_fetch_array, arginfo_class_mysqli_result_fetch_array, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(fetch_assoc, mysqli_fetch_assoc, arginfo_class_mysqli_result_fetch_assoc, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(fetch_object, mysqli_fetch_object, arginfo_class_mysqli_result_fetch_object, ZEND_ACC_PUBLIC)
@@ -1033,9 +1015,7 @@ static const zend_function_entry class_mysqli_stmt_methods[] = {
#if defined(MYSQLI_USE_MYSQLND)
ZEND_ME_MAPPING(more_results, mysqli_stmt_more_results, arginfo_class_mysqli_stmt_more_results, ZEND_ACC_PUBLIC)
#endif
-#if defined(MYSQLI_USE_MYSQLND)
ZEND_ME_MAPPING(next_result, mysqli_stmt_next_result, arginfo_class_mysqli_stmt_next_result, ZEND_ACC_PUBLIC)
-#endif
ZEND_ME_MAPPING(num_rows, mysqli_stmt_num_rows, arginfo_class_mysqli_stmt_num_rows, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(send_long_data, mysqli_stmt_send_long_data, arginfo_class_mysqli_stmt_send_long_data, ZEND_ACC_PUBLIC)
ZEND_ME_MAPPING(free_result, mysqli_stmt_free_result, arginfo_class_mysqli_stmt_free_result, ZEND_ACC_PUBLIC)
@@ -1059,3 +1039,320 @@ static const zend_function_entry class_mysqli_warning_methods[] = {
static const zend_function_entry class_mysqli_sql_exception_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_mysqli_driver(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "mysqli_driver", class_mysqli_driver_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ zval property_client_info_default_value;
+ ZVAL_UNDEF(&property_client_info_default_value);
+ zend_string *property_client_info_name = zend_string_init("client_info", sizeof("client_info") - 1, 1);
+ zend_declare_typed_property(class_entry, property_client_info_name, &property_client_info_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_client_info_name);
+
+ zval property_client_version_default_value;
+ ZVAL_UNDEF(&property_client_version_default_value);
+ zend_string *property_client_version_name = zend_string_init("client_version", sizeof("client_version") - 1, 1);
+ zend_declare_typed_property(class_entry, property_client_version_name, &property_client_version_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_client_version_name);
+
+ zval property_driver_version_default_value;
+ ZVAL_UNDEF(&property_driver_version_default_value);
+ zend_string *property_driver_version_name = zend_string_init("driver_version", sizeof("driver_version") - 1, 1);
+ zend_declare_typed_property(class_entry, property_driver_version_name, &property_driver_version_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_driver_version_name);
+
+ zval property_reconnect_default_value;
+ ZVAL_BOOL(&property_reconnect_default_value, 0);
+ zend_string *property_reconnect_name = zend_string_init("reconnect", sizeof("reconnect") - 1, 1);
+ zend_declare_property_ex(class_entry, property_reconnect_name, &property_reconnect_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_reconnect_name);
+
+ zval property_report_mode_default_value;
+ ZVAL_LONG(&property_report_mode_default_value, 0);
+ zend_string *property_report_mode_name = zend_string_init("report_mode", sizeof("report_mode") - 1, 1);
+ zend_declare_property_ex(class_entry, property_report_mode_name, &property_report_mode_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_report_mode_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_mysqli(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "mysqli", class_mysqli_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ zval property_affected_rows_default_value;
+ ZVAL_UNDEF(&property_affected_rows_default_value);
+ zend_string *property_affected_rows_name = zend_string_init("affected_rows", sizeof("affected_rows") - 1, 1);
+ zend_declare_typed_property(class_entry, property_affected_rows_name, &property_affected_rows_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG|MAY_BE_STRING));
+ zend_string_release(property_affected_rows_name);
+
+ zval property_client_info_default_value;
+ ZVAL_UNDEF(&property_client_info_default_value);
+ zend_string *property_client_info_name = zend_string_init("client_info", sizeof("client_info") - 1, 1);
+ zend_declare_typed_property(class_entry, property_client_info_name, &property_client_info_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_client_info_name);
+
+ zval property_client_version_default_value;
+ ZVAL_UNDEF(&property_client_version_default_value);
+ zend_string *property_client_version_name = zend_string_init("client_version", sizeof("client_version") - 1, 1);
+ zend_declare_typed_property(class_entry, property_client_version_name, &property_client_version_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_client_version_name);
+
+ zval property_connect_errno_default_value;
+ ZVAL_UNDEF(&property_connect_errno_default_value);
+ zend_string *property_connect_errno_name = zend_string_init("connect_errno", sizeof("connect_errno") - 1, 1);
+ zend_declare_typed_property(class_entry, property_connect_errno_name, &property_connect_errno_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_connect_errno_name);
+
+ zval property_connect_error_default_value;
+ ZVAL_UNDEF(&property_connect_error_default_value);
+ zend_string *property_connect_error_name = zend_string_init("connect_error", sizeof("connect_error") - 1, 1);
+ zend_declare_typed_property(class_entry, property_connect_error_name, &property_connect_error_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+ zend_string_release(property_connect_error_name);
+
+ zval property_errno_default_value;
+ ZVAL_UNDEF(&property_errno_default_value);
+ zend_string *property_errno_name = zend_string_init("errno", sizeof("errno") - 1, 1);
+ zend_declare_typed_property(class_entry, property_errno_name, &property_errno_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_errno_name);
+
+ zval property_error_default_value;
+ ZVAL_UNDEF(&property_error_default_value);
+ zend_string *property_error_name = zend_string_init("error", sizeof("error") - 1, 1);
+ zend_declare_typed_property(class_entry, property_error_name, &property_error_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_error_name);
+
+ zval property_error_list_default_value;
+ ZVAL_UNDEF(&property_error_list_default_value);
+ zend_string *property_error_list_name = zend_string_init("error_list", sizeof("error_list") - 1, 1);
+ zend_declare_typed_property(class_entry, property_error_list_name, &property_error_list_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
+ zend_string_release(property_error_list_name);
+
+ zval property_field_count_default_value;
+ ZVAL_UNDEF(&property_field_count_default_value);
+ zend_string *property_field_count_name = zend_string_init("field_count", sizeof("field_count") - 1, 1);
+ zend_declare_typed_property(class_entry, property_field_count_name, &property_field_count_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_field_count_name);
+
+ zval property_host_info_default_value;
+ ZVAL_UNDEF(&property_host_info_default_value);
+ zend_string *property_host_info_name = zend_string_init("host_info", sizeof("host_info") - 1, 1);
+ zend_declare_typed_property(class_entry, property_host_info_name, &property_host_info_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_host_info_name);
+
+ zval property_info_default_value;
+ ZVAL_UNDEF(&property_info_default_value);
+ zend_string *property_info_name = zend_string_init("info", sizeof("info") - 1, 1);
+ zend_declare_typed_property(class_entry, property_info_name, &property_info_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
+ zend_string_release(property_info_name);
+
+ zval property_insert_id_default_value;
+ ZVAL_UNDEF(&property_insert_id_default_value);
+ zend_string *property_insert_id_name = zend_string_init("insert_id", sizeof("insert_id") - 1, 1);
+ zend_declare_typed_property(class_entry, property_insert_id_name, &property_insert_id_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG|MAY_BE_STRING));
+ zend_string_release(property_insert_id_name);
+
+ zval property_server_info_default_value;
+ ZVAL_UNDEF(&property_server_info_default_value);
+ zend_string *property_server_info_name = zend_string_init("server_info", sizeof("server_info") - 1, 1);
+ zend_declare_typed_property(class_entry, property_server_info_name, &property_server_info_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_server_info_name);
+
+ zval property_server_version_default_value;
+ ZVAL_UNDEF(&property_server_version_default_value);
+ zend_string *property_server_version_name = zend_string_init("server_version", sizeof("server_version") - 1, 1);
+ zend_declare_typed_property(class_entry, property_server_version_name, &property_server_version_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_server_version_name);
+
+ zval property_sqlstate_default_value;
+ ZVAL_UNDEF(&property_sqlstate_default_value);
+ zend_string *property_sqlstate_name = zend_string_init("sqlstate", sizeof("sqlstate") - 1, 1);
+ zend_declare_typed_property(class_entry, property_sqlstate_name, &property_sqlstate_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_sqlstate_name);
+
+ zval property_protocol_version_default_value;
+ ZVAL_UNDEF(&property_protocol_version_default_value);
+ zend_string *property_protocol_version_name = zend_string_init("protocol_version", sizeof("protocol_version") - 1, 1);
+ zend_declare_typed_property(class_entry, property_protocol_version_name, &property_protocol_version_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_protocol_version_name);
+
+ zval property_thread_id_default_value;
+ ZVAL_UNDEF(&property_thread_id_default_value);
+ zend_string *property_thread_id_name = zend_string_init("thread_id", sizeof("thread_id") - 1, 1);
+ zend_declare_typed_property(class_entry, property_thread_id_name, &property_thread_id_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_thread_id_name);
+
+ zval property_warning_count_default_value;
+ ZVAL_UNDEF(&property_warning_count_default_value);
+ zend_string *property_warning_count_name = zend_string_init("warning_count", sizeof("warning_count") - 1, 1);
+ zend_declare_typed_property(class_entry, property_warning_count_name, &property_warning_count_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_warning_count_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_mysqli_result(zend_class_entry *class_entry_IteratorAggregate)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "mysqli_result", class_mysqli_result_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_IteratorAggregate);
+
+ zval property_current_field_default_value;
+ ZVAL_UNDEF(&property_current_field_default_value);
+ zend_string *property_current_field_name = zend_string_init("current_field", sizeof("current_field") - 1, 1);
+ zend_declare_typed_property(class_entry, property_current_field_name, &property_current_field_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_current_field_name);
+
+ zval property_field_count_default_value;
+ ZVAL_UNDEF(&property_field_count_default_value);
+ zend_string *property_field_count_name = zend_string_init("field_count", sizeof("field_count") - 1, 1);
+ zend_declare_typed_property(class_entry, property_field_count_name, &property_field_count_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_field_count_name);
+
+ zval property_lengths_default_value;
+ ZVAL_UNDEF(&property_lengths_default_value);
+ zend_string *property_lengths_name = zend_string_init("lengths", sizeof("lengths") - 1, 1);
+ zend_declare_typed_property(class_entry, property_lengths_name, &property_lengths_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY|MAY_BE_NULL));
+ zend_string_release(property_lengths_name);
+
+ zval property_num_rows_default_value;
+ ZVAL_UNDEF(&property_num_rows_default_value);
+ zend_string *property_num_rows_name = zend_string_init("num_rows", sizeof("num_rows") - 1, 1);
+ zend_declare_typed_property(class_entry, property_num_rows_name, &property_num_rows_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG|MAY_BE_STRING));
+ zend_string_release(property_num_rows_name);
+
+ zval property_type_default_value;
+ ZVAL_UNDEF(&property_type_default_value);
+ zend_string *property_type_name = zend_string_init("type", sizeof("type") - 1, 1);
+ zend_declare_typed_property(class_entry, property_type_name, &property_type_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_type_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_mysqli_stmt(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "mysqli_stmt", class_mysqli_stmt_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ zval property_affected_rows_default_value;
+ ZVAL_UNDEF(&property_affected_rows_default_value);
+ zend_string *property_affected_rows_name = zend_string_init("affected_rows", sizeof("affected_rows") - 1, 1);
+ zend_declare_typed_property(class_entry, property_affected_rows_name, &property_affected_rows_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG|MAY_BE_STRING));
+ zend_string_release(property_affected_rows_name);
+
+ zval property_insert_id_default_value;
+ ZVAL_UNDEF(&property_insert_id_default_value);
+ zend_string *property_insert_id_name = zend_string_init("insert_id", sizeof("insert_id") - 1, 1);
+ zend_declare_typed_property(class_entry, property_insert_id_name, &property_insert_id_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG|MAY_BE_STRING));
+ zend_string_release(property_insert_id_name);
+
+ zval property_num_rows_default_value;
+ ZVAL_UNDEF(&property_num_rows_default_value);
+ zend_string *property_num_rows_name = zend_string_init("num_rows", sizeof("num_rows") - 1, 1);
+ zend_declare_typed_property(class_entry, property_num_rows_name, &property_num_rows_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG|MAY_BE_STRING));
+ zend_string_release(property_num_rows_name);
+
+ zval property_param_count_default_value;
+ ZVAL_UNDEF(&property_param_count_default_value);
+ zend_string *property_param_count_name = zend_string_init("param_count", sizeof("param_count") - 1, 1);
+ zend_declare_typed_property(class_entry, property_param_count_name, &property_param_count_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_param_count_name);
+
+ zval property_field_count_default_value;
+ ZVAL_UNDEF(&property_field_count_default_value);
+ zend_string *property_field_count_name = zend_string_init("field_count", sizeof("field_count") - 1, 1);
+ zend_declare_typed_property(class_entry, property_field_count_name, &property_field_count_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_field_count_name);
+
+ zval property_errno_default_value;
+ ZVAL_UNDEF(&property_errno_default_value);
+ zend_string *property_errno_name = zend_string_init("errno", sizeof("errno") - 1, 1);
+ zend_declare_typed_property(class_entry, property_errno_name, &property_errno_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_errno_name);
+
+ zval property_error_default_value;
+ ZVAL_UNDEF(&property_error_default_value);
+ zend_string *property_error_name = zend_string_init("error", sizeof("error") - 1, 1);
+ zend_declare_typed_property(class_entry, property_error_name, &property_error_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_error_name);
+
+ zval property_error_list_default_value;
+ ZVAL_UNDEF(&property_error_list_default_value);
+ zend_string *property_error_list_name = zend_string_init("error_list", sizeof("error_list") - 1, 1);
+ zend_declare_typed_property(class_entry, property_error_list_name, &property_error_list_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
+ zend_string_release(property_error_list_name);
+
+ zval property_sqlstate_default_value;
+ ZVAL_UNDEF(&property_sqlstate_default_value);
+ zend_string *property_sqlstate_name = zend_string_init("sqlstate", sizeof("sqlstate") - 1, 1);
+ zend_declare_typed_property(class_entry, property_sqlstate_name, &property_sqlstate_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_sqlstate_name);
+
+ zval property_id_default_value;
+ ZVAL_UNDEF(&property_id_default_value);
+ zend_string *property_id_name = zend_string_init("id", sizeof("id") - 1, 1);
+ zend_declare_typed_property(class_entry, property_id_name, &property_id_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_id_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_mysqli_warning(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "mysqli_warning", class_mysqli_warning_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ zval property_message_default_value;
+ ZVAL_UNDEF(&property_message_default_value);
+ zend_string *property_message_name = zend_string_init("message", sizeof("message") - 1, 1);
+ zend_declare_typed_property(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_message_name);
+
+ zval property_sqlstate_default_value;
+ ZVAL_UNDEF(&property_sqlstate_default_value);
+ zend_string *property_sqlstate_name = zend_string_init("sqlstate", sizeof("sqlstate") - 1, 1);
+ zend_declare_typed_property(class_entry, property_sqlstate_name, &property_sqlstate_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_sqlstate_name);
+
+ zval property_errno_default_value;
+ ZVAL_UNDEF(&property_errno_default_value);
+ zend_string *property_errno_name = zend_string_init("errno", sizeof("errno") - 1, 1);
+ zend_declare_typed_property(class_entry, property_errno_name, &property_errno_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_errno_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_mysqli_sql_exception(zend_class_entry *class_entry_RuntimeException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "mysqli_sql_exception", class_mysqli_sql_exception_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ zval property_sqlstate_default_value;
+ zend_string *property_sqlstate_default_value_str = zend_string_init("00000", sizeof("00000") - 1, 1);
+ ZVAL_STR(&property_sqlstate_default_value, property_sqlstate_default_value_str);
+ zend_string *property_sqlstate_name = zend_string_init("sqlstate", sizeof("sqlstate") - 1, 1);
+ zend_declare_property_ex(class_entry, property_sqlstate_name, &property_sqlstate_default_value, ZEND_ACC_PROTECTED, NULL);
+ zend_string_release(property_sqlstate_name);
+
+ return class_entry;
+}
diff --git a/ext/mysqli/mysqli_driver.c b/ext/mysqli/mysqli_driver.c
index c3fb5e48bb..7f98faf996 100644
--- a/ext/mysqli/mysqli_driver.c
+++ b/ext/mysqli/mysqli_driver.c
@@ -26,101 +26,64 @@
#include "php_mysqli_structs.h"
#include "zend_exceptions.h"
-#define MAP_PROPERTY_MYG_BOOL_READ(name, value) \
-static int name(mysqli_object *obj, zval *retval, zend_bool quiet) \
-{ \
- ZVAL_BOOL(retval, MyG(value)); \
- return SUCCESS; \
-} \
-#define MAP_PROPERTY_MYG_BOOL_WRITE(name, value) \
-static int name(mysqli_object *obj, zval *value) \
-{ \
- MyG(value) = Z_LVAL_P(value) > 0; \
- return SUCCESS; \
-} \
-
-#define MAP_PROPERTY_MYG_LONG_READ(name, value) \
-static int name(mysqli_object *obj, zval *retval, zend_bool quiet) \
-{ \
- ZVAL_LONG(retval, MyG(value)); \
- return SUCCESS; \
-} \
-
-#define MAP_PROPERTY_MYG_LONG_WRITE(name, value) \
-static int name(mysqli_object *obj, zval *value) \
-{ \
- MyG(value) = Z_LVAL_P(value); \
- return SUCCESS; \
-} \
+/* {{{ property driver_report_read */
+static int driver_reconnect_read(mysqli_object *obj, zval *retval, bool quiet)
+{
+ ZVAL_BOOL(retval, MyG(reconnect));
+ return SUCCESS;
+}
+/* }}} */
-#define MAP_PROPERTY_MYG_STRING_READ(name, value) \
-static int name(mysqli_object *obj, zval *retval, zend_bool quiet) \
-{ \
- ZVAL_STRING(retval, MyG(value)); \
- return SUCCESS; \
-} \
+/* {{{ property driver_report_write */
+static int driver_reconnect_write(mysqli_object *obj, zval *value)
+{
+ MyG(reconnect) = Z_LVAL_P(value) > 0;
+ return SUCCESS;
+}
+/* }}} */
-#define MAP_PROPERTY_MYG_STRING_WRITE(name, value) \
-static int name(mysqli_object *obj, zval *value) \
-{ \
- MyG(value) = Z_STRVAL_P(value); \
- return SUCCESS; \
-} \
+/* {{{ property driver_report_read */
+static int driver_report_read(mysqli_object *obj, zval *retval, bool quiet)
+{
+ ZVAL_LONG(retval, MyG(report_mode));
+ return SUCCESS;
+}
+/* }}} */
/* {{{ property driver_report_write */
static int driver_report_write(mysqli_object *obj, zval *value)
{
MyG(report_mode) = Z_LVAL_P(value);
- /*FIXME*/
- /* zend_replace_error_handling(MyG(report_mode) & MYSQLI_REPORT_STRICT ? EH_THROW : EH_NORMAL, NULL, NULL); */
return SUCCESS;
}
/* }}} */
/* {{{ property driver_client_version_read */
-static int driver_client_version_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int driver_client_version_read(mysqli_object *obj, zval *retval, bool quiet)
{
ZVAL_LONG(retval, mysql_get_client_version());
-
return SUCCESS;
}
/* }}} */
/* {{{ property driver_client_info_read */
-static int driver_client_info_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int driver_client_info_read(mysqli_object *obj, zval *retval, bool quiet)
{
ZVAL_STRING(retval, (char *)mysql_get_client_info());
-
return SUCCESS;
}
/* }}} */
/* {{{ property driver_driver_version_read */
-static int driver_driver_version_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int driver_driver_version_read(mysqli_object *obj, zval *retval, bool quiet)
{
+ zend_error(E_DEPRECATED, "The driver_version property is deprecated");
ZVAL_LONG(retval, MYSQLI_VERSION_ID);
-
return SUCCESS;
}
/* }}} */
-MAP_PROPERTY_MYG_BOOL_READ(driver_reconnect_read, reconnect)
-MAP_PROPERTY_MYG_BOOL_WRITE(driver_reconnect_write, reconnect)
-MAP_PROPERTY_MYG_LONG_READ(driver_report_read, report_mode)
-
-ZEND_FUNCTION(mysqli_driver_construct)
-{
-#ifdef G0
- MYSQLI_RESOURCE *mysqli_resource;
-
- mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
- mysqli_resource->ptr = 1;
- mysqli_resource->status = (ZEND_NUM_ARGS() == 1) ? MYSQLI_STATUS_INITIALIZED : MYSQLI_STATUS_VALID;
- (Z_MYSQLI_P(getThis()))->ptr = mysqli_resource;
-#endif
-}
-
const mysqli_property_entry mysqli_driver_property_entries[] = {
{"client_info", sizeof("client_info") - 1, driver_client_info_read, NULL},
{"client_version", sizeof("client_version") - 1, driver_client_version_read, NULL},
diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c
index 364638c44a..907b1e3fbc 100644
--- a/ext/mysqli/mysqli_nonapi.c
+++ b/ext/mysqli/mysqli_nonapi.c
@@ -47,7 +47,7 @@ static void php_mysqli_set_error(zend_long mysql_errno, char *mysql_err)
}
/* }}} */
-void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_connect, zend_bool in_ctor) /* {{{ */
+void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, bool is_real_connect, bool in_ctor) /* {{{ */
{
MY_MYSQL *mysql = NULL;
MYSQLI_RESOURCE *mysqli_resource = NULL;
@@ -56,14 +56,14 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
*ssl_key = NULL, *ssl_cert = NULL, *ssl_ca = NULL, *ssl_capath = NULL,
*ssl_cipher = NULL;
size_t hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
- zend_bool persistent = FALSE, ssl = FALSE;
+ bool persistent = FALSE, ssl = FALSE;
zend_long port = 0, flags = 0;
- zend_bool port_is_null = 1;
+ bool port_is_null = 1;
zend_string *hash_key = NULL;
- zend_bool new_connection = FALSE;
+ bool new_connection = FALSE;
zend_resource *le;
mysqli_plist_entry *plist = NULL;
- zend_bool self_alloced = 0;
+ bool self_alloced = 0;
#if !defined(MYSQL_USE_MYSQLND)
@@ -245,7 +245,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
#ifndef MYSQLI_USE_MYSQLND
if (!(mysql->mysql = mysql_init(NULL))) {
#else
- if (!(mysql->mysql = mysqlnd_init(MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA, persistent))) {
+ if (!(mysql->mysql = mysqlnd_init(MYSQLND_CLIENT_NO_FLAG, persistent))) {
#endif
goto err;
}
@@ -307,7 +307,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
}
}
if (mysqlnd_connect(mysql->mysql, hostname, username, passwd, passwd_len, dbname, dbname_len,
- port, socket, flags, MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA) == NULL)
+ port, socket, flags, MYSQLND_CLIENT_NO_FLAG) == NULL)
#endif
{
/* Save error messages - for mysqli_connect_error() & mysqli_connect_errno() */
@@ -332,6 +332,12 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
unsigned int allow_local_infile = MyG(allow_local_infile);
mysql_options(mysql->mysql, MYSQL_OPT_LOCAL_INFILE, (char *)&allow_local_infile);
+#if MYSQL_VERSION_ID >= 80021 || defined(MYSQLI_USE_MYSQLND)
+ if (MyG(local_infile_directory) && !php_check_open_basedir(MyG(local_infile_directory))) {
+ mysql_options(mysql->mysql, MYSQL_OPT_LOAD_DATA_LOCAL_DIR, MyG(local_infile_directory));
+ }
+#endif
+
end:
if (!mysqli_resource) {
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
@@ -431,28 +437,39 @@ PHP_FUNCTION(mysqli_fetch_assoc)
/* }}} */
/* {{{ Fetches all result rows as an associative array, a numeric array, or both */
-#ifdef MYSQLI_USE_MYSQLND
PHP_FUNCTION(mysqli_fetch_all)
{
MYSQL_RES *result;
zval *mysql_result;
- zend_long mode = MYSQLND_FETCH_NUM;
+ zend_long mode = MYSQLI_NUM;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &mode) == FAILURE) {
RETURN_THROWS();
}
MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
- if (!mode || (mode & ~MYSQLND_FETCH_BOTH)) {
+ if (!mode || (mode & ~MYSQLI_BOTH)) {
zend_argument_value_error(ERROR_ARG_POS(2), "must be one of MYSQLI_FETCH_NUM, "
"MYSQLI_FETCH_ASSOC, or MYSQLI_FETCH_BOTH");
RETURN_THROWS();
}
- mysqlnd_fetch_all(result, mode, return_value);
+ array_init_size(return_value, mysql_num_rows(result));
+
+ zend_ulong i = 0;
+ do {
+ zval row;
+ php_mysqli_fetch_into_hash_aux(&row, result, mode);
+ if (Z_TYPE(row) != IS_ARRAY) {
+ zval_ptr_dtor_nogc(&row);
+ break;
+ }
+ add_index_zval(return_value, i++, &row);
+ } while (1);
}
/* }}} */
+#ifdef MYSQLI_USE_MYSQLND
/* {{{ Returns statistics about the zval cache */
PHP_FUNCTION(mysqli_get_client_stats)
{
@@ -689,12 +706,7 @@ PHP_FUNCTION(mysqli_query)
switch (resultmode & ~MYSQLI_ASYNC) {
#endif
case MYSQLI_STORE_RESULT:
-#ifdef MYSQLI_USE_MYSQLND
- if (resultmode & MYSQLI_STORE_RESULT_COPY_DATA) {
- result = mysqlnd_store_result_ofs(mysql->mysql);
- } else
-#endif
- result = mysql_store_result(mysql->mysql);
+ result = mysql_store_result(mysql->mysql);
break;
case MYSQLI_USE_RESULT:
result = mysql_use_result(mysql->mysql);
@@ -1197,7 +1209,7 @@ PHP_FUNCTION(mysqli_begin_transaction)
#ifndef MYSQLI_USE_MYSQLND
/* {{{ */
-static int mysqli_savepoint_libmysql(MYSQL * conn, const char * const name, zend_bool release)
+static int mysqli_savepoint_libmysql(MYSQL * conn, const char * const name, bool release)
{
int ret;
char * query;
diff --git a/ext/mysqli/mysqli_priv.h b/ext/mysqli/mysqli_priv.h
index f537514968..0e8baba576 100644
--- a/ext/mysqli/mysqli_priv.h
+++ b/ext/mysqli/mysqli_priv.h
@@ -127,8 +127,8 @@ if ((MyG(report_mode) & MYSQLI_REPORT_ERROR) && mysql_stmt_errno(stmt)) { \
php_mysqli_report_error(mysql_stmt_sqlstate(stmt), mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); \
}
-void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_connect, zend_bool in_ctor);
+void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, bool is_real_connect, bool in_ctor);
-void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_method);
+void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS, bool is_method);
#endif /* MYSQLI_PRIV_H */
diff --git a/ext/mysqli/mysqli_prop.c b/ext/mysqli/mysqli_prop.c
index 2ee059c756..a44af2a5ed 100644
--- a/ext/mysqli/mysqli_prop.c
+++ b/ext/mysqli/mysqli_prop.c
@@ -71,44 +71,62 @@ if (!obj->ptr) { \
p = (MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt; \
}
-#define MYSQLI_MAP_PROPERTY_FUNC_LONG( __func, __int_func, __get_type, __ret_type, __ret_type_sprint_mod)\
-static int __func(mysqli_object *obj, zval *retval, zend_bool quiet) \
+#define MYSQLI_MAP_PROPERTY_FUNC_LONG_OR_STR( __func, __int_func, __get_type, __ret_type, __ret_type_sprint_mod)\
+static int __func(mysqli_object *obj, zval *retval, bool quiet) \
{\
__ret_type l;\
__get_type;\
- if (!p) {\
- ZVAL_NULL(retval);\
- } else {\
- l = (__ret_type)__int_func(p);\
- if (l < ZEND_LONG_MAX) {\
- ZVAL_LONG(retval, (zend_long) l);\
- } else { \
- ZVAL_NEW_STR(retval, strpprintf(0, __ret_type_sprint_mod, l)); \
- } \
+ ZEND_ASSERT(p);\
+ l = (__ret_type)__int_func(p);\
+ if (l < ZEND_LONG_MAX) {\
+ ZVAL_LONG(retval, (zend_long) l);\
+ } else { \
+ ZVAL_NEW_STR(retval, strpprintf(0, __ret_type_sprint_mod, l)); \
} \
return SUCCESS; \
}
-#define MYSQLI_MAP_PROPERTY_FUNC_STRING(__func, __int_func, __get_type)\
-static int __func(mysqli_object *obj, zval *retval, zend_bool quiet)\
+#define MYSQLI_MAP_PROPERTY_FUNC_LONG( __func, __int_func, __get_type, __ret_type, __ret_type_sprint_mod)\
+static int __func(mysqli_object *obj, zval *retval, bool quiet) \
+{\
+ __ret_type l;\
+ __get_type;\
+ ZEND_ASSERT(p);\
+ l = (__ret_type)__int_func(p);\
+ ZEND_ASSERT(l < ZEND_LONG_MAX);\
+ ZVAL_LONG(retval, (zend_long) l);\
+ return SUCCESS; \
+}
+
+#define MYSQLI_MAP_PROPERTY_FUNC_STR_OR_NULL(__func, __int_func, __get_type)\
+static int __func(mysqli_object *obj, zval *retval, bool quiet)\
{\
char *c;\
__get_type;\
- if (!p) {\
- ZVAL_NULL(retval);\
+ ZEND_ASSERT(p);\
+ c = (char *)__int_func(p);\
+ if (c) {\
+ ZVAL_STRING(retval, c);\
} else {\
- c = (char *)__int_func(p);\
- if (!c) {\
- ZVAL_NULL(retval);\
- } else {\
- ZVAL_STRING(retval, c);\
- }\
+ ZVAL_NULL(retval);\
}\
return SUCCESS; \
}
+#define MYSQLI_MAP_PROPERTY_FUNC_STR(__func, __int_func, __get_type)\
+static int __func(mysqli_object *obj, zval *retval, bool quiet)\
+{\
+ char *c;\
+ __get_type;\
+ ZEND_ASSERT(p);\
+ c = (char *)__int_func(p);\
+ ZEND_ASSERT(c);\
+ ZVAL_STRING(retval, c);\
+ return SUCCESS; \
+}
+
/* {{{ property link_client_version_read */
-static int link_client_version_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int link_client_version_read(mysqli_object *obj, zval *retval, bool quiet)
{
ZVAL_LONG(retval, MYSQL_VERSION_ID);
@@ -117,9 +135,8 @@ static int link_client_version_read(mysqli_object *obj, zval *retval, zend_bool
/* }}} */
/* {{{ property link_client_info_read */
-static int link_client_info_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int link_client_info_read(mysqli_object *obj, zval *retval, bool quiet)
{
- CHECK_STATUS(MYSQLI_STATUS_INITIALIZED, quiet);
ZVAL_STRING(retval, MYSQL_SERVER_VERSION);
return SUCCESS;
@@ -127,7 +144,7 @@ static int link_client_info_read(mysqli_object *obj, zval *retval, zend_bool qui
/* }}} */
/* {{{ property link_connect_errno_read */
-static int link_connect_errno_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int link_connect_errno_read(mysqli_object *obj, zval *retval, bool quiet)
{
ZVAL_LONG(retval, (zend_long)MyG(error_no));
@@ -136,7 +153,7 @@ static int link_connect_errno_read(mysqli_object *obj, zval *retval, zend_bool q
/* }}} */
/* {{{ property link_connect_error_read */
-static int link_connect_error_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int link_connect_error_read(mysqli_object *obj, zval *retval, bool quiet)
{
if (MyG(error_msg)) {
ZVAL_STRING(retval, MyG(error_msg));
@@ -149,32 +166,27 @@ static int link_connect_error_read(mysqli_object *obj, zval *retval, zend_bool q
/* }}} */
/* {{{ property link_affected_rows_read */
-static int link_affected_rows_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int link_affected_rows_read(mysqli_object *obj, zval *retval, bool quiet)
{
MY_MYSQL *mysql;
my_ulonglong rc;
- CHECK_STATUS(MYSQLI_STATUS_INITIALIZED, quiet);
+ CHECK_STATUS(MYSQLI_STATUS_VALID, quiet);
mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
+ ZEND_ASSERT(mysql);
- if (!mysql) {
- ZVAL_NULL(retval);
- } else {
- CHECK_STATUS(MYSQLI_STATUS_VALID, quiet);
+ rc = mysql_affected_rows(mysql->mysql);
- rc = mysql_affected_rows(mysql->mysql);
-
- if (rc == (my_ulonglong) -1) {
- ZVAL_LONG(retval, -1);
- return SUCCESS;
- }
+ if (rc == (my_ulonglong) -1) {
+ ZVAL_LONG(retval, -1);
+ return SUCCESS;
+ }
- if (rc < ZEND_LONG_MAX) {
- ZVAL_LONG(retval, (zend_long) rc);
- } else {
- ZVAL_NEW_STR(retval, strpprintf(0, MYSQLI_LLU_SPEC, rc));
- }
+ if (rc < ZEND_LONG_MAX) {
+ ZVAL_LONG(retval, (zend_long) rc);
+ } else {
+ ZVAL_NEW_STR(retval, strpprintf(0, MYSQLI_LLU_SPEC, rc));
}
return SUCCESS;
@@ -182,7 +194,7 @@ static int link_affected_rows_read(mysqli_object *obj, zval *retval, zend_bool q
/* }}} */
/* {{{ property link_error_list_read */
-static int link_error_list_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int link_error_list_read(mysqli_object *obj, zval *retval, bool quiet)
{
MY_MYSQL *mysql;
@@ -228,46 +240,43 @@ static int link_error_list_read(mysqli_object *obj, zval *retval, zend_bool quie
/* link properties */
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED), zend_ulong, ZEND_ULONG_FMT)
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_error_read, mysql_error, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED))
+MYSQLI_MAP_PROPERTY_FUNC_STR(link_error_read, mysql_error, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED))
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_field_count_read, mysql_field_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_host_info_read, mysql_get_host_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_info_read, mysql_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
+MYSQLI_MAP_PROPERTY_FUNC_STR(link_host_info_read, mysql_get_host_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
+MYSQLI_MAP_PROPERTY_FUNC_STR_OR_NULL(link_info_read, mysql_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
+MYSQLI_MAP_PROPERTY_FUNC_LONG_OR_STR(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_protocol_version_read, mysql_get_proto_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_server_info_read, mysql_get_server_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
+MYSQLI_MAP_PROPERTY_FUNC_STR(link_server_info_read, mysql_get_server_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_server_version_read, mysql_get_server_version, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_sqlstate_read, mysql_sqlstate, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
+MYSQLI_MAP_PROPERTY_FUNC_STR(link_sqlstate_read, mysql_sqlstate, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_thread_id_read, mysql_thread_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
/* result properties */
/* {{{ property result_type_read */
-static int result_type_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int result_type_read(mysqli_object *obj, zval *retval, bool quiet)
{
MYSQL_RES *p;
CHECK_STATUS(MYSQLI_STATUS_VALID, quiet);
p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
- if (!p) {
- ZVAL_NULL(retval);
- } else {
- ZVAL_LONG(retval, mysqli_result_is_unbuffered(p) ? MYSQLI_USE_RESULT:MYSQLI_STORE_RESULT);
- }
+ ZEND_ASSERT(p);
+ ZVAL_LONG(retval, mysqli_result_is_unbuffered(p) ? MYSQLI_USE_RESULT:MYSQLI_STORE_RESULT);
return SUCCESS;
}
/* }}} */
/* {{{ property result_lengths_read */
-static int result_lengths_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int result_lengths_read(mysqli_object *obj, zval *retval, bool quiet)
{
MYSQL_RES *p;
#ifdef MYSQLI_USE_MYSQLND
const size_t *ret;
#else
- const zend_ulong *ret;
+ const unsigned long *ret;
#endif
uint32_t field_count;
@@ -292,12 +301,12 @@ static int result_lengths_read(mysqli_object *obj, zval *retval, zend_bool quiet
MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read, mysql_field_tell, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
MYSQLI_MAP_PROPERTY_FUNC_LONG(result_field_count_read, mysql_num_fields, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
-MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
+MYSQLI_MAP_PROPERTY_FUNC_LONG_OR_STR(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
/* statement properties */
/* {{{ property stmt_id_read */
-static int stmt_id_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int stmt_id_read(mysqli_object *obj, zval *retval, bool quiet)
{
MY_STMT *p;
@@ -305,18 +314,15 @@ static int stmt_id_read(mysqli_object *obj, zval *retval, zend_bool quiet)
p = (MY_STMT*)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
- if (!p) {
- ZVAL_NULL(retval);
- } else {
- ZVAL_LONG(retval, mysqli_stmt_get_id(p->stmt));
- }
+ ZEND_ASSERT(p);
+ ZVAL_LONG(retval, mysqli_stmt_get_id(p->stmt));
return SUCCESS;
}
/* }}} */
/* {{{ property stmt_affected_rows_read */
-static int stmt_affected_rows_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int stmt_affected_rows_read(mysqli_object *obj, zval *retval, bool quiet)
{
MY_STMT *p;
my_ulonglong rc;
@@ -325,21 +331,18 @@ static int stmt_affected_rows_read(mysqli_object *obj, zval *retval, zend_bool q
p = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
- if (!p) {
- ZVAL_NULL(retval);
- } else {
- rc = mysql_stmt_affected_rows(p->stmt);
+ ZEND_ASSERT(p);
+ rc = mysql_stmt_affected_rows(p->stmt);
- if (rc == (my_ulonglong) -1) {
- ZVAL_LONG(retval, -1);
- return SUCCESS;
- }
+ if (rc == (my_ulonglong) -1) {
+ ZVAL_LONG(retval, -1);
+ return SUCCESS;
+ }
- if (rc < ZEND_LONG_MAX) {
- ZVAL_LONG(retval, (zend_long) rc);
- } else {
- ZVAL_NEW_STR(retval, strpprintf(0, MYSQLI_LLU_SPEC, rc));
- }
+ if (rc < ZEND_LONG_MAX) {
+ ZVAL_LONG(retval, (zend_long) rc);
+ } else {
+ ZVAL_NEW_STR(retval, strpprintf(0, MYSQLI_LLU_SPEC, rc));
}
return SUCCESS;
@@ -347,7 +350,7 @@ static int stmt_affected_rows_read(mysqli_object *obj, zval *retval, zend_bool q
/* }}} */
/* {{{ property stmt_error_list_read */
-static int stmt_error_list_read(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int stmt_error_list_read(mysqli_object *obj, zval *retval, bool quiet)
{
MY_STMT * stmt;
@@ -390,13 +393,13 @@ static int stmt_error_list_read(mysqli_object *obj, zval *retval, zend_bool quie
}
/* }}} */
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
+MYSQLI_MAP_PROPERTY_FUNC_LONG_OR_STR(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
+MYSQLI_MAP_PROPERTY_FUNC_LONG_OR_STR(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_param_count_read, mysql_stmt_param_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_field_count_read, mysql_stmt_field_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_errno_read, mysql_stmt_errno, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED), zend_ulong, ZEND_ULONG_FMT)
-MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_error_read, mysql_stmt_error, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED))
-MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_sqlstate_read, mysql_stmt_sqlstate, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED))
+MYSQLI_MAP_PROPERTY_FUNC_STR(stmt_error_read, mysql_stmt_error, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED))
+MYSQLI_MAP_PROPERTY_FUNC_STR(stmt_sqlstate_read, mysql_stmt_sqlstate, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED))
/* }}} */
const mysqli_property_entry mysqli_link_property_entries[] = {
diff --git a/ext/mysqli/mysqli_warning.c b/ext/mysqli/mysqli_warning.c
index 7b1552e5ac..9d2b05b30a 100644
--- a/ext/mysqli/mysqli_warning.c
+++ b/ext/mysqli/mysqli_warning.c
@@ -125,13 +125,13 @@ MYSQLI_WARNING * php_get_warnings(MYSQLND_CONN_DATA * mysql)
return NULL;
}
- result = mysql->m->use_result(mysql, 0);
+ result = mysql->m->use_result(mysql);
for (;;) {
zval *entry;
int errno;
- mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, &row, MYSQLND_MYSQLI);
+ mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, &row);
if (Z_TYPE(row) != IS_ARRAY) {
zval_ptr_dtor(&row);
break;
@@ -195,7 +195,7 @@ PHP_METHOD(mysqli_warning, next)
/* }}} */
/* {{{ property mysqli_warning_message */
-static int mysqli_warning_message(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int mysqli_warning_message(mysqli_object *obj, zval *retval, bool quiet)
{
MYSQLI_WARNING *w;
@@ -215,7 +215,7 @@ static int mysqli_warning_message(mysqli_object *obj, zval *retval, zend_bool qu
/* }}} */
/* {{{ property mysqli_warning_sqlstate */
-static int mysqli_warning_sqlstate(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int mysqli_warning_sqlstate(mysqli_object *obj, zval *retval, bool quiet)
{
MYSQLI_WARNING *w;
@@ -235,7 +235,7 @@ static int mysqli_warning_sqlstate(mysqli_object *obj, zval *retval, zend_bool q
/* }}} */
/* {{{ property mysqli_warning_error */
-static int mysqli_warning_errno(mysqli_object *obj, zval *retval, zend_bool quiet)
+static int mysqli_warning_errno(mysqli_object *obj, zval *retval, bool quiet)
{
MYSQLI_WARNING *w;
diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h
index 16ed9ddefc..5a80e2f6bf 100644
--- a/ext/mysqli/php_mysqli_structs.h
+++ b/ext/mysqli/php_mysqli_structs.h
@@ -46,6 +46,7 @@ typedef _Bool my_bool;
#include <errmsg.h>
#include <mysqld_error.h>
#include "mysqli_libmysql.h"
+
#endif /* MYSQLI_USE_MYSQLND */
@@ -88,7 +89,7 @@ typedef struct {
zval li_read;
php_stream *li_stream;
unsigned int multi_query;
- zend_bool persistent;
+ bool persistent;
#ifdef MYSQLI_USE_MYSQLND
int async_result_fetch_type;
#endif
@@ -124,7 +125,7 @@ struct st_mysqli_warning {
typedef struct _mysqli_property_entry {
const char *pname;
size_t pname_length;
- int (*r_func)(mysqli_object *obj, zval *retval, zend_bool quiet);
+ int (*r_func)(mysqli_object *obj, zval *retval, bool quiet);
int (*w_func)(mysqli_object *obj, zval *value);
} mysqli_property_entry;
@@ -186,13 +187,6 @@ extern void php_mysqli_fetch_into_hash_aux(zval *return_value, MYSQL_RES * resul
mysql->multi_query = 1; \
}
-#define REGISTER_MYSQLI_CLASS_ENTRY(name, mysqli_entry, class_functions) { \
- zend_class_entry ce; \
- INIT_CLASS_ENTRY(ce, name,class_functions); \
- ce.create_object = mysqli_objects_new; \
- mysqli_entry = zend_register_internal_class(&ce); \
-} \
-
#define MYSQLI_REGISTER_RESOURCE_EX(__ptr, __zval) \
(Z_MYSQLI_P(__zval))->ptr = __ptr;
@@ -269,27 +263,24 @@ extern void php_mysqli_fetch_into_hash_aux(zval *return_value, MYSQL_RES * resul
ZEND_BEGIN_MODULE_GLOBALS(mysqli)
- zend_long default_link;
zend_long num_links;
zend_long max_links;
zend_long num_active_persistent;
zend_long num_inactive_persistent;
zend_long max_persistent;
zend_long allow_persistent;
- zend_ulong default_port;
- char *default_host;
- char *default_user;
- char *default_socket;
- char *default_pw;
+ zend_ulong default_port;
+ char *default_host;
+ char *default_user;
+ char *default_pw;
+ char *default_socket;
zend_long reconnect;
zend_long allow_local_infile;
- zend_long strict;
+ char *local_infile_directory;
zend_long error_no;
- char *error_msg;
+ char *error_msg;
zend_long report_mode;
- HashTable *report_ht;
- zend_ulong multi_query;
- zend_bool rollback_on_cached_plink;
+ bool rollback_on_cached_plink;
ZEND_END_MODULE_GLOBALS(mysqli)
#define MyG(v) ZEND_MODULE_GLOBALS_ACCESSOR(mysqli, v)
diff --git a/ext/mysqli/tests/003.phpt b/ext/mysqli/tests/003.phpt
index 56a26602df..62f397587e 100644
--- a/ext/mysqli/tests/003.phpt
+++ b/ext/mysqli/tests/003.phpt
@@ -92,7 +92,7 @@ array(7) {
[2]=>
string(19) "2002-01-02 17:46:59"
[3]=>
- int(2010)
+ string(4) "2010"
[4]=>
string(19) "2010-07-10 00:00:00"
[5]=>
diff --git a/ext/mysqli/tests/020.phpt b/ext/mysqli/tests/020.phpt
index a2a8782f0f..d3bbd59332 100644
--- a/ext/mysqli/tests/020.phpt
+++ b/ext/mysqli/tests/020.phpt
@@ -87,7 +87,7 @@ array(7) {
[2]=>
%s(19) "2002-01-02 17:46:59"
[3]=>
- int(2010)
+ string(4) "2010"
[4]=>
%s(19) "2010-07-10 00:00:00"
[5]=>
diff --git a/ext/mysqli/tests/073.phpt b/ext/mysqli/tests/073.phpt
deleted file mode 100644
index c03cb2236d..0000000000
--- a/ext/mysqli/tests/073.phpt
+++ /dev/null
@@ -1,22 +0,0 @@
---TEST--
-mysqli_driver properties
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
---FILE--
-<?php
- require_once("connect.inc");
-
- var_dump($driver->client_version);
- var_dump($driver->client_info);
- var_dump($driver->driver_version);
- var_dump($driver->reconnect);
- var_dump($driver->report_mode);
- print "done!";
-?>
---EXPECTF--
-int(%d)
-string(%d) "%s"
-int(%d)
-bool(%s)
-int(%d)
-done!
diff --git a/ext/mysqli/tests/bug34810.phpt b/ext/mysqli/tests/bug34810.phpt
index 9157a13b9a..e1568d3038 100644
--- a/ext/mysqli/tests/bug34810.phpt
+++ b/ext/mysqli/tests/bug34810.phpt
@@ -12,13 +12,14 @@ class DbConnection {
public function connect() {
require_once("connect.inc");
- $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket);
+ /* Pass false as $connect_flags cannot be accessed via globals. */
+ $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket, false);
var_dump($link);
$link = mysqli_init();
var_dump($link);
- $mysql = new my_mysqli($host, $user, $passwd, $db, $port, $socket);
+ $mysql = new my_mysqli($host, $user, $passwd, $db, $port, $socket, false);
$mysql->query("DROP TABLE IF EXISTS test_warnings");
$mysql->query("CREATE TABLE test_warnings (a int not null)");
$mysql->query("SET sql_mode=''");
diff --git a/ext/mysqli/tests/bug36802.phpt b/ext/mysqli/tests/bug36802.phpt
index 1189115837..c0bace8aaf 100644
--- a/ext/mysqli/tests/bug36802.phpt
+++ b/ext/mysqli/tests/bug36802.phpt
@@ -31,7 +31,7 @@ Bug #36802 (crashes with with mysqli_set_charset())
}
/* following operations should work */
- $x[1] = ($mysql->client_version > 0);
+ $x[1] = ($mysql->error);
$x[2] = $mysql->errno;
$mysql->close();
@@ -43,7 +43,7 @@ mysqli object is not fully initialized
mysqli object is not fully initialized
array(2) {
[1]=>
- bool(true)
+ string(0) ""
[2]=>
int(0)
}
diff --git a/ext/mysqli/tests/bug62885.phpt b/ext/mysqli/tests/bug62885.phpt
index 4d02475570..c0815c7f04 100644
--- a/ext/mysqli/tests/bug62885.phpt
+++ b/ext/mysqli/tests/bug62885.phpt
@@ -12,11 +12,11 @@ if (!$IS_MYSQLND) {
<?php
error_reporting(E_ALL);
$tablica = array();
-$test1 = mysqli_poll($test2, $test3, $tablica, null);
+$test1 = mysqli_poll($test2, $test3, $tablica, 0);
$test2 = array();
$test2 = array();
-$test1 = mysqli_poll($test2, $test3, $tablica, null);
+$test1 = mysqli_poll($test2, $test3, $tablica, 0);
echo "okey";
?>
--EXPECTF--
diff --git a/ext/mysqli/tests/bug66124.phpt b/ext/mysqli/tests/bug66124.phpt
index cede635e14..8a2e5a5f73 100644
--- a/ext/mysqli/tests/bug66124.phpt
+++ b/ext/mysqli/tests/bug66124.phpt
@@ -8,15 +8,15 @@ require_once('skipifconnectfailure.inc');
?>
--FILE--
<?php
-$table_drop = "DROP TABLE IF EXISTS `bug66124`";
-$table_create = "CREATE TABLE `bug66124` (
+$table_drop = "DROP TABLE IF EXISTS `test`";
+$table_create = "CREATE TABLE `test` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8";
-$table_insert = "INSERT INTO `bug66124` SET `id`=?";
-$table_select = "SELECT * FROM `bug66124`";
-$table_delete = "DELETE FROM `bug66124`";
+$table_insert = "INSERT INTO `test` SET `id`=?";
+$table_select = "SELECT * FROM `test`";
+$table_delete = "DELETE FROM `test`";
$id = '1311200011005001566';
@@ -91,6 +91,10 @@ if ($result){
$link->close();
?>
done
+--CLEAN--
+<?php
+require_once "clean_table.inc";
+?>
--EXPECT--
Using 'i':
insert id:1311200011005001566=>1311200011005001566
diff --git a/ext/mysqli/tests/bug75018.phpt b/ext/mysqli/tests/bug75018.phpt
index 28af0bb77c..ce522aab87 100644
--- a/ext/mysqli/tests/bug75018.phpt
+++ b/ext/mysqli/tests/bug75018.phpt
@@ -11,7 +11,7 @@ require_once("connect.inc");
$mysqli = new mysqli("$host:$port", $user, $passwd, $db);
-$tbl = "test_bug75018";
+$tbl = "test";
$sql = "DROP TABLE IF EXISTS $tbl";
$mysqli->query($sql);
@@ -31,6 +31,10 @@ while ($row = $result->fetch_assoc()) {
}
?>
+--CLEAN--
+<?php
+require_once "clean_table.inc";
+?>
--EXPECT--
string(1) "0"
string(4) "1365"
diff --git a/ext/mysqli/tests/bug75434.phpt b/ext/mysqli/tests/bug75434.phpt
index 1bc325e29f..3e295d83bf 100644
--- a/ext/mysqli/tests/bug75434.phpt
+++ b/ext/mysqli/tests/bug75434.phpt
@@ -3,7 +3,6 @@ Bug #75434 Wrong reflection for mysqli_fetch_all function
--SKIPIF--
<?php
require_once('skipif.inc');
-if (!stristr(mysqli_get_client_info(), 'mysqlnd')) die("skip: only available in mysqlnd");
?>
--FILE--
<?php
diff --git a/ext/mysqli/tests/bug77597.phpt b/ext/mysqli/tests/bug77597.phpt
index 52ae874454..cd9055deb7 100644
--- a/ext/mysqli/tests/bug77597.phpt
+++ b/ext/mysqli/tests/bug77597.phpt
@@ -12,11 +12,11 @@ if (!defined('MYSQLI_STORE_RESULT_COPY_DATA')) die('skip requires mysqlnd');
require_once("connect.inc");
$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket);
-$mysqli->query('DROP TABLE IF EXISTS a');
-$mysqli->query('CREATE TABLE a (b int)');
-$mysqli->query('INSERT INTO a VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)');
+$mysqli->query('DROP TABLE IF EXISTS test');
+$mysqli->query('CREATE TABLE test (b int)');
+$mysqli->query('INSERT INTO test VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)');
-$mysqli->real_query("SELECT * FROM a");
+$mysqli->real_query("SELECT * FROM test");
$result = $mysqli->store_result(MYSQLI_STORE_RESULT_COPY_DATA);
@@ -24,5 +24,9 @@ $field = $result->fetch_field();
var_dump($field->name);
?>
+--CLEAN--
+<?php
+require_once "clean_table.inc";
+?>
--EXPECT--
string(1) "b"
diff --git a/ext/mysqli/tests/bug77935.phpt b/ext/mysqli/tests/bug77935.phpt
index 7a39ac0065..9917488a25 100644
--- a/ext/mysqli/tests/bug77935.phpt
+++ b/ext/mysqli/tests/bug77935.phpt
@@ -31,6 +31,13 @@ while ($row = $result->fetch_assoc()) {
}
?>
+--CLEAN--
+<?php
+require_once 'connect.inc';
+$link = new mysqli($host, $user, $passwd, $db, $port, $socket);
+$link->query('DROP PROCEDURE IF EXISTS testSp');
+$link->close();
+?>
--EXPECT--
array(1) {
[1]=>
diff --git a/ext/mysqli/tests/bug77956.phpt b/ext/mysqli/tests/bug77956.phpt
index c76e1021e1..19df063951 100644
--- a/ext/mysqli/tests/bug77956.phpt
+++ b/ext/mysqli/tests/bug77956.phpt
@@ -55,6 +55,5 @@ $link->close();
unlink('bug77956.data');
?>
--EXPECTF--
-Warning: mysqli::query(): LOAD DATA LOCAL INFILE forbidden in %s on line %d
-[006] [2000] LOAD DATA LOCAL INFILE is forbidden, check mysqli.allow_local_infile
-done
+[006] [2000] LOAD DATA LOCAL INFILE is forbidden, check related settings like mysqli.allow_local_infile|mysqli.local_infile_directory or PDO::MYSQL_ATTR_LOCAL_INFILE|PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY
+done \ No newline at end of file
diff --git a/ext/mysqli/tests/connect.inc b/ext/mysqli/tests/connect.inc
index 604ecc97ea..e8f56cf249 100644
--- a/ext/mysqli/tests/connect.inc
+++ b/ext/mysqli/tests/connect.inc
@@ -7,6 +7,7 @@
*/
$driver = new mysqli_driver;
+ $driver->report_mode = MYSQLI_REPORT_OFF;
$host = getenv("MYSQL_TEST_HOST") ?: "127.0.0.1";
$port = getenv("MYSQL_TEST_PORT") ?: 3306;
@@ -51,7 +52,7 @@
if (!function_exists('my_mysqli_connect')) {
/**
- * Whenever possible, please use this wrapper to make testing ot MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible
+ * Whenever possible, please use this wrapper to make testing of MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible
*
* @param enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS)?
*/
@@ -71,7 +72,7 @@
}
/**
- * Whenever possible, please use this wrapper to make testing ot MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible
+ * Whenever possible, please use this wrapper to make testing of MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible
*
* @param enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS)
*/
diff --git a/ext/mysqli/tests/foo/bar/bar.data b/ext/mysqli/tests/foo/bar/bar.data
new file mode 100644
index 0000000000..56e5e8cdce
--- /dev/null
+++ b/ext/mysqli/tests/foo/bar/bar.data
@@ -0,0 +1,3 @@
+97
+98
+99
diff --git a/ext/mysqli/tests/foo/foo.data b/ext/mysqli/tests/foo/foo.data
new file mode 100644
index 0000000000..01e79c32a8
--- /dev/null
+++ b/ext/mysqli/tests/foo/foo.data
@@ -0,0 +1,3 @@
+1
+2
+3
diff --git a/ext/mysqli/tests/local_infile_tools.inc b/ext/mysqli/tests/local_infile_tools.inc
index fef400d0a9..d45d15e6ac 100644
--- a/ext/mysqli/tests/local_infile_tools.inc
+++ b/ext/mysqli/tests/local_infile_tools.inc
@@ -6,8 +6,7 @@
}
}
- function check_local_infile_support($link, $engine, $table_name = 'test') {
-
+ function check_local_infile_allowed_by_server($link) {
if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"'))
return "Cannot check if Server variable 'local_infile' is set to 'ON'";
@@ -16,6 +15,15 @@
if ('ON' != $row['Value'])
return sprintf("Server variable 'local_infile' seems not set to 'ON', found '%s'", $row['Value']);
+ return "";
+ }
+
+ function check_local_infile_support($link, $engine, $table_name = 'test') {
+ $res = check_local_infile_allowed_by_server($link);
+ if ($res) {
+ return $res;
+ }
+
if (!mysqli_query($link, sprintf('DROP TABLE IF EXISTS %s', $table_name))) {
return "Failed to drop old test table";
}
diff --git a/ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt b/ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt
new file mode 100644
index 0000000000..187701ff8c
--- /dev/null
+++ b/ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt
@@ -0,0 +1,75 @@
+--TEST--
+mysqli.allow_local_infile overrides mysqli.local_infile_directory
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifconnectfailure.inc');
+
+if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
+ die("skip Cannot connect to MySQL");
+
+include_once("local_infile_tools.inc");
+if ($msg = check_local_infile_allowed_by_server($link))
+ die(sprintf("skip %s, [%d] %s", $msg, $link->errno, $link->error));
+
+mysqli_close($link);
+
+?>
+--INI--
+open_basedir={PWD}
+mysqli.allow_local_infile=1
+mysqli.local_infile_directory={PWD}/foo/bar
+--FILE--
+<?php
+ require_once("connect.inc");
+
+ if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
+ printf("[001] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
+ }
+
+ if (!$link->query("DROP TABLE IF EXISTS test")) {
+ printf("[002] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ if (!$link->query("CREATE TABLE test (id INT UNSIGNED NOT NULL PRIMARY KEY) ENGINE=" . $engine)) {
+ printf("[003] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ $filepath = str_replace('\\', '/', __DIR__.'/foo/foo.data');
+ if (!$link->query("LOAD DATA LOCAL INFILE '".$filepath."' INTO TABLE test")) {
+ printf("[004] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ if ($res = mysqli_query($link, 'SELECT COUNT(id) AS num FROM test')) {
+ $row = mysqli_fetch_assoc($res);
+ mysqli_free_result($res);
+
+ $row_count = $row['num'];
+ $expected_row_count = 3;
+ if ($row_count != $expected_row_count) {
+ printf("[005] %d != %d\n", $row_count, $expected_row_count);
+ }
+ } else {
+ printf("[006] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ $link->close();
+ echo "done";
+?>
+--CLEAN--
+<?php
+require_once('connect.inc');
+
+if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
+ printf("[clean] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
+ $host, $user, $db, $port, $socket);
+}
+
+if (!$link->query($link, 'DROP TABLE IF EXISTS test')) {
+ printf("[clean] Failed to drop old test table: [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+}
+
+$link->close();
+?>
+--EXPECT--
+done
diff --git a/ext/mysqli/tests/mysqli_class_mysqli_driver_interface.phpt b/ext/mysqli/tests/mysqli_class_mysqli_driver_interface.phpt
index 55fd3be47e..ebf9c7f2b7 100644
--- a/ext/mysqli/tests/mysqli_class_mysqli_driver_interface.phpt
+++ b/ext/mysqli/tests/mysqli_class_mysqli_driver_interface.phpt
@@ -3,81 +3,80 @@ Interface of the class mysqli_driver
--SKIPIF--
<?php
require_once('skipif.inc');
-require_once('skipifconnectfailure.inc');
?>
--FILE--
<?php
- require('connect.inc');
- require('table.inc');
- $driver = new mysqli_driver();
+$driver = new mysqli_driver();
- printf("Parent class:\n");
- var_dump(get_parent_class($driver));
+printf("Parent class:\n");
+var_dump(get_parent_class($driver));
- printf("\nMethods:\n");
- $methods = get_class_methods($driver);
- $expected_methods = array();
+printf("\nMethods:\n");
+$methods = get_class_methods($driver);
+$expected_methods = [];
- foreach ($methods as $k => $method) {
- if (isset($expected_methods[$method])) {
- unset($expected_methods[$method]);
- unset($methods[$k]);
- }
+foreach ($methods as $k => $method) {
+ if (isset($expected_methods[$method])) {
+ unset($expected_methods[$method], $methods[$k]);
}
- if (!empty($expected_methods)) {
- printf("Dumping list of missing methods.\n");
- var_dump($expected_methods);
- }
- if (!empty($methods)) {
- printf("Dumping list of unexpected methods.\n");
- var_dump($methods);
- }
- if (empty($expected_methods) && empty($methods))
- printf("ok\n");
-
- printf("\nClass variables:\n");
- $variables = array_keys(get_class_vars(get_class($driver)));
- sort($variables);
- foreach ($variables as $k => $var)
- printf("%s\n", $var);
-
- printf("\nObject variables:\n");
- $variables = array_keys(get_object_vars($driver));
- foreach ($variables as $k => $var)
- printf("%s\n", $var);
-
- printf("\nMagic, magic properties:\n");
-
- assert(mysqli_get_client_info() === $driver->client_info);
- printf("driver->client_info = '%s'\n", $driver->client_info);
-
- assert(mysqli_get_client_version() === $driver->client_version);
- printf("driver->client_version = '%s'\n", $driver->client_version);
-
- assert($driver->driver_version > 0);
- printf("driver->driver_version = '%s'\n", $driver->driver_version);
-
- assert(in_array($driver->report_mode,
- array(
- MYSQLI_REPORT_ALL,
- MYSQLI_REPORT_STRICT,
- MYSQLI_REPORT_ERROR,
- MYSQLI_REPORT_INDEX,
- MYSQLI_REPORT_OFF
- )
- ));
-
- printf("driver->report_mode = '%s'\n", $driver->report_mode);
- $driver->report_mode = MYSQLI_REPORT_STRICT;
- assert($driver->report_mode === MYSQLI_REPORT_STRICT);
-
- printf("driver->reconnect = '%s'\n", $driver->reconnect);
-
- printf("\nAccess to undefined properties:\n");
- printf("driver->unknown = '%s'\n", @$driver->unknown);
-
- print "done!";
+}
+if (!empty($expected_methods)) {
+ printf("Dumping list of missing methods.\n");
+ var_dump($expected_methods);
+}
+if (!empty($methods)) {
+ printf("Dumping list of unexpected methods.\n");
+ var_dump($methods);
+}
+if (empty($expected_methods) && empty($methods)) {
+ printf("ok\n");
+}
+
+printf("\nClass variables:\n");
+$variables = array_keys(get_class_vars(get_class($driver)));
+sort($variables);
+foreach ($variables as $var) {
+ printf("%s\n", $var);
+}
+
+printf("\nObject variables:\n");
+$variables = array_keys(get_object_vars($driver));
+foreach ($variables as $var) {
+ printf("%s\n", $var);
+}
+
+printf("\nMagic, magic properties:\n");
+
+assert(mysqli_get_client_info() === $driver->client_info);
+printf("driver->client_info = '%s'\n", $driver->client_info);
+
+assert(mysqli_get_client_version() === $driver->client_version);
+printf("driver->client_version = '%s'\n", $driver->client_version);
+
+printf("driver->driver_version = '%s'\n", $driver->driver_version);
+
+assert(in_array($driver->report_mode, [
+ MYSQLI_REPORT_ALL,
+ MYSQLI_REPORT_STRICT,
+ MYSQLI_REPORT_STRICT|MYSQLI_REPORT_ERROR,
+ MYSQLI_REPORT_STRICT|MYSQLI_REPORT_INDEX,
+ MYSQLI_REPORT_ERROR,
+ MYSQLI_REPORT_ERROR|MYSQLI_REPORT_INDEX,
+ MYSQLI_REPORT_INDEX,
+ MYSQLI_REPORT_OFF
+]));
+
+printf("driver->report_mode = '%s'\n", $driver->report_mode);
+$driver->report_mode = MYSQLI_REPORT_STRICT;
+assert($driver->report_mode === MYSQLI_REPORT_STRICT);
+
+printf("driver->reconnect = '%s'\n", $driver->reconnect);
+
+printf("\nAccess to undefined properties:\n");
+printf("driver->unknown = '%s'\n", @$driver->unknown);
+
+print "done!";
?>
--EXPECTF--
Parent class:
@@ -94,15 +93,14 @@ reconnect
report_mode
Object variables:
-client_info
-client_version
-driver_version
reconnect
report_mode
Magic, magic properties:
driver->client_info = '%s'
driver->client_version = '%d'
+
+Deprecated: The driver_version property is deprecated in %s on line %d
driver->driver_version = '%d'
driver->report_mode = '%d'
driver->reconnect = ''
diff --git a/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt b/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt
index 48706fcf6e..d0d858b9de 100644
--- a/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt
+++ b/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt
@@ -92,7 +92,7 @@ require_once('skipifconnectfailure.inc');
printf("\nClass variables:\n");
- $expected_class_variables = $expected_object_variables = array(
+ $expected_class_variables = [
"affected_rows" => true,
"client_info" => true,
"client_version" => true,
@@ -110,10 +110,10 @@ require_once('skipifconnectfailure.inc');
"sqlstate" => true,
"thread_id" => true,
"warning_count" => true,
- );
+ "error_list" => true,
+ ];
- $expected_class_variables["error_list"] = true;
- $expected_object_variables["error_list"] = true;
+ $expected_object_variables = [];
$variables = get_class_vars(get_class($mysqli));
foreach ($variables as $var => $v) {
diff --git a/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt b/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt
index 651520b70a..b04fb93e9c 100644
--- a/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt
+++ b/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt
@@ -45,11 +45,7 @@ require_once('skipifconnectfailure.inc');
echo $exception->getMessage() . "\n";
}
- try {
- $mysqli->client_info;
- } catch (Error $exception) {
- echo $exception->getMessage() . "\n";
- }
+ printf("mysqli->client_info = '%s'/%s\n", $mysqli->client_info, gettype($mysqli->client_info));
printf("mysqli->client_version = '%s'/%s\n", $mysqli->client_version, gettype($mysqli->client_version));
@@ -242,7 +238,7 @@ Without RS
Class variables:
Property access is not allowed yet
-Property access is not allowed yet
+client_info = '%s'
client_version = '%s'
connect_errno = '%s'
connect_error = ''%s'
@@ -261,29 +257,11 @@ mysqli object is already closed
mysqli object is already closed
Object variables:
-Property access is not allowed yet
-Property access is not allowed yet
-client_version = '%s'
-connect_errno = '%s'
-connect_error = ''%s'
-mysqli object is already closed
-mysqli object is already closed
-Property access is not allowed yet
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
Magic, magic properties:
mysqli object is already closed
Property access is not allowed yet
-Property access is not allowed yet
+mysqli->client_info = '%s'/string
mysqli->client_version = '%d'/integer
mysqli object is already closed
mysqli object is already closed
@@ -324,7 +302,7 @@ mysqli object is already closed
Class variables:
Property access is not allowed yet
-Property access is not allowed yet
+client_info = '%s'
client_version = '%s'
connect_errno = '%s'
connect_error = '%s'
@@ -343,29 +321,11 @@ mysqli object is already closed
mysqli object is already closed
Object variables:
-Property access is not allowed yet
-Property access is not allowed yet
-client_version = '%s'
-connect_errno = '%s'
-connect_error = '%s'
-mysqli object is already closed
-mysqli object is already closed
-Property access is not allowed yet
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
-mysqli object is already closed
Magic, magic properties:
mysqli object is already closed
Property access is not allowed yet
-Property access is not allowed yet
+mysqli->client_info = '%s'/string
mysqli->client_version = '%d'/integer
mysqli object is already closed
mysqli object is already closed
diff --git a/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt b/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt
index 629697a50c..27656417e5 100644
--- a/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt
+++ b/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt
@@ -27,6 +27,7 @@ require_once('skipifconnectfailure.inc');
'__construct' => true,
'close' => true,
'data_seek' => true,
+ 'fetch_all' => true,
'fetch_array' => true,
'fetch_assoc' => true,
'fetch_field' => true,
@@ -39,8 +40,6 @@ require_once('skipifconnectfailure.inc');
'free_result' => true,
'getIterator' => true,
);
- if ($IS_MYSQLND)
- $expected_methods['fetch_all'] = true;
foreach ($methods as $k => $method) {
if (isset($expected_methods[$method])) {
@@ -163,11 +162,6 @@ num_rows
type
Object variables:
-current_field
-field_count
-lengths
-num_rows
-type
Magic, magic properties:
mysqli_result->current_field = '0'/integer ('0'/integer)
diff --git a/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt b/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt
index 393e06ebaa..b10877a285 100644
--- a/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt
+++ b/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt
@@ -153,16 +153,6 @@ param_count
sqlstate
Object variables:
-affected_rows
-insert_id
-num_rows
-param_count
-field_count
-errno
-error
-error_list
-sqlstate
-id
Magic, magic properties:
mysqli_stmt object is not fully initialized
diff --git a/ext/mysqli/tests/mysqli_constants.phpt b/ext/mysqli/tests/mysqli_constants.phpt
index 22e3cd9d2b..8538fafa4f 100644
--- a/ext/mysqli/tests/mysqli_constants.phpt
+++ b/ext/mysqli/tests/mysqli_constants.phpt
@@ -93,6 +93,7 @@ mysqli.allow_local_infile=1
"MYSQLI_REFRESH_HOSTS" => true,
"MYSQLI_REFRESH_STATUS" => true,
"MYSQLI_REFRESH_THREADS" => true,
+ "MYSQLI_REFRESH_REPLICA" => true,
"MYSQLI_REFRESH_SLAVE" => true,
"MYSQLI_REFRESH_MASTER" => true,
"MYSQLI_DEBUG_TRACE_ENABLED" => true,
@@ -201,6 +202,10 @@ mysqli.allow_local_infile=1
$expected_constants["MYSQLI_TYPE_JSON"] = true;
}
+ if ($version > 80210 || $IS_MYSQLND) {
+ $expected_constants['MYSQLI_OPT_LOAD_DATA_LOCAL_DIR'] = true;
+ }
+
$unexpected_constants = array();
foreach ($constants as $group => $consts) {
diff --git a/ext/mysqli/tests/mysqli_driver.phpt b/ext/mysqli/tests/mysqli_driver.phpt
index 4ef41e355c..a756766df6 100644
--- a/ext/mysqli/tests/mysqli_driver.phpt
+++ b/ext/mysqli/tests/mysqli_driver.phpt
@@ -7,102 +7,118 @@ require_once('skipifconnectfailure.inc');
?>
--FILE--
<?php
- require("table.inc");
+require_once('connect.inc');
- if (!is_object($driver = new mysqli_driver()))
- printf("[001] Failed to create mysqli_driver object\n");
+if (!is_object($driver = new mysqli_driver())) {
+ printf("[001] Failed to create mysqli_driver object\n");
+}
- $client_info = mysqli_get_client_info();
- if (($tmp = $driver->client_info) !== $client_info)
- printf("[002] Expecting %s/%s, got %s/%s\n",
- gettype($client_info), $client_info,
- gettype($tmp), $tmp);
-
- $client_version = mysqli_get_client_version();
- if (($tmp = $driver->client_version) !== $client_version)
- printf("[003] Expecting %s/%s, got %s/%s\n",
- gettype($client_version), $client_version,
- gettype($tmp), $tmp);
-
- if (!is_int($tmp = $driver->driver_version) || (0 == $tmp))
- printf("[004] Expecting int/any, got %s/%s\n",
+$client_info = mysqli_get_client_info();
+if (($tmp = $driver->client_info) !== $client_info) {
+ printf("[002] Expecting %s/%s, got %s/%s\n",
+ gettype($client_info), $client_info,
gettype($tmp), $tmp);
-
-
- $all_modes = array(MYSQLI_REPORT_INDEX, MYSQLI_REPORT_ERROR, MYSQLI_REPORT_STRICT,
- MYSQLI_REPORT_ALL, MYSQLI_REPORT_OFF);
- $report_mode = $driver->report_mode;
- if (!is_int($report_mode))
- printf("[005] Expecting int/any, got %s/%s\n",
- gettype($report_mode), $report_mode);
-
- if (!in_array($report_mode, $all_modes))
- printf("[006] Illegal report mode returned? Got %s, expected %s\n",
- $report_mode, implode(', ', $all_modes));
-
- $driver->report_mode = MYSQLI_REPORT_STRICT;
- $ok = false;
- try {
-
- if ($link = my_mysqli_connect($host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket))
- printf("[007] Can connect to the server using host=%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n",
- $host, $user . 'unknown_really', $db, $port, $socket);
- mysqli_close($link);
-
- } catch (mysqli_sql_exception $e) {
- $ok = true;
- if ('' == $e->getMessage())
- printf("[008] getMessage() has returned an empty string.\n");
- if ('' == $e->getCode())
- printf("[009] getCode() has returned an empty string.\n");
- if ('' == $e->getFile())
- printf("[010] getFile() has returned an empty string.\n");
- if ('' == $e->getLine())
- printf("[011] getLine() has returned an empty string.\n");
- $tmp = $e->getTrace();
- if (empty($tmp))
- printf("[012] getTrace() has returned an empty array.\n");
- if ('' == $e->getTraceAsString())
- printf("[013] getTraceAsString() has returned an empty string.\n");
- if ('' == $e->__toString())
- printf("[014] __toString() has returned an empty string.\n");
-
+}
+
+$client_version = mysqli_get_client_version();
+if (($tmp = $driver->client_version) !== $client_version) {
+ printf("[003] Expecting %s/%s, got %s/%s\n",
+ gettype($client_version), $client_version,
+ gettype($tmp), $tmp);
+}
+
+$all_modes = [
+ MYSQLI_REPORT_ALL,
+ MYSQLI_REPORT_STRICT,
+ MYSQLI_REPORT_STRICT|MYSQLI_REPORT_ERROR,
+ MYSQLI_REPORT_STRICT|MYSQLI_REPORT_INDEX,
+ MYSQLI_REPORT_ERROR,
+ MYSQLI_REPORT_ERROR|MYSQLI_REPORT_INDEX,
+ MYSQLI_REPORT_INDEX,
+ MYSQLI_REPORT_OFF
+];
+$report_mode = $driver->report_mode;
+if (!is_int($report_mode)) {
+ printf("[005] Expecting int/any, got %s/%s\n",
+ gettype($report_mode), $report_mode);
+}
+
+if (!in_array($report_mode, $all_modes)) {
+ printf("[006] Illegal report mode returned? Got %s, expected %s\n",
+ $report_mode, implode(', ', $all_modes));
+}
+
+$driver->report_mode = MYSQLI_REPORT_STRICT;
+$ok = false;
+try {
+ if ($link = my_mysqli_connect($host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket)) {
+ printf("[007] Can connect to the server using host=%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n",
+ $host, $user . 'unknown_really', $db, $port, $socket);
}
- if (!$ok)
- printf("[015] Error reporting mode has not been switched to exceptions and or no exception thrown\n");
-
-
- $driver->report_mode = MYSQLI_REPORT_OFF;
- if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
- printf("[016] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
- mysqli_query($link, "NO_SQL");
mysqli_close($link);
+} catch (mysqli_sql_exception $e) {
+ $ok = true;
+ if ('' == $e->getMessage()) {
+ printf("[008] getMessage() has returned an empty string.\n");
+ }
+ if ('' == $e->getCode()) {
+ printf("[009] getCode() has returned an empty string.\n");
+ }
+ if ('' == $e->getFile()) {
+ printf("[010] getFile() has returned an empty string.\n");
+ }
+ if ('' == $e->getLine()) {
+ printf("[011] getLine() has returned an empty string.\n");
+ }
+ if ([] == $e->getTrace()) {
+ printf("[012] getTrace() has returned an empty array.\n");
+ }
+ if ('' == $e->getTraceAsString()) {
+ printf("[013] getTraceAsString() has returned an empty string.\n");
+ }
+ if ('' == $e->__toString()) {
+ printf("[014] __toString() has returned an empty string.\n");
+ }
+}
+if (!$ok) {
+ printf("[015] Error reporting mode has not been switched to exceptions and or no exception thrown\n");
+}
- $driver->report_mode = MYSQLI_REPORT_ERROR;
+$driver->report_mode = MYSQLI_REPORT_OFF;
+if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
+ printf("[016] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
+}
+mysqli_query($link, "NO_SQL");
+mysqli_close($link);
- if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
- printf("[017] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
- mysqli_query($link, "NO_SQL");
- mysqli_close($link);
+$driver->report_mode = MYSQLI_REPORT_ERROR;
+
+if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
+ printf("[017] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
+}
+mysqli_query($link, "NO_SQL");
+mysqli_close($link);
- if (MYSQLI_REPORT_ERROR !== $driver->report_mode)
- printf("[018] Error mode should be different\n");
+if (MYSQLI_REPORT_ERROR !== $driver->report_mode) {
+ printf("[018] Error reporting mode should be different\n");
+}
- /* TODO - more report testing should go in here, but it's not really documented what behaviour is expected */
+/* TODO - more report testing should go in here, but it's not really documented what behaviour is expected */
- $driver->report_mode = $report_mode;
+$driver->report_mode = $report_mode;
- $reconnect = $driver->reconnect;
- if (!is_bool($reconnect))
+$reconnect = $driver->reconnect;
+if (!is_bool($reconnect)) {
printf("[019] Expecting boolean/any, got %s/%s\n",
- gettype($reconnect), $reconnect);
+ gettype($reconnect), $reconnect);
+}
- /* pointless, but I need more documentation */
- $driver->reconnect = true;
- $driver->reconnect = false;
- $driver->reconnect = $reconnect;
+/* pointless, but I need more documentation */
+$driver->reconnect = true;
+$driver->reconnect = false;
+$driver->reconnect = $reconnect;
- print "done!";
+print "done!";
?>
--EXPECTF--
Warning: mysqli_query(): (%d/%d): You have an error in your SQL syntax; check the manual that corresponds to your %s server version for the right syntax to use near 'NO_SQL' at line 1 in %s on line %d
diff --git a/ext/mysqli/tests/mysqli_fetch_all.phpt b/ext/mysqli/tests/mysqli_fetch_all.phpt
index ae99c2ca87..fac34e3d88 100644
--- a/ext/mysqli/tests/mysqli_fetch_all.phpt
+++ b/ext/mysqli/tests/mysqli_fetch_all.phpt
@@ -4,8 +4,6 @@ mysqli_fetch_all()
<?php
require_once('skipif.inc');
require_once('skipifconnectfailure.inc');
-if (!function_exists('mysqli_fetch_all'))
- die("skip: function only available with mysqlnd");
?>
--FILE--
<?php
diff --git a/ext/mysqli/tests/mysqli_fetch_all_oo.phpt b/ext/mysqli/tests/mysqli_fetch_all_oo.phpt
index df522f2eeb..ebdc55443c 100644
--- a/ext/mysqli/tests/mysqli_fetch_all_oo.phpt
+++ b/ext/mysqli/tests/mysqli_fetch_all_oo.phpt
@@ -4,9 +4,6 @@ $mysqli->fetch_all() (introduced with mysqlnd)
<?php
require_once('skipif.inc');
require_once('skipifconnectfailure.inc');
-
-if (!function_exists('mysqli_fetch_all'))
- die("skip: function only available with mysqlnd");
?>
--FILE--
<?php
diff --git a/ext/mysqli/tests/mysqli_fetch_field.phpt b/ext/mysqli/tests/mysqli_fetch_field.phpt
index 2018d75755..48d30453a0 100644
--- a/ext/mysqli/tests/mysqli_fetch_field.phpt
+++ b/ext/mysqli/tests/mysqli_fetch_field.phpt
@@ -35,10 +35,6 @@ require_once('skipifconnectfailure.inc');
printf("[004] Expecting charset %s/%d got %d\n",
$charsetInfo->charset, $charsetInfo->number, $tmp->charsetnr);
}
- if ($tmp->length != $charsetInfo->max_length) {
- printf("[005] Expecting length %d got %d\n",
- $charsetInfo->max_length, $tmp->max_length);
- }
if ($tmp->db != $db) {
printf("011] Expecting database '%s' got '%s'\n",
$db, $tmp->db);
@@ -97,7 +93,7 @@ object(stdClass)#%d (13) {
["catalog"]=>
string(%d) "%s"
["max_length"]=>
- int(1)
+ int(0)
["length"]=>
int(11)
["charsetnr"]=>
@@ -159,7 +155,7 @@ object(stdClass)#%d (13) {
["catalog"]=>
string(%d) "%s"
["max_length"]=>
- int(1)
+ int(0)
["length"]=>
int(11)
["charsetnr"]=>
diff --git a/ext/mysqli/tests/mysqli_fetch_field_oo.phpt b/ext/mysqli/tests/mysqli_fetch_field_oo.phpt
index d655e05a9c..ed0ce107cf 100644
--- a/ext/mysqli/tests/mysqli_fetch_field_oo.phpt
+++ b/ext/mysqli/tests/mysqli_fetch_field_oo.phpt
@@ -42,10 +42,6 @@ require_once('skipifconnectfailure.inc');
printf("[005] Expecting charset %s/%d got %d\n",
$charsetInfo->charset, $charsetInfo->number, $tmp->charsetnr);
}
- if ($tmp->length != $charsetInfo->max_length) {
- printf("[006] Expecting length %d got %d\n",
- $charsetInfo->max_length, $tmp->max_length);
- }
if ($tmp->db != $db) {
printf("[007] Expecting database '%s' got '%s'\n",
$db, $tmp->db);
@@ -86,7 +82,7 @@ object(stdClass)#%d (13) {
["catalog"]=>
string(%d) "%s"
["max_length"]=>
- int(1)
+ int(0)
["length"]=>
int(11)
["charsetnr"]=>
diff --git a/ext/mysqli/tests/mysqli_fetch_fields.phpt b/ext/mysqli/tests/mysqli_fetch_fields.phpt
index 7cfad35f87..ae1d12847a 100644
--- a/ext/mysqli/tests/mysqli_fetch_fields.phpt
+++ b/ext/mysqli/tests/mysqli_fetch_fields.phpt
@@ -35,11 +35,6 @@ require_once('skipifconnectfailure.inc');
$charsetInfo->charset,
$charsetInfo->number, $field->charsetnr);
}
- if ($field->length != $charsetInfo->max_length) {
- printf("[005] Expecting length %d got %d\n",
- $charsetInfo->max_length,
- $field->max_length);
- }
break;
}
}
@@ -76,7 +71,7 @@ object(stdClass)#%d (13) {
["catalog"]=>
string(%d) "%s"
["max_length"]=>
- int(1)
+ int(0)
["length"]=>
int(11)
["charsetnr"]=>
@@ -104,7 +99,7 @@ object(stdClass)#%d (13) {
["catalog"]=>
string(%d) "%s"
["max_length"]=>
- int(1)
+ int(0)
["length"]=>
int(%d)
["charsetnr"]=>
diff --git a/ext/mysqli/tests/mysqli_get_info_deprecations.phpt b/ext/mysqli/tests/mysqli_get_info_deprecations.phpt
new file mode 100644
index 0000000000..2dbbce0540
--- /dev/null
+++ b/ext/mysqli/tests/mysqli_get_info_deprecations.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Deprecated messages for mysqli::get_client_info() method
+--SKIPIF--
+<?php
+require_once 'skipif.inc';
+require_once 'skipifconnectfailure.inc';
+?>
+--FILE--
+<?php
+require 'connect.inc';
+
+if (!$mysqli = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
+ printf("Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
+ $host, $user, $db, $port, $socket);
+ exit(1);
+}
+
+printf("client_info = '%s'\n", $mysqli->get_client_info());
+
+printf("client_info = '%s'\n", mysqli_get_client_info($mysqli));
+
+print "done!";
+?>
+--EXPECTF--
+
+Deprecated: Method mysqli::get_client_info() is deprecated in %s
+client_info = '%s'
+
+Deprecated: mysqli_get_client_info(): Passing connection object as an argument is deprecated in %s
+client_info = '%s'
+done!
diff --git a/ext/mysqli/tests/mysqli_incomplete_initialization.phpt b/ext/mysqli/tests/mysqli_incomplete_initialization.phpt
index 533ea10af1..399ad74274 100644
--- a/ext/mysqli/tests/mysqli_incomplete_initialization.phpt
+++ b/ext/mysqli/tests/mysqli_incomplete_initialization.phpt
@@ -7,6 +7,7 @@ require_once('skipif.inc');
--FILE--
<?php
+mysqli_report(MYSQLI_REPORT_OFF);
$mysqli = new mysqli();
@$mysqli->__construct('doesnotexist');
$mysqli->close();
diff --git a/ext/mysqli/tests/mysqli_insert_packet_overflow.phpt b/ext/mysqli/tests/mysqli_insert_packet_overflow.phpt
index 105b3276d3..1285fe1f50 100644
--- a/ext/mysqli/tests/mysqli_insert_packet_overflow.phpt
+++ b/ext/mysqli/tests/mysqli_insert_packet_overflow.phpt
@@ -113,5 +113,12 @@ memory_limit=256M
print "done!";
?>
+--CLEAN--
+<?php
+require_once 'connect.inc';
+$link = new mysqli($host, $user, $passwd, $db, $port, $socket);
+$link->query('DROP TABLE test__mysqli_insert_packet_overflow');
+$link->close();
+?>
--EXPECT--
done!
diff --git a/ext/mysqli/tests/mysqli_kill.phpt b/ext/mysqli/tests/mysqli_kill.phpt
index bec08cc1e1..d2c0fc6df6 100644
--- a/ext/mysqli/tests/mysqli_kill.phpt
+++ b/ext/mysqli/tests/mysqli_kill.phpt
@@ -11,9 +11,8 @@ require_once('skipifconnectfailure.inc');
require('table.inc');
- // Zend will cast the NULL to 0
try {
- mysqli_kill($link, null);
+ mysqli_kill($link, 0);
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
diff --git a/ext/mysqli/tests/mysqli_local_infile_default_off.phpt b/ext/mysqli/tests/mysqli_local_infile_default_off.phpt
index c2e8aa2dc8..65f4012925 100644
--- a/ext/mysqli/tests/mysqli_local_infile_default_off.phpt
+++ b/ext/mysqli/tests/mysqli_local_infile_default_off.phpt
@@ -16,11 +16,11 @@ echo "server: ", $row['Value'], "\n";
mysqli_free_result($res);
mysqli_close($link);
-echo "connector: ", ini_get("mysqli.allow_local_infile"), "\n";
+echo 'connector: ', ini_get('mysqli.allow_local_infile'), ' ', var_export(ini_get('mysqli.local_infile_directory')), "\n";
print "done!\n";
?>
--EXPECTF--
server: %s
-connector: 0
+connector: 0 ''
done!
diff --git a/ext/mysqli/tests/mysqli_local_infile_directory_access_allowed.phpt b/ext/mysqli/tests/mysqli_local_infile_directory_access_allowed.phpt
new file mode 100644
index 0000000000..a9c0c82e99
--- /dev/null
+++ b/ext/mysqli/tests/mysqli_local_infile_directory_access_allowed.phpt
@@ -0,0 +1,80 @@
+--TEST--
+mysqli.local_infile_directory vs access allowed
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifconnectfailure.inc');
+
+if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
+ die("skip Cannot connect to MySQL");
+
+include_once("local_infile_tools.inc");
+if ($msg = check_local_infile_allowed_by_server($link))
+ die(sprintf("skip %s, [%d] %s", $msg, $link->errno, $link->error));
+
+mysqli_close($link);
+
+?>
+--INI--
+open_basedir={PWD}
+mysqli.allow_local_infile=0
+mysqli.local_infile_directory={PWD}/foo
+--FILE--
+<?php
+ require_once("connect.inc");
+
+ if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
+ printf("[001] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
+ }
+
+ if (!$link->query("DROP TABLE IF EXISTS test")) {
+ printf("[002] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ if (!$link->query("CREATE TABLE test (id INT UNSIGNED NOT NULL PRIMARY KEY) ENGINE=" . $engine)) {
+ printf("[003] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ $filepath = str_replace('\\', '/', __DIR__.'/foo/foo.data');
+ if (!$link->query("LOAD DATA LOCAL INFILE '".$filepath."' INTO TABLE test")) {
+ printf("[004] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ $filepath = str_replace('\\', '/', __DIR__.'/foo/bar/bar.data');
+ if (!$link->query("LOAD DATA LOCAL INFILE '".$filepath."' INTO TABLE test")) {
+ printf("[005] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ if ($res = mysqli_query($link, 'SELECT COUNT(id) AS num FROM test')) {
+ $row = mysqli_fetch_assoc($res);
+ mysqli_free_result($res);
+
+ $row_count = $row['num'];
+ $expected_row_count = 6;
+ if ($row_count != $expected_row_count) {
+ printf("[006] %d != %d\n", $row_count, $expected_row_count);
+ }
+ } else {
+ printf("[007] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ $link->close();
+ echo "done";
+?>
+--CLEAN--
+<?php
+require_once('connect.inc');
+
+if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
+ printf("[clean] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
+ $host, $user, $db, $port, $socket);
+}
+
+if (!$link->query($link, 'DROP TABLE IF EXISTS test')) {
+ printf("[clean] Failed to drop old test table: [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+}
+
+$link->close();
+?>
+--EXPECT--
+done
diff --git a/ext/mysqli/tests/mysqli_local_infile_directory_access_denied.phpt b/ext/mysqli/tests/mysqli_local_infile_directory_access_denied.phpt
new file mode 100644
index 0000000000..8f50e03220
--- /dev/null
+++ b/ext/mysqli/tests/mysqli_local_infile_directory_access_denied.phpt
@@ -0,0 +1,65 @@
+--TEST--
+mysqli.local_infile_directory access denied
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifconnectfailure.inc');
+
+if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
+ die("skip Cannot connect to MySQL");
+
+include_once("local_infile_tools.inc");
+if ($msg = check_local_infile_allowed_by_server($link))
+ die(sprintf("skip %s, [%d] %s", $msg, $link->errno, $link->error));
+
+mysqli_close($link);
+
+?>
+--INI--
+open_basedir={PWD}
+mysqli.allow_local_infile=0
+mysqli.local_infile_directory={PWD}/foo/bar
+--FILE--
+<?php
+ require_once("connect.inc");
+
+ if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
+ printf("[001] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
+ }
+
+ if (!$link->query("DROP TABLE IF EXISTS test")) {
+ printf("[002] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ if (!$link->query("CREATE TABLE test (id INT UNSIGNED NOT NULL PRIMARY KEY) ENGINE=" . $engine)) {
+ printf("[003] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ $filepath = str_replace('\\', '/', __DIR__.'/foo/foo.data');
+ if (!$link->query("LOAD DATA LOCAL INFILE '".$filepath."' INTO TABLE test")) {
+ printf("[004] [%d] %s\n", $link->errno, $link->error);
+ } else {
+ printf("[005] bug! should not happen - access denied expected\n");
+ }
+
+ $link->close();
+ echo "done";
+?>
+--CLEAN--
+<?php
+require_once('connect.inc');
+
+if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
+ printf("[clean] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
+ $host, $user, $db, $port, $socket);
+}
+
+if (!$link->query($link, 'DROP TABLE IF EXISTS test')) {
+ printf("[clean] Failed to drop old test table: [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+}
+
+$link->close();
+?>
+--EXPECTF--
+[004] [2068] LOAD DATA LOCAL INFILE %s
+done
diff --git a/ext/mysqli/tests/mysqli_local_infile_directory_vs_open_basedir.phpt b/ext/mysqli/tests/mysqli_local_infile_directory_vs_open_basedir.phpt
new file mode 100644
index 0000000000..a48606ad66
--- /dev/null
+++ b/ext/mysqli/tests/mysqli_local_infile_directory_vs_open_basedir.phpt
@@ -0,0 +1,65 @@
+--TEST--
+mysqli.local_infile_directory vs open_basedir
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifconnectfailure.inc');
+
+if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
+ die("skip Cannot connect to MySQL");
+
+include_once("local_infile_tools.inc");
+if ($msg = check_local_infile_allowed_by_server($link))
+ die(sprintf("skip %s, [%d] %s", $msg, $link->errno, $link->error));
+
+mysqli_close($link);
+
+?>
+--INI--
+open_basedir={PWD}
+mysqli.allow_local_infile=0
+mysqli.local_infile_directory={PWD}/../
+--FILE--
+<?php
+ require_once("connect.inc");
+
+ if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
+ printf("[001] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
+ }
+
+ if (!$link->query("DROP TABLE IF EXISTS test")) {
+ printf("[002] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ if (!$link->query("CREATE TABLE test (id INT UNSIGNED NOT NULL PRIMARY KEY) ENGINE=" . $engine)) {
+ printf("[003] [%d] %s\n", $link->errno, $link->error);
+ }
+
+ $filepath = str_replace('\\', '/', __DIR__.'/foo/foo.data');
+ if (!$link->query("LOAD DATA LOCAL INFILE '".$filepath."' INTO TABLE test")) {
+ printf("[004] [%d] %s\n", $link->errno, $link->error);
+ } else {
+ printf("[005] bug! should not happen - operation not permitted expected\n");
+ }
+
+ echo "done";
+?>
+--CLEAN--
+<?php
+require_once('connect.inc');
+
+if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
+ printf("[clean] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
+ $host, $user, $db, $port, $socket);
+}
+
+if (!$link->query($link, 'DROP TABLE IF EXISTS test')) {
+ printf("[clean] Failed to drop old test table: [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+}
+
+$link->close();
+?>
+--EXPECTF--
+Warning: mysqli_connect(): open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s) in %s on line %d
+[004] [2068] LOAD DATA LOCAL INFILE %s
+done
diff --git a/ext/mysqli/tests/mysqli_pam_sha256.phpt b/ext/mysqli/tests/mysqli_pam_sha256.phpt
index 8866409efe..7f94f202cc 100644
--- a/ext/mysqli/tests/mysqli_pam_sha256.phpt
+++ b/ext/mysqli/tests/mysqli_pam_sha256.phpt
@@ -45,9 +45,8 @@ if (strlen($row['Value']) < 100) {
die(sprintf("skip Server misconfiguration? RSA pub key is suspicious, [%d] %s\n", $link->errno, $link->error));
}
-if (!$link->query("SET @@session.old_passwords=2")) {
- die(sprintf("skip Cannot set @@session.old_passwords=2 [%d] %s", $link->errno, $link->error));
-}
+// Ignore errors because this variable exists only in MySQL 5.6 and 5.7
+$link->query("SET @@session.old_passwords=2");
$link->query('DROP USER shatest');
$link->query("DROP USER shatest@localhost");
@@ -58,8 +57,8 @@ if (!$link->query('CREATE USER shatest@"%" IDENTIFIED WITH sha256_password') ||
die(sprintf("skip CREATE USER failed [%d] %s", $link->errno, $link->error));
}
-if (!$link->query('SET PASSWORD FOR shatest@"%" = PASSWORD("shatest")') ||
- !$link->query('SET PASSWORD FOR shatest@"localhost" = PASSWORD("shatest")')) {
+if (!$link->query('SET PASSWORD FOR shatest@"%" = "shatest"') ||
+ !$link->query('SET PASSWORD FOR shatest@"localhost" = "shatest"')) {
die(sprintf("skip SET PASSWORD failed [%d] %s", $link->errno, $link->error));
}
@@ -75,6 +74,7 @@ if (!$link->query(sprintf("GRANT SELECT ON TABLE %s.test TO shatest@'%%'", $db))
}
$link->close();
+echo "nocache";
?>
--FILE--
<?php
diff --git a/ext/mysqli/tests/mysqli_pam_sha256_public_key_ini.phpt b/ext/mysqli/tests/mysqli_pam_sha256_public_key_ini.phpt
index 86e27fbaff..f67d57ca75 100644
--- a/ext/mysqli/tests/mysqli_pam_sha256_public_key_ini.phpt
+++ b/ext/mysqli/tests/mysqli_pam_sha256_public_key_ini.phpt
@@ -57,10 +57,8 @@ if (strlen($key) != fwrite($fp, $key)) {
die(sprintf("skip Failed to create pub key file"));
}
-
-if (!$link->query("SET @@session.old_passwords=2")) {
- die(sprintf("skip Cannot set @@session.old_passwords=2 [%d] %s", $link->errno, $link->error));
-}
+// Ignore errors because this variable exists only in MySQL 5.6 and 5.7
+$link->query("SET @@session.old_passwords=2");
$link->query('DROP USER shatest');
$link->query("DROP USER shatest@localhost");
@@ -71,8 +69,8 @@ if (!$link->query('CREATE USER shatest@"%" IDENTIFIED WITH sha256_password') ||
die(sprintf("skip CREATE USER failed [%d] %s", $link->errno, $link->error));
}
-if (!$link->query('SET PASSWORD FOR shatest@"%" = PASSWORD("shatest")') ||
- !$link->query('SET PASSWORD FOR shatest@"localhost" = PASSWORD("shatest")')) {
+if (!$link->query('SET PASSWORD FOR shatest@"%" = "shatest"') ||
+ !$link->query('SET PASSWORD FOR shatest@"localhost" = "shatest"')) {
die(sprintf("skip SET PASSWORD failed [%d] %s", $link->errno, $link->error));
}
@@ -88,6 +86,7 @@ if (!$link->query(sprintf("GRANT SELECT ON TABLE %s.test TO shatest@'%%'", $db))
}
$link->close();
+echo "nocache";
?>
--INI--
mysqlnd.sha256_server_public_key="test_sha256_ini"
diff --git a/ext/mysqli/tests/mysqli_pam_sha256_public_key_option.phpt b/ext/mysqli/tests/mysqli_pam_sha256_public_key_option.phpt
index 9b5639ff9a..a76feebf9f 100644
--- a/ext/mysqli/tests/mysqli_pam_sha256_public_key_option.phpt
+++ b/ext/mysqli/tests/mysqli_pam_sha256_public_key_option.phpt
@@ -54,10 +54,8 @@ if (strlen($row['Value']) != fwrite($fp, $row['Value'])) {
die(sprintf("skip Failed to create pub key file"));
}
-
-if (!$link->query("SET @@session.old_passwords=2")) {
- die(sprintf("skip Cannot set @@session.old_passwords=2 [%d] %s", $link->errno, $link->error));
-}
+// Ignore errors because this variable exists only in MySQL 5.6 and 5.7
+$link->query("SET @@session.old_passwords=2");
$link->query('DROP USER shatest');
$link->query("DROP USER shatest@localhost");
@@ -68,8 +66,8 @@ if (!$link->query('CREATE USER shatest@"%" IDENTIFIED WITH sha256_password') ||
die(sprintf("skip CREATE USER failed [%d] %s", $link->errno, $link->error));
}
-if (!$link->query('SET PASSWORD FOR shatest@"%" = PASSWORD("shatest")') ||
- !$link->query('SET PASSWORD FOR shatest@"localhost" = PASSWORD("shatest")')) {
+if (!$link->query('SET PASSWORD FOR shatest@"%" = "shatest"') ||
+ !$link->query('SET PASSWORD FOR shatest@"localhost" = "shatest"')) {
die(sprintf("skip SET PASSWORD failed [%d] %s", $link->errno, $link->error));
}
@@ -85,6 +83,7 @@ if (!$link->query(sprintf("GRANT SELECT ON TABLE %s.test TO shatest@'%%'", $db))
}
$link->close();
+echo "nocache";
?>
--FILE--
<?php
diff --git a/ext/mysqli/tests/mysqli_pam_sha256_public_key_option_invalid.phpt b/ext/mysqli/tests/mysqli_pam_sha256_public_key_option_invalid.phpt
index b664179265..9b2109d754 100644
--- a/ext/mysqli/tests/mysqli_pam_sha256_public_key_option_invalid.phpt
+++ b/ext/mysqli/tests/mysqli_pam_sha256_public_key_option_invalid.phpt
@@ -54,10 +54,8 @@ if (strlen($row['Value']) != fwrite($fp, $row['Value'])) {
die(sprintf("skip Failed to create pub key file"));
}
-
-if (!$link->query("SET @@session.old_passwords=2")) {
- die(sprintf("skip Cannot set @@session.old_passwords=2 [%d] %s", $link->errno, $link->error));
-}
+// Ignore errors because this variable exists only in MySQL 5.6 and 5.7
+$link->query("SET @@session.old_passwords=2");
$link->query('DROP USER shatest');
$link->query("DROP USER shatest@localhost");
@@ -68,8 +66,8 @@ if (!$link->query('CREATE USER shatest@"%" IDENTIFIED WITH sha256_password') ||
die(sprintf("skip CREATE USER failed [%d] %s", $link->errno, $link->error));
}
-if (!$link->query('SET PASSWORD FOR shatest@"%" = PASSWORD("shatest")') ||
- !$link->query('SET PASSWORD FOR shatest@"localhost" = PASSWORD("shatest")')) {
+if (!$link->query('SET PASSWORD FOR shatest@"%" = "shatest"') ||
+ !$link->query('SET PASSWORD FOR shatest@"localhost" = "shatest"')) {
die(sprintf("skip SET PASSWORD failed [%d] %s", $link->errno, $link->error));
}
@@ -85,6 +83,7 @@ if (!$link->query(sprintf("GRANT SELECT ON TABLE %s.test TO shatest@'%%'", $db))
}
$link->close();
+echo "nocache";
?>
--FILE--
<?php
diff --git a/ext/mysqli/tests/mysqli_phpinfo.phpt b/ext/mysqli/tests/mysqli_phpinfo.phpt
index fd0edd4463..ea78a6bb0c 100644
--- a/ext/mysqli/tests/mysqli_phpinfo.phpt
+++ b/ext/mysqli/tests/mysqli_phpinfo.phpt
@@ -46,7 +46,7 @@ require_once('skipifconnectfailure.inc');
if ($IS_MYSQLND) {
$expected = array(
'size',
- 'mysqli.allow_local_infile',
+ 'mysqli.allow_local_infile', 'mysqli.local_infile_directory',
'mysqli.allow_persistent', 'mysqli.max_persistent'
);
foreach ($expected as $k => $entry)
diff --git a/ext/mysqli/tests/mysqli_query_unicode.phpt b/ext/mysqli/tests/mysqli_query_unicode.phpt
index b62418508f..6a5e1be912 100644
--- a/ext/mysqli/tests/mysqli_query_unicode.phpt
+++ b/ext/mysqli/tests/mysqli_query_unicode.phpt
@@ -82,6 +82,14 @@ mysqli_close($link);
print "done!";
?>
+--CLEAN--
+<?php
+require_once 'connect.inc';
+$link = new mysqli($host, $user, $passwd, $db, $port, $socket);
+$link->query('DROP PROCEDURE IF EXISTS процедурка');
+$link->query('DROP FUNCTION IF EXISTS функцийка');
+$link->close();
+?>
--EXPECTF--
array(1) {
["правилен"]=>
diff --git a/ext/mysqli/tests/mysqli_real_connect.phpt b/ext/mysqli/tests/mysqli_real_connect.phpt
index f580037844..5a16863780 100644
--- a/ext/mysqli/tests/mysqli_real_connect.phpt
+++ b/ext/mysqli/tests/mysqli_real_connect.phpt
@@ -154,6 +154,8 @@ mysqli.allow_local_infile=1
--EXPECTF--
Warning: mysqli_real_connect(): (%s/%d): Access denied for user '%s'@'%s' (using password: YES) in %s on line %d
object(mysqli)#%d (%d) {
+ ["client_info"]=>
+ string(%d) "%s"
["client_version"]=>
int(%d)
["connect_errno"]=>
diff --git a/ext/mysqli/tests/mysqli_result_references.phpt b/ext/mysqli/tests/mysqli_result_references.phpt
index 2e97cd45d7..be90b45794 100644
--- a/ext/mysqli/tests/mysqli_result_references.phpt
+++ b/ext/mysqli/tests/mysqli_result_references.phpt
@@ -5,6 +5,8 @@ References to result sets
require_once('skipif.inc');
require_once('skipifconnectfailure.inc');
?>
+--INI--
+opcache.enable=0
--FILE--
<?php
require_once('connect.inc');
@@ -85,60 +87,78 @@ array(7) refcount(2){
[0]=>
array(2) refcount(1){
["id"]=>
- int(1)
+ reference refcount(1) {
+ int(1)
+ }
["label"]=>
string(1) "a" refcount(%d)
}
[1]=>
array(2) refcount(1){
["id"]=>
- int(2)
+ reference refcount(1) {
+ int(2)
+ }
["label"]=>
string(1) "b" refcount(%d)
}
[2]=>
array(2) refcount(1){
["id"]=>
- int(1)
+ reference refcount(1) {
+ int(1)
+ }
["label"]=>
string(1) "a" refcount(%d)
}
[3]=>
array(2) refcount(1){
["id"]=>
- int(2)
+ reference refcount(1) {
+ int(2)
+ }
["label"]=>
string(1) "b" refcount(%d)
}
[4]=>
array(3) refcount(1){
["id"]=>
- &int(3)
+ reference refcount(2) {
+ int(3)
+ }
["label"]=>
string(1) "a" refcount(%d)
["id2"]=>
- &int(3)
+ reference refcount(2) {
+ int(3)
+ }
}
[5]=>
array(3) refcount(1){
["id"]=>
- &int(4)
+ reference refcount(2) {
+ int(4)
+ }
["label"]=>
string(1) "b" refcount(%d)
["id2"]=>
- &int(4)
+ reference refcount(2) {
+ int(4)
+ }
}
[6]=>
- &object(mysqli_result)#%d (0) refcount(%d){
+ reference refcount(2) {
+ object(mysqli_result)#2 (0) refcount(1){
+ }
}
}
array(1) refcount(2){
[0]=>
array(2) refcount(1){
["id"]=>
- string(1) "1" refcount(%d)
+ string(1) "1" interned
["label"]=>
- string(1) "a" refcount(%d)
+ string(1) "a" interned
}
}
done!
diff --git a/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt b/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt
index 3c44f8a309..5f5e352596 100644
--- a/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt
+++ b/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt
@@ -55,57 +55,71 @@ array(1) refcount(%d){
[0]=>
array(4) refcount(%d){
["row_ref"]=>
- &NULL
+ reference refcount(2) {
+ NULL
+ }
["row_copy"]=>
array(2) refcount(1){
["id"]=>
- string(1) "1" refcount(%d)
+ string(1) "1" interned
["label"]=>
- string(1) "a" refcount(%d)
+ string(1) "a" interned
}
["id_ref"]=>
- string(1) "1" refcount(%d)
+ reference refcount(1) {
+ string(1) "1" interned
+ }
["id_copy"]=>
- string(1) "1" refcount(%d)
+ string(1) "1" interned
}
}
array(2) refcount(%d){
[0]=>
array(4) refcount(%d){
["row_ref"]=>
- &NULL
+ reference refcount(2) {
+ NULL
+ }
["row_copy"]=>
array(2) refcount(%d){
["id"]=>
- string(1) "1" refcount(%d)
+ string(1) "1" interned
["label"]=>
- string(1) "a" refcount(%d)
+ string(1) "a" interned
}
["id_ref"]=>
- string(1) "1" refcount(%d)
+ reference refcount(1) {
+ string(1) "1" interned
+ }
["id_copy"]=>
- string(1) "1" refcount(%d)
+ string(1) "1" interned
}
[1]=>
array(5) refcount(%d){
["row_ref"]=>
- &array(2) refcount(%d){
- ["id"]=>
- &string(1) "2" refcount(%d)
- ["label"]=>
- string(1) "b" refcount(%d)
+ reference refcount(2) {
+ array(2) refcount(1){
+ ["id"]=>
+ reference refcount(2) {
+ string(1) "2" interned
+ }
+ ["label"]=>
+ string(1) "b" interned
+ }
}
["row_copy"]=>
array(2) refcount(%d){
["id"]=>
- string(1) "2" refcount(%d)
+ string(1) "2" interned
["label"]=>
- string(1) "b" refcount(%d)
+ string(1) "b" interned
}
["id_ref"]=>
- &string(1) "2" refcount(%d)
+ reference refcount(2) {
+ string(1) "2" interned
+ }
["id_copy"]=>
- string(1) "2" refcount(%d)
+ string(1) "2" interned
["id_copy_mod"]=>
int(2)
}
diff --git a/ext/mysqli/tests/mysqli_stmt_attr_set.phpt b/ext/mysqli/tests/mysqli_stmt_attr_set.phpt
index 0edbc578e8..634faa01c3 100644
--- a/ext/mysqli/tests/mysqli_stmt_attr_set.phpt
+++ b/ext/mysqli/tests/mysqli_stmt_attr_set.phpt
@@ -61,7 +61,7 @@ require_once("connect.inc");
$res->close();
$stmt->close();
- // expecting max_length to _be_ set
+ // MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH is no longer supported, expect no change in behavior.
$stmt = mysqli_stmt_init($link);
$stmt->prepare("SELECT label FROM test");
var_dump($stmt->attr_set(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH, 1));
@@ -75,8 +75,8 @@ require_once("connect.inc");
$max_lengths = array();
foreach ($fields as $k => $meta) {
$max_lengths[$meta->name] = $meta->max_length;
- if ($meta->max_length === 0)
- printf("[008] max_length should be set (!= 0), got %s for field %s\n", $meta->max_length, $meta->name);
+ if ($meta->max_length !== 0)
+ printf("[008] max_length should be not set (= 0), got %s for field %s\n", $meta->max_length, $meta->name);
}
$res->close();
$stmt->close();
diff --git a/ext/mysqli/tests/mysqli_stmt_bind_result_references.phpt b/ext/mysqli/tests/mysqli_stmt_bind_result_references.phpt
index 8ac3a049a1..91a8c0a556 100644
--- a/ext/mysqli/tests/mysqli_stmt_bind_result_references.phpt
+++ b/ext/mysqli/tests/mysqli_stmt_bind_result_references.phpt
@@ -291,23 +291,23 @@ string(1) "a"
reference, object, forward declaration...
int(1)
object(bar)#%d (2) {
- ["bar"]=>
- &string(1) "a"
["foo"]=>
&string(1) "a"
+ ["bar"]=>
+ &string(1) "a"
}
string(1) "a"
references, object, private...
int(1)
string(1) "a"
object(mega_bar)#5 (4) {
+ ["foo"]=>
+ &string(1) "a"
+ ["bar"]=>
+ &string(1) "a"
[%s]=>
&int(1)
["id_ref"]=>
&int(1)
- ["bar"]=>
- &string(1) "a"
- ["foo"]=>
- &string(1) "a"
}
done!
diff --git a/ext/mysqli/tests/mysqli_stmt_get_result_non_select.phpt b/ext/mysqli/tests/mysqli_stmt_get_result_non_select.phpt
index f2428aeb92..9a0e52d5cb 100644
--- a/ext/mysqli/tests/mysqli_stmt_get_result_non_select.phpt
+++ b/ext/mysqli/tests/mysqli_stmt_get_result_non_select.phpt
@@ -35,12 +35,12 @@ if (!function_exists('mysqli_stmt_get_result'))
printf("[004] It is very unlikely that SHOW ENGINES returns no data, check manually\n");
} else {
$found = false;
- foreach ($engines as $k => $engine)
- foreach ($engine as $k => $v)
- if (stristr($v, 'MyISAM')) {
- $found = true;
- break;
- }
+ foreach ($engines as $engine) {
+ if (stristr($engine[0], 'MyISAM')) {
+ $found = true;
+ break;
+ }
+ }
if (!$found)
printf("[005] It is very unlikely that SHOW ENGINES does not show MyISAM, check manually\n");
}
diff --git a/ext/mysqli/tests/mysqli_stmt_multires.phpt b/ext/mysqli/tests/mysqli_stmt_multires.phpt
index 73af79e2b1..07abac4dcc 100644
--- a/ext/mysqli/tests/mysqli_stmt_multires.phpt
+++ b/ext/mysqli/tests/mysqli_stmt_multires.phpt
@@ -94,10 +94,10 @@ require_once('skipifconnectfailure.inc');
?>
--CLEAN--
<?php
- require_once("connect.inc");
- if (!$link->query('DROP PROCEDURE IF EXISTS p123')) {
- printf("[001] [%d] %s\n", $link->error, $link->errno);
- }
+require_once 'connect.inc';
+$link = new mysqli($host, $user, $passwd, $db, $port, $socket);
+$link->query('DROP PROCEDURE IF EXISTS p123');
+$link->close();
?>
--EXPECT--
string(4) "pre:"
diff --git a/ext/mysqli/tests/ps_cursor_multiple_result_sets.phpt b/ext/mysqli/tests/ps_cursor_multiple_result_sets.phpt
index ed15d10e4a..c4d80498b1 100644
--- a/ext/mysqli/tests/ps_cursor_multiple_result_sets.phpt
+++ b/ext/mysqli/tests/ps_cursor_multiple_result_sets.phpt
@@ -71,6 +71,13 @@ while ($row = $result->fetch_assoc()) {
$stmt->next_result();
?>
+--CLEAN--
+<?php
+require_once 'connect.inc';
+$link = new mysqli($host, $user, $passwd, $db, $port, $socket);
+$link->query('DROP PROCEDURE IF EXISTS testPs');
+$link->close();
+?>
--EXPECT--
use_result:
int(1)
diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h
index dc9b1e9732..09aee0cc81 100644
--- a/ext/mysqlnd/mysqlnd.h
+++ b/ext/mysqlnd/mysqlnd.h
@@ -24,7 +24,6 @@
#define MYSQLND_PLUGIN_API_VERSION 2
-#define MYSQLND_STRING_TO_INT_CONVERSION
/*
This force mysqlnd to do a single (or more depending on amount of data)
non-blocking read() calls before sending a command to the server. Useful
@@ -81,7 +80,7 @@ PHPAPI const MYSQLND_CHARSET * mysqlnd_find_charset_name(const char * const char
#define mysqlnd_connect(conn, host, user, pass, pass_len, db, db_len, port, socket, mysql_flags, client_api_flags) \
mysqlnd_connection_connect((conn), (host), (user), (pass), (pass_len), (db), (db_len), (port), (socket), (mysql_flags), (client_api_flags))
-PHPAPI MYSQLND * mysqlnd_connection_init(const size_t client_flags, const zend_bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory);
+PHPAPI MYSQLND * mysqlnd_connection_init(const size_t client_flags, const bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory);
PHPAPI MYSQLND * mysqlnd_connection_connect(MYSQLND * conn,
const char * const host,
const char * const user,
@@ -99,10 +98,10 @@ PHPAPI MYSQLND * mysqlnd_connection_connect(MYSQLND * conn,
PHPAPI void mysqlnd_debug(const char *mode);
/* Query */
-#define mysqlnd_fetch_into(result, flags, ret_val, ext) (result)->m.fetch_into((result), (flags), (ret_val), (ext) ZEND_FILE_LINE_CC)
+#define mysqlnd_fetch_into(result, flags, ret_val) (result)->m.fetch_into((result), (flags), (ret_val) ZEND_FILE_LINE_CC)
#define mysqlnd_fetch_row_c(result) (result)->m.fetch_row_c((result))
-#define mysqlnd_fetch_all(result, flags, return_value) (result)->m.fetch_all((result), (flags), (return_value) ZEND_FILE_LINE_CC)
-#define mysqlnd_result_fetch_field_data(res,offset,ret) (res)->m.fetch_field_data((res), (offset), (ret))
+#define mysqlnd_fetch_row_zval(result, row_ptr, fetched) \
+ (result)->m.fetch_row((result), (row_ptr), 0, (fetched))
#define mysqlnd_get_connection_stats(conn, values) ((conn)->data)->m->get_statistics((conn)->data, (values) ZEND_FILE_LINE_CC)
#define mysqlnd_get_client_stats(values) _mysqlnd_get_client_stats(mysqlnd_global_stats, (values) ZEND_FILE_LINE_CC)
@@ -114,9 +113,8 @@ PHPAPI void mysqlnd_debug(const char *mode);
PHPAPI enum_func_status mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQLND ***dont_poll, long sec, long usec, int * desc_num);
-#define mysqlnd_use_result(conn) ((conn)->data)->m->use_result((conn)->data, 0)
-#define mysqlnd_store_result(conn) ((conn)->data)->m->store_result((conn)->data, MYSQLND_STORE_NO_COPY)
-#define mysqlnd_store_result_ofs(conn) ((conn)->data)->m->store_result((conn)->data, MYSQLND_STORE_COPY)
+#define mysqlnd_use_result(conn) ((conn)->data)->m->use_result((conn)->data)
+#define mysqlnd_store_result(conn) ((conn)->data)->m->store_result((conn)->data)
#define mysqlnd_next_result(conn) ((conn)->data)->m->next_result((conn)->data)
#define mysqlnd_more_results(conn) ((conn)->data)->m->more_results((conn)->data)
#define mysqlnd_free_result(r,e_or_i) ((MYSQLND_RES*)r)->m.free_result(((MYSQLND_RES*)(r)), (e_or_i))
@@ -309,16 +307,9 @@ ZEND_BEGIN_MODULE_GLOBALS(mysqlnd)
zend_long log_mask;
zend_long net_read_timeout;
zend_long mempool_default_size;
- zend_long debug_emalloc_fail_threshold;
- zend_long debug_ecalloc_fail_threshold;
- zend_long debug_erealloc_fail_threshold;
- zend_long debug_malloc_fail_threshold;
- zend_long debug_calloc_fail_threshold;
- zend_long debug_realloc_fail_threshold;
char * sha256_server_public_key;
- zend_bool fetch_data_copy;
- zend_bool collect_statistics;
- zend_bool collect_memory_statistics;
+ bool collect_statistics;
+ bool collect_memory_statistics;
ZEND_END_MODULE_GLOBALS(mysqlnd)
PHPAPI ZEND_EXTERN_MODULE_GLOBALS(mysqlnd)
diff --git a/ext/mysqlnd/mysqlnd_alloc.c b/ext/mysqlnd/mysqlnd_alloc.c
index 5beb3707cb..ad32ba666c 100644
--- a/ext/mysqlnd/mysqlnd_alloc.c
+++ b/ext/mysqlnd/mysqlnd_alloc.c
@@ -32,10 +32,6 @@ static const char mysqlnd_erealloc_name[] = "_mysqlnd_erealloc";
static const char mysqlnd_perealloc_name[] = "_mysqlnd_perealloc";
static const char mysqlnd_efree_name[] = "_mysqlnd_efree";
static const char mysqlnd_pefree_name[] = "_mysqlnd_pefree";
-static const char mysqlnd_malloc_name[] = "_mysqlnd_malloc";
-static const char mysqlnd_calloc_name[] = "_mysqlnd_calloc";
-static const char mysqlnd_realloc_name[] = "_mysqlnd_realloc";
-static const char mysqlnd_free_name[] = "_mysqlnd_free";
static const char mysqlnd_pememdup_name[] = "_mysqlnd_pememdup";
static const char mysqlnd_pestrndup_name[] = "_mysqlnd_pestrndup";
static const char mysqlnd_pestrdup_name[] = "_mysqlnd_pestrdup";
@@ -50,10 +46,6 @@ PHPAPI const char * mysqlnd_debug_std_no_trace_funcs[] =
mysqlnd_pecalloc_name,
mysqlnd_pefree_name,
mysqlnd_perealloc_name,
- mysqlnd_malloc_name,
- mysqlnd_calloc_name,
- mysqlnd_realloc_name,
- mysqlnd_free_name,
mysqlnd_pestrndup_name,
mysqlnd_read_header_name,
mysqlnd_read_body_name,
@@ -77,30 +69,13 @@ PHPAPI const char * mysqlnd_debug_std_no_trace_funcs[] =
static void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D)
{
void *ret;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
-#if PHP_DEBUG
- zend_long * threshold = &MYSQLND_G(debug_emalloc_fail_threshold);
- TRACE_ALLOC_ENTER(mysqlnd_emalloc_name);
-
- {
- char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
- TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
- }
-
- if (*threshold == 0) {
- ret = NULL;
- } else {
- ret = emalloc_rel(REAL_SIZE(size));
- --*threshold;
- }
-#else
+ bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
TRACE_ALLOC_ENTER(mysqlnd_emalloc_name);
ret = emalloc_rel(REAL_SIZE(size));
-#endif
TRACE_ALLOC_INF_FMT("size=%lu ptr=%p", size, ret);
- if (ret && collect_memory_statistics) {
+ if (collect_memory_statistics) {
*(size_t *) ret = size;
MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_EMALLOC_COUNT, 1, STAT_MEM_EMALLOC_AMOUNT, size);
}
@@ -110,33 +85,16 @@ static void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D)
/* {{{ _mysqlnd_pemalloc */
-static void * _mysqlnd_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D)
+static void * _mysqlnd_pemalloc(size_t size, bool persistent MYSQLND_MEM_D)
{
void *ret;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
-#if PHP_DEBUG
- zend_long * threshold = persistent? &MYSQLND_G(debug_malloc_fail_threshold):&MYSQLND_G(debug_emalloc_fail_threshold);
- TRACE_ALLOC_ENTER(mysqlnd_pemalloc_name);
-
- {
- char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
- TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
- }
-
- if (*threshold == 0) {
- ret = NULL;
- } else {
- ret = pemalloc_rel(REAL_SIZE(size), persistent);
- --*threshold;
- }
-#else
+ bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
TRACE_ALLOC_ENTER(mysqlnd_pemalloc_name);
ret = pemalloc_rel(REAL_SIZE(size), persistent);
-#endif
TRACE_ALLOC_INF_FMT("size=%lu ptr=%p persistent=%u", size, ret, persistent);
- if (ret && collect_memory_statistics) {
+ if (collect_memory_statistics) {
enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_MALLOC_COUNT:STAT_MEM_EMALLOC_COUNT;
enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_MALLOC_AMOUNT:STAT_MEM_EMALLOC_AMOUNT;
*(size_t *) ret = size;
@@ -152,32 +110,14 @@ static void * _mysqlnd_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D)
static void * _mysqlnd_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
{
void *ret;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
-#if PHP_DEBUG
- zend_long * threshold = &MYSQLND_G(debug_ecalloc_fail_threshold);
- TRACE_ALLOC_ENTER(mysqlnd_ecalloc_name);
-
- {
- char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
- TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
- }
- TRACE_ALLOC_INF_FMT("before: %lu", zend_memory_usage(FALSE));
-
- if (*threshold == 0) {
- ret = NULL;
- } else {
- ret = ecalloc_rel(nmemb, REAL_SIZE(size));
- --*threshold;
- }
-#else
+ bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
TRACE_ALLOC_ENTER(mysqlnd_ecalloc_name);
TRACE_ALLOC_INF_FMT("before: %lu", zend_memory_usage(FALSE));
ret = ecalloc_rel(nmemb, REAL_SIZE(size));
-#endif
TRACE_ALLOC_INF_FMT("after : %lu", zend_memory_usage(FALSE));
TRACE_ALLOC_INF_FMT("size=%lu ptr=%p", size, ret);
- if (ret && collect_memory_statistics) {
+ if (collect_memory_statistics) {
*(size_t *) ret = size;
MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_ECALLOC_COUNT, 1, STAT_MEM_ECALLOC_AMOUNT, size);
}
@@ -187,32 +127,16 @@ static void * _mysqlnd_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
/* {{{ _mysqlnd_pecalloc */
-static void * _mysqlnd_pecalloc(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D)
+static void * _mysqlnd_pecalloc(unsigned int nmemb, size_t size, bool persistent MYSQLND_MEM_D)
{
void *ret;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
-#if PHP_DEBUG
- zend_long * threshold = persistent? &MYSQLND_G(debug_calloc_fail_threshold):&MYSQLND_G(debug_ecalloc_fail_threshold);
- TRACE_ALLOC_ENTER(mysqlnd_pecalloc_name);
- {
- char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
- TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
- }
-
- if (*threshold == 0) {
- ret = NULL;
- } else {
- ret = pecalloc_rel(nmemb, REAL_SIZE(size), persistent);
- --*threshold;
- }
-#else
+ bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
TRACE_ALLOC_ENTER(mysqlnd_pecalloc_name);
ret = pecalloc_rel(nmemb, REAL_SIZE(size), persistent);
-#endif
TRACE_ALLOC_INF_FMT("size=%lu ptr=%p", size, ret);
- if (ret && collect_memory_statistics) {
+ if (collect_memory_statistics) {
enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_CALLOC_COUNT:STAT_MEM_ECALLOC_COUNT;
enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_CALLOC_AMOUNT:STAT_MEM_ECALLOC_AMOUNT;
*(size_t *) ret = size;
@@ -228,32 +152,14 @@ static void * _mysqlnd_pecalloc(unsigned int nmemb, size_t size, zend_bool persi
static void * _mysqlnd_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D)
{
void *ret;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
+ bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
size_t old_size = collect_memory_statistics && ptr? *(size_t *) (((char*)ptr) - sizeof(size_t)) : 0;
-#if PHP_DEBUG
- zend_long * threshold = &MYSQLND_G(debug_erealloc_fail_threshold);
- TRACE_ALLOC_ENTER(mysqlnd_erealloc_name);
-
- {
- char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
- TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
- }
- TRACE_ALLOC_INF_FMT("ptr=%p old_size=%lu, new_size=%lu", ptr, old_size, new_size);
-
- if (*threshold == 0) {
- ret = NULL;
- } else {
- ret = erealloc_rel(REAL_PTR(ptr), REAL_SIZE(new_size));
- --*threshold;
- }
-#else
TRACE_ALLOC_ENTER(mysqlnd_erealloc_name);
TRACE_ALLOC_INF_FMT("ptr=%p old_size=%lu, new_size=%lu", ptr, old_size, new_size);
ret = erealloc_rel(REAL_PTR(ptr), REAL_SIZE(new_size));
-#endif
TRACE_ALLOC_INF_FMT("new_ptr=%p", (char*)ret);
- if (ret && collect_memory_statistics) {
+ if (collect_memory_statistics) {
*(size_t *) ret = new_size;
MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_EREALLOC_COUNT, 1, STAT_MEM_EREALLOC_AMOUNT, new_size);
}
@@ -263,36 +169,18 @@ static void * _mysqlnd_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D)
/* {{{ _mysqlnd_perealloc */
-static void * _mysqlnd_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D)
+static void * _mysqlnd_perealloc(void *ptr, size_t new_size, bool persistent MYSQLND_MEM_D)
{
void *ret;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
+ bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
size_t old_size = collect_memory_statistics && ptr? *(size_t *) (((char*)ptr) - sizeof(size_t)) : 0;
-#if PHP_DEBUG
- zend_long * threshold = persistent? &MYSQLND_G(debug_realloc_fail_threshold):&MYSQLND_G(debug_erealloc_fail_threshold);
- TRACE_ALLOC_ENTER(mysqlnd_perealloc_name);
-
- {
- char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
- TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
- }
- TRACE_ALLOC_INF_FMT("ptr=%p old_size=%lu new_size=%lu persistent=%u", ptr, old_size, new_size, persistent);
-
- if (*threshold == 0) {
- ret = NULL;
- } else {
- ret = perealloc_rel(REAL_PTR(ptr), REAL_SIZE(new_size), persistent);
- --*threshold;
- }
-#else
TRACE_ALLOC_ENTER(mysqlnd_perealloc_name);
TRACE_ALLOC_INF_FMT("ptr=%p old_size=%lu new_size=%lu persistent=%u", ptr, old_size, new_size, persistent);
ret = perealloc_rel(REAL_PTR(ptr), REAL_SIZE(new_size), persistent);
-#endif
TRACE_ALLOC_INF_FMT("new_ptr=%p", (char*)ret);
- if (ret && collect_memory_statistics) {
+ if (collect_memory_statistics) {
enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_REALLOC_COUNT:STAT_MEM_EREALLOC_COUNT;
enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_REALLOC_AMOUNT:STAT_MEM_EREALLOC_AMOUNT;
*(size_t *) ret = new_size;
@@ -307,7 +195,7 @@ static void * _mysqlnd_perealloc(void *ptr, size_t new_size, zend_bool persisten
static void _mysqlnd_efree(void *ptr MYSQLND_MEM_D)
{
size_t free_amount = 0;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
+ bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
TRACE_ALLOC_ENTER(mysqlnd_efree_name);
#if PHP_DEBUG
@@ -335,10 +223,10 @@ static void _mysqlnd_efree(void *ptr MYSQLND_MEM_D)
/* {{{ _mysqlnd_pefree */
-static void _mysqlnd_pefree(void *ptr, zend_bool persistent MYSQLND_MEM_D)
+static void _mysqlnd_pefree(void *ptr, bool persistent MYSQLND_MEM_D)
{
size_t free_amount = 0;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
+ bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
TRACE_ALLOC_ENTER(mysqlnd_pefree_name);
#if PHP_DEBUG
@@ -366,152 +254,11 @@ static void _mysqlnd_pefree(void *ptr, zend_bool persistent MYSQLND_MEM_D)
/* }}} */
-/* {{{ _mysqlnd_malloc */
-static void * _mysqlnd_malloc(size_t size MYSQLND_MEM_D)
-{
- void *ret;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
-#if PHP_DEBUG
- zend_long * threshold = &MYSQLND_G(debug_malloc_fail_threshold);
- TRACE_ALLOC_ENTER(mysqlnd_malloc_name);
-
- {
- char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
- TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
- }
-
- if (*threshold == 0) {
- ret = NULL;
- } else {
- ret = malloc(REAL_SIZE(size));
- --*threshold;
- }
-#else
- TRACE_ALLOC_ENTER(mysqlnd_malloc_name);
- ret = malloc(REAL_SIZE(size));
-#endif
-
- TRACE_ALLOC_INF_FMT("size=%lu ptr=%p", size, ret);
- if (ret && collect_memory_statistics) {
- *(size_t *) ret = size;
- MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_MALLOC_COUNT, 1, STAT_MEM_MALLOC_AMOUNT, size);
- }
- TRACE_ALLOC_RETURN(FAKE_PTR(ret));
-}
-/* }}} */
-
-
-/* {{{ _mysqlnd_calloc */
-static void * _mysqlnd_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
-{
- void *ret;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
-#if PHP_DEBUG
- zend_long * threshold = &MYSQLND_G(debug_calloc_fail_threshold);
- TRACE_ALLOC_ENTER(mysqlnd_calloc_name);
-
- {
- char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
- TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
- }
-
- if (*threshold == 0) {
- ret = NULL;
- } else {
- ret = calloc(nmemb, REAL_SIZE(size));
- --*threshold;
- }
-#else
- TRACE_ALLOC_ENTER(mysqlnd_calloc_name);
- ret = calloc(nmemb, REAL_SIZE(size));
-#endif
-
- TRACE_ALLOC_INF_FMT("size=%lu ptr=%p", size, ret);
- if (ret && collect_memory_statistics) {
- *(size_t *) ret = size;
- MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_CALLOC_COUNT, 1, STAT_MEM_CALLOC_AMOUNT, size);
- }
- TRACE_ALLOC_RETURN(FAKE_PTR(ret));
-}
-/* }}} */
-
-
-/* {{{ _mysqlnd_realloc */
-static void * _mysqlnd_realloc(void *ptr, size_t new_size MYSQLND_MEM_D)
-{
- void *ret;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
-#if PHP_DEBUG
- zend_long * threshold = &MYSQLND_G(debug_realloc_fail_threshold);
- TRACE_ALLOC_ENTER(mysqlnd_realloc_name);
-
- {
- char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
- TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
- }
- TRACE_ALLOC_INF_FMT("ptr=%p new_size=%lu ", new_size, ptr);
- TRACE_ALLOC_INF_FMT("before: %lu", zend_memory_usage(TRUE));
-
- if (*threshold == 0) {
- ret = NULL;
- } else {
- ret = realloc(REAL_PTR(ptr), REAL_SIZE(new_size));
- --*threshold;
- }
-#else
- TRACE_ALLOC_ENTER(mysqlnd_realloc_name);
- TRACE_ALLOC_INF_FMT("ptr=%p new_size=%lu ", new_size, ptr);
- TRACE_ALLOC_INF_FMT("before: %lu", zend_memory_usage(TRUE));
- ret = realloc(REAL_PTR(ptr), REAL_SIZE(new_size));
-#endif
-
- TRACE_ALLOC_INF_FMT("new_ptr=%p", (char*)ret);
-
- if (ret && collect_memory_statistics) {
- *(size_t *) ret = new_size;
- MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_REALLOC_COUNT, 1, STAT_MEM_REALLOC_AMOUNT, new_size);
- }
- TRACE_ALLOC_RETURN(FAKE_PTR(ret));
-}
-/* }}} */
-
-
-/* {{{ _mysqlnd_free */
-static void _mysqlnd_free(void *ptr MYSQLND_MEM_D)
-{
- size_t free_amount = 0;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
- TRACE_ALLOC_ENTER(mysqlnd_free_name);
-
-#if PHP_DEBUG
- {
- char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR);
- TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno);
- }
-#endif
- TRACE_ALLOC_INF_FMT("ptr=%p", ptr);
-
- if (ptr) {
- if (collect_memory_statistics) {
- free_amount = *(size_t *)(((char*)ptr) - sizeof(size_t));
- TRACE_ALLOC_INF_FMT("ptr=%p size=%u", ((char*)ptr) - sizeof(size_t), (unsigned int) free_amount);
- }
- free(REAL_PTR(ptr));
- }
-
- if (collect_memory_statistics) {
- MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_FREE_COUNT, 1, STAT_MEM_FREE_AMOUNT, free_amount);
- }
- TRACE_ALLOC_VOID_RETURN;
-}
-/* }}} */
-
-
/* {{{ _mysqlnd_pememdup */
-static char * _mysqlnd_pememdup(const char * const ptr, size_t length, zend_bool persistent MYSQLND_MEM_D)
+static char * _mysqlnd_pememdup(const char * const ptr, size_t length, bool persistent MYSQLND_MEM_D)
{
char * ret;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
+ bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
TRACE_ALLOC_ENTER(mysqlnd_pememdup_name);
#if PHP_DEBUG
@@ -539,10 +286,10 @@ static char * _mysqlnd_pememdup(const char * const ptr, size_t length, zend_bool
/* {{{ _mysqlnd_pestrndup */
-static char * _mysqlnd_pestrndup(const char * const ptr, size_t length, zend_bool persistent MYSQLND_MEM_D)
+static char * _mysqlnd_pestrndup(const char * const ptr, size_t length, bool persistent MYSQLND_MEM_D)
{
char * ret;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
+ bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
TRACE_ALLOC_ENTER(mysqlnd_pestrndup_name);
#if PHP_DEBUG
@@ -580,12 +327,12 @@ static char * _mysqlnd_pestrndup(const char * const ptr, size_t length, zend_boo
/* {{{ _mysqlnd_pestrdup */
-static char * _mysqlnd_pestrdup(const char * const ptr, zend_bool persistent MYSQLND_MEM_D)
+static char * _mysqlnd_pestrdup(const char * const ptr, bool persistent MYSQLND_MEM_D)
{
char * ret;
smart_str tmp_str = {0, 0};
const char * p = ptr;
- zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
+ bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics);
TRACE_ALLOC_ENTER(mysqlnd_pestrdup_name);
#if PHP_DEBUG
{
@@ -656,7 +403,7 @@ static void * mysqlnd_zend_mm_emalloc(size_t size MYSQLND_MEM_D)
/* {{{ mysqlnd_zend_mm_pemalloc */
-static void * mysqlnd_zend_mm_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D)
+static void * mysqlnd_zend_mm_pemalloc(size_t size, bool persistent MYSQLND_MEM_D)
{
return pemalloc_rel(size, persistent);
}
@@ -672,7 +419,7 @@ static void * mysqlnd_zend_mm_ecalloc(unsigned int nmemb, size_t size MYSQLND_ME
/* {{{ mysqlnd_zend_mm_pecalloc */
-static void * mysqlnd_zend_mm_pecalloc(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D)
+static void * mysqlnd_zend_mm_pecalloc(unsigned int nmemb, size_t size, bool persistent MYSQLND_MEM_D)
{
return pecalloc_rel(nmemb, size, persistent);
}
@@ -688,7 +435,7 @@ static void * mysqlnd_zend_mm_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D)
/* {{{ mysqlnd_zend_mm_perealloc */
-static void * mysqlnd_zend_mm_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D)
+static void * mysqlnd_zend_mm_perealloc(void *ptr, size_t new_size, bool persistent MYSQLND_MEM_D)
{
return perealloc_rel(ptr, new_size, persistent);
}
@@ -704,47 +451,15 @@ static void mysqlnd_zend_mm_efree(void * ptr MYSQLND_MEM_D)
/* {{{ mysqlnd_zend_mm_pefree */
-static void mysqlnd_zend_mm_pefree(void * ptr, zend_bool persistent MYSQLND_MEM_D)
+static void mysqlnd_zend_mm_pefree(void * ptr, bool persistent MYSQLND_MEM_D)
{
pefree_rel(ptr, persistent);
}
/* }}} */
-/* {{{ mysqlnd_zend_mm_malloc */
-static void * mysqlnd_zend_mm_malloc(size_t size MYSQLND_MEM_D)
-{
- return malloc(size);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_zend_mm_calloc */
-static void * mysqlnd_zend_mm_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D)
-{
- return calloc(nmemb, size);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_zend_mm_realloc */
-static void * mysqlnd_zend_mm_realloc(void * ptr, size_t new_size MYSQLND_MEM_D)
-{
- return realloc(ptr, new_size);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_zend_mm_free */
-static void mysqlnd_zend_mm_free(void * ptr MYSQLND_MEM_D)
-{
- free(ptr);
-}
-/* }}} */
-
-
/* {{{ mysqlnd_zend_mm_pememdup */
-static char * mysqlnd_zend_mm_pememdup(const char * const ptr, size_t length, zend_bool persistent MYSQLND_MEM_D)
+static char * mysqlnd_zend_mm_pememdup(const char * const ptr, size_t length, bool persistent MYSQLND_MEM_D)
{
char * dest = pemalloc_rel(length, persistent);
if (dest) {
@@ -756,7 +471,7 @@ static char * mysqlnd_zend_mm_pememdup(const char * const ptr, size_t length, ze
/* {{{ mysqlnd_zend_mm_pestrndup */
-static char * mysqlnd_zend_mm_pestrndup(const char * const ptr, size_t length, zend_bool persistent MYSQLND_MEM_D)
+static char * mysqlnd_zend_mm_pestrndup(const char * const ptr, size_t length, bool persistent MYSQLND_MEM_D)
{
return persistent? zend_strndup(ptr, length ) : estrndup_rel(ptr, length);
}
@@ -764,7 +479,7 @@ static char * mysqlnd_zend_mm_pestrndup(const char * const ptr, size_t length, z
/* {{{ mysqlnd_zend_mm_pestrdup */
-static char * mysqlnd_zend_mm_pestrdup(const char * const ptr, zend_bool persistent MYSQLND_MEM_D)
+static char * mysqlnd_zend_mm_pestrdup(const char * const ptr, bool persistent MYSQLND_MEM_D)
{
return pestrdup_rel(ptr, persistent);
}
@@ -784,10 +499,6 @@ PHPAPI struct st_mysqlnd_allocator_methods mysqlnd_allocator =
_mysqlnd_perealloc,
_mysqlnd_efree,
_mysqlnd_pefree,
- _mysqlnd_malloc,
- _mysqlnd_calloc,
- _mysqlnd_realloc,
- _mysqlnd_free,
_mysqlnd_pememdup,
_mysqlnd_pestrndup,
_mysqlnd_pestrdup,
@@ -803,10 +514,6 @@ PHPAPI struct st_mysqlnd_allocator_methods mysqlnd_allocator =
mysqlnd_zend_mm_perealloc,
mysqlnd_zend_mm_efree,
mysqlnd_zend_mm_pefree,
- mysqlnd_zend_mm_malloc,
- mysqlnd_zend_mm_calloc,
- mysqlnd_zend_mm_realloc,
- mysqlnd_zend_mm_free,
mysqlnd_zend_mm_pememdup,
mysqlnd_zend_mm_pestrndup,
mysqlnd_zend_mm_pestrdup,
diff --git a/ext/mysqlnd/mysqlnd_alloc.h b/ext/mysqlnd/mysqlnd_alloc.h
index 8ef00e00e4..5ced16abeb 100644
--- a/ext/mysqlnd/mysqlnd_alloc.h
+++ b/ext/mysqlnd/mysqlnd_alloc.h
@@ -26,20 +26,16 @@ PHPAPI extern const char * mysqlnd_debug_std_no_trace_funcs[];
struct st_mysqlnd_allocator_methods
{
void * (*m_emalloc)(size_t size MYSQLND_MEM_D);
- void * (*m_pemalloc)(size_t size, zend_bool persistent MYSQLND_MEM_D);
+ void * (*m_pemalloc)(size_t size, bool persistent MYSQLND_MEM_D);
void * (*m_ecalloc)(unsigned int nmemb, size_t size MYSQLND_MEM_D);
- void * (*m_pecalloc)(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D);
+ void * (*m_pecalloc)(unsigned int nmemb, size_t size, bool persistent MYSQLND_MEM_D);
void * (*m_erealloc)(void *ptr, size_t new_size MYSQLND_MEM_D);
- void * (*m_perealloc)(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D);
+ void * (*m_perealloc)(void *ptr, size_t new_size, bool persistent MYSQLND_MEM_D);
void (*m_efree)(void *ptr MYSQLND_MEM_D);
- void (*m_pefree)(void *ptr, zend_bool persistent MYSQLND_MEM_D);
- void * (*m_malloc)(size_t size MYSQLND_MEM_D);
- void * (*m_calloc)(unsigned int nmemb, size_t size MYSQLND_MEM_D);
- void * (*m_realloc)(void *ptr, size_t new_size MYSQLND_MEM_D);
- void (*m_free)(void *ptr MYSQLND_MEM_D);
- char * (*m_pememdup)(const char * const ptr, size_t size, zend_bool persistent MYSQLND_MEM_D);
- char * (*m_pestrndup)(const char * const ptr, size_t size, zend_bool persistent MYSQLND_MEM_D);
- char * (*m_pestrdup)(const char * const ptr, zend_bool persistent MYSQLND_MEM_D);
+ void (*m_pefree)(void *ptr, bool persistent MYSQLND_MEM_D);
+ char * (*m_pememdup)(const char * const ptr, size_t size, bool persistent MYSQLND_MEM_D);
+ char * (*m_pestrndup)(const char * const ptr, size_t size, bool persistent MYSQLND_MEM_D);
+ char * (*m_pestrdup)(const char * const ptr, bool persistent MYSQLND_MEM_D);
int (*m_sprintf)(char **pbuf, size_t max_len, const char *format, ...);
int (*m_vsprintf)(char **pbuf, size_t max_len, const char *format, va_list ap);
void (*m_sprintf_free)(char * p);
@@ -55,10 +51,6 @@ PHPAPI extern struct st_mysqlnd_allocator_methods mysqlnd_allocator;
#define mnd_perealloc(ptr, new_size, p) mysqlnd_allocator.m_perealloc((ptr), (new_size), (p) MYSQLND_MEM_C)
#define mnd_efree(ptr) mysqlnd_allocator.m_efree((ptr) MYSQLND_MEM_C)
#define mnd_pefree(ptr, pers) mysqlnd_allocator.m_pefree((ptr), (pers) MYSQLND_MEM_C)
-#define mnd_malloc(size) mysqlnd_allocator.m_malloc((size) MYSQLND_MEM_C)
-#define mnd_calloc(nmemb, size) mysqlnd_allocator.m_calloc((nmemb), (size) MYSQLND_MEM_C)
-#define mnd_realloc(ptr, new_size) mysqlnd_allocator.m_realloc((ptr), (new_size) MYSQLND_MEM_C)
-#define mnd_free(ptr) mysqlnd_allocator.m_free((ptr) MYSQLND_MEM_C)
#define mnd_pememdup(ptr, size, pers) mysqlnd_allocator.m_pememdup((ptr), (size), (pers) MYSQLND_MEM_C)
#define mnd_pestrndup(ptr, size, pers) mysqlnd_allocator.m_pestrndup((ptr), (size), (pers) MYSQLND_MEM_C)
#define mnd_pestrdup(ptr, pers) mysqlnd_allocator.m_pestrdup((ptr), (pers) MYSQLND_MEM_C)
@@ -66,7 +58,7 @@ PHPAPI extern struct st_mysqlnd_allocator_methods mysqlnd_allocator;
#define mnd_vsprintf(p, mx_len, fmt,ap) mysqlnd_allocator.m_vsprintf((p), (mx_len), (fmt), (ap))
#define mnd_sprintf_free(p) mysqlnd_allocator.m_sprintf_free((p))
-static inline MYSQLND_STRING mnd_dup_cstring(const MYSQLND_CSTRING str, const zend_bool persistent)
+static inline MYSQLND_STRING mnd_dup_cstring(const MYSQLND_CSTRING str, const bool persistent)
{
const MYSQLND_STRING ret = {(char*) mnd_pemalloc(str.l + 1, persistent), str.l};
if (ret.s) {
diff --git a/ext/mysqlnd/mysqlnd_auth.c b/ext/mysqlnd/mysqlnd_auth.c
index a524161653..e3fb6fc90f 100644
--- a/ext/mysqlnd/mysqlnd_auth.c
+++ b/ext/mysqlnd/mysqlnd_auth.c
@@ -45,12 +45,12 @@ mysqlnd_run_authentication(
const unsigned int charset_no,
const MYSQLND_SESSION_OPTIONS * const session_options,
const zend_ulong mysql_flags,
- const zend_bool silent,
- const zend_bool is_change_user
+ const bool silent,
+ const bool is_change_user
)
{
enum_func_status ret = FAIL;
- zend_bool first_call = TRUE;
+ bool first_call = TRUE;
char * switch_to_auth_protocol = NULL;
size_t switch_to_auth_protocol_len = 0;
@@ -81,8 +81,10 @@ mysqlnd_run_authentication(
mnd_pefree(requested_protocol, FALSE);
requested_protocol = mnd_pestrdup(MYSQLND_DEFAULT_AUTH_PROTOCOL, FALSE);
} else {
- php_error_docref(NULL, E_WARNING, "The server requested authentication method unknown to the client [%s]", requested_protocol);
- SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method unknown to the client");
+ char * msg;
+ mnd_sprintf(&msg, 0, "The server requested authentication method unknown to the client [%s]", requested_protocol);
+ SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, msg);
+ mnd_sprintf_free(msg);
goto end;
}
}
@@ -103,10 +105,6 @@ mysqlnd_run_authentication(
}
conn->authentication_plugin_data.l = plugin_data_len;
conn->authentication_plugin_data.s = mnd_pemalloc(conn->authentication_plugin_data.l, conn->persistent);
- if (!conn->authentication_plugin_data.s) {
- SET_OOM_ERROR(conn->error_info);
- goto end;
- }
memcpy(conn->authentication_plugin_data.s, plugin_data, plugin_data_len);
DBG_INF_FMT("salt(%d)=[%.*s]", plugin_data_len, plugin_data_len, plugin_data);
@@ -244,7 +242,7 @@ mysqlnd_auth_handshake(MYSQLND_CONN_DATA * conn,
const MYSQLND_SESSION_OPTIONS * const session_options,
const zend_ulong mysql_flags,
const unsigned int server_charset_no,
- const zend_bool use_full_blown_auth_packet,
+ const bool use_full_blown_auth_packet,
const char * const auth_protocol,
struct st_mysqlnd_authentication_plugin * auth_plugin,
const zend_uchar * const orig_auth_plugin_data,
@@ -373,8 +371,8 @@ mysqlnd_auth_change_user(MYSQLND_CONN_DATA * const conn,
const size_t passwd_len,
const char * const db,
const size_t db_len,
- const zend_bool silent,
- const zend_bool use_full_blown_auth_packet,
+ const bool silent,
+ const bool use_full_blown_auth_packet,
const char * const auth_protocol,
struct st_mysqlnd_authentication_plugin * auth_plugin,
const zend_uchar * const orig_auth_plugin_data,
@@ -1278,8 +1276,12 @@ mysqlnd_caching_sha2_handle_server_response(struct st_mysqlnd_authentication_plu
case 2:
// The server tried to send a key, which we didn't expect
// fall-through
- default:
- php_error_docref(NULL, E_WARNING, "Unexpected server response while doing caching_sha2 auth: %i", result_packet.response_code);
+ default: {
+ char * msg;
+ mnd_sprintf(&msg, 0, "Unexpected server response while doing caching_sha2 auth: %i", result_packet.response_code);
+ SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, msg);
+ mnd_sprintf_free(msg);
+ }
}
DBG_RETURN(PASS);
diff --git a/ext/mysqlnd/mysqlnd_auth.h b/ext/mysqlnd/mysqlnd_auth.h
index be51294e92..0cb555cfb5 100644
--- a/ext/mysqlnd/mysqlnd_auth.h
+++ b/ext/mysqlnd/mysqlnd_auth.h
@@ -27,7 +27,7 @@ mysqlnd_auth_handshake(MYSQLND_CONN_DATA * conn,
const MYSQLND_SESSION_OPTIONS * const session_options,
const zend_ulong mysql_flags,
const unsigned int server_charset_no,
- const zend_bool use_full_blown_auth_packet,
+ const bool use_full_blown_auth_packet,
const char * const auth_protocol,
struct st_mysqlnd_authentication_plugin * auth_plugin,
const zend_uchar * const orig_auth_plugin_data,
@@ -48,8 +48,8 @@ mysqlnd_auth_change_user(MYSQLND_CONN_DATA * const conn,
const size_t passwd_len,
const char * const db,
const size_t db_len,
- const zend_bool silent,
- const zend_bool use_full_blown_auth_packet,
+ const bool silent,
+ const bool use_full_blown_auth_packet,
const char * const auth_protocol,
struct st_mysqlnd_authentication_plugin * auth_plugin,
const zend_uchar * const orig_auth_plugin_data,
@@ -92,8 +92,8 @@ mysqlnd_run_authentication(
const unsigned int charset_no,
const MYSQLND_SESSION_OPTIONS * const session_options,
const zend_ulong mysql_flags,
- const zend_bool silent,
- const zend_bool is_change_user
+ const bool silent,
+ const bool is_change_user
);
PHPAPI void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const scramble, const zend_uchar * const pass, const size_t pass_len);
diff --git a/ext/mysqlnd/mysqlnd_block_alloc.c b/ext/mysqlnd/mysqlnd_block_alloc.c
index a1b83308de..5c80ad028b 100644
--- a/ext/mysqlnd/mysqlnd_block_alloc.c
+++ b/ext/mysqlnd/mysqlnd_block_alloc.c
@@ -22,65 +22,12 @@
#include "mysqlnd_debug.h"
#include "mysqlnd_priv.h"
-/* {{{ mysqlnd_mempool_free_chunk */
-static void
-mysqlnd_mempool_free_chunk(MYSQLND_MEMORY_POOL * pool, void * ptr)
-{
- DBG_ENTER("mysqlnd_mempool_free_chunk");
- /* Try to back-off and guess if this is the last block allocated */
-#ifndef ZEND_TRACK_ARENA_ALLOC
- if (ptr == pool->last) {
- /*
- This was the last allocation. Lucky us, we can free
- a bit of memory from the pool. Next time we will return from the same ptr.
- */
- pool->arena->ptr = (char*)ptr;
- pool->last = NULL;
- }
-#endif
- DBG_VOID_RETURN;
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_mempool_resize_chunk */
-static void *
-mysqlnd_mempool_resize_chunk(MYSQLND_MEMORY_POOL * pool, void * ptr, size_t old_size, size_t size)
-{
- DBG_ENTER("mysqlnd_mempool_resize_chunk");
-
-#ifndef ZEND_TRACK_ARENA_ALLOC
- /* Try to back-off and guess if this is the last block allocated */
- if (ptr == pool->last
- && (ZEND_MM_ALIGNED_SIZE(size) <= ((char*)pool->arena->end - (char*)ptr))) {
- /*
- This was the last allocation. Lucky us, we can free
- a bit of memory from the pool. Next time we will return from the same ptr.
- */
- pool->arena->ptr = (char*)ptr + ZEND_MM_ALIGNED_SIZE(size);
- DBG_RETURN(ptr);
- }
-#endif
-
- void *new_ptr = zend_arena_alloc(&pool->arena, size);
- memcpy(new_ptr, ptr, MIN(old_size, size));
- pool->last = ptr = new_ptr;
- DBG_RETURN(ptr);
-}
-/* }}} */
-
-
/* {{{ mysqlnd_mempool_get_chunk */
static void *
mysqlnd_mempool_get_chunk(MYSQLND_MEMORY_POOL * pool, size_t size)
{
- void *ptr = NULL;
DBG_ENTER("mysqlnd_mempool_get_chunk");
-
- ptr = zend_arena_alloc(&pool->arena, size);
- pool->last = ptr;
-
- DBG_RETURN(ptr);
+ DBG_RETURN(zend_arena_alloc(&pool->arena, size));
}
/* }}} */
@@ -96,11 +43,8 @@ mysqlnd_mempool_create(size_t arena_size)
arena = zend_arena_create(MAX(arena_size, ZEND_MM_ALIGNED_SIZE(sizeof(zend_arena))));
ret = zend_arena_alloc(&arena, sizeof(MYSQLND_MEMORY_POOL));
ret->arena = arena;
- ret->last = NULL;
ret->checkpoint = NULL;
ret->get_chunk = mysqlnd_mempool_get_chunk;
- ret->free_chunk = mysqlnd_mempool_free_chunk;
- ret->resize_chunk = mysqlnd_mempool_resize_chunk;
DBG_RETURN(ret);
}
/* }}} */
@@ -137,7 +81,6 @@ mysqlnd_mempool_restore_state(MYSQLND_MEMORY_POOL * pool)
#endif
if (pool->checkpoint) {
zend_arena_release(&pool->arena, pool->checkpoint);
- pool->last = NULL;
pool->checkpoint = NULL;
}
DBG_VOID_RETURN;
diff --git a/ext/mysqlnd/mysqlnd_charset.c b/ext/mysqlnd/mysqlnd_charset.c
index 48bef05e49..5cf4e6a099 100644
--- a/ext/mysqlnd/mysqlnd_charset.c
+++ b/ext/mysqlnd/mysqlnd_charset.c
@@ -777,7 +777,7 @@ PHPAPI zend_ulong mysqlnd_cset_escape_quotes(const MYSQLND_CHARSET * const cset,
const char *newstr_s = newstr;
const char *newstr_e = newstr + 2 * escapestr_len;
const char *end = escapestr + escapestr_len;
- zend_bool escape_overflow = FALSE;
+ bool escape_overflow = FALSE;
DBG_ENTER("mysqlnd_cset_escape_quotes");
@@ -831,7 +831,7 @@ PHPAPI zend_ulong mysqlnd_cset_escape_slashes(const MYSQLND_CHARSET * const cset
const char *newstr_s = newstr;
const char *newstr_e = newstr + 2 * escapestr_len;
const char *end = escapestr + escapestr_len;
- zend_bool escape_overflow = FALSE;
+ bool escape_overflow = FALSE;
DBG_ENTER("mysqlnd_cset_escape_slashes");
DBG_INF_FMT("charset=%s", cset->name);
diff --git a/ext/mysqlnd/mysqlnd_commands.c b/ext/mysqlnd/mysqlnd_commands.c
index 953c3a2fcd..c5ca7a763e 100644
--- a/ext/mysqlnd/mysqlnd_commands.c
+++ b/ext/mysqlnd/mysqlnd_commands.c
@@ -112,11 +112,6 @@ MYSQLND_METHOD(mysqlnd_command, init_db)(MYSQLND_CONN_DATA * const conn, const M
}
conn->connect_or_select_db.s = mnd_pestrndup(db.s, db.l, conn->persistent);
conn->connect_or_select_db.l = db.l;
- if (!conn->connect_or_select_db.s) {
- /* OOM */
- SET_OOM_ERROR(conn->error_info);
- ret = FAIL;
- }
}
DBG_RETURN(ret);
@@ -192,7 +187,7 @@ MYSQLND_METHOD(mysqlnd_command, statistics)(MYSQLND_CONN_DATA * const conn, zend
/* {{{ mysqlnd_command::process_kill */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_command, process_kill)(MYSQLND_CONN_DATA * const conn, const unsigned int process_id, const zend_bool read_response)
+MYSQLND_METHOD(mysqlnd_command, process_kill)(MYSQLND_CONN_DATA * const conn, const unsigned int process_id, const bool read_response)
{
const func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command;
const func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response;
@@ -338,7 +333,7 @@ MYSQLND_METHOD(mysqlnd_command, query)(MYSQLND_CONN_DATA * const conn, MYSQLND_C
/* {{{ mysqlnd_command::change_user */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_command, change_user)(MYSQLND_CONN_DATA * const conn, const MYSQLND_CSTRING payload, const zend_bool silent)
+MYSQLND_METHOD(mysqlnd_command, change_user)(MYSQLND_CONN_DATA * const conn, const MYSQLND_CSTRING payload, const bool silent)
{
const func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command;
enum_func_status ret = FAIL;
@@ -563,7 +558,7 @@ MYSQLND_METHOD(mysqlnd_command, enable_ssl)(MYSQLND_CONN_DATA * const conn, cons
#ifdef MYSQLND_SSL_SUPPORTED
if (client_capabilities & CLIENT_SSL) {
- const zend_bool server_has_ssl = (server_capabilities & CLIENT_SSL)? TRUE:FALSE;
+ const bool server_has_ssl = (server_capabilities & CLIENT_SSL)? TRUE:FALSE;
if (server_has_ssl == FALSE) {
goto close_conn;
} else {
@@ -637,11 +632,11 @@ MYSQLND_METHOD(mysqlnd_command, handshake)(MYSQLND_CONN_DATA * const conn, const
SET_CLIENT_ERROR(conn->error_info, greet_packet.error_no, greet_packet.sqlstate, greet_packet.error);
goto err;
} else if (greet_packet.pre41) {
- DBG_ERR_FMT("Connecting to 3.22, 3.23 & 4.0 is not supported. Server is %-.32s", greet_packet.server_version);
- php_error_docref(NULL, E_WARNING, "Connecting to 3.22, 3.23 & 4.0 "
- " is not supported. Server is %-.32s", greet_packet.server_version);
- SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE,
- "Connecting to 3.22, 3.23 & 4.0 servers is not supported");
+ char * msg;
+ mnd_sprintf(&msg, 0, "Connecting to 3.22, 3.23 & 4.0 is not supported. Server is %-.32s", greet_packet.server_version);
+ DBG_ERR(msg);
+ SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, msg);
+ mnd_sprintf_free(msg);
goto err;
}
@@ -651,10 +646,10 @@ MYSQLND_METHOD(mysqlnd_command, handshake)(MYSQLND_CONN_DATA * const conn, const
conn->greet_charset = mysqlnd_find_charset_nr(greet_packet.charset_no);
if (!conn->greet_charset) {
- php_error_docref(NULL, E_WARNING,
- "Server sent charset (%d) unknown to the client. Please, report to the developers", greet_packet.charset_no);
- SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE,
- "Server sent charset unknown to the client. Please, report to the developers");
+ char * msg;
+ mnd_sprintf(&msg, 0, "Server sent charset (%d) unknown to the client. Please, report to the developers", greet_packet.charset_no);
+ SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, msg);
+ mnd_sprintf_free(msg);
goto err;
}
diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c
index d034fb0ca3..8730de04b1 100644
--- a/ext/mysqlnd/mysqlnd_connection.c
+++ b/ext/mysqlnd/mysqlnd_connection.c
@@ -146,8 +146,8 @@ MYSQLND_CLASS_METHODS_END;
/* {{{ mysqlnd_error_info_init */
-PHPAPI enum_func_status
-mysqlnd_error_info_init(MYSQLND_ERROR_INFO * const info, const zend_bool persistent)
+PHPAPI void
+mysqlnd_error_info_init(MYSQLND_ERROR_INFO * const info, const bool persistent)
{
DBG_ENTER("mysqlnd_error_info_init");
info->m = mysqlnd_error_info_get_methods();
@@ -155,7 +155,7 @@ mysqlnd_error_info_init(MYSQLND_ERROR_INFO * const info, const zend_bool persist
zend_llist_init(&info->error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t) mysqlnd_error_list_pdtor, persistent);
info->persistent = persistent;
- DBG_RETURN(PASS);
+ DBG_VOID_RETURN;
}
/* }}} */
@@ -219,7 +219,7 @@ mysqlnd_connection_state_init(struct st_mysqlnd_connection_state * const state)
static void
MYSQLND_METHOD(mysqlnd_conn_data, free_options)(MYSQLND_CONN_DATA * conn)
{
- zend_bool pers = conn->persistent;
+ bool pers = conn->persistent;
if (conn->options->charset_name) {
mnd_pefree(conn->options->charset_name, pers);
@@ -251,6 +251,10 @@ MYSQLND_METHOD(mysqlnd_conn_data, free_options)(MYSQLND_CONN_DATA * conn)
mnd_pefree(conn->options->connect_attr, pers);
conn->options->connect_attr = NULL;
}
+ if (conn->options->local_infile_directory) {
+ mnd_pefree(conn->options->local_infile_directory, pers);
+ conn->options->local_infile_directory = NULL;
+ }
}
/* }}} */
@@ -259,7 +263,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, free_options)(MYSQLND_CONN_DATA * conn)
static void
MYSQLND_METHOD(mysqlnd_conn_data, free_contents)(MYSQLND_CONN_DATA * conn)
{
- zend_bool pers = conn->persistent;
+ bool pers = conn->persistent;
DBG_ENTER("mysqlnd_conn_data::free_contents");
@@ -456,7 +460,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, execute_init_commands)(MYSQLND_CONN_DATA * con
}
do {
if (conn->last_query_type == QUERY_SELECT) {
- MYSQLND_RES * result = conn->m->use_result(conn, 0);
+ MYSQLND_RES * result = conn->m->use_result(conn);
if (result) {
result->m.free_result(result, TRUE);
}
@@ -544,7 +548,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect_handshake)(MYSQLND_CONN_DATA * conn,
/* {{{ mysqlnd_conn_data::get_scheme */
static MYSQLND_STRING
-MYSQLND_METHOD(mysqlnd_conn_data, get_scheme)(MYSQLND_CONN_DATA * conn, MYSQLND_CSTRING hostname, MYSQLND_CSTRING *socket_or_pipe, unsigned int port, zend_bool * unix_socket, zend_bool * named_pipe)
+MYSQLND_METHOD(mysqlnd_conn_data, get_scheme)(MYSQLND_CONN_DATA * conn, MYSQLND_CSTRING hostname, MYSQLND_CSTRING *socket_or_pipe, unsigned int port, bool * unix_socket, bool * named_pipe)
{
MYSQLND_STRING transport;
DBG_ENTER("mysqlnd_conn_data::get_scheme");
@@ -592,11 +596,11 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
)
{
const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), connect);
- zend_bool unix_socket = FALSE;
- zend_bool named_pipe = FALSE;
- zend_bool reconnect = FALSE;
- zend_bool saved_compression = FALSE;
- zend_bool local_tx_started = FALSE;
+ bool unix_socket = FALSE;
+ bool named_pipe = FALSE;
+ bool reconnect = FALSE;
+ bool saved_compression = FALSE;
+ bool local_tx_started = FALSE;
MYSQLND_PFC * pfc = conn->protocol_frame_codec;
MYSQLND_STRING transport = { NULL, 0 };
@@ -709,17 +713,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
conn->connect_or_select_db.l = database.l;
conn->connect_or_select_db.s = mnd_pestrndup(database.s, conn->connect_or_select_db.l, conn->persistent);
- if (!conn->username.s || !conn->password.s|| !conn->connect_or_select_db.s) {
- SET_OOM_ERROR(conn->error_info);
- goto err; /* OOM */
- }
-
if (!unix_socket && !named_pipe) {
conn->hostname.s = mnd_pestrndup(hostname.s, hostname.l, conn->persistent);
- if (!conn->hostname.s) {
- SET_OOM_ERROR(conn->error_info);
- goto err; /* OOM */
- }
conn->hostname.l = hostname.l;
{
char *p;
@@ -730,10 +725,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
}
conn->host_info = mnd_pestrdup(p, conn->persistent);
mnd_sprintf_free(p);
- if (!conn->host_info) {
- SET_OOM_ERROR(conn->error_info);
- goto err; /* OOM */
- }
}
} else {
conn->unix_socket.s = mnd_pestrdup(socket_or_pipe.s, conn->persistent);
@@ -746,12 +737,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
SET_OOM_ERROR(conn->error_info);
goto err; /* OOM */
}
- conn->host_info = mnd_pestrdup(p, conn->persistent);
+ conn->host_info = mnd_pestrdup(p, conn->persistent);
mnd_sprintf_free(p);
- if (!conn->host_info) {
- SET_OOM_ERROR(conn->error_info);
- goto err; /* OOM */
- }
} else {
php_error_docref(NULL, E_WARNING, "Impossible. Should be either socket or a pipe. Report a bug!");
}
@@ -791,8 +778,10 @@ err:
DBG_ERR_FMT("[%u] %.128s (trying to connect via %s)", conn->error_info->error_no, conn->error_info->error, conn->scheme.s);
if (!conn->error_info->error_no) {
- SET_CLIENT_ERROR(conn->error_info, CR_CONNECTION_ERROR, UNKNOWN_SQLSTATE, conn->error_info->error);
- php_error_docref(NULL, E_WARNING, "[%u] %.128s (trying to connect via %s)", conn->error_info->error_no, conn->error_info->error, conn->scheme.s);
+ char * msg;
+ mnd_sprintf(&msg, 0, "%s (trying to connect via %s)",conn->error_info->error, conn->scheme.s);
+ SET_CLIENT_ERROR(conn->error_info, CR_CONNECTION_ERROR, UNKNOWN_SQLSTATE, msg);
+ mnd_sprintf_free(msg);
}
conn->m->free_contents(conn);
@@ -945,7 +934,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, list_method)(MYSQLND_CONN_DATA * conn, const c
}
if (PASS == conn->m->query(conn, show_query, show_query_len)) {
- result = conn->m->store_result(conn, MYSQLND_STORE_NO_COPY);
+ result = conn->m->store_result(conn);
}
if (show_query != query) {
mnd_sprintf_free(show_query);
@@ -1456,7 +1445,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, get_server_version)(const MYSQLND_CONN_DATA *
/* {{{ mysqlnd_conn_data::more_results */
-static zend_bool
+static bool
MYSQLND_METHOD(mysqlnd_conn_data, more_results)(const MYSQLND_CONN_DATA * const conn)
{
DBG_ENTER("mysqlnd_conn_data::more_results");
@@ -1574,7 +1563,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, change_user)(MYSQLND_CONN_DATA * const conn,
const char * user,
const char * passwd,
const char * db,
- zend_bool silent,
+ bool silent,
size_t passwd_len
)
{
@@ -1653,11 +1642,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c
case MYSQL_SERVER_PUBLIC_KEY:
ret = conn->protocol_frame_codec->data->m.set_client_option(conn->protocol_frame_codec, option, value);
break;
-#ifdef MYSQLND_STRING_TO_INT_CONVERSION
case MYSQLND_OPT_INT_AND_FLOAT_NATIVE:
conn->options->int_and_float_native = *(unsigned int*) value;
break;
-#endif
case MYSQL_OPT_LOCAL_INFILE:
if (value && (*(unsigned int*) value) ? 1 : 0) {
conn->options->flags |= CLIENT_LOCAL_FILES;
@@ -1665,6 +1652,19 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c
conn->options->flags &= ~CLIENT_LOCAL_FILES;
}
break;
+ case MYSQL_OPT_LOAD_DATA_LOCAL_DIR:
+ {
+ if (conn->options->local_infile_directory) {
+ mnd_pefree(conn->options->local_infile_directory, conn->persistent);
+ }
+
+ if (!value || (*value == '\0')) {
+ conn->options->local_infile_directory = NULL;
+ } else {
+ conn->options->local_infile_directory = mnd_pestrdup(value, conn->persistent);
+ }
+ break;
+ }
case MYSQL_INIT_COMMAND:
{
char ** new_init_commands;
@@ -1672,14 +1672,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c
/* when num_commands is 0, then realloc will be effectively a malloc call, internally */
/* Don't assign to conn->options->init_commands because in case of OOM we will lose the pointer and leak */
new_init_commands = mnd_perealloc(conn->options->init_commands, sizeof(char *) * (conn->options->num_commands + 1), conn->persistent);
- if (!new_init_commands) {
- goto oom;
- }
conn->options->init_commands = new_init_commands;
new_command = mnd_pestrdup(value, conn->persistent);
- if (!new_command) {
- goto oom;
- }
conn->options->init_commands[conn->options->num_commands] = new_command;
++conn->options->num_commands;
break;
@@ -1702,9 +1696,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c
}
new_charset_name = mnd_pestrdup(value, conn->persistent);
- if (!new_charset_name) {
- goto oom;
- }
if (conn->options->charset_name) {
mnd_pefree(conn->options->charset_name, conn->persistent);
}
@@ -1740,9 +1731,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c
case MYSQLND_OPT_AUTH_PROTOCOL:
{
char * new_auth_protocol = value? mnd_pestrdup(value, conn->persistent) : NULL;
- if (value && !new_auth_protocol) {
- goto oom;
- }
if (conn->options->auth_protocol) {
mnd_pefree(conn->options->auth_protocol, conn->persistent);
}
@@ -1781,9 +1769,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c
}
conn->m->local_tx_end(conn, this_func, ret);
DBG_RETURN(ret);
-oom:
- SET_OOM_ERROR(conn->error_info);
- conn->m->local_tx_end(conn, this_func, FAIL);
end:
DBG_RETURN(FAIL);
}
@@ -1811,9 +1796,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option_2d)(MYSQLND_CONN_DATA * cons
if (!conn->options->connect_attr) {
DBG_INF("Initializing connect_attr hash");
conn->options->connect_attr = mnd_pemalloc(sizeof(HashTable), conn->persistent);
- if (!conn->options->connect_attr) {
- goto oom;
- }
zend_hash_init(conn->options->connect_attr, 0, NULL, conn->persistent ? ZVAL_INTERNAL_PTR_DTOR : ZVAL_PTR_DTOR, conn->persistent);
}
DBG_INF_FMT("Adding [%s][%s]", key, value);
@@ -1839,9 +1821,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option_2d)(MYSQLND_CONN_DATA * cons
}
conn->m->local_tx_end(conn, this_func, ret);
DBG_RETURN(ret);
-oom:
- SET_OOM_ERROR(conn->error_info);
- conn->m->local_tx_end(conn, this_func, FAIL);
end:
DBG_RETURN(FAIL);
}
@@ -1850,7 +1829,7 @@ end:
/* {{{ mysqlnd_conn_data::use_result */
static MYSQLND_RES *
-MYSQLND_METHOD(mysqlnd_conn_data, use_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags)
+MYSQLND_METHOD(mysqlnd_conn_data, use_result)(MYSQLND_CONN_DATA * const conn)
{
const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), use_result);
MYSQLND_RES * result = NULL;
@@ -1892,7 +1871,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, use_result)(MYSQLND_CONN_DATA * const conn, co
/* {{{ mysqlnd_conn_data::store_result */
static MYSQLND_RES *
-MYSQLND_METHOD(mysqlnd_conn_data, store_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags)
+MYSQLND_METHOD(mysqlnd_conn_data, store_result)(MYSQLND_CONN_DATA * const conn)
{
const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), store_result);
MYSQLND_RES * result = NULL;
@@ -1902,7 +1881,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, store_result)(MYSQLND_CONN_DATA * const conn,
if (PASS == conn->m->local_tx_start(conn, this_func)) {
do {
- unsigned int f = flags;
if (!conn->current_result) {
break;
}
@@ -1915,25 +1893,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, store_result)(MYSQLND_CONN_DATA * const conn,
}
MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_BUFFERED_SETS);
-
- /* overwrite */
- if ((conn->m->get_client_api_capabilities(conn) & MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA)) {
- if (MYSQLND_G(fetch_data_copy)) {
- f &= ~MYSQLND_STORE_NO_COPY;
- f |= MYSQLND_STORE_COPY;
- }
- } else {
- /* if for some reason PDO borks something */
- if (!(f & (MYSQLND_STORE_NO_COPY | MYSQLND_STORE_COPY))) {
- f |= MYSQLND_STORE_COPY;
- }
- }
- if (!(f & (MYSQLND_STORE_NO_COPY | MYSQLND_STORE_COPY))) {
- SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, "Unknown fetch mode");
- DBG_ERR("Unknown fetch mode");
- break;
- }
- result = conn->current_result->m.store_result(conn->current_result, conn, f);
+ result = conn->current_result->m.store_result(conn->current_result, conn, NULL);
if (!result) {
conn->current_result->m.free_result(conn->current_result, TRUE);
}
@@ -2034,7 +1994,7 @@ mysqlnd_escape_string_for_tx_name_in_comment(const char * const name)
char * ret = NULL;
DBG_ENTER("mysqlnd_escape_string_for_tx_name_in_comment");
if (name) {
- zend_bool warned = FALSE;
+ bool warned = FALSE;
const char * p_orig = name;
char * p_copy;
p_copy = ret = mnd_emalloc(strlen(name) + 1 + 2 + 2 + 1); /* space, open, close, NullS */
@@ -2072,7 +2032,7 @@ mysqlnd_escape_string_for_tx_name_in_comment(const char * const name)
/* {{{ mysqlnd_conn_data::tx_commit_ex */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_conn_data, tx_commit_or_rollback)(MYSQLND_CONN_DATA * conn, const zend_bool commit, const unsigned int flags, const char * const name)
+MYSQLND_METHOD(mysqlnd_conn_data, tx_commit_or_rollback)(MYSQLND_CONN_DATA * conn, const bool commit, const unsigned int flags, const char * const name)
{
const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), tx_commit_or_rollback);
enum_func_status ret = FAIL;
@@ -2159,9 +2119,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsi
}
ret = conn->m->query(conn, query, query_len);
mnd_sprintf_free(query);
- if (ret && mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY) &&
- mysqlnd_stmt_errno(conn) == 1064) {
- php_error_docref(NULL, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
+ if (ret && mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY) && mysqlnd_stmt_errno(conn) == 1064) {
+ SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE,
+ "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required");
break;
}
}
@@ -2542,7 +2502,7 @@ mysqlnd_stream_array_from_fd_set(MYSQLND ** conn_array, fd_set * fds)
php_socket_t this_fd;
php_stream *stream = NULL;
unsigned int ret = 0;
- zend_bool disproportion = FALSE;
+ bool disproportion = FALSE;
MYSQLND **fwd = conn_array, **bckwd = conn_array;
DBG_ENTER("mysqlnd_stream_array_from_fd_set");
@@ -2669,7 +2629,7 @@ PHPAPI MYSQLND * mysqlnd_connection_connect(MYSQLND * conn_handle,
)
{
enum_func_status ret = FAIL;
- zend_bool self_alloced = FALSE;
+ bool self_alloced = FALSE;
MYSQLND_CSTRING hostname = { host, host? strlen(host) : 0 };
MYSQLND_CSTRING username = { user, user? strlen(user) : 0 };
MYSQLND_CSTRING password = { passwd, passwd_len };
@@ -2706,7 +2666,7 @@ PHPAPI MYSQLND * mysqlnd_connection_connect(MYSQLND * conn_handle,
/* {{{ mysqlnd_connection_init */
PHPAPI MYSQLND *
-mysqlnd_connection_init(const size_t client_flags, const zend_bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory)
+mysqlnd_connection_init(const size_t client_flags, const bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory)
{
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *factory = object_factory? object_factory : &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory);
MYSQLND * ret;
diff --git a/ext/mysqlnd/mysqlnd_connection.h b/ext/mysqlnd/mysqlnd_connection.h
index 795ec3c5ea..a9f3cbd685 100644
--- a/ext/mysqlnd/mysqlnd_connection.h
+++ b/ext/mysqlnd/mysqlnd_connection.h
@@ -65,7 +65,7 @@ void mysqlnd_upsert_status_init(MYSQLND_UPSERT_STATUS * const upsert_status);
}
-PHPAPI enum_func_status mysqlnd_error_info_init(MYSQLND_ERROR_INFO * const info, const zend_bool persistent);
+PHPAPI void mysqlnd_error_info_init(MYSQLND_ERROR_INFO * const info, const bool persistent);
PHPAPI void mysqlnd_error_info_free_contents(MYSQLND_ERROR_INFO * const info);
#define GET_CONNECTION_STATE(state_struct) (state_struct)->m->get((state_struct))
diff --git a/ext/mysqlnd/mysqlnd_debug.c b/ext/mysqlnd/mysqlnd_debug.c
index 55590f45c9..edc3c250b5 100644
--- a/ext/mysqlnd/mysqlnd_debug.c
+++ b/ext/mysqlnd/mysqlnd_debug.c
@@ -26,7 +26,7 @@ static const char * const mysqlnd_debug_empty_string = "";
/* {{{ mysqlnd_debug::open */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_debug, open)(MYSQLND_DEBUG * self, zend_bool reopen)
+MYSQLND_METHOD(mysqlnd_debug, open)(MYSQLND_DEBUG * self, bool reopen)
{
if (!self->file_name) {
return FAIL;
@@ -239,7 +239,7 @@ MYSQLND_METHOD(mysqlnd_debug, log_va)(MYSQLND_DEBUG *self,
/* FALSE - The DBG_ calls won't be traced, TRUE - will be traced */
/* {{{ mysqlnd_debug::func_enter */
-static zend_bool
+static bool
MYSQLND_METHOD(mysqlnd_debug, func_enter)(MYSQLND_DEBUG * self,
unsigned int line, const char * const file,
const char * const func_name, unsigned int func_name_len)
@@ -313,7 +313,7 @@ MYSQLND_METHOD(mysqlnd_debug, func_leave)(MYSQLND_DEBUG * self, unsigned int lin
char **func_name;
uint64_t * parent_non_own_time_ptr = NULL, * mine_non_own_time_ptr = NULL;
uint64_t mine_non_own_time = 0;
- zend_bool profile_calls = self->flags & MYSQLND_DEBUG_PROFILE_CALLS? TRUE:FALSE;
+ bool profile_calls = self->flags & MYSQLND_DEBUG_PROFILE_CALLS? TRUE:FALSE;
if ((self->flags & MYSQLND_DEBUG_DUMP_TRACE) == 0 || self->file_name == NULL) {
return PASS;
diff --git a/ext/mysqlnd/mysqlnd_debug.h b/ext/mysqlnd/mysqlnd_debug.h
index 79d53ad700..7c9b57bc0c 100644
--- a/ext/mysqlnd/mysqlnd_debug.h
+++ b/ext/mysqlnd/mysqlnd_debug.h
@@ -23,13 +23,13 @@
struct st_mysqlnd_debug_methods
{
- enum_func_status (*open)(MYSQLND_DEBUG * self, zend_bool reopen);
+ enum_func_status (*open)(MYSQLND_DEBUG * self, bool reopen);
void (*set_mode)(MYSQLND_DEBUG * self, const char * const mode);
enum_func_status (*log)(MYSQLND_DEBUG * self, unsigned int line, const char * const file,
unsigned int level, const char * type, const char *message);
enum_func_status (*log_va)(MYSQLND_DEBUG * self, unsigned int line, const char * const file,
unsigned int level, const char * type, const char *format, ...);
- zend_bool (*func_enter)(MYSQLND_DEBUG * self, unsigned int line, const char * const file,
+ bool (*func_enter)(MYSQLND_DEBUG * self, unsigned int line, const char * const file,
const char * const func_name, unsigned int func_name_len);
enum_func_status (*func_leave)(MYSQLND_DEBUG * self, unsigned int line, const char * const file, uint64_t call_time);
enum_func_status (*close)(MYSQLND_DEBUG * self);
@@ -117,7 +117,7 @@ PHPAPI MYSQLND_DEBUG * mysqlnd_debug_init(const char * skip_functions[]);
#define DBG_ENTER_EX2(dbg_obj1, dbg_obj2, func_name) \
struct timeval __dbg_prof_tp = {0}; \
uint64_t __dbg_prof_start = 0; /* initialization is needed */ \
- zend_bool dbg_skip_trace = TRUE; \
+ bool dbg_skip_trace = TRUE; \
((void)__dbg_prof_start); \
if ((dbg_obj1)) { \
dbg_skip_trace = !(dbg_obj1)->m->func_enter((dbg_obj1), __LINE__, __FILE__, func_name, strlen(func_name)); \
diff --git a/ext/mysqlnd/mysqlnd_driver.c b/ext/mysqlnd/mysqlnd_driver.c
index 4762d4e720..d553a98ce9 100644
--- a/ext/mysqlnd/mysqlnd_driver.c
+++ b/ext/mysqlnd/mysqlnd_driver.c
@@ -29,7 +29,7 @@
#include "mysqlnd_reverse_api.h"
#include "mysqlnd_ext_plugin.h"
-static zend_bool mysqlnd_library_initted = FALSE;
+static bool mysqlnd_library_initted = FALSE;
static struct st_mysqlnd_plugin_core mysqlnd_plugin_core =
{
@@ -94,7 +94,7 @@ PHPAPI void mysqlnd_library_init(void)
/* {{{ mysqlnd_object_factory::get_connection */
static MYSQLND *
-MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *factory, const zend_bool persistent)
+MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *factory, const bool persistent)
{
const size_t alloc_size_ret = sizeof(MYSQLND) + mysqlnd_plugin_count() * sizeof(void *);
const size_t alloc_size_ret_data = sizeof(MYSQLND_CONN_DATA) + mysqlnd_plugin_count() * sizeof(void *);
@@ -116,10 +116,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(MYSQLND_CLASS_METHODS_TYP
new_object->m = mysqlnd_conn_get_methods();
data = new_object->data;
- if (FAIL == mysqlnd_error_info_init(&data->error_info_impl, persistent)) {
- new_object->m->dtor(new_object);
- DBG_RETURN(NULL);
- }
+ mysqlnd_error_info_init(&data->error_info_impl, persistent);
data->error_info = &data->error_info_impl;
data->options = &(data->options_impl);
@@ -191,57 +188,36 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement)(MYSQLND_CONN_DATA
MYSQLND_STMT_DATA * stmt = NULL;
DBG_ENTER("mysqlnd_object_factory::get_prepared_statement");
- do {
- if (!ret) {
- break;
- }
- ret->m = mysqlnd_stmt_get_methods();
+ ret->m = mysqlnd_stmt_get_methods();
- stmt = ret->data = mnd_ecalloc(1, sizeof(MYSQLND_STMT_DATA));
- DBG_INF_FMT("stmt=%p", stmt);
- if (!stmt) {
- break;
- }
+ stmt = ret->data = mnd_ecalloc(1, sizeof(MYSQLND_STMT_DATA));
+ DBG_INF_FMT("stmt=%p", stmt);
- if (FAIL == mysqlnd_error_info_init(&stmt->error_info_impl, 0)) {
- break;
- }
- stmt->error_info = &stmt->error_info_impl;
-
- mysqlnd_upsert_status_init(&stmt->upsert_status_impl);
- stmt->upsert_status = &(stmt->upsert_status_impl);
- stmt->state = MYSQLND_STMT_INITTED;
- stmt->execute_cmd_buffer.length = 4096;
- stmt->execute_cmd_buffer.buffer = mnd_emalloc(stmt->execute_cmd_buffer.length);
- if (!stmt->execute_cmd_buffer.buffer) {
- break;
- }
-
- stmt->prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS;
+ mysqlnd_error_info_init(&stmt->error_info_impl, 0);
+ stmt->error_info = &stmt->error_info_impl;
- /*
- Mark that we reference the connection, thus it won't be
- be destructed till there is open statements. The last statement
- or normal query result will close it then.
- */
- stmt->conn = conn->m->get_reference(conn);
+ mysqlnd_upsert_status_init(&stmt->upsert_status_impl);
+ stmt->upsert_status = &(stmt->upsert_status_impl);
+ stmt->state = MYSQLND_STMT_INITTED;
+ stmt->execute_cmd_buffer.length = 4096;
+ stmt->execute_cmd_buffer.buffer = mnd_emalloc(stmt->execute_cmd_buffer.length);
+ stmt->prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS;
- DBG_RETURN(ret);
- } while (0);
+ /*
+ Mark that we reference the connection, thus it won't be
+ be destructed till there is open statements. The last statement
+ or normal query result will close it then.
+ */
+ stmt->conn = conn->m->get_reference(conn);
- SET_OOM_ERROR(conn->error_info);
- if (ret) {
- ret->m->dtor(ret, TRUE);
- ret = NULL;
- }
- DBG_RETURN(NULL);
+ DBG_RETURN(ret);
}
/* }}} */
/* {{{ mysqlnd_object_factory::get_pfc */
static MYSQLND_PFC *
-MYSQLND_METHOD(mysqlnd_object_factory, get_pfc)(const zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
+MYSQLND_METHOD(mysqlnd_object_factory, get_pfc)(const bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
{
const size_t pfc_alloc_size = ZEND_MM_ALIGNED_SIZE(sizeof(MYSQLND_PFC) + mysqlnd_plugin_count() * sizeof(void *));
const size_t pfc_data_alloc_size = sizeof(MYSQLND_PFC_DATA) + mysqlnd_plugin_count() * sizeof(void *);
@@ -266,7 +242,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_pfc)(const zend_bool persistent, MYSQ
/* {{{ mysqlnd_object_factory::get_vio */
static MYSQLND_VIO *
-MYSQLND_METHOD(mysqlnd_object_factory, get_vio)(const zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
+MYSQLND_METHOD(mysqlnd_object_factory, get_vio)(const bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
{
const size_t vio_alloc_size = ZEND_MM_ALIGNED_SIZE(sizeof(MYSQLND_VIO) + mysqlnd_plugin_count() * sizeof(void *));
const size_t vio_data_alloc_size = sizeof(MYSQLND_VIO_DATA) + mysqlnd_plugin_count() * sizeof(void *);
@@ -291,7 +267,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_vio)(const zend_bool persistent, MYSQ
/* {{{ mysqlnd_object_factory::get_protocol_payload_decoder_factory */
static MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY *
-MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_payload_decoder_factory)(MYSQLND_CONN_DATA * conn, const zend_bool persistent)
+MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_payload_decoder_factory)(MYSQLND_CONN_DATA * conn, const bool persistent)
{
const size_t alloc_size = sizeof(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY) + mysqlnd_plugin_count() * sizeof(void *);
MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY *ret = mnd_pecalloc(1, alloc_size, persistent);
diff --git a/ext/mysqlnd/mysqlnd_enum_n_def.h b/ext/mysqlnd/mysqlnd_enum_n_def.h
index 955eccac0e..80be26e622 100644
--- a/ext/mysqlnd/mysqlnd_enum_n_def.h
+++ b/ext/mysqlnd/mysqlnd_enum_n_def.h
@@ -129,6 +129,7 @@
#define CR_PARAMS_NOT_BOUND 2031
#define CR_INVALID_PARAMETER_NO 2034
#define CR_INVALID_BUFFER_USE 2035
+#define CR_LOAD_DATA_LOCAL_INFILE_REJECTED 2068
#define MYSQLND_EE_FILENOTFOUND 7890
@@ -148,12 +149,6 @@
#define TRANS_COR_RELEASE 4
#define TRANS_COR_NO_RELEASE 8
-typedef enum mysqlnd_extension
-{
- MYSQLND_MYSQL = 0,
- MYSQLND_MYSQLI
-} enum_mysqlnd_extension;
-
enum
{
MYSQLND_FETCH_ASSOC = 1,
@@ -253,10 +248,9 @@ typedef enum mysqlnd_client_option
MYSQL_OPT_NET_BUFFER_LENGTH,
MYSQL_OPT_TLS_VERSION,
MYSQL_OPT_SSL_MODE,
+ MYSQL_OPT_LOAD_DATA_LOCAL_DIR,
MYSQLND_DEPRECATED_ENUM1 = 200,
-#ifdef MYSQLND_STRING_TO_INT_CONVERSION
MYSQLND_OPT_INT_AND_FLOAT_NATIVE = 201,
-#endif
MYSQLND_OPT_NET_CMD_BUFFER_SIZE = 202,
MYSQLND_OPT_NET_READ_BUFFER_SIZE = 203,
MYSQLND_OPT_SSL_KEY = 204,
@@ -689,23 +683,12 @@ enum php_mysqlnd_server_command
#define MYSQLND_REFRESH_HOSTS 8 /* Flush host cache */
#define MYSQLND_REFRESH_STATUS 16 /* Flush status variables */
#define MYSQLND_REFRESH_THREADS 32 /* Flush thread cache */
-#define MYSQLND_REFRESH_SLAVE 64 /* Reset master info and restart slave */
+#define MYSQLND_REFRESH_REPLICA 64 /* Reset master info and restart replica */
+#define MYSQLND_REFRESH_SLAVE MYSQLND_REFRESH_REPLICA /* temporarily for backward compatibility */
#define MYSQLND_REFRESH_MASTER 128 /* Remove all bin logs in the index */
#define MYSQLND_REFRESH_BACKUP_LOG 0x200000L
-#define MYSQLND_STORE_PS 1
-#define MYSQLND_STORE_NO_COPY 2
-#define MYSQLND_STORE_COPY 4
-
-enum mysqlnd_buffered_type
-{
- MYSQLND_BUFFERED_TYPE_ZVAL = 1,
- MYSQLND_BUFFERED_TYPE_C
-};
-
-
#define MYSQLND_CLIENT_NO_FLAG 0
-#define MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA 1
#endif /* MYSQLND_ENUM_N_DEF_H */
diff --git a/ext/mysqlnd/mysqlnd_ext_plugin.c b/ext/mysqlnd/mysqlnd_ext_plugin.c
index 58a4ee767e..cf28b81ea5 100644
--- a/ext/mysqlnd/mysqlnd_ext_plugin.c
+++ b/ext/mysqlnd/mysqlnd_ext_plugin.c
@@ -83,30 +83,16 @@ mysqlnd_plugin__get_plugin_result_unbuffered_data(const MYSQLND_RES_UNBUFFERED *
}
/* }}} */
-
-/* {{{ _mysqlnd_plugin__get_plugin_result_buffered_data */
-static void **
-mysqlnd_plugin__get_plugin_result_buffered_data_zval(const MYSQLND_RES_BUFFERED_ZVAL * result, const unsigned int plugin_id)
-{
- DBG_ENTER("_mysqlnd_plugin__get_plugin_result_data");
- DBG_INF_FMT("plugin_id=%u", plugin_id);
- if (!result || plugin_id >= mysqlnd_plugin_count()) {
- return NULL;
- }
- DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES_BUFFERED_ZVAL) + plugin_id * sizeof(void *)));
-}
-/* }}} */
-
/* {{{ mysqlnd_plugin__get_plugin_result_buffered_data */
static void **
-mysqlnd_plugin__get_plugin_result_buffered_data_c(const MYSQLND_RES_BUFFERED_C * result, const unsigned int plugin_id)
+mysqlnd_plugin__get_plugin_result_buffered_data(const MYSQLND_RES_BUFFERED * result, const unsigned int plugin_id)
{
DBG_ENTER("mysqlnd_plugin__get_plugin_result_data");
DBG_INF_FMT("plugin_id=%u", plugin_id);
if (!result || plugin_id >= mysqlnd_plugin_count()) {
return NULL;
}
- DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES_BUFFERED_C) + plugin_id * sizeof(void *)));
+ DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES_BUFFERED) + plugin_id * sizeof(void *)));
}
/* }}} */
@@ -172,8 +158,7 @@ struct st_mysqlnd_plugin__plugin_area_getters mysqlnd_plugin_area_getters =
mysqlnd_plugin__get_plugin_connection_data_data,
mysqlnd_plugin__get_plugin_result_data,
mysqlnd_plugin__get_plugin_result_unbuffered_data,
- mysqlnd_plugin__get_plugin_result_buffered_data_zval,
- mysqlnd_plugin__get_plugin_result_buffered_data_c,
+ mysqlnd_plugin__get_plugin_result_buffered_data,
mysqlnd_plugin__get_plugin_stmt_data,
mysqlnd_plugin__get_plugin_protocol_data,
mysqlnd_plugin__get_plugin_pfc_data,
diff --git a/ext/mysqlnd/mysqlnd_ext_plugin.h b/ext/mysqlnd/mysqlnd_ext_plugin.h
index 713eb1f44f..027fda976a 100644
--- a/ext/mysqlnd/mysqlnd_ext_plugin.h
+++ b/ext/mysqlnd/mysqlnd_ext_plugin.h
@@ -25,8 +25,7 @@ struct st_mysqlnd_plugin__plugin_area_getters
void ** (*get_connection_data_area)(const MYSQLND_CONN_DATA * conn, const unsigned int plugin_id);
void ** (*get_result_area)(const MYSQLND_RES * result, const unsigned int plugin_id);
void ** (*get_unbuffered_area)(const MYSQLND_RES_UNBUFFERED * result, const unsigned int plugin_id);
- void ** (*get_result_buffered_area)(const MYSQLND_RES_BUFFERED_ZVAL * result, const unsigned int plugin_id);
- void ** (*get_result_buffered_aread_c)(const MYSQLND_RES_BUFFERED_C * result, const unsigned int plugin_id);
+ void ** (*get_result_buffered_aread)(const MYSQLND_RES_BUFFERED * result, const unsigned int plugin_id);
void ** (*get_stmt_area)(const MYSQLND_STMT * stmt, const unsigned int plugin_id);
void ** (*get_protocol_decoder_area)(const MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory, const unsigned int plugin_id);
void ** (*get_pfc_area)(const MYSQLND_PFC * pfc, const unsigned int plugin_id);
@@ -39,8 +38,7 @@ PHPAPI extern struct st_mysqlnd_plugin__plugin_area_getters mysqlnd_plugin_area_
#define mysqlnd_plugin_get_plugin_connection_data_data(c, p_id) mysqlnd_plugin_area_getters.get_connection_data_area((c), (p_id))
#define mysqlnd_plugin_get_plugin_result_data(res, p_id) mysqlnd_plugin_area_getters.get_result_area((res), (p_id))
#define mysqlnd_plugin_get_plugin_result_unbuffered_data(res, p_id) mysqlnd_plugin_area_getters.get_unbuffered_area((res), (p_id))
-#define mysqlnd_plugin_get_plugin_result_buffered_data_zval(res, p_id) mysqlnd_plugin_area_getters.get_result_buffered_area((res), (p_id))
-#define mysqlnd_plugin_get_plugin_result_buffered_data_c(res, p_id) mysqlnd_plugin_area_getters.get_result_buffered_aread_c((res), (p_id))
+#define mysqlnd_plugin_get_plugin_result_buffered_data_c(res, p_id) mysqlnd_plugin_area_getters.get_result_buffered_aread((res), (p_id))
#define mysqlnd_plugin_get_plugin_stmt_data(stmt, p_id) mysqlnd_plugin_area_getters.get_stmt_area((stmt), (p_id))
#define mysqlnd_plugin_get_plugin_protocol_data(proto, p_id) mysqlnd_plugin_area_getters.get_protocol_decoder_area((proto), (p_id))
#define mysqlnd_plugin_get_plugin_pfc_data(pfc, p_id) mysqlnd_plugin_area_getters.get_pfc_area((pfc), (p_id))
diff --git a/ext/mysqlnd/mysqlnd_libmysql_compat.h b/ext/mysqlnd/mysqlnd_libmysql_compat.h
index 092659e9dd..8782a44350 100644
--- a/ext/mysqlnd/mysqlnd_libmysql_compat.h
+++ b/ext/mysqlnd/mysqlnd_libmysql_compat.h
@@ -26,7 +26,7 @@
#define MYSQL_RES MYSQLND_RES
#define MYSQL_ROW MYSQLND_ROW_C
#define MYSQL MYSQLND
-#define my_bool zend_bool
+#define my_bool bool
#define my_ulonglong uint64_t
#define MYSQL_VERSION_ID MYSQLND_VERSION_ID
@@ -125,6 +125,7 @@
#define REFRESH_STATUS MYSQLND_REFRESH_STATUS
#define REFRESH_THREADS MYSQLND_REFRESH_THREADS
#define REFRESH_SLAVE MYSQLND_REFRESH_SLAVE
+#define REFRESH_REPLICA MYSQLND_REFRESH_REPLICA
#define REFRESH_MASTER MYSQLND_REFRESH_MASTER
#define REFRESH_BACKUP_LOG MYSQLND_REFRESH_BACKUP_LOG
diff --git a/ext/mysqlnd/mysqlnd_loaddata.c b/ext/mysqlnd/mysqlnd_loaddata.c
index 6cd100ab74..c00800c451 100644
--- a/ext/mysqlnd/mysqlnd_loaddata.c
+++ b/ext/mysqlnd/mysqlnd_loaddata.c
@@ -137,7 +137,7 @@ static const char *lost_conn = "Lost connection to MySQL server during LOAD DATA
/* {{{ mysqlnd_handle_local_infile */
enum_func_status
-mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char * const filename, zend_bool * is_warning)
+mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char * const filename, bool * is_warning)
{
zend_uchar *buf = NULL;
zend_uchar empty_packet[MYSQLND_HEADER_SIZE];
@@ -149,13 +149,51 @@ mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char * const filenam
MYSQLND_INFILE infile;
MYSQLND_PFC * net = conn->protocol_frame_codec;
MYSQLND_VIO * vio = conn->vio;
+ bool is_local_infile_enabled = (conn->options->flags & CLIENT_LOCAL_FILES) == CLIENT_LOCAL_FILES;
+ const char* local_infile_directory = conn->options->local_infile_directory;
+ bool is_local_infile_dir_set = local_infile_directory != NULL;
+ bool prerequisities_ok = TRUE;
DBG_ENTER("mysqlnd_handle_local_infile");
- if (!(conn->options->flags & CLIENT_LOCAL_FILES)) {
- php_error_docref(NULL, E_WARNING, "LOAD DATA LOCAL INFILE forbidden");
- SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE,
- "LOAD DATA LOCAL INFILE is forbidden, check mysqli.allow_local_infile");
+ /*
+ if local_infile is disabled, and local_infile_dir is not set, then operation is forbidden
+ */
+ if (!is_local_infile_enabled && !is_local_infile_dir_set) {
+ SET_CLIENT_ERROR(conn->error_info, CR_LOAD_DATA_LOCAL_INFILE_REJECTED, UNKNOWN_SQLSTATE,
+ "LOAD DATA LOCAL INFILE is forbidden, check related settings like "
+ "mysqli.allow_local_infile|mysqli.local_infile_directory or "
+ "PDO::MYSQL_ATTR_LOCAL_INFILE|PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY");
+ prerequisities_ok = FALSE;
+ }
+
+ /*
+ if local_infile_dir is set, then check whether it actually exists, and is accessible
+ */
+ if (is_local_infile_dir_set) {
+ php_stream *stream = php_stream_opendir(local_infile_directory, REPORT_ERRORS, NULL);
+ if (stream) {
+ php_stream_closedir(stream);
+ } else {
+ SET_CLIENT_ERROR(conn->error_info, CR_LOAD_DATA_LOCAL_INFILE_REJECTED, UNKNOWN_SQLSTATE, "cannot open local_infile_directory");
+ prerequisities_ok = FALSE;
+ }
+ }
+
+ /*
+ if local_infile is disabled and local_infile_dir is set, then we have to check whether
+ filename is located inside its subtree
+ but only in such a case, because when local_infile is enabled, then local_infile_dir is ignored
+ */
+ if (prerequisities_ok && !is_local_infile_enabled && is_local_infile_dir_set) {
+ if (php_check_specific_open_basedir(local_infile_directory, filename) == -1) {
+ SET_CLIENT_ERROR(conn->error_info, CR_LOAD_DATA_LOCAL_INFILE_REJECTED, UNKNOWN_SQLSTATE,
+ "LOAD DATA LOCAL INFILE DIRECTORY restriction in effect. Unable to open file");
+ prerequisities_ok = FALSE;
+ }
+ }
+
+ if (!prerequisities_ok) {
/* write empty packet to server */
ret = net->data->m.send(net, vio, empty_packet, 0, conn->stats, conn->error_info);
*is_warning = TRUE;
diff --git a/ext/mysqlnd/mysqlnd_priv.h b/ext/mysqlnd/mysqlnd_priv.h
index d0b97eb16e..c19bc10723 100644
--- a/ext/mysqlnd/mysqlnd_priv.h
+++ b/ext/mysqlnd/mysqlnd_priv.h
@@ -30,5 +30,5 @@ PHPAPI extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_upsert_status);
PHPAPI extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_error_info);
PHPAPI extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_command);
-enum_func_status mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char * const filename, zend_bool * is_warning);
+enum_func_status mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char * const filename, bool * is_warning);
#endif /* MYSQLND_PRIV_H */
diff --git a/ext/mysqlnd/mysqlnd_protocol_frame_codec.c b/ext/mysqlnd/mysqlnd_protocol_frame_codec.c
index f562e8fa5e..f16ce7bf9d 100644
--- a/ext/mysqlnd/mysqlnd_protocol_frame_codec.c
+++ b/ext/mysqlnd/mysqlnd_protocol_frame_codec.c
@@ -77,7 +77,7 @@ static ssize_t write_compressed_packet(
#ifdef WHEN_WE_NEED_TO_CHECK_WHETHER_COMPRESSION_WORKS_CORRECTLY
if (res == Z_OK) {
size_t decompressed_size = left + MYSQLND_HEADER_SIZE;
- zend_uchar * decompressed_data = mnd_malloc(decompressed_size);
+ zend_uchar * decompressed_data = mnd_emalloc(decompressed_size);
int error = pfc->data->m.decode(decompressed_data, decompressed_size,
compress_buf + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE, payload_size);
if (error == Z_OK) {
@@ -93,7 +93,7 @@ static ssize_t write_compressed_packet(
} else {
DBG_INF("error decompressing");
}
- mnd_free(decompressed_data);
+ mnd_efree(decompressed_data);
}
#endif /* WHEN_WE_NEED_TO_CHECK_WHETHER_COMPRESSION_WORKS_CORRECTLY */
DBG_RETURN(bytes_sent);
@@ -387,7 +387,7 @@ MYSQLND_METHOD(mysqlnd_pfc, set_client_option)(MYSQLND_PFC * const pfc, enum_mys
pfc->data->flags |= MYSQLND_PROTOCOL_FLAG_USE_COMPRESSION;
break;
case MYSQL_SERVER_PUBLIC_KEY: {
- const zend_bool pers = pfc->persistent;
+ const bool pers = pfc->persistent;
if (pfc->data->sha256_server_public_key) {
mnd_pefree(pfc->data->sha256_server_public_key, pers);
}
@@ -498,7 +498,7 @@ MYSQLND_CLASS_METHODS_END;
/* {{{ mysqlnd_pfc_init */
PHPAPI MYSQLND_PFC *
-mysqlnd_pfc_init(const zend_bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
+mysqlnd_pfc_init(const bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
{
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *factory = object_factory? object_factory : &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory);
MYSQLND_PFC * pfc;
diff --git a/ext/mysqlnd/mysqlnd_protocol_frame_codec.h b/ext/mysqlnd/mysqlnd_protocol_frame_codec.h
index 8ba317f0e2..1aa6d703d9 100644
--- a/ext/mysqlnd/mysqlnd_protocol_frame_codec.h
+++ b/ext/mysqlnd/mysqlnd_protocol_frame_codec.h
@@ -18,7 +18,7 @@
#ifndef MYSQLND_PROTOCOL_FRAME_CODEC_H
#define MYSQLND_PROTOCOL_FRAME_CODEC_H
-PHPAPI MYSQLND_PFC * mysqlnd_pfc_init(const zend_bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
+PHPAPI MYSQLND_PFC * mysqlnd_pfc_init(const bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
PHPAPI void mysqlnd_pfc_free(MYSQLND_PFC * const pfc, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
#endif /* MYSQLND_PROTOCOL_FRAME_CODEC_H */
diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c
index f3dee49d88..66a60c4f95 100644
--- a/ext/mysqlnd/mysqlnd_ps.c
+++ b/ext/mysqlnd/mysqlnd_ps.c
@@ -32,8 +32,8 @@ const char * const mysqlnd_not_bound_as_blob = "Can't send long data for non-str
const char * const mysqlnd_stmt_not_prepared = "Statement not prepared";
/* Exported by mysqlnd_ps_codec.c */
-enum_func_status mysqlnd_stmt_execute_generate_request(MYSQLND_STMT * const s, zend_uchar ** request, size_t *request_len, zend_bool * free_buffer);
-enum_func_status mysqlnd_stmt_execute_batch_generate_request(MYSQLND_STMT * const s, zend_uchar ** request, size_t *request_len, zend_bool * free_buffer);
+enum_func_status mysqlnd_stmt_execute_generate_request(MYSQLND_STMT * const s, zend_uchar ** request, size_t *request_len, bool * free_buffer);
+enum_func_status mysqlnd_stmt_execute_batch_generate_request(MYSQLND_STMT * const s, zend_uchar ** request, size_t *request_len, bool * free_buffer);
static void mysqlnd_stmt_separate_result_bind(MYSQLND_STMT * const stmt);
@@ -54,7 +54,7 @@ static enum_func_status mysqlnd_stmt_send_cursor_fetch_command(
return PASS;
}
-static zend_bool mysqlnd_stmt_check_state(const MYSQLND_STMT_DATA *stmt)
+static bool mysqlnd_stmt_check_state(const MYSQLND_STMT_DATA *stmt)
{
const MYSQLND_CONN_DATA *conn = stmt->conn;
if (stmt->state != MYSQLND_STMT_WAITING_USE_OR_STORE) {
@@ -109,7 +109,7 @@ MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const s)
result->type = MYSQLND_RES_PS_BUF;
/* result->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol; */
- result->stored_data = (MYSQLND_RES_BUFFERED *) mysqlnd_result_buffered_zval_init(result, result->field_count, TRUE);
+ result->stored_data = mysqlnd_result_buffered_init(result, result->field_count, stmt);
if (!result->stored_data) {
SET_OOM_ERROR(conn->error_info);
DBG_RETURN(NULL);
@@ -117,30 +117,8 @@ MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const s)
ret = result->m.store_result_fetch_data(conn, result, result->meta, &result->stored_data->row_buffers, TRUE);
- result->stored_data->m.fetch_row = mysqlnd_stmt_fetch_row_buffered;
-
if (PASS == ret) {
- if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_ZVAL) {
- MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result->stored_data;
- if (result->stored_data->row_count) {
- /* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */
- if (result->stored_data->row_count * result->meta->field_count * sizeof(zval *) > SIZE_MAX) {
- SET_OOM_ERROR(conn->error_info);
- DBG_RETURN(NULL);
- }
- /* if pecalloc is used valgrind barks gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux) */
- set->data = mnd_emalloc((size_t)(result->stored_data->row_count * result->meta->field_count * sizeof(zval)));
- if (!set->data) {
- SET_OOM_ERROR(conn->error_info);
- DBG_RETURN(NULL);
- }
- memset(set->data, 0, (size_t)(result->stored_data->row_count * result->meta->field_count * sizeof(zval)));
- }
- /* Position at the first row */
- set->data_cursor = set->data;
- } else if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_ZVAL) {
- /*TODO*/
- }
+ result->stored_data->current_row = 0;
/* libmysql API docs say it should be so for SELECT statements */
UPSERT_STATUS_SET_AFFECTED_ROWS(stmt->upsert_status, stmt->result->stored_data->row_count);
@@ -208,7 +186,7 @@ MYSQLND_METHOD(mysqlnd_stmt, get_result)(MYSQLND_STMT * const s)
break;
}
- if (result->m.store_result(result, conn, MYSQLND_STORE_PS | MYSQLND_STORE_NO_COPY)) {
+ if (result->m.store_result(result, conn, stmt)) {
UPSERT_STATUS_SET_AFFECTED_ROWS(stmt->upsert_status, result->stored_data->row_count);
stmt->state = MYSQLND_STMT_PREPARED;
result->type = MYSQLND_RES_PS_BUF;
@@ -229,7 +207,7 @@ MYSQLND_METHOD(mysqlnd_stmt, get_result)(MYSQLND_STMT * const s)
/* {{{ mysqlnd_stmt::more_results */
-static zend_bool
+static bool
MYSQLND_METHOD(mysqlnd_stmt, more_results)(const MYSQLND_STMT * s)
{
MYSQLND_STMT_DATA * stmt = s? s->data : NULL;
@@ -484,11 +462,11 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const
if (stmt_to_prepare != stmt) {
/* swap */
size_t real_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *);
- char * tmp_swap = mnd_malloc(real_size);
+ char * tmp_swap = mnd_emalloc(real_size);
memcpy(tmp_swap, s, real_size);
memcpy(s, s_to_prepare, real_size);
memcpy(s_to_prepare, tmp_swap, real_size);
- mnd_free(tmp_swap);
+ mnd_efree(tmp_swap);
{
MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare;
stmt_to_prepare = stmt;
@@ -588,11 +566,6 @@ mysqlnd_stmt_execute_parse_response(MYSQLND_STMT * const s, enum_mysqlnd_parse_e
}
stmt->field_count = stmt->result->field_count = conn->field_count;
- if (stmt->result->stored_data) {
- stmt->result->stored_data->lengths = NULL;
- } else if (stmt->result->unbuf) {
- stmt->result->unbuf->lengths = NULL;
- }
if (stmt->field_count) {
stmt->state = MYSQLND_STMT_WAITING_USE_OR_STORE;
/*
@@ -680,7 +653,7 @@ MYSQLND_METHOD(mysqlnd_stmt, send_execute)(MYSQLND_STMT * const s, const enum_my
enum_func_status ret;
zend_uchar *request = NULL;
size_t request_len;
- zend_bool free_request;
+ bool free_request;
DBG_ENTER("mysqlnd_stmt::send_execute");
if (!stmt || !conn) {
@@ -758,218 +731,6 @@ MYSQLND_METHOD(mysqlnd_stmt, send_execute)(MYSQLND_STMT * const s, const enum_my
/* }}} */
-/* {{{ mysqlnd_stmt_fetch_row_buffered */
-enum_func_status
-mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything)
-{
- MYSQLND_STMT * s = (MYSQLND_STMT *) param;
- MYSQLND_STMT_DATA * stmt = s? s->data : NULL;
- const MYSQLND_RES_METADATA * const meta = result->meta;
- unsigned int field_count = meta->field_count;
-
- DBG_ENTER("mysqlnd_stmt_fetch_row_buffered");
- *fetched_anything = FALSE;
- DBG_INF_FMT("stmt=%lu", stmt != NULL ? stmt->stmt_id : 0L);
-
- /* If we haven't read everything */
- if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_ZVAL) {
- MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result->stored_data;
- if (set->data_cursor &&
- (set->data_cursor - set->data) < (result->stored_data->row_count * field_count))
- {
- /* The user could have skipped binding - don't crash*/
- if (stmt->result_bind) {
- unsigned int i;
- zval *current_row = set->data_cursor;
-
- if (Z_ISUNDEF(current_row[0])) {
- uint64_t row_num = (set->data_cursor - set->data) / field_count;
- enum_func_status rc = result->stored_data->m.row_decoder(&result->stored_data->row_buffers[row_num],
- current_row,
- meta->field_count,
- meta->fields,
- result->conn->options->int_and_float_native,
- result->conn->stats);
- if (PASS != rc) {
- DBG_RETURN(FAIL);
- }
- result->stored_data->initialized_rows++;
- if (stmt->update_max_length) {
- for (i = 0; i < result->field_count; i++) {
- /*
- NULL fields are 0 length, 0 is not more than 0
- String of zero size, definitely can't be the next max_length.
- Thus for NULL and zero-length we are quite efficient.
- */
- if (Z_TYPE(current_row[i]) == IS_STRING) {
- zend_ulong len = Z_STRLEN(current_row[i]);
- if (meta->fields[i].max_length < len) {
- meta->fields[i].max_length = len;
- }
- }
- }
- }
- }
-
- for (i = 0; i < result->field_count; i++) {
- /* copy the type */
- zval *resultzv = &stmt->result_bind[i].zv;
- if (stmt->result_bind[i].bound == TRUE) {
- DBG_INF_FMT("i=%u type=%u", i, Z_TYPE(current_row[i]));
- ZEND_TRY_ASSIGN_COPY_EX(resultzv, &current_row[i], 0);
- }
- }
- }
- set->data_cursor += field_count;
- *fetched_anything = TRUE;
- /* buffered result sets don't have a connection */
- MYSQLND_INC_GLOBAL_STATISTIC(STAT_ROWS_FETCHED_FROM_CLIENT_PS_BUF);
- DBG_INF("row fetched");
- } else {
- set->data_cursor = NULL;
- DBG_INF("no more data");
- }
- } else if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_C) {
- /*TODO*/
- }
- DBG_INF("PASS");
- DBG_RETURN(PASS);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_stmt_fetch_row_unbuffered */
-enum_func_status
-mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything)
-{
- enum_func_status ret;
- MYSQLND_STMT * s = (MYSQLND_STMT *) param;
- MYSQLND_STMT_DATA * stmt = s? s->data : NULL;
- MYSQLND_PACKET_ROW * row_packet;
- MYSQLND_CONN_DATA * conn = result->conn;
- const MYSQLND_RES_METADATA * const meta = result->meta;
- void *checkpoint;
-
- DBG_ENTER("mysqlnd_stmt_fetch_row_unbuffered");
-
- *fetched_anything = FALSE;
-
- if (result->unbuf->eof_reached) {
- /* No more rows obviously */
- DBG_INF("EOF already reached");
- DBG_RETURN(PASS);
- }
- if (GET_CONNECTION_STATE(&conn->state) != CONN_FETCHING_DATA) {
- SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync);
- DBG_ERR("command out of sync");
- DBG_RETURN(FAIL);
- }
- if (!(row_packet = result->unbuf->row_packet)) {
- DBG_RETURN(FAIL);
- }
-
- /* Let the row packet fill our buffer and skip additional malloc + memcpy */
- row_packet->skip_extraction = stmt && stmt->result_bind? FALSE:TRUE;
-
- checkpoint = result->memory_pool->checkpoint;
- mysqlnd_mempool_save_state(result->memory_pool);
-
- /*
- If we skip rows (stmt == NULL || stmt->result_bind == NULL) we have to
- result->unbuf->m.free_last_data() before it. The function returns always true.
- */
- if (PASS == (ret = PACKET_READ(conn, row_packet)) && !row_packet->eof) {
- unsigned int i, field_count = result->field_count;
-
- if (!row_packet->skip_extraction) {
- result->unbuf->m.free_last_data(result->unbuf, conn->stats);
-
- result->unbuf->last_row_data = row_packet->fields;
- result->unbuf->last_row_buffer = row_packet->row_buffer;
- row_packet->fields = NULL;
- row_packet->row_buffer.ptr = NULL;
-
- if (PASS != result->unbuf->m.row_decoder(&result->unbuf->last_row_buffer,
- result->unbuf->last_row_data,
- row_packet->field_count,
- row_packet->fields_metadata,
- conn->options->int_and_float_native,
- conn->stats))
- {
- mysqlnd_mempool_restore_state(result->memory_pool);
- result->memory_pool->checkpoint = checkpoint;
- DBG_RETURN(FAIL);
- }
-
- for (i = 0; i < field_count; i++) {
- zval *resultzv = &stmt->result_bind[i].zv;
- if (stmt->result_bind[i].bound == TRUE) {
- zval *data = &result->unbuf->last_row_data[i];
-
- if (Z_TYPE_P(data) == IS_STRING && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){
- meta->fields[i].max_length = Z_STRLEN_P(data);
- }
-
- ZEND_TRY_ASSIGN_VALUE_EX(resultzv, data, 0);
- /* copied data, thus also the ownership. Thus null data */
- ZVAL_NULL(data);
- }
- }
- MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_UNBUF);
- } else {
- DBG_INF("skipping extraction");
- /*
- Data has been allocated and usually result->unbuf->m.free_last_data()
- frees it but we can't call this function as it will cause problems with
- the bound variables. Thus we need to do part of what it does or Zend will
- report leaks.
- */
- row_packet->result_set_memory_pool->free_chunk(
- row_packet->result_set_memory_pool, row_packet->row_buffer.ptr);
- row_packet->row_buffer.ptr = NULL;
- }
-
- result->unbuf->row_count++;
- *fetched_anything = TRUE;
- } else if (ret == FAIL) {
- if (row_packet->error_info.error_no) {
- COPY_CLIENT_ERROR(conn->error_info, row_packet->error_info);
- if (stmt) {
- COPY_CLIENT_ERROR(stmt->error_info, row_packet->error_info);
- }
- }
- if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) {
- SET_CONNECTION_STATE(&conn->state, CONN_READY);
- }
- result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */
- } else if (row_packet->eof) {
- DBG_INF("EOF");
- /* Mark the connection as usable again */
- result->unbuf->eof_reached = TRUE;
- UPSERT_STATUS_RESET(conn->upsert_status);
- UPSERT_STATUS_SET_WARNINGS(conn->upsert_status, row_packet->warning_count);
- UPSERT_STATUS_SET_SERVER_STATUS(conn->upsert_status, row_packet->server_status);
-
- /*
- result->row_packet will be cleaned when
- destroying the result object
- */
- if (UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status) & SERVER_MORE_RESULTS_EXISTS) {
- SET_CONNECTION_STATE(&conn->state, CONN_NEXT_RESULT_PENDING);
- } else {
- SET_CONNECTION_STATE(&conn->state, CONN_READY);
- }
- }
-
- mysqlnd_mempool_restore_state(result->memory_pool);
- result->memory_pool->checkpoint = checkpoint;
-
- DBG_INF_FMT("ret=%s fetched_anything=%u", ret == PASS? "PASS":"FAIL", *fetched_anything);
- DBG_RETURN(ret);
-}
-/* }}} */
-
-
/* {{{ mysqlnd_stmt::use_result */
static MYSQLND_RES *
MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT * s)
@@ -995,9 +756,10 @@ MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT * s)
MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_PS_UNBUFFERED_SETS);
result = stmt->result;
- result->m.use_result(stmt->result, TRUE);
- result->unbuf->m.fetch_row = stmt->cursor_exists? mysqlnd_fetch_stmt_row_cursor:
- mysqlnd_stmt_fetch_row_unbuffered;
+ result->m.use_result(stmt->result, stmt);
+ if (stmt->cursor_exists) {
+ result->unbuf->m.fetch_row = mysqlnd_fetch_stmt_row_cursor;
+ }
stmt->state = MYSQLND_STMT_USE_OR_STORE_CALLED;
DBG_INF_FMT("%p", result);
@@ -1008,13 +770,13 @@ MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT * s)
/* {{{ mysqlnd_fetch_row_cursor */
enum_func_status
-mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything)
+mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, zval **row_ptr, const unsigned int flags, bool * fetched_anything)
{
enum_func_status ret;
- MYSQLND_STMT * s = (MYSQLND_STMT *) param;
- MYSQLND_STMT_DATA * stmt = s? s->data : NULL;
- MYSQLND_CONN_DATA * conn = stmt? stmt->conn : NULL;
+ MYSQLND_STMT_DATA * stmt = result->unbuf->stmt;
+ MYSQLND_CONN_DATA * conn = stmt->conn;
MYSQLND_PACKET_ROW * row_packet;
+ void *checkpoint;
DBG_ENTER("mysqlnd_fetch_stmt_row_cursor");
@@ -1042,70 +804,33 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned
DBG_RETURN(FAIL);
}
- row_packet->skip_extraction = stmt->result_bind? FALSE:TRUE;
+ checkpoint = result->memory_pool->checkpoint;
+ mysqlnd_mempool_save_state(result->memory_pool);
UPSERT_STATUS_RESET(stmt->upsert_status);
if (PASS == (ret = PACKET_READ(conn, row_packet)) && !row_packet->eof) {
- const MYSQLND_RES_METADATA * const meta = result->meta;
- unsigned int i, field_count = result->field_count;
-
- if (!row_packet->skip_extraction) {
- result->unbuf->m.free_last_data(result->unbuf, conn->stats);
-
- result->unbuf->last_row_data = row_packet->fields;
+ if (row_ptr) {
result->unbuf->last_row_buffer = row_packet->row_buffer;
- row_packet->fields = NULL;
row_packet->row_buffer.ptr = NULL;
+ *row_ptr = result->row_data;
if (PASS != result->unbuf->m.row_decoder(&result->unbuf->last_row_buffer,
- result->unbuf->last_row_data,
+ result->row_data,
row_packet->field_count,
row_packet->fields_metadata,
conn->options->int_and_float_native,
conn->stats))
{
+ mysqlnd_mempool_restore_state(result->memory_pool);
+ result->memory_pool->checkpoint = checkpoint;
DBG_RETURN(FAIL);
}
-
- /* If no result bind, do nothing. We consumed the data */
- for (i = 0; i < field_count; i++) {
- zval *resultzv = &stmt->result_bind[i].zv;
- if (stmt->result_bind[i].bound == TRUE) {
- zval *data = &result->unbuf->last_row_data[i];
-
- DBG_INF_FMT("i=%u bound_var=%p type=%u refc=%u", i, &stmt->result_bind[i].zv,
- Z_TYPE_P(data), Z_REFCOUNTED(stmt->result_bind[i].zv)?
- Z_REFCOUNT(stmt->result_bind[i].zv) : 0);
-
- if (Z_TYPE_P(data) == IS_STRING &&
- (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))) {
- meta->fields[i].max_length = Z_STRLEN_P(data);
- }
-
- ZEND_TRY_ASSIGN_VALUE_EX(resultzv, data, 0);
- /* copied data, thus also the ownership. Thus null data */
- ZVAL_NULL(data);
- }
- }
} else {
DBG_INF("skipping extraction");
- /*
- Data has been allocated and usually result->unbuf->m.free_last_data()
- frees it but we can't call this function as it will cause problems with
- the bound variables. Thus we need to do part of what it does or Zend will
- report leaks.
- */
- row_packet->result_set_memory_pool->free_chunk(
- row_packet->result_set_memory_pool, row_packet->row_buffer.ptr);
row_packet->row_buffer.ptr = NULL;
}
/* We asked for one row, the next one should be EOF, eat it */
ret = PACKET_READ(conn, row_packet);
- if (row_packet->row_buffer.ptr) {
- row_packet->result_set_memory_pool->free_chunk(
- row_packet->result_set_memory_pool, row_packet->row_buffer.ptr);
- row_packet->row_buffer.ptr = NULL;
- }
MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_CURSOR);
result->unbuf->row_count++;
@@ -1126,6 +851,9 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned
UPSERT_STATUS_SET_SERVER_STATUS(stmt->upsert_status, row_packet->server_status);
UPSERT_STATUS_SET_SERVER_STATUS(conn->upsert_status, row_packet->server_status);
+ mysqlnd_mempool_restore_state(result->memory_pool);
+ result->memory_pool->checkpoint = checkpoint;
+
DBG_INF_FMT("ret=%s fetched=%u server_status=%u warnings=%u eof=%u",
ret == PASS? "PASS":"FAIL", *fetched_anything,
row_packet->server_status, row_packet->warning_count,
@@ -1137,7 +865,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned
/* {{{ mysqlnd_stmt::fetch */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const s, zend_bool * const fetched_anything)
+MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const s, bool * const fetched_anything)
{
MYSQLND_STMT_DATA * stmt = s? s->data : NULL;
MYSQLND_CONN_DATA * conn = stmt? stmt->conn : NULL;
@@ -1162,7 +890,24 @@ MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const s, zend_bool * const fe
SET_EMPTY_ERROR(stmt->error_info);
SET_EMPTY_ERROR(conn->error_info);
- ret = stmt->result->m.fetch_row(stmt->result, (void*)s, 0, fetched_anything);
+ if (stmt->result_bind) {
+ zval *row_data;
+ ret = stmt->result->m.fetch_row(stmt->result, &row_data, 0, fetched_anything);
+ if (ret == PASS && *fetched_anything) {
+ unsigned field_count = stmt->result->field_count;
+ for (unsigned i = 0; i < field_count; i++) {
+ zval *resultzv = &stmt->result_bind[i].zv;
+ if (stmt->result_bind[i].bound == TRUE) {
+ DBG_INF_FMT("i=%u type=%u", i, Z_TYPE(row_data[i]));
+ ZEND_TRY_ASSIGN_VALUE_EX(resultzv, &row_data[i], 0);
+ } else {
+ zval_ptr_dtor_nogc(&row_data[i]);
+ }
+ }
+ }
+ } else {
+ ret = stmt->result->m.fetch_row(stmt->result, NULL, 0, fetched_anything);
+ }
DBG_RETURN(ret);
}
/* }}} */
@@ -1766,13 +1511,6 @@ MYSQLND_METHOD(mysqlnd_stmt, result_metadata)(MYSQLND_STMT * const s)
DBG_RETURN(NULL);
}
- if (stmt->update_max_length && stmt->result->stored_data) {
- /* stored result, we have to update the max_length before we clone the meta data :( */
- stmt->result->stored_data->m.initialize_result_set_rest(stmt->result->stored_data,
- stmt->result->meta,
- conn->stats,
- conn->options->int_and_float_native);
- }
/*
TODO: This implementation is kind of a hack,
find a better way to do it. In different functions I have put
@@ -1785,7 +1523,7 @@ MYSQLND_METHOD(mysqlnd_stmt, result_metadata)(MYSQLND_STMT * const s)
break;
}
result_meta->type = MYSQLND_RES_NORMAL;
- result_meta->unbuf = mysqlnd_result_unbuffered_init(result_meta, stmt->field_count, TRUE);
+ result_meta->unbuf = mysqlnd_result_unbuffered_init(result_meta, stmt->field_count, stmt);
if (!result_meta->unbuf) {
break;
}
@@ -1878,7 +1616,7 @@ MYSQLND_METHOD(mysqlnd_stmt, attr_get)(const MYSQLND_STMT * const s,
switch (attr_type) {
case STMT_ATTR_UPDATE_MAX_LENGTH:
- *(zend_bool *) value= stmt->update_max_length;
+ *(bool *) value= stmt->update_max_length;
break;
case STMT_ATTR_CURSOR_TYPE:
*(unsigned long *) value= stmt->flags;
@@ -2004,7 +1742,7 @@ MYSQLND_METHOD(mysqlnd_stmt, free_stmt_result)(MYSQLND_STMT * const s)
mysqlnd_stmt_separate_result_bind(s);
/* Not every statement has a result set attached */
if (stmt->result) {
- stmt->result->m.free_result_internal(stmt->result);
+ stmt->result->m.free_result(stmt->result, /* implicit */ TRUE);
stmt->result = NULL;
}
zend_llist_clean(&stmt->error_info->error_list);
@@ -2052,7 +1790,7 @@ MYSQLND_METHOD(mysqlnd_stmt, free_stmt_content)(MYSQLND_STMT * const s)
/* {{{ mysqlnd_stmt::close_on_server */
static enum_func_status
-MYSQLND_METHOD_PRIVATE(mysqlnd_stmt, close_on_server)(MYSQLND_STMT * const s, zend_bool implicit)
+MYSQLND_METHOD_PRIVATE(mysqlnd_stmt, close_on_server)(MYSQLND_STMT * const s, bool implicit)
{
MYSQLND_STMT_DATA * stmt = s? s->data : NULL;
MYSQLND_CONN_DATA * conn = stmt? stmt->conn : NULL;
@@ -2136,7 +1874,7 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_stmt, close_on_server)(MYSQLND_STMT * const s, ze
/* {{{ mysqlnd_stmt::dtor */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit)
+MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, bool implicit)
{
MYSQLND_STMT_DATA * stmt = (s != NULL) ? s->data:NULL;
enum_func_status ret = FAIL;
diff --git a/ext/mysqlnd/mysqlnd_ps.h b/ext/mysqlnd/mysqlnd_ps.h
index 0d4f7f8068..f590d4d798 100644
--- a/ext/mysqlnd/mysqlnd_ps.h
+++ b/ext/mysqlnd/mysqlnd_ps.h
@@ -26,14 +26,14 @@ struct st_mysqlnd_perm_bind {
/* should be signed int */
int pack_len;
unsigned int php_type;
- zend_bool is_possibly_blob;
- zend_bool can_ret_as_str_in_uni;
+ bool is_possibly_blob;
+ bool can_ret_as_str_in_uni;
};
extern struct st_mysqlnd_perm_bind mysqlnd_ps_fetch_functions[MYSQL_TYPE_LAST + 1];
-enum_func_status mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything);
-enum_func_status mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything);
+enum_func_status mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES * result, zval **row_data, const unsigned int flags, bool * fetched_anything);
+enum_func_status mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, zval **row_data, const unsigned int flags, bool * fetched_anything);
void _mysqlnd_init_ps_subsystem();/* This one is private, mysqlnd_library_init() will call it */
void _mysqlnd_init_ps_fetch_subsystem();
diff --git a/ext/mysqlnd/mysqlnd_ps_codec.c b/ext/mysqlnd/mysqlnd_ps_codec.c
index e942f10fac..eba4805b9d 100644
--- a/ext/mysqlnd/mysqlnd_ps_codec.c
+++ b/ext/mysqlnd/mysqlnd_ps_codec.c
@@ -40,7 +40,7 @@ struct st_mysqlnd_time
{
unsigned int year, month, day, hour, minute, second;
zend_ulong second_part;
- zend_bool neg;
+ bool neg;
enum mysqlnd_timestamp_type time_type;
};
@@ -57,7 +57,7 @@ ps_fetch_from_1_to_8_bytes(zval * zv, const MYSQLND_FIELD * const field, const u
{
char tmp[22];
size_t tmp_len = 0;
- zend_bool is_bit = field->type == MYSQL_TYPE_BIT;
+ bool is_bit = field->type == MYSQL_TYPE_BIT;
DBG_ENTER("ps_fetch_from_1_to_8_bytes");
DBG_INF_FMT("zv=%p byte_count=%u", zv, byte_count);
if (field->flags & UNSIGNED_FLAG) {
@@ -74,6 +74,11 @@ ps_fetch_from_1_to_8_bytes(zval * zv, const MYSQLND_FIELD * const field, const u
case 1:uval = (uint64_t) uint1korr(*row);break;
}
+ if (field->flags & ZEROFILL_FLAG) {
+ DBG_INF("stringify due to zerofill");
+ tmp_len = sprintf((char *)&tmp, "%0*" PRIu64, (int) field->length, uval);
+ DBG_INF_FMT("value=%s", tmp);
+ } else
#if SIZEOF_ZEND_LONG==4
if (uval > INT_MAX) {
DBG_INF("stringify");
@@ -212,15 +217,14 @@ static void
ps_fetch_time(zval * zv, const MYSQLND_FIELD * const field, const unsigned int pack_len, const zend_uchar ** row)
{
struct st_mysqlnd_time t;
- zend_ulong length; /* First byte encodes the length*/
- char * value;
+ zend_ulong length; /* First byte encodes the length */
DBG_ENTER("ps_fetch_time");
if ((length = php_mysqlnd_net_field_length(row))) {
const zend_uchar * to = *row;
t.time_type = MYSQLND_TIMESTAMP_TIME;
- t.neg = (zend_bool) to[0];
+ t.neg = (bool) to[0];
t.day = (zend_ulong) sint4korr(to+1);
t.hour = (unsigned int) to[5];
@@ -241,24 +245,13 @@ ps_fetch_time(zval * zv, const MYSQLND_FIELD * const field, const unsigned int p
}
if (field->decimals > 0 && field->decimals < 7) {
- length = mnd_sprintf(
- &value,
- 0,
- "%s%02u:%02u:%02u.%0*u",
- (t.neg ? "-" : ""),
- t.hour,
- t.minute,
- t.second,
- field->decimals,
- (uint32_t) (t.second_part / pow(10, 6 - field->decimals))
- );
+ ZVAL_STR(zv, zend_strpprintf(0, "%s%02u:%02u:%02u.%0*u",
+ (t.neg ? "-" : ""), t.hour, t.minute, t.second, field->decimals,
+ (uint32_t) (t.second_part / pow(10, 6 - field->decimals))));
} else {
- length = mnd_sprintf(&value, 0, "%s%02u:%02u:%02u", (t.neg ? "-" : ""), t.hour, t.minute, t.second);
+ ZVAL_STR(zv, zend_strpprintf(0, "%s%02u:%02u:%02u",
+ (t.neg ? "-" : ""), t.hour, t.minute, t.second));
}
-
- DBG_INF_FMT("%s", value);
- ZVAL_STRINGL(zv, value, length);
- mnd_sprintf_free(value);
DBG_VOID_RETURN;
}
/* }}} */
@@ -270,7 +263,6 @@ ps_fetch_date(zval * zv, const MYSQLND_FIELD * const field, const unsigned int p
{
struct st_mysqlnd_time t = {0};
zend_ulong length; /* First byte encodes the length*/
- char * value;
DBG_ENTER("ps_fetch_date");
if ((length = php_mysqlnd_net_field_length(row))) {
@@ -291,11 +283,7 @@ ps_fetch_date(zval * zv, const MYSQLND_FIELD * const field, const unsigned int p
t.time_type = MYSQLND_TIMESTAMP_DATE;
}
- length = mnd_sprintf(&value, 0, "%04u-%02u-%02u", t.year, t.month, t.day);
-
- DBG_INF_FMT("%s", value);
- ZVAL_STRINGL(zv, value, length);
- mnd_sprintf_free(value);
+ ZVAL_STR(zv, zend_strpprintf(0, "%04u-%02u-%02u", t.year, t.month, t.day));
DBG_VOID_RETURN;
}
/* }}} */
@@ -307,7 +295,6 @@ ps_fetch_datetime(zval * zv, const MYSQLND_FIELD * const field, const unsigned i
{
struct st_mysqlnd_time t;
zend_ulong length; /* First byte encodes the length*/
- char * value;
DBG_ENTER("ps_fetch_datetime");
if ((length = php_mysqlnd_net_field_length(row))) {
@@ -336,26 +323,13 @@ ps_fetch_datetime(zval * zv, const MYSQLND_FIELD * const field, const unsigned i
}
if (field->decimals > 0 && field->decimals < 7) {
- length = mnd_sprintf(
- &value,
- 0,
- "%04u-%02u-%02u %02u:%02u:%02u.%0*u",
- t.year,
- t.month,
- t.day,
- t.hour,
- t.minute,
- t.second,
- field->decimals,
- (uint32_t) (t.second_part / pow(10, 6 - field->decimals))
- );
+ ZVAL_STR(zv, zend_strpprintf(0, "%04u-%02u-%02u %02u:%02u:%02u.%0*u",
+ t.year, t.month, t.day, t.hour, t.minute, t.second, field->decimals,
+ (uint32_t) (t.second_part / pow(10, 6 - field->decimals))));
} else {
- length = mnd_sprintf(&value, 0, "%04u-%02u-%02u %02u:%02u:%02u", t.year, t.month, t.day, t.hour, t.minute, t.second);
+ ZVAL_STR(zv, zend_strpprintf(0, "%04u-%02u-%02u %02u:%02u:%02u",
+ t.year, t.month, t.day, t.hour, t.minute, t.second));
}
-
- DBG_INF_FMT("%s", value);
- ZVAL_STRINGL(zv, value, length);
- mnd_sprintf_free(value);
DBG_VOID_RETURN;
}
/* }}} */
@@ -365,15 +339,11 @@ ps_fetch_datetime(zval * zv, const MYSQLND_FIELD * const field, const unsigned i
static void
ps_fetch_string(zval * zv, const MYSQLND_FIELD * const field, const unsigned int pack_len, const zend_uchar ** row)
{
- /*
- For now just copy, before we make it possible
- to write \0 to the row buffer
- */
const zend_ulong length = php_mysqlnd_net_field_length(row);
DBG_ENTER("ps_fetch_string");
DBG_INF_FMT("len = %lu", length);
DBG_INF("copying from the row buffer");
- ZVAL_STRINGL(zv, (char *)*row, length);
+ ZVAL_STRINGL_FAST(zv, (char *)*row, length);
(*row) += length;
DBG_VOID_RETURN;
@@ -638,7 +608,7 @@ mysqlnd_stmt_execute_prepare_param_types(MYSQLND_STMT_DATA * stmt, zval ** copie
*/
if (d >= (double) ZEND_LONG_MAX || d < (double) ZEND_LONG_MIN) {
stmt->send_types_to_server = *resend_types_next_time = 1;
- convert_to_string_ex(tmp_data);
+ convert_to_string(tmp_data);
} else {
convert_to_long(tmp_data);
}
@@ -682,7 +652,7 @@ mysqlnd_stmt_execute_store_types(MYSQLND_STMT_DATA * stmt, zval * copies, zend_u
current_type = MYSQL_TYPE_VAR_STRING;
/*
don't change stmt->param_bind[i].type to MYSQL_TYPE_VAR_STRING
- we force convert_to_long_ex in all cases, thus the type will be right in the next switch.
+ we force convert_to_long in all cases, thus the type will be right in the next switch.
if the type is however not long, then we will do a goto in the next switch.
We want to preserve the original bind type given by the user. Thus, we do these hacks.
*/
@@ -749,7 +719,7 @@ mysqlnd_stmt_execute_calculate_param_values_size(MYSQLND_STMT_DATA * stmt, zval
if (Z_TYPE_P(tmp_data) == IS_STRING) {
goto use_string;
}
- convert_to_long_ex(tmp_data);
+ convert_to_long(tmp_data);
}
*data_size += 4 + is_longlong;
break;
@@ -806,7 +776,7 @@ mysqlnd_stmt_execute_store_param_values(MYSQLND_STMT_DATA * stmt, zval * copies,
} else {
switch (stmt->param_bind[i].type) {
case MYSQL_TYPE_DOUBLE:
- convert_to_double_ex(data);
+ convert_to_double(data);
float8store(*p, Z_DVAL_P(data));
(*p) += 8;
break;
@@ -940,7 +910,7 @@ end:
/* {{{ mysqlnd_stmt_execute_generate_request */
enum_func_status
-mysqlnd_stmt_execute_generate_request(MYSQLND_STMT * const s, zend_uchar ** request, size_t *request_len, zend_bool * free_buffer)
+mysqlnd_stmt_execute_generate_request(MYSQLND_STMT * const s, zend_uchar ** request, size_t *request_len, bool * free_buffer)
{
MYSQLND_STMT_DATA * stmt = s->data;
zend_uchar *p = stmt->execute_cmd_buffer.buffer,
diff --git a/ext/mysqlnd/mysqlnd_read_buffer.c b/ext/mysqlnd/mysqlnd_read_buffer.c
index d2ff02e7ca..e4c761c7de 100644
--- a/ext/mysqlnd/mysqlnd_read_buffer.c
+++ b/ext/mysqlnd/mysqlnd_read_buffer.c
@@ -22,7 +22,7 @@
/* {{{ mysqlnd_read_buffer_is_empty */
-static zend_bool
+static bool
mysqlnd_read_buffer_is_empty(const MYSQLND_READ_BUFFER * const buffer)
{
return buffer->len? FALSE:TRUE;
diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c
index f2386f5c00..ac8e707757 100644
--- a/ext/mysqlnd/mysqlnd_result.c
+++ b/ext/mysqlnd/mysqlnd_result.c
@@ -27,159 +27,11 @@
#include "mysqlnd_debug.h"
#include "mysqlnd_ext_plugin.h"
-/* {{{ mysqlnd_result_buffered_zval::initialize_result_set_rest */
-static enum_func_status
-MYSQLND_METHOD(mysqlnd_result_buffered_zval, initialize_result_set_rest)(MYSQLND_RES_BUFFERED * const result,
- MYSQLND_RES_METADATA * const meta,
- MYSQLND_STATS * stats,
- zend_bool int_and_float_native)
-{
- enum_func_status ret = PASS;
- const unsigned int field_count = meta->field_count;
- const uint64_t row_count = result->row_count;
-
- zval *data_begin = ((MYSQLND_RES_BUFFERED_ZVAL *) result)->data;
- zval *data_cursor = data_begin;
-
- DBG_ENTER("mysqlnd_result_buffered_zval::initialize_result_set_rest");
-
- if (!data_cursor || row_count == result->initialized_rows) {
- DBG_RETURN(ret);
- }
- while ((data_cursor - data_begin) < (int)(row_count * field_count)) {
- if (Z_ISUNDEF(data_cursor[0])) {
- unsigned int i;
- const size_t current_row_num = (data_cursor - data_begin) / field_count;
- enum_func_status rc = result->m.row_decoder(&result->row_buffers[current_row_num],
- data_cursor,
- field_count,
- meta->fields,
- int_and_float_native,
- stats);
- if (rc != PASS) {
- ret = FAIL;
- break;
- }
- ++result->initialized_rows;
- for (i = 0; i < field_count; ++i) {
- /*
- NULL fields are 0 length, 0 is not more than 0
- String of zero size, definitely can't be the next max_length.
- Thus for NULL and zero-length we are quite efficient.
- */
- if (Z_TYPE(data_cursor[i]) == IS_STRING) {
- const size_t len = Z_STRLEN(data_cursor[i]);
- if (meta->fields[i].max_length < len) {
- meta->fields[i].max_length = len;
- }
- }
- }
- }
- data_cursor += field_count;
- }
- DBG_RETURN(ret);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_result_buffered_c::initialize_result_set_rest */
-static enum_func_status
-MYSQLND_METHOD(mysqlnd_result_buffered_c, initialize_result_set_rest)(MYSQLND_RES_BUFFERED * const result,
- MYSQLND_RES_METADATA * const meta,
- MYSQLND_STATS * stats,
- const zend_bool int_and_float_native)
-{
- unsigned int row, field;
- enum_func_status ret = PASS;
- const unsigned int field_count = meta->field_count;
- const uint64_t row_count = result->row_count;
- enum_func_status rc;
- DBG_ENTER("mysqlnd_result_buffered_c::initialize_result_set_rest");
-
- if (result->initialized_rows < row_count) {
- zend_uchar * initialized = ((MYSQLND_RES_BUFFERED_C *) result)->initialized;
- zval * current_row = mnd_emalloc(field_count * sizeof(zval));
-
- if (!current_row) {
- DBG_RETURN(FAIL);
- }
-
- for (row = 0; row < result->row_count; row++) {
- /* (row / 8) & the_bit_for_row*/
- if (ZEND_BIT_TEST(initialized, row)) {
- continue;
- }
-
- rc = result->m.row_decoder(&result->row_buffers[row], current_row, field_count, meta->fields, int_and_float_native, stats);
-
- if (rc != PASS) {
- ret = FAIL;
- break;
- }
- result->initialized_rows++;
- initialized[row >> 3] |= (1 << (row & 7));
- for (field = 0; field < field_count; field++) {
- /*
- NULL fields are 0 length, 0 is not more than 0
- String of zero size, definitely can't be the next max_length.
- Thus for NULL and zero-length we are quite efficient.
- */
- if (Z_TYPE(current_row[field]) == IS_STRING) {
- const size_t len = Z_STRLEN(current_row[field]);
- if (meta->fields[field].max_length < len) {
- meta->fields[field].max_length = len;
- }
- }
- zval_ptr_dtor_nogc(&current_row[field]);
- }
- }
- mnd_efree(current_row);
- }
- DBG_RETURN(ret);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_result_unbuffered::free_last_data */
-static void
-MYSQLND_METHOD(mysqlnd_result_unbuffered, free_last_data)(MYSQLND_RES_UNBUFFERED * unbuf, MYSQLND_STATS * const global_stats)
-{
- DBG_ENTER("mysqlnd_res::unbuffered_free_last_data");
-
- if (!unbuf) {
- DBG_VOID_RETURN;
- }
-
- DBG_INF_FMT("field_count=%u", unbuf->field_count);
- if (unbuf->last_row_data) {
- unsigned int i;
- for (i = 0; i < unbuf->field_count; i++) {
- zval_ptr_dtor_nogc(&(unbuf->last_row_data[i]));
- }
-
- /* Free last row's zvals */
- mnd_efree(unbuf->last_row_data);
- unbuf->last_row_data = NULL;
- }
- if (unbuf->last_row_buffer.ptr) {
- DBG_INF("Freeing last row buffer");
- /* Nothing points to this buffer now, free it */
- unbuf->result_set_memory_pool->free_chunk(
- unbuf->result_set_memory_pool, unbuf->last_row_buffer.ptr);
- unbuf->last_row_buffer.ptr = NULL;
- }
-
- DBG_VOID_RETURN;
-}
-/* }}} */
-
-
/* {{{ mysqlnd_result_unbuffered::free_result */
static void
MYSQLND_METHOD(mysqlnd_result_unbuffered, free_result)(MYSQLND_RES_UNBUFFERED * const result, MYSQLND_STATS * const global_stats)
{
DBG_ENTER("mysqlnd_result_unbuffered, free_result");
- result->m.free_last_data(result, global_stats);
/* must be free before because references the memory pool */
if (result->row_packet) {
@@ -192,49 +44,15 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, free_result)(MYSQLND_RES_UNBUFFERED *
}
/* }}} */
-
-/* {{{ mysqlnd_result_buffered_zval::free_result */
-static void
-MYSQLND_METHOD(mysqlnd_result_buffered_zval, free_result)(MYSQLND_RES_BUFFERED_ZVAL * const set)
+static void mysqlnd_result_free_prev_data(MYSQLND_RES *result)
{
- zval * data = set->data;
-
- DBG_ENTER("mysqlnd_result_buffered_zval::free_result");
-
- set->data = NULL; /* prevent double free if following loop is interrupted */
- if (data) {
- const unsigned int field_count = set->field_count;
- int64_t row;
-
- for (row = set->row_count - 1; row >= 0; row--) {
- zval *current_row = data + row * field_count;
- int64_t col;
-
- if (current_row != NULL) {
- for (col = field_count - 1; col >= 0; --col) {
- zval_ptr_dtor_nogc(&(current_row[col]));
- }
- }
+ if (result->free_row_data) {
+ for (unsigned i = 0; i < result->field_count; ++i) {
+ zval_ptr_dtor_nogc(&result->row_data[i]);
}
- mnd_efree(data);
+ result->free_row_data = 0;
}
- set->data_cursor = NULL;
- DBG_VOID_RETURN;
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_result_buffered_c::free_result */
-static void
-MYSQLND_METHOD(mysqlnd_result_buffered_c, free_result)(MYSQLND_RES_BUFFERED_C * const set)
-{
- DBG_ENTER("mysqlnd_result_buffered_c::free_result");
- mnd_efree(set->initialized);
- set->initialized = NULL;
- DBG_VOID_RETURN;
}
-/* }}} */
-
/* {{{ mysqlnd_result_buffered::free_result */
static void
@@ -246,12 +64,6 @@ MYSQLND_METHOD(mysqlnd_result_buffered, free_result)(MYSQLND_RES_BUFFERED * cons
mysqlnd_error_info_free_contents(&set->error_info);
- if (set->type == MYSQLND_BUFFERED_TYPE_ZVAL) {
- MYSQLND_METHOD(mysqlnd_result_buffered_zval, free_result)((MYSQLND_RES_BUFFERED_ZVAL *) set);
- } if (set->type == MYSQLND_BUFFERED_TYPE_C) {
- MYSQLND_METHOD(mysqlnd_result_buffered_c, free_result)((MYSQLND_RES_BUFFERED_C *) set);
- }
-
if (set->row_buffers) {
mnd_efree(set->row_buffers);
set->row_buffers = NULL;
@@ -269,6 +81,8 @@ MYSQLND_METHOD(mysqlnd_res, free_result_buffers)(MYSQLND_RES * result)
DBG_ENTER("mysqlnd_res::free_result_buffers");
DBG_INF_FMT("%s", result->unbuf? "unbuffered":(result->stored_data? "buffered":"unknown"));
+ mysqlnd_result_free_prev_data(result);
+
if (result->meta) {
ZEND_ASSERT(zend_arena_contains(result->memory_pool->arena, result->meta));
result->meta->m->free_metadata(result->meta);
@@ -311,20 +125,6 @@ void MYSQLND_METHOD(mysqlnd_res, free_result_contents_internal)(MYSQLND_RES * re
/* }}} */
-/* {{{ mysqlnd_res::free_result_internal */
-static
-void MYSQLND_METHOD(mysqlnd_res, free_result_internal)(MYSQLND_RES * result)
-{
- DBG_ENTER("mysqlnd_res::free_result_internal");
-
- result->m.skip_result(result);
- result->m.free_result_contents(result);
-
- DBG_VOID_RETURN;
-}
-/* }}} */
-
-
/* {{{ mysqlnd_res::read_result_metadata */
static enum_func_status
MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQLND_RES * result, MYSQLND_CONN_DATA * conn)
@@ -343,10 +143,6 @@ MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQLND_RES * result, MYSQLND_
}
result->meta = result->m.result_meta_init(result, result->field_count);
- if (!result->meta) {
- SET_OOM_ERROR(conn->error_info);
- DBG_RETURN(FAIL);
- }
/* 1. Read all fields metadata */
@@ -421,7 +217,7 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s)
switch (rset_header.field_count) {
case MYSQLND_NULL_LENGTH: { /* LOAD DATA LOCAL INFILE */
- zend_bool is_warning;
+ bool is_warning;
DBG_INF("LOAD DATA");
conn->last_query_type = QUERY_LOAD_LOCAL;
conn->field_count = 0; /* overwrite previous value, or the last value could be used and lead to bug#53503 */
@@ -568,44 +364,11 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s)
completeness.
*/
static const size_t *
-MYSQLND_METHOD(mysqlnd_result_buffered_zval, fetch_lengths)(const MYSQLND_RES_BUFFERED * const result)
+MYSQLND_METHOD(mysqlnd_result_buffered, fetch_lengths)(const MYSQLND_RES_BUFFERED * const result)
{
- const MYSQLND_RES_BUFFERED_ZVAL * const set = (const MYSQLND_RES_BUFFERED_ZVAL *) result;
- /*
- If:
- - unbuffered result
- - first row has not been read
- - last_row has been read
- */
- DBG_ENTER("mysqlnd_result_buffered_zval::fetch_lengths");
+ DBG_ENTER("mysqlnd_result_buffered::fetch_lengths");
- if (set->data_cursor == NULL ||
- set->data_cursor == set->data ||
- ((set->data_cursor - set->data) > (result->row_count * result->field_count) ))
- {
- DBG_INF("EOF");
- DBG_RETURN(NULL);/* No rows or no more rows */
- }
- DBG_INF("non NULL");
- DBG_RETURN(result->lengths);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_result_buffered_c::fetch_lengths */
-/*
- Do lazy initialization for buffered results. As PHP strings have
- length inside, this function makes not much sense in the context
- of PHP, to be called as separate function. But let's have it for
- completeness.
-*/
-static const size_t *
-MYSQLND_METHOD(mysqlnd_result_buffered_c, fetch_lengths)(const MYSQLND_RES_BUFFERED * const result)
-{
- const MYSQLND_RES_BUFFERED_C * const set = (const MYSQLND_RES_BUFFERED_C *) result;
- DBG_ENTER("mysqlnd_result_buffered_c::fetch_lengths");
-
- if (set->current_row > set->row_count || set->current_row == 0) {
+ if (result->current_row > result->row_count || result->current_row == 0) {
DBG_INF("EOF");
DBG_RETURN(NULL); /* No more rows, or no fetched row */
}
@@ -620,7 +383,7 @@ static const size_t *
MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_lengths)(const MYSQLND_RES_UNBUFFERED * const result)
{
/* simulate output of libmysql */
- return (result->last_row_data || result->eof_reached)? result->lengths : NULL;
+ return (result->last_row_buffer.ptr || result->eof_reached)? result->lengths : NULL;
}
/* }}} */
@@ -642,153 +405,21 @@ MYSQLND_METHOD(mysqlnd_res, fetch_lengths)(const MYSQLND_RES * const result)
/* }}} */
-/* {{{ mysqlnd_result_unbuffered::fetch_row_c */
-static enum_func_status
-MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row_c)(MYSQLND_RES * result, void * param, unsigned int flags, zend_bool * fetched_anything)
-{
- enum_func_status ret;
- MYSQLND_ROW_C *row = (MYSQLND_ROW_C *) param;
- MYSQLND_PACKET_ROW *row_packet = result->unbuf->row_packet;
- MYSQLND_RES_METADATA * const meta = result->meta;
- MYSQLND_CONN_DATA * const conn = result->conn;
- void *checkpoint;
-
- DBG_ENTER("mysqlnd_result_unbuffered::fetch_row_c");
-
- *fetched_anything = FALSE;
- if (result->unbuf->eof_reached) {
- /* No more rows obviously */
- DBG_RETURN(PASS);
- }
- if (!conn || GET_CONNECTION_STATE(&conn->state) != CONN_FETCHING_DATA) {
- SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync);
- DBG_RETURN(FAIL);
- }
- if (!row_packet) {
- /* Not fully initialized object that is being cleaned up */
- DBG_RETURN(FAIL);
- }
- /* Let the row packet fill our buffer and skip additional mnd_malloc + memcpy */
- row_packet->skip_extraction = FALSE;
-
- checkpoint = result->memory_pool->checkpoint;
- mysqlnd_mempool_save_state(result->memory_pool);
-
- /*
- If we skip rows (row == NULL) we have to
- result->m.unbuffered_free_last_data() before it. The function returns always true.
- */
- if (PASS == (ret = PACKET_READ(conn, row_packet)) && !row_packet->eof) {
- result->unbuf->m.free_last_data(result->unbuf, conn->stats);
-
- result->unbuf->last_row_data = row_packet->fields;
- result->unbuf->last_row_buffer = row_packet->row_buffer;
- row_packet->fields = NULL;
- row_packet->row_buffer.ptr = NULL;
-
- MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF);
-
- if (!row_packet->skip_extraction) {
- unsigned int i, field_count = meta->field_count;
-
- enum_func_status rc = result->unbuf->m.row_decoder(&result->unbuf->last_row_buffer,
- result->unbuf->last_row_data,
- field_count,
- row_packet->fields_metadata,
- conn->options->int_and_float_native,
- conn->stats);
- if (PASS != rc) {
- mysqlnd_mempool_restore_state(result->memory_pool);
- result->memory_pool->checkpoint = checkpoint;
- DBG_RETURN(FAIL);
- }
- {
- *row = mnd_malloc(field_count * sizeof(char *));
- if (*row) {
- MYSQLND_FIELD * field = meta->fields;
- size_t * lengths = result->unbuf->lengths;
-
- for (i = 0; i < field_count; i++, field++) {
- zval * data = &result->unbuf->last_row_data[i];
- const size_t len = (Z_TYPE_P(data) == IS_STRING)? Z_STRLEN_P(data) : 0;
-
-/* BEGIN difference between normal normal fetch and _c */
- if (Z_TYPE_P(data) != IS_NULL) {
- convert_to_string(data);
- (*row)[i] = Z_STRVAL_P(data);
- } else {
- (*row)[i] = NULL;
- }
-/* END difference between normal normal fetch and _c */
-
- if (lengths) {
- lengths[i] = len;
- }
-
- if (field->max_length < len) {
- field->max_length = len;
- }
- }
- } else {
- SET_OOM_ERROR(conn->error_info);
- }
- }
- }
- result->unbuf->row_count++;
- *fetched_anything = TRUE;
- } else if (ret == FAIL) {
- if (row_packet->error_info.error_no) {
- COPY_CLIENT_ERROR(conn->error_info, row_packet->error_info);
- DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error);
- }
- if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) {
- SET_CONNECTION_STATE(&conn->state, CONN_READY);
- }
- result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */
- } else if (row_packet->eof) {
- /* Mark the connection as usable again */
- DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status);
- result->unbuf->eof_reached = TRUE;
-
- UPSERT_STATUS_RESET(conn->upsert_status);
- UPSERT_STATUS_SET_WARNINGS(conn->upsert_status, row_packet->warning_count);
- UPSERT_STATUS_SET_SERVER_STATUS(conn->upsert_status, row_packet->server_status);
- /*
- result->row_packet will be cleaned when
- destroying the result object
- */
- if (UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status) & SERVER_MORE_RESULTS_EXISTS) {
- SET_CONNECTION_STATE(&conn->state, CONN_NEXT_RESULT_PENDING);
- } else {
- SET_CONNECTION_STATE(&conn->state, CONN_READY);
- }
- result->unbuf->m.free_last_data(result->unbuf, conn->stats);
- }
-
- mysqlnd_mempool_restore_state(result->memory_pool);
- result->memory_pool->checkpoint = checkpoint;
-
- DBG_INF_FMT("ret=%s fetched=%u", ret == PASS? "PASS":"FAIL", *fetched_anything);
- DBG_RETURN(PASS);
-}
-/* }}} */
-
-
/* {{{ mysqlnd_result_unbuffered::fetch_row */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything)
+MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, zval **row_ptr, const unsigned int flags, bool * fetched_anything)
{
- enum_func_status ret;
- zval *row = (zval *) param;
+ enum_func_status ret;
MYSQLND_PACKET_ROW *row_packet = result->unbuf->row_packet;
const MYSQLND_RES_METADATA * const meta = result->meta;
+ MYSQLND_RES_UNBUFFERED *set = result->unbuf;
MYSQLND_CONN_DATA * const conn = result->conn;
void *checkpoint;
DBG_ENTER("mysqlnd_result_unbuffered::fetch_row");
*fetched_anything = FALSE;
- if (result->unbuf->eof_reached) {
+ if (set->eof_reached) {
/* No more rows obviously */
DBG_RETURN(PASS);
}
@@ -800,95 +431,57 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void
/* Not fully initialized object that is being cleaned up */
DBG_RETURN(FAIL);
}
- /* Let the row packet fill our buffer and skip additional mnd_malloc + memcpy */
- row_packet->skip_extraction = row? FALSE:TRUE;
checkpoint = result->memory_pool->checkpoint;
mysqlnd_mempool_save_state(result->memory_pool);
- /*
- If we skip rows (row == NULL) we have to
- result->m.unbuffered_free_last_data() before it. The function returns always true.
- */
if (PASS == (ret = PACKET_READ(conn, row_packet)) && !row_packet->eof) {
- result->unbuf->m.free_last_data(result->unbuf, conn->stats);
-
- result->unbuf->last_row_data = row_packet->fields;
- result->unbuf->last_row_buffer = row_packet->row_buffer;
- row_packet->fields = NULL;
+ set->last_row_buffer = row_packet->row_buffer;
row_packet->row_buffer.ptr = NULL;
- MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF);
+ MYSQLND_INC_CONN_STATISTIC(conn->stats, set->stmt
+ ? STAT_ROWS_FETCHED_FROM_CLIENT_PS_UNBUF
+ : STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF);
- if (!row_packet->skip_extraction) {
- unsigned int i, field_count = meta->field_count;
+ if (row_ptr) {
+ unsigned int field_count = meta->field_count;
- enum_func_status rc = result->unbuf->m.row_decoder(&result->unbuf->last_row_buffer,
- result->unbuf->last_row_data,
- field_count,
- row_packet->fields_metadata,
- conn->options->int_and_float_native,
- conn->stats);
+ *row_ptr = result->row_data;
+ enum_func_status rc = set->m.row_decoder(
+ &set->last_row_buffer, result->row_data, field_count,
+ row_packet->fields_metadata, conn->options->int_and_float_native, conn->stats);
if (PASS != rc) {
mysqlnd_mempool_restore_state(result->memory_pool);
result->memory_pool->checkpoint = checkpoint;
DBG_RETURN(FAIL);
}
- {
- HashTable * row_ht = Z_ARRVAL_P(row);
- MYSQLND_FIELD * field = meta->fields;
- size_t * lengths = result->unbuf->lengths;
-
- for (i = 0; i < field_count; i++, field++) {
- zval * data = &result->unbuf->last_row_data[i];
- const size_t len = (Z_TYPE_P(data) == IS_STRING)? Z_STRLEN_P(data) : 0;
-
- if (flags & MYSQLND_FETCH_NUM) {
- if (zend_hash_index_add(row_ht, i, data) != NULL) {
- Z_TRY_ADDREF_P(data);
- }
- }
- if (flags & MYSQLND_FETCH_ASSOC) {
- /* zend_hash_quick_update needs length + trailing zero */
- /* QQ: Error handling ? */
- /*
- zend_hash_quick_update does not check, as add_assoc_zval_ex do, whether
- the index is a numeric and convert it to it. This however means constant
- hashing of the column name, which is not needed as it can be precomputed.
- */
- Z_TRY_ADDREF_P(data);
- if (meta->fields[i].is_numeric == FALSE) {
- zend_hash_update(row_ht, meta->fields[i].sname, data);
- } else {
- zend_hash_index_update(row_ht, meta->fields[i].num_key, data);
- }
- }
- if (lengths) {
- lengths[i] = len;
- }
-
- if (field->max_length < len) {
- field->max_length = len;
- }
+ size_t *lengths = set->lengths;
+ if (lengths) {
+ for (unsigned i = 0; i < field_count; i++) {
+ zval *data = &result->row_data[i];
+ lengths[i] = Z_TYPE_P(data) == IS_STRING ? Z_STRLEN_P(data) : 0;
}
}
}
- result->unbuf->row_count++;
+ set->row_count++;
*fetched_anything = TRUE;
} else if (ret == FAIL) {
if (row_packet->error_info.error_no) {
COPY_CLIENT_ERROR(conn->error_info, row_packet->error_info);
+ if (set->stmt) {
+ COPY_CLIENT_ERROR(set->stmt->error_info, row_packet->error_info);
+ }
DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error);
}
if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) {
SET_CONNECTION_STATE(&conn->state, CONN_READY);
}
- result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */
+ set->eof_reached = TRUE; /* so next time we won't get an error */
} else if (row_packet->eof) {
/* Mark the connection as usable again */
DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status);
- result->unbuf->eof_reached = TRUE;
+ set->eof_reached = TRUE;
UPSERT_STATUS_RESET(conn->upsert_status);
UPSERT_STATUS_SET_WARNINGS(conn->upsert_status, row_packet->warning_count);
@@ -902,7 +495,6 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void
} else {
SET_CONNECTION_STATE(&conn->state, CONN_READY);
}
- result->unbuf->m.free_last_data(result->unbuf, conn->stats);
}
mysqlnd_mempool_restore_state(result->memory_pool);
@@ -916,23 +508,20 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void
/* {{{ mysqlnd_res::use_result */
static MYSQLND_RES *
-MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, const zend_bool ps)
+MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, MYSQLND_STMT_DATA *stmt)
{
MYSQLND_CONN_DATA * const conn = result->conn;
DBG_ENTER("mysqlnd_res::use_result");
SET_EMPTY_ERROR(conn->error_info);
- if (ps == FALSE) {
- result->type = MYSQLND_RES_NORMAL;
+ if (!stmt) {
+ result->type = MYSQLND_RES_NORMAL;
} else {
- result->type = MYSQLND_RES_PS_UNBUF;
+ result->type = MYSQLND_RES_PS_UNBUF;
}
- result->unbuf = mysqlnd_result_unbuffered_init(result, result->field_count, ps);
- if (!result->unbuf) {
- goto oom;
- }
+ result->unbuf = mysqlnd_result_unbuffered_init(result, result->field_count, stmt);
/*
Will be freed in the mysqlnd_internal_free_result_contents() called
@@ -946,315 +535,79 @@ MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, const zend_b
conn->payload_decoder_factory->m.init_row_packet(row_packet);
row_packet->result_set_memory_pool = result->unbuf->result_set_memory_pool;
row_packet->field_count = result->field_count;
- row_packet->binary_protocol = ps;
+ row_packet->binary_protocol = stmt != NULL;
row_packet->fields_metadata = result->meta->fields;
result->unbuf->row_packet = row_packet;
}
DBG_RETURN(result);
-oom:
- SET_OOM_ERROR(conn->error_info);
- DBG_RETURN(NULL);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_result_buffered::fetch_row_c */
-static enum_func_status
-MYSQLND_METHOD(mysqlnd_result_buffered, fetch_row_c)(MYSQLND_RES * result, void * param, unsigned int flags, zend_bool * const fetched_anything)
-{
- enum_func_status ret = FAIL;
- MYSQLND_ROW_C * row = (MYSQLND_ROW_C *) param;
- const MYSQLND_RES_METADATA * const meta = result->meta;
- const unsigned int field_count = meta->field_count;
- MYSQLND_CONN_DATA * const conn = result->conn;
- DBG_ENTER("mysqlnd_result_buffered::fetch_row_c");
-
- if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_ZVAL) {
- MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result->stored_data;
-
- /* If we haven't read everything */
- if (set->data_cursor &&
- (set->data_cursor - set->data) < (result->stored_data->row_count * field_count))
- {
- zval *current_row = set->data_cursor;
- unsigned int i;
-
- if (Z_ISUNDEF(current_row[0])) {
- uint64_t row_num = (set->data_cursor - set->data) / field_count;
- enum_func_status rc = set->m.row_decoder(&set->row_buffers[row_num],
- current_row,
- field_count,
- meta->fields,
- conn->options->int_and_float_native,
- conn->stats);
- if (rc != PASS) {
- DBG_RETURN(FAIL);
- }
- ++set->initialized_rows;
- for (i = 0; i < field_count; ++i) {
- /*
- NULL fields are 0 length, 0 is not more than 0
- String of zero size, definitely can't be the next max_length.
- Thus for NULL and zero-length we are quite efficient.
- */
- if (Z_TYPE(current_row[i]) == IS_STRING) {
- const size_t len = Z_STRLEN(current_row[i]);
- if (meta->fields[i].max_length < len) {
- meta->fields[i].max_length = len;
- }
- }
- }
- }
-
-/* BEGIN difference between normal normal fetch and _c */
- /* there is no conn handle in this function thus we can't set OOM in error_info */
- *row = mnd_malloc(field_count * sizeof(char *));
- if (*row) {
- for (i = 0; i < field_count; ++i) {
- zval * data = &current_row[i];
-
- set->lengths[i] = (Z_TYPE_P(data) == IS_STRING)? Z_STRLEN_P(data) : 0;
-
- if (Z_TYPE_P(data) != IS_NULL) {
- convert_to_string(data);
- (*row)[i] = Z_STRVAL_P(data);
- } else {
- (*row)[i] = NULL;
- }
- }
- set->data_cursor += field_count;
- MYSQLND_INC_GLOBAL_STATISTIC(STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_BUF);
- } else {
- SET_OOM_ERROR(conn->error_info);
- }
-/* END difference between normal normal fetch and _c */
-
- *fetched_anything = *row? TRUE:FALSE;
- ret = *row? PASS:FAIL;
- } else {
- set->data_cursor = NULL;
- DBG_INF("EOF reached");
- *fetched_anything = FALSE;
- ret = PASS;
- }
- } else if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_C) {
- /*
- We don't support _C with pdo because it uses the data in a different way - just references it.
- We will either leak or give nirvana pointers
- */
- *fetched_anything = FALSE;
- DBG_RETURN(FAIL);
- }
- DBG_INF_FMT("ret=PASS fetched=%u", *fetched_anything);
- DBG_RETURN(ret);
}
/* }}} */
-/* {{{ mysqlnd_result_buffered_zval::fetch_row */
+/* {{{ mysqlnd_result_buffered::fetch_row */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_result_buffered_zval, fetch_row)(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * const fetched_anything)
+MYSQLND_METHOD(mysqlnd_result_buffered, fetch_row)(MYSQLND_RES * result, zval **row_ptr, const unsigned int flags, bool * fetched_anything)
{
- enum_func_status ret = FAIL;
- zval * row = (zval *) param;
- const MYSQLND_RES_METADATA * const meta = result->meta;
- const unsigned int field_count = meta->field_count;
- MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result->stored_data;
- MYSQLND_CONN_DATA * const conn = result->conn;
+ MYSQLND_RES_BUFFERED *set = result->stored_data;
- DBG_ENTER("mysqlnd_result_buffered_zval::fetch_row");
+ DBG_ENTER("mysqlnd_result_buffered::fetch_row");
/* If we haven't read everything */
- if (set->data_cursor && (set->data_cursor - set->data) < (set->row_count * field_count)) {
- unsigned int i;
- zval *current_row = set->data_cursor;
-
- if (Z_ISUNDEF(current_row[0])) {
- const size_t row_num = (set->data_cursor - set->data) / field_count;
- enum_func_status rc = set->m.row_decoder(&set->row_buffers[row_num],
- current_row,
- field_count,
- meta->fields,
- conn->options->int_and_float_native,
- conn->stats);
+ if (set->current_row < set->row_count) {
+ if (row_ptr) {
+ const MYSQLND_RES_METADATA * const meta = result->meta;
+ const unsigned int field_count = meta->field_count;
+ MYSQLND_CONN_DATA * const conn = result->conn;
+ enum_func_status rc;
+ zval *current_row = result->row_data;
+ *row_ptr = result->row_data;
+ rc = result->stored_data->m.row_decoder(&set->row_buffers[set->current_row],
+ current_row,
+ field_count,
+ meta->fields,
+ conn->options->int_and_float_native,
+ conn->stats);
if (rc != PASS) {
DBG_RETURN(FAIL);
}
- ++set->initialized_rows;
- for (i = 0; i < field_count; ++i) {
- /*
- NULL fields are 0 length, 0 is not more than 0
- String of zero size, definitely can't be the next max_length.
- Thus for NULL and zero-length we are quite efficient.
- */
- if (Z_TYPE(current_row[i]) == IS_STRING) {
- const size_t len = Z_STRLEN(current_row[i]);
- if (meta->fields[i].max_length < len) {
- meta->fields[i].max_length = len;
- }
- }
- }
- }
-
- for (i = 0; i < field_count; ++i) {
- zval * data = &current_row[i];
-
- set->lengths[i] = (Z_TYPE_P(data) == IS_STRING)? Z_STRLEN_P(data) : 0;
-
- if (flags & MYSQLND_FETCH_NUM) {
- if (zend_hash_index_add(Z_ARRVAL_P(row), i, data) != NULL) {
- Z_TRY_ADDREF_P(data);
- }
- }
- if (flags & MYSQLND_FETCH_ASSOC) {
- /* zend_hash_quick_update needs length + trailing zero */
- /* QQ: Error handling ? */
- /*
- zend_hash_quick_update does not check, as add_assoc_zval_ex do, whether
- the index is a numeric and convert it to it. This however means constant
- hashing of the column name, which is not needed as it can be precomputed.
- */
- Z_TRY_ADDREF_P(data);
- if (meta->fields[i].is_numeric == FALSE) {
- zend_hash_update(Z_ARRVAL_P(row), meta->fields[i].sname, data);
- } else {
- zend_hash_index_update(Z_ARRVAL_P(row), meta->fields[i].num_key, data);
- }
- }
- }
- set->data_cursor += field_count;
- MYSQLND_INC_GLOBAL_STATISTIC(STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_BUF);
- *fetched_anything = TRUE;
- ret = PASS;
- } else {
- set->data_cursor = NULL;
- DBG_INF("EOF reached");
- *fetched_anything = FALSE;
- ret = PASS;
- }
- DBG_INF_FMT("ret=PASS fetched=%u", *fetched_anything);
- DBG_RETURN(ret);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_result_buffered_c::fetch_row */
-static enum_func_status
-MYSQLND_METHOD(mysqlnd_result_buffered_c, fetch_row)(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything)
-{
- enum_func_status ret = FAIL;
- zval * row = (zval *) param;
- const MYSQLND_RES_METADATA * const meta = result->meta;
- const unsigned int field_count = meta->field_count;
- MYSQLND_CONN_DATA * const conn = result->conn;
-
- MYSQLND_RES_BUFFERED_C * set = (MYSQLND_RES_BUFFERED_C *) result->stored_data;
-
- DBG_ENTER("mysqlnd_result_buffered_c::fetch_row");
-
- /* If we haven't read everything */
- if (set->current_row < set->row_count) {
- enum_func_status rc;
- zval * current_row;
- unsigned int i;
- current_row = mnd_emalloc(field_count * sizeof(zval));
- if (!current_row) {
- SET_OOM_ERROR(conn->error_info);
- DBG_RETURN(FAIL);
- }
-
- rc = result->stored_data->m.row_decoder(&result->stored_data->row_buffers[set->current_row],
- current_row,
- field_count,
- meta->fields,
- conn->options->int_and_float_native,
- conn->stats);
- if (rc != PASS) {
- DBG_RETURN(FAIL);
- }
- if (!ZEND_BIT_TEST(set->initialized, set->current_row)) {
- set->initialized[set->current_row >> 3] |= (1 << (set->current_row & 7)); /* mark initialized */
-
- ++set->initialized_rows;
-
- for (i = 0; i < field_count; ++i) {
- /*
- NULL fields are 0 length, 0 is not more than 0
- String of zero size, definitely can't be the next max_length.
- Thus for NULL and zero-length we are quite efficient.
- */
- if (Z_TYPE(current_row[i]) == IS_STRING) {
- const size_t len = Z_STRLEN(current_row[i]);
- if (meta->fields[i].max_length < len) {
- meta->fields[i].max_length = len;
- }
+ if (set->lengths) {
+ for (unsigned i = 0; i < field_count; ++i) {
+ zval *data = &current_row[i];
+ set->lengths[i] = Z_TYPE_P(data) == IS_STRING ? Z_STRLEN_P(data) : 0;
}
}
}
- for (i = 0; i < field_count; ++i) {
- zval * data = &current_row[i];
-
- set->lengths[i] = (Z_TYPE_P(data) == IS_STRING)? Z_STRLEN_P(data) : 0;
-
- if (flags & MYSQLND_FETCH_NUM) {
- if (zend_hash_index_add(Z_ARRVAL_P(row), i, data)) {
- Z_TRY_ADDREF_P(data);
- }
- }
- if (flags & MYSQLND_FETCH_ASSOC) {
- /* zend_hash_quick_update needs length + trailing zero */
- /* QQ: Error handling ? */
- /*
- zend_hash_quick_update does not check, as add_assoc_zval_ex do, whether
- the index is a numeric and convert it to it. This however means constant
- hashing of the column name, which is not needed as it can be precomputed.
- */
- Z_TRY_ADDREF_P(data);
- if (meta->fields[i].is_numeric == FALSE) {
- zend_hash_update(Z_ARRVAL_P(row), meta->fields[i].sname, data);
- } else {
- zend_hash_index_update(Z_ARRVAL_P(row), meta->fields[i].num_key, data);
- }
- }
- /*
- This will usually not destroy anything but decref.
- However, if neither NUM nor ASSOC is set we will free memory cleanly and won't leak.
- It also simplifies the handling of Z_ADDREF_P because we don't need to check if only
- either NUM or ASSOC is set but not both.
- */
- zval_ptr_dtor_nogc(data);
- }
- mnd_efree(current_row);
++set->current_row;
- MYSQLND_INC_GLOBAL_STATISTIC(STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_BUF);
+ MYSQLND_INC_GLOBAL_STATISTIC(set->stmt
+ ? STAT_ROWS_FETCHED_FROM_CLIENT_PS_BUF : STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_BUF);
*fetched_anything = TRUE;
- ret = PASS;
} else {
if (set->current_row == set->row_count) {
set->current_row = set->row_count + 1;
}
DBG_INF_FMT("EOF reached. current_row=%llu", (unsigned long long) set->current_row);
*fetched_anything = FALSE;
- ret = PASS;
}
DBG_INF_FMT("ret=PASS fetched=%u", *fetched_anything);
- DBG_RETURN(ret);
+ DBG_RETURN(PASS);
}
/* }}} */
/* {{{ mysqlnd_res::fetch_row */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_res, fetch_row)(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool *fetched_anything)
+MYSQLND_METHOD(mysqlnd_res, fetch_row)(MYSQLND_RES *result, zval **row_ptr, const unsigned int flags, bool *fetched_anything)
{
- const mysqlnd_fetch_row_func f = result->stored_data? result->stored_data->m.fetch_row:(result->unbuf? result->unbuf->m.fetch_row:NULL);
+ const mysqlnd_fetch_row_func f =
+ result->stored_data ? result->stored_data->m.fetch_row :
+ result->unbuf ? result->unbuf->m.fetch_row : NULL;
if (f) {
- return f(result, param, flags, fetched_anything);
+ return f(result, row_ptr, flags, fetched_anything);
}
*fetched_anything = FALSE;
return PASS;
@@ -1267,7 +620,7 @@ enum_func_status
MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const conn, MYSQLND_RES * result,
MYSQLND_RES_METADATA * meta,
MYSQLND_ROW_BUFFER **row_buffers,
- zend_bool binary_protocol)
+ bool binary_protocol)
{
enum_func_status ret;
uint64_t total_allocated_rows = 0;
@@ -1291,8 +644,6 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c
row_packet.binary_protocol = binary_protocol;
row_packet.fields_metadata = meta->fields;
- row_packet.skip_extraction = TRUE; /* let php_mysqlnd_rowp_read() not allocate row_packet.fields, we will do it */
-
while (FAIL != (ret = PACKET_READ(conn, &row_packet)) && !row_packet.eof) {
if (!free_rows) {
MYSQLND_ROW_BUFFER * new_row_buffers;
@@ -1321,11 +672,6 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c
} else {
new_row_buffers = mnd_emalloc((size_t)(total_allocated_rows * sizeof(MYSQLND_ROW_BUFFER)));
}
- if (!new_row_buffers) {
- SET_OOM_ERROR(conn->error_info);
- ret = FAIL;
- goto free_end;
- }
*row_buffers = new_row_buffers;
}
free_rows--;
@@ -1334,15 +680,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c
set->row_count++;
/* So row_packet's destructor function won't efree() it */
- row_packet.fields = NULL;
row_packet.row_buffer.ptr = NULL;
-
- /*
- No need to FREE_ALLOCA as we can reuse the
- 'lengths' and 'fields' arrays. For lengths its absolutely safe.
- 'fields' is reused because the ownership of the strings has been
- transferred above.
- */
}
/* Overflow ? */
MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats,
@@ -1405,7 +743,7 @@ end:
static MYSQLND_RES *
MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result,
MYSQLND_CONN_DATA * const conn,
- const unsigned int flags)
+ MYSQLND_STMT_DATA *stmt)
{
enum_func_status ret;
MYSQLND_ROW_BUFFER **row_buffers = NULL;
@@ -1413,28 +751,16 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result,
DBG_ENTER("mysqlnd_res::store_result");
/* We need the conn because we are doing lazy zval initialization in buffered_fetch_row */
- /* In case of error the reference will be released in free_result_internal() called indirectly by our caller */
+ /* In case of error the reference will be released in free_result() called indirectly by our caller */
result->conn = conn->m->get_reference(conn);
result->type = MYSQLND_RES_NORMAL;
SET_CONNECTION_STATE(&conn->state, CONN_FETCHING_DATA);
- if (flags & MYSQLND_STORE_NO_COPY) {
- result->stored_data = (MYSQLND_RES_BUFFERED *) mysqlnd_result_buffered_zval_init(result, result->field_count, flags & MYSQLND_STORE_PS);
- if (!result->stored_data) {
- SET_OOM_ERROR(conn->error_info);
- DBG_RETURN(NULL);
- }
- row_buffers = &result->stored_data->row_buffers;
- } else if (flags & MYSQLND_STORE_COPY) {
- result->stored_data = (MYSQLND_RES_BUFFERED *) mysqlnd_result_buffered_c_init(result, result->field_count, flags & MYSQLND_STORE_PS);
- if (!result->stored_data) {
- SET_OOM_ERROR(conn->error_info);
- DBG_RETURN(NULL);
- }
- row_buffers = &result->stored_data->row_buffers;
- }
- ret = result->m.store_result_fetch_data(conn, result, result->meta, row_buffers, flags & MYSQLND_STORE_PS);
+ result->stored_data = (MYSQLND_RES_BUFFERED *) mysqlnd_result_buffered_init(result, result->field_count, stmt);
+ row_buffers = &result->stored_data->row_buffers;
+
+ ret = result->m.store_result_fetch_data(conn, result, result->meta, row_buffers, stmt != NULL);
if (FAIL == ret) {
if (result->stored_data) {
@@ -1444,31 +770,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result,
}
DBG_RETURN(NULL);
} else {
- if (flags & MYSQLND_STORE_NO_COPY) {
- const MYSQLND_RES_METADATA * const meta = result->meta;
- MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result->stored_data;
-
- if (set->row_count) {
- /* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */
- if (set->row_count * meta->field_count * sizeof(zval *) > SIZE_MAX) {
- SET_OOM_ERROR(conn->error_info);
- DBG_RETURN(NULL);
- }
- /* if pecalloc is used valgrind barks gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux) */
- set->data = mnd_emalloc((size_t)(set->row_count * meta->field_count * sizeof(zval)));
- if (!set->data) {
- SET_OOM_ERROR(conn->error_info);
- DBG_RETURN(NULL);
- }
- memset(set->data, 0, (size_t)(set->row_count * meta->field_count * sizeof(zval)));
- }
- /* Position at the first row */
- set->data_cursor = set->data;
- } else if (flags & MYSQLND_STORE_COPY) {
- MYSQLND_RES_BUFFERED_C * set = (MYSQLND_RES_BUFFERED_C *) result->stored_data;
- set->current_row = 0;
- set->initialized = mnd_ecalloc((unsigned int) ((set->row_count / 8) + 1), sizeof(zend_uchar)); /* +1 for safety */
- }
+ result->stored_data->current_row = 0;
}
/* libmysql's documentation says it should be so for SELECT statements */
@@ -1483,7 +785,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result,
static enum_func_status
MYSQLND_METHOD(mysqlnd_res, skip_result)(MYSQLND_RES * const result)
{
- zend_bool fetched_anything;
+ bool fetched_anything;
DBG_ENTER("mysqlnd_res::skip_result");
/*
@@ -1500,7 +802,9 @@ MYSQLND_METHOD(mysqlnd_res, skip_result)(MYSQLND_RES * const result)
STAT_FLUSHED_PS_SETS);
while ((PASS == result->m.fetch_row(result, NULL, 0, &fetched_anything)) && fetched_anything == TRUE) {
- /* do nothing */;
+ MYSQLND_INC_CONN_STATISTIC(conn->stats,
+ result->type == MYSQLND_RES_NORMAL
+ ? STAT_ROWS_SKIPPED_NORMAL : STAT_ROWS_SKIPPED_PS);
}
}
DBG_RETURN(PASS);
@@ -1510,7 +814,7 @@ MYSQLND_METHOD(mysqlnd_res, skip_result)(MYSQLND_RES * const result)
/* {{{ mysqlnd_res::free_result */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_res, free_result)(MYSQLND_RES * result, const zend_bool implicit)
+MYSQLND_METHOD(mysqlnd_res, free_result)(MYSQLND_RES * result, const bool implicit)
{
DBG_ENTER("mysqlnd_res::free_result");
@@ -1518,7 +822,8 @@ MYSQLND_METHOD(mysqlnd_res, free_result)(MYSQLND_RES * result, const zend_bool i
implicit == TRUE? STAT_FREE_RESULT_IMPLICIT:
STAT_FREE_RESULT_EXPLICIT);
- result->m.free_result_internal(result);
+ result->m.skip_result(result);
+ result->m.free_result_contents(result);
DBG_RETURN(PASS);
}
/* }}} */
@@ -1536,36 +841,17 @@ MYSQLND_METHOD(mysqlnd_res, data_seek)(MYSQLND_RES * const result, const uint64_
/* }}} */
-/* {{{ mysqlnd_result_buffered_zval::data_seek */
+/* {{{ mysqlnd_result_buffered::data_seek */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_result_buffered_zval, data_seek)(MYSQLND_RES_BUFFERED * const result, const uint64_t row)
+MYSQLND_METHOD(mysqlnd_result_buffered, data_seek)(MYSQLND_RES_BUFFERED * const result, const uint64_t row)
{
- MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result;
- DBG_ENTER("mysqlnd_result_buffered_zval::data_seek");
+ DBG_ENTER("mysqlnd_result_buffered::data_seek");
/* libmysql just moves to the end, it does traversing of a linked list */
- if (row >= set->row_count) {
- set->data_cursor = NULL;
+ if (row >= result->row_count) {
+ result->current_row = result->row_count;
} else {
- set->data_cursor = set->data + row * result->field_count;
- }
- DBG_RETURN(PASS);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_result_buffered_c::data_seek */
-static enum_func_status
-MYSQLND_METHOD(mysqlnd_result_buffered_c, data_seek)(MYSQLND_RES_BUFFERED * const result, const uint64_t row)
-{
- MYSQLND_RES_BUFFERED_C * set = (MYSQLND_RES_BUFFERED_C *) result;
- DBG_ENTER("mysqlnd_result_buffered_c::data_seek");
-
- /* libmysql just moves to the end, it does traversing of a linked list */
- if (row >= set->row_count) {
- set->current_row = set->row_count;
- } else {
- set->current_row = row;
+ result->current_row = row;
}
DBG_RETURN(PASS);
}
@@ -1618,28 +904,6 @@ MYSQLND_METHOD(mysqlnd_res, fetch_field)(MYSQLND_RES * const result)
DBG_ENTER("mysqlnd_res::fetch_field");
do {
if (result->meta) {
- /*
- We optimize the result set, so we don't convert all the data from raw buffer format to
- zval arrays during store. In the case someone doesn't read all the lines this will
- save time. However, when a metadata call is done, we need to calculate max_length.
- We don't have control whether max_length will be used, unfortunately. Otherwise we
- could have been able to skip that step.
- Well, if the mysqli API switches from returning stdClass to class like mysqli_field_metadata,
- then we can have max_length as dynamic property, which will be calculated during runtime and
- not during mysqli_fetch_field() time.
- */
- if (result->stored_data && (result->stored_data->initialized_rows < result->stored_data->row_count)) {
- const MYSQLND_CONN_DATA * const conn = result->conn;
- DBG_INF_FMT("We have decode the whole result set to be able to satisfy this meta request");
- /* we have to initialize the rest to get the updated max length */
- if (PASS != result->stored_data->m.initialize_result_set_rest(result->stored_data,
- result->meta,
- conn->stats,
- conn->options->int_and_float_native))
- {
- break;
- }
- }
DBG_RETURN(result->meta->m->fetch_field(result->meta));
}
} while (0);
@@ -1655,28 +919,6 @@ MYSQLND_METHOD(mysqlnd_res, fetch_field_direct)(MYSQLND_RES * const result, cons
DBG_ENTER("mysqlnd_res::fetch_field_direct");
do {
if (result->meta) {
- /*
- We optimize the result set, so we don't convert all the data from raw buffer format to
- zval arrays during store. In the case someone doesn't read all the lines this will
- save time. However, when a metadata call is done, we need to calculate max_length.
- We don't have control whether max_length will be used, unfortunately. Otherwise we
- could have been able to skip that step.
- Well, if the mysqli API switches from returning stdClass to class like mysqli_field_metadata,
- then we can have max_length as dynamic property, which will be calculated during runtime and
- not during mysqli_fetch_field_direct() time.
- */
- if (result->stored_data && (result->stored_data->initialized_rows < result->stored_data->row_count)) {
- const MYSQLND_CONN_DATA * const conn = result->conn;
- DBG_INF_FMT("We have decode the whole result set to be able to satisfy this meta request");
- /* we have to initialized the rest to get the updated max length */
- if (PASS != result->stored_data->m.initialize_result_set_rest(result->stored_data,
- result->meta,
- conn->stats,
- conn->options->int_and_float_native))
- {
- break;
- }
- }
DBG_RETURN(result->meta->m->fetch_field_direct(result->meta, fieldnr));
}
} while (0);
@@ -1693,17 +935,6 @@ MYSQLND_METHOD(mysqlnd_res, fetch_fields)(MYSQLND_RES * const result)
DBG_ENTER("mysqlnd_res::fetch_fields");
do {
if (result->meta) {
- if (result->stored_data && (result->stored_data->initialized_rows < result->stored_data->row_count)) {
- const MYSQLND_CONN_DATA * const conn = result->conn;
- /* we have to initialize the rest to get the updated max length */
- if (PASS != result->stored_data->m.initialize_result_set_rest(result->stored_data,
- result->meta,
- conn->stats,
- conn->options->int_and_float_native))
- {
- break;
- }
- }
DBG_RETURN(result->meta->m->fetch_fields(result->meta));
}
} while (0);
@@ -1733,43 +964,56 @@ MYSQLND_METHOD(mysqlnd_res, field_tell)(const MYSQLND_RES * const result)
/* {{{ mysqlnd_res::fetch_into */
static void
MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES * result, const unsigned int flags,
- zval *return_value,
- enum_mysqlnd_extension extension ZEND_FILE_LINE_DC)
+ zval *return_value ZEND_FILE_LINE_DC)
{
- zend_bool fetched_anything;
- unsigned int array_size;
+ bool fetched_anything;
+ zval *row_data;
DBG_ENTER("mysqlnd_res::fetch_into");
+ if (FAIL == result->m.fetch_row(result, &row_data, flags, &fetched_anything)) {
+ php_error_docref(NULL, E_WARNING, "Error while reading a row");
+ RETVAL_FALSE;
+ DBG_VOID_RETURN;
+ } else if (fetched_anything == FALSE) {
+ RETVAL_NULL();
+ DBG_VOID_RETURN;
+ }
- /*
- Hint Zend how many elements we will have in the hash. Thus it won't
- extend and rehash the hash constantly.
- */
- array_size = result->field_count;
+ const MYSQLND_RES_METADATA * const meta = result->meta;
+ unsigned int array_size = meta->field_count;
if ((flags & (MYSQLND_FETCH_NUM|MYSQLND_FETCH_ASSOC)) == (MYSQLND_FETCH_NUM|MYSQLND_FETCH_ASSOC)) {
array_size *= 2;
}
array_init_size(return_value, array_size);
- if (FAIL == result->m.fetch_row(result, (void *)return_value, flags, &fetched_anything)) {
- php_error_docref(NULL, E_WARNING, "Error while reading a row");
- zend_array_destroy(Z_ARR_P(return_value));
- RETVAL_FALSE;
- } else if (fetched_anything == FALSE) {
- zend_array_destroy(Z_ARR_P(return_value));
- switch (extension) {
- case MYSQLND_MYSQLI:
- RETVAL_NULL();
- break;
- case MYSQLND_MYSQL:
- RETVAL_FALSE;
- break;
- default:exit(0);
+
+ HashTable *row_ht = Z_ARRVAL_P(return_value);
+ MYSQLND_FIELD *field = meta->fields;
+ for (unsigned i = 0; i < meta->field_count; i++, field++) {
+ zval *data = &row_data[i];
+
+ if (flags & MYSQLND_FETCH_NUM) {
+ if (zend_hash_index_add(row_ht, i, data) != NULL) {
+ Z_TRY_ADDREF_P(data);
+ }
+ }
+ if (flags & MYSQLND_FETCH_ASSOC) {
+ /* zend_hash_quick_update needs length + trailing zero */
+ /* QQ: Error handling ? */
+ /*
+ zend_hash_quick_update does not check, as add_assoc_zval_ex do, whether
+ the index is a numeric and convert it to it. This however means constant
+ hashing of the column name, which is not needed as it can be precomputed.
+ */
+ Z_TRY_ADDREF_P(data);
+ if (meta->fields[i].is_numeric == FALSE) {
+ zend_hash_update(row_ht, meta->fields[i].sname, data);
+ } else {
+ zend_hash_index_update(row_ht, meta->fields[i].num_key, data);
+ }
}
+
+ zval_ptr_dtor_nogc(data);
}
- /*
- return_value is IS_NULL for no more data and an array for data. Thus it's ok
- to return here.
- */
DBG_VOID_RETURN;
}
/* }}} */
@@ -1779,91 +1023,29 @@ MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES * result, const unsigned int
static MYSQLND_ROW_C
MYSQLND_METHOD(mysqlnd_res, fetch_row_c)(MYSQLND_RES * result)
{
- zend_bool fetched_anything;
+ bool fetched_anything;
+ zval *row_data;
MYSQLND_ROW_C ret = NULL;
DBG_ENTER("mysqlnd_res::fetch_row_c");
- if (result->stored_data && result->stored_data->m.fetch_row == MYSQLND_METHOD(mysqlnd_result_buffered_zval, fetch_row)) {
- MYSQLND_METHOD(mysqlnd_result_buffered, fetch_row_c)(result, (void *) &ret, 0, &fetched_anything);
- } else if (result->unbuf && result->unbuf->m.fetch_row == MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)) {
- MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row_c)(result, (void *) &ret, 0, &fetched_anything);
- } else {
- ret = NULL;
- php_error_docref(NULL, E_ERROR, "result->m.fetch_row has invalid value. Report to the developers");
- }
- DBG_RETURN(ret);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_res::fetch_all */
-static void
-MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES * result, const unsigned int flags, zval *return_value ZEND_FILE_LINE_DC)
-{
- zval row;
- zend_ulong i = 0;
- MYSQLND_RES_BUFFERED *set = result->stored_data;
-
- DBG_ENTER("mysqlnd_res::fetch_all");
-
- if ((!result->unbuf && !set)) {
- php_error_docref(NULL, E_WARNING, "fetch_all can be used only with buffered sets");
- if (result->conn) {
- SET_CLIENT_ERROR(result->conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "fetch_all can be used only with buffered sets");
- }
- RETVAL_NULL();
- DBG_VOID_RETURN;
- }
-
- /* 4 is a magic value. The cast is safe, if larger then the array will be later extended - no big deal :) */
- array_init_size(return_value, set? (unsigned int) set->row_count : 4);
-
- do {
- mysqlnd_fetch_into(result, flags, &row, MYSQLND_MYSQLI);
- if (Z_TYPE(row) != IS_ARRAY) {
- zval_ptr_dtor_nogc(&row);
- break;
+ mysqlnd_result_free_prev_data(result);
+ if (result->m.fetch_row(result, &row_data, 0, &fetched_anything) == PASS && fetched_anything) {
+ unsigned field_count = result->field_count;
+ MYSQLND_FIELD *field = result->meta->fields;
+
+ ret = mnd_emalloc(field_count * sizeof(char *));
+ for (unsigned i = 0; i < field_count; i++, field++) {
+ zval *data = &row_data[i];
+ if (Z_TYPE_P(data) != IS_NULL) {
+ convert_to_string(data);
+ ret[i] = Z_STRVAL_P(data);
+ } else {
+ ret[i] = NULL;
+ }
}
- add_index_zval(return_value, i++, &row);
- } while (1);
-
- DBG_VOID_RETURN;
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_res::fetch_field_data */
-static void
-MYSQLND_METHOD(mysqlnd_res, fetch_field_data)(MYSQLND_RES * result, const unsigned int offset, zval *return_value)
-{
- zval row;
- zval *entry;
- unsigned int i = 0;
-
- DBG_ENTER("mysqlnd_res::fetch_field_data");
- DBG_INF_FMT("offset=%u", offset);
- /*
- Hint Zend how many elements we will have in the hash. Thus it won't
- extend and rehash the hash constantly.
- */
- mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, &row, MYSQLND_MYSQL);
- if (Z_TYPE(row) != IS_ARRAY) {
- zval_ptr_dtor_nogc(&row);
- RETVAL_NULL();
- DBG_VOID_RETURN;
+ result->free_row_data = 1;
}
-
- zend_hash_internal_pointer_reset(Z_ARRVAL(row));
- while (i++ < offset) {
- zend_hash_move_forward(Z_ARRVAL(row));
- }
-
- entry = zend_hash_get_current_data(Z_ARRVAL(row));
-
- ZVAL_COPY(return_value, entry);
- zval_ptr_dtor_nogc(&row);
-
- DBG_VOID_RETURN;
+ DBG_RETURN(ret);
}
/* }}} */
@@ -1874,8 +1056,6 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_res)
MYSQLND_METHOD(mysqlnd_res, store_result),
MYSQLND_METHOD(mysqlnd_res, fetch_into),
MYSQLND_METHOD(mysqlnd_res, fetch_row_c),
- MYSQLND_METHOD(mysqlnd_res, fetch_all),
- MYSQLND_METHOD(mysqlnd_res, fetch_field_data),
MYSQLND_METHOD(mysqlnd_res, num_rows),
MYSQLND_METHOD(mysqlnd_res, num_fields),
MYSQLND_METHOD(mysqlnd_res, skip_result),
@@ -1890,7 +1070,6 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_res)
MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data),
MYSQLND_METHOD(mysqlnd_res, free_result_buffers),
MYSQLND_METHOD(mysqlnd_res, free_result),
- MYSQLND_METHOD(mysqlnd_res, free_result_internal),
MYSQLND_METHOD(mysqlnd_res, free_result_contents_internal),
mysqlnd_result_meta_init,
NULL, /* unused1 */
@@ -1906,18 +1085,16 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_result_unbuffered)
NULL, /* row_decoder */
MYSQLND_METHOD(mysqlnd_result_unbuffered, num_rows),
MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_lengths),
- MYSQLND_METHOD(mysqlnd_result_unbuffered, free_last_data),
MYSQLND_METHOD(mysqlnd_result_unbuffered, free_result)
MYSQLND_CLASS_METHODS_END;
MYSQLND_CLASS_METHODS_START(mysqlnd_result_buffered)
- NULL, /* fetch_row */
+ MYSQLND_METHOD(mysqlnd_result_buffered, fetch_row),
NULL, /* row_decoder */
MYSQLND_METHOD(mysqlnd_result_buffered, num_rows),
- NULL, /* fetch_lengths */
- NULL, /* data_seek */
- NULL, /* initialize_result_set_rest */
+ MYSQLND_METHOD(mysqlnd_result_buffered, fetch_lengths),
+ MYSQLND_METHOD(mysqlnd_result_buffered, data_seek),
MYSQLND_METHOD(mysqlnd_result_buffered, free_result)
MYSQLND_CLASS_METHODS_END;
@@ -1940,6 +1117,9 @@ mysqlnd_result_init(const unsigned int field_count)
ret = pool->get_chunk(pool, alloc_size);
memset(ret, 0, alloc_size);
+ ret->row_data = pool->get_chunk(pool, field_count * sizeof(zval));
+ ret->free_row_data = 0;
+
ret->memory_pool = pool;
ret->field_count = field_count;
ret->m = *mysqlnd_result_get_methods();
@@ -1953,7 +1133,7 @@ mysqlnd_result_init(const unsigned int field_count)
/* {{{ mysqlnd_result_unbuffered_init */
PHPAPI MYSQLND_RES_UNBUFFERED *
-mysqlnd_result_unbuffered_init(MYSQLND_RES *result, const unsigned int field_count, const zend_bool ps)
+mysqlnd_result_unbuffered_init(MYSQLND_RES *result, const unsigned int field_count, MYSQLND_STMT_DATA *stmt)
{
const size_t alloc_size = sizeof(MYSQLND_RES_UNBUFFERED) + mysqlnd_plugin_count() * sizeof(void *);
MYSQLND_MEMORY_POOL * pool = result->memory_pool;
@@ -1964,104 +1144,58 @@ mysqlnd_result_unbuffered_init(MYSQLND_RES *result, const unsigned int field_cou
ret = pool->get_chunk(pool, alloc_size);
memset(ret, 0, alloc_size);
- ret->lengths = pool->get_chunk(pool, field_count * sizeof(size_t));
- memset(ret->lengths, 0, field_count * sizeof(size_t));
-
ret->result_set_memory_pool = pool;
- ret->field_count= field_count;
- ret->ps = ps;
+ ret->field_count = field_count;
+ ret->stmt = stmt;
ret->m = *mysqlnd_result_unbuffered_get_methods();
- if (ps) {
+ if (stmt) {
+ ret->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol;
ret->m.fetch_lengths = NULL; /* makes no sense */
- ret->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol;
+ ret->lengths = NULL;
} else {
- ret->m.row_decoder = php_mysqlnd_rowp_read_text_protocol_zval;
- }
-
- DBG_RETURN(ret);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_result_buffered_zval_init */
-PHPAPI MYSQLND_RES_BUFFERED_ZVAL *
-mysqlnd_result_buffered_zval_init(MYSQLND_RES * result, const unsigned int field_count, const zend_bool ps)
-{
- const size_t alloc_size = sizeof(MYSQLND_RES_BUFFERED_ZVAL) + mysqlnd_plugin_count() * sizeof(void *);
- MYSQLND_MEMORY_POOL * pool = result->memory_pool;
- MYSQLND_RES_BUFFERED_ZVAL * ret;
-
- DBG_ENTER("mysqlnd_result_buffered_zval_init");
-
- ret = pool->get_chunk(pool, alloc_size);
- memset(ret, 0, alloc_size);
+ ret->m.row_decoder = php_mysqlnd_rowp_read_text_protocol;
- if (FAIL == mysqlnd_error_info_init(&ret->error_info, 0)) {
- DBG_RETURN(NULL);
+ ret->lengths = pool->get_chunk(pool, field_count * sizeof(size_t));
+ memset(ret->lengths, 0, field_count * sizeof(size_t));
}
- ret->lengths = pool->get_chunk(pool, field_count * sizeof(size_t));
- memset(ret->lengths, 0, field_count * sizeof(size_t));
-
- ret->result_set_memory_pool = pool;
- ret->field_count= field_count;
- ret->ps = ps;
- ret->m = *mysqlnd_result_buffered_get_methods();
- ret->type = MYSQLND_BUFFERED_TYPE_ZVAL;
-
- if (ps) {
- ret->m.fetch_lengths = NULL; /* makes no sense */
- ret->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol;
- } else {
- ret->m.row_decoder = php_mysqlnd_rowp_read_text_protocol_zval;
- }
- ret->m.fetch_row = MYSQLND_METHOD(mysqlnd_result_buffered_zval, fetch_row);
- ret->m.fetch_lengths = MYSQLND_METHOD(mysqlnd_result_buffered_zval, fetch_lengths);
- ret->m.data_seek = MYSQLND_METHOD(mysqlnd_result_buffered_zval, data_seek);
- ret->m.initialize_result_set_rest = MYSQLND_METHOD(mysqlnd_result_buffered_zval, initialize_result_set_rest);
DBG_RETURN(ret);
}
/* }}} */
-/* {{{ mysqlnd_result_buffered_c_init */
-PHPAPI MYSQLND_RES_BUFFERED_C *
-mysqlnd_result_buffered_c_init(MYSQLND_RES * result, const unsigned int field_count, const zend_bool ps)
+/* {{{ mysqlnd_result_buffered_init */
+PHPAPI MYSQLND_RES_BUFFERED *
+mysqlnd_result_buffered_init(MYSQLND_RES * result, const unsigned int field_count, MYSQLND_STMT_DATA *stmt)
{
- const size_t alloc_size = sizeof(MYSQLND_RES_BUFFERED_C) + mysqlnd_plugin_count() * sizeof(void *);
+ const size_t alloc_size = sizeof(MYSQLND_RES_BUFFERED) + mysqlnd_plugin_count() * sizeof(void *);
MYSQLND_MEMORY_POOL * pool = result->memory_pool;
- MYSQLND_RES_BUFFERED_C * ret;
+ MYSQLND_RES_BUFFERED * ret;
- DBG_ENTER("mysqlnd_result_buffered_c_init");
+ DBG_ENTER("mysqlnd_result_buffered_init");
ret = pool->get_chunk(pool, alloc_size);
memset(ret, 0, alloc_size);
- if (FAIL == mysqlnd_error_info_init(&ret->error_info, 0)) {
- DBG_RETURN(NULL);
- }
-
- ret->lengths = pool->get_chunk(pool, field_count * sizeof(size_t));
- memset(ret->lengths, 0, field_count * sizeof(size_t));
+ mysqlnd_error_info_init(&ret->error_info, /* persistent */ 0);
ret->result_set_memory_pool = pool;
ret->field_count= field_count;
- ret->ps = ps;
+ ret->stmt = stmt;
ret->m = *mysqlnd_result_buffered_get_methods();
- ret->type = MYSQLND_BUFFERED_TYPE_C;
- if (ps) {
+ if (stmt) {
+ ret->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol;
ret->m.fetch_lengths = NULL; /* makes no sense */
- ret->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol;
+ ret->lengths = NULL;
} else {
- ret->m.row_decoder = php_mysqlnd_rowp_read_text_protocol_c;
+ ret->m.row_decoder = php_mysqlnd_rowp_read_text_protocol;
+
+ ret->lengths = pool->get_chunk(pool, field_count * sizeof(size_t));
+ memset(ret->lengths, 0, field_count * sizeof(size_t));
}
- ret->m.fetch_row = MYSQLND_METHOD(mysqlnd_result_buffered_c, fetch_row);
- ret->m.fetch_lengths = MYSQLND_METHOD(mysqlnd_result_buffered_c, fetch_lengths);
- ret->m.data_seek = MYSQLND_METHOD(mysqlnd_result_buffered_c, data_seek);
- ret->m.initialize_result_set_rest = MYSQLND_METHOD(mysqlnd_result_buffered_c, initialize_result_set_rest);
DBG_RETURN(ret);
}
diff --git a/ext/mysqlnd/mysqlnd_result.h b/ext/mysqlnd/mysqlnd_result.h
index 14f894ccba..9dde8a5fad 100644
--- a/ext/mysqlnd/mysqlnd_result.h
+++ b/ext/mysqlnd/mysqlnd_result.h
@@ -19,9 +19,8 @@
#define MYSQLND_RESULT_H
PHPAPI MYSQLND_RES * mysqlnd_result_init(const unsigned int field_count);
-PHPAPI MYSQLND_RES_UNBUFFERED * mysqlnd_result_unbuffered_init(MYSQLND_RES * result, const unsigned int field_count, const zend_bool ps);
-PHPAPI MYSQLND_RES_BUFFERED_ZVAL * mysqlnd_result_buffered_zval_init(MYSQLND_RES * result, const unsigned int field_count, const zend_bool ps);
-PHPAPI MYSQLND_RES_BUFFERED_C * mysqlnd_result_buffered_c_init(MYSQLND_RES * result, const unsigned int field_count, const zend_bool ps);
+PHPAPI MYSQLND_RES_UNBUFFERED * mysqlnd_result_unbuffered_init(MYSQLND_RES * result, const unsigned int field_count, MYSQLND_STMT_DATA *stmt);
+PHPAPI MYSQLND_RES_BUFFERED * mysqlnd_result_buffered_init(MYSQLND_RES * result, const unsigned int field_count, MYSQLND_STMT_DATA *stmt);
enum_func_status mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * stmt);
diff --git a/ext/mysqlnd/mysqlnd_result_meta.c b/ext/mysqlnd/mysqlnd_result_meta.c
index 1cbc438b44..9af4b0e152 100644
--- a/ext/mysqlnd/mysqlnd_result_meta.c
+++ b/ext/mysqlnd/mysqlnd_result_meta.c
@@ -215,9 +215,8 @@ MYSQLND_METHOD(mysqlnd_res_meta, fetch_field)(MYSQLND_RES_METADATA * const meta)
DBG_INF("no more fields");
DBG_RETURN(NULL);
}
- DBG_INF_FMT("name=%s max_length=%u",
- meta->fields[meta->current_field].name? meta->fields[meta->current_field].name:"",
- meta->fields[meta->current_field].max_length);
+ DBG_INF_FMT("name=%s",
+ meta->fields[meta->current_field].name? meta->fields[meta->current_field].name:"");
DBG_RETURN(&meta->fields[meta->current_field++]);
}
/* }}} */
@@ -229,9 +228,8 @@ MYSQLND_METHOD(mysqlnd_res_meta, fetch_field_direct)(const MYSQLND_RES_METADATA
{
DBG_ENTER("mysqlnd_res_meta::fetch_field_direct");
DBG_INF_FMT("fieldnr=%u", fieldnr);
- DBG_INF_FMT("name=%s max_length=%u",
- meta->fields[meta->current_field].name? meta->fields[meta->current_field].name:"",
- meta->fields[meta->current_field].max_length);
+ DBG_INF_FMT("name=%s",
+ meta->fields[meta->current_field].name? meta->fields[meta->current_field].name:"");
DBG_RETURN(&meta->fields[fieldnr]);
}
/* }}} */
@@ -289,20 +287,17 @@ mysqlnd_result_meta_init(MYSQLND_RES *result, unsigned int field_count)
MYSQLND_RES_METADATA *ret;
DBG_ENTER("mysqlnd_result_meta_init");
- do {
- ret = result->memory_pool->get_chunk(result->memory_pool, alloc_size);
- memset(ret, 0, alloc_size);
- ret->m = & mysqlnd_mysqlnd_res_meta_methods;
-
- ret->field_count = field_count;
- /* +1 is to have empty marker at the end */
- alloc_size = (field_count + 1) * sizeof(MYSQLND_FIELD);
- ret->fields = result->memory_pool->get_chunk(result->memory_pool, alloc_size);
- memset(ret->fields, 0, alloc_size);
- DBG_INF_FMT("meta=%p", ret);
- DBG_RETURN(ret);
- } while (0);
- DBG_RETURN(NULL);
+ ret = result->memory_pool->get_chunk(result->memory_pool, alloc_size);
+ memset(ret, 0, alloc_size);
+ ret->m = & mysqlnd_mysqlnd_res_meta_methods;
+
+ ret->field_count = field_count;
+ /* +1 is to have empty marker at the end */
+ alloc_size = (field_count + 1) * sizeof(MYSQLND_FIELD);
+ ret->fields = result->memory_pool->get_chunk(result->memory_pool, alloc_size);
+ memset(ret->fields, 0, alloc_size);
+ DBG_INF_FMT("meta=%p", ret);
+ DBG_RETURN(ret);
}
/* }}} */
diff --git a/ext/mysqlnd/mysqlnd_statistics.c b/ext/mysqlnd/mysqlnd_statistics.c
index 0a34ebc81c..117847a5f3 100644
--- a/ext/mysqlnd/mysqlnd_statistics.c
+++ b/ext/mysqlnd/mysqlnd_statistics.c
@@ -212,7 +212,7 @@ mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, const MYSQLND_STRING
/* {{{ mysqlnd_stats_init */
PHPAPI void
-mysqlnd_stats_init(MYSQLND_STATS ** stats, const size_t statistic_count, const zend_bool persistent)
+mysqlnd_stats_init(MYSQLND_STATS ** stats, const size_t statistic_count, const bool persistent)
{
*stats = pecalloc(1, sizeof(MYSQLND_STATS), persistent);
(*stats)->values = pecalloc(statistic_count, sizeof(uint64_t), persistent);
@@ -228,7 +228,7 @@ mysqlnd_stats_init(MYSQLND_STATS ** stats, const size_t statistic_count, const z
/* {{{ mysqlnd_stats_end */
PHPAPI void
-mysqlnd_stats_end(MYSQLND_STATS * stats, const zend_bool persistent)
+mysqlnd_stats_end(MYSQLND_STATS * stats, const bool persistent)
{
#ifdef ZTS
tsrm_mutex_free(stats->LOCK_access);
diff --git a/ext/mysqlnd/mysqlnd_statistics.h b/ext/mysqlnd/mysqlnd_statistics.h
index 0a6310d716..99e3903492 100644
--- a/ext/mysqlnd/mysqlnd_statistics.h
+++ b/ext/mysqlnd/mysqlnd_statistics.h
@@ -108,8 +108,8 @@
-PHPAPI void mysqlnd_stats_init(MYSQLND_STATS ** stats, const size_t statistic_count, const zend_bool persistent);
-PHPAPI void mysqlnd_stats_end(MYSQLND_STATS * stats, const zend_bool persistent);
+PHPAPI void mysqlnd_stats_init(MYSQLND_STATS ** stats, const size_t statistic_count, const bool persistent);
+PHPAPI void mysqlnd_stats_end(MYSQLND_STATS * stats, const bool persistent);
PHPAPI void mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, const MYSQLND_STRING * names, zval *return_value ZEND_FILE_LINE_DC);
diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h
index ee3dba0e87..7929cc1153 100644
--- a/ext/mysqlnd/mysqlnd_structs.h
+++ b/ext/mysqlnd/mysqlnd_structs.h
@@ -51,12 +51,9 @@ typedef struct st_mysqlnd_memory_pool MYSQLND_MEMORY_POOL;
struct st_mysqlnd_memory_pool
{
zend_arena *arena;
- void *last;
void *checkpoint;
void* (*get_chunk)(MYSQLND_MEMORY_POOL * pool, size_t size);
- void* (*resize_chunk)(MYSQLND_MEMORY_POOL * pool, void * ptr, size_t old_size, size_t size);
- void (*free_chunk)(MYSQLND_MEMORY_POOL * pool, void * ptr);
};
@@ -79,7 +76,7 @@ typedef struct st_mysqlnd_cmd_buffer
typedef struct st_mysqlnd_field
{
zend_string *sname; /* Name of column */
- zend_bool is_numeric;
+ bool is_numeric;
zend_ulong num_key;
const char *name; /* Name of column in C string */
const char *org_name; /* Original column name, if an alias */
@@ -89,7 +86,6 @@ typedef struct st_mysqlnd_field
const char *catalog; /* Catalog for table */
char *def; /* Default value */
zend_ulong length; /* Width of column (create length) */
- zend_ulong max_length; /* Max width for selected set */
unsigned int name_length;
unsigned int org_name_length;
unsigned int table_length;
@@ -150,7 +146,7 @@ struct st_mysqlnd_error_info
unsigned int error_no;
zend_llist error_list;
- zend_bool persistent;
+ bool persistent;
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_error_info) *m;
};
@@ -231,9 +227,9 @@ typedef struct st_mysqlnd_session_options
/* maximum allowed packet size for communication */
unsigned int max_allowed_packet;
-#ifdef MYSQLND_STRING_TO_INT_CONVERSION
- zend_bool int_and_float_native;
-#endif
+ bool int_and_float_native;
+
+ char *local_infile_directory;
} MYSQLND_SESSION_OPTIONS;
@@ -282,9 +278,7 @@ typedef struct st_mysqlnd_param_bind MYSQLND_PARAM_BIND;
typedef struct st_mysqlnd_result_bind MYSQLND_RESULT_BIND;
typedef struct st_mysqlnd_result_metadata MYSQLND_RES_METADATA;
-typedef struct st_mysqlnd_buffered_result_parent MYSQLND_RES_BUFFERED;
-typedef struct st_mysqlnd_buffered_result_zval MYSQLND_RES_BUFFERED_ZVAL;
-typedef struct st_mysqlnd_buffered_result_c MYSQLND_RES_BUFFERED_C;
+typedef struct st_mysqlnd_buffered_result MYSQLND_RES_BUFFERED;
typedef struct st_mysqlnd_unbuffered_result MYSQLND_RES_UNBUFFERED;
typedef struct st_mysqlnd_debug MYSQLND_DEBUG;
@@ -292,9 +286,9 @@ typedef struct st_mysqlnd_debug MYSQLND_DEBUG;
typedef MYSQLND_RES* (*mysqlnd_stmt_use_or_store_func)(MYSQLND_STMT * const);
typedef enum_func_status (*mysqlnd_fetch_row_func)(MYSQLND_RES *result,
- void * param,
+ zval **row,
const unsigned int flags,
- zend_bool * fetched_anything
+ bool * fetched_anything
);
@@ -307,7 +301,7 @@ struct st_mysqlnd_stats
uint64_t *values;
mysqlnd_stat_trigger *triggers;
size_t count;
- zend_bool in_trigger;
+ bool in_trigger;
#ifdef ZTS
MUTEX_T LOCK_access;
#endif
@@ -319,12 +313,12 @@ typedef enum_func_status (*func_mysqlnd_execute_com_debug)(MYSQLND_CONN_DATA * c
typedef enum_func_status (*func_mysqlnd_execute_com_init_db)(MYSQLND_CONN_DATA * const conn, const MYSQLND_CSTRING db);
typedef enum_func_status (*func_mysqlnd_execute_com_ping)(MYSQLND_CONN_DATA * const conn);
typedef enum_func_status (*func_mysqlnd_execute_com_statistics)(MYSQLND_CONN_DATA * const conn, zend_string ** message);
-typedef enum_func_status (*func_mysqlnd_execute_com_process_kill)(MYSQLND_CONN_DATA * const conn, const unsigned int process_id, const zend_bool read_response);
+typedef enum_func_status (*func_mysqlnd_execute_com_process_kill)(MYSQLND_CONN_DATA * const conn, const unsigned int process_id, const bool read_response);
typedef enum_func_status (*func_mysqlnd_execute_com_refresh)(MYSQLND_CONN_DATA * const conn, const uint8_t options);
typedef enum_func_status (*func_mysqlnd_execute_com_shutdown)(MYSQLND_CONN_DATA * const conn, const uint8_t level);
typedef enum_func_status (*func_mysqlnd_execute_com_quit)(MYSQLND_CONN_DATA * const conn);
typedef enum_func_status (*func_mysqlnd_execute_com_query)(MYSQLND_CONN_DATA * const conn, MYSQLND_CSTRING query);
-typedef enum_func_status (*func_mysqlnd_execute_com_change_user)(MYSQLND_CONN_DATA * const conn, const MYSQLND_CSTRING payload, const zend_bool silent);
+typedef enum_func_status (*func_mysqlnd_execute_com_change_user)(MYSQLND_CONN_DATA * const conn, const MYSQLND_CSTRING payload, const bool silent);
typedef enum_func_status (*func_mysqlnd_execute_com_reap_result)(MYSQLND_CONN_DATA * const conn);
typedef enum_func_status (*func_mysqlnd_execute_com_stmt_prepare)(MYSQLND_CONN_DATA * const conn, const MYSQLND_CSTRING query);
typedef enum_func_status (*func_mysqlnd_execute_com_stmt_execute)(MYSQLND_CONN_DATA * conn, const MYSQLND_CSTRING payload);
@@ -365,13 +359,13 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_command)
typedef enum_func_status (*func_mysqlnd_vio__init)(MYSQLND_VIO * const vio, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info);
typedef void (*func_mysqlnd_vio__dtor)(MYSQLND_VIO * const vio, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
-typedef enum_func_status (*func_mysqlnd_vio__connect)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const zend_bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
+typedef enum_func_status (*func_mysqlnd_vio__connect)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
typedef void (*func_mysqlnd_vio__close_stream)(MYSQLND_VIO * const vio, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
-typedef php_stream * (*func_mysqlnd_vio__open_stream)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const zend_bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
+typedef php_stream * (*func_mysqlnd_vio__open_stream)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
typedef php_stream * (*func_mysqlnd_vio__get_stream)(const MYSQLND_VIO * const vio);
typedef enum_func_status (*func_mysqlnd_vio__set_stream)(MYSQLND_VIO * const vio, php_stream * vio_stream);
-typedef zend_bool (*func_mysqlnd_vio__has_valid_stream)(const MYSQLND_VIO * const vio);
+typedef bool (*func_mysqlnd_vio__has_valid_stream)(const MYSQLND_VIO * const vio);
typedef func_mysqlnd_vio__open_stream (*func_mysqlnd_vio__get_open_stream)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, MYSQLND_ERROR_INFO * const error_info);
typedef enum_func_status (*func_mysqlnd_vio__set_client_option)(MYSQLND_VIO * const vio, enum_mysqlnd_client_option option, const char * const value);
@@ -419,12 +413,12 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio)
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory);
-typedef MYSQLND * (*func_mysqlnd_object_factory__get_connection)(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) * factory, const zend_bool persistent);
+typedef MYSQLND * (*func_mysqlnd_object_factory__get_connection)(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) * factory, const bool persistent);
typedef MYSQLND * (*func_mysqlnd_object_factory__clone_connection_object)(MYSQLND * conn);
typedef MYSQLND_STMT * (*func_mysqlnd_object_factory__get_prepared_statement)(MYSQLND_CONN_DATA * conn);
-typedef MYSQLND_PFC * (*func_mysqlnd_object_factory__get_pfc)(const zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
-typedef MYSQLND_VIO * (*func_mysqlnd_object_factory__get_vio)(const zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
-typedef MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * (*func_mysqlnd_object_factory__get_protocol_payload_decoder_factory)(MYSQLND_CONN_DATA * conn, const zend_bool persistent);
+typedef MYSQLND_PFC * (*func_mysqlnd_object_factory__get_pfc)(const bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
+typedef MYSQLND_VIO * (*func_mysqlnd_object_factory__get_vio)(const bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
+typedef MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * (*func_mysqlnd_object_factory__get_protocol_payload_decoder_factory)(MYSQLND_CONN_DATA * conn, const bool persistent);
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory)
@@ -444,10 +438,10 @@ typedef enum_func_status (*func_mysqlnd_conn_data__set_charset)(MYSQLND_CONN_DAT
typedef enum_func_status (*func_mysqlnd_conn_data__query)(MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len);
typedef enum_func_status (*func_mysqlnd_conn_data__send_query)(MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len, enum_mysqlnd_send_query_type type, zval *read_cb, zval *err_cb);
typedef enum_func_status (*func_mysqlnd_conn_data__reap_query)(MYSQLND_CONN_DATA * conn, enum_mysqlnd_reap_result_type type);
-typedef MYSQLND_RES * (*func_mysqlnd_conn_data__use_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags);
-typedef MYSQLND_RES * (*func_mysqlnd_conn_data__store_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags);
+typedef MYSQLND_RES * (*func_mysqlnd_conn_data__use_result)(MYSQLND_CONN_DATA * const conn);
+typedef MYSQLND_RES * (*func_mysqlnd_conn_data__store_result)(MYSQLND_CONN_DATA * const conn);
typedef enum_func_status (*func_mysqlnd_conn_data__next_result)(MYSQLND_CONN_DATA * const conn);
-typedef zend_bool (*func_mysqlnd_conn_data__more_results)(const MYSQLND_CONN_DATA * const conn);
+typedef bool (*func_mysqlnd_conn_data__more_results)(const MYSQLND_CONN_DATA * const conn);
typedef MYSQLND_STMT * (*func_mysqlnd_conn_data__stmt_init)(MYSQLND_CONN_DATA * const conn);
@@ -458,7 +452,7 @@ typedef enum_func_status (*func_mysqlnd_conn_data__ping)(MYSQLND_CONN_DATA * con
typedef enum_func_status (*func_mysqlnd_conn_data__kill_connection)(MYSQLND_CONN_DATA * conn, unsigned int pid);
typedef enum_func_status (*func_mysqlnd_conn_data__select_db)(MYSQLND_CONN_DATA * const conn, const char * const db, const size_t db_len);
typedef enum_func_status (*func_mysqlnd_conn_data__server_dump_debug_information)(MYSQLND_CONN_DATA * const conn);
-typedef enum_func_status (*func_mysqlnd_conn_data__change_user)(MYSQLND_CONN_DATA * const conn, const char * user, const char * passwd, const char * db, zend_bool silent, size_t passwd_len);
+typedef enum_func_status (*func_mysqlnd_conn_data__change_user)(MYSQLND_CONN_DATA * const conn, const char * user, const char * passwd, const char * db, bool silent, size_t passwd_len);
typedef unsigned int (*func_mysqlnd_conn_data__get_error_no)(const MYSQLND_CONN_DATA * const conn);
typedef const char * (*func_mysqlnd_conn_data__get_error_str)(const MYSQLND_CONN_DATA * const conn);
@@ -493,8 +487,8 @@ typedef enum_func_status (*func_mysqlnd_conn_data__query_read_result_set_header)
typedef MYSQLND_CONN_DATA * (*func_mysqlnd_conn_data__get_reference)(MYSQLND_CONN_DATA * const conn);
typedef enum_func_status (*func_mysqlnd_conn_data__free_reference)(MYSQLND_CONN_DATA * const conn);
-typedef enum_func_status (*func_mysqlnd_conn_data__send_command_do_request)(MYSQLND_CONN_DATA * const conn, const enum php_mysqlnd_server_command command, const zend_uchar * const arg, const size_t arg_len, const zend_bool silent, const zend_bool ignore_upsert_status);
-typedef enum_func_status (*func_mysqlnd_conn_data__send_command_handle_response)(MYSQLND_CONN_DATA * const conn, const enum mysqlnd_packet_type ok_packet, const zend_bool silent, const enum php_mysqlnd_server_command command, const zend_bool ignore_upsert_status);
+typedef enum_func_status (*func_mysqlnd_conn_data__send_command_do_request)(MYSQLND_CONN_DATA * const conn, const enum php_mysqlnd_server_command command, const zend_uchar * const arg, const size_t arg_len, const bool silent, const bool ignore_upsert_status);
+typedef enum_func_status (*func_mysqlnd_conn_data__send_command_handle_response)(MYSQLND_CONN_DATA * const conn, const enum mysqlnd_packet_type ok_packet, const bool silent, const enum php_mysqlnd_server_command command, const bool ignore_upsert_status);
typedef enum_func_status (*func_mysqlnd_conn_data__restart_psession)(MYSQLND_CONN_DATA * conn);
typedef enum_func_status (*func_mysqlnd_conn_data__end_psession)(MYSQLND_CONN_DATA * conn);
@@ -508,7 +502,7 @@ typedef enum_func_status (*func_mysqlnd_conn_data__set_autocommit)(MYSQLND_CONN_
typedef enum_func_status (*func_mysqlnd_conn_data__tx_commit)(MYSQLND_CONN_DATA * conn);
typedef enum_func_status (*func_mysqlnd_conn_data__tx_rollback)(MYSQLND_CONN_DATA * conn);
typedef enum_func_status (*func_mysqlnd_conn_data__tx_begin)(MYSQLND_CONN_DATA * conn, const unsigned int mode, const char * const name);
-typedef enum_func_status (*func_mysqlnd_conn_data__tx_commit_or_rollback)(MYSQLND_CONN_DATA * conn, const zend_bool commit, const unsigned int flags, const char * const name);
+typedef enum_func_status (*func_mysqlnd_conn_data__tx_commit_or_rollback)(MYSQLND_CONN_DATA * conn, const bool commit, const unsigned int flags, const char * const name);
typedef void (*func_mysqlnd_conn_data__tx_cor_options_to_string)(const MYSQLND_CONN_DATA * const conn, smart_str * tmp_str, const unsigned int mode);
typedef enum_func_status (*func_mysqlnd_conn_data__tx_savepoint)(MYSQLND_CONN_DATA * conn, const char * const name);
typedef enum_func_status (*func_mysqlnd_conn_data__tx_savepoint_release)(MYSQLND_CONN_DATA * conn, const char * const name);
@@ -526,7 +520,7 @@ typedef enum_func_status (*func_mysqlnd_conn_data__set_client_option_2d)(MYSQLND
typedef size_t (*func_mysqlnd_conn_data__negotiate_client_api_capabilities)(MYSQLND_CONN_DATA * const conn, const size_t flags);
typedef size_t (*func_mysqlnd_conn_data__get_client_api_capabilities)(const MYSQLND_CONN_DATA * const conn);
-typedef MYSQLND_STRING (*func_mysqlnd_conn_data__get_scheme)(MYSQLND_CONN_DATA * conn, MYSQLND_CSTRING hostname, MYSQLND_CSTRING *socket_or_pipe, unsigned int port, zend_bool * unix_socket, zend_bool * named_pipe);
+typedef MYSQLND_STRING (*func_mysqlnd_conn_data__get_scheme)(MYSQLND_CONN_DATA * conn, MYSQLND_CSTRING hostname, MYSQLND_CSTRING *socket_or_pipe, unsigned int port, bool * unix_socket, bool * named_pipe);
@@ -638,15 +632,13 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn)
/* for decoding - binary or text protocol */
typedef enum_func_status (*func_mysqlnd_res__row_decoder)(MYSQLND_ROW_BUFFER * row_buffer, zval * fields,
const unsigned int field_count, const MYSQLND_FIELD * const fields_metadata,
- const zend_bool as_int_or_float, MYSQLND_STATS * const stats);
+ const bool as_int_or_float, MYSQLND_STATS * const stats);
-typedef MYSQLND_RES * (*func_mysqlnd_res__use_result)(MYSQLND_RES * const result, const zend_bool ps_protocol);
-typedef MYSQLND_RES * (*func_mysqlnd_res__store_result)(MYSQLND_RES * result, MYSQLND_CONN_DATA * const conn, const unsigned int flags);
-typedef void (*func_mysqlnd_res__fetch_into)(MYSQLND_RES *result, const unsigned int flags, zval *return_value, enum_mysqlnd_extension ext ZEND_FILE_LINE_DC);
+typedef MYSQLND_RES * (*func_mysqlnd_res__use_result)(MYSQLND_RES * const result, MYSQLND_STMT_DATA *stmt);
+typedef MYSQLND_RES * (*func_mysqlnd_res__store_result)(MYSQLND_RES * result, MYSQLND_CONN_DATA * const conn, MYSQLND_STMT_DATA *stmt);
+typedef void (*func_mysqlnd_res__fetch_into)(MYSQLND_RES *result, const unsigned int flags, zval *return_value ZEND_FILE_LINE_DC);
typedef MYSQLND_ROW_C (*func_mysqlnd_res__fetch_row_c)(MYSQLND_RES *result);
-typedef void (*func_mysqlnd_res__fetch_all)(MYSQLND_RES *result, const unsigned int flags, zval *return_value ZEND_FILE_LINE_DC);
-typedef void (*func_mysqlnd_res__fetch_field_data)(MYSQLND_RES *result, const unsigned int offset, zval *return_value);
typedef uint64_t (*func_mysqlnd_res__num_rows)(const MYSQLND_RES * const result);
typedef unsigned int (*func_mysqlnd_res__num_fields)(const MYSQLND_RES * const result);
typedef enum_func_status (*func_mysqlnd_res__skip_result)(MYSQLND_RES * const result);
@@ -659,14 +651,12 @@ typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_fields)(MYSQLND_RES * con
typedef enum_func_status (*func_mysqlnd_res__read_result_metadata)(MYSQLND_RES * result, MYSQLND_CONN_DATA * conn);
typedef const size_t * (*func_mysqlnd_res__fetch_lengths)(const MYSQLND_RES * const result);
-typedef enum_func_status (*func_mysqlnd_res__store_result_fetch_data)(MYSQLND_CONN_DATA * const conn, MYSQLND_RES * result, MYSQLND_RES_METADATA * meta, MYSQLND_ROW_BUFFER ** row_buffers, zend_bool binary_protocol);
+typedef enum_func_status (*func_mysqlnd_res__store_result_fetch_data)(MYSQLND_CONN_DATA * const conn, MYSQLND_RES * result, MYSQLND_RES_METADATA * meta, MYSQLND_ROW_BUFFER ** row_buffers, bool binary_protocol);
typedef void (*func_mysqlnd_res__free_result_buffers)(MYSQLND_RES * result); /* private */
-typedef enum_func_status (*func_mysqlnd_res__free_result)(MYSQLND_RES * result, const zend_bool implicit);
-typedef void (*func_mysqlnd_res__free_result_internal)(MYSQLND_RES *result);
+typedef enum_func_status (*func_mysqlnd_res__free_result)(MYSQLND_RES * result, const bool implicit);
typedef void (*func_mysqlnd_res__free_result_contents)(MYSQLND_RES *result);
typedef void (*func_mysqlnd_res__free_buffered_data)(MYSQLND_RES *result);
-typedef void (*func_mysqlnd_res__unbuffered_free_last_data)(MYSQLND_RES *result);
typedef MYSQLND_RES_METADATA * (*func_mysqlnd_res__result_meta_init)(MYSQLND_RES *result, unsigned int field_count);
@@ -679,8 +669,6 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res)
func_mysqlnd_res__store_result store_result;
func_mysqlnd_res__fetch_into fetch_into;
func_mysqlnd_res__fetch_row_c fetch_row_c;
- func_mysqlnd_res__fetch_all fetch_all;
- func_mysqlnd_res__fetch_field_data fetch_field_data;
func_mysqlnd_res__num_rows num_rows;
func_mysqlnd_res__num_fields num_fields;
func_mysqlnd_res__skip_result skip_result;
@@ -695,7 +683,6 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res)
func_mysqlnd_res__store_result_fetch_data store_result_fetch_data;
func_mysqlnd_res__free_result_buffers free_result_buffers;
func_mysqlnd_res__free_result free_result;
- func_mysqlnd_res__free_result_internal free_result_internal;
func_mysqlnd_res__free_result_contents free_result_contents;
func_mysqlnd_res__result_meta_init result_meta_init;
@@ -710,7 +697,6 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res)
typedef uint64_t (*func_mysqlnd_result_unbuffered__num_rows)(const MYSQLND_RES_UNBUFFERED * const result);
typedef const size_t * (*func_mysqlnd_result_unbuffered__fetch_lengths)(const MYSQLND_RES_UNBUFFERED * const result);
-typedef void (*func_mysqlnd_result_unbuffered__free_last_data)(MYSQLND_RES_UNBUFFERED * result, MYSQLND_STATS * const global_stats);
typedef void (*func_mysqlnd_result_unbuffered__free_result)(MYSQLND_RES_UNBUFFERED * const result, MYSQLND_STATS * const global_stats);
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_unbuffered)
@@ -719,13 +705,10 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_unbuffered)
func_mysqlnd_res__row_decoder row_decoder;
func_mysqlnd_result_unbuffered__num_rows num_rows;
func_mysqlnd_result_unbuffered__fetch_lengths fetch_lengths;
- func_mysqlnd_result_unbuffered__free_last_data free_last_data;
func_mysqlnd_result_unbuffered__free_result free_result;
};
typedef uint64_t (*func_mysqlnd_result_buffered__num_rows)(const MYSQLND_RES_BUFFERED * const result);
-typedef enum_func_status (*func_mysqlnd_result_buffered__initialize_result_set_rest)(MYSQLND_RES_BUFFERED * const result, MYSQLND_RES_METADATA * const meta,
- MYSQLND_STATS * stats, const zend_bool int_and_float_native);
typedef const size_t * (*func_mysqlnd_result_buffered__fetch_lengths)(const MYSQLND_RES_BUFFERED * const result);
typedef enum_func_status (*func_mysqlnd_result_buffered__data_seek)(MYSQLND_RES_BUFFERED * const result, const uint64_t row);
typedef void (*func_mysqlnd_result_buffered__free_result)(MYSQLND_RES_BUFFERED * const result);
@@ -737,7 +720,6 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered)
func_mysqlnd_result_buffered__num_rows num_rows;
func_mysqlnd_result_buffered__fetch_lengths fetch_lengths;
func_mysqlnd_result_buffered__data_seek data_seek;
- func_mysqlnd_result_buffered__initialize_result_set_rest initialize_result_set_rest;
func_mysqlnd_result_buffered__free_result free_result;
};
@@ -770,14 +752,14 @@ typedef enum_func_status (*func_mysqlnd_stmt__execute)(MYSQLND_STMT * const stmt
typedef MYSQLND_RES * (*func_mysqlnd_stmt__use_result)(MYSQLND_STMT * const stmt);
typedef MYSQLND_RES * (*func_mysqlnd_stmt__store_result)(MYSQLND_STMT * const stmt);
typedef MYSQLND_RES * (*func_mysqlnd_stmt__get_result)(MYSQLND_STMT * const stmt);
-typedef zend_bool (*func_mysqlnd_stmt__more_results)(const MYSQLND_STMT * const stmt);
+typedef bool (*func_mysqlnd_stmt__more_results)(const MYSQLND_STMT * const stmt);
typedef enum_func_status (*func_mysqlnd_stmt__next_result)(MYSQLND_STMT * const stmt);
typedef enum_func_status (*func_mysqlnd_stmt__free_result)(MYSQLND_STMT * const stmt);
typedef enum_func_status (*func_mysqlnd_stmt__seek_data)(const MYSQLND_STMT * const stmt, uint64_t row);
typedef enum_func_status (*func_mysqlnd_stmt__reset)(MYSQLND_STMT * const stmt);
-typedef enum_func_status (*func_mysqlnd_stmt__close_on_server)(MYSQLND_STMT * const stmt, zend_bool implicit); /* private */
-typedef enum_func_status (*func_mysqlnd_stmt__dtor)(MYSQLND_STMT * const stmt, zend_bool implicit); /* use this for mysqlnd_stmt_close */
-typedef enum_func_status (*func_mysqlnd_stmt__fetch)(MYSQLND_STMT * const stmt, zend_bool * const fetched_anything);
+typedef enum_func_status (*func_mysqlnd_stmt__close_on_server)(MYSQLND_STMT * const stmt, bool implicit); /* private */
+typedef enum_func_status (*func_mysqlnd_stmt__dtor)(MYSQLND_STMT * const stmt, bool implicit); /* use this for mysqlnd_stmt_close */
+typedef enum_func_status (*func_mysqlnd_stmt__fetch)(MYSQLND_STMT * const stmt, bool * const fetched_anything);
typedef enum_func_status (*func_mysqlnd_stmt__bind_parameters)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND * const param_bind);
typedef enum_func_status (*func_mysqlnd_stmt__bind_one_parameter)(MYSQLND_STMT * const stmt, unsigned int param_no, zval * const zv, zend_uchar type);
typedef enum_func_status (*func_mysqlnd_stmt__refresh_bind_param)(MYSQLND_STMT * const stmt);
@@ -802,7 +784,7 @@ typedef MYSQLND_RESULT_BIND*(*func_mysqlnd_stmt__alloc_result_bind)(MYSQLND_STMT
typedef void (*func_mysqlnd_stmt__free_parameter_bind)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND *);
typedef void (*func_mysqlnd_stmt__free_result_bind)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND *);
typedef unsigned int (*func_mysqlnd_stmt__server_status)(const MYSQLND_STMT * const stmt);
-typedef enum_func_status (*func_mysqlnd_stmt__generate_execute_request)(MYSQLND_STMT * const s, zend_uchar ** request, size_t *request_len, zend_bool * free_buffer);
+typedef enum_func_status (*func_mysqlnd_stmt__generate_execute_request)(MYSQLND_STMT * const s, zend_uchar ** request, size_t *request_len, bool * free_buffer);
typedef enum_func_status (*func_mysqlnd_stmt__parse_execute_response)(MYSQLND_STMT * const s, enum_mysqlnd_parse_exec_response_type type);
typedef void (*func_mysqlnd_stmt__free_stmt_content)(MYSQLND_STMT * const s);
typedef enum_func_status (*func_mysqlnd_stmt__flush)(MYSQLND_STMT * const stmt);
@@ -871,7 +853,7 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_stmt)
struct st_mysqlnd_vio_data
{
php_stream *stream;
- zend_bool ssl;
+ bool ssl;
MYSQLND_VIO_OPTIONS options;
#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND
zend_uchar last_command;
@@ -879,7 +861,7 @@ struct st_mysqlnd_vio_data
zend_uchar unused_pad1;
#endif
- zend_bool persistent;
+ bool persistent;
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio) m;
};
@@ -889,7 +871,7 @@ struct st_mysqlnd_vio
{
struct st_mysqlnd_vio_data * data;
- zend_bool persistent;
+ bool persistent;
};
@@ -974,22 +956,22 @@ struct st_mysqlnd_connection_data
zval async_read_cb;
zval async_err_cb;
- zend_bool in_async_read_cb;
- zend_bool in_async_err_cb;
+ bool in_async_read_cb;
+ bool in_async_err_cb;
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) object_factory;
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_command) * command;
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data) * m;
/* persistent connection */
- zend_bool persistent;
+ bool persistent;
};
struct st_mysqlnd_connection
{
MYSQLND_CONN_DATA * data;
- zend_bool persistent;
+ bool persistent;
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn) * m;
};
@@ -1034,7 +1016,7 @@ typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_c
MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory,
const enum php_mysqlnd_server_command command,
const zend_uchar * const arg, const size_t arg_len,
- const zend_bool silent,
+ const bool silent,
MYSQLND_CONNECTION_STATE * connection_state,
MYSQLND_ERROR_INFO * error_info,
@@ -1047,7 +1029,7 @@ typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_c
MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory,
MYSQLND_ERROR_INFO * const error_info,
MYSQLND_UPSERT_STATUS * const upsert_status,
- const zend_bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
+ const bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
MYSQLND_STRING * const last_message);
typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_EOF)(
@@ -1058,9 +1040,9 @@ typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_c
typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response)(
MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory,
const enum mysqlnd_packet_type ok_packet,
- const zend_bool silent,
+ const bool silent,
const enum php_mysqlnd_server_command command,
- const zend_bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
+ const bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
MYSQLND_ERROR_INFO * error_info,
MYSQLND_UPSERT_STATUS * upsert_status,
@@ -1095,7 +1077,7 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_payload_decoder_factory)
struct st_mysqlnd_protocol_payload_decoder_factory
{
MYSQLND_CONN_DATA * conn;
- zend_bool persistent;
+ bool persistent;
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_payload_decoder_factory) m;
};
@@ -1105,7 +1087,7 @@ typedef struct st_mysqlnd_read_buffer {
size_t offset;
size_t size;
size_t len;
- zend_bool (*is_empty)(const struct st_mysqlnd_read_buffer *);
+ bool (*is_empty)(const struct st_mysqlnd_read_buffer *);
void (*read)(struct st_mysqlnd_read_buffer *, size_t count, zend_uchar * dest);
size_t (*bytes_left)(const struct st_mysqlnd_read_buffer *);
void (*free_buffer)(struct st_mysqlnd_read_buffer **);
@@ -1146,8 +1128,8 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_packet_frame_codec)
struct st_mysqlnd_protocol_frame_codec_data
{
php_stream *stream;
- zend_bool compressed;
- zend_bool ssl;
+ bool compressed;
+ bool ssl;
uint64_t flags;
char * sha256_server_public_key;
@@ -1161,7 +1143,7 @@ struct st_mysqlnd_protocol_frame_codec_data
zend_uchar packet_no;
zend_uchar compressed_envelope_packet_no;
- zend_bool persistent;
+ bool persistent;
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_packet_frame_codec) m;
};
@@ -1173,7 +1155,7 @@ struct st_mysqlnd_protocol_frame_codec
struct st_mysqlnd_protocol_frame_codec_data * data;
- zend_bool persistent;
+ bool persistent;
};
@@ -1188,50 +1170,30 @@ struct st_mysqlnd_result_metadata
};
-#define def_mysqlnd_buffered_result_parent \
- MYSQLND_ROW_BUFFER *row_buffers; \
- uint64_t row_count; \
- uint64_t initialized_rows; \
- \
- /* Column lengths of current row - both buffered and unbuffered. For buffered results it duplicates the data found in **data */ \
- size_t *lengths; \
- \
- MYSQLND_MEMORY_POOL *result_set_memory_pool; \
- \
- unsigned int references; \
- \
- MYSQLND_ERROR_INFO error_info; \
- \
- unsigned int field_count; \
- zend_bool ps; \
- MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered) m; \
- enum mysqlnd_buffered_type type; \
- void * unused1; \
- void * unused2; \
- void * unused3
-
-
-struct st_mysqlnd_buffered_result_parent
+struct st_mysqlnd_buffered_result
{
- def_mysqlnd_buffered_result_parent;
-};
+ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered) m;
+ MYSQLND_ROW_BUFFER *row_buffers;
+ uint64_t row_count;
-struct st_mysqlnd_buffered_result_zval
-{
- def_mysqlnd_buffered_result_parent;
+ /* Column lengths of current row - both buffered and unbuffered. For buffered results it duplicates the data found in **data */
+ size_t *lengths;
- zval *data;
- zval *data_cursor;
-};
+ MYSQLND_MEMORY_POOL *result_set_memory_pool;
+ unsigned int references;
-struct st_mysqlnd_buffered_result_c
-{
- def_mysqlnd_buffered_result_parent;
+ MYSQLND_ERROR_INFO error_info;
+
+ unsigned int field_count;
+ MYSQLND_STMT_DATA *stmt;
- zend_uchar *initialized; /* every row is a single bit */
uint64_t current_row;
+
+ void * unused1;
+ void * unused2;
+ void * unused3;
};
@@ -1241,7 +1203,6 @@ struct st_mysqlnd_unbuffered_result
uint64_t row_count;
/* For unbuffered (both normal and PS) */
- zval *last_row_data;
MYSQLND_ROW_BUFFER last_row_buffer;
/*
@@ -1256,9 +1217,9 @@ struct st_mysqlnd_unbuffered_result
unsigned int field_count;
- zend_bool eof_reached;
+ bool eof_reached;
- zend_bool ps;
+ MYSQLND_STMT_DATA *stmt;
};
@@ -1268,6 +1229,9 @@ struct st_mysqlnd_res
enum_mysqlnd_res_type type;
unsigned int field_count;
+ zval *row_data;
+ bool free_row_data;
+
/* For metadata functions */
MYSQLND_RES_METADATA *meta;
@@ -1291,7 +1255,7 @@ struct st_mysqlnd_param_bind
struct st_mysqlnd_result_bind
{
zval zv;
- zend_bool bound;
+ bool bound;
};
@@ -1314,16 +1278,16 @@ struct st_mysqlnd_stmt_data
MYSQLND_ERROR_INFO * error_info;
MYSQLND_ERROR_INFO error_info_impl;
- zend_bool update_max_length;
+ bool update_max_length;
zend_ulong prefetch_rows;
- zend_bool cursor_exists;
+ bool cursor_exists;
mysqlnd_stmt_use_or_store_func default_rset_handler;
zval execute_read_cb;
zval execute_err_cb;
- zend_bool in_execute_read_cb;
- zend_bool in_execute_err_cb;
+ bool in_execute_read_cb;
+ bool in_execute_err_cb;
MYSQLND_CMD_BUFFER execute_cmd_buffer;
unsigned int execute_count;/* count how many times the stmt was executed */
diff --git a/ext/mysqlnd/mysqlnd_vio.c b/ext/mysqlnd/mysqlnd_vio.c
index e33761f278..82a45ed7f0 100644
--- a/ext/mysqlnd/mysqlnd_vio.c
+++ b/ext/mysqlnd/mysqlnd_vio.c
@@ -115,7 +115,7 @@ MYSQLND_METHOD(mysqlnd_vio, network_write)(MYSQLND_VIO * const vio, const zend_u
/* {{{ mysqlnd_vio::open_pipe */
static php_stream *
-MYSQLND_METHOD(mysqlnd_vio, open_pipe)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const zend_bool persistent,
+MYSQLND_METHOD(mysqlnd_vio, open_pipe)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const bool persistent,
MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info)
{
unsigned int streams_options = 0;
@@ -150,7 +150,7 @@ MYSQLND_METHOD(mysqlnd_vio, open_pipe)(MYSQLND_VIO * const vio, const MYSQLND_CS
/* {{{ mysqlnd_vio::open_tcp_or_unix */
static php_stream *
-MYSQLND_METHOD(mysqlnd_vio, open_tcp_or_unix)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const zend_bool persistent,
+MYSQLND_METHOD(mysqlnd_vio, open_tcp_or_unix)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const bool persistent,
MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info)
{
unsigned int streams_options = 0;
@@ -298,7 +298,7 @@ MYSQLND_METHOD(mysqlnd_vio, get_open_stream)(MYSQLND_VIO * const vio, const MYSQ
/* {{{ mysqlnd_vio::connect */
static enum_func_status
-MYSQLND_METHOD(mysqlnd_vio, connect)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const zend_bool persistent,
+MYSQLND_METHOD(mysqlnd_vio, connect)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const bool persistent,
MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info)
{
enum_func_status ret = FAIL;
@@ -339,7 +339,7 @@ MYSQLND_METHOD(mysqlnd_vio, set_client_option)(MYSQLND_VIO * const net, enum_mys
break;
case MYSQLND_OPT_SSL_KEY:
{
- zend_bool pers = net->persistent;
+ bool pers = net->persistent;
if (net->data->options.ssl_key) {
mnd_pefree(net->data->options.ssl_key, pers);
}
@@ -348,7 +348,7 @@ MYSQLND_METHOD(mysqlnd_vio, set_client_option)(MYSQLND_VIO * const net, enum_mys
}
case MYSQLND_OPT_SSL_CERT:
{
- zend_bool pers = net->persistent;
+ bool pers = net->persistent;
if (net->data->options.ssl_cert) {
mnd_pefree(net->data->options.ssl_cert, pers);
}
@@ -357,7 +357,7 @@ MYSQLND_METHOD(mysqlnd_vio, set_client_option)(MYSQLND_VIO * const net, enum_mys
}
case MYSQLND_OPT_SSL_CA:
{
- zend_bool pers = net->persistent;
+ bool pers = net->persistent;
if (net->data->options.ssl_ca) {
mnd_pefree(net->data->options.ssl_ca, pers);
}
@@ -366,7 +366,7 @@ MYSQLND_METHOD(mysqlnd_vio, set_client_option)(MYSQLND_VIO * const net, enum_mys
}
case MYSQLND_OPT_SSL_CAPATH:
{
- zend_bool pers = net->persistent;
+ bool pers = net->persistent;
if (net->data->options.ssl_capath) {
mnd_pefree(net->data->options.ssl_capath, pers);
}
@@ -375,7 +375,7 @@ MYSQLND_METHOD(mysqlnd_vio, set_client_option)(MYSQLND_VIO * const net, enum_mys
}
case MYSQLND_OPT_SSL_CIPHER:
{
- zend_bool pers = net->persistent;
+ bool pers = net->persistent;
if (net->data->options.ssl_cipher) {
mnd_pefree(net->data->options.ssl_cipher, pers);
}
@@ -384,7 +384,7 @@ MYSQLND_METHOD(mysqlnd_vio, set_client_option)(MYSQLND_VIO * const net, enum_mys
}
case MYSQLND_OPT_SSL_PASSPHRASE:
{
- zend_bool pers = net->persistent;
+ bool pers = net->persistent;
if (net->data->options.ssl_passphrase) {
mnd_pefree(net->data->options.ssl_passphrase, pers);
}
@@ -492,7 +492,7 @@ MYSQLND_METHOD(mysqlnd_vio, enable_ssl)(MYSQLND_VIO * const net)
#ifdef MYSQLND_SSL_SUPPORTED
php_stream_context * context = php_stream_context_alloc();
php_stream * net_stream = net->data->m.get_stream(net);
- zend_bool any_flag = FALSE;
+ bool any_flag = FALSE;
DBG_ENTER("mysqlnd_vio::enable_ssl");
@@ -543,7 +543,7 @@ MYSQLND_METHOD(mysqlnd_vio, enable_ssl)(MYSQLND_VIO * const net)
}
{
zval verify_peer_zval;
- zend_bool verify;
+ bool verify;
if (net->data->options.ssl_verify_peer == MYSQLND_SSL_PEER_DEFAULT) {
net->data->options.ssl_verify_peer = any_flag? MYSQLND_SSL_PEER_DEFAULT_ACTION:MYSQLND_SSL_PEER_DONT_VERIFY;
@@ -610,7 +610,7 @@ MYSQLND_METHOD(mysqlnd_vio, disable_ssl)(MYSQLND_VIO * const vio)
static void
MYSQLND_METHOD(mysqlnd_vio, free_contents)(MYSQLND_VIO * net)
{
- zend_bool pers = net->persistent;
+ bool pers = net->persistent;
DBG_ENTER("mysqlnd_vio::free_contents");
if (net->data->options.ssl_key) {
@@ -646,7 +646,7 @@ MYSQLND_METHOD(mysqlnd_vio, close_stream)(MYSQLND_VIO * const net, MYSQLND_STATS
php_stream * net_stream;
DBG_ENTER("mysqlnd_vio::close_stream");
if (net && (net_stream = net->data->m.get_stream(net))) {
- zend_bool pers = net->persistent;
+ bool pers = net->persistent;
DBG_INF_FMT("Freeing stream. abstract=%p", net_stream->abstract);
/* We removed the resource from the stream, so pass FREE_RSRC_DTOR now to force
* destruction to occur during shutdown, because it won't happen through the resource. */
@@ -728,7 +728,7 @@ MYSQLND_METHOD(mysqlnd_vio, set_stream)(MYSQLND_VIO * const vio, php_stream * ne
/* {{{ mysqlnd_vio::has_valid_stream */
-static zend_bool
+static bool
MYSQLND_METHOD(mysqlnd_vio, has_valid_stream)(const MYSQLND_VIO * const vio)
{
DBG_ENTER("mysqlnd_vio::has_valid_stream");
@@ -770,7 +770,7 @@ MYSQLND_CLASS_METHODS_END;
/* {{{ mysqlnd_vio_init */
PHPAPI MYSQLND_VIO *
-mysqlnd_vio_init(zend_bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
+mysqlnd_vio_init(bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
{
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *factory = object_factory? object_factory : &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory);
MYSQLND_VIO * vio;
diff --git a/ext/mysqlnd/mysqlnd_vio.h b/ext/mysqlnd/mysqlnd_vio.h
index 7c71aaa01e..c4982e0312 100644
--- a/ext/mysqlnd/mysqlnd_vio.h
+++ b/ext/mysqlnd/mysqlnd_vio.h
@@ -18,7 +18,7 @@
#ifndef MYSQLND_VIO_H
#define MYSQLND_VIO_H
-PHPAPI MYSQLND_VIO * mysqlnd_vio_init(zend_bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
+PHPAPI MYSQLND_VIO * mysqlnd_vio_init(bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
PHPAPI void mysqlnd_vio_free(MYSQLND_VIO * const vio, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
#endif /* MYSQLND_VIO_H */
diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c
index ba579ba403..ed36c8404b 100644
--- a/ext/mysqlnd/mysqlnd_wireprotocol.c
+++ b/ext/mysqlnd/mysqlnd_wireprotocol.c
@@ -1074,14 +1074,9 @@ php_mysqlnd_rset_header_read(MYSQLND_CONN_DATA * conn, void * _packet)
*/
len = packet->header.size - 1;
packet->info_or_local_file.s = mnd_emalloc(len + 1);
- if (packet->info_or_local_file.s) {
- memcpy(packet->info_or_local_file.s, p, len);
- packet->info_or_local_file.s[len] = '\0';
- packet->info_or_local_file.l = len;
- } else {
- SET_OOM_ERROR(error_info);
- ret = FAIL;
- }
+ memcpy(packet->info_or_local_file.s, p, len);
+ packet->info_or_local_file.s[len] = '\0';
+ packet->info_or_local_file.l = len;
break;
case 0x00:
DBG_INF("UPSERT");
@@ -1101,14 +1096,9 @@ php_mysqlnd_rset_header_read(MYSQLND_CONN_DATA * conn, void * _packet)
/* Check for additional textual data */
if (packet->header.size > (size_t) (p - buf) && (len = php_mysqlnd_net_field_length(&p))) {
packet->info_or_local_file.s = mnd_emalloc(len + 1);
- if (packet->info_or_local_file.s) {
- memcpy(packet->info_or_local_file.s, p, len);
- packet->info_or_local_file.s[len] = '\0';
- packet->info_or_local_file.l = len;
- } else {
- SET_OOM_ERROR(error_info);
- ret = FAIL;
- }
+ memcpy(packet->info_or_local_file.s, p, len);
+ packet->info_or_local_file.s[len] = '\0';
+ packet->info_or_local_file.l = len;
}
DBG_INF_FMT("affected_rows=%llu last_insert_id=%llu server_status=%u warning_count=%u",
packet->affected_rows, packet->last_insert_id,
@@ -1380,7 +1370,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
*/
/*
- We're allocating an extra byte, as php_mysqlnd_rowp_read_text_protocol_aux
+ We're allocating an extra byte, as php_mysqlnd_rowp_read_text_protocol
needs to be able to append a terminating \0 for atoi/atof.
*/
prealloc_more_bytes = 1;
@@ -1391,53 +1381,41 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT);
set_packet_error(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
} else {
+ /* If the packet is split in multiple chunks, allocate a temporary buffer that we can
+ * reallocate, and only afterwards copy it to the pool when we know the final size. */
+ zend_uchar *buf = NULL;
+ while (header.size >= MYSQLND_MAX_PACKET_SIZE) {
+ buf = erealloc(buf, *data_size + header.size);
+ p = buf + *data_size;
+ *data_size += header.size;
+
+ if (UNEXPECTED(PASS != (ret = pfc->data->m.receive(pfc, vio, p, header.size, stats, error_info)))) {
+ DBG_ERR("Empty row packet body");
+ SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT);
+ set_packet_error(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
+ efree(buf);
+ DBG_RETURN(FAIL);
+ }
+ if (FAIL == mysqlnd_read_header(pfc, vio, &header, stats, error_info)) {
+ efree(buf);
+ DBG_RETURN(FAIL);
+ }
+ }
+
+ buffer->ptr = pool->get_chunk(pool, *data_size + header.size + prealloc_more_bytes);
+ if (buf) {
+ memcpy(buffer->ptr, buf, *data_size);
+ efree(buf);
+ }
+ p = (zend_uchar *) buffer->ptr + *data_size;
*data_size += header.size;
- buffer->ptr = pool->get_chunk(pool, *data_size + prealloc_more_bytes);
- p = buffer->ptr;
if (UNEXPECTED(PASS != (ret = pfc->data->m.receive(pfc, vio, p, header.size, stats, error_info)))) {
DBG_ERR("Empty row packet body");
SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT);
set_packet_error(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
- } else {
- while (header.size >= MYSQLND_MAX_PACKET_SIZE) {
- if (FAIL == mysqlnd_read_header(pfc, vio, &header, stats, error_info)) {
- ret = FAIL;
- break;
- }
-
- *data_size += header.size;
-
- /* Empty packet after MYSQLND_MAX_PACKET_SIZE packet. That's ok, break */
- if (!header.size) {
- break;
- }
-
- /*
- We have to realloc the buffer.
- */
- buffer->ptr = pool->resize_chunk(pool, buffer->ptr, *data_size - header.size, *data_size + prealloc_more_bytes);
- if (!buffer->ptr) {
- SET_OOM_ERROR(error_info);
- ret = FAIL;
- break;
- }
- /* The position could have changed, recalculate */
- p = (zend_uchar *) buffer->ptr + (*data_size - header.size);
-
- if (PASS != (ret = pfc->data->m.receive(pfc, vio, p, header.size, stats, error_info))) {
- DBG_ERR("Empty row packet body");
- SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT);
- set_packet_error(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
- break;
- }
- }
}
}
- if (ret == FAIL && buffer->ptr) {
- pool->free_chunk(pool, buffer->ptr);
- buffer->ptr = NULL;
- }
DBG_RETURN(ret);
}
/* }}} */
@@ -1447,7 +1425,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
enum_func_status
php_mysqlnd_rowp_read_binary_protocol(MYSQLND_ROW_BUFFER * row_buffer, zval * fields,
const unsigned int field_count, const MYSQLND_FIELD * const fields_metadata,
- const zend_bool as_int_or_float, MYSQLND_STATS * const stats)
+ const bool as_int_or_float, MYSQLND_STATS * const stats)
{
unsigned int i;
const zend_uchar * p = row_buffer->ptr;
@@ -1536,9 +1514,9 @@ php_mysqlnd_rowp_read_binary_protocol(MYSQLND_ROW_BUFFER * row_buffer, zval * fi
/* {{{ php_mysqlnd_rowp_read_text_protocol */
enum_func_status
-php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval * fields,
+php_mysqlnd_rowp_read_text_protocol(MYSQLND_ROW_BUFFER * row_buffer, zval * fields,
unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
- zend_bool as_int_or_float, MYSQLND_STATS * stats)
+ bool as_int_or_float, MYSQLND_STATS * stats)
{
unsigned int i;
zval *current_field, *end_field, *start_field;
@@ -1546,7 +1524,7 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval *
const size_t data_size = row_buffer->size;
const zend_uchar * const packet_end = (zend_uchar*) p + data_size;
- DBG_ENTER("php_mysqlnd_rowp_read_text_protocol_aux");
+ DBG_ENTER("php_mysqlnd_rowp_read_text_protocol");
if (!fields) {
DBG_RETURN(FAIL);
@@ -1566,10 +1544,8 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval *
" bytes after end of packet", (p + len) - packet_end - 1);
DBG_RETURN(FAIL);
} else {
-#ifdef MYSQLND_STRING_TO_INT_CONVERSION
struct st_mysqlnd_perm_bind perm_bind =
mysqlnd_ps_fetch_functions[fields_metadata[i].type];
-#endif
if (MYSQLND_G(collect_statistics)) {
enum_mysqlnd_collected_stats statistic;
switch (fields_metadata[i].type) {
@@ -1624,9 +1600,8 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval *
} else if (Z_TYPE_P(current_field) == IS_STRING) {
/* nothing to do here, as we want a string and ps_fetch_from_1_to_8_bytes() has given us one */
}
- }
-#ifdef MYSQLND_STRING_TO_INT_CONVERSION
- else if (as_int_or_float && perm_bind.php_type == IS_LONG) {
+ } else if (as_int_or_float && perm_bind.php_type == IS_LONG
+ && !(fields_metadata[i].flags & ZEROFILL_FLAG)) {
zend_uchar save = *(p + len);
/* We have to make it ASCIIZ temporarily */
*(p + len) = '\0';
@@ -1646,7 +1621,7 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval *
#else
(uint64_t) _atoi64((char *) p);
#endif
- zend_bool uns = fields_metadata[i].flags & UNSIGNED_FLAG? TRUE:FALSE;
+ bool uns = fields_metadata[i].flags & UNSIGNED_FLAG? TRUE:FALSE;
/* We have to make it ASCIIZ temporarily */
#if SIZEOF_ZEND_LONG==8
if (uns == TRUE && v > 9223372036854775807L)
@@ -1670,9 +1645,7 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval *
*(p + len) = '\0';
ZVAL_DOUBLE(current_field, zend_strtod((char *) p, NULL));
*(p + len) = save;
- }
-#endif /* MYSQLND_STRING_TO_INT_CONVERSION */
- else {
+ } else {
ZVAL_STRINGL_FAST(current_field, (char *)p, len);
}
p += len;
@@ -1684,39 +1657,7 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval *
/* }}} */
-/* {{{ php_mysqlnd_rowp_read_text_protocol_zval */
-enum_func_status
-php_mysqlnd_rowp_read_text_protocol_zval(MYSQLND_ROW_BUFFER * row_buffer, zval * fields,
- const unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
- const zend_bool as_int_or_float, MYSQLND_STATS * stats)
-{
- enum_func_status ret;
- DBG_ENTER("php_mysqlnd_rowp_read_text_protocol_zval");
- ret = php_mysqlnd_rowp_read_text_protocol_aux(row_buffer, fields, field_count, fields_metadata, as_int_or_float, stats);
- DBG_RETURN(ret);
-}
-/* }}} */
-
-
-/* {{{ php_mysqlnd_rowp_read_text_protocol_c */
-enum_func_status
-php_mysqlnd_rowp_read_text_protocol_c(MYSQLND_ROW_BUFFER * row_buffer, zval * fields,
- const unsigned int field_count, const MYSQLND_FIELD * const fields_metadata,
- const zend_bool as_int_or_float, MYSQLND_STATS * const stats)
-{
- enum_func_status ret;
- DBG_ENTER("php_mysqlnd_rowp_read_text_protocol_c");
- ret = php_mysqlnd_rowp_read_text_protocol_aux(row_buffer, fields, field_count, fields_metadata, as_int_or_float, stats);
- DBG_RETURN(ret);
-}
-/* }}} */
-
-
/* {{{ php_mysqlnd_rowp_read */
-/*
- if normal statements => packet->fields is created by this function,
- if PS => packet->fields is passed from outside
-*/
static enum_func_status
php_mysqlnd_rowp_read(MYSQLND_CONN_DATA * conn, void * _packet)
{
@@ -1777,33 +1718,10 @@ php_mysqlnd_rowp_read(MYSQLND_CONN_DATA * conn, void * _packet)
DBG_INF_FMT("server_status=%u warning_count=%u", packet->server_status, packet->warning_count);
}
} else {
+ packet->eof = FALSE;
MYSQLND_INC_CONN_STATISTIC(stats,
packet->binary_protocol? STAT_ROWS_FETCHED_FROM_SERVER_PS:
STAT_ROWS_FETCHED_FROM_SERVER_NORMAL);
-
- packet->eof = FALSE;
- /* packet->field_count is set by the user of the packet */
-
- if (!packet->skip_extraction) {
- if (!packet->fields) {
- DBG_INF("Allocating packet->fields");
- /*
- old-API will probably set packet->fields to NULL every time, though for
- unbuffered sets it makes not much sense as the zvals in this buffer matter,
- not the buffer. Constantly allocating and deallocating brings nothing.
-
- For PS - if stmt_store() is performed, thus we don't have a cursor, it will
- behave just like old-API buffered. Cursors will behave like a bit different,
- but mostly like old-API unbuffered and thus will populate this array with
- value.
- */
- packet->fields = mnd_ecalloc(packet->field_count, sizeof(zval));
- }
- } else {
- MYSQLND_INC_CONN_STATISTIC(stats,
- packet->binary_protocol? STAT_ROWS_SKIPPED_PS:
- STAT_ROWS_SKIPPED_NORMAL);
- }
}
end:
@@ -1812,30 +1730,6 @@ end:
/* }}} */
-/* {{{ php_mysqlnd_rowp_free_mem */
-static void
-php_mysqlnd_rowp_free_mem(void * _packet)
-{
- MYSQLND_PACKET_ROW *p;
-
- DBG_ENTER("php_mysqlnd_rowp_free_mem");
- p = (MYSQLND_PACKET_ROW *) _packet;
- if (p->row_buffer.ptr) {
- p->result_set_memory_pool->free_chunk(p->result_set_memory_pool, p->row_buffer.ptr);
- p->row_buffer.ptr = NULL;
- }
- /*
- Don't free packet->fields :
- - normal queries -> store_result() | fetch_row_unbuffered() will transfer
- the ownership and NULL it.
- - PS will pass in it the bound variables, we have to use them! and of course
- not free the array. As it is passed to us, we should not clean it ourselves.
- */
- DBG_VOID_RETURN;
-}
-/* }}} */
-
-
/* {{{ php_mysqlnd_stats_read */
static enum_func_status
php_mysqlnd_stats_read(MYSQLND_CONN_DATA * conn, void * _packet)
@@ -2282,7 +2176,7 @@ mysqlnd_packet_methods packet_methods[PROT_LAST] =
{
php_mysqlnd_rowp_read, /* read */
NULL, /* write */
- php_mysqlnd_rowp_free_mem,
+ NULL,
}, /* PROT_ROW_PACKET */
{
php_mysqlnd_stats_read, /* read */
@@ -2515,7 +2409,7 @@ MYSQLND_METHOD(mysqlnd_protocol, send_command)(
MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory,
const enum php_mysqlnd_server_command command,
const zend_uchar * const arg, const size_t arg_len,
- const zend_bool silent,
+ const bool silent,
struct st_mysqlnd_connection_state * connection_state,
MYSQLND_ERROR_INFO * error_info,
@@ -2581,7 +2475,7 @@ MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_OK)(
MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory,
MYSQLND_ERROR_INFO * const error_info,
MYSQLND_UPSERT_STATUS * const upsert_status,
- const zend_bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
+ const bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
MYSQLND_STRING * const last_message)
{
enum_func_status ret = FAIL;
@@ -2675,9 +2569,9 @@ static enum_func_status
MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_response)(
MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory,
const enum mysqlnd_packet_type ok_packet,
- const zend_bool silent,
+ const bool silent,
const enum php_mysqlnd_server_command command,
- const zend_bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
+ const bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
MYSQLND_ERROR_INFO * error_info,
MYSQLND_UPSERT_STATUS * upsert_status,
@@ -2737,7 +2631,7 @@ MYSQLND_CLASS_METHODS_END;
/* {{{ mysqlnd_protocol_payload_decoder_factory_init */
PHPAPI MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY *
-mysqlnd_protocol_payload_decoder_factory_init(MYSQLND_CONN_DATA * conn, const zend_bool persistent)
+mysqlnd_protocol_payload_decoder_factory_init(MYSQLND_CONN_DATA * conn, const bool persistent)
{
MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * ret;
DBG_ENTER("mysqlnd_protocol_payload_decoder_factory_init");
@@ -2754,7 +2648,7 @@ mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_F
DBG_ENTER("mysqlnd_protocol_payload_decoder_factory_free");
if (factory) {
- zend_bool pers = factory->persistent;
+ bool pers = factory->persistent;
mnd_pefree(factory, pers);
}
DBG_VOID_RETURN;
diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.h b/ext/mysqlnd/mysqlnd_wireprotocol.h
index e917736bb5..7b5b6194ae 100644
--- a/ext/mysqlnd/mysqlnd_wireprotocol.h
+++ b/ext/mysqlnd/mysqlnd_wireprotocol.h
@@ -69,7 +69,7 @@ typedef struct st_mysqlnd_packet_greet {
uint8_t charset_no;
uint16_t server_status;
/* 13 byte pad, in 5.5 first 2 bytes are more capabilities followed by 1 byte scramble_length */
- zend_bool pre41;
+ bool pre41;
/* If error packet, we use these */
char error[MYSQLND_ERRMSG_SIZE+1];
char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
@@ -90,9 +90,9 @@ typedef struct st_mysqlnd_packet_auth {
uint32_t max_packet_size;
uint8_t charset_no;
/* Here the packet ends. This is user supplied data */
- zend_bool send_auth_data;
- zend_bool is_change_user_packet;
- zend_bool silent;
+ bool send_auth_data;
+ bool is_change_user_packet;
+ bool silent;
HashTable *connect_attr;
size_t db_len;
} MYSQLND_PACKET_AUTH;
@@ -197,7 +197,7 @@ typedef struct st_mysqlnd_packet_res_field {
MYSQLND_MEMORY_POOL *memory_pool;
MYSQLND_FIELD *metadata;
/* For table definitions, empty for result sets */
- zend_bool skip_parsing;
+ bool skip_parsing;
MYSQLND_ERROR_INFO error_info;
} MYSQLND_PACKET_RES_FIELD;
@@ -206,9 +206,8 @@ typedef struct st_mysqlnd_packet_res_field {
/* Row packet */
typedef struct st_mysqlnd_packet_row {
MYSQLND_PACKET_HEADER header;
- zval *fields;
uint32_t field_count;
- zend_bool eof;
+ bool eof;
/*
These are, of course, only for SELECT in the EOF packet,
which is detected by this packet
@@ -219,8 +218,7 @@ typedef struct st_mysqlnd_packet_row {
MYSQLND_ROW_BUFFER row_buffer;
MYSQLND_MEMORY_POOL * result_set_memory_pool;
- zend_bool skip_extraction;
- zend_bool binary_protocol;
+ bool binary_protocol;
MYSQLND_FIELD *fields_metadata;
/* If error packet, we use these */
@@ -259,7 +257,7 @@ typedef struct st_mysqlnd_packet_chg_user_resp {
uint16_t server_capabilities;
/* If error packet, we use these */
MYSQLND_ERROR_INFO error_info;
- zend_bool server_asked_323_auth;
+ bool server_asked_323_auth;
char *new_auth_protocol;
size_t new_auth_protocol_len;
@@ -307,19 +305,15 @@ PHPAPI extern const char * const mysqlnd_empty_string;
enum_func_status php_mysqlnd_rowp_read_binary_protocol(MYSQLND_ROW_BUFFER * row_buffer, zval * fields,
unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
- zend_bool as_int_or_float, MYSQLND_STATS * stats);
+ bool as_int_or_float, MYSQLND_STATS * stats);
-enum_func_status php_mysqlnd_rowp_read_text_protocol_zval(MYSQLND_ROW_BUFFER * row_buffer, zval * fields,
+enum_func_status php_mysqlnd_rowp_read_text_protocol(MYSQLND_ROW_BUFFER * row_buffer, zval * fields,
unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
- zend_bool as_int_or_float, MYSQLND_STATS * stats);
-
-enum_func_status php_mysqlnd_rowp_read_text_protocol_c(MYSQLND_ROW_BUFFER * row_buffer, zval * fields,
- unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
- zend_bool as_int_or_float, MYSQLND_STATS * stats);
+ bool as_int_or_float, MYSQLND_STATS * stats);
-PHPAPI MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * mysqlnd_protocol_payload_decoder_factory_init(MYSQLND_CONN_DATA * conn, const zend_bool persistent);
+PHPAPI MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * mysqlnd_protocol_payload_decoder_factory_init(MYSQLND_CONN_DATA * conn, const bool persistent);
PHPAPI void mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory);
#endif /* MYSQLND_WIREPROTOCOL_H */
diff --git a/ext/mysqlnd/php_mysqlnd.c b/ext/mysqlnd/php_mysqlnd.c
index 337b9fef7a..bac28a1a7a 100644
--- a/ext/mysqlnd/php_mysqlnd.c
+++ b/ext/mysqlnd/php_mysqlnd.c
@@ -149,14 +149,7 @@ static PHP_GINIT_FUNCTION(mysqlnd)
mysqlnd_globals->net_read_timeout = 31536000;
mysqlnd_globals->log_mask = 0;
mysqlnd_globals->mempool_default_size = 16000;
- mysqlnd_globals->debug_emalloc_fail_threshold = -1;
- mysqlnd_globals->debug_ecalloc_fail_threshold = -1;
- mysqlnd_globals->debug_erealloc_fail_threshold = -1;
- mysqlnd_globals->debug_malloc_fail_threshold = -1;
- mysqlnd_globals->debug_calloc_fail_threshold = -1;
- mysqlnd_globals->debug_realloc_fail_threshold = -1;
mysqlnd_globals->sha256_server_public_key = NULL;
- mysqlnd_globals->fetch_data_copy = FALSE;
}
/* }}} */
@@ -189,16 +182,6 @@ PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("mysqlnd.log_mask", "0", PHP_INI_ALL, OnUpdateLong, log_mask, zend_mysqlnd_globals, mysqlnd_globals)
STD_PHP_INI_ENTRY("mysqlnd.mempool_default_size","16000", PHP_INI_ALL, OnUpdateLong, mempool_default_size, zend_mysqlnd_globals, mysqlnd_globals)
STD_PHP_INI_ENTRY("mysqlnd.sha256_server_public_key",NULL, PHP_INI_PERDIR, OnUpdateString, sha256_server_public_key, zend_mysqlnd_globals, mysqlnd_globals)
- STD_PHP_INI_BOOLEAN("mysqlnd.fetch_data_copy", "0", PHP_INI_ALL, OnUpdateBool, fetch_data_copy, zend_mysqlnd_globals, mysqlnd_globals)
-#if PHP_DEBUG
- STD_PHP_INI_ENTRY("mysqlnd.debug_emalloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_emalloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
- STD_PHP_INI_ENTRY("mysqlnd.debug_ecalloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_ecalloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
- STD_PHP_INI_ENTRY("mysqlnd.debug_erealloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_erealloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
-
- STD_PHP_INI_ENTRY("mysqlnd.debug_malloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_malloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
- STD_PHP_INI_ENTRY("mysqlnd.debug_calloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_calloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
- STD_PHP_INI_ENTRY("mysqlnd.debug_realloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_realloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
-#endif
PHP_INI_END()
/* }}} */
diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c
index ad9b23a9c4..93fba39c17 100644
--- a/ext/oci8/oci8.c
+++ b/ext/oci8/oci8.c
@@ -279,9 +279,6 @@ static PHP_GSHUTDOWN_FUNCTION(oci)
PHP_MINIT_FUNCTION(oci)
{
- zend_class_entry oci_lob_class_entry;
- zend_class_entry oci_coll_class_entry;
-
REGISTER_INI_ENTRIES();
le_statement = zend_register_list_destructors_ex(php_oci_statement_list_dtor, NULL, "oci8 statement", module_number);
@@ -291,11 +288,8 @@ PHP_MINIT_FUNCTION(oci)
le_descriptor = zend_register_list_destructors_ex(php_oci_descriptor_list_dtor, NULL, "oci8 descriptor", module_number);
le_collection = zend_register_list_destructors_ex(php_oci_collection_list_dtor, NULL, "oci8 collection", module_number);
- INIT_CLASS_ENTRY(oci_lob_class_entry, "OCILob", class_OCILob_methods);
- INIT_CLASS_ENTRY(oci_coll_class_entry, "OCICollection", class_OCICollection_methods);
-
- oci_lob_class_entry_ptr = zend_register_internal_class(&oci_lob_class_entry);
- oci_coll_class_entry_ptr = zend_register_internal_class(&oci_coll_class_entry);
+ oci_lob_class_entry_ptr = register_class_OCILob();
+ oci_coll_class_entry_ptr = register_class_OCICollection();
/* thies@thieso.net 990203 i do not think that we will need all of them - just in here for completeness for now! */
REGISTER_LONG_CONSTANT("OCI_DEFAULT",OCI_DEFAULT, CONST_CS | CONST_PERSISTENT);
@@ -923,8 +917,8 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
smart_str hashed_details = {0};
time_t timestamp;
php_oci_spool *session_pool = NULL;
- zend_bool use_spool = 1; /* Default is to use client-side session pool */
- zend_bool ping_done = 0;
+ bool use_spool = 1; /* Default is to use client-side session pool */
+ bool ping_done = 0;
ub2 charsetid = 0;
ub2 charsetid_nls_lang = 0;
@@ -1042,7 +1036,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
php_strtolower(ZSTR_VAL(hashed_details.s), ZSTR_LEN(hashed_details.s));
if (!exclusive && !new_password) {
- zend_bool found = 0;
+ bool found = 0;
if (persistent && ((zvp = zend_hash_find(&EG(persistent_list), hashed_details.s))) != NULL) {
zend_resource *le = Z_RES_P(zvp);
@@ -1190,7 +1184,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
* a last resort, return a non-persistent connection.
*/
if (persistent) {
- zend_bool alloc_non_persistent = 0;
+ bool alloc_non_persistent = 0;
if (OCI_G(max_persistent) != -1 && OCI_G(num_persistent) >= OCI_G(max_persistent)) {
/* try to find an idle connection and kill it */
@@ -1436,7 +1430,7 @@ int php_oci_connection_commit(php_oci_connection *connection)
static int php_oci_connection_close(php_oci_connection *connection)
{
int result = 0;
- zend_bool in_call_save = OCI_G(in_call);
+ bool in_call_save = OCI_G(in_call);
#ifdef HAVE_OCI8_DTRACE
if (DTRACE_OCI8_CONNECTION_CLOSE_ENABLED()) {
@@ -1528,7 +1522,7 @@ static int php_oci_connection_close(php_oci_connection *connection)
int php_oci_connection_release(php_oci_connection *connection)
{
int result = 0;
- zend_bool in_call_save = OCI_G(in_call);
+ bool in_call_save = OCI_G(in_call);
time_t timestamp = time(NULL);
if (connection->is_stub) {
@@ -1989,7 +1983,7 @@ static int php_oci_persistent_helper(zval *zv)
static php_oci_spool *php_oci_create_spool(char *username, int username_len, char *password, int password_len, char *dbname, int dbname_len, zend_string *hash_key, int charsetid)
{
php_oci_spool *session_pool = NULL;
- zend_bool iserror = 0;
+ bool iserror = 0;
ub4 poolmode = OCI_DEFAULT; /* Mode to be passed to OCISessionPoolCreate */
OCIAuthInfo *spoolAuth = NULL;
sword errstatus;
@@ -2128,7 +2122,7 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char *
smart_str spool_hashed_details = {0};
php_oci_spool *session_pool = NULL;
zend_resource *spool_out_le = NULL;
- zend_bool iserror = 0;
+ bool iserror = 0;
zval *spool_out_zv = NULL;
/* {{{ Create the spool hash key */
diff --git a/ext/oci8/oci8.stub.php b/ext/oci8/oci8.stub.php
index ee8ea98b54..b7d47d5dc9 100644
--- a/ext/oci8/oci8.stub.php
+++ b/ext/oci8/oci8.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
/** @param resource $statement */
function oci_define_by_name($statement, string $column, mixed &$var, int $type = 0): bool {}
diff --git a/ext/oci8/oci8_arginfo.h b/ext/oci8/oci8_arginfo.h
index 4486036c49..4fc33e377c 100644
--- a/ext/oci8/oci8_arginfo.h
+++ b/ext/oci8/oci8_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: e7a7a9402b2668136f9f47d6e547e3af46a78a50 */
+ * Stub hash: f96a1c7a278551bf334eab82a69710c3418beebf */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_oci_define_by_name, 0, 3, _IS_BOOL, 0)
ZEND_ARG_INFO(0, statement)
@@ -789,3 +789,23 @@ static const zend_function_entry class_OCICollection_methods[] = {
ZEND_ME_MAPPING(trim, oci_collection_trim, arginfo_class_OCICollection_trim, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_OCILob(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "OCILob", class_OCILob_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_OCICollection(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "OCICollection", class_OCICollection_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c
index df71b510fd..416ab92677 100644
--- a/ext/oci8/oci8_interface.c
+++ b/ext/oci8/oci8_interface.c
@@ -528,7 +528,7 @@ PHP_FUNCTION(oci_lob_write)
php_oci_descriptor *descriptor;
size_t data_len;
zend_long write_len;
- zend_bool write_len_is_null = 1;
+ bool write_len_is_null = 1;
ub4 bytes_written;
char *data;
@@ -628,7 +628,7 @@ PHP_FUNCTION(oci_lob_erase)
php_oci_descriptor *descriptor;
ub4 bytes_erased;
zend_long offset, length;
- zend_bool offset_is_null = 1, length_is_null = 1;
+ bool offset_is_null = 1, length_is_null = 1;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|l!l!", &z_descriptor, oci_lob_class_entry_ptr, &offset, &offset_is_null, &length, &length_is_null) == FAILURE) {
RETURN_THROWS();
@@ -697,7 +697,7 @@ PHP_FUNCTION(ocisetbufferinglob)
{
zval *tmp, *z_descriptor;
php_oci_descriptor *descriptor;
- zend_bool flag;
+ bool flag;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ob", &z_descriptor, oci_lob_class_entry_ptr, &flag) == FAILURE) {
RETURN_THROWS();
@@ -747,7 +747,7 @@ PHP_FUNCTION(oci_lob_copy)
zval *tmp_dest, *tmp_from, *z_descriptor_dest, *z_descriptor_from;
php_oci_descriptor *descriptor_dest, *descriptor_from;
zend_long length;
- zend_bool length_is_null = 1;
+ bool length_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO|l!", &z_descriptor_dest, oci_lob_class_entry_ptr, &z_descriptor_from, oci_lob_class_entry_ptr, &length, &length_is_null) == FAILURE) {
RETURN_THROWS();
@@ -824,7 +824,7 @@ PHP_FUNCTION(oci_lob_export)
char *buffer;
size_t filename_len;
zend_long start, length, block_length;
- zend_bool start_is_null = 1, length_is_null = 1;
+ bool start_is_null = 1, length_is_null = 1;
php_stream *stream;
ub4 lob_length;
diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c
index e16e38713d..e08878f81d 100644
--- a/ext/oci8/oci8_statement.c
+++ b/ext/oci8/oci8_statement.c
@@ -250,7 +250,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows)
void *handlepp;
ub4 typep, iterp, idxp;
ub1 in_outp, piecep;
- zend_bool piecewisecols = 0;
+ bool piecewisecols = 0;
php_oci_out_column *column;
sword errstatus;
@@ -1832,7 +1832,7 @@ php_oci_bind *php_oci_bind_array_helper_number(zval *var, zend_long max_table_le
bind->array.element_lengths[i] = sizeof(oci_phpsized_int);
}
if ((i < bind->array.current_length) && (entry = zend_hash_get_current_data(hash)) != NULL) {
- convert_to_long_ex(entry);
+ convert_to_long(entry);
((oci_phpsized_int *)bind->array.elements)[i] = (oci_phpsized_int) Z_LVAL_P(entry);
zend_hash_move_forward(hash);
} else {
@@ -1873,7 +1873,7 @@ php_oci_bind *php_oci_bind_array_helper_double(zval *var, zend_long max_table_le
bind->array.element_lengths[i] = sizeof(double);
}
if ((i < bind->array.current_length) && (entry = zend_hash_get_current_data(hash)) != NULL) {
- convert_to_double_ex(entry);
+ convert_to_double(entry);
((double *)bind->array.elements)[i] = (double) Z_DVAL_P(entry);
zend_hash_move_forward(hash);
} else {
diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h
index 825437bc57..b462aa762d 100644
--- a/ext/oci8/php_oci8_int.h
+++ b/ext/oci8/php_oci8_int.h
@@ -519,16 +519,16 @@ ZEND_BEGIN_MODULE_GLOBALS(oci) /* {{{ Module globals */
zend_long persistent_timeout; /* time period after which idle persistent connection is considered expired */
zend_long statement_cache_size; /* statement cache size. used with 9i+ clients only*/
zend_long default_prefetch; /* default prefetch setting */
- zend_bool privileged_connect; /* privileged connect flag (On/Off) */
- zend_bool old_oci_close_semantics; /* old_oci_close_semantics flag (to determine the way oci_close() should behave) */
+ bool privileged_connect; /* privileged connect flag (On/Off) */
+ bool old_oci_close_semantics; /* old_oci_close_semantics flag (to determine the way oci_close() should behave) */
int shutdown; /* in shutdown flag */
OCIEnv *env; /* global environment handle */
- zend_bool in_call;
+ bool in_call;
char *connection_class;
- zend_bool events;
+ bool events;
char *edition;
ZEND_END_MODULE_GLOBALS(oci) /* }}} */
diff --git a/ext/oci8/tests/bind_char_1.phpt b/ext/oci8/tests/bind_char_1.phpt
index f405155980..93dcd96e37 100644
--- a/ext/oci8/tests/bind_char_1.phpt
+++ b/ext/oci8/tests/bind_char_1.phpt
@@ -87,17 +87,17 @@ if ($r)
do_e_q($s);
echo "Test 2.4: Type: AFC: Length: strlen\n";
-$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1), SQLT_AFC);
+$r = oci_bind_by_name($s, ":bv", $bv1, 0, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 2.5: Type: AFC. Length: strlen-1\n";
-$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)-1, SQLT_AFC);
+$r = oci_bind_by_name($s, ":bv", $bv1, -1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 2.6: Type: AFC. Length: strlen+1\n";
-$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)+1, SQLT_AFC);
+$r = oci_bind_by_name($s, ":bv", $bv1, 1, SQLT_AFC);
if ($r)
do_e_q($s);
@@ -159,17 +159,17 @@ if ($r)
do_e_q($s);
echo "Test 4.4: Type: AFC: Length: strlen\n";
-$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1), SQLT_AFC);
+$r = oci_bind_by_name($s, ":bv", $bv1, 0, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 4.5: Type: AFC. Length: strlen-1\n";
-$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)-1, SQLT_AFC);
+$r = oci_bind_by_name($s, ":bv", $bv1, -1, SQLT_AFC);
if ($r)
do_e_q($s);
echo "Test 4.6: Type: AFC. Length: strlen+1\n";
-$r = oci_bind_by_name($s, ":bv", $bv1, strlen($bv1)+1, SQLT_AFC);
+$r = oci_bind_by_name($s, ":bv", $bv1, +1, SQLT_AFC);
if ($r)
do_e_q($s);
diff --git a/ext/oci8/tests/coll_010.phpt b/ext/oci8/tests/coll_010.phpt
index da0b278e07..005dcd5460 100644
--- a/ext/oci8/tests/coll_010.phpt
+++ b/ext/oci8/tests/coll_010.phpt
@@ -10,9 +10,9 @@ require(__DIR__.'/skipif.inc');
require __DIR__."/connect.inc";
-$ora_sql = "DROP TYPE
- ".$type_name."
- ";
+error_reporting(E_ALL ^ E_DEPRECATED);
+
+$ora_sql = "DROP TYPE ".$type_name;
$statement = oci_parse($c,$ora_sql);
@oci_execute($statement);
diff --git a/ext/oci8/tests/coll_010_func.phpt b/ext/oci8/tests/coll_010_func.phpt
index f244ce16a8..3950dc7cb4 100644
--- a/ext/oci8/tests/coll_010_func.phpt
+++ b/ext/oci8/tests/coll_010_func.phpt
@@ -10,9 +10,9 @@ require(__DIR__.'/skipif.inc');
require __DIR__."/connect.inc";
-$ora_sql = "DROP TYPE
- ".$type_name."
- ";
+error_reporting(E_ALL ^ E_DEPRECATED);
+
+$ora_sql = "DROP TYPE ".$type_name;
$statement = oci_parse($c,$ora_sql);
@oci_execute($statement);
diff --git a/ext/oci8/tests/coll_017.phpt b/ext/oci8/tests/coll_017.phpt
index 6701a930c3..082713a732 100644
--- a/ext/oci8/tests/coll_017.phpt
+++ b/ext/oci8/tests/coll_017.phpt
@@ -10,9 +10,9 @@ require(__DIR__.'/skipif.inc');
require __DIR__."/connect.inc";
-$ora_sql = "DROP TYPE
- ".$type_name."
- ";
+error_reporting(E_ALL ^ E_DEPRECATED);
+
+$ora_sql = "DROP TYPE ".$type_name;
$statement = oci_parse($c,$ora_sql);
@oci_execute($statement);
diff --git a/ext/oci8/tests/coll_017_func.phpt b/ext/oci8/tests/coll_017_func.phpt
index b1c403a16b..8f4587d54c 100644
--- a/ext/oci8/tests/coll_017_func.phpt
+++ b/ext/oci8/tests/coll_017_func.phpt
@@ -10,9 +10,9 @@ require(__DIR__.'/skipif.inc');
require __DIR__."/connect.inc";
-$ora_sql = "DROP TYPE
- ".$type_name."
- ";
+error_reporting(E_ALL ^ E_DEPRECATED);
+
+$ora_sql = "DROP TYPE ".$type_name;
$statement = oci_parse($c,$ora_sql);
@oci_execute($statement);
diff --git a/ext/oci8/tests/coll_019.phpt b/ext/oci8/tests/coll_019.phpt
index be79e98aab..de6e187102 100644
--- a/ext/oci8/tests/coll_019.phpt
+++ b/ext/oci8/tests/coll_019.phpt
@@ -8,6 +8,8 @@ require(__DIR__.'/skipif.inc');
--FILE--
<?php
+error_reporting(E_ALL ^ E_DEPRECATED);
+
require __DIR__."/connect.inc";
$ora_sql = "DROP TYPE ".$type_name;
diff --git a/ext/oci8/tests/conn_attr_4.phpt b/ext/oci8/tests/conn_attr_4.phpt
index e4e457194d..9cf55f55f9 100644
--- a/ext/oci8/tests/conn_attr_4.phpt
+++ b/ext/oci8/tests/conn_attr_4.phpt
@@ -21,6 +21,8 @@ if (!(isset($matches[0]) &&
--FILE--
<?php
+error_reporting(E_ALL ^ E_DEPRECATED);
+
$testuser = 'testuser_attr_4'; // Used in conn_attr.inc
$testpassword = 'testuser';
diff --git a/ext/oci8/tests/edition_2.phpt b/ext/oci8/tests/edition_2.phpt
index 4aab1c36bc..7cfcaa8d18 100644
--- a/ext/oci8/tests/edition_2.phpt
+++ b/ext/oci8/tests/edition_2.phpt
@@ -27,6 +27,8 @@ if (!(isset($matches[0]) &&
--FILE--
<?php
+error_reporting(E_ALL ^ E_DEPRECATED);
+
/* In 11.2, there can only be one child edition. So this test will
* fail to create the necessary editions if a child edition exists
* already
diff --git a/ext/oci8/tests/extauth_01.phpt b/ext/oci8/tests/extauth_01.phpt
index db23097d82..6b543922ec 100644
--- a/ext/oci8/tests/extauth_01.phpt
+++ b/ext/oci8/tests/extauth_01.phpt
@@ -12,6 +12,8 @@ oci8.privileged_connect=1
--FILE--
<?php
+error_reporting(E_ALL ^ E_DEPRECATED);
+
// Run Test
echo "Test 1\n";
diff --git a/ext/oci8/tests/extauth_02.phpt b/ext/oci8/tests/extauth_02.phpt
index c8c3dd6725..03911fda90 100644
--- a/ext/oci8/tests/extauth_02.phpt
+++ b/ext/oci8/tests/extauth_02.phpt
@@ -11,6 +11,8 @@ oci8.privileged_connect=1
--FILE--
<?php
+error_reporting(E_ALL ^ E_DEPRECATED);
+
// Run Test
echo "Test 1\n";
diff --git a/ext/oci8/tests/extauth_03.phpt b/ext/oci8/tests/extauth_03.phpt
index 863f94499b..7aefc4726f 100644
--- a/ext/oci8/tests/extauth_03.phpt
+++ b/ext/oci8/tests/extauth_03.phpt
@@ -11,6 +11,8 @@ oci8.privileged_connect=1
--FILE--
<?php
+error_reporting(E_ALL ^ E_DEPRECATED);
+
// Run Test
echo "Test 1\n";
diff --git a/ext/oci8/tests/lob_null.phpt b/ext/oci8/tests/lob_null.phpt
index 2543aeef81..df9c83fd47 100644
--- a/ext/oci8/tests/lob_null.phpt
+++ b/ext/oci8/tests/lob_null.phpt
@@ -10,6 +10,8 @@ require(__DIR__.'/skipif.inc');
require __DIR__.'/connect.inc';
+error_reporting(E_ALL ^ E_DEPRECATED);
+
// Initialization
$s = oci_parse($c, 'drop table lob_null_tab');
diff --git a/ext/odbc/odbc.stub.php b/ext/odbc/odbc.stub.php
index e241022e10..fc19ca259f 100644
--- a/ext/odbc/odbc.stub.php
+++ b/ext/odbc/odbc.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function odbc_close_all(): void {}
diff --git a/ext/odbc/odbc_arginfo.h b/ext/odbc/odbc_arginfo.h
index 974edf32f0..d766a97820 100644
--- a/ext/odbc/odbc_arginfo.h
+++ b/ext/odbc/odbc_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: dd2205269dd48e1af19c3980291b21d86fa11a93 */
+ * Stub hash: 6d7d8d8f495236297745b9b1087e5cf955976127 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_odbc_close_all, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO()
diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c
index e7498ee2b7..05e371d05f 100644
--- a/ext/odbc/php_odbc.c
+++ b/ext/odbc/php_odbc.c
@@ -1661,7 +1661,7 @@ PHP_FUNCTION(odbc_fetch_row)
RETCODE rc;
zval *pv_res;
zend_long pv_row;
- zend_bool pv_row_is_null = 1;
+ bool pv_row_is_null = 1;
#ifdef HAVE_SQL_EXTENDED_FETCH
SQLULEN crow;
SQLUSMALLINT RowStatus[1];
@@ -2540,7 +2540,7 @@ PHP_FUNCTION(odbc_autocommit)
odbc_connection *conn;
RETCODE rc;
zval *pv_conn;
- zend_bool pv_onoff = 0;
+ bool pv_onoff = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|b", &pv_conn, &pv_onoff) == FAILURE) {
RETURN_THROWS();
diff --git a/ext/odbc/tests/odbc_columnprivileges_001.phpt b/ext/odbc/tests/odbc_columnprivileges_001.phpt
index 062985d55f..353ae1e81a 100644
--- a/ext/odbc/tests/odbc_columnprivileges_001.phpt
+++ b/ext/odbc/tests/odbc_columnprivileges_001.phpt
@@ -22,6 +22,12 @@ var_dump(odbc_fetch_row($result));
--EXPECTF--
resource(%d) of type (odbc result)
bool(false)
+
+Deprecated: odbc_columnprivileges(): Passing null to parameter #3 ($schema) of type string is deprecated in %s on line %d
+
+Deprecated: odbc_columnprivileges(): Passing null to parameter #4 ($table) of type string is deprecated in %s on line %d
+
+Deprecated: odbc_columnprivileges(): Passing null to parameter #5 ($column) of type string is deprecated in %s on line %d
resource(%d) of type (odbc result)
bool(false)
resource(%d) of type (odbc result)
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index 6974307e29..fc24cff389 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -109,17 +109,19 @@ zend_accel_shared_globals *accel_shared_globals = NULL;
#ifdef ZEND_WIN32
char accel_uname_id[32];
#endif
-zend_bool accel_startup_ok = 0;
+bool accel_startup_ok = 0;
static char *zps_failure_reason = NULL;
char *zps_api_failure_reason = NULL;
-zend_bool file_cache_only = 0; /* process uses file cache only */
+bool file_cache_only = 0; /* process uses file cache only */
#if ENABLE_FILE_CACHE_FALLBACK
-zend_bool fallback_process = 0; /* process uses file cache fallback */
+bool fallback_process = 0; /* process uses file cache fallback */
#endif
static zend_op_array *(*accelerator_orig_compile_file)(zend_file_handle *file_handle, int type);
-static zend_result (*accelerator_orig_zend_stream_open_function)(const char *filename, zend_file_handle *handle );
-static zend_string *(*accelerator_orig_zend_resolve_path)(const char *filename, size_t filename_len);
+static zend_class_entry* (*accelerator_orig_inheritance_cache_get)(zend_class_entry *ce, zend_class_entry *parent, zend_class_entry **traits_and_interfaces);
+static zend_class_entry* (*accelerator_orig_inheritance_cache_add)(zend_class_entry *ce, zend_class_entry *proto, zend_class_entry *parent, zend_class_entry **traits_and_interfaces, HashTable *dependencies);
+static zend_result (*accelerator_orig_zend_stream_open_function)(zend_file_handle *handle );
+static zend_string *(*accelerator_orig_zend_resolve_path)(zend_string *filename);
static void (*accelerator_orig_zend_error_cb)(int type, const char *error_filename, const uint32_t error_lineno, zend_string *message);
static zif_handler orig_chdir = NULL;
static ZEND_INI_MH((*orig_include_path_on_modify)) = NULL;
@@ -503,7 +505,7 @@ zend_string* ZEND_FASTCALL accel_new_interned_string(zend_string *str)
hash_slot = STRTAB_HASH_TO_SLOT(&ZCSG(interned_strings), h);
STRTAB_COLLISION(s) = *hash_slot;
*hash_slot = STRTAB_STR_TO_POS(&ZCSG(interned_strings), s);
- GC_SET_REFCOUNT(s, 1);
+ GC_SET_REFCOUNT(s, 2);
GC_TYPE_INFO(s) = GC_STRING | ((IS_STR_INTERNED | IS_STR_PERMANENT) << GC_FLAGS_SHIFT);
ZSTR_H(s) = h;
ZSTR_LEN(s) = ZSTR_LEN(str);
@@ -805,7 +807,7 @@ static inline void kill_all_lockers(struct flock *mem_usage_check)
/* errno is not ESRCH or we ran out of tries to kill the locker */
ZCSG(force_restart_time) = time(NULL); /* restore forced restart request */
/* cannot kill the locker, bail out with error */
- zend_accel_error(ACCEL_LOG_ERROR, "Cannot kill process %d!", mem_usage_check->l_pid);
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Cannot kill process %d!", mem_usage_check->l_pid);
}
mem_usage_check->l_type = F_WRLCK;
@@ -950,7 +952,7 @@ accel_time_t zend_get_file_handle_timestamp(zend_file_handle *file_handle, size_
if (sapi_module.get_stat &&
!EG(current_execute_data) &&
- file_handle->filename == SG(request_info).path_translated) {
+ file_handle->primary_script) {
zend_stat_t *tmpbuf = sapi_module.get_stat();
@@ -972,7 +974,7 @@ accel_time_t zend_get_file_handle_timestamp(zend_file_handle *file_handle, size_
switch (file_handle->type) {
case ZEND_HANDLE_FP:
if (zend_fstat(fileno(file_handle->handle.fp), &statbuf) == -1) {
- if (zend_get_stream_timestamp(file_handle->filename, &statbuf) != SUCCESS) {
+ if (zend_get_stream_timestamp(ZSTR_VAL(file_handle->filename), &statbuf) != SUCCESS) {
return 0;
}
}
@@ -991,7 +993,7 @@ accel_time_t zend_get_file_handle_timestamp(zend_file_handle *file_handle, size_
}
}
- if (zend_get_stream_timestamp(file_handle->filename, &statbuf) != SUCCESS) {
+ if (zend_get_stream_timestamp(ZSTR_VAL(file_handle->filename), &statbuf) != SUCCESS) {
return 0;
}
break;
@@ -1037,6 +1039,7 @@ static inline int do_validate_timestamps(zend_persistent_script *persistent_scri
{
zend_file_handle ps_handle;
zend_string *full_path_ptr = NULL;
+ int ret;
/** check that the persistent script is indeed the same file we cached
* (if part of the path is a symlink than it possible that the user will change it)
@@ -1048,7 +1051,7 @@ static inline int do_validate_timestamps(zend_persistent_script *persistent_scri
return FAILURE;
}
} else {
- full_path_ptr = accelerator_orig_zend_resolve_path(file_handle->filename, strlen(file_handle->filename));
+ full_path_ptr = accelerator_orig_zend_resolve_path(file_handle->filename);
if (full_path_ptr &&
persistent_script->script.filename != full_path_ptr &&
!zend_string_equal_content(persistent_script->script.filename, full_path_ptr)) {
@@ -1078,14 +1081,15 @@ static inline int do_validate_timestamps(zend_persistent_script *persistent_scri
file_handle->opened_path = NULL;
}
- zend_stream_init_filename(&ps_handle, ZSTR_VAL(persistent_script->script.filename));
+ zend_stream_init_filename_ex(&ps_handle, persistent_script->script.filename);
ps_handle.opened_path = persistent_script->script.filename;
- if (zend_get_file_handle_timestamp(&ps_handle, NULL) == persistent_script->timestamp) {
- return SUCCESS;
- }
+ ret = zend_get_file_handle_timestamp(&ps_handle, NULL) == persistent_script->timestamp
+ ? SUCCESS : FAILURE;
- return FAILURE;
+ zend_destroy_file_handle(&ps_handle);
+
+ return ret;
}
int validate_timestamp_and_record(zend_persistent_script *persistent_script, zend_file_handle *file_handle)
@@ -1117,23 +1121,25 @@ int validate_timestamp_and_record_ex(zend_persistent_script *persistent_script,
/* Instead of resolving full real path name each time we need to identify file,
* we create a key that consist from requested file name, current working
* directory, current include_path, etc */
-char *accel_make_persistent_key(const char *path, size_t path_length, int *key_len)
+zend_string *accel_make_persistent_key(zend_string *str)
{
+ const char *path = ZSTR_VAL(str);
+ size_t path_length = ZSTR_LEN(str);
+ char *key;
int key_length;
+ ZSTR_LEN(&ZCG(key)) = 0;
+
/* CWD and include_path don't matter for absolute file names and streams */
if (IS_ABSOLUTE_PATH(path, path_length)) {
/* pass */
- ZCG(key_len) = 0;
} else if (UNEXPECTED(is_stream_path(path))) {
if (!is_cacheable_stream_path(path)) {
return NULL;
}
/* pass */
- ZCG(key_len) = 0;
} else if (UNEXPECTED(!ZCG(accel_directives).use_cwd)) {
/* pass */
- ZCG(key_len) = 0;
} else {
const char *include_path = NULL, *cwd = NULL;
int include_path_len = 0, cwd_len = 0;
@@ -1231,7 +1237,7 @@ char *accel_make_persistent_key(const char *path, size_t path_length, int *key_l
}
/* Calculate key length */
- if (UNEXPECTED((size_t)(cwd_len + path_length + include_path_len + 2) >= sizeof(ZCG(key)))) {
+ if (UNEXPECTED((size_t)(cwd_len + path_length + include_path_len + 2) >= sizeof(ZCG(_key)))) {
return NULL;
}
@@ -1240,16 +1246,17 @@ char *accel_make_persistent_key(const char *path, size_t path_length, int *key_l
* since in itself, it may include colons (which we use to separate
* different components of the key)
*/
- memcpy(ZCG(key), path, path_length);
- ZCG(key)[path_length] = ':';
+ key = ZSTR_VAL(&ZCG(key));
+ memcpy(key, path, path_length);
+ key[path_length] = ':';
key_length = path_length + 1;
- memcpy(ZCG(key) + key_length, cwd, cwd_len);
+ memcpy(key + key_length, cwd, cwd_len);
key_length += cwd_len;
if (include_path_len) {
- ZCG(key)[key_length] = ':';
+ key[key_length] = ':';
key_length += 1;
- memcpy(ZCG(key) + key_length, include_path, include_path_len);
+ memcpy(key + key_length, include_path, include_path_len);
key_length += include_path_len;
}
@@ -1263,25 +1270,27 @@ char *accel_make_persistent_key(const char *path, size_t path_length, int *key_l
parent_script_len = ZSTR_LEN(parent_script);
while ((--parent_script_len > 0) && !IS_SLASH(ZSTR_VAL(parent_script)[parent_script_len]));
- if (UNEXPECTED((size_t)(key_length + parent_script_len + 1) >= sizeof(ZCG(key)))) {
+ if (UNEXPECTED((size_t)(key_length + parent_script_len + 1) >= sizeof(ZCG(_key)))) {
return NULL;
}
- ZCG(key)[key_length] = ':';
+ key[key_length] = ':';
key_length += 1;
- memcpy(ZCG(key) + key_length, ZSTR_VAL(parent_script), parent_script_len);
+ memcpy(key + key_length, ZSTR_VAL(parent_script), parent_script_len);
key_length += parent_script_len;
}
- ZCG(key)[key_length] = '\0';
- *key_len = ZCG(key_len) = key_length;
- return ZCG(key);
+ key[key_length] = '\0';
+ GC_SET_REFCOUNT(&ZCG(key), 1);
+ GC_TYPE_INFO(&ZCG(key)) = GC_STRING;
+ ZSTR_H(&ZCG(key)) = 0;
+ ZSTR_LEN(&ZCG(key)) = key_length;
+ return &ZCG(key);
}
/* not use_cwd */
- *key_len = path_length;
- return (char*)path;
+ return str;
}
-int zend_accel_invalidate(const char *filename, size_t filename_len, zend_bool force)
+int zend_accel_invalidate(zend_string *filename, bool force)
{
zend_string *realpath;
zend_persistent_script *persistent_script;
@@ -1290,7 +1299,7 @@ int zend_accel_invalidate(const char *filename, size_t filename_len, zend_bool f
return FAILURE;
}
- realpath = accelerator_orig_zend_resolve_path(filename, filename_len);
+ realpath = accelerator_orig_zend_resolve_path(filename);
if (!realpath) {
return FAILURE;
@@ -1303,7 +1312,7 @@ int zend_accel_invalidate(const char *filename, size_t filename_len, zend_bool f
persistent_script = zend_accel_hash_find(&ZCSG(hash), realpath);
if (persistent_script && !persistent_script->corrupted) {
zend_file_handle file_handle;
- zend_stream_init_filename(&file_handle, ZSTR_VAL(realpath));
+ zend_stream_init_filename_ex(&file_handle, realpath);
file_handle.opened_path = realpath;
if (force ||
@@ -1326,6 +1335,9 @@ int zend_accel_invalidate(const char *filename, size_t filename_len, zend_bool f
SHM_PROTECT();
HANDLE_UNBLOCK_INTERRUPTIONS();
}
+
+ file_handle.opened_path = NULL;
+ zend_destroy_file_handle(&file_handle);
}
accelerator_shm_read_unlock();
@@ -1334,20 +1346,38 @@ int zend_accel_invalidate(const char *filename, size_t filename_len, zend_bool f
return SUCCESS;
}
+static zend_string* accel_new_interned_key(zend_string *key)
+{
+ zend_string *new_key;
+
+ GC_ADDREF(key);
+ new_key = accel_new_interned_string(key);
+ if (UNEXPECTED(new_key == key)) {
+ new_key = zend_shared_alloc(ZEND_MM_ALIGNED_SIZE_EX(_ZSTR_STRUCT_SIZE(ZSTR_LEN(key)), 8));
+ if (EXPECTED(new_key)) {
+ GC_SET_REFCOUNT(new_key, 2);
+ GC_TYPE_INFO(new_key) = GC_STRING | (IS_STR_INTERNED << GC_FLAGS_SHIFT);
+ ZSTR_H(new_key) = ZSTR_H(key);
+ ZSTR_LEN(new_key) = ZSTR_LEN(key);
+ memcpy(ZSTR_VAL(new_key), ZSTR_VAL(key), ZSTR_LEN(new_key) + 1);
+ }
+ }
+ return new_key;
+}
+
/* Adds another key for existing cached script */
-static void zend_accel_add_key(const char *key, unsigned int key_length, zend_accel_hash_entry *bucket)
+static void zend_accel_add_key(zend_string *key, zend_accel_hash_entry *bucket)
{
- if (!zend_accel_hash_str_find(&ZCSG(hash), key, key_length)) {
+ if (!zend_accel_hash_find(&ZCSG(hash), key)) {
if (zend_accel_hash_is_full(&ZCSG(hash))) {
zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!");
ZSMMG(memory_exhausted) = 1;
zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_HASH);
} else {
- char *new_key = zend_shared_alloc(key_length + 1);
+ zend_string *new_key = accel_new_interned_key(key);
if (new_key) {
- memcpy(new_key, key, key_length + 1);
- if (zend_accel_hash_update(&ZCSG(hash), new_key, key_length, 1, bucket)) {
- zend_accel_error(ACCEL_LOG_INFO, "Added key '%s'", new_key);
+ if (zend_accel_hash_update(&ZCSG(hash), new_key, 1, bucket)) {
+ zend_accel_error(ACCEL_LOG_INFO, "Added key '%s'", ZSTR_VAL(new_key));
}
} else {
zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_OOM);
@@ -1356,7 +1386,7 @@ static void zend_accel_add_key(const char *key, unsigned int key_length, zend_ac
}
}
-static zend_always_inline zend_bool is_phar_file(zend_string *filename)
+static zend_always_inline bool is_phar_file(zend_string *filename)
{
return filename && ZSTR_LEN(filename) >= sizeof(".phar") &&
!memcmp(ZSTR_VAL(filename) + ZSTR_LEN(filename) - (sizeof(".phar")-1), ".phar", sizeof(".phar")-1) &&
@@ -1370,7 +1400,7 @@ static zend_persistent_script *store_script_in_file_cache(zend_persistent_script
zend_shared_alloc_init_xlat_table();
/* Calculate the required memory size */
- memory_used = zend_accel_script_persist_calc(new_persistent_script, NULL, 0, 0);
+ memory_used = zend_accel_script_persist_calc(new_persistent_script, 0);
/* Allocate memory block */
#if defined(__AVX__) || defined(__SSE2__)
@@ -1388,7 +1418,7 @@ static zend_persistent_script *store_script_in_file_cache(zend_persistent_script
zend_shared_alloc_clear_xlat_table();
/* Copy into memory block */
- new_persistent_script = zend_accel_script_persist(new_persistent_script, NULL, 0, 0);
+ new_persistent_script = zend_accel_script_persist(new_persistent_script, 0);
zend_shared_alloc_destroy_xlat_table();
@@ -1428,7 +1458,7 @@ static zend_persistent_script *cache_script_in_file_cache(zend_persistent_script
return store_script_in_file_cache(new_persistent_script);
}
-static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_script *new_persistent_script, const char *key, unsigned int key_length, int *from_shared_memory)
+static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_script *new_persistent_script, zend_string *key, int *from_shared_memory)
{
zend_accel_hash_entry *bucket;
uint32_t memory_used;
@@ -1458,7 +1488,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr
if (key &&
(!ZCG(accel_directives).validate_timestamps ||
(new_persistent_script->timestamp == existing_persistent_script->timestamp))) {
- zend_accel_add_key(key, key_length, bucket);
+ zend_accel_add_key(key, bucket);
}
zend_shared_alloc_unlock();
#if 1
@@ -1487,7 +1517,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr
zend_shared_alloc_init_xlat_table();
/* Calculate the required memory size */
- memory_used = zend_accel_script_persist_calc(new_persistent_script, key, key_length, 1);
+ memory_used = zend_accel_script_persist_calc(new_persistent_script, 1);
/* Allocate shared memory */
#if defined(__AVX__) || defined(__SSE2__)
@@ -1545,7 +1575,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr
zend_shared_alloc_clear_xlat_table();
/* Copy into shared memory */
- new_persistent_script = zend_accel_script_persist(new_persistent_script, &key, key_length, 1);
+ new_persistent_script = zend_accel_script_persist(new_persistent_script, 1);
zend_shared_alloc_destroy_xlat_table();
@@ -1565,21 +1595,26 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr
new_persistent_script->dynamic_members.checksum = zend_accel_script_checksum(new_persistent_script);
/* store script structure in the hash table */
- bucket = zend_accel_hash_update(&ZCSG(hash), ZSTR_VAL(new_persistent_script->script.filename), ZSTR_LEN(new_persistent_script->script.filename), 0, new_persistent_script);
+ bucket = zend_accel_hash_update(&ZCSG(hash), new_persistent_script->script.filename, 0, new_persistent_script);
if (bucket) {
zend_accel_error(ACCEL_LOG_INFO, "Cached script '%s'", ZSTR_VAL(new_persistent_script->script.filename));
if (key &&
/* key may contain non-persistent PHAR aliases (see issues #115 and #149) */
- memcmp(key, "phar://", sizeof("phar://") - 1) != 0 &&
- (ZSTR_LEN(new_persistent_script->script.filename) != key_length ||
- memcmp(ZSTR_VAL(new_persistent_script->script.filename), key, key_length) != 0)) {
+ memcmp(ZSTR_VAL(key), "phar://", sizeof("phar://") - 1) != 0 &&
+ !zend_string_equals(new_persistent_script->script.filename, key)) {
/* link key to the same persistent script in hash table */
- if (zend_accel_hash_update(&ZCSG(hash), key, key_length, 1, bucket)) {
- zend_accel_error(ACCEL_LOG_INFO, "Added key '%s'", key);
+ zend_string *new_key = accel_new_interned_key(key);
+
+ if (new_key) {
+ if (zend_accel_hash_update(&ZCSG(hash), new_key, 1, bucket)) {
+ zend_accel_error(ACCEL_LOG_INFO, "Added key '%s'", ZSTR_VAL(key));
+ } else {
+ zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!");
+ ZSMMG(memory_exhausted) = 1;
+ zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_HASH);
+ }
} else {
- zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!");
- ZSMMG(memory_exhausted) = 1;
- zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_HASH);
+ zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_OOM);
}
}
}
@@ -1699,7 +1734,7 @@ static void free_recorded_warnings() {
ZCG(num_warnings) = 0;
}
-static zend_persistent_script *opcache_compile_file(zend_file_handle *file_handle, int type, const char *key, zend_op_array **op_array_p)
+static zend_persistent_script *opcache_compile_file(zend_file_handle *file_handle, int type, zend_op_array **op_array_p)
{
zend_persistent_script *new_persistent_script;
uint32_t orig_functions_count, orig_class_count;
@@ -1712,13 +1747,13 @@ static zend_persistent_script *opcache_compile_file(zend_file_handle *file_handl
/* Try to open file */
if (file_handle->type == ZEND_HANDLE_FILENAME) {
- if (accelerator_orig_zend_stream_open_function(file_handle->filename, file_handle) != SUCCESS) {
+ if (accelerator_orig_zend_stream_open_function(file_handle) != SUCCESS) {
*op_array_p = NULL;
if (!EG(exception)) {
if (type == ZEND_REQUIRE) {
- zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename);
+ zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, ZSTR_VAL(file_handle->filename));
} else {
- zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename);
+ zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, ZSTR_VAL(file_handle->filename));
}
}
return NULL;
@@ -1850,7 +1885,7 @@ static zend_persistent_script *opcache_compile_file(zend_file_handle *file_handl
if (file_handle->opened_path) {
new_persistent_script->script.filename = zend_string_copy(file_handle->opened_path);
} else {
- new_persistent_script->script.filename = zend_string_init(file_handle->filename, strlen(file_handle->filename), 0);
+ new_persistent_script->script.filename = zend_string_copy(file_handle->filename);
}
zend_string_hash_val(new_persistent_script->script.filename);
@@ -1864,19 +1899,19 @@ zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int type)
zend_op_array *op_array = NULL;
int from_memory; /* if the script we've got is stored in SHM */
- if (is_stream_path(file_handle->filename) &&
- !is_cacheable_stream_path(file_handle->filename)) {
+ if (is_stream_path(ZSTR_VAL(file_handle->filename)) &&
+ !is_cacheable_stream_path(ZSTR_VAL(file_handle->filename))) {
return accelerator_orig_compile_file(file_handle, type);
}
if (!file_handle->opened_path) {
if (file_handle->type == ZEND_HANDLE_FILENAME &&
- accelerator_orig_zend_stream_open_function(file_handle->filename, file_handle) == FAILURE) {
+ accelerator_orig_zend_stream_open_function(file_handle) == FAILURE) {
if (!EG(exception)) {
if (type == ZEND_REQUIRE) {
- zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename);
+ zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, ZSTR_VAL(file_handle->filename));
} else {
- zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename);
+ zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, ZSTR_VAL(file_handle->filename));
}
}
return NULL;
@@ -1912,7 +1947,6 @@ zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int type)
}
}
replay_warnings(persistent_script);
- zend_file_handle_dtor(file_handle);
if (persistent_script->ping_auto_globals_mask) {
zend_accel_set_auto_globals(persistent_script->ping_auto_globals_mask);
@@ -1921,7 +1955,7 @@ zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int type)
return zend_accel_load_script(persistent_script, 1);
}
- persistent_script = opcache_compile_file(file_handle, type, NULL, &op_array);
+ persistent_script = opcache_compile_file(file_handle, type, &op_array);
if (persistent_script) {
from_memory = 0;
@@ -1959,8 +1993,7 @@ int check_persistent_script_access(zend_persistent_script *persistent_script)
zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
{
zend_persistent_script *persistent_script = NULL;
- char *key = NULL;
- int key_length;
+ zend_string *key = NULL;
int from_shared_memory; /* if the script we've got is stored in SHM */
if (!file_handle->filename || !ZCG(accelerator_enabled)) {
@@ -1992,7 +2025,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
* persistent script already found */
if (ZCG(cache_persistent_script) &&
((!EG(current_execute_data) &&
- file_handle->filename == SG(request_info).path_translated &&
+ file_handle->primary_script &&
ZCG(cache_opline) == NULL) ||
(EG(current_execute_data) &&
EG(current_execute_data)->func &&
@@ -2000,22 +2033,21 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
ZCG(cache_opline) == EG(current_execute_data)->opline))) {
persistent_script = ZCG(cache_persistent_script);
- if (ZCG(key_len)) {
- key = ZCG(key);
- key_length = ZCG(key_len);
+ if (ZSTR_LEN(&ZCG(key))) {
+ key = &ZCG(key);
}
} else {
if (!ZCG(accel_directives).revalidate_path) {
/* try to find cached script by key */
- key = accel_make_persistent_key(file_handle->filename, strlen(file_handle->filename), &key_length);
+ key = accel_make_persistent_key(file_handle->filename);
if (!key) {
ZCG(cache_opline) = NULL;
ZCG(cache_persistent_script) = NULL;
return accelerator_orig_compile_file(file_handle, type);
}
- persistent_script = zend_accel_hash_str_find(&ZCSG(hash), key, key_length);
- } else if (UNEXPECTED(is_stream_path(file_handle->filename) && !is_cacheable_stream_path(file_handle->filename))) {
+ persistent_script = zend_accel_hash_find(&ZCSG(hash), key);
+ } else if (UNEXPECTED(is_stream_path(ZSTR_VAL(file_handle->filename)) && !is_cacheable_stream_path(ZSTR_VAL(file_handle->filename)))) {
ZCG(cache_opline) = NULL;
ZCG(cache_persistent_script) = NULL;
return accelerator_orig_compile_file(file_handle, type);
@@ -2026,13 +2058,13 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
zend_accel_hash_entry *bucket;
/* open file to resolve the path */
- if (file_handle->type == ZEND_HANDLE_FILENAME &&
- accelerator_orig_zend_stream_open_function(file_handle->filename, file_handle) == FAILURE) {
+ if (file_handle->type == ZEND_HANDLE_FILENAME
+ && accelerator_orig_zend_stream_open_function(file_handle) == FAILURE) {
if (!EG(exception)) {
if (type == ZEND_REQUIRE) {
- zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename);
+ zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, ZSTR_VAL(file_handle->filename));
} else {
- zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename);
+ zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, ZSTR_VAL(file_handle->filename));
}
}
return NULL;
@@ -2048,7 +2080,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
HANDLE_BLOCK_INTERRUPTIONS();
SHM_UNPROTECT();
zend_shared_alloc_lock();
- zend_accel_add_key(key, key_length, bucket);
+ zend_accel_add_key(key, bucket);
zend_shared_alloc_unlock();
SHM_PROTECT();
HANDLE_UNBLOCK_INTERRUPTIONS();
@@ -2087,9 +2119,9 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
UNEXPECTED(check_persistent_script_access(persistent_script))) {
if (!EG(exception)) {
if (type == ZEND_REQUIRE) {
- zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename);
+ zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, ZSTR_VAL(file_handle->filename));
} else {
- zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename);
+ zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, ZSTR_VAL(file_handle->filename));
}
}
return NULL;
@@ -2167,7 +2199,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
SHM_PROTECT();
HANDLE_UNBLOCK_INTERRUPTIONS();
- persistent_script = opcache_compile_file(file_handle, type, key, &op_array);
+ persistent_script = opcache_compile_file(file_handle, type, &op_array);
HANDLE_BLOCK_INTERRUPTIONS();
SHM_UNPROTECT();
@@ -2176,7 +2208,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
*/
from_shared_memory = 0;
if (persistent_script) {
- persistent_script = cache_script_in_shared_memory(persistent_script, key, key ? key_length : 0, &from_shared_memory);
+ persistent_script = cache_script_in_shared_memory(persistent_script, key, &from_shared_memory);
}
/* Caching is disabled, returning op_array;
@@ -2232,7 +2264,6 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
}
}
replay_warnings(persistent_script);
- zend_file_handle_dtor(file_handle);
from_shared_memory = 1;
}
@@ -2249,6 +2280,212 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
return zend_accel_load_script(persistent_script, from_shared_memory);
}
+static zend_always_inline zend_inheritance_cache_entry* zend_accel_inheritance_cache_find(zend_inheritance_cache_entry *entry, zend_class_entry *ce, zend_class_entry *parent, zend_class_entry **traits_and_interfaces, bool *needs_autoload_ptr)
+{
+ uint32_t i;
+
+ ZEND_ASSERT(ce->ce_flags & ZEND_ACC_IMMUTABLE);
+ ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_LINKED));
+
+ while (entry) {
+ bool found = 1;
+ bool needs_autoload = 0;
+
+ if (entry->parent != parent) {
+ found = 0;
+ } else {
+ for (i = 0; i < ce->num_traits + ce->num_interfaces; i++) {
+ if (entry->traits_and_interfaces[i] != traits_and_interfaces[i]) {
+ found = 0;
+ break;
+ }
+ }
+ if (found && entry->dependencies) {
+ for (i = 0; i < entry->dependencies_count; i++) {
+ zend_class_entry *ce = zend_lookup_class_ex(entry->dependencies[i].name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+
+ if (ce != entry->dependencies[i].ce) {
+ if (!ce) {
+ needs_autoload = 1;
+ } else {
+ found = 0;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (found) {
+ *needs_autoload_ptr = needs_autoload;
+ return entry;
+ }
+ entry = entry->next;
+ }
+
+ return NULL;
+}
+
+static zend_class_entry* zend_accel_inheritance_cache_get(zend_class_entry *ce, zend_class_entry *parent, zend_class_entry **traits_and_interfaces)
+{
+ uint32_t i;
+ bool needs_autoload;
+ zend_inheritance_cache_entry *entry = ce->inheritance_cache;
+
+ while (entry) {
+ entry = zend_accel_inheritance_cache_find(entry, ce, parent, traits_and_interfaces, &needs_autoload);
+ if (entry) {
+ if (!needs_autoload) {
+ if (ZCSG(map_ptr_last) > CG(map_ptr_last)) {
+ zend_map_ptr_extend(ZCSG(map_ptr_last));
+ }
+ return entry->ce;
+ }
+
+ for (i = 0; i < entry->dependencies_count; i++) {
+ zend_class_entry *ce = zend_lookup_class_ex(entry->dependencies[i].name, NULL, 0);
+
+ if (ce == NULL) {
+ return NULL;
+ }
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static zend_class_entry* zend_accel_inheritance_cache_add(zend_class_entry *ce, zend_class_entry *proto, zend_class_entry *parent, zend_class_entry **traits_and_interfaces, HashTable *dependencies)
+{
+ zend_persistent_script dummy;
+ size_t size;
+ uint32_t i;
+ bool needs_autoload;
+ zend_class_entry *new_ce;
+ zend_inheritance_cache_entry *entry;
+
+ ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_IMMUTABLE));
+ ZEND_ASSERT(ce->ce_flags & ZEND_ACC_LINKED);
+
+ if (!ZCG(accelerator_enabled) ||
+ (ZCSG(restart_in_progress) && accel_restart_is_active())) {
+ return NULL;
+ }
+
+ if (traits_and_interfaces && dependencies) {
+ for (i = 0; i < proto->num_traits + proto->num_interfaces; i++) {
+ if (traits_and_interfaces[i]) {
+ zend_hash_del(dependencies, traits_and_interfaces[i]->name);
+ }
+ }
+ }
+
+ SHM_UNPROTECT();
+ zend_shared_alloc_lock();
+
+ entry = ce->inheritance_cache;
+ while (entry) {
+ entry = zend_accel_inheritance_cache_find(entry, ce, parent, traits_and_interfaces, &needs_autoload);
+ if (entry) {
+ if (!needs_autoload) {
+ zend_shared_alloc_unlock();
+ SHM_PROTECT();
+
+ zend_map_ptr_extend(ZCSG(map_ptr_last));
+ return entry->ce;
+ }
+ ZEND_ASSERT(0); // entry = entry->next; // This shouldn't be posible ???
+ }
+ }
+
+ zend_shared_alloc_init_xlat_table();
+
+ memset(&dummy, 0, sizeof(dummy));
+ dummy.size = ZEND_ALIGNED_SIZE(
+ sizeof(zend_inheritance_cache_entry) -
+ sizeof(void*) +
+ (sizeof(void*) * (proto->num_traits + proto->num_interfaces)));
+ if (dependencies) {
+ dummy.size += ZEND_ALIGNED_SIZE(zend_hash_num_elements(dependencies) * sizeof(zend_class_dependency));
+ }
+ ZCG(current_persistent_script) = &dummy;
+ zend_persist_class_entry_calc(ce);
+ size = dummy.size;
+
+ zend_shared_alloc_clear_xlat_table();
+
+#if ZEND_MM_ALIGNMENT < 8
+ /* Align to 8-byte boundary */
+ ZCG(mem) = zend_shared_alloc(size + 8);
+#else
+ ZCG(mem) = zend_shared_alloc(size);
+#endif
+
+ if (!ZCG(mem)) {
+ zend_shared_alloc_destroy_xlat_table();
+ zend_shared_alloc_unlock();
+ SHM_PROTECT();
+ return NULL;
+ }
+
+#if ZEND_MM_ALIGNMENT < 8
+ /* Align to 8-byte boundary */
+ ZCG(mem) = (void*)(((zend_uintptr_t)ZCG(mem) + 7L) & ~7L);
+#endif
+
+ memset(ZCG(mem), 0, size);
+ entry = (zend_inheritance_cache_entry*)ZCG(mem);
+ ZCG(mem) = (char*)ZCG(mem) +
+ ZEND_ALIGNED_SIZE(
+ (sizeof(zend_inheritance_cache_entry) -
+ sizeof(void*) +
+ (sizeof(void*) * (proto->num_traits + proto->num_interfaces))));
+ entry->parent = parent;
+ for (i = 0; i < proto->num_traits + proto->num_interfaces; i++) {
+ entry->traits_and_interfaces[i] = traits_and_interfaces[i];
+ }
+ if (dependencies && zend_hash_num_elements(dependencies)) {
+ zend_string *dep_name;
+ zend_class_entry *dep_ce;
+
+ i = 0;
+ entry->dependencies_count = zend_hash_num_elements(dependencies);
+ entry->dependencies = (zend_class_dependency*)ZCG(mem);
+ ZEND_HASH_FOREACH_STR_KEY_PTR(dependencies, dep_name, dep_ce) {
+#if ZEND_DEBUG
+ ZEND_ASSERT(zend_accel_in_shm(dep_name));
+#endif
+ entry->dependencies[i].name = dep_name;
+ entry->dependencies[i].ce = dep_ce;
+ i++;
+ } ZEND_HASH_FOREACH_END();
+ ZCG(mem) = (char*)ZCG(mem) + zend_hash_num_elements(dependencies) * sizeof(zend_class_dependency);
+ }
+ entry->ce = new_ce = zend_persist_class_entry(ce);
+ zend_update_parent_ce(new_ce);
+ entry->next = proto->inheritance_cache;
+ proto->inheritance_cache = entry;
+
+ zend_shared_alloc_destroy_xlat_table();
+
+ zend_shared_alloc_unlock();
+ SHM_PROTECT();
+
+ /* Consistency check */
+ if ((char*)entry + size != (char*)ZCG(mem)) {
+ zend_accel_error(
+ ((char*)entry + size < (char*)ZCG(mem)) ? ACCEL_LOG_ERROR : ACCEL_LOG_WARNING,
+ "Internal error: wrong class size calculation: %s start=" ZEND_ADDR_FMT ", end=" ZEND_ADDR_FMT ", real=" ZEND_ADDR_FMT "\n",
+ ZSTR_VAL(ce->name),
+ (size_t)entry,
+ (size_t)((char *)entry + size),
+ (size_t)ZCG(mem));
+ }
+
+ zend_map_ptr_extend(ZCSG(map_ptr_last));
+
+ return new_ce;
+}
+
#ifdef ZEND_WIN32
static int accel_gen_uname_id(void)
{
@@ -2270,12 +2507,12 @@ static int accel_gen_uname_id(void)
#endif
/* zend_stream_open_function() replacement for PHP 5.3 and above */
-static zend_result persistent_stream_open_function(const char *filename, zend_file_handle *handle)
+static zend_result persistent_stream_open_function(zend_file_handle *handle)
{
if (ZCG(cache_persistent_script)) {
/* check if callback is called from include_once or it's a main request */
if ((!EG(current_execute_data) &&
- filename == SG(request_info).path_translated &&
+ handle->primary_script &&
ZCG(cache_opline) == NULL) ||
(EG(current_execute_data) &&
EG(current_execute_data)->func &&
@@ -2283,25 +2520,23 @@ static zend_result persistent_stream_open_function(const char *filename, zend_fi
ZCG(cache_opline) == EG(current_execute_data)->opline)) {
/* we are in include_once or FastCGI request */
- zend_stream_init_filename(handle, (char*) filename);
handle->opened_path = zend_string_copy(ZCG(cache_persistent_script)->script.filename);
return SUCCESS;
}
ZCG(cache_opline) = NULL;
ZCG(cache_persistent_script) = NULL;
}
- return accelerator_orig_zend_stream_open_function(filename, handle);
+ return accelerator_orig_zend_stream_open_function(handle);
}
/* zend_resolve_path() replacement for PHP 5.3 and above */
-static zend_string* persistent_zend_resolve_path(const char *filename, size_t filename_len)
+static zend_string* persistent_zend_resolve_path(zend_string *filename)
{
if (!file_cache_only &&
ZCG(accelerator_enabled)) {
/* check if callback is called from include_once or it's a main request */
- if ((!EG(current_execute_data) &&
- filename == SG(request_info).path_translated) ||
+ if ((!EG(current_execute_data)) ||
(EG(current_execute_data) &&
EG(current_execute_data)->func &&
ZEND_USER_CODE(EG(current_execute_data)->func->common.type) &&
@@ -2311,14 +2546,13 @@ static zend_string* persistent_zend_resolve_path(const char *filename, size_t fi
/* we are in include_once or FastCGI request */
zend_string *resolved_path;
- int key_length;
- char *key = NULL;
+ zend_string *key = NULL;
if (!ZCG(accel_directives).revalidate_path) {
/* lookup by "not-real" path */
- key = accel_make_persistent_key(filename, filename_len, &key_length);
+ key = accel_make_persistent_key(filename);
if (key) {
- zend_accel_hash_entry *bucket = zend_accel_hash_str_find_entry(&ZCSG(hash), key, key_length);
+ zend_accel_hash_entry *bucket = zend_accel_hash_find_entry(&ZCSG(hash), key);
if (bucket != NULL) {
zend_persistent_script *persistent_script = (zend_persistent_script *)bucket->data;
if (!persistent_script->corrupted) {
@@ -2330,12 +2564,12 @@ static zend_string* persistent_zend_resolve_path(const char *filename, size_t fi
} else {
ZCG(cache_opline) = NULL;
ZCG(cache_persistent_script) = NULL;
- return accelerator_orig_zend_resolve_path(filename, filename_len);
+ return accelerator_orig_zend_resolve_path(filename);
}
}
/* find the full real path */
- resolved_path = accelerator_orig_zend_resolve_path(filename, filename_len);
+ resolved_path = accelerator_orig_zend_resolve_path(filename);
if (resolved_path) {
/* lookup by real path */
@@ -2348,12 +2582,12 @@ static zend_string* persistent_zend_resolve_path(const char *filename, size_t fi
HANDLE_BLOCK_INTERRUPTIONS();
SHM_UNPROTECT();
zend_shared_alloc_lock();
- zend_accel_add_key(key, key_length, bucket);
+ zend_accel_add_key(key, bucket);
zend_shared_alloc_unlock();
SHM_PROTECT();
HANDLE_UNBLOCK_INTERRUPTIONS();
} else {
- ZCG(key_len) = 0;
+ ZSTR_LEN(&ZCG(key)) = 0;
}
ZCG(cache_opline) = EG(current_execute_data) ? EG(current_execute_data)->opline : NULL;
ZCG(cache_persistent_script) = persistent_script;
@@ -2369,7 +2603,7 @@ static zend_string* persistent_zend_resolve_path(const char *filename, size_t fi
}
ZCG(cache_opline) = NULL;
ZCG(cache_persistent_script) = NULL;
- return accelerator_orig_zend_resolve_path(filename, filename_len);
+ return accelerator_orig_zend_resolve_path(filename);
}
static void zend_reset_cache_vars(void)
@@ -2642,7 +2876,7 @@ static int zend_accel_init_shm(void)
accel_shared_globals = zend_shared_alloc(sizeof(zend_accel_shared_globals) + sizeof(uint32_t));
}
if (!accel_shared_globals) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
zend_shared_alloc_unlock();
return FAILURE;
}
@@ -2960,9 +3194,6 @@ static zend_result accel_post_startup(void)
}
}
- /* Initialize zend_func_info_rid */
- zend_optimizer_startup();
-
/********************************************/
/* End of non-SHM dependent initializations */
/********************************************/
@@ -2971,7 +3202,7 @@ static zend_result accel_post_startup(void)
size_t shm_size = ZCG(accel_directives).memory_consumption;
#ifdef HAVE_JIT
size_t jit_size = 0;
- zend_bool reattached = 0;
+ bool reattached = 0;
if (JIT_G(enabled) && JIT_G(buffer_size)
&& zend_jit_check_support() == SUCCESS) {
@@ -2985,7 +3216,7 @@ static zend_result accel_post_startup(void)
page_size = getpagesize();
# endif
if (!page_size || (page_size & (page_size - 1))) {
- zend_accel_error(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - can't get page size.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - can't get page size.");
abort();
}
jit_size = JIT_G(buffer_size);
@@ -3005,7 +3236,7 @@ static zend_result accel_post_startup(void)
break;
case ALLOC_FAILURE:
accel_startup_ok = 0;
- zend_accel_error(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - probably not enough shared memory.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - probably not enough shared memory.");
return SUCCESS;
case SUCCESSFULLY_REATTACHED:
#if defined(HAVE_JIT) && !defined(ZEND_WIN32)
@@ -3018,7 +3249,7 @@ static zend_result accel_post_startup(void)
break;
case FAILED_REATTACHED:
accel_startup_ok = 0;
- zend_accel_error(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - can not reattach to exiting shared memory.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - can not reattach to exiting shared memory.");
return SUCCESS;
break;
#if ENABLE_FILE_CACHE_FALLBACK
@@ -3058,7 +3289,7 @@ static zend_result accel_post_startup(void)
SHM_PROTECT();
} else if (!ZCG(accel_directives).file_cache) {
accel_startup_ok = 0;
- zend_accel_error(ACCEL_LOG_FATAL, "opcache.file_cache_only is set without a proper setting of opcache.file_cache");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "opcache.file_cache_only is set without a proper setting of opcache.file_cache");
return SUCCESS;
} else {
#ifdef HAVE_JIT
@@ -3122,13 +3353,23 @@ file_cache_fallback:
zend_accel_blacklist_load(&accel_blacklist, ZCG(accel_directives.user_blacklist_filename));
}
- zend_optimizer_startup();
-
if (!file_cache_only && ZCG(accel_directives).interned_strings_buffer) {
accel_use_shm_interned_strings();
}
- return accel_finish_startup();
+ if (accel_finish_startup() != SUCCESS) {
+ return FAILURE;
+ }
+
+ if (ZCG(enabled) && accel_startup_ok) {
+ /* Override inheritance cache callbaks */
+ accelerator_orig_inheritance_cache_get = zend_inheritance_cache_get;
+ accelerator_orig_inheritance_cache_add = zend_inheritance_cache_add;
+ zend_inheritance_cache_get = zend_accel_inheritance_cache_get;
+ zend_inheritance_cache_add = zend_accel_inheritance_cache_add;
+ }
+
+ return SUCCESS;
}
static void (*orig_post_shutdown_cb)(void);
@@ -3141,14 +3382,12 @@ static void accel_post_shutdown(void)
void accel_shutdown(void)
{
zend_ini_entry *ini_entry;
- zend_bool _file_cache_only = 0;
+ bool _file_cache_only = 0;
#ifdef HAVE_JIT
zend_jit_shutdown();
#endif
- zend_optimizer_shutdown();
-
zend_accel_blacklist_shutdown(&accel_blacklist);
if (!ZCG(enabled) || !accel_startup_ok) {
@@ -3177,6 +3416,8 @@ void accel_shutdown(void)
}
zend_compile_file = accelerator_orig_compile_file;
+ zend_inheritance_cache_get = accelerator_orig_inheritance_cache_get;
+ zend_inheritance_cache_add = accelerator_orig_inheritance_cache_add;
if ((ini_entry = zend_hash_str_find_ptr(EG(ini_directives), "include_path", sizeof("include_path")-1)) != NULL) {
ini_entry->on_modify = orig_include_path_on_modify;
@@ -3304,11 +3545,11 @@ static void preload_activate(void)
static void preload_restart(void)
{
- zend_accel_hash_update(&ZCSG(hash), ZSTR_VAL(ZCSG(preload_script)->script.filename), ZSTR_LEN(ZCSG(preload_script)->script.filename), 0, ZCSG(preload_script));
+ zend_accel_hash_update(&ZCSG(hash), ZCSG(preload_script)->script.filename, 0, ZCSG(preload_script));
if (ZCSG(saved_scripts)) {
zend_persistent_script **p = ZCSG(saved_scripts);
while (*p) {
- zend_accel_hash_update(&ZCSG(hash), ZSTR_VAL((*p)->script.filename), ZSTR_LEN((*p)->script.filename), 0, *p);
+ zend_accel_hash_update(&ZCSG(hash), (*p)->script.filename, 0, *p);
p++;
}
}
@@ -3420,11 +3661,6 @@ static zend_op_array *preload_compile_file(zend_file_handle *file_handle, int ty
//??? efree(op_array->refcount);
op_array->refcount = NULL;
- if (op_array->static_variables &&
- !(GC_FLAGS(op_array->static_variables) & IS_ARRAY_IMMUTABLE)) {
- GC_ADDREF(op_array->static_variables);
- }
-
zend_hash_add_ptr(preload_scripts, script->script.filename, script);
}
@@ -3479,35 +3715,7 @@ try_again:
}
}
-static void get_unresolved_initializer(zend_class_entry *ce, const char **kind, const char **name) {
- zend_string *key;
- zend_class_constant *c;
- zend_property_info *prop;
-
- *kind = "unknown";
- *name = "";
-
- ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, key, c) {
- if (Z_TYPE(c->value) == IS_CONSTANT_AST) {
- *kind = "constant ";
- *name = ZSTR_VAL(key);
- }
- } ZEND_HASH_FOREACH_END();
- ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop) {
- zval *val;
- if (prop->flags & ZEND_ACC_STATIC) {
- val = &ce->default_static_members_table[prop->offset];
- } else {
- val = &ce->default_properties_table[OBJ_PROP_TO_NUM(prop->offset)];
- }
- if (Z_TYPE_P(val) == IS_CONSTANT_AST) {
- *kind = (prop->flags & ZEND_ACC_STATIC) ? "static property $" : "property $";
- *name = ZSTR_VAL(key);
- }
- } ZEND_HASH_FOREACH_END();
-}
-
-static zend_bool preload_needed_types_known(zend_class_entry *ce);
+static bool preload_needed_types_known(zend_class_entry *ce);
static void get_unlinked_dependency(zend_class_entry *ce, const char **kind, const char **name) {
zend_class_entry *p;
*kind = "Unknown reason";
@@ -3522,16 +3730,6 @@ static void get_unlinked_dependency(zend_class_entry *ce, const char **kind, con
*name = ZSTR_VAL(ce->parent_name);
return;
}
- if (!(p->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
- *kind = "Parent with unresolved initializers ";
- *name = ZSTR_VAL(ce->parent_name);
- return;
- }
- if (!(p->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED)) {
- *kind = "Parent with unresolved property types ";
- *name = ZSTR_VAL(ce->parent_name);
- return;
- }
}
if (ce->num_interfaces) {
@@ -3564,14 +3762,13 @@ static void get_unlinked_dependency(zend_class_entry *ce, const char **kind, con
}
}
-static zend_bool preload_try_resolve_constants(zend_class_entry *ce)
+static bool preload_try_resolve_constants(zend_class_entry *ce)
{
- zend_bool ok, changed;
+ bool ok, changed, was_changed = 0;
zend_class_constant *c;
zval *val;
EG(exception) = (void*)(uintptr_t)-1; /* prevent error reporting */
- CG(in_compilation) = 1; /* prevent autoloading */
do {
ok = 1;
changed = 0;
@@ -3579,68 +3776,71 @@ static zend_bool preload_try_resolve_constants(zend_class_entry *ce)
val = &c->value;
if (Z_TYPE_P(val) == IS_CONSTANT_AST) {
if (EXPECTED(zval_update_constant_ex(val, c->ce) == SUCCESS)) {
- changed = 1;
+ was_changed = changed = 1;
} else {
ok = 0;
}
}
} ZEND_HASH_FOREACH_END();
+ if (ok) {
+ ce->ce_flags &= ~ZEND_ACC_HAS_AST_CONSTANTS;
+ }
if (ce->default_properties_count) {
uint32_t i;
+ bool resolved = 1;
+
for (i = 0; i < ce->default_properties_count; i++) {
val = &ce->default_properties_table[i];
if (Z_TYPE_P(val) == IS_CONSTANT_AST) {
zend_property_info *prop = ce->properties_info_table[i];
if (UNEXPECTED(zval_update_constant_ex(val, prop->ce) != SUCCESS)) {
- ok = 0;
+ resolved = ok = 0;
}
}
}
+ if (resolved) {
+ ce->ce_flags &= ~ZEND_ACC_HAS_AST_PROPERTIES;
+ }
}
if (ce->default_static_members_count) {
uint32_t count = ce->parent ? ce->default_static_members_count - ce->parent->default_static_members_count : ce->default_static_members_count;
+ bool resolved = 1;
val = ce->default_static_members_table + ce->default_static_members_count - 1;
while (count) {
if (Z_TYPE_P(val) == IS_CONSTANT_AST) {
if (UNEXPECTED(zval_update_constant_ex(val, ce) != SUCCESS)) {
- ok = 0;
+ resolved = ok = 0;
}
}
val--;
count--;
}
+ if (resolved) {
+ ce->ce_flags &= ~ZEND_ACC_HAS_AST_STATICS;
+ }
}
} while (changed && !ok);
EG(exception) = NULL;
CG(in_compilation) = 0;
- return ok;
+ if (ok) {
+ ce->ce_flags |= ZEND_ACC_CONSTANTS_UPDATED;
+ }
+
+ return ok || was_changed;
}
-static zend_class_entry *preload_fetch_resolved_ce(zend_string *name, zend_class_entry *self_ce) {
+static zend_class_entry *preload_fetch_resolved_ce(zend_string *name) {
zend_string *lcname = zend_string_tolower(name);
zend_class_entry *ce = zend_hash_find_ptr(EG(class_table), lcname);
zend_string_release(lcname);
- if (!ce) {
- return NULL;
- }
- if (ce == self_ce) {
- /* Ignore the following requirements if this is the class referring to itself */
- return ce;
- }
- if (!(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
- return NULL;
- }
- if (!(ce->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED)) {
- return NULL;
- }
return ce;
}
-static zend_bool preload_try_resolve_property_types(zend_class_entry *ce)
+static bool preload_try_resolve_property_types(zend_class_entry *ce)
{
- zend_bool ok = 1;
+ bool ok = 1;
if (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) {
zend_property_info *prop;
ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) {
@@ -3648,7 +3848,7 @@ static zend_bool preload_try_resolve_property_types(zend_class_entry *ce)
ZEND_TYPE_FOREACH(prop->type, single_type) {
if (ZEND_TYPE_HAS_NAME(*single_type)) {
zend_class_entry *p =
- preload_fetch_resolved_ce(ZEND_TYPE_NAME(*single_type), ce);
+ preload_fetch_resolved_ce(ZEND_TYPE_NAME(*single_type));
if (!p) {
ok = 0;
continue;
@@ -3657,12 +3857,15 @@ static zend_bool preload_try_resolve_property_types(zend_class_entry *ce)
}
} ZEND_TYPE_FOREACH_END();
} ZEND_HASH_FOREACH_END();
+ if (ok) {
+ ce->ce_flags |= ZEND_ACC_PROPERTY_TYPES_RESOLVED;
+ }
}
return ok;
}
-static zend_bool preload_is_class_type_known(zend_class_entry *ce, zend_string *name) {
+static bool preload_is_class_type_known(zend_class_entry *ce, zend_string *name) {
if (zend_string_equals_literal_ci(name, "self") ||
zend_string_equals_literal_ci(name, "parent") ||
zend_string_equals_ci(name, ce->name)) {
@@ -3670,12 +3873,12 @@ static zend_bool preload_is_class_type_known(zend_class_entry *ce, zend_string *
}
zend_string *lcname = zend_string_tolower(name);
- zend_bool known = zend_hash_exists(EG(class_table), lcname);
+ bool known = zend_hash_exists(EG(class_table), lcname);
zend_string_release(lcname);
return known;
}
-static zend_bool preload_is_type_known(zend_class_entry *ce, zend_type *type) {
+static bool preload_is_type_known(zend_class_entry *ce, zend_type *type) {
zend_type *single_type;
ZEND_TYPE_FOREACH(*type, single_type) {
if (ZEND_TYPE_HAS_NAME(*single_type)) {
@@ -3687,7 +3890,7 @@ static zend_bool preload_is_type_known(zend_class_entry *ce, zend_type *type) {
return 1;
}
-static zend_bool preload_is_method_maybe_override(zend_class_entry *ce, zend_string *lcname) {
+static bool preload_is_method_maybe_override(zend_class_entry *ce, zend_string *lcname) {
zend_class_entry *p;
if (ce->trait_aliases || ce->trait_precedences) {
return 1;
@@ -3725,7 +3928,7 @@ static zend_bool preload_is_method_maybe_override(zend_class_entry *ce, zend_str
return 0;
}
-static zend_bool preload_needed_types_known(zend_class_entry *ce) {
+static bool preload_needed_types_known(zend_class_entry *ce) {
zend_function *fptr;
zend_string *lcname;
ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, lcname, fptr) {
@@ -3752,7 +3955,7 @@ static void preload_link(void)
zend_persistent_script *script;
zend_class_entry *ce, *parent, *p;
zend_string *key;
- zend_bool found, changed;
+ bool found, changed;
uint32_t i;
dtor_func_t orig_dtor;
zend_function *function;
@@ -3785,12 +3988,6 @@ static void preload_link(void)
parent = zend_hash_find_ptr(EG(class_table), key);
zend_string_release(key);
if (!parent) continue;
- if (!(parent->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
- continue;
- }
- if (!(parent->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED)) {
- continue;
- }
}
if (ce->num_interfaces) {
@@ -3801,10 +3998,6 @@ static void preload_link(void)
found = 0;
break;
}
- if (!(p->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
- found = 0;
- break;
- }
}
if (!found) continue;
}
@@ -3829,11 +4022,8 @@ static void preload_link(void)
continue;
}
- {
- zend_string *key = zend_string_tolower(ce->name);
- zv = zend_hash_set_bucket_key(EG(class_table), (Bucket*)zv, key);
- zend_string_release(key);
- }
+ key = zend_string_tolower(ce->name);
+ zv = zend_hash_set_bucket_key(EG(class_table), (Bucket*)zv, key);
if (EXPECTED(zv)) {
/* Set filename & lineno information for inheritance errors */
@@ -3849,7 +4039,8 @@ static void preload_link(void)
} else {
CG(zend_lineno) = ce->info.user.line_start;
}
- if (zend_do_link_class(ce, NULL) == FAILURE) {
+ ce = zend_do_link_class(ce, NULL, key);
+ if (!ce) {
ZEND_ASSERT(0 && "Class linking failed?");
}
CG(in_compilation) = 0;
@@ -3857,22 +4048,41 @@ static void preload_link(void)
changed = 1;
}
+
+ zend_string_release(key);
}
- if (ce->ce_flags & ZEND_ACC_LINKED) {
- if (!(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
- if ((ce->ce_flags & ZEND_ACC_TRAIT) /* don't update traits */
- || preload_try_resolve_constants(ce)) {
- ce->ce_flags |= ZEND_ACC_CONSTANTS_UPDATED;
- changed = 1;
- }
- }
+ } ZEND_HASH_FOREACH_END();
+ } while (changed);
- if (!(ce->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED)) {
- if ((ce->ce_flags & ZEND_ACC_TRAIT) /* don't update traits */
- || preload_try_resolve_property_types(ce)) {
- ce->ce_flags |= ZEND_ACC_PROPERTY_TYPES_RESOLVED;
+ /* Resolve property types */
+ ZEND_HASH_REVERSE_FOREACH_VAL(EG(class_table), zv) {
+ ce = Z_PTR_P(zv);
+ if (ce->type == ZEND_INTERNAL_CLASS) {
+ break;
+ }
+ if (!(ce->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED)) {
+ if (!(ce->ce_flags & ZEND_ACC_TRAIT)) {
+ preload_try_resolve_property_types(ce);
+ }
+ }
+ } ZEND_HASH_FOREACH_END();
+
+
+ do {
+ changed = 0;
+
+ ZEND_HASH_REVERSE_FOREACH_VAL(EG(class_table), zv) {
+ ce = Z_PTR_P(zv);
+ if (ce->type == ZEND_INTERNAL_CLASS) {
+ break;
+ }
+ if (!(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
+ if (!(ce->ce_flags & ZEND_ACC_TRAIT)) { /* don't update traits */
+ CG(in_compilation) = 1; /* prevent autoloading */
+ if (preload_try_resolve_constants(ce)) {
changed = 1;
}
+ CG(in_compilation) = 0;
}
}
} ZEND_HASH_FOREACH_END();
@@ -3902,18 +4112,6 @@ static void preload_link(void)
ZSTR_VAL(ce->name), kind, name);
}
zend_string_release(key);
- } else if (!(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
- const char *kind, *name;
- get_unresolved_initializer(ce, &kind, &name);
- zend_error_at(
- E_WARNING, ZSTR_VAL(ce->info.user.filename), ce->info.user.line_start,
- "Can't preload class %s with unresolved initializer for %s%s",
- ZSTR_VAL(ce->name), kind, name);
- } else if (!(ce->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED)) {
- zend_error_at(
- E_WARNING, ZSTR_VAL(ce->info.user.filename), ce->info.user.line_start,
- "Can't preload class %s with unresolved property types",
- ZSTR_VAL(ce->name));
} else {
continue;
}
@@ -3967,7 +4165,7 @@ static inline int preload_update_class_constants(zend_class_entry *ce) {
* maybe-uninitialized analysis. */
int result;
zend_try {
- result = zend_update_class_constants(ce);
+ result = preload_try_resolve_constants(ce) ? SUCCESS : FAILURE;
} zend_catch {
result = FAILURE;
} zend_end_try();
@@ -3983,13 +4181,6 @@ static zend_class_entry *preload_load_prop_type(zend_property_info *prop, zend_s
} else {
ce = zend_lookup_class(name);
}
- if (ce) {
- return ce;
- }
-
- zend_error_noreturn(E_ERROR,
- "Failed to load class %s used by typed property %s::$%s during preloading",
- ZSTR_VAL(name), ZSTR_VAL(prop->ce->name), zend_get_unmangled_property_name(prop->name));
return ce;
}
@@ -4015,12 +4206,7 @@ static void preload_ensure_classes_loadable() {
}
if (!(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
- if (preload_update_class_constants(ce) == FAILURE) {
- zend_error_noreturn(E_ERROR,
- "Failed to resolve initializers of class %s during preloading",
- ZSTR_VAL(ce->name));
- }
- ZEND_ASSERT(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED);
+ preload_update_class_constants(ce);
}
if (!(ce->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED)) {
@@ -4032,7 +4218,9 @@ static void preload_ensure_classes_loadable() {
if (ZEND_TYPE_HAS_NAME(*single_type)) {
zend_class_entry *ce = preload_load_prop_type(
prop, ZEND_TYPE_NAME(*single_type));
- ZEND_TYPE_SET_CE(*single_type, ce);
+ if (ce) {
+ ZEND_TYPE_SET_CE(*single_type, ce);
+ }
}
} ZEND_TYPE_FOREACH_END();
} ZEND_HASH_FOREACH_END();
@@ -4049,13 +4237,13 @@ static zend_string *preload_resolve_path(zend_string *filename)
if (is_stream_path(ZSTR_VAL(filename))) {
return NULL;
}
- return zend_resolve_path(ZSTR_VAL(filename), ZSTR_LEN(filename));
+ return zend_resolve_path(filename);
}
static void preload_remove_empty_includes(void)
{
zend_persistent_script *script;
- zend_bool changed;
+ bool changed;
/* mark all as empty */
ZEND_HASH_FOREACH_PTR(preload_scripts, script) {
@@ -4224,14 +4412,14 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
uint32_t checkpoint;
if (zend_accel_hash_is_full(&ZCSG(hash))) {
- zend_accel_error(ACCEL_LOG_FATAL, "Not enough entries in hash table for preloading. Consider increasing the value for the opcache.max_accelerated_files directive in php.ini.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Not enough entries in hash table for preloading. Consider increasing the value for the opcache.max_accelerated_files directive in php.ini.");
return NULL;
}
checkpoint = zend_shared_alloc_checkpoint_xlat_table();
/* Calculate the required memory size */
- memory_used = zend_accel_script_persist_calc(new_persistent_script, NULL, 0, 1);
+ memory_used = zend_accel_script_persist_calc(new_persistent_script, 1);
/* Allocate shared memory */
#if defined(__AVX__) || defined(__SSE2__)
@@ -4276,14 +4464,14 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
}
#endif
if (!ZCG(mem)) {
- zend_accel_error(ACCEL_LOG_FATAL, "Not enough shared memory for preloading. Consider increasing the value for the opcache.memory_consumption directive in php.ini.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Not enough shared memory for preloading. Consider increasing the value for the opcache.memory_consumption directive in php.ini.");
return NULL;
}
zend_shared_alloc_restore_xlat_table(checkpoint);
/* Copy into shared memory */
- new_persistent_script = zend_accel_script_persist(new_persistent_script, NULL, 0, 1);
+ new_persistent_script = zend_accel_script_persist(new_persistent_script, 1);
new_persistent_script->is_phar = is_phar_file(new_persistent_script->script.filename);
@@ -4301,7 +4489,7 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
new_persistent_script->dynamic_members.checksum = zend_accel_script_checksum(new_persistent_script);
/* store script structure in the hash table */
- bucket = zend_accel_hash_update(&ZCSG(hash), ZSTR_VAL(new_persistent_script->script.filename), ZSTR_LEN(new_persistent_script->script.filename), 0, new_persistent_script);
+ bucket = zend_accel_hash_update(&ZCSG(hash), new_persistent_script->script.filename, 0, new_persistent_script);
if (bucket) {
zend_accel_error(ACCEL_LOG_INFO, "Cached script '%s'", ZSTR_VAL(new_persistent_script->script.filename));
}
@@ -4362,7 +4550,7 @@ static zend_result preload_autoload(zend_string *filename)
zend_op_array *op_array;
zend_execute_data *old_execute_data;
zend_class_entry *old_fake_scope;
- zend_bool do_bailout = 0;
+ bool do_bailout = 0;
int ret = SUCCESS;
if (zend_hash_exists(&EG(included_files), filename)) {
@@ -4425,7 +4613,7 @@ static zend_result preload_autoload(zend_string *filename)
return ret;
}
-static int accel_preload(const char *config, zend_bool in_child)
+static int accel_preload(const char *config, bool in_child)
{
zend_file_handle file_handle;
int ret;
@@ -4565,15 +4753,8 @@ static int accel_preload(const char *config, zend_bool in_child)
ZEND_ASSERT(ce->ce_flags & ZEND_ACC_PRELOADED);
if (ce->default_static_members_count) {
zend_cleanup_internal_class_data(ce);
- if (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED) {
- int i;
-
- for (i = 0; i < ce->default_static_members_count; i++) {
- if (Z_TYPE(ce->default_static_members_table[i]) == IS_CONSTANT_AST) {
- ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
- break;
- }
- }
+ if (ce->ce_flags & ZEND_ACC_HAS_AST_STATICS) {
+ ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
}
}
if (ce->ce_flags & ZEND_HAS_STATIC_IN_METHODS) {
@@ -4598,7 +4779,7 @@ static int accel_preload(const char *config, zend_bool in_child)
CG(map_ptr_last) = orig_map_ptr_last;
if (EG(full_tables_cleanup)) {
- zend_accel_error(ACCEL_LOG_FATAL, "Preloading is not compatible with dl() function.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Preloading is not compatible with dl() function.");
ret = FAILURE;
goto finish;
}
@@ -4681,7 +4862,7 @@ static int accel_preload(const char *config, zend_bool in_child)
zend_hash_sort_ex(&script->script.class_table, preload_sort_classes, NULL, 0);
if (preload_optimize(script) != SUCCESS) {
- zend_accel_error(ACCEL_LOG_FATAL, "Optimization error during preloading!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Optimization error during preloading!");
return FAILURE;
}
@@ -4708,8 +4889,6 @@ static int accel_preload(const char *config, zend_bool in_child)
SHM_PROTECT();
HANDLE_UNBLOCK_INTERRUPTIONS();
- ZEND_ASSERT(ZCSG(preload_script)->arena_size == 0);
-
preload_load();
/* Store individual scripts with unlinked classes */
@@ -4780,7 +4959,7 @@ static int accel_finish_startup(void)
if (ZCG(accel_directives).preload && *ZCG(accel_directives).preload) {
#ifdef ZEND_WIN32
- zend_accel_error(ACCEL_LOG_ERROR, "Preloading is not supported on Windows");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Preloading is not supported on Windows");
return FAILURE;
#else
int in_child = 0;
@@ -4798,7 +4977,7 @@ static int accel_finish_startup(void)
size_t (*orig_ub_write)(const char *str, size_t str_length) = sapi_module.ub_write;
void (*orig_flush)(void *server_context) = sapi_module.flush;
#ifdef ZEND_SIGNALS
- zend_bool old_reset_signals = SIGG(reset);
+ bool old_reset_signals = SIGG(reset);
#endif
if (UNEXPECTED(file_cache_only)) {
@@ -4823,21 +5002,21 @@ static int accel_finish_startup(void)
if (!ZCG(accel_directives).preload_user
|| !*ZCG(accel_directives).preload_user) {
zend_shared_alloc_unlock();
- zend_accel_error(ACCEL_LOG_FATAL, "\"opcache.preload_user\" has not been defined");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "\"opcache.preload_user\" has not been defined");
return FAILURE;
}
pw = getpwnam(ZCG(accel_directives).preload_user);
if (pw == NULL) {
zend_shared_alloc_unlock();
- zend_accel_error(ACCEL_LOG_FATAL, "Preloading failed to getpwnam(\"%s\")", ZCG(accel_directives).preload_user);
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Preloading failed to getpwnam(\"%s\")", ZCG(accel_directives).preload_user);
return FAILURE;
}
pid = fork();
if (pid == -1) {
zend_shared_alloc_unlock();
- zend_accel_error(ACCEL_LOG_FATAL, "Preloading failed to fork()");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Preloading failed to fork()");
return FAILURE;
} else if (pid == 0) { /* children */
if (setgid(pw->pw_gid) < 0) {
@@ -4858,7 +5037,7 @@ static int accel_finish_startup(void)
if (waitpid(pid, &status, 0) < 0) {
zend_shared_alloc_unlock();
- zend_accel_error(ACCEL_LOG_FATAL, "Preloading failed to waitpid(%d)", pid);
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Preloading failed to waitpid(%d)", pid);
return FAILURE;
}
@@ -4904,7 +5083,7 @@ static int accel_finish_startup(void)
EG(error_reporting) = orig_error_reporting;
if (rc == SUCCESS) {
- zend_bool orig_report_memleaks;
+ bool orig_report_memleaks;
/* don't send headers */
SG(headers_sent) = 1;
diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h
index b9e3f2a81d..fab1b71666 100644
--- a/ext/opcache/ZendAccelerator.h
+++ b/ext/opcache/ZendAccelerator.h
@@ -121,16 +121,14 @@ typedef struct _zend_persistent_script {
zend_long compiler_halt_offset; /* position of __HALT_COMPILER or -1 */
int ping_auto_globals_mask; /* which autoglobals are used by the script */
accel_time_t timestamp; /* the script modification time */
- zend_bool corrupted;
- zend_bool is_phar;
- zend_bool empty;
+ bool corrupted;
+ bool is_phar;
+ bool empty;
uint32_t num_warnings;
zend_recorded_warning **warnings;
void *mem; /* shared memory area used by script structures */
size_t size; /* size of used shared memory */
- void *arena_mem; /* part that should be copied into process */
- size_t arena_size;
/* All entries that shouldn't be counted in the ADLER32
* checksum must be declared in this struct
@@ -155,18 +153,18 @@ typedef struct _zend_accel_directives {
char *user_blacklist_filename;
zend_long consistency_checks;
zend_long force_restart_timeout;
- zend_bool use_cwd;
- zend_bool ignore_dups;
- zend_bool validate_timestamps;
- zend_bool revalidate_path;
- zend_bool save_comments;
- zend_bool record_warnings;
- zend_bool protect_memory;
- zend_bool file_override_enabled;
- zend_bool enable_cli;
- zend_bool validate_permission;
+ bool use_cwd;
+ bool ignore_dups;
+ bool validate_timestamps;
+ bool revalidate_path;
+ bool save_comments;
+ bool record_warnings;
+ bool protect_memory;
+ bool file_override_enabled;
+ bool enable_cli;
+ bool validate_permission;
#ifndef ZEND_WIN32
- zend_bool validate_root;
+ bool validate_root;
#endif
zend_ulong revalidate_freq;
zend_ulong file_update_protection;
@@ -186,13 +184,13 @@ typedef struct _zend_accel_directives {
char *lockfile_path;
#endif
char *file_cache;
- zend_bool file_cache_only;
- zend_bool file_cache_consistency_checks;
+ bool file_cache_only;
+ bool file_cache_consistency_checks;
#if ENABLE_FILE_CACHE_FALLBACK
- zend_bool file_cache_fallback;
+ bool file_cache_fallback;
#endif
#ifdef HAVE_HUGE_CODE_PAGES
- zend_bool huge_code_pages;
+ bool huge_code_pages;
#endif
char *preload;
#ifndef ZEND_WIN32
@@ -205,11 +203,10 @@ typedef struct _zend_accel_directives {
typedef struct _zend_accel_globals {
int counted; /* the process uses shared memory */
- zend_bool enabled;
- zend_bool locked; /* thread obtained exclusive lock */
- zend_bool accelerator_enabled; /* accelerator enabled for current request */
- zend_bool pcre_reseted;
- HashTable bind_hash; /* prototype and zval lookup table */
+ bool enabled;
+ bool locked; /* thread obtained exclusive lock */
+ bool accelerator_enabled; /* accelerator enabled for current request */
+ bool pcre_reseted;
zend_accel_directives accel_directives;
zend_string *cwd; /* current working directory or NULL */
zend_string *include_path; /* current value of "include_path" directive */
@@ -228,19 +225,17 @@ typedef struct _zend_accel_globals {
#endif
/* preallocated shared-memory block to save current script */
void *mem;
- void *arena_mem;
zend_persistent_script *current_persistent_script;
- zend_bool is_immutable_class;
/* Temporary storage for warnings before they are moved into persistent_script. */
- zend_bool record_warnings;
+ bool record_warnings;
uint32_t num_warnings;
zend_recorded_warning **warnings;
/* cache to save hash lookup on the same INCLUDE opcode */
const zend_op *cache_opline;
zend_persistent_script *cache_persistent_script;
/* preallocated buffer for keys */
- int key_len;
- char key[MAXPATHLEN * 8];
+ zend_string key;
+ char _key[MAXPATHLEN * 8];
} zend_accel_globals;
typedef struct _zend_string_table {
@@ -268,15 +263,15 @@ typedef struct _zend_accel_shared_globals {
time_t start_time;
time_t last_restart_time;
time_t force_restart_time;
- zend_bool accelerator_enabled;
- zend_bool restart_pending;
+ bool accelerator_enabled;
+ bool restart_pending;
zend_accel_restart_reason restart_reason;
- zend_bool cache_status_before_restart;
+ bool cache_status_before_restart;
#ifdef ZEND_WIN32
LONGLONG mem_usage;
LONGLONG restart_in;
#endif
- zend_bool restart_in_progress;
+ bool restart_in_progress;
/* Preloading */
zend_persistent_script *preload_script;
@@ -292,10 +287,10 @@ typedef struct _zend_accel_shared_globals {
#ifdef ZEND_WIN32
extern char accel_uname_id[32];
#endif
-extern zend_bool accel_startup_ok;
-extern zend_bool file_cache_only;
+extern bool accel_startup_ok;
+extern bool file_cache_only;
#if ENABLE_FILE_CACHE_FALLBACK
-extern zend_bool fallback_process;
+extern bool fallback_process;
#endif
extern zend_accel_shared_globals *accel_shared_globals;
@@ -322,11 +317,11 @@ void zend_accel_schedule_restart_if_necessary(zend_accel_restart_reason reason);
accel_time_t zend_get_file_handle_timestamp(zend_file_handle *file_handle, size_t *size);
int validate_timestamp_and_record(zend_persistent_script *persistent_script, zend_file_handle *file_handle);
int validate_timestamp_and_record_ex(zend_persistent_script *persistent_script, zend_file_handle *file_handle);
-int zend_accel_invalidate(const char *filename, size_t filename_len, zend_bool force);
+int zend_accel_invalidate(zend_string *filename, bool force);
int accelerator_shm_read_lock(void);
void accelerator_shm_read_unlock(void);
-char *accel_make_persistent_key(const char *path, size_t path_length, int *key_len);
+zend_string *accel_make_persistent_key(zend_string *path);
zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type);
#define IS_ACCEL_INTERNED(str) \
@@ -334,6 +329,8 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type);
zend_string* ZEND_FASTCALL accel_new_interned_string(zend_string *str);
+uint32_t zend_accel_get_type_map_ptr(zend_string *type_name, zend_class_entry *scope);
+
/* memory write protection */
#define SHM_PROTECT() \
do { \
diff --git a/ext/opcache/config.m4 b/ext/opcache/config.m4
index 993cee855c..7cbf123f4e 100644
--- a/ext/opcache/config.m4
+++ b/ext/opcache/config.m4
@@ -312,31 +312,9 @@ int main() {
shared_alloc_shm.c \
shared_alloc_mmap.c \
shared_alloc_posix.c \
- Optimizer/zend_optimizer.c \
- Optimizer/pass1.c \
- Optimizer/pass3.c \
- Optimizer/optimize_func_calls.c \
- Optimizer/block_pass.c \
- Optimizer/optimize_temp_vars_5.c \
- Optimizer/nop_removal.c \
- Optimizer/compact_literals.c \
- Optimizer/zend_cfg.c \
- Optimizer/zend_dfg.c \
- Optimizer/dfa_pass.c \
- Optimizer/zend_ssa.c \
- Optimizer/zend_inference.c \
- Optimizer/zend_func_info.c \
- Optimizer/zend_call_graph.c \
- Optimizer/sccp.c \
- Optimizer/scdf.c \
- Optimizer/dce.c \
- Optimizer/escape_analysis.c \
- Optimizer/compact_vars.c \
- Optimizer/zend_dump.c \
$ZEND_JIT_SRC,
shared,,-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1,,yes)
- PHP_ADD_BUILD_DIR([$ext_builddir/Optimizer], 1)
PHP_ADD_EXTENSION_DEP(opcache, pcre)
if test "$have_shm_ipc" != "yes" && test "$have_shm_mmap_posix" != "yes" && test "$have_shm_mmap_anon" != "yes"; then
diff --git a/ext/opcache/config.w32 b/ext/opcache/config.w32
index fb921c73da..a7f292ee76 100644
--- a/ext/opcache/config.w32
+++ b/ext/opcache/config.w32
@@ -38,8 +38,6 @@ if (PHP_OPCACHE != "no") {
}
}
- ADD_SOURCES(configure_module_dirname + "/Optimizer", "zend_optimizer.c pass1.c pass3.c optimize_func_calls.c block_pass.c optimize_temp_vars_5.c nop_removal.c compact_literals.c zend_cfg.c zend_dfg.c dfa_pass.c zend_ssa.c zend_inference.c zend_func_info.c zend_call_graph.c zend_dump.c escape_analysis.c compact_vars.c dce.c sccp.c scdf.c", "opcache", "ext\\opcache\\Optimizer");
-
ADD_FLAG('CFLAGS_OPCACHE', "/I " + configure_module_dirname);
}
diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c
index 7513abbf9b..097f4f6acc 100644
--- a/ext/opcache/jit/zend_jit.c
+++ b/ext/opcache/jit/zend_jit.c
@@ -124,14 +124,14 @@ static uint32_t zend_jit_trace_get_exit_point(const zend_op *to_opline, uint32_t
static const void *zend_jit_trace_get_exit_addr(uint32_t n);
static void zend_jit_trace_add_code(const void *start, uint32_t size);
-static zend_bool dominates(const zend_basic_block *blocks, int a, int b) {
+static bool dominates(const zend_basic_block *blocks, int a, int b) {
while (blocks[b].level > blocks[a].level) {
b = blocks[b].idom;
}
return a == b;
}
-static zend_bool zend_ssa_is_last_use(const zend_op_array *op_array, const zend_ssa *ssa, int var, int use)
+static bool zend_ssa_is_last_use(const zend_op_array *op_array, const zend_ssa *ssa, int var, int use)
{
int next_use;
@@ -165,7 +165,7 @@ static zend_bool zend_ssa_is_last_use(const zend_op_array *op_array, const zend_
return 0;
}
-static zend_bool zend_ival_is_last_use(const zend_lifetime_interval *ival, int use)
+static bool zend_ival_is_last_use(const zend_lifetime_interval *ival, int use)
{
if (ival->flags & ZREG_LAST_USE) {
const zend_life_range *range = &ival->range;
@@ -178,7 +178,7 @@ static zend_bool zend_ival_is_last_use(const zend_lifetime_interval *ival, int u
return 0;
}
-static zend_bool zend_is_commutative(zend_uchar opcode)
+static bool zend_is_commutative(zend_uchar opcode)
{
return
opcode == ZEND_ADD ||
@@ -188,7 +188,7 @@ static zend_bool zend_is_commutative(zend_uchar opcode)
opcode == ZEND_BW_XOR;
}
-static zend_bool zend_long_is_power_of_two(zend_long x)
+static bool zend_long_is_power_of_two(zend_long x)
{
return (x > 0) && !(x & (x - 1));
}
@@ -1044,7 +1044,7 @@ static int zend_jit_compute_block_order(zend_ssa *ssa, int *block_order)
return end - block_order;
}
-static zend_bool zend_jit_in_loop(zend_ssa *ssa, int header, zend_basic_block *b)
+static bool zend_jit_in_loop(zend_ssa *ssa, int header, zend_basic_block *b)
{
while (b->loop_header >= 0) {
if (b->loop_header == header) {
@@ -1435,7 +1435,7 @@ static uint32_t zend_interval_end(zend_lifetime_interval *ival)
return range->end;
}
-static zend_bool zend_interval_covers(zend_lifetime_interval *ival, uint32_t position)
+static bool zend_interval_covers(zend_lifetime_interval *ival, uint32_t position)
{
zend_life_range *range = &ival->range;
@@ -1997,7 +1997,7 @@ static zend_lifetime_interval** zend_jit_allocate_registers(const zend_op_array
((intervals[i]->flags & ZREG_LOAD) ||
((intervals[i]->flags & ZREG_STORE) && ssa->vars[i].definition >= 0)) &&
ssa->vars[i].use_chain < 0) {
- zend_bool may_remove = 1;
+ bool may_remove = 1;
zend_ssa_phi *phi = ssa->vars[i].phi_use_chain;
while (phi) {
@@ -2020,7 +2020,7 @@ static zend_lifetime_interval** zend_jit_allocate_registers(const zend_op_array
(intervals[i]->flags & ZREG_STORE) &&
(ssa->vars[i].use_chain < 0 ||
zend_ssa_next_use(ssa->ops, i, ssa->vars[i].use_chain) < 0)) {
- zend_bool may_remove = 1;
+ bool may_remove = 1;
zend_ssa_phi *phi = ssa->vars[i].phi_use_chain;
while (phi) {
@@ -2070,14 +2070,14 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
int call_level = 0;
void *checkpoint = NULL;
zend_lifetime_interval **ra = NULL;
- zend_bool is_terminated = 1; /* previous basic block is terminated by jump */
- zend_bool recv_emitted = 0; /* emitted at least one RECV opcode */
+ bool is_terminated = 1; /* previous basic block is terminated by jump */
+ bool recv_emitted = 0; /* emitted at least one RECV opcode */
zend_uchar smart_branch_opcode;
uint32_t target_label, target_label2;
uint32_t op1_info, op1_def_info, op2_info, res_info, res_use_info;
zend_jit_addr op1_addr, op1_def_addr, op2_addr, op2_def_addr, res_addr;
zend_class_entry *ce;
- zend_bool ce_is_instanceof;
+ bool ce_is_instanceof;
if (JIT_G(bisect_limit)) {
jit_bisect_pos++;
@@ -2962,7 +2962,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
}
} else {
int j;
- zend_bool left_frame = 0;
+ bool left_frame = 0;
if (!zend_jit_return(&dasm_state, opline, op_array,
op1_info, OP1_REG_ADDR())) {
@@ -3240,6 +3240,15 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
goto jit_failure;
}
goto done;
+ case ZEND_COUNT:
+ op1_info = OP1_INFO();
+ if ((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_ARRAY) {
+ break;
+ }
+ if (!zend_jit_count(&dasm_state, opline, op1_info, OP1_REG_ADDR(), zend_may_throw(opline, ssa_op, op_array, ssa))) {
+ goto jit_failure;
+ }
+ goto done;
case ZEND_FETCH_THIS:
if (!zend_jit_fetch_this(&dasm_state, opline, op_array, 0)) {
goto jit_failure;
@@ -3659,7 +3668,7 @@ static void ZEND_FASTCALL zend_runtime_jit(void)
/* JIT-ed code is going to be called by VM */
}
-void zend_jit_check_funcs(HashTable *function_table, zend_bool is_method) {
+void zend_jit_check_funcs(HashTable *function_table, bool is_method) {
zend_op *opline;
zend_function *func;
zend_op_array *op_array;
@@ -4239,7 +4248,7 @@ ZEND_EXT_API int zend_jit_check_support(void)
return SUCCESS;
}
-ZEND_EXT_API int zend_jit_startup(void *buf, size_t size, zend_bool reattached)
+ZEND_EXT_API int zend_jit_startup(void *buf, size_t size, bool reattached)
{
int ret;
diff --git a/ext/opcache/jit/zend_jit.h b/ext/opcache/jit/zend_jit.h
index fffac1edc2..0d71efa470 100644
--- a/ext/opcache/jit/zend_jit.h
+++ b/ext/opcache/jit/zend_jit.h
@@ -81,8 +81,8 @@ typedef struct _zend_jit_trace_stack_frame zend_jit_trace_stack_frame;
typedef struct _sym_node zend_sym_node;
typedef struct _zend_jit_globals {
- zend_bool enabled;
- zend_bool on;
+ bool enabled;
+ bool on;
uint8_t trigger;
uint8_t opt_level;
uint32_t opt_flags;
@@ -108,7 +108,7 @@ typedef struct _zend_jit_globals {
zend_sym_node *symbols; /* symbols for disassembler */
- zend_bool tracing;
+ bool tracing;
zend_jit_trace_rec *current_trace;
zend_jit_trace_stack_frame *current_frame;
@@ -137,7 +137,7 @@ ZEND_EXT_API void zend_jit_init(void);
ZEND_EXT_API int zend_jit_config(zend_string *jit_options, int stage);
ZEND_EXT_API int zend_jit_debug_config(zend_long old_val, zend_long new_val, int stage);
ZEND_EXT_API int zend_jit_check_support(void);
-ZEND_EXT_API int zend_jit_startup(void *jit_buffer, size_t size, zend_bool reattached);
+ZEND_EXT_API int zend_jit_startup(void *jit_buffer, size_t size, bool reattached);
ZEND_EXT_API void zend_jit_shutdown(void);
ZEND_EXT_API void zend_jit_activate(void);
ZEND_EXT_API void zend_jit_deactivate(void);
diff --git a/ext/opcache/jit/zend_jit_disasm_x86.c b/ext/opcache/jit/zend_jit_disasm_x86.c
index 977e85e1cb..6a9892bafc 100644
--- a/ext/opcache/jit/zend_jit_disasm_x86.c
+++ b/ext/opcache/jit/zend_jit_disasm_x86.c
@@ -412,9 +412,7 @@ static int zend_jit_disasm_init(void)
REGISTER_HELPER(zend_jit_leave_func_helper);
REGISTER_HELPER(zend_jit_symtable_find);
REGISTER_HELPER(zend_jit_hash_index_lookup_rw);
- REGISTER_HELPER(zend_jit_hash_index_lookup_w);
REGISTER_HELPER(zend_jit_hash_lookup_rw);
- REGISTER_HELPER(zend_jit_hash_lookup_w);
REGISTER_HELPER(zend_jit_symtable_lookup_rw);
REGISTER_HELPER(zend_jit_symtable_lookup_w);
REGISTER_HELPER(zend_jit_undefined_op_helper);
diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c
index 9fd4bddf15..53e0107bdc 100644
--- a/ext/opcache/jit/zend_jit_helpers.c
+++ b/ext/opcache/jit/zend_jit_helpers.c
@@ -259,31 +259,10 @@ static zval* ZEND_FASTCALL zend_jit_hash_index_lookup_rw(HashTable *ht, zend_lon
return retval;
}
-static zval* ZEND_FASTCALL zend_jit_hash_index_lookup_w(HashTable *ht, zend_long idx)
-{
- zval *retval = _zend_hash_index_find(ht, idx);
-
- if (!retval) {
- retval = zend_hash_index_add_new(ht, idx, &EG(uninitialized_zval));
- }
- return retval;
-}
-
static zval* ZEND_FASTCALL zend_jit_hash_lookup_rw(HashTable *ht, zend_string *str)
{
zval *retval = zend_hash_find_ex(ht, str, 1);
-
- if (retval) {
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
- retval = Z_INDIRECT_P(retval);
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
- if (UNEXPECTED(zend_undefined_index_write(ht, str) == FAILURE)) {
- return NULL;
- }
- ZVAL_NULL(retval);
- }
- }
- } else {
+ if (!retval) {
/* Key may be released while throwing the undefined index warning. */
zend_string_addref(str);
if (UNEXPECTED(zend_undefined_index_write(ht, str) == FAILURE)) {
@@ -296,23 +275,6 @@ static zval* ZEND_FASTCALL zend_jit_hash_lookup_rw(HashTable *ht, zend_string *s
return retval;
}
-static zval* ZEND_FASTCALL zend_jit_hash_lookup_w(HashTable *ht, zend_string *str)
-{
- zval *retval = zend_hash_find_ex(ht, str, 1);
-
- if (retval) {
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
- retval = Z_INDIRECT_P(retval);
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
- ZVAL_NULL(retval);
- }
- }
- } else {
- retval = zend_hash_add_new(ht, str, &EG(uninitialized_zval));
- }
- return retval;
-}
-
static zval* ZEND_FASTCALL zend_jit_symtable_lookup_rw(HashTable *ht, zend_string *str)
{
zend_ulong idx;
@@ -344,17 +306,7 @@ static zval* ZEND_FASTCALL zend_jit_symtable_lookup_rw(HashTable *ht, zend_strin
} while (0);
retval = zend_hash_find(ht, str);
- if (retval) {
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
- retval = Z_INDIRECT_P(retval);
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
- if (UNEXPECTED(zend_undefined_index_write(ht, str) == FAILURE)) {
- return NULL;
- }
- ZVAL_NULL(retval);
- }
- }
- } else {
+ if (!retval) {
/* Key may be released while throwing the undefined index warning. */
zend_string_addref(str);
if (UNEXPECTED(zend_undefined_index_write(ht, str) == FAILURE)) {
@@ -371,7 +323,6 @@ static zval* ZEND_FASTCALL zend_jit_symtable_lookup_w(HashTable *ht, zend_string
{
zend_ulong idx;
register const char *tmp = str->val;
- zval *retval;
do {
if (*tmp > '9') {
@@ -386,26 +337,11 @@ static zval* ZEND_FASTCALL zend_jit_symtable_lookup_w(HashTable *ht, zend_string
}
}
if (_zend_handle_numeric_str_ex(str->val, str->len, &idx)) {
- retval = zend_hash_index_find(ht, idx);
- if (!retval) {
- retval = zend_hash_index_add_new(ht, idx, &EG(uninitialized_zval));
- }
- return retval;
+ return zend_hash_index_lookup(ht, idx);
}
} while (0);
- retval = zend_hash_find(ht, str);
- if (retval) {
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
- retval = Z_INDIRECT_P(retval);
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
- ZVAL_NULL(retval);
- }
- }
- } else {
- retval = zend_hash_add_new(ht, str, &EG(uninitialized_zval));
- }
- return retval;
+ return zend_hash_lookup(ht, str);
}
static int ZEND_FASTCALL zend_jit_undefined_op_helper(uint32_t var)
@@ -482,17 +418,7 @@ str_index:
goto num_index;
}
retval = zend_hash_find(ht, offset_key);
- if (retval) {
- /* support for $GLOBALS[...] */
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
- retval = Z_INDIRECT_P(retval);
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
- zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(offset_key));
- ZVAL_NULL(result);
- return;
- }
- }
- } else {
+ if (!retval) {
zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(offset_key));
ZVAL_NULL(result);
return;
@@ -557,16 +483,7 @@ str_index:
goto num_index;
}
retval = zend_hash_find(ht, offset_key);
- if (retval) {
- /* support for $GLOBALS[...] */
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
- retval = Z_INDIRECT_P(retval);
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
- ZVAL_NULL(result);
- return;
- }
- }
- } else {
+ if (!retval) {
ZVAL_NULL(result);
return;
}
@@ -628,18 +545,13 @@ str_index:
goto num_index;
}
retval = zend_hash_find(ht, offset_key);
- if (retval) {
- /* support for $GLOBALS[...] */
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
- retval = Z_INDIRECT_P(retval);
- }
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_REFERENCE)) {
- retval = Z_REFVAL_P(retval);
- }
- return (Z_TYPE_P(retval) > IS_NULL);
- } else {
+ if (!retval) {
return 0;
}
+ if (UNEXPECTED(Z_TYPE_P(retval) == IS_REFERENCE)) {
+ retval = Z_REFVAL_P(retval);
+ }
+ return Z_TYPE_P(retval) > IS_NULL;
num_index:
ZEND_HASH_INDEX_FIND(ht, hval, retval, num_undef);
@@ -701,18 +613,7 @@ str_index:
goto num_index;
}
retval = zend_hash_find(ht, offset_key);
- if (retval) {
- /* support for $GLOBALS[...] */
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
- retval = Z_INDIRECT_P(retval);
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
- if (UNEXPECTED(zend_undefined_index_write(ht, offset_key) == FAILURE)) {
- return NULL;
- }
- ZVAL_NULL(retval);
- }
- }
- } else {
+ if (!retval) {
/* Key may be released while throwing the undefined index warning. */
zend_string_addref(offset_key);
if (UNEXPECTED(zend_undefined_index_write(ht, offset_key) == FAILURE)) {
@@ -784,26 +685,10 @@ str_index:
if (ZEND_HANDLE_NUMERIC(offset_key, hval)) {
goto num_index;
}
- retval = zend_hash_find(ht, offset_key);
- if (retval) {
- /* support for $GLOBALS[...] */
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
- retval = Z_INDIRECT_P(retval);
- if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
- ZVAL_NULL(retval);
- }
- }
- } else {
- retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval));
- }
- return retval;
+ return zend_hash_lookup(ht, offset_key);
num_index:
- ZEND_HASH_INDEX_FIND(ht, hval, retval, num_undef);
- return retval;
-
-num_undef:
- retval = zend_hash_index_add_new(ht, hval, &EG(uninitialized_zval));
+ ZEND_HASH_INDEX_LOOKUP(ht, hval, retval);
return retval;
}
@@ -1452,7 +1337,7 @@ check_indirect:
return ref;
}
-static zend_always_inline zend_bool zend_jit_verify_type_common(zval *arg, zend_arg_info *arg_info, void **cache_slot)
+static zend_always_inline bool zend_jit_verify_type_common(zval *arg, zend_arg_info *arg_info, void **cache_slot)
{
uint32_t type_mask;
@@ -1463,14 +1348,20 @@ static zend_always_inline zend_bool zend_jit_verify_type_common(zval *arg, zend_
ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(arg_info->type), list_type) {
if (*cache_slot) {
ce = *cache_slot;
+ } else if (ZEND_TYPE_HAS_CE_CACHE(*list_type) && ZEND_TYPE_CE_CACHE(*list_type)) {
+ ce = ZEND_TYPE_CE_CACHE(*list_type);
+ *cache_slot = ce;
} else {
ce = zend_fetch_class(ZEND_TYPE_NAME(*list_type),
- (ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD));
+ ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
if (!ce) {
cache_slot++;
continue;
}
*cache_slot = ce;
+ if (ZEND_TYPE_HAS_CE_CACHE(*list_type)) {
+ ZEND_TYPE_SET_CE_CACHE(*list_type, ce);
+ }
}
if (instanceof_function(Z_OBJCE_P(arg), ce)) {
return 1;
@@ -1480,12 +1371,19 @@ static zend_always_inline zend_bool zend_jit_verify_type_common(zval *arg, zend_
} else {
if (EXPECTED(*cache_slot)) {
ce = (zend_class_entry *) *cache_slot;
+ } else if (ZEND_TYPE_HAS_CE_CACHE(arg_info->type) && ZEND_TYPE_CE_CACHE(arg_info->type)) {
+ ce = ZEND_TYPE_CE_CACHE(arg_info->type);
+ *cache_slot = ce;
} else {
- ce = zend_fetch_class(ZEND_TYPE_NAME(arg_info->type), (ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD));
+ ce = zend_fetch_class(ZEND_TYPE_NAME(arg_info->type),
+ ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT);
if (UNEXPECTED(!ce)) {
goto builtin_types;
}
*cache_slot = (void *) ce;
+ if (ZEND_TYPE_HAS_CE_CACHE(arg_info->type)) {
+ ZEND_TYPE_SET_CE_CACHE(arg_info->type, ce);
+ }
}
if (instanceof_function(Z_OBJCE_P(arg), ce)) {
return 1;
@@ -1510,12 +1408,12 @@ builtin_types:
return 0;
}
-static zend_bool ZEND_FASTCALL zend_jit_verify_arg_slow(zval *arg, zend_arg_info *arg_info)
+static bool ZEND_FASTCALL zend_jit_verify_arg_slow(zval *arg, zend_arg_info *arg_info)
{
zend_execute_data *execute_data = EG(current_execute_data);
const zend_op *opline = EX(opline);
void **cache_slot = CACHE_ADDR(opline->extended_value);
- zend_bool ret;
+ bool ret;
ret = zend_jit_verify_type_common(arg, arg_info, cache_slot);
if (UNEXPECTED(!ret)) {
@@ -1648,12 +1546,12 @@ static void ZEND_FASTCALL zend_jit_fetch_obj_is_dynamic(zend_object *zobj, intpt
zend_jit_fetch_obj_is_slow(zobj);
}
-static zend_always_inline zend_bool promotes_to_array(zval *val) {
+static zend_always_inline bool promotes_to_array(zval *val) {
return Z_TYPE_P(val) <= IS_FALSE
|| (Z_ISREF_P(val) && Z_TYPE_P(Z_REFVAL_P(val)) <= IS_FALSE);
}
-static zend_always_inline zend_bool check_type_array_assignable(zend_type type) {
+static zend_always_inline bool check_type_array_assignable(zend_type type) {
if (!ZEND_TYPE_IS_SET(type)) {
return 1;
}
@@ -1695,7 +1593,7 @@ static zend_never_inline ZEND_COLD void zend_throw_access_uninit_prop_by_ref_err
zend_get_unmangled_property_name(prop->name));
}
-static zend_never_inline zend_bool zend_handle_fetch_obj_flags(
+static zend_never_inline bool zend_handle_fetch_obj_flags(
zval *result, zval *ptr, zend_object *obj, zend_property_info *prop_info, uint32_t flags)
{
switch (flags) {
@@ -1878,7 +1776,7 @@ static zend_property_info *zend_jit_get_prop_not_accepting_double(zend_reference
return NULL;
}
-static ZEND_COLD void zend_jit_throw_incdec_ref_error(zend_reference *ref, zend_bool inc)
+static ZEND_COLD void zend_jit_throw_incdec_ref_error(zend_reference *ref, bool inc)
{
zend_property_info *error_prop = zend_jit_get_prop_not_accepting_double(ref);
/* Currently there should be no way for a typed reference to accept both int and double.
diff --git a/ext/opcache/jit/zend_jit_internal.h b/ext/opcache/jit/zend_jit_internal.h
index 917fa10f2e..906262773f 100644
--- a/ext/opcache/jit/zend_jit_internal.h
+++ b/ext/opcache/jit/zend_jit_internal.h
@@ -128,7 +128,7 @@ ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_func_counter_helper(ZEND_OPCODE_H
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_loop_counter_helper(ZEND_OPCODE_HANDLER_ARGS);
void ZEND_FASTCALL zend_jit_copy_extra_args_helper(EXECUTE_DATA_D);
-zend_bool ZEND_FASTCALL zend_jit_deprecated_helper(OPLINE_D);
+bool ZEND_FASTCALL zend_jit_deprecated_helper(OPLINE_D);
zend_constant* ZEND_FASTCALL zend_jit_get_constant(const zval *key, uint32_t flags);
zend_constant* ZEND_FASTCALL zend_jit_check_constant(const zval *key);
@@ -484,7 +484,7 @@ int ZEND_FASTCALL zend_jit_trace_hot_root(zend_execute_data *execute_data, const
int ZEND_FASTCALL zend_jit_trace_exit(uint32_t exit_num, zend_jit_registers_buf *regs);
zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *execute_data, const zend_op *opline, zend_jit_trace_rec *trace_buffer, uint8_t start, uint32_t is_megamorphc);
-static zend_always_inline const zend_op* zend_jit_trace_get_exit_opline(zend_jit_trace_rec *trace, const zend_op *opline, zend_bool *exit_if_true)
+static zend_always_inline const zend_op* zend_jit_trace_get_exit_opline(zend_jit_trace_rec *trace, const zend_op *opline, bool *exit_if_true)
{
if (trace->op == ZEND_JIT_TRACE_VM || trace->op == ZEND_JIT_TRACE_END) {
if (trace->opline == opline + 1) {
@@ -505,7 +505,7 @@ static zend_always_inline const zend_op* zend_jit_trace_get_exit_opline(zend_jit
return NULL;
}
-static zend_always_inline zend_bool zend_jit_may_be_polymorphic_call(const zend_op *opline)
+static zend_always_inline bool zend_jit_may_be_polymorphic_call(const zend_op *opline)
{
if (opline->opcode == ZEND_INIT_FCALL
|| opline->opcode == ZEND_INIT_FCALL_BY_NAME
diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c
index 8353c3cec0..80ce45605e 100644
--- a/ext/opcache/jit/zend_jit_trace.c
+++ b/ext/opcache/jit/zend_jit_trace.c
@@ -1581,6 +1581,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
/* break missing intentionally */
case ZEND_ECHO:
case ZEND_STRLEN:
+ case ZEND_COUNT:
case ZEND_QM_ASSIGN:
case ZEND_FE_RESET_R:
case ZEND_FE_FETCH_R:
@@ -2423,7 +2424,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
if (p->op == ZEND_JIT_TRACE_VM) {
const zend_op *opline = p->opline;
int len;
- zend_bool support_opline;
+ bool support_opline;
support_opline =
zend_jit_opline_supports_reg(op_array, ssa, opline, ssa_op, p);
@@ -3085,7 +3086,7 @@ static void zend_jit_trace_setup_ret_counter(const zend_op *opline, size_t offse
}
}
-static zend_bool zend_jit_may_delay_fetch_this(zend_ssa *ssa, const zend_op **ssa_opcodes, int var)
+static bool zend_jit_may_delay_fetch_this(zend_ssa *ssa, const zend_op **ssa_opcodes, int var)
{
int i;
int use = ssa->vars[var].use_chain;
@@ -3176,11 +3177,11 @@ static int zend_jit_trace_deoptimization(dasm_State **Dst,
zend_ssa *ssa,
zend_jit_trace_stack *stack,
zend_lifetime_interval **ra,
- zend_bool polymorphic_side_trace)
+ bool polymorphic_side_trace)
{
int i;
- zend_bool has_constants = 0;
- zend_bool has_unsaved_vars = 0;
+ bool has_constants = 0;
+ bool has_unsaved_vars = 0;
// TODO: Merge this loop with the following register LOAD loop to implement parallel move ???
for (i = 0; i < parent_vars_count; i++) {
@@ -3317,7 +3318,7 @@ static void zend_jit_trace_set_var_range(zend_ssa_var_info *info, zend_long min,
info->range.overflow = 0;
}
-static void zend_jit_trace_update_condition_ranges(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, zend_bool exit_if_true)
+static void zend_jit_trace_update_condition_ranges(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, bool exit_if_true)
{
zend_long op1_min, op1_max, op2_min, op2_max;
@@ -3435,7 +3436,7 @@ static void zend_jit_trace_update_condition_ranges(const zend_op *opline, const
}
}
-static zend_bool zend_jit_may_skip_comparison(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_ssa *ssa, const zend_op **ssa_opcodes)
+static bool zend_jit_may_skip_comparison(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_ssa *ssa, const zend_op **ssa_opcodes)
{
zend_uchar prev_opcode;
@@ -3537,14 +3538,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
zend_uchar smart_branch_opcode;
const void *exit_addr;
uint32_t op1_info, op1_def_info, op2_info, res_info, res_use_info, op1_data_info;
- zend_bool send_result = 0;
- zend_bool skip_comparison;
+ bool send_result = 0;
+ bool skip_comparison;
zend_jit_addr op1_addr, op1_def_addr, op2_addr, op2_def_addr, res_addr;
zend_class_entry *ce;
- zend_bool ce_is_instanceof;
- zend_bool delayed_fetch_this = 0;
- zend_bool avoid_refcounting = 0;
- zend_bool polymorphic_side_trace =
+ bool ce_is_instanceof;
+ bool delayed_fetch_this = 0;
+ bool avoid_refcounting = 0;
+ bool polymorphic_side_trace =
parent_trace &&
(zend_jit_traces[parent_trace].exit_info[exit_num].flags & ZEND_JIT_EXIT_METHOD_CALL);
uint32_t i;
@@ -3817,7 +3818,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
uint8_t op3_type = p->op3_type;
uint8_t orig_op1_type = op1_type;
uint8_t orig_op2_type = op2_type;
- zend_bool op1_indirect;
+ bool op1_indirect;
zend_class_entry *op1_ce = NULL;
zend_class_entry *op2_ce = NULL;
@@ -4788,7 +4789,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
CHECK_OP1_TRACE_TYPE();
CHECK_OP2_TRACE_TYPE();
if ((opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
- zend_bool exit_if_true = 0;
+ bool exit_if_true = 0;
const zend_op *exit_opline = zend_jit_trace_get_exit_opline(p + 1, opline + 1, &exit_if_true);
uint32_t exit_point;
@@ -4836,7 +4837,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
CHECK_OP1_TRACE_TYPE();
CHECK_OP2_TRACE_TYPE();
if ((opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
- zend_bool exit_if_true = 0;
+ bool exit_if_true = 0;
const zend_op *exit_opline = zend_jit_trace_get_exit_opline(p + 1, opline + 1, &exit_if_true);
uint32_t exit_point;
@@ -4876,7 +4877,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
goto done;
case ZEND_DEFINED:
if ((opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
- zend_bool exit_if_true = 0;
+ bool exit_if_true = 0;
const zend_op *exit_opline = zend_jit_trace_get_exit_opline(p + 1, opline + 1, &exit_if_true);
uint32_t exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
@@ -4900,7 +4901,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
}
op1_info = OP1_INFO();
if ((opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
- zend_bool exit_if_true = 0;
+ bool exit_if_true = 0;
const zend_op *exit_opline = zend_jit_trace_get_exit_opline(p + 1, opline + 1, &exit_if_true);
uint32_t exit_point;
@@ -4940,7 +4941,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
} else {
int j;
int may_throw = 0;
- zend_bool left_frame = 0;
+ bool left_frame = 0;
if (!zend_jit_return(&dasm_state, opline, op_array,
op1_info, OP1_REG_ADDR())) {
@@ -5096,7 +5097,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
CHECK_OP1_TRACE_TYPE();
}
if ((opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
- zend_bool exit_if_true = 0;
+ bool exit_if_true = 0;
const zend_op *exit_opline = zend_jit_trace_get_exit_opline(p + 1, opline + 1, &exit_if_true);
uint32_t exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
@@ -5126,7 +5127,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
break;
}
if ((opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
- zend_bool exit_if_true = 0;
+ bool exit_if_true = 0;
const zend_op *exit_opline = zend_jit_trace_get_exit_opline(p + 1, opline + 1, &exit_if_true);
uint32_t exit_point = zend_jit_trace_get_exit_point(exit_opline, 0);
@@ -5289,7 +5290,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
op2_info = OP2_INFO();
CHECK_OP2_TRACE_TYPE();
if ((opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
- zend_bool exit_if_true = 0;
+ bool exit_if_true = 0;
const zend_op *exit_opline = zend_jit_trace_get_exit_opline(p + 1, opline + 1, &exit_if_true);
uint32_t exit_point;
@@ -5512,6 +5513,28 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
goto jit_failure;
}
goto done;
+ case ZEND_COUNT:
+ op1_info = OP1_INFO();
+ op1_addr = OP1_REG_ADDR();
+ if (orig_op1_type == (IS_TRACE_REFERENCE|IS_ARRAY)) {
+ if (!zend_jit_fetch_reference(&dasm_state, opline, orig_op1_type, &op1_info, &op1_addr,
+ !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) {
+ goto jit_failure;
+ }
+ if (opline->op1_type == IS_CV
+ && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) {
+ ssa->var_info[ssa_op->op1_use].guarded_reference = 1;
+ }
+ } else {
+ CHECK_OP1_TRACE_TYPE();
+ if ((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_ARRAY) {
+ break;
+ }
+ }
+ if (!zend_jit_count(&dasm_state, opline, op1_info, op1_addr, zend_may_throw(opline, ssa_op, op_array, ssa))) {
+ goto jit_failure;
+ }
+ goto done;
case ZEND_FETCH_THIS:
delayed_fetch_this = 0;
if (ssa_op->result_def >= 0 && opline->result_type != IS_CV) {
@@ -6184,7 +6207,8 @@ done:
zend_call_info *call_info = jit_extension->func_info.callee_info;
while (call_info) {
- if (call_info->caller_init_opline == init_opline) {
+ if (call_info->caller_init_opline == init_opline
+ && !call_info->is_prototype) {
if (op_array->fn_flags & ZEND_ACC_TRAIT_CLONE) {
if (init_opline->opcode == ZEND_INIT_STATIC_METHOD_CALL
&& init_opline->op1_type != IS_CONST) {
@@ -6423,7 +6447,7 @@ static const void *zend_jit_trace_exit_to_vm(uint32_t trace_num, uint32_t exit_n
const zend_op *opline;
uint32_t stack_size;
zend_jit_trace_stack *stack;
- zend_bool original_handler = 0;
+ bool original_handler = 0;
if (!zend_jit_trace_exit_needs_deoptimization(trace_num, exit_num)) {
return dasm_labels[zend_lbtrace_escape];
@@ -6604,7 +6628,7 @@ static void zend_jit_blacklist_root_trace(const zend_op *opline, size_t offset)
zend_shared_alloc_unlock();
}
-static zend_bool zend_jit_trace_is_bad_root(const zend_op *opline, zend_jit_trace_stop stop, size_t offset)
+static bool zend_jit_trace_is_bad_root(const zend_op *opline, zend_jit_trace_stop stop, size_t offset)
{
const zend_op **cache_opline = JIT_G(bad_root_cache_opline);
uint8_t *cache_count = JIT_G(bad_root_cache_count);
@@ -7069,7 +7093,7 @@ static void zend_jit_blacklist_trace_exit(uint32_t trace_num, uint32_t exit_num)
zend_shared_alloc_unlock();
}
-static zend_bool zend_jit_trace_exit_is_bad(uint32_t trace_num, uint32_t exit_num)
+static bool zend_jit_trace_exit_is_bad(uint32_t trace_num, uint32_t exit_num)
{
uint8_t *counter = JIT_G(exit_counters) +
zend_jit_traces[trace_num].exit_counters + exit_num;
@@ -7081,7 +7105,7 @@ static zend_bool zend_jit_trace_exit_is_bad(uint32_t trace_num, uint32_t exit_nu
return 0;
}
-static zend_bool zend_jit_trace_exit_is_hot(uint32_t trace_num, uint32_t exit_num)
+static bool zend_jit_trace_exit_is_hot(uint32_t trace_num, uint32_t exit_num)
{
uint8_t *counter = JIT_G(exit_counters) +
zend_jit_traces[trace_num].exit_counters + exit_num;
diff --git a/ext/opcache/jit/zend_jit_vm_helpers.c b/ext/opcache/jit/zend_jit_vm_helpers.c
index d919b59c9e..9a7b205340 100644
--- a/ext/opcache/jit/zend_jit_vm_helpers.c
+++ b/ext/opcache/jit/zend_jit_vm_helpers.c
@@ -161,7 +161,7 @@ void ZEND_FASTCALL zend_jit_copy_extra_args_helper(EXECUTE_DATA_D)
}
}
-zend_bool ZEND_FASTCALL zend_jit_deprecated_helper(OPLINE_D)
+bool ZEND_FASTCALL zend_jit_deprecated_helper(OPLINE_D)
{
zend_execute_data *call = (zend_execute_data *) opline;
zend_function *fbc = call->func;
diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc
index 3b96db9361..73f97be95b 100644
--- a/ext/opcache/jit/zend_jit_x86.dasc
+++ b/ext/opcache/jit/zend_jit_x86.dasc
@@ -1628,12 +1628,12 @@ static void* dasm_labels[zend_lb_MAX];
|| }
|.endmacro
-static zend_bool reuse_ip = 0;
-static zend_bool delayed_call_chain = 0;
+static bool reuse_ip = 0;
+static bool delayed_call_chain = 0;
static uint32_t delayed_call_level = 0;
static const zend_op *last_valid_opline = NULL;
-static zend_bool use_last_vald_opline = 0;
-static zend_bool track_last_valid_opline = 0;
+static bool use_last_vald_opline = 0;
+static bool track_last_valid_opline = 0;
static int jit_return_label = -1;
static uint32_t current_trace_num = 0;
static uint32_t allowed_opt_flags = 0;
@@ -1652,7 +1652,7 @@ static void zend_jit_use_last_valid_opline(void)
}
}
-static zend_bool zend_jit_trace_uses_initial_ip(void)
+static bool zend_jit_trace_uses_initial_ip(void)
{
return use_last_vald_opline;
}
@@ -1716,12 +1716,12 @@ static uint32_t floor_log2(uint32_t x)
return ones32(x) - 1;
}
-static zend_bool is_power_of_two(uint32_t x)
+static bool is_power_of_two(uint32_t x)
{
return !(x & (x - 1)) && x != 0;
}
-static zend_bool has_concrete_type(uint32_t value_type)
+static bool has_concrete_type(uint32_t value_type)
{
return is_power_of_two (value_type & (MAY_BE_ANY|MAY_BE_UNDEF));
}
@@ -1731,7 +1731,7 @@ static uint32_t concrete_type(uint32_t value_type)
return floor_log2(value_type & (MAY_BE_ANY|MAY_BE_UNDEF));
}
-static inline zend_bool is_signed(double d)
+static inline bool is_signed(double d)
{
return (((unsigned char*)&d)[sizeof(double)-1] & 0x80) != 0;
}
@@ -2651,7 +2651,7 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
zend_jit_addr val_addr,
uint32_t val_info,
zend_jit_addr res_addr,
- zend_bool check_exception);
+ bool check_exception);
static int zend_jit_assign_const_stub(dasm_State **Dst)
{
@@ -3397,7 +3397,7 @@ static int zend_jit_trace_link_to_root(dasm_State **Dst, zend_jit_trace_info *t,
return 1;
}
-static int zend_jit_trace_return(dasm_State **Dst, zend_bool original_handler)
+static int zend_jit_trace_return(dasm_State **Dst, bool original_handler)
{
#if 0
| jmp ->trace_escape
@@ -3549,7 +3549,7 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
zend_jit_trace_stack *stack = JIT_G(current_frame)->stack;
if (zend_is_smart_branch(opline)) {
- zend_bool exit_if_true = 0;
+ bool exit_if_true = 0;
exit_opline = zend_jit_trace_get_exit_opline(trace, opline + 1, &exit_if_true);
} else {
switch (opline->opcode) {
@@ -3756,7 +3756,7 @@ static int zend_jit_call(dasm_State **Dst, const zend_op *opline, unsigned int n
#endif
}
-static int zend_jit_spill_store(dasm_State **Dst, zend_jit_addr src, zend_jit_addr dst, uint32_t info, zend_bool set_type)
+static int zend_jit_spill_store(dasm_State **Dst, zend_jit_addr src, zend_jit_addr dst, uint32_t info, bool set_type)
{
ZEND_ASSERT(Z_MODE(src) == IS_REG);
ZEND_ASSERT(Z_MODE(dst) == IS_MEM_ZVAL);
@@ -3792,7 +3792,7 @@ static int zend_jit_load_reg(dasm_State **Dst, zend_jit_addr src, zend_jit_addr
return 1;
}
-static int zend_jit_store_var(dasm_State **Dst, uint32_t info, int var, zend_reg reg, zend_bool set_type)
+static int zend_jit_store_var(dasm_State **Dst, uint32_t info, int var, zend_reg reg, bool set_type)
{
zend_jit_addr src = ZEND_ADDR_REG(reg);
zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, EX_NUM_TO_VAR(var));
@@ -3813,7 +3813,7 @@ static int zend_jit_store_var_if_necessary_ex(dasm_State **Dst, int var, zend_ji
{
if (Z_MODE(src) == IS_REG && Z_STORE(src)) {
zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, var);
- zend_bool set_type = 1;
+ bool set_type = 1;
if ((info & (MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF)) ==
(old_info & (MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF))) {
@@ -4210,7 +4210,7 @@ static int zend_jit_math_long_long(dasm_State **Dst,
uint32_t res_use_info,
int may_overflow)
{
- zend_bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
+ bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
zend_reg result_reg;
zend_reg tmp_reg = ZREG_R0;
@@ -4530,7 +4530,7 @@ static int zend_jit_math_double_double(dasm_State **Dst,
zend_jit_addr res_addr,
uint32_t res_use_info)
{
- zend_bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
+ bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
zend_reg result_reg;
if (Z_MODE(res_addr) == IS_REG) {
@@ -4621,7 +4621,7 @@ static int zend_jit_math_helper(dasm_State **Dst,
int may_throw)
/* Labels: 1,2,3,4,5,6 */
{
- zend_bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
+ bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
if ((op1_info & MAY_BE_LONG) && (op2_info & MAY_BE_LONG)) {
if (op1_info & (MAY_BE_ANY-MAY_BE_LONG)) {
@@ -4874,7 +4874,7 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
int may_throw)
/* Labels: 6 */
{
- zend_bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
+ bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
zend_reg result_reg;
zval tmp;
@@ -5299,8 +5299,8 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
}
if (op2_info & MAY_BE_LONG) {
- zend_bool op2_loaded = 0;
- zend_bool packed_loaded = 0;
+ bool op2_loaded = 0;
+ bool packed_loaded = 0;
if (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_LONG)) {
| // if (EXPECTED(Z_TYPE_P(dim) == IS_LONG))
@@ -5546,7 +5546,7 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
| // hval = Z_LVAL_P(dim);
| GET_ZVAL_LVAL ZREG_FCARG2a, op2_addr
}
- | EXT_CALL zend_jit_hash_index_lookup_w, r0
+ | EXT_CALL zend_hash_index_lookup, r0
}
break;
default:
@@ -5588,10 +5588,6 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
} else {
| jz >9 // NOT_FOUND
}
- | // if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT))
- | IF_NOT_Z_TYPE r0, IS_INDIRECT, >1
- | GET_Z_PTR r0, r0
- |1:
break;
case BP_VAR_R:
case BP_VAR_IS:
@@ -5618,40 +5614,25 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
| jz >7 // NOT_FOUND
} else {
| jz >2 // NOT_FOUND
- }
- | // if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT))
- | IF_Z_TYPE r0, IS_INDIRECT, >1 // SLOW
- |.cold_code
- |1:
- | // retval = Z_INDIRECT_P(retval);
- | GET_Z_PTR r0, r0
- | IF_NOT_Z_TYPE r0, IS_UNDEF, >8
- if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && type == BP_VAR_R) {
- | jmp &exit_addr
- } else if (type == BP_VAR_IS && not_found_exit_addr) {
- | jmp &not_found_exit_addr
- }
- |2:
- switch (type) {
- case BP_VAR_R:
- if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) {
+ |.cold_code
+ |2:
+ switch (type) {
+ case BP_VAR_R:
// zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(offset_key));
| UNDEFINED_INDEX opline
| jmp >9
- }
- break;
- case BP_VAR_IS:
- case BP_VAR_UNSET:
- if (!not_found_exit_addr && !found_exit_addr) {
+ break;
+ case BP_VAR_IS:
+ case BP_VAR_UNSET:
| // retval = &EG(uninitialized_zval);
| SET_ZVAL_TYPE_INFO res_addr, IS_NULL
| jmp >9
- }
- break;
- default:
- ZEND_UNREACHABLE();
+ break;
+ default:
+ ZEND_UNREACHABLE();
+ }
+ |.code
}
- |.code
break;
case BP_VAR_RW:
| SET_EX_OPLINE opline, r0
@@ -5667,7 +5648,7 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
if (opline->op2_type != IS_CONST) {
| EXT_CALL zend_jit_symtable_lookup_w, r0
} else {
- | EXT_CALL zend_jit_hash_lookup_w, r0
+ | EXT_CALL zend_hash_lookup, r0
}
break;
default:
@@ -5920,7 +5901,7 @@ static int zend_jit_assign_to_typed_ref(dasm_State **Dst,
const zend_op *opline,
zend_uchar val_type,
zend_jit_addr val_addr,
- zend_bool check_exception)
+ bool check_exception)
{
| // if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) {
| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0
@@ -5967,7 +5948,7 @@ static int zend_jit_assign_to_variable_call(dasm_State **Dst,
zend_jit_addr val_addr,
uint32_t val_info,
zend_jit_addr __res_addr,
- zend_bool __check_exception)
+ bool __check_exception)
{
if (Z_MODE(var_addr) != IS_MEM_ZVAL || Z_REG(var_addr) != ZREG_FCARG1a || Z_OFFSET(var_addr) != 0) {
| LOAD_ZVAL_ADDR FCARG1a, var_addr
@@ -6013,7 +5994,7 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
zend_jit_addr val_addr,
uint32_t val_info,
zend_jit_addr res_addr,
- zend_bool check_exception)
+ bool check_exception)
/* Labels: 1,2,3,4,5,8 */
{
int done = 0;
@@ -6054,7 +6035,7 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
in_cold = 1;
}
if (Z_REG(var_use_addr) == ZREG_FCARG1a || Z_REG(var_use_addr) == ZREG_R0) {
- zend_bool keep_gc = 0;
+ bool keep_gc = 0;
| GET_ZVAL_PTR Ra(tmp_reg), var_use_addr
if (tmp_reg == ZREG_FCARG1a) {
@@ -6677,7 +6658,7 @@ static int zend_jit_is_constant_cmp_long_long(const zend_op *opline,
zend_jit_addr op1_addr,
zend_ssa_range *op2_range,
zend_jit_addr op2_addr,
- zend_bool *result)
+ bool *result)
{
zend_long op1_min;
zend_long op1_max;
@@ -6762,10 +6743,10 @@ static int zend_jit_cmp_long_long(dasm_State **Dst,
uint32_t target_label,
uint32_t target_label2,
const void *exit_addr,
- zend_bool skip_comparison)
+ bool skip_comparison)
{
- zend_bool swap = 0;
- zend_bool result;
+ bool swap = 0;
+ bool result;
if (zend_jit_is_constant_cmp_long_long(opline, op1_range, op1_addr, op2_range, op2_addr, &result)) {
if (!smart_branch_opcode ||
@@ -7056,7 +7037,7 @@ static int zend_jit_cmp_long_long(dasm_State **Dst,
return 1;
}
-static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, zend_jit_addr res_addr, zend_bool swap, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
+static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, zend_jit_addr res_addr, bool swap, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
{
if (smart_branch_opcode) {
if (smart_branch_opcode == ZEND_JMPZ) {
@@ -7415,7 +7396,7 @@ static int zend_jit_cmp_double_long(dasm_State **Dst, const zend_op *opline, zen
static int zend_jit_cmp_double_double(dasm_State **Dst, const zend_op *opline, zend_jit_addr op1_addr, zend_jit_addr op2_addr, zend_jit_addr res_addr, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
{
- zend_bool swap = 0;
+ bool swap = 0;
if (Z_MODE(op1_addr) == IS_REG) {
| SSE_AVX_OP ucomisd, vucomisd, Z_REG(op1_addr), op2_addr
@@ -7591,10 +7572,10 @@ static int zend_jit_cmp(dasm_State **Dst,
uint32_t target_label,
uint32_t target_label2,
const void *exit_addr,
- zend_bool skip_comparison)
+ bool skip_comparison)
{
- zend_bool same_ops = (opline->op1_type == opline->op2_type) && (opline->op1.var == opline->op2.var);
- zend_bool has_slow;
+ bool same_ops = (opline->op1_type == opline->op2_type) && (opline->op1.var == opline->op2.var);
+ bool has_slow;
has_slow =
(op1_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) &&
@@ -7830,7 +7811,7 @@ static int zend_jit_identical(dasm_State **Dst,
uint32_t target_label,
uint32_t target_label2,
const void *exit_addr,
- zend_bool skip_comparison)
+ bool skip_comparison)
{
uint32_t identical_label = (uint32_t)-1;
uint32_t not_identical_label = (uint32_t)-1;
@@ -8206,10 +8187,10 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_
{
uint32_t true_label = -1;
uint32_t false_label = -1;
- zend_bool set_bool = 0;
- zend_bool set_bool_not = 0;
- zend_bool set_delayed = 0;
- zend_bool jmp_done = 0;
+ bool set_bool = 0;
+ bool set_bool_not = 0;
+ bool set_delayed = 0;
+ bool jmp_done = 0;
if (branch_opcode == ZEND_BOOL) {
set_bool = 1;
@@ -8750,7 +8731,7 @@ static int zend_jit_stack_check(dasm_State **Dst, const zend_op *opline, uint32_
return 1;
}
-static int zend_jit_push_call_frame(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_function *func, zend_bool is_closure, zend_bool use_this, zend_bool stack_check)
+static int zend_jit_push_call_frame(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_function *func, bool is_closure, bool use_this, bool stack_check)
{
uint32_t used_stack;
@@ -9188,7 +9169,7 @@ static int zend_jit_init_fcall_guard(dasm_State **Dst, uint32_t level, const zen
return 1;
}
-static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t b, const zend_op_array *op_array, zend_ssa *ssa, const zend_ssa_op *ssa_op, int call_level, zend_jit_trace_rec *trace, zend_bool stack_check)
+static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t b, const zend_op_array *op_array, zend_ssa *ssa, const zend_ssa_op *ssa_op, int call_level, zend_jit_trace_rec *trace, bool stack_check)
{
zend_func_info *info = ZEND_FUNC_INFO(op_array);
zend_call_info *call_info = NULL;
@@ -9205,7 +9186,7 @@ static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t
while (call_info && call_info->caller_init_opline != opline) {
call_info = call_info->next_callee;
}
- if (call_info && call_info->callee_func) {
+ if (call_info && call_info->callee_func && !call_info->is_prototype) {
func = call_info->callee_func;
}
}
@@ -9232,7 +9213,7 @@ static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t
#endif
/* load constant address later */
} else if (func && op_array == &func->op_array) {
- /* recursive call */
+ /* recursive call */
if (!(func->op_array.fn_flags & ZEND_ACC_IMMUTABLE) ||
(sizeof(void*) == 8 && !IS_SIGNED_32BIT(func))) {
| mov r0, EX->func
@@ -9350,12 +9331,12 @@ static int zend_jit_init_method_call(dasm_State **Dst,
uint32_t op1_info,
zend_jit_addr op1_addr,
zend_class_entry *ce,
- zend_bool ce_is_instanceof,
- zend_bool use_this,
+ bool ce_is_instanceof,
+ bool use_this,
zend_class_entry *trace_ce,
zend_jit_trace_rec *trace,
- zend_bool stack_check,
- zend_bool polymorphic_side_trace)
+ bool stack_check,
+ bool polymorphic_side_trace)
{
zend_func_info *info = ZEND_FUNC_INFO(op_array);
zend_call_info *call_info = NULL;
@@ -9372,7 +9353,7 @@ static int zend_jit_init_method_call(dasm_State **Dst,
while (call_info && call_info->caller_init_opline != opline) {
call_info = call_info->next_callee;
}
- if (call_info && call_info->callee_func) {
+ if (call_info && call_info->callee_func && !call_info->is_prototype) {
func = call_info->callee_func;
}
}
@@ -9599,7 +9580,7 @@ static int zend_jit_init_closure_call(dasm_State **Dst,
const zend_ssa_op *ssa_op,
int call_level,
zend_jit_trace_rec *trace,
- zend_bool stack_check)
+ bool stack_check)
{
zend_function *func = NULL;
zend_jit_addr op2_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var);
@@ -9697,6 +9678,8 @@ static uint32_t skip_valid_arguments(const zend_op_array *op_array, zend_ssa *ss
uint32_t num_args = 0;
zend_function *func = call_info->callee_func;
+ /* It's okay to handle prototypes here, because they can only increase the accepted arguments.
+ * Anything legal for the parent method is also legal for the parent method. */
while (num_args < call_info->num_args) {
zend_arg_info *arg_info = func->op_array.arg_info + num_args;
@@ -9725,7 +9708,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
uint32_t i;
zend_jit_addr res_addr;
uint32_t call_num_args = 0;
- zend_bool unknown_num_args = 0;
+ bool unknown_num_args = 0;
const void *exit_addr = NULL;
const zend_op *prev_opline;
@@ -9750,7 +9733,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
while (call_info && call_info->caller_call_opline != opline) {
call_info = call_info->next_callee;
}
- if (call_info && call_info->callee_func) {
+ if (call_info && call_info->callee_func && !call_info->is_prototype) {
func = call_info->callee_func;
}
}
@@ -9913,7 +9896,10 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
if (func && !(func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
if (ZEND_MAP_PTR_IS_OFFSET(func->op_array.run_time_cache)) {
| MEM_OP2_2_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
- } else if (!zend_accel_in_shm(func->op_array.opcodes)) {
+ } else if ((func->op_array.fn_flags & ZEND_ACC_IMMUTABLE)
+ && (!func->op_array.scope || (func->op_array.scope->ce_flags & ZEND_ACC_LINKED))) {
+ | MEM_OP2_2_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
+ } else {
/* the called op_array may be not persisted yet */
| test r2, 1
| jz >1
@@ -10255,7 +10241,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
if (!RETURN_VALUE_USED(opline)) {
zend_class_entry *ce;
- zend_bool ce_is_instanceof;
+ bool ce_is_instanceof;
uint32_t func_info = call_info ?
zend_get_func_info(call_info, ssa, &ce, &ce_is_instanceof) :
(MAY_BE_ANY|MAY_BE_REF|MAY_BE_RC1|MAY_BE_RCN);
@@ -11201,17 +11187,17 @@ static int zend_jit_leave_func(dasm_State **Dst,
const zend_op_array *op_array,
const zend_op *opline,
uint32_t op1_info,
- zend_bool left_frame,
+ bool left_frame,
zend_jit_trace_rec *trace,
zend_jit_trace_info *trace_info,
int indirect_var_access,
int may_throw)
{
- zend_bool may_be_top_frame =
+ bool may_be_top_frame =
JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
!JIT_G(current_frame) ||
!TRACE_FRAME_IS_NESTED(JIT_G(current_frame));
- zend_bool may_need_call_helper =
+ bool may_need_call_helper =
indirect_var_access || /* may have symbol table */
!op_array->function_name || /* may have symbol table */
may_be_top_frame ||
@@ -11220,7 +11206,7 @@ static int zend_jit_leave_func(dasm_State **Dst,
!JIT_G(current_frame) ||
TRACE_FRAME_NUM_ARGS(JIT_G(current_frame)) == -1 || /* unknown number of args */
(uint32_t)TRACE_FRAME_NUM_ARGS(JIT_G(current_frame)) > op_array->num_args; /* extra args */
- zend_bool may_need_release_this =
+ bool may_need_release_this =
!(op_array->fn_flags & ZEND_ACC_CLOSURE) &&
op_array->scope &&
!(op_array->fn_flags & ZEND_ACC_STATIC) &&
@@ -11634,7 +11620,7 @@ static int zend_jit_zval_copy_deref(dasm_State **Dst, zend_jit_addr res_addr, ze
return 1;
}
-static zend_bool zend_jit_may_avoid_refcounting(const zend_op *opline)
+static bool zend_jit_may_avoid_refcounting(const zend_op *opline)
{
switch (opline->opcode) {
case ZEND_FETCH_OBJ_FUNC_ARG:
@@ -11677,7 +11663,7 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst,
const zend_ssa_op *ssa_op,
uint32_t op1_info,
zend_jit_addr op1_addr,
- zend_bool op1_avoid_refcounting,
+ bool op1_avoid_refcounting,
uint32_t op2_info,
uint32_t res_info,
zend_jit_addr res_addr,
@@ -11687,7 +11673,7 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst,
const void *exit_addr = NULL;
const void *not_found_exit_addr = NULL;
const void *res_exit_addr = NULL;
- zend_bool result_avoid_refcounting = 0;
+ bool result_avoid_refcounting = 0;
uint32_t may_be_string = (opline->opcode != ZEND_FETCH_LIST_R) ? MAY_BE_STRING : 0;
orig_op1_addr = OP1_ADDR();
@@ -12188,7 +12174,7 @@ static int zend_jit_isset_isempty_dim(dasm_State **Dst,
const zend_op *opline,
uint32_t op1_info,
zend_jit_addr op1_addr,
- zend_bool op1_avoid_refcounting,
+ bool op1_avoid_refcounting,
uint32_t op2_info,
int may_throw,
zend_uchar smart_branch_opcode,
@@ -12446,10 +12432,10 @@ static int zend_jit_bind_global(dasm_State **Dst, const zend_op *opline, uint32_
return 1;
}
-static int zend_jit_verify_arg_type(dasm_State **Dst, const zend_op *opline, zend_arg_info *arg_info, zend_bool check_exception)
+static int zend_jit_verify_arg_type(dasm_State **Dst, const zend_op *opline, zend_arg_info *arg_info, bool check_exception)
{
zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
- zend_bool in_cold = 0;
+ bool in_cold = 0;
uint32_t type_mask = ZEND_TYPE_PURE_MASK(arg_info->type) & MAY_BE_ANY;
zend_reg tmp_reg = (type_mask == 0 || is_power_of_two(type_mask)) ? ZREG_FCARG1a : ZREG_R0;
@@ -12570,7 +12556,7 @@ static int zend_jit_recv(dasm_State **Dst, const zend_op *opline, const zend_op_
return 1;
}
-static int zend_jit_recv_init(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_bool is_last, int may_throw)
+static int zend_jit_recv_init(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, bool is_last, int may_throw)
{
uint32_t arg_num = opline->op1.num;
zval *zv = RT_CONSTANT(opline, opline->op2);
@@ -12646,11 +12632,12 @@ static int zend_jit_recv_init(dasm_State **Dst, const zend_op *opline, const zen
return 1;
}
-static zend_property_info* zend_get_known_property_info(zend_class_entry *ce, zend_string *member, zend_bool on_this, zend_string *filename)
+static zend_property_info* zend_get_known_property_info(const zend_op_array *op_array, zend_class_entry *ce, zend_string *member, bool on_this, zend_string *filename)
{
zend_property_info *info = NULL;
- if (!ce ||
+ if ((on_this && (op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) ||
+ !ce ||
!(ce->ce_flags & ZEND_ACC_LINKED) ||
(ce->ce_flags & ZEND_ACC_TRAIT) ||
ce->create_object) {
@@ -12698,7 +12685,7 @@ static zend_property_info* zend_get_known_property_info(zend_class_entry *ce, ze
return info;
}
-static zend_bool zend_may_be_dynamic_property(zend_class_entry *ce, zend_string *member, zend_bool on_this, zend_string *filename)
+static bool zend_may_be_dynamic_property(zend_class_entry *ce, zend_string *member, bool on_this, zend_string *filename)
{
zend_property_info *info;
@@ -12759,17 +12746,17 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
const zend_ssa_op *ssa_op,
uint32_t op1_info,
zend_jit_addr op1_addr,
- zend_bool op1_indirect,
+ bool op1_indirect,
zend_class_entry *ce,
- zend_bool ce_is_instanceof,
- zend_bool use_this,
- zend_bool op1_avoid_refcounting,
+ bool ce_is_instanceof,
+ bool use_this,
+ bool op1_avoid_refcounting,
zend_class_entry *trace_ce,
int may_throw)
{
zval *member;
zend_property_info *prop_info;
- zend_bool may_be_dynamic = 1;
+ bool may_be_dynamic = 1;
zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This));
zend_jit_addr prop_addr;
@@ -12780,7 +12767,7 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
member = RT_CONSTANT(opline, opline->op2);
ZEND_ASSERT(Z_TYPE_P(member) == IS_STRING && Z_STRVAL_P(member)[0] != '\0');
- prop_info = zend_get_known_property_info(ce, Z_STR_P(member), opline->op1_type == IS_UNUSED, op_array->filename);
+ prop_info = zend_get_known_property_info(op_array, ce, Z_STR_P(member), opline->op1_type == IS_UNUSED, op_array->filename);
if (opline->op1_type == IS_UNUSED || use_this) {
| GET_ZVAL_PTR FCARG1a, this_addr
@@ -12819,7 +12806,7 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
}
if (!prop_info && trace_ce && (trace_ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
- prop_info = zend_get_known_property_info(trace_ce, Z_STR_P(member), opline->op1_type == IS_UNUSED, op_array->filename);
+ prop_info = zend_get_known_property_info(op_array, trace_ce, Z_STR_P(member), opline->op1_type == IS_UNUSED, op_array->filename);
if (prop_info) {
ce = trace_ce;
ce_is_instanceof = 0;
@@ -12970,7 +12957,7 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
ssa->var_info[ssa_op->result_def].indirect_reference = 1;
}
} else {
- zend_bool result_avoid_refcounting = 0;
+ bool result_avoid_refcounting = 0;
if ((res_info & MAY_BE_GUARD) && JIT_G(current_frame) && prop_info) {
uint32_t flags = 0;
@@ -13150,10 +13137,10 @@ static int zend_jit_incdec_obj(dasm_State **Dst,
const zend_ssa_op *ssa_op,
uint32_t op1_info,
zend_jit_addr op1_addr,
- zend_bool op1_indirect,
+ bool op1_indirect,
zend_class_entry *ce,
- zend_bool ce_is_instanceof,
- zend_bool use_this,
+ bool ce_is_instanceof,
+ bool use_this,
zend_class_entry *trace_ce,
int may_throw)
{
@@ -13163,7 +13150,7 @@ static int zend_jit_incdec_obj(dasm_State **Dst,
zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This));
zend_jit_addr res_addr = 0;
zend_jit_addr prop_addr;
- zend_bool needs_slow_path = 0;
+ bool needs_slow_path = 0;
ZEND_ASSERT(opline->op2_type == IS_CONST);
ZEND_ASSERT(op1_info & MAY_BE_OBJECT);
@@ -13175,7 +13162,7 @@ static int zend_jit_incdec_obj(dasm_State **Dst,
member = RT_CONSTANT(opline, opline->op2);
ZEND_ASSERT(Z_TYPE_P(member) == IS_STRING && Z_STRVAL_P(member)[0] != '\0');
name = Z_STR_P(member);
- prop_info = zend_get_known_property_info(ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
+ prop_info = zend_get_known_property_info(op_array, ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
if (opline->op1_type == IS_UNUSED || use_this) {
| GET_ZVAL_PTR FCARG1a, this_addr
@@ -13223,7 +13210,7 @@ static int zend_jit_incdec_obj(dasm_State **Dst,
}
if (!prop_info && trace_ce && (trace_ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
- prop_info = zend_get_known_property_info(trace_ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
+ prop_info = zend_get_known_property_info(op_array, trace_ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
if (prop_info) {
ce = trace_ce;
ce_is_instanceof = 0;
@@ -13526,10 +13513,10 @@ static int zend_jit_assign_obj_op(dasm_State **Dst,
zend_jit_addr op1_addr,
uint32_t val_info,
zend_ssa_range *val_range,
- zend_bool op1_indirect,
+ bool op1_indirect,
zend_class_entry *ce,
- zend_bool ce_is_instanceof,
- zend_bool use_this,
+ bool ce_is_instanceof,
+ bool use_this,
zend_class_entry *trace_ce,
int may_throw)
{
@@ -13539,7 +13526,7 @@ static int zend_jit_assign_obj_op(dasm_State **Dst,
zend_jit_addr val_addr = OP1_DATA_ADDR();
zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This));
zend_jit_addr prop_addr;
- zend_bool needs_slow_path = 0;
+ bool needs_slow_path = 0;
binary_op_type binary_op = get_binary_op(opline->extended_value);
ZEND_ASSERT(opline->op2_type == IS_CONST);
@@ -13549,7 +13536,7 @@ static int zend_jit_assign_obj_op(dasm_State **Dst,
member = RT_CONSTANT(opline, opline->op2);
ZEND_ASSERT(Z_TYPE_P(member) == IS_STRING && Z_STRVAL_P(member)[0] != '\0');
name = Z_STR_P(member);
- prop_info = zend_get_known_property_info(ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
+ prop_info = zend_get_known_property_info(op_array, ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
if (opline->op1_type == IS_UNUSED || use_this) {
| GET_ZVAL_PTR FCARG1a, this_addr
@@ -13606,7 +13593,7 @@ static int zend_jit_assign_obj_op(dasm_State **Dst,
}
if (!prop_info && trace_ce && (trace_ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
- prop_info = zend_get_known_property_info(trace_ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
+ prop_info = zend_get_known_property_info(op_array, trace_ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
if (prop_info) {
ce = trace_ce;
ce_is_instanceof = 0;
@@ -13856,10 +13843,10 @@ static int zend_jit_assign_obj(dasm_State **Dst,
uint32_t op1_info,
zend_jit_addr op1_addr,
uint32_t val_info,
- zend_bool op1_indirect,
+ bool op1_indirect,
zend_class_entry *ce,
- zend_bool ce_is_instanceof,
- zend_bool use_this,
+ bool ce_is_instanceof,
+ bool use_this,
zend_class_entry *trace_ce,
int may_throw)
{
@@ -13870,7 +13857,7 @@ static int zend_jit_assign_obj(dasm_State **Dst,
zend_jit_addr res_addr = 0;
zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This));
zend_jit_addr prop_addr;
- zend_bool needs_slow_path = 0;
+ bool needs_slow_path = 0;
if (RETURN_VALUE_USED(opline)) {
res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
@@ -13882,7 +13869,7 @@ static int zend_jit_assign_obj(dasm_State **Dst,
member = RT_CONSTANT(opline, opline->op2);
ZEND_ASSERT(Z_TYPE_P(member) == IS_STRING && Z_STRVAL_P(member)[0] != '\0');
name = Z_STR_P(member);
- prop_info = zend_get_known_property_info(ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
+ prop_info = zend_get_known_property_info(op_array, ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
if (opline->op1_type == IS_UNUSED || use_this) {
| GET_ZVAL_PTR FCARG1a, this_addr
@@ -13938,7 +13925,7 @@ static int zend_jit_assign_obj(dasm_State **Dst,
}
if (!prop_info && trace_ce && (trace_ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
- prop_info = zend_get_known_property_info(trace_ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
+ prop_info = zend_get_known_property_info(op_array, trace_ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
if (prop_info) {
ce = trace_ce;
ce_is_instanceof = 0;
@@ -14275,6 +14262,38 @@ static int zend_jit_strlen(dasm_State **Dst, const zend_op *opline, uint32_t op1
return 1;
}
+static int zend_jit_count(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, int may_throw)
+{
+ zend_jit_addr res_addr = RES_ADDR();
+
+ if (opline->op1_type == IS_CONST) {
+ zval *zv;
+ zend_long count;
+
+ zv = RT_CONSTANT(opline, opline->op1);
+ ZEND_ASSERT(Z_TYPE_P(zv) == IS_ARRAY);
+ count = zend_hash_num_elements(Z_ARRVAL_P(zv));
+
+ | SET_ZVAL_LVAL res_addr, count
+ | SET_ZVAL_TYPE_INFO res_addr, IS_LONG
+ } else {
+ ZEND_ASSERT((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY);
+ // Note: See the implementation of ZEND_COUNT in Zend/zend_vm_def.h - arrays do not contain IS_UNDEF starting in php 8.1+.
+
+ | GET_ZVAL_PTR r0, op1_addr
+ // Sign-extend the 32-bit value to a potentially 64-bit zend_long
+ | mov eax, dword [r0 + offsetof(HashTable, nNumOfElements)]
+ | SET_ZVAL_LVAL res_addr, r0
+ | SET_ZVAL_TYPE_INFO res_addr, IS_LONG
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline
+ }
+
+ if (may_throw) {
+ return zend_jit_check_exception(Dst);
+ }
+ return 1;
+}
+
static int zend_jit_load_this(dasm_State **Dst, uint32_t var)
{
zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, var);
@@ -14287,7 +14306,7 @@ static int zend_jit_load_this(dasm_State **Dst, uint32_t var)
return 1;
}
-static int zend_jit_fetch_this(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, zend_bool check_only)
+static int zend_jit_fetch_this(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, bool check_only)
{
if (!op_array->scope || (op_array->fn_flags & ZEND_ACC_STATIC)) {
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
@@ -14695,13 +14714,13 @@ static int zend_jit_switch(dasm_State **Dst, const zend_op *opline, const zend_o
return 1;
}
-static zend_bool zend_jit_verify_return_type(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info)
+static bool zend_jit_verify_return_type(dasm_State **Dst, const zend_op *opline, const zend_op_array *op_array, uint32_t op1_info)
{
zend_arg_info *arg_info = &op_array->arg_info[-1];
ZEND_ASSERT(ZEND_TYPE_IS_SET(arg_info->type));
zend_jit_addr op1_addr = OP1_ADDR();
- zend_bool needs_slow_check = 1;
- zend_bool slow_check_in_cold = 1;
+ bool needs_slow_check = 1;
+ bool slow_check_in_cold = 1;
uint32_t type_mask = ZEND_TYPE_PURE_MASK(arg_info->type) & MAY_BE_ANY;
if (type_mask == 0) {
@@ -14864,21 +14883,21 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t o
| // array = EX_VAR(opline->op1.var);
| // fe_ht = Z_ARRVAL_P(array);
- | GET_ZVAL_PTR FCARG2a, op1_addr
+ | GET_ZVAL_PTR FCARG1a, op1_addr
| // pos = Z_FE_POS_P(array);
- | mov FCARG1d, dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)]
+ | mov eax, dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)]
| // p = fe_ht->arData + pos;
|.if X64
|| ZEND_ASSERT(sizeof(Bucket) == 32);
- | mov eax, FCARG1d
- | shl r0, 5
+ | mov FCARG2d, eax
+ | shl FCARG2a, 5
|.else
- | imul r0, FCARG1a, sizeof(Bucket)
+ | imul FCARG2a, r0, sizeof(Bucket)
|.endif
- | add r0, aword [FCARG2a + offsetof(zend_array, arData)]
+ | add FCARG2a, aword [FCARG1a + offsetof(zend_array, arData)]
|1:
| // if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
- | cmp dword [FCARG2a + offsetof(zend_array, nNumUsed)], FCARG1d
+ | cmp dword [FCARG1a + offsetof(zend_array, nNumUsed)], eax
| // ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
| // ZEND_VM_CONTINUE();
if (exit_addr) {
@@ -14891,28 +14910,16 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t o
| jbe =>target_label
}
| // pos++;
- | add FCARG1d, 1
- | // value_type = Z_TYPE_INFO_P(value);
- | // if (EXPECTED(value_type != IS_UNDEF)) {
- | IF_Z_TYPE r0, IS_UNDEF, >2
- if (!exit_addr || exit_opcode == ZEND_JMP) {
- | IF_NOT_Z_TYPE r0, IS_INDIRECT, >3
- } else {
- | IF_NOT_Z_TYPE r0, IS_INDIRECT, &exit_addr
- }
- | // value = Z_INDIRECT_P(value);
- | GET_Z_PTR FCARG2a, r0
+ | add eax, 1
| // value_type = Z_TYPE_INFO_P(value);
| // if (EXPECTED(value_type != IS_UNDEF)) {
if (!exit_addr || exit_opcode == ZEND_JMP) {
- | IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, >4
+ | IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, >3
} else {
- | IF_NOT_Z_TYPE r0, IS_UNDEF, &exit_addr
+ | IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, &exit_addr
}
- | GET_ZVAL_PTR FCARG2a, op1_addr // reload
- |2:
| // p++;
- | add r0, sizeof(Bucket)
+ | add FCARG2a, sizeof(Bucket)
| jmp <1
|3:
@@ -14921,10 +14928,8 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t o
zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var);
uint32_t val_info;
- | mov FCARG2a, r0
- |4:
| // Z_FE_POS_P(array) = pos + 1;
- | mov dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)], FCARG1d
+ | mov dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)], eax
if (RETURN_VALUE_USED(opline)) {
zend_jit_addr res_addr = RES_ADDR();
@@ -14932,19 +14937,19 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t o
if ((op1_info & MAY_BE_ARRAY_KEY_LONG)
&& (op1_info & MAY_BE_ARRAY_KEY_STRING)) {
| // if (!p->key) {
- | cmp aword [r0 + offsetof(Bucket, key)], 0
+ | cmp aword [FCARG2a + offsetof(Bucket, key)], 0
| jz >2
}
if (op1_info & MAY_BE_ARRAY_KEY_STRING) {
| // ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
- | mov FCARG1a, aword [r0 + offsetof(Bucket, key)]
- | SET_ZVAL_PTR res_addr, FCARG1a
- | test dword [FCARG1a + offsetof(zend_refcounted, gc.u.type_info)], IS_STR_INTERNED
+ | mov r0, aword [FCARG2a + offsetof(Bucket, key)]
+ | SET_ZVAL_PTR res_addr, r0
+ | test dword [r0 + offsetof(zend_refcounted, gc.u.type_info)], IS_STR_INTERNED
| jz >1
| SET_ZVAL_TYPE_INFO res_addr, IS_STRING
| jmp >3
|1:
- | GC_ADDREF FCARG1a
+ | GC_ADDREF r0
| SET_ZVAL_TYPE_INFO res_addr, IS_STRING_EX
if (op1_info & MAY_BE_ARRAY_KEY_LONG) {
@@ -14954,8 +14959,8 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t o
}
if (op1_info & MAY_BE_ARRAY_KEY_LONG) {
| // ZVAL_LONG(EX_VAR(opline->result.var), p->h);
- | mov FCARG1a, aword [r0 + offsetof(Bucket, h)]
- | SET_ZVAL_LVAL res_addr, FCARG1a
+ | mov r0, aword [FCARG2a + offsetof(Bucket, h)]
+ | SET_ZVAL_LVAL res_addr, r0
| SET_ZVAL_TYPE_INFO res_addr, IS_LONG
}
|3:
@@ -15110,7 +15115,7 @@ static int zend_jit_in_array(dasm_State **Dst, const zend_op *opline, uint32_t o
return 1;
}
-static zend_bool zend_jit_noref_guard(dasm_State **Dst, const zend_op *opline, zend_jit_addr var_addr)
+static bool zend_jit_noref_guard(dasm_State **Dst, const zend_op *opline, zend_jit_addr var_addr)
{
int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
@@ -15123,7 +15128,7 @@ static zend_bool zend_jit_noref_guard(dasm_State **Dst, const zend_op *opline, z
return 1;
}
-static zend_bool zend_jit_fetch_reference(dasm_State **Dst, const zend_op *opline, uint8_t var_type, uint32_t *var_info_ptr, zend_jit_addr *var_addr_ptr, zend_bool add_ref_guard, zend_bool add_type_guard)
+static bool zend_jit_fetch_reference(dasm_State **Dst, const zend_op *opline, uint8_t var_type, uint32_t *var_info_ptr, zend_jit_addr *var_addr_ptr, bool add_ref_guard, bool add_type_guard)
{
zend_jit_addr var_addr = *var_addr_ptr;
uint32_t var_info = *var_info_ptr;
@@ -15179,7 +15184,7 @@ static zend_bool zend_jit_fetch_reference(dasm_State **Dst, const zend_op *oplin
return 1;
}
-static zend_bool zend_jit_fetch_indirect_var(dasm_State **Dst, const zend_op *opline, uint8_t var_type, uint32_t *var_info_ptr, zend_jit_addr *var_addr_ptr, zend_bool add_indirect_guard)
+static bool zend_jit_fetch_indirect_var(dasm_State **Dst, const zend_op *opline, uint8_t var_type, uint32_t *var_info_ptr, zend_jit_addr *var_addr_ptr, bool add_indirect_guard)
{
zend_jit_addr var_addr = *var_addr_ptr;
uint32_t var_info = *var_info_ptr;
@@ -15242,7 +15247,7 @@ static zend_bool zend_jit_fetch_indirect_var(dasm_State **Dst, const zend_op *op
return 1;
}
-static zend_bool zend_jit_may_reuse_reg(const zend_op *opline, const zend_ssa_op *ssa_op, zend_ssa *ssa, int def_var, int use_var)
+static bool zend_jit_may_reuse_reg(const zend_op *opline, const zend_ssa_op *ssa_op, zend_ssa *ssa, int def_var, int use_var)
{
if ((ssa->var_info[def_var].type & ~MAY_BE_GUARD) != (ssa->var_info[use_var].type & ~MAY_BE_GUARD)) {
return 0;
@@ -15274,7 +15279,7 @@ static zend_bool zend_jit_may_reuse_reg(const zend_op *opline, const zend_ssa_op
return 0;
}
-static zend_bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa *ssa, const zend_op *opline, const zend_ssa_op *ssa_op, zend_jit_trace_rec *trace)
+static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa *ssa, const zend_op *opline, const zend_ssa_op *ssa_op, zend_jit_trace_rec *trace)
{
uint32_t op1_info, op2_info;
@@ -15345,7 +15350,7 @@ static zend_bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zen
return 0;
}
-static zend_bool zend_jit_var_supports_reg(zend_ssa *ssa, int var)
+static bool zend_jit_var_supports_reg(zend_ssa *ssa, int var)
{
if (ssa->vars[var].no_val) {
/* we don't need the value */
@@ -15379,7 +15384,7 @@ static zend_bool zend_jit_var_supports_reg(zend_ssa *ssa, int var)
return 1;
}
-static zend_bool zend_jit_may_be_in_reg(const zend_op_array *op_array, zend_ssa *ssa, int var)
+static bool zend_jit_may_be_in_reg(const zend_op_array *op_array, zend_ssa *ssa, int var)
{
if (!zend_jit_var_supports_reg(ssa, var)) {
return 0;
@@ -15407,7 +15412,7 @@ static zend_bool zend_jit_may_be_in_reg(const zend_op_array *op_array, zend_ssa
return 1;
}
-static zend_bool zend_needs_extra_reg_for_const(const zend_op *opline, zend_uchar op_type, znode_op op)
+static bool zend_needs_extra_reg_for_const(const zend_op *opline, zend_uchar op_type, znode_op op)
{
|.if X64
|| if (op_type == IS_CONST) {
@@ -15422,7 +15427,7 @@ static zend_bool zend_needs_extra_reg_for_const(const zend_op *opline, zend_ucha
return 0;
}
-static zend_regset zend_jit_get_def_scratch_regset(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, int current_var, zend_bool last_use)
+static zend_regset zend_jit_get_def_scratch_regset(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, int current_var, bool last_use)
{
uint32_t op1_info, op2_info;
@@ -15444,7 +15449,7 @@ static zend_regset zend_jit_get_def_scratch_regset(const zend_op *opline, const
return ZEND_REGSET_EMPTY;
}
-static zend_regset zend_jit_get_scratch_regset(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, int current_var, zend_bool last_use)
+static zend_regset zend_jit_get_scratch_regset(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, int current_var, bool last_use)
{
uint32_t op1_info, op2_info, res_info;
zend_regset regset = ZEND_REGSET_SCRATCH;
diff --git a/ext/opcache/jit/zend_jit_x86.h b/ext/opcache/jit/zend_jit_x86.h
index 10a82db14f..e9476ebb31 100644
--- a/ext/opcache/jit/zend_jit_x86.h
+++ b/ext/opcache/jit/zend_jit_x86.h
@@ -318,7 +318,7 @@ static zend_always_inline zend_jit_addr _zend_jit_decode_op(zend_uchar op_type,
#define OP1_DATA_DEF_REG_ADDR() \
OP_REG_ADDR(opline + 1, op1_type, op1, op1_def)
-static zend_always_inline zend_bool zend_jit_same_addr(zend_jit_addr addr1, zend_jit_addr addr2)
+static zend_always_inline bool zend_jit_same_addr(zend_jit_addr addr1, zend_jit_addr addr2)
{
if (addr1 == addr2) {
return 1;
diff --git a/ext/opcache/opcache.stub.php b/ext/opcache/opcache.stub.php
index 34cc789717..ba65b9a264 100644
--- a/ext/opcache/opcache.stub.php
+++ b/ext/opcache/opcache.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function opcache_reset(): bool {}
diff --git a/ext/opcache/opcache_arginfo.h b/ext/opcache/opcache_arginfo.h
index 5085255a0f..55e867f392 100644
--- a/ext/opcache/opcache_arginfo.h
+++ b/ext/opcache/opcache_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 06a37b4af6a0fb5d7bd24b1660ea8ce09e959ec8 */
+ * Stub hash: 919d85eb3f3e1127ea3911051f1d98340e84654e */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_opcache_reset, 0, 0, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
diff --git a/ext/opcache/shared_alloc_mmap.c b/ext/opcache/shared_alloc_mmap.c
index c30a3b483c..18f2268a67 100644
--- a/ext/opcache/shared_alloc_mmap.c
+++ b/ext/opcache/shared_alloc_mmap.c
@@ -29,6 +29,10 @@
#include <stdlib.h>
#include <sys/mman.h>
+#ifdef __APPLE__
+#include <mach/vm_statistics.h>
+#endif
+
#if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
# define MAP_ANONYMOUS MAP_ANON
#endif
@@ -39,10 +43,14 @@
static int create_segments(size_t requested_size, zend_shared_segment ***shared_segments_p, int *shared_segments_count, char **error_in)
{
zend_shared_segment *shared_segment;
- int flags = PROT_READ | PROT_WRITE;
+ int flags = PROT_READ | PROT_WRITE, fd = -1;
void *p;
#ifdef PROT_MPROTECT
- flags |= PROT_MPROTECT(PROT_EXEC);
+ flags |= PROT_MPROTECT(PROT_EXEC);
+#endif
+#ifdef VM_MAKE_TAG
+ /* allows tracking segments via tools such as vmmap */
+ fd = VM_MAKE_TAG(251U);
#endif
#ifdef PROT_MAX
flags |= PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC);
@@ -65,7 +73,7 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
/* to got HUGE PAGES in low 32-bit address we have to reserve address
space and then remap it using MAP_HUGETLB */
- p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
+ p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, fd, 0);
if (p != MAP_FAILED) {
munmap(p, requested_size);
p = (void*)(ZEND_MM_ALIGNED_SIZE_EX((ptrdiff_t)p, huge_page_size));
@@ -73,26 +81,26 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
if (p != MAP_FAILED) {
goto success;
} else {
- p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
+ p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, fd, 0);
if (p != MAP_FAILED) {
goto success;
}
}
}
# endif
- p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);
+ p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB, fd, 0);
if (p != MAP_FAILED) {
goto success;
}
}
#elif defined(PREFER_MAP_32BIT) && defined(__x86_64__) && defined(MAP_32BIT)
- p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
+ p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, fd, 0);
if (p != MAP_FAILED) {
goto success;
}
#endif
- p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
+ p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS, fd, 0);
if (p == MAP_FAILED) {
*error_in = "mmap";
return ALLOC_FAILURE;
diff --git a/ext/opcache/shared_alloc_win32.c b/ext/opcache/shared_alloc_win32.c
index 497132d9cc..76df553468 100644
--- a/ext/opcache/shared_alloc_win32.c
+++ b/ext/opcache/shared_alloc_win32.c
@@ -142,7 +142,7 @@ static int zend_shared_alloc_reattach(size_t requested_size, char **error_in)
}
pre_size = ZEND_ALIGNED_SIZE(sizeof(zend_smm_shared_globals)) + ZEND_ALIGNED_SIZE(sizeof(zend_shared_segment)) + ZEND_ALIGNED_SIZE(sizeof(void *)) + ZEND_ALIGNED_SIZE(sizeof(int));
- /* Map only part of SHM to have access opcache shared globals */
+ /* Map only part of SHM to have access to opcache shared globals */
mapping_base = MapViewOfFileEx(memfile, FILE_MAP_ALL_ACCESS, 0, 0, pre_size + ZEND_ALIGNED_SIZE(sizeof(zend_accel_shared_globals)), NULL);
if (mapping_base == NULL) {
err = GetLastError();
@@ -210,7 +210,7 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
zend_shared_alloc_lock_win32();
/* Mapping retries: When Apache2 restarts, the parent process startup routine
- can be called before the child process is killed. In this case, the map will fail
+ can be called before the child process is killed. In this case, the mapping will fail
and we have to sleep some time (until the child releases the mapping object) and retry.*/
do {
memfile = OpenFileMapping(FILE_MAP_READ|FILE_MAP_WRITE|FILE_MAP_EXECUTE, 0, create_name_with_username(ACCEL_FILEMAP_NAME));
@@ -267,15 +267,15 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
return ALLOC_FAILURE;
}
- /* Starting from windows Vista, heap randomization occurs which might cause our mapping base to
- be taken (fail to map). So under Vista, we try to map into a hard coded predefined addresses
+ /* Starting from Windows Vista, heap randomization occurs which might cause our mapping base to
+ be taken (fail to map). So we try to map into one of the hard coded predefined addresses
in high memory. */
if (!ZCG(accel_directives).mmap_base || !*ZCG(accel_directives).mmap_base) {
wanted_mapping_base = vista_mapping_base_set;
} else {
char *s = ZCG(accel_directives).mmap_base;
- /* skip leading 0x, %p assumes hexdeciaml format anyway */
+ /* skip leading 0x, %p assumes hexdecimal format anyway */
if (*s == '0' && *(s + 1) == 'x') {
s += 2;
}
diff --git a/ext/opcache/tests/bug65915.phpt b/ext/opcache/tests/bug65915.phpt
index c616c4fb5f..b62dbd8ea7 100644
--- a/ext/opcache/tests/bug65915.phpt
+++ b/ext/opcache/tests/bug65915.phpt
@@ -5,7 +5,11 @@ opcache.enable=1
opcache.enable_cli=1
opcache.file_cache_only=0
--SKIPIF--
-<?php require_once('skipif.inc'); ?>
+<?php
+require_once('skipif.inc');
+// We don't invalidate the file after the second write.
+if (getenv('SKIP_REPEAT')) die("skip Not repeatable");
+?>
--FILE--
<?php
$tmp = __DIR__ . "/bug65915.inc.php";
diff --git a/ext/opcache/tests/bug76337.phpt b/ext/opcache/tests/bug76337.phpt
index 384bb074ed..a49f2788b7 100644
--- a/ext/opcache/tests/bug76337.phpt
+++ b/ext/opcache/tests/bug76337.phpt
@@ -2,7 +2,7 @@
Bug 76337: segmentation fault when an extension use zend_register_class_alias() and opcache enabled
--SKIPIF--
<?php require_once('skipif.inc'); ?>
-<?php if (!extension_loaded('zend-test')) die('skip zend-test extension not loaded');
+<?php if (!extension_loaded('zend_test')) die('skip zend_test extension not loaded');
--INI--
opcache.enable=1
opcache.enable_cli=1
diff --git a/ext/opcache/tests/bug78014.phpt b/ext/opcache/tests/bug78014.phpt
index 3b4d332828..63fc1b6db1 100644
--- a/ext/opcache/tests/bug78014.phpt
+++ b/ext/opcache/tests/bug78014.phpt
@@ -12,18 +12,8 @@ if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows
?>
--FILE--
<?php
-class B extends A {
- function foo(): int { return 24; }
-}
$c = new C;
var_dump($c->foo());
?>
---EXPECTF--
-Warning: Can't preload unlinked class C: Parent with unresolved initializers B in %s on line %d
-
-Warning: Can't preload class B with unresolved initializer for constant X in %s on line %d
-
-Fatal error: Uncaught Error: Class "C" not found in %sbug78014.php:5
-Stack trace:
-#0 {main}
- thrown in %sbug78014.php on line 5
+--EXPECT--
+int(42)
diff --git a/ext/opcache/tests/bug78961.phpt b/ext/opcache/tests/bug78961.phpt
deleted file mode 100644
index 736a747f43..0000000000
--- a/ext/opcache/tests/bug78961.phpt
+++ /dev/null
@@ -1,17 +0,0 @@
---TEST--
-Bug #78961 (erroneous optimization of re-assigned $GLOBALS)
---INI--
-opcache.enable=1
-opcache.enable_cli=1
-opcache.optimization_level=-1
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
---FILE--
-<?php
-$GLOBALS = array();
-$GLOBALS['td'] = array();
-$GLOBALS['td']['nsno'] = 3;
-var_dump($GLOBALS['td']['nsno']);
-?>
---EXPECT--
-int(3)
diff --git a/ext/opcache/tests/internal_func_info_static_method.phpt b/ext/opcache/tests/internal_func_info_static_method.phpt
index df4e9b2aab..1a189b00a8 100644
--- a/ext/opcache/tests/internal_func_info_static_method.phpt
+++ b/ext/opcache/tests/internal_func_info_static_method.phpt
@@ -2,7 +2,7 @@
Internal static methods should not be confused with global functions
--SKIPIF--
<?php
-if (!extension_loaded('zend-test')) die('skip requires zend-test');
+if (!extension_loaded('zend_test')) die('skip requires zend_test');
?>
--FILE--
<?php
diff --git a/ext/opcache/tests/jit/bug80426.phpt b/ext/opcache/tests/jit/bug80426.phpt
index 19364e8a6c..c961bed472 100644
--- a/ext/opcache/tests/jit/bug80426.phpt
+++ b/ext/opcache/tests/jit/bug80426.phpt
@@ -8,7 +8,7 @@ zend_test.replace_zend_execute_ex=1
--SKIPIF--
<?php require_once('skipif.inc'); ?>
<?php if (!isset(opcache_get_status()["jit"])) die('skip: JIT is not available'); ?>
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--FILE--
<?php
diff --git a/ext/opcache/tests/jit/count_001.phpt b/ext/opcache/tests/jit/count_001.phpt
new file mode 100644
index 0000000000..c76206f3aa
--- /dev/null
+++ b/ext/opcache/tests/jit/count_001.phpt
@@ -0,0 +1,68 @@
+--TEST--
+JIT COUNT: 001
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.file_update_protection=0
+opcache.jit_buffer_size=1M
+;opcache.jit_debug=1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+class ThrowsInDestructor {
+ public function __destruct() {
+ throw new RuntimeException("In destructor");
+ }
+}
+class C {
+ public static function create_array(int $i): array {
+ return array_fill(0, $i, new stdClass());
+ }
+
+ public static function foo() {
+ $x = [self::create_array(5)];
+ echo count(self::create_array(0)), "\n";
+ echo count(self::create_array(1)), "\n";
+ echo count($x[0]), "\n";
+ $a = [];
+ for ($i = 0; $i < 4; $i++) {
+ $a[] = $i;
+ echo count($a) . "\n";
+ }
+ }
+ public static function count_ref(array &$ref): int {
+ return count($ref);
+ }
+
+ public static function count_throws(): int {
+ $result = count([new ThrowsInDestructor()]);
+ echo "Unreachable\n";
+ return $result;
+ }
+}
+C::foo();
+$x = ['x', 'y', 'z', 'a', new stdClass()];
+echo C::count_ref($x), "\n";
+for ($i = 0; $i < 5; $i++) {
+ try {
+ echo C::count_throws(), "\n";
+ } catch (RuntimeException $e) {
+ printf("Caught %s\n", $e->getMessage());
+ }
+}
+
+--EXPECT--
+0
+1
+5
+1
+2
+3
+4
+5
+Caught In destructor
+Caught In destructor
+Caught In destructor
+Caught In destructor
+Caught In destructor \ No newline at end of file
diff --git a/ext/opcache/tests/opt/dce_009.phpt b/ext/opcache/tests/opt/dce_009.phpt
new file mode 100644
index 0000000000..0503614f34
--- /dev/null
+++ b/ext/opcache/tests/opt/dce_009.phpt
@@ -0,0 +1,71 @@
+--TEST--
+DCE 009: Foreach over empty array is a no-op
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.opt_debug_level=0x20000
+opcache.preload=
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+class Loop {
+ const VALUES = [];
+ public static function test() {
+ echo "Start\n";
+ $y = [];
+ foreach ($y as $x) {
+ }
+ echo "Done\n";
+ }
+ public static function test2() {
+ foreach (self::VALUES as $x) {
+ }
+ }
+ public static function test3() {
+ foreach ([] as $k => &$v) {
+ }
+ }
+}
+Loop::test();
+Loop::test2();
+Loop::test3();
+--EXPECTF--
+$_main:
+ ; (lines=7, args=0, vars=0, tmps=0)
+ ; (after optimizer)
+ ; %sdce_009.php:1-23
+0000 INIT_STATIC_METHOD_CALL 0 string("Loop") string("test")
+0001 DO_UCALL
+0002 INIT_STATIC_METHOD_CALL 0 string("Loop") string("test2")
+0003 DO_UCALL
+0004 INIT_STATIC_METHOD_CALL 0 string("Loop") string("test3")
+0005 DO_UCALL
+0006 RETURN int(1)
+
+Loop::test:
+ ; (lines=3, args=0, vars=0, tmps=0)
+ ; (after optimizer)
+ ; %sdce_009.php:4-10
+0000 ECHO string("Start
+")
+0001 ECHO string("Done
+")
+0002 RETURN null
+
+Loop::test2:
+ ; (lines=1, args=0, vars=0, tmps=0)
+ ; (after optimizer)
+ ; %sdce_009.php:11-14
+0000 RETURN null
+
+Loop::test3:
+ ; (lines=3, args=0, vars=0, tmps=1)
+ ; (after optimizer)
+ ; %sdce_009.php:15-18
+0000 V0 = FE_RESET_RW array(...) 0001
+0001 FE_FREE V0
+0002 RETURN null
+Start
+Done
diff --git a/ext/opcache/tests/opt/sccp_024.phpt b/ext/opcache/tests/opt/sccp_024.phpt
index 0e4cbee76a..040baf9d8b 100644
--- a/ext/opcache/tests/opt/sccp_024.phpt
+++ b/ext/opcache/tests/opt/sccp_024.phpt
@@ -38,7 +38,7 @@ A::t:
0003 ECHO T2
0004 T2 = INSTANCEOF CV0($obj) string("self")
0005 ECHO T2
-0006 V3 = FETCH_CLASS (no-autolod) (exception) CV1($c)
+0006 V3 = FETCH_CLASS (no-autoload) (silent) (exception) CV1($c)
0007 T2 = INSTANCEOF CV0($obj) V3
0008 ECHO T2
0009 RETURN null
diff --git a/ext/opcache/tests/opt/sccp_033.phpt b/ext/opcache/tests/opt/sccp_033.phpt
new file mode 100644
index 0000000000..f3fbbb9c28
--- /dev/null
+++ b/ext/opcache/tests/opt/sccp_033.phpt
@@ -0,0 +1,27 @@
+--TEST--
+SCCP: Warning during evaluation of function
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+function test() {
+ $array = ["foo", []];
+ return implode(",", $array);
+}
+
+echo "Before\n";
+var_dump(test());
+echo "After\n";
+
+?>
+--EXPECTF--
+Before
+
+Warning: Array to string conversion in %s on line %d
+string(9) "foo,Array"
+After
diff --git a/ext/opcache/tests/opt/verify_return_type.phpt b/ext/opcache/tests/opt/verify_return_type.phpt
new file mode 100644
index 0000000000..7f52c829a4
--- /dev/null
+++ b/ext/opcache/tests/opt/verify_return_type.phpt
@@ -0,0 +1,116 @@
+--TEST--
+Return type check elision
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.opt_debug_level=0x20000
+opcache.preload=
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+class Test1 {
+ final public function getIntOrFloat(int $i): int|float {
+ return $i;
+ }
+ final public function getInt(): int {
+ return $this->getIntOrFloat();
+ }
+}
+
+class Test2 {
+ public function getInt(): int {
+ return 42;
+ }
+ public function getInt2(): int {
+ return $this->getInt();
+ }
+ public function getIntOrFloat(int $i): int|float {
+ return $i;
+ }
+ public function getInt3(int $i): int {
+ // Should not elide return type check. Test2::getIntOrFloat() returns only int,
+ // but a child method may return int|float.
+ return $this->getIntOrFloat($i);
+ }
+}
+
+class Test3 {
+ private function getBool() {
+ return true;
+ }
+
+ private function getBool2(): bool {
+ return $this->getBool();
+ }
+}
+
+?>
+--EXPECTF--
+$_main:
+ ; (lines=1, args=0, vars=0, tmps=0)
+ ; (after optimizer)
+ ; %s
+0000 RETURN int(1)
+
+Test1::getIntOrFloat:
+ ; (lines=2, args=1, vars=1, tmps=0)
+ ; (after optimizer)
+ ; %s
+0000 CV0($i) = RECV 1
+0001 RETURN CV0($i)
+
+Test1::getInt:
+ ; (lines=3, args=0, vars=0, tmps=1)
+ ; (after optimizer)
+ ; %s
+0000 INIT_METHOD_CALL 0 THIS string("getIntOrFloat")
+0001 V0 = DO_UCALL
+0002 RETURN V0
+
+Test2::getInt:
+ ; (lines=1, args=0, vars=0, tmps=0)
+ ; (after optimizer)
+ ; %s
+0000 RETURN int(42)
+
+Test2::getInt2:
+ ; (lines=3, args=0, vars=0, tmps=1)
+ ; (after optimizer)
+ ; %s
+0000 INIT_METHOD_CALL 0 THIS string("getInt")
+0001 V0 = DO_FCALL
+0002 RETURN V0
+
+Test2::getIntOrFloat:
+ ; (lines=2, args=1, vars=1, tmps=0)
+ ; (after optimizer)
+ ; %s
+0000 CV0($i) = RECV 1
+0001 RETURN CV0($i)
+
+Test2::getInt3:
+ ; (lines=6, args=1, vars=1, tmps=1)
+ ; (after optimizer)
+ ; %s
+0000 CV0($i) = RECV 1
+0001 INIT_METHOD_CALL 1 THIS string("getIntOrFloat")
+0002 SEND_VAR CV0($i) 1
+0003 V1 = DO_FCALL
+0004 VERIFY_RETURN_TYPE V1
+0005 RETURN V1
+
+Test3::getBool:
+ ; (lines=1, args=0, vars=0, tmps=0)
+ ; (after optimizer)
+ ; %s
+0000 RETURN bool(true)
+
+Test3::getBool2:
+ ; (lines=2, args=0, vars=0, tmps=1)
+ ; (after optimizer)
+ ; %s
+0000 V0 = QM_ASSIGN bool(true)
+0001 RETURN bool(true)
diff --git a/ext/opcache/tests/preload_004.phpt b/ext/opcache/tests/preload_004.phpt
index f4dd45a062..c8006dae1c 100644
--- a/ext/opcache/tests/preload_004.phpt
+++ b/ext/opcache/tests/preload_004.phpt
@@ -9,13 +9,16 @@ opcache.preload={PWD}/preload_undef_const.inc
<?php
require_once('skipif.inc');
if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows');
-if (getenv('SKIP_ASAN')) die('xfail Startup failure leak');
?>
--FILE--
<?php
var_dump(class_exists('Foo'));
+try {
+ new Foo();
+} catch (Throwable $ex) {
+ echo $ex->getMessage() . "\n";
+}
?>
--EXPECT--
-Fatal error: Undefined constant self::DOES_NOT_EXIST in Unknown on line 0
-
-Fatal error: Failed to resolve initializers of class Foo during preloading in Unknown on line 0
+bool(true)
+Undefined constant self::DOES_NOT_EXIST
diff --git a/ext/opcache/tests/preload_009.phpt b/ext/opcache/tests/preload_009.phpt
index a13b504cd1..88d0df5fdd 100644
--- a/ext/opcache/tests/preload_009.phpt
+++ b/ext/opcache/tests/preload_009.phpt
@@ -9,14 +9,18 @@ opcache.preload={PWD}/preload_undef_const_2.inc
<?php
require_once('skipif.inc');
if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows');
-if (getenv('SKIP_ASAN')) die('xfail Startup failure leak');
?>
--FILE--
<?php
var_dump(trait_exists('T'));
var_dump(class_exists('Foo'));
+try {
+ new Foo();
+} catch (Throwable $ex) {
+ echo $ex->getMessage() . "\n";
+}
?>
--EXPECT--
-Fatal error: Undefined constant "UNDEF" in Unknown on line 0
-
-Fatal error: Failed to resolve initializers of class Foo during preloading in Unknown on line 0
+bool(true)
+bool(true)
+Undefined constant "UNDEF"
diff --git a/ext/opcache/tests/preload_012.phpt b/ext/opcache/tests/preload_012.phpt
index 7c5ad9aa1a..0ca2ae15b9 100644
--- a/ext/opcache/tests/preload_012.phpt
+++ b/ext/opcache/tests/preload_012.phpt
@@ -11,5 +11,16 @@ require_once('skipif.inc');
if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows');
?>
--FILE--
---EXPECTF--
-Warning: Can't preload class Test with unresolved initializer for constant C in %s on line %d
+<?php
+class Foo {
+}
+var_dump(class_exists('Test'));
+try {
+ new Test();
+} catch (Throwable $ex) {
+ echo $ex->getMessage() . "\n";
+}
+?>
+--EXPECT--
+bool(true)
+Undefined constant Foo::BAR
diff --git a/ext/opcache/tests/preload_ind.phpt b/ext/opcache/tests/preload_ind.phpt
index 158fc15ab6..4f0c625b08 100644
--- a/ext/opcache/tests/preload_ind.phpt
+++ b/ext/opcache/tests/preload_ind.phpt
@@ -12,6 +12,5 @@ if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows
?>
--FILE--
OK
---EXPECTF--
-Warning: Can't preload class C with unresolved property types in %s on line %d
+--EXPECT--
OK
diff --git a/ext/opcache/tests/preload_loadable_classes_2.phpt b/ext/opcache/tests/preload_loadable_classes_2.phpt
index 665f3157e2..8d4e8e3712 100644
--- a/ext/opcache/tests/preload_loadable_classes_2.phpt
+++ b/ext/opcache/tests/preload_loadable_classes_2.phpt
@@ -9,11 +9,17 @@ opcache.preload={PWD}/preload_loadable_classes_2.inc
<?php
require_once('skipif.inc');
if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows');
-if (getenv('SKIP_ASAN')) die('xfail Startup failure leak');
?>
--FILE--
-Unreachable
+<?php
+const UNDEF = 1;
+class Foo {
+ const UNDEF = 2;
+}
+var_dump(class_exists("Test"));
+var_dump(Test::X);
+var_dump(Test::Y);
--EXPECT--
-Fatal error: Undefined constant "UNDEF" in Unknown on line 0
-
-Fatal error: Failed to resolve initializers of class Test during preloading in Unknown on line 0
+bool(true)
+int(1)
+int(2)
diff --git a/ext/opcache/tests/preload_loadable_classes_3.phpt b/ext/opcache/tests/preload_loadable_classes_3.phpt
index 97309a6fcc..b12cc9d3cd 100644
--- a/ext/opcache/tests/preload_loadable_classes_3.phpt
+++ b/ext/opcache/tests/preload_loadable_classes_3.phpt
@@ -9,9 +9,15 @@ opcache.preload={PWD}/preload_loadable_classes_3.inc
<?php
require_once('skipif.inc');
if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows');
-if (getenv('SKIP_ASAN')) die('xfail Startup failure leak');
?>
--FILE--
-Unreachable
+<?php
+class Foo {
+}
+var_dump(new Test);
+?>
--EXPECT--
-Fatal error: Failed to load class Foo used by typed property Test::$prop during preloading in Unknown on line 0
+object(Test)#1 (0) {
+ ["prop":protected]=>
+ uninitialized(Foo)
+}
diff --git a/ext/opcache/tests/preload_method_static_vars.phpt b/ext/opcache/tests/preload_method_static_vars.phpt
index f3d211793c..05716c91e5 100644
--- a/ext/opcache/tests/preload_method_static_vars.phpt
+++ b/ext/opcache/tests/preload_method_static_vars.phpt
@@ -18,8 +18,8 @@ Bar::test();
--EXPECT--
int(1)
int(2)
+int(1)
int(2)
-int(3)
int(1)
int(1)
diff --git a/ext/opcache/tests/preload_unresolved_prop_type.phpt b/ext/opcache/tests/preload_unresolved_prop_type.phpt
index 3e2accd19e..9e0b3570ee 100644
--- a/ext/opcache/tests/preload_unresolved_prop_type.phpt
+++ b/ext/opcache/tests/preload_unresolved_prop_type.phpt
@@ -11,7 +11,12 @@ require_once('skipif.inc');
if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows');
?>
--FILE--
+<?php
+class Unknown {
+}
+$x = new Test;
+$x->prop = new Unknown;
+?>
===DONE===
---EXPECTF--
-Warning: Can't preload class Test with unresolved property types in %s on line %d
+--EXPECT--
===DONE===
diff --git a/ext/opcache/tests/zzz_basic_logging.phpt b/ext/opcache/tests/zzz_basic_logging.phpt
index bf04b50861..0fbf308a51 100644
--- a/ext/opcache/tests/zzz_basic_logging.phpt
+++ b/ext/opcache/tests/zzz_basic_logging.phpt
@@ -12,7 +12,11 @@ opcache.log_verbosity_level=4
opcache.huge_code_pages=0
opcache.preload=
--SKIPIF--
-<?php require_once('skipif.inc'); ?>
+<?php
+require_once('skipif.inc');
+// Prints "Debug Restarting!" message on next request.
+if (getenv('SKIP_REPEAT')) die("skip Not repeatable");
+?>
--FILE--
<?php
echo "Foo Bar\n";
diff --git a/ext/opcache/zend_accelerator_blacklist.c b/ext/opcache/zend_accelerator_blacklist.c
index febe38aa92..df9417db34 100644
--- a/ext/opcache/zend_accelerator_blacklist.c
+++ b/ext/opcache/zend_accelerator_blacklist.c
@@ -60,7 +60,7 @@ void zend_accel_blacklist_init(zend_blacklist *blacklist)
blacklist->entries = (zend_blacklist_entry *) calloc(sizeof(zend_blacklist_entry), blacklist->size);
if (!blacklist->entries) {
- zend_accel_error(ACCEL_LOG_FATAL, "Blacklist initialization: no memory\n");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Blacklist initialization: no memory\n");
return;
}
blacklist->regexp_list = NULL;
@@ -68,7 +68,7 @@ void zend_accel_blacklist_init(zend_blacklist *blacklist)
static void blacklist_report_regexp_error(const char *pcre_error, int pcre_error_offset)
{
- zend_accel_error(ACCEL_LOG_ERROR, "Blacklist compilation failed (offset: %d), %s\n", pcre_error_offset, pcre_error);
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Blacklist compilation failed (offset: %d), %s\n", pcre_error_offset, pcre_error);
}
static void zend_accel_blacklist_update_regexp(zend_blacklist *blacklist)
@@ -163,7 +163,7 @@ static void zend_accel_blacklist_update_regexp(zend_blacklist *blacklist)
if (*c || i == blacklist->pos - 1) {
if (*c) {
if (!backtrack) {
- zend_accel_error(ACCEL_LOG_ERROR, "Too long blacklist entry\n");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Too long blacklist entry\n");
}
p = backtrack;
} else {
@@ -173,7 +173,7 @@ static void zend_accel_blacklist_update_regexp(zend_blacklist *blacklist)
it = (zend_regexp_list*)malloc(sizeof(zend_regexp_list));
if (!it) {
- zend_accel_error(ACCEL_LOG_ERROR, "malloc() failed\n");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "malloc() failed\n");
return;
}
it->next = NULL;
@@ -304,7 +304,7 @@ static void zend_accel_blacklist_loadone(zend_blacklist *blacklist, char *filena
blacklist->entries[blacklist->pos].path_length = path_length;
blacklist->entries[blacklist->pos].path = (char *)malloc(path_length + 1);
if (!blacklist->entries[blacklist->pos].path) {
- zend_accel_error(ACCEL_LOG_ERROR, "malloc() failed\n");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "malloc() failed\n");
fclose(fp);
return;
}
@@ -346,7 +346,7 @@ void zend_accel_blacklist_load(zend_blacklist *blacklist, char *filename)
zend_accel_blacklist_update_regexp(blacklist);
}
-zend_bool zend_accel_blacklist_is_blacklisted(zend_blacklist *blacklist, char *verify_path, size_t verify_path_len)
+bool zend_accel_blacklist_is_blacklisted(zend_blacklist *blacklist, char *verify_path, size_t verify_path_len)
{
int ret = 0;
zend_regexp_list *regexp_list_it = blacklist->regexp_list;
diff --git a/ext/opcache/zend_accelerator_blacklist.h b/ext/opcache/zend_accelerator_blacklist.h
index 16c75bb396..a75a0e1ed8 100644
--- a/ext/opcache/zend_accelerator_blacklist.h
+++ b/ext/opcache/zend_accelerator_blacklist.h
@@ -45,7 +45,7 @@ void zend_accel_blacklist_init(zend_blacklist *blacklist);
void zend_accel_blacklist_shutdown(zend_blacklist *blacklist);
void zend_accel_blacklist_load(zend_blacklist *blacklist, char *filename);
-zend_bool zend_accel_blacklist_is_blacklisted(zend_blacklist *blacklist, char *verify_path, size_t verify_path_len);
+bool zend_accel_blacklist_is_blacklisted(zend_blacklist *blacklist, char *verify_path, size_t verify_path_len);
void zend_accel_blacklist_apply(zend_blacklist *blacklist, blacklist_apply_func_arg_t func, void *argument);
#endif /* ZEND_ACCELERATOR_BLACKLIST_H */
diff --git a/ext/opcache/zend_accelerator_debug.c b/ext/opcache/zend_accelerator_debug.c
index f91c269975..a3db2a7215 100644
--- a/ext/opcache/zend_accelerator_debug.c
+++ b/ext/opcache/zend_accelerator_debug.c
@@ -28,9 +28,8 @@
#endif
#include "ZendAccelerator.h"
-void zend_accel_error(int type, const char *format, ...)
+static void zend_accel_error_va_args(int type, const char *format, va_list args)
{
- va_list args;
time_t timestamp;
char *time_string;
FILE * fLog = NULL;
@@ -77,9 +76,7 @@ void zend_accel_error(int type, const char *format, ...)
break;
}
- va_start(args, format);
vfprintf(fLog, format, args);
- va_end(args);
fprintf(fLog, "\n");
fflush(fLog);
@@ -98,3 +95,22 @@ void zend_accel_error(int type, const char *format, ...)
}
}
+
+void zend_accel_error(int type, const char *format, ...)
+{
+ va_list args;
+ va_start(args, format);
+ zend_accel_error_va_args(type, format, args);
+ va_end(args);
+}
+
+ZEND_NORETURN void zend_accel_error_noreturn(int type, const char *format, ...)
+{
+ va_list args;
+ va_start(args, format);
+ ZEND_ASSERT(type == ACCEL_LOG_FATAL || type == ACCEL_LOG_ERROR);
+ zend_accel_error_va_args(type, format, args);
+ va_end(args);
+ /* Should never reach this. */
+ abort();
+}
diff --git a/ext/opcache/zend_accelerator_debug.h b/ext/opcache/zend_accelerator_debug.h
index 234d0367de..61456096d1 100644
--- a/ext/opcache/zend_accelerator_debug.h
+++ b/ext/opcache/zend_accelerator_debug.h
@@ -29,5 +29,6 @@
#define ACCEL_LOG_DEBUG 4
void zend_accel_error(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
+ZEND_NORETURN void zend_accel_error_noreturn(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
#endif /* _ZEND_ACCELERATOR_DEBUG_H */
diff --git a/ext/opcache/zend_accelerator_hash.c b/ext/opcache/zend_accelerator_hash.c
index 7cd9ef1ef4..a39b6a3ecf 100644
--- a/ext/opcache/zend_accelerator_hash.c
+++ b/ext/opcache/zend_accelerator_hash.c
@@ -54,14 +54,14 @@ void zend_accel_hash_init(zend_accel_hash *accel_hash, uint32_t hash_size)
/* set up hash pointers table */
accel_hash->hash_table = zend_shared_alloc(sizeof(zend_accel_hash_entry *)*accel_hash->max_num_entries);
if (!accel_hash->hash_table) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return;
}
/* set up hash values table */
accel_hash->hash_entries = zend_shared_alloc(sizeof(zend_accel_hash_entry)*accel_hash->max_num_entries);
if (!accel_hash->hash_entries) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return;
}
memset(accel_hash->hash_table, 0, sizeof(zend_accel_hash_entry *)*accel_hash->max_num_entries);
@@ -71,7 +71,7 @@ void zend_accel_hash_init(zend_accel_hash *accel_hash, uint32_t hash_size)
* Returns pointer the actual hash entry on success
* key needs to be already allocated as it is not copied
*/
-zend_accel_hash_entry* zend_accel_hash_update(zend_accel_hash *accel_hash, const char *key, uint32_t key_length, zend_bool indirect, void *data)
+zend_accel_hash_entry* zend_accel_hash_update(zend_accel_hash *accel_hash, zend_string *key, bool indirect, void *data)
{
zend_ulong hash_value;
zend_ulong index;
@@ -85,7 +85,7 @@ zend_accel_hash_entry* zend_accel_hash_update(zend_accel_hash *accel_hash, const
}
}
- hash_value = zend_inline_hash_func(key, key_length);
+ hash_value = zend_string_hash_val(key);
#ifndef ZEND_WIN32
hash_value ^= ZCG(root_hash);
#endif
@@ -95,8 +95,7 @@ zend_accel_hash_entry* zend_accel_hash_update(zend_accel_hash *accel_hash, const
entry = accel_hash->hash_table[index];
while (entry) {
if (entry->hash_value == hash_value
- && entry->key_length == key_length
- && !memcmp(entry->key, key, key_length)) {
+ && zend_string_equals(entry->key, key)) {
if (entry->indirect) {
if (indirect_bucket) {
@@ -134,17 +133,18 @@ zend_accel_hash_entry* zend_accel_hash_update(zend_accel_hash *accel_hash, const
}
entry->hash_value = hash_value;
entry->key = key;
- entry->key_length = key_length;
entry->next = accel_hash->hash_table[index];
accel_hash->hash_table[index] = entry;
return entry;
}
-static zend_always_inline void* zend_accel_hash_find_ex(zend_accel_hash *accel_hash, const char *key, uint32_t key_length, zend_ulong hash_value, int data)
+static zend_always_inline void* zend_accel_hash_find_ex(zend_accel_hash *accel_hash, zend_string *key, int data)
{
zend_ulong index;
zend_accel_hash_entry *entry;
+ zend_ulong hash_value;
+ hash_value = zend_string_hash_val(key);
#ifndef ZEND_WIN32
hash_value ^= ZCG(root_hash);
#endif
@@ -153,8 +153,7 @@ static zend_always_inline void* zend_accel_hash_find_ex(zend_accel_hash *accel_h
entry = accel_hash->hash_table[index];
while (entry) {
if (entry->hash_value == hash_value
- && entry->key_length == key_length
- && !memcmp(entry->key, key, key_length)) {
+ && zend_string_equals(entry->key, key)) {
if (entry->indirect) {
if (data) {
return ((zend_accel_hash_entry*)entry->data)->data;
@@ -179,12 +178,7 @@ static zend_always_inline void* zend_accel_hash_find_ex(zend_accel_hash *accel_h
*/
void* zend_accel_hash_find(zend_accel_hash *accel_hash, zend_string *key)
{
- return zend_accel_hash_find_ex(
- accel_hash,
- ZSTR_VAL(key),
- ZSTR_LEN(key),
- zend_string_hash_val(key),
- 1);
+ return zend_accel_hash_find_ex(accel_hash, key, 1);
}
/* Returns the hash entry associated with key on success
@@ -192,47 +186,16 @@ void* zend_accel_hash_find(zend_accel_hash *accel_hash, zend_string *key)
*/
zend_accel_hash_entry* zend_accel_hash_find_entry(zend_accel_hash *accel_hash, zend_string *key)
{
- return (zend_accel_hash_entry *)zend_accel_hash_find_ex(
- accel_hash,
- ZSTR_VAL(key),
- ZSTR_LEN(key),
- zend_string_hash_val(key),
- 0);
-}
-
-/* Returns the data associated with key on success
- * Returns NULL if data doesn't exist
- */
-void* zend_accel_hash_str_find(zend_accel_hash *accel_hash, const char *key, uint32_t key_length)
-{
- return zend_accel_hash_find_ex(
- accel_hash,
- key,
- key_length,
- zend_inline_hash_func(key, key_length),
- 1);
-}
-
-/* Returns the hash entry associated with key on success
- * Returns NULL if it doesn't exist
- */
-zend_accel_hash_entry* zend_accel_hash_str_find_entry(zend_accel_hash *accel_hash, const char *key, uint32_t key_length)
-{
- return (zend_accel_hash_entry *)zend_accel_hash_find_ex(
- accel_hash,
- key,
- key_length,
- zend_inline_hash_func(key, key_length),
- 0);
+ return (zend_accel_hash_entry *)zend_accel_hash_find_ex(accel_hash, key, 0);
}
-int zend_accel_hash_unlink(zend_accel_hash *accel_hash, const char *key, uint32_t key_length)
+int zend_accel_hash_unlink(zend_accel_hash *accel_hash, zend_string *key)
{
zend_ulong hash_value;
zend_ulong index;
zend_accel_hash_entry *entry, *last_entry=NULL;
- hash_value = zend_inline_hash_func(key, key_length);
+ hash_value = zend_string_hash_val(key);
#ifndef ZEND_WIN32
hash_value ^= ZCG(root_hash);
#endif
@@ -241,8 +204,7 @@ int zend_accel_hash_unlink(zend_accel_hash *accel_hash, const char *key, uint32_
entry = accel_hash->hash_table[index];
while (entry) {
if (entry->hash_value == hash_value
- && entry->key_length == key_length
- && !memcmp(entry->key, key, key_length)) {
+ && zend_string_equals(entry->key, key)) {
if (!entry->indirect) {
accel_hash->num_direct_entries--;
}
diff --git a/ext/opcache/zend_accelerator_hash.h b/ext/opcache/zend_accelerator_hash.h
index dc18ca54e1..f3df0c0885 100644
--- a/ext/opcache/zend_accelerator_hash.h
+++ b/ext/opcache/zend_accelerator_hash.h
@@ -46,11 +46,10 @@ typedef struct _zend_accel_hash_entry zend_accel_hash_entry;
struct _zend_accel_hash_entry {
zend_ulong hash_value;
- const char *key;
+ zend_string *key;
zend_accel_hash_entry *next;
void *data;
- uint32_t key_length;
- zend_bool indirect;
+ bool indirect;
};
typedef struct _zend_accel_hash {
@@ -66,9 +65,8 @@ void zend_accel_hash_clean(zend_accel_hash *accel_hash);
zend_accel_hash_entry* zend_accel_hash_update(
zend_accel_hash *accel_hash,
- const char *key,
- uint32_t key_length,
- zend_bool indirect,
+ zend_string *key,
+ bool indirect,
void *data);
void* zend_accel_hash_find(
@@ -79,22 +77,11 @@ zend_accel_hash_entry* zend_accel_hash_find_entry(
zend_accel_hash *accel_hash,
zend_string *key);
-void* zend_accel_hash_str_find(
- zend_accel_hash *accel_hash,
- const char *key,
- uint32_t key_length);
-
-zend_accel_hash_entry* zend_accel_hash_str_find_entry(
- zend_accel_hash *accel_hash,
- const char *key,
- uint32_t key_length);
-
int zend_accel_hash_unlink(
zend_accel_hash *accel_hash,
- const char *key,
- uint32_t key_length);
+ zend_string *key);
-static inline zend_bool zend_accel_hash_is_full(zend_accel_hash *accel_hash)
+static inline bool zend_accel_hash_is_full(zend_accel_hash *accel_hash)
{
if (accel_hash->num_entries == accel_hash->max_num_entries) {
return 1;
diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c
index d68ab9531a..e8b4fb6e8e 100644
--- a/ext/opcache/zend_accelerator_module.c
+++ b/ext/opcache/zend_accelerator_module.c
@@ -116,7 +116,7 @@ static ZEND_INI_MH(OnEnable)
return OnUpdateBool(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
} else {
/* It may be only temporary disabled */
- zend_bool *p = (zend_bool *) ZEND_INI_GET_ADDR();
+ bool *p = (bool *) ZEND_INI_GET_ADDR();
if ((ZSTR_LEN(new_value) == 2 && strcasecmp("on", ZSTR_VAL(new_value)) == 0) ||
(ZSTR_LEN(new_value) == 3 && strcasecmp("yes", ZSTR_VAL(new_value)) == 0) ||
(ZSTR_LEN(new_value) == 4 && strcasecmp("true", ZSTR_VAL(new_value)) == 0) ||
@@ -310,17 +310,21 @@ ZEND_INI_END()
static int filename_is_in_cache(zend_string *filename)
{
- char *key;
- int key_length;
+ zend_string *key;
- key = accel_make_persistent_key(ZSTR_VAL(filename), ZSTR_LEN(filename), &key_length);
+ key = accel_make_persistent_key(filename);
if (key != NULL) {
- zend_persistent_script *persistent_script = zend_accel_hash_str_find(&ZCSG(hash), key, key_length);
+ zend_persistent_script *persistent_script = zend_accel_hash_find(&ZCSG(hash), key);
if (persistent_script && !persistent_script->corrupted) {
if (ZCG(accel_directives).validate_timestamps) {
zend_file_handle handle;
- zend_stream_init_filename(&handle, ZSTR_VAL(filename));
- return validate_timestamp_and_record_ex(persistent_script, &handle) == SUCCESS;
+ int ret;
+
+ zend_stream_init_filename_ex(&handle, filename);
+ ret = validate_timestamp_and_record_ex(persistent_script, &handle) == SUCCESS
+ ? 1 : 0;
+ zend_destroy_file_handle(&handle);
+ return ret;
}
return 1;
@@ -332,15 +336,14 @@ static int filename_is_in_cache(zend_string *filename)
static int accel_file_in_cache(INTERNAL_FUNCTION_PARAMETERS)
{
- zval zfilename;
+ if (ZEND_NUM_ARGS() == 1) {
+ zval *zv = ZEND_CALL_ARG(execute_data , 1);
- if (ZEND_NUM_ARGS() != 1 ||
- zend_get_parameters_array_ex(1, &zfilename) == FAILURE ||
- Z_TYPE(zfilename) != IS_STRING ||
- Z_STRLEN(zfilename) == 0) {
- return 0;
+ if (Z_TYPE_P(zv) == IS_STRING && Z_STRLEN_P(zv) != 0) {
+ return filename_is_in_cache(Z_STR_P(zv));
+ }
}
- return filename_is_in_cache(Z_STR(zfilename));
+ return 0;
}
static ZEND_NAMED_FUNCTION(accel_file_exists)
@@ -559,7 +562,7 @@ static int accelerator_get_scripts(zval *return_value)
timerclear(&exec_time);
timerclear(&fetch_time);
- zend_hash_str_update(Z_ARRVAL_P(return_value), cache_entry->key, cache_entry->key_length, &persistent_script_report);
+ zend_hash_update(Z_ARRVAL_P(return_value), cache_entry->key, &persistent_script_report);
}
}
accelerator_shm_read_unlock();
@@ -572,7 +575,7 @@ ZEND_FUNCTION(opcache_get_status)
{
zend_long reqs;
zval memory_usage, statistics, scripts;
- zend_bool fetch_scripts = 1;
+ bool fetch_scripts = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &fetch_scripts) == FAILURE) {
RETURN_THROWS();
@@ -837,11 +840,10 @@ ZEND_FUNCTION(opcache_reset)
/* {{{ Invalidates cached script (in necessary or forced) */
ZEND_FUNCTION(opcache_invalidate)
{
- char *script_name;
- size_t script_name_len;
- zend_bool force = 0;
+ zend_string *script_name;
+ bool force = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|b", &script_name, &script_name_len, &force) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|b", &script_name, &force) == FAILURE) {
RETURN_THROWS();
}
@@ -849,7 +851,7 @@ ZEND_FUNCTION(opcache_invalidate)
RETURN_FALSE;
}
- if (zend_accel_invalidate(script_name, script_name_len, force) == SUCCESS) {
+ if (zend_accel_invalidate(script_name, force) == SUCCESS) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -858,14 +860,13 @@ ZEND_FUNCTION(opcache_invalidate)
ZEND_FUNCTION(opcache_compile_file)
{
- char *script_name;
- size_t script_name_len;
+ zend_string *script_name;
zend_file_handle handle;
zend_op_array *op_array = NULL;
zend_execute_data *orig_execute_data = NULL;
uint32_t orig_compiler_options;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &script_name, &script_name_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "S", &script_name) == FAILURE) {
RETURN_THROWS();
}
@@ -874,7 +875,7 @@ ZEND_FUNCTION(opcache_compile_file)
RETURN_FALSE;
}
- zend_stream_init_filename(&handle, script_name);
+ zend_stream_init_filename_ex(&handle, script_name);
orig_execute_data = EG(current_execute_data);
orig_compiler_options = CG(compiler_options);
@@ -890,7 +891,7 @@ ZEND_FUNCTION(opcache_compile_file)
op_array = persistent_compile_file(&handle, ZEND_INCLUDE);
} zend_catch {
EG(current_execute_data) = orig_execute_data;
- zend_error(E_WARNING, ACCELERATOR_PRODUCT_NAME " could not compile file %s", handle.filename);
+ zend_error(E_WARNING, ACCELERATOR_PRODUCT_NAME " could not compile file %s", ZSTR_VAL(handle.filename));
} zend_end_try();
}
@@ -911,9 +912,9 @@ ZEND_FUNCTION(opcache_is_script_cached)
{
zend_string *script_name;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "S", &script_name) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_STR(script_name)
+ ZEND_PARSE_PARAMETERS_END();
if (!validate_api_restriction()) {
RETURN_FALSE;
diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c
index cfd70eec12..6f101b0915 100644
--- a/ext/opcache/zend_accelerator_util_funcs.c
+++ b/ext/opcache/zend_accelerator_util_funcs.c
@@ -25,22 +25,6 @@
#include "zend_persist.h"
#include "zend_shared_alloc.h"
-#if SIZEOF_SIZE_T <= SIZEOF_ZEND_LONG
-/* If sizeof(void*) == sizeof(zend_ulong) we can use zend_hash index functions */
-# define accel_xlat_set(old, new) zend_hash_index_add_new_ptr(&ZCG(bind_hash), (zend_ulong)(zend_uintptr_t)(old), (new))
-# define accel_xlat_get(old) zend_hash_index_find_ptr(&ZCG(bind_hash), (zend_ulong)(zend_uintptr_t)(old))
-#else
-# define accel_xlat_set(old, new) zend_hash_str_add_new_ptr(&ZCG(bind_hash), (char*)&(old), sizeof(void*), (new))
-# define accel_xlat_get(old) zend_hash_str_find_ptr(&ZCG(bind_hash), (char*)&(old), sizeof(void*))
-#endif
-
-#define IN_ARENA(ptr) \
- ((void*)(ptr) >= ZCG(current_persistent_script)->arena_mem && \
- (void*)(ptr) < (void*)((char*)ZCG(current_persistent_script)->arena_mem + ZCG(current_persistent_script)->arena_size))
-
-#define ARENA_REALLOC(ptr) \
- (void*)(((char*)(ptr)) + ((char*)ZCG(arena_mem) - (char*)ZCG(current_persistent_script)->arena_mem))
-
typedef int (*id_function_t)(void *, void *);
typedef void (*unique_copy_ctor_func_t)(void *pElement);
@@ -140,288 +124,6 @@ void zend_accel_move_user_classes(HashTable *src, uint32_t count, zend_script *s
src->pDestructor = orig_dtor;
}
-static void zend_hash_clone_constants(HashTable *ht)
-{
- Bucket *p, *end;
- zend_class_constant *c;
-
- if (HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) {
- return;
- }
-
- p = emalloc(HT_SIZE(ht));
- memcpy(p, HT_GET_DATA_ADDR(ht), HT_USED_SIZE(ht));
- HT_SET_DATA_ADDR(ht, p);
-
- p = ht->arData;
- end = p + ht->nNumUsed;
- for (; p != end; p++) {
- ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
- c = Z_PTR(p->val);
- if (IN_ARENA(c)) {
- c = ARENA_REALLOC(c);
- Z_PTR(p->val) = c;
-
- if (IN_ARENA(c->ce)) {
- c->ce = ARENA_REALLOC(c->ce);
- }
- }
- }
-}
-
-static void zend_hash_clone_methods(HashTable *ht)
-{
- Bucket *p, *end;
- zend_op_array *new_entry;
-
- ht->pDestructor = ZEND_FUNCTION_DTOR;
-
- if (HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) {
- return;
- }
-
- p = emalloc(HT_SIZE(ht));
- memcpy(p, HT_GET_DATA_ADDR(ht), HT_USED_SIZE(ht));
- HT_SET_DATA_ADDR(ht, p);
-
- p = ht->arData;
- end = p + ht->nNumUsed;
- for (; p != end; p++) {
- ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
- new_entry = Z_PTR(p->val);
- if (IN_ARENA(new_entry)) {
- new_entry = ARENA_REALLOC(new_entry);
- Z_PTR(p->val) = new_entry;
-
- if (IN_ARENA(new_entry->scope)) {
- new_entry->scope = ARENA_REALLOC(new_entry->scope);
-
- /* update prototype */
- if (IN_ARENA(new_entry->prototype)) {
- new_entry->prototype = ARENA_REALLOC(new_entry->prototype);
- }
- }
- if (IN_ARENA(ZEND_MAP_PTR(new_entry->run_time_cache))) {
- ZEND_MAP_PTR_INIT(new_entry->run_time_cache, ARENA_REALLOC(ZEND_MAP_PTR(new_entry->run_time_cache)));
- }
- ZEND_MAP_PTR_INIT(new_entry->static_variables_ptr, &new_entry->static_variables);
- }
- }
-}
-
-static void zend_hash_clone_prop_info(HashTable *ht)
-{
- Bucket *p, *end;
- zend_property_info *prop_info;
-
- if (HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) {
- return;
- }
-
- p = emalloc(HT_SIZE(ht));
- memcpy(p, HT_GET_DATA_ADDR(ht), HT_USED_SIZE(ht));
- HT_SET_DATA_ADDR(ht, p);
-
- p = ht->arData;
- end = p + ht->nNumUsed;
- for (; p != end; p++) {
- ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
- prop_info = Z_PTR(p->val);
- if (IN_ARENA(prop_info)) {
- prop_info = ARENA_REALLOC(prop_info);
- Z_PTR(p->val) = prop_info;
-
- if (IN_ARENA(prop_info->ce)) {
- prop_info->ce = ARENA_REALLOC(prop_info->ce);
- }
-
- if (ZEND_TYPE_HAS_LIST(prop_info->type)) {
- zend_type_list *list = ZEND_TYPE_LIST(prop_info->type);
- if (IN_ARENA(list)) {
- list = ARENA_REALLOC(list);
- ZEND_TYPE_SET_PTR(prop_info->type, list);
-
- zend_type *list_type;
- ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(prop_info->type), list_type) {
- if (ZEND_TYPE_HAS_CE(*list_type)) {
- zend_class_entry *ce = ZEND_TYPE_CE(*list_type);
- if (IN_ARENA(ce)) {
- ce = ARENA_REALLOC(ce);
- ZEND_TYPE_SET_PTR(*list_type, ce);
- }
- }
- } ZEND_TYPE_LIST_FOREACH_END();
- }
- } else if (ZEND_TYPE_HAS_CE(prop_info->type)) {
- zend_class_entry *ce = ZEND_TYPE_CE(prop_info->type);
- if (IN_ARENA(ce)) {
- ce = ARENA_REALLOC(ce);
- ZEND_TYPE_SET_PTR(prop_info->type, ce);
- }
- }
- }
- }
-}
-
-#define zend_update_inherited_handler(handler) \
-{ \
- if (ce->handler != NULL && IN_ARENA(ce->handler)) { \
- ce->handler = ARENA_REALLOC(ce->handler); \
- } \
-}
-
-/* Protects class' refcount, copies default properties, functions and class name */
-static void zend_class_copy_ctor(zend_class_entry **pce)
-{
- zend_class_entry *ce = *pce;
- zval *src, *dst, *end;
-
- *pce = ce = ARENA_REALLOC(ce);
- ce->refcount = 1;
-
- if ((ce->ce_flags & ZEND_ACC_LINKED) && IN_ARENA(ce->parent)) {
- ce->parent = ARENA_REALLOC(ce->parent);
- }
-
- if (ce->default_properties_table) {
- dst = emalloc(sizeof(zval) * ce->default_properties_count);
- src = ce->default_properties_table;
- end = src + ce->default_properties_count;
- ce->default_properties_table = dst;
- for (; src != end; src++, dst++) {
- ZVAL_COPY_VALUE_PROP(dst, src);
- }
- }
-
- zend_hash_clone_methods(&ce->function_table);
-
- /* static members */
- if (ce->default_static_members_table) {
- int i, end;
- zend_class_entry *parent = !(ce->ce_flags & ZEND_ACC_LINKED) ? NULL : ce->parent;
-
- dst = emalloc(sizeof(zval) * ce->default_static_members_count);
- src = ce->default_static_members_table;
- ce->default_static_members_table = dst;
- i = ce->default_static_members_count - 1;
-
- /* Copy static properties in this class */
- end = parent ? parent->default_static_members_count : 0;
- for (; i >= end; i--) {
- zval *p = &dst[i];
- ZVAL_COPY_VALUE(p, &src[i]);
- }
-
- /* Create indirections to static properties from parent classes */
- while (parent && parent->default_static_members_table) {
- end = parent->parent ? parent->parent->default_static_members_count : 0;
- for (; i >= end; i--) {
- zval *p = &dst[i];
- ZVAL_INDIRECT(p, &parent->default_static_members_table[i]);
- }
-
- parent = parent->parent;
- }
- }
- ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
-
- /* properties_info */
- zend_hash_clone_prop_info(&ce->properties_info);
-
- /* constants table */
- zend_hash_clone_constants(&ce->constants_table);
-
- if (ce->properties_info_table) {
- int i;
- ce->properties_info_table = ARENA_REALLOC(ce->properties_info_table);
- for (i = 0; i < ce->default_properties_count; i++) {
- if (IN_ARENA(ce->properties_info_table[i])) {
- ce->properties_info_table[i] = ARENA_REALLOC(ce->properties_info_table[i]);
- }
- }
- }
-
- if (ce->num_interfaces) {
- zend_class_name *interface_names;
-
- if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
- interface_names = emalloc(sizeof(zend_class_name) * ce->num_interfaces);
- memcpy(interface_names, ce->interface_names, sizeof(zend_class_name) * ce->num_interfaces);
- ce->interface_names = interface_names;
- } else {
- zend_class_entry **interfaces = emalloc(sizeof(zend_class_entry*) * ce->num_interfaces);
- uint32_t i;
-
- for (i = 0; i < ce->num_interfaces; i++) {
- if (IN_ARENA(ce->interfaces[i])) {
- interfaces[i] = ARENA_REALLOC(ce->interfaces[i]);
- } else {
- interfaces[i] = ce->interfaces[i];
- }
- }
- ce->interfaces = interfaces;
- }
- }
-
- zend_update_inherited_handler(constructor);
- zend_update_inherited_handler(destructor);
- zend_update_inherited_handler(clone);
- zend_update_inherited_handler(__get);
- zend_update_inherited_handler(__set);
- zend_update_inherited_handler(__call);
- zend_update_inherited_handler(__isset);
- zend_update_inherited_handler(__unset);
- zend_update_inherited_handler(__tostring);
- zend_update_inherited_handler(__callstatic);
- zend_update_inherited_handler(__debugInfo);
- zend_update_inherited_handler(__serialize);
- zend_update_inherited_handler(__unserialize);
-
-/* 5.4 traits */
- if (ce->num_traits) {
- zend_class_name *trait_names = emalloc(sizeof(zend_class_name) * ce->num_traits);
-
- memcpy(trait_names, ce->trait_names, sizeof(zend_class_name) * ce->num_traits);
- ce->trait_names = trait_names;
-
- if (ce->trait_aliases) {
- zend_trait_alias **trait_aliases;
- int i = 0;
-
- while (ce->trait_aliases[i]) {
- i++;
- }
- trait_aliases = emalloc(sizeof(zend_trait_alias*) * (i + 1));
- i = 0;
- while (ce->trait_aliases[i]) {
- trait_aliases[i] = emalloc(sizeof(zend_trait_alias));
- memcpy(trait_aliases[i], ce->trait_aliases[i], sizeof(zend_trait_alias));
- i++;
- }
- trait_aliases[i] = NULL;
- ce->trait_aliases = trait_aliases;
- }
-
- if (ce->trait_precedences) {
- zend_trait_precedence **trait_precedences;
- int i = 0;
-
- while (ce->trait_precedences[i]) {
- i++;
- }
- trait_precedences = emalloc(sizeof(zend_trait_precedence*) * (i + 1));
- i = 0;
- while (ce->trait_precedences[i]) {
- trait_precedences[i] = emalloc(sizeof(zend_trait_precedence) + (ce->trait_precedences[i]->num_excludes - 1) * sizeof(zend_string*));
- memcpy(trait_precedences[i], ce->trait_precedences[i], sizeof(zend_trait_precedence) + (ce->trait_precedences[i]->num_excludes - 1) * sizeof(zend_string*));
- i++;
- }
- trait_precedences[i] = NULL;
- ce->trait_precedences = trait_precedences;
- }
- }
-}
-
static void zend_accel_function_hash_copy(HashTable *target, HashTable *source)
{
zend_function *function1, *function2;
@@ -436,67 +138,9 @@ static void zend_accel_function_hash_copy(HashTable *target, HashTable *source)
ZEND_ASSERT(p->key);
t = zend_hash_find_ex(target, p->key, 1);
if (UNEXPECTED(t != NULL)) {
- if (EXPECTED(ZSTR_LEN(p->key) > 0) && EXPECTED(ZSTR_VAL(p->key)[0] == 0)) {
- /* Runtime definition key. There are two circumstances under which the key can
- * already be defined:
- * 1. The file has been re-included without being changed in the meantime. In
- * this case we can keep the old value, because we know that the definition
- * hasn't changed.
- * 2. The file has been changed in the meantime, but the RTD key ends up colliding.
- * This would be a bug.
- * As we can't distinguish these cases, we assume that it is 1. and keep the old
- * value. */
- continue;
- } else {
- goto failure;
- }
- } else {
- _zend_hash_append_ptr(target, p->key, Z_PTR(p->val));
- }
- }
- target->nInternalPointer = 0;
- return;
-
-failure:
- function1 = Z_PTR(p->val);
- function2 = Z_PTR_P(t);
- CG(in_compilation) = 1;
- zend_set_compiled_filename(function1->op_array.filename);
- CG(zend_lineno) = function1->op_array.opcodes[0].lineno;
- if (function2->type == ZEND_USER_FUNCTION
- && function2->op_array.last > 0) {
- zend_error(E_ERROR, "Cannot redeclare %s() (previously declared in %s:%d)",
- ZSTR_VAL(function1->common.function_name),
- ZSTR_VAL(function2->op_array.filename),
- (int)function2->op_array.opcodes[0].lineno);
- } else {
- zend_error(E_ERROR, "Cannot redeclare %s()", ZSTR_VAL(function1->common.function_name));
- }
-}
-
-static void zend_accel_function_hash_copy_from_shm(HashTable *target, HashTable *source)
-{
- zend_function *function1, *function2;
- Bucket *p, *end;
- zval *t;
-
- zend_hash_extend(target, target->nNumUsed + source->nNumUsed, 0);
- p = source->arData;
- end = p + source->nNumUsed;
- for (; p != end; p++) {
- ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
- ZEND_ASSERT(p->key);
- t = zend_hash_find_ex(target, p->key, 1);
- if (UNEXPECTED(t != NULL)) {
- if (EXPECTED(ZSTR_LEN(p->key) > 0) && EXPECTED(ZSTR_VAL(p->key)[0] == 0)) {
- /* See comment in zend_accel_function_hash_copy(). */
- continue;
- } else {
- goto failure;
- }
- } else {
- _zend_hash_append_ptr_ex(target, p->key, Z_PTR(p->val), 1);
+ goto failure;
}
+ _zend_hash_append_ptr_ex(target, p->key, Z_PTR(p->val), 1);
}
target->nInternalPointer = 0;
return;
@@ -527,49 +171,20 @@ static void zend_accel_class_hash_copy(HashTable *target, HashTable *source)
p = source->arData;
end = p + source->nNumUsed;
for (; p != end; p++) {
- if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
- ZEND_ASSERT(p->key);
- t = zend_hash_find_ex(target, p->key, 1);
- if (UNEXPECTED(t != NULL)) {
- if (EXPECTED(ZSTR_LEN(p->key) > 0) && EXPECTED(ZSTR_VAL(p->key)[0] == 0)) {
- /* See comment in zend_accel_function_hash_copy(). */
- continue;
- } else if (UNEXPECTED(!ZCG(accel_directives).ignore_dups)) {
- zend_class_entry *ce1 = Z_PTR(p->val);
- if (!(ce1->ce_flags & ZEND_ACC_ANON_CLASS)) {
- CG(in_compilation) = 1;
- zend_set_compiled_filename(ce1->info.user.filename);
- CG(zend_lineno) = ce1->info.user.line_start;
- zend_error(E_ERROR,
- "Cannot declare %s %s, because the name is already in use",
- zend_get_object_type(ce1), ZSTR_VAL(ce1->name));
- return;
- }
- continue;
- }
- } else {
- t = _zend_hash_append_ptr(target, p->key, Z_PTR(p->val));
- }
- }
- target->nInternalPointer = 0;
- return;
-}
-
-static void zend_accel_class_hash_copy_from_shm(HashTable *target, HashTable *source)
-{
- Bucket *p, *end;
- zval *t;
-
- zend_hash_extend(target, target->nNumUsed + source->nNumUsed, 0);
- p = source->arData;
- end = p + source->nNumUsed;
- for (; p != end; p++) {
ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
ZEND_ASSERT(p->key);
t = zend_hash_find_ex(target, p->key, 1);
if (UNEXPECTED(t != NULL)) {
if (EXPECTED(ZSTR_LEN(p->key) > 0) && EXPECTED(ZSTR_VAL(p->key)[0] == 0)) {
- /* See comment in zend_accel_function_hash_copy(). */
+ /* Runtime definition key. There are two circumstances under which the key can
+ * already be defined:
+ * 1. The file has been re-included without being changed in the meantime. In
+ * this case we can keep the old value, because we know that the definition
+ * hasn't changed.
+ * 2. The file has been changed in the meantime, but the RTD key ends up colliding.
+ * This would be a bug.
+ * As we can't distinguish these cases, we assume that it is 1. and keep the old
+ * value. */
continue;
} else if (UNEXPECTED(!ZCG(accel_directives).ignore_dups)) {
zend_class_entry *ce1 = Z_PTR(p->val);
@@ -586,201 +201,28 @@ static void zend_accel_class_hash_copy_from_shm(HashTable *target, HashTable *so
}
} else {
t = _zend_hash_append_ptr_ex(target, p->key, Z_PTR(p->val), 1);
- if (!(((zend_class_entry*)Z_PTR_P(t))->ce_flags & ZEND_ACC_IMMUTABLE)) {
- zend_class_copy_ctor((zend_class_entry**)&Z_PTR_P(t));
- }
}
}
target->nInternalPointer = 0;
return;
}
-#if __has_feature(memory_sanitizer)
-# define fast_memcpy memcpy
-#elif defined(__AVX__)
-# include <nmmintrin.h>
-# if defined(__GNUC__) && defined(__i386__)
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- size_t delta = (char*)dest - (char*)src;
-
- __asm__ volatile (
- ".align 16\n\t"
- ".LL0%=:\n\t"
- "prefetchnta 0x40(%1)\n\t"
- "vmovaps (%1), %%ymm0\n\t"
- "vmovaps 0x20(%1), %%ymm1\n\t"
- "vmovaps %%ymm0, (%1,%2)\n\t"
- "vmovaps %%ymm1, 0x20(%1,%2)\n\t"
- "addl $0x40, %1\n\t"
- "subl $0x40, %0\n\t"
- "ja .LL0%="
- : "+r"(size),
- "+r"(src)
- : "r"(delta)
- : "cc", "memory", "%ymm0", "%ymm1");
-}
-# elif defined(__GNUC__) && defined(__x86_64__)
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- size_t delta = (char*)dest - (char*)src;
-
- __asm__ volatile (
- ".align 16\n\t"
- ".LL0%=:\n\t"
- "prefetchnta 0x40(%1)\n\t"
- "vmovaps (%1), %%ymm0\n\t"
- "vmovaps 0x20(%1), %%ymm1\n\t"
- "vmovaps %%ymm0, (%1,%2)\n\t"
- "vmovaps %%ymm1, 0x20(%1,%2)\n\t"
- "addq $0x40, %1\n\t"
- "subq $0x40, %0\n\t"
- "ja .LL0%="
- : "+r"(size),
- "+r"(src)
- : "r"(delta)
- : "cc", "memory", "%ymm0", "%ymm1");
-}
-# else
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- __m256 *dqdest = (__m256*)dest;
- const __m256 *dqsrc = (const __m256*)src;
- const __m256 *end = (const __m256*)((const char*)src + size);
-
- do {
-#ifdef PHP_WIN32
- _mm_prefetch((const char *)(dqsrc + 2), _MM_HINT_NTA);
-#else
- _mm_prefetch(dqsrc + 2, _MM_HINT_NTA);
-#endif
-
- __m256 ymm0 = _mm256_load_ps((const float *)(dqsrc + 0));
- __m256 ymm1 = _mm256_load_ps((const float *)(dqsrc + 1));
- dqsrc += 2;
- _mm256_store_ps((float *)(dqdest + 0), ymm0);
- _mm256_store_ps((float *)(dqdest + 1), ymm1);
- dqdest += 2;
- } while (dqsrc != end);
-}
-# endif
-#elif defined(__SSE2__)
-# include <emmintrin.h>
-# if defined(__GNUC__) && defined(__i386__)
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- size_t delta = (char*)dest - (char*)src;
-
- __asm__ volatile (
- ".align 16\n\t"
- ".LL0%=:\n\t"
- "prefetchnta 0x40(%1)\n\t"
- "movdqa (%1), %%xmm0\n\t"
- "movdqa 0x10(%1), %%xmm1\n\t"
- "movdqa 0x20(%1), %%xmm2\n\t"
- "movdqa 0x30(%1), %%xmm3\n\t"
- "movdqa %%xmm0, (%1,%2)\n\t"
- "movdqa %%xmm1, 0x10(%1,%2)\n\t"
- "movdqa %%xmm2, 0x20(%1,%2)\n\t"
- "movdqa %%xmm3, 0x30(%1,%2)\n\t"
- "addl $0x40, %1\n\t"
- "subl $0x40, %0\n\t"
- "ja .LL0%="
- : "+r"(size),
- "+r"(src)
- : "r"(delta)
- : "cc", "memory", "%xmm0", "%xmm1", "%xmm1", "%xmm2");
-}
-# elif defined(__GNUC__) && defined(__x86_64__) && !defined(__ILP32__)
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- size_t delta = (char*)dest - (char*)src;
-
- __asm__ volatile (
- ".align 16\n\t"
- ".LL0%=:\n\t"
- "prefetchnta 0x40(%1)\n\t"
- "movdqa (%1), %%xmm0\n\t"
- "movdqa 0x10(%1), %%xmm1\n\t"
- "movdqa 0x20(%1), %%xmm2\n\t"
- "movdqa 0x30(%1), %%xmm3\n\t"
- "movdqa %%xmm0, (%1,%2)\n\t"
- "movdqa %%xmm1, 0x10(%1,%2)\n\t"
- "movdqa %%xmm2, 0x20(%1,%2)\n\t"
- "movdqa %%xmm3, 0x30(%1,%2)\n\t"
- "addq $0x40, %1\n\t"
- "subq $0x40, %0\n\t"
- "ja .LL0%="
- : "+r"(size),
- "+r"(src)
- : "r"(delta)
- : "cc", "memory", "%xmm0", "%xmm1", "%xmm1", "%xmm2");
-}
-# else
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- __m128i *dqdest = (__m128i*)dest;
- const __m128i *dqsrc = (const __m128i*)src;
- const __m128i *end = (const __m128i*)((const char*)src + size);
-
- do {
-#ifdef PHP_WIN32
- _mm_prefetch((const char *)(dqsrc + 4), _MM_HINT_NTA);
-#else
- _mm_prefetch(dqsrc + 4, _MM_HINT_NTA);
-#endif
-
- __m128i xmm0 = _mm_load_si128(dqsrc + 0);
- __m128i xmm1 = _mm_load_si128(dqsrc + 1);
- __m128i xmm2 = _mm_load_si128(dqsrc + 2);
- __m128i xmm3 = _mm_load_si128(dqsrc + 3);
- dqsrc += 4;
- _mm_store_si128(dqdest + 0, xmm0);
- _mm_store_si128(dqdest + 1, xmm1);
- _mm_store_si128(dqdest + 2, xmm2);
- _mm_store_si128(dqdest + 3, xmm3);
- dqdest += 4;
- } while (dqsrc != end);
-}
-# endif
-#endif
-
zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script, int from_shared_memory)
{
zend_op_array *op_array;
op_array = (zend_op_array *) emalloc(sizeof(zend_op_array));
*op_array = persistent_script->script.main_op_array;
- ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
- if (EXPECTED(from_shared_memory)) {
- zend_hash_init(&ZCG(bind_hash), 10, NULL, NULL, 0);
-
- ZCG(current_persistent_script) = persistent_script;
- ZCG(arena_mem) = NULL;
- if (EXPECTED(persistent_script->arena_size)) {
-#if defined(__AVX__) || defined(__SSE2__)
- /* Target address must be aligned to 64-byte boundary */
- _mm_prefetch(persistent_script->arena_mem, _MM_HINT_NTA);
- ZCG(arena_mem) = zend_arena_alloc(&CG(arena), persistent_script->arena_size + 64);
- ZCG(arena_mem) = (void*)(((zend_uintptr_t)ZCG(arena_mem) + 63L) & ~63L);
- fast_memcpy(ZCG(arena_mem), persistent_script->arena_mem, persistent_script->arena_size);
-#else
- ZCG(arena_mem) = zend_arena_alloc(&CG(arena), persistent_script->arena_size);
- memcpy(ZCG(arena_mem), persistent_script->arena_mem, persistent_script->arena_size);
-#endif
- }
+ if (zend_hash_num_elements(&persistent_script->script.function_table) > 0) {
+ zend_accel_function_hash_copy(CG(function_table), &persistent_script->script.function_table);
+ }
- /* Copy all the necessary stuff from shared memory to regular memory, and protect the shared script */
- if (zend_hash_num_elements(&persistent_script->script.class_table) > 0) {
- zend_accel_class_hash_copy_from_shm(CG(class_table), &persistent_script->script.class_table);
- }
- /* we must first to copy all classes and then prepare functions, since functions may try to bind
- classes - which depend on pre-bind class entries existent in the class table */
- if (zend_hash_num_elements(&persistent_script->script.function_table) > 0) {
- zend_accel_function_hash_copy_from_shm(CG(function_table), &persistent_script->script.function_table);
- }
+ if (zend_hash_num_elements(&persistent_script->script.class_table) > 0) {
+ zend_accel_class_hash_copy(CG(class_table), &persistent_script->script.class_table);
+ }
+ if (EXPECTED(from_shared_memory)) {
/* Register __COMPILER_HALT_OFFSET__ constant */
if (persistent_script->compiler_halt_offset != 0 &&
persistent_script->script.filename) {
@@ -794,15 +236,8 @@ zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script,
zend_string_release_ex(name, 0);
}
- zend_hash_destroy(&ZCG(bind_hash));
- ZCG(current_persistent_script) = NULL;
- zend_map_ptr_extend(ZCSG(map_ptr_last));
- } else /* if (!from_shared_memory) */ {
- if (zend_hash_num_elements(&persistent_script->script.function_table) > 0) {
- zend_accel_function_hash_copy(CG(function_table), &persistent_script->script.function_table);
- }
- if (zend_hash_num_elements(&persistent_script->script.class_table) > 0) {
- zend_accel_class_hash_copy(CG(class_table), &persistent_script->script.class_table);
+ if (ZCSG(map_ptr_last) > CG(map_ptr_last)) {
+ zend_map_ptr_extend(ZCSG(map_ptr_last));
}
}
diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c
index 62a2d261ff..835ec5ac15 100644
--- a/ext/opcache/zend_file_cache.c
+++ b/ext/opcache/zend_file_cache.c
@@ -113,11 +113,13 @@ static int zend_file_cache_flock(int fd, int type)
#define IS_SERIALIZED_INTERNED(ptr) \
((size_t)(ptr) & Z_UL(1))
-/* Allowing == here to account for a potential empty allocation at the end of the memory */
+/* Allowing == on the upper bound accounts for a potential empty allocation at the end of the
+ * memory region. This can also happen for a return-type-only arg_info, where &arg_info[1] is
+ * stored, which may point to the end of the region. */
#define IS_SERIALIZED(ptr) \
((char*)(ptr) <= (char*)script->size)
#define IS_UNSERIALIZED(ptr) \
- (((char*)(ptr) >= (char*)script->mem && (char*)(ptr) < (char*)script->mem + script->size) || \
+ (((char*)(ptr) >= (char*)script->mem && (char*)(ptr) <= (char*)script->mem + script->size) || \
IS_ACCEL_INTERNED(ptr))
#define SERIALIZE_PTR(ptr) do { \
if (ptr) { \
@@ -450,31 +452,19 @@ static void zend_file_cache_serialize_op_array(zend_op_array *op_arra
zend_file_cache_metainfo *info,
void *buf)
{
+ ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, NULL);
+ ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL);
+
/* Check whether this op_array has already been serialized. */
if (IS_SERIALIZED(op_array->opcodes)) {
ZEND_ASSERT(op_array->scope && "Only method op_arrays should be shared");
return;
}
- if (op_array->static_variables) {
- HashTable *ht;
-
- SERIALIZE_PTR(op_array->static_variables);
- ht = op_array->static_variables;
- UNSERIALIZE_PTR(ht);
- zend_file_cache_serialize_hash(ht, script, info, buf, zend_file_cache_serialize_zval);
- }
-
- ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
- if (op_array->fn_flags & ZEND_ACC_IMMUTABLE) {
- ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL);
- } else {
- SERIALIZE_PTR(ZEND_MAP_PTR(op_array->run_time_cache));
- }
-
if (op_array->scope) {
if (UNEXPECTED(zend_shared_alloc_get_xlat_entry(op_array->opcodes))) {
op_array->refcount = (uint32_t*)(intptr_t)-1;
+ SERIALIZE_PTR(op_array->static_variables);
SERIALIZE_PTR(op_array->literals);
SERIALIZE_PTR(op_array->opcodes);
SERIALIZE_PTR(op_array->arg_info);
@@ -492,6 +482,15 @@ static void zend_file_cache_serialize_op_array(zend_op_array *op_arra
zend_shared_alloc_register_xlat_entry(op_array->opcodes, op_array->opcodes);
}
+ if (op_array->static_variables) {
+ HashTable *ht;
+
+ SERIALIZE_PTR(op_array->static_variables);
+ ht = op_array->static_variables;
+ UNSERIALIZE_PTR(ht);
+ zend_file_cache_serialize_hash(ht, script, info, buf, zend_file_cache_serialize_zval);
+ }
+
if (op_array->literals) {
zval *p, *end;
@@ -608,6 +607,20 @@ static void zend_file_cache_serialize_op_array(zend_op_array *op_arra
}
}
+ if (op_array->num_dynamic_func_defs) {
+ zend_op_array **defs;
+ SERIALIZE_PTR(op_array->dynamic_func_defs);
+ defs = op_array->dynamic_func_defs;
+ UNSERIALIZE_PTR(defs);
+ for (uint32_t i = 0; i < op_array->num_dynamic_func_defs; i++) {
+ zend_op_array *def;
+ SERIALIZE_PTR(defs[i]);
+ def = defs[i];
+ UNSERIALIZE_PTR(def);
+ zend_file_cache_serialize_op_array(def, script, info, buf);
+ }
+ }
+
SERIALIZE_STR(op_array->function_name);
SERIALIZE_STR(op_array->filename);
SERIALIZE_PTR(op_array->live_range);
@@ -624,12 +637,12 @@ static void zend_file_cache_serialize_func(zval *zv,
zend_file_cache_metainfo *info,
void *buf)
{
- zend_op_array *op_array;
-
+ zend_function *func;
SERIALIZE_PTR(Z_PTR_P(zv));
- op_array = Z_PTR_P(zv);
- UNSERIALIZE_PTR(op_array);
- zend_file_cache_serialize_op_array(op_array, script, info, buf);
+ func = Z_PTR_P(zv);
+ UNSERIALIZE_PTR(func);
+ ZEND_ASSERT(func->type == ZEND_USER_FUNCTION);
+ zend_file_cache_serialize_op_array(&func->op_array, script, info, buf);
}
static void zend_file_cache_serialize_prop_info(zval *zv,
@@ -831,6 +844,14 @@ static void zend_file_cache_serialize_class(zval *zv,
}
}
+ if (ce->backed_enum_table) {
+ HashTable *ht;
+ SERIALIZE_PTR(ce->backed_enum_table);
+ ht = ce->backed_enum_table;
+ UNSERIALIZE_PTR(ht);
+ zend_file_cache_serialize_hash(ht, script, info, buf, zend_file_cache_serialize_zval);
+ }
+
SERIALIZE_PTR(ce->constructor);
SERIALIZE_PTR(ce->destructor);
SERIALIZE_PTR(ce->clone);
@@ -855,7 +876,8 @@ static void zend_file_cache_serialize_class(zval *zv,
SERIALIZE_PTR(ce->iterator_funcs_ptr);
}
- ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
+ ZEND_MAP_PTR_INIT(ce->static_members_table, NULL);
+ ZEND_MAP_PTR_INIT(ce->mutable_data, NULL);
}
static void zend_file_cache_serialize_warnings(
@@ -901,7 +923,6 @@ static void zend_file_cache_serialize(zend_persistent_script *script,
zend_file_cache_serialize_op_array(&new_script->script.main_op_array, script, info, buf);
zend_file_cache_serialize_warnings(new_script, info, buf);
- SERIALIZE_PTR(new_script->arena_mem);
new_script->mem = NULL;
}
@@ -1194,7 +1215,7 @@ static void zend_file_cache_unserialize_attribute(zval *zv, zend_persistent_scri
}
static void zend_file_cache_unserialize_type(
- zend_type *type, zend_persistent_script *script, void *buf)
+ zend_type *type, zend_class_entry *scope, zend_persistent_script *script, void *buf)
{
if (ZEND_TYPE_HAS_LIST(*type)) {
zend_type_list *list = ZEND_TYPE_LIST(*type);
@@ -1203,12 +1224,24 @@ static void zend_file_cache_unserialize_type(
zend_type *list_type;
ZEND_TYPE_LIST_FOREACH(list, list_type) {
- zend_file_cache_unserialize_type(list_type, script, buf);
+ zend_file_cache_unserialize_type(list_type, scope, script, buf);
} ZEND_TYPE_LIST_FOREACH_END();
} else if (ZEND_TYPE_HAS_NAME(*type)) {
zend_string *type_name = ZEND_TYPE_NAME(*type);
UNSERIALIZE_STR(type_name);
ZEND_TYPE_SET_PTR(*type, type_name);
+ if (!(script->corrupted)) {
+ uint32_t ptr = zend_accel_get_type_map_ptr(type_name, scope);
+
+ if (ptr) {
+ type->type_mask |= _ZEND_TYPE_CACHE_BIT;
+ type->ce_cache__ptr = ptr;
+ } else {
+ type->type_mask &= ~_ZEND_TYPE_CACHE_BIT;
+ }
+ } else {
+ type->type_mask &= ~_ZEND_TYPE_CACHE_BIT;
+ }
} else if (ZEND_TYPE_HAS_CE(*type)) {
zend_class_entry *ce = ZEND_TYPE_CE(*type);
UNSERIALIZE_PTR(ce);
@@ -1220,43 +1253,39 @@ static void zend_file_cache_unserialize_op_array(zend_op_array *op_arr
zend_persistent_script *script,
void *buf)
{
- /* Check whether this op_array has already been unserialized. */
- if (IS_UNSERIALIZED(op_array->opcodes)) {
- ZEND_ASSERT(op_array->scope && "Only method op_arrays should be shared");
- return;
- }
-
- if (op_array->static_variables) {
- HashTable *ht;
-
- UNSERIALIZE_PTR(op_array->static_variables);
- ht = op_array->static_variables;
- zend_file_cache_unserialize_hash(ht,
- script, buf, zend_file_cache_unserialize_zval, ZVAL_PTR_DTOR);
- }
-
- if (op_array->fn_flags & ZEND_ACC_IMMUTABLE) {
+ if (!(script->corrupted)
+ && op_array != &script->script.main_op_array) {
+ op_array->fn_flags |= ZEND_ACC_IMMUTABLE;
if (op_array->static_variables) {
ZEND_MAP_PTR_NEW(op_array->static_variables_ptr);
} else {
- ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
+ ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, NULL);
}
ZEND_MAP_PTR_NEW(op_array->run_time_cache);
} else {
- ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
- if (ZEND_MAP_PTR(op_array->run_time_cache)) {
- if (script->corrupted) {
- /* Not in SHM: Use serialized arena pointer. */
- UNSERIALIZE_PTR(ZEND_MAP_PTR(op_array->run_time_cache));
- } else {
- /* In SHM: Allocate new pointer. */
- ZEND_MAP_PTR_NEW(op_array->run_time_cache);
- }
+ op_array->fn_flags &= ~ZEND_ACC_IMMUTABLE;
+ if (op_array->static_variables) {
+ ZEND_MAP_PTR_INIT(op_array->static_variables_ptr,
+ zend_arena_alloc(&CG(arena), sizeof(HashTable *)));
+ ZEND_MAP_PTR_SET(op_array->static_variables_ptr, NULL);
+ }
+ if (op_array != &script->script.main_op_array) {
+ ZEND_MAP_PTR_INIT(op_array->run_time_cache, zend_arena_alloc(&CG(arena), sizeof(void*)));
+ ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL);
+ } else {
+ ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL);
}
}
+ /* Check whether this op_array has already been unserialized. */
+ if (IS_UNSERIALIZED(op_array->opcodes)) {
+ ZEND_ASSERT(op_array->scope && "Only method op_arrays should be shared");
+ return;
+ }
+
if (op_array->refcount) {
op_array->refcount = NULL;
+ UNSERIALIZE_PTR(op_array->static_variables);
UNSERIALIZE_PTR(op_array->literals);
UNSERIALIZE_PTR(op_array->opcodes);
UNSERIALIZE_PTR(op_array->arg_info);
@@ -1272,6 +1301,15 @@ static void zend_file_cache_unserialize_op_array(zend_op_array *op_arr
return;
}
+ if (op_array->static_variables) {
+ HashTable *ht;
+
+ UNSERIALIZE_PTR(op_array->static_variables);
+ ht = op_array->static_variables;
+ zend_file_cache_unserialize_hash(ht,
+ script, buf, zend_file_cache_unserialize_zval, ZVAL_PTR_DTOR);
+ }
+
if (op_array->literals) {
zval *p, *end;
@@ -1344,6 +1382,8 @@ static void zend_file_cache_unserialize_op_array(zend_op_array *op_arr
opline++;
}
+ UNSERIALIZE_PTR(op_array->scope);
+
if (op_array->arg_info) {
zend_arg_info *p, *end;
UNSERIALIZE_PTR(op_array->arg_info);
@@ -1359,7 +1399,7 @@ static void zend_file_cache_unserialize_op_array(zend_op_array *op_arr
if (!IS_UNSERIALIZED(p->name)) {
UNSERIALIZE_STR(p->name);
}
- zend_file_cache_unserialize_type(&p->type, script, buf);
+ zend_file_cache_unserialize_type(&p->type, (op_array->fn_flags & ZEND_ACC_CLOSURE) ? NULL : op_array->scope, script, buf);
p++;
}
}
@@ -1378,10 +1418,17 @@ static void zend_file_cache_unserialize_op_array(zend_op_array *op_arr
}
}
+ if (op_array->num_dynamic_func_defs) {
+ UNSERIALIZE_PTR(op_array->dynamic_func_defs);
+ for (uint32_t i = 0; i < op_array->num_dynamic_func_defs; i++) {
+ UNSERIALIZE_PTR(op_array->dynamic_func_defs[i]);
+ zend_file_cache_unserialize_op_array(op_array->dynamic_func_defs[i], script, buf);
+ }
+ }
+
UNSERIALIZE_STR(op_array->function_name);
UNSERIALIZE_STR(op_array->filename);
UNSERIALIZE_PTR(op_array->live_range);
- UNSERIALIZE_PTR(op_array->scope);
UNSERIALIZE_STR(op_array->doc_comment);
UNSERIALIZE_ATTRIBUTES(op_array->attributes);
UNSERIALIZE_PTR(op_array->try_catch_array);
@@ -1393,11 +1440,11 @@ static void zend_file_cache_unserialize_func(zval *zv,
zend_persistent_script *script,
void *buf)
{
- zend_op_array *op_array;
-
+ zend_function *func;
UNSERIALIZE_PTR(Z_PTR_P(zv));
- op_array = Z_PTR_P(zv);
- zend_file_cache_unserialize_op_array(op_array, script, buf);
+ func = Z_PTR_P(zv);
+ ZEND_ASSERT(func->type == ZEND_USER_FUNCTION);
+ zend_file_cache_unserialize_op_array(&func->op_array, script, buf);
}
static void zend_file_cache_unserialize_prop_info(zval *zv,
@@ -1418,7 +1465,7 @@ static void zend_file_cache_unserialize_prop_info(zval *zv,
UNSERIALIZE_STR(prop->doc_comment);
}
UNSERIALIZE_ATTRIBUTES(prop->attributes);
- zend_file_cache_unserialize_type(&prop->type, script, buf);
+ zend_file_cache_unserialize_type(&prop->type, prop->ce, script, buf);
}
}
}
@@ -1576,6 +1623,12 @@ static void zend_file_cache_unserialize_class(zval *zv,
}
}
+ if (ce->backed_enum_table) {
+ UNSERIALIZE_PTR(ce->backed_enum_table);
+ zend_file_cache_unserialize_hash(
+ ce->backed_enum_table, script, buf, zend_file_cache_unserialize_zval, ZVAL_PTR_DTOR);
+ }
+
UNSERIALIZE_PTR(ce->constructor);
UNSERIALIZE_PTR(ce->destructor);
UNSERIALIZE_PTR(ce->clone);
@@ -1605,10 +1658,20 @@ static void zend_file_cache_unserialize_class(zval *zv,
UNSERIALIZE_PTR(ce->iterator_funcs_ptr->zf_next);
}
- if (ce->ce_flags & ZEND_ACC_IMMUTABLE && ce->default_static_members_table) {
- ZEND_MAP_PTR_NEW(ce->static_members_table);
+ if (!(script->corrupted)) {
+ ce->ce_flags |= ZEND_ACC_IMMUTABLE;
+ ce->ce_flags &= ~ZEND_ACC_FILE_CACHED;
+ if (ce->ce_flags & ZEND_ACC_IMMUTABLE && ce->default_static_members_table) {
+ ZEND_MAP_PTR_NEW(ce->static_members_table);
+ } else {
+ ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
+ }
+ ZEND_MAP_PTR_NEW(ce->mutable_data);
} else {
+ ce->ce_flags &= ~ZEND_ACC_IMMUTABLE;
+ ce->ce_flags |= ZEND_ACC_FILE_CACHED;
ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
+ ZEND_MAP_PTR_INIT(ce->mutable_data, NULL);
}
}
@@ -1637,8 +1700,6 @@ static void zend_file_cache_unserialize(zend_persistent_script *script,
script, buf, zend_file_cache_unserialize_func, ZEND_FUNCTION_DTOR);
zend_file_cache_unserialize_op_array(&script->script.main_op_array, script, buf);
zend_file_cache_unserialize_warnings(script, buf);
-
- UNSERIALIZE_PTR(script->arena_mem);
}
zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handle)
@@ -1821,7 +1882,7 @@ use_process_mem:
script->dynamic_members.checksum = zend_accel_script_checksum(script);
script->dynamic_members.last_used = ZCG(request_time);
- zend_accel_hash_update(&ZCSG(hash), ZSTR_VAL(script->script.filename), ZSTR_LEN(script->script.filename), 0, script);
+ zend_accel_hash_update(&ZCSG(hash), script->script.filename, 0, script);
zend_shared_alloc_unlock();
zend_accel_error(ACCEL_LOG_INFO, "File cached script loaded into memory '%s'", ZSTR_VAL(script->script.filename));
diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c
index efadcb91fb..52d961c428 100644
--- a/ext/opcache/zend_persist.c
+++ b/ext/opcache/zend_persist.c
@@ -36,6 +36,7 @@
#endif
#define zend_set_str_gc_flags(str) do { \
+ GC_SET_REFCOUNT(str, 2); \
if (file_cache_only) { \
GC_TYPE_INFO(str) = GC_STRING | (IS_STR_INTERNED << GC_FLAGS_SHIFT); \
} else { \
@@ -81,6 +82,7 @@
typedef void (*zend_persist_func_t)(zval*);
static void zend_persist_zval(zval *z);
+static void zend_persist_op_array(zval *zv);
static const uint32_t uninitialized_bucket[-HT_MIN_MASK] =
{HT_INVALID_IDX, HT_INVALID_IDX};
@@ -115,7 +117,11 @@ static void zend_hash_persist(HashTable *ht)
}
if (HT_FLAGS(ht) & HASH_FLAG_PACKED) {
void *data = HT_GET_DATA_ADDR(ht);
- data = zend_shared_memdup_free(data, HT_USED_SIZE(ht));
+ if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) {
+ data = zend_shared_memdup(data, HT_USED_SIZE(ht));
+ } else {
+ data = zend_shared_memdup_free(data, HT_USED_SIZE(ht));
+ }
HT_SET_DATA_ADDR(ht, data);
} else if (ht->nNumUsed > HT_MIN_SIZE && ht->nNumUsed < (uint32_t)(-(int32_t)ht->nTableMask) / 4) {
/* compact table */
@@ -133,7 +139,9 @@ static void zend_hash_persist(HashTable *ht)
ZCG(mem) = (void*)((char*)ZCG(mem) + ZEND_ALIGNED_SIZE((hash_size * sizeof(uint32_t)) + (ht->nNumUsed * sizeof(Bucket))));
HT_HASH_RESET(ht);
memcpy(ht->arData, old_buckets, ht->nNumUsed * sizeof(Bucket));
- efree(old_data);
+ if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
+ efree(old_data);
+ }
/* rehash */
for (idx = 0; idx < ht->nNumUsed; idx++) {
@@ -150,7 +158,9 @@ static void zend_hash_persist(HashTable *ht)
ZEND_ASSERT(((zend_uintptr_t)ZCG(mem) & 0x7) == 0); /* should be 8 byte aligned */
ZCG(mem) = (void*)((char*)data + ZEND_ALIGNED_SIZE(HT_USED_SIZE(ht)));
memcpy(data, old_data, HT_USED_SIZE(ht));
- efree(old_data);
+ if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) {
+ efree(old_data);
+ }
HT_SET_DATA_ADDR(ht, data);
}
}
@@ -201,33 +211,29 @@ static void zend_persist_zval(zval *z)
if (new_ptr) {
Z_ARR_P(z) = new_ptr;
Z_TYPE_FLAGS_P(z) = 0;
+ } else if (!ZCG(current_persistent_script)->corrupted
+ && zend_accel_in_shm(Z_ARR_P(z))) {
+ /* pass */
} else {
Bucket *p;
if (!Z_REFCOUNTED_P(z)) {
Z_ARR_P(z) = zend_shared_memdup_put(Z_ARR_P(z), sizeof(zend_array));
- zend_hash_persist(Z_ARRVAL_P(z));
- ZEND_HASH_FOREACH_BUCKET(Z_ARRVAL_P(z), p) {
- if (p->key) {
- zend_accel_memdup_interned_string(p->key);
- }
- zend_persist_zval(&p->val);
- } ZEND_HASH_FOREACH_END();
} else {
GC_REMOVE_FROM_BUFFER(Z_ARR_P(z));
Z_ARR_P(z) = zend_shared_memdup_put_free(Z_ARR_P(z), sizeof(zend_array));
- zend_hash_persist(Z_ARRVAL_P(z));
- ZEND_HASH_FOREACH_BUCKET(Z_ARRVAL_P(z), p) {
- if (p->key) {
- zend_accel_store_interned_string(p->key);
- }
- zend_persist_zval(&p->val);
- } ZEND_HASH_FOREACH_END();
- /* make immutable array */
- Z_TYPE_FLAGS_P(z) = 0;
- GC_SET_REFCOUNT(Z_COUNTED_P(z), 2);
- GC_ADD_FLAGS(Z_COUNTED_P(z), IS_ARRAY_IMMUTABLE);
}
+ zend_hash_persist(Z_ARRVAL_P(z));
+ ZEND_HASH_FOREACH_BUCKET(Z_ARRVAL_P(z), p) {
+ if (p->key) {
+ zend_accel_store_interned_string(p->key);
+ }
+ zend_persist_zval(&p->val);
+ } ZEND_HASH_FOREACH_END();
+ /* make immutable array */
+ Z_TYPE_FLAGS_P(z) = 0;
+ GC_SET_REFCOUNT(Z_COUNTED_P(z), 2);
+ GC_ADD_FLAGS(Z_COUNTED_P(z), IS_ARRAY_IMMUTABLE);
}
break;
case IS_CONSTANT_AST:
@@ -235,7 +241,8 @@ static void zend_persist_zval(zval *z)
if (new_ptr) {
Z_AST_P(z) = new_ptr;
Z_TYPE_FLAGS_P(z) = 0;
- } else {
+ } else if (ZCG(current_persistent_script)->corrupted
+ || !zend_accel_in_shm(Z_AST_P(z))) {
zend_ast_ref *old_ref = Z_AST_P(z);
Z_AST_P(z) = zend_shared_memdup_put(Z_AST_P(z), sizeof(zend_ast_ref));
zend_persist_ast(GC_AST(old_ref));
@@ -252,50 +259,99 @@ static void zend_persist_zval(zval *z)
static HashTable *zend_persist_attributes(HashTable *attributes)
{
- HashTable *ptr = zend_shared_alloc_get_xlat_entry(attributes);
+ uint32_t i;
+ zval *v;
- if (!ptr) {
- uint32_t i;
- zval *v;
+ if (!ZCG(current_persistent_script)->corrupted && zend_accel_in_shm(attributes)) {
+ return attributes;
+ }
- zend_hash_persist(attributes);
+ zend_hash_persist(attributes);
- ZEND_HASH_FOREACH_VAL(attributes, v) {
- zend_attribute *attr = Z_PTR_P(v);
- zend_attribute *copy = zend_shared_memdup_put_free(attr, ZEND_ATTRIBUTE_SIZE(attr->argc));
+ ZEND_HASH_FOREACH_VAL(attributes, v) {
+ zend_attribute *attr = Z_PTR_P(v);
+ zend_attribute *copy = zend_shared_memdup_put_free(attr, ZEND_ATTRIBUTE_SIZE(attr->argc));
- zend_accel_store_interned_string(copy->name);
- zend_accel_store_interned_string(copy->lcname);
+ zend_accel_store_interned_string(copy->name);
+ zend_accel_store_interned_string(copy->lcname);
- for (i = 0; i < copy->argc; i++) {
- if (copy->args[i].name) {
- zend_accel_store_interned_string(copy->args[i].name);
- }
- zend_persist_zval(&copy->args[i].value);
+ for (i = 0; i < copy->argc; i++) {
+ if (copy->args[i].name) {
+ zend_accel_store_interned_string(copy->args[i].name);
}
+ zend_persist_zval(&copy->args[i].value);
+ }
- ZVAL_PTR(v, copy);
- } ZEND_HASH_FOREACH_END();
+ ZVAL_PTR(v, copy);
+ } ZEND_HASH_FOREACH_END();
- ptr = zend_shared_memdup_put_free(attributes, sizeof(HashTable));
- GC_SET_REFCOUNT(ptr, 2);
- GC_TYPE_INFO(ptr) = GC_ARRAY | ((IS_ARRAY_IMMUTABLE|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT);
+ HashTable *ptr = zend_shared_memdup_put_free(attributes, sizeof(HashTable));
+ GC_SET_REFCOUNT(ptr, 2);
+ GC_TYPE_INFO(ptr) = GC_ARRAY | ((IS_ARRAY_IMMUTABLE|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT);
+
+ return ptr;
+}
+
+uint32_t zend_accel_get_type_map_ptr(zend_string *type_name, zend_class_entry *scope)
+{
+ uint32_t ret;
+
+ if (zend_string_equals_literal_ci(type_name, "self")) {
+ if (!scope || (scope->ce_flags & ZEND_ACC_TRAIT)) {
+ return 0;
+ }
+ type_name = scope->name;
+ } else if (zend_string_equals_literal_ci(type_name, "parent")) {
+ if (!scope || !scope->parent) {
+ return 0;
+ }
+ if (scope->ce_flags & ZEND_ACC_RESOLVED_PARENT) {
+ type_name = scope->parent->name;
+ } else {
+ type_name = scope->parent_name;
+ }
}
+ ZEND_ASSERT(GC_FLAGS(type_name) & GC_IMMUTABLE);
+ ZEND_ASSERT(GC_FLAGS(type_name) & IS_STR_PERMANENT);
+ ret = GC_REFCOUNT(type_name);
+
+ /* We use type.name.gc.refcount to keep map_ptr of corresponding type */
+ if (ret <= 2) {
+ do {
+ ret = (uint32_t)(uintptr_t)zend_map_ptr_new();
+ } while (ret <= 2);
+ GC_SET_REFCOUNT(type_name, ret);
+ }
+ return ret;
+}
+
+static HashTable *zend_persist_backed_enum_table(HashTable *backed_enum_table)
+{
+ HashTable *ptr;
+ Bucket *p;
+ zend_hash_persist(backed_enum_table);
+
+ ZEND_HASH_FOREACH_BUCKET(backed_enum_table, p) {
+ if (p->key != NULL) {
+ zend_accel_store_interned_string(p->key);
+ }
+ zend_persist_zval(&p->val);
+ } ZEND_HASH_FOREACH_END();
+
+ ptr = zend_shared_memdup_free(backed_enum_table, sizeof(HashTable));
+ GC_SET_REFCOUNT(ptr, 2);
+ GC_TYPE_INFO(ptr) = GC_ARRAY | ((IS_ARRAY_IMMUTABLE|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT);
+
return ptr;
}
-static void zend_persist_type(zend_type *type) {
+static void zend_persist_type(zend_type *type, zend_class_entry *scope) {
if (ZEND_TYPE_HAS_LIST(*type)) {
zend_type_list *list = ZEND_TYPE_LIST(*type);
if (ZEND_TYPE_USES_ARENA(*type)) {
- if (!ZCG(is_immutable_class)) {
- list = zend_shared_memdup_arena_put(list, ZEND_TYPE_LIST_SIZE(list->num_types));
- } else {
- /* Moved from arena to SHM because type list was fully resolved. */
- list = zend_shared_memdup_put(list, ZEND_TYPE_LIST_SIZE(list->num_types));
- ZEND_TYPE_FULL_MASK(*type) &= ~_ZEND_TYPE_ARENA_BIT;
- }
+ list = zend_shared_memdup_put(list, ZEND_TYPE_LIST_SIZE(list->num_types));
+ ZEND_TYPE_FULL_MASK(*type) &= ~_ZEND_TYPE_ARENA_BIT;
} else {
list = zend_shared_memdup_put_free(list, ZEND_TYPE_LIST_SIZE(list->num_types));
}
@@ -308,6 +364,14 @@ static void zend_persist_type(zend_type *type) {
zend_string *type_name = ZEND_TYPE_NAME(*single_type);
zend_accel_store_interned_string(type_name);
ZEND_TYPE_SET_PTR(*single_type, type_name);
+ if (!ZCG(current_persistent_script)->corrupted) {
+ uint32_t ptr = zend_accel_get_type_map_ptr(type_name, scope);
+
+ if (ptr) {
+ single_type->type_mask |= _ZEND_TYPE_CACHE_BIT;
+ single_type->ce_cache__ptr = ptr;
+ }
+ }
}
} ZEND_TYPE_FOREACH_END();
}
@@ -352,6 +416,7 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
if (scope) {
op_array->scope = scope;
}
+
if (op_array->prototype) {
zend_function *ptr = zend_shared_alloc_get_xlat_entry(op_array->prototype);
@@ -367,7 +432,6 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
op_array->static_variables = zend_shared_alloc_get_xlat_entry(op_array->static_variables);
ZEND_ASSERT(op_array->static_variables != NULL);
}
- ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
if (op_array->literals) {
op_array->literals = zend_shared_alloc_get_xlat_entry(op_array->literals);
ZEND_ASSERT(op_array->literals != NULL);
@@ -401,7 +465,8 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
}
}
if (op_array->attributes) {
- op_array->attributes = zend_persist_attributes(op_array->attributes);
+ op_array->attributes = zend_shared_alloc_get_xlat_entry(op_array->attributes);
+ ZEND_ASSERT(op_array->attributes != NULL);
}
if (op_array->try_catch_array) {
@@ -435,7 +500,13 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
op_array->prototype = NULL;
}
- if (op_array->static_variables) {
+ if (op_array->scope
+ && !(op_array->fn_flags & ZEND_ACC_CLOSURE)
+ && (op_array->scope->ce_flags & ZEND_ACC_CACHED)) {
+ return;
+ }
+
+ if (op_array->static_variables && !zend_accel_in_shm(op_array->static_variables)) {
Bucket *p;
zend_hash_persist(op_array->static_variables);
@@ -449,7 +520,6 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
GC_SET_REFCOUNT(op_array->static_variables, 2);
GC_TYPE_INFO(op_array->static_variables) = GC_ARRAY | ((IS_ARRAY_IMMUTABLE|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT);
}
- ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
if (op_array->literals) {
zval *p, *end;
@@ -551,7 +621,6 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
efree(op_array->opcodes);
op_array->opcodes = new_opcodes;
- ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL);
}
if (op_array->filename) {
@@ -575,7 +644,7 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
if (arg_info[i].name) {
zend_accel_store_interned_string(arg_info[i].name);
}
- zend_persist_type(&arg_info[i].type);
+ zend_persist_type(&arg_info[i].type, op_array->scope);
}
if (op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
arg_info++;
@@ -612,6 +681,17 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
}
}
+ if (op_array->num_dynamic_func_defs) {
+ op_array->dynamic_func_defs = zend_shared_memdup_put_free(
+ op_array->dynamic_func_defs, sizeof(zend_function *) * op_array->num_dynamic_func_defs);
+ for (uint32_t i = 0; i < op_array->num_dynamic_func_defs; i++) {
+ zval tmp;
+ ZVAL_PTR(&tmp, op_array->dynamic_func_defs[i]);
+ zend_persist_op_array(&tmp);
+ op_array->dynamic_func_defs[i] = Z_PTR(tmp);
+ }
+ }
+
ZCG(mem) = (void*)((char*)ZCG(mem) + ZEND_ALIGNED_SIZE(zend_extensions_op_array_persist(op_array, ZCG(mem))));
#ifdef HAVE_JIT
@@ -625,24 +705,27 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
static void zend_persist_op_array(zval *zv)
{
zend_op_array *op_array = Z_PTR_P(zv);
-
+ zend_op_array *old_op_array;
ZEND_ASSERT(op_array->type == ZEND_USER_FUNCTION);
- op_array = Z_PTR_P(zv) = zend_shared_memdup(Z_PTR_P(zv), sizeof(zend_op_array));
- zend_persist_op_array_ex(op_array, NULL);
- if (!ZCG(current_persistent_script)->corrupted) {
- op_array->fn_flags |= ZEND_ACC_IMMUTABLE;
- ZEND_MAP_PTR_NEW(op_array->run_time_cache);
- if (op_array->static_variables) {
- ZEND_MAP_PTR_NEW(op_array->static_variables_ptr);
+
+ old_op_array = zend_shared_alloc_get_xlat_entry(op_array);
+ if (!old_op_array) {
+ op_array = Z_PTR_P(zv) = zend_shared_memdup_put(Z_PTR_P(zv), sizeof(zend_op_array));
+ zend_persist_op_array_ex(op_array, NULL);
+ if (!ZCG(current_persistent_script)->corrupted) {
+ op_array->fn_flags |= ZEND_ACC_IMMUTABLE;
+ ZEND_MAP_PTR_NEW(op_array->run_time_cache);
+ if (op_array->static_variables) {
+ ZEND_MAP_PTR_NEW(op_array->static_variables_ptr);
+ }
}
} else {
- ZEND_MAP_PTR_INIT(op_array->run_time_cache, ZCG(arena_mem));
- ZCG(arena_mem) = (void*)(((char*)ZCG(arena_mem)) + ZEND_ALIGNED_SIZE(sizeof(void*)));
- ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL);
+ /* This can happen during preloading, if a dynamic function definition is declared. */
+ Z_PTR_P(zv) = old_op_array;
}
}
-static void zend_persist_class_method(zval *zv)
+static void zend_persist_class_method(zval *zv, zend_class_entry *ce)
{
zend_op_array *op_array = Z_PTR_P(zv);
zend_op_array *old_op_array;
@@ -654,11 +737,7 @@ static void zend_persist_class_method(zval *zv)
if (old_op_array) {
Z_PTR_P(zv) = old_op_array;
} else {
- if (ZCG(is_immutable_class)) {
- op_array = Z_PTR_P(zv) = zend_shared_memdup_put(op_array, sizeof(zend_internal_function));
- } else {
- op_array = Z_PTR_P(zv) = zend_shared_memdup_arena_put(op_array, sizeof(zend_internal_function));
- }
+ op_array = Z_PTR_P(zv) = zend_shared_memdup_put(op_array, sizeof(zend_internal_function));
if (op_array->scope) {
void *persist_ptr;
@@ -676,6 +755,14 @@ static void zend_persist_class_method(zval *zv)
return;
}
+ if ((op_array->fn_flags & ZEND_ACC_IMMUTABLE)
+ && !op_array->static_variables
+ && !ZCG(current_persistent_script)->corrupted
+ && zend_accel_in_shm(op_array)) {
+ zend_shared_alloc_register_xlat_entry(op_array, op_array);
+ return;
+ }
+
old_op_array = zend_shared_alloc_get_xlat_entry(op_array);
if (old_op_array) {
Z_PTR_P(zv) = old_op_array;
@@ -692,33 +779,27 @@ static void zend_persist_class_method(zval *zv)
}
return;
}
- if (ZCG(is_immutable_class)) {
- op_array = Z_PTR_P(zv) = zend_shared_memdup_put(op_array, sizeof(zend_op_array));
- } else {
- op_array = Z_PTR_P(zv) = zend_shared_memdup_arena_put(op_array, sizeof(zend_op_array));
- }
+ op_array = Z_PTR_P(zv) = zend_shared_memdup_put(op_array, sizeof(zend_op_array));
zend_persist_op_array_ex(op_array, NULL);
- if (ZCG(is_immutable_class)) {
+ if ((ce->ce_flags & ZEND_ACC_LINKED)
+ && (ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
op_array->fn_flags |= ZEND_ACC_IMMUTABLE;
ZEND_MAP_PTR_NEW(op_array->run_time_cache);
if (op_array->static_variables) {
ZEND_MAP_PTR_NEW(op_array->static_variables_ptr);
}
} else {
- ZEND_MAP_PTR_INIT(op_array->run_time_cache, ZCG(arena_mem));
- ZCG(arena_mem) = (void*)(((char*)ZCG(arena_mem)) + ZEND_ALIGNED_SIZE(sizeof(void*)));
- ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL);
+ if (ce->ce_flags & ZEND_ACC_IMMUTABLE) {
+ ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL);
+ ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, NULL);
+ }
}
}
static zend_property_info *zend_persist_property_info(zend_property_info *prop)
{
zend_class_entry *ce;
- if (ZCG(is_immutable_class)) {
- prop = zend_shared_memdup_put(prop, sizeof(zend_property_info));
- } else {
- prop = zend_shared_memdup_arena_put(prop, sizeof(zend_property_info));
- }
+ prop = zend_shared_memdup_put(prop, sizeof(zend_property_info));
ce = zend_shared_alloc_get_xlat_entry(prop->ce);
if (ce) {
prop->ce = ce;
@@ -738,7 +819,7 @@ static zend_property_info *zend_persist_property_info(zend_property_info *prop)
if (prop->attributes) {
prop->attributes = zend_persist_attributes(prop->attributes);
}
- zend_persist_type(&prop->type);
+ zend_persist_type(&prop->type, ce);
return prop;
}
@@ -750,12 +831,11 @@ static void zend_persist_class_constant(zval *zv)
if (c) {
Z_PTR_P(zv) = c;
return;
+ } else if (!ZCG(current_persistent_script)->corrupted
+ && zend_accel_in_shm(Z_PTR_P(zv))) {
+ return;
}
- if (ZCG(is_immutable_class)) {
- c = Z_PTR_P(zv) = zend_shared_memdup_put(Z_PTR_P(zv), sizeof(zend_class_constant));
- } else {
- c = Z_PTR_P(zv) = zend_shared_memdup_arena_put(Z_PTR_P(zv), sizeof(zend_class_constant));
- }
+ c = Z_PTR_P(zv) = zend_shared_memdup_put(Z_PTR_P(zv), sizeof(zend_class_constant));
zend_persist_zval(&c->value);
ce = zend_shared_alloc_get_xlat_entry(c->ce);
if (ce) {
@@ -783,38 +863,35 @@ static void zend_persist_class_constant(zval *zv)
}
}
-static void zend_persist_class_entry(zval *zv)
+zend_class_entry *zend_persist_class_entry(zend_class_entry *orig_ce)
{
Bucket *p;
- zend_class_entry *orig_ce = Z_PTR_P(zv), *ce = orig_ce;
+ zend_class_entry *ce = orig_ce;
if (ce->type == ZEND_USER_CLASS) {
/* The same zend_class_entry may be reused by class_alias */
zend_class_entry *new_ce = zend_shared_alloc_get_xlat_entry(ce);
if (new_ce) {
- Z_PTR_P(zv) = new_ce;
- return;
+ return new_ce;
}
- if ((ce->ce_flags & ZEND_ACC_LINKED)
- && (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)
- && (ce->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED)
- && !ZCG(current_persistent_script)->corrupted) {
- ZCG(is_immutable_class) = 1;
- ce = Z_PTR_P(zv) = zend_shared_memdup_put(ce, sizeof(zend_class_entry));
+ ce = zend_shared_memdup_put(ce, sizeof(zend_class_entry));
+ if (EXPECTED(!ZCG(current_persistent_script)->corrupted)) {
ce->ce_flags |= ZEND_ACC_IMMUTABLE;
- } else {
- ZCG(is_immutable_class) = 0;
- ce = Z_PTR_P(zv) = zend_shared_memdup_arena_put(ce, sizeof(zend_class_entry));
}
- zend_accel_store_interned_string(ce->name);
- if (ce->parent_name && !(ce->ce_flags & ZEND_ACC_LINKED)) {
- zend_accel_store_interned_string(ce->parent_name);
+ ce->inheritance_cache = NULL;
+
+ if (!(ce->ce_flags & ZEND_ACC_CACHED)) {
+ zend_accel_store_interned_string(ce->name);
+ if (ce->parent_name && !(ce->ce_flags & ZEND_ACC_LINKED)) {
+ zend_accel_store_interned_string(ce->parent_name);
+ }
}
+
zend_hash_persist(&ce->function_table);
ZEND_HASH_FOREACH_BUCKET(&ce->function_table, p) {
ZEND_ASSERT(p->key != NULL);
zend_accel_store_interned_string(p->key);
- zend_persist_class_method(&p->val);
+ zend_persist_class_method(&p->val, ce);
} ZEND_HASH_FOREACH_END();
HT_FLAGS(&ce->function_table) &= (HASH_FLAG_UNINITIALIZED | HASH_FLAG_STATIC_KEYS);
if (ce->default_properties_table) {
@@ -825,6 +902,15 @@ static void zend_persist_class_entry(zval *zv)
zend_persist_zval(&ce->default_properties_table[i]);
}
}
+ if ((ce->ce_flags & ZEND_ACC_IMMUTABLE)
+ && (ce->ce_flags & ZEND_ACC_LINKED)
+ && !(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
+ ZEND_MAP_PTR_NEW(ce->mutable_data);
+ } else if (ce->ce_flags & ZEND_ACC_IMMUTABLE) {
+ ZEND_MAP_PTR_INIT(ce->mutable_data, NULL);
+ } else {
+ ce->ce_flags |= ZEND_ACC_FILE_CACHED;
+ }
if (ce->default_static_members_table) {
int i;
ce->default_static_members_table = zend_shared_memdup_free(ce->default_static_members_table, sizeof(zval) * ce->default_static_members_count);
@@ -836,7 +922,11 @@ static void zend_persist_class_entry(zval *zv)
zend_persist_zval(&ce->default_static_members_table[i]);
}
if (ce->ce_flags & ZEND_ACC_IMMUTABLE) {
- ZEND_MAP_PTR_NEW(ce->static_members_table);
+ if (ce->ce_flags & ZEND_ACC_LINKED) {
+ ZEND_MAP_PTR_NEW(ce->static_members_table);
+ } else {
+ ZEND_MAP_PTR_INIT(ce->static_members_table, NULL);
+ }
} else {
ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
}
@@ -852,23 +942,6 @@ static void zend_persist_class_entry(zval *zv)
} ZEND_HASH_FOREACH_END();
HT_FLAGS(&ce->constants_table) &= (HASH_FLAG_UNINITIALIZED | HASH_FLAG_STATIC_KEYS);
- if (ce->info.user.filename) {
- zend_accel_store_string(ce->info.user.filename);
- }
- if (ce->info.user.doc_comment) {
- if (ZCG(accel_directives).save_comments) {
- zend_accel_store_interned_string(ce->info.user.doc_comment);
- } else {
- if (!zend_shared_alloc_get_xlat_entry(ce->info.user.doc_comment)) {
- zend_shared_alloc_register_xlat_entry(ce->info.user.doc_comment, ce->info.user.doc_comment);
- zend_string_release_ex(ce->info.user.doc_comment, 0);
- }
- ce->info.user.doc_comment = NULL;
- }
- }
- if (ce->attributes) {
- ce->attributes = zend_persist_attributes(ce->attributes);
- }
zend_hash_persist(&ce->properties_info);
ZEND_HASH_FOREACH_BUCKET(&ce->properties_info, p) {
zend_property_info *prop = Z_PTR(p->val);
@@ -894,13 +967,8 @@ static void zend_persist_class_entry(zval *zv)
size_t size = sizeof(zend_property_info *) * ce->default_properties_count;
ZEND_ASSERT(ce->ce_flags & ZEND_ACC_LINKED);
- if (ZCG(is_immutable_class)) {
- ce->properties_info_table = zend_shared_memdup(
- ce->properties_info_table, size);
- } else {
- ce->properties_info_table = zend_shared_memdup_arena(
- ce->properties_info_table, size);
- }
+ ce->properties_info_table = zend_shared_memdup(
+ ce->properties_info_table, size);
for (i = 0; i < ce->default_properties_count; i++) {
if (ce->properties_info_table[i]) {
@@ -913,6 +981,36 @@ static void zend_persist_class_entry(zval *zv)
}
}
+ if (ce->iterator_funcs_ptr) {
+ ce->iterator_funcs_ptr = zend_shared_memdup(ce->iterator_funcs_ptr, sizeof(zend_class_iterator_funcs));
+ }
+
+ if (ce->ce_flags & ZEND_ACC_CACHED) {
+ return ce;
+ }
+
+ ce->ce_flags |= ZEND_ACC_CACHED;
+
+ if (ce->info.user.filename) {
+ zend_accel_store_string(ce->info.user.filename);
+ }
+
+ if (ce->info.user.doc_comment) {
+ if (ZCG(accel_directives).save_comments) {
+ zend_accel_store_interned_string(ce->info.user.doc_comment);
+ } else {
+ if (!zend_shared_alloc_get_xlat_entry(ce->info.user.doc_comment)) {
+ zend_shared_alloc_register_xlat_entry(ce->info.user.doc_comment, ce->info.user.doc_comment);
+ zend_string_release_ex(ce->info.user.doc_comment, 0);
+ }
+ ce->info.user.doc_comment = NULL;
+ }
+ }
+
+ if (ce->attributes) {
+ ce->attributes = zend_persist_attributes(ce->attributes);
+ }
+
if (ce->num_interfaces && !(ce->ce_flags & ZEND_ACC_LINKED)) {
uint32_t i = 0;
@@ -973,13 +1071,15 @@ static void zend_persist_class_entry(zval *zv)
}
}
- if (ce->iterator_funcs_ptr) {
- ce->iterator_funcs_ptr = zend_shared_memdup(ce->iterator_funcs_ptr, sizeof(zend_class_iterator_funcs));
+ if (ce->backed_enum_table) {
+ ce->backed_enum_table = zend_persist_backed_enum_table(ce->backed_enum_table);
}
}
+
+ return ce;
}
-static void zend_update_parent_ce(zend_class_entry *ce)
+void zend_update_parent_ce(zend_class_entry *ce)
{
if (ce->ce_flags & ZEND_ACC_LINKED) {
if (ce->parent) {
@@ -1144,7 +1244,7 @@ static void zend_accel_persist_class_table(HashTable *class_table)
ZEND_HASH_FOREACH_BUCKET(class_table, p) {
ZEND_ASSERT(p->key != NULL);
zend_accel_store_interned_string(p->key);
- zend_persist_class_entry(&p->val);
+ Z_CE(p->val) = zend_persist_class_entry(Z_CE(p->val));
} ZEND_HASH_FOREACH_END();
ZEND_HASH_FOREACH_BUCKET(class_table, p) {
if (EXPECTED(Z_TYPE(p->val) != IS_ALIAS_PTR)) {
@@ -1167,7 +1267,7 @@ static void zend_persist_warnings(zend_persistent_script *script) {
}
}
-zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script, const char **key, unsigned int key_length, int for_shm)
+zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script, int for_shm)
{
Bucket *p;
@@ -1176,10 +1276,6 @@ zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script
ZEND_ASSERT(((zend_uintptr_t)ZCG(mem) & 0x7) == 0); /* should be 8 byte aligned */
script = zend_shared_memdup_free(script, sizeof(zend_persistent_script));
- if (key && *key) {
- *key = zend_shared_memdup_put((void*)*key, key_length + 1);
- }
-
script->corrupted = 0;
ZCG(current_persistent_script) = script;
@@ -1197,9 +1293,6 @@ zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script
ZEND_ASSERT(((zend_uintptr_t)ZCG(mem) & 0x7) == 0); /* should be 8 byte aligned */
#endif
- script->arena_mem = ZCG(arena_mem) = ZCG(mem);
- ZCG(mem) = (void*)((char*)ZCG(mem) + script->arena_size);
-
#ifdef HAVE_JIT
if (JIT_G(on) && for_shm) {
zend_jit_unprotect();
@@ -1216,6 +1309,12 @@ zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script
zend_persist_op_array(&p->val);
} ZEND_HASH_FOREACH_END();
zend_persist_op_array_ex(&script->script.main_op_array, script);
+ if (!script->corrupted) {
+ ZEND_MAP_PTR_INIT(script->script.main_op_array.run_time_cache, NULL);
+ if (script->script.main_op_array.static_variables) {
+ ZEND_MAP_PTR_NEW(script->script.main_op_array.static_variables_ptr);
+ }
+ }
zend_persist_warnings(script);
if (for_shm) {
diff --git a/ext/opcache/zend_persist.h b/ext/opcache/zend_persist.h
index d5eca3f195..f491cb8ca6 100644
--- a/ext/opcache/zend_persist.h
+++ b/ext/opcache/zend_persist.h
@@ -22,7 +22,11 @@
#ifndef ZEND_PERSIST_H
#define ZEND_PERSIST_H
-uint32_t zend_accel_script_persist_calc(zend_persistent_script *script, const char *key, unsigned int key_length, int for_shm);
-zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script, const char **key, unsigned int key_length, int for_shm);
+uint32_t zend_accel_script_persist_calc(zend_persistent_script *script, int for_shm);
+zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script, int for_shm);
+
+void zend_persist_class_entry_calc(zend_class_entry *ce);
+zend_class_entry *zend_persist_class_entry(zend_class_entry *ce);
+void zend_update_parent_ce(zend_class_entry *ce);
#endif /* ZEND_PERSIST_H */
diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c
index 9de02e91e2..c3292ec2a1 100644
--- a/ext/opcache/zend_persist_calc.c
+++ b/ext/opcache/zend_persist_calc.c
@@ -29,15 +29,6 @@
#define ADD_DUP_SIZE(m,s) ZCG(current_persistent_script)->size += zend_shared_memdup_size((void*)m, s)
#define ADD_SIZE(m) ZCG(current_persistent_script)->size += ZEND_ALIGNED_SIZE(m)
-#define ADD_ARENA_SIZE(m) ZCG(current_persistent_script)->arena_size += ZEND_ALIGNED_SIZE(m)
-
-#define ADD_SIZE_EX(m) do { \
- if (ZCG(is_immutable_class)) { \
- ADD_SIZE(m); \
- } else { \
- ADD_ARENA_SIZE(m); \
- } \
- } while (0)
# define ADD_STRING(str) ADD_DUP_SIZE((str), _ZSTR_STRUCT_SIZE(ZSTR_LEN(str)))
@@ -55,6 +46,7 @@
} while (0)
static void zend_persist_zval_calc(zval *z);
+static void zend_persist_op_array_calc(zval *zv);
static void zend_hash_persist_calc(HashTable *ht)
{
@@ -114,6 +106,10 @@ static void zend_persist_zval_calc(zval *z)
}
break;
case IS_ARRAY:
+ if (!ZCG(current_persistent_script)->corrupted
+ && zend_accel_in_shm(Z_ARR_P(z))) {
+ return;
+ }
size = zend_shared_memdup_size(Z_ARR_P(z), sizeof(zend_array));
if (size) {
Bucket *p;
@@ -129,10 +125,13 @@ static void zend_persist_zval_calc(zval *z)
}
break;
case IS_CONSTANT_AST:
- size = zend_shared_memdup_size(Z_AST_P(z), sizeof(zend_ast_ref));
- if (size) {
- ADD_SIZE(size);
- zend_persist_ast_calc(Z_ASTVAL_P(z));
+ if (ZCG(current_persistent_script)->corrupted
+ || !zend_accel_in_shm(Z_AST_P(z))) {
+ size = zend_shared_memdup_size(Z_AST_P(z), sizeof(zend_ast_ref));
+ if (size) {
+ ADD_SIZE(size);
+ zend_persist_ast_calc(Z_ASTVAL_P(z));
+ }
}
break;
default:
@@ -143,7 +142,9 @@ static void zend_persist_zval_calc(zval *z)
static void zend_persist_attributes_calc(HashTable *attributes)
{
- if (!zend_shared_alloc_get_xlat_entry(attributes)) {
+ if (!zend_shared_alloc_get_xlat_entry(attributes)
+ && (ZCG(current_persistent_script)->corrupted
+ || !zend_accel_in_shm(attributes))) {
zend_attribute *attr;
uint32_t i;
@@ -169,11 +170,7 @@ static void zend_persist_attributes_calc(HashTable *attributes)
static void zend_persist_type_calc(zend_type *type)
{
if (ZEND_TYPE_HAS_LIST(*type)) {
- if (ZEND_TYPE_USES_ARENA(*type) && !ZCG(is_immutable_class)) {
- ADD_ARENA_SIZE(ZEND_TYPE_LIST_SIZE(ZEND_TYPE_LIST(*type)->num_types));
- } else {
- ADD_SIZE(ZEND_TYPE_LIST_SIZE(ZEND_TYPE_LIST(*type)->num_types));
- }
+ ADD_SIZE(ZEND_TYPE_LIST_SIZE(ZEND_TYPE_LIST(*type)->num_types));
}
zend_type *single_type;
@@ -198,13 +195,21 @@ static void zend_persist_op_array_calc_ex(zend_op_array *op_array)
}
}
- if (op_array->scope && zend_shared_alloc_get_xlat_entry(op_array->opcodes)) {
- /* already stored */
- ADD_SIZE(ZEND_ALIGNED_SIZE(zend_extensions_op_array_persist_calc(op_array)));
+ if (op_array->scope) {
+ if (zend_shared_alloc_get_xlat_entry(op_array->opcodes)) {
+ /* already stored */
+ ADD_SIZE(ZEND_ALIGNED_SIZE(zend_extensions_op_array_persist_calc(op_array)));
+ return;
+ }
+ }
+
+ if (op_array->scope
+ && !(op_array->fn_flags & ZEND_ACC_CLOSURE)
+ && (op_array->scope->ce_flags & ZEND_ACC_CACHED)) {
return;
}
- if (op_array->static_variables) {
+ if (op_array->static_variables && !zend_accel_in_shm(op_array->static_variables)) {
if (!zend_shared_alloc_get_xlat_entry(op_array->static_variables)) {
Bucket *p;
@@ -283,18 +288,28 @@ static void zend_persist_op_array_calc_ex(zend_op_array *op_array)
}
}
+ if (op_array->num_dynamic_func_defs) {
+ ADD_SIZE(sizeof(void *) * op_array->num_dynamic_func_defs);
+ for (uint32_t i = 0; i < op_array->num_dynamic_func_defs; i++) {
+ zval tmp;
+ ZVAL_PTR(&tmp, op_array->dynamic_func_defs[i]);
+ zend_persist_op_array_calc(&tmp);
+ }
+ }
+
ADD_SIZE(ZEND_ALIGNED_SIZE(zend_extensions_op_array_persist_calc(op_array)));
}
static void zend_persist_op_array_calc(zval *zv)
{
zend_op_array *op_array = Z_PTR_P(zv);
-
ZEND_ASSERT(op_array->type == ZEND_USER_FUNCTION);
- ADD_SIZE(sizeof(zend_op_array));
- zend_persist_op_array_calc_ex(Z_PTR_P(zv));
- if (ZCG(current_persistent_script)->corrupted) {
- ADD_ARENA_SIZE(sizeof(void*));
+ if (!zend_shared_alloc_get_xlat_entry(op_array)) {
+ zend_shared_alloc_register_xlat_entry(op_array, op_array);
+ ADD_SIZE(sizeof(zend_op_array));
+ zend_persist_op_array_calc_ex(op_array);
+ } else {
+ /* This can happen during preloading, if a dynamic function definition is declared. */
}
}
@@ -308,21 +323,26 @@ static void zend_persist_class_method_calc(zval *zv)
if (op_array->fn_flags & ZEND_ACC_ARENA_ALLOCATED) {
old_op_array = zend_shared_alloc_get_xlat_entry(op_array);
if (!old_op_array) {
- ADD_SIZE_EX(sizeof(zend_internal_function));
+ ADD_SIZE(sizeof(zend_internal_function));
zend_shared_alloc_register_xlat_entry(op_array, Z_PTR_P(zv));
}
}
return;
}
+ if ((op_array->fn_flags & ZEND_ACC_IMMUTABLE)
+ && !op_array->static_variables
+ && !ZCG(current_persistent_script)->corrupted
+ && zend_accel_in_shm(op_array)) {
+ zend_shared_alloc_register_xlat_entry(op_array, op_array);
+ return;
+ }
+
old_op_array = zend_shared_alloc_get_xlat_entry(op_array);
if (!old_op_array) {
- ADD_SIZE_EX(sizeof(zend_op_array));
+ ADD_SIZE(sizeof(zend_op_array));
zend_persist_op_array_calc_ex(Z_PTR_P(zv));
zend_shared_alloc_register_xlat_entry(op_array, Z_PTR_P(zv));
- if (!ZCG(is_immutable_class)) {
- ADD_ARENA_SIZE(sizeof(void*));
- }
} else {
/* If op_array is shared, the function name refcount is still incremented for each use,
* so we need to release it here. We remembered the original function name in xlat. */
@@ -336,7 +356,7 @@ static void zend_persist_class_method_calc(zval *zv)
static void zend_persist_property_info_calc(zend_property_info *prop)
{
- ADD_SIZE_EX(sizeof(zend_property_info));
+ ADD_SIZE(sizeof(zend_property_info));
ADD_INTERNED_STRING(prop->name);
zend_persist_type_calc(&prop->type);
if (ZCG(accel_directives).save_comments && prop->doc_comment) {
@@ -352,8 +372,12 @@ static void zend_persist_class_constant_calc(zval *zv)
zend_class_constant *c = Z_PTR_P(zv);
if (!zend_shared_alloc_get_xlat_entry(c)) {
+ if (!ZCG(current_persistent_script)->corrupted
+ && zend_accel_in_shm(Z_PTR_P(zv))) {
+ return;
+ }
zend_shared_alloc_register_xlat_entry(c, c);
- ADD_SIZE_EX(sizeof(zend_class_constant));
+ ADD_SIZE(sizeof(zend_class_constant));
zend_persist_zval_calc(&c->value);
if (ZCG(accel_directives).save_comments && c->doc_comment) {
ADD_STRING(c->doc_comment);
@@ -364,29 +388,8 @@ static void zend_persist_class_constant_calc(zval *zv)
}
}
-static void check_property_type_resolution(zend_class_entry *ce) {
- zend_property_info *prop;
- if (ce->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED) {
- /* Preloading might have computed this already. */
- return;
- }
-
- if (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) {
- ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) {
- zend_type *single_type;
- ZEND_TYPE_FOREACH(prop->type, single_type) {
- if (ZEND_TYPE_HAS_NAME(*single_type)) {
- return;
- }
- } ZEND_TYPE_FOREACH_END();
- } ZEND_HASH_FOREACH_END();
- }
- ce->ce_flags |= ZEND_ACC_PROPERTY_TYPES_RESOLVED;
-}
-
-static void zend_persist_class_entry_calc(zval *zv)
+void zend_persist_class_entry_calc(zend_class_entry *ce)
{
- zend_class_entry *ce = Z_PTR_P(zv);
Bucket *p;
if (ce->type == ZEND_USER_CLASS) {
@@ -396,19 +399,15 @@ static void zend_persist_class_entry_calc(zval *zv)
}
zend_shared_alloc_register_xlat_entry(ce, ce);
- check_property_type_resolution(ce);
-
- ZCG(is_immutable_class) =
- (ce->ce_flags & ZEND_ACC_LINKED) &&
- (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED) &&
- (ce->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED) &&
- !ZCG(current_persistent_script)->corrupted;
+ ADD_SIZE(sizeof(zend_class_entry));
- ADD_SIZE_EX(sizeof(zend_class_entry));
- ADD_INTERNED_STRING(ce->name);
- if (ce->parent_name && !(ce->ce_flags & ZEND_ACC_LINKED)) {
- ADD_INTERNED_STRING(ce->parent_name);
+ if (!(ce->ce_flags & ZEND_ACC_CACHED)) {
+ ADD_INTERNED_STRING(ce->name);
+ if (ce->parent_name && !(ce->ce_flags & ZEND_ACC_LINKED)) {
+ ADD_INTERNED_STRING(ce->parent_name);
+ }
}
+
zend_hash_persist_calc(&ce->function_table);
ZEND_HASH_FOREACH_BUCKET(&ce->function_table, p) {
ZEND_ASSERT(p->key != NULL);
@@ -440,16 +439,6 @@ static void zend_persist_class_entry_calc(zval *zv)
zend_persist_class_constant_calc(&p->val);
} ZEND_HASH_FOREACH_END();
- if (ce->info.user.filename) {
- ADD_STRING(ce->info.user.filename);
- }
- if (ZCG(accel_directives).save_comments && ce->info.user.doc_comment) {
- ADD_STRING(ce->info.user.doc_comment);
- }
- if (ce->attributes) {
- zend_persist_attributes_calc(ce->attributes);
- }
-
zend_hash_persist_calc(&ce->properties_info);
ZEND_HASH_FOREACH_BUCKET(&ce->properties_info, p) {
zend_property_info *prop = Z_PTR(p->val);
@@ -461,7 +450,31 @@ static void zend_persist_class_entry_calc(zval *zv)
} ZEND_HASH_FOREACH_END();
if (ce->properties_info_table) {
- ADD_SIZE_EX(sizeof(zend_property_info *) * ce->default_properties_count);
+ ADD_SIZE(sizeof(zend_property_info *) * ce->default_properties_count);
+ }
+
+ if (ce->num_interfaces && (ce->ce_flags & ZEND_ACC_LINKED)) {
+ ADD_SIZE(sizeof(zend_class_entry*) * ce->num_interfaces);
+ }
+
+ if (ce->iterator_funcs_ptr) {
+ ADD_SIZE(sizeof(zend_class_iterator_funcs));
+ }
+
+ if (ce->ce_flags & ZEND_ACC_CACHED) {
+ return;
+ }
+
+ if (ce->info.user.filename) {
+ ADD_STRING(ce->info.user.filename);
+ }
+
+ if (ZCG(accel_directives).save_comments && ce->info.user.doc_comment) {
+ ADD_STRING(ce->info.user.doc_comment);
+ }
+
+ if (ce->attributes) {
+ zend_persist_attributes_calc(ce->attributes);
}
if (ce->num_interfaces) {
@@ -473,8 +486,6 @@ static void zend_persist_class_entry_calc(zval *zv)
ADD_INTERNED_STRING(ce->interface_names[i].lc_name);
}
ADD_SIZE(sizeof(zend_class_name) * ce->num_interfaces);
- } else {
- ADD_SIZE(sizeof(zend_class_entry*) * ce->num_interfaces);
}
}
@@ -524,8 +535,16 @@ static void zend_persist_class_entry_calc(zval *zv)
}
}
- if (ce->iterator_funcs_ptr) {
- ADD_SIZE(sizeof(zend_class_iterator_funcs));
+ if (ce->backed_enum_table) {
+ Bucket *p;
+ ADD_SIZE(sizeof(HashTable));
+ zend_hash_persist_calc(ce->backed_enum_table);
+ ZEND_HASH_FOREACH_BUCKET(ce->backed_enum_table, p) {
+ if (p->key != NULL) {
+ ADD_INTERNED_STRING(p->key);
+ }
+ zend_persist_zval_calc(&p->val);
+ } ZEND_HASH_FOREACH_END();
}
}
}
@@ -538,7 +557,7 @@ static void zend_accel_persist_class_table_calc(HashTable *class_table)
ZEND_HASH_FOREACH_BUCKET(class_table, p) {
ZEND_ASSERT(p->key != NULL);
ADD_INTERNED_STRING(p->key);
- zend_persist_class_entry_calc(&p->val);
+ zend_persist_class_entry_calc(Z_CE(p->val));
} ZEND_HASH_FOREACH_END();
}
@@ -551,14 +570,12 @@ static void zend_persist_warnings_calc(zend_persistent_script *script) {
}
}
-uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_script, const char *key, unsigned int key_length, int for_shm)
+uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_script, int for_shm)
{
Bucket *p;
new_persistent_script->mem = NULL;
new_persistent_script->size = 0;
- new_persistent_script->arena_mem = NULL;
- new_persistent_script->arena_size = 0;
new_persistent_script->corrupted = 0;
ZCG(current_persistent_script) = new_persistent_script;
@@ -568,10 +585,6 @@ uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_s
}
ADD_SIZE(sizeof(zend_persistent_script));
- if (key) {
- ADD_SIZE(key_length + 1);
- zend_shared_alloc_register_xlat_entry(key, key);
- }
ADD_STRING(new_persistent_script->script.filename);
#if defined(__AVX__) || defined(__SSE2__)
@@ -595,12 +608,6 @@ uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_s
zend_persist_op_array_calc_ex(&new_persistent_script->script.main_op_array);
zend_persist_warnings_calc(new_persistent_script);
-#if defined(__AVX__) || defined(__SSE2__)
- /* Align size to 64-byte boundary */
- new_persistent_script->arena_size = (new_persistent_script->arena_size + 63) & ~63;
-#endif
-
- new_persistent_script->size += new_persistent_script->arena_size;
new_persistent_script->corrupted = 0;
ZCG(current_persistent_script) = NULL;
diff --git a/ext/opcache/zend_shared_alloc.c b/ext/opcache/zend_shared_alloc.c
index d32a70b7e8..a078a31c0f 100644
--- a/ext/opcache/zend_shared_alloc.c
+++ b/ext/opcache/zend_shared_alloc.c
@@ -86,7 +86,7 @@ void zend_shared_alloc_create_lock(char *lockfile_path)
fchmod(lock_file, 0666);
if (lock_file == -1) {
- zend_accel_error(ACCEL_LOG_FATAL, "Unable to create lock file: %s (%d)", strerror(errno), errno);
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Unable to create lock file: %s (%d)", strerror(errno), errno);
}
val = fcntl(lock_file, F_GETFD, 0);
val |= FD_CLOEXEC;
@@ -98,7 +98,7 @@ void zend_shared_alloc_create_lock(char *lockfile_path)
static void no_memory_bailout(size_t allocate_size, char *error)
{
- zend_accel_error(ACCEL_LOG_FATAL, "Unable to allocate shared memory segment of %zu bytes: %s: %s (%d)", allocate_size, error?error:"unknown", strerror(errno), errno );
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Unable to allocate shared memory segment of %zu bytes: %s: %s (%d)", allocate_size, error?error:"unknown", strerror(errno), errno );
}
static void copy_shared_segments(void *to, void *from, int count, int size)
@@ -231,14 +231,14 @@ int zend_shared_alloc_startup(size_t requested_size, size_t reserved_size)
p_tmp_shared_globals = (zend_smm_shared_globals *) zend_shared_alloc(sizeof(zend_smm_shared_globals));
if (!p_tmp_shared_globals) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return ALLOC_FAILURE;
}
memset(p_tmp_shared_globals, 0, sizeof(zend_smm_shared_globals));
tmp_shared_segments = zend_shared_alloc(shared_segments_array_size + ZSMMG(shared_segments_count) * sizeof(void *));
if (!tmp_shared_segments) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return ALLOC_FAILURE;
}
@@ -252,7 +252,7 @@ int zend_shared_alloc_startup(size_t requested_size, size_t reserved_size)
ZSMMG(shared_memory_state).positions = (int *)zend_shared_alloc(sizeof(int) * ZSMMG(shared_segments_count));
if (!ZSMMG(shared_memory_state).positions) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return ALLOC_FAILURE;
}
@@ -263,7 +263,7 @@ int zend_shared_alloc_startup(size_t requested_size, size_t reserved_size)
ZSMMG(reserved) = (char*)ZSMMG(shared_segments)[i]->p + ZSMMG(shared_segments)[i]->end;
ZSMMG(reserved_size) = reserved_size;
} else {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return ALLOC_FAILURE;
}
}
@@ -340,7 +340,7 @@ void *zend_shared_alloc(size_t size)
#if 1
if (!ZCG(locked)) {
- zend_accel_error(ACCEL_LOG_ERROR, "Shared memory lock not obtained");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Shared memory lock not obtained");
}
#endif
if (block_size > ZSMMG(shared_free)) { /* No hope to find a big-enough block */
@@ -375,7 +375,7 @@ int zend_shared_memdup_size(void *source, size_t size)
return ZEND_ALIGNED_SIZE(size);
}
-static zend_always_inline void *_zend_shared_memdup(void *source, size_t size, zend_bool arena, zend_bool get_xlat, zend_bool set_xlat, zend_bool free_source)
+static zend_always_inline void *_zend_shared_memdup(void *source, size_t size, bool get_xlat, bool set_xlat, bool free_source)
{
void *old_p, *retval;
zend_ulong key;
@@ -388,13 +388,8 @@ static zend_always_inline void *_zend_shared_memdup(void *source, size_t size, z
return old_p;
}
}
- if (arena) {
- retval = ZCG(arena_mem);
- ZCG(arena_mem) = (void*)(((char*)ZCG(arena_mem)) + ZEND_ALIGNED_SIZE(size));
- } else {
- retval = ZCG(mem);
- ZCG(mem) = (void*)(((char*)ZCG(mem)) + ZEND_ALIGNED_SIZE(size));
- }
+ retval = ZCG(mem);
+ ZCG(mem) = (void*)(((char*)ZCG(mem)) + ZEND_ALIGNED_SIZE(size));
memcpy(retval, source, size);
if (set_xlat) {
if (!get_xlat) {
@@ -411,42 +406,32 @@ static zend_always_inline void *_zend_shared_memdup(void *source, size_t size, z
void *zend_shared_memdup_get_put_free(void *source, size_t size)
{
- return _zend_shared_memdup(source, size, 0, 1, 1, 1);
+ return _zend_shared_memdup(source, size, 1, 1, 1);
}
void *zend_shared_memdup_put_free(void *source, size_t size)
{
- return _zend_shared_memdup(source, size, 0, 0, 1, 1);
+ return _zend_shared_memdup(source, size, 0, 1, 1);
}
void *zend_shared_memdup_free(void *source, size_t size)
{
- return _zend_shared_memdup(source, size, 0, 0, 0, 1);
+ return _zend_shared_memdup(source, size, 0, 0, 1);
}
void *zend_shared_memdup_get_put(void *source, size_t size)
{
- return _zend_shared_memdup(source, size, 0, 1, 1, 0);
+ return _zend_shared_memdup(source, size, 1, 1, 0);
}
void *zend_shared_memdup_put(void *source, size_t size)
{
- return _zend_shared_memdup(source, size, 0, 0, 1, 0);
+ return _zend_shared_memdup(source, size, 0, 1, 0);
}
void *zend_shared_memdup(void *source, size_t size)
{
- return _zend_shared_memdup(source, size, 0, 0, 0, 0);
-}
-
-void *zend_shared_memdup_arena_put(void *source, size_t size)
-{
- return _zend_shared_memdup(source, size, 1, 0, 1, 0);
-}
-
-void *zend_shared_memdup_arena(void *source, size_t size)
-{
- return _zend_shared_memdup(source, size, 1, 0, 0, 0);
+ return _zend_shared_memdup(source, size, 0, 0, 0);
}
void zend_shared_alloc_safe_unlock(void)
@@ -482,7 +467,7 @@ void zend_shared_alloc_lock(void)
if (errno == EINTR) {
continue;
}
- zend_accel_error(ACCEL_LOG_ERROR, "Cannot create lock - %s (%d)", strerror(errno), errno);
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Cannot create lock - %s (%d)", strerror(errno), errno);
}
break;
}
@@ -508,7 +493,7 @@ void zend_shared_alloc_unlock(void)
#ifndef ZEND_WIN32
if (fcntl(lock_file, F_SETLK, &mem_write_unlock) == -1) {
- zend_accel_error(ACCEL_LOG_ERROR, "Cannot remove lock - %s (%d)", strerror(errno), errno);
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Cannot remove lock - %s (%d)", strerror(errno), errno);
}
#ifdef ZTS
tsrm_mutex_unlock(zts_lock);
@@ -631,7 +616,7 @@ void zend_accel_shared_protect(int mode)
for (i = 0; i < ZSMMG(shared_segments_count); i++) {
DWORD oldProtect;
if (!VirtualProtect(ZSMMG(shared_segments)[i]->p, ZSMMG(shared_segments)[i]->end, mode, &oldProtect)) {
- zend_accel_error(ACCEL_LOG_ERROR, "Failed to protect memory");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Failed to protect memory");
}
}
#endif
diff --git a/ext/opcache/zend_shared_alloc.h b/ext/opcache/zend_shared_alloc.h
index 1dbc88d42e..7b67c3c454 100644
--- a/ext/opcache/zend_shared_alloc.h
+++ b/ext/opcache/zend_shared_alloc.h
@@ -109,7 +109,7 @@ typedef struct _zend_smm_shared_globals {
/* Amount of shared memory allocated by garbage */
size_t wasted_shared_memory;
/* No more shared memory flag */
- zend_bool memory_exhausted;
+ bool memory_exhausted;
/* Saved Shared Allocator State */
zend_shared_memory_state shared_memory_state;
/* Pointer to the application's shared data structures */
@@ -139,8 +139,6 @@ void *zend_shared_memdup_free(void *source, size_t size);
void *zend_shared_memdup_get_put(void *source, size_t size);
void *zend_shared_memdup_put(void *source, size_t size);
void *zend_shared_memdup(void *source, size_t size);
-void *zend_shared_memdup_arena_put(void *source, size_t size);
-void *zend_shared_memdup_arena(void *source, size_t size);
int zend_shared_memdup_size(void *p, size_t size);
diff --git a/ext/openssl/config0.m4 b/ext/openssl/config0.m4
index 9df2469363..e08a76897a 100644
--- a/ext/openssl/config0.m4
+++ b/ext/openssl/config0.m4
@@ -1,7 +1,7 @@
PHP_ARG_WITH([openssl],
[for OpenSSL support],
[AS_HELP_STRING([--with-openssl],
- [Include OpenSSL support (requires OpenSSL >= 1.0.1)])])
+ [Include OpenSSL support (requires OpenSSL >= 1.0.2)])])
PHP_ARG_WITH([kerberos],
[for Kerberos support],
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index 340e40a001..749751c07a 100644
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -1103,10 +1103,7 @@ PHP_MINIT_FUNCTION(openssl)
{
char * config_filename;
- zend_class_entry ce;
- INIT_CLASS_ENTRY(ce, "OpenSSLCertificate", class_OpenSSLCertificate_methods);
- php_openssl_certificate_ce = zend_register_internal_class(&ce);
- php_openssl_certificate_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ php_openssl_certificate_ce = register_class_OpenSSLCertificate();
php_openssl_certificate_ce->create_object = php_openssl_certificate_create_object;
php_openssl_certificate_ce->serialize = zend_class_serialize_deny;
php_openssl_certificate_ce->unserialize = zend_class_unserialize_deny;
@@ -1118,10 +1115,7 @@ PHP_MINIT_FUNCTION(openssl)
php_openssl_certificate_object_handlers.clone_obj = NULL;
php_openssl_certificate_object_handlers.compare = zend_objects_not_comparable;
- zend_class_entry csr_ce;
- INIT_CLASS_ENTRY(csr_ce, "OpenSSLCertificateSigningRequest", class_OpenSSLCertificateSigningRequest_methods);
- php_openssl_request_ce = zend_register_internal_class(&csr_ce);
- php_openssl_request_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ php_openssl_request_ce = register_class_OpenSSLCertificateSigningRequest();
php_openssl_request_ce->create_object = php_openssl_request_create_object;
php_openssl_request_ce->serialize = zend_class_serialize_deny;
php_openssl_request_ce->unserialize = zend_class_unserialize_deny;
@@ -1133,10 +1127,7 @@ PHP_MINIT_FUNCTION(openssl)
php_openssl_request_object_handlers.clone_obj = NULL;
php_openssl_request_object_handlers.compare = zend_objects_not_comparable;
- zend_class_entry key_ce;
- INIT_CLASS_ENTRY(key_ce, "OpenSSLAsymmetricKey", class_OpenSSLAsymmetricKey_methods);
- php_openssl_pkey_ce = zend_register_internal_class(&key_ce);
- php_openssl_pkey_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ php_openssl_pkey_ce = register_class_OpenSSLAsymmetricKey();
php_openssl_pkey_ce->create_object = php_openssl_pkey_create_object;
php_openssl_pkey_ce->serialize = zend_class_serialize_deny;
php_openssl_pkey_ce->unserialize = zend_class_unserialize_deny;
@@ -1154,13 +1145,6 @@ PHP_MINIT_FUNCTION(openssl)
OpenSSL_add_all_ciphers();
OpenSSL_add_all_digests();
OpenSSL_add_all_algorithms();
-
-#if !defined(OPENSSL_NO_AES) && defined(EVP_CIPH_CCM_MODE) && OPENSSL_VERSION_NUMBER < 0x100020000
- EVP_add_cipher(EVP_aes_128_ccm());
- EVP_add_cipher(EVP_aes_192_ccm());
- EVP_add_cipher(EVP_aes_256_ccm());
-#endif
-
SSL_load_error_strings();
#else
OPENSSL_init_ssl(OPENSSL_INIT_LOAD_CONFIG, NULL);
@@ -1483,7 +1467,7 @@ PHP_FUNCTION(openssl_x509_export_to_file)
zend_object *cert_obj;
zend_string *cert_str;
- zend_bool notext = 1;
+ bool notext = 1;
BIO * bio_out;
char * filename;
size_t filename_len;
@@ -1793,7 +1777,7 @@ PHP_FUNCTION(openssl_x509_export)
zend_object *cert_obj;
zend_string *cert_str;
zval *zout;
- zend_bool notext = 1;
+ bool notext = 1;
BIO * bio_out;
ZEND_PARSE_PARAMETERS_START(2, 3)
@@ -1839,7 +1823,7 @@ cleanup:
}
/* }}} */
-zend_string* php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw)
+zend_string* php_openssl_x509_fingerprint(X509 *peer, const char *method, bool raw)
{
unsigned char md[EVP_MAX_MD_SIZE];
const EVP_MD *mdtype;
@@ -1871,7 +1855,7 @@ PHP_FUNCTION(openssl_x509_fingerprint)
X509 *cert;
zend_object *cert_obj;
zend_string *cert_str;
- zend_bool raw_output = 0;
+ bool raw_output = 0;
char *method = "sha1";
size_t method_len;
zend_string *fingerprint;
@@ -2050,7 +2034,7 @@ PHP_FUNCTION(openssl_x509_parse)
zend_object *cert_obj;
zend_string *cert_str;
int i, sig_nid;
- zend_bool useshortnames = 1;
+ bool useshortnames = 1;
char * tmpstr;
zval subitem;
X509_EXTENSION *extension;
@@ -3045,7 +3029,7 @@ PHP_FUNCTION(openssl_csr_export_to_file)
X509_REQ *csr;
zend_object *csr_obj;
zend_string *csr_str;
- zend_bool notext = 1;
+ bool notext = 1;
char * filename = NULL;
size_t filename_len;
BIO * bio_out;
@@ -3099,7 +3083,7 @@ PHP_FUNCTION(openssl_csr_export)
zend_object *csr_obj;
zend_string *csr_str;
zval *zout;
- zend_bool notext = 1;
+ bool notext = 1;
BIO * bio_out;
ZEND_PARSE_PARAMETERS_START(2, 3)
@@ -3386,7 +3370,7 @@ PHP_FUNCTION(openssl_csr_get_subject)
X509_REQ *csr;
zend_object *csr_obj;
zend_string *csr_str;
- zend_bool use_shortnames = 1;
+ bool use_shortnames = 1;
X509_NAME *subject;
ZEND_PARSE_PARAMETERS_START(1, 2)
@@ -3417,7 +3401,7 @@ PHP_FUNCTION(openssl_csr_get_public_key)
X509_REQ *orig_csr, *csr;
zend_object *csr_obj;
zend_string *csr_str;
- zend_bool use_shortnames = 1;
+ bool use_shortnames = 1;
php_openssl_pkey_object *key_object;
EVP_PKEY *tpubkey;
@@ -3672,28 +3656,20 @@ static EVP_PKEY * php_openssl_generate_private_key(struct php_x509_request * req
case OPENSSL_KEYTYPE_RSA:
{
RSA* rsaparam;
-#if OPENSSL_VERSION_NUMBER < 0x10002000L
- /* OpenSSL 1.0.2 deprecates RSA_generate_key */
- PHP_OPENSSL_RAND_ADD_TIME();
- rsaparam = (RSA*)RSA_generate_key(req->priv_key_bits, RSA_F4, NULL, NULL);
-#else
- {
- BIGNUM *bne = (BIGNUM *)BN_new();
- if (BN_set_word(bne, RSA_F4) != 1) {
- BN_free(bne);
- php_error_docref(NULL, E_WARNING, "Failed setting exponent");
- return NULL;
- }
- rsaparam = RSA_new();
- PHP_OPENSSL_RAND_ADD_TIME();
- if (rsaparam == NULL || !RSA_generate_key_ex(rsaparam, req->priv_key_bits, bne, NULL)) {
- php_openssl_store_errors();
- RSA_free(rsaparam);
- rsaparam = NULL;
- }
+ BIGNUM *bne = (BIGNUM *)BN_new();
+ if (BN_set_word(bne, RSA_F4) != 1) {
BN_free(bne);
+ php_error_docref(NULL, E_WARNING, "Failed setting exponent");
+ return NULL;
}
-#endif
+ rsaparam = RSA_new();
+ PHP_OPENSSL_RAND_ADD_TIME();
+ if (rsaparam == NULL || !RSA_generate_key_ex(rsaparam, req->priv_key_bits, bne, NULL)) {
+ php_openssl_store_errors();
+ RSA_free(rsaparam);
+ rsaparam = NULL;
+ }
+ BN_free(bne);
if (rsaparam && EVP_PKEY_assign_RSA(req->priv_key, rsaparam)) {
return_val = req->priv_key;
} else {
@@ -3892,7 +3868,7 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey)
} while (0);
/* {{{ php_openssl_pkey_init_rsa */
-static zend_bool php_openssl_pkey_init_and_assign_rsa(EVP_PKEY *pkey, RSA *rsa, zval *data)
+static bool php_openssl_pkey_init_and_assign_rsa(EVP_PKEY *pkey, RSA *rsa, zval *data)
{
BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp;
@@ -3925,7 +3901,7 @@ static zend_bool php_openssl_pkey_init_and_assign_rsa(EVP_PKEY *pkey, RSA *rsa,
}
/* {{{ php_openssl_pkey_init_dsa */
-static zend_bool php_openssl_pkey_init_dsa(DSA *dsa, zval *data)
+static bool php_openssl_pkey_init_dsa(DSA *dsa, zval *data)
{
BIGNUM *p, *q, *g, *priv_key, *pub_key;
const BIGNUM *priv_key_const, *pub_key_const;
@@ -4003,7 +3979,7 @@ static BIGNUM *php_openssl_dh_pub_from_priv(BIGNUM *priv_key, BIGNUM *g, BIGNUM
/* }}} */
/* {{{ php_openssl_pkey_init_dh */
-static zend_bool php_openssl_pkey_init_dh(DH *dh, zval *data)
+static bool php_openssl_pkey_init_dh(DH *dh, zval *data)
{
BIGNUM *p, *q, *g, *priv_key, *pub_key;
@@ -6781,7 +6757,7 @@ static void php_openssl_add_method(const OBJ_NAME *name, void *arg) /* {{{ */
/* {{{ Return array of available digest algorithms */
PHP_FUNCTION(openssl_get_md_methods)
{
- zend_bool aliases = 0;
+ bool aliases = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &aliases) == FAILURE) {
RETURN_THROWS();
@@ -6796,7 +6772,7 @@ PHP_FUNCTION(openssl_get_md_methods)
/* {{{ Return array of available cipher algorithms */
PHP_FUNCTION(openssl_get_cipher_methods)
{
- zend_bool aliases = 0;
+ bool aliases = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &aliases) == FAILURE) {
RETURN_THROWS();
@@ -6841,7 +6817,7 @@ PHP_FUNCTION(openssl_get_curve_names)
/* {{{ Computes digest hash value for given data using given method, returns raw or binhex encoded string */
PHP_FUNCTION(openssl_digest)
{
- zend_bool raw_output = 0;
+ bool raw_output = 0;
char *data, *method;
size_t data_len, method_len;
const EVP_MD *mdtype;
@@ -6890,10 +6866,10 @@ PHP_FUNCTION(openssl_digest)
/* Cipher mode info */
struct php_openssl_cipher_mode {
- zend_bool is_aead;
- zend_bool is_single_run_aead;
- zend_bool set_tag_length_always;
- zend_bool set_tag_length_when_encrypting;
+ bool is_aead;
+ bool is_single_run_aead;
+ bool set_tag_length_always;
+ bool set_tag_length_when_encrypting;
int aead_get_tag_flag;
int aead_set_tag_flag;
int aead_ivlen_flag;
@@ -6945,7 +6921,7 @@ static void php_openssl_load_cipher_mode(struct php_openssl_cipher_mode *mode, c
/* }}} */
static int php_openssl_validate_iv(const char **piv, size_t *piv_len, size_t iv_required_len,
- zend_bool *free_iv, EVP_CIPHER_CTX *cipher_ctx, struct php_openssl_cipher_mode *mode) /* {{{ */
+ bool *free_iv, EVP_CIPHER_CTX *cipher_ctx, struct php_openssl_cipher_mode *mode) /* {{{ */
{
char *iv_new;
@@ -6998,8 +6974,8 @@ static int php_openssl_validate_iv(const char **piv, size_t *piv_len, size_t iv_
static int php_openssl_cipher_init(const EVP_CIPHER *cipher_type,
EVP_CIPHER_CTX *cipher_ctx, struct php_openssl_cipher_mode *mode,
- const char **ppassword, size_t *ppassword_len, zend_bool *free_password,
- const char **piv, size_t *piv_len, zend_bool *free_iv,
+ const char **ppassword, size_t *ppassword_len, bool *free_password,
+ const char **piv, size_t *piv_len, bool *free_iv,
const char *tag, int tag_len, zend_long options, int enc) /* {{{ */
{
unsigned char *key;
@@ -7124,7 +7100,7 @@ PHP_OPENSSL_API zend_string* php_openssl_encrypt(
EVP_CIPHER_CTX *cipher_ctx;
struct php_openssl_cipher_mode mode;
int i = 0, outlen;
- zend_bool free_iv = 0, free_password = 0;
+ bool free_iv = 0, free_password = 0;
zend_string *outbuf = NULL;
PHP_OPENSSL_CHECK_SIZE_T_TO_INT_NULL_RETURN(data_len, data);
@@ -7238,7 +7214,7 @@ PHP_OPENSSL_API zend_string* php_openssl_decrypt(
struct php_openssl_cipher_mode mode;
int i = 0, outlen;
zend_string *base64_str = NULL;
- zend_bool free_iv = 0, free_password = 0;
+ bool free_iv = 0, free_password = 0;
zend_string *outbuf = NULL;
PHP_OPENSSL_CHECK_SIZE_T_TO_INT_NULL_RETURN(data_len, data);
diff --git a/ext/openssl/openssl.stub.php b/ext/openssl/openssl.stub.php
index e77f4e4043..db49af3126 100644
--- a/ext/openssl/openssl.stub.php
+++ b/ext/openssl/openssl.stub.php
@@ -1,15 +1,18 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+/** @strict-properties */
final class OpenSSLCertificate
{
}
+/** @strict-properties */
final class OpenSSLCertificateSigningRequest
{
}
+/** @strict-properties */
final class OpenSSLAsymmetricKey
{
}
diff --git a/ext/openssl/openssl_arginfo.h b/ext/openssl/openssl_arginfo.h
index 1e30d9c2c1..2470e528ec 100644
--- a/ext/openssl/openssl_arginfo.h
+++ b/ext/openssl/openssl_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: d4f73f86e6f16a74ab5b60bb79c4a9f29e9bc4fb */
+ * Stub hash: e881a9190424d49fa39ac76f6c13044b65ba2f7f */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_openssl_x509_export_to_file, 0, 2, _IS_BOOL, 0)
ZEND_ARG_OBJ_TYPE_MASK(0, certificate, OpenSSLCertificate, MAY_BE_STRING, NULL)
@@ -530,3 +530,36 @@ static const zend_function_entry class_OpenSSLCertificateSigningRequest_methods[
static const zend_function_entry class_OpenSSLAsymmetricKey_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_OpenSSLCertificate(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "OpenSSLCertificate", class_OpenSSLCertificate_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_OpenSSLCertificateSigningRequest(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "OpenSSLCertificateSigningRequest", class_OpenSSLCertificateSigningRequest_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_OpenSSLAsymmetricKey(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "OpenSSLAsymmetricKey", class_OpenSSLAsymmetricKey_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/openssl/php_openssl.h b/ext/openssl/php_openssl.h
index c674ead34b..838832388c 100644
--- a/ext/openssl/php_openssl.h
+++ b/ext/openssl/php_openssl.h
@@ -35,9 +35,7 @@ extern zend_module_entry openssl_module_entry;
#endif
#else
/* OpenSSL version check */
-#if OPENSSL_VERSION_NUMBER < 0x10002000L
-#define PHP_OPENSSL_API_VERSION 0x10001
-#elif OPENSSL_VERSION_NUMBER < 0x10100000L
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
#define PHP_OPENSSL_API_VERSION 0x10002
#else
#define PHP_OPENSSL_API_VERSION 0x10100
diff --git a/ext/openssl/tests/openssl_decrypt_ccm.phpt b/ext/openssl/tests/openssl_decrypt_ccm.phpt
index 13ee520b79..74c67872d3 100644
--- a/ext/openssl/tests/openssl_decrypt_ccm.phpt
+++ b/ext/openssl/tests/openssl_decrypt_ccm.phpt
@@ -24,7 +24,7 @@ foreach ($methods as $method) {
// no IV
var_dump(openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA,
- NULL, $test['tag'], $test['aad']));
+ '', $test['tag'], $test['aad']));
// failed because no AAD
var_dump(openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA,
$test['iv'], $test['tag']));
diff --git a/ext/openssl/tests/openssl_decrypt_gcm.phpt b/ext/openssl/tests/openssl_decrypt_gcm.phpt
index 223c9e72c4..bfec7240df 100644
--- a/ext/openssl/tests/openssl_decrypt_gcm.phpt
+++ b/ext/openssl/tests/openssl_decrypt_gcm.phpt
@@ -22,7 +22,7 @@ foreach ($tests as $idx => $test) {
// no IV
var_dump(openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA,
- NULL, $test['tag'], $test['aad']));
+ '', $test['tag'], $test['aad']));
// failed because no AAD
var_dump(openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA,
$test['iv'], $test['tag']));
diff --git a/ext/openssl/tests/openssl_decrypt_ocb.phpt b/ext/openssl/tests/openssl_decrypt_ocb.phpt
index cea35501dd..52b5d03c7d 100644
--- a/ext/openssl/tests/openssl_decrypt_ocb.phpt
+++ b/ext/openssl/tests/openssl_decrypt_ocb.phpt
@@ -22,7 +22,7 @@ foreach ($tests as $idx => $test) {
// no IV
var_dump(openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA,
- NULL, $test['tag'], $test['aad']));
+ '', $test['tag'], $test['aad']));
// IV too long
var_dump(openssl_decrypt($test['ct'], $method, $test['key'], OPENSSL_RAW_DATA,
diff --git a/ext/openssl/tests/openssl_encrypt_ccm.phpt b/ext/openssl/tests/openssl_encrypt_ccm.phpt
index 8c4c41f818..f4b773749a 100644
--- a/ext/openssl/tests/openssl_encrypt_ccm.phpt
+++ b/ext/openssl/tests/openssl_encrypt_ccm.phpt
@@ -24,7 +24,7 @@ foreach ($methods as $method) {
}
// Empty IV error
-var_dump(openssl_encrypt('data', $method, 'password', 0, NULL, $tag, ''));
+var_dump(openssl_encrypt('data', $method, 'password', 0, '', $tag, ''));
// Test setting different IV length and tag length
var_dump(openssl_encrypt('data', $method, 'password', 0, str_repeat('x', 10), $tag, '', 14));
diff --git a/ext/openssl/tests/openssl_encrypt_gcm.phpt b/ext/openssl/tests/openssl_encrypt_gcm.phpt
index 2b4a31b0f4..d976f4a5f3 100644
--- a/ext/openssl/tests/openssl_encrypt_gcm.phpt
+++ b/ext/openssl/tests/openssl_encrypt_gcm.phpt
@@ -22,7 +22,7 @@ foreach ($tests as $idx => $test) {
}
// Empty IV error
-var_dump(openssl_encrypt('data', $method, 'password', 0, NULL, $tag, ''));
+var_dump(openssl_encrypt('data', $method, 'password', 0, '', $tag, ''));
// Failing to retrieve tag (max is 16 bytes)
var_dump(openssl_encrypt('data', $method, 'password', 0, str_repeat('x', 32), $tag, '', 20));
diff --git a/ext/openssl/tests/openssl_encrypt_ocb.phpt b/ext/openssl/tests/openssl_encrypt_ocb.phpt
index ee35a37ce4..57106f7855 100644
--- a/ext/openssl/tests/openssl_encrypt_ocb.phpt
+++ b/ext/openssl/tests/openssl_encrypt_ocb.phpt
@@ -22,7 +22,7 @@ foreach ($tests as $idx => $test) {
}
// Empty IV error
-var_dump(openssl_encrypt('data', $method, 'password', 0, NULL, $tag, ''));
+var_dump(openssl_encrypt('data', $method, 'password', 0, '', $tag, ''));
// Failing to retrieve tag (must be at most 16 bytes)
var_dump(openssl_encrypt('data', $method, 'password', 0, str_repeat('x', 12), $tag, '', 20));
diff --git a/ext/openssl/tests/openssl_x509_export_basic.phpt b/ext/openssl/tests/openssl_x509_export_basic.phpt
index 2f87296019..c1c886356b 100644
--- a/ext/openssl/tests/openssl_x509_export_basic.phpt
+++ b/ext/openssl/tests/openssl_x509_export_basic.phpt
@@ -29,9 +29,9 @@ if (PHP_EOL !== "\n") {
var_dump(strcmp($output, $a));
var_dump(strcmp($output, $output2));
-var_dump(strcmp($output, $output3));
-var_dump(strcmp($output, $output4)); // different
-var_dump(strcmp($output, $output5)); // different
+var_dump(strcmp($output, $output4));
+var_dump($output3);
+var_dump($output5);
?>
--EXPECTF--
bool(true)
@@ -44,5 +44,5 @@ openssl_x509_export(): Argument #1 ($certificate) must be of type OpenSSLCertifi
int(0)
int(0)
int(%d)
-int(0)
-int(%d)
+NULL
+NULL
diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c
index feb9ee52c1..9918e0c751 100644
--- a/ext/openssl/xp_ssl.c
+++ b/ext/openssl/xp_ssl.c
@@ -33,11 +33,8 @@
#include <openssl/x509.h>
#include <openssl/x509v3.h>
#include <openssl/err.h>
-
-#if OPENSSL_VERSION_NUMBER >= 0x10002000L
#include <openssl/bn.h>
#include <openssl/dh.h>
-#endif
#ifdef PHP_WIN32
#include "win32/winutil.h"
@@ -80,10 +77,8 @@
#ifndef OPENSSL_NO_TLSEXT
#define HAVE_TLS_SNI 1
-#if OPENSSL_VERSION_NUMBER >= 0x10002000L
#define HAVE_TLS_ALPN 1
#endif
-#endif
#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
#define HAVE_SEC_LEVEL 1
@@ -120,7 +115,7 @@ static RSA *php_openssl_tmp_rsa_cb(SSL *s, int is_export, int keylength);
#endif
extern php_stream* php_openssl_get_stream_from_ssl_handle(const SSL *ssl);
-extern zend_string* php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw);
+extern zend_string* php_openssl_x509_fingerprint(X509 *peer, const char *method, bool raw);
extern int php_openssl_get_ssl_stream_data_index();
static struct timeval php_openssl_subtract_timeval(struct timeval a, struct timeval b);
static int php_openssl_compare_timeval(struct timeval a, struct timeval b);
@@ -201,7 +196,7 @@ static int php_openssl_is_http_stream_talking_to_iis(php_stream *stream) /* {{{
}
/* }}} */
-static int php_openssl_handle_ssl_error(php_stream *stream, int nr_bytes, zend_bool is_init) /* {{{ */
+static int php_openssl_handle_ssl_error(php_stream *stream, int nr_bytes, bool is_init) /* {{{ */
{
php_openssl_netstream_data_t *sslsock = (php_openssl_netstream_data_t*)stream->abstract;
int err = SSL_get_error(sslsock->ssl_handle, nr_bytes);
@@ -339,7 +334,7 @@ static int php_openssl_x509_fingerprint_cmp(X509 *peer, const char *method, cons
return result;
}
-static zend_bool php_openssl_x509_fingerprint_match(X509 *peer, zval *val)
+static bool php_openssl_x509_fingerprint_match(X509 *peer, zval *val)
{
if (Z_TYPE_P(val) == IS_STRING) {
const char *method = NULL;
@@ -383,7 +378,7 @@ static zend_bool php_openssl_x509_fingerprint_match(X509 *peer, zval *val)
return 0;
}
-static zend_bool php_openssl_matches_wildcard_name(const char *subjectname, const char *certname) /* {{{ */
+static bool php_openssl_matches_wildcard_name(const char *subjectname, const char *certname) /* {{{ */
{
char *wildcard = NULL;
ptrdiff_t prefix_len;
@@ -418,7 +413,7 @@ static zend_bool php_openssl_matches_wildcard_name(const char *subjectname, cons
}
/* }}} */
-static zend_bool php_openssl_matches_san_list(X509 *peer, const char *subject_name) /* {{{ */
+static bool php_openssl_matches_san_list(X509 *peer, const char *subject_name) /* {{{ */
{
int i, len;
unsigned char *cert_name = NULL;
@@ -478,11 +473,11 @@ static zend_bool php_openssl_matches_san_list(X509 *peer, const char *subject_na
}
/* }}} */
-static zend_bool php_openssl_matches_common_name(X509 *peer, const char *subject_name) /* {{{ */
+static bool php_openssl_matches_common_name(X509 *peer, const char *subject_name) /* {{{ */
{
char buf[1024];
X509_NAME *cert_name;
- zend_bool is_match = 0;
+ bool is_match = 0;
int cert_name_len;
cert_name = X509_get_subject_name(peer);
@@ -632,7 +627,7 @@ static int php_openssl_win_cert_verify_callback(X509_STORE_CTX *x509_store_ctx,
php_stream *stream;
php_openssl_netstream_data_t *sslsock;
zval *val;
- zend_bool is_self_signed = 0;
+ bool is_self_signed = 0;
stream = (php_stream*)arg;
@@ -912,7 +907,6 @@ static int php_openssl_enable_peer_verification(SSL_CTX *ctx, php_stream *stream
} else {
#ifdef PHP_WIN32
SSL_CTX_set_cert_verify_callback(ctx, php_openssl_win_cert_verify_callback, (void *)stream);
- SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
#else
if (sslsock->is_client && !SSL_CTX_set_default_verify_paths(ctx)) {
php_error_docref(NULL, E_WARNING,
@@ -1294,12 +1288,8 @@ static int php_openssl_set_server_ecdh_curve(php_stream *stream, SSL_CTX *ctx) /
zvcurve = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream), "ssl", "ecdh_curve");
if (zvcurve == NULL) {
-#if OPENSSL_VERSION_NUMBER >= 0x10002000L
SSL_CTX_set_ecdh_auto(ctx, 1);
return SUCCESS;
-#else
- curve_nid = NID_X9_62_prime256v1;
-#endif
} else {
if (!try_convert_to_string(zvcurve)) {
return FAILURE;
@@ -2301,7 +2291,7 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_
php_stream_xport_param *xparam STREAMS_DC) /* {{{ */
{
int clisock;
- zend_bool nodelay = 0;
+ bool nodelay = 0;
zval *tmpzval = NULL;
xparam->outputs.client = NULL;
diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c
index f9a48b0406..def0ac637d 100644
--- a/ext/pcntl/pcntl.c
+++ b/ext/pcntl/pcntl.c
@@ -885,8 +885,8 @@ PHP_FUNCTION(pcntl_signal)
{
zval *handle;
zend_long signo;
- zend_bool restart_syscalls = 1;
- zend_bool restart_syscalls_is_null = 1;
+ bool restart_syscalls = 1;
+ bool restart_syscalls_is_null = 1;
char *error = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz|b!", &signo, &handle, &restart_syscalls, &restart_syscalls_is_null) == FAILURE) {
@@ -1185,7 +1185,7 @@ PHP_FUNCTION(pcntl_getpriority)
{
zend_long who = PRIO_PROCESS;
zend_long pid;
- zend_bool pid_is_null = 1;
+ bool pid_is_null = 1;
int pri;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!l", &pid, &pid_is_null, &who) == FAILURE) {
@@ -1224,7 +1224,7 @@ PHP_FUNCTION(pcntl_setpriority)
{
zend_long who = PRIO_PROCESS;
zend_long pid;
- zend_bool pid_is_null = 1;
+ bool pid_is_null = 1;
zend_long pri;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l!l", &pri, &pid, &pid_is_null, &who) == FAILURE) {
@@ -1387,7 +1387,7 @@ void pcntl_signal_dispatch()
/* {{{ Enable/disable asynchronous signal handling and return the old setting. */
PHP_FUNCTION(pcntl_async_signals)
{
- zend_bool on, on_is_null = 1;
+ bool on, on_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b!", &on, &on_is_null) == FAILURE) {
RETURN_THROWS();
diff --git a/ext/pcntl/pcntl.stub.php b/ext/pcntl/pcntl.stub.php
index ea66c9f898..53c9b607ad 100644
--- a/ext/pcntl/pcntl.stub.php
+++ b/ext/pcntl/pcntl.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function pcntl_fork(): int {}
diff --git a/ext/pcntl/pcntl_arginfo.h b/ext/pcntl/pcntl_arginfo.h
index 87a2579c9b..38d512631f 100644
--- a/ext/pcntl/pcntl_arginfo.h
+++ b/ext/pcntl/pcntl_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 8742901e9b4fe5ee595a1e7c492474723f95d253 */
+ * Stub hash: dc44f2c96c13457cd6acae4897d6e416403e6756 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pcntl_fork, 0, 0, IS_LONG, 0)
ZEND_END_ARG_INFO()
diff --git a/ext/pcntl/php_pcntl.h b/ext/pcntl/php_pcntl.h
index 4fec1627ad..05bd8d4c13 100644
--- a/ext/pcntl/php_pcntl.h
+++ b/ext/pcntl/php_pcntl.h
@@ -86,7 +86,7 @@ ZEND_BEGIN_MODULE_GLOBALS(pcntl)
struct php_pcntl_pending_signal *head, *tail, *spares;
int last_error;
volatile char pending_signals;
- zend_bool async_signals;
+ bool async_signals;
ZEND_END_MODULE_GLOBALS(pcntl)
#if defined(ZTS) && defined(COMPILE_DL_PCNTL)
diff --git a/ext/pcntl/tests/002.phpt b/ext/pcntl/tests/002.phpt
index 68b2643092..254da86136 100644
--- a/ext/pcntl/tests/002.phpt
+++ b/ext/pcntl/tests/002.phpt
@@ -7,6 +7,7 @@ pcntl: pcntl_sigprocmask(), pcntl_sigwaitinfo(), pcntl_sigtimedwait()
elseif (!function_exists('pcntl_sigwaitinfo') or !function_exists('pcntl_sigtimedwait')) die('skip required functionality is not available');
elseif (!defined('CLD_EXITED')) die('skip CLD_EXITED not defined');
elseif (getenv('SKIP_ASAN')) die('skip Fails intermittently under asan/msan');
+ elseif (getenv("SKIP_REPEAT")) die("skip cannot be repeated");
?>
--FILE--
<?php
diff --git a/ext/pcntl/tests/pcntl_unshare_01.phpt b/ext/pcntl/tests/pcntl_unshare_01.phpt
index fcbf112e4d..6eb5a20bdd 100644
--- a/ext/pcntl/tests/pcntl_unshare_01.phpt
+++ b/ext/pcntl/tests/pcntl_unshare_01.phpt
@@ -9,6 +9,7 @@ if (!defined("CLONE_NEWUSER")) die("skip flag unavailable");
if (@pcntl_unshare(CLONE_NEWUSER) == false && pcntl_get_last_error() == PCNTL_EPERM) {
die("skip Insufficient privileges to use CLONE_NEWUSER");
}
+if (getenv("SKIP_REPEAT")) die("skip cannot be repeated");
?>
--FILE--
<?php
diff --git a/ext/pcntl/tests/pcntl_unshare_02.phpt b/ext/pcntl/tests/pcntl_unshare_02.phpt
index fdf07bc81c..3e90a3920c 100644
--- a/ext/pcntl/tests/pcntl_unshare_02.phpt
+++ b/ext/pcntl/tests/pcntl_unshare_02.phpt
@@ -15,6 +15,7 @@ if (posix_getuid() !== 0 &&
if (@pcntl_unshare(CLONE_NEWPID) == false && pcntl_get_last_error() == PCNTL_EPERM) {
die("skip Insufficient privileges for CLONE_NEWPID");
}
+if (getenv("SKIP_REPEAT")) die("skip cannot be repeated");
?>
--FILE--
<?php
diff --git a/ext/pcntl/tests/pcntl_unshare_03.phpt b/ext/pcntl/tests/pcntl_unshare_03.phpt
index f82f27b719..8e9bd793e6 100644
--- a/ext/pcntl/tests/pcntl_unshare_03.phpt
+++ b/ext/pcntl/tests/pcntl_unshare_03.phpt
@@ -15,6 +15,7 @@ if (@pcntl_unshare(CLONE_NEWNET) == false && pcntl_get_last_error() == PCNTL_EPE
die("skip Insufficient privileges for CLONE_NEWPID");
}
if (getenv("SKIP_ONLINE_TESTS")) die("skip online test");
+if (getenv("SKIP_REPEAT")) die("skip cannot be repeated");
?>
--FILE--
<?php
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index f4f99432fd..63f558d057 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -67,7 +67,7 @@ ZEND_TLS pcre2_general_context *gctx = NULL;
ZEND_TLS pcre2_compile_context *cctx = NULL;
ZEND_TLS pcre2_match_context *mctx = NULL;
ZEND_TLS pcre2_match_data *mdata = NULL;
-ZEND_TLS zend_bool mdata_used = 0;
+ZEND_TLS bool mdata_used = 0;
ZEND_TLS uint8_t pcre2_init_ok = 0;
#if defined(ZTS) && defined(HAVE_PCRE_JIT_SUPPORT)
static MUTEX_T pcre_mt = NULL;
@@ -999,7 +999,7 @@ static inline void populate_match_value(
}
static inline void add_named(
- zval *subpats, zend_string *name, zval *val, zend_bool unmatched) {
+ zval *subpats, zend_string *name, zval *val, bool unmatched) {
/* If the DUPNAMES option is used, multiple subpatterns might have the same name.
* In this case we want to preserve the one that actually has a value. */
if (!unmatched) {
@@ -1049,8 +1049,8 @@ static inline void add_offset_pair(
static void populate_subpat_array(
zval *subpats, const char *subject, PCRE2_SIZE *offsets, zend_string **subpat_names,
uint32_t num_subpats, int count, const PCRE2_SPTR mark, zend_long flags) {
- zend_bool offset_capture = (flags & PREG_OFFSET_CAPTURE) != 0;
- zend_bool unmatched_as_null = (flags & PREG_UNMATCHED_AS_NULL) != 0;
+ bool offset_capture = (flags & PREG_OFFSET_CAPTURE) != 0;
+ bool unmatched_as_null = (flags & PREG_UNMATCHED_AS_NULL) != 0;
zval val;
int i;
if (subpat_names) {
@@ -1145,7 +1145,7 @@ static void php_do_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) /* {{{ *
}
/* }}} */
-static zend_always_inline zend_bool is_known_valid_utf8(
+static zend_always_inline bool is_known_valid_utf8(
zend_string *subject_str, PCRE2_SIZE start_offset) {
if (!(GC_FLAGS(subject_str) & IS_STR_VALID_UTF8)) {
/* We don't know whether the string is valid UTF-8 or not. */
@@ -1659,7 +1659,7 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, zend_string *su
piece = subject + last_end_offset;
if (count >= 0 && limit > 0) {
- zend_bool simple_string;
+ bool simple_string;
/* Check for too many substrings condition. */
if (UNEXPECTED(count == 0)) {
@@ -1858,7 +1858,7 @@ static zend_string *php_pcre_replace_func_impl(pcre_cache_entry *pce, zend_strin
zend_string *result; /* Result of replacement */
zend_string *eval_result; /* Result of custom function */
pcre2_match_data *match_data;
- zend_bool old_mdata_used;
+ bool old_mdata_used;
/* Calculate the size of the offsets array, and allocate memory for it. */
num_subpats = pce->capture_count + 1;
@@ -2732,7 +2732,7 @@ PHP_FUNCTION(preg_quote)
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STR(str)
Z_PARAM_OPTIONAL
- Z_PARAM_STR_EX(delim, 1, 0)
+ Z_PARAM_STR_OR_NULL(delim)
ZEND_PARSE_PARAMETERS_END();
/* Nothing to do if we got an empty string */
@@ -2885,7 +2885,7 @@ PHPAPI void php_pcre_grep_impl(pcre_cache_entry *pce, zval *input, zval *return
uint32_t options; /* Execution options */
zend_string *string_key;
zend_ulong num_key;
- zend_bool invert; /* Whether to return non-matching
+ bool invert; /* Whether to return non-matching
entries */
pcre2_match_data *match_data;
invert = flags & PREG_GREP_INVERT ? 1 : 0;
diff --git a/ext/pcre/php_pcre.h b/ext/pcre/php_pcre.h
index e9f5e34ab9..6e49715257 100644
--- a/ext/pcre/php_pcre.h
+++ b/ext/pcre/php_pcre.h
@@ -77,9 +77,9 @@ ZEND_BEGIN_MODULE_GLOBALS(pcre)
zend_long backtrack_limit;
zend_long recursion_limit;
#ifdef HAVE_PCRE_JIT_SUPPORT
- zend_bool jit;
+ bool jit;
#endif
- zend_bool per_request_cache;
+ bool per_request_cache;
php_pcre_error_code error_code;
/* Used for unmatched subpatterns in OFFSET_CAPTURE mode */
zval unmatched_null_pair;
diff --git a/ext/pcre/php_pcre.stub.php b/ext/pcre/php_pcre.stub.php
index b2862a2f62..54cb842676 100644
--- a/ext/pcre/php_pcre.stub.php
+++ b/ext/pcre/php_pcre.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
/** @param array $matches */
function preg_match(string $pattern, string $subject, &$matches = null, int $flags = 0, int $offset = 0): int|false {}
diff --git a/ext/pcre/php_pcre_arginfo.h b/ext/pcre/php_pcre_arginfo.h
index c53f35559e..e242b3d49d 100644
--- a/ext/pcre/php_pcre_arginfo.h
+++ b/ext/pcre/php_pcre_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 2e5a9edc9635edd4f5a00e9d888fb34c1746a5b8 */
+ * Stub hash: 861429ae51cfa064e85c0c1c1972707c28869f56 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_preg_match, 0, 2, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, pattern, IS_STRING, 0)
diff --git a/ext/pdo/pdo.c b/ext/pdo/pdo.c
index a66596ee54..1120f9a326 100644
--- a/ext/pdo/pdo.c
+++ b/ext/pdo/pdo.c
@@ -62,14 +62,6 @@ PDO_API zend_class_entry *php_pdo_get_exception(void) /* {{{ */
}
/* }}} */
-PDO_API char *php_pdo_str_tolower_dup(const char *src, int len) /* {{{ */
-{
- char *dest = emalloc(len + 1);
- zend_str_tolower_copy(dest, src, len);
- return dest;
-}
-/* }}} */
-
/* {{{ Return array of available PDO drivers */
PHP_FUNCTION(pdo_drivers)
{
@@ -80,7 +72,7 @@ PHP_FUNCTION(pdo_drivers)
array_init(return_value);
ZEND_HASH_FOREACH_PTR(&pdo_driver_hash, pdriver) {
- add_next_index_stringl(return_value, (char*)pdriver->driver_name, pdriver->driver_name_len);
+ add_next_index_stringl(return_value, pdriver->driver_name, pdriver->driver_name_len);
} ZEND_HASH_FOREACH_END();
}
/* }}} */
@@ -115,7 +107,7 @@ zend_module_entry pdo_module_entry = {
ZEND_GET_MODULE(pdo)
#endif
-PDO_API int php_pdo_register_driver(const pdo_driver_t *driver) /* {{{ */
+PDO_API zend_result php_pdo_register_driver(const pdo_driver_t *driver) /* {{{ */
{
if (driver->api_version != PDO_DRIVER_API) {
zend_error(E_ERROR, "PDO: driver %s requires PDO API version " ZEND_ULONG_FMT "; this is PDO version %d",
@@ -127,7 +119,7 @@ PDO_API int php_pdo_register_driver(const pdo_driver_t *driver) /* {{{ */
return FAILURE; /* NOTREACHED */
}
- return zend_hash_str_add_ptr(&pdo_driver_hash, (char*)driver->driver_name, driver->driver_name_len, (void*)driver) != NULL ? SUCCESS : FAILURE;
+ return zend_hash_str_add_ptr(&pdo_driver_hash, driver->driver_name, driver->driver_name_len, (void*)driver) != NULL ? SUCCESS : FAILURE;
}
/* }}} */
@@ -137,13 +129,13 @@ PDO_API void php_pdo_unregister_driver(const pdo_driver_t *driver) /* {{{ */
return;
}
- zend_hash_str_del(&pdo_driver_hash, (char*)driver->driver_name, driver->driver_name_len);
+ zend_hash_str_del(&pdo_driver_hash, driver->driver_name, driver->driver_name_len);
}
/* }}} */
pdo_driver_t *pdo_find_driver(const char *name, int namelen) /* {{{ */
{
- return zend_hash_str_find_ptr(&pdo_driver_hash, (char*)name, namelen);
+ return zend_hash_str_find_ptr(&pdo_driver_hash, name, namelen);
}
/* }}} */
@@ -248,8 +240,9 @@ PDO_API int php_pdo_parse_data_source(const char *data_source, zend_ulong data_s
}
/* }}} */
+/* TODO Refactor */
static const char digit_vec[] = "0123456789";
-PDO_API char *php_pdo_int64_to_str(pdo_int64_t i64) /* {{{ */
+PDO_API zend_string *php_pdo_int64_to_str(int64_t i64) /* {{{ */
{
char buffer[65];
char outbuf[65] = "";
@@ -257,25 +250,23 @@ PDO_API char *php_pdo_int64_to_str(pdo_int64_t i64) /* {{{ */
zend_long long_val;
char *dst = outbuf;
+ if (i64 == 0) {
+ return ZSTR_CHAR('0');
+ }
+
if (i64 < 0) {
i64 = -i64;
*dst++ = '-';
}
- if (i64 == 0) {
- *dst++ = '0';
- *dst++ = '\0';
- return estrdup(outbuf);
- }
-
p = &buffer[sizeof(buffer)-1];
*p = '\0';
- while ((pdo_uint64_t)i64 > (pdo_uint64_t)ZEND_LONG_MAX) {
- pdo_uint64_t quo = (pdo_uint64_t)i64 / (unsigned int)10;
+ while ((uint64_t)i64 > (uint64_t)ZEND_LONG_MAX) {
+ uint64_t quo = (uint64_t)i64 / (unsigned int)10;
unsigned int rem = (unsigned int)(i64 - quo*10U);
*--p = digit_vec[rem];
- i64 = (pdo_int64_t)quo;
+ i64 = (int64_t)quo;
}
long_val = (zend_long)i64;
while (long_val != 0) {
@@ -286,29 +277,21 @@ PDO_API char *php_pdo_int64_to_str(pdo_int64_t i64) /* {{{ */
while ((*dst++ = *p++) != 0)
;
*dst = '\0';
- return estrdup(outbuf);
+ return zend_string_init(outbuf, strlen(outbuf), 0);
}
/* }}} */
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(pdo)
{
- zend_class_entry ce;
-
- if (FAILURE == pdo_sqlstate_init_error_table()) {
- return FAILURE;
- }
+ pdo_sqlstate_init_error_table();
zend_hash_init(&pdo_driver_hash, 0, NULL, NULL, 1);
le_ppdo = zend_register_list_destructors_ex(NULL, php_pdo_pdbh_dtor,
"PDO persistent database", module_number);
- INIT_CLASS_ENTRY(ce, "PDOException", NULL);
-
- pdo_exception_ce = zend_register_internal_class_ex(&ce, spl_ce_RuntimeException);
-
- zend_declare_property_null(pdo_exception_ce, "errorInfo", sizeof("errorInfo")-1, ZEND_ACC_PUBLIC);
+ pdo_exception_ce = register_class_PDOException(spl_ce_RuntimeException);
pdo_dbh_init();
pdo_stmt_init();
diff --git a/ext/pdo/pdo.stub.php b/ext/pdo/pdo.stub.php
index 8e8a60cfd2..6d6d070cd7 100644
--- a/ext/pdo/pdo.stub.php
+++ b/ext/pdo/pdo.stub.php
@@ -1,9 +1,11 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class PDOException extends RuntimeException
{
+ /** @var array|null */
+ public $errorInfo;
}
function pdo_drivers(): array {}
diff --git a/ext/pdo/pdo_arginfo.h b/ext/pdo/pdo_arginfo.h
index d6d69898eb..10850afc16 100644
--- a/ext/pdo/pdo_arginfo.h
+++ b/ext/pdo/pdo_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 307a770b43157120de39093535ea4ee20c4524fa */
+ * Stub hash: e5e41e3d0ae7a506b43996b6071047755a39d61a */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pdo_drivers, 0, 0, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
@@ -17,3 +17,19 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_PDOException_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_PDOException(zend_class_entry *class_entry_RuntimeException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "PDOException", class_PDOException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException);
+
+ zval property_errorInfo_default_value;
+ ZVAL_NULL(&property_errorInfo_default_value);
+ zend_string *property_errorInfo_name = zend_string_init("errorInfo", sizeof("errorInfo") - 1, 1);
+ zend_declare_property_ex(class_entry, property_errorInfo_name, &property_errorInfo_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_errorInfo_name);
+
+ return class_entry;
+}
diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c
index 375100b360..73a1c8aa17 100644
--- a/ext/pdo/pdo_dbh.c
+++ b/ext/pdo/pdo_dbh.c
@@ -34,7 +34,7 @@
#include "zend_interfaces.h"
#include "pdo_dbh_arginfo.h"
-static zend_result pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value);
+static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value);
void pdo_throw_exception(unsigned int driver_errcode, char *driver_errmsg, pdo_error_type *pdo_error)
{
@@ -148,21 +148,20 @@ PDO_API void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt) /* {{{ */
ZVAL_UNDEF(&info);
if (dbh->methods->fetch_err) {
+ zval *item;
array_init(&info);
add_next_index_string(&info, *pdo_err);
- if (dbh->methods->fetch_err(dbh, stmt, &info)) {
- zval *item;
+ dbh->methods->fetch_err(dbh, stmt, &info);
- if ((item = zend_hash_index_find(Z_ARRVAL(info), 1)) != NULL
- && Z_TYPE_P(item) == IS_LONG) {
- native_code = Z_LVAL_P(item);
- }
+ if ((item = zend_hash_index_find(Z_ARRVAL(info), 1)) != NULL
+ && Z_TYPE_P(item) == IS_LONG) {
+ native_code = Z_LVAL_P(item);
+ }
- if ((item = zend_hash_index_find(Z_ARRVAL(info), 2)) != NULL) {
- supp = estrndup(Z_STRVAL_P(item), Z_STRLEN_P(item));
- }
+ if ((item = zend_hash_index_find(Z_ARRVAL(info), 2)) != NULL) {
+ supp = estrndup(Z_STRVAL_P(item), Z_STRLEN_P(item));
}
}
@@ -225,7 +224,7 @@ PHP_METHOD(PDO, __construct)
{
zval *object = ZEND_THIS;
pdo_dbh_t *dbh = NULL;
- zend_bool is_persistent = 0;
+ bool is_persistent = 0;
char *data_source;
size_t data_source_len;
char *colon;
@@ -376,6 +375,8 @@ PHP_METHOD(PDO, __construct)
php_error_docref(NULL, E_ERROR, "Out of memory");
}
+ /* pdo_dbh_attribute_set() can emit a Warning if the ERR_MODE is set to warning
+ * As we are in a constructor we override the behaviour by replacing the error handler */
zend_replace_error_handling(EH_THROW, pdo_exception_ce, &zeh);
if (!call_factory) {
@@ -408,7 +409,8 @@ options:
continue;
}
ZVAL_DEREF(attr_value);
- /* TODO: Check that this doesn't fail? */
+
+ /* TODO: Should the constructor fail when the attribute cannot be set? */
pdo_dbh_attribute_set(dbh, long_key, attr_value);
} ZEND_HASH_FOREACH_END();
}
@@ -452,10 +454,9 @@ static void pdo_stmt_construct(zend_execute_data *execute_data, pdo_stmt_t *stmt
zval query_string;
zend_string *key;
- ZVAL_STRINGL(&query_string, stmt->query_string, stmt->query_stringlen);
+ ZVAL_STR(&query_string, stmt->query_string);
key = zend_string_init("queryString", sizeof("queryString") - 1, 0);
zend_std_write_property(Z_OBJ_P(object), key, &query_string, NULL);
- zval_ptr_dtor(&query_string);
zend_string_release_ex(key, 0);
if (dbstmt_ce->constructor) {
@@ -490,22 +491,21 @@ static void pdo_stmt_construct(zend_execute_data *execute_data, pdo_stmt_t *stmt
PHP_METHOD(PDO, prepare)
{
pdo_stmt_t *stmt;
- char *statement;
- size_t statement_len;
+ zend_string *statement;
zval *options = NULL, *value, *item, ctor_args;
zend_class_entry *dbstmt_ce, *pce;
pdo_dbh_object_t *dbh_obj = Z_PDO_OBJECT_P(ZEND_THIS);
pdo_dbh_t *dbh = dbh_obj->inner;
ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_STRING(statement, statement_len)
+ Z_PARAM_STR(statement)
Z_PARAM_OPTIONAL
Z_PARAM_ARRAY(options)
ZEND_PARSE_PARAMETERS_END();
PDO_CONSTRUCT_CHECK;
- if (statement_len == 0) {
+ if (ZSTR_LEN(statement) == 0) {
zend_argument_value_error(1, "cannot be empty");
RETURN_THROWS();
}
@@ -557,8 +557,7 @@ PHP_METHOD(PDO, prepare)
stmt = Z_PDO_STMT_P(return_value);
/* unconditionally keep this for later reference */
- stmt->query_string = estrndup(statement, statement_len);
- stmt->query_stringlen = statement_len;
+ stmt->query_string = zend_string_copy(statement);
stmt->default_fetch_type = dbh->default_fetch_type;
stmt->dbh = dbh;
/* give it a reference to me */
@@ -566,7 +565,7 @@ PHP_METHOD(PDO, prepare)
/* we haven't created a lazy object yet */
ZVAL_UNDEF(&stmt->lazy_object_ref);
- if (dbh->methods->preparer(dbh, statement, statement_len, stmt, options)) {
+ if (dbh->methods->preparer(dbh, statement, stmt, options)) {
pdo_stmt_construct(execute_data, stmt, return_value, dbstmt_ce, &ctor_args);
return;
}
@@ -581,7 +580,7 @@ PHP_METHOD(PDO, prepare)
/* }}} */
-static zend_bool pdo_is_in_transaction(pdo_dbh_t *dbh) {
+static bool pdo_is_in_transaction(pdo_dbh_t *dbh) {
if (dbh->methods->in_transaction) {
return dbh->methods->in_transaction(dbh);
}
@@ -603,14 +602,13 @@ PHP_METHOD(PDO, beginTransaction)
}
if (!dbh->methods->begin) {
- /* TODO: this should be an exception; see the auto-commit mode
- * comments below */
+ /* Throw an exception when the driver does not support transactions */
zend_throw_exception_ex(php_pdo_get_exception(), 0, "This driver doesn't support transactions");
RETURN_THROWS();
}
if (dbh->methods->begin(dbh)) {
- dbh->in_txn = 1;
+ dbh->in_txn = true;
RETURN_TRUE;
}
@@ -634,7 +632,7 @@ PHP_METHOD(PDO, commit)
}
if (dbh->methods->commit(dbh)) {
- dbh->in_txn = 0;
+ dbh->in_txn = false;
RETURN_TRUE;
}
@@ -658,7 +656,7 @@ PHP_METHOD(PDO, rollBack)
}
if (dbh->methods->rollback(dbh)) {
- dbh->in_txn = 0;
+ dbh->in_txn = false;
RETURN_TRUE;
}
@@ -680,52 +678,89 @@ PHP_METHOD(PDO, inTransaction)
}
/* }}} */
-static zend_result pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /* {{{ */
+PDO_API bool pdo_get_long_param(zend_long *lval, zval *value)
{
- zend_long lval;
+ switch (Z_TYPE_P(value)) {
+ case IS_LONG:
+ case IS_TRUE:
+ case IS_FALSE:
+ *lval = zval_get_long(value);
+ return true;
+ case IS_STRING:
+ if (IS_LONG == is_numeric_str_function(Z_STR_P(value), lval, NULL)) {
+ return true;
+ }
+ /* fallthrough */
+ default:
+ zend_type_error("Attribute value must be of type int for selected attribute, %s given", zend_zval_type_name(value));
+ return false;
+ }
+}
+PDO_API bool pdo_get_bool_param(bool *bval, zval *value)
+{
+ switch (Z_TYPE_P(value)) {
+ case IS_TRUE:
+ *bval = true;
+ return true;
+ case IS_FALSE:
+ *bval = false;
+ return true;
+ case IS_LONG:
+ *bval = zval_is_true(value);
+ return true;
+ case IS_STRING: /* TODO Should string be allowed? */
+ default:
+ zend_type_error("Attribute value must be of type bool for selected attribute, %s given", zend_zval_type_name(value));
+ return false;
+ }
+}
-/* TODO: Make distinction between numeric and non-numeric strings */
-#define PDO_LONG_PARAM_CHECK \
- if (Z_TYPE_P(value) != IS_LONG && Z_TYPE_P(value) != IS_STRING && Z_TYPE_P(value) != IS_FALSE && Z_TYPE_P(value) != IS_TRUE) { \
- zend_type_error("Attribute value must be of type int for selected attribute, %s given", zend_zval_type_name(value)); \
- return FAILURE; \
- } \
+/* Return false on failure, true otherwise */
+static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /* {{{ */
+{
+ zend_long lval;
+ bool bval;
switch (attr) {
case PDO_ATTR_ERRMODE:
- PDO_LONG_PARAM_CHECK;
- lval = zval_get_long(value);
+ if (!pdo_get_long_param(&lval, value)) {
+ return false;
+ }
switch (lval) {
case PDO_ERRMODE_SILENT:
case PDO_ERRMODE_WARNING:
case PDO_ERRMODE_EXCEPTION:
dbh->error_mode = lval;
- return SUCCESS;
+ return true;
default:
zend_value_error("Error mode must be one of the PDO::ERRMODE_* constants");
- return FAILURE;
+ return false;
}
- return FAILURE;
+ return false;
case PDO_ATTR_CASE:
- PDO_LONG_PARAM_CHECK;
- lval = zval_get_long(value);
+ if (!pdo_get_long_param(&lval, value)) {
+ return false;
+ }
switch (lval) {
case PDO_CASE_NATURAL:
case PDO_CASE_UPPER:
case PDO_CASE_LOWER:
dbh->desired_case = lval;
- return SUCCESS;
+ return true;
default:
zend_value_error("Case folding mode must be one of the PDO::CASE_* constants");
- return FAILURE;
+ return false;
}
- return FAILURE;
+ return false;
case PDO_ATTR_ORACLE_NULLS:
- PDO_LONG_PARAM_CHECK;
- dbh->oracle_nulls = zval_get_long(value);
- return SUCCESS;
+ if (!pdo_get_long_param(&lval, value)) {
+ return false;
+ }
+ /* TODO Check for valid value (NULL_NATURAL, NULL_EMPTY_STRING, NULL_TO_STRING)? */
+ dbh->oracle_nulls = lval;
+ return true;
case PDO_ATTR_DEFAULT_FETCH_MODE:
if (Z_TYPE_P(value) == IS_ARRAY) {
@@ -733,24 +768,28 @@ static zend_result pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *v
if ((tmp = zend_hash_index_find(Z_ARRVAL_P(value), 0)) != NULL && Z_TYPE_P(tmp) == IS_LONG) {
if (Z_LVAL_P(tmp) == PDO_FETCH_INTO || Z_LVAL_P(tmp) == PDO_FETCH_CLASS) {
zend_value_error("PDO::FETCH_INTO and PDO::FETCH_CLASS cannot be set as the default fetch mode");
- return FAILURE;
+ return false;
}
}
+ lval = zval_get_long(value);
} else {
- PDO_LONG_PARAM_CHECK;
+ if (!pdo_get_long_param(&lval, value)) {
+ return false;
+ }
}
- lval = zval_get_long(value);
if (lval == PDO_FETCH_USE_DEFAULT) {
zend_value_error("Fetch mode must be a bitmask of PDO::FETCH_* constants");
- return FAILURE;
+ return false;
}
dbh->default_fetch_type = lval;
- return SUCCESS;
+ return true;
case PDO_ATTR_STRINGIFY_FETCHES:
- PDO_LONG_PARAM_CHECK;
- dbh->stringify = zval_get_long(value) ? 1 : 0;
- return SUCCESS;
+ if (!pdo_get_bool_param(&bval, value)) {
+ return false;
+ }
+ dbh->stringify = bval;
+ return true;
case PDO_ATTR_STATEMENT_CLASS: {
/* array(string classname, array(mixed ctor_args)) */
@@ -763,29 +802,29 @@ static zend_result pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *v
"PDO::ATTR_STATEMENT_CLASS cannot be used with persistent PDO instances"
);
PDO_HANDLE_DBH_ERR();
- return FAILURE;
+ return false;
}
if (Z_TYPE_P(value) != IS_ARRAY) {
zend_type_error("PDO::ATTR_STATEMENT_CLASS value must be of type array, %s given",
zend_zval_type_name(value));
- return FAILURE;
+ return false;
}
if ((item = zend_hash_index_find(Z_ARRVAL_P(value), 0)) == NULL) {
zend_value_error("PDO::ATTR_STATEMENT_CLASS value must be an array with the format "
"array(classname, constructor_args)");
- return FAILURE;
+ return false;
}
if (Z_TYPE_P(item) != IS_STRING || (pce = zend_lookup_class(Z_STR_P(item))) == NULL) {
zend_type_error("PDO::ATTR_STATEMENT_CLASS class must be a valid class");
- return FAILURE;
+ return false;
}
if (!instanceof_function(pce, pdo_dbstmt_ce)) {
zend_type_error("PDO::ATTR_STATEMENT_CLASS class must be derived from PDOStatement");
- return FAILURE;
+ return false;
}
if (pce->constructor && !(pce->constructor->common.fn_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED))) {
zend_type_error("User-supplied statement class cannot have a public constructor");
- return FAILURE;
+ return false;
}
dbh->def_stmt_ce = pce;
if (!Z_ISUNDEF(dbh->def_stmt_ctor_args)) {
@@ -796,15 +835,14 @@ static zend_result pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *v
if (Z_TYPE_P(item) != IS_ARRAY) {
zend_type_error("PDO::ATTR_STATEMENT_CLASS constructor_args must be of type ?array, %s given",
zend_zval_type_name(value));
- return FAILURE;
+ return false;
}
ZVAL_COPY(&dbh->def_stmt_ctor_args, item);
}
- return SUCCESS;
+ return true;
}
-
- default:
- ;
+ /* Don't throw a ValueError as the attribute might be a driver specific one */
+ default:;
}
if (!dbh->methods->set_attribute) {
@@ -813,7 +851,7 @@ static zend_result pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *v
PDO_DBH_CLEAR_ERR();
if (dbh->methods->set_attribute(dbh, attr, value)) {
- return SUCCESS;
+ return true;
}
fail:
@@ -822,7 +860,7 @@ fail:
} else {
PDO_HANDLE_DBH_ERR();
}
- return FAILURE;
+ return false;
}
/* }}} */
@@ -841,10 +879,7 @@ PHP_METHOD(PDO, setAttribute)
PDO_DBH_CLEAR_ERR();
PDO_CONSTRUCT_CHECK;
- if (pdo_dbh_attribute_set(dbh, attr, value) != FAILURE) {
- RETURN_TRUE;
- }
- RETURN_FALSE;
+ RETURN_BOOL(pdo_dbh_attribute_set(dbh, attr, value));
}
/* }}} */
@@ -907,6 +942,8 @@ PHP_METHOD(PDO, getAttribute)
RETURN_FALSE;
default:
+ /* No error state, just return as the return_value has been assigned
+ * by the get_attribute handler */
return;
}
}
@@ -916,23 +953,22 @@ PHP_METHOD(PDO, getAttribute)
PHP_METHOD(PDO, exec)
{
pdo_dbh_t *dbh = Z_PDO_DBH_P(ZEND_THIS);
- char *statement;
- size_t statement_len;
+ zend_string *statement;
zend_long ret;
ZEND_PARSE_PARAMETERS_START(1, 1)
- Z_PARAM_STRING(statement, statement_len)
+ Z_PARAM_STR(statement)
ZEND_PARSE_PARAMETERS_END();
- if (statement_len == 0) {
+ if (ZSTR_LEN(statement) == 0) {
zend_argument_value_error(1, "cannot be empty");
RETURN_THROWS();
}
PDO_DBH_CLEAR_ERR();
PDO_CONSTRUCT_CHECK;
- ret = dbh->methods->doer(dbh, statement, statement_len);
- if(ret == -1) {
+ ret = dbh->methods->doer(dbh, statement);
+ if (ret == -1) {
PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
} else {
@@ -945,12 +981,12 @@ PHP_METHOD(PDO, exec)
PHP_METHOD(PDO, lastInsertId)
{
pdo_dbh_t *dbh = Z_PDO_DBH_P(ZEND_THIS);
- char *name = NULL;
- size_t namelen;
+ zend_string *name = NULL;
+ zend_string *last_id = NULL;
ZEND_PARSE_PARAMETERS_START(0, 1)
Z_PARAM_OPTIONAL
- Z_PARAM_STRING_OR_NULL(name, namelen)
+ Z_PARAM_STR_OR_NULL(name)
ZEND_PARSE_PARAMETERS_END();
PDO_CONSTRUCT_CHECK;
@@ -960,19 +996,13 @@ PHP_METHOD(PDO, lastInsertId)
if (!dbh->methods->last_id) {
pdo_raise_impl_error(dbh, NULL, "IM001", "driver does not support lastInsertId()");
RETURN_FALSE;
- } else {
- size_t id_len;
- char *id;
- id = dbh->methods->last_id(dbh, name, &id_len);
- if (!id) {
- PDO_HANDLE_DBH_ERR();
- RETURN_FALSE;
- } else {
- //??? use zend_string ?
- RETVAL_STRINGL(id, id_len);
- efree(id);
- }
}
+ last_id = dbh->methods->last_id(dbh, name);
+ if (!last_id) {
+ PDO_HANDLE_DBH_ERR();
+ RETURN_FALSE;
+ }
+ RETURN_STR(last_id);
}
/* }}} */
@@ -1051,23 +1081,22 @@ fill_array:
PHP_METHOD(PDO, query)
{
pdo_stmt_t *stmt;
- char *statement;
- size_t statement_len;
+ zend_string *statement;
zend_long fetch_mode;
- zend_bool fetch_mode_is_null = 1;
+ bool fetch_mode_is_null = 1;
zval *args = NULL;
uint32_t num_args = 0;
pdo_dbh_object_t *dbh_obj = Z_PDO_OBJECT_P(ZEND_THIS);
pdo_dbh_t *dbh = dbh_obj->inner;
- if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "s|l!*", &statement, &statement_len,
+ if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "S|l!*", &statement,
&fetch_mode, &fetch_mode_is_null, &args, &num_args)) {
RETURN_THROWS();
}
PDO_CONSTRUCT_CHECK;
- if (statement_len == 0) {
+ if (ZSTR_LEN(statement) == 0) {
zend_argument_value_error(1, "cannot be empty");
RETURN_THROWS();
}
@@ -1080,25 +1109,22 @@ PHP_METHOD(PDO, query)
stmt = Z_PDO_STMT_P(return_value);
/* unconditionally keep this for later reference */
- stmt->query_string = estrndup(statement, statement_len);
- stmt->query_stringlen = statement_len;
-
+ stmt->query_string = zend_string_copy(statement);
+ stmt->active_query_string = zend_string_copy(stmt->query_string);
stmt->default_fetch_type = dbh->default_fetch_type;
- stmt->active_query_string = stmt->query_string;
- stmt->active_query_stringlen = statement_len;
stmt->dbh = dbh;
/* give it a reference to me */
ZVAL_OBJ_COPY(&stmt->database_object_handle, &dbh_obj->std);
/* we haven't created a lazy object yet */
ZVAL_UNDEF(&stmt->lazy_object_ref);
- if (dbh->methods->preparer(dbh, statement, statement_len, stmt, NULL)) {
+ if (dbh->methods->preparer(dbh, statement, stmt, NULL)) {
PDO_STMT_CLEAR_ERR();
if (fetch_mode_is_null || pdo_stmt_setup_fetch_mode(stmt, fetch_mode, 2, args, num_args)) {
/* now execute the statement */
PDO_STMT_CLEAR_ERR();
if (stmt->methods->executer(stmt)) {
- int ret = 1;
+ bool ret = true;
if (!stmt->executed) {
if (stmt->dbh->alloc_own_columns) {
ret = pdo_stmt_describe_columns(stmt);
@@ -1126,18 +1152,17 @@ PHP_METHOD(PDO, query)
}
/* }}} */
-/* {{{ quotes string for use in a query. The optional paramtype acts as a hint for drivers that have alternate quoting styles. The default value is PDO_PARAM_STR */
+/* {{{ quotes string for use in a query.
+ * The optional paramtype acts as a hint for drivers that have alternate quoting styles.
+ * The default value is PDO_PARAM_STR */
PHP_METHOD(PDO, quote)
{
pdo_dbh_t *dbh = Z_PDO_DBH_P(ZEND_THIS);
- char *str;
- size_t str_len;
+ zend_string *str;
zend_long paramtype = PDO_PARAM_STR;
- char *qstr;
- size_t qlen;
ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_STRING(str, str_len)
+ Z_PARAM_STR(str)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(paramtype)
ZEND_PARSE_PARAMETERS_END();
@@ -1150,13 +1175,7 @@ PHP_METHOD(PDO, quote)
RETURN_FALSE;
}
- if (dbh->methods->quoter(dbh, str, str_len, &qstr, &qlen, paramtype)) {
- RETVAL_STRINGL(qstr, qlen);
- efree(qstr);
- return;
- }
- PDO_HANDLE_DBH_ERR();
- RETURN_FALSE;
+ RETURN_STR(dbh->methods->quoter(dbh, str, paramtype));
}
/* }}} */
@@ -1194,7 +1213,7 @@ static void cls_method_pdtor(zval *el) /* {{{ */ {
/* }}} */
/* {{{ overloaded object handlers for PDO class */
-int pdo_hash_methods(pdo_dbh_object_t *dbh_obj, int kind)
+bool pdo_hash_methods(pdo_dbh_object_t *dbh_obj, int kind)
{
const zend_function_entry *funcs;
zend_internal_function func;
@@ -1203,11 +1222,11 @@ int pdo_hash_methods(pdo_dbh_object_t *dbh_obj, int kind)
pdo_dbh_t *dbh = dbh_obj->inner;
if (!dbh || !dbh->methods || !dbh->methods->get_driver_methods) {
- return 0;
+ return false;
}
funcs = dbh->methods->get_driver_methods(dbh, kind);
if (!funcs) {
- return 0;
+ return false;
}
dbh->cls_methods[kind] = pemalloc(sizeof(HashTable), dbh->is_persistent);
@@ -1259,7 +1278,7 @@ int pdo_hash_methods(pdo_dbh_object_t *dbh_obj, int kind)
funcs++;
}
- return 1;
+ return true;
}
static zend_function *dbh_method_get(zend_object **object, zend_string *method_name, const zval *key)
@@ -1288,16 +1307,15 @@ out:
return fbc;
}
-static int dbh_compare(zval *object1, zval *object2)
-{
- return ZEND_UNCOMPARABLE;
-}
-
static HashTable *dbh_get_gc(zend_object *object, zval **gc_data, int *gc_count)
{
pdo_dbh_t *dbh = php_pdo_dbh_fetch_inner(object);
- *gc_data = &dbh->def_stmt_ctor_args;
- *gc_count = 1;
+ zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create();
+ zend_get_gc_buffer_add_zval(gc_buffer, &dbh->def_stmt_ctor_args);
+ if (dbh->methods && dbh->methods->get_gc) {
+ dbh->methods->get_gc(dbh, gc_buffer);
+ }
+ zend_get_gc_buffer_use(gc_buffer, gc_data, gc_count);
return zend_std_get_properties(object);
}
@@ -1306,10 +1324,7 @@ static void pdo_dbh_free_storage(zend_object *std);
void pdo_dbh_init(void)
{
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY(ce, "PDO", class_PDO_methods);
- pdo_dbh_ce = zend_register_internal_class(&ce);
+ pdo_dbh_ce = register_class_PDO();
pdo_dbh_ce->create_object = pdo_dbh_new;
pdo_dbh_ce->serialize = zend_class_serialize_deny;
pdo_dbh_ce->unserialize = zend_class_unserialize_deny;
@@ -1320,7 +1335,7 @@ void pdo_dbh_init(void)
pdo_dbh_object_handlers.free_obj = pdo_dbh_free_storage;
pdo_dbh_object_handlers.clone_obj = NULL;
pdo_dbh_object_handlers.get_method = dbh_method_get;
- pdo_dbh_object_handlers.compare = dbh_compare;
+ pdo_dbh_object_handlers.compare = zend_objects_not_comparable;
pdo_dbh_object_handlers.get_gc = dbh_get_gc;
REGISTER_PDO_CLASS_CONST_LONG("PARAM_BOOL", (zend_long)PDO_PARAM_BOOL);
@@ -1409,7 +1424,7 @@ void pdo_dbh_init(void)
REGISTER_PDO_CLASS_CONST_LONG("CURSOR_SCROLL", (zend_long)PDO_CURSOR_SCROLL);
}
-static void dbh_free(pdo_dbh_t *dbh, zend_bool free_persistent)
+static void dbh_free(pdo_dbh_t *dbh, bool free_persistent)
{
int i;
@@ -1464,7 +1479,7 @@ static void pdo_dbh_free_storage(zend_object *std)
pdo_dbh_t *dbh = php_pdo_dbh_fetch_inner(std);
if (dbh->in_txn && dbh->methods && dbh->methods->rollback) {
dbh->methods->rollback(dbh);
- dbh->in_txn = 0;
+ dbh->in_txn = false;
}
if (dbh->is_persistent && dbh->methods && dbh->methods->persistent_shutdown) {
diff --git a/ext/pdo/pdo_dbh.stub.php b/ext/pdo/pdo_dbh.stub.php
index adca7d6b7a..d25408db7e 100644
--- a/ext/pdo/pdo_dbh.stub.php
+++ b/ext/pdo/pdo_dbh.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class PDO
{
diff --git a/ext/pdo/pdo_dbh_arginfo.h b/ext/pdo/pdo_dbh_arginfo.h
index ac2fc76350..a78807d688 100644
--- a/ext/pdo/pdo_dbh_arginfo.h
+++ b/ext/pdo/pdo_dbh_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 788d1cd616c140df4072c6e0564c2995fbdc84ad */
+ * Stub hash: 779192c91fd281db6d2dc04143dd8656148ed789 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_PDO___construct, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, dsn, IS_STRING, 0)
@@ -92,3 +92,13 @@ static const zend_function_entry class_PDO_methods[] = {
ZEND_ME(PDO, setAttribute, arginfo_class_PDO_setAttribute, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_PDO(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "PDO", class_PDO_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re
index 04a4118fc4..6716401187 100644
--- a/ext/pdo/pdo_sql_parser.re
+++ b/ext/pdo/pdo_sql_parser.re
@@ -70,22 +70,18 @@ static int scan(Scanner *s)
struct placeholder {
const char *pos;
size_t len;
- size_t qlen; /* quoted length of value */
- char *quoted; /* quoted value */
- int freeq;
+ zend_string *quoted; /* quoted value */
int bindno;
struct placeholder *next;
};
static void free_param_name(zval *el) {
- efree(Z_PTR_P(el));
+ zend_string_release(Z_PTR_P(el));
}
-PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inquery_len,
- char **outquery, size_t *outquery_len)
+PDO_API int pdo_parse_params(pdo_stmt_t *stmt, zend_string *inquery, zend_string **outquery)
{
Scanner s;
- const char *ptr;
char *newbuffer;
ptrdiff_t t;
uint32_t bindno = 0;
@@ -96,9 +92,8 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inque
int query_type = PDO_PLACEHOLDER_NONE;
struct placeholder *placeholders = NULL, *placetail = NULL, *plc = NULL;
- ptr = *outquery;
- s.cur = inquery;
- s.end = inquery + inquery_len + 1;
+ s.cur = ZSTR_VAL(inquery);
+ s.end = s.cur + ZSTR_LEN(inquery) + 1;
/* phase 1: look for args */
while((t = scan(&s)) != PDO_PARSER_EOI) {
@@ -110,7 +105,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inque
if (t == PDO_PARSER_BIND) {
ptrdiff_t len = s.cur - s.tok;
- if ((inquery < (s.cur - len)) && isalnum(*(s.cur - len - 1))) {
+ if ((ZSTR_VAL(inquery) < (s.cur - len)) && isalnum(*(s.cur - len - 1))) {
continue;
}
query_type |= PDO_PLACEHOLDER_NAMED;
@@ -126,9 +121,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inque
if (t == PDO_PARSER_ESCAPED_QUESTION) {
plc->bindno = PDO_PARSER_BINDNO_ESCAPED_CHAR;
- plc->quoted = "?";
- plc->qlen = 1;
- plc->freeq = 0;
+ plc->quoted = ZSTR_CHAR('?');
escapes++;
} else {
plc->bindno = bindno++;
@@ -179,7 +172,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inque
if (stmt->supports_placeholders == query_type && !stmt->named_rewrite_template) {
/* query matches native syntax */
if (escapes) {
- newbuffer_len = inquery_len;
+ newbuffer_len = ZSTR_LEN(inquery);
goto rewrite;
}
@@ -201,7 +194,7 @@ safe:
if (stmt->supports_placeholders == PDO_PLACEHOLDER_NONE) {
/* query generation */
- newbuffer_len = inquery_len;
+ newbuffer_len = ZSTR_LEN(inquery);
/* let's quote all the values */
for (plc = placeholders; plc && params; plc = plc->next) {
@@ -243,16 +236,9 @@ safe:
if (!buf) {
buf = ZSTR_EMPTY_ALLOC();
}
- if (!stmt->dbh->methods->quoter(stmt->dbh, ZSTR_VAL(buf), ZSTR_LEN(buf), &plc->quoted, &plc->qlen,
- param->param_type)) {
- /* bork */
- ret = -1;
- strncpy(stmt->error_code, stmt->dbh->error_code, 6);
- if (buf) {
- zend_string_release_ex(buf, 0);
- }
- goto clean_up;
- }
+
+ plc->quoted = stmt->dbh->methods->quoter(stmt->dbh, buf, param->param_type);
+
if (buf) {
zend_string_release_ex(buf, 0);
}
@@ -261,7 +247,6 @@ safe:
ret = -1;
goto clean_up;
}
- plc->freeq = 1;
} else {
enum pdo_param_type param_type = param->param_type;
zend_string *buf = NULL;
@@ -273,40 +258,29 @@ safe:
switch (param_type) {
case PDO_PARAM_BOOL:
- plc->quoted = zend_is_true(parameter) ? "1" : "0";
- plc->qlen = sizeof("1")-1;
- plc->freeq = 0;
+ plc->quoted = zend_is_true(parameter) ? ZSTR_CHAR('1') : ZSTR_CHAR('0');
break;
case PDO_PARAM_INT:
- buf = zend_long_to_str(zval_get_long(parameter));
-
- plc->qlen = ZSTR_LEN(buf);
- plc->quoted = estrdup(ZSTR_VAL(buf));
- plc->freeq = 1;
+ plc->quoted = zend_long_to_str(zval_get_long(parameter));
break;
case PDO_PARAM_NULL:
- plc->quoted = "NULL";
- plc->qlen = sizeof("NULL")-1;
- plc->freeq = 0;
+ plc->quoted = ZSTR_KNOWN(ZEND_STR_NULL);
break;
- default:
- buf = zval_get_string(parameter);
- if (EG(exception) ||
- !stmt->dbh->methods->quoter(stmt->dbh, ZSTR_VAL(buf),
- ZSTR_LEN(buf), &plc->quoted, &plc->qlen,
- param_type)) {
+ default: {
+ buf = zval_try_get_string(parameter);
+ /* parameter does not have a string representation, buf == NULL */
+ if (EG(exception)) {
/* bork */
ret = -1;
strncpy(stmt->error_code, stmt->dbh->error_code, 6);
- if (buf) {
- zend_string_release_ex(buf, 0);
- }
goto clean_up;
}
- plc->freeq = 1;
+
+ plc->quoted = stmt->dbh->methods->quoter(stmt->dbh, buf, param_type);
+ }
}
if (buf) {
@@ -320,20 +294,19 @@ safe:
} else {
parameter = &param->parameter;
}
- plc->quoted = Z_STRVAL_P(parameter);
- plc->qlen = Z_STRLEN_P(parameter);
+ plc->quoted = zend_string_copy(Z_STR_P(parameter));
}
- newbuffer_len += plc->qlen;
+ newbuffer_len += ZSTR_LEN(plc->quoted);
}
rewrite:
/* allocate output buffer */
- newbuffer = emalloc(newbuffer_len + 1);
- *outquery = newbuffer;
+ *outquery = zend_string_alloc(newbuffer_len, 0);
+ newbuffer = ZSTR_VAL(*outquery);
/* and build the query */
+ const char *ptr = ZSTR_VAL(inquery);
plc = placeholders;
- ptr = inquery;
do {
t = plc->pos - ptr;
@@ -342,8 +315,8 @@ rewrite:
newbuffer += t;
}
if (plc->quoted) {
- memcpy(newbuffer, plc->quoted, plc->qlen);
- newbuffer += plc->qlen;
+ memcpy(newbuffer, ZSTR_VAL(plc->quoted), ZSTR_LEN(plc->quoted));
+ newbuffer += ZSTR_LEN(plc->quoted);
} else {
memcpy(newbuffer, plc->pos, plc->len);
newbuffer += plc->len;
@@ -353,24 +326,23 @@ rewrite:
plc = plc->next;
} while (plc);
- t = (inquery + inquery_len) - ptr;
+ t = ZSTR_VAL(inquery) + ZSTR_LEN(inquery) - ptr;
if (t) {
memcpy(newbuffer, ptr, t);
newbuffer += t;
}
*newbuffer = '\0';
- *outquery_len = newbuffer - *outquery;
+ ZSTR_LEN(*outquery) = newbuffer - ZSTR_VAL(*outquery);
ret = 1;
goto clean_up;
} else if (query_type == PDO_PLACEHOLDER_POSITIONAL) {
/* rewrite ? to :pdoX */
- char *name, *idxbuf;
const char *tmpl = stmt->named_rewrite_template ? stmt->named_rewrite_template : ":pdo%d";
int bind_no = 1;
- newbuffer_len = inquery_len;
+ newbuffer_len = ZSTR_LEN(inquery);
if (stmt->bound_param_map == NULL) {
ALLOC_HASHTABLE(stmt->bound_param_map);
@@ -379,36 +351,35 @@ rewrite:
for (plc = placeholders; plc; plc = plc->next) {
int skip_map = 0;
- char *p;
+ zend_string *p;
+ zend_string *idxbuf;
if (plc->bindno == PDO_PARSER_BINDNO_ESCAPED_CHAR) {
continue;
}
- name = estrndup(plc->pos, plc->len);
+ zend_string *name = zend_string_init(plc->pos, plc->len, 0);
/* check if bound parameter is already available */
- if (!strcmp(name, "?") || (p = zend_hash_str_find_ptr(stmt->bound_param_map, name, plc->len)) == NULL) {
- spprintf(&idxbuf, 0, tmpl, bind_no++);
+ if (zend_string_equals_literal(name, "?") || (p = zend_hash_find_ptr(stmt->bound_param_map, name)) == NULL) {
+ idxbuf = zend_strpprintf(0, tmpl, bind_no++);
} else {
- idxbuf = estrdup(p);
+ idxbuf = zend_string_copy(p);
skip_map = 1;
}
plc->quoted = idxbuf;
- plc->qlen = strlen(plc->quoted);
- plc->freeq = 1;
- newbuffer_len += plc->qlen;
+ newbuffer_len += ZSTR_LEN(plc->quoted);
if (!skip_map && stmt->named_rewrite_template) {
/* create a mapping */
- zend_hash_str_update_mem(stmt->bound_param_map, name, plc->len, idxbuf, plc->qlen + 1);
+ zend_hash_update_ptr(stmt->bound_param_map, name, zend_string_copy(plc->quoted));
}
/* map number to name */
- zend_hash_index_update_mem(stmt->bound_param_map, plc->bindno, idxbuf, plc->qlen + 1);
+ zend_hash_index_update_ptr(stmt->bound_param_map, plc->bindno, zend_string_copy(plc->quoted));
- efree(name);
+ zend_string_release(name);
}
goto rewrite;
@@ -416,7 +387,7 @@ rewrite:
} else {
/* rewrite :name to ? */
- newbuffer_len = inquery_len;
+ newbuffer_len = ZSTR_LEN(inquery);
if (stmt->bound_param_map == NULL) {
ALLOC_HASHTABLE(stmt->bound_param_map);
@@ -424,12 +395,9 @@ rewrite:
}
for (plc = placeholders; plc; plc = plc->next) {
- char *name;
- name = estrndup(plc->pos, plc->len);
- zend_hash_index_update_mem(stmt->bound_param_map, plc->bindno, name, plc->len + 1);
- efree(name);
- plc->quoted = "?";
- plc->qlen = 1;
+ zend_string *name = zend_string_init(plc->pos, plc->len, 0);
+ zend_hash_index_update_ptr(stmt->bound_param_map, plc->bindno, name);
+ plc->quoted = ZSTR_CHAR('?');
newbuffer_len -= plc->len - 1;
}
@@ -441,11 +409,9 @@ clean_up:
while (placeholders) {
plc = placeholders;
placeholders = plc->next;
-
- if (plc->freeq) {
- efree(plc->quoted);
+ if (plc->quoted) {
+ zend_string_release_ex(plc->quoted, 0);
}
-
efree(plc);
}
diff --git a/ext/pdo/pdo_sqlstate.c b/ext/pdo/pdo_sqlstate.c
index 7df2f9c87a..00a5adeb6d 100644
--- a/ext/pdo/pdo_sqlstate.c
+++ b/ext/pdo/pdo_sqlstate.c
@@ -305,7 +305,7 @@ void pdo_sqlstate_fini_error_table(void)
zend_hash_destroy(&err_hash);
}
-int pdo_sqlstate_init_error_table(void)
+void pdo_sqlstate_init_error_table(void)
{
size_t i;
const struct pdo_sqlstate_info *info;
@@ -317,8 +317,6 @@ int pdo_sqlstate_init_error_table(void)
zend_hash_str_add_ptr(&err_hash, info->state, sizeof(info->state), (void *)info);
}
-
- return SUCCESS;
}
const char *pdo_sqlstate_state_to_description(char *state)
diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c
index 80b50605b9..cadfd664b8 100644
--- a/ext/pdo/pdo_stmt.c
+++ b/ext/pdo/pdo_stmt.c
@@ -50,7 +50,7 @@ static inline bool rewrite_name_to_position(pdo_stmt_t *stmt, struct pdo_bound_p
* we will raise an error, as we can't be sure that it is safe
* to bind multiple parameters onto the same zval in the underlying
* driver */
- char *name;
+ zend_string *name;
int position = 0;
if (stmt->named_rewrite_template) {
@@ -60,7 +60,7 @@ static inline bool rewrite_name_to_position(pdo_stmt_t *stmt, struct pdo_bound_p
if (!param->name) {
/* do the reverse; map the parameter number to the name */
if ((name = zend_hash_index_find_ptr(stmt->bound_param_map, param->paramno)) != NULL) {
- param->name = zend_string_init(name, strlen(name), 0);
+ param->name = zend_string_copy(name);
return 1;
}
/* TODO Error? */
@@ -69,7 +69,7 @@ static inline bool rewrite_name_to_position(pdo_stmt_t *stmt, struct pdo_bound_p
}
ZEND_HASH_FOREACH_PTR(stmt->bound_param_map, name) {
- if (strncmp(name, ZSTR_VAL(param->name), ZSTR_LEN(param->name) + 1)) {
+ if (!zend_string_equals(name, param->name)) {
position++;
continue;
}
@@ -125,7 +125,7 @@ iterate:
}
/* }}} */
-int pdo_stmt_describe_columns(pdo_stmt_t *stmt) /* {{{ */
+bool pdo_stmt_describe_columns(pdo_stmt_t *stmt) /* {{{ */
{
int col;
@@ -133,7 +133,7 @@ int pdo_stmt_describe_columns(pdo_stmt_t *stmt) /* {{{ */
for (col = 0; col < stmt->column_count; col++) {
if (!stmt->methods->describer(stmt, col)) {
- return 0;
+ return false;
}
/* if we are applying case conversions on column names, do so now */
@@ -168,7 +168,7 @@ int pdo_stmt_describe_columns(pdo_stmt_t *stmt) /* {{{ */
}
}
- return 1;
+ return true;
}
/* }}} */
@@ -297,8 +297,7 @@ static bool really_register_bound_param(struct pdo_bound_param_data *param, pdo_
int i;
for (i = 0; i < stmt->column_count; i++) {
- if (ZSTR_LEN(stmt->columns[i].name) == ZSTR_LEN(param->name) &&
- strncmp(ZSTR_VAL(stmt->columns[i].name), ZSTR_VAL(param->name), ZSTR_LEN(param->name) + 1) == 0) {
+ if (zend_string_equals(stmt->columns[i].name, param->name)) {
param->paramno = i;
break;
}
@@ -442,18 +441,16 @@ PHP_METHOD(PDOStatement, execute)
*/
/* string is leftover from previous calls so PDOStatement::debugDumpParams() can access */
- if (stmt->active_query_string && stmt->active_query_string != stmt->query_string) {
- efree(stmt->active_query_string);
+ if (stmt->active_query_string) {
+ zend_string_release(stmt->active_query_string);
+ stmt->active_query_string = NULL;
}
- stmt->active_query_string = NULL;
- ret = pdo_parse_params(stmt, stmt->query_string, stmt->query_stringlen,
- &stmt->active_query_string, &stmt->active_query_stringlen);
+ ret = pdo_parse_params(stmt, stmt->query_string, &stmt->active_query_string);
if (ret == 0) {
/* no changes were made */
- stmt->active_query_string = stmt->query_string;
- stmt->active_query_stringlen = stmt->query_stringlen;
+ stmt->active_query_string = zend_string_copy(stmt->query_string);
ret = 1;
} else if (ret == -1) {
/* something broke */
@@ -488,14 +485,8 @@ PHP_METHOD(PDOStatement, execute)
}
/* }}} */
-static inline void fetch_value(pdo_stmt_t *stmt, zval *dest, int colno, int *type_override) /* {{{ */
+static inline void fetch_value(pdo_stmt_t *stmt, zval *dest, int colno, enum pdo_param_type *type_override) /* {{{ */
{
- struct pdo_column_data *col;
- char *value = NULL;
- size_t value_len = 0;
- int caller_frees = 0;
- int type, new_type;
-
if (colno < 0) {
zend_value_error("Column index must be greater than or equal to 0");
ZVAL_NULL(dest);
@@ -508,122 +499,62 @@ static inline void fetch_value(pdo_stmt_t *stmt, zval *dest, int colno, int *typ
return;
}
- col = &stmt->columns[colno];
- type = PDO_PARAM_TYPE(col->param_type);
- new_type = type_override ? (int)PDO_PARAM_TYPE(*type_override) : type;
-
- value = NULL;
- value_len = 0;
-
- stmt->methods->get_col(stmt, colno, &value, &value_len, &caller_frees);
+ ZVAL_NULL(dest);
+ stmt->methods->get_col(stmt, colno, dest, type_override);
- switch (type) {
- case PDO_PARAM_ZVAL:
- if (value && value_len == sizeof(zval)) {
- ZVAL_COPY_VALUE(dest, (zval *)value);
- } else {
- ZVAL_NULL(dest);
- }
+ if (Z_TYPE_P(dest) == IS_STRING && Z_STRLEN_P(dest) == 0
+ && stmt->dbh->oracle_nulls == PDO_NULL_EMPTY_STRING) {
+ zval_ptr_dtor_str(dest);
+ ZVAL_NULL(dest);
+ }
- if (Z_TYPE_P(dest) == IS_NULL) {
- type = new_type;
- }
- break;
+ /* If stringification is requested, override with PDO_PARAM_STR. */
+ enum pdo_param_type pdo_param_str = PDO_PARAM_STR;
+ if (stmt->dbh->stringify) {
+ type_override = &pdo_param_str;
+ }
- case PDO_PARAM_INT:
- if (value && value_len == sizeof(zend_long)) {
- ZVAL_LONG(dest, *(zend_long*)value);
+ if (type_override && Z_TYPE_P(dest) != IS_NULL) {
+ switch (*type_override) {
+ case PDO_PARAM_INT:
+ convert_to_long(dest);
break;
- }
- ZVAL_NULL(dest);
- break;
-
- case PDO_PARAM_BOOL:
- if (value && value_len == sizeof(zend_bool)) {
- ZVAL_BOOL(dest, *(zend_bool*)value);
+ case PDO_PARAM_BOOL:
+ convert_to_boolean(dest);
break;
- }
- ZVAL_NULL(dest);
- break;
-
- case PDO_PARAM_LOB:
- if (value == NULL) {
- ZVAL_NULL(dest);
- } else if (value_len == 0) {
- /* Warning, empty strings need to be passed as stream */
- if (stmt->dbh->stringify || new_type == PDO_PARAM_STR) {
- zend_string *buf;
- buf = php_stream_copy_to_mem((php_stream*)value, PHP_STREAM_COPY_ALL, 0);
- if (buf == NULL) {
+ case PDO_PARAM_STR:
+ if (Z_TYPE_P(dest) == IS_FALSE) {
+ /* Return "0" rather than "", because this is what database drivers that
+ * don't have a dedicated boolean type would return. */
+ zval_ptr_dtor_nogc(dest);
+ ZVAL_INTERNED_STR(dest, ZSTR_CHAR('0'));
+ } else if (Z_TYPE_P(dest) == IS_RESOURCE) {
+ /* Convert LOB stream to string */
+ php_stream *stream;
+ php_stream_from_zval_no_verify(stream, dest);
+ zend_string *str = php_stream_copy_to_mem(stream, PHP_STREAM_COPY_ALL, 0);
+ zval_ptr_dtor_nogc(dest);
+ if (str == NULL) {
ZVAL_EMPTY_STRING(dest);
} else {
- ZVAL_STR(dest, buf);
+ ZVAL_STR(dest, str);
}
- php_stream_close((php_stream*)value);
} else {
- php_stream_to_zval((php_stream*)value, dest);
+ convert_to_string(dest);
}
- } else if (!stmt->dbh->stringify && new_type != PDO_PARAM_STR) {
- /* they gave us a string, but LOBs are represented as streams in PDO */
- php_stream *stm;
-#ifdef TEMP_STREAM_TAKE_BUFFER
- if (caller_frees) {
- stm = php_stream_memory_open(TEMP_STREAM_TAKE_BUFFER, value, value_len);
- if (stm) {
- caller_frees = 0;
- }
- } else
-#endif
- {
- stm = php_stream_memory_open(TEMP_STREAM_READONLY, value, value_len);
- }
- if (stm) {
- php_stream_to_zval(stm, dest);
- } else {
- ZVAL_NULL(dest);
- }
- } else {
- ZVAL_STRINGL(dest, value, value_len);
- }
- break;
-
- case PDO_PARAM_STR:
- if (value && !(value_len == 0 && stmt->dbh->oracle_nulls == PDO_NULL_EMPTY_STRING)) {
- ZVAL_STRINGL(dest, value, value_len);
- break;
- }
- default:
- ZVAL_NULL(dest);
- }
-
- if (type != new_type) {
- switch (new_type) {
- case PDO_PARAM_INT:
- convert_to_long_ex(dest);
- break;
- case PDO_PARAM_BOOL:
- convert_to_boolean_ex(dest);
- break;
- case PDO_PARAM_STR:
- convert_to_string_ex(dest);
break;
case PDO_PARAM_NULL:
- convert_to_null_ex(dest);
+ convert_to_null(dest);
+ break;
+ case PDO_PARAM_LOB:
+ if (Z_TYPE_P(dest) == IS_STRING) {
+ php_stream *stream =
+ php_stream_memory_open(TEMP_STREAM_READONLY, Z_STR_P(dest));
+ zval_ptr_dtor_str(dest);
+ php_stream_to_zval(stream, dest);
+ }
break;
default:
- ;
- }
- }
-
- if (caller_frees && value) {
- efree(value);
- }
-
- if (stmt->dbh->stringify) {
- switch (Z_TYPE_P(dest)) {
- case IS_LONG:
- case IS_DOUBLE:
- convert_to_string(dest);
break;
}
}
@@ -671,7 +602,7 @@ static bool do_fetch_common(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori, ze
zval_ptr_dtor(Z_REFVAL(param->parameter));
/* set new value */
- fetch_value(stmt, Z_REFVAL(param->parameter), param->paramno, (int *)&param->param_type);
+ fetch_value(stmt, Z_REFVAL(param->parameter), param->paramno, &param->param_type);
/* TODO: some smart thing that avoids duplicating the value in the
* general loop below. For now, if you're binding output columns,
@@ -1759,10 +1690,6 @@ PHP_METHOD(PDOStatement, getColumnMeta)
add_assoc_str(return_value, "name", zend_string_copy(col->name));
add_assoc_long(return_value, "len", col->maxlen); /* FIXME: unsigned ? */
add_assoc_long(return_value, "precision", col->precision);
- if (col->param_type != PDO_PARAM_ZVAL) {
- /* if param_type is PDO_PARAM_ZVAL the driver has to provide correct data */
- add_assoc_long(return_value, "pdo_type", col->param_type);
- }
}
/* }}} */
@@ -2034,16 +1961,16 @@ PHP_METHOD(PDOStatement, debugDumpParams)
}
/* break into multiple operations so query string won't be truncated at FORMAT_CONV_MAX_PRECISION */
- php_stream_printf(out, "SQL: [%zd] ", stmt->query_stringlen);
- php_stream_write(out, stmt->query_string, stmt->query_stringlen);
+ php_stream_printf(out, "SQL: [%zd] ", ZSTR_LEN(stmt->query_string));
+ php_stream_write(out, ZSTR_VAL(stmt->query_string), ZSTR_LEN(stmt->query_string));
php_stream_write(out, "\n", 1);
/* show parsed SQL if emulated prepares enabled */
/* pointers will be equal if PDO::query() was invoked */
if (stmt->active_query_string != NULL && stmt->active_query_string != stmt->query_string) {
/* break into multiple operations so query string won't be truncated at FORMAT_CONV_MAX_PRECISION */
- php_stream_printf(out, "Sent SQL: [%zd] ", stmt->active_query_stringlen);
- php_stream_write(out, stmt->active_query_string, stmt->active_query_stringlen);
+ php_stream_printf(out, "Sent SQL: [%zd] ", ZSTR_LEN(stmt->active_query_string));
+ php_stream_write(out, ZSTR_VAL(stmt->active_query_string), ZSTR_LEN(stmt->active_query_string));
php_stream_write(out, "\n", 1);
}
@@ -2090,7 +2017,7 @@ PHP_METHOD(PDOStatement, getIterator)
/* {{{ overloaded handlers for PDOStatement class */
static zval *dbstmt_prop_write(zend_object *object, zend_string *name, zval *value, void **cache_slot)
{
- if (strcmp(ZSTR_VAL(name), "queryString") == 0) {
+ if (zend_string_equals_literal(name, "queryString")) {
zend_throw_error(NULL, "Property queryString is read only");
return value;
} else {
@@ -2100,7 +2027,7 @@ static zval *dbstmt_prop_write(zend_object *object, zend_string *name, zval *val
static void dbstmt_prop_delete(zend_object *object, zend_string *name, void **cache_slot)
{
- if (strcmp(ZSTR_VAL(name), "queryString") == 0) {
+ if (zend_string_equals_literal(name, "queryString")) {
zend_throw_error(NULL, "Property queryString is read only");
} else {
zend_std_unset_property(object, name, cache_slot);
@@ -2145,11 +2072,6 @@ out:
return fbc;
}
-static int dbstmt_compare(zval *object1, zval *object2)
-{
- return ZEND_UNCOMPARABLE;
-}
-
zend_object_handlers pdo_dbstmt_object_handlers;
zend_object_handlers pdo_row_object_handlers;
@@ -2174,11 +2096,11 @@ PDO_API void php_pdo_free_statement(pdo_stmt_t *stmt)
if (stmt->methods && stmt->methods->dtor) {
stmt->methods->dtor(stmt);
}
- if (stmt->active_query_string && stmt->active_query_string != stmt->query_string) {
- efree(stmt->active_query_string);
+ if (stmt->active_query_string) {
+ zend_string_release(stmt->active_query_string);
}
if (stmt->query_string) {
- efree(stmt->query_string);
+ zend_string_release(stmt->query_string);
}
pdo_stmt_reset_columns(stmt);
@@ -2337,26 +2259,22 @@ static zval *row_prop_read(zend_object *object, zend_string *name, int type, voi
pdo_stmt_t *stmt = row->stmt;
int colno = -1;
zend_long lval;
+ ZEND_ASSERT(stmt);
ZVAL_NULL(rv);
- if (stmt) {
- if (is_numeric_string(ZSTR_VAL(name), ZSTR_LEN(name), &lval, NULL, 0) == IS_LONG) {
- if (lval >= 0 && lval < stmt->column_count) {
- fetch_value(stmt, rv, lval, NULL);
- }
- } else {
- /* TODO: replace this with a hash of available column names to column
- * numbers */
- for (colno = 0; colno < stmt->column_count; colno++) {
- if (ZSTR_LEN(stmt->columns[colno].name) == ZSTR_LEN(name) &&
- strncmp(ZSTR_VAL(stmt->columns[colno].name), ZSTR_VAL(name), ZSTR_LEN(name)) == 0) {
- fetch_value(stmt, rv, colno, NULL);
- return rv;
- }
- }
- if (strcmp(ZSTR_VAL(name), "queryString") == 0) {
- //zval_ptr_dtor(rv);
- return zend_std_read_property(&stmt->std, name, type, cache_slot, rv);
+ if (zend_string_equals_literal(name, "queryString")) {
+ return zend_std_read_property(&stmt->std, name, type, cache_slot, rv);
+ } else if (is_numeric_string(ZSTR_VAL(name), ZSTR_LEN(name), &lval, NULL, 0) == IS_LONG) {
+ if (lval >= 0 && lval < stmt->column_count) {
+ fetch_value(stmt, rv, lval, NULL);
+ }
+ } else {
+ /* TODO: replace this with a hash of available column names to column
+ * numbers */
+ for (colno = 0; colno < stmt->column_count; colno++) {
+ if (zend_string_equals(stmt->columns[colno].name, name)) {
+ fetch_value(stmt, rv, colno, NULL);
+ return rv;
}
}
}
@@ -2370,35 +2288,33 @@ static zval *row_dim_read(zend_object *object, zval *member, int type, zval *rv)
pdo_stmt_t *stmt = row->stmt;
int colno = -1;
zend_long lval;
+ ZEND_ASSERT(stmt);
ZVAL_NULL(rv);
- if (stmt) {
- if (Z_TYPE_P(member) == IS_LONG) {
- if (Z_LVAL_P(member) >= 0 && Z_LVAL_P(member) < stmt->column_count) {
- fetch_value(stmt, rv, Z_LVAL_P(member), NULL);
- }
- } else if (Z_TYPE_P(member) == IS_STRING
- && is_numeric_string(Z_STRVAL_P(member), Z_STRLEN_P(member), &lval, NULL, 0) == IS_LONG) {
- if (lval >= 0 && lval < stmt->column_count) {
- fetch_value(stmt, rv, lval, NULL);
- }
- } else {
- if (!try_convert_to_string(member)) {
- return &EG(uninitialized_zval);
- }
+ if (Z_TYPE_P(member) == IS_LONG) {
+ if (Z_LVAL_P(member) >= 0 && Z_LVAL_P(member) < stmt->column_count) {
+ fetch_value(stmt, rv, Z_LVAL_P(member), NULL);
+ }
+ } else if (Z_TYPE_P(member) == IS_STRING
+ && is_numeric_string(Z_STRVAL_P(member), Z_STRLEN_P(member), &lval, NULL, 0) == IS_LONG) {
+ if (lval >= 0 && lval < stmt->column_count) {
+ fetch_value(stmt, rv, lval, NULL);
+ }
+ } else {
+ if (!try_convert_to_string(member)) {
+ return &EG(uninitialized_zval);
+ }
- /* TODO: replace this with a hash of available column names to column
- * numbers */
- for (colno = 0; colno < stmt->column_count; colno++) {
- if (ZSTR_LEN(stmt->columns[colno].name) == Z_STRLEN_P(member) &&
- strncmp(ZSTR_VAL(stmt->columns[colno].name), Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0) {
- fetch_value(stmt, rv, colno, NULL);
- return rv;
- }
- }
- if (strcmp(Z_STRVAL_P(member), "queryString") == 0) {
- //zval_ptr_dtor(rv);
- return zend_std_read_property(&stmt->std, Z_STR_P(member), type, NULL, rv);
+ if (zend_string_equals_literal(Z_STR_P(member), "queryString")) {
+ return zend_std_read_property(&stmt->std, Z_STR_P(member), type, NULL, rv);
+ }
+
+ /* TODO: replace this with a hash of available column names to column
+ * numbers */
+ for (colno = 0; colno < stmt->column_count; colno++) {
+ if (zend_string_equals(stmt->columns[colno].name, Z_STR_P(member))) {
+ fetch_value(stmt, rv, colno, NULL);
+ return rv;
}
}
}
@@ -2423,26 +2339,24 @@ static int row_prop_exists(zend_object *object, zend_string *name, int check_emp
pdo_stmt_t *stmt = row->stmt;
int colno = -1;
zend_long lval;
+ ZEND_ASSERT(stmt);
- if (stmt) {
- if (is_numeric_string(ZSTR_VAL(name), ZSTR_LEN(name), &lval, NULL, 0) == IS_LONG) {
- return lval >=0 && lval < stmt->column_count;
- }
+ if (is_numeric_string(ZSTR_VAL(name), ZSTR_LEN(name), &lval, NULL, 0) == IS_LONG) {
+ return lval >=0 && lval < stmt->column_count;
+ }
- /* TODO: replace this with a hash of available column names to column
- * numbers */
- for (colno = 0; colno < stmt->column_count; colno++) {
- if (ZSTR_LEN(stmt->columns[colno].name) == ZSTR_LEN(name) &&
- strncmp(ZSTR_VAL(stmt->columns[colno].name), ZSTR_VAL(name), ZSTR_LEN(name)) == 0) {
- int res;
- zval val;
+ /* TODO: replace this with a hash of available column names to column
+ * numbers */
+ for (colno = 0; colno < stmt->column_count; colno++) {
+ if (zend_string_equals(stmt->columns[colno].name, name)) {
+ int res;
+ zval val;
- fetch_value(stmt, &val, colno, NULL);
- res = check_empty ? i_zend_is_true(&val) : Z_TYPE(val) != IS_NULL;
- zval_ptr_dtor_nogc(&val);
+ fetch_value(stmt, &val, colno, NULL);
+ res = check_empty ? i_zend_is_true(&val) : Z_TYPE(val) != IS_NULL;
+ zval_ptr_dtor_nogc(&val);
- return res;
- }
+ return res;
}
}
@@ -2455,34 +2369,32 @@ static int row_dim_exists(zend_object *object, zval *member, int check_empty)
pdo_stmt_t *stmt = row->stmt;
int colno = -1;
zend_long lval;
+ ZEND_ASSERT(stmt);
- if (stmt) {
- if (Z_TYPE_P(member) == IS_LONG) {
- return Z_LVAL_P(member) >= 0 && Z_LVAL_P(member) < stmt->column_count;
- } else if (Z_TYPE_P(member) == IS_STRING) {
- if (is_numeric_string(Z_STRVAL_P(member), Z_STRLEN_P(member), &lval, NULL, 0) == IS_LONG) {
- return lval >=0 && lval < stmt->column_count;
- }
- } else {
- if (!try_convert_to_string(member)) {
- return 0;
- }
+ if (Z_TYPE_P(member) == IS_LONG) {
+ return Z_LVAL_P(member) >= 0 && Z_LVAL_P(member) < stmt->column_count;
+ } else if (Z_TYPE_P(member) == IS_STRING) {
+ if (is_numeric_string(Z_STRVAL_P(member), Z_STRLEN_P(member), &lval, NULL, 0) == IS_LONG) {
+ return lval >=0 && lval < stmt->column_count;
}
+ } else {
+ if (!try_convert_to_string(member)) {
+ return 0;
+ }
+ }
- /* TODO: replace this with a hash of available column names to column
- * numbers */
- for (colno = 0; colno < stmt->column_count; colno++) {
- if (ZSTR_LEN(stmt->columns[colno].name) == Z_STRLEN_P(member) &&
- strncmp(ZSTR_VAL(stmt->columns[colno].name), Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0) {
- int res;
- zval val;
+ /* TODO: replace this with a hash of available column names to column
+ * numbers */
+ for (colno = 0; colno < stmt->column_count; colno++) {
+ if (zend_string_equals(stmt->columns[colno].name, Z_STR_P(member))) {
+ int res;
+ zval val;
- fetch_value(stmt, &val, colno, NULL);
- res = check_empty ? i_zend_is_true(&val) : Z_TYPE(val) != IS_NULL;
- zval_ptr_dtor_nogc(&val);
+ fetch_value(stmt, &val, colno, NULL);
+ res = check_empty ? i_zend_is_true(&val) : Z_TYPE(val) != IS_NULL;
+ zval_ptr_dtor_nogc(&val);
- return res;
- }
+ return res;
}
}
@@ -2505,8 +2417,9 @@ static HashTable *row_get_properties_for(zend_object *object, zend_prop_purpose
pdo_stmt_t *stmt = row->stmt;
HashTable *props;
int i;
+ ZEND_ASSERT(stmt);
- if (purpose != ZEND_PROP_PURPOSE_DEBUG || stmt == NULL) {
+ if (purpose != ZEND_PROP_PURPOSE_DEBUG) {
return zend_std_get_properties_for(object, purpose);
}
@@ -2515,6 +2428,10 @@ static HashTable *row_get_properties_for(zend_object *object, zend_prop_purpose
}
props = zend_array_dup(stmt->std.properties);
for (i = 0; i < stmt->column_count; i++) {
+ if (zend_string_equals_literal(stmt->columns[i].name, "queryString")) {
+ continue;
+ }
+
zval val;
fetch_value(stmt, &val, i, NULL);
@@ -2553,11 +2470,6 @@ static zend_string *row_get_classname(const zend_object *object)
return zend_string_init("PDORow", sizeof("PDORow") - 1, 0);
}
-static int row_compare(zval *object1, zval *object2)
-{
- return ZEND_UNCOMPARABLE;
-}
-
void pdo_row_free_storage(zend_object *std)
{
pdo_row_t *row = (pdo_row_t *)std;
@@ -2578,16 +2490,11 @@ zend_object *pdo_row_new(zend_class_entry *ce)
void pdo_stmt_init(void)
{
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY(ce, "PDOStatement", class_PDOStatement_methods);
- pdo_dbstmt_ce = zend_register_internal_class(&ce);
+ pdo_dbstmt_ce = register_class_PDOStatement(zend_ce_aggregate);
pdo_dbstmt_ce->get_iterator = pdo_stmt_iter_get;
pdo_dbstmt_ce->create_object = pdo_dbstmt_new;
pdo_dbstmt_ce->serialize = zend_class_serialize_deny;
pdo_dbstmt_ce->unserialize = zend_class_unserialize_deny;
- zend_class_implements(pdo_dbstmt_ce, 1, zend_ce_aggregate);
- zend_declare_property_null(pdo_dbstmt_ce, "queryString", sizeof("queryString")-1, ZEND_ACC_PUBLIC);
memcpy(&pdo_dbstmt_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
pdo_dbstmt_object_handlers.offset = XtOffsetOf(pdo_stmt_t, std);
@@ -2596,12 +2503,10 @@ void pdo_stmt_init(void)
pdo_dbstmt_object_handlers.write_property = dbstmt_prop_write;
pdo_dbstmt_object_handlers.unset_property = dbstmt_prop_delete;
pdo_dbstmt_object_handlers.get_method = dbstmt_method_get;
- pdo_dbstmt_object_handlers.compare = dbstmt_compare;
+ pdo_dbstmt_object_handlers.compare = zend_objects_not_comparable;
pdo_dbstmt_object_handlers.clone_obj = NULL;
- INIT_CLASS_ENTRY(ce, "PDORow", class_PDORow_methods);
- pdo_row_ce = zend_register_internal_class(&ce);
- pdo_row_ce->ce_flags |= ZEND_ACC_FINAL; /* when removing this a lot of handlers need to be redone */
+ pdo_row_ce = register_class_PDORow();
pdo_row_ce->create_object = pdo_row_new;
pdo_row_ce->serialize = zend_class_serialize_deny;
pdo_row_ce->unserialize = zend_class_unserialize_deny;
@@ -2622,5 +2527,5 @@ void pdo_stmt_init(void)
pdo_row_object_handlers.get_method = row_method_get;
pdo_row_object_handlers.get_constructor = row_get_ctor;
pdo_row_object_handlers.get_class_name = row_get_classname;
- pdo_row_object_handlers.compare = row_compare;
+ pdo_row_object_handlers.compare = zend_objects_not_comparable;
}
diff --git a/ext/pdo/pdo_stmt.stub.php b/ext/pdo/pdo_stmt.stub.php
index ab3ab6a42f..18e79e56b9 100644
--- a/ext/pdo/pdo_stmt.stub.php
+++ b/ext/pdo/pdo_stmt.stub.php
@@ -1,9 +1,11 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class PDOStatement implements IteratorAggregate
{
+ public string $queryString;
+
/** @return bool */
public function bindColumn(string|int $column, mixed &$var, int $type = 0, int $maxLength = 0, mixed $driverOptions = null) {}
@@ -66,4 +68,5 @@ class PDOStatement implements IteratorAggregate
final class PDORow
{
+ public string $queryString;
}
diff --git a/ext/pdo/pdo_stmt_arginfo.h b/ext/pdo/pdo_stmt_arginfo.h
index 25858477eb..282938f52a 100644
--- a/ext/pdo/pdo_stmt_arginfo.h
+++ b/ext/pdo/pdo_stmt_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 9d890849a08b43cb35e2cd8468aeaabfc0a7f218 */
+ * Stub hash: 1b8043ec5e3e621819c85828daf9316136fef62e */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_PDOStatement_bindColumn, 0, 0, 2)
ZEND_ARG_TYPE_MASK(0, column, MAY_BE_STRING|MAY_BE_LONG, NULL)
@@ -134,3 +134,37 @@ static const zend_function_entry class_PDOStatement_methods[] = {
static const zend_function_entry class_PDORow_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_PDOStatement(zend_class_entry *class_entry_IteratorAggregate)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "PDOStatement", class_PDOStatement_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_IteratorAggregate);
+
+ zval property_queryString_default_value;
+ ZVAL_UNDEF(&property_queryString_default_value);
+ zend_string *property_queryString_name = zend_string_init("queryString", sizeof("queryString") - 1, 1);
+ zend_declare_typed_property(class_entry, property_queryString_name, &property_queryString_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_queryString_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_PDORow(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "PDORow", class_PDORow_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ zval property_queryString_default_value;
+ ZVAL_UNDEF(&property_queryString_default_value);
+ zend_string *property_queryString_name = zend_string_init("queryString", sizeof("queryString") - 1, 1);
+ zend_declare_typed_property(class_entry, property_queryString_name, &property_queryString_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_queryString_name);
+
+ return class_entry;
+}
diff --git a/ext/pdo/php_pdo_driver.h b/ext/pdo/php_pdo_driver.h
index 2ee8acdd56..c1a01b3400 100644
--- a/ext/pdo/php_pdo_driver.h
+++ b/ext/pdo/php_pdo_driver.h
@@ -26,14 +26,7 @@ typedef struct _pdo_stmt_t pdo_stmt_t;
typedef struct _pdo_row_t pdo_row_t;
struct pdo_bound_param_data;
-#ifdef PHP_WIN32
-typedef __int64 pdo_int64_t;
-typedef unsigned __int64 pdo_uint64_t;
-#else
-typedef long long int pdo_int64_t;
-typedef unsigned long long int pdo_uint64_t;
-#endif
-PDO_API char *php_pdo_int64_to_str(pdo_int64_t i64);
+PDO_API zend_string *php_pdo_int64_to_str(int64_t i64);
#ifndef TRUE
# define TRUE 1
@@ -46,32 +39,14 @@ PDO_API char *php_pdo_int64_to_str(pdo_int64_t i64);
enum pdo_param_type {
PDO_PARAM_NULL,
-
- /* int as in long (the php native int type).
- * If you mark a column as an int, PDO expects get_col to return
- * a pointer to a long */
+ PDO_PARAM_BOOL,
PDO_PARAM_INT,
-
- /* get_col ptr should point to start of the string buffer */
PDO_PARAM_STR,
-
- /* get_col: when len is 0 ptr should point to a php_stream *,
- * otherwise it should behave like a string. Indicate a NULL field
- * value by setting the ptr to NULL */
PDO_PARAM_LOB,
- /* get_col: will expect the ptr to point to a new PDOStatement object handle,
- * but this isn't wired up yet */
+ /* get_col: Not supported (yet?) */
PDO_PARAM_STMT, /* hierarchical result set */
- /* get_col ptr should point to a zend_bool */
- PDO_PARAM_BOOL,
-
- /* get_col ptr should point to a zval*
- and the driver is responsible for adding correct type information to get_column_meta()
- */
- PDO_PARAM_ZVAL,
-
/* magic flag to denote a parameter as being input/output */
PDO_PARAM_INPUT_OUTPUT = 0x80000000,
@@ -244,48 +219,63 @@ typedef struct {
/* {{{ methods for a database handle */
/* close or otherwise disconnect the database */
-typedef int (*pdo_dbh_close_func)(pdo_dbh_t *dbh);
+typedef void (*pdo_dbh_close_func)(pdo_dbh_t *dbh);
-/* prepare a statement and stash driver specific portion into stmt */
-typedef int (*pdo_dbh_prepare_func)(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options);
+/* prepare a statement and stash driver specific portion into stmt
+ * return true on success, false otherwise */
+typedef bool (*pdo_dbh_prepare_func)(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options);
-/* execute a statement (that does not return a result set) */
-typedef zend_long (*pdo_dbh_do_func)(pdo_dbh_t *dbh, const char *sql, size_t sql_len);
+/* execute a statement (that does not return a result set)
+ * Return -1 on failure, otherwise the number of affected rows */
+typedef zend_long (*pdo_dbh_do_func)(pdo_dbh_t *dbh, const zend_string *sql);
/* quote a string */
-typedef int (*pdo_dbh_quote_func)(pdo_dbh_t *dbh, const char *unquoted, size_t unquotedlen, char **quoted, size_t *quotedlen, enum pdo_param_type paramtype);
+typedef zend_string* (*pdo_dbh_quote_func)(pdo_dbh_t *dbh, const zend_string *unquoted, enum pdo_param_type paramtype);
-/* transaction related */
-typedef int (*pdo_dbh_txn_func)(pdo_dbh_t *dbh);
+/* transaction related (beingTransaction(), commit, rollBack, inTransaction)
+ * Return true if currently inside a transaction, false otherwise. */
+typedef bool (*pdo_dbh_txn_func)(pdo_dbh_t *dbh);
-/* setting of attributes */
-typedef int (*pdo_dbh_set_attr_func)(pdo_dbh_t *dbh, zend_long attr, zval *val);
+/* setting of attributes
+ * Return true on success and false in case of failure */
+typedef bool (*pdo_dbh_set_attr_func)(pdo_dbh_t *dbh, zend_long attr, zval *val);
-/* return last insert id. NULL indicates error condition, otherwise, the return value
- * MUST be an emalloc'd NULL terminated string. */
-typedef char *(*pdo_dbh_last_id_func)(pdo_dbh_t *dbh, const char *name, size_t *len);
+/* return last insert id. NULL indicates error condition.
+ * name MIGHT be NULL */
+typedef zend_string *(*pdo_dbh_last_id_func)(pdo_dbh_t *dbh, const zend_string *name);
-/* fetch error information. if stmt is not null, fetch information pertaining
- * to the statement, otherwise fetch global error information. The driver
- * should add the following information to the array "info" in this order:
+/* Fetch error information.
+ * If stmt is not null, fetch information pertaining to the statement,
+ * otherwise fetch global error information.
+ * info is an initialized PHP array, if there are no messages leave it empty.
+ * The driver should add the following information to the array "info" in this order:
* - native error code
* - string representation of the error code ... any other optional driver
- * specific data ... */
-typedef int (*pdo_dbh_fetch_error_func)(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info);
-
-/* fetching of attributes */
+ * specific data ...
+ * PDO takes care of normalizing the array. */
+typedef void (*pdo_dbh_fetch_error_func)(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info);
+
+/* fetching of attributes
+ * There are 3 return states:
+ * * -1 for errors while retrieving a valid attribute
+ * * 0 for attempting to retrieve an attribute which is not supported by the driver
+ * * any other value for success, *val must be set to the attribute value */
typedef int (*pdo_dbh_get_attr_func)(pdo_dbh_t *dbh, zend_long attr, zval *val);
/* checking/pinging persistent connections; return SUCCESS if the connection
* is still alive and ready to be used, FAILURE otherwise.
* You may set this handler to NULL, which is equivalent to returning SUCCESS. */
-typedef int (*pdo_dbh_check_liveness_func)(pdo_dbh_t *dbh);
+typedef zend_result (*pdo_dbh_check_liveness_func)(pdo_dbh_t *dbh);
/* called at request end for each persistent dbh; this gives the driver
* the opportunity to safely release resources that only have per-request
* scope */
typedef void (*pdo_dbh_request_shutdown)(pdo_dbh_t *dbh);
+/* Called when the PDO handle is scanned for GC. Should populate the get_gc buffer
+ * with any zvals in the driver_data that would be freed if the handle is destroyed. */
+typedef void (*pdo_dbh_get_gc_func)(pdo_dbh_t *dbh, zend_get_gc_buffer *buffer);
+
/* for adding methods to the dbh or stmt objects
pointer to a list of driver specific functions. The convention is
to prefix the function names using the PDO driver name; this will
@@ -315,7 +305,9 @@ struct pdo_dbh_methods {
pdo_dbh_check_liveness_func check_liveness;
pdo_dbh_get_driver_methods_func get_driver_methods;
pdo_dbh_request_shutdown persistent_shutdown;
+ /* if defined to NULL, PDO will use its internal transaction tracking state */
pdo_dbh_txn_func in_transaction;
+ pdo_dbh_get_gc_func get_gc;
};
/* }}} */
@@ -338,13 +330,13 @@ typedef int (*pdo_stmt_fetch_func)(pdo_stmt_t *stmt,
* Driver should populate stmt->columns[colno] with appropriate info */
typedef int (*pdo_stmt_describe_col_func)(pdo_stmt_t *stmt, int colno);
-/* retrieves pointer and size of the value for a column.
- * Note that PDO expects the driver to manage the lifetime of this data;
- * it will copy the value into a zval on behalf of the script.
- * If the driver sets caller_frees, ptr should point to emalloc'd memory
- * and PDO will free it as soon as it is done using it.
- */
-typedef int (*pdo_stmt_get_col_data_func)(pdo_stmt_t *stmt, int colno, char **ptr, size_t *len, int *caller_frees);
+/* Retrieves zval value of a column. If type is non-NULL, then this specifies the type which
+ * the user requested through bindColumn(). The driver does not need to check this argument,
+ * as PDO will perform any necessary conversions itself. However, it might be used to fetch
+ * a value more efficiently into the final type, or make the behavior dependent on the requested
+ * type. */
+typedef int (*pdo_stmt_get_col_data_func)(
+ pdo_stmt_t *stmt, int colno, zval *result, enum pdo_param_type *type);
/* hook for bound params */
enum pdo_param_event {
@@ -377,8 +369,8 @@ typedef int (*pdo_stmt_get_attr_func)(pdo_stmt_t *stmt, zend_long attr, zval *va
* name => the column name
* len => the length/size of the column
* precision => precision of the column
- * pdo_type => an integer, one of the PDO_PARAM_XXX values
*
+ * pdo_type => an integer, one of the PDO_PARAM_XXX values
* scale => the floating point scale
* table => the table for that column
* type => a string representation of the type, mapped to the PHP equivalent type name
@@ -455,7 +447,7 @@ struct _pdo_dbh_t {
unsigned alloc_own_columns:1;
/* if true, commit or rollBack is allowed to be called */
- unsigned in_txn:1;
+ bool in_txn:1;
/* max length a single character can become after correct quoting */
unsigned max_escaped_char_length:3;
@@ -536,7 +528,6 @@ struct pdo_column_data {
zend_string *name;
size_t maxlen;
zend_ulong precision;
- enum pdo_param_type param_type;
};
/* describes a bound parameter */
@@ -599,12 +590,10 @@ struct _pdo_stmt_t {
zend_long row_count;
/* used to hold the statement's current query */
- char *query_string;
- size_t query_stringlen;
+ zend_string *query_string;
/* the copy of the query with expanded binds ONLY for emulated-prepare drivers */
- char *active_query_string;
- size_t active_query_stringlen;
+ zend_string *active_query_string;
/* the cursor specific error code. */
pdo_error_type error_code;
@@ -659,8 +648,9 @@ struct _pdo_row_t {
pdo_stmt_t *stmt;
};
-/* call this in MINIT to register your PDO driver */
-PDO_API int php_pdo_register_driver(const pdo_driver_t *driver);
+/* Call this in MINIT to register the PDO driver.
+ * Registering the driver might fail and should be reported accordingly in MINIT. */
+PDO_API zend_result php_pdo_register_driver(const pdo_driver_t *driver);
/* call this in MSHUTDOWN to unregister your PDO driver */
PDO_API void php_pdo_unregister_driver(const pdo_driver_t *driver);
@@ -680,8 +670,7 @@ PDO_API int php_pdo_parse_data_source(const char *data_source,
PDO_API zend_class_entry *php_pdo_get_dbh_ce(void);
PDO_API zend_class_entry *php_pdo_get_exception(void);
-PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inquery_len,
- char **outquery, size_t *outquery_len);
+PDO_API int pdo_parse_params(pdo_stmt_t *stmt, zend_string *inquery, zend_string **outquery);
PDO_API void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt,
const char *sqlstate, const char *supp);
@@ -692,5 +681,9 @@ PDO_API void php_pdo_dbh_delref(pdo_dbh_t *dbh);
PDO_API void php_pdo_free_statement(pdo_stmt_t *stmt);
PDO_API void php_pdo_stmt_set_column_count(pdo_stmt_t *stmt, int new_count);
+/* Normalization for fetching long param for driver attributes */
+PDO_API bool pdo_get_long_param(zend_long *lval, zval *value);
+PDO_API bool pdo_get_bool_param(bool *bval, zval *value);
+
PDO_API void pdo_throw_exception(unsigned int driver_errcode, char *driver_errmsg, pdo_error_type *pdo_error);
#endif /* PHP_PDO_DRIVER_H */
diff --git a/ext/pdo/php_pdo_int.h b/ext/pdo/php_pdo_int.h
index 7f992a5fd0..59ad4b8dd4 100644
--- a/ext/pdo/php_pdo_int.h
+++ b/ext/pdo/php_pdo_int.h
@@ -39,7 +39,7 @@ extern zend_class_entry *pdo_dbstmt_ce;
void pdo_dbstmt_free_storage(zend_object *std);
zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object, int by_ref);
extern zend_object_handlers pdo_dbstmt_object_handlers;
-int pdo_stmt_describe_columns(pdo_stmt_t *stmt);
+bool pdo_stmt_describe_columns(pdo_stmt_t *stmt);
bool pdo_stmt_setup_fetch_mode(pdo_stmt_t *stmt, zend_long mode, uint32_t mode_arg_num,
zval *args, uint32_t variadic_num_args);
@@ -53,7 +53,7 @@ zend_object_iterator *php_pdo_dbstmt_iter_get(zend_class_entry *ce, zval *object
extern pdo_driver_t *pdo_find_driver(const char *name, int namelen);
-int pdo_sqlstate_init_error_table(void);
+void pdo_sqlstate_init_error_table(void);
void pdo_sqlstate_fini_error_table(void);
const char *pdo_sqlstate_state_to_description(char *state);
-int pdo_hash_methods(pdo_dbh_object_t *dbh, int kind);
+bool pdo_hash_methods(pdo_dbh_object_t *dbh, int kind);
diff --git a/ext/pdo/tests/bug_44159.phpt b/ext/pdo/tests/bug_44159.phpt
index b5601eed41..d80311ad22 100644
--- a/ext/pdo/tests/bug_44159.phpt
+++ b/ext/pdo/tests/bug_44159.phpt
@@ -42,6 +42,6 @@ foreach ($attrs as $attr) {
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, null given
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, int given
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, string given
-TypeError: Attribute value must be of type int for selected attribute, null given
-bool(true)
+TypeError: Attribute value must be of type bool for selected attribute, null given
bool(true)
+TypeError: Attribute value must be of type bool for selected attribute, string given
diff --git a/ext/pdo/tests/bug_69356.phpt b/ext/pdo/tests/bug_69356.phpt
index 44a3440670..5631766a96 100644
--- a/ext/pdo/tests/bug_69356.phpt
+++ b/ext/pdo/tests/bug_69356.phpt
@@ -16,26 +16,35 @@ require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
$db = PDOTest::factory();
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
-$stmt = $db->query("
- SELECT '
- Dumps the information contained by a prepared statement directly on the output. It will provide the SQL query in use, the number of parameters used (Params), the list of parameters, with their name, type (paramtype) as an integer, their key name or position, and the position in the query (if this is supported by the PDO driver, otherwise, it will be -1).
- This is a debug function, which dump directly the data on the normal output.
- Tip:
- As with anything that outputs its result directly to the browser, the output-control functions can be used to capture the output of this function, and save it in a string (for example).
- This will only dumps the parameters in the statement at the moment of the dump. Extra parameters are not stored in the statement, and not displayed.
- '
-");
+$query = <<<'SQL'
+SELECT '
+ Dumps the information contained by a prepared statement directly on the output. It will provide the SQL query in use, the number of parameters used (Params), the list of parameters, with their name, type (paramtype) as an integer, their key name or position, and the position in the query (if this is supported by the PDO driver, otherwise, it will be -1).
+ This is a debug function, which dump directly the data on the normal output.
+ Tip:
+ As with anything that outputs its result directly to the browser, the output-control functions can be used to capture the output of this function, and save it in a string (for example).
+ This will only dumps the parameters in the statement at the moment of the dump. Extra parameters are not stored in the statement, and not displayed.
+'
+SQL;
+
+switch ($db->getAttribute(PDO::ATTR_DRIVER_NAME)) {
+ case 'oci':
+ $query .= ' FROM DUAL';
+ break;
+ case 'firebird':
+ $query .= ' FROM RDB$DATABASE';
+ break;
+}
+
+$stmt = $db->query($query);
var_dump($stmt->debugDumpParams());
?>
--EXPECTF--
-SQL: [%d]
- SELECT '
- Dumps the information contained by a prepared statement directly on the output. It will provide the SQL query in use, the number of parameters used (Params), the list of parameters, with their name, type (paramtype) as an integer, their key name or position, and the position in the query (if this is supported by the PDO driver, otherwise, it will be -1).
- This is a debug function, which dump directly the data on the normal output.
- Tip:
- As with anything that outputs its result directly to the browser, the output-control functions can be used to capture the output of this function, and save it in a string (for example).
- This will only dumps the parameters in the statement at the moment of the dump. Extra parameters are not stored in the statement, and not displayed.
- '
-
+SQL: [%s] SELECT '
+ Dumps the information contained by a prepared statement directly on the output. It will provide the SQL query in use, the number of parameters used (Params), the list of parameters, with their name, type (paramtype) as an integer, their key name or position, and the position in the query (if this is supported by the PDO driver, otherwise, it will be -1).
+ This is a debug function, which dump directly the data on the normal output.
+ Tip:
+ As with anything that outputs its result directly to the browser, the output-control functions can be used to capture the output of this function, and save it in a string (for example).
+ This will only dumps the parameters in the statement at the moment of the dump. Extra parameters are not stored in the statement, and not displayed.
+'%S
Params: 0
NULL
diff --git a/ext/pdo/tests/bug_73234.phpt b/ext/pdo/tests/bug_73234.phpt
index 451cc4849c..dddf5c5bf0 100644
--- a/ext/pdo/tests/bug_73234.phpt
+++ b/ext/pdo/tests/bug_73234.phpt
@@ -15,7 +15,16 @@ require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
$db = PDOTest::factory();
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
-$db->exec('CREATE TABLE test(id INT NULL)');
+
+switch ($db->getAttribute(PDO::ATTR_DRIVER_NAME)) {
+ case 'dblib':
+ $sql = 'CREATE TABLE test(id INT NULL)';
+ break;
+ default:
+ $sql = 'CREATE TABLE test(id INT)';
+ break;
+}
+$db->exec($sql);
$stmt = $db->prepare('INSERT INTO test VALUES(:value)');
diff --git a/ext/pdo/tests/debug_emulated_prepares.phpt b/ext/pdo/tests/debug_emulated_prepares.phpt
index f347c7e4ea..e981f7db39 100644
--- a/ext/pdo/tests/debug_emulated_prepares.phpt
+++ b/ext/pdo/tests/debug_emulated_prepares.phpt
@@ -47,17 +47,17 @@ Key: Name: [5] :bool
paramno=-1
name=[5] ":bool"
is_param=1
-param_type=5
+param_type=1
Key: Name: [4] :int
paramno=-1
name=[4] ":int"
is_param=1
-param_type=1
+param_type=2
Key: Name: [7] :string
paramno=-1
name=[7] ":string"
is_param=1
-param_type=2
+param_type=3
Key: Name: [5] :null
paramno=-1
name=[5] ":null"
diff --git a/ext/pdo/tests/pdo_005.phpt b/ext/pdo/tests/pdo_005.phpt
index 25eab7782f..1427028a9f 100644
--- a/ext/pdo/tests/pdo_005.phpt
+++ b/ext/pdo/tests/pdo_005.phpt
@@ -114,40 +114,40 @@ TestDerived::__construct(2,3)
array(3) {
[0]=>
object(TestDerived)#%d (5) {
- ["row":protected]=>
- int(0)
["id"]=>
string(1) "1"
["val":protected]=>
string(1) "A"
["val2":"TestBase":private]=>
NULL
+ ["row":protected]=>
+ int(0)
["val2"]=>
string(2) "AA"
}
[1]=>
object(TestDerived)#%d (5) {
- ["row":protected]=>
- int(1)
["id"]=>
string(1) "2"
["val":protected]=>
string(1) "B"
["val2":"TestBase":private]=>
NULL
+ ["row":protected]=>
+ int(1)
["val2"]=>
string(2) "BB"
}
[2]=>
object(TestDerived)#%d (5) {
- ["row":protected]=>
- int(2)
["id"]=>
string(1) "3"
["val":protected]=>
string(1) "C"
["val2":"TestBase":private]=>
NULL
+ ["row":protected]=>
+ int(2)
["val2"]=>
string(2) "CC"
}
diff --git a/ext/pdo/tests/pdo_018.phpt b/ext/pdo/tests/pdo_018.phpt
index d35e078b32..de03382353 100644
--- a/ext/pdo/tests/pdo_018.phpt
+++ b/ext/pdo/tests/pdo_018.phpt
@@ -206,9 +206,9 @@ array(4) {
===INSERT===
TestBase::serialize() = 'a:3:{s:7:"BasePub";s:6:"Public";s:7:"BasePro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}'
TestDerived::serialize()
-TestBase::serialize() = 'a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}'
+TestBase::serialize() = 'a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:7:"BasePri";s:7:"Private";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}'
TestDerived::serialize()
-TestBase::serialize() = 'a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}'
+TestBase::serialize() = 'a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:7:"BasePri";s:7:"Private";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}'
===DATA===
array(4) {
[0]=>
@@ -216,9 +216,9 @@ array(4) {
[1]=>
string(91) "a:3:{s:7:"BasePub";s:6:"Public";s:7:"BasePro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
[2]=>
- string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
+ string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:7:"BasePri";s:7:"Private";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}"
[3]=>
- string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
+ string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:7:"BasePri";s:7:"Private";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}"
}
===FAILURE===
Exception:SQLSTATE[HY000]: General error: cannot unserialize class
@@ -238,22 +238,22 @@ array(3) {
["name"]=>
string(11) "TestDerived"
["val"]=>
- string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
+ string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:7:"BasePri";s:7:"Private";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}"
}
[2]=>
array(2) {
["name"]=>
NULL
["val"]=>
- string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
+ string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:7:"BasePri";s:7:"Private";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}"
}
}
===FETCHCLASS===
TestBase::unserialize(a:3:{s:7:"BasePub";s:6:"Public";s:7:"BasePro";s:9:"Protected";s:7:"BasePri";s:7:"Private";})
TestDerived::unserialize()
-TestBase::unserialize(a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";})
+TestBase::unserialize(a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:7:"BasePri";s:7:"Private";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";})
TestDerived::unserialize()
-TestBase::unserialize(a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";})
+TestBase::unserialize(a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:7:"BasePri";s:7:"Private";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";})
array(3) {
[0]=>
object(TestBase)#%d (3) {
@@ -270,14 +270,14 @@ array(3) {
string(14) "#DerivedPublic"
["BasePro":protected]=>
string(17) "#DerivdeProtected"
+ ["BasePri":"TestBase":private]=>
+ string(8) "#Private"
["DerivedPub"]=>
string(7) "#Public"
["DerivedPro":protected]=>
string(10) "#Protected"
["DerivedPri":"TestDerived":private]=>
string(7) "Private"
- ["BasePri":"TestBase":private]=>
- string(8) "#Private"
}
[2]=>
object(TestLeaf)#%d (6) {
@@ -285,13 +285,13 @@ array(3) {
string(14) "#DerivedPublic"
["BasePro":protected]=>
string(17) "#DerivdeProtected"
+ ["BasePri":"TestBase":private]=>
+ string(8) "#Private"
["DerivedPub"]=>
string(7) "#Public"
["DerivedPro":protected]=>
string(10) "#Protected"
["DerivedPri":"TestDerived":private]=>
string(7) "Private"
- ["BasePri":"TestBase":private]=>
- string(8) "#Private"
}
}
diff --git a/ext/pdo/tests/pdo_023.phpt b/ext/pdo/tests/pdo_023.phpt
index 834c99309e..ee38f98cac 100644
--- a/ext/pdo/tests/pdo_023.phpt
+++ b/ext/pdo/tests/pdo_023.phpt
@@ -95,10 +95,10 @@ PDOStatementX::__destruct()
PDODatabaseX::query()
PDOStatementX::__construct()
object(PDOStatementX)#%d (3) {
- ["test1"]=>
- int(1)
["queryString"]=>
string(24) "SELECT val, id FROM test"
+ ["test1"]=>
+ int(1)
["test2"]=>
int(22)
}
diff --git a/ext/pdo/tests/pdo_036.phpt b/ext/pdo/tests/pdo_036.phpt
index 21c8241c99..e27cc253ee 100644
--- a/ext/pdo/tests/pdo_036.phpt
+++ b/ext/pdo/tests/pdo_036.phpt
@@ -15,9 +15,9 @@ var_dump($x);
?>
--EXPECTF--
-object(PDOStatement)#%d (1) {
+object(PDOStatement)#%d (0) {
["queryString"]=>
- NULL
+ uninitialized(string)
}
Fatal error: Uncaught PDOException: You may not create a PDORow manually in %spdo_036.php:8
diff --git a/ext/pdo_dblib/config.m4 b/ext/pdo_dblib/config.m4
index b6cbc01a5a..4160cd9596 100644
--- a/ext/pdo_dblib/config.m4
+++ b/ext/pdo_dblib/config.m4
@@ -10,23 +10,13 @@ if test "$PHP_PDO_DBLIB" != "no"; then
fi
if test "$PHP_PDO_DBLIB" = "yes"; then
-
- for i in /usr/local /usr; do
- if test -f $i/include/sybdb.h; then
- PDO_FREETDS_INSTALLATION_DIR=$i
- PDO_FREETDS_INCLUDE_DIR=$i/include
- break
- elif test -f $i/include/freetds/sybdb.h; then
- PDO_FREETDS_INSTALLATION_DIR=$i
- PDO_FREETDS_INCLUDE_DIR=$i/include/freetds
- break;
- fi
- done
-
- if test -z "$PDO_FREETDS_INSTALLATION_DIR"; then
- AC_MSG_ERROR(Cannot find FreeTDS in known installation directories)
- fi
-
+ dnl FreeTDS must be on the default system include/library path.
+ dnl Only perform a sanity check that this is really the case.
+ PHP_CHECK_LIBRARY(sybdb, dbsqlexec,
+ [],[
+ AC_MSG_ERROR([Cannot find FreeTDS in known installation directories])
+ ])
+ PHP_ADD_LIBRARY(sybdb,,GMP_SHARED_LIBADD)
elif test "$PHP_PDO_DBLIB" != "no"; then
if test -f $PHP_PDO_DBLIB/include/sybdb.h; then
@@ -38,18 +28,18 @@ if test "$PHP_PDO_DBLIB" != "no"; then
else
AC_MSG_ERROR(Directory $PHP_PDO_DBLIB is not a FreeTDS installation directory)
fi
- fi
- if test "x$PHP_LIBDIR" = "x" ; then
- PHP_LIBDIR=lib
- fi
+ if test "x$PHP_LIBDIR" = "x" ; then
+ PHP_LIBDIR=lib
+ fi
- if test ! -r "$PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.a" && test ! -r "$PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.so"; then
- AC_MSG_ERROR(Could not find $PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.[a|so])
- fi
+ if test ! -r "$PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.a" && test ! -r "$PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.so"; then
+ AC_MSG_ERROR(Could not find $PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.[a|so])
+ fi
- PHP_ADD_INCLUDE($PDO_FREETDS_INCLUDE_DIR)
- PHP_ADD_LIBRARY_WITH_PATH(sybdb, $PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR, PDO_DBLIB_SHARED_LIBADD)
+ PHP_ADD_INCLUDE($PDO_FREETDS_INCLUDE_DIR)
+ PHP_ADD_LIBRARY_WITH_PATH(sybdb, $PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR, PDO_DBLIB_SHARED_LIBADD)
+ fi
PHP_CHECK_PDO_INCLUDES
diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c
index 7f160a402f..712a6e11d0 100644
--- a/ext/pdo_dblib/dblib_driver.c
+++ b/ext/pdo_dblib/dblib_driver.c
@@ -31,7 +31,7 @@
/* Cache of the server supported datatypes, initialized in handle_factory */
zval* pdo_dblib_datatypes;
-static int dblib_fetch_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info)
+static void dblib_fetch_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info)
{
pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
pdo_dblib_err *einfo = &H->err;
@@ -55,11 +55,11 @@ static int dblib_fetch_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info)
/* don't return anything if there's nothing to return */
if (msg == NULL && einfo->dberr == 0 && einfo->oserr == 0 && einfo->severity == 0) {
- return 0;
+ return;
}
spprintf(&message, 0, "%s [%d] (severity %d) [%s]",
- msg, einfo->dberr, einfo->severity, stmt ? stmt->active_query_string : "");
+ msg, einfo->dberr, einfo->severity, stmt ? ZSTR_VAL(stmt->active_query_string) : "");
add_next_index_long(info, einfo->dberr);
add_next_index_string(info, message);
@@ -69,12 +69,10 @@ static int dblib_fetch_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info)
if (einfo->oserrstr) {
add_next_index_string(info, einfo->oserrstr);
}
-
- return 1;
}
-static int dblib_handle_closer(pdo_dbh_t *dbh)
+static void dblib_handle_closer(pdo_dbh_t *dbh)
{
pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
@@ -91,10 +89,9 @@ static int dblib_handle_closer(pdo_dbh_t *dbh)
pefree(H, dbh->is_persistent);
dbh->driver_data = NULL;
}
- return 0;
}
-static int dblib_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options)
+static bool dblib_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options)
{
pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
pdo_dblib_stmt *S = ecalloc(1, sizeof(*S));
@@ -106,17 +103,17 @@ static int dblib_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len
S->computed_column_name_count = 0;
S->err.sqlstate = stmt->error_code;
- return 1;
+ return true;
}
-static zend_long dblib_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_len)
+static zend_long dblib_handle_doer(pdo_dbh_t *dbh, const zend_string *sql)
{
pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
RETCODE ret, resret;
dbsetuserdata(H->link, (BYTE*)&H->err);
- if (FAIL == dbcmd(H->link, sql)) {
+ if (FAIL == dbcmd(H->link, ZSTR_VAL(sql))) {
return -1;
}
@@ -145,14 +142,14 @@ static zend_long dblib_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_l
return DBCOUNT(H->link);
}
-static int dblib_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unquotedlen, char **quoted, size_t *quotedlen, enum pdo_param_type paramtype)
+static zend_string* dblib_handle_quoter(pdo_dbh_t *dbh, const zend_string *unquoted, enum pdo_param_type paramtype)
{
pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
- zend_bool use_national_character_set = 0;
-
+ bool use_national_character_set = 0;
size_t i;
- char * q;
- *quotedlen = 0;
+ char *q;
+ size_t quotedlen = 0;
+ zend_string *quoted_str;
if (H->assume_national_character_set_strings) {
use_national_character_set = 1;
@@ -165,72 +162,74 @@ static int dblib_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unqu
}
/* Detect quoted length, adding extra char for doubled single quotes */
- for (i = 0; i < unquotedlen; i++) {
- if (unquoted[i] == '\'') ++*quotedlen;
- ++*quotedlen;
+ for (i = 0; i < ZSTR_LEN(unquoted); i++) {
+ if (ZSTR_VAL(unquoted)[i] == '\'') ++quotedlen;
+ ++quotedlen;
}
- *quotedlen += 2; /* +2 for opening, closing quotes */
+ quotedlen += 2; /* +2 for opening, closing quotes */
if (use_national_character_set) {
- ++*quotedlen; /* N prefix */
+ ++quotedlen; /* N prefix */
}
- q = *quoted = emalloc(*quotedlen + 1); /* Add byte for terminal null */
+ quoted_str = zend_string_alloc(quotedlen, 0);
+ q = ZSTR_VAL(quoted_str);
if (use_national_character_set) {
*q++ = 'N';
}
*q++ = '\'';
- for (i = 0; i < unquotedlen; i++) {
- if (unquoted[i] == '\'') {
+ for (i = 0; i < ZSTR_LEN(unquoted); i++) {
+ if (ZSTR_VAL(unquoted)[i] == '\'') {
*q++ = '\'';
*q++ = '\'';
} else {
- *q++ = unquoted[i];
+ *q++ = ZSTR_VAL(unquoted)[i];
}
}
*q++ = '\'';
+ *q = '\0';
- *q = 0;
-
- return 1;
+ return quoted_str;
}
-static int pdo_dblib_transaction_cmd(const char *cmd, pdo_dbh_t *dbh)
+static bool pdo_dblib_transaction_cmd(const char *cmd, pdo_dbh_t *dbh)
{
pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
if (FAIL == dbcmd(H->link, cmd)) {
- return 0;
+ return false;
}
if (FAIL == dbsqlexec(H->link)) {
- return 0;
+ return false;
}
- return 1;
+ return true;
}
-static int dblib_handle_begin(pdo_dbh_t *dbh)
+static bool dblib_handle_begin(pdo_dbh_t *dbh)
{
return pdo_dblib_transaction_cmd("BEGIN TRANSACTION", dbh);
}
-static int dblib_handle_commit(pdo_dbh_t *dbh)
+static bool dblib_handle_commit(pdo_dbh_t *dbh)
{
return pdo_dblib_transaction_cmd("COMMIT TRANSACTION", dbh);
}
-static int dblib_handle_rollback(pdo_dbh_t *dbh)
+static bool dblib_handle_rollback(pdo_dbh_t *dbh)
{
return pdo_dblib_transaction_cmd("ROLLBACK TRANSACTION", dbh);
}
-char *dblib_handle_last_id(pdo_dbh_t *dbh, const char *name, size_t *len)
+zend_string *dblib_handle_last_id(pdo_dbh_t *dbh, const zend_string *name)
{
pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
RETCODE ret;
char *id = NULL;
+ size_t len;
+ zend_string *ret_id;
/*
* Would use scope_identity() but it's not implemented on Sybase
@@ -263,34 +262,53 @@ char *dblib_handle_last_id(pdo_dbh_t *dbh, const char *name, size_t *len)
}
id = emalloc(32);
- *len = dbconvert(NULL, (dbcoltype(H->link, 1)) , (dbdata(H->link, 1)) , (dbdatlen(H->link, 1)), SQLCHAR, (BYTE *)id, (DBINT)-1);
-
+ len = dbconvert(NULL, (dbcoltype(H->link, 1)) , (dbdata(H->link, 1)) , (dbdatlen(H->link, 1)), SQLCHAR, (BYTE *)id, (DBINT)-1);
dbcancel(H->link);
- return id;
+
+ ret_id = zend_string_init(id, len, 0);
+ efree(id);
+ return ret_id;
}
-static int dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
+static bool dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
{
pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
+ zend_long lval;
+ bool bval;
switch(attr) {
case PDO_ATTR_DEFAULT_STR_PARAM:
- H->assume_national_character_set_strings = zval_get_long(val) == PDO_PARAM_STR_NATL ? 1 : 0;
- return 1;
+ if (!pdo_get_long_param(&lval, val)) {
+ return false;
+ }
+ H->assume_national_character_set_strings = lval == PDO_PARAM_STR_NATL ? 1 : 0;
+ return true;
case PDO_ATTR_TIMEOUT:
case PDO_DBLIB_ATTR_QUERY_TIMEOUT:
- return SUCCEED == dbsettime(zval_get_long(val)) ? 1 : 0;
+ if (!pdo_get_long_param(&lval, val)) {
+ return false;
+ }
+ return SUCCEED == dbsettime(lval);
case PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER:
- H->stringify_uniqueidentifier = zval_get_long(val);
- return 1;
+ if (!pdo_get_long_param(&lval, val)) {
+ return false;
+ }
+ H->stringify_uniqueidentifier = lval;
+ return true;
case PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS:
- H->skip_empty_rowsets = zval_is_true(val);
- return 1;
+ if (!pdo_get_bool_param(&bval, val)) {
+ return false;
+ }
+ H->skip_empty_rowsets = bval;
+ return true;
case PDO_DBLIB_ATTR_DATETIME_CONVERT:
- H->datetime_convert = zval_get_long(val);
- return 1;
+ if (!pdo_get_long_param(&lval, val)) {
+ return false;
+ }
+ H->datetime_convert = lval;
+ return true;
default:
- return 0;
+ return false;
}
}
@@ -417,7 +435,8 @@ static const struct pdo_dbh_methods dblib_methods = {
NULL, /* check liveness */
NULL, /* get driver methods */
NULL, /* request shutdown */
- NULL /* in transaction */
+ NULL, /* in transaction, use PDO's internal tracking mechanism */
+ NULL /* get gc */
};
static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options)
diff --git a/ext/pdo_dblib/dblib_stmt.c b/ext/pdo_dblib/dblib_stmt.c
index 94526a4c6e..03e69a4ac0 100644
--- a/ext/pdo_dblib/dblib_stmt.c
+++ b/ext/pdo_dblib/dblib_stmt.c
@@ -177,7 +177,7 @@ static int pdo_dblib_stmt_execute(pdo_stmt_t *stmt)
pdo_dblib_stmt_cursor_closer(stmt);
- if (FAIL == dbcmd(H->link, stmt->active_query_string)) {
+ if (FAIL == dbcmd(H->link, ZSTR_VAL(stmt->active_query_string))) {
return 0;
}
@@ -251,7 +251,6 @@ static int pdo_dblib_stmt_describe(pdo_stmt_t *stmt, int colno)
}
col->maxlen = dbcollen(H->link, colno+1);
- col->param_type = PDO_PARAM_ZVAL;
return 1;
}
@@ -304,14 +303,12 @@ static int pdo_dblib_stmt_should_stringify_col(pdo_stmt_t *stmt, int coltype)
return 0;
}
-static void pdo_dblib_stmt_stringify_col(int coltype, LPBYTE data, DBINT data_len, zval **ptr)
+static void pdo_dblib_stmt_stringify_col(int coltype, LPBYTE data, DBINT data_len, zval *zv)
{
DBCHAR *tmp_data;
- DBINT tmp_data_len;
- zval *zv;
/* FIXME: We allocate more than we need here */
- tmp_data_len = 32 + (2 * (data_len));
+ DBINT tmp_data_len = 32 + (2 * (data_len));
switch (coltype) {
case SQLDATETIME:
@@ -326,7 +323,6 @@ static void pdo_dblib_stmt_stringify_col(int coltype, LPBYTE data, DBINT data_le
tmp_data = emalloc(tmp_data_len);
data_len = dbconvert(NULL, coltype, data, data_len, SQLCHAR, (LPBYTE) tmp_data, tmp_data_len);
- zv = emalloc(sizeof(zval));
if (data_len > 0) {
/* to prevent overflows, tmp_data_len is provided as a dest len for dbconvert()
* this code previously passed a dest len of -1
@@ -342,12 +338,9 @@ static void pdo_dblib_stmt_stringify_col(int coltype, LPBYTE data, DBINT data_le
}
efree(tmp_data);
-
- *ptr = zv;
}
-static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr,
- zend_ulong *len, int *caller_frees)
+static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, zval *zv, enum pdo_param_type *type)
{
pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
@@ -357,7 +350,6 @@ static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr,
LPBYTE data;
DBCHAR *tmp_data;
DBINT data_len, tmp_data_len;
- zval *zv = NULL;
coltype = dbcoltype(H->link, colno+1);
data = dbdata(H->link, colno+1);
@@ -365,10 +357,8 @@ static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr,
if (data_len != 0 || data != NULL) {
if (pdo_dblib_stmt_should_stringify_col(stmt, coltype) && dbwillconvert(coltype, SQLCHAR)) {
- pdo_dblib_stmt_stringify_col(coltype, data, data_len, &zv);
- }
-
- if (!zv) {
+ pdo_dblib_stmt_stringify_col(coltype, data, data_len, zv);
+ } else {
switch (coltype) {
case SQLCHAR:
case SQLVARCHAR:
@@ -382,7 +372,6 @@ static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr,
case SQLVARBINARY:
case SQLBINARY:
case SQLIMAGE: {
- zv = emalloc(sizeof(zval));
ZVAL_STRINGL(zv, (DBCHAR *) data, data_len);
break;
@@ -407,50 +396,31 @@ static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr,
#endif
);
- zv = emalloc(sizeof(zval));
ZVAL_STRINGL(zv, tmp_data, dl);
efree(tmp_data);
break;
}
- case SQLFLT4: {
- zv = emalloc(sizeof(zval));
+ case SQLFLT4:
ZVAL_DOUBLE(zv, *(DBFLT4 *) data);
-
break;
- }
- case SQLFLT8: {
- zv = emalloc(sizeof(zval));
+ case SQLFLT8:
ZVAL_DOUBLE(zv, *(DBFLT8 *) data);
-
break;
- }
- case SQLINT8: {
- zv = emalloc(sizeof(zval));
+ case SQLINT8:
ZVAL_LONG(zv, *(DBBIGINT *) data);
-
break;
- }
- case SQLINT4: {
- zv = emalloc(sizeof(zval));
+ case SQLINT4:
ZVAL_LONG(zv, *(DBINT *) data);
-
break;
- }
- case SQLINT2: {
- zv = emalloc(sizeof(zval));
+ case SQLINT2:
ZVAL_LONG(zv, *(DBSMALLINT *) data);
-
break;
- }
case SQLINT1:
- case SQLBIT: {
- zv = emalloc(sizeof(zval));
+ case SQLBIT:
ZVAL_LONG(zv, *(DBTINYINT *) data);
-
break;
- }
case SQLDECIMAL:
case SQLNUMERIC:
case SQLMONEY:
@@ -458,10 +428,7 @@ static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr,
case SQLMONEYN: {
DBFLT8 float_value;
dbconvert(NULL, coltype, data, 8, SQLFLT8, (LPBYTE) &float_value, -1);
-
- zv = emalloc(sizeof(zval));
ZVAL_DOUBLE(zv, float_value);
-
break;
}
@@ -472,12 +439,10 @@ static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr,
tmp_data = safe_emalloc(tmp_data_len, sizeof(char), 1);
data_len = dbconvert(NULL, SQLUNIQUE, data, data_len, SQLCHAR, (LPBYTE) tmp_data, tmp_data_len);
php_strtoupper(tmp_data, data_len);
- zv = emalloc(sizeof(zval));
ZVAL_STRINGL(zv, tmp_data, data_len);
efree(tmp_data);
} else {
/* 16-byte binary representation */
- zv = emalloc(sizeof(zval));
ZVAL_STRINGL(zv, (DBCHAR *) data, 16);
}
break;
@@ -485,7 +450,7 @@ static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr,
default: {
if (dbwillconvert(coltype, SQLCHAR)) {
- pdo_dblib_stmt_stringify_col(coltype, data, data_len, &zv);
+ pdo_dblib_stmt_stringify_col(coltype, data, data_len, zv);
}
break;
@@ -494,16 +459,6 @@ static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr,
}
}
- if (zv != NULL) {
- *ptr = (char*)zv;
- *len = sizeof(zval);
- } else {
- *ptr = NULL;
- *len = 0;
- }
-
- *caller_frees = 1;
-
return 1;
}
diff --git a/ext/pdo_dblib/pdo_dblib.c b/ext/pdo_dblib/pdo_dblib.c
index ddce55dc36..12378fb0db 100644
--- a/ext/pdo_dblib/pdo_dblib.c
+++ b/ext/pdo_dblib/pdo_dblib.c
@@ -121,7 +121,7 @@ int pdo_dblib_error_handler(DBPROCESS *dbproc, int severity, int dberr,
}
int pdo_dblib_msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate,
- int severity, char *msgtext, char *srvname, char *procname, DBUSMALLINT line)
+ int severity, char *msgtext, char *srvname, char *procname, int line)
{
pdo_dblib_err *einfo;
diff --git a/ext/pdo_dblib/php_pdo_dblib_int.h b/ext/pdo_dblib/php_pdo_dblib_int.h
index ecd65f577c..0a5c7898fc 100644
--- a/ext/pdo_dblib/php_pdo_dblib_int.h
+++ b/ext/pdo_dblib/php_pdo_dblib_int.h
@@ -98,7 +98,7 @@ int pdo_dblib_error_handler(DBPROCESS *dbproc, int severity, int dberr,
int oserr, char *dberrstr, char *oserrstr);
int pdo_dblib_msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate,
- int severity, char *msgtext, char *srvname, char *procname, DBUSMALLINT line);
+ int severity, char *msgtext, char *srvname, char *procname, int line);
extern const pdo_driver_t pdo_dblib_driver;
extern const struct pdo_stmt_methods dblib_stmt_methods;
diff --git a/ext/pdo_dblib/tests/README.md b/ext/pdo_dblib/tests/README.md
new file mode 100644
index 0000000000..3b597d6f57
--- /dev/null
+++ b/ext/pdo_dblib/tests/README.md
@@ -0,0 +1,11 @@
+# The pdo_mysql extension tests
+
+This extension can be tested using Microsoft's Docker image for [SQL Server on Linux](https://hub.docker.com/_/microsoft-mssql-server):
+
+```bash
+docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" -p 1433:1433 --name sql1 -h sql1 -d mcr.microsoft.com/mssql/server:2019-latest
+docker exec sql1 /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U SA -P "<YourStrong@Passw0rd>" -Q "create login pdo_test with password='password', check_policy=off; create user pdo_test for login pdo_test; grant alter, control to pdo_test;"
+
+# and then from the root of php-src
+PDO_DBLIB_TEST_DSN="dblib:host=127.0.0.1;dbname=master;version=7.0" PDO_DBLIB_TEST_USER="pdo_test" PDO_DBLIB_TEST_PASS="password" TESTS=ext/pdo_dblib make test
+```
diff --git a/ext/pdo_dblib/tests/bug_45876.phpt b/ext/pdo_dblib/tests/bug_45876.phpt
index 7328cdc9bb..fb5359f1ee 100644
--- a/ext/pdo_dblib/tests/bug_45876.phpt
+++ b/ext/pdo_dblib/tests/bug_45876.phpt
@@ -31,7 +31,7 @@ array(10) {
["native_usertype_id"]=>
int(%d)
["pdo_type"]=>
- int(2)
+ int(3)
["name"]=>
string(13) "TABLE_CATALOG"
["len"]=>
diff --git a/ext/pdo_dblib/tests/pdo_dblib_param_str_natl.phpt b/ext/pdo_dblib/tests/pdo_dblib_param_str_natl.phpt
index 8e4062e359..3c5e721a11 100644
--- a/ext/pdo_dblib/tests/pdo_dblib_param_str_natl.phpt
+++ b/ext/pdo_dblib/tests/pdo_dblib_param_str_natl.phpt
@@ -23,5 +23,5 @@ Key: Name: [6] :value
paramno=-1
name=[6] ":value"
is_param=1
-param_type=1073741826
+param_type=1073741827
NULL
diff --git a/ext/pdo_dblib/tests/pdo_dblib_quote.phpt b/ext/pdo_dblib/tests/pdo_dblib_quote.phpt
index c5f2a4b620..582c54c5d2 100644
--- a/ext/pdo_dblib/tests/pdo_dblib_quote.phpt
+++ b/ext/pdo_dblib/tests/pdo_dblib_quote.phpt
@@ -29,10 +29,12 @@ $db = new PDO($dsn, $user, $pass, [PDO::ATTR_DEFAULT_STR_PARAM => PDO::PARAM_STR
var_dump($db->getAttribute(PDO::ATTR_DEFAULT_STR_PARAM) === PDO::PARAM_STR_NATL);
?>
---EXPECT--
+--EXPECTF--
string(3) "'1'"
string(2) "''"
string(4) "'42'"
+
+Deprecated: PDO::quote(): Passing null to parameter #1 ($string) of type string is deprecated in %s on line %d
string(2) "''"
string(4) "''''"
string(5) "'foo'"
diff --git a/ext/pdo_dblib/tests/timeout.phpt b/ext/pdo_dblib/tests/timeout.phpt
index a070b0da75..0ef227a88b 100644
--- a/ext/pdo_dblib/tests/timeout.phpt
+++ b/ext/pdo_dblib/tests/timeout.phpt
@@ -12,12 +12,6 @@ require __DIR__ . '/config.inc';
$sql = 'WAITFOR DELAY \'00:00:02\'';
-// querying without a timeout will succeed
-$stmt = $db->prepare($sql);
-if ($stmt->execute()) {
- echo "OK\n";
-}
-
// regular timeout attribute, set after instance created, will affect query timeout, causing this query to fail
$db = new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
@@ -80,4 +74,3 @@ OK
OK
OK
OK
-OK
diff --git a/ext/pdo_dblib/tests/types.phpt b/ext/pdo_dblib/tests/types.phpt
index fa336d9fb4..a6e34ac10b 100644
--- a/ext/pdo_dblib/tests/types.phpt
+++ b/ext/pdo_dblib/tests/types.phpt
@@ -58,7 +58,7 @@ var_dump($row['datetime']);
var_dump($row['false']);
var_dump($row['float'] === get_expected_float_string());
var_dump($row['int']);
-var_dump($row['money']);
+// var_dump($row['money']); -- the decimal precision varies and it's not clear why
var_dump($row['smalldatetime']);
var_dump($row['true']);
@@ -77,6 +77,5 @@ string(19) "2030-01-01 23:59:59"
string(1) "0"
bool(true)
string(4) "1000"
-string(5) "10.50"
string(19) "1950-01-18 23:00:00"
string(1) "1"
diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c
index 7721b64de5..deee7f33f3 100644
--- a/ext/pdo_firebird/firebird_driver.c
+++ b/ext/pdo_firebird/firebird_driver.c
@@ -29,7 +29,7 @@
#include "php_pdo_firebird.h"
#include "php_pdo_firebird_int.h"
-static int firebird_alloc_prepare_stmt(pdo_dbh_t*, const char*, size_t, XSQLDA*, isc_stmt_handle*,
+static int firebird_alloc_prepare_stmt(pdo_dbh_t*, const zend_string*, XSQLDA*, isc_stmt_handle*,
HashTable*);
const char CHR_LETTER = 1;
@@ -171,10 +171,11 @@ static const char classes_array[] = {
/* 127 */ 0
};
-inline char classes(char idx)
+static inline char classes(char idx)
{
- if (idx > 127) return 0;
- return classes_array[idx];
+ unsigned char uidx = (unsigned char) idx;
+ if (uidx > 127) return 0;
+ return classes_array[uidx];
}
typedef enum {
@@ -290,13 +291,13 @@ static FbTokenType getToken(const char** begin, const char* end)
return ret;
}
-int preprocess(const char* sql, int sql_len, char* sql_out, HashTable* named_params)
+int preprocess(const zend_string* sql, char* sql_out, HashTable* named_params)
{
- zend_bool passAsIs = 1, execBlock = 0;
+ bool passAsIs = 1, execBlock = 0;
zend_long pindex = -1;
char pname[254], ident[253], ident2[253];
unsigned int l;
- const char* p = sql, * end = sql + sql_len;
+ const char* p = ZSTR_VAL(sql), * end = ZSTR_VAL(sql) + ZSTR_LEN(sql);
const char* start = p;
FbTokenType tok = getToken(&p, end);
@@ -362,7 +363,7 @@ int preprocess(const char* sql, int sql_len, char* sql_out, HashTable* named_par
if (passAsIs)
{
- strcpy(sql_out, sql);
+ strcpy(sql_out, ZSTR_VAL(sql));
return 1;
}
@@ -388,7 +389,7 @@ int preprocess(const char* sql, int sql_len, char* sql_out, HashTable* named_par
}
strncpy(pname, start, l);
pname[l] = '\0';
-
+
if (named_params) {
zval tmp;
ZVAL_LONG(&tmp, pindex);
@@ -466,7 +467,7 @@ void _firebird_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, char const *file, zend_lo
#define RECORD_ERROR(dbh) _firebird_error(dbh, NULL, __FILE__, __LINE__)
/* called by PDO to close a db handle */
-static int firebird_handle_closer(pdo_dbh_t *dbh) /* {{{ */
+static void firebird_handle_closer(pdo_dbh_t *dbh) /* {{{ */
{
pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
@@ -497,13 +498,11 @@ static int firebird_handle_closer(pdo_dbh_t *dbh) /* {{{ */
}
pefree(H, dbh->is_persistent);
-
- return 0;
}
/* }}} */
/* called by PDO to prepare an SQL query */
-static int firebird_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, /* {{{ */
+static bool firebird_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, /* {{{ */
pdo_stmt_t *stmt, zval *driver_options)
{
pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
@@ -523,7 +522,7 @@ static int firebird_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_
zend_hash_init(np, 8, NULL, NULL, 0);
/* allocate and prepare statement */
- if (!firebird_alloc_prepare_stmt(dbh, sql, sql_len, &num_sqlda, &s, np)) {
+ if (!firebird_alloc_prepare_stmt(dbh, sql, &num_sqlda, &s, np)) {
break;
}
@@ -531,7 +530,6 @@ static int firebird_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_
S = ecalloc(1, sizeof(*S)-sizeof(XSQLDA) + XSQLDA_LENGTH(num_sqlda.sqld));
S->H = H;
S->stmt = s;
- S->fetch_buf = ecalloc(1,sizeof(char*) * num_sqlda.sqld);
S->out_sqlda.version = PDO_FB_SQLDA_VERSION;
S->out_sqlda.sqln = stmt->column_count = num_sqlda.sqld;
S->named_params = np;
@@ -568,7 +566,7 @@ static int firebird_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_
stmt->methods = &firebird_stmt_methods;
stmt->supports_placeholders = PDO_PLACEHOLDER_POSITIONAL;
- return 1;
+ return true;
} while (0);
@@ -584,12 +582,12 @@ static int firebird_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_
efree(S);
}
- return 0;
+ return false;
}
/* }}} */
/* called by PDO to execute a statement that doesn't produce a result set */
-static zend_long firebird_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_len) /* {{{ */
+static zend_long firebird_handle_doer(pdo_dbh_t *dbh, const zend_string *sql) /* {{{ */
{
pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
isc_stmt_handle stmt = PDO_FIREBIRD_HANDLE_INITIALIZER;
@@ -604,7 +602,7 @@ static zend_long firebird_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sq
out_sqlda.sqln = 1;
/* allocate and prepare statement */
- if (!firebird_alloc_prepare_stmt(dbh, sql, sql_len, &out_sqlda, &stmt, 0)) {
+ if (!firebird_alloc_prepare_stmt(dbh, sql, &out_sqlda, &stmt, 0)) {
return -1;
}
@@ -651,30 +649,29 @@ free_statement:
/* }}} */
/* called by the PDO SQL parser to add quotes to values that are copied into SQL */
-static int firebird_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unquotedlen, /* {{{ */
- char **quoted, size_t *quotedlen, enum pdo_param_type paramtype)
+static zend_string* firebird_handle_quoter(pdo_dbh_t *dbh, const zend_string *unquoted, enum pdo_param_type paramtype)
{
int qcount = 0;
char const *co, *l, *r;
char *c;
+ size_t quotedlen;
+ zend_string *quoted_str;
- if (!unquotedlen) {
- *quotedlen = 2;
- *quoted = emalloc(*quotedlen+1);
- strcpy(*quoted, "''");
- return 1;
+ if (ZSTR_LEN(unquoted) == 0) {
+ return zend_string_init("''", 2, 0);
}
/* Firebird only requires single quotes to be doubled if string lengths are used */
/* count the number of ' characters */
- for (co = unquoted; (co = strchr(co,'\'')); qcount++, co++);
+ for (co = ZSTR_VAL(unquoted); (co = strchr(co,'\'')); qcount++, co++);
- *quotedlen = unquotedlen + qcount + 2;
- *quoted = c = emalloc(*quotedlen+1);
+ quotedlen = ZSTR_LEN(unquoted) + qcount + 2;
+ quoted_str = zend_string_alloc(quotedlen, 0);
+ c = ZSTR_VAL(quoted_str);
*c++ = '\'';
/* foreach (chunk that ends in a quote) */
- for (l = unquoted; (r = strchr(l,'\'')); l = r+1) {
+ for (l = ZSTR_VAL(unquoted); (r = strchr(l,'\'')); l = r+1) {
strncpy(c, l, r-l+1);
c += (r-l+1);
/* add the second quote */
@@ -682,16 +679,16 @@ static int firebird_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t u
}
/* copy the remainder */
- strncpy(c, l, *quotedlen-(c-*quoted)-1);
- (*quoted)[*quotedlen-1] = '\'';
- (*quoted)[*quotedlen] = '\0';
+ strncpy(c, l, quotedlen-(c-ZSTR_VAL(quoted_str))-1);
+ ZSTR_VAL(quoted_str)[quotedlen-1] = '\'';
+ ZSTR_VAL(quoted_str)[quotedlen] = '\0';
- return 1;
+ return quoted_str;
}
/* }}} */
/* called by PDO to start a transaction */
-static int firebird_handle_begin(pdo_dbh_t *dbh) /* {{{ */
+static bool firebird_handle_begin(pdo_dbh_t *dbh) /* {{{ */
{
pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
char tpb[8] = { isc_tpb_version3 }, *ptpb = tpb+1;
@@ -737,47 +734,47 @@ static int firebird_handle_begin(pdo_dbh_t *dbh) /* {{{ */
#endif
if (isc_start_transaction(H->isc_status, &H->tr, 1, &H->db, (unsigned short)(ptpb-tpb), tpb)) {
RECORD_ERROR(dbh);
- return 0;
+ return false;
}
- return 1;
+ return true;
}
/* }}} */
/* called by PDO to commit a transaction */
-static int firebird_handle_commit(pdo_dbh_t *dbh) /* {{{ */
+static bool firebird_handle_commit(pdo_dbh_t *dbh) /* {{{ */
{
pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
if (isc_commit_transaction(H->isc_status, &H->tr)) {
RECORD_ERROR(dbh);
- return 0;
+ return false;
}
- return 1;
+ return true;
}
/* }}} */
/* called by PDO to rollback a transaction */
-static int firebird_handle_rollback(pdo_dbh_t *dbh) /* {{{ */
+static bool firebird_handle_rollback(pdo_dbh_t *dbh) /* {{{ */
{
pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
if (isc_rollback_transaction(H->isc_status, &H->tr)) {
RECORD_ERROR(dbh);
- return 0;
+ return false;
}
- return 1;
+ return true;
}
/* }}} */
/* used by prepare and exec to allocate a statement handle and prepare the SQL */
-static int firebird_alloc_prepare_stmt(pdo_dbh_t *dbh, const char *sql, size_t sql_len, /* {{{ */
+static int firebird_alloc_prepare_stmt(pdo_dbh_t *dbh, const zend_string *sql,
XSQLDA *out_sqlda, isc_stmt_handle *s, HashTable *named_params)
{
pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
char *new_sql;
/* Firebird allows SQL statements up to 64k, so bail if it doesn't fit */
- if (sql_len > 65536) {
+ if (ZSTR_LEN(sql) > 65536) {
strcpy(dbh->error_code, "01004");
return 0;
}
@@ -789,7 +786,7 @@ static int firebird_alloc_prepare_stmt(pdo_dbh_t *dbh, const char *sql, size_t s
if (!firebird_handle_begin(dbh)) {
return 0;
}
- dbh->in_txn = 1;
+ dbh->in_txn = true;
}
/* allocate the statement */
@@ -800,11 +797,11 @@ static int firebird_alloc_prepare_stmt(pdo_dbh_t *dbh, const char *sql, size_t s
/* in order to support named params, which Firebird itself doesn't,
we need to replace :foo by ?, and store the name we just replaced */
- new_sql = emalloc(sql_len+1);
+ new_sql = emalloc(ZSTR_LEN(sql)+1);
new_sql[0] = '\0';
- if (!preprocess(sql, sql_len, new_sql, named_params)) {
+ if (!preprocess(sql, new_sql, named_params)) {
strcpy(dbh->error_code, "07000");
- efree(new_sql);
+ efree(new_sql);
return 0;
}
@@ -818,17 +815,19 @@ static int firebird_alloc_prepare_stmt(pdo_dbh_t *dbh, const char *sql, size_t s
efree(new_sql);
return 1;
}
-/* }}} */
/* called by PDO to set a driver-specific dbh attribute */
-static int firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /* {{{ */
+static bool firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /* {{{ */
{
pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
+ bool bval;
switch (attr) {
case PDO_ATTR_AUTOCOMMIT:
{
- zend_bool bval = zval_get_long(val)? 1 : 0;
+ if (!pdo_get_bool_param(&bval, val)) {
+ return false;
+ }
/* ignore if the new value equals the old one */
if (dbh->auto_commit ^ bval) {
@@ -837,29 +836,32 @@ static int firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *v
/* turning on auto_commit with an open transaction is illegal, because
we won't know what to do with it */
H->last_app_error = "Cannot enable auto-commit while a transaction is already open";
- return 0;
+ return false;
} else {
/* close the transaction */
if (!firebird_handle_commit(dbh)) {
break;
}
- dbh->in_txn = 0;
+ dbh->in_txn = false;
}
}
dbh->auto_commit = bval;
}
}
- return 1;
+ return true;
case PDO_ATTR_FETCH_TABLE_NAMES:
- H->fetch_table_names = zval_get_long(val)? 1 : 0;
- return 1;
+ if (!pdo_get_bool_param(&bval, val)) {
+ return false;
+ }
+ H->fetch_table_names = bval;
+ return true;
case PDO_FB_ATTR_DATE_FORMAT:
{
zend_string *str = zval_try_get_string(val);
if (UNEXPECTED(!str)) {
- return 0;
+ return false;
}
if (H->date_format) {
efree(H->date_format);
@@ -867,13 +869,13 @@ static int firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *v
spprintf(&H->date_format, 0, "%s", ZSTR_VAL(str));
zend_string_release_ex(str, 0);
}
- return 1;
+ return true;
case PDO_FB_ATTR_TIME_FORMAT:
{
zend_string *str = zval_try_get_string(val);
if (UNEXPECTED(!str)) {
- return 0;
+ return false;
}
if (H->time_format) {
efree(H->time_format);
@@ -881,13 +883,13 @@ static int firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *v
spprintf(&H->time_format, 0, "%s", ZSTR_VAL(str));
zend_string_release_ex(str, 0);
}
- return 1;
+ return true;
case PDO_FB_ATTR_TIMESTAMP_FORMAT:
{
zend_string *str = zval_try_get_string(val);
if (UNEXPECTED(!str)) {
- return 0;
+ return false;
}
if (H->timestamp_format) {
efree(H->timestamp_format);
@@ -895,9 +897,9 @@ static int firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *v
spprintf(&H->timestamp_format, 0, "%s", ZSTR_VAL(str));
zend_string_release_ex(str, 0);
}
- return 1;
+ return true;
}
- return 0;
+ return false;
}
/* }}} */
@@ -970,7 +972,7 @@ static int firebird_handle_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *v
/* }}} */
/* called by PDO to retrieve driver-specific information about an error that has occurred */
-static int pdo_firebird_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) /* {{{ */
+static void pdo_firebird_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) /* {{{ */
{
pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
const ISC_STATUS *s = H->isc_status;
@@ -989,7 +991,6 @@ static int pdo_firebird_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval
add_next_index_long(info, -999);
add_next_index_string(info, const_cast(H->last_app_error));
}
- return 1;
}
/* }}} */
@@ -1005,7 +1006,11 @@ static const struct pdo_dbh_methods firebird_methods = { /* {{{ */
NULL, /* last_id not supported */
pdo_firebird_fetch_error_func,
firebird_handle_get_attribute,
- NULL /* check_liveness */
+ NULL, /* check_liveness */
+ NULL, /* get driver methods */
+ NULL, /* request shutdown */
+ NULL, /* in transaction, use PDO's internal tracking mechanism */
+ NULL /* get gc */
};
/* }}} */
@@ -1081,7 +1086,7 @@ static int pdo_firebird_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /*
char errmsg[512];
const ISC_STATUS *s = H->isc_status;
fb_interpret(errmsg, sizeof(errmsg),&s);
- zend_throw_exception_ex(php_pdo_get_exception(), H->isc_status[1], "SQLSTATE[%s] [%d] %s",
+ zend_throw_exception_ex(php_pdo_get_exception(), H->isc_status[1], "SQLSTATE[%s] [%ld] %s",
"HY000", H->isc_status[1], errmsg);
}
diff --git a/ext/pdo_firebird/firebird_statement.c b/ext/pdo_firebird/firebird_statement.c
index 105d5a3587..7fad08e2ad 100644
--- a/ext/pdo_firebird/firebird_statement.c
+++ b/ext/pdo_firebird/firebird_statement.c
@@ -49,7 +49,7 @@ static void free_sqlda(XSQLDA const *sqlda) /* {{{ */
static int firebird_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */
{
pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data;
- int result = 1, i;
+ int result = 1;
/* release the statement */
if (isc_dsql_free_statement(S->H->isc_status, &S->stmt, DSQL_drop)) {
@@ -57,14 +57,6 @@ static int firebird_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */
result = 0;
}
- /* clean up the fetch buffers if they have been used */
- for (i = 0; i < S->out_sqlda.sqld; ++i) {
- if (S->fetch_buf[i]) {
- efree(S->fetch_buf[i]);
- }
- }
- efree(S->fetch_buf);
-
zend_hash_destroy(S->named_params);
FREE_HASHTABLE(S->named_params);
@@ -219,8 +211,18 @@ static int firebird_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */
memmove(cp, var->aliasname, var->aliasname_length);
*(cp+var->aliasname_length) = '\0';
+ return 1;
+}
+/* }}} */
+
+static int firebird_stmt_get_column_meta(pdo_stmt_t *stmt, zend_long colno, zval *return_value)
+{
+ pdo_firebird_stmt *S = (pdo_firebird_stmt *) stmt->driver_data;
+ XSQLVAR *var = &S->out_sqlda.sqlvar[colno];
+
+ enum pdo_param_type param_type;
if (var->sqlscale < 0) {
- col->param_type = PDO_PARAM_STR;
+ param_type = PDO_PARAM_STR;
} else {
switch (var->sqltype & ~1) {
case SQL_SHORT:
@@ -228,31 +230,26 @@ static int firebird_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */
#if SIZEOF_ZEND_LONG >= 8
case SQL_INT64:
#endif
- col->param_type = PDO_PARAM_INT;
+ param_type = PDO_PARAM_INT;
break;
#ifdef SQL_BOOLEAN
case SQL_BOOLEAN:
- col->param_type = PDO_PARAM_BOOL;
+ param_type = PDO_PARAM_BOOL;
break;
#endif
default:
- col->param_type = PDO_PARAM_STR;
+ param_type = PDO_PARAM_STR;
break;
}
}
+ array_init(return_value);
+ add_assoc_long(return_value, "pdo_type", param_type);
return 1;
}
-/* }}} */
-
-#define FETCH_BUF(buf,type,len,lenvar) ((buf) = (buf) ? (buf) : \
- emalloc((len) ? (len * sizeof(type)) : ((*(unsigned long*)lenvar) = sizeof(type))))
-
-#define CHAR_BUF_LEN 24
/* fetch a blob into a fetch buffer */
-static int firebird_fetch_blob(pdo_stmt_t *stmt, int colno, char **ptr, /* {{{ */
- zend_ulong *len, ISC_QUAD *blob_id)
+static int firebird_fetch_blob(pdo_stmt_t *stmt, int colno, zval *result, ISC_QUAD *blob_id)
{
pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data;
pdo_firebird_db_handle *H = S->H;
@@ -260,7 +257,8 @@ static int firebird_fetch_blob(pdo_stmt_t *stmt, int colno, char **ptr, /* {{{ *
char const bl_item = isc_info_blob_total_length;
char bl_info[20];
unsigned short i;
- int result = *len = 0;
+ int retval = 0;
+ size_t len = 0;
if (isc_open_blob(H->isc_status, &H->db, &H->tr, &blobh, blob_id)) {
RECORD_ERROR(stmt);
@@ -287,7 +285,7 @@ static int firebird_fetch_blob(pdo_stmt_t *stmt, int colno, char **ptr, /* {{{ *
item_len = (unsigned short) isc_vax_integer(&bl_info[i], 2);
if (item == isc_info_blob_total_length) {
- *len = isc_vax_integer(&bl_info[i+2], item_len);
+ len = isc_vax_integer(&bl_info[i+2], item_len);
break;
}
i += item_len+2;
@@ -295,49 +293,47 @@ static int firebird_fetch_blob(pdo_stmt_t *stmt, int colno, char **ptr, /* {{{ *
/* we've found the blob's length, now fetch! */
- if (*len) {
+ if (len) {
zend_ulong cur_len;
unsigned short seg_len;
ISC_STATUS stat;
+ zend_string *str = zend_string_alloc(len, 0);
- *ptr = S->fetch_buf[colno] = erealloc(S->fetch_buf[colno], *len+1);
-
- for (cur_len = stat = 0; (!stat || stat == isc_segment) && cur_len < *len; cur_len += seg_len) {
+ for (cur_len = stat = 0; (!stat || stat == isc_segment) && cur_len < len; cur_len += seg_len) {
- unsigned short chunk_size = (*len-cur_len) > USHRT_MAX ? USHRT_MAX
- : (unsigned short)(*len-cur_len);
+ unsigned short chunk_size = (len - cur_len) > USHRT_MAX ? USHRT_MAX
+ : (unsigned short)(len - cur_len);
- stat = isc_get_segment(H->isc_status, &blobh, &seg_len, chunk_size, &(*ptr)[cur_len]);
+ stat = isc_get_segment(H->isc_status, &blobh, &seg_len, chunk_size, ZSTR_VAL(str) + cur_len);
}
- (*ptr)[*len++] = '\0';
+ ZSTR_VAL(str)[len] = '\0';
+ ZVAL_STR(result, str);
if (H->isc_status[0] == 1 && (stat != 0 && stat != isc_segstr_eof && stat != isc_segment)) {
H->last_app_error = "Error reading from BLOB";
goto fetch_blob_end;
}
}
- result = 1;
+ retval = 1;
fetch_blob_end:
if (isc_close_blob(H->isc_status, &blobh)) {
RECORD_ERROR(stmt);
return 0;
}
- return result;
+ return retval;
}
/* }}} */
-static int firebird_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, /* {{{ */
- zend_ulong *len, int *caller_frees)
+static int firebird_stmt_get_col(
+ pdo_stmt_t *stmt, int colno, zval *result, enum pdo_param_type *type)
{
pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data;
XSQLVAR const *var = &S->out_sqlda.sqlvar[colno];
if (*var->sqlind == -1) {
- /* A NULL value */
- *ptr = NULL;
- *len = 0;
+ ZVAL_NULL(result);
} else {
if (var->sqlscale < 0) {
static ISC_INT64 const scales[] = { 1, 10, 100, 1000,
@@ -358,6 +354,7 @@ static int firebird_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, /* {{
LL_LIT(1000000000000000000)
};
ISC_INT64 n, f = scales[-var->sqlscale];
+ zend_string *str;
switch (var->sqltype & ~1) {
case SQL_SHORT:
@@ -368,67 +365,57 @@ static int firebird_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, /* {{
break;
case SQL_INT64:
n = *(ISC_INT64*)var->sqldata;
+ break;
+ EMPTY_SWITCH_DEFAULT_CASE()
}
- *ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
-
if ((var->sqltype & ~1) == SQL_DOUBLE) {
- *len = slprintf(*ptr, CHAR_BUF_LEN, "%.*F", -var->sqlscale, *(double*)var->sqldata);
+ str = zend_strpprintf(0, "%.*F", -var->sqlscale, *(double*)var->sqldata);
} else if (n >= 0) {
- *len = slprintf(*ptr, CHAR_BUF_LEN, "%" LL_MASK "d.%0*" LL_MASK "d",
+ str = zend_strpprintf(0, "%" LL_MASK "d.%0*" LL_MASK "d",
n / f, -var->sqlscale, n % f);
} else if (n <= -f) {
- *len = slprintf(*ptr, CHAR_BUF_LEN, "%" LL_MASK "d.%0*" LL_MASK "d",
+ str = zend_strpprintf(0, "%" LL_MASK "d.%0*" LL_MASK "d",
n / f, -var->sqlscale, -n % f);
} else {
- *len = slprintf(*ptr, CHAR_BUF_LEN, "-0.%0*" LL_MASK "d", -var->sqlscale, -n % f);
+ str = zend_strpprintf(0, "-0.%0*" LL_MASK "d", -var->sqlscale, -n % f);
}
+ ZVAL_STR(result, str);
} else {
switch (var->sqltype & ~1) {
struct tm t;
char *fmt;
case SQL_VARYING:
- *ptr = &var->sqldata[2];
- *len = *(short*)var->sqldata;
+ ZVAL_STRINGL_FAST(result, &var->sqldata[2], *(short*)var->sqldata);
break;
case SQL_TEXT:
- *ptr = var->sqldata;
- *len = var->sqllen;
+ ZVAL_STRINGL_FAST(result, var->sqldata, var->sqllen);
break;
case SQL_SHORT:
- *len = sizeof(zend_long);
- *ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL);
- *(zend_long *)*ptr = *(short*)var->sqldata;
+ ZVAL_LONG(result, *(short*)var->sqldata);
break;
case SQL_LONG:
- *len = sizeof(zend_long);
- *ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL);
- *(zend_long *)*ptr = *(ISC_LONG*)var->sqldata;
+ ZVAL_LONG(result, *(ISC_LONG*)var->sqldata);
break;
case SQL_INT64:
#if SIZEOF_ZEND_LONG >= 8
- *len = sizeof(zend_long);
- *ptr = FETCH_BUF(S->fetch_buf[colno], zend_long, 1, NULL);
- *(zend_long *)*ptr = *(ISC_INT64*)var->sqldata;
+ ZVAL_LONG(result, *(ISC_INT64*)var->sqldata);
#else
- *ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
- *len = slprintf(*ptr, CHAR_BUF_LEN, "%" LL_MASK "d", *(ISC_INT64*)var->sqldata);
+ ZVAL_STR(result, zend_strpprintf(0, "%" LL_MASK "d", *(ISC_INT64*)var->sqldata));
#endif
break;
case SQL_FLOAT:
- *ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
- *len = slprintf(*ptr, CHAR_BUF_LEN, "%F", *(float*)var->sqldata);
+ /* TODO: Why is this not returned as the native type? */
+ ZVAL_STR(result, zend_strpprintf(0, "%F", *(float*)var->sqldata));
break;
case SQL_DOUBLE:
- *ptr = FETCH_BUF(S->fetch_buf[colno], char, CHAR_BUF_LEN, NULL);
- *len = slprintf(*ptr, CHAR_BUF_LEN, "%F" , *(double*)var->sqldata);
+ /* TODO: Why is this not returned as the native type? */
+ ZVAL_STR(result, zend_strpprintf(0, "%F", *(double*)var->sqldata));
break;
#ifdef SQL_BOOLEAN
case SQL_BOOLEAN:
- *len = sizeof(zend_bool);
- *ptr = FETCH_BUF(S->fetch_buf[colno], zend_bool, 1, NULL);
- *(zend_bool*)*ptr = *(FB_BOOLEAN*)var->sqldata;
+ ZVAL_BOOL(result, *(FB_BOOLEAN*)var->sqldata);
break;
#endif
case SQL_TYPE_DATE:
@@ -444,19 +431,17 @@ static int firebird_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, /* {{
fmt = S->H->timestamp_format ? S->H->timestamp_format : PDO_FB_DEF_TIMESTAMP_FMT;
}
/* convert the timestamp into a string */
- *len = 80;
- *ptr = FETCH_BUF(S->fetch_buf[colno], char, *len, NULL);
- *len = strftime(*ptr, *len, fmt, &t);
+ char buf[80];
+ size_t len = strftime(buf, sizeof(buf), fmt, &t);
+ ZVAL_STRINGL(result, buf, len);
break;
case SQL_BLOB:
- return firebird_fetch_blob(stmt,colno,ptr,len,
- (ISC_QUAD*)var->sqldata);
+ return firebird_fetch_blob(stmt, colno, result, (ISC_QUAD*)var->sqldata);
}
}
}
return 1;
}
-/* }}} */
static int firebird_bind_blob(pdo_stmt_t *stmt, ISC_QUAD *blob_id, zval *param)
{
@@ -548,9 +533,6 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
var = &sqlda->sqlvar[param->paramno];
switch (event_type) {
- char *value;
- zend_ulong value_len;
- int caller_frees;
zval *parameter;
case PDO_PARAM_EVT_ALLOC:
@@ -726,9 +708,6 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
if (param->is_param) {
break;
}
- value = NULL;
- value_len = 0;
- caller_frees = 0;
if (Z_ISREF(param->parameter)) {
parameter = Z_REFVAL(param->parameter);
} else {
@@ -736,37 +715,7 @@ static int firebird_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_dat
}
zval_ptr_dtor(parameter);
ZVAL_NULL(parameter);
-
- if (firebird_stmt_get_col(stmt, param->paramno, &value, &value_len, &caller_frees)) {
- switch (PDO_PARAM_TYPE(param->param_type)) {
- case PDO_PARAM_STR:
- if (value) {
- ZVAL_STRINGL(parameter, value, value_len);
- break;
- }
- case PDO_PARAM_INT:
- if (value) {
- ZVAL_LONG(parameter, *(zend_long*)value);
- break;
- }
- case PDO_PARAM_EVT_NORMALIZE:
- if (!param->is_param) {
- char *s = ZSTR_VAL(param->name);
- while (*s != '\0') {
- *s = toupper(*s);
- s++;
- }
- }
- break;
- default:
- ZVAL_NULL(parameter);
- }
- if (value && caller_frees) {
- efree(value);
- }
- return 1;
- }
- return 0;
+ return firebird_stmt_get_col(stmt, param->paramno, parameter, NULL);
default:
;
}
@@ -841,7 +790,7 @@ const struct pdo_stmt_methods firebird_stmt_methods = { /* {{{ */
firebird_stmt_param_hook,
firebird_stmt_set_attribute,
firebird_stmt_get_attribute,
- NULL, /* get_column_meta_func */
+ firebird_stmt_get_column_meta,
NULL, /* next_rowset_func */
firebird_stmt_cursor_closer
};
diff --git a/ext/pdo_firebird/pdo_firebird.c b/ext/pdo_firebird/pdo_firebird.c
index e1a9bef643..29b8bc85a7 100644
--- a/ext/pdo_firebird/pdo_firebird.c
+++ b/ext/pdo_firebird/pdo_firebird.c
@@ -58,7 +58,14 @@ PHP_MINIT_FUNCTION(pdo_firebird) /* {{{ */
REGISTER_PDO_CLASS_CONST_LONG("FB_ATTR_TIME_FORMAT", (zend_long) PDO_FB_ATTR_TIME_FORMAT);
REGISTER_PDO_CLASS_CONST_LONG("FB_ATTR_TIMESTAMP_FORMAT", (zend_long) PDO_FB_ATTR_TIMESTAMP_FORMAT);
- php_pdo_register_driver(&pdo_firebird_driver);
+ if (FAILURE == php_pdo_register_driver(&pdo_firebird_driver)) {
+ return FAILURE;
+ }
+
+#ifdef ZEND_SIGNALS
+ /* firebird replaces some signals at runtime, suppress warnings. */
+ SIGG(check) = 0;
+#endif
return SUCCESS;
}
diff --git a/ext/pdo_firebird/php_pdo_firebird_int.h b/ext/pdo_firebird/php_pdo_firebird_int.h
index 094767fa35..f0ba0d08b4 100644
--- a/ext/pdo_firebird/php_pdo_firebird_int.h
+++ b/ext/pdo_firebird/php_pdo_firebird_int.h
@@ -34,12 +34,11 @@
#define SHORT_MAX (1 << (8*sizeof(short)-1))
#if SIZEOF_ZEND_LONG == 8 && !defined(PHP_WIN32)
-# define LL_MASK "l"
# define LL_LIT(lit) lit ## L
#else
-# define LL_MASK "ll"
# define LL_LIT(lit) lit ## LL
#endif
+#define LL_MASK "ll"
/* Firebird API has a couple of missing const decls in its API */
#define const_cast(s) ((char*)(s))
@@ -114,9 +113,6 @@ typedef struct {
/* the named params that were converted to ?'s by the driver */
HashTable *named_params;
- /* allocated space to convert fields values to other types */
- char **fetch_buf;
-
/* the input SQLDA */
XSQLDA *in_sqlda;
diff --git a/ext/pdo_firebird/tests/CONFLICTS b/ext/pdo_firebird/tests/CONFLICTS
new file mode 100644
index 0000000000..4667cdfa07
--- /dev/null
+++ b/ext/pdo_firebird/tests/CONFLICTS
@@ -0,0 +1 @@
+firebird
diff --git a/ext/pdo_firebird/tests/bug_72583.phpt b/ext/pdo_firebird/tests/bug_72583.phpt
index 87bc481fdc..9df4c3e915 100644
--- a/ext/pdo_firebird/tests/bug_72583.phpt
+++ b/ext/pdo_firebird/tests/bug_72583.phpt
@@ -6,8 +6,7 @@ PDO_Firebird: Feature 72583 Fetch integers as php integers not as strings
<?php
require 'testdb.inc';
-@$dbh->exec('drop table atable');
-$dbh->exec('create table atable (aint integer, asmi smallint)');
+$dbh->exec('recreate table atable (aint integer, asmi smallint)');
$dbh->exec('insert into atable values (1, -1)');
$S = $dbh->prepare('select aint, asmi from atable');
$S->execute();
diff --git a/ext/pdo_firebird/tests/bug_72931.phpt b/ext/pdo_firebird/tests/bug_72931.phpt
index 56270ba984..5e2e849ba4 100644
--- a/ext/pdo_firebird/tests/bug_72931.phpt
+++ b/ext/pdo_firebird/tests/bug_72931.phpt
@@ -6,8 +6,7 @@ PDO_Firebird: Bug 72931 Insert returning fails on Firebird 3
<?php
require 'testdb.inc';
-@$dbh->exec('drop table tablea');
-$dbh->exec('create table tablea (id integer)');
+$dbh->exec('recreate table tablea (id integer)');
$S = $dbh->prepare('insert into tablea (id) values (1) returning id');
$S->execute();
$D = $S->fetch(PDO::FETCH_NUM);
diff --git a/ext/pdo_firebird/tests/bug_73087.phpt b/ext/pdo_firebird/tests/bug_73087.phpt
index cd3d90137e..fa642ff5c2 100644
--- a/ext/pdo_firebird/tests/bug_73087.phpt
+++ b/ext/pdo_firebird/tests/bug_73087.phpt
@@ -6,8 +6,7 @@ PDO_Firebird: bug 73087 segfault binding blob parameter
<?php
require 'testdb.inc';
-@$dbh->exec('drop table atable');
-$dbh->exec('create table atable (id integer not null, content blob sub_type 1 segment size 80)');
+$dbh->exec('recreate table atable (id integer not null, content blob sub_type 1 segment size 80)');
$S = $dbh->prepare('insert into atable (id, content) values (:id, :content)');
for ($I = 1; $I < 10; $I++) {
$Params = [
diff --git a/ext/pdo_firebird/tests/bug_74462.phpt b/ext/pdo_firebird/tests/bug_74462.phpt
index fe97a1fc19..913b1b89db 100644
--- a/ext/pdo_firebird/tests/bug_74462.phpt
+++ b/ext/pdo_firebird/tests/bug_74462.phpt
@@ -6,8 +6,7 @@ PDO_Firebird: Bug #74462 Returns only NULLs for boolean fields
<?php
require 'testdb.inc';
-@$dbh->exec('drop table atable');
-$dbh->exec('create table atable (id integer not null, abool boolean)');
+$dbh->exec('recreate table atable (id integer not null, abool boolean)');
$dbh->exec('insert into atable (id, abool) values (1, true)');
$dbh->exec('insert into atable (id, abool) values (2, false)');
$dbh->exec('insert into atable (id, abool) values (3, null)');
diff --git a/ext/pdo_mysql/config.w32 b/ext/pdo_mysql/config.w32
index 8b5577273d..48e47f7871 100644
--- a/ext/pdo_mysql/config.w32
+++ b/ext/pdo_mysql/config.w32
@@ -10,7 +10,10 @@ if (PHP_PDO_MYSQL != "no") {
ADD_EXTENSION_DEP('pdo_mysql', 'pdo');
} else {
if (CHECK_LIB("libmysql.lib", "pdo_mysql", PHP_PDO_MYSQL) &&
- CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_PDO_MYSQL", PHP_PHP_BUILD + "\\include\\mysql;" + PHP_PDO_MYSQL)) {
+ CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_PDO_MYSQL",
+ PHP_PDO_MYSQL + "\\include;" +
+ PHP_PHP_BUILD + "\\include\\mysql;" +
+ PHP_PDO_MYSQL)) {
EXTENSION("pdo_mysql", "pdo_mysql.c mysql_driver.c mysql_statement.c", null, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
} else {
WARNING("pdo_mysql not enabled; libraries and headers not found");
diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c
index 980a285c0d..7bc0cbcf0a 100644
--- a/ext/pdo_mysql/mysql_driver.c
+++ b/ext/pdo_mysql/mysql_driver.c
@@ -117,7 +117,7 @@ int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int lin
/* }}} */
/* {{{ pdo_mysql_fetch_error_func */
-static int pdo_mysql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info)
+static void pdo_mysql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info)
{
pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data;
pdo_mysql_error_info *einfo = &H->einfo;
@@ -136,12 +136,12 @@ static int pdo_mysql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *in
add_next_index_string(info, einfo->errmsg);
}
- PDO_DBG_RETURN(1);
+ PDO_DBG_VOID_RETURN;
}
/* }}} */
/* {{{ mysql_handle_closer */
-static int mysql_handle_closer(pdo_dbh_t *dbh)
+static void mysql_handle_closer(pdo_dbh_t *dbh)
{
pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data;
@@ -157,23 +157,21 @@ static int mysql_handle_closer(pdo_dbh_t *dbh)
pefree(H, dbh->is_persistent);
dbh->driver_data = NULL;
}
- PDO_DBG_RETURN(0);
}
/* }}} */
/* {{{ mysql_handle_preparer */
-static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options)
+static bool mysql_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options)
{
pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data;
pdo_mysql_stmt *S = ecalloc(1, sizeof(pdo_mysql_stmt));
- char *nsql = NULL;
- size_t nsql_len = 0;
+ zend_string *nsql = NULL;
int ret;
int server_version;
PDO_DBG_ENTER("mysql_handle_preparer");
PDO_DBG_INF_FMT("dbh=%p", dbh);
- PDO_DBG_INF_FMT("sql=%.*s", (int)sql_len, sql);
+ PDO_DBG_INF_FMT("sql=%.*s", ZSTR_LEN(sql), ZSTR_VAL(sql));
S->H = H;
stmt->driver_data = S;
@@ -188,29 +186,28 @@ static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len
goto fallback;
}
stmt->supports_placeholders = PDO_PLACEHOLDER_POSITIONAL;
- ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len);
+ ret = pdo_parse_params(stmt, sql, &nsql);
if (ret == 1) {
/* query was rewritten */
sql = nsql;
- sql_len = nsql_len;
} else if (ret == -1) {
/* failed to parse */
strcpy(dbh->error_code, stmt->error_code);
- PDO_DBG_RETURN(0);
+ PDO_DBG_RETURN(false);
}
if (!(S->stmt = mysql_stmt_init(H->server))) {
pdo_mysql_error(dbh);
if (nsql) {
- efree(nsql);
+ zend_string_release(nsql);
}
- PDO_DBG_RETURN(0);
+ PDO_DBG_RETURN(false);
}
- if (mysql_stmt_prepare(S->stmt, sql, sql_len)) {
+ if (mysql_stmt_prepare(S->stmt, ZSTR_VAL(sql), ZSTR_LEN(sql))) {
if (nsql) {
- efree(nsql);
+ zend_string_release(nsql);
}
/* TODO: might need to pull statement specific info here? */
/* if the query isn't supported by the protocol, fallback to emulation */
@@ -220,10 +217,10 @@ static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len
goto fallback;
}
pdo_mysql_error(dbh);
- PDO_DBG_RETURN(0);
+ PDO_DBG_RETURN(false);
}
if (nsql) {
- efree(nsql);
+ zend_string_release(nsql);
}
S->num_params = mysql_stmt_param_count(S->stmt);
@@ -241,25 +238,25 @@ static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len
S->max_length = pdo_attr_lval(driver_options, PDO_ATTR_MAX_COLUMN_LEN, 0);
- PDO_DBG_RETURN(1);
+ PDO_DBG_RETURN(true);
fallback:
end:
stmt->supports_placeholders = PDO_PLACEHOLDER_NONE;
- PDO_DBG_RETURN(1);
+ PDO_DBG_RETURN(true);
}
/* }}} */
/* {{{ mysql_handle_doer */
-static zend_long mysql_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_len)
+static zend_long mysql_handle_doer(pdo_dbh_t *dbh, const zend_string *sql)
{
pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data;
PDO_DBG_ENTER("mysql_handle_doer");
PDO_DBG_INF_FMT("dbh=%p", dbh);
- PDO_DBG_INF_FMT("sql=%.*s", (int)sql_len, sql);
+ PDO_DBG_INF_FMT("sql=%.*s", (int)ZSTR_LEN(sql), ZSTR_VAL(sql));
- if (mysql_real_query(H->server, sql, sql_len)) {
+ if (mysql_real_query(H->server, ZSTR_VAL(sql), ZSTR_LEN(sql))) {
pdo_mysql_error(dbh);
PDO_DBG_RETURN(-1);
} else {
@@ -288,13 +285,11 @@ static zend_long mysql_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_l
/* }}} */
/* {{{ pdo_mysql_last_insert_id */
-static char *pdo_mysql_last_insert_id(pdo_dbh_t *dbh, const char *name, size_t *len)
+static zend_string *pdo_mysql_last_insert_id(pdo_dbh_t *dbh, const zend_string *name)
{
pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data;
- char *id = php_pdo_int64_to_str(mysql_insert_id(H->server));
PDO_DBG_ENTER("pdo_mysql_last_insert_id");
- *len = strlen(id);
- PDO_DBG_RETURN(id);
+ PDO_DBG_RETURN(php_pdo_int64_to_str(mysql_insert_id(H->server)));
}
/* }}} */
@@ -304,10 +299,13 @@ static char *pdo_mysql_last_insert_id(pdo_dbh_t *dbh, const char *name, size_t *
#endif
/* {{{ mysql_handle_quoter */
-static int mysql_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unquotedlen, char **quoted, size_t *quotedlen, enum pdo_param_type paramtype )
+static zend_string* mysql_handle_quoter(pdo_dbh_t *dbh, const zend_string *unquoted, enum pdo_param_type paramtype )
{
pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data;
- zend_bool use_national_character_set = 0;
+ bool use_national_character_set = 0;
+ char *quoted;
+ size_t quotedlen;
+ zend_string *quoted_str;
if (H->assume_national_character_set_strings) {
use_national_character_set = 1;
@@ -321,59 +319,69 @@ static int mysql_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unqu
PDO_DBG_ENTER("mysql_handle_quoter");
PDO_DBG_INF_FMT("dbh=%p", dbh);
- PDO_DBG_INF_FMT("unquoted=%.*s", (int)unquotedlen, unquoted);
- *quoted = safe_emalloc(2, unquotedlen, 3 + (use_national_character_set ? 1 : 0));
+ PDO_DBG_INF_FMT("unquoted=%.*s", (int)ZSTR_LEN(unquoted), ZSTR_VAL(unquoted));
+ quoted = safe_emalloc(2, ZSTR_LEN(unquoted), 3 + (use_national_character_set ? 1 : 0));
if (use_national_character_set) {
- *quotedlen = mysql_real_escape_string_quote(H->server, *quoted + 2, unquoted, unquotedlen, '\'');
- (*quoted)[0] = 'N';
- (*quoted)[1] = '\'';
+ quotedlen = mysql_real_escape_string_quote(H->server, quoted + 2, ZSTR_VAL(unquoted), ZSTR_LEN(unquoted), '\'');
+ quoted[0] = 'N';
+ quoted[1] = '\'';
- ++*quotedlen; /* N prefix */
+ ++quotedlen; /* N prefix */
} else {
- *quotedlen = mysql_real_escape_string_quote(H->server, *quoted + 1, unquoted, unquotedlen, '\'');
- (*quoted)[0] = '\'';
+ quotedlen = mysql_real_escape_string_quote(H->server, quoted + 1, ZSTR_VAL(unquoted), ZSTR_LEN(unquoted), '\'');
+ quoted[0] = '\'';
}
- (*quoted)[++*quotedlen] = '\'';
- (*quoted)[++*quotedlen] = '\0';
- PDO_DBG_INF_FMT("quoted=%.*s", (int)*quotedlen, *quoted);
- PDO_DBG_RETURN(1);
+ quoted[++quotedlen] = '\'';
+ quoted[++quotedlen] = '\0';
+ PDO_DBG_INF_FMT("quoted=%.*s", (int)quotedlen, quoted);
+
+ quoted_str = zend_string_init(quoted, quotedlen, 0);
+ efree(quoted);
+ PDO_DBG_RETURN(quoted_str);
}
/* }}} */
/* {{{ mysql_handle_begin */
-static int mysql_handle_begin(pdo_dbh_t *dbh)
+static bool mysql_handle_begin(pdo_dbh_t *dbh)
{
+ zend_long return_value;
+ zend_string *command;
+
PDO_DBG_ENTER("mysql_handle_quoter");
PDO_DBG_INF_FMT("dbh=%p", dbh);
- PDO_DBG_RETURN(0 <= mysql_handle_doer(dbh, ZEND_STRL("START TRANSACTION")));
+
+ command = zend_string_init("START TRANSACTION", strlen("START TRANSACTION"), 0);
+ return_value = mysql_handle_doer(dbh, command);
+ zend_string_release_ex(command, 0);
+ PDO_DBG_RETURN(0 <= return_value);
}
/* }}} */
/* {{{ mysql_handle_commit */
-static int mysql_handle_commit(pdo_dbh_t *dbh)
+static bool mysql_handle_commit(pdo_dbh_t *dbh)
{
PDO_DBG_ENTER("mysql_handle_commit");
PDO_DBG_INF_FMT("dbh=%p", dbh);
if (mysql_commit(((pdo_mysql_db_handle *)dbh->driver_data)->server)) {
pdo_mysql_error(dbh);
- PDO_DBG_RETURN(0);
+ PDO_DBG_RETURN(false);
}
- PDO_DBG_RETURN(1);
+ PDO_DBG_RETURN(true);
}
/* }}} */
/* {{{ mysql_handle_rollback */
-static int mysql_handle_rollback(pdo_dbh_t *dbh)
+static bool mysql_handle_rollback(pdo_dbh_t *dbh)
{
PDO_DBG_ENTER("mysql_handle_rollback");
PDO_DBG_INF_FMT("dbh=%p", dbh);
if (mysql_rollback(((pdo_mysql_db_handle *)dbh->driver_data)->server)) {
pdo_mysql_error(dbh);
- PDO_DBG_RETURN(0);
+ PDO_DBG_RETURN(false);
}
- PDO_DBG_RETURN(1);
+ PDO_DBG_RETURN(true);
}
/* }}} */
@@ -392,45 +400,64 @@ static inline int mysql_handle_autocommit(pdo_dbh_t *dbh)
/* }}} */
/* {{{ pdo_mysql_set_attribute */
-static int pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
+static bool pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
{
- zend_long lval = zval_get_long(val);
- zend_bool bval = lval ? 1 : 0;
+ zend_long lval;
+ bool bval;
PDO_DBG_ENTER("pdo_mysql_set_attribute");
PDO_DBG_INF_FMT("dbh=%p", dbh);
PDO_DBG_INF_FMT("attr=%l", attr);
+
switch (attr) {
case PDO_ATTR_AUTOCOMMIT:
+ if (!pdo_get_bool_param(&bval, val)) {
+ return false;
+ }
/* ignore if the new value equals the old one */
if (dbh->auto_commit ^ bval) {
dbh->auto_commit = bval;
if (!mysql_handle_autocommit(dbh)) {
- PDO_DBG_RETURN(0);
+ PDO_DBG_RETURN(false);
}
}
- PDO_DBG_RETURN(1);
+ PDO_DBG_RETURN(true);
case PDO_ATTR_DEFAULT_STR_PARAM:
+ if (!pdo_get_long_param(&lval, val)) {
+ PDO_DBG_RETURN(false);
+ }
((pdo_mysql_db_handle *)dbh->driver_data)->assume_national_character_set_strings = lval == PDO_PARAM_STR_NATL;
- PDO_DBG_RETURN(1);
+ PDO_DBG_RETURN(true);
case PDO_MYSQL_ATTR_USE_BUFFERED_QUERY:
+ if (!pdo_get_bool_param(&bval, val)) {
+ return false;
+ }
/* ignore if the new value equals the old one */
((pdo_mysql_db_handle *)dbh->driver_data)->buffered = bval;
- PDO_DBG_RETURN(1);
+ PDO_DBG_RETURN(true);
case PDO_MYSQL_ATTR_DIRECT_QUERY:
case PDO_ATTR_EMULATE_PREPARES:
+ if (!pdo_get_bool_param(&bval, val)) {
+ return false;
+ }
/* ignore if the new value equals the old one */
((pdo_mysql_db_handle *)dbh->driver_data)->emulate_prepare = bval;
- PDO_DBG_RETURN(1);
+ PDO_DBG_RETURN(true);
case PDO_ATTR_FETCH_TABLE_NAMES:
+ if (!pdo_get_bool_param(&bval, val)) {
+ return false;
+ }
((pdo_mysql_db_handle *)dbh->driver_data)->fetch_table_names = bval;
- PDO_DBG_RETURN(1);
+ PDO_DBG_RETURN(true);
#ifndef PDO_USE_MYSQLND
case PDO_MYSQL_ATTR_MAX_BUFFER_SIZE:
+ if (!pdo_get_long_param(&lval, val)) {
+ PDO_DBG_RETURN(false);
+ }
if (lval < 0) {
/* TODO: Johannes, can we throw a warning here? */
((pdo_mysql_db_handle *)dbh->driver_data)->max_buffer_size = 1024*1024;
@@ -438,12 +465,12 @@ static int pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
} else {
((pdo_mysql_db_handle *)dbh->driver_data)->max_buffer_size = lval;
}
- PDO_DBG_RETURN(1);
+ PDO_DBG_RETURN(true);
break;
#endif
default:
- PDO_DBG_RETURN(0);
+ PDO_DBG_RETURN(false);
}
}
/* }}} */
@@ -513,6 +540,24 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_
ZVAL_BOOL(return_value, H->local_infile);
break;
+#if MYSQL_VERSION_ID >= 80021 || defined(PDO_USE_MYSQLND)
+ case PDO_MYSQL_ATTR_LOCAL_INFILE_DIRECTORY:
+ {
+ const char* local_infile_directory = NULL;
+#ifdef PDO_USE_MYSQLND
+ local_infile_directory = H->server->data->options->local_infile_directory;
+#else
+ mysql_get_option(H->server, MYSQL_OPT_LOAD_DATA_LOCAL_DIR, &local_infile_directory);
+#endif
+ if (local_infile_directory) {
+ ZVAL_STRING(return_value, local_infile_directory);
+ } else {
+ ZVAL_NULL(return_value);
+ }
+ break;
+ }
+#endif
+
default:
PDO_DBG_RETURN(0);
}
@@ -522,7 +567,7 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_
/* }}} */
/* {{{ pdo_mysql_check_liveness */
-static int pdo_mysql_check_liveness(pdo_dbh_t *dbh)
+static zend_result pdo_mysql_check_liveness(pdo_dbh_t *dbh)
{
pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data;
@@ -558,7 +603,7 @@ static void pdo_mysql_request_shutdown(pdo_dbh_t *dbh)
#endif
/* {{{ pdo_mysql_in_transaction */
-static int pdo_mysql_in_transaction(pdo_dbh_t *dbh)
+static bool pdo_mysql_in_transaction(pdo_dbh_t *dbh)
{
pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data;
PDO_DBG_ENTER("pdo_mysql_in_transaction");
@@ -582,7 +627,8 @@ static const struct pdo_dbh_methods mysql_methods = {
pdo_mysql_check_liveness,
NULL,
pdo_mysql_request_shutdown,
- pdo_mysql_in_transaction
+ pdo_mysql_in_transaction,
+ NULL /* get_gc */
};
/* }}} */
@@ -715,6 +761,17 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options)
#endif
}
+#if MYSQL_VERSION_ID >= 80021 || defined(PDO_USE_MYSQLND)
+ zend_string *local_infile_directory = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_LOCAL_INFILE_DIRECTORY, NULL);
+ if (local_infile_directory && !php_check_open_basedir(ZSTR_VAL(local_infile_directory))) {
+ if (mysql_options(H->server, MYSQL_OPT_LOAD_DATA_LOCAL_DIR, (const char *)ZSTR_VAL(local_infile_directory))) {
+ zend_string_release(local_infile_directory);
+ pdo_mysql_error(dbh);
+ goto cleanup;
+ }
+ zend_string_release(local_infile_directory);
+ }
+#endif
#ifdef MYSQL_OPT_RECONNECT
/* since 5.0.3, the default for this option is 0 if not specified.
* we want the old behaviour
@@ -827,6 +884,14 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options)
goto cleanup;
}
+#ifdef PDO_USE_MYSQLND
+ unsigned int int_and_float_native = 1;
+ if (mysql_options(H->server, MYSQLND_OPT_INT_AND_FLOAT_NATIVE, (const char *) &int_and_float_native)) {
+ pdo_mysql_error(dbh);
+ goto cleanup;
+ }
+#endif
+
if (vars[0].optval && mysql_options(H->server, MYSQL_SET_CHARSET_NAME, vars[0].optval)) {
pdo_mysql_error(dbh);
goto cleanup;
diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c
index 0d0df4ca6d..c35657191f 100644
--- a/ext/pdo_mysql/mysql_statement.c
+++ b/ext/pdo_mysql/mysql_statement.c
@@ -34,7 +34,6 @@
# define pdo_mysql_stmt_execute_prepared(stmt) pdo_mysql_stmt_execute_prepared_libmysql(stmt)
#endif
-
static void pdo_mysql_free_result(pdo_mysql_stmt *S)
{
if (S->result) {
@@ -52,8 +51,16 @@ static void pdo_mysql_free_result(pdo_mysql_stmt *S)
efree(S->out_length);
S->bound_result = NULL;
}
+#else
+ if (S->current_row) {
+ unsigned column_count = mysql_num_fields(S->result);
+ for (unsigned i = 0; i < column_count; i++) {
+ zval_ptr_dtor_nogc(&S->current_row[i]);
+ }
+ efree(S->current_row);
+ S->current_row = NULL;
+ }
#endif
-
mysql_free_result(S->result);
S->result = NULL;
}
@@ -104,12 +111,6 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */
}
}
-#ifdef PDO_USE_MYSQLND
- if (!S->stmt && S->current_data) {
- mnd_free(S->current_data);
- }
-#endif /* PDO_USE_MYSQLND */
-
efree(S);
PDO_DBG_RETURN(1);
}
@@ -317,7 +318,7 @@ static int pdo_mysql_stmt_execute(pdo_stmt_t *stmt) /* {{{ */
PDO_DBG_RETURN(pdo_mysql_stmt_execute_prepared(stmt));
}
- if (mysql_real_query(H->server, stmt->active_query_string, stmt->active_query_stringlen) != 0) {
+ if (mysql_real_query(H->server, ZSTR_VAL(stmt->active_query_string), ZSTR_LEN(stmt->active_query_string)) != 0) {
pdo_mysql_error_stmt(stmt);
PDO_DBG_RETURN(0);
}
@@ -554,7 +555,7 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori
}
#ifdef PDO_USE_MYSQLND
- zend_bool fetched_anything;
+ bool fetched_anything;
PDO_DBG_ENTER("pdo_mysql_stmt_fetch");
PDO_DBG_INF_FMT("stmt=%p", S->stmt);
@@ -567,9 +568,24 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori
PDO_DBG_RETURN(1);
}
- if (!S->stmt && S->current_data) {
- mnd_free(S->current_data);
+ zval *row_data;
+ if (mysqlnd_fetch_row_zval(S->result, &row_data, &fetched_anything) == FAIL) {
+ pdo_mysql_error_stmt(stmt);
+ PDO_DBG_RETURN(0);
+ }
+
+ if (!fetched_anything) {
+ PDO_DBG_RETURN(0);
}
+
+ if (!S->current_row) {
+ S->current_row = ecalloc(sizeof(zval), stmt->column_count);
+ }
+ for (unsigned i = 0; i < stmt->column_count; i++) {
+ zval_ptr_dtor_nogc(&S->current_row[i]);
+ ZVAL_COPY_VALUE(&S->current_row[i], &row_data[i]);
+ }
+ PDO_DBG_RETURN(1);
#else
int ret;
@@ -591,7 +607,6 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori
PDO_DBG_RETURN(1);
}
-#endif /* PDO_USE_MYSQLND */
if ((S->current_data = mysql_fetch_row(S->result)) == NULL) {
if (!S->H->buffered && mysql_errno(S->H->server)) {
@@ -602,6 +617,7 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori
S->current_lengths = mysql_fetch_lengths(S->result);
PDO_DBG_RETURN(1);
+#endif /* PDO_USE_MYSQLND */
}
/* }}} */
@@ -642,21 +658,13 @@ static int pdo_mysql_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */
cols[i].precision = S->fields[i].decimals;
cols[i].maxlen = S->fields[i].length;
-
-#ifdef PDO_USE_MYSQLND
- if (S->stmt) {
- cols[i].param_type = PDO_PARAM_ZVAL;
- } else
-#endif
- {
- cols[i].param_type = PDO_PARAM_STR;
- }
}
PDO_DBG_RETURN(1);
}
/* }}} */
-static int pdo_mysql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, size_t *len, int *caller_frees) /* {{{ */
+static int pdo_mysql_stmt_get_col(
+ pdo_stmt_t *stmt, int colno, zval *result, enum pdo_param_type *type) /* {{{ */
{
pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data;
@@ -666,46 +674,41 @@ static int pdo_mysql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, size_
PDO_DBG_RETURN(0);
}
- /* With mysqlnd data is stored inside mysqlnd, not S->current_data */
- if (!S->stmt) {
- if (S->current_data == NULL || !S->result) {
- PDO_DBG_RETURN(0);
- }
- }
-
if (colno >= stmt->column_count) {
/* error invalid column */
PDO_DBG_RETURN(0);
}
#ifdef PDO_USE_MYSQLND
if (S->stmt) {
- Z_TRY_ADDREF(S->stmt->data->result_bind[colno].zv);
- *ptr = (char*)&S->stmt->data->result_bind[colno].zv;
- *len = sizeof(zval);
- PDO_DBG_RETURN(1);
+ ZVAL_COPY(result, &S->stmt->data->result_bind[colno].zv);
+ } else {
+ ZVAL_COPY(result, &S->current_row[colno]);
}
+ PDO_DBG_RETURN(1);
#else
if (S->stmt) {
if (S->out_null[colno]) {
- *ptr = NULL;
- *len = 0;
PDO_DBG_RETURN(1);
}
- *ptr = S->bound_result[colno].buffer;
- if (S->out_length[colno] > S->bound_result[colno].buffer_length) {
+
+ size_t length = S->out_length[colno];
+ if (length > S->bound_result[colno].buffer_length) {
/* mysql lied about the column width */
strcpy(stmt->error_code, "01004"); /* truncated */
- S->out_length[colno] = S->bound_result[colno].buffer_length;
- *len = S->out_length[colno];
- PDO_DBG_RETURN(0);
+ length = S->out_length[colno] = S->bound_result[colno].buffer_length;
}
- *len = S->out_length[colno];
+ ZVAL_STRINGL_FAST(result, S->bound_result[colno].buffer, length);
PDO_DBG_RETURN(1);
}
-#endif
- *ptr = S->current_data[colno];
- *len = S->current_lengths[colno];
+
+ if (S->current_data == NULL) {
+ PDO_DBG_RETURN(0);
+ }
+ if (S->current_data[colno]) {
+ ZVAL_STRINGL_FAST(result, S->current_data[colno], S->current_lengths[colno]);
+ }
PDO_DBG_RETURN(1);
+#endif
} /* }}} */
static char *type_to_name_native(int type) /* {{{ */
@@ -802,7 +805,7 @@ static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, zend_long colno, zval *retu
add_assoc_string(return_value, "native_type", str);
}
-#ifdef PDO_USE_MYSQLND
+ enum pdo_param_type param_type;
switch (F->type) {
case MYSQL_TYPE_BIT:
case MYSQL_TYPE_YEAR:
@@ -813,13 +816,13 @@ static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, zend_long colno, zval *retu
#if SIZEOF_ZEND_LONG==8
case MYSQL_TYPE_LONGLONG:
#endif
- add_assoc_long(return_value, "pdo_type", PDO_PARAM_INT);
+ param_type = PDO_PARAM_INT;
break;
default:
- add_assoc_long(return_value, "pdo_type", PDO_PARAM_STR);
+ param_type = PDO_PARAM_STR;
break;
}
-#endif
+ add_assoc_long(return_value, "pdo_type", param_type);
add_assoc_zval(return_value, "flags", &flags);
add_assoc_string(return_value, "table", (char *) (F->table?F->table : ""));
diff --git a/ext/pdo_mysql/pdo_mysql.c b/ext/pdo_mysql/pdo_mysql.c
index 84828edaa4..1bfc5ff874 100644
--- a/ext/pdo_mysql/pdo_mysql.c
+++ b/ext/pdo_mysql/pdo_mysql.c
@@ -124,6 +124,9 @@ static PHP_MINIT_FUNCTION(pdo_mysql)
#ifdef PDO_USE_MYSQLND
REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_VERIFY_SERVER_CERT", (zend_long)PDO_MYSQL_ATTR_SSL_VERIFY_SERVER_CERT);
#endif
+#if MYSQL_VERSION_ID >= 80021 || defined(PDO_USE_MYSQLND)
+ REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_LOCAL_INFILE_DIRECTORY", (zend_long)PDO_MYSQL_ATTR_LOCAL_INFILE_DIRECTORY);
+#endif
#ifdef PDO_USE_MYSQLND
mysqlnd_reverse_api_register_api(&pdo_mysql_reverse_api);
diff --git a/ext/pdo_mysql/php_pdo_mysql_int.h b/ext/pdo_mysql/php_pdo_mysql_int.h
index 553437829e..6077ce8245 100644
--- a/ext/pdo_mysql/php_pdo_mysql_int.h
+++ b/ext/pdo_mysql/php_pdo_mysql_int.h
@@ -39,7 +39,7 @@ typedef _Bool my_bool;
#define PDO_DBG_INF_FMT(...) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log_va(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "info : ", __VA_ARGS__); } while (0)
#define PDO_DBG_ERR_FMT(...) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log_va(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "error: ", __VA_ARGS__); } while (0)
#define PDO_DBG_ENTER(func_name) \
- zend_bool dbg_skip_trace = TRUE; \
+ bool dbg_skip_trace = TRUE; \
((void) dbg_skip_trace); \
if (PDO_MYSQL_G(dbg)) \
dbg_skip_trace = !PDO_MYSQL_G(dbg)->m->func_enter(PDO_MYSQL_G(dbg), __LINE__, __FILE__, func_name, strlen(func_name));
@@ -120,12 +120,6 @@ typedef struct {
pdo_mysql_db_handle *H;
MYSQL_RES *result;
const MYSQL_FIELD *fields;
- MYSQL_ROW current_data;
-#ifdef PDO_USE_MYSQLND
- const size_t *current_lengths;
-#else
- unsigned long *current_lengths;
-#endif
pdo_mysql_error_info einfo;
#ifdef PDO_USE_MYSQLND
MYSQLND_STMT *stmt;
@@ -137,10 +131,14 @@ typedef struct {
#ifndef PDO_USE_MYSQLND
my_bool *in_null;
zend_ulong *in_length;
-#endif
PDO_MYSQL_PARAM_BIND *bound_result;
my_bool *out_null;
zend_ulong *out_length;
+ MYSQL_ROW current_data;
+ unsigned long *current_lengths;
+#else
+ zval *current_row;
+#endif
unsigned max_length:1;
/* Whether all result sets have been fully consumed.
* If this flag is not set, they need to be consumed during destruction. */
@@ -180,6 +178,9 @@ enum {
#ifdef PDO_USE_MYSQLND
PDO_MYSQL_ATTR_SSL_VERIFY_SERVER_CERT,
#endif
+#if MYSQL_VERSION_ID >= 80021 || defined(PDO_USE_MYSQLND)
+ PDO_MYSQL_ATTR_LOCAL_INFILE_DIRECTORY,
+#endif
};
#endif
diff --git a/ext/pdo_mysql/tests/bug44327.phpt b/ext/pdo_mysql/tests/bug44327.phpt
index 8fa0025dd6..ad31d21ff8 100644
--- a/ext/pdo_mysql/tests/bug44327.phpt
+++ b/ext/pdo_mysql/tests/bug44327.phpt
@@ -11,6 +11,7 @@ $db = MySQLPDOTest::factory();
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$stmt = $db->prepare("SELECT 1 AS \"one\"");
$stmt->execute();
@@ -51,7 +52,7 @@ string(1) "1"
string(1) "1"
string(17) "SELECT 1 AS "one""
----------------------------------
-object(PDORow)#%d (2) {
+object(PDORow)#5 (2) {
["queryString"]=>
string(19) "SELECT id FROM test"
["id"]=>
diff --git a/ext/pdo_mysql/tests/bug63185.phpt b/ext/pdo_mysql/tests/bug63185.phpt
index 4bf6d7e4db..92221942e2 100644
--- a/ext/pdo_mysql/tests/bug63185.phpt
+++ b/ext/pdo_mysql/tests/bug63185.phpt
@@ -42,6 +42,12 @@ try {
var_dump($st->fetchAll());
?>
+--CLEAN--
+<?php
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc';
+$pdo = MySQLPDOTest::factory();
+$pdo->query('DROP PROCEDURE IF EXISTS test_procedure_error_at_second');
+?>
--EXPECTF--
array(1) {
[0]=>
diff --git a/ext/pdo_mysql/tests/bug70389.phpt b/ext/pdo_mysql/tests/bug70389.phpt
index 7815b21255..adfd65f5ab 100644
--- a/ext/pdo_mysql/tests/bug70389.phpt
+++ b/ext/pdo_mysql/tests/bug70389.phpt
@@ -26,8 +26,8 @@ var_dump($flags);
array(3) {
[%d]=>
bool(true)
- [1001]=>
+ [%d]=>
bool(true)
- [12]=>
+ [%d]=>
bool(true)
}
diff --git a/ext/pdo_mysql/tests/bug71145.phpt b/ext/pdo_mysql/tests/bug71145.phpt
index b3f887d7c4..2f2834cbca 100644
--- a/ext/pdo_mysql/tests/bug71145.phpt
+++ b/ext/pdo_mysql/tests/bug71145.phpt
@@ -14,6 +14,7 @@ require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$attr = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; SET SESSION sql_mode=traditional',
+ PDO::ATTR_STRINGIFY_FETCHES => true,
);
putenv('PDOTEST_ATTR=' . serialize($attr));
diff --git a/ext/pdo_mysql/tests/bug75177.phpt b/ext/pdo_mysql/tests/bug75177.phpt
index f6414f0b29..104734f3ac 100644
--- a/ext/pdo_mysql/tests/bug75177.phpt
+++ b/ext/pdo_mysql/tests/bug75177.phpt
@@ -5,27 +5,42 @@ PDO MySQL Bug #75177 Type 'bit' is fetched as unexpected string
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
MySQLPDOTest::skip();
+if (!MySQLPDOTest::isPDOMySQLnd()) die('skip only for mysqlnd');
?>
--FILE--
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$pdo = MySQLPDOTest::factory();
-$tbl = "tbl_bug75177";
+$tbl = "test";
$pdo->query("DROP TABLE IF EXISTS $tbl");
$pdo->query("CREATE TABLE $tbl (`bit` bit(8)) ENGINE=InnoDB");
$pdo->query("INSERT INTO $tbl (`bit`) VALUES (1)");
$pdo->query("INSERT INTO $tbl (`bit`) VALUES (0b011)");
$pdo->query("INSERT INTO $tbl (`bit`) VALUES (0b01100)");
+$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$ret = $pdo->query("SELECT * FROM $tbl")->fetchAll();
+foreach ($ret as $i) {
+ var_dump($i["bit"]);
+}
+$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+$ret = $pdo->query("SELECT * FROM $tbl")->fetchAll();
foreach ($ret as $i) {
var_dump($i["bit"]);
}
?>
+--CLEAN--
+<?php
+require dirname(__FILE__) . '/mysql_pdo_test.inc';
+MySQLPDOTest::dropTestTable();
+?>
--EXPECT--
-string(1) "1"
-string(1) "3"
-string(2) "12"
+int(1)
+int(3)
+int(12)
+int(1)
+int(3)
+int(12)
diff --git a/ext/pdo_mysql/tests/bug76815.phpt b/ext/pdo_mysql/tests/bug76815.phpt
index b5c8577b07..4e627e0ff7 100644
--- a/ext/pdo_mysql/tests/bug76815.phpt
+++ b/ext/pdo_mysql/tests/bug76815.phpt
@@ -28,6 +28,13 @@ unset($st);
echo "Ok.\n";
?>
+--CLEAN--
+<?php
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc';
+$pdo = MySQLPDOTest::factory();
+$pdo->query('DROP FUNCTION IF EXISTS tst');
+$pdo->query('DROP PROCEDURE IF EXISTS tst2');
+?>
--EXPECT--
SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'tst()' at row 1
Ok.
diff --git a/ext/pdo_mysql/tests/bug80458.phpt b/ext/pdo_mysql/tests/bug80458.phpt
index 86e171d302..10bf305d60 100644
--- a/ext/pdo_mysql/tests/bug80458.phpt
+++ b/ext/pdo_mysql/tests/bug80458.phpt
@@ -14,6 +14,7 @@ require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$db->query('DROP TABLE IF EXISTS test');
$db->query('CREATE TABLE test (first int) ENGINE = InnoDB');
@@ -127,9 +128,9 @@ array(1) {
[0]=>
array(2) {
["first"]=>
- int(5)
+ string(1) "5"
[0]=>
- int(5)
+ string(1) "5"
}
}
array(0) {
@@ -138,9 +139,9 @@ array(1) {
[0]=>
array(2) {
["first"]=>
- int(7)
+ string(1) "7"
[0]=>
- int(7)
+ string(1) "7"
}
}
array(0) {
@@ -179,8 +180,8 @@ array(1) {
[0]=>
array(2) {
["first"]=>
- int(16)
+ string(2) "16"
[0]=>
- int(16)
+ string(2) "16"
}
}
diff --git a/ext/pdo_mysql/tests/bug80808.phpt b/ext/pdo_mysql/tests/bug80808.phpt
new file mode 100644
index 0000000000..364b559a4c
--- /dev/null
+++ b/ext/pdo_mysql/tests/bug80808.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #80808: PDO returns ZEROFILL integers without leading zeros
+--SKIPIF--
+<?php
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+MySQLPDOTest::skip();
+?>
+--FILE--
+<?php
+
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+$pdo = MySQLPDOTest::factory();
+
+$pdo->exec('DROP TABLE IF EXISTS test');
+$pdo->exec('CREATE TABLE test (postcode INT(4) UNSIGNED ZEROFILL)');
+$pdo->exec('INSERT INTO test (postcode) VALUES (\'0800\')');
+
+$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
+var_dump($pdo->query('SELECT * FROM test')->fetchColumn(0));
+$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+var_dump($pdo->query('SELECT * FROM test')->fetchColumn(0));
+
+?>
+--EXPECT--
+string(4) "0800"
+string(4) "0800"
diff --git a/ext/pdo_mysql/tests/bug_33689.phpt b/ext/pdo_mysql/tests/bug_33689.phpt
index 84b8f5b914..08dc2235a0 100644
--- a/ext/pdo_mysql/tests/bug_33689.phpt
+++ b/ext/pdo_mysql/tests/bug_33689.phpt
@@ -27,8 +27,9 @@ $stmt->execute();
$tmp = $stmt->getColumnMeta(0);
// libmysql and mysqlnd will show the pdo_type entry at a different position in the hash
-if (!isset($tmp['pdo_type']) || (isset($tmp['pdo_type']) && $tmp['pdo_type'] != 2))
- printf("Expecting pdo_type = 2 got %s\n", $tmp['pdo_type']);
+// and will report a different type, as mysqlnd returns native types.
+if (!isset($tmp['pdo_type']) || ($tmp['pdo_type'] != 1 && $tmp['pdo_type'] != 2))
+ printf("Expecting pdo_type = 1 got %s\n", $tmp['pdo_type']);
else
unset($tmp['pdo_type']);
diff --git a/ext/pdo_mysql/tests/bug_41125.phpt b/ext/pdo_mysql/tests/bug_41125.phpt
index d96778d754..5962cec898 100644
--- a/ext/pdo_mysql/tests/bug_41125.phpt
+++ b/ext/pdo_mysql/tests/bug_41125.phpt
@@ -21,6 +21,7 @@ if ($version < 40100)
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$db->exec("DROP TABLE IF EXISTS test");
// And now allow the evil to do his work
diff --git a/ext/pdo_mysql/tests/bug_41997.phpt b/ext/pdo_mysql/tests/bug_41997.phpt
index 769080f86a..270e65398d 100644
--- a/ext/pdo_mysql/tests/bug_41997.phpt
+++ b/ext/pdo_mysql/tests/bug_41997.phpt
@@ -21,6 +21,7 @@ if ($version < 50000)
<?php
require __DIR__ . '/mysql_pdo_test.inc';
$db = MySQLPDOTest::factory();
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$db->exec('DROP PROCEDURE IF EXISTS p');
$db->exec('CREATE PROCEDURE p() BEGIN SELECT 1 AS "one"; END');
@@ -36,6 +37,12 @@ var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
var_dump($stmt->errorInfo());
print "done!";
?>
+--CLEAN--
+<?php
+require_once __DIR__ . '/mysql_pdo_test.inc';
+$db = MySQLPDOTest::factory();
+$db->exec("DROP PROCEDURE IF EXISTS p");
+?>
--EXPECT--
array(1) {
[0]=>
diff --git a/ext/pdo_mysql/tests/bug_61411.phpt b/ext/pdo_mysql/tests/bug_61411.phpt
index 9390e2abff..d80c685cd7 100644
--- a/ext/pdo_mysql/tests/bug_61411.phpt
+++ b/ext/pdo_mysql/tests/bug_61411.phpt
@@ -30,6 +30,7 @@ if (!$attr) {
}
$attr[PDO::ATTR_PERSISTENT] = true;
$attr[PDO::ATTR_EMULATE_PREPARES] = false;
+$attr[PDO::ATTR_STRINGIFY_FETCHES] = true;
putenv('PDOTEST_ATTR='.serialize($attr));
$db = MySQLPDOTest::factory();
@@ -46,8 +47,8 @@ print "done!";
--EXPECT--
array(2) {
[1]=>
- int(1)
+ string(1) "1"
[0]=>
- int(1)
+ string(1) "1"
}
done!
diff --git a/ext/pdo_mysql/tests/change_column_count.phpt b/ext/pdo_mysql/tests/change_column_count.phpt
index 5bb521d300..6349be3ea4 100644
--- a/ext/pdo_mysql/tests/change_column_count.phpt
+++ b/ext/pdo_mysql/tests/change_column_count.phpt
@@ -12,7 +12,8 @@ MySQLPDOTest::skip();
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
-$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$db->exec('DROP TABLE IF EXISTS test');
$db->exec('CREATE TABLE test (id INTEGER PRIMARY KEY NOT NULL, name VARCHAR(255) NOT NULL)');
diff --git a/ext/pdo_mysql/tests/foo/bar/bar.data b/ext/pdo_mysql/tests/foo/bar/bar.data
new file mode 100644
index 0000000000..3fa90ba016
--- /dev/null
+++ b/ext/pdo_mysql/tests/foo/bar/bar.data
@@ -0,0 +1,3 @@
+97;first
+98;second
+99;third
diff --git a/ext/pdo_mysql/tests/foo/foo.data b/ext/pdo_mysql/tests/foo/foo.data
new file mode 100644
index 0000000000..70d8d301e9
--- /dev/null
+++ b/ext/pdo_mysql/tests/foo/foo.data
@@ -0,0 +1,3 @@
+1;one
+2;two
+3;three
diff --git a/ext/pdo_mysql/tests/native_types.phpt b/ext/pdo_mysql/tests/native_types.phpt
new file mode 100644
index 0000000000..8c6be68082
--- /dev/null
+++ b/ext/pdo_mysql/tests/native_types.phpt
@@ -0,0 +1,50 @@
+--TEST--
+PDO MySQL should use native types if ATTR_STRINGIFY_FETCHES is not enabled
+--SKIPIF--
+<?php
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+MySQLPDOTest::skip();
+if (!MySQLPDOTest::isPDOMySQLnd()) die('skip mysqlnd only');
+?>
+--FILE--
+<?php
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+
+$db = MySQLPDOTest::factory();
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+$db->exec('DROP TABLE IF EXISTS test');
+$db->exec('CREATE TABLE test (i INT, f FLOAT)');
+$db->exec('INSERT INTO test VALUES (42, 42.5)');
+
+$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+var_dump($db->query('SELECT * FROM test')->fetchAll(PDO::FETCH_ASSOC));
+
+$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
+var_dump($db->query('SELECT * FROM test')->fetchAll(PDO::FETCH_ASSOC));
+?>
+--CLEAN--
+<?php
+require __DIR__ . '/mysql_pdo_test.inc';
+MySQLPDOTest::dropTestTable();
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ array(2) {
+ ["i"]=>
+ int(42)
+ ["f"]=>
+ float(42.5)
+ }
+}
+array(1) {
+ [0]=>
+ array(2) {
+ ["i"]=>
+ int(42)
+ ["f"]=>
+ float(42.5)
+ }
+}
diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt
index efbf3c51c8..76db58dff2 100644
--- a/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql___construct_options.phpt
@@ -156,6 +156,11 @@ MySQLPDOTest::skip();
set_option_and_check(33, PDO::MYSQL_ATTR_DIRECT_QUERY, 1, 'PDO::MYSQL_ATTR_DIRECT_QUERY');
set_option_and_check(34, PDO::MYSQL_ATTR_DIRECT_QUERY, 0, 'PDO::MYSQL_ATTR_DIRECT_QUERY');
+ if (defined('PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY')) {
+ set_option_and_check(35, PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY, null, 'PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY');
+ // libmysqlclient returns the directory with a trailing slash.
+ // set_option_and_check(36, PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY, __DIR__, 'PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY');
+ }
} catch (PDOException $e) {
printf("[001] %s, [%s] %s Line: %s\n",
$e->getMessage(),
diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt
index 99cd631a4a..55b923be71 100644
--- a/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql___construct_uri.phpt
@@ -47,14 +47,21 @@ MySQLPDOTest::skip();
$db = new PDO($uri, $user, $pass);
} catch (PDOException $e) {
$expected = array(
- "SQLSTATE[HY000] [1049] Unknown database 'letshopeinvalid'",
- "SQLSTATE[42000] [1049] Unknown database 'letshopeinvalid'",
- "SQLSTATE[HY000] [2002] No such file or directory"
+ "SQLSTATE[HY000] [1049]",
+ "SQLSTATE[42000] [1049]",
+ "SQLSTATE[HY000] [2002]"
);
+ $isExpected = false;
+ foreach ($expected as $prefix) {
+ if (str_starts_with($e->getMessage(), $prefix)) {
+ $isExpected = true;
+ }
+ }
+
printf("[003] URI=%s, DSN=%s, File=%s (%d bytes, '%s'), chr(0) test, %s\n",
$uri, $dsn,
$file, filesize($file), file_get_contents($file),
- (in_array($e->getMessage(), $expected) ? 'EXPECTED ERROR' : $e->getMessage()));
+ ($isExpected ? 'EXPECTED ERROR' : $e->getMessage()));
}
unlink($file);
}
diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_case.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_case.phpt
index 2b45154248..f9f0f55afb 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_attr_case.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_attr_case.phpt
@@ -11,6 +11,7 @@ $db = MySQLPDOTest::factory();
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
MySQLPDOTest::createTestTable($db);
$default = $db->getAttribute(PDO::ATTR_CASE);
diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_errmode.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_errmode.phpt
index d6ebd87f60..fc4f2f0808 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_attr_errmode.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_attr_errmode.phpt
@@ -25,7 +25,6 @@ error_reporting=E_ALL
echo get_class($e), ': ', $e->getMessage(), \PHP_EOL;
}
try {
- /* This currently passes */
$db->setAttribute(PDO::ATTR_ERRMODE, 'pdo');
} catch (\Error $e) {
echo get_class($e), ': ', $e->getMessage(), \PHP_EOL;
@@ -160,6 +159,7 @@ error_reporting=E_ALL
--EXPECTF--
TypeError: Attribute value must be of type int for selected attribute, array given
TypeError: Attribute value must be of type int for selected attribute, stdClass given
+TypeError: Attribute value must be of type int for selected attribute, string given
ValueError: Error mode must be one of the PDO::ERRMODE_* constants
Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: %d You have an error in your SQL syntax; check the manual that corresponds to your %s server version for the right syntax to use near '%s' at line %d in %s on line %d
diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt
index c979075fd7..b12161d4f3 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_attr_init_command.phpt
@@ -24,6 +24,7 @@ error_reporting=E_ALL
$create = sprintf('CREATE TABLE %s(id INT)', $table);
var_dump($create);
$db = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => $create));
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$info = $db->errorInfo();
var_dump($info[0]);
diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_max_buffer_size.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_max_buffer_size.phpt
index 73e657fff9..d4ea033c08 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_attr_max_buffer_size.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_attr_max_buffer_size.phpt
@@ -58,8 +58,12 @@ if (MySQLPDOTest::isPDOMySQLnd())
try_buffer_size(1, -1);
try_buffer_size(2, 1000);
- try_buffer_size(3, NULL);
try_buffer_size(4, 2000);
+ try {
+ try_buffer_size(3, NULL);
+ } catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+ }
print "done!";
?>
@@ -72,6 +76,6 @@ $db->exec('DROP TABLE IF EXISTS test');
--EXPECTF--
[001] id = 1, val = 0123456789... (length: %d)
[002] id = 1, val = 0123456789... (length: 1000)
-[003] id = 1, val = 0123456789... (length: %d)
[004] id = 1, val = 0123456789... (length: 2000)
+Attribute value must be of type int for selected attribute, null given
done!
diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_multi_statements.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_multi_statements.phpt
index f268117821..34d9d57ce3 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_attr_multi_statements.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_attr_multi_statements.phpt
@@ -20,6 +20,7 @@ error_reporting=E_ALL
$table = sprintf("test_%s", md5(mt_rand(0, PHP_INT_MAX)));
$db = new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$db->exec(sprintf('DROP TABLE IF EXISTS %s', $table));
$create = sprintf('CREATE TABLE %s(id INT)', $table);
$db->exec($create);
@@ -37,6 +38,7 @@ error_reporting=E_ALL
// New connection, does not allow multiple statements.
$db = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_MULTI_STATEMENTS => false));
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$stmt = $db->query(sprintf('SELECT * FROM %s; INSERT INTO %s(id) VALUES (3)', $table, $table));
var_dump($stmt);
$info = $db->errorInfo();
diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt
index 1b6941c583..78d6ae7879 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt
@@ -23,7 +23,6 @@ MySQLPDOTest::skip();
echo $e->getMessage(), \PHP_EOL;
}
try {
- /* Currently passes... */
$db->setAttribute(PDO::ATTR_ORACLE_NULLS, 'pdo');
} catch (\TypeError $e) {
echo $e->getMessage(), \PHP_EOL;
@@ -72,6 +71,7 @@ MySQLPDOTest::skip();
--EXPECTF--
Attribute value must be of type int for selected attribute, array given
Attribute value must be of type int for selected attribute, stdClass given
+Attribute value must be of type int for selected attribute, string given
array(1) {
[0]=>
array(6) {
@@ -112,11 +112,11 @@ array(1) {
["z"]=>
NULL
["a"]=>
- string(0) ""
+ NULL
["b"]=>
string(1) " "
["c"]=>
- string(0) ""
+ NULL
["d"]=>
string(2) " d"
["e"]=>
@@ -131,11 +131,11 @@ array(1) {
["z"]=>
NULL
["a"]=>
- string(0) ""
+ NULL
["b"]=>
string(1) " "
["c"]=>
- string(0) ""
+ NULL
["d"]=>
string(2) " d"
["e"]=>
diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt
index 77f231d28f..4bbf639939 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt
@@ -11,6 +11,7 @@ $db = MySQLPDOTest::factory();
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
MySQLPDOTest::createTestTable($db);
$default = $db->getAttribute(PDO::ATTR_STATEMENT_CLASS);
diff --git a/ext/pdo_mysql/tests/pdo_mysql_begintransaction.phpt b/ext/pdo_mysql/tests/pdo_mysql_begintransaction.phpt
index fb550b1aa2..cdecc97b2e 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_begintransaction.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_begintransaction.phpt
@@ -13,6 +13,7 @@ if (false == MySQLPDOTest::detect_transactional_mysql_engine($db))
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
+
MySQLPDOTest::createTestTable($db, MySQLPDOTest::detect_transactional_mysql_engine($db));
if (1 !== $db->getAttribute(PDO::ATTR_AUTOCOMMIT))
@@ -31,6 +32,7 @@ if (false == MySQLPDOTest::detect_transactional_mysql_engine($db))
/* This is the PDO way to close a connection */
$db = null;
$db = MySQLPDOTest::factory();
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
/* Autocommit was off - by definition. Commit was not issued. DELETE should have been rolled back. */
if (!($stmt = $db->query('SELECT id, label FROM test ORDER BY id ASC')))
diff --git a/ext/pdo_mysql/tests/pdo_mysql_class_constants.phpt b/ext/pdo_mysql/tests/pdo_mysql_class_constants.phpt
index c9877f3ac1..205e059b54 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_class_constants.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_class_constants.phpt
@@ -13,6 +13,16 @@ if (!extension_loaded('mysqli') && !extension_loaded('mysqlnd')) {
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+ function get_client_version() {
+ if (extension_loaded('mysqli')) {
+ return mysqli_get_client_version();
+ }
+ /* XXX the MySQL client library version isn't exposed with any
+ constants, the single possibility is to use the PDO::getAttribute().
+ This however will fail with no connection. */
+ return MySQLPDOTest::getClientVersion(MySQLPDOTest::factory());
+ }
+
$expected = array(
'MYSQL_ATTR_USE_BUFFERED_QUERY' => true,
'MYSQL_ATTR_LOCAL_INFILE' => true,
@@ -38,15 +48,12 @@ if (!extension_loaded('mysqli') && !extension_loaded('mysqlnd')) {
if (extension_loaded('mysqlnd')) {
$expected['MYSQL_ATTR_SSL_VERIFY_SERVER_CERT'] = true;
$expected['MYSQL_ATTR_SERVER_PUBLIC_KEY'] = true;
- } else if (extension_loaded('mysqli')) {
- if (mysqli_get_client_version() > 50605) {
- $expected['MYSQL_ATTR_SERVER_PUBLIC_KEY'] = true;
- }
- } else if (MySQLPDOTest::getClientVersion(MySQLPDOTest::factory()) > 50605) {
- /* XXX the MySQL client library version isn't exposed with any
- constants, the single possibility is to use the PDO::getAttribute().
- This however will fail with no connection. */
- $expected['MYSQL_ATTR_SERVER_PUBLIC_KEY'] = true;
+ } else if (get_client_version() > 50605) {
+ $expected['MYSQL_ATTR_SERVER_PUBLIC_KEY'] = true;
+ }
+
+ if (MySQLPDOTest::isPDOMySQLnd() || get_client_version() >= 80021) {
+ $expected['MYSQL_ATTR_LOCAL_INFILE_DIRECTORY'] = true;
}
/*
diff --git a/ext/pdo_mysql/tests/pdo_mysql_closecursor_error.phpt b/ext/pdo_mysql/tests/pdo_mysql_closecursor_error.phpt
index 1f9421fe8a..5d4c933542 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_closecursor_error.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_closecursor_error.phpt
@@ -10,6 +10,7 @@ MySQLPDOTest::skip();
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$stmt = $db->query('SELECT 1; SELECT x FROM does_not_exist');
var_dump($stmt->fetchAll());
diff --git a/ext/pdo_mysql/tests/pdo_mysql_local_infile_default_off.phpt b/ext/pdo_mysql/tests/pdo_mysql_local_infile_default_off.phpt
index 810adce7e7..9a12f837fb 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_local_infile_default_off.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_local_infile_default_off.phpt
@@ -5,6 +5,9 @@ ensure default for local infile is off
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
MySQLPDOTest::skip();
+if (!defined('PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY')) {
+ die("skip No MYSQL_ATTR_LOCAL_INFILE_DIRECTORY support");
+}
?>
--FILE--
<?php
@@ -17,8 +20,10 @@ $pass = PDO_MYSQL_TEST_PASS;
$db = new PDO($dsn, $user, $pass);
echo var_export($db->getAttribute(PDO::MYSQL_ATTR_LOCAL_INFILE)), "\n";
+echo var_export($db->getAttribute(PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY)), "\n";
echo "done!\n";
?>
--EXPECT--
false
+NULL
done!
diff --git a/ext/pdo_mysql/tests/pdo_mysql_local_infile_directory_allowed.phpt b/ext/pdo_mysql/tests/pdo_mysql_local_infile_directory_allowed.phpt
new file mode 100644
index 0000000000..edabfbc07f
--- /dev/null
+++ b/ext/pdo_mysql/tests/pdo_mysql_local_infile_directory_allowed.phpt
@@ -0,0 +1,85 @@
+--TEST--
+PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY vs access allowed
+--SKIPIF--
+<?php
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+MySQLPDOTest::skip();
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipifinfilenotallowed.inc');
+if (!defined('PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY')) {
+ die("skip No MYSQL_ATTR_LOCAL_INFILE_DIRECTORY support");
+}
+?>
+--FILE--
+<?php
+ function exec_and_count($offset, &$db, $sql, $exp) {
+ try {
+ $ret = $db->exec($sql);
+ if ($ret !== $exp) {
+ printf("[%03d] Expecting '%s'/%s got '%s'/%s when running '%s', [%s] %s\n",
+ $offset, $exp, gettype($exp), $ret, gettype($ret), $sql,
+ $db->errorCode(), implode(' ', $db->errorInfo()));
+ return false;
+ }
+ } catch (PDOException $e) {
+ printf("[%03d] '%s' has failed, [%s] %s\n",
+ $offset, $sql, $db->errorCode(), implode(' ', $db->errorInfo()));
+ return false;
+ }
+
+ return true;
+ }
+
+ require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+ putenv('PDOTEST_ATTR='.serialize([
+ PDO::MYSQL_ATTR_LOCAL_INFILE=>false,
+ PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY=>__DIR__."/foo"
+ ]));
+ $db = MySQLPDOTest::factory();
+ MySQLPDOTest::createTestTable($db, MySQLPDOTest::detect_transactional_mysql_engine($db));
+
+ try {
+ exec_and_count(1, $db, 'DROP TABLE IF EXISTS test', 0);
+ exec_and_count(2, $db, sprintf('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, col1 CHAR(10)) ENGINE=%s', PDO_MYSQL_TEST_ENGINE), 0);
+
+ $filepath = str_replace('\\', '/', __DIR__.'/foo/bar/bar.data');
+
+ $sql = sprintf("LOAD DATA LOCAL INFILE %s INTO TABLE test FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'", $db->quote($filepath));
+ if (exec_and_count(3, $db, $sql, 3)) {
+ $stmt = $db->query('SELECT id, col1 FROM test ORDER BY id ASC');
+ $expected = array(
+ array("id" => 97, "col1" => "first"),
+ array("id" => 98, "col1" => "second"),
+ array("id" => 99, "col1" => "third"),
+ );
+ $ret = $stmt->fetchAll(PDO::FETCH_ASSOC);
+ foreach ($expected as $offset => $exp) {
+ foreach ($exp as $key => $value) {
+ $actual_value = trim(strval($ret[$offset][$key]));
+ if ($actual_value != $value) {
+ printf("Results seem wrong, check manually\n");
+ echo "------ EXPECTED OUTPUT ------\n";
+ var_dump($expected);
+ echo "------ ACTUAL OUTPUT ------\n";
+ var_dump($ret);
+ break 2;
+ }
+ }
+ }
+ }
+ } catch (PDOException $e) {
+ printf("[001] %s, [%s] %s\n",
+ $e->getMessage(),
+ $db->errorCode(), implode(' ', $db->errorInfo()));
+ }
+
+ print "done!";
+?>
+--CLEAN--
+<?php
+require dirname(__FILE__) . '/mysql_pdo_test.inc';
+$db = MySQLPDOTest::factory();
+$db->exec('DROP TABLE IF EXISTS test');
+?>
+--EXPECT--
+done!
diff --git a/ext/pdo_mysql/tests/pdo_mysql_local_infile_directory_denied.phpt b/ext/pdo_mysql/tests/pdo_mysql_local_infile_directory_denied.phpt
new file mode 100644
index 0000000000..c955c1daad
--- /dev/null
+++ b/ext/pdo_mysql/tests/pdo_mysql_local_infile_directory_denied.phpt
@@ -0,0 +1,76 @@
+--TEST--
+PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY vs access denied
+--SKIPIF--
+<?php
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+MySQLPDOTest::skip();
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipifinfilenotallowed.inc');
+if (!defined('PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY')) {
+ die("skip No MYSQL_ATTR_LOCAL_INFILE_DIRECTORY support");
+}
+?>
+--FILE--
+<?php
+ function exec_and_count($offset, &$db, $sql, $exp) {
+ try {
+ $ret = $db->exec($sql);
+ if ($ret !== $exp) {
+ printf("[%03d] Expecting '%s'/%s got '%s'/%s when running '%s', [%s] %s\n",
+ $offset, $exp, gettype($exp), $ret, gettype($ret), $sql,
+ $db->errorCode(), implode(' ', $db->errorInfo()));
+ return false;
+ }
+ } catch (PDOException $e) {
+ printf("[%03d] '%s' has failed, [%s] %s\n",
+ $offset, $sql, $db->errorCode(), implode(' ', $db->errorInfo()));
+ return false;
+ }
+
+ return true;
+ }
+
+ require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+ putenv('PDOTEST_ATTR='.serialize([
+ PDO::MYSQL_ATTR_LOCAL_INFILE=>false,
+ PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY=>__DIR__."/foo/bar"
+ ]));
+ $db = MySQLPDOTest::factory();
+ MySQLPDOTest::createTestTable($db, MySQLPDOTest::detect_transactional_mysql_engine($db));
+
+ try {
+ exec_and_count(1, $db, 'DROP TABLE IF EXISTS test', 0);
+ exec_and_count(2, $db, sprintf('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, col1 CHAR(10)) ENGINE=%s', PDO_MYSQL_TEST_ENGINE), 0);
+
+ $filepath = str_replace('\\', '/', __DIR__.'/foo/foo.data');
+
+ $sql = sprintf("LOAD DATA LOCAL INFILE %s INTO TABLE test FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'", $db->quote($filepath));
+ if (exec_and_count(3, $db, $sql, false)) {
+ $stmt = $db->query('SELECT id, col1 FROM test ORDER BY id ASC');
+ $expected = array();
+ $ret = $stmt->fetchAll(PDO::FETCH_ASSOC);
+ if ($ret != $expected) {
+ printf("Results seem wrong, check manually\n");
+ echo "------ EXPECTED OUTPUT ------\n";
+ var_dump($expected);
+ echo "------ ACTUAL OUTPUT ------\n";
+ var_dump($ret);
+ }
+ }
+ } catch (PDOException $e) {
+ printf("[001] %s, [%s] %s\n",
+ $e->getMessage(),
+ $db->errorCode(), implode(' ', $db->errorInfo()));
+ }
+
+ print "done!";
+?>
+--CLEAN--
+<?php
+require dirname(__FILE__) . '/mysql_pdo_test.inc';
+$db = MySQLPDOTest::factory();
+$db->exec('DROP TABLE IF EXISTS test');
+?>
+--EXPECTF--
+Warning: PDO::exec(): SQLSTATE[HY000]: General error: 2068 LOAD DATA LOCAL INFILE %s in %s on line %d
+done!
diff --git a/ext/pdo_mysql/tests/pdo_mysql_local_infile_overrides_local_infile_directory.phpt b/ext/pdo_mysql/tests/pdo_mysql_local_infile_overrides_local_infile_directory.phpt
new file mode 100644
index 0000000000..c6d60fd1ab
--- /dev/null
+++ b/ext/pdo_mysql/tests/pdo_mysql_local_infile_overrides_local_infile_directory.phpt
@@ -0,0 +1,85 @@
+--TEST--
+PDO::MYSQL_ATTR_LOCAL_INFILE overrides PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY
+--SKIPIF--
+<?php
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+MySQLPDOTest::skip();
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipifinfilenotallowed.inc');
+if (!defined('PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY')) {
+ die("skip No MYSQL_ATTR_LOCAL_INFILE_DIRECTORY support");
+}
+?>
+--FILE--
+<?php
+ function exec_and_count($offset, &$db, $sql, $exp) {
+ try {
+ $ret = $db->exec($sql);
+ if ($ret !== $exp) {
+ printf("[%03d] Expecting '%s'/%s got '%s'/%s when running '%s', [%s] %s\n",
+ $offset, $exp, gettype($exp), $ret, gettype($ret), $sql,
+ $db->errorCode(), implode(' ', $db->errorInfo()));
+ return false;
+ }
+ } catch (PDOException $e) {
+ printf("[%03d] '%s' has failed, [%s] %s\n",
+ $offset, $sql, $db->errorCode(), implode(' ', $db->errorInfo()));
+ return false;
+ }
+
+ return true;
+ }
+
+ require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+ putenv('PDOTEST_ATTR='.serialize([
+ PDO::MYSQL_ATTR_LOCAL_INFILE=>true,
+ PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY=>__DIR__."/foo/bar"
+ ]));
+ $db = MySQLPDOTest::factory();
+ MySQLPDOTest::createTestTable($db, MySQLPDOTest::detect_transactional_mysql_engine($db));
+
+ try {
+ exec_and_count(1, $db, 'DROP TABLE IF EXISTS test', 0);
+ exec_and_count(2, $db, sprintf('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, col1 CHAR(10)) ENGINE=%s', PDO_MYSQL_TEST_ENGINE), 0);
+
+ $filepath = str_replace('\\', '/', __DIR__.'/foo/foo.data');
+
+ $sql = sprintf("LOAD DATA LOCAL INFILE %s INTO TABLE test FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'", $db->quote($filepath));
+ if (exec_and_count(3, $db, $sql, 3)) {
+ $stmt = $db->query('SELECT id, col1 FROM test ORDER BY id ASC');
+ $expected = array(
+ array("id" => 1, "col1" => "one"),
+ array("id" => 2, "col1" => "two"),
+ array("id" => 3, "col1" => "three"),
+ );
+ $ret = $stmt->fetchAll(PDO::FETCH_ASSOC);
+ foreach ($expected as $offset => $exp) {
+ foreach ($exp as $key => $value) {
+ $actual_value = trim(strval($ret[$offset][$key]));
+ if ($actual_value != $value) {
+ printf("Results seem wrong, check manually\n");
+ echo "------ EXPECTED OUTPUT ------\n";
+ var_dump($expected);
+ echo "------ ACTUAL OUTPUT ------\n";
+ var_dump($ret);
+ break 2;
+ }
+ }
+ }
+ }
+ } catch (PDOException $e) {
+ printf("[001] %s, [%s] %s\n",
+ $e->getMessage(),
+ $db->errorCode(), implode(' ', $db->errorInfo()));
+ }
+
+ print "done!";
+?>
+--CLEAN--
+<?php
+require dirname(__FILE__) . '/mysql_pdo_test.inc';
+$db = MySQLPDOTest::factory();
+$db->exec('DROP TABLE IF EXISTS test');
+?>
+--EXPECT--
+done!
diff --git a/ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt b/ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt
index 51e5b7b44a..72a29f9e36 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt
@@ -23,7 +23,7 @@ MySQLPDOTest::skip();
$db1->exec('SET @pdo_persistent_connection=1');
$stmt = $db2->query('SELECT @pdo_persistent_connection as _pers');
$tmp = $stmt->fetch(PDO::FETCH_ASSOC);
- if ($tmp['_pers'] !== '1')
+ if ($tmp['_pers'] != 1)
printf("[001] Both handles should use the same connection.");
$stmt = $db1->query('SELECT CONNECTION_ID() as _con1');
diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt
index b23d697efa..f4f1dcd13d 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt
@@ -11,6 +11,7 @@ $db = MySQLPDOTest::factory();
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
function prepex($offset, &$db, $query, $input_params = null, $error_info = null) {
diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt
index 88f9f5dcf1..5f32da7412 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_clear_error.phpt
@@ -11,6 +11,7 @@ $db = MySQLPDOTest::factory();
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
try {
diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_dup_named_placeholder.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_dup_named_placeholder.phpt
index 1c5ddc407f..8e52154902 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_dup_named_placeholder.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_dup_named_placeholder.phpt
@@ -11,6 +11,7 @@ $db = MySQLPDOTest::factory();
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
try {
diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_placeholder_everywhere.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_placeholder_everywhere.phpt
index a7a76a462b..50819f9695 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_placeholder_everywhere.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_placeholder_everywhere.phpt
@@ -11,6 +11,8 @@ $db = MySQLPDOTest::factory();
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
+
try {
$db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 1);
if (1 != $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY))
@@ -41,16 +43,7 @@ $db = MySQLPDOTest::factory();
var_export($stmt->errorCode(), true),
var_export($stmt->errorInfo(), true));
- $tmp = $stmt->fetchAll(PDO::FETCH_ASSOC);
- if (!MySQLPDOTest::isPDOMySQLnd()) {
- if (isset($tmp[0]['id'])) {
- // libmysql should return a string here whereas mysqlnd returns a native int
- if (gettype($tmp[0]['id']) == 'string')
- // convert to int for the test output...
- settype($tmp[0]['id'], 'integer');
- }
- }
- var_dump($tmp);
+ var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
} catch (PDOException $e) {
printf("[001] %s [%s] %s\n",
@@ -82,7 +75,7 @@ array(1) {
["?"]=>
string(2) "id"
["id"]=>
- int(1)
+ string(1) "1"
["label"]=>
string(4) "row1"
}
diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_blobs.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_blobs.phpt
index 9bdd03d7bd..7f45e56b6b 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_stmt_blobs.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_blobs.phpt
@@ -48,9 +48,15 @@ MySQLPDOTest::skip();
return false;
}
- if ($label !== $value) {
+ if (!is_resource($label)) {
+ printf("[%03d + 3] Returned value is not a stream resource\n", $offset);
+ return false;
+ }
+
+ $contents = stream_get_contents($label);
+ if ($contents !== $value) {
printf("[%03d + 3] Returned value seems to be wrong (%d vs. %d characters). Check manually\n",
- $offset, strlen($label), strlen($value));
+ $offset, strlen($contents), strlen($value));
return false;
}
diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt
index e83a99f529..bb92353fbe 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt
@@ -21,6 +21,7 @@ if (!$ok)
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$db = MySQLPDOTest::factory();
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
MySQLPDOTest::createTestTable($db);
try {
diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_getcolumnmeta.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_getcolumnmeta.phpt
index b5b0275f04..0e87b118ee 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_stmt_getcolumnmeta.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_getcolumnmeta.phpt
@@ -139,23 +139,22 @@ try {
$real_as_float = (false === stristr($row['_mode'], "REAL_AS_FLOAT")) ? false : true;
$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
- $is_mysqlnd = MySQLPDOTest::isPDOMySQLnd();
- test_meta($db, 20, 'BIT(8)', 1, 'BIT', ($is_mysqlnd) ? PDO::PARAM_INT : PDO::PARAM_STR);
- test_meta($db, 30, 'TINYINT', -127, 'TINY', ($is_mysqlnd) ? PDO::PARAM_INT : PDO::PARAM_STR);
- test_meta($db, 40, 'TINYINT UNSIGNED', 255, 'TINY', ($is_mysqlnd) ? PDO::PARAM_INT : PDO::PARAM_STR);
- test_meta($db, 50, 'BOOLEAN', 1, NULL, ($is_mysqlnd) ? PDO::PARAM_INT : PDO::PARAM_STR);
+ test_meta($db, 20, 'BIT(8)', 1, 'BIT', PDO::PARAM_INT);
+ test_meta($db, 30, 'TINYINT', -127, 'TINY', PDO::PARAM_INT);
+ test_meta($db, 40, 'TINYINT UNSIGNED', 255, 'TINY', PDO::PARAM_INT);
+ test_meta($db, 50, 'BOOLEAN', 1, NULL, PDO::PARAM_INT);
- test_meta($db, 60, 'SMALLINT', -32768, 'SHORT', ($is_mysqlnd) ? PDO::PARAM_INT : PDO::PARAM_STR);
- test_meta($db, 70, 'SMALLINT UNSIGNED', 65535, 'SHORT', ($is_mysqlnd) ? PDO::PARAM_INT : PDO::PARAM_STR);
+ test_meta($db, 60, 'SMALLINT', -32768, 'SHORT', PDO::PARAM_INT);
+ test_meta($db, 70, 'SMALLINT UNSIGNED', 65535, 'SHORT', PDO::PARAM_INT);
- test_meta($db, 80, 'MEDIUMINT', -8388608, 'INT24', ($is_mysqlnd) ? PDO::PARAM_INT : PDO::PARAM_STR);
- test_meta($db, 90, 'MEDIUMINT UNSIGNED', 16777215, 'INT24', ($is_mysqlnd) ? PDO::PARAM_INT : PDO::PARAM_STR);
+ test_meta($db, 80, 'MEDIUMINT', -8388608, 'INT24', PDO::PARAM_INT);
+ test_meta($db, 90, 'MEDIUMINT UNSIGNED', 16777215, 'INT24', PDO::PARAM_INT);
- test_meta($db, 100, 'INT', -2147483648, 'LONG', ($is_mysqlnd) ? PDO::PARAM_INT : PDO::PARAM_STR);
- test_meta($db, 110, 'INT UNSIGNED', 4294967295, 'LONG', ($is_mysqlnd) ? PDO::PARAM_INT : PDO::PARAM_STR);
+ test_meta($db, 100, 'INT', -2147483648, 'LONG', PDO::PARAM_INT);
+ test_meta($db, 110, 'INT UNSIGNED', 4294967295, 'LONG', PDO::PARAM_INT);
- test_meta($db, 120, 'BIGINT', '-9223372036854775808', 'LONGLONG', ($is_mysqlnd) ? ((PHP_INT_SIZE == 4) ? PDO::PARAM_STR : PDO::PARAM_INT) : PDO::PARAM_STR);
- test_meta($db, 130, 'BIGINT UNSIGNED', '18446744073709551615', 'LONGLONG', ($is_mysqlnd) ? ((PHP_INT_SIZE == 4) ? PDO::PARAM_STR : PDO::PARAM_INT) : PDO::PARAM_STR);
+ test_meta($db, 120, 'BIGINT', '-9223372036854775808', 'LONGLONG', (PHP_INT_SIZE == 4) ? PDO::PARAM_STR : PDO::PARAM_INT);
+ test_meta($db, 130, 'BIGINT UNSIGNED', '18446744073709551615', 'LONGLONG', (PHP_INT_SIZE == 4) ? PDO::PARAM_STR : PDO::PARAM_INT);
test_meta($db, 130, 'REAL', -1.01, ($real_as_float) ? 'FLOAT' : 'DOUBLE', PDO::PARAM_STR);
test_meta($db, 140, 'REAL UNSIGNED', 1.01, ($real_as_float) ? 'FLOAT' : 'DOUBLE', PDO::PARAM_STR);
@@ -186,7 +185,7 @@ try {
test_meta($db, 340, 'TIME', '14:37:00', 'TIME', PDO::PARAM_STR);
test_meta($db, 350, 'TIMESTAMP', '2008-03-23 14:38:00', 'TIMESTAMP', PDO::PARAM_STR);
test_meta($db, 360, 'DATETIME', '2008-03-23 14:38:00', 'DATETIME', PDO::PARAM_STR);
- test_meta($db, 370, 'YEAR', '2008', 'YEAR', ($is_mysqlnd) ? PDO::PARAM_INT : PDO::PARAM_STR);
+ test_meta($db, 370, 'YEAR', '2008', 'YEAR', PDO::PARAM_INT);
test_meta($db, 380, 'CHAR(1)', 'a', 'STRING', PDO::PARAM_STR);
test_meta($db, 390, 'CHAR(10)', '0123456789', 'STRING', PDO::PARAM_STR);
diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt
index 110710dd11..5e70861816 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt
@@ -117,5 +117,11 @@ if ($version < 50000)
print "done!";
?>
+--CLEAN--
+<?php
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc';
+$pdo = MySQLPDOTest::factory();
+$pdo->query('DROP PROCEDURE IF EXISTS p');
+?>
--EXPECT--
done!
diff --git a/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt b/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt
index 0a996be8f5..d79de14862 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt
@@ -51,6 +51,7 @@ MySQLPDOTest::skip();
}
$db = new MyPDO(PDO_MYSQL_TEST_DSN, PDO_MYSQL_TEST_USER, PDO_MYSQL_TEST_PASS);
+ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$db->exec('DROP TABLE IF EXISTS test');
$db->exec('CREATE TABLE test(id INT)');
$db->exec('INSERT INTO test(id) VALUES (1), (2)');
diff --git a/ext/pdo_mysql/tests/skipifinfilenotallowed.inc b/ext/pdo_mysql/tests/skipifinfilenotallowed.inc
new file mode 100644
index 0000000000..abfea299b7
--- /dev/null
+++ b/ext/pdo_mysql/tests/skipifinfilenotallowed.inc
@@ -0,0 +1,6 @@
+<?php
+$db = MySQLPDOTest::factory();
+$stmt = $db->query("SHOW VARIABLES LIKE 'local_infile'");
+if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) && ($row['value'] != 'ON'))
+ die("skip Server variable 'local_infile' seems not set to 'ON', found '". $row['value'] ."'");
+?>
diff --git a/ext/pdo_oci/oci_driver.c b/ext/pdo_oci/oci_driver.c
index 096a26575e..36f6654a35 100644
--- a/ext/pdo_oci/oci_driver.c
+++ b/ext/pdo_oci/oci_driver.c
@@ -29,7 +29,7 @@
static inline ub4 pdo_oci_sanitize_prefetch(long prefetch);
-static int pdo_oci_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) /* {{{ */
+static void pdo_oci_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) /* {{{ */
{
pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
pdo_oci_error_info *einfo;
@@ -48,8 +48,6 @@ static int pdo_oci_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info
add_next_index_long(info, einfo->errcode);
add_next_index_string(info, einfo->errmsg);
}
-
- return 1;
}
/* }}} */
@@ -185,7 +183,7 @@ ub4 _oci_error(OCIError *err, pdo_dbh_t *dbh, pdo_stmt_t *stmt, char *what, swor
}
/* }}} */
-static int oci_handle_closer(pdo_dbh_t *dbh) /* {{{ */
+static void oci_handle_closer(pdo_dbh_t *dbh) /* {{{ */
{
pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
@@ -233,18 +231,15 @@ static int oci_handle_closer(pdo_dbh_t *dbh) /* {{{ */
}
pefree(H, dbh->is_persistent);
-
- return 0;
}
/* }}} */
-static int oci_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options) /* {{{ */
+static bool oci_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options) /* {{{ */
{
pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
pdo_oci_stmt *S = ecalloc(1, sizeof(*S));
ub4 prefetch;
- char *nsql = NULL;
- size_t nsql_len = 0;
+ zend_string *nsql = NULL;
int ret;
#ifdef HAVE_OCISTMTFETCH2
@@ -257,17 +252,16 @@ static int oci_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len,
S->H = H;
stmt->supports_placeholders = PDO_PLACEHOLDER_NAMED;
- ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len);
+ ret = pdo_parse_params(stmt, sql, &nsql);
if (ret == 1) {
/* query was re-written */
sql = nsql;
- sql_len = nsql_len;
} else if (ret == -1) {
/* couldn't grok it */
strcpy(dbh->error_code, stmt->error_code);
efree(S);
- return 0;
+ return false;
}
/* create an OCI statement handle */
@@ -276,10 +270,10 @@ static int oci_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len,
/* and our own private error handle */
OCIHandleAlloc(H->env, (dvoid*)&S->err, OCI_HTYPE_ERROR, 0, NULL);
- if (sql_len) {
- H->last_err = OCIStmtPrepare(S->stmt, H->err, (text*)sql, (ub4) sql_len, OCI_NTV_SYNTAX, OCI_DEFAULT);
+ if (ZSTR_LEN(sql) != 0) {
+ H->last_err = OCIStmtPrepare(S->stmt, H->err, (text*) ZSTR_VAL(sql), (ub4) ZSTR_LEN(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
if (nsql) {
- efree(nsql);
+ zend_string_release(nsql);
nsql = NULL;
}
if (H->last_err) {
@@ -287,7 +281,7 @@ static int oci_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len,
OCIHandleFree(S->stmt, OCI_HTYPE_STMT);
OCIHandleFree(S->err, OCI_HTYPE_ERROR);
efree(S);
- return 0;
+ return false;
}
}
@@ -304,15 +298,15 @@ static int oci_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len,
stmt->driver_data = S;
stmt->methods = &oci_stmt_methods;
if (nsql) {
- efree(nsql);
+ zend_string_release(nsql);
nsql = NULL;
}
- return 1;
+ return true;
}
/* }}} */
-static zend_long oci_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_len) /* {{{ */
+static zend_long oci_handle_doer(pdo_dbh_t *dbh, const zend_string *sql) /* {{{ */
{
pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
OCIStmt *stmt;
@@ -322,7 +316,7 @@ static zend_long oci_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_len
OCIHandleAlloc(H->env, (dvoid*)&stmt, OCI_HTYPE_STMT, 0, NULL);
- H->last_err = OCIStmtPrepare(stmt, H->err, (text*)sql, (ub4) sql_len, OCI_NTV_SYNTAX, OCI_DEFAULT);
+ H->last_err = OCIStmtPrepare(stmt, H->err, (text*)ZSTR_VAL(sql), (ub4) ZSTR_LEN(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
if (H->last_err) {
H->last_err = oci_drv_error("OCIStmtPrepare");
OCIHandleFree(stmt, OCI_HTYPE_STMT);
@@ -356,51 +350,52 @@ static zend_long oci_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_len
}
/* }}} */
-static int oci_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unquotedlen, char **quoted, size_t *quotedlen, enum pdo_param_type paramtype ) /* {{{ */
+static zend_string* oci_handle_quoter(pdo_dbh_t *dbh, const zend_string *unquoted, enum pdo_param_type paramtype ) /* {{{ */
{
int qcount = 0;
char const *cu, *l, *r;
- char *c;
+ char *c, *quoted;
+ size_t quotedlen;
+ zend_string *quoted_str;
- if (!unquotedlen) {
- *quotedlen = 2;
- *quoted = emalloc(*quotedlen+1);
- strcpy(*quoted, "''");
- return 1;
+ if (ZSTR_LEN(unquoted) == 0) {
+ return zend_string_init("''", 2, 0);
}
/* count single quotes */
- for (cu = unquoted; (cu = strchr(cu,'\'')); qcount++, cu++)
+ for (cu = ZSTR_VAL(unquoted); (cu = strchr(cu,'\'')); qcount++, cu++)
; /* empty loop */
- *quotedlen = unquotedlen + qcount + 2;
- *quoted = c = emalloc(*quotedlen+1);
+ quotedlen = ZSTR_LEN(unquoted) + qcount + 2;
+ quoted = c = emalloc(quotedlen+1);
*c++ = '\'';
/* foreach (chunk that ends in a quote) */
- for (l = unquoted; (r = strchr(l,'\'')); l = r+1) {
+ for (l = ZSTR_VAL(unquoted); (r = strchr(l,'\'')); l = r+1) {
strncpy(c, l, r-l+1);
c += (r-l+1);
*c++ = '\''; /* add second quote */
}
/* Copy remainder and add enclosing quote */
- strncpy(c, l, *quotedlen-(c-*quoted)-1);
- (*quoted)[*quotedlen-1] = '\'';
- (*quoted)[*quotedlen] = '\0';
+ strncpy(c, l, quotedlen-(c-quoted)-1);
+ quoted[quotedlen-1] = '\'';
+ quoted[quotedlen] = '\0';
- return 1;
+ quoted_str = zend_string_init(quoted, quotedlen, 0);
+ efree(quoted);
+ return quoted_str;
}
/* }}} */
-static int oci_handle_begin(pdo_dbh_t *dbh) /* {{{ */
+static bool oci_handle_begin(pdo_dbh_t *dbh) /* {{{ */
{
/* with Oracle, there is nothing special to be done */
- return 1;
+ return true;
}
/* }}} */
-static int oci_handle_commit(pdo_dbh_t *dbh) /* {{{ */
+static bool oci_handle_commit(pdo_dbh_t *dbh) /* {{{ */
{
pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
@@ -408,13 +403,13 @@ static int oci_handle_commit(pdo_dbh_t *dbh) /* {{{ */
if (H->last_err) {
H->last_err = oci_drv_error("OCITransCommit");
- return 0;
+ return false;
}
- return 1;
+ return true;
}
/* }}} */
-static int oci_handle_rollback(pdo_dbh_t *dbh) /* {{{ */
+static bool oci_handle_rollback(pdo_dbh_t *dbh) /* {{{ */
{
pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
@@ -422,45 +417,54 @@ static int oci_handle_rollback(pdo_dbh_t *dbh) /* {{{ */
if (H->last_err) {
H->last_err = oci_drv_error("OCITransRollback");
- return 0;
+ return false;
}
- return 1;
+ return true;
}
/* }}} */
-static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /* {{{ */
+static bool oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /* {{{ */
{
- zend_long lval = zval_get_long(val);
+ zend_long lval;
pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
switch (attr) {
case PDO_ATTR_AUTOCOMMIT:
{
+ bool bval;
+ if (!pdo_get_bool_param(&bval, val)) {
+ return false;
+ }
+
if (dbh->in_txn) {
/* Assume they want to commit whatever is outstanding */
H->last_err = OCITransCommit(H->svc, H->err, 0);
if (H->last_err) {
H->last_err = oci_drv_error("OCITransCommit");
- return 0;
+ return false;
}
- dbh->in_txn = 0;
+ dbh->in_txn = false;
}
- dbh->auto_commit = (unsigned int)lval? 1 : 0;
- return 1;
+ dbh->auto_commit = (unsigned int) bval;
+ return true;
}
case PDO_ATTR_PREFETCH:
{
+ if (!pdo_get_long_param(&lval, val)) {
+ return false;
+ }
+
H->prefetch = pdo_oci_sanitize_prefetch(lval);
- return 1;
+ return true;
}
case PDO_OCI_ATTR_ACTION:
{
#if (OCI_MAJOR_VERSION >= 10)
zend_string *action = zval_try_get_string(val);
if (UNEXPECTED(!action)) {
- return 0;
+ return false;
}
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
@@ -468,12 +472,12 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /
OCI_ATTR_ACTION, H->err);
if (H->last_err) {
oci_drv_error("OCIAttrSet: OCI_ATTR_ACTION");
- return 0;
+ return false;
}
- return 1;
+ return true;
#else
oci_drv_error("Unsupported attribute type");
- return 0;
+ return false;
#endif
}
case PDO_OCI_ATTR_CLIENT_INFO:
@@ -481,7 +485,7 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /
#if (OCI_MAJOR_VERSION >= 10)
zend_string *client_info = zval_try_get_string(val);
if (UNEXPECTED(!client_info)) {
- return 0;
+ return false;
}
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
@@ -489,12 +493,12 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /
OCI_ATTR_CLIENT_INFO, H->err);
if (H->last_err) {
oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_INFO");
- return 0;
+ return false;
}
- return 1;
+ return true;
#else
oci_drv_error("Unsupported attribute type");
- return 0;
+ return false;
#endif
}
case PDO_OCI_ATTR_CLIENT_IDENTIFIER:
@@ -502,7 +506,7 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /
#if (OCI_MAJOR_VERSION >= 10)
zend_string *identifier = zval_try_get_string(val);
if (UNEXPECTED(!identifier)) {
- return 0;
+ return false;
}
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
@@ -510,12 +514,12 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /
OCI_ATTR_CLIENT_IDENTIFIER, H->err);
if (H->last_err) {
oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_IDENTIFIER");
- return 0;
+ return false;
}
- return 1;
+ return true;
#else
oci_drv_error("Unsupported attribute type");
- return 0;
+ return false;
#endif
}
case PDO_OCI_ATTR_MODULE:
@@ -523,7 +527,7 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /
#if (OCI_MAJOR_VERSION >= 10)
zend_string *module = zval_try_get_string(val);
if (UNEXPECTED(!module)) {
- return 0;
+ return false;
}
H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION,
@@ -531,17 +535,20 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /
OCI_ATTR_MODULE, H->err);
if (H->last_err) {
oci_drv_error("OCIAttrSet: OCI_ATTR_MODULE");
- return 0;
+ return false;
}
- return 1;
+ return true;
#else
oci_drv_error("Unsupported attribute type");
- return 0;
+ return false;
#endif
}
case PDO_OCI_ATTR_CALL_TIMEOUT:
{
#if (OCI_MAJOR_VERSION >= 18)
+ if (!pdo_get_long_param(&lval, val)) {
+ return false;
+ }
ub4 timeout = (ub4) lval;
H->last_err = OCIAttrSet(H->svc, OCI_HTYPE_SVCCTX,
@@ -549,16 +556,16 @@ static int oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /
OCI_ATTR_CALL_TIMEOUT, H->err);
if (H->last_err) {
oci_drv_error("OCIAttrSet: OCI_ATTR_CALL_TIMEOUT");
- return 0;
+ return false;
}
- return 1;
+ return true;
#else
oci_drv_error("Unsupported attribute type");
- return 0;
+ return false;
#endif
}
default:
- return 0;
+ return false;
}
}
@@ -653,7 +660,7 @@ static int oci_handle_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return
}
/* }}} */
-static int pdo_oci_check_liveness(pdo_dbh_t *dbh) /* {{{ */
+static zend_result pdo_oci_check_liveness(pdo_dbh_t *dbh) /* {{{ */
{
pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
sb4 error_code = 0;
@@ -701,13 +708,14 @@ static const struct pdo_dbh_methods oci_methods = {
oci_handle_commit,
oci_handle_rollback,
oci_handle_set_attribute,
- NULL,
+ NULL, /* last_id not supported */
pdo_oci_fetch_error_func,
oci_handle_get_attribute,
pdo_oci_check_liveness, /* check_liveness */
- NULL, /* get_driver_methods */
- NULL,
- NULL
+ NULL, /* get_driver_methods */
+ NULL, /* request_shutdown */
+ NULL, /* in transaction, use PDO's internal tracking mechanism */
+ NULL /* get_gc */
};
static int pdo_oci_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ */
diff --git a/ext/pdo_oci/oci_statement.c b/ext/pdo_oci/oci_statement.c
index 0ab043f041..de021e76fb 100644
--- a/ext/pdo_oci/oci_statement.c
+++ b/ext/pdo_oci/oci_statement.c
@@ -235,10 +235,11 @@ static sb4 oci_bind_output_cb(dvoid *ctx, OCIBind *bindp, ub4 iter, ub4 index, d
ZEND_ASSERT(param);
- if (Z_ISREF(param->parameter))
- parameter = Z_REFVAL(param->parameter);
- else
- parameter = &param->parameter;
+ if (Z_ISREF(param->parameter)) {
+ parameter = Z_REFVAL(param->parameter);
+ } else {
+ parameter = &param->parameter;
+ }
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_LOB) {
P->actual_len = sizeof(OCILobLocator*);
@@ -517,7 +518,7 @@ static int oci_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */
ub2 dtype, data_size, precis;
ub4 namelen;
struct pdo_column_data *col = &stmt->columns[colno];
- zend_bool dyn = FALSE;
+ bool dyn = FALSE;
/* describe the column */
STMT_CALL(OCIParamGet, (S->stmt, OCI_HTYPE_STMT, S->err, (dvoid*)&param, colno+1));
@@ -555,12 +556,10 @@ static int oci_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */
}
S->cols[colno].datalen = 512; /* XXX should be INT_MAX and fetched by pieces */
S->cols[colno].data = emalloc(S->cols[colno].datalen + 1);
- col->param_type = PDO_PARAM_STR;
break;
case SQLT_BLOB:
case SQLT_CLOB:
- col->param_type = PDO_PARAM_LOB;
STMT_CALL(OCIDescriptorAlloc, (S->H->env, (dvoid**)&S->cols[colno].data, OCI_DTYPE_LOB, 0, NULL));
S->cols[colno].datalen = sizeof(OCILobLocator*);
dyn = TRUE;
@@ -590,9 +589,6 @@ static int oci_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */
S->cols[colno].data = emalloc(S->cols[colno].datalen + 1);
dtype = SQLT_CHR;
-
- /* returning data as a string */
- col->param_type = PDO_PARAM_STR;
}
STMT_CALL(OCIDefineByPos, (S->stmt, &S->cols[colno].def, S->err, colno+1,
@@ -742,7 +738,7 @@ static php_stream *oci_create_lob_stream(zval *dbh, pdo_stmt_t *stmt, OCILobLoca
return NULL;
}
-static int oci_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, size_t *len, int *caller_frees) /* {{{ */
+static int oci_stmt_get_col(pdo_stmt_t *stmt, int colno, zval *result, enum pdo_param_type *type) /* {{{ */
{
pdo_oci_stmt *S = (pdo_oci_stmt*)stmt->driver_data;
pdo_oci_column *C = &S->cols[colno];
@@ -750,30 +746,27 @@ static int oci_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, size_t *len
/* check the indicator to ensure that the data is intact */
if (C->indicator == -1) {
/* A NULL value */
- *ptr = NULL;
- *len = 0;
+ ZVAL_NULL(result);
return 1;
} else if (C->indicator == 0) {
/* it was stored perfectly */
if (C->dtype == SQLT_BLOB || C->dtype == SQLT_CLOB) {
if (C->data) {
- *ptr = (char*)oci_create_lob_stream(&stmt->database_object_handle, stmt, (OCILobLocator*)C->data);
+ php_stream *stream = oci_create_lob_stream(&stmt->database_object_handle, stmt, (OCILobLocator*)C->data);
OCILobOpen(S->H->svc, S->err, (OCILobLocator*)C->data, OCI_LOB_READONLY);
+ php_stream_to_zval(stream, result);
+ return 1;
}
- *len = (size_t) 0;
- return *ptr ? 1 : 0;
+ return 0;
}
- *ptr = C->data;
- *len = (size_t) C->fetched_len;
+ ZVAL_STRINGL_FAST(result, C->data, C->fetched_len);
return 1;
} else {
/* it was truncated */
php_error_docref(NULL, E_WARNING, "Column %d data was too large for buffer and was truncated to fit it", colno);
-
- *ptr = C->data;
- *len = (size_t) C->fetched_len;
+ ZVAL_STRINGL(result, C->data, C->fetched_len);
return 1;
}
} /* }}} */
@@ -943,6 +936,16 @@ static int oci_stmt_col_meta(pdo_stmt_t *stmt, zend_long colno, zval *return_val
add_assoc_string(return_value, "native_type", "NULL");
}
+ switch (dtype) {
+ case SQLT_BLOB:
+ case SQLT_CLOB:
+ add_assoc_long(return_value, "pdo_type", PDO_PARAM_LOB);
+ break;
+ default:
+ add_assoc_long(return_value, "pdo_type", PDO_PARAM_STR);
+ break;
+ }
+
/* column can be null */
STMT_CALL_MSG(OCIAttrGet, "OCI_ATTR_IS_NULL",
(param, OCI_DTYPE_PARAM, &isnull, 0, OCI_ATTR_IS_NULL, S->err));
diff --git a/ext/pdo_oci/pdo_oci.c b/ext/pdo_oci/pdo_oci.c
index efa7c1caf6..5ae28a50df 100644
--- a/ext/pdo_oci/pdo_oci.c
+++ b/ext/pdo_oci/pdo_oci.c
@@ -87,7 +87,9 @@ PHP_MINIT_FUNCTION(pdo_oci)
REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_MODULE", (zend_long)PDO_OCI_ATTR_MODULE);
REGISTER_PDO_CLASS_CONST_LONG("OCI_ATTR_CALL_TIMEOUT", (zend_long)PDO_OCI_ATTR_CALL_TIMEOUT);
- php_pdo_register_driver(&pdo_oci_driver);
+ if (FAILURE == php_pdo_register_driver(&pdo_oci_driver)) {
+ return FAILURE;
+ }
// Defer OCI init to PHP_RINIT_FUNCTION because with php-fpm,
// NLS_LANG is not yet available here.
diff --git a/ext/pdo_odbc/odbc_driver.c b/ext/pdo_odbc/odbc_driver.c
index 76b981e2c2..790ee87851 100644
--- a/ext/pdo_odbc/odbc_driver.c
+++ b/ext/pdo_odbc/odbc_driver.c
@@ -27,7 +27,7 @@
#include "php_pdo_odbc_int.h"
#include "zend_exceptions.h"
-static int pdo_odbc_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info)
+static void pdo_odbc_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info)
{
pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data;
pdo_odbc_errinfo *einfo = &H->einfo;
@@ -47,8 +47,6 @@ static int pdo_odbc_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *inf
add_next_index_long(info, einfo->last_error);
add_next_index_str(info, message);
add_next_index_string(info, einfo->last_state);
-
- return 1;
}
@@ -120,7 +118,7 @@ void pdo_odbc_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, PDO_ODBC_HSTMT statement,
}
/* }}} */
-static int odbc_handle_closer(pdo_dbh_t *dbh)
+static void odbc_handle_closer(pdo_dbh_t *dbh)
{
pdo_odbc_db_handle *H = (pdo_odbc_db_handle*)dbh->driver_data;
@@ -134,19 +132,16 @@ static int odbc_handle_closer(pdo_dbh_t *dbh)
H->env = NULL;
pefree(H, dbh->is_persistent);
dbh->driver_data = NULL;
-
- return 0;
}
-static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options)
+static bool odbc_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options)
{
RETCODE rc;
pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data;
pdo_odbc_stmt *S = ecalloc(1, sizeof(*S));
enum pdo_cursor_type cursor_type = PDO_CURSOR_FWDONLY;
int ret;
- char *nsql = NULL;
- size_t nsql_len = 0;
+ zend_string *nsql = NULL;
S->H = H;
S->assume_utf8 = H->assume_utf8;
@@ -154,7 +149,7 @@ static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len,
/* before we prepare, we need to peek at the query; if it uses named parameters,
* we want PDO to rewrite them for us */
stmt->supports_placeholders = PDO_PLACEHOLDER_POSITIONAL;
- ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len);
+ ret = pdo_parse_params(stmt, sql, &nsql);
if (ret == 1) {
/* query was re-written */
@@ -163,7 +158,7 @@ static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len,
/* couldn't grok it */
strcpy(dbh->error_code, stmt->error_code);
efree(S);
- return 0;
+ return false;
}
rc = SQLAllocHandle(SQL_HANDLE_STMT, H->dbc, &S->stmt);
@@ -171,10 +166,10 @@ static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len,
if (rc == SQL_INVALID_HANDLE || rc == SQL_ERROR) {
efree(S);
if (nsql) {
- efree(nsql);
+ zend_string_release(nsql);
}
pdo_odbc_drv_error("SQLAllocStmt");
- return 0;
+ return false;
}
stmt->driver_data = S;
@@ -186,15 +181,15 @@ static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len,
pdo_odbc_stmt_error("SQLSetStmtAttr: SQL_ATTR_CURSOR_SCROLLABLE");
SQLFreeHandle(SQL_HANDLE_STMT, S->stmt);
if (nsql) {
- efree(nsql);
+ zend_string_release(nsql);
}
- return 0;
+ return false;
}
}
- rc = SQLPrepare(S->stmt, (SQLCHAR *) sql, SQL_NTS);
+ rc = SQLPrepare(S->stmt, (SQLCHAR *) ZSTR_VAL(sql), SQL_NTS);
if (nsql) {
- efree(nsql);
+ zend_string_release(nsql);
}
stmt->methods = &odbc_stmt_methods;
@@ -212,12 +207,12 @@ static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len,
}
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
- return 0;
+ return false;
}
- return 1;
+ return true;
}
-static zend_long odbc_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_len)
+static zend_long odbc_handle_doer(pdo_dbh_t *dbh, const zend_string *sql)
{
pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data;
RETCODE rc;
@@ -230,7 +225,7 @@ static zend_long odbc_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_le
return -1;
}
- rc = SQLExecDirect(stmt, (SQLCHAR *) sql, sql_len);
+ rc = SQLExecDirect(stmt, (SQLCHAR *) ZSTR_VAL(sql), ZSTR_LEN(sql));
if (rc == SQL_NO_DATA) {
/* If SQLExecDirect executes a searched update or delete statement that
@@ -267,7 +262,7 @@ static int odbc_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unquo
}
*/
-static int odbc_handle_begin(pdo_dbh_t *dbh)
+static bool odbc_handle_begin(pdo_dbh_t *dbh)
{
if (dbh->auto_commit) {
/* we need to disable auto-commit now, to be able to initiate a transaction */
@@ -277,13 +272,13 @@ static int odbc_handle_begin(pdo_dbh_t *dbh)
rc = SQLSetConnectAttr(H->dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER);
if (rc != SQL_SUCCESS) {
pdo_odbc_drv_error("SQLSetConnectAttr AUTOCOMMIT = OFF");
- return 0;
+ return false;
}
}
- return 1;
+ return true;
}
-static int odbc_handle_commit(pdo_dbh_t *dbh)
+static bool odbc_handle_commit(pdo_dbh_t *dbh)
{
pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data;
RETCODE rc;
@@ -294,7 +289,7 @@ static int odbc_handle_commit(pdo_dbh_t *dbh)
pdo_odbc_drv_error("SQLEndTran: Commit");
if (rc != SQL_SUCCESS_WITH_INFO) {
- return 0;
+ return false;
}
}
@@ -303,13 +298,13 @@ static int odbc_handle_commit(pdo_dbh_t *dbh)
rc = SQLSetConnectAttr(H->dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, SQL_IS_INTEGER);
if (rc != SQL_SUCCESS) {
pdo_odbc_drv_error("SQLSetConnectAttr AUTOCOMMIT = ON");
- return 0;
+ return false;
}
}
- return 1;
+ return true;
}
-static int odbc_handle_rollback(pdo_dbh_t *dbh)
+static bool odbc_handle_rollback(pdo_dbh_t *dbh)
{
pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data;
RETCODE rc;
@@ -320,7 +315,7 @@ static int odbc_handle_rollback(pdo_dbh_t *dbh)
pdo_odbc_drv_error("SQLEndTran: Rollback");
if (rc != SQL_SUCCESS_WITH_INFO) {
- return 0;
+ return false;
}
}
if (dbh->auto_commit && H->dbc) {
@@ -328,25 +323,30 @@ static int odbc_handle_rollback(pdo_dbh_t *dbh)
rc = SQLSetConnectAttr(H->dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, SQL_IS_INTEGER);
if (rc != SQL_SUCCESS) {
pdo_odbc_drv_error("SQLSetConnectAttr AUTOCOMMIT = ON");
- return 0;
+ return false;
}
}
- return 1;
+ return true;
}
-static int odbc_handle_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
+static bool odbc_handle_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
{
pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data;
+ bool bval;
+
switch (attr) {
case PDO_ODBC_ATTR_ASSUME_UTF8:
- H->assume_utf8 = zval_is_true(val);
- return 1;
+ if (!pdo_get_bool_param(&bval, val)) {
+ return false;
+ }
+ H->assume_utf8 = bval;
+ return true;
default:
strcpy(H->einfo.last_err_msg, "Unknown Attribute");
H->einfo.what = "setAttribute";
strcpy(H->einfo.last_state, "IM001");
- return 0;
+ return false;
}
}
@@ -384,7 +384,11 @@ static const struct pdo_dbh_methods odbc_methods = {
NULL, /* last id */
pdo_odbc_fetch_error_func,
odbc_handle_get_attr, /* get attr */
- NULL, /* check_liveness */
+ NULL, /* check_liveness */
+ NULL, /* get_driver_methods */
+ NULL, /* request_shutdown */
+ NULL, /* in transaction, use PDO's internal tracking mechanism */
+ NULL /* get_gc */
};
static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ */
diff --git a/ext/pdo_odbc/odbc_stmt.c b/ext/pdo_odbc/odbc_stmt.c
index 5e882fbcc9..c1f4b5f497 100644
--- a/ext/pdo_odbc/odbc_stmt.c
+++ b/ext/pdo_odbc/odbc_stmt.c
@@ -88,31 +88,28 @@ static int pdo_odbc_utf82ucs2(pdo_stmt_t *stmt, int is_unicode, const char *buf,
return PDO_ODBC_CONV_NOT_REQUIRED;
}
-static int pdo_odbc_ucs22utf8(pdo_stmt_t *stmt, int is_unicode, const char *buf,
- zend_ulong buflen, zend_ulong *outlen)
+static int pdo_odbc_ucs22utf8(pdo_stmt_t *stmt, int is_unicode, zval *result)
{
#ifdef PHP_WIN32
- if (is_unicode && buflen) {
+ ZEND_ASSERT(Z_TYPE_P(result) == IS_STRING);
+ if (is_unicode && Z_STRLEN_P(result) != 0) {
pdo_odbc_stmt *S = (pdo_odbc_stmt*)stmt->driver_data;
DWORD ret;
- ret = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)buf, buflen/sizeof(WCHAR), NULL, 0, NULL, NULL);
+ ret = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR) Z_STRVAL_P(result), Z_STRLEN_P(result)/sizeof(WCHAR), NULL, 0, NULL, NULL);
if (ret == 0) {
return PDO_ODBC_CONV_FAIL;
}
- if (S->convbufsize <= ret) {
- S->convbufsize = ret + 1;
- S->convbuf = erealloc(S->convbuf, S->convbufsize);
- }
-
- ret = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)buf, buflen/sizeof(WCHAR), S->convbuf, S->convbufsize, NULL, NULL);
+ zend_string *str = zend_string_alloc(ret, 0);
+ ret = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR) Z_STRVAL_P(result), Z_STRLEN_P(result)/sizeof(WCHAR), ZSTR_VAL(str), ZSTR_LEN(str), NULL, NULL);
if (ret == 0) {
return PDO_ODBC_CONV_FAIL;
}
- *outlen = ret;
- S->convbuf[*outlen] = '\0';
+ ZSTR_VAL(str)[ret] = '\0';
+ zval_ptr_dtor_str(result);
+ ZVAL_STR(result, str);
return PDO_ODBC_CONV_OK;
}
#endif
@@ -480,38 +477,27 @@ static int odbc_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *p
P = param->driver_data;
if (P->outbuf) {
- zend_ulong ulen;
- char *srcbuf;
- zend_ulong srclen = 0;
-
if (Z_ISREF(param->parameter)) {
parameter = Z_REFVAL(param->parameter);
} else {
parameter = &param->parameter;
}
zval_ptr_dtor(parameter);
- ZVAL_NULL(parameter);
switch (P->len) {
case SQL_NULL_DATA:
+ ZVAL_NULL(parameter);
break;
default:
- switch (pdo_odbc_ucs22utf8(stmt, P->is_unicode, P->outbuf, P->len, &ulen)) {
+ ZVAL_STRINGL(parameter, P->outbuf, P->len);
+ switch (pdo_odbc_ucs22utf8(stmt, P->is_unicode, parameter)) {
case PDO_ODBC_CONV_FAIL:
/* something fishy, but allow it to come back as binary */
case PDO_ODBC_CONV_NOT_REQUIRED:
- srcbuf = P->outbuf;
- srclen = P->len;
break;
case PDO_ODBC_CONV_OK:
- srcbuf = S->convbuf;
- srclen = ulen;
break;
}
-
- ZVAL_NEW_STR(parameter, zend_string_alloc(srclen, 0));
- memcpy(Z_STRVAL_P(parameter), srcbuf, srclen);
- Z_STRVAL_P(parameter)[Z_STRLEN_P(parameter)] = '\0';
}
}
return 1;
@@ -612,9 +598,6 @@ static int odbc_stmt_describe(pdo_stmt_t *stmt, int colno)
col->name = zend_string_init(S->cols[colno].colname, colnamelen, 0);
S->cols[colno].is_unicode = pdo_odbc_sqltype_is_unicode(S, S->cols[colno].coltype);
- /* returning data as a string */
- col->param_type = PDO_PARAM_STR;
-
/* tell ODBC to put it straight into our buffer, but only if it
* isn't "long" data, and only if we haven't already bound a long
* column. */
@@ -642,17 +625,21 @@ static int odbc_stmt_describe(pdo_stmt_t *stmt, int colno)
return 1;
}
-static int odbc_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, zend_ulong *len, int *caller_frees)
+static int odbc_stmt_get_column_meta(pdo_stmt_t *stmt, zend_long colno, zval *return_value)
+{
+ array_init(return_value);
+ add_assoc_long(return_value, "pdo_type", PDO_PARAM_STR);
+ return 1;
+}
+
+static int odbc_stmt_get_col(pdo_stmt_t *stmt, int colno, zval *result, enum pdo_param_type *type)
{
pdo_odbc_stmt *S = (pdo_odbc_stmt*)stmt->driver_data;
pdo_odbc_column *C = &S->cols[colno];
- zend_ulong ulen;
/* if it is a column containing "long" data, perform late binding now */
if (C->is_long) {
SQLLEN orig_fetched_len = SQL_NULL_DATA;
- zend_ulong used = 0;
- char *buf;
RETCODE rc;
/* fetch it into C->data, which is allocated with a length
@@ -679,11 +666,9 @@ static int odbc_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, zend_ulong
this loop has to work whether or not SQLGetData() provides the total column length.
calling SQLDescribeCol() or other, specifically to get the column length, then doing a single read
for that size would be slower except maybe for extremely long columns.*/
- char *buf2;
-
- buf2 = emalloc(256);
- buf = estrndup(C->data, 256);
- used = 255; /* not 256; the driver NUL terminated the buffer */
+ char *buf2 = emalloc(256);
+ zend_string *str = zend_string_init(C->data, 256, 0);
+ size_t used = 255; /* not 256; the driver NUL terminated the buffer */
do {
C->fetched_len = 0;
@@ -702,12 +687,12 @@ static int odbc_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, zend_ulong
/* point 5, in section "Retrieving Data with SQLGetData" in http://msdn.microsoft.com/en-us/library/windows/desktop/ms715441(v=vs.85).aspx
states that if SQL_SUCCESS_WITH_INFO, fetched_len will be > 255 (greater than buf2's size)
(if a driver fails to follow that and wrote less than 255 bytes to buf2, this will AV or read garbage into buf) */
- buf = erealloc(buf, used + 255+1);
- memcpy(buf + used, buf2, 255);
+ str = zend_string_realloc(str, used + 256, 0);
+ memcpy(ZSTR_VAL(str) + used, buf2, 256);
used = used + 255;
} else if (rc==SQL_SUCCESS) {
- buf = erealloc(buf, used + C->fetched_len+1);
- memcpy(buf + used, buf2, C->fetched_len);
+ str = zend_string_realloc(str, used + C->fetched_len, 0);
+ memcpy(ZSTR_VAL(str) + used, buf2, C->fetched_len);
used = used + C->fetched_len;
} else {
/* includes SQL_NO_DATA */
@@ -719,11 +704,8 @@ static int odbc_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, zend_ulong
efree(buf2);
/* NULL terminate the buffer once, when finished, for use with the rest of PHP */
- buf[used] = '\0';
-
- *ptr = buf;
- *caller_frees = 1;
- *len = used;
+ ZSTR_VAL(str)[used] = '\0';
+ ZVAL_STR(result, str);
if (C->is_unicode) {
goto unicode_conv;
}
@@ -731,8 +713,6 @@ static int odbc_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, zend_ulong
}
/* something went caca */
- *ptr = NULL;
- *len = 0;
return 1;
}
@@ -740,40 +720,29 @@ in_data:
/* check the indicator to ensure that the data is intact */
if (C->fetched_len == SQL_NULL_DATA) {
/* A NULL value */
- *ptr = NULL;
- *len = 0;
+ ZVAL_NULL(result);
return 1;
} else if (C->fetched_len >= 0) {
/* it was stored perfectly */
- *ptr = C->data;
- *len = C->fetched_len;
+ ZVAL_STRINGL_FAST(result, C->data, C->fetched_len);
if (C->is_unicode) {
goto unicode_conv;
}
return 1;
} else {
/* no data? */
- *ptr = NULL;
- *len = 0;
+ ZVAL_NULL(result);
return 1;
}
- unicode_conv:
- switch (pdo_odbc_ucs22utf8(stmt, C->is_unicode, *ptr, *len, &ulen)) {
+unicode_conv:
+ switch (pdo_odbc_ucs22utf8(stmt, C->is_unicode, result)) {
case PDO_ODBC_CONV_FAIL:
/* oh well. They can have the binary version of it */
case PDO_ODBC_CONV_NOT_REQUIRED:
/* shouldn't happen... */
return 1;
-
case PDO_ODBC_CONV_OK:
- if (*caller_frees) {
- efree(*ptr);
- }
- *ptr = emalloc(ulen + 1);
- *len = ulen;
- memcpy(*ptr, S->convbuf, ulen+1);
- *caller_frees = 1;
return 1;
}
return 1;
@@ -883,8 +852,8 @@ const struct pdo_stmt_methods odbc_stmt_methods = {
odbc_stmt_get_col,
odbc_stmt_param_hook,
odbc_stmt_set_param,
- odbc_stmt_get_attr, /* get attr */
- NULL, /* get column meta */
+ odbc_stmt_get_attr,
+ odbc_stmt_get_column_meta,
odbc_stmt_next_rowset,
odbc_stmt_close_cursor
};
diff --git a/ext/pdo_pgsql/pdo_pgsql.c b/ext/pdo_pgsql/pdo_pgsql.c
index 4764419e47..9c711a883e 100644
--- a/ext/pdo_pgsql/pdo_pgsql.c
+++ b/ext/pdo_pgsql/pdo_pgsql.c
@@ -65,8 +65,7 @@ PHP_MINIT_FUNCTION(pdo_pgsql)
REGISTER_PDO_CLASS_CONST_LONG("PGSQL_TRANSACTION_INERROR", (zend_long)PGSQL_TRANSACTION_INERROR);
REGISTER_PDO_CLASS_CONST_LONG("PGSQL_TRANSACTION_UNKNOWN", (zend_long)PGSQL_TRANSACTION_UNKNOWN);
- php_pdo_register_driver(&pdo_pgsql_driver);
- return SUCCESS;
+ return php_pdo_register_driver(&pdo_pgsql_driver);
}
/* }}} */
diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c
index a5b0a22f20..1c511c1d47 100644
--- a/ext/pdo_pgsql/pgsql_driver.c
+++ b/ext/pdo_pgsql/pgsql_driver.c
@@ -107,7 +107,7 @@ static void _pdo_pgsql_notice(pdo_dbh_t *dbh, const char *message) /* {{{ */
}
/* }}} */
-static int pdo_pgsql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) /* {{{ */
+static void pdo_pgsql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) /* {{{ */
{
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
pdo_pgsql_error_info *einfo = &H->einfo;
@@ -115,13 +115,12 @@ static int pdo_pgsql_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *in
if (einfo->errcode) {
add_next_index_long(info, einfo->errcode);
} else {
+ /* Add null to respect expected info array structure */
add_next_index_null(info);
}
if (einfo->errmsg) {
add_next_index_string(info, einfo->errmsg);
}
-
- return 1;
}
/* }}} */
@@ -203,7 +202,7 @@ php_stream *pdo_pgsql_create_lob_stream(zval *dbh, int lfd, Oid oid)
}
/* }}} */
-static int pgsql_handle_closer(pdo_dbh_t *dbh) /* {{{ */
+static void pgsql_handle_closer(pdo_dbh_t *dbh) /* {{{ */
{
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
if (H) {
@@ -218,18 +217,16 @@ static int pgsql_handle_closer(pdo_dbh_t *dbh) /* {{{ */
pefree(H, dbh->is_persistent);
dbh->driver_data = NULL;
}
- return 0;
}
/* }}} */
-static int pgsql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options)
+static bool pgsql_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options)
{
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
pdo_pgsql_stmt *S = ecalloc(1, sizeof(pdo_pgsql_stmt));
int scrollable;
int ret;
- char *nsql = NULL;
- size_t nsql_len = 0;
+ zend_string *nsql = NULL;
int emulate = 0;
int execute_only = 0;
@@ -269,17 +266,17 @@ static int pgsql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len
stmt->named_rewrite_template = "$%d";
}
- ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len);
+ ret = pdo_parse_params(stmt, sql, &nsql);
if (ret == -1) {
/* couldn't grok it */
strcpy(dbh->error_code, stmt->error_code);
- return 0;
+ return false;
} else if (ret == 1) {
/* query was re-written */
S->query = nsql;
} else {
- S->query = estrdup(sql);
+ S->query = zend_string_copy(sql);
}
if (!emulate && !execute_only) {
@@ -288,17 +285,17 @@ static int pgsql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len
spprintf(&S->stmt_name, 0, "pdo_stmt_%08x", ++H->stmt_counter);
}
- return 1;
+ return true;
}
-static zend_long pgsql_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_len)
+static zend_long pgsql_handle_doer(pdo_dbh_t *dbh, const zend_string *sql)
{
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
PGresult *res;
zend_long ret = 1;
ExecStatusType qs;
- if (!(res = PQexec(H->server, sql))) {
+ if (!(res = PQexec(H->server, ZSTR_VAL(sql)))) {
/* fatal error */
pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
return -1;
@@ -320,39 +317,45 @@ static zend_long pgsql_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_l
return ret;
}
-static int pgsql_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unquotedlen, char **quoted, size_t *quotedlen, enum pdo_param_type paramtype)
+static zend_string* pgsql_handle_quoter(pdo_dbh_t *dbh, const zend_string *unquoted, enum pdo_param_type paramtype)
{
unsigned char *escaped;
+ char *quoted;
+ size_t quotedlen;
+ zend_string *quoted_str;
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
size_t tmp_len;
switch (paramtype) {
case PDO_PARAM_LOB:
/* escapedlen returned by PQescapeBytea() accounts for trailing 0 */
- escaped = PQescapeByteaConn(H->server, (unsigned char *)unquoted, unquotedlen, &tmp_len);
- *quotedlen = tmp_len + 1;
- *quoted = emalloc(*quotedlen + 1);
- memcpy((*quoted)+1, escaped, *quotedlen-2);
- (*quoted)[0] = '\'';
- (*quoted)[*quotedlen-1] = '\'';
- (*quoted)[*quotedlen] = '\0';
+ escaped = PQescapeByteaConn(H->server, (unsigned char *)ZSTR_VAL(unquoted), ZSTR_LEN(unquoted), &tmp_len);
+ quotedlen = tmp_len + 1;
+ quoted = emalloc(quotedlen + 1);
+ memcpy(quoted+1, escaped, quotedlen-2);
+ quoted[0] = '\'';
+ quoted[quotedlen-1] = '\'';
+ quoted[quotedlen] = '\0';
PQfreemem(escaped);
break;
default:
- *quoted = safe_emalloc(2, unquotedlen, 3);
- (*quoted)[0] = '\'';
- *quotedlen = PQescapeStringConn(H->server, *quoted + 1, unquoted, unquotedlen, NULL);
- (*quoted)[*quotedlen + 1] = '\'';
- (*quoted)[*quotedlen + 2] = '\0';
- *quotedlen += 2;
+ quoted = safe_emalloc(2, ZSTR_LEN(unquoted), 3);
+ quoted[0] = '\'';
+ quotedlen = PQescapeStringConn(H->server, quoted + 1, ZSTR_VAL(unquoted), ZSTR_LEN(unquoted), NULL);
+ quoted[quotedlen + 1] = '\'';
+ quoted[quotedlen + 2] = '\0';
+ quotedlen += 2;
}
- return 1;
+
+ quoted_str = zend_string_init(quoted, quotedlen, 0);
+ efree(quoted);
+ return quoted_str;
}
-static char *pdo_pgsql_last_insert_id(pdo_dbh_t *dbh, const char *name, size_t *len)
+static zend_string *pdo_pgsql_last_insert_id(pdo_dbh_t *dbh, const zend_string *name)
{
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
- char *id = NULL;
+ zend_string *id = NULL;
PGresult *res;
ExecStatusType status;
@@ -360,15 +363,14 @@ static char *pdo_pgsql_last_insert_id(pdo_dbh_t *dbh, const char *name, size_t *
res = PQexec(H->server, "SELECT LASTVAL()");
} else {
const char *q[1];
- q[0] = name;
+ q[0] = ZSTR_VAL(name);
res = PQexecParams(H->server, "SELECT CURRVAL($1)", 1, NULL, q, NULL, NULL, 0);
}
status = PQresultStatus(res);
if (res && (status == PGRES_TUPLES_OK)) {
- id = estrdup((char *)PQgetvalue(res, 0, 0));
- *len = PQgetlength(res, 0, 0);
+ id = zend_string_init((char *)PQgetvalue(res, 0, 0), PQgetlength(res, 0, 0), 0);
} else {
pdo_pgsql_error(dbh, status, pdo_pgsql_sqlstate(res));
}
@@ -489,7 +491,7 @@ static int pdo_pgsql_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_
}
/* {{{ */
-static int pdo_pgsql_check_liveness(pdo_dbh_t *dbh)
+static zend_result pdo_pgsql_check_liveness(pdo_dbh_t *dbh)
{
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
if (!PQconsumeInput(H->server) || PQstatus(H->server) == CONNECTION_BAD) {
@@ -499,7 +501,7 @@ static int pdo_pgsql_check_liveness(pdo_dbh_t *dbh)
}
/* }}} */
-static int pgsql_handle_in_transaction(pdo_dbh_t *dbh)
+static bool pgsql_handle_in_transaction(pdo_dbh_t *dbh)
{
pdo_pgsql_db_handle *H;
@@ -508,31 +510,31 @@ static int pgsql_handle_in_transaction(pdo_dbh_t *dbh)
return PQtransactionStatus(H->server) > PQTRANS_IDLE;
}
-static int pdo_pgsql_transaction_cmd(const char *cmd, pdo_dbh_t *dbh)
+static bool pdo_pgsql_transaction_cmd(const char *cmd, pdo_dbh_t *dbh)
{
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
PGresult *res;
- int ret = 1;
+ bool ret = true;
res = PQexec(H->server, cmd);
if (PQresultStatus(res) != PGRES_COMMAND_OK) {
pdo_pgsql_error(dbh, PQresultStatus(res), pdo_pgsql_sqlstate(res));
- ret = 0;
+ ret = false;
}
PQclear(res);
return ret;
}
-static int pgsql_handle_begin(pdo_dbh_t *dbh)
+static bool pgsql_handle_begin(pdo_dbh_t *dbh)
{
return pdo_pgsql_transaction_cmd("BEGIN", dbh);
}
-static int pgsql_handle_commit(pdo_dbh_t *dbh)
+static bool pgsql_handle_commit(pdo_dbh_t *dbh)
{
- int ret = pdo_pgsql_transaction_cmd("COMMIT", dbh);
+ bool ret = pdo_pgsql_transaction_cmd("COMMIT", dbh);
/* When deferred constraints are used the commit could
fail, and a ROLLBACK implicitly ran. See bug #67462 */
@@ -543,7 +545,7 @@ static int pgsql_handle_commit(pdo_dbh_t *dbh)
return ret;
}
-static int pgsql_handle_rollback(pdo_dbh_t *dbh)
+static bool pgsql_handle_rollback(pdo_dbh_t *dbh)
{
return pdo_pgsql_transaction_cmd("ROLLBACK", dbh);
}
@@ -1150,20 +1152,26 @@ static const zend_function_entry *pdo_pgsql_get_driver_methods(pdo_dbh_t *dbh, i
}
}
-static int pdo_pgsql_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
+static bool pdo_pgsql_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
{
- zend_bool bval = zval_get_long(val)? 1 : 0;
+ bool bval;
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
switch (attr) {
case PDO_ATTR_EMULATE_PREPARES:
+ if (!pdo_get_bool_param(&bval, val)) {
+ return false;
+ }
H->emulate_prepares = bval;
- return 1;
+ return true;
case PDO_PGSQL_ATTR_DISABLE_PREPARES:
+ if (!pdo_get_bool_param(&bval, val)) {
+ return false;
+ }
H->disable_prepares = bval;
- return 1;
+ return true;
default:
- return 0;
+ return false;
}
}
@@ -1183,6 +1191,7 @@ static const struct pdo_dbh_methods pgsql_methods = {
pdo_pgsql_get_driver_methods, /* get_driver_methods */
NULL,
pgsql_handle_in_transaction,
+ NULL /* get_gc */
};
static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ */
diff --git a/ext/pdo_pgsql/pgsql_statement.c b/ext/pdo_pgsql/pgsql_statement.c
index 21f4c83807..6570a86e14 100644
--- a/ext/pdo_pgsql/pgsql_statement.c
+++ b/ext/pdo_pgsql/pgsql_statement.c
@@ -57,7 +57,7 @@
static int pgsql_stmt_dtor(pdo_stmt_t *stmt)
{
pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
- zend_bool server_obj_usable = !Z_ISUNDEF(stmt->database_object_handle)
+ bool server_obj_usable = !Z_ISUNDEF(stmt->database_object_handle)
&& IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)])
&& !(OBJ_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED);
@@ -100,7 +100,7 @@ static int pgsql_stmt_dtor(pdo_stmt_t *stmt)
S->param_types = NULL;
}
if (S->query) {
- efree(S->query);
+ zend_string_release(S->query);
S->query = NULL;
}
@@ -151,7 +151,7 @@ static int pgsql_stmt_execute(pdo_stmt_t *stmt)
efree(q);
}
- spprintf(&q, 0, "DECLARE %s SCROLL CURSOR WITH HOLD FOR %s", S->cursor_name, stmt->active_query_string);
+ spprintf(&q, 0, "DECLARE %s SCROLL CURSOR WITH HOLD FOR %s", S->cursor_name, ZSTR_VAL(stmt->active_query_string));
S->result = PQexec(H->server, q);
efree(q);
@@ -177,7 +177,7 @@ static int pgsql_stmt_execute(pdo_stmt_t *stmt)
stmt_retry:
/* we deferred the prepare until now, because we didn't
* know anything about the parameter types; now we do */
- S->result = PQprepare(H->server, S->stmt_name, S->query,
+ S->result = PQprepare(H->server, S->stmt_name, ZSTR_VAL(S->query),
stmt->bound_params ? zend_hash_num_elements(stmt->bound_params) : 0,
S->param_types);
status = PQresultStatus(S->result);
@@ -222,7 +222,7 @@ stmt_retry:
0);
} else if (stmt->supports_placeholders == PDO_PLACEHOLDER_NAMED) {
/* execute query with parameters */
- S->result = PQexecParams(H->server, S->query,
+ S->result = PQexecParams(H->server, ZSTR_VAL(S->query),
stmt->bound_params ? zend_hash_num_elements(stmt->bound_params) : 0,
S->param_types,
(const char**)S->param_values,
@@ -231,7 +231,7 @@ stmt_retry:
0);
} else {
/* execute plain query (with embedded parameters) */
- S->result = PQexec(H->server, stmt->active_query_string);
+ S->result = PQexec(H->server, ZSTR_VAL(stmt->active_query_string));
}
status = PQresultStatus(S->result);
@@ -275,11 +275,11 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
ZEND_ATOL(param->paramno, ZSTR_VAL(param->name) + 1);
} else {
/* resolve parameter name to rewritten name */
- char *namevar;
+ zend_string *namevar;
if (stmt->bound_param_map && (namevar = zend_hash_find_ptr(stmt->bound_param_map,
param->name)) != NULL) {
- ZEND_ATOL(param->paramno, namevar + 1);
+ ZEND_ATOL(param->paramno, ZSTR_VAL(namevar) + 1);
param->paramno--;
} else {
pdo_pgsql_error_stmt_msg(stmt, 0, "HY093", ZSTR_VAL(param->name));
@@ -359,7 +359,6 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
} else {
zend_string *str = php_stream_copy_to_mem(stm, PHP_STREAM_COPY_ALL, 0);
if (str != NULL) {
- //??SEPARATE_ZVAL_IF_NOT_REF(&param->parameter);
ZVAL_STR(parameter, str);
} else {
ZVAL_EMPTY_STRING(parameter);
@@ -381,8 +380,7 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
S->param_lengths[param->paramno] = 1;
S->param_formats[param->paramno] = 0;
} else {
- //SEPARATE_ZVAL_IF_NOT_REF(&param->parameter);
- convert_to_string_ex(parameter);
+ convert_to_string(parameter);
S->param_values[param->paramno] = Z_STRVAL_P(parameter);
S->param_lengths[param->paramno] = Z_STRLEN_P(parameter);
S->param_formats[param->paramno] = 0;
@@ -467,7 +465,6 @@ static int pgsql_stmt_describe(pdo_stmt_t *stmt, int colno)
{
pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
struct pdo_column_data *cols = stmt->columns;
- struct pdo_bound_param_data *param;
char *str;
if (!S->result) {
@@ -480,122 +477,79 @@ static int pgsql_stmt_describe(pdo_stmt_t *stmt, int colno)
cols[colno].precision = PQfmod(S->result, colno);
S->cols[colno].pgsql_type = PQftype(S->result, colno);
- switch (S->cols[colno].pgsql_type) {
-
- case BOOLOID:
- cols[colno].param_type = PDO_PARAM_BOOL;
- break;
-
- case OIDOID:
- /* did the user bind the column as a LOB ? */
- if (stmt->bound_columns && (
- (param = zend_hash_index_find_ptr(stmt->bound_columns, colno)) != NULL ||
- (param = zend_hash_find_ptr(stmt->bound_columns, cols[colno].name)) != NULL)) {
-
- if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_LOB) {
- cols[colno].param_type = PDO_PARAM_LOB;
- break;
- }
- }
- cols[colno].param_type = PDO_PARAM_INT;
- break;
-
- case INT2OID:
- case INT4OID:
- cols[colno].param_type = PDO_PARAM_INT;
- break;
-
- case INT8OID:
- if (sizeof(zend_long)>=8) {
- cols[colno].param_type = PDO_PARAM_INT;
- } else {
- cols[colno].param_type = PDO_PARAM_STR;
- }
- break;
-
- case BYTEAOID:
- cols[colno].param_type = PDO_PARAM_LOB;
- break;
-
- default:
- cols[colno].param_type = PDO_PARAM_STR;
- }
-
return 1;
}
-static int pgsql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, size_t *len, int *caller_frees )
+static int pgsql_stmt_get_col(pdo_stmt_t *stmt, int colno, zval *result, enum pdo_param_type *type)
{
pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
- struct pdo_column_data *cols = stmt->columns;
- size_t tmp_len;
-
if (!S->result) {
return 0;
}
/* We have already increased count by 1 in pgsql_stmt_fetch() */
if (PQgetisnull(S->result, S->current_row - 1, colno)) { /* Check if we got NULL */
- *ptr = NULL;
- *len = 0;
+ ZVAL_NULL(result);
} else {
- *ptr = PQgetvalue(S->result, S->current_row - 1, colno);
- *len = PQgetlength(S->result, S->current_row - 1, colno);
-
- switch (cols[colno].param_type) {
+ char *ptr = PQgetvalue(S->result, S->current_row - 1, colno);
+ size_t len = PQgetlength(S->result, S->current_row - 1, colno);
- case PDO_PARAM_INT:
- ZEND_ATOL(S->cols[colno].intval, *ptr);
- *ptr = (char *) &(S->cols[colno].intval);
- *len = sizeof(zend_long);
+ switch (S->cols[colno].pgsql_type) {
+ case BOOLOID:
+ ZVAL_BOOL(result, *ptr == 't');
break;
- case PDO_PARAM_BOOL:
- S->cols[colno].boolval = **ptr == 't';
- *ptr = (char *) &(S->cols[colno].boolval);
- *len = sizeof(zend_bool);
+ case INT2OID:
+ case INT4OID:
+#if SIZEOF_ZEND_LONG >= 8
+ case INT8OID:
+#endif
+ {
+ zend_long intval;
+ ZEND_ATOL(intval, ptr);
+ ZVAL_LONG(result, intval);
break;
+ }
- case PDO_PARAM_LOB:
- if (S->cols[colno].pgsql_type == OIDOID) {
- /* ooo, a real large object */
- char *end_ptr;
- Oid oid = (Oid)strtoul(*ptr, &end_ptr, 10);
+ case OIDOID: {
+ char *end_ptr;
+ Oid oid = (Oid)strtoul(ptr, &end_ptr, 10);
+ if (type && *type == PDO_PARAM_LOB) {
+ /* If column was bound as LOB, return a stream. */
int loid = lo_open(S->H->server, oid, INV_READ);
if (loid >= 0) {
- *ptr = (char*)pdo_pgsql_create_lob_stream(&stmt->database_object_handle, loid, oid);
- *len = 0;
- return *ptr ? 1 : 0;
+ php_stream *stream = pdo_pgsql_create_lob_stream(&stmt->database_object_handle, loid, oid);
+ if (stream) {
+ php_stream_to_zval(stream, result);
+ return 1;
+ }
}
- *ptr = NULL;
- *len = 0;
return 0;
} else {
- char *tmp_ptr = (char *)PQunescapeBytea((unsigned char *)*ptr, &tmp_len);
- if (!tmp_ptr) {
- /* PQunescapeBytea returned an error */
- *len = 0;
- return 0;
- }
- if (!tmp_len) {
- /* Empty string, return as empty stream */
- *ptr = (char *)php_stream_memory_open(TEMP_STREAM_READONLY, "", 0);
- PQfreemem(tmp_ptr);
- *len = 0;
- } else {
- *ptr = estrndup(tmp_ptr, tmp_len);
- PQfreemem(tmp_ptr);
- *len = tmp_len;
- *caller_frees = 1;
- }
+ /* Otherwise return OID as integer. */
+ ZVAL_LONG(result, oid);
}
break;
- case PDO_PARAM_NULL:
- case PDO_PARAM_STR:
- case PDO_PARAM_STMT:
- case PDO_PARAM_INPUT_OUTPUT:
- case PDO_PARAM_ZVAL:
+ }
+
+ case BYTEAOID: {
+ size_t tmp_len;
+ char *tmp_ptr = (char *)PQunescapeBytea((unsigned char *) ptr, &tmp_len);
+ if (!tmp_ptr) {
+ /* PQunescapeBytea returned an error */
+ return 0;
+ }
+
+ zend_string *str = zend_string_init(tmp_ptr, tmp_len, 0);
+ php_stream *stream = php_stream_memory_open(TEMP_STREAM_READONLY, str);
+ php_stream_to_zval(stream, result);
+ zend_string_release(str);
+ PQfreemem(tmp_ptr);
+ break;
+ }
+
default:
+ ZVAL_STRINGL_FAST(result, ptr, len);
break;
}
}
@@ -698,6 +652,26 @@ static int pgsql_stmt_get_column_meta(pdo_stmt_t *stmt, zend_long colno, zval *r
}
PQclear(res);
}
+
+ enum pdo_param_type param_type;
+ switch (S->cols[colno].pgsql_type) {
+ case BOOLOID:
+ param_type = PDO_PARAM_BOOL;
+ break;
+ case INT2OID:
+ case INT4OID:
+ case INT8OID:
+ param_type = PDO_PARAM_INT;
+ break;
+ case OIDOID:
+ case BYTEAOID:
+ param_type = PDO_PARAM_LOB;
+ break;
+ default:
+ param_type = PDO_PARAM_STR;
+ }
+ add_assoc_long(return_value, "pdo_type", param_type);
+
return 1;
}
diff --git a/ext/pdo_pgsql/php_pdo_pgsql_int.h b/ext/pdo_pgsql/php_pdo_pgsql_int.h
index bc31c9cdee..16aeb3ca48 100644
--- a/ext/pdo_pgsql/php_pdo_pgsql_int.h
+++ b/ext/pdo_pgsql/php_pdo_pgsql_int.h
@@ -42,16 +42,13 @@ typedef struct {
unsigned int stmt_counter;
/* The following two variables have the same purpose. Unfortunately we need
to keep track of two different attributes having the same effect. */
- zend_bool emulate_prepares;
- zend_bool disable_native_prepares; /* deprecated since 5.6 */
- zend_bool disable_prepares;
+ bool emulate_prepares;
+ bool disable_native_prepares; /* deprecated since 5.6 */
+ bool disable_prepares;
} pdo_pgsql_db_handle;
typedef struct {
- char *def;
- zend_long intval;
Oid pgsql_type;
- zend_bool boolval;
} pdo_pgsql_column;
typedef struct {
@@ -60,13 +57,13 @@ typedef struct {
pdo_pgsql_column *cols;
char *cursor_name;
char *stmt_name;
- char *query;
+ zend_string *query;
char **param_values;
int *param_lengths;
int *param_formats;
Oid *param_types;
int current_row;
- zend_bool is_prepared;
+ bool is_prepared;
} pdo_pgsql_stmt;
typedef struct {
diff --git a/ext/pdo_pgsql/tests/bug62498.phpt b/ext/pdo_pgsql/tests/bug62498.phpt
index 1620e7e77a..2970278204 100644
--- a/ext/pdo_pgsql/tests/bug62498.phpt
+++ b/ext/pdo_pgsql/tests/bug62498.phpt
@@ -56,14 +56,14 @@ array(9) {
string(13) "bugtest_62498"
["native_type"]=>
string(4) "int2"
+ ["pdo_type"]=>
+ int(2)
["name"]=>
string(7) "int2col"
["len"]=>
int(2)
["precision"]=>
int(-1)
- ["pdo_type"]=>
- int(1)
}
[1]=>
array(8) {
@@ -75,14 +75,14 @@ array(9) {
string(13) "bugtest_62498"
["native_type"]=>
string(4) "int4"
+ ["pdo_type"]=>
+ int(2)
["name"]=>
string(7) "int4col"
["len"]=>
int(4)
["precision"]=>
int(-1)
- ["pdo_type"]=>
- int(1)
}
[2]=>
array(8) {
@@ -94,14 +94,14 @@ array(9) {
string(13) "bugtest_62498"
["native_type"]=>
string(4) "int8"
+ ["pdo_type"]=>
+ int(2)
["name"]=>
string(7) "int8col"
["len"]=>
int(8)
["precision"]=>
int(-1)
- ["pdo_type"]=>
- int(1)
}
[3]=>
array(8) {
@@ -113,14 +113,14 @@ array(9) {
string(13) "bugtest_62498"
["native_type"]=>
string(7) "varchar"
+ ["pdo_type"]=>
+ int(3)
["name"]=>
string(9) "stringcol"
["len"]=>
int(-1)
["precision"]=>
int(259)
- ["pdo_type"]=>
- int(2)
}
[4]=>
array(8) {
@@ -132,14 +132,14 @@ array(9) {
string(13) "bugtest_62498"
["native_type"]=>
string(4) "bool"
+ ["pdo_type"]=>
+ int(1)
["name"]=>
string(7) "boolcol"
["len"]=>
int(1)
["precision"]=>
int(-1)
- ["pdo_type"]=>
- int(5)
}
[5]=>
array(8) {
@@ -151,14 +151,14 @@ array(9) {
string(13) "bugtest_62498"
["native_type"]=>
string(4) "date"
+ ["pdo_type"]=>
+ int(3)
["name"]=>
string(7) "datecol"
["len"]=>
int(4)
["precision"]=>
int(-1)
- ["pdo_type"]=>
- int(2)
}
[6]=>
array(8) {
@@ -170,14 +170,14 @@ array(9) {
string(13) "bugtest_62498"
["native_type"]=>
string(4) "text"
+ ["pdo_type"]=>
+ int(3)
["name"]=>
string(7) "textcol"
["len"]=>
int(-1)
["precision"]=>
int(-1)
- ["pdo_type"]=>
- int(2)
}
[7]=>
array(8) {
@@ -189,14 +189,14 @@ array(9) {
string(13) "bugtest_62498"
["native_type"]=>
string(9) "timestamp"
+ ["pdo_type"]=>
+ int(3)
["name"]=>
string(5) "tscol"
["len"]=>
int(8)
["precision"]=>
int(-1)
- ["pdo_type"]=>
- int(2)
}
[8]=>
array(8) {
@@ -208,14 +208,14 @@ array(9) {
string(13) "bugtest_62498"
["native_type"]=>
string(5) "bytea"
+ ["pdo_type"]=>
+ int(4)
["name"]=>
string(8) "byteacol"
["len"]=>
int(-1)
["precision"]=>
int(-1)
- ["pdo_type"]=>
- int(3)
}
}
Done
diff --git a/ext/pdo_pgsql/tests/bug62593.phpt b/ext/pdo_pgsql/tests/bug62593.phpt
index 598307a652..a50bcdbc25 100644
--- a/ext/pdo_pgsql/tests/bug62593.phpt
+++ b/ext/pdo_pgsql/tests/bug62593.phpt
@@ -13,6 +13,7 @@ require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc';
$db = PDOTest::test_factory(__DIR__ . '/common.phpt');
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$errors = array();
$value = true;
diff --git a/ext/pdo_pgsql/tests/bug71885.phpt b/ext/pdo_pgsql/tests/bug71885.phpt
index f47ffcb444..a0a72b6796 100644
--- a/ext/pdo_pgsql/tests/bug71885.phpt
+++ b/ext/pdo_pgsql/tests/bug71885.phpt
@@ -37,10 +37,10 @@ foreach ([false, true] as $emulate) {
string(3) "ERR"
array(1) {
[0]=>
- bool(true)
+ string(1) "1"
}
array(1) {
[0]=>
- bool(true)
+ string(1) "1"
}
==OK==
diff --git a/ext/pdo_pgsql/tests/bug71885_2.phpt b/ext/pdo_pgsql/tests/bug71885_2.phpt
index 2f9b9923b0..334899db48 100644
--- a/ext/pdo_pgsql/tests/bug71885_2.phpt
+++ b/ext/pdo_pgsql/tests/bug71885_2.phpt
@@ -40,18 +40,18 @@ foreach ([false, true] as $emulate) {
--EXPECT--
array(1) {
[0]=>
- bool(false)
+ string(1) "0"
}
array(1) {
[0]=>
- bool(true)
+ string(1) "1"
}
array(1) {
[0]=>
- bool(false)
+ string(1) "0"
}
array(1) {
[0]=>
- bool(true)
+ string(1) "1"
}
==OK==
diff --git a/ext/pdo_pgsql/tests/bug75402.phpt b/ext/pdo_pgsql/tests/bug75402.phpt
index 3aa26660ef..5db01b16b5 100644
--- a/ext/pdo_pgsql/tests/bug75402.phpt
+++ b/ext/pdo_pgsql/tests/bug75402.phpt
@@ -105,7 +105,7 @@ object(stdClass)#2 (1) {
["sprogress"]=>
string(3) "100"
["bhidden"]=>
- bool(false)
+ string(1) "0"
["sdatetime"]=>
string(19) "2017.10.16 08:36:45"
}
diff --git a/ext/pdo_pgsql/tests/debug_emulated_prepares.phpt b/ext/pdo_pgsql/tests/debug_emulated_prepares.phpt
index dfbbcb4ad4..5c8f590351 100644
--- a/ext/pdo_pgsql/tests/debug_emulated_prepares.phpt
+++ b/ext/pdo_pgsql/tests/debug_emulated_prepares.phpt
@@ -31,17 +31,17 @@ Key: Name: [5] :bool
paramno=-1
name=[5] ":bool"
is_param=1
-param_type=2
+param_type=3
Key: Name: [4] :int
paramno=-1
name=[4] ":int"
is_param=1
-param_type=1
+param_type=2
Key: Name: [7] :string
paramno=-1
name=[7] ":string"
is_param=1
-param_type=2
+param_type=3
Key: Name: [5] :null
paramno=-1
name=[5] ":null"
diff --git a/ext/pdo_sqlite/sqlite_driver.c b/ext/pdo_sqlite/sqlite_driver.c
index 26fa1c00eb..b7c20b1eae 100644
--- a/ext/pdo_sqlite/sqlite_driver.c
+++ b/ext/pdo_sqlite/sqlite_driver.c
@@ -82,7 +82,7 @@ int _pdo_sqlite_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int li
}
/* }}} */
-static int pdo_sqlite_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info)
+static void pdo_sqlite_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info)
{
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
pdo_sqlite_error_info *einfo = &H->einfo;
@@ -91,8 +91,6 @@ static int pdo_sqlite_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *i
add_next_index_long(info, einfo->errcode);
add_next_index_string(info, einfo->errmsg);
}
-
- return 1;
}
static void pdo_sqlite_cleanup_callbacks(pdo_sqlite_db_handle *H)
@@ -148,7 +146,7 @@ static void pdo_sqlite_cleanup_callbacks(pdo_sqlite_db_handle *H)
}
}
-static int sqlite_handle_closer(pdo_dbh_t *dbh) /* {{{ */
+static void sqlite_handle_closer(pdo_dbh_t *dbh) /* {{{ */
{
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
@@ -171,11 +169,10 @@ static int sqlite_handle_closer(pdo_dbh_t *dbh) /* {{{ */
pefree(H, dbh->is_persistent);
dbh->driver_data = NULL;
}
- return 0;
}
/* }}} */
-static int sqlite_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options)
+static bool sqlite_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options)
{
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
pdo_sqlite_stmt *S = ecalloc(1, sizeof(pdo_sqlite_stmt));
@@ -190,25 +187,25 @@ static int sqlite_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_le
if (PDO_CURSOR_FWDONLY != pdo_attr_lval(driver_options, PDO_ATTR_CURSOR, PDO_CURSOR_FWDONLY)) {
H->einfo.errcode = SQLITE_ERROR;
pdo_sqlite_error(dbh);
- return 0;
+ return false;
}
- i = sqlite3_prepare_v2(H->db, sql, sql_len, &S->stmt, &tail);
+ i = sqlite3_prepare_v2(H->db, ZSTR_VAL(sql), ZSTR_LEN(sql), &S->stmt, &tail);
if (i == SQLITE_OK) {
- return 1;
+ return true;
}
pdo_sqlite_error(dbh);
- return 0;
+ return false;
}
-static zend_long sqlite_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_len)
+static zend_long sqlite_handle_doer(pdo_dbh_t *dbh, const zend_string *sql)
{
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
char *errmsg = NULL;
- if (sqlite3_exec(H->db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
+ if (sqlite3_exec(H->db, ZSTR_VAL(sql), NULL, NULL, &errmsg) != SQLITE_OK) {
pdo_sqlite_error(dbh);
if (errmsg)
sqlite3_free(errmsg);
@@ -219,26 +216,25 @@ static zend_long sqlite_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_
}
}
-static char *pdo_sqlite_last_insert_id(pdo_dbh_t *dbh, const char *name, size_t *len)
+static zend_string *pdo_sqlite_last_insert_id(pdo_dbh_t *dbh, const zend_string *name)
{
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
- char *id;
- id = php_pdo_int64_to_str(sqlite3_last_insert_rowid(H->db));
- *len = strlen(id);
- return id;
+ return php_pdo_int64_to_str(sqlite3_last_insert_rowid(H->db));
}
/* NB: doesn't handle binary strings... use prepared stmts for that */
-static int sqlite_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unquotedlen, char **quoted, size_t *quotedlen, enum pdo_param_type paramtype )
+static zend_string* sqlite_handle_quoter(pdo_dbh_t *dbh, const zend_string *unquoted, enum pdo_param_type paramtype)
{
- *quoted = safe_emalloc(2, unquotedlen, 3);
- sqlite3_snprintf(2*unquotedlen + 3, *quoted, "'%q'", unquoted);
- *quotedlen = strlen(*quoted);
- return 1;
+ char *quoted = safe_emalloc(2, ZSTR_LEN(unquoted), 3);
+ /* TODO use %Q format? */
+ sqlite3_snprintf(2*ZSTR_LEN(unquoted) + 3, quoted, "'%q'", ZSTR_VAL(unquoted));
+ zend_string *quoted_str = zend_string_init(quoted, strlen(quoted), 0);
+ efree(quoted);
+ return quoted_str;
}
-static int sqlite_handle_begin(pdo_dbh_t *dbh)
+static bool sqlite_handle_begin(pdo_dbh_t *dbh)
{
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
char *errmsg = NULL;
@@ -247,12 +243,12 @@ static int sqlite_handle_begin(pdo_dbh_t *dbh)
pdo_sqlite_error(dbh);
if (errmsg)
sqlite3_free(errmsg);
- return 0;
+ return false;
}
- return 1;
+ return true;
}
-static int sqlite_handle_commit(pdo_dbh_t *dbh)
+static bool sqlite_handle_commit(pdo_dbh_t *dbh)
{
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
char *errmsg = NULL;
@@ -261,12 +257,12 @@ static int sqlite_handle_commit(pdo_dbh_t *dbh)
pdo_sqlite_error(dbh);
if (errmsg)
sqlite3_free(errmsg);
- return 0;
+ return false;
}
- return 1;
+ return true;
}
-static int sqlite_handle_rollback(pdo_dbh_t *dbh)
+static bool sqlite_handle_rollback(pdo_dbh_t *dbh)
{
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
char *errmsg = NULL;
@@ -275,9 +271,9 @@ static int sqlite_handle_rollback(pdo_dbh_t *dbh)
pdo_sqlite_error(dbh);
if (errmsg)
sqlite3_free(errmsg);
- return 0;
+ return false;
}
- return 1;
+ return true;
}
static int pdo_sqlite_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_value)
@@ -295,19 +291,26 @@ static int pdo_sqlite_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return
return 1;
}
-static int pdo_sqlite_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
+static bool pdo_sqlite_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
{
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
+ zend_long lval;
switch (attr) {
case PDO_ATTR_TIMEOUT:
- sqlite3_busy_timeout(H->db, zval_get_long(val) * 1000);
- return 1;
+ if (!pdo_get_long_param(&lval, val)) {
+ return false;
+ }
+ sqlite3_busy_timeout(H->db, lval * 1000);
+ return true;
case PDO_SQLITE_ATTR_EXTENDED_RESULT_CODES:
- sqlite3_extended_result_codes(H->db, zval_get_long(val));
- return 1;
+ if (!pdo_get_long_param(&lval, val)) {
+ return false;
+ }
+ sqlite3_extended_result_codes(H->db, lval);
+ return true;
}
- return 0;
+ return false;
}
typedef struct {
@@ -497,7 +500,7 @@ static int php_sqlite3_collation_callback(void *context,
php_error_docref(NULL, E_WARNING, "An error occurred while invoking the callback");
} else if (!Z_ISUNDEF(retval)) {
if (Z_TYPE(retval) != IS_LONG) {
- convert_to_long_ex(&retval);
+ convert_to_long(&retval);
}
ret = 0;
if (Z_LVAL(retval) > 0) {
@@ -695,6 +698,25 @@ static void pdo_sqlite_request_shutdown(pdo_dbh_t *dbh)
}
}
+static void pdo_sqlite_get_gc(pdo_dbh_t *dbh, zend_get_gc_buffer *gc_buffer)
+{
+ pdo_sqlite_db_handle *H = dbh->driver_data;
+
+ struct pdo_sqlite_func *func = H->funcs;
+ while (func) {
+ zend_get_gc_buffer_add_zval(gc_buffer, &func->func);
+ zend_get_gc_buffer_add_zval(gc_buffer, &func->step);
+ zend_get_gc_buffer_add_zval(gc_buffer, &func->fini);
+ func = func->next;
+ }
+
+ struct pdo_sqlite_collation *collation = H->collations;
+ while (collation) {
+ zend_get_gc_buffer_add_zval(gc_buffer, &collation->callback);
+ collation = collation->next;
+ }
+}
+
static const struct pdo_dbh_methods sqlite_methods = {
sqlite_handle_closer,
sqlite_handle_preparer,
@@ -710,11 +732,18 @@ static const struct pdo_dbh_methods sqlite_methods = {
NULL, /* check_liveness: not needed */
get_driver_methods,
pdo_sqlite_request_shutdown,
- NULL
+ NULL, /* in transaction, use PDO's internal tracking mechanism */
+ pdo_sqlite_get_gc
};
static char *make_filename_safe(const char *filename)
{
+ if (*filename && strncasecmp(filename, "file:", 5) == 0) {
+ if (PG(open_basedir) && *PG(open_basedir)) {
+ return NULL;
+ }
+ return estrdup(filename);
+ }
if (*filename && memcmp(filename, ":memory:", sizeof(":memory:"))) {
char *fullpath = expand_filepath(filename, NULL);
@@ -787,6 +816,9 @@ static int pdo_sqlite_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{
flags = pdo_attr_lval(driver_options, PDO_SQLITE_ATTR_OPEN_FLAGS, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE);
+ if (!(PG(open_basedir) && *PG(open_basedir))) {
+ flags |= SQLITE_OPEN_URI;
+ }
i = sqlite3_open_v2(filename, &H->db, flags, NULL);
efree(filename);
diff --git a/ext/pdo_sqlite/sqlite_statement.c b/ext/pdo_sqlite/sqlite_statement.c
index 3769b1e049..65bdb1de91 100644
--- a/ext/pdo_sqlite/sqlite_statement.c
+++ b/ext/pdo_sqlite/sqlite_statement.c
@@ -247,21 +247,11 @@ static int pdo_sqlite_stmt_describe(pdo_stmt_t *stmt, int colno)
stmt->columns[colno].maxlen = SIZE_MAX;
stmt->columns[colno].precision = 0;
- switch (sqlite3_column_type(S->stmt, colno)) {
- case SQLITE_INTEGER:
- case SQLITE_FLOAT:
- case SQLITE3_TEXT:
- case SQLITE_BLOB:
- case SQLITE_NULL:
- default:
- stmt->columns[colno].param_type = PDO_PARAM_STR;
- break;
- }
-
return 1;
}
-static int pdo_sqlite_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, size_t *len, int *caller_frees)
+static int pdo_sqlite_stmt_get_col(
+ pdo_stmt_t *stmt, int colno, zval *result, enum pdo_param_type *type)
{
pdo_sqlite_stmt *S = (pdo_sqlite_stmt*)stmt->driver_data;
if (!S->stmt) {
@@ -274,18 +264,35 @@ static int pdo_sqlite_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, size
}
switch (sqlite3_column_type(S->stmt, colno)) {
case SQLITE_NULL:
- *ptr = NULL;
- *len = 0;
+ ZVAL_NULL(result);
+ return 1;
+
+ case SQLITE_INTEGER: {
+ int64_t i = sqlite3_column_int64(S->stmt, colno);
+#if SIZEOF_ZEND_LONG < 8
+ if (i > ZEND_LONG_MAX || i < ZEND_LONG_MIN) {
+ ZVAL_STRINGL(result,
+ (char *) sqlite3_column_text(S->stmt, colno),
+ sqlite3_column_bytes(S->stmt, colno));
+ return 1;
+ }
+#endif
+ ZVAL_LONG(result, i);
+ return 1;
+ }
+
+ case SQLITE_FLOAT:
+ ZVAL_DOUBLE(result, sqlite3_column_double(S->stmt, colno));
return 1;
case SQLITE_BLOB:
- *ptr = (char*)sqlite3_column_blob(S->stmt, colno);
- *len = sqlite3_column_bytes(S->stmt, colno);
+ ZVAL_STRINGL_FAST(result,
+ sqlite3_column_blob(S->stmt, colno), sqlite3_column_bytes(S->stmt, colno));
return 1;
default:
- *ptr = (char*)sqlite3_column_text(S->stmt, colno);
- *len = sqlite3_column_bytes(S->stmt, colno);
+ ZVAL_STRINGL_FAST(result,
+ (char *) sqlite3_column_text(S->stmt, colno), sqlite3_column_bytes(S->stmt, colno));
return 1;
}
}
@@ -311,20 +318,24 @@ static int pdo_sqlite_stmt_col_meta(pdo_stmt_t *stmt, zend_long colno, zval *ret
switch (sqlite3_column_type(S->stmt, colno)) {
case SQLITE_NULL:
add_assoc_string(return_value, "native_type", "null");
+ add_assoc_long(return_value, "pdo_type", PDO_PARAM_NULL);
break;
case SQLITE_FLOAT:
add_assoc_string(return_value, "native_type", "double");
+ add_assoc_long(return_value, "pdo_type", PDO_PARAM_STR);
break;
case SQLITE_BLOB:
add_next_index_string(&flags, "blob");
case SQLITE_TEXT:
add_assoc_string(return_value, "native_type", "string");
+ add_assoc_long(return_value, "pdo_type", PDO_PARAM_STR);
break;
case SQLITE_INTEGER:
add_assoc_string(return_value, "native_type", "integer");
+ add_assoc_long(return_value, "pdo_type", PDO_PARAM_INT);
break;
}
diff --git a/ext/pdo_sqlite/tests/bug38334.phpt b/ext/pdo_sqlite/tests/bug38334.phpt
new file mode 100644
index 0000000000..6537a28d19
--- /dev/null
+++ b/ext/pdo_sqlite/tests/bug38334.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Bug #38334: Proper data-type support for PDO_SQLITE
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo_sqlite')) print 'skip not loaded';
+?>
+--FILE--
+<?php
+
+$db = new PDO('sqlite::memory:');
+$db->exec('CREATE TABLE test (i INTEGER , f DOUBLE, s VARCHAR(255))');
+$db->exec('INSERT INTO test VALUES (42, 46.7, "test")');
+var_dump($db->query('SELECT * FROM test')->fetch(PDO::FETCH_ASSOC));
+
+// Check handling of integers larger than 32-bit.
+$db->exec('INSERT INTO test VALUES (10000000000, 0.0, "")');
+$i = $db->query('SELECT i FROM test WHERE f = 0.0')->fetchColumn(0);
+if (PHP_INT_SIZE >= 8) {
+ var_dump($i === 10000000000);
+} else {
+ var_dump($i === '10000000000');
+}
+
+// Check storing of strings into integer/float columns.
+$db->exec('INSERT INTO test VALUES ("test", "test", "x")');
+var_dump($db->query('SELECT * FROM test WHERE s = "x"')->fetch(PDO::FETCH_ASSOC));
+
+?>
+--EXPECT--
+array(3) {
+ ["i"]=>
+ int(42)
+ ["f"]=>
+ float(46.7)
+ ["s"]=>
+ string(4) "test"
+}
+bool(true)
+array(3) {
+ ["i"]=>
+ string(4) "test"
+ ["f"]=>
+ string(4) "test"
+ ["s"]=>
+ string(1) "x"
+}
diff --git a/ext/pdo_sqlite/tests/bug44327_2.phpt b/ext/pdo_sqlite/tests/bug44327_2.phpt
index 531af9586c..7229e41a2f 100644
--- a/ext/pdo_sqlite/tests/bug44327_2.phpt
+++ b/ext/pdo_sqlite/tests/bug44327_2.phpt
@@ -32,9 +32,9 @@ object(PDOStatement)#%d (1) {
string(23) "select 1 as queryString"
array(2) {
["queryString"]=>
- string(1) "1"
+ int(1)
[0]=>
- string(1) "1"
+ int(1)
}
NULL
--------------------------------------------
@@ -45,6 +45,6 @@ object(PDOStatement)#%d (1) {
string(23) "select 1 as queryString"
object(PDORow)#%d (1) {
["queryString"]=>
- string(1) "1"
+ string(23) "select 1 as queryString"
}
-string(1) "1"
+string(23) "select 1 as queryString"
diff --git a/ext/pdo_sqlite/tests/bug44327_3.phpt b/ext/pdo_sqlite/tests/bug44327_3.phpt
index 45cdbff0c4..462fbab6dc 100644
--- a/ext/pdo_sqlite/tests/bug44327_3.phpt
+++ b/ext/pdo_sqlite/tests/bug44327_3.phpt
@@ -23,11 +23,11 @@ object(PDORow)#%d (2) {
["queryString"]=>
string(25) "select 1 as queryStringxx"
["queryStringxx"]=>
- string(1) "1"
+ int(1)
}
string(25) "select 1 as queryStringxx"
NULL
-string(1) "1"
+int(1)
---
NULL
NULL
diff --git a/ext/pdo_sqlite/tests/bug78192.phpt b/ext/pdo_sqlite/tests/bug78192.phpt
index defdafb681..be20756d3b 100644
--- a/ext/pdo_sqlite/tests/bug78192.phpt
+++ b/ext/pdo_sqlite/tests/bug78192.phpt
@@ -29,7 +29,7 @@ array(1) {
[0]=>
array(2) {
["id"]=>
- string(2) "10"
+ int(10)
["name"]=>
string(4) "test"
}
@@ -38,7 +38,7 @@ array(1) {
[0]=>
array(3) {
["id"]=>
- string(2) "10"
+ int(10)
["name"]=>
string(4) "test"
["new_col"]=>
diff --git a/ext/pdo_sqlite/tests/bug79664.phpt b/ext/pdo_sqlite/tests/bug79664.phpt
index fae39aea3e..6c7b0e7740 100644
--- a/ext/pdo_sqlite/tests/bug79664.phpt
+++ b/ext/pdo_sqlite/tests/bug79664.phpt
@@ -18,6 +18,8 @@ if ($stmt->columnCount()) {
array(6) {
["native_type"]=>
string(4) "null"
+ ["pdo_type"]=>
+ int(0)
["flags"]=>
array(0) {
}
@@ -27,6 +29,4 @@ array(6) {
int(-1)
["precision"]=>
int(0)
- ["pdo_type"]=>
- int(2)
}
diff --git a/ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt b/ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt
index fc30f1d21c..dbb4b6cf7d 100644
--- a/ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt
+++ b/ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt
@@ -9,14 +9,22 @@ if (!extension_loaded('pdo_sqlite')) die('skip PDO SQLite not available');
$pdo = new PDO("sqlite:".__DIR__."/foo.db");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
-var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, NULL));
+try {
+ var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, NULL));
+} catch (\TypeError $e) {
+ echo $e->getMessage(), \PHP_EOL;
+}
var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, 1));
-var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, 'nonsense'));
+try {
+ var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, 'nonsense'));
+} catch (\TypeError $e) {
+ echo $e->getMessage(), \PHP_EOL;
+}
@unlink(__DIR__."/foo.db");
?>
--EXPECT--
+Attribute value must be of type int for selected attribute, null given
bool(true)
-bool(true)
-bool(true)
+Attribute value must be of type int for selected attribute, string given
diff --git a/ext/pdo_sqlite/tests/bug_63916-2.phpt b/ext/pdo_sqlite/tests/bug_63916-2.phpt
index 4535410b55..688ab82ad0 100644
--- a/ext/pdo_sqlite/tests/bug_63916-2.phpt
+++ b/ext/pdo_sqlite/tests/bug_63916-2.phpt
@@ -24,4 +24,4 @@ var_dump($num,$result[0]);
?>
--EXPECT--
int(2147483647)
-string(10) "2147483647"
+int(2147483647)
diff --git a/ext/pdo_sqlite/tests/bug_63916.phpt b/ext/pdo_sqlite/tests/bug_63916.phpt
index 582413db4d..5b77f6bb98 100644
--- a/ext/pdo_sqlite/tests/bug_63916.phpt
+++ b/ext/pdo_sqlite/tests/bug_63916.phpt
@@ -24,4 +24,4 @@ var_dump($num,$result[0]);
?>
--EXPECT--
int(100004313234244)
-string(15) "100004313234244"
+int(100004313234244)
diff --git a/ext/pdo_sqlite/tests/debugdumpparams_001.phpt b/ext/pdo_sqlite/tests/debugdumpparams_001.phpt
index 4402b5c815..88dc21ce82 100644
--- a/ext/pdo_sqlite/tests/debugdumpparams_001.phpt
+++ b/ext/pdo_sqlite/tests/debugdumpparams_001.phpt
@@ -23,15 +23,15 @@ Key: Name: [2] :a
paramno=-1
name=[2] ":a"
is_param=1
-param_type=1
+param_type=2
Key: Name: [2] :b
paramno=-1
name=[2] ":b"
is_param=1
-param_type=2
+param_type=3
Key: Position #2:
paramno=2
name=[0] ""
is_param=1
-param_type=2
+param_type=3
NULL
diff --git a/ext/pdo_sqlite/tests/gc.phpt b/ext/pdo_sqlite/tests/gc.phpt
new file mode 100644
index 0000000000..25407697e6
--- /dev/null
+++ b/ext/pdo_sqlite/tests/gc.phpt
@@ -0,0 +1,24 @@
+--TEST--
+GC support for PDO Sqlite driver data
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo_sqlite')) print 'skip not loaded';
+?>
+--FILE--
+<?php
+
+class Obj {
+ public $a;
+ public function callback() { }
+}
+
+$obj = new Obj;
+$obj->a = new PDO('sqlite::memory:');
+$obj->a->sqliteCreateFunction('func1', function() use ($obj) {}, 1);
+$obj->a->sqliteCreateAggregate('func2', function() use ($obj) {}, function() use($obj) {});
+$obj->a->sqliteCreateCollation('col', function() use ($obj) {});
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/ext/pdo_sqlite/tests/open_basedir.phpt b/ext/pdo_sqlite/tests/open_basedir.phpt
new file mode 100644
index 0000000000..8041b47407
--- /dev/null
+++ b/ext/pdo_sqlite/tests/open_basedir.phpt
@@ -0,0 +1,31 @@
+--TEST--
+PDO SQLite open_basedir check
+--SKIPIF--
+<?php if (!extension_loaded('pdo_sqlite')) print 'skip not loaded'; ?>
+--INI--
+open_basedir=.
+--FILE--
+<?php
+chdir(__DIR__);
+
+try {
+ $db = new PDO('sqlite:../not_in_open_basedir.sqlite');
+} catch (Exception $e) {
+ echo $e->getMessage() . "\n";
+}
+try {
+ $db = new PDO('sqlite:file:../not_in_open_basedir.sqlite');
+} catch (Exception $e) {
+ echo $e->getMessage() . "\n";
+}
+try {
+ $db = new PDO('sqlite:file:../not_in_open_basedir.sqlite?mode=ro');
+} catch (Exception $e) {
+ echo $e->getMessage() . "\n";
+}
+
+?>
+--EXPECT--
+open_basedir prohibits opening ../not_in_open_basedir.sqlite
+open_basedir prohibits opening file:../not_in_open_basedir.sqlite
+open_basedir prohibits opening file:../not_in_open_basedir.sqlite?mode=ro
diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_filename_uri.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_filename_uri.phpt
new file mode 100644
index 0000000000..7eec264ae2
--- /dev/null
+++ b/ext/pdo_sqlite/tests/pdo_sqlite_filename_uri.phpt
@@ -0,0 +1,37 @@
+--TEST--
+PDO_sqlite: Testing filename uri
+--SKIPIF--
+<?php if (!extension_loaded('pdo_sqlite')) print 'skip not loaded'; ?>
+--FILE--
+<?php
+
+// create with default read-write|create mode
+$filename = "file:" . __DIR__ . DIRECTORY_SEPARATOR . "pdo_sqlite_filename_uri.db";
+
+$db = new PDO('sqlite:' . $filename);
+
+var_dump($db->exec('CREATE TABLE test1 (id INT);'));
+
+// create with readonly mode
+$filename = "file:" . __DIR__ . DIRECTORY_SEPARATOR . "pdo_sqlite_filename_uri.db?mode=ro";
+
+$db = new PDO('sqlite:' . $filename);
+
+var_dump($db->exec('CREATE TABLE test2 (id INT);'));
+
+?>
+--CLEAN--
+<?php
+$filename = __DIR__ . DIRECTORY_SEPARATOR . "pdo_sqlite_filename_uri.db";
+if (file_exists($filename)) {
+ unlink($filename);
+}
+?>
+--EXPECTF--
+int(0)
+
+Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 8 attempt to write a readonly database in %s
+Stack trace:
+%s
+#1 {main}
+ thrown in %s
diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c
index 7ea7d199ea..7faa5af4fe 100644
--- a/ext/pgsql/pgsql.c
+++ b/ext/pgsql/pgsql.c
@@ -1548,7 +1548,7 @@ PHP_FUNCTION(pg_field_table)
zval *result;
pgsql_result_handle *pg_result;
zend_long fnum = -1;
- zend_bool return_oid = 0;
+ bool return_oid = 0;
Oid oid;
smart_str hash_key = {0};
char *table_name;
@@ -2615,7 +2615,7 @@ PHP_FUNCTION(pg_lo_write)
zval *pgsql_id;
char *str;
zend_long z_len;
- zend_bool z_len_is_null = 1;
+ bool z_len_is_null = 1;
size_t str_len, nbytes;
size_t len;
pgLofp *pgsql;
@@ -3614,7 +3614,7 @@ static void php_pgsql_do_async(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
if (PQsetnonblocking(pgsql, 0)) {
php_error_docref(NULL, E_NOTICE, "Cannot set connection to blocking mode");
}
- convert_to_boolean_ex(return_value);
+ convert_to_boolean(return_value);
}
/* }}} */
@@ -4243,7 +4243,7 @@ PHP_FUNCTION(pg_flush)
* table_name must not be empty
* TODO: Add meta_data cache for better performance
*/
-PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, const char *table_name, zval *meta, zend_bool extended)
+PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, const char *table_name, zval *meta, bool extended)
{
PGresult *pg_result;
char *src, *tmp_name, *tmp_name2 = NULL;
@@ -4358,7 +4358,7 @@ PHP_FUNCTION(pg_meta_data)
zval *pgsql_link;
char *table_name;
size_t table_name_len;
- zend_bool extended=0;
+ bool extended=0;
PGconn *pgsql;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|b",
@@ -4385,88 +4385,87 @@ PHP_FUNCTION(pg_meta_data)
/* }}} */
/* {{{ php_pgsql_get_data_type */
-static php_pgsql_data_type php_pgsql_get_data_type(const char *type_name, size_t len)
+static php_pgsql_data_type php_pgsql_get_data_type(const zend_string *type_name)
{
- /* This is stupid way to do. I'll fix it when I decied how to support
+ /* This is stupid way to do. I'll fix it when I decide how to support
user defined types. (Yasuo) */
-
/* boolean */
- if (!strcmp(type_name, "bool")|| !strcmp(type_name, "boolean"))
+ if (zend_string_equals_literal(type_name, "bool")|| zend_string_equals_literal(type_name, "boolean"))
return PG_BOOL;
/* object id */
- if (!strcmp(type_name, "oid"))
+ if (zend_string_equals_literal(type_name, "oid"))
return PG_OID;
/* integer */
- if (!strcmp(type_name, "int2") || !strcmp(type_name, "smallint"))
+ if (zend_string_equals_literal(type_name, "int2") || zend_string_equals_literal(type_name, "smallint"))
return PG_INT2;
- if (!strcmp(type_name, "int4") || !strcmp(type_name, "integer"))
+ if (zend_string_equals_literal(type_name, "int4") || zend_string_equals_literal(type_name, "integer"))
return PG_INT4;
- if (!strcmp(type_name, "int8") || !strcmp(type_name, "bigint"))
+ if (zend_string_equals_literal(type_name, "int8") || zend_string_equals_literal(type_name, "bigint"))
return PG_INT8;
/* real and other */
- if (!strcmp(type_name, "float4") || !strcmp(type_name, "real"))
+ if (zend_string_equals_literal(type_name, "float4") || zend_string_equals_literal(type_name, "real"))
return PG_FLOAT4;
- if (!strcmp(type_name, "float8") || !strcmp(type_name, "double precision"))
+ if (zend_string_equals_literal(type_name, "float8") || zend_string_equals_literal(type_name, "double precision"))
return PG_FLOAT8;
- if (!strcmp(type_name, "numeric"))
+ if (zend_string_equals_literal(type_name, "numeric"))
return PG_NUMERIC;
- if (!strcmp(type_name, "money"))
+ if (zend_string_equals_literal(type_name, "money"))
return PG_MONEY;
/* character */
- if (!strcmp(type_name, "text"))
+ if (zend_string_equals_literal(type_name, "text"))
return PG_TEXT;
- if (!strcmp(type_name, "bpchar") || !strcmp(type_name, "character"))
+ if (zend_string_equals_literal(type_name, "bpchar") || zend_string_equals_literal(type_name, "character"))
return PG_CHAR;
- if (!strcmp(type_name, "varchar") || !strcmp(type_name, "character varying"))
+ if (zend_string_equals_literal(type_name, "varchar") || zend_string_equals_literal(type_name, "character varying"))
return PG_VARCHAR;
/* time and interval */
- if (!strcmp(type_name, "abstime"))
+ if (zend_string_equals_literal(type_name, "abstime"))
return PG_UNIX_TIME;
- if (!strcmp(type_name, "reltime"))
+ if (zend_string_equals_literal(type_name, "reltime"))
return PG_UNIX_TIME_INTERVAL;
- if (!strcmp(type_name, "tinterval"))
+ if (zend_string_equals_literal(type_name, "tinterval"))
return PG_UNIX_TIME_INTERVAL;
- if (!strcmp(type_name, "date"))
+ if (zend_string_equals_literal(type_name, "date"))
return PG_DATE;
- if (!strcmp(type_name, "time"))
+ if (zend_string_equals_literal(type_name, "time"))
return PG_TIME;
- if (!strcmp(type_name, "time with time zone") || !strcmp(type_name, "timetz"))
+ if (zend_string_equals_literal(type_name, "time with time zone") || zend_string_equals_literal(type_name, "timetz"))
return PG_TIME_WITH_TIMEZONE;
- if (!strcmp(type_name, "timestamp without time zone") || !strcmp(type_name, "timestamp"))
+ if (zend_string_equals_literal(type_name, "timestamp without time zone") || zend_string_equals_literal(type_name, "timestamp"))
return PG_TIMESTAMP;
- if (!strcmp(type_name, "timestamp with time zone") || !strcmp(type_name, "timestamptz"))
+ if (zend_string_equals_literal(type_name, "timestamp with time zone") || zend_string_equals_literal(type_name, "timestamptz"))
return PG_TIMESTAMP_WITH_TIMEZONE;
- if (!strcmp(type_name, "interval"))
+ if (zend_string_equals_literal(type_name, "interval"))
return PG_INTERVAL;
/* binary */
- if (!strcmp(type_name, "bytea"))
+ if (zend_string_equals_literal(type_name, "bytea"))
return PG_BYTEA;
/* network */
- if (!strcmp(type_name, "cidr"))
+ if (zend_string_equals_literal(type_name, "cidr"))
return PG_CIDR;
- if (!strcmp(type_name, "inet"))
+ if (zend_string_equals_literal(type_name, "inet"))
return PG_INET;
- if (!strcmp(type_name, "macaddr"))
+ if (zend_string_equals_literal(type_name, "macaddr"))
return PG_MACADDR;
/* bit */
- if (!strcmp(type_name, "bit"))
+ if (zend_string_equals_literal(type_name, "bit"))
return PG_BIT;
- if (!strcmp(type_name, "bit varying"))
+ if (zend_string_equals_literal(type_name, "bit varying"))
return PG_VARBIT;
/* geometric */
- if (!strcmp(type_name, "line"))
+ if (zend_string_equals_literal(type_name, "line"))
return PG_LINE;
- if (!strcmp(type_name, "lseg"))
+ if (zend_string_equals_literal(type_name, "lseg"))
return PG_LSEG;
- if (!strcmp(type_name, "box"))
+ if (zend_string_equals_literal(type_name, "box"))
return PG_BOX;
- if (!strcmp(type_name, "path"))
+ if (zend_string_equals_literal(type_name, "path"))
return PG_PATH;
- if (!strcmp(type_name, "point"))
+ if (zend_string_equals_literal(type_name, "point"))
return PG_POINT;
- if (!strcmp(type_name, "polygon"))
+ if (zend_string_equals_literal(type_name, "polygon"))
return PG_POLYGON;
- if (!strcmp(type_name, "circle"))
+ if (zend_string_equals_literal(type_name, "circle"))
return PG_CIRCLE;
return PG_UNKNOWN;
@@ -4530,7 +4529,7 @@ static int php_pgsql_convert_match(const char *str, size_t str_len, const char *
/* {{{ php_pgsql_add_quote
* add quotes around string.
*/
-static int php_pgsql_add_quotes(zval *src, zend_bool should_free)
+static int php_pgsql_add_quotes(zval *src, bool should_free)
{
smart_str str = {0};
@@ -4554,7 +4553,7 @@ static int php_pgsql_add_quotes(zval *src, zend_bool should_free)
/* Raise E_NOTICE to E_WARNING or Error? */
#define PGSQL_CONV_CHECK_IGNORE() \
- if (!err && Z_TYPE(new_val) == IS_STRING && !strcmp(Z_STRVAL(new_val), "NULL")) { \
+ if (!err && Z_TYPE(new_val) == IS_STRING && zend_string_equals_literal(Z_STR(new_val), "NULL")) { \
/* if new_value is string "NULL" and field has default value, remove element to use default value */ \
if (!(opt & PGSQL_CONV_IGNORE_DEFAULT) && Z_TYPE_P(has_default) == IS_TRUE) { \
zval_ptr_dtor(&new_val); \
@@ -4636,7 +4635,7 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
/* enums need to be treated like strings */
data_type = PG_TEXT;
} else {
- data_type = php_pgsql_get_data_type(Z_STRVAL_P(type), Z_STRLEN_P(type));
+ data_type = php_pgsql_get_data_type(Z_STR_P(type));
}
/* TODO: Should E_NOTICE be converted to type error if PHP type cannot be converted to field type? */
@@ -4649,18 +4648,18 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
ZVAL_STRING(&new_val, "NULL");
}
else {
- if (!strcmp(Z_STRVAL_P(val), "t") || !strcmp(Z_STRVAL_P(val), "T") ||
- !strcmp(Z_STRVAL_P(val), "y") || !strcmp(Z_STRVAL_P(val), "Y") ||
- !strcmp(Z_STRVAL_P(val), "true") || !strcmp(Z_STRVAL_P(val), "True") ||
- !strcmp(Z_STRVAL_P(val), "yes") || !strcmp(Z_STRVAL_P(val), "Yes") ||
- !strcmp(Z_STRVAL_P(val), "1")) {
+ if (zend_string_equals_literal(Z_STR_P(val), "t") || zend_string_equals_literal(Z_STR_P(val), "T") ||
+ zend_string_equals_literal(Z_STR_P(val), "y") || zend_string_equals_literal(Z_STR_P(val), "Y") ||
+ zend_string_equals_literal(Z_STR_P(val), "true") || zend_string_equals_literal(Z_STR_P(val), "True") ||
+ zend_string_equals_literal(Z_STR_P(val), "yes") || zend_string_equals_literal(Z_STR_P(val), "Yes") ||
+ zend_string_equals_literal(Z_STR_P(val), "1")) {
ZVAL_STRINGL(&new_val, "'t'", sizeof("'t'")-1);
}
- else if (!strcmp(Z_STRVAL_P(val), "f") || !strcmp(Z_STRVAL_P(val), "F") ||
- !strcmp(Z_STRVAL_P(val), "n") || !strcmp(Z_STRVAL_P(val), "N") ||
- !strcmp(Z_STRVAL_P(val), "false") || !strcmp(Z_STRVAL_P(val), "False") ||
- !strcmp(Z_STRVAL_P(val), "no") || !strcmp(Z_STRVAL_P(val), "No") ||
- !strcmp(Z_STRVAL_P(val), "0")) {
+ else if (zend_string_equals_literal(Z_STR_P(val), "f") || zend_string_equals_literal(Z_STR_P(val), "F") ||
+ zend_string_equals_literal(Z_STR_P(val), "n") || zend_string_equals_literal(Z_STR_P(val), "N") ||
+ zend_string_equals_literal(Z_STR_P(val), "false") || zend_string_equals_literal(Z_STR_P(val), "False") ||
+ zend_string_equals_literal(Z_STR_P(val), "no") || zend_string_equals_literal(Z_STR_P(val), "No") ||
+ zend_string_equals_literal(Z_STR_P(val), "0")) {
ZVAL_STRINGL(&new_val, "'f'", sizeof("'f'")-1);
}
else {
@@ -4724,7 +4723,7 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
case IS_DOUBLE:
ZVAL_DOUBLE(&new_val, Z_DVAL_P(val));
- convert_to_long_ex(&new_val);
+ convert_to_long(&new_val);
break;
case IS_LONG:
@@ -4840,7 +4839,7 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
case IS_DOUBLE:
ZVAL_DOUBLE(&new_val, Z_DVAL_P(val));
- convert_to_string_ex(&new_val);
+ convert_to_string(&new_val);
break;
case IS_NULL:
@@ -4871,14 +4870,14 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
}
else {
ZVAL_STRINGL(&new_val, Z_STRVAL_P(val), Z_STRLEN_P(val));
- convert_to_long_ex(&new_val);
+ convert_to_long(&new_val);
}
}
break;
case IS_DOUBLE:
ZVAL_DOUBLE(&new_val, Z_DVAL_P(val));
- convert_to_long_ex(&new_val);
+ convert_to_long(&new_val);
break;
case IS_LONG:
@@ -5143,7 +5142,7 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
case IS_DOUBLE:
ZVAL_DOUBLE(&new_val, Z_DVAL_P(val));
- convert_to_string_ex(&new_val);
+ convert_to_string(&new_val);
break;
case IS_NULL:
@@ -5540,7 +5539,8 @@ static inline int build_assignment_string(PGconn *pg_link, smart_str *querystr,
} else {
smart_str_appendl(querystr, ZSTR_VAL(fld), ZSTR_LEN(fld));
}
- if (where_cond && (Z_TYPE_P(val) == IS_TRUE || Z_TYPE_P(val) == IS_FALSE || (Z_TYPE_P(val) == IS_STRING && !strcmp(Z_STRVAL_P(val), "NULL")))) {
+ if (where_cond && (Z_TYPE_P(val) == IS_TRUE || Z_TYPE_P(val) == IS_FALSE ||
+ (Z_TYPE_P(val) == IS_STRING && zend_string_equals_literal(Z_STR_P(val), "NULL")))) {
smart_str_appends(querystr, " IS ");
} else {
smart_str_appendc(querystr, '=');
diff --git a/ext/pgsql/pgsql.stub.php b/ext/pgsql/pgsql.stub.php
index aff847bbc4..65edfd3329 100644
--- a/ext/pgsql/pgsql.stub.php
+++ b/ext/pgsql/pgsql.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
/** @return resource|false */
function pg_connect(string $connection_string, int $flags = 0) {}
diff --git a/ext/pgsql/pgsql_arginfo.h b/ext/pgsql/pgsql_arginfo.h
index 3d9a4f2d5d..bb12e2d228 100644
--- a/ext/pgsql/pgsql_arginfo.h
+++ b/ext/pgsql/pgsql_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: de1718d3e6e66dfade25462b8461983b914120ed */
+ * Stub hash: c88ced859b9bc6775690361d932c4cec14cb0c64 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_pg_connect, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, connection_string, IS_STRING, 0)
diff --git a/ext/pgsql/php_pgsql.h b/ext/pgsql/php_pgsql.h
index 3da04282d9..5398a92266 100644
--- a/ext/pgsql/php_pgsql.h
+++ b/ext/pgsql/php_pgsql.h
@@ -176,7 +176,7 @@ PHP_FUNCTION(pg_select);
#define PGSQL_DML_ESCAPE (1<<12) /* No convert, but escape only */
/* exported functions */
-PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, const char *table_name, zval *meta, zend_bool extended);
+PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, const char *table_name, zval *meta, bool extended);
PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval *values, zval *result, zend_ulong opt);
PHP_PGSQL_API int php_pgsql_insert(PGconn *pg_link, const char *table, zval *values, zend_ulong opt, zend_string **sql);
PHP_PGSQL_API int php_pgsql_update(PGconn *pg_link, const char *table, zval *values, zval *ids, zend_ulong opt , zend_string **sql);
diff --git a/ext/pgsql/tests/skipif.inc b/ext/pgsql/tests/skipif.inc
index 38c2888afa..92712f3e05 100644
--- a/ext/pgsql/tests/skipif.inc
+++ b/ext/pgsql/tests/skipif.inc
@@ -12,6 +12,11 @@ include("lcmess.inc");
if (!extension_loaded("pgsql")) {
die("skip pgsql extension not loaded\n");
}
+if (getenv("SKIP_REPEAT")) {
+ // pgsql tests are order-dependent.
+ // We should probably change that, but in the meantime do not allow repetition.
+ die("skip Cannot repeat pgsql tests");
+}
$conn = @pg_connect($conn_str);
if (!is_resource($conn)) {
die("skip could not connect\n");
diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c
index 7ddd7b564b..4d2afe0e86 100644
--- a/ext/phar/dirstream.c
+++ b/ext/phar/dirstream.c
@@ -22,7 +22,7 @@
#include "dirstream.h"
BEGIN_EXTERN_C()
-void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stream_statbuf *ssb, zend_bool is_dir);
+void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stream_statbuf *ssb, bool is_dir);
END_EXTERN_C()
const php_stream_ops phar_dir_ops = {
diff --git a/ext/phar/func_interceptors.c b/ext/phar/func_interceptors.c
index 9987f79572..4c7975c318 100644
--- a/ext/phar/func_interceptors.c
+++ b/ext/phar/func_interceptors.c
@@ -94,11 +94,11 @@ PHAR_FUNC(phar_file_get_contents) /* {{{ */
char *filename;
size_t filename_len;
zend_string *contents;
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
php_stream *stream;
zend_long offset = -1;
zend_long maxlen;
- zend_bool maxlen_is_null = 1;
+ bool maxlen_is_null = 1;
zval *zcontext = NULL;
if (!PHAR_G(intercepted)) {
@@ -234,7 +234,7 @@ PHAR_FUNC(phar_readfile) /* {{{ */
char *filename;
size_t filename_len;
int size = 0;
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
zval *zcontext = NULL;
php_stream *stream;
@@ -334,7 +334,7 @@ PHAR_FUNC(phar_fopen) /* {{{ */
{
char *filename, *mode;
size_t filename_len, mode_len;
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
zval *zcontext = NULL;
php_stream *stream;
diff --git a/ext/phar/phar.c b/ext/phar/phar.c
index 2a1e8d38f5..99502478be 100644
--- a/ext/phar/phar.c
+++ b/ext/phar/phar.c
@@ -26,14 +26,14 @@
static void destroy_phar_data(zval *zv);
ZEND_DECLARE_MODULE_GLOBALS(phar)
-zend_string *(*phar_save_resolve_path)(const char *filename, size_t filename_len);
+static zend_string *(*phar_save_resolve_path)(zend_string *filename);
/**
* set's phar->is_writeable based on the current INI value
*/
static int phar_set_writeable_bit(zval *zv, void *argument) /* {{{ */
{
- zend_bool keep = *(zend_bool *)argument;
+ bool keep = *(bool *)argument;
phar_archive_data *phar = (phar_archive_data *)Z_PTR_P(zv);
if (!phar->is_data) {
@@ -47,7 +47,7 @@ static int phar_set_writeable_bit(zval *zv, void *argument) /* {{{ */
/* if the original value is 0 (disabled), then allow setting/unsetting at will. Otherwise only allow 1 (enabled), and error on disabling */
ZEND_INI_MH(phar_ini_modify_handler) /* {{{ */
{
- zend_bool old, ini;
+ bool old, ini;
if (ZSTR_LEN(entry->name) == sizeof("phar.readonly")-1) {
old = PHAR_G(readonly_orig);
@@ -56,16 +56,16 @@ ZEND_INI_MH(phar_ini_modify_handler) /* {{{ */
}
if (ZSTR_LEN(new_value) == 2 && !strcasecmp("on", ZSTR_VAL(new_value))) {
- ini = (zend_bool) 1;
+ ini = (bool) 1;
}
else if (ZSTR_LEN(new_value) == 3 && !strcasecmp("yes", ZSTR_VAL(new_value))) {
- ini = (zend_bool) 1;
+ ini = (bool) 1;
}
else if (ZSTR_LEN(new_value) == 4 && !strcasecmp("true", ZSTR_VAL(new_value))) {
- ini = (zend_bool) 1;
+ ini = (bool) 1;
}
else {
- ini = (zend_bool) atoi(ZSTR_VAL(new_value));
+ ini = (bool) atoi(ZSTR_VAL(new_value));
}
/* do not allow unsetting in runtime */
@@ -495,7 +495,7 @@ void phar_entry_remove(phar_entry_data *idata, char **error) /* {{{ */
/**
* Open an already loaded phar
*/
-int phar_open_parsed_phar(char *fname, size_t fname_len, char *alias, size_t alias_len, zend_bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
+int phar_open_parsed_phar(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
{
phar_archive_data *phar;
#ifdef PHP_WIN32
@@ -601,7 +601,7 @@ void phar_metadata_tracker_try_ensure_has_serialized_data(phar_metadata_tracker
*/
int phar_metadata_tracker_unserialize_or_copy(phar_metadata_tracker *tracker, zval *metadata, int persistent, HashTable *unserialize_options, const char* method_name) /* {{{ */
{
- const zend_bool has_unserialize_options = unserialize_options != NULL && zend_array_count(unserialize_options) > 0;
+ const bool has_unserialize_options = unserialize_options != NULL && zend_hash_num_elements(unserialize_options) > 0;
/* It should be impossible to create a zval in a persistent phar/entry. */
ZEND_ASSERT(!persistent || Z_ISUNDEF(tracker->val));
@@ -640,7 +640,7 @@ int phar_metadata_tracker_unserialize_or_copy(phar_metadata_tracker *tracker, zv
/**
* Check if this has any data, serialized or as a raw value.
*/
-zend_bool phar_metadata_tracker_has_data(const phar_metadata_tracker *tracker, int persistent) /* {{{ */
+bool phar_metadata_tracker_has_data(const phar_metadata_tracker *tracker, int persistent) /* {{{ */
{
ZEND_ASSERT(!persistent || Z_ISUNDEF(tracker->val));
return !Z_ISUNDEF(tracker->val) || tracker->str != NULL;
@@ -1116,11 +1116,11 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, size_t fname_len, ch
/* set up our manifest */
zend_hash_init(&mydata->manifest, manifest_count,
- zend_get_hash_value, destroy_phar_manifest_entry, (zend_bool)mydata->is_persistent);
+ zend_get_hash_value, destroy_phar_manifest_entry, (bool)mydata->is_persistent);
zend_hash_init(&mydata->mounted_dirs, 5,
- zend_get_hash_value, NULL, (zend_bool)mydata->is_persistent);
+ zend_get_hash_value, NULL, (bool)mydata->is_persistent);
zend_hash_init(&mydata->virtual_dirs, manifest_count * 2,
- zend_get_hash_value, NULL, (zend_bool)mydata->is_persistent);
+ zend_get_hash_value, NULL, (bool)mydata->is_persistent);
mydata->fname = pestrndup(fname, fname_len, mydata->is_persistent);
#ifdef PHP_WIN32
phar_unixify_path_separators(mydata->fname, fname_len);
@@ -1311,7 +1311,7 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, size_t fname_len, ch
/**
* Create or open a phar for writing
*/
-int phar_open_or_create_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, zend_bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
+int phar_open_or_create_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
{
const char *ext_str, *z;
char *my_error;
@@ -1388,7 +1388,7 @@ check_file:
}
/* }}} */
-int phar_create_or_parse_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, zend_bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
+int phar_create_or_parse_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
{
phar_archive_data *mydata;
php_stream *fp;
@@ -1473,7 +1473,7 @@ int phar_create_or_parse_filename(char *fname, size_t fname_len, char *alias, si
zend_hash_init(&mydata->mounted_dirs, sizeof(char *),
zend_get_hash_value, NULL, 0);
zend_hash_init(&mydata->virtual_dirs, sizeof(char *),
- zend_get_hash_value, NULL, (zend_bool)mydata->is_persistent);
+ zend_get_hash_value, NULL, (bool)mydata->is_persistent);
mydata->fname_len = fname_len;
snprintf(mydata->version, sizeof(mydata->version), "%s", PHP_PHAR_API_VERSION);
mydata->is_temporary_alias = alias ? 0 : 1;
@@ -3292,41 +3292,41 @@ static size_t phar_zend_stream_fsizer(void *handle) /* {{{ */
} /* }}} */
zend_op_array *(*phar_orig_compile_file)(zend_file_handle *file_handle, int type);
-#define phar_orig_zend_open zend_stream_open_function
-static zend_string *phar_resolve_path(const char *filename, size_t filename_len)
+static zend_string *phar_resolve_path(zend_string *filename)
{
- return phar_find_in_include_path((char *) filename, filename_len, NULL);
+ zend_string *ret = phar_find_in_include_path(ZSTR_VAL(filename), ZSTR_LEN(filename), NULL);
+ if (!ret) {
+ ret = phar_save_resolve_path(filename);
+ }
+ return ret;
}
static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type) /* {{{ */
{
zend_op_array *res;
- char *name = NULL;
+ zend_string *name = NULL;
int failed;
phar_archive_data *phar;
if (!file_handle || !file_handle->filename) {
return phar_orig_compile_file(file_handle, type);
}
- if (strstr(file_handle->filename, ".phar") && !strstr(file_handle->filename, "://")) {
- if (SUCCESS == phar_open_from_filename((char*)file_handle->filename, strlen(file_handle->filename), NULL, 0, 0, &phar, NULL)) {
+ if (strstr(ZSTR_VAL(file_handle->filename), ".phar") && !strstr(ZSTR_VAL(file_handle->filename), "://")) {
+ if (SUCCESS == phar_open_from_filename(ZSTR_VAL(file_handle->filename), ZSTR_LEN(file_handle->filename), NULL, 0, 0, &phar, NULL)) {
if (phar->is_zip || phar->is_tar) {
- zend_file_handle f = *file_handle;
+ zend_file_handle f;
/* zip or tar-based phar */
- spprintf(&name, 4096, "phar://%s/%s", file_handle->filename, ".phar/stub.php");
- if (SUCCESS == phar_orig_zend_open((const char *)name, &f)) {
-
- efree(name);
- name = NULL;
-
+ name = zend_strpprintf(4096, "phar://%s/%s", ZSTR_VAL(file_handle->filename), ".phar/stub.php");
+ zend_stream_init_filename_ex(&f, name);
+ if (SUCCESS == zend_stream_open_function(&f)) {
+ zend_string_release(f.filename);
f.filename = file_handle->filename;
if (f.opened_path) {
- efree(f.opened_path);
+ zend_string_release(f.opened_path);
}
f.opened_path = file_handle->opened_path;
- f.free_filename = file_handle->free_filename;
switch (file_handle->type) {
case ZEND_HANDLE_STREAM:
@@ -3341,7 +3341,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type)
*file_handle = f;
}
} else if (phar->flags & PHAR_FILE_COMPRESSION_MASK) {
- zend_file_handle_dtor(file_handle);
/* compressed phar */
file_handle->type = ZEND_HANDLE_STREAM;
/* we do our own reading directly from the phar, don't change the next line */
@@ -3367,7 +3366,7 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type)
} zend_end_try();
if (name) {
- efree(name);
+ zend_string_release(name);
}
if (failed) {
diff --git a/ext/phar/phar/pharcommand.inc b/ext/phar/phar/pharcommand.inc
index 1fb41dbb6a..4cf84ee551 100644
--- a/ext/phar/phar/pharcommand.inc
+++ b/ext/phar/phar/pharcommand.inc
@@ -259,7 +259,7 @@ class PharCommand extends CLICommand
self::error($msg);
}
}
- $arg = $found;
+ return null;
}
return self::cli_arg_typ_file($arg);
}
diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h
index f959cb29bc..89344a3f22 100644
--- a/ext/phar/phar_internal.h
+++ b/ext/phar/phar_internal.h
@@ -141,9 +141,9 @@ ZEND_BEGIN_MODULE_GLOBALS(phar)
int persist;
int has_zlib;
int has_bz2;
- zend_bool readonly_orig;
- zend_bool require_hash_orig;
- zend_bool intercepted;
+ bool readonly_orig;
+ bool require_hash_orig;
+ bool intercepted;
int request_init;
int require_hash;
int request_done;
@@ -475,10 +475,6 @@ union _phar_entry_object {
phar_entry_info *entry;
};
-#ifndef PHAR_MAIN
-extern zend_string *(*phar_save_resolve_path)(const char *filename, size_t filename_len);
-#endif
-
BEGIN_EXTERN_C()
#ifdef PHP_WIN32
@@ -532,12 +528,12 @@ void phar_destroy_phar_data(phar_archive_data *phar);
int phar_open_entry_file(phar_archive_data *phar, phar_entry_info *entry, char **error);
int phar_postprocess_file(phar_entry_data *idata, uint32_t crc32, char **error, int process_zip);
int phar_open_from_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error);
-int phar_open_or_create_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, zend_bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
-int phar_create_or_parse_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, zend_bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
+int phar_open_or_create_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
+int phar_create_or_parse_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
int phar_open_executed_filename(char *alias, size_t alias_len, char **error);
int phar_free_alias(phar_archive_data *phar, char *alias, size_t alias_len);
int phar_get_archive(phar_archive_data **archive, char *fname, size_t fname_len, char *alias, size_t alias_len, char **error);
-int phar_open_parsed_phar(char *fname, size_t fname_len, char *alias, size_t alias_len, zend_bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
+int phar_open_parsed_phar(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
int phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, char *sig, size_t sig_len, char *fname, char **signature, size_t *signature_len, char **error);
int phar_create_signature(phar_archive_data *phar, php_stream *fp, char **signature, size_t *signature_length, char **error);
@@ -553,7 +549,7 @@ zend_string *phar_find_in_include_path(char *file, size_t file_len, phar_archive
char *phar_fix_filepath(char *path, size_t *new_len, int use_cwd);
phar_entry_info * phar_open_jit(phar_archive_data *phar, phar_entry_info *entry, char **error);
void phar_parse_metadata_lazy(const char *buffer, phar_metadata_tracker *tracker, uint32_t zip_metadata_len, int persistent);
-zend_bool phar_metadata_tracker_has_data(const phar_metadata_tracker* tracker, int persistent);
+bool phar_metadata_tracker_has_data(const phar_metadata_tracker* tracker, int persistent);
/* If this has data, free it and set all values to undefined. */
void phar_metadata_tracker_free(phar_metadata_tracker* val, int persistent);
void phar_metadata_tracker_copy(phar_metadata_tracker* dest, const phar_metadata_tracker *source, int persistent);
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c
index 5fe9e26af0..f67855af18 100644
--- a/ext/phar/phar_object.c
+++ b/ext/phar/phar_object.c
@@ -247,13 +247,12 @@ static int phar_file_action(phar_archive_data *phar, phar_entry_info *info, char
if (!new_op_array) {
zend_hash_str_del(&EG(included_files), name, name_len);
}
-
- zend_destroy_file_handle(&file_handle);
-
} else {
efree(name);
new_op_array = NULL;
}
+
+ zend_destroy_file_handle(&file_handle);
#ifdef PHP_WIN32
efree(arch);
#endif
@@ -395,7 +394,7 @@ PHP_METHOD(Phar, running)
{
char *fname, *arch, *entry;
size_t fname_len, arch_len, entry_len;
- zend_bool retphar = 1;
+ bool retphar = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &retphar) == FAILURE) {
RETURN_THROWS();
@@ -1049,7 +1048,7 @@ PHP_METHOD(Phar, isValidPharFilename)
size_t fname_len;
size_t ext_len;
int is_executable;
- zend_bool executable = 1;
+ bool executable = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|b", &fname, &fname_len, &executable) == FAILURE) {
RETURN_THROWS();
@@ -1106,7 +1105,7 @@ PHP_METHOD(Phar, __construct)
char *fname, *alias = NULL, *error, *arch = NULL, *entry = NULL, *save_fname;
size_t fname_len, alias_len = 0;
size_t arch_len, entry_len;
- zend_bool is_data;
+ bool is_data;
zend_long flags = SPL_FILE_DIR_SKIPDOTS|SPL_FILE_DIR_UNIXPATHS;
zend_long format = 0;
phar_archive_object *phar_obj;
@@ -1376,7 +1375,7 @@ struct _phar_t {
static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
{
zval *value;
- zend_bool close_fp = 1;
+ bool close_fp = 1;
struct _phar_t *p_obj = (struct _phar_t*) puser;
size_t str_key_len, base_len = p_obj->l;
phar_entry_data *data;
@@ -1443,7 +1442,6 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
case IS_OBJECT:
if (instanceof_function(Z_OBJCE_P(value), spl_ce_SplFileInfo)) {
char *test = NULL;
- zval dummy;
spl_filesystem_object *intern = (spl_filesystem_object*)((char*)Z_OBJ_P(value) - Z_OBJ_P(value)->handlers->offset);
if (!base_len) {
@@ -1455,9 +1453,7 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
case SPL_FS_DIR:
test = spl_filesystem_object_get_path(intern, NULL);
fname_len = spprintf(&fname, 0, "%s%c%s", test, DEFAULT_SLASH, intern->u.dir.entry.d_name);
- php_stat(fname, fname_len, FS_IS_DIR, &dummy);
-
- if (Z_TYPE(dummy) == IS_TRUE) {
+ if (php_stream_stat_path(fname, &ssb) == 0 && S_ISDIR(ssb.sb.st_mode)) {
/* ignore directories */
efree(fname);
return ZEND_HASH_APPLY_KEEP;
@@ -1478,7 +1474,7 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
goto phar_spl_fileinfo;
case SPL_FS_INFO:
case SPL_FS_FILE:
- fname = expand_filepath(intern->file_name, NULL);
+ fname = expand_filepath(ZSTR_VAL(intern->file_name), NULL);
if (!fname) {
zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, "Could not resolve file path");
return ZEND_HASH_APPLY_STOP;
@@ -1698,7 +1694,7 @@ PHP_METHOD(Phar, buildFromDirectory)
{
char *dir, *error, *regex = NULL;
size_t dir_len, regex_len = 0;
- zend_bool apply_reg = 0;
+ bool apply_reg = 0;
zval arg, arg2, iter, iteriter, regexiter;
struct _phar_t pass;
@@ -2341,7 +2337,7 @@ PHP_METHOD(Phar, convertToExecutable)
uint32_t flags;
zend_object *ret;
zend_long format, method;
- zend_bool format_is_null = 1, method_is_null = 1;
+ bool format_is_null = 1, method_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!l!s!", &format, &format_is_null, &method, &method_is_null, &ext, &ext_len) == FAILURE) {
RETURN_THROWS();
@@ -2452,7 +2448,7 @@ PHP_METHOD(Phar, convertToData)
uint32_t flags;
zend_object *ret;
zend_long format, method;
- zend_bool format_is_null = 1, method_is_null = 1;
+ bool format_is_null = 1, method_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!l!s!", &format, &format_is_null, &method, &method_is_null, &ext, &ext_len) == FAILURE) {
RETURN_THROWS();
@@ -4097,7 +4093,7 @@ PHP_METHOD(Phar, delMetadata)
}
/* }}} */
-static int phar_extract_file(zend_bool overwrite, phar_entry_info *entry, char *dest, size_t dest_len, char **error) /* {{{ */
+static int phar_extract_file(bool overwrite, phar_entry_info *entry, char *dest, size_t dest_len, char **error) /* {{{ */
{
php_stream_statbuf ssb;
size_t len;
@@ -4279,7 +4275,7 @@ static int phar_extract_file(zend_bool overwrite, phar_entry_info *entry, char *
}
/* }}} */
-static int extract_helper(phar_archive_data *archive, zend_string *search, char *pathto, size_t pathto_len, zend_bool overwrite, char **error) { /* {{{ */
+static int extract_helper(phar_archive_data *archive, zend_string *search, char *pathto, size_t pathto_len, bool overwrite, char **error) { /* {{{ */
int extracted = 0;
phar_entry_info *entry;
@@ -4319,7 +4315,7 @@ PHP_METHOD(Phar, extractTo)
int ret;
zval *zval_file;
HashTable *files_ht = NULL;
- zend_bool overwrite = 0;
+ bool overwrite = 0;
char *error = NULL;
ZEND_PARSE_PARAMETERS_START(1, 3)
@@ -4524,7 +4520,7 @@ PHP_METHOD(PharFileInfo, getCompressedSize)
PHP_METHOD(PharFileInfo, isCompressed)
{
zend_long method;
- zend_bool method_is_null = 1;
+ bool method_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!", &method, &method_is_null) == FAILURE) {
RETURN_THROWS();
@@ -4644,11 +4640,11 @@ PHP_METHOD(PharFileInfo, chmod)
/* hackish cache in php_stat needs to be cleared */
/* if this code fails to work, check main/streams/streams.c, _php_stream_stat_path */
if (BG(CurrentLStatFile)) {
- efree(BG(CurrentLStatFile));
+ zend_string_release(BG(CurrentLStatFile));
}
if (BG(CurrentStatFile)) {
- efree(BG(CurrentStatFile));
+ zend_string_release(BG(CurrentStatFile));
}
BG(CurrentLStatFile) = NULL;
@@ -5074,23 +5070,13 @@ PHP_METHOD(PharFileInfo, decompress)
void phar_object_init(void) /* {{{ */
{
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY(ce, "PharException", class_PharException_methods);
- phar_ce_PharException = zend_register_internal_class_ex(&ce, zend_ce_exception);
-
- INIT_CLASS_ENTRY(ce, "Phar", class_Phar_methods);
- phar_ce_archive = zend_register_internal_class_ex(&ce, spl_ce_RecursiveDirectoryIterator);
-
- zend_class_implements(phar_ce_archive, 2, zend_ce_countable, zend_ce_arrayaccess);
+ phar_ce_PharException = register_class_PharException(zend_ce_exception);
- INIT_CLASS_ENTRY(ce, "PharData", class_PharData_methods);
- phar_ce_data = zend_register_internal_class_ex(&ce, spl_ce_RecursiveDirectoryIterator);
+ phar_ce_archive = register_class_Phar(spl_ce_RecursiveDirectoryIterator, zend_ce_countable, zend_ce_arrayaccess);
- zend_class_implements(phar_ce_data, 2, zend_ce_countable, zend_ce_arrayaccess);
+ phar_ce_data = register_class_PharData(spl_ce_RecursiveDirectoryIterator, zend_ce_countable, zend_ce_arrayaccess);
- INIT_CLASS_ENTRY(ce, "PharFileInfo", class_PharFileInfo_methods);
- phar_ce_entry = zend_register_internal_class_ex(&ce, spl_ce_SplFileInfo);
+ phar_ce_entry = register_class_PharFileInfo(spl_ce_SplFileInfo);
REGISTER_PHAR_CLASS_CONST_LONG(phar_ce_archive, "BZ2", PHAR_ENT_COMPRESSED_BZ2)
REGISTER_PHAR_CLASS_CONST_LONG(phar_ce_archive, "GZ", PHAR_ENT_COMPRESSED_GZ)
diff --git a/ext/phar/phar_object.stub.php b/ext/phar/phar_object.stub.php
index 5a1122c74f..2e2a83a352 100644
--- a/ext/phar/phar_object.stub.php
+++ b/ext/phar/phar_object.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class PharException extends Exception
{
@@ -180,7 +180,10 @@ class Phar extends RecursiveDirectoryIterator implements Countable, ArrayAccess
class PharData extends RecursiveDirectoryIterator implements Countable, ArrayAccess
{
- /** @implementation-alias Phar::__construct */
+ /**
+ * @implementation-alias Phar::__construct
+ * @no-verify PharData constructor accepts extra $format argument
+ */
public function __construct(string $filename, int $flags = FilesystemIterator::SKIP_DOTS|FilesystemIterator::UNIX_PATHS, ?string $alias = null, int $format = 0) {}
/** @implementation-alias Phar::__destruct */
diff --git a/ext/phar/phar_object_arginfo.h b/ext/phar/phar_object_arginfo.h
index ade8f874ab..4811e6a567 100644
--- a/ext/phar/phar_object_arginfo.h
+++ b/ext/phar/phar_object_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: a8562e63010e127aadb97134733ac328ced3c7bf */
+ * Stub hash: 8f6974078c7b16fd452a34a9e1b5c509699a2037 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Phar___construct, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@@ -581,3 +581,45 @@ static const zend_function_entry class_PharFileInfo_methods[] = {
ZEND_ME(PharFileInfo, setMetadata, arginfo_class_PharFileInfo_setMetadata, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_PharException(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "PharException", class_PharException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_Phar(zend_class_entry *class_entry_RecursiveDirectoryIterator, zend_class_entry *class_entry_Countable, zend_class_entry *class_entry_ArrayAccess)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Phar", class_Phar_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RecursiveDirectoryIterator);
+ zend_class_implements(class_entry, 2, class_entry_Countable, class_entry_ArrayAccess);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_PharData(zend_class_entry *class_entry_RecursiveDirectoryIterator, zend_class_entry *class_entry_Countable, zend_class_entry *class_entry_ArrayAccess)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "PharData", class_PharData_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RecursiveDirectoryIterator);
+ zend_class_implements(class_entry, 2, class_entry_Countable, class_entry_ArrayAccess);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_PharFileInfo(zend_class_entry *class_entry_SplFileInfo)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "PharFileInfo", class_PharFileInfo_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_SplFileInfo);
+
+ return class_entry;
+}
diff --git a/ext/phar/stream.c b/ext/phar/stream.c
index 91ed30cf03..5fac84da32 100644
--- a/ext/phar/stream.c
+++ b/ext/phar/stream.c
@@ -480,7 +480,7 @@ static int phar_stream_flush(php_stream *stream) /* {{{ */
/**
* stat an opened phar file handle stream, used by phar_stat()
*/
-void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stream_statbuf *ssb, zend_bool is_temp_dir)
+void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stream_statbuf *ssb, bool is_temp_dir)
{
memset(ssb, 0, sizeof(php_stream_statbuf));
diff --git a/ext/phar/tar.c b/ext/phar/tar.c
index bae1a4bf7b..890a90b515 100644
--- a/ext/phar/tar.c
+++ b/ext/phar/tar.c
@@ -242,11 +242,11 @@ int phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, char *alia
myphar->is_persistent = PHAR_G(persist);
/* estimate number of entries, can't be certain with tar files */
zend_hash_init(&myphar->manifest, 2 + (totalsize >> 12),
- zend_get_hash_value, destroy_phar_manifest_entry, (zend_bool)myphar->is_persistent);
+ zend_get_hash_value, destroy_phar_manifest_entry, (bool)myphar->is_persistent);
zend_hash_init(&myphar->mounted_dirs, 5,
- zend_get_hash_value, NULL, (zend_bool)myphar->is_persistent);
+ zend_get_hash_value, NULL, (bool)myphar->is_persistent);
zend_hash_init(&myphar->virtual_dirs, 4 + (totalsize >> 11),
- zend_get_hash_value, NULL, (zend_bool)myphar->is_persistent);
+ zend_get_hash_value, NULL, (bool)myphar->is_persistent);
myphar->is_tar = 1;
/* remember whether this entire phar was compressed with gz/bzip2 */
myphar->flags = compression;
diff --git a/ext/phar/tests/bug60164.phpt b/ext/phar/tests/bug60164.phpt
index 8cc2eceaa0..0a7b9227e7 100644
--- a/ext/phar/tests/bug60164.phpt
+++ b/ext/phar/tests/bug60164.phpt
@@ -10,7 +10,7 @@ phar.readonly=0
--FILE--
<?php
$phar = __DIR__ . '/files/stuboflength1041.phar';
-foreach (new RecursiveIteratorIterator(new Phar($phar, null, 'stuboflength1041.phar')) as $item) {
+foreach (new RecursiveIteratorIterator(new Phar($phar, alias: 'stuboflength1041.phar')) as $item) {
var_dump($item->getFileName());
}
?>
diff --git a/ext/phar/tests/bug77022.phpt b/ext/phar/tests/bug77022.phpt
index 40d908f1ee..4f5795842d 100644
--- a/ext/phar/tests/bug77022.phpt
+++ b/ext/phar/tests/bug77022.phpt
@@ -13,9 +13,9 @@ var_dump(decoct(umask()));
$sFile = tempnam(__DIR__, 'test77022');
var_dump(decoct(stat($sFile)['mode']));
-foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $mode => $ext) {
+foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $format => $ext) {
clearstatcache();
- $phar = new PharData(__DIR__ . '/test77022.' . $ext, null, null, $mode);
+ $phar = new PharData(__DIR__ . '/test77022.' . $ext, format: $format);
$phar->addFile($sFile, 'test-file-phar');
$phar->addFromString("test-from-string", 'test-file-phar');
$phar->extractTo(__DIR__);
@@ -33,4 +33,4 @@ string(6) "100600"
string(6) "100600"
string(6) "100644"
string(6) "100600"
-string(6) "100644" \ No newline at end of file
+string(6) "100644"
diff --git a/ext/phar/tests/bug79082.phpt b/ext/phar/tests/bug79082.phpt
index 512c4fb95c..1c36db2b1a 100644
--- a/ext/phar/tests/bug79082.phpt
+++ b/ext/phar/tests/bug79082.phpt
@@ -12,9 +12,9 @@ var_dump(decoct(umask()));
chmod(__DIR__ . '/test79082/test79082-testfile', 0644);
chmod(__DIR__ . '/test79082/test79082-testfile2', 0400);
-foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $mode => $ext) {
+foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $format => $ext) {
clearstatcache();
- $phar = new PharData(__DIR__ . '/test79082.' . $ext, null, null, $mode);
+ $phar = new PharData(__DIR__ . '/test79082.' . $ext, format: $format);
$phar->buildFromIterator(new \RecursiveDirectoryIterator(__DIR__ . '/test79082', \FilesystemIterator::SKIP_DOTS), __DIR__ . '/test79082');
$phar->extractTo(__DIR__);
var_dump(decoct(stat(__DIR__ . '/test79082-testfile')['mode']));
@@ -22,9 +22,9 @@ foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $mode => $ext) {
unlink(__DIR__ . '/test79082-testfile');
unlink(__DIR__ . '/test79082-testfile2');
}
-foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $mode => $ext) {
+foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $format => $ext) {
clearstatcache();
- $phar = new PharData(__DIR__ . '/test79082-d.' . $ext, null, null, $mode);
+ $phar = new PharData(__DIR__ . '/test79082-d.' . $ext, format: $format);
$phar->buildFromDirectory(__DIR__ . '/test79082');
$phar->extractTo(__DIR__);
var_dump(decoct(stat(__DIR__ . '/test79082-testfile')['mode']));
diff --git a/ext/phar/tests/files/phar_test.inc b/ext/phar/tests/files/phar_test.inc
index f5279a93d2..277271ef4c 100644
--- a/ext/phar/tests/files/phar_test.inc
+++ b/ext/phar/tests/files/phar_test.inc
@@ -35,7 +35,7 @@ foreach($files as $name => $cont)
if (empty($ulen)) $ulen = strlen($cont);
if (empty($clen)) $clen = strlen($comp);
if (empty($crc32))$crc32= crc32((binary)$cont);
- if (isset($meta)) $meta = serialize($meta);
+ $meta = isset($meta) ? serialize($meta) : "";
// write manifest entry
$manifest .= pack('V', strlen($name)) . (binary)$name;
diff --git a/ext/phar/util.c b/ext/phar/util.c
index 59362bbc72..4011a996ca 100644
--- a/ext/phar/util.c
+++ b/ext/phar/util.c
@@ -253,7 +253,7 @@ zend_string *phar_find_in_include_path(char *filename, size_t filename_len, phar
}
if (!zend_is_executing() || !PHAR_G(cwd)) {
- return phar_save_resolve_path(filename, filename_len);
+ return NULL;
}
fname = (char*)zend_get_executed_filename();
@@ -267,7 +267,7 @@ zend_string *phar_find_in_include_path(char *filename, size_t filename_len, phar
}
if (fname_len < 7 || memcmp(fname, "phar://", 7) || SUCCESS != phar_split_fname(fname, strlen(fname), &arch, &arch_len, &entry, &entry_len, 1, 0)) {
- return phar_save_resolve_path(filename, filename_len);
+ return NULL;
}
efree(entry);
@@ -277,7 +277,7 @@ zend_string *phar_find_in_include_path(char *filename, size_t filename_len, phar
if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL)) {
efree(arch);
- return phar_save_resolve_path(filename, filename_len);
+ return NULL;
}
splitted:
if (pphar) {
diff --git a/ext/phar/zip.c b/ext/phar/zip.c
index d7fe4d346d..bc47806ab5 100644
--- a/ext/phar/zip.c
+++ b/ext/phar/zip.c
@@ -303,11 +303,11 @@ foundit:
php_stream_seek(fp, PHAR_GET_32(locator.cdir_offset), SEEK_SET);
/* read in central directory */
zend_hash_init(&mydata->manifest, PHAR_GET_16(locator.count),
- zend_get_hash_value, destroy_phar_manifest_entry, (zend_bool)mydata->is_persistent);
+ zend_get_hash_value, destroy_phar_manifest_entry, (bool)mydata->is_persistent);
zend_hash_init(&mydata->mounted_dirs, 5,
- zend_get_hash_value, NULL, (zend_bool)mydata->is_persistent);
+ zend_get_hash_value, NULL, (bool)mydata->is_persistent);
zend_hash_init(&mydata->virtual_dirs, PHAR_GET_16(locator.count) * 2,
- zend_get_hash_value, NULL, (zend_bool)mydata->is_persistent);
+ zend_get_hash_value, NULL, (bool)mydata->is_persistent);
entry.phar = mydata;
entry.is_zip = 1;
entry.fp_type = PHAR_FP;
diff --git a/ext/posix/posix.c b/ext/posix/posix.c
index bb86b5324b..7538c3d527 100644
--- a/ext/posix/posix.c
+++ b/ext/posix/posix.c
@@ -138,6 +138,12 @@ static PHP_MINIT_FUNCTION(posix)
#ifdef RLIMIT_STACK
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_STACK", RLIMIT_STACK, CONST_CS | CONST_PERSISTENT);
#endif
+#ifdef RLIMIT_KQUEUES
+ REGISTER_LONG_CONSTANT("POSIX_RLIMIT_KQUEUES", RLIMIT_KQUEUES, CONST_CS | CONST_PERSISTENT);
+#endif
+#ifdef RLIMIT_NPTS
+ REGISTER_LONG_CONSTANT("POSIX_RLIMIT_NPTS", RLIMIT_NPTS, CONST_CS | CONST_PERSISTENT);
+#endif
#ifdef HAVE_SETRLIMIT
REGISTER_LONG_CONSTANT("POSIX_RLIMIT_INFINITY", RLIM_INFINITY, CONST_CS | CONST_PERSISTENT);
#endif
@@ -1096,6 +1102,14 @@ static const struct limitlist {
{ RLIMIT_OFILE, "openfiles" },
#endif
+#ifdef RLIMIT_KQUEUES
+ { RLIMIT_KQUEUES, "kqueues" },
+#endif
+
+#ifdef RLIMIT_NPTS
+ { RLIMIT_NPTS, "npts" },
+#endif
+
{ 0, NULL }
};
/* }}} */
diff --git a/ext/posix/posix.stub.php b/ext/posix/posix.stub.php
index a509d9460f..a15a3a5dc5 100644
--- a/ext/posix/posix.stub.php
+++ b/ext/posix/posix.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function posix_kill(int $process_id, int $signal): bool {}
diff --git a/ext/posix/posix_arginfo.h b/ext/posix/posix_arginfo.h
index 1d7b90f364..40f2dc4393 100644
--- a/ext/posix/posix_arginfo.h
+++ b/ext/posix/posix_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 6d1383a6f98104498b466ce5d9dcf5721760e8b7 */
+ * Stub hash: 954c403785617dade95048b4345a34d4ec5d91c3 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_posix_kill, 0, 2, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, process_id, IS_LONG, 0)
diff --git a/ext/posix/tests/posix_getgrgid_error.phpt b/ext/posix/tests/posix_getgrgid_error.phpt
index 46314f9aa4..9b01abc350 100644
--- a/ext/posix/tests/posix_getgrgid_error.phpt
+++ b/ext/posix/tests/posix_getgrgid_error.phpt
@@ -2,7 +2,8 @@
Test posix_getgrgid() function : error conditions
--SKIPIF--
<?php
- if(!extension_loaded("posix")) print "skip - POSIX extension not loaded";
+if(!extension_loaded("posix")) die("skip - POSIX extension not loaded");
+if (getenv('SKIP_ASAN')) die('skip LSan crashes when firebird is loaded');
?>
--FILE--
<?php
diff --git a/ext/posix/tests/posix_getpwuid_error.phpt b/ext/posix/tests/posix_getpwuid_error.phpt
index 15bd93b80d..9da73bd73e 100644
--- a/ext/posix/tests/posix_getpwuid_error.phpt
+++ b/ext/posix/tests/posix_getpwuid_error.phpt
@@ -2,7 +2,8 @@
Test posix_getpwuid() function : error conditions
--SKIPIF--
<?php
- if(!extension_loaded("posix")) print "skip - POSIX extension not loaded";
+if(!extension_loaded("posix")) dir("skip - POSIX extension not loaded");
+if (getenv('SKIP_ASAN')) die('skip LSan crashes when firebird is loaded');
?>
--FILE--
<?php
diff --git a/ext/posix/tests/posix_getrlimit_basic.phpt b/ext/posix/tests/posix_getrlimit_basic.phpt
deleted file mode 100644
index 57870477f8..0000000000
--- a/ext/posix/tests/posix_getrlimit_basic.phpt
+++ /dev/null
@@ -1,20 +0,0 @@
---TEST--
-posix_getrlimit(): Basic tests
---SKIPIF--
-<?php
-if (!extension_loaded('posix')) die('skip - POSIX extension not loaded');
-if (!function_exists('posix_getrlimit')) die('skip posix_getrlimit() not found');
-?>
---FILE--
-<?php
-echo "Basic test of POSIX posix_getrlimit function\n";
-var_dump(posix_getrlimit());
-
-?>
-===DONE====
---EXPECTF--
-Basic test of POSIX posix_getrlimit function
-array(%d) {
-%a
-}
-===DONE====
diff --git a/ext/posix/tests/posix_initgroups.phpt b/ext/posix/tests/posix_initgroups.phpt
index c77acfe3a4..5800c594d7 100644
--- a/ext/posix/tests/posix_initgroups.phpt
+++ b/ext/posix/tests/posix_initgroups.phpt
@@ -8,7 +8,7 @@ if (!function_exists('posix_initgroups')) die('skip posix_initgroups() not found
--FILE--
<?php
-var_dump(posix_initgroups(NULL, NULL));
+var_dump(posix_initgroups('', 0));
?>
--EXPECT--
diff --git a/ext/posix/tests/posix_mknod.phpt b/ext/posix/tests/posix_mknod.phpt
index a238f18186..fc3258f069 100644
--- a/ext/posix/tests/posix_mknod.phpt
+++ b/ext/posix/tests/posix_mknod.phpt
@@ -8,7 +8,7 @@ if (!function_exists('posix_mknod')) die('skip posix_mknod() not found');
--FILE--
<?php
-var_dump(posix_mknod(NULL, NULL, NULL, NULL));
+var_dump(posix_mknod('', 0, 0, 0));
?>
--EXPECT--
diff --git a/ext/posix/tests/posix_mknod_basic.phpt b/ext/posix/tests/posix_mknod_basic.phpt
deleted file mode 100644
index 568d8d3dc6..0000000000
--- a/ext/posix/tests/posix_mknod_basic.phpt
+++ /dev/null
@@ -1,18 +0,0 @@
---TEST--
-posix_mknod(): Basic tests
---SKIPIF--
-<?php
-if (!extension_loaded('posix')) die('skip - POSIX extension not loaded');
-if (!function_exists('posix_mknod')) die('skip posix_mknod() not found');
-?>
---FILE--
-<?php
-echo "Basic test of POSIX posix_mknod function\n";
-var_dump(posix_mknod(NULL, NULL, NULL, NULL));
-
-?>
-===DONE====
---EXPECT--
-Basic test of POSIX posix_mknod function
-bool(false)
-===DONE====
diff --git a/ext/pspell/pspell.c b/ext/pspell/pspell.c
index 63732b77b0..b965a22f61 100644
--- a/ext/pspell/pspell.c
+++ b/ext/pspell/pspell.c
@@ -19,6 +19,7 @@
#endif
#include "php.h"
+#include "zend_interfaces.h"
#include <stdlib.h>
#include <ctype.h>
@@ -48,58 +49,134 @@
static PHP_MINIT_FUNCTION(pspell);
static PHP_MINFO_FUNCTION(pspell);
-static int le_pspell, le_pspell_config;
+static zend_class_entry *php_pspell_ce = NULL;
+static zend_object_handlers php_pspell_handlers;
+static zend_class_entry *php_pspell_config_ce = NULL;
+static zend_object_handlers php_pspell_config_handlers;
zend_module_entry pspell_module_entry = {
STANDARD_MODULE_HEADER,
- "pspell", ext_functions, PHP_MINIT(pspell), NULL, NULL, NULL, PHP_MINFO(pspell), PHP_PSPELL_VERSION, STANDARD_MODULE_PROPERTIES
+ "pspell",
+ ext_functions,
+ PHP_MINIT(pspell),
+ NULL,
+ NULL,
+ NULL,
+ PHP_MINFO(pspell),
+ PHP_PSPELL_VERSION,
+ STANDARD_MODULE_PROPERTIES,
};
#ifdef COMPILE_DL_PSPELL
ZEND_GET_MODULE(pspell)
#endif
-static void php_pspell_close(zend_resource *rsrc)
+/* class PSpell */
+
+typedef struct _php_pspell_object {
+ PspellManager *mgr;
+ zend_object std;
+} php_pspell_object;
+
+static php_pspell_object *php_pspell_object_from_zend_object(zend_object *zobj) {
+ return ((php_pspell_object*)(zobj + 1)) - 1;
+}
+
+static zend_object *php_pspell_object_to_zend_object(php_pspell_object *obj) {
+ return ((zend_object*)(obj + 1)) - 1;
+}
+
+static zend_function *php_pspell_object_get_constructor(zend_object *object)
{
- PspellManager *manager = (PspellManager *)rsrc->ptr;
+ zend_throw_error(NULL, "You cannot initialize a PSpell object except through helper functions");
+ return NULL;
+}
+
+static zend_object *php_pspell_object_create(zend_class_entry *ce)
+{
+ php_pspell_object *obj = zend_object_alloc(sizeof(php_pspell_object), ce);
+ zend_object *zobj = php_pspell_object_to_zend_object(obj);
+
+ obj->mgr = NULL;
+ zend_object_std_init(zobj, ce);
+ object_properties_init(zobj, ce);
+ zobj->handlers = &php_pspell_handlers;
+
+ return zobj;
+}
+
+static void php_pspell_object_free(zend_object *zobj) {
+ delete_pspell_manager(php_pspell_object_from_zend_object(zobj)->mgr);
+}
- delete_pspell_manager(manager);
+/* class PSpellConfig */
+
+typedef struct _php_pspell_config_object {
+ PspellConfig *cfg;
+ zend_object std;
+} php_pspell_config_object;
+
+static php_pspell_config_object *php_pspell_config_object_from_zend_object(zend_object *zobj) {
+ return ((php_pspell_config_object*)(zobj + 1)) - 1;
}
-static void php_pspell_close_config(zend_resource *rsrc)
+static zend_object *php_pspell_config_object_to_zend_object(php_pspell_config_object *obj) {
+ return ((zend_object*)(obj + 1)) - 1;
+}
+
+static zend_function *php_pspell_config_object_get_constructor(zend_object *object)
{
- PspellConfig *config = (PspellConfig *)rsrc->ptr;
+ zend_throw_error(NULL, "You cannot initialize a PSpellConfig object except through helper functions");
+ return NULL;
+}
- delete_pspell_config(config);
+static zend_object *php_pspell_config_object_create(zend_class_entry *ce)
+{
+ php_pspell_config_object *obj = zend_object_alloc(sizeof(php_pspell_config_object), ce);
+ zend_object *zobj = php_pspell_config_object_to_zend_object(obj);
+
+ obj->cfg = NULL;
+ zend_object_std_init(zobj, ce);
+ object_properties_init(zobj, ce);
+ zobj->handlers = &php_pspell_config_handlers;
+
+ return zobj;
}
-#define PSPELL_FETCH_CONFIG do { \
- zval *res = zend_hash_index_find(&EG(regular_list), conf); \
- if (res == NULL || Z_RES_P(res)->type != le_pspell_config) { \
- zend_throw_error(NULL, "%s(): " ZEND_LONG_FMT " is not a PSPELL config index", get_active_function_name(), conf); \
- RETURN_THROWS(); \
- } \
- config = (PspellConfig *)Z_RES_P(res)->ptr; \
-} while (0)
-
-#define PSPELL_FETCH_MANAGER do { \
- zval *res = zend_hash_index_find(&EG(regular_list), scin); \
- if (res == NULL || Z_RES_P(res)->type != le_pspell) { \
- zend_throw_error(NULL, "%s(): " ZEND_LONG_FMT " is not a PSPELL result index", get_active_function_name(), scin); \
- RETURN_THROWS(); \
- } \
- manager = (PspellManager *)Z_RES_P(res)->ptr; \
-} while (0);
+static void php_pspell_config_object_free(zend_object *zobj) {
+ delete_pspell_config(php_pspell_config_object_from_zend_object(zobj)->cfg);
+}
/* {{{ PHP_MINIT_FUNCTION */
static PHP_MINIT_FUNCTION(pspell)
{
+ php_pspell_ce = register_class_PSpell();
+ php_pspell_ce->create_object = php_pspell_object_create;
+ php_pspell_ce->serialize = zend_class_serialize_deny;
+ php_pspell_ce->unserialize = zend_class_unserialize_deny;
+
+ memcpy(&php_pspell_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ php_pspell_handlers.clone_obj = NULL;
+ php_pspell_handlers.free_obj = php_pspell_object_free;
+ php_pspell_handlers.get_constructor = php_pspell_object_get_constructor;
+ php_pspell_handlers.offset = XtOffsetOf(php_pspell_object, std);
+
+ php_pspell_config_ce = register_class_PSpellConfig();
+ php_pspell_config_ce->create_object = php_pspell_config_object_create;
+ php_pspell_config_ce->serialize = zend_class_serialize_deny;
+ php_pspell_config_ce->unserialize = zend_class_unserialize_deny;
+
+ memcpy(&php_pspell_config_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ php_pspell_config_handlers.clone_obj = NULL;
+ php_pspell_config_handlers.free_obj = php_pspell_config_object_free;
+ php_pspell_config_handlers.get_constructor = php_pspell_config_object_get_constructor;
+ php_pspell_config_handlers.offset = XtOffsetOf(php_pspell_config_object, std);
+
REGISTER_LONG_CONSTANT("PSPELL_FAST", PSPELL_FAST, CONST_PERSISTENT | CONST_CS);
REGISTER_LONG_CONSTANT("PSPELL_NORMAL", PSPELL_NORMAL, CONST_PERSISTENT | CONST_CS);
REGISTER_LONG_CONSTANT("PSPELL_BAD_SPELLERS", PSPELL_BAD_SPELLERS, CONST_PERSISTENT | CONST_CS);
REGISTER_LONG_CONSTANT("PSPELL_RUN_TOGETHER", PSPELL_RUN_TOGETHER, CONST_PERSISTENT | CONST_CS);
- le_pspell = zend_register_list_destructors_ex(php_pspell_close, NULL, "pspell", module_number);
- le_pspell_config = zend_register_list_destructors_ex(php_pspell_close_config, NULL, "pspell config", module_number);
+
return SUCCESS;
}
/* }}} */
@@ -111,7 +188,6 @@ PHP_FUNCTION(pspell_new)
size_t language_len, spelling_len = 0, jargon_len = 0, encoding_len = 0;
zend_long mode = Z_L(0), speed = Z_L(0);
int argc = ZEND_NUM_ARGS();
- zval *ind;
#ifdef PHP_WIN32
TCHAR aspell_dir[200];
@@ -122,7 +198,6 @@ PHP_FUNCTION(pspell_new)
#endif
PspellCanHaveError *ret;
- PspellManager *manager;
PspellConfig *config;
if (zend_parse_parameters(argc, "s|sssl", &language, &language_len, &spelling, &spelling_len,
@@ -194,9 +269,8 @@ PHP_FUNCTION(pspell_new)
RETURN_FALSE;
}
- manager = to_pspell_manager(ret);
- ind = zend_list_insert(manager, le_pspell);
- RETURN_LONG(Z_RES_HANDLE_P(ind));
+ object_init_ex(return_value, php_pspell_ce);
+ php_pspell_object_from_zend_object(Z_OBJ_P(return_value))->mgr = to_pspell_manager(ret);
}
/* }}} */
@@ -207,7 +281,6 @@ PHP_FUNCTION(pspell_new_personal)
size_t personal_len, language_len, spelling_len = 0, jargon_len = 0, encoding_len = 0;
zend_long mode = Z_L(0), speed = Z_L(0);
int argc = ZEND_NUM_ARGS();
- zval *ind;
#ifdef PHP_WIN32
TCHAR aspell_dir[200];
@@ -218,7 +291,6 @@ PHP_FUNCTION(pspell_new_personal)
#endif
PspellCanHaveError *ret;
- PspellManager *manager;
PspellConfig *config;
if (zend_parse_parameters(argc, "ps|sssl", &personal, &personal_len, &language, &language_len,
@@ -298,26 +370,22 @@ PHP_FUNCTION(pspell_new_personal)
RETURN_FALSE;
}
- manager = to_pspell_manager(ret);
- ind = zend_list_insert(manager, le_pspell);
- RETURN_LONG(Z_RES_HANDLE_P(ind));
+ object_init_ex(return_value, php_pspell_ce);
+ php_pspell_object_from_zend_object(Z_OBJ_P(return_value))->mgr = to_pspell_manager(ret);
}
/* }}} */
/* {{{ Load a dictionary based on the given config */
PHP_FUNCTION(pspell_new_config)
{
- zend_long conf;
- zval *ind;
+ zval *zcfg;
PspellCanHaveError *ret;
- PspellManager *manager;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &conf) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &zcfg, php_pspell_config_ce) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
ret = new_pspell_manager(config);
@@ -327,27 +395,24 @@ PHP_FUNCTION(pspell_new_config)
RETURN_FALSE;
}
- manager = to_pspell_manager(ret);
- ind = zend_list_insert(manager, le_pspell);
- RETURN_LONG(Z_RES_HANDLE_P(ind));
+ object_init_ex(return_value, php_pspell_ce);
+ php_pspell_object_from_zend_object(Z_OBJ_P(return_value))->mgr = to_pspell_manager(ret);
}
/* }}} */
/* {{{ Returns true if word is valid */
PHP_FUNCTION(pspell_check)
{
- size_t word_len;
- zend_long scin;
- char *word;
+ zval *zmgr;
+ zend_string *word;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &scin, &word, &word_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &zmgr, php_pspell_ce, &word) == FAILURE) {
RETURN_THROWS();
}
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
- PSPELL_FETCH_MANAGER;
-
- if (pspell_manager_check(manager, word)) {
+ if (pspell_manager_check(manager, ZSTR_VAL(word))) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -358,22 +423,20 @@ PHP_FUNCTION(pspell_check)
/* {{{ Returns array of suggestions */
PHP_FUNCTION(pspell_suggest)
{
- zend_long scin;
- char *word;
- size_t word_len;
+ zval *zmgr;
+ zend_string *word;
PspellManager *manager;
const PspellWordList *wl;
const char *sug;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &scin, &word, &word_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &zmgr, php_pspell_ce, &word) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_MANAGER;
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
array_init(return_value);
- wl = pspell_manager_suggest(manager, word);
+ wl = pspell_manager_suggest(manager, ZSTR_VAL(word));
if (wl) {
PspellStringEmulation *els = pspell_word_list_elements(wl);
while ((sug = pspell_string_emulation_next(els)) != 0) {
@@ -390,18 +453,16 @@ PHP_FUNCTION(pspell_suggest)
/* {{{ Notify the dictionary of a user-selected replacement */
PHP_FUNCTION(pspell_store_replacement)
{
- size_t miss_len, corr_len;
- zend_long scin;
- char *miss, *corr;
+ zval *zmgr;
+ zend_string *miss, *corr;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lss", &scin, &miss, &miss_len, &corr, &corr_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS", &zmgr, php_pspell_ce, &miss, &corr) == FAILURE) {
RETURN_THROWS();
}
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
- PSPELL_FETCH_MANAGER;
-
- pspell_manager_store_replacement(manager, miss, corr);
+ pspell_manager_store_replacement(manager, ZSTR_VAL(miss), ZSTR_VAL(corr));
if (pspell_manager_error_number(manager) == 0) {
RETURN_TRUE;
} else {
@@ -414,23 +475,21 @@ PHP_FUNCTION(pspell_store_replacement)
/* {{{ Adds a word to a personal list */
PHP_FUNCTION(pspell_add_to_personal)
{
- size_t word_len;
- zend_long scin;
- char *word;
+ zval *zmgr;
+ zend_string *word;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &scin, &word, &word_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &zmgr, php_pspell_ce, &word) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_MANAGER;
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
/*If the word is empty, we have to return; otherwise we'll segfault! ouch!*/
- if (word_len == 0) {
+ if (ZSTR_LEN(word) == 0) {
RETURN_FALSE;
}
- pspell_manager_add_to_personal(manager, word);
+ pspell_manager_add_to_personal(manager, ZSTR_VAL(word));
if (pspell_manager_error_number(manager) == 0) {
RETURN_TRUE;
} else {
@@ -443,23 +502,21 @@ PHP_FUNCTION(pspell_add_to_personal)
/* {{{ Adds a word to the current session */
PHP_FUNCTION(pspell_add_to_session)
{
- size_t word_len;
- zend_long scin;
- char *word;
+ zval *zmgr;
+ zend_string *word;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &scin, &word, &word_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &zmgr, php_pspell_ce, &word) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_MANAGER;
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
/*If the word is empty, we have to return; otherwise we'll segfault! ouch!*/
- if (word_len == 0) {
+ if (ZSTR_LEN(word) == 0) {
RETURN_FALSE;
}
- pspell_manager_add_to_session(manager, word);
+ pspell_manager_add_to_session(manager, ZSTR_VAL(word));
if (pspell_manager_error_number(manager) == 0) {
RETURN_TRUE;
} else {
@@ -472,14 +529,13 @@ PHP_FUNCTION(pspell_add_to_session)
/* {{{ Clears the current session */
PHP_FUNCTION(pspell_clear_session)
{
- zend_long scin;
+ zval *zmgr;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &scin) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &zmgr, php_pspell_ce) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_MANAGER;
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
pspell_manager_clear_session(manager);
if (pspell_manager_error_number(manager) == 0) {
@@ -494,14 +550,13 @@ PHP_FUNCTION(pspell_clear_session)
/* {{{ Saves the current (personal) wordlist */
PHP_FUNCTION(pspell_save_wordlist)
{
- zend_long scin;
+ zval *zmgr;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &scin) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &zmgr, php_pspell_ce) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_MANAGER;
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
pspell_manager_save_all_word_lists(manager);
@@ -520,7 +575,6 @@ PHP_FUNCTION(pspell_config_create)
{
char *language, *spelling = NULL, *jargon = NULL, *encoding = NULL;
size_t language_len, spelling_len = 0, jargon_len = 0, encoding_len = 0;
- zval *ind;
PspellConfig *config;
#ifdef PHP_WIN32
@@ -577,23 +631,22 @@ PHP_FUNCTION(pspell_config_create)
which is not what we want */
pspell_config_replace(config, "save-repl", "false");
- ind = zend_list_insert(config, le_pspell_config);
- RETURN_LONG(Z_RES_HANDLE_P(ind));
+ object_init_ex(return_value, php_pspell_config_ce);
+ php_pspell_config_object_from_zend_object(Z_OBJ_P(return_value))->cfg = config;
}
/* }}} */
/* {{{ Consider run-together words as valid components */
PHP_FUNCTION(pspell_config_runtogether)
{
- zend_long conf;
- zend_bool runtogether;
+ zval *zcfg;
+ bool runtogether;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lb", &conf, &runtogether) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &zcfg, php_pspell_config_ce, &runtogether) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
pspell_config_replace(config, "run-together", runtogether ? "true" : "false");
@@ -604,14 +657,14 @@ PHP_FUNCTION(pspell_config_runtogether)
/* {{{ Select mode for config (PSPELL_FAST, PSPELL_NORMAL or PSPELL_BAD_SPELLERS) */
PHP_FUNCTION(pspell_config_mode)
{
- zend_long conf, mode;
+ zval *zcfg;
+ zend_long mode;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", &conf, &mode) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &zcfg, php_pspell_config_ce, &mode) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
/* First check what mode we want (how many suggestions) */
if (mode == PSPELL_FAST) {
@@ -630,14 +683,14 @@ PHP_FUNCTION(pspell_config_mode)
PHP_FUNCTION(pspell_config_ignore)
{
char ignore_str[MAX_LENGTH_OF_LONG + 1];
- zend_long conf, ignore = 0L;
+ zval *zcfg;
+ zend_long ignore = 0L;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", &conf, &ignore) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &zcfg, php_pspell_config_ce, &ignore) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
snprintf(ignore_str, sizeof(ignore_str), ZEND_LONG_FMT, ignore);
@@ -648,22 +701,20 @@ PHP_FUNCTION(pspell_config_ignore)
static void pspell_config_path(INTERNAL_FUNCTION_PARAMETERS, char *option)
{
- zend_long conf;
- char *value;
- size_t value_len;
+ zval *zcfg;
+ zend_string *value;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lp", &conf, &value, &value_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OP", &zcfg, php_pspell_config_ce, &value) == FAILURE) {
RETURN_THROWS();
}
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
- PSPELL_FETCH_CONFIG;
-
- if (php_check_open_basedir(value)) {
+ if (php_check_open_basedir(ZSTR_VAL(value))) {
RETURN_FALSE;
}
- pspell_config_replace(config, option, value);
+ pspell_config_replace(config, option, ZSTR_VAL(value));
RETURN_TRUE;
}
@@ -692,24 +743,22 @@ PHP_FUNCTION(pspell_config_data_dir)
/* {{{ Use a personal dictionary with replacement pairs for this config */
PHP_FUNCTION(pspell_config_repl)
{
- zend_long conf;
- char *repl;
- size_t repl_len;
+ zval *zcfg;
+ zend_string *repl;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lp", &conf, &repl, &repl_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OP", &zcfg, php_pspell_config_ce, &repl) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
pspell_config_replace(config, "save-repl", "true");
- if (php_check_open_basedir(repl)) {
+ if (php_check_open_basedir(ZSTR_VAL(repl))) {
RETURN_FALSE;
}
- pspell_config_replace(config, "repl", repl);
+ pspell_config_replace(config, "repl", ZSTR_VAL(repl));
RETURN_TRUE;
}
@@ -718,15 +767,14 @@ PHP_FUNCTION(pspell_config_repl)
/* {{{ Save replacement pairs when personal list is saved for this config */
PHP_FUNCTION(pspell_config_save_repl)
{
- zend_long conf;
- zend_bool save;
+ zval *zcfg;
+ bool save;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lb", &conf, &save) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &zcfg, php_pspell_config_ce, &save) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
pspell_config_replace(config, "save-repl", save ? "true" : "false");
diff --git a/ext/pspell/pspell.stub.php b/ext/pspell/pspell.stub.php
index cf15fb35eb..40a2a73097 100644
--- a/ext/pspell/pspell.stub.php
+++ b/ext/pspell/pspell.stub.php
@@ -1,8 +1,13 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
-function pspell_new(string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int|false {}
+/** @strict-properties */
+final class PSpell {}
+/** @strict-properties */
+final class PSpellConfig {}
+
+function pspell_new(string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): PSpell|false {}
function pspell_new_personal(
string $filename,
@@ -11,38 +16,24 @@ function pspell_new_personal(
string $jargon = "",
string $encoding = "",
int $mode = 0
-): int|false {}
-
-function pspell_new_config(int $config): int|false {}
-
-function pspell_check(int $dictionary, string $word): bool {}
-
-function pspell_suggest(int $dictionary, string $word): array|false {}
-
-function pspell_store_replacement(int $dictionary, string $misspelled, string $correct): bool {}
-
-function pspell_add_to_personal(int $dictionary, string $word): bool {}
-
-function pspell_add_to_session(int $dictionary, string $word): bool {}
-
-function pspell_clear_session(int $dictionary): bool {}
-
-function pspell_save_wordlist(int $dictionary): bool {}
-
-function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = ""): int {}
-
-function pspell_config_runtogether(int $config, bool $allow): bool {}
-
-function pspell_config_mode(int $config, int $mode): bool {}
-
-function pspell_config_ignore(int $config, int $min_length): bool {}
-
-function pspell_config_personal(int $config, string $filename): bool {}
-
-function pspell_config_dict_dir(int $config, string $directory): bool {}
-
-function pspell_config_data_dir(int $config, string $directory): bool {}
-
-function pspell_config_repl(int $config, string $filename): bool {}
-
-function pspell_config_save_repl(int $config, bool $save): bool {}
+): PSpell|false {}
+
+function pspell_new_config(PSpellConfig $config): PSpell|false {}
+
+function pspell_check(PSpell $dictionary, string $word): bool {}
+function pspell_suggest(PSpell $dictionary, string $word): array|false {}
+function pspell_store_replacement(PSpell $dictionary, string $misspelled, string $correct): bool {}
+function pspell_add_to_personal(PSpell $dictionary, string $word): bool {}
+function pspell_add_to_session(PSpell $dictionary, string $word): bool {}
+function pspell_clear_session(PSpell $dictionary): bool {}
+function pspell_save_wordlist(PSpell $dictionary): bool {}
+
+function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = ""): PSpellConfig {}
+function pspell_config_runtogether(PSpellConfig $config, bool $allow): bool {}
+function pspell_config_mode(PSpellConfig $config, int $mode): bool {}
+function pspell_config_ignore(PSpellConfig $config, int $min_length): bool {}
+function pspell_config_personal(PSpellConfig $config, string $filename): bool {}
+function pspell_config_dict_dir(PSpellConfig $config, string $directory): bool {}
+function pspell_config_data_dir(PSpellConfig $config, string $directory): bool {}
+function pspell_config_repl(PSpellConfig $config, string $filename): bool {}
+function pspell_config_save_repl(PSpellConfig $config, bool $save): bool {}
diff --git a/ext/pspell/pspell_arginfo.h b/ext/pspell/pspell_arginfo.h
index 102907461c..323d465126 100644
--- a/ext/pspell/pspell_arginfo.h
+++ b/ext/pspell/pspell_arginfo.h
@@ -1,7 +1,7 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 1d201126072be285aa2dd3c0136cb7cc261f5841 */
+ * Stub hash: d7a2f6b4aa719778166e5a255432f03100184a42 */
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_new, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_pspell_new, 0, 1, PSpell, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, language, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, spelling, IS_STRING, 0, "\"\"")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, jargon, IS_STRING, 0, "\"\"")
@@ -9,7 +9,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_new, 0, 1, MAY_BE_LONG|MA
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_new_personal, 0, 2, MAY_BE_LONG|MAY_BE_FALSE)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_pspell_new_personal, 0, 2, PSpell, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, language, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, spelling, IS_STRING, 0, "\"\"")
@@ -18,22 +18,22 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_new_personal, 0, 2, MAY_B
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_new_config, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_pspell_new_config, 0, 1, PSpell, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_check, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, dictionary, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, dictionary, PSpell, 0)
ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_suggest, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_TYPE_INFO(0, dictionary, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, dictionary, PSpell, 0)
ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_store_replacement, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, dictionary, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, dictionary, PSpell, 0)
ZEND_ARG_TYPE_INFO(0, misspelled, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, correct, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -43,12 +43,12 @@ ZEND_END_ARG_INFO()
#define arginfo_pspell_add_to_session arginfo_pspell_check
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_clear_session, 0, 1, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, dictionary, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, dictionary, PSpell, 0)
ZEND_END_ARG_INFO()
#define arginfo_pspell_save_wordlist arginfo_pspell_clear_session
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_create, 0, 1, IS_LONG, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_pspell_config_create, 0, 1, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, language, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, spelling, IS_STRING, 0, "\"\"")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, jargon, IS_STRING, 0, "\"\"")
@@ -56,27 +56,27 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_create, 0, 1, IS_L
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_runtogether, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, allow, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_mode, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, mode, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_ignore, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, min_length, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_personal, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_dict_dir, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -85,7 +85,7 @@ ZEND_END_ARG_INFO()
#define arginfo_pspell_config_repl arginfo_pspell_config_personal
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_save_repl, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, save, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
@@ -133,3 +133,35 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(pspell_config_save_repl, arginfo_pspell_config_save_repl)
ZEND_FE_END
};
+
+
+static const zend_function_entry class_PSpell_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_PSpellConfig_methods[] = {
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class_PSpell(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "PSpell", class_PSpell_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_PSpellConfig(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "PSpellConfig", class_PSpellConfig_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/pspell/tests/003.phpt b/ext/pspell/tests/003.phpt
index e8677ae826..63291a8d42 100644
--- a/ext/pspell/tests/003.phpt
+++ b/ext/pspell/tests/003.phpt
@@ -34,7 +34,7 @@ var_dump(pspell_config_ignore($cfg, PHP_INT_MAX));
bool(false)
Warning: pspell_new_config(): PSPELL couldn't open the dictionary. reason: The encoding "b0rked" is not known. This could also mean that the file "%sb0rked.%s" could not be opened for reading or does not exist. in %s003.php on line 9
-pspell_check(): 0 is not a PSPELL result index
+pspell_check(): Argument #1 ($dictionary) must be of type PSpell, bool given
---
bool(true)
bool(true)
diff --git a/ext/pspell/tests/004.phpt b/ext/pspell/tests/004.phpt
index 80602bce39..24c4bffffa 100644
--- a/ext/pspell/tests/004.phpt
+++ b/ext/pspell/tests/004.phpt
@@ -22,8 +22,6 @@ var_dump(pspell_config_runtogether($cfg, true));
$p = pspell_new_config($cfg);
var_dump(pspell_check($p, 'theoasis'));
-var_dump(pspell_config_runtogether($cfg, NULL))
-
?>
--EXPECT--
bool(true)
@@ -32,4 +30,3 @@ bool(false)
---
bool(true)
bool(true)
-bool(true)
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index 647eb0977f..2b001e8ebd 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -414,7 +414,7 @@ static char *_readline_command_generator(const char *text, int state)
while ((entry = zend_hash_get_current_data(myht)) != NULL) {
zend_hash_move_forward(myht);
- convert_to_string_ex(entry);
+ convert_to_string(entry);
if (strncmp (Z_STRVAL_P(entry), text, strlen(text)) == 0) {
return (strdup(Z_STRVAL_P(entry)));
}
diff --git a/ext/readline/readline.stub.php b/ext/readline/readline.stub.php
index cfc1d0d8d5..26f5755923 100644
--- a/ext/readline/readline.stub.php
+++ b/ext/readline/readline.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function readline(?string $prompt = null): string|false {}
diff --git a/ext/readline/readline_arginfo.h b/ext/readline/readline_arginfo.h
index 0b432d1e4e..7511b44e06 100644
--- a/ext/readline/readline_arginfo.h
+++ b/ext/readline/readline_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 226b138a99e3e32aea90cbb5c44446ac7c16db71 */
+ * Stub hash: d121fe2e6860eb29eba0b4d34c446cd08e3c6f43 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_readline, 0, 0, MAY_BE_STRING|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, prompt, IS_STRING, 1, "null")
diff --git a/ext/readline/readline_cli.c b/ext/readline/readline_cli.c
index 2930796ae7..b13cd4ea81 100644
--- a/ext/readline/readline_cli.c
+++ b/ext/readline/readline_cli.c
@@ -598,8 +598,10 @@ static int readline_shell_run(void) /* {{{ */
if (PG(auto_prepend_file) && PG(auto_prepend_file)[0]) {
zend_file_handle prepend_file;
+
zend_stream_init_filename(&prepend_file, PG(auto_prepend_file));
zend_execute_scripts(ZEND_REQUIRE, NULL, 1, &prepend_file);
+ zend_destroy_file_handle(&prepend_file);
}
#ifndef PHP_WIN32
diff --git a/ext/readline/tests/libedit_info_001.phpt b/ext/readline/tests/libedit_info_001.phpt
index 46618120fb..8b6fb80671 100644
--- a/ext/readline/tests/libedit_info_001.phpt
+++ b/ext/readline/tests/libedit_info_001.phpt
@@ -6,6 +6,7 @@ if (READLINE_LIB != "libedit") die("skip libedit only");
if(substr(PHP_OS, 0, 3) == 'WIN' ) {
die('skip not for windows');
}
+if (getenv('SKIP_REPEAT')) die("skip readline has global state");
?>
--FILE--
<?php
diff --git a/ext/readline/tests/libedit_write_history_001-win32.phpt b/ext/readline/tests/libedit_write_history_001-win32.phpt
index 6cc94bd129..e6ff60af5c 100644
--- a/ext/readline/tests/libedit_write_history_001-win32.phpt
+++ b/ext/readline/tests/libedit_write_history_001-win32.phpt
@@ -15,7 +15,6 @@ $name = tempnam(sys_get_temp_dir(), 'readline.tmp');
readline_add_history('foo');
readline_add_history('');
readline_add_history(1);
-readline_add_history(NULL);
readline_write_history($name);
var_dump(file_get_contents($name));
diff --git a/ext/readline/tests/libedit_write_history_001.phpt b/ext/readline/tests/libedit_write_history_001.phpt
index 96424e232f..e7013111e7 100644
--- a/ext/readline/tests/libedit_write_history_001.phpt
+++ b/ext/readline/tests/libedit_write_history_001.phpt
@@ -6,6 +6,7 @@ if (READLINE_LIB != "libedit") die("skip libedit only");
if(substr(PHP_OS, 0, 3) == 'WIN' ) {
die('skip not for windows');
}
+if (getenv('SKIP_REPEAT')) die("skip readline has global state");
?>
--FILE--
<?php
@@ -15,7 +16,6 @@ $name = tempnam('/tmp', 'readline.tmp');
readline_add_history('foo');
readline_add_history('');
readline_add_history(1);
-readline_add_history(NULL);
readline_write_history($name);
var_dump(file_get_contents($name));
@@ -24,9 +24,8 @@ unlink($name);
?>
--EXPECT--
-string(21) "_HiStOrY_V2_
+string(20) "_HiStOrY_V2_
foo
1
-
"
diff --git a/ext/readline/tests/readline_add_history_001.phpt b/ext/readline/tests/readline_add_history_001.phpt
index 7b6b4112db..bd505d45f6 100644
--- a/ext/readline/tests/readline_add_history_001.phpt
+++ b/ext/readline/tests/readline_add_history_001.phpt
@@ -7,7 +7,7 @@ readline_add_history(): Basic test
var_dump(readline_add_history('foo'));
var_dump(readline_list_history());
-var_dump(readline_add_history(NULL));
+var_dump(readline_add_history(''));
var_dump(readline_list_history());
var_dump(readline_clear_history());
diff --git a/ext/readline/tests/readline_info_001.phpt b/ext/readline/tests/readline_info_001.phpt
index 8f5d641d94..f0d4e67ca5 100644
--- a/ext/readline/tests/readline_info_001.phpt
+++ b/ext/readline/tests/readline_info_001.phpt
@@ -3,6 +3,7 @@ readline_info(): Basic test
--SKIPIF--
<?php if (!extension_loaded("readline")) die("skip");
if (READLINE_LIB == "libedit") die("skip readline only");
+if (getenv('SKIP_REPEAT')) die("skip readline has global state");
?>
--FILE--
<?php
diff --git a/ext/readline/tests/readline_read_history_001.phpt b/ext/readline/tests/readline_read_history_001.phpt
index 6cabaf369b..8fbcaf1a27 100644
--- a/ext/readline/tests/readline_read_history_001.phpt
+++ b/ext/readline/tests/readline_read_history_001.phpt
@@ -1,7 +1,10 @@
--TEST--
readline_read_history(): Basic test
--SKIPIF--
-<?php if (!extension_loaded("readline") || !function_exists('readline_list_history')) die("skip"); ?>
+<?php
+if (!extension_loaded("readline") || !function_exists('readline_list_history')) die("skip");
+if (getenv('SKIP_REPEAT')) die("skip readline has global state");
+?>
--FILE--
<?php
diff --git a/ext/readline/tests/readline_write_history_001.phpt b/ext/readline/tests/readline_write_history_001.phpt
index 95c34e3e89..b1e934c3b0 100644
--- a/ext/readline/tests/readline_write_history_001.phpt
+++ b/ext/readline/tests/readline_write_history_001.phpt
@@ -3,6 +3,7 @@ readline_write_history(): Basic test
--SKIPIF--
<?php if (!extension_loaded("readline") || !function_exists('readline_add_history')) die("skip");
if (READLINE_LIB == "libedit") die("skip readline only");
+if (getenv('SKIP_REPEAT')) die("skip readline has global state");
?>
--FILE--
<?php
@@ -12,7 +13,6 @@ $name = tempnam('/tmp', 'readline.tmp');
readline_add_history('foo');
readline_add_history('');
readline_add_history(1);
-readline_add_history(NULL);
readline_write_history($name);
var_dump(file_get_contents($name));
@@ -21,8 +21,7 @@ unlink($name);
?>
--EXPECT--
-string(8) "foo
+string(7) "foo
1
-
"
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 64c5355fc8..280b3fc06c 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -43,12 +43,13 @@
#include "zend_extensions.h"
#include "zend_builtin_functions.h"
#include "zend_smart_str.h"
+#include "zend_enum.h"
#include "php_reflection_arginfo.h"
/* Key used to avoid leaking addresses in ReflectionProperty::getId() */
#define REFLECTION_KEY_LEN 16
ZEND_BEGIN_MODULE_GLOBALS(reflection)
- zend_bool key_initialized;
+ bool key_initialized;
unsigned char key[REFLECTION_KEY_LEN];
ZEND_END_MODULE_GLOBALS(reflection)
ZEND_DECLARE_MODULE_GLOBALS(reflection)
@@ -87,6 +88,9 @@ PHPAPI zend_class_entry *reflection_extension_ptr;
PHPAPI zend_class_entry *reflection_zend_extension_ptr;
PHPAPI zend_class_entry *reflection_reference_ptr;
PHPAPI zend_class_entry *reflection_attribute_ptr;
+PHPAPI zend_class_entry *reflection_enum_ptr;
+PHPAPI zend_class_entry *reflection_enum_unit_case_ptr;
+PHPAPI zend_class_entry *reflection_enum_backed_case_ptr;
/* Exception throwing macro */
#define _DO_THROW(msg) \
@@ -125,7 +129,7 @@ typedef struct _property_reference {
/* Struct for parameters */
typedef struct _parameter_reference {
uint32_t offset;
- zend_bool required;
+ bool required;
struct _zend_arg_info *arg_info;
zend_function *fptr;
} parameter_reference;
@@ -134,7 +138,7 @@ typedef struct _parameter_reference {
typedef struct _type_reference {
zend_type type;
/* Whether to use backwards compatible null representation */
- zend_bool legacy_behavior;
+ bool legacy_behavior;
} type_reference;
/* Struct for attributes */
@@ -180,7 +184,7 @@ static zend_always_inline uint32_t prop_get_flags(property_reference *ref) {
return ref->prop ? ref->prop->flags : ZEND_ACC_PUBLIC;
}
-static inline zend_bool is_closure_invoke(zend_class_entry *ce, zend_string *lcname) {
+static inline bool is_closure_invoke(zend_class_entry *ce, zend_string *lcname) {
return ce == zend_ce_closure
&& zend_string_equals_literal(lcname, ZEND_INVOKE_FUNC_NAME);
}
@@ -386,7 +390,7 @@ static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char
zend_string *key;
zend_class_constant *c;
- ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, key, c) {
+ ZEND_HASH_FOREACH_STR_KEY_PTR(CE_CONSTANTS_TABLE(ce), key, c) {
_class_const_string(str, ZSTR_VAL(key), c, ZSTR_VAL(sub_indent));
if (UNEXPECTED(EG(exception))) {
zend_string_release(sub_indent);
@@ -573,6 +577,9 @@ static void _class_const_string(smart_str *str, char *name, zend_class_constant
if (Z_TYPE(c->value) == IS_ARRAY) {
smart_str_append_printf(str, "%sConstant [ %s %s %s ] { Array }\n",
indent, visibility, type, name);
+ } else if (Z_TYPE(c->value) == IS_OBJECT) {
+ smart_str_append_printf(str, "%sConstant [ %s %s %s ] { Object }\n",
+ indent, visibility, type, name);
} else {
zend_string *tmp_value_str;
zend_string *value_str = zval_get_tmp_string(&c->value, &tmp_value_str);
@@ -645,13 +652,13 @@ static int format_default_value(smart_str *str, zval *value, zend_class_entry *s
return SUCCESS;
}
-static inline zend_bool has_internal_arg_info(const zend_function *fptr) {
+static inline bool has_internal_arg_info(const zend_function *fptr) {
return fptr->type == ZEND_INTERNAL_FUNCTION
&& !(fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO);
}
/* {{{ _parameter_string */
-static void _parameter_string(smart_str *str, zend_function *fptr, struct _zend_arg_info *arg_info, uint32_t offset, zend_bool required, char* indent)
+static void _parameter_string(smart_str *str, zend_function *fptr, struct _zend_arg_info *arg_info, uint32_t offset, bool required, char* indent)
{
smart_str_append_printf(str, "Parameter #%d [ ", offset);
if (!required) {
@@ -1251,6 +1258,18 @@ PHPAPI void zend_reflection_class_factory(zend_class_entry *ce, zval *object)
}
/* }}} */
+static void zend_reflection_enum_factory(zend_class_entry *ce, zval *object)
+{
+ reflection_object *intern;
+
+ reflection_instantiate(reflection_enum_ptr, object);
+ intern = Z_REFLECTION_P(object);
+ intern->ptr = ce;
+ intern->ref_type = REF_TYPE_OTHER;
+ intern->ce = ce;
+ ZVAL_STR_COPY(reflection_prop_name(object), ce->name);
+}
+
/* {{{ reflection_extension_factory */
static void reflection_extension_factory(zval *object, const char *name_str)
{
@@ -1277,7 +1296,7 @@ static void reflection_extension_factory(zval *object, const char *name_str)
/* }}} */
/* {{{ reflection_parameter_factory */
-static void reflection_parameter_factory(zend_function *fptr, zval *closure_object, struct _zend_arg_info *arg_info, uint32_t offset, zend_bool required, zval *object)
+static void reflection_parameter_factory(zend_function *fptr, zval *closure_object, struct _zend_arg_info *arg_info, uint32_t offset, bool required, zval *object)
{
reflection_object *intern;
parameter_reference *reference;
@@ -1309,7 +1328,7 @@ static void reflection_parameter_factory(zend_function *fptr, zval *closure_obje
/* For backwards compatibility reasons, we need to return T|null style unions
* as a ReflectionNamedType. Here we determine what counts as a union type and
* what doesn't. */
-static zend_bool is_union_type(zend_type type) {
+static bool is_union_type(zend_type type) {
if (ZEND_TYPE_HAS_LIST(type)) {
return 1;
}
@@ -1325,12 +1344,12 @@ static zend_bool is_union_type(zend_type type) {
}
/* {{{ reflection_type_factory */
-static void reflection_type_factory(zend_type type, zval *object, zend_bool legacy_behavior)
+static void reflection_type_factory(zend_type type, zval *object, bool legacy_behavior)
{
reflection_object *intern;
type_reference *reference;
- zend_bool is_union = is_union_type(type);
- zend_bool is_mixed = ZEND_TYPE_PURE_MASK(type) == MAY_BE_ANY;
+ bool is_union = is_union_type(type);
+ bool is_mixed = ZEND_TYPE_PURE_MASK(type) == MAY_BE_ANY;
reflection_instantiate(is_union && !is_mixed ? reflection_union_type_ptr : reflection_named_type_ptr, object);
intern = Z_REFLECTION_P(object);
@@ -1430,6 +1449,24 @@ static void reflection_class_constant_factory(zend_string *name_str, zend_class_
}
/* }}} */
+static void reflection_enum_case_factory(zend_class_entry *ce, zend_string *name_str, zend_class_constant *constant, zval *object)
+{
+ reflection_object *intern;
+
+ zend_class_entry *case_reflection_class = ce->backed_enum_table == IS_UNDEF
+ ? reflection_enum_unit_case_ptr
+ : reflection_enum_backed_case_ptr;
+ reflection_instantiate(case_reflection_class, object);
+ intern = Z_REFLECTION_P(object);
+ intern->ptr = constant;
+ intern->ref_type = REF_TYPE_CLASS_CONSTANT;
+ intern->ce = constant->ce;
+ intern->ignore_visibility = 0;
+
+ ZVAL_STR_COPY(reflection_prop_name(object), name_str);
+ ZVAL_STR_COPY(reflection_prop_class(object), constant->ce->name);
+}
+
static int get_parameter_default(zval *result, parameter_reference *param) {
if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
if (param->fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO) {
@@ -1801,7 +1838,6 @@ ZEND_METHOD(ReflectionFunctionAbstract, getStaticVariables)
array_init(return_value);
ht = ZEND_MAP_PTR_GET(fptr->op_array.static_variables_ptr);
if (!ht) {
- ZEND_ASSERT(fptr->op_array.fn_flags & ZEND_ACC_IMMUTABLE);
ht = zend_array_dup(fptr->op_array.static_variables);
ZEND_MAP_PTR_SET(fptr->op_array.static_variables_ptr, ht);
}
@@ -2249,7 +2285,7 @@ ZEND_METHOD(ReflectionParameter, __construct)
struct _zend_arg_info *arg_info;
uint32_t num_args;
zend_class_entry *ce = NULL;
- zend_bool is_closure = 0;
+ bool is_closure = 0;
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_ZVAL(reference)
@@ -2957,8 +2993,14 @@ ZEND_METHOD(ReflectionUnionType, getTypes)
append_type(return_value, *list_type);
} ZEND_TYPE_LIST_FOREACH_END();
} else if (ZEND_TYPE_HAS_NAME(param->type)) {
- append_type(return_value,
- (zend_type) ZEND_TYPE_INIT_CLASS(ZEND_TYPE_NAME(param->type), 0, 0));
+ if (ZEND_TYPE_HAS_CE_CACHE(param->type)
+ && ZEND_TYPE_CE_CACHE(param->type)) {
+ append_type(return_value,
+ (zend_type) ZEND_TYPE_INIT_CE(ZEND_TYPE_CE_CACHE(param->type), 0, 0));
+ } else {
+ append_type(return_value,
+ (zend_type) ZEND_TYPE_INIT_CLASS(ZEND_TYPE_NAME(param->type), 0, 0));
+ }
} else if (ZEND_TYPE_HAS_CE(param->type)) {
append_type(return_value,
(zend_type) ZEND_TYPE_INIT_CE(ZEND_TYPE_CE(param->type), 0, 0));
@@ -3517,7 +3559,7 @@ ZEND_METHOD(ReflectionMethod, getPrototype)
ZEND_METHOD(ReflectionMethod, setAccessible)
{
reflection_object *intern;
- zend_bool visible;
+ bool visible;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &visible) == FAILURE) {
RETURN_THROWS();
@@ -3557,7 +3599,7 @@ ZEND_METHOD(ReflectionClassConstant, __construct)
object = ZEND_THIS;
intern = Z_REFLECTION_P(object);
- if ((constant = zend_hash_find_ptr(&ce->constants_table, constname)) == NULL) {
+ if ((constant = zend_hash_find_ptr(CE_CONSTANTS_TABLE(ce), constname)) == NULL) {
zend_throw_exception_ex(reflection_exception_ptr, 0, "Constant %s::%s does not exist", ZSTR_VAL(ce->name), ZSTR_VAL(constname));
RETURN_THROWS();
}
@@ -3660,10 +3702,10 @@ ZEND_METHOD(ReflectionClassConstant, getValue)
}
GET_REFLECTION_OBJECT_PTR(ref);
- ZVAL_COPY_OR_DUP(return_value, &ref->value);
- if (Z_TYPE_P(return_value) == IS_CONSTANT_AST) {
- zval_update_constant_ex(return_value, ref->ce);
+ if (Z_TYPE(ref->value) == IS_CONSTANT_AST) {
+ zval_update_constant_ex(&ref->value, ref->ce);
}
+ ZVAL_COPY_OR_DUP(return_value, &ref->value);
}
/* }}} */
@@ -3713,6 +3755,16 @@ ZEND_METHOD(ReflectionClassConstant, getAttributes)
}
/* }}} */
+ZEND_METHOD(ReflectionClassConstant, isEnumCase)
+{
+ reflection_object *intern;
+ zend_class_constant *ref;
+
+ GET_REFLECTION_OBJECT_PTR(ref);
+
+ RETURN_BOOL(Z_ACCESS_FLAGS(ref->value) & ZEND_CLASS_CONST_IS_CASE);
+}
+
/* {{{ reflection_class_object_ctor */
static void reflection_class_object_ctor(INTERNAL_FUNCTION_PARAMETERS, int is_object)
{
@@ -3764,7 +3816,7 @@ ZEND_METHOD(ReflectionClass, __construct)
/* }}} */
/* {{{ add_class_vars */
-static void add_class_vars(zend_class_entry *ce, zend_bool statics, zval *return_value)
+static void add_class_vars(zend_class_entry *ce, bool statics, zval *return_value)
{
zend_property_info *prop_info;
zval *prop, prop_copy;
@@ -3776,7 +3828,7 @@ static void add_class_vars(zend_class_entry *ce, zend_bool statics, zval *return
continue;
}
- zend_bool is_static = (prop_info->flags & ZEND_ACC_STATIC) != 0;
+ bool is_static = (prop_info->flags & ZEND_ACC_STATIC) != 0;
if (statics != is_static) {
continue;
}
@@ -4208,7 +4260,7 @@ ZEND_METHOD(ReflectionClass, getMethods)
zend_class_entry *ce;
zend_function *mptr;
zend_long filter;
- zend_bool filter_is_null = 1;
+ bool filter_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!", &filter, &filter_is_null) == FAILURE) {
RETURN_THROWS();
@@ -4226,7 +4278,7 @@ ZEND_METHOD(ReflectionClass, getMethods)
} ZEND_HASH_FOREACH_END();
if (instanceof_function(ce, zend_ce_closure)) {
- zend_bool has_obj = Z_TYPE(intern->obj) != IS_UNDEF;
+ bool has_obj = Z_TYPE(intern->obj) != IS_UNDEF;
zval obj_tmp;
zend_object *obj;
if (!has_obj) {
@@ -4384,7 +4436,7 @@ ZEND_METHOD(ReflectionClass, getProperties)
zend_string *key;
zend_property_info *prop_info;
zend_long filter;
- zend_bool filter_is_null = 1;
+ bool filter_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!", &filter, &filter_is_null) == FAILURE) {
RETURN_THROWS();
@@ -4440,7 +4492,7 @@ ZEND_METHOD(ReflectionClass, getConstants)
zend_class_constant *constant;
zval val;
zend_long filter;
- zend_bool filter_is_null = 1;
+ bool filter_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!", &filter, &filter_is_null) == FAILURE) {
RETURN_THROWS();
@@ -4453,7 +4505,7 @@ ZEND_METHOD(ReflectionClass, getConstants)
GET_REFLECTION_OBJECT_PTR(ce);
array_init(return_value);
- ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, key, constant) {
+ ZEND_HASH_FOREACH_STR_KEY_PTR(CE_CONSTANTS_TABLE(ce), key, constant) {
if (UNEXPECTED(zval_update_constant_ex(&constant->value, ce) != SUCCESS)) {
RETURN_THROWS();
}
@@ -4474,7 +4526,7 @@ ZEND_METHOD(ReflectionClass, getReflectionConstants)
zend_string *name;
zend_class_constant *constant;
zend_long filter;
- zend_bool filter_is_null = 1;
+ bool filter_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!", &filter, &filter_is_null) == FAILURE) {
RETURN_THROWS();
@@ -4487,7 +4539,7 @@ ZEND_METHOD(ReflectionClass, getReflectionConstants)
GET_REFLECTION_OBJECT_PTR(ce);
array_init(return_value);
- ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, name, constant) {
+ ZEND_HASH_FOREACH_STR_KEY_PTR(CE_CONSTANTS_TABLE(ce), name, constant) {
if (Z_ACCESS_FLAGS(constant->value) & filter) {
zval class_const;
reflection_class_constant_factory(name, constant, &class_const);
@@ -4502,6 +4554,7 @@ ZEND_METHOD(ReflectionClass, getConstant)
{
reflection_object *intern;
zend_class_entry *ce;
+ HashTable *constants_table;
zend_class_constant *c;
zend_string *name;
@@ -4510,12 +4563,13 @@ ZEND_METHOD(ReflectionClass, getConstant)
}
GET_REFLECTION_OBJECT_PTR(ce);
- ZEND_HASH_FOREACH_PTR(&ce->constants_table, c) {
+ constants_table = CE_CONSTANTS_TABLE(ce);
+ ZEND_HASH_FOREACH_PTR(constants_table, c) {
if (UNEXPECTED(zval_update_constant_ex(&c->value, ce) != SUCCESS)) {
RETURN_THROWS();
}
} ZEND_HASH_FOREACH_END();
- if ((c = zend_hash_find_ptr(&ce->constants_table, name)) == NULL) {
+ if ((c = zend_hash_find_ptr(constants_table, name)) == NULL) {
RETURN_FALSE;
}
ZVAL_COPY_OR_DUP(return_value, &c->value);
@@ -4535,7 +4589,7 @@ ZEND_METHOD(ReflectionClass, getReflectionConstant)
RETURN_THROWS();
}
- if ((constant = zend_hash_find_ptr(&ce->constants_table, name)) == NULL) {
+ if ((constant = zend_hash_find_ptr(CE_CONSTANTS_TABLE(ce), name)) == NULL) {
RETURN_FALSE;
}
reflection_class_constant_factory(name, constant, return_value);
@@ -4630,6 +4684,11 @@ ZEND_METHOD(ReflectionClass, isTrait)
}
/* }}} */
+ZEND_METHOD(ReflectionClass, isEnum)
+{
+ _class_check_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_ENUM);
+}
+
/* {{{ Returns whether this class is final */
ZEND_METHOD(ReflectionClass, isFinal)
{
@@ -4922,9 +4981,30 @@ ZEND_METHOD(ReflectionClass, getTraitAliases)
zend_trait_method_reference *cur_ref = &ce->trait_aliases[i]->trait_method;
if (ce->trait_aliases[i]->alias) {
+ zend_string *class_name = cur_ref->class_name;
+
+ if (!class_name) {
+ uint32_t j = 0;
+ zval *zv;
+ zend_class_entry *trait;
+ zend_string *lcname = zend_string_tolower(cur_ref->method_name);
+
+ for (j = 0; j < ce->num_traits; j++) {
+ zv = zend_hash_find_ex(CG(class_table), ce->trait_names[j].lc_name, 1);
+ if (zv) {
+ trait = Z_CE_P(zv);
+ if (zend_hash_exists(&trait->function_table, lcname)) {
+ class_name = trait->name;
+ break;
+ }
+ }
+ }
+ zend_string_release_ex(lcname, 0);
+ ZEND_ASSERT(class_name != NULL);
+ }
- mname = zend_string_alloc(ZSTR_LEN(cur_ref->class_name) + ZSTR_LEN(cur_ref->method_name) + 2, 0);
- snprintf(ZSTR_VAL(mname), ZSTR_LEN(mname) + 1, "%s::%s", ZSTR_VAL(cur_ref->class_name), ZSTR_VAL(cur_ref->method_name));
+ mname = zend_string_alloc(ZSTR_LEN(class_name) + ZSTR_LEN(cur_ref->method_name) + 2, 0);
+ snprintf(ZSTR_VAL(mname), ZSTR_LEN(mname) + 1, "%s::%s", ZSTR_VAL(class_name), ZSTR_VAL(cur_ref->method_name));
add_assoc_str_ex(return_value, ZSTR_VAL(ce->trait_aliases[i]->alias), ZSTR_LEN(ce->trait_aliases[i]->alias), mname);
}
i++;
@@ -5520,7 +5600,7 @@ ZEND_METHOD(ReflectionProperty, getAttributes)
ZEND_METHOD(ReflectionProperty, setAccessible)
{
reflection_object *intern;
- zend_bool visible;
+ bool visible;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &visible) == FAILURE) {
RETURN_THROWS();
@@ -5798,7 +5878,7 @@ ZEND_METHOD(ReflectionExtension, getINIEntries)
/* }}} */
/* {{{ add_extension_class */
-static void add_extension_class(zend_class_entry *ce, zend_string *key, zval *class_array, zend_module_entry *module, zend_bool add_reflection_class)
+static void add_extension_class(zend_class_entry *ce, zend_string *key, zval *class_array, zend_module_entry *module, bool add_reflection_class)
{
if (ce->type == ZEND_INTERNAL_CLASS && ce->info.internal.module && !strcasecmp(ce->info.internal.module->name, module->name)) {
zend_string *name;
@@ -6117,7 +6197,7 @@ ZEND_METHOD(ReflectionReference, __construct)
}
/* }}} */
-static zend_bool is_ignorable_reference(HashTable *ht, zval *ref) {
+static bool is_ignorable_reference(HashTable *ht, zval *ref) {
if (Z_REFCOUNT_P(ref) != 1) {
return 0;
}
@@ -6466,6 +6546,194 @@ ZEND_METHOD(ReflectionAttribute, newInstance)
RETURN_COPY_VALUE(&obj);
}
+ZEND_METHOD(ReflectionEnum, __construct)
+{
+ reflection_class_object_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+ if (EG(exception)) {
+ RETURN_THROWS();
+ }
+
+ reflection_object *intern;
+ zend_class_entry *ce;
+ GET_REFLECTION_OBJECT_PTR(ce);
+
+ if (!(ce->ce_flags & ZEND_ACC_ENUM)) {
+ zend_throw_exception_ex(reflection_exception_ptr, -1, "Class \"%s\" is not an enum", ZSTR_VAL(ce->name));
+ RETURN_THROWS();
+ }
+}
+
+ZEND_METHOD(ReflectionEnum, hasCase)
+{
+ reflection_object *intern;
+ zend_class_entry *ce;
+ zend_string *name;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "S", &name) == FAILURE) {
+ RETURN_THROWS();
+ }
+
+ GET_REFLECTION_OBJECT_PTR(ce);
+
+ zend_class_constant *class_const = zend_hash_find_ptr(&ce->constants_table, name);
+ if (class_const == NULL) {
+ RETURN_FALSE;
+ }
+
+ RETURN_BOOL(Z_ACCESS_FLAGS(class_const->value) & ZEND_CLASS_CONST_IS_CASE);
+}
+
+ZEND_METHOD(ReflectionEnum, getCase)
+{
+ reflection_object *intern;
+ zend_class_entry *ce;
+ zend_string *name;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "S", &name) == FAILURE) {
+ RETURN_THROWS();
+ }
+
+ GET_REFLECTION_OBJECT_PTR(ce);
+
+ zend_class_constant *constant = zend_hash_find_ptr(&ce->constants_table, name);
+ if (constant == NULL) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0, "Case %s::%s does not exist", ZSTR_VAL(ce->name), ZSTR_VAL(name));
+ RETURN_THROWS();
+ }
+ if (!(Z_ACCESS_FLAGS(constant->value) & ZEND_CLASS_CONST_IS_CASE)) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0, "%s::%s is not a case", ZSTR_VAL(ce->name), ZSTR_VAL(name));
+ RETURN_THROWS();
+ }
+
+ reflection_enum_case_factory(ce, name, constant, return_value);
+}
+
+ZEND_METHOD(ReflectionEnum, getCases)
+{
+ reflection_object *intern;
+ zend_class_entry *ce;
+ zend_string *name;
+ zend_class_constant *constant;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ RETURN_THROWS();
+ }
+
+ GET_REFLECTION_OBJECT_PTR(ce);
+
+ array_init(return_value);
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, name, constant) {
+ if (Z_ACCESS_FLAGS(constant->value) & ZEND_CLASS_CONST_IS_CASE) {
+ zval class_const;
+ reflection_enum_case_factory(ce, name, constant, &class_const);
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &class_const);
+ }
+ } ZEND_HASH_FOREACH_END();
+}
+
+ZEND_METHOD(ReflectionEnum, isBacked)
+{
+ reflection_object *intern;
+ zend_class_entry *ce;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ RETURN_THROWS();
+ }
+
+ GET_REFLECTION_OBJECT_PTR(ce);
+ RETURN_BOOL(ce->enum_backing_type != IS_UNDEF);
+}
+
+ZEND_METHOD(ReflectionEnum, getBackingType)
+{
+ reflection_object *intern;
+ zend_class_entry *ce;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ RETURN_THROWS();
+ }
+
+ GET_REFLECTION_OBJECT_PTR(ce);
+
+ if (ce->enum_backing_type == IS_UNDEF) {
+ RETURN_NULL();
+ } else {
+ zend_type type = ZEND_TYPE_INIT_CODE(ce->enum_backing_type, 0, 0);
+ reflection_type_factory(type, return_value, 0);
+ }
+}
+
+ZEND_METHOD(ReflectionEnumUnitCase, __construct)
+{
+ ZEND_MN(ReflectionClassConstant___construct)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ if (EG(exception)) {
+ RETURN_THROWS();
+ }
+
+ reflection_object *intern;
+ zend_class_constant *ref;
+
+ GET_REFLECTION_OBJECT_PTR(ref);
+
+ if (!(Z_ACCESS_FLAGS(ref->value) & ZEND_CLASS_CONST_IS_CASE)) {
+ zval *case_name = reflection_prop_name(ZEND_THIS);
+ zend_throw_exception_ex(reflection_exception_ptr, 0, "Constant %s::%s is not a case", ZSTR_VAL(ref->ce->name), Z_STRVAL_P(case_name));
+ RETURN_THROWS();
+ }
+}
+
+ZEND_METHOD(ReflectionEnumUnitCase, getEnum)
+{
+ reflection_object *intern;
+ zend_class_constant *ref;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ RETURN_THROWS();
+ }
+ GET_REFLECTION_OBJECT_PTR(ref);
+
+ zend_reflection_enum_factory(ref->ce, return_value);
+}
+
+ZEND_METHOD(ReflectionEnumBackedCase, __construct)
+{
+ ZEND_MN(ReflectionEnumUnitCase___construct)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ if (EG(exception)) {
+ RETURN_THROWS();
+ }
+
+ reflection_object *intern;
+ zend_class_constant *ref;
+
+ GET_REFLECTION_OBJECT_PTR(ref);
+
+ if (ref->ce->enum_backing_type == IS_UNDEF) {
+ zval *case_name = reflection_prop_name(ZEND_THIS);
+ zend_throw_exception_ex(reflection_exception_ptr, 0, "Enum case %s::%s is not a backed case", ZSTR_VAL(ref->ce->name), Z_STRVAL_P(case_name));
+ RETURN_THROWS();
+ }
+}
+
+ZEND_METHOD(ReflectionEnumBackedCase, getBackingValue)
+{
+ reflection_object *intern;
+ zend_class_constant *ref;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ RETURN_THROWS();
+ }
+ GET_REFLECTION_OBJECT_PTR(ref);
+
+ if (Z_TYPE(ref->value) == IS_CONSTANT_AST) {
+ zval_update_constant_ex(&ref->value, ref->ce);
+ }
+
+ ZEND_ASSERT(intern->ce->enum_backing_type != IS_UNDEF);
+ zval *member_p = zend_enum_fetch_case_value(Z_OBJ(ref->value));
+
+ ZVAL_COPY_OR_DUP(return_value, member_p);
+}
+
/* {{{ _reflection_write_property */
static zval *_reflection_write_property(zend_object *object, zend_string *name, zval *value, void **cache_slot)
{
@@ -6491,8 +6759,6 @@ static void reflection_init_class_handlers(zend_class_entry *ce) {
PHP_MINIT_FUNCTION(reflection) /* {{{ */
{
- zend_class_entry _reflection_entry;
-
memcpy(&reflection_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
reflection_object_handlers.offset = XtOffsetOf(reflection_object, zo);
reflection_object_handlers.free_obj = reflection_free_objects_storage;
@@ -6500,59 +6766,37 @@ PHP_MINIT_FUNCTION(reflection) /* {{{ */
reflection_object_handlers.write_property = _reflection_write_property;
reflection_object_handlers.get_gc = reflection_get_gc;
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionException", class_ReflectionException_methods);
- reflection_exception_ptr = zend_register_internal_class_ex(&_reflection_entry, zend_ce_exception);
+ reflection_exception_ptr = register_class_ReflectionException(zend_ce_exception);
- INIT_CLASS_ENTRY(_reflection_entry, "Reflection", class_Reflection_methods);
- reflection_ptr = zend_register_internal_class(&_reflection_entry);
+ reflection_ptr = register_class_Reflection();
- INIT_CLASS_ENTRY(_reflection_entry, "Reflector", class_Reflector_methods);
- reflector_ptr = zend_register_internal_interface(&_reflection_entry);
- zend_class_implements(reflector_ptr, 1, zend_ce_stringable);
+ reflector_ptr = register_class_Reflector(zend_ce_stringable);
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionFunctionAbstract", class_ReflectionFunctionAbstract_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_function_abstract_ptr = zend_register_internal_class(&_reflection_entry);
- zend_class_implements(reflection_function_abstract_ptr, 1, reflector_ptr);
- zend_declare_property_string(reflection_function_abstract_ptr, "name", sizeof("name")-1, "", ZEND_ACC_ABSTRACT);
+ reflection_function_abstract_ptr = register_class_ReflectionFunctionAbstract(reflector_ptr);
+ reflection_init_class_handlers(reflection_function_abstract_ptr);
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionFunction", class_ReflectionFunction_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_function_ptr = zend_register_internal_class_ex(&_reflection_entry, reflection_function_abstract_ptr);
- zend_declare_property_string(reflection_function_ptr, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC);
+ reflection_function_ptr = register_class_ReflectionFunction(reflection_function_abstract_ptr);
+ reflection_init_class_handlers(reflection_function_ptr);
REGISTER_REFLECTION_CLASS_CONST_LONG(function, "IS_DEPRECATED", ZEND_ACC_DEPRECATED);
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionGenerator", class_ReflectionGenerator_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_generator_ptr = zend_register_internal_class(&_reflection_entry);
- reflection_generator_ptr->ce_flags |= ZEND_ACC_FINAL;
-
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionParameter", class_ReflectionParameter_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_parameter_ptr = zend_register_internal_class(&_reflection_entry);
- zend_class_implements(reflection_parameter_ptr, 1, reflector_ptr);
- zend_declare_property_string(reflection_parameter_ptr, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC);
-
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionType", class_ReflectionType_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_type_ptr = zend_register_internal_class(&_reflection_entry);
- reflection_type_ptr->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS;
- zend_class_implements(reflection_type_ptr, 1, zend_ce_stringable);
-
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionNamedType", class_ReflectionNamedType_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_named_type_ptr = zend_register_internal_class_ex(&_reflection_entry, reflection_type_ptr);
-
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionUnionType", class_ReflectionUnionType_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_union_type_ptr = zend_register_internal_class_ex(&_reflection_entry, reflection_type_ptr);
-
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionMethod", class_ReflectionMethod_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_method_ptr = zend_register_internal_class_ex(&_reflection_entry, reflection_function_abstract_ptr);
- zend_declare_property_string(reflection_method_ptr, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC);
- zend_declare_property_string(reflection_method_ptr, "class", sizeof("class")-1, "", ZEND_ACC_PUBLIC);
+ reflection_generator_ptr = register_class_ReflectionGenerator();
+ reflection_init_class_handlers(reflection_generator_ptr);
+
+ reflection_parameter_ptr = register_class_ReflectionParameter(reflector_ptr);
+ reflection_init_class_handlers(reflection_parameter_ptr);
+
+ reflection_type_ptr = register_class_ReflectionType(zend_ce_stringable);
+ reflection_init_class_handlers(reflection_type_ptr);
+
+ reflection_named_type_ptr = register_class_ReflectionNamedType(reflection_type_ptr);
+ reflection_init_class_handlers(reflection_named_type_ptr);
+
+ reflection_union_type_ptr = register_class_ReflectionUnionType(reflection_type_ptr);
+ reflection_init_class_handlers(reflection_union_type_ptr);
+
+ reflection_method_ptr = register_class_ReflectionMethod(reflection_function_abstract_ptr);
+ reflection_init_class_handlers(reflection_method_ptr);
REGISTER_REFLECTION_CLASS_CONST_LONG(method, "IS_STATIC", ZEND_ACC_STATIC);
REGISTER_REFLECTION_CLASS_CONST_LONG(method, "IS_PUBLIC", ZEND_ACC_PUBLIC);
@@ -6561,65 +6805,52 @@ PHP_MINIT_FUNCTION(reflection) /* {{{ */
REGISTER_REFLECTION_CLASS_CONST_LONG(method, "IS_ABSTRACT", ZEND_ACC_ABSTRACT);
REGISTER_REFLECTION_CLASS_CONST_LONG(method, "IS_FINAL", ZEND_ACC_FINAL);
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionClass", class_ReflectionClass_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_class_ptr = zend_register_internal_class(&_reflection_entry);
- zend_class_implements(reflection_class_ptr, 1, reflector_ptr);
- zend_declare_property_string(reflection_class_ptr, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC);
+ reflection_class_ptr = register_class_ReflectionClass(reflector_ptr);
+ reflection_init_class_handlers(reflection_class_ptr);
/* IS_IMPLICIT_ABSTRACT is not longer used */
REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_IMPLICIT_ABSTRACT", ZEND_ACC_IMPLICIT_ABSTRACT_CLASS);
REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_EXPLICIT_ABSTRACT", ZEND_ACC_EXPLICIT_ABSTRACT_CLASS);
REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_FINAL", ZEND_ACC_FINAL);
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionObject", class_ReflectionObject_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_object_ptr = zend_register_internal_class_ex(&_reflection_entry, reflection_class_ptr);
+ reflection_object_ptr = register_class_ReflectionObject(reflection_class_ptr);
+ reflection_init_class_handlers(reflection_object_ptr);
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionProperty", class_ReflectionProperty_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_property_ptr = zend_register_internal_class(&_reflection_entry);
- zend_class_implements(reflection_property_ptr, 1, reflector_ptr);
- zend_declare_property_string(reflection_property_ptr, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC);
- zend_declare_property_string(reflection_property_ptr, "class", sizeof("class")-1, "", ZEND_ACC_PUBLIC);
+ reflection_property_ptr = register_class_ReflectionProperty(reflector_ptr);
+ reflection_init_class_handlers(reflection_property_ptr);
REGISTER_REFLECTION_CLASS_CONST_LONG(property, "IS_STATIC", ZEND_ACC_STATIC);
REGISTER_REFLECTION_CLASS_CONST_LONG(property, "IS_PUBLIC", ZEND_ACC_PUBLIC);
REGISTER_REFLECTION_CLASS_CONST_LONG(property, "IS_PROTECTED", ZEND_ACC_PROTECTED);
REGISTER_REFLECTION_CLASS_CONST_LONG(property, "IS_PRIVATE", ZEND_ACC_PRIVATE);
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionClassConstant", class_ReflectionClassConstant_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_class_constant_ptr = zend_register_internal_class(&_reflection_entry);
- zend_class_implements(reflection_class_constant_ptr, 1, reflector_ptr);
- zend_declare_property_string(reflection_class_constant_ptr, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC);
- zend_declare_property_string(reflection_class_constant_ptr, "class", sizeof("class")-1, "", ZEND_ACC_PUBLIC);
+ reflection_class_constant_ptr = register_class_ReflectionClassConstant(reflector_ptr);
+ reflection_init_class_handlers(reflection_class_constant_ptr);
REGISTER_REFLECTION_CLASS_CONST_LONG(class_constant, "IS_PUBLIC", ZEND_ACC_PUBLIC);
REGISTER_REFLECTION_CLASS_CONST_LONG(class_constant, "IS_PROTECTED", ZEND_ACC_PROTECTED);
REGISTER_REFLECTION_CLASS_CONST_LONG(class_constant, "IS_PRIVATE", ZEND_ACC_PRIVATE);
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionExtension", class_ReflectionExtension_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_extension_ptr = zend_register_internal_class(&_reflection_entry);
- zend_class_implements(reflection_extension_ptr, 1, reflector_ptr);
- zend_declare_property_string(reflection_extension_ptr, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC);
-
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionZendExtension", class_ReflectionZendExtension_methods);
- reflection_init_class_handlers(&_reflection_entry);
- reflection_zend_extension_ptr = zend_register_internal_class(&_reflection_entry);
- zend_class_implements(reflection_zend_extension_ptr, 1, reflector_ptr);
- zend_declare_property_string(reflection_zend_extension_ptr, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC);
-
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionReference", class_ReflectionReference_methods);
- reflection_init_class_handlers(&_reflection_entry);
- _reflection_entry.ce_flags |= ZEND_ACC_FINAL;
- reflection_reference_ptr = zend_register_internal_class(&_reflection_entry);
-
- INIT_CLASS_ENTRY(_reflection_entry, "ReflectionAttribute", class_ReflectionAttribute_methods);
- reflection_init_class_handlers(&_reflection_entry);
- _reflection_entry.ce_flags |= ZEND_ACC_FINAL;
- reflection_attribute_ptr = zend_register_internal_class(&_reflection_entry);
+ reflection_extension_ptr = register_class_ReflectionExtension(reflector_ptr);
+ reflection_init_class_handlers(reflection_extension_ptr);
+
+ reflection_zend_extension_ptr = register_class_ReflectionZendExtension(reflector_ptr);
+ reflection_init_class_handlers(reflection_zend_extension_ptr);
+
+ reflection_reference_ptr = register_class_ReflectionReference();
+ reflection_init_class_handlers(reflection_reference_ptr);
+
+ reflection_attribute_ptr = register_class_ReflectionAttribute();
+ reflection_init_class_handlers(reflection_attribute_ptr);
+
+ reflection_enum_ptr = register_class_ReflectionEnum(reflection_class_ptr);
+ reflection_init_class_handlers(reflection_enum_ptr);
+
+ reflection_enum_unit_case_ptr = register_class_ReflectionEnumUnitCase(reflection_class_constant_ptr);
+ reflection_init_class_handlers(reflection_enum_unit_case_ptr);
+
+ reflection_enum_backed_case_ptr = register_class_ReflectionEnumBackedCase(reflection_enum_unit_case_ptr);
+ reflection_init_class_handlers(reflection_enum_backed_case_ptr);
REGISTER_REFLECTION_CLASS_CONST_LONG(attribute, "IS_INSTANCEOF", REFLECTION_ATTRIBUTE_IS_INSTANCEOF);
diff --git a/ext/reflection/php_reflection.h b/ext/reflection/php_reflection.h
index 654ba55256..de368a86c0 100644
--- a/ext/reflection/php_reflection.h
+++ b/ext/reflection/php_reflection.h
@@ -43,6 +43,9 @@ extern PHPAPI zend_class_entry *reflection_extension_ptr;
extern PHPAPI zend_class_entry *reflection_zend_extension_ptr;
extern PHPAPI zend_class_entry *reflection_reference_ptr;
extern PHPAPI zend_class_entry *reflection_attribute_ptr;
+extern PHPAPI zend_class_entry *reflection_enum_ptr;
+extern PHPAPI zend_class_entry *reflection_enum_unit_case_ptr;
+extern PHPAPI zend_class_entry *reflection_enum_backed_case_ptr;
PHPAPI void zend_reflection_class_factory(zend_class_entry *ce, zval *object);
diff --git a/ext/reflection/php_reflection.stub.php b/ext/reflection/php_reflection.stub.php
index d12d10bd81..e9815558d6 100644
--- a/ext/reflection/php_reflection.stub.php
+++ b/ext/reflection/php_reflection.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class ReflectionException extends Exception
{
@@ -18,6 +18,8 @@ interface Reflector extends Stringable
abstract class ReflectionFunctionAbstract implements Reflector
{
+ public string $name;
+
/** @implementation-alias ReflectionClass::__clone */
final private function __clone(): void {}
@@ -147,6 +149,8 @@ final class ReflectionGenerator
class ReflectionMethod extends ReflectionFunctionAbstract
{
+ public string $class;
+
public function __construct(object|string $objectOrMethod, ?string $method = null) {}
public function __toString(): string {}
@@ -199,6 +203,8 @@ class ReflectionMethod extends ReflectionFunctionAbstract
class ReflectionClass implements Reflector
{
+ public string $name;
+
final private function __clone(): void {}
public function __construct(object|string $objectOrClass) {}
@@ -292,6 +298,8 @@ class ReflectionClass implements Reflector
/** @return bool */
public function isTrait() {}
+ public function isEnum(): bool {}
+
/** @return bool */
public function isAbstract() {}
@@ -369,6 +377,9 @@ class ReflectionObject extends ReflectionClass
class ReflectionProperty implements Reflector
{
+ public string $name;
+ public string $class;
+
/** @implementation-alias ReflectionClass::__clone */
final private function __clone(): void {}
@@ -434,6 +445,9 @@ class ReflectionProperty implements Reflector
class ReflectionClassConstant implements Reflector
{
+ public string $name;
+ public string $class;
+
/** @implementation-alias ReflectionClass::__clone */
final private function __clone(): void {}
@@ -467,10 +481,14 @@ class ReflectionClassConstant implements Reflector
/** @return ReflectionAttribute[] */
public function getAttributes(?string $name = null, int $flags = 0): array {}
+
+ public function isEnumCase(): bool {}
}
class ReflectionParameter implements Reflector
{
+ public string $name;
+
/** @implementation-alias ReflectionClass::__clone */
final private function __clone(): void {}
@@ -575,6 +593,8 @@ class ReflectionUnionType extends ReflectionType
class ReflectionExtension implements Reflector
{
+ public string $name;
+
/** @implementation-alias ReflectionClass::__clone */
final private function __clone(): void {}
@@ -618,6 +638,8 @@ class ReflectionExtension implements Reflector
class ReflectionZendExtension implements Reflector
{
+ public string $name;
+
/** @implementation-alias ReflectionClass::__clone */
final private function __clone(): void {}
@@ -665,3 +687,36 @@ final class ReflectionAttribute
private function __construct() {}
}
+
+final class ReflectionEnum extends ReflectionClass
+{
+ public function __construct(object|string $objectOrClass) {}
+
+ public function hasCase(string $name): bool {}
+
+ public function getCase(string $name): ReflectionEnumUnitCase {}
+
+ /** @return ReflectionEnumUnitCase[] */
+ public function getCases(): array {}
+
+ public function isBacked(): bool {}
+
+ public function getBackingType(): ReflectionType|null {}
+}
+
+class ReflectionEnumUnitCase extends ReflectionClassConstant
+{
+ public function __construct(object|string $class, string $constant) {}
+
+ public function getEnum(): ReflectionEnum {}
+
+ /** @implementation-alias ReflectionClassConstant::getValue */
+ public function getValue(): UnitEnum {}
+}
+
+final class ReflectionEnumBackedCase extends ReflectionEnumUnitCase
+{
+ public function __construct(object|string $class, string $constant) {}
+
+ public function getBackingValue(): int|string {}
+}
diff --git a/ext/reflection/php_reflection_arginfo.h b/ext/reflection/php_reflection_arginfo.h
index ba524b4f6d..36e6dc3cec 100644
--- a/ext/reflection/php_reflection_arginfo.h
+++ b/ext/reflection/php_reflection_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 6849bff1f2b343df4bd7e6da9c8adc555731e2d3 */
+ * Stub hash: 3594ec0b0c3ed7266223be9c6b426aac56e3aabe */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Reflection_getModifierNames, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, modifiers, IS_LONG, 0)
@@ -218,6 +218,9 @@ ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionClass_isTrait arginfo_class_ReflectionFunctionAbstract_inNamespace
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionClass_isEnum, 0, 0, _IS_BOOL, 0)
+ZEND_END_ARG_INFO()
+
#define arginfo_class_ReflectionClass_isAbstract arginfo_class_ReflectionFunctionAbstract_inNamespace
#define arginfo_class_ReflectionClass_isFinal arginfo_class_ReflectionFunctionAbstract_inNamespace
@@ -308,8 +311,7 @@ ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionProperty_isDefault arginfo_class_ReflectionFunctionAbstract_inNamespace
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionProperty_isPromoted, 0, 0, _IS_BOOL, 0)
-ZEND_END_ARG_INFO()
+#define arginfo_class_ReflectionProperty_isPromoted arginfo_class_ReflectionClass_isEnum
#define arginfo_class_ReflectionProperty_getModifiers arginfo_class_ReflectionFunctionAbstract_inNamespace
@@ -323,7 +325,7 @@ ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionProperty_hasType arginfo_class_ReflectionFunctionAbstract_inNamespace
-#define arginfo_class_ReflectionProperty_hasDefaultValue arginfo_class_ReflectionProperty_isPromoted
+#define arginfo_class_ReflectionProperty_hasDefaultValue arginfo_class_ReflectionClass_isEnum
#define arginfo_class_ReflectionProperty_getDefaultValue arginfo_class_ReflectionFunctionAbstract_inNamespace
@@ -356,6 +358,8 @@ ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionClassConstant_getAttributes arginfo_class_ReflectionFunctionAbstract_getAttributes
+#define arginfo_class_ReflectionClassConstant_isEnumCase arginfo_class_ReflectionClass_isEnum
+
#define arginfo_class_ReflectionParameter___clone arginfo_class_ReflectionFunctionAbstract___clone
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionParameter___construct, 0, 0, 2)
@@ -401,7 +405,7 @@ ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionParameter_isVariadic arginfo_class_ReflectionFunctionAbstract_inNamespace
-#define arginfo_class_ReflectionParameter_isPromoted arginfo_class_ReflectionProperty_isPromoted
+#define arginfo_class_ReflectionParameter_isPromoted arginfo_class_ReflectionClass_isEnum
#define arginfo_class_ReflectionParameter_getAttributes arginfo_class_ReflectionFunctionAbstract_getAttributes
@@ -478,7 +482,7 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionAttribute_getTarget, 0, 0, IS_LONG, 0)
ZEND_END_ARG_INFO()
-#define arginfo_class_ReflectionAttribute_isRepeated arginfo_class_ReflectionProperty_isPromoted
+#define arginfo_class_ReflectionAttribute_isRepeated arginfo_class_ReflectionClass_isEnum
#define arginfo_class_ReflectionAttribute_getArguments arginfo_class_ReflectionUnionType_getTypes
@@ -489,6 +493,36 @@ ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionAttribute___construct arginfo_class_ReflectionFunctionAbstract_inNamespace
+#define arginfo_class_ReflectionEnum___construct arginfo_class_ReflectionClass___construct
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionEnum_hasCase, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionEnum_getCase, 0, 1, ReflectionEnumUnitCase, 0)
+ ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ReflectionEnum_getCases arginfo_class_ReflectionUnionType_getTypes
+
+#define arginfo_class_ReflectionEnum_isBacked arginfo_class_ReflectionClass_isEnum
+
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionEnum_getBackingType, 0, 0, ReflectionType, 1)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ReflectionEnumUnitCase___construct arginfo_class_ReflectionClassConstant___construct
+
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionEnumUnitCase_getEnum, 0, 0, ReflectionEnum, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionEnumUnitCase_getValue, 0, 0, UnitEnum, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ReflectionEnumBackedCase___construct arginfo_class_ReflectionClassConstant___construct
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_ReflectionEnumBackedCase_getBackingValue, 0, 0, MAY_BE_LONG|MAY_BE_STRING)
+ZEND_END_ARG_INFO()
+
ZEND_METHOD(Reflection, getModifierNames);
ZEND_METHOD(ReflectionClass, __clone);
@@ -579,6 +613,7 @@ ZEND_METHOD(ReflectionClass, getTraits);
ZEND_METHOD(ReflectionClass, getTraitNames);
ZEND_METHOD(ReflectionClass, getTraitAliases);
ZEND_METHOD(ReflectionClass, isTrait);
+ZEND_METHOD(ReflectionClass, isEnum);
ZEND_METHOD(ReflectionClass, isAbstract);
ZEND_METHOD(ReflectionClass, isFinal);
ZEND_METHOD(ReflectionClass, getModifiers);
@@ -633,6 +668,7 @@ ZEND_METHOD(ReflectionClassConstant, getModifiers);
ZEND_METHOD(ReflectionClassConstant, getDeclaringClass);
ZEND_METHOD(ReflectionClassConstant, getDocComment);
ZEND_METHOD(ReflectionClassConstant, getAttributes);
+ZEND_METHOD(ReflectionClassConstant, isEnumCase);
ZEND_METHOD(ReflectionParameter, __construct);
ZEND_METHOD(ReflectionParameter, __toString);
ZEND_METHOD(ReflectionParameter, getName);
@@ -690,6 +726,16 @@ ZEND_METHOD(ReflectionAttribute, getArguments);
ZEND_METHOD(ReflectionAttribute, newInstance);
ZEND_METHOD(ReflectionAttribute, __clone);
ZEND_METHOD(ReflectionAttribute, __construct);
+ZEND_METHOD(ReflectionEnum, __construct);
+ZEND_METHOD(ReflectionEnum, hasCase);
+ZEND_METHOD(ReflectionEnum, getCase);
+ZEND_METHOD(ReflectionEnum, getCases);
+ZEND_METHOD(ReflectionEnum, isBacked);
+ZEND_METHOD(ReflectionEnum, getBackingType);
+ZEND_METHOD(ReflectionEnumUnitCase, __construct);
+ZEND_METHOD(ReflectionEnumUnitCase, getEnum);
+ZEND_METHOD(ReflectionEnumBackedCase, __construct);
+ZEND_METHOD(ReflectionEnumBackedCase, getBackingValue);
static const zend_function_entry class_ReflectionException_methods[] = {
@@ -818,6 +864,7 @@ static const zend_function_entry class_ReflectionClass_methods[] = {
ZEND_ME(ReflectionClass, getTraitNames, arginfo_class_ReflectionClass_getTraitNames, ZEND_ACC_PUBLIC)
ZEND_ME(ReflectionClass, getTraitAliases, arginfo_class_ReflectionClass_getTraitAliases, ZEND_ACC_PUBLIC)
ZEND_ME(ReflectionClass, isTrait, arginfo_class_ReflectionClass_isTrait, ZEND_ACC_PUBLIC)
+ ZEND_ME(ReflectionClass, isEnum, arginfo_class_ReflectionClass_isEnum, ZEND_ACC_PUBLIC)
ZEND_ME(ReflectionClass, isAbstract, arginfo_class_ReflectionClass_isAbstract, ZEND_ACC_PUBLIC)
ZEND_ME(ReflectionClass, isFinal, arginfo_class_ReflectionClass_isFinal, ZEND_ACC_PUBLIC)
ZEND_ME(ReflectionClass, getModifiers, arginfo_class_ReflectionClass_getModifiers, ZEND_ACC_PUBLIC)
@@ -890,6 +937,7 @@ static const zend_function_entry class_ReflectionClassConstant_methods[] = {
ZEND_ME(ReflectionClassConstant, getDeclaringClass, arginfo_class_ReflectionClassConstant_getDeclaringClass, ZEND_ACC_PUBLIC)
ZEND_ME(ReflectionClassConstant, getDocComment, arginfo_class_ReflectionClassConstant_getDocComment, ZEND_ACC_PUBLIC)
ZEND_ME(ReflectionClassConstant, getAttributes, arginfo_class_ReflectionClassConstant_getAttributes, ZEND_ACC_PUBLIC)
+ ZEND_ME(ReflectionClassConstant, isEnumCase, arginfo_class_ReflectionClassConstant_isEnumCase, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
@@ -994,3 +1042,325 @@ static const zend_function_entry class_ReflectionAttribute_methods[] = {
ZEND_ME(ReflectionAttribute, __construct, arginfo_class_ReflectionAttribute___construct, ZEND_ACC_PRIVATE)
ZEND_FE_END
};
+
+
+static const zend_function_entry class_ReflectionEnum_methods[] = {
+ ZEND_ME(ReflectionEnum, __construct, arginfo_class_ReflectionEnum___construct, ZEND_ACC_PUBLIC)
+ ZEND_ME(ReflectionEnum, hasCase, arginfo_class_ReflectionEnum_hasCase, ZEND_ACC_PUBLIC)
+ ZEND_ME(ReflectionEnum, getCase, arginfo_class_ReflectionEnum_getCase, ZEND_ACC_PUBLIC)
+ ZEND_ME(ReflectionEnum, getCases, arginfo_class_ReflectionEnum_getCases, ZEND_ACC_PUBLIC)
+ ZEND_ME(ReflectionEnum, isBacked, arginfo_class_ReflectionEnum_isBacked, ZEND_ACC_PUBLIC)
+ ZEND_ME(ReflectionEnum, getBackingType, arginfo_class_ReflectionEnum_getBackingType, ZEND_ACC_PUBLIC)
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_ReflectionEnumUnitCase_methods[] = {
+ ZEND_ME(ReflectionEnumUnitCase, __construct, arginfo_class_ReflectionEnumUnitCase___construct, ZEND_ACC_PUBLIC)
+ ZEND_ME(ReflectionEnumUnitCase, getEnum, arginfo_class_ReflectionEnumUnitCase_getEnum, ZEND_ACC_PUBLIC)
+ ZEND_MALIAS(ReflectionClassConstant, getValue, getValue, arginfo_class_ReflectionEnumUnitCase_getValue, ZEND_ACC_PUBLIC)
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_ReflectionEnumBackedCase_methods[] = {
+ ZEND_ME(ReflectionEnumBackedCase, __construct, arginfo_class_ReflectionEnumBackedCase___construct, ZEND_ACC_PUBLIC)
+ ZEND_ME(ReflectionEnumBackedCase, getBackingValue, arginfo_class_ReflectionEnumBackedCase_getBackingValue, ZEND_ACC_PUBLIC)
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class_ReflectionException(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionException", class_ReflectionException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_Reflection(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Reflection", class_Reflection_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_Reflector(zend_class_entry *class_entry_Stringable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Reflector", class_Reflector_methods);
+ class_entry = zend_register_internal_interface(&ce);
+ zend_class_implements(class_entry, 1, class_entry_Stringable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionFunctionAbstract(zend_class_entry *class_entry_Reflector)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionFunctionAbstract", class_ReflectionFunctionAbstract_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_ABSTRACT;
+ zend_class_implements(class_entry, 1, class_entry_Reflector);
+
+ zval property_name_default_value;
+ ZVAL_UNDEF(&property_name_default_value);
+ zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
+ zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_name_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionFunction(zend_class_entry *class_entry_ReflectionFunctionAbstract)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionFunction", class_ReflectionFunction_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_ReflectionFunctionAbstract);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionGenerator(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionGenerator", class_ReflectionGenerator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionMethod(zend_class_entry *class_entry_ReflectionFunctionAbstract)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionMethod", class_ReflectionMethod_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_ReflectionFunctionAbstract);
+
+ zval property_class_default_value;
+ ZVAL_UNDEF(&property_class_default_value);
+ zend_string *property_class_name = zend_string_init("class", sizeof("class") - 1, 1);
+ zend_declare_typed_property(class_entry, property_class_name, &property_class_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_class_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionClass(zend_class_entry *class_entry_Reflector)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionClass", class_ReflectionClass_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Reflector);
+
+ zval property_name_default_value;
+ ZVAL_UNDEF(&property_name_default_value);
+ zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
+ zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_name_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionObject(zend_class_entry *class_entry_ReflectionClass)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionObject", class_ReflectionObject_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_ReflectionClass);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionProperty(zend_class_entry *class_entry_Reflector)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionProperty", class_ReflectionProperty_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Reflector);
+
+ zval property_name_default_value;
+ ZVAL_UNDEF(&property_name_default_value);
+ zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
+ zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_name_name);
+
+ zval property_class_default_value;
+ ZVAL_UNDEF(&property_class_default_value);
+ zend_string *property_class_name = zend_string_init("class", sizeof("class") - 1, 1);
+ zend_declare_typed_property(class_entry, property_class_name, &property_class_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_class_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionClassConstant(zend_class_entry *class_entry_Reflector)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionClassConstant", class_ReflectionClassConstant_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Reflector);
+
+ zval property_name_default_value;
+ ZVAL_UNDEF(&property_name_default_value);
+ zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
+ zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_name_name);
+
+ zval property_class_default_value;
+ ZVAL_UNDEF(&property_class_default_value);
+ zend_string *property_class_name = zend_string_init("class", sizeof("class") - 1, 1);
+ zend_declare_typed_property(class_entry, property_class_name, &property_class_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_class_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionParameter(zend_class_entry *class_entry_Reflector)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionParameter", class_ReflectionParameter_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Reflector);
+
+ zval property_name_default_value;
+ ZVAL_UNDEF(&property_name_default_value);
+ zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
+ zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_name_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionType(zend_class_entry *class_entry_Stringable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionType", class_ReflectionType_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_ABSTRACT;
+ zend_class_implements(class_entry, 1, class_entry_Stringable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionNamedType(zend_class_entry *class_entry_ReflectionType)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionNamedType", class_ReflectionNamedType_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_ReflectionType);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionUnionType(zend_class_entry *class_entry_ReflectionType)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionUnionType", class_ReflectionUnionType_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_ReflectionType);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionExtension(zend_class_entry *class_entry_Reflector)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionExtension", class_ReflectionExtension_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Reflector);
+
+ zval property_name_default_value;
+ ZVAL_UNDEF(&property_name_default_value);
+ zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
+ zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_name_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionZendExtension(zend_class_entry *class_entry_Reflector)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionZendExtension", class_ReflectionZendExtension_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Reflector);
+
+ zval property_name_default_value;
+ ZVAL_UNDEF(&property_name_default_value);
+ zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
+ zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_name_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionReference(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionReference", class_ReflectionReference_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionAttribute(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionAttribute", class_ReflectionAttribute_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionEnum(zend_class_entry *class_entry_ReflectionClass)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionEnum", class_ReflectionEnum_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_ReflectionClass);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionEnumUnitCase(zend_class_entry *class_entry_ReflectionClassConstant)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionEnumUnitCase", class_ReflectionEnumUnitCase_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_ReflectionClassConstant);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ReflectionEnumBackedCase(zend_class_entry *class_entry_ReflectionEnumUnitCase)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ReflectionEnumBackedCase", class_ReflectionEnumBackedCase_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_ReflectionEnumUnitCase);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
diff --git a/ext/reflection/tests/ReflectionClassConstant_isEnumCase.phpt b/ext/reflection/tests/ReflectionClassConstant_isEnumCase.phpt
new file mode 100644
index 0000000000..7125075085
--- /dev/null
+++ b/ext/reflection/tests/ReflectionClassConstant_isEnumCase.phpt
@@ -0,0 +1,23 @@
+--TEST--
+ReflectionClassConstant::isEnumCase()
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ const Baz = self::Bar;
+}
+
+class Qux {
+ const Quux = 0;
+}
+
+var_dump((new ReflectionClassConstant(Foo::class, 'Bar'))->isEnumCase());
+var_dump((new ReflectionClassConstant(Foo::class, 'Baz'))->isEnumCase());
+var_dump((new ReflectionClassConstant(Qux::class, 'Quux'))->isEnumCase());
+
+?>
+--EXPECT--
+bool(true)
+bool(false)
+bool(false)
diff --git a/ext/reflection/tests/ReflectionClass_constructor_002.phpt b/ext/reflection/tests/ReflectionClass_constructor_002.phpt
index 7df620eaaa..adb3784347 100644
--- a/ext/reflection/tests/ReflectionClass_constructor_002.phpt
+++ b/ext/reflection/tests/ReflectionClass_constructor_002.phpt
@@ -45,8 +45,10 @@ try {
}
?>
---EXPECT--
+--EXPECTF--
ReflectionClass::__construct() expects exactly 1 argument, 0 given
+
+Deprecated: ReflectionClass::__construct(): Passing null to parameter #1 ($objectOrClass) of type object|string is deprecated in %s on line %d
Class "" does not exist
Class "1" does not exist
Class "1" does not exist
diff --git a/ext/reflection/tests/ReflectionClass_getConstant_error.phpt b/ext/reflection/tests/ReflectionClass_getConstant_error.phpt
index ca9bc0ce2d..d143006af9 100644
--- a/ext/reflection/tests/ReflectionClass_getConstant_error.phpt
+++ b/ext/reflection/tests/ReflectionClass_getConstant_error.phpt
@@ -8,7 +8,6 @@ class C {
$rc = new ReflectionClass("C");
echo "Check invalid params:\n";
-var_dump($rc->getConstant(null));
var_dump($rc->getConstant(1));
var_dump($rc->getConstant(1.5));
var_dump($rc->getConstant(true));
@@ -18,4 +17,3 @@ Check invalid params:
bool(false)
bool(false)
bool(false)
-bool(false)
diff --git a/ext/reflection/tests/ReflectionClass_getMethod_002.phpt b/ext/reflection/tests/ReflectionClass_getMethod_002.phpt
index 8271822884..9278b47875 100644
--- a/ext/reflection/tests/ReflectionClass_getMethod_002.phpt
+++ b/ext/reflection/tests/ReflectionClass_getMethod_002.phpt
@@ -54,10 +54,12 @@ try {
?>
---EXPECT--
+--EXPECTF--
Check invalid params:
ReflectionClass::getMethod() expects exactly 1 argument, 0 given
ReflectionClass::getMethod() expects exactly 1 argument, 2 given
+
+Deprecated: ReflectionClass::getMethod(): Passing null to parameter #1 ($name) of type string is deprecated in %s on line %d
Method C::() does not exist
Method C::1() does not exist
Method C::1.5() does not exist
diff --git a/ext/reflection/tests/ReflectionClass_getProperty_002.phpt b/ext/reflection/tests/ReflectionClass_getProperty_002.phpt
index 80ef77c8a3..c2f8419a1e 100644
--- a/ext/reflection/tests/ReflectionClass_getProperty_002.phpt
+++ b/ext/reflection/tests/ReflectionClass_getProperty_002.phpt
@@ -52,10 +52,12 @@ try {
echo $e->getMessage() . "\n";
}
?>
---EXPECT--
+--EXPECTF--
Check invalid params:
ReflectionClass::getProperty() expects exactly 1 argument, 0 given
ReflectionClass::getProperty() expects exactly 1 argument, 2 given
+
+Deprecated: ReflectionClass::getProperty(): Passing null to parameter #1 ($name) of type string is deprecated in %s on line %d
Property C::$ does not exist
Property C::$1 does not exist
Property C::$1.5 does not exist
diff --git a/ext/reflection/tests/ReflectionClass_getStaticPropertyValue_002.phpt b/ext/reflection/tests/ReflectionClass_getStaticPropertyValue_002.phpt
index 4a5a5929d5..2b6fda0590 100644
--- a/ext/reflection/tests/ReflectionClass_getStaticPropertyValue_002.phpt
+++ b/ext/reflection/tests/ReflectionClass_getStaticPropertyValue_002.phpt
@@ -38,9 +38,11 @@ try {
?>
---EXPECT--
+--EXPECTF--
ReflectionClass::getStaticPropertyValue() expects at most 2 arguments, 3 given
ReflectionClass::getStaticPropertyValue() expects at least 1 argument, 0 given
+
+Deprecated: ReflectionClass::getStaticPropertyValue(): Passing null to parameter #1 ($name) of type string is deprecated in %s on line %d
Property C::$ does not exist
string(3) "def"
ReflectionClass::getStaticPropertyValue(): Argument #1 ($name) must be of type string, array given
diff --git a/ext/reflection/tests/ReflectionClass_hasConstant_002.phpt b/ext/reflection/tests/ReflectionClass_hasConstant_002.phpt
index 5dcc7df173..4e4c206ac2 100644
--- a/ext/reflection/tests/ReflectionClass_hasConstant_002.phpt
+++ b/ext/reflection/tests/ReflectionClass_hasConstant_002.phpt
@@ -11,7 +11,6 @@ class C {
$rc = new ReflectionClass("C");
echo "Check invalid params:\n";
-var_dump($rc->hasConstant(null));
var_dump($rc->hasConstant(1));
var_dump($rc->hasConstant(1.5));
var_dump($rc->hasConstant(true));
@@ -21,4 +20,3 @@ Check invalid params:
bool(false)
bool(false)
bool(false)
-bool(false)
diff --git a/ext/reflection/tests/ReflectionClass_hasMethod_002.phpt b/ext/reflection/tests/ReflectionClass_hasMethod_002.phpt
index 2bbc84551e..5e175fbb7e 100644
--- a/ext/reflection/tests/ReflectionClass_hasMethod_002.phpt
+++ b/ext/reflection/tests/ReflectionClass_hasMethod_002.phpt
@@ -11,7 +11,6 @@ class C {
$rc = new ReflectionClass("C");
echo "Check invalid params:\n";
-var_dump($rc->hasMethod(null));
var_dump($rc->hasMethod(1));
var_dump($rc->hasMethod(1.5));
var_dump($rc->hasMethod(true));
@@ -21,4 +20,3 @@ Check invalid params:
bool(false)
bool(false)
bool(false)
-bool(false)
diff --git a/ext/reflection/tests/ReflectionClass_hasProperty_002.phpt b/ext/reflection/tests/ReflectionClass_hasProperty_002.phpt
index 607fead65c..14b4520e07 100644
--- a/ext/reflection/tests/ReflectionClass_hasProperty_002.phpt
+++ b/ext/reflection/tests/ReflectionClass_hasProperty_002.phpt
@@ -11,7 +11,6 @@ class C {
$rc = new ReflectionClass("C");
echo "Check invalid params:\n";
-var_dump($rc->hasProperty(null));
var_dump($rc->hasProperty(1));
var_dump($rc->hasProperty(1.5));
var_dump($rc->hasProperty(true));
@@ -21,4 +20,3 @@ Check invalid params:
bool(false)
bool(false)
bool(false)
-bool(false)
diff --git a/ext/reflection/tests/ReflectionClass_implementsInterface_001.phpt b/ext/reflection/tests/ReflectionClass_implementsInterface_001.phpt
index 5fb158cb8d..7af12f07b7 100644
--- a/ext/reflection/tests/ReflectionClass_implementsInterface_001.phpt
+++ b/ext/reflection/tests/ReflectionClass_implementsInterface_001.phpt
@@ -65,7 +65,7 @@ try {
echo $e->getMessage() . "\n";
}
?>
---EXPECT--
+--EXPECTF--
Does A implement A?
- Using object argument: A is not an interface
- Using string argument: A is not an interface
@@ -146,6 +146,8 @@ Does I2 implement I2?
Test bad arguments:
ReflectionClass::implementsInterface() expects exactly 1 argument, 0 given
ReflectionClass::implementsInterface() expects exactly 1 argument, 2 given
+
+Deprecated: ReflectionClass::implementsInterface(): Passing null to parameter #1 ($interface) of type ReflectionClass|string is deprecated in %s on line %d
Interface "" does not exist
Interface "ThisClassDoesNotExist" does not exist
Interface "2" does not exist
diff --git a/ext/reflection/tests/ReflectionClass_isEnum.phpt b/ext/reflection/tests/ReflectionClass_isEnum.phpt
new file mode 100644
index 0000000000..b781c61509
--- /dev/null
+++ b/ext/reflection/tests/ReflectionClass_isEnum.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Testing ReflectionClass::isEnum()
+--FILE--
+<?php
+
+class Foo {}
+enum Bar {
+ case Baz;
+}
+
+$fooReflection = new ReflectionClass(Foo::class);
+$barReflection = new ReflectionClass(Bar::class);
+
+var_dump($fooReflection->isEnum());
+var_dump($barReflection->isEnum());
+
+?>
+--EXPECT--
+bool(false)
+bool(true)
diff --git a/ext/reflection/tests/ReflectionClass_isSubclassOf_002.phpt b/ext/reflection/tests/ReflectionClass_isSubclassOf_002.phpt
index 51fc52b8ee..db3961b3e6 100644
--- a/ext/reflection/tests/ReflectionClass_isSubclassOf_002.phpt
+++ b/ext/reflection/tests/ReflectionClass_isSubclassOf_002.phpt
@@ -35,10 +35,12 @@ try {
echo $e->getMessage() . "\n";
}
?>
---EXPECT--
+--EXPECTF--
Test bad arguments:
ReflectionClass::isSubclassOf() expects exactly 1 argument, 0 given
ReflectionClass::isSubclassOf() expects exactly 1 argument, 2 given
+
+Deprecated: ReflectionClass::isSubclassOf(): Passing null to parameter #1 ($class) of type ReflectionClass|string is deprecated in %s on line %d
Class "" does not exist
Class "ThisClassDoesNotExist" does not exist
Class "2" does not exist
diff --git a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt
index 7bd2b1eecd..82de2ce0c2 100644
--- a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt
+++ b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt
@@ -43,10 +43,12 @@ try {
?>
---EXPECT--
+--EXPECTF--
ReflectionClass::setStaticPropertyValue() expects exactly 2 arguments, 3 given
ReflectionClass::setStaticPropertyValue() expects exactly 2 arguments, 0 given
ReflectionClass::setStaticPropertyValue() expects exactly 2 arguments, 1 given
+
+Deprecated: ReflectionClass::setStaticPropertyValue(): Passing null to parameter #1 ($name) of type string is deprecated in %s on line %d
Class C does not have a property named
Class C does not have a property named 1.5
ReflectionClass::setStaticPropertyValue(): Argument #1 ($name) must be of type string, array given
diff --git a/ext/reflection/tests/ReflectionClass_toString_001.phpt b/ext/reflection/tests/ReflectionClass_toString_001.phpt
index 86d6720fe6..e8baf72689 100644
--- a/ext/reflection/tests/ReflectionClass_toString_001.phpt
+++ b/ext/reflection/tests/ReflectionClass_toString_001.phpt
@@ -24,10 +24,10 @@ Class [ <internal:Reflection> class ReflectionClass implements Reflector, String
}
- Properties [1] {
- Property [ public $name = '' ]
+ Property [ public string $name ]
}
- - Methods [54] {
+ - Methods [55] {
Method [ <internal:Reflection> final private method __clone ] {
- Parameters [0] {
@@ -234,6 +234,13 @@ Class [ <internal:Reflection> class ReflectionClass implements Reflector, String
}
}
+ Method [ <internal:Reflection> public method isEnum ] {
+
+ - Parameters [0] {
+ }
+ - Return [ bool ]
+ }
+
Method [ <internal:Reflection> public method isAbstract ] {
- Parameters [0] {
diff --git a/ext/reflection/tests/ReflectionEnumBackedCase_getBackingValue.phpt b/ext/reflection/tests/ReflectionEnumBackedCase_getBackingValue.phpt
new file mode 100644
index 0000000000..f81241d73a
--- /dev/null
+++ b/ext/reflection/tests/ReflectionEnumBackedCase_getBackingValue.phpt
@@ -0,0 +1,38 @@
+--TEST--
+ReflectionEnumBackedCase::getBackingValue()
+--FILE--
+<?php
+
+enum Enum_ {
+ case Foo;
+}
+
+enum IntEnum: int {
+ case Foo = 0;
+}
+
+enum StringEnum: string {
+ case Foo = 'Foo';
+}
+
+try {
+ var_dump(new ReflectionEnumBackedCase(Enum_::class, 'Foo'));
+} catch (ReflectionException $e) {
+ echo $e->getMessage() . "\n";
+}
+
+try {
+ var_dump(new ReflectionEnumBackedCase([], 'Foo'));
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+var_dump((new ReflectionEnumBackedCase(IntEnum::class, 'Foo'))->getBackingValue());
+var_dump((new ReflectionEnumBackedCase(StringEnum::class, 'Foo'))->getBackingValue());
+
+?>
+--EXPECT--
+Enum case Enum_::Foo is not a backed case
+ReflectionEnumBackedCase::__construct(): Argument #1 ($class) must be of type object|string, array given
+int(0)
+string(3) "Foo"
diff --git a/ext/reflection/tests/ReflectionEnumUnitCase_construct.phpt b/ext/reflection/tests/ReflectionEnumUnitCase_construct.phpt
new file mode 100644
index 0000000000..de5af5c549
--- /dev/null
+++ b/ext/reflection/tests/ReflectionEnumUnitCase_construct.phpt
@@ -0,0 +1,36 @@
+--TEST--
+ReflectionEnumUnitCase::__construct()
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ const Baz = self::Bar;
+}
+
+echo (new ReflectionEnumUnitCase(Foo::class, 'Bar'))->getName() . "\n";
+
+try {
+ new ReflectionEnumUnitCase(Foo::class, 'Baz');
+} catch (\Exception $e) {
+ echo $e->getMessage() . "\n";
+}
+
+try {
+ new ReflectionEnumUnitCase(Foo::class, 'Qux');
+} catch (\Exception $e) {
+ echo $e->getMessage() . "\n";
+}
+
+try {
+ new ReflectionEnumUnitCase([], 'Foo');
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+?>
+--EXPECT--
+Bar
+Constant Foo::Baz is not a case
+Constant Foo::Qux does not exist
+ReflectionEnumUnitCase::__construct(): Argument #1 ($class) must be of type object|string, array given
diff --git a/ext/reflection/tests/ReflectionEnumUnitCase_getEnum.phpt b/ext/reflection/tests/ReflectionEnumUnitCase_getEnum.phpt
new file mode 100644
index 0000000000..3d3bcc227e
--- /dev/null
+++ b/ext/reflection/tests/ReflectionEnumUnitCase_getEnum.phpt
@@ -0,0 +1,39 @@
+--TEST--
+ReflectionEnumUnitCase::getEnum()
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+echo (new ReflectionEnumUnitCase(Foo::class, 'Bar'))->getEnum();
+
+?>
+--EXPECTF--
+Class [ <user> final class Foo implements UnitEnum ] {
+ @@ %sReflectionEnumUnitCase_getEnum.php 3-5
+
+ - Constants [1] {
+ Constant [ public Foo Bar ] { Object }
+ }
+
+ - Static properties [0] {
+ }
+
+ - Static methods [1] {
+ Method [ <internal, prototype UnitEnum> static public method cases ] {
+
+ - Parameters [0] {
+ }
+ - Return [ array ]
+ }
+ }
+
+ - Properties [1] {
+ Property [ public string $name ]
+ }
+
+ - Methods [0] {
+ }
+}
diff --git a/ext/reflection/tests/ReflectionEnumUnitCase_getValue.phpt b/ext/reflection/tests/ReflectionEnumUnitCase_getValue.phpt
new file mode 100644
index 0000000000..ec5f22d9f8
--- /dev/null
+++ b/ext/reflection/tests/ReflectionEnumUnitCase_getValue.phpt
@@ -0,0 +1,30 @@
+--TEST--
+ReflectionEnumUnitCase::getValue()
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ case Baz;
+}
+
+$barFromReflection = (new ReflectionEnumUnitCase(Foo::class, 'Bar'))->getValue();
+$bazFromReflection = (new ReflectionEnumUnitCase(Foo::class, 'Baz'))->getValue();
+
+var_dump($barFromReflection);
+var_dump($bazFromReflection);
+
+var_dump(Foo::Bar === $barFromReflection);
+var_dump(Foo::Baz === $barFromReflection);
+
+var_dump(Foo::Bar === $bazFromReflection);
+var_dump(Foo::Baz === $bazFromReflection);
+
+?>
+--EXPECT--
+enum(Foo::Bar)
+enum(Foo::Baz)
+bool(true)
+bool(false)
+bool(false)
+bool(true)
diff --git a/ext/reflection/tests/ReflectionEnum_construct.phpt b/ext/reflection/tests/ReflectionEnum_construct.phpt
new file mode 100644
index 0000000000..4b4a039105
--- /dev/null
+++ b/ext/reflection/tests/ReflectionEnum_construct.phpt
@@ -0,0 +1,34 @@
+--TEST--
+ReflectionEnum::__construct()
+--FILE--
+<?php
+
+enum Foo {}
+class Bar {}
+
+echo (new ReflectionEnum(Foo::class))->getName() . "\n";
+
+try {
+ new ReflectionEnum('Bar');
+} catch (\Exception $e) {
+ echo $e->getMessage() . "\n";
+}
+
+try {
+ new ReflectionEnum('Baz');
+} catch (\Exception $e) {
+ echo $e->getMessage() . "\n";
+}
+
+try {
+ new ReflectionEnum([]);
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+?>
+--EXPECT--
+Foo
+Class "Bar" is not an enum
+Class "Baz" does not exist
+ReflectionEnum::__construct(): Argument #1 ($objectOrClass) must be of type object|string, array given
diff --git a/ext/reflection/tests/ReflectionEnum_getBackingType.phpt b/ext/reflection/tests/ReflectionEnum_getBackingType.phpt
new file mode 100644
index 0000000000..e9d429f592
--- /dev/null
+++ b/ext/reflection/tests/ReflectionEnum_getBackingType.phpt
@@ -0,0 +1,20 @@
+--TEST--
+ReflectionEnum::getBackingType()
+--FILE--
+<?php
+
+enum Enum_ {}
+enum IntEnum: int {}
+enum StringEnum: string {}
+
+function test(): string {}
+
+var_dump((new ReflectionEnum(Enum_::class))->getBackingType());
+echo (new ReflectionEnum(IntEnum::class))->getBackingType() . "\n";
+echo (new ReflectionEnum(StringEnum::class))->getBackingType() . "\n";
+
+?>
+--EXPECT--
+NULL
+int
+string
diff --git a/ext/reflection/tests/ReflectionEnum_getCase.phpt b/ext/reflection/tests/ReflectionEnum_getCase.phpt
new file mode 100644
index 0000000000..f2b53cf657
--- /dev/null
+++ b/ext/reflection/tests/ReflectionEnum_getCase.phpt
@@ -0,0 +1,50 @@
+--TEST--
+ReflectionEnum::getCases()
+--FILE--
+<?php
+
+enum Enum_ {
+ case Foo;
+ const Bar = self::Foo;
+}
+
+enum IntEnum: int {
+ case Foo = 0;
+ const Bar = self::Foo;
+}
+
+function test(string $enumName, string $caseName) {
+ try {
+ $reflectionEnum = new ReflectionEnum($enumName);
+ var_dump($reflectionEnum->getCase($caseName));
+ } catch (Throwable $e) {
+ echo get_class($e) . ': ' . $e->getMessage() . "\n";
+ }
+}
+
+test(Enum_::class, 'Foo');
+test(Enum_::class, 'Bar');
+test(Enum_::class, 'Baz');
+
+test(IntEnum::class, 'Foo');
+test(IntEnum::class, 'Bar');
+test(IntEnum::class, 'Baz');
+
+?>
+--EXPECT--
+object(ReflectionEnumUnitCase)#2 (2) {
+ ["name"]=>
+ string(3) "Foo"
+ ["class"]=>
+ string(5) "Enum_"
+}
+ReflectionException: Enum_::Bar is not a case
+ReflectionException: Case Enum_::Baz does not exist
+object(ReflectionEnumBackedCase)#2 (2) {
+ ["name"]=>
+ string(3) "Foo"
+ ["class"]=>
+ string(7) "IntEnum"
+}
+ReflectionException: IntEnum::Bar is not a case
+ReflectionException: Case IntEnum::Baz does not exist
diff --git a/ext/reflection/tests/ReflectionEnum_getCases.phpt b/ext/reflection/tests/ReflectionEnum_getCases.phpt
new file mode 100644
index 0000000000..9365008774
--- /dev/null
+++ b/ext/reflection/tests/ReflectionEnum_getCases.phpt
@@ -0,0 +1,54 @@
+--TEST--
+ReflectionEnum::getCases()
+--FILE--
+<?php
+
+enum Enum_ {
+ case Foo;
+ case Bar;
+ const Baz = self::Bar;
+}
+
+enum IntEnum: int {
+ case Foo = 0;
+ case Bar = 1;
+ const Baz = self::Bar;
+}
+
+var_dump((new ReflectionEnum(Enum_::class))->getCases());
+var_dump((new ReflectionEnum(IntEnum::class))->getCases());
+
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ object(ReflectionEnumUnitCase)#2 (2) {
+ ["name"]=>
+ string(3) "Foo"
+ ["class"]=>
+ string(5) "Enum_"
+ }
+ [1]=>
+ object(ReflectionEnumUnitCase)#3 (2) {
+ ["name"]=>
+ string(3) "Bar"
+ ["class"]=>
+ string(5) "Enum_"
+ }
+}
+array(2) {
+ [0]=>
+ object(ReflectionEnumBackedCase)#2 (2) {
+ ["name"]=>
+ string(3) "Foo"
+ ["class"]=>
+ string(7) "IntEnum"
+ }
+ [1]=>
+ object(ReflectionEnumBackedCase)#1 (2) {
+ ["name"]=>
+ string(3) "Bar"
+ ["class"]=>
+ string(7) "IntEnum"
+ }
+}
diff --git a/ext/reflection/tests/ReflectionEnum_hasCase.phpt b/ext/reflection/tests/ReflectionEnum_hasCase.phpt
new file mode 100644
index 0000000000..3310f0ef6b
--- /dev/null
+++ b/ext/reflection/tests/ReflectionEnum_hasCase.phpt
@@ -0,0 +1,20 @@
+--TEST--
+ReflectionEnum::hasCase()
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+ const Baz = self::Bar;
+}
+
+$reflectionEnum = new ReflectionEnum(Foo::class);
+var_dump($reflectionEnum->hasCase('Bar'));
+var_dump($reflectionEnum->hasCase('Baz'));
+var_dump($reflectionEnum->hasCase('Qux'));
+
+?>
+--EXPECT--
+bool(true)
+bool(false)
+bool(false)
diff --git a/ext/reflection/tests/ReflectionEnum_isBacked.phpt b/ext/reflection/tests/ReflectionEnum_isBacked.phpt
new file mode 100644
index 0000000000..cb449e951a
--- /dev/null
+++ b/ext/reflection/tests/ReflectionEnum_isBacked.phpt
@@ -0,0 +1,20 @@
+--TEST--
+ReflectionEnum::isBacked()
+--FILE--
+<?php
+
+enum Enum_ {}
+enum IntEnum: int {}
+enum StringEnum: string {}
+
+function test(): string {}
+
+var_dump((new ReflectionEnum(Enum_::class))->isBacked());
+var_dump((new ReflectionEnum(IntEnum::class))->isBacked());
+var_dump((new ReflectionEnum(StringEnum::class))->isBacked());
+
+?>
+--EXPECT--
+bool(false)
+bool(true)
+bool(true)
diff --git a/ext/reflection/tests/ReflectionEnum_toString.phpt b/ext/reflection/tests/ReflectionEnum_toString.phpt
new file mode 100644
index 0000000000..567191e594
--- /dev/null
+++ b/ext/reflection/tests/ReflectionEnum_toString.phpt
@@ -0,0 +1,39 @@
+--TEST--
+ReflectionEnum::__toString()
+--FILE--
+<?php
+
+enum Foo {
+ case Bar;
+}
+
+echo new ReflectionEnum(Foo::class);
+
+?>
+--EXPECTF--
+Class [ <user> final class Foo implements UnitEnum ] {
+ @@ %sReflectionEnum_toString.php 3-5
+
+ - Constants [1] {
+ Constant [ public Foo Bar ] { Object }
+ }
+
+ - Static properties [0] {
+ }
+
+ - Static methods [1] {
+ Method [ <internal, prototype UnitEnum> static public method cases ] {
+
+ - Parameters [0] {
+ }
+ - Return [ array ]
+ }
+ }
+
+ - Properties [1] {
+ Property [ public string $name ]
+ }
+
+ - Methods [0] {
+ }
+}
diff --git a/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt b/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt
index e90209ee67..5c4d1cb87f 100644
--- a/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt
+++ b/ext/reflection/tests/ReflectionExtension_getClassNames_basic.phpt
@@ -7,14 +7,14 @@ Felix De Vliegher <felix.devliegher@gmail.com>
$standard = new ReflectionExtension('standard');
var_dump($standard->getClassNames());
?>
---EXPECTF--
+--EXPECT--
array(4) {
[0]=>
- %s(22) "__PHP_Incomplete_Class"
+ string(22) "__PHP_Incomplete_Class"
[1]=>
- %s(15) "php_user_filter"
+ string(14) "AssertionError"
[2]=>
- %s(9) "Directory"
+ string(15) "php_user_filter"
[3]=>
- %s(14) "AssertionError"
+ string(9) "Directory"
}
diff --git a/ext/reflection/tests/ReflectionExtension_getClasses_basic.phpt b/ext/reflection/tests/ReflectionExtension_getClasses_basic.phpt
index 81d3c8d55b..084e05e118 100644
--- a/ext/reflection/tests/ReflectionExtension_getClasses_basic.phpt
+++ b/ext/reflection/tests/ReflectionExtension_getClasses_basic.phpt
@@ -8,7 +8,7 @@ $ext = new ReflectionExtension('reflection');
var_dump($ext->getClasses());
?>
--EXPECT--
-array(19) {
+array(22) {
["ReflectionException"]=>
object(ReflectionClass)#2 (1) {
["name"]=>
@@ -104,4 +104,19 @@ array(19) {
["name"]=>
string(19) "ReflectionAttribute"
}
+ ["ReflectionEnum"]=>
+ object(ReflectionClass)#21 (1) {
+ ["name"]=>
+ string(14) "ReflectionEnum"
+ }
+ ["ReflectionEnumUnitCase"]=>
+ object(ReflectionClass)#22 (1) {
+ ["name"]=>
+ string(22) "ReflectionEnumUnitCase"
+ }
+ ["ReflectionEnumBackedCase"]=>
+ object(ReflectionClass)#23 (1) {
+ ["name"]=>
+ string(24) "ReflectionEnumBackedCase"
+ }
}
diff --git a/ext/reflection/tests/ReflectionObject_isSubclassOf.002.phpt b/ext/reflection/tests/ReflectionObject_isSubclassOf.002.phpt
index ceedc7d4f0..03a4cfcc22 100644
--- a/ext/reflection/tests/ReflectionObject_isSubclassOf.002.phpt
+++ b/ext/reflection/tests/ReflectionObject_isSubclassOf.002.phpt
@@ -35,10 +35,12 @@ try {
echo $e->getMessage() . "\n";
}
?>
---EXPECT--
+--EXPECTF--
Test bad arguments:
ReflectionClass::isSubclassOf() expects exactly 1 argument, 0 given
ReflectionClass::isSubclassOf() expects exactly 1 argument, 2 given
+
+Deprecated: ReflectionClass::isSubclassOf(): Passing null to parameter #1 ($class) of type ReflectionClass|string is deprecated in %s on line %d
Class "" does not exist
Class "ThisClassDoesNotExist" does not exist
Class "2" does not exist
diff --git a/ext/reflection/tests/ReflectionProperty_setValue_readonly.phpt b/ext/reflection/tests/ReflectionProperty_setValue_readonly.phpt
new file mode 100644
index 0000000000..6efea38913
--- /dev/null
+++ b/ext/reflection/tests/ReflectionProperty_setValue_readonly.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Test ReflectionProperty::setValue() error cases.
+--FILE--
+<?php
+
+enum Foo: int {
+ case Bar = 0;
+}
+
+$reflection = new ReflectionProperty(Foo::class, 'value');
+
+try {
+ $reflection->setValue(Foo::Bar, 1);
+} catch (Error $e) {
+ echo $e->getMessage() . "\n";
+}
+
+var_dump(Foo::Bar->value);
+
+?>
+--EXPECT--
+Enum properties are immutable
+int(0)
diff --git a/ext/reflection/tests/bug36337.phpt b/ext/reflection/tests/bug36337.phpt
index ebe64431a7..d4a155bda9 100644
--- a/ext/reflection/tests/bug36337.phpt
+++ b/ext/reflection/tests/bug36337.phpt
@@ -3,7 +3,7 @@ Reflection Bug #36337 (ReflectionProperty fails to return correct visibility)
--FILE--
<?php
-abstract class enum {
+abstract class enum_ {
protected $_values;
public function __construct() {
@@ -13,7 +13,7 @@ abstract class enum {
}
-final class myEnum extends enum {
+final class myEnum extends enum_ {
public $_values = array(
0 => 'No value',
);
diff --git a/ext/session/mod_user.c b/ext/session/mod_user.c
index b41b742cba..977d0c0157 100644
--- a/ext/session/mod_user.c
+++ b/ext/session/mod_user.c
@@ -108,7 +108,7 @@ PS_OPEN_FUNC(user)
PS_CLOSE_FUNC(user)
{
- zend_bool bailout = 0;
+ bool bailout = 0;
STDVARS;
if (!PS(mod_user_implemented)) {
diff --git a/ext/session/php_session.h b/ext/session/php_session.h
index c365975fb5..1a2bc9164f 100644
--- a/ext/session/php_session.h
+++ b/ext/session/php_session.h
@@ -128,8 +128,8 @@ typedef struct _php_session_rfc1867_progress {
zend_long update_step;
zend_long next_update;
double next_update_time;
- zend_bool cancel_upload;
- zend_bool apply_trans_sid;
+ bool cancel_upload;
+ bool apply_trans_sid;
size_t content_length;
zval data; /* the array exported to session data */
@@ -148,8 +148,8 @@ typedef struct _php_ps_globals {
zend_long cookie_lifetime;
char *cookie_path;
char *cookie_domain;
- zend_bool cookie_secure;
- zend_bool cookie_httponly;
+ bool cookie_secure;
+ bool cookie_httponly;
char *cookie_samesite;
const ps_module *mod;
const ps_module *default_mod;
@@ -178,10 +178,10 @@ typedef struct _php_ps_globals {
int mod_user_is_open;
const struct ps_serializer_struct *serializer;
zval http_session_vars;
- zend_bool auto_start;
- zend_bool use_cookies;
- zend_bool use_only_cookies;
- zend_bool use_trans_sid; /* contains the INI value of whether to use trans-sid */
+ bool auto_start;
+ bool use_cookies;
+ bool use_only_cookies;
+ bool use_trans_sid; /* contains the INI value of whether to use trans-sid */
zend_long sid_length;
zend_long sid_bits_per_character;
@@ -189,17 +189,17 @@ typedef struct _php_ps_globals {
int define_sid;
php_session_rfc1867_progress *rfc1867_progress;
- zend_bool rfc1867_enabled; /* session.upload_progress.enabled */
- zend_bool rfc1867_cleanup; /* session.upload_progress.cleanup */
+ bool rfc1867_enabled; /* session.upload_progress.enabled */
+ bool rfc1867_cleanup; /* session.upload_progress.cleanup */
char *rfc1867_prefix; /* session.upload_progress.prefix */
char *rfc1867_name; /* session.upload_progress.name */
zend_long rfc1867_freq; /* session.upload_progress.freq */
double rfc1867_min_freq; /* session.upload_progress.min_freq */
- zend_bool use_strict_mode; /* whether or not PHP accepts unknown session ids */
- zend_bool lazy_write; /* omit session write when it is possible */
- zend_bool in_save_handler; /* state if session is in save handler or not */
- zend_bool set_handler; /* state if session module i setting handler or not */
+ bool use_strict_mode; /* whether or not PHP accepts unknown session ids */
+ bool lazy_write; /* omit session write when it is possible */
+ bool in_save_handler; /* state if session is in save handler or not */
+ bool set_handler; /* state if session module i setting handler or not */
zend_string *session_vars; /* serialized original session data */
} php_ps_globals;
@@ -305,16 +305,12 @@ PHPAPI ZEND_EXTERN_MODULE_GLOBALS(ps)
void php_session_auto_start(void *data);
-#define PS_CLASS_NAME "SessionHandler"
extern PHPAPI zend_class_entry *php_session_class_entry;
-#define PS_IFACE_NAME "SessionHandlerInterface"
extern PHPAPI zend_class_entry *php_session_iface_entry;
-#define PS_SID_IFACE_NAME "SessionIdInterface"
extern PHPAPI zend_class_entry *php_session_id_iface_entry;
-#define PS_UPDATE_TIMESTAMP_IFACE_NAME "SessionUpdateTimestampHandlerInterface"
extern PHPAPI zend_class_entry *php_session_update_timestamp_iface_entry;
extern PHP_METHOD(SessionHandler, open);
diff --git a/ext/session/session.c b/ext/session/session.c
index a79569c5ea..286d108d64 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -359,7 +359,7 @@ PHPAPI int php_session_valid_key(const char *key) /* {{{ */
/* }}} */
-static zend_long php_session_gc(zend_bool immediate) /* {{{ */
+static zend_long php_session_gc(bool immediate) /* {{{ */
{
int nrand;
zend_long num = -1;
@@ -605,9 +605,9 @@ static PHP_INI_MH(OnUpdateTransSid) /* {{{ */
SESSION_CHECK_OUTPUT_STATE;
if (!strncasecmp(ZSTR_VAL(new_value), "on", sizeof("on"))) {
- PS(use_trans_sid) = (zend_bool) 1;
+ PS(use_trans_sid) = (bool) 1;
} else {
- PS(use_trans_sid) = (zend_bool) atoi(ZSTR_VAL(new_value));
+ PS(use_trans_sid) = (bool) atoi(ZSTR_VAL(new_value));
}
return SUCCESS;
@@ -1430,7 +1430,7 @@ PHPAPI int php_session_reset_id(void) /* {{{ */
{
int module_number = PS(module_number);
zval *sid, *data, *ppid;
- zend_bool apply_trans_sid;
+ bool apply_trans_sid;
if (!PS(id)) {
php_error_docref(NULL, E_WARNING, "Cannot set session ID - session ID is not initialized");
@@ -1676,8 +1676,8 @@ PHP_FUNCTION(session_set_cookie_params)
HashTable *options_ht;
zend_long lifetime_long;
zend_string *lifetime = NULL, *path = NULL, *domain = NULL, *samesite = NULL;
- zend_bool secure = 0, secure_null = 1;
- zend_bool httponly = 0, httponly_null = 1;
+ bool secure = 0, secure_null = 1;
+ bool httponly = 0, httponly_null = 1;
zend_string *ini_name;
int result;
int found = 0;
@@ -1974,7 +1974,7 @@ PHP_FUNCTION(session_set_save_handler)
zval *obj = NULL;
zend_string *func_name;
zend_function *current_mptr;
- zend_bool register_shutdown = 1;
+ bool register_shutdown = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|b", &obj, php_session_iface_entry, &register_shutdown) == FAILURE) {
RETURN_THROWS();
@@ -2185,7 +2185,7 @@ PHP_FUNCTION(session_id)
/* {{{ Update the current session id with a newly generated one. If delete_old_session is set to true, remove the old session. */
PHP_FUNCTION(session_regenerate_id)
{
- zend_bool del_ses = 0;
+ bool del_ses = 0;
zend_string *data;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &del_ses) == FAILURE) {
@@ -2379,7 +2379,7 @@ PHP_FUNCTION(session_cache_limiter)
PHP_FUNCTION(session_cache_expire)
{
zend_long expires;
- zend_bool expires_is_null = 1;
+ bool expires_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!", &expires, &expires_is_null) == FAILURE) {
RETURN_THROWS();
@@ -2687,7 +2687,7 @@ PHP_FUNCTION(session_register_shutdown)
* Module Setup and Destruction *
******************************** */
-static int php_rinit_session(zend_bool auto_start) /* {{{ */
+static int php_rinit_session(bool auto_start) /* {{{ */
{
php_rinit_session_globals();
@@ -2780,8 +2780,6 @@ static PHP_GINIT_FUNCTION(ps) /* {{{ */
static PHP_MINIT_FUNCTION(session) /* {{{ */
{
- zend_class_entry ce;
-
zend_register_auto_global(zend_string_init_interned("_SESSION", sizeof("_SESSION") - 1, 1), 0, NULL);
my_module_number = module_number;
@@ -2797,23 +2795,14 @@ static PHP_MINIT_FUNCTION(session) /* {{{ */
php_rfc1867_callback = php_session_rfc1867_callback;
/* Register interfaces */
- INIT_CLASS_ENTRY(ce, PS_IFACE_NAME, class_SessionHandlerInterface_methods);
- php_session_iface_entry = zend_register_internal_class(&ce);
- php_session_iface_entry->ce_flags |= ZEND_ACC_INTERFACE;
+ php_session_iface_entry = register_class_SessionHandlerInterface();
- INIT_CLASS_ENTRY(ce, PS_SID_IFACE_NAME, class_SessionIdInterface_methods);
- php_session_id_iface_entry = zend_register_internal_class(&ce);
- php_session_id_iface_entry->ce_flags |= ZEND_ACC_INTERFACE;
+ php_session_id_iface_entry = register_class_SessionIdInterface();
- INIT_CLASS_ENTRY(ce, PS_UPDATE_TIMESTAMP_IFACE_NAME, class_SessionUpdateTimestampHandlerInterface_methods);
- php_session_update_timestamp_iface_entry = zend_register_internal_class(&ce);
- php_session_update_timestamp_iface_entry->ce_flags |= ZEND_ACC_INTERFACE;
+ php_session_update_timestamp_iface_entry = register_class_SessionUpdateTimestampHandlerInterface();
/* Register base class */
- INIT_CLASS_ENTRY(ce, PS_CLASS_NAME, class_SessionHandler_methods);
- php_session_class_entry = zend_register_internal_class(&ce);
- zend_class_implements(php_session_class_entry, 1, php_session_iface_entry);
- zend_class_implements(php_session_class_entry, 1, php_session_id_iface_entry);
+ php_session_class_entry = register_class_SessionHandler(php_session_iface_entry, php_session_id_iface_entry);
REGISTER_LONG_CONSTANT("PHP_SESSION_DISABLED", php_session_disabled, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PHP_SESSION_NONE", php_session_none, CONST_CS | CONST_PERSISTENT);
@@ -2904,7 +2893,7 @@ static const zend_module_dep session_deps[] = { /* {{{ */
* Upload hook handling *
************************ */
-static zend_bool early_find_sid_in(zval *dest, int where, php_session_rfc1867_progress *progress) /* {{{ */
+static bool early_find_sid_in(zval *dest, int where, php_session_rfc1867_progress *progress) /* {{{ */
{
zval *ppid;
@@ -2939,7 +2928,7 @@ static void php_session_rfc1867_early_find_sid(php_session_rfc1867_progress *pro
early_find_sid_in(&progress->sid, TRACK_VARS_GET, progress);
} /* }}} */
-static zend_bool php_check_cancel_upload(php_session_rfc1867_progress *progress) /* {{{ */
+static bool php_check_cancel_upload(php_session_rfc1867_progress *progress) /* {{{ */
{
zval *progress_ary, *cancel_upload;
diff --git a/ext/session/session.stub.php b/ext/session/session.stub.php
index d8c9b67e50..c8f7308b13 100644
--- a/ext/session/session.stub.php
+++ b/ext/session/session.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function session_name(?string $name = null): string|false {}
diff --git a/ext/session/session_arginfo.h b/ext/session/session_arginfo.h
index 0c82feabb2..54024ca59b 100644
--- a/ext/session/session_arginfo.h
+++ b/ext/session/session_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 8175feea632f2832e43d830e70dc9332377b9f22 */
+ * Stub hash: 84df891ffafa76a34679f4d298f1a1e91a5c23bf */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_session_name, 0, 0, MAY_BE_STRING|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, name, IS_STRING, 1, "null")
@@ -226,3 +226,44 @@ static const zend_function_entry class_SessionHandler_methods[] = {
ZEND_ME(SessionHandler, create_sid, arginfo_class_SessionHandler_create_sid, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SessionHandlerInterface(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SessionHandlerInterface", class_SessionHandlerInterface_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SessionIdInterface(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SessionIdInterface", class_SessionIdInterface_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SessionUpdateTimestampHandlerInterface(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SessionUpdateTimestampHandlerInterface", class_SessionUpdateTimestampHandlerInterface_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SessionHandler(zend_class_entry *class_entry_SessionHandlerInterface, zend_class_entry *class_entry_SessionIdInterface)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SessionHandler", class_SessionHandler_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 2, class_entry_SessionHandlerInterface, class_entry_SessionIdInterface);
+
+ return class_entry;
+}
diff --git a/ext/session/tests/003.phpt b/ext/session/tests/003.phpt
index e7e4294375..4f9b37b75d 100644
--- a/ext/session/tests/003.phpt
+++ b/ext/session/tests/003.phpt
@@ -17,7 +17,7 @@ class foo {
function method() { $this->yes++; }
}
-session_id("abtest");
+session_id("test003");
session_start();
session_decode('baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}}');
diff --git a/ext/session/tests/004.phpt b/ext/session/tests/004.phpt
index 4b81a088b2..c3ed0c5616 100644
--- a/ext/session/tests/004.phpt
+++ b/ext/session/tests/004.phpt
@@ -55,7 +55,7 @@ class foo {
session_set_save_handler(array($hnd, "open"), array($hnd, "close"), array($hnd, "read"), array($hnd, "write"), array($hnd, "destroy"), array($hnd, "gc"));
-session_id("abtest");
+session_id("test004");
session_start();
$_SESSION["baz"]->method();
$_SESSION["arr"][3]->method();
@@ -75,7 +75,7 @@ session_destroy();
?>
--EXPECT--
OPEN: PHPSESSID
-READ: abtest
+READ: test004
object(foo)#2 (2) {
["bar"]=>
string(2) "ok"
@@ -91,9 +91,9 @@ array(1) {
int(2)
}
}
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
+WRITE: test004, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
OPEN: PHPSESSID
-READ: abtest
+READ: test004
object(foo)#3 (2) {
["bar"]=>
string(2) "ok"
@@ -109,4 +109,4 @@ array(1) {
int(2)
}
}
-DESTROY: abtest
+DESTROY: test004
diff --git a/ext/session/tests/005.phpt b/ext/session/tests/005.phpt
index a7b42de7fa..2b51ceed94 100644
--- a/ext/session/tests/005.phpt
+++ b/ext/session/tests/005.phpt
@@ -56,7 +56,7 @@ class foo {
session_set_save_handler(array($hnd, "open"), array($hnd, "close"), array($hnd, "read"), array($hnd, "write"), array($hnd, "destroy"), array($hnd, "gc"));
-session_id("abtest");
+session_id("test005");
session_start();
session_decode($hnd->data);
@@ -91,7 +91,7 @@ session_destroy();
?>
--EXPECT--
OPEN: PHPSESSID
-READ: abtest
+READ: test005
object(foo)#4 (2) {
["bar"]=>
string(2) "ok"
@@ -107,10 +107,10 @@ array(1) {
int(2)
}
}
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
+WRITE: test005, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
CLOSE
OPEN: PHPSESSID
-READ: abtest
+READ: test005
object(foo)#2 (2) {
["bar"]=>
string(2) "ok"
@@ -127,10 +127,10 @@ array(1) {
}
}
int(123)
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}}c|i:123;
+WRITE: test005, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}}c|i:123;
CLOSE
OPEN: PHPSESSID
-READ: abtest
+READ: test005
object(foo)#4 (2) {
["bar"]=>
string(2) "ok"
@@ -147,5 +147,5 @@ array(1) {
}
}
int(123)
-DESTROY: abtest
+DESTROY: test005
CLOSE
diff --git a/ext/session/tests/006.phpt b/ext/session/tests/006.phpt
index 68cea7314a..e3c048748f 100644
--- a/ext/session/tests/006.phpt
+++ b/ext/session/tests/006.phpt
@@ -13,7 +13,7 @@ session.save_handler=files
error_reporting(E_ALL);
ob_start();
-session_id("abtest");
+session_id("test006");
session_start();
class a {
diff --git a/ext/session/tests/009.phpt b/ext/session/tests/009.phpt
index 10069c21d0..898cf76a5a 100644
--- a/ext/session/tests/009.phpt
+++ b/ext/session/tests/009.phpt
@@ -13,14 +13,14 @@ session.save_handler=files
error_reporting(E_ALL);
ob_start();
-session_id("abtest");
+session_id("test009");
### Phase 1 cleanup
session_start();
session_destroy();
### Phase 2 $_SESSION["c"] does not contain any value
-session_id("abtest");
+session_id("test009");
session_start();
var_dump($_SESSION);
$_SESSION["name"] = "foo";
diff --git a/ext/session/tests/012.phpt b/ext/session/tests/012.phpt
index c555d2ca1e..ad3f54962e 100644
--- a/ext/session/tests/012.phpt
+++ b/ext/session/tests/012.phpt
@@ -14,7 +14,7 @@ error_reporting(E_ALL);
### Absurd example, value of $_SESSION does not matter
-session_id("abtest");
+session_id("test012");
session_start();
$_SESSION["_SESSION"] = Array();
$_SESSION = "kk";
diff --git a/ext/session/tests/013.phpt b/ext/session/tests/013.phpt
index 32909eb58c..07fcea407b 100644
--- a/ext/session/tests/013.phpt
+++ b/ext/session/tests/013.phpt
@@ -12,10 +12,10 @@ session.save_handler=files
<?php
error_reporting(E_ALL);
-session_id("abtest");
+session_id("test013");
session_start();
session_destroy();
-session_id("abtest2");
+session_id("test013-2");
session_start();
session_destroy();
diff --git a/ext/session/tests/014.phpt b/ext/session/tests/014.phpt
index d8369cfec5..a0c6515243 100644
--- a/ext/session/tests/014.phpt
+++ b/ext/session/tests/014.phpt
@@ -14,7 +14,7 @@ session.save_handler=files
<?php
error_reporting(E_ALL);
-session_id("abtest");
+session_id("test014");
session_start();
?>
diff --git a/ext/session/tests/015.phpt b/ext/session/tests/015.phpt
index 527b86bc1d..788f1eac06 100644
--- a/ext/session/tests/015.phpt
+++ b/ext/session/tests/015.phpt
@@ -16,7 +16,7 @@ session.save_handler=files
<?php
error_reporting(E_ALL);
-session_id("abtest");
+session_id("test015");
session_start();
?>
<a href="/link?<?php echo SID; ?>">
@@ -24,4 +24,4 @@ session_start();
session_destroy();
?>
--EXPECT--
-<a href="/link?PHPSESSID=abtest&PHPSESSID=abtest">
+<a href="/link?PHPSESSID=test015&PHPSESSID=test015">
diff --git a/ext/session/tests/018.phpt b/ext/session/tests/018.phpt
index 5ec132b34f..d132abf717 100644
--- a/ext/session/tests/018.phpt
+++ b/ext/session/tests/018.phpt
@@ -16,7 +16,7 @@ session.save_handler=files
error_reporting(E_ALL);
-session_id("abtest");
+session_id("test018");
session_start();
?>
<form accept-charset="ISO-8859-15, ISO-8859-1" action=url.php>
@@ -24,4 +24,4 @@ session_start();
session_destroy();
?>
--EXPECT--
-<form accept-charset="ISO-8859-15, ISO-8859-1" action=url.php><input type="hidden" name="PHPSESSID" value="abtest" />
+<form accept-charset="ISO-8859-15, ISO-8859-1" action=url.php><input type="hidden" name="PHPSESSID" value="test018" />
diff --git a/ext/session/tests/019.phpt b/ext/session/tests/019.phpt
index d9a478245b..e3793a5522 100644
--- a/ext/session/tests/019.phpt
+++ b/ext/session/tests/019.phpt
@@ -23,7 +23,7 @@ class TFoo {
}
}
-session_id("abtest");
+session_id("test019");
session_start();
$_SESSION["o1"] = new TFoo(42);
diff --git a/ext/session/tests/020.phpt b/ext/session/tests/020.phpt
index 267e52191c..f4ec38c8fb 100644
--- a/ext/session/tests/020.phpt
+++ b/ext/session/tests/020.phpt
@@ -17,7 +17,7 @@ session.save_handler=files
error_reporting(E_ALL);
-session_id("abtest");
+session_id("test020");
session_start();
?>
<a href="link.php?a=b">
@@ -25,4 +25,4 @@ session_start();
session_destroy();
?>
--EXPECT--
-<a href="link.php?a=b&amp;PHPSESSID=abtest">
+<a href="link.php?a=b&amp;PHPSESSID=test020">
diff --git a/ext/session/tests/021.phpt b/ext/session/tests/021.phpt
index 4a97d7d32a..2532324fee 100644
--- a/ext/session/tests/021.phpt
+++ b/ext/session/tests/021.phpt
@@ -19,7 +19,7 @@ error_reporting(E_ALL);
ini_set('session.trans_sid_hosts', 'php.net');
$_SERVER['HTTP_HOST'] = 'php.net';
-session_id("abtest");
+session_id("test021");
session_start();
?>
<form action="//bad.net/do.php">
@@ -60,11 +60,11 @@ session_destroy();
--EXPECT--
<form action="//bad.net/do.php">
<fieldset>
-<form action="//php.net/do.php"><input type="hidden" name="PHPSESSID" value="abtest" />
+<form action="//php.net/do.php"><input type="hidden" name="PHPSESSID" value="test021" />
<fieldset>
-<form action="../do.php"><input type="hidden" name="PHPSESSID" value="abtest" />
+<form action="../do.php"><input type="hidden" name="PHPSESSID" value="test021" />
<fieldset>
-<form action="/do.php"><input type="hidden" name="PHPSESSID" value="abtest" />
+<form action="/do.php"><input type="hidden" name="PHPSESSID" value="test021" />
<fieldset>
-<form action="/foo/do.php"><input type="hidden" name="PHPSESSID" value="abtest" />
+<form action="/foo/do.php"><input type="hidden" name="PHPSESSID" value="test021" />
<fieldset>
diff --git a/ext/session/tests/023.phpt b/ext/session/tests/023.phpt
index 23c7096f23..e9ce084256 100644
--- a/ext/session/tests/023.phpt
+++ b/ext/session/tests/023.phpt
@@ -17,7 +17,7 @@ class foo {
function method() { $this->yes++; }
}
-session_id("abtest");
+session_id("test023");
session_start();
session_decode('baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}}');
$baz = $_SESSION['baz'];
diff --git a/ext/session/tests/024.phpt b/ext/session/tests/024.phpt
index 174f2e2639..913956f5b3 100644
--- a/ext/session/tests/024.phpt
+++ b/ext/session/tests/024.phpt
@@ -56,7 +56,7 @@ class foo {
session_set_save_handler(array($hnd, "open"), array($hnd, "close"), array($hnd, "read"), array($hnd, "write"), array($hnd, "destroy"), array($hnd, "gc"));
-session_id("abtest");
+session_id("test024");
session_start();
$baz = $_SESSION['baz'];
@@ -79,7 +79,7 @@ session_destroy();
?>
--EXPECTF--
OPEN: PHPSESSID
-READ: abtest
+READ: test024
object(foo)#%d (2) {
["bar"]=>
string(2) "ok"
@@ -95,9 +95,9 @@ array(1) {
int(2)
}
}
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
+WRITE: test024, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
OPEN: PHPSESSID
-READ: abtest
+READ: test024
object(foo)#%d (2) {
["bar"]=>
string(2) "ok"
@@ -113,4 +113,4 @@ array(1) {
int(2)
}
}
-DESTROY: abtest
+DESTROY: test024
diff --git a/ext/session/tests/025.phpt b/ext/session/tests/025.phpt
index 172ea579c6..4e91da9796 100644
--- a/ext/session/tests/025.phpt
+++ b/ext/session/tests/025.phpt
@@ -57,7 +57,7 @@ class foo {
session_set_save_handler(array($hnd, "open"), array($hnd, "close"), array($hnd, "read"), array($hnd, "write"), array($hnd, "destroy"), array($hnd, "gc"));
-session_id("abtest");
+session_id("test025");
session_start();
$baz = $_SESSION['baz'];
$arr = $_SESSION['arr'];
@@ -93,7 +93,7 @@ session_destroy();
?>
--EXPECTF--
OPEN: PHPSESSID
-READ: abtest
+READ: test025
object(foo)#%d (2) {
["bar"]=>
string(2) "ok"
@@ -109,10 +109,10 @@ array(1) {
int(2)
}
}
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
+WRITE: test025, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
CLOSE
OPEN: PHPSESSID
-READ: abtest
+READ: test025
object(foo)#%d (2) {
["bar"]=>
string(2) "ok"
@@ -129,10 +129,10 @@ array(1) {
}
}
int(123)
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}}c|i:123;
+WRITE: test025, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}}c|i:123;
CLOSE
OPEN: PHPSESSID
-READ: abtest
+READ: test025
object(foo)#%d (2) {
["bar"]=>
string(2) "ok"
@@ -149,5 +149,5 @@ array(1) {
}
}
int(123)
-DESTROY: abtest
+DESTROY: test025
CLOSE
diff --git a/ext/session/tests/026.phpt b/ext/session/tests/026.phpt
index b61039ee0c..f5abdac0a5 100644
--- a/ext/session/tests/026.phpt
+++ b/ext/session/tests/026.phpt
@@ -13,7 +13,7 @@ session.save_handler=files
error_reporting(E_ALL);
ob_start();
-session_id("abtest");
+session_id("test026");
session_start();
class a {
diff --git a/ext/session/tests/027.phpt b/ext/session/tests/027.phpt
index ebaf25467c..969bc5b872 100644
--- a/ext/session/tests/027.phpt
+++ b/ext/session/tests/027.phpt
@@ -13,14 +13,14 @@ session.save_handler=files
error_reporting(E_ALL);
ob_start();
-session_id("abtest");
+session_id("test027");
### Phase 1 cleanup
session_start();
session_destroy();
### Phase 2 $_SESSION["c"] does not contain any value
-session_id("abtest");
+session_id("test027");
session_start();
var_dump($_SESSION);
$_SESSION["name"] = "foo";
diff --git a/ext/session/tests/CONFLICTS b/ext/session/tests/CONFLICTS
deleted file mode 100644
index 30888ae480..0000000000
--- a/ext/session/tests/CONFLICTS
+++ /dev/null
@@ -1 +0,0 @@
-session
diff --git a/ext/session/tests/bug41600.phpt b/ext/session/tests/bug41600.phpt
index 79d5e12841..d4dfce9d88 100644
--- a/ext/session/tests/bug41600.phpt
+++ b/ext/session/tests/bug41600.phpt
@@ -17,7 +17,7 @@ session.save_handler=files
error_reporting(E_ALL);
-session_id("abtest");
+session_id("bug41600");
session_start();
?>
<a href="link.php?a=b">
@@ -25,4 +25,4 @@ session_start();
session_destroy();
?>
--EXPECT--
-<a href="link.php?a=b&amp;PHPSESSID=abtest">
+<a href="link.php?a=b&amp;PHPSESSID=bug41600">
diff --git a/ext/session/tests/bug42596.phpt b/ext/session/tests/bug42596.phpt
index f27e86387e..83567bde5f 100644
--- a/ext/session/tests/bug42596.phpt
+++ b/ext/session/tests/bug42596.phpt
@@ -15,7 +15,7 @@ session.serialize_handler=php
session.save_handler=files
--FILE--
<?php
-$sessdir = __DIR__.'/sessions/';
+$sessdir = __DIR__.'/bug42596/';
@rmdir($sessdir);
mkdir($sessdir);
$save_path = '0;0777;'.$sessdir;
diff --git a/ext/session/tests/bug69111.phpt b/ext/session/tests/bug69111.phpt
index c7a6cada65..7dff0590dd 100644
--- a/ext/session/tests/bug69111.phpt
+++ b/ext/session/tests/bug69111.phpt
@@ -14,7 +14,7 @@ $sessionName = ini_get('session.name');
$sh->open($savePath, $sessionName);
$sh->write("foo", "bar");
-var_dump($sh->read(@$id));
+var_dump($sh->read(""));
?>
--EXPECTF--
Warning: SessionHandler::open(): Session is not active in %s on line 10
diff --git a/ext/session/tests/rfc1867.phpt b/ext/session/tests/rfc1867.phpt
index 0e189b7aa6..a5ae8b2218 100644
--- a/ext/session/tests/rfc1867.phpt
+++ b/ext/session/tests/rfc1867.phpt
@@ -18,15 +18,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -50,7 +50,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_cleanup.phpt b/ext/session/tests/rfc1867_cleanup.phpt
index ae5dcbe8dc..9baa6144ba 100644
--- a/ext/session/tests/rfc1867_cleanup.phpt
+++ b/ext/session/tests/rfc1867_cleanup.phpt
@@ -18,15 +18,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-cleanup
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-cleanup-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-cleanup-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -50,7 +50,7 @@ var_dump(isset($_SESSION["upload_progress_" . basename(__FILE__)]));
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-cleanup"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_disabled.phpt b/ext/session/tests/rfc1867_disabled.phpt
index 5bedb1de88..8d8effd1f4 100644
--- a/ext/session/tests/rfc1867_disabled.phpt
+++ b/ext/session/tests/rfc1867_disabled.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-disabled
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-disabled-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-disabled-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="file1"; filename="file1.txt"
@@ -44,7 +44,7 @@ var_dump(isset($_SESSION["upload_progress_" . basename(__FILE__)]));
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-disabled"
array(2) {
["file1"]=>
array(5) {
diff --git a/ext/session/tests/rfc1867_disabled_2.phpt b/ext/session/tests/rfc1867_disabled_2.phpt
index d63748369d..c539c6eaea 100644
--- a/ext/session/tests/rfc1867_disabled_2.phpt
+++ b/ext/session/tests/rfc1867_disabled_2.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-disabled-2
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-disabled-2-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-disabled-2-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="file1"; filename="file1.txt"
@@ -44,7 +44,7 @@ var_dump(isset($_SESSION["upload_progress_" . basename(__FILE__)]));
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-disabled-2"
array(2) {
["file1"]=>
array(5) {
diff --git a/ext/session/tests/rfc1867_inter.phpt b/ext/session/tests/rfc1867_inter.phpt
index b961bbcac3..fd28dfe07a 100644
--- a/ext/session/tests/rfc1867_inter.phpt
+++ b/ext/session/tests/rfc1867_inter.phpt
@@ -18,15 +18,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-inter
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-inter-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-inter-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -54,7 +54,7 @@ var_dump(isset($_SESSION["upload_progress_" . basename(__FILE__) . "_2"]));
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-inter"
array(2) {
["file1"]=>
array(5) {
diff --git a/ext/session/tests/rfc1867_no_name.phpt b/ext/session/tests/rfc1867_no_name.phpt
index 98e8e7cf09..15877a664e 100644
--- a/ext/session/tests/rfc1867_no_name.phpt
+++ b/ext/session/tests/rfc1867_no_name.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-no-name
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-no-name-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-no-name-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="file1"; filename="file1.txt"
@@ -44,7 +44,7 @@ var_dump(isset($_SESSION["upload_progress_" . basename(__FILE__)]));
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-no-name"
array(2) {
["file1"]=>
array(5) {
diff --git a/ext/session/tests/rfc1867_sid_cookie.phpt b/ext/session/tests/rfc1867_sid_cookie.phpt
index 804a9ba308..85c28934f4 100644
--- a/ext/session/tests/rfc1867_sid_cookie.phpt
+++ b/ext/session/tests/rfc1867_sid_cookie.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-sid-cookie
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-sid-cookie-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-sid-cookie-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -49,7 +49,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-sid-cookie"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_sid_get.phpt b/ext/session/tests/rfc1867_sid_get.phpt
index 17d1ebce0f..dfb192cb47 100644
--- a/ext/session/tests/rfc1867_sid_get.phpt
+++ b/ext/session/tests/rfc1867_sid_get.phpt
@@ -17,13 +17,13 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--GET--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-sid-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-sid-get-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -47,7 +47,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-sid-get"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_sid_get_2.phpt b/ext/session/tests/rfc1867_sid_get_2.phpt
index 4b32c6e352..33e4489cc8 100644
--- a/ext/session/tests/rfc1867_sid_get_2.phpt
+++ b/ext/session/tests/rfc1867_sid_get_2.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests-cookie
+PHPSESSID=rfc1867-sid-get-2-cookie
--GET--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-sid-get-2
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-sid-get-2-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -49,7 +49,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-sid-get-2"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_sid_only_cookie.phpt b/ext/session/tests/rfc1867_sid_only_cookie.phpt
index 0c376bb026..54897b91c8 100644
--- a/ext/session/tests/rfc1867_sid_only_cookie.phpt
+++ b/ext/session/tests/rfc1867_sid_only_cookie.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-sid-only-cookie
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-sid-only-cookie-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-sid-only-cookie-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -49,7 +49,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-sid-only-cookie"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_sid_only_cookie_2.phpt b/ext/session/tests/rfc1867_sid_only_cookie_2.phpt
index 9b0aae9429..3fd46148d7 100644
--- a/ext/session/tests/rfc1867_sid_only_cookie_2.phpt
+++ b/ext/session/tests/rfc1867_sid_only_cookie_2.phpt
@@ -16,13 +16,13 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-sid-only-cookie-2-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-sid-only-cookie-2-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
diff --git a/ext/session/tests/rfc1867_sid_post.phpt b/ext/session/tests/rfc1867_sid_post.phpt
index a126f9ba38..f22f153403 100644
--- a/ext/session/tests/rfc1867_sid_post.phpt
+++ b/ext/session/tests/rfc1867_sid_post.phpt
@@ -21,7 +21,7 @@ Content-Type: multipart/form-data; boundary=---------------------------208960602
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests
+rfc1867-sid-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -45,7 +45,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-sid-post"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/session_basic1.phpt b/ext/session/tests/session_basic1.phpt
index ffdcf6c5ec..13c21d3e85 100644
--- a/ext/session/tests/session_basic1.phpt
+++ b/ext/session/tests/session_basic1.phpt
@@ -17,7 +17,7 @@ ob_start();
echo "*** Testing basic session functionality : variation1 ***\n";
-$session_id = 'testid';
+$session_id = 'session-basic1';
session_id($session_id);
$path = __DIR__;
var_dump(session_save_path($path));
@@ -47,20 +47,20 @@ ob_end_flush();
*** Testing basic session functionality : variation1 ***
string(0) ""
*** Without lazy_write ***
-string(6) "testid"
+string(14) "session-basic1"
bool(true)
array(1) {
["lazy_write"]=>
bool(false)
}
bool(true)
-string(6) "testid"
+string(14) "session-basic1"
*** With lazy_write ***
-string(6) "testid"
+string(14) "session-basic1"
bool(true)
bool(true)
-string(6) "testid"
+string(14) "session-basic1"
*** Cleanup ***
-string(6) "testid"
+string(14) "session-basic1"
bool(true)
bool(true)
diff --git a/ext/session/tests/session_basic2.phpt b/ext/session/tests/session_basic2.phpt
index cb9585303c..68230f89b7 100644
--- a/ext/session/tests/session_basic2.phpt
+++ b/ext/session/tests/session_basic2.phpt
@@ -19,7 +19,7 @@ ob_start();
echo "*** Testing basic session functionality : variation2 ***\n";
-$session_id = 'testid';
+$session_id = 'session-basic2';
session_id($session_id);
$path = __DIR__;
var_dump(session_save_path($path));
@@ -55,7 +55,7 @@ ob_end_flush();
*** Testing basic session functionality : variation2 ***
string(0) ""
*** Without lazy_write ***
-string(6) "testid"
+string(14) "session-basic2"
bool(true)
bool(true)
bool(true)
diff --git a/ext/session/tests/session_basic3.phpt b/ext/session/tests/session_basic3.phpt
index f6ed10e296..5f6bd72b82 100644
--- a/ext/session/tests/session_basic3.phpt
+++ b/ext/session/tests/session_basic3.phpt
@@ -93,7 +93,7 @@ output_reset_rewrite_vars();
echo "*** Test trans sid ***\n";
ob_start();
-$session_id = 'testid';
+$session_id = 'session-basic3';
session_id($session_id);
session_start();
// Should add session ID to relative URL only for SECURITY
@@ -225,39 +225,39 @@ ob_end_flush();
*** Testing basic session functionality : variation3 use_trans_sid ***
*** Test trans sid ***
-<a href="/?PHPSESSID=testid">test</a>
-<a href="/path?PHPSESSID=testid">test</a>
-<a href="/path/?PHPSESSID=testid">test</a>
-<a href="/path/?foo=var&PHPSESSID=testid">test</a>
-<a href="../?PHPSESSID=testid">test</a>
-<a href="../path?PHPSESSID=testid">test</a>
-<a href="../path/?PHPSESSID=testid">test</a>
-<a href="../path/?foo=var&PHPSESSID=testid">test</a>
+<a href="/?PHPSESSID=session-basic3">test</a>
+<a href="/path?PHPSESSID=session-basic3">test</a>
+<a href="/path/?PHPSESSID=session-basic3">test</a>
+<a href="/path/?foo=var&PHPSESSID=session-basic3">test</a>
+<a href="../?PHPSESSID=session-basic3">test</a>
+<a href="../path?PHPSESSID=session-basic3">test</a>
+<a href="../path/?PHPSESSID=session-basic3">test</a>
+<a href="../path/?foo=var&PHPSESSID=session-basic3">test</a>
-<a href="/?PHPSESSID=testid#bar">test</a>
-<a href="/path/?PHPSESSID=testid#bar">test</a>
-<a href="/path/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../?PHPSESSID=testid#bar">test</a>
-<a href="../path/?PHPSESSID=testid#bar">test</a>
-<a href="../path/?foo=var&PHPSESSID=testid#bar">test</a>
+<a href="/?PHPSESSID=session-basic3#bar">test</a>
+<a href="/path/?PHPSESSID=session-basic3#bar">test</a>
+<a href="/path/?foo=var&PHPSESSID=session-basic3#bar">test</a>
+<a href="../?PHPSESSID=session-basic3#bar">test</a>
+<a href="../path/?PHPSESSID=session-basic3#bar">test</a>
+<a href="../path/?foo=var&PHPSESSID=session-basic3#bar">test</a>
-<a href="/?foo&PHPSESSID=testid">test</a>
-<a href="/?foo&PHPSESSID=testid#bar">test</a>
-<a href="/?foo=var&PHPSESSID=testid">test</a>
-<a href="/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../?foo&PHPSESSID=testid">test</a>
-<a href="../?foo&PHPSESSID=testid#bar">test</a>
-<a href="../?foo=var&PHPSESSID=testid">test</a>
-<a href="../?foo=var&PHPSESSID=testid#bar">test</a>
+<a href="/?foo&PHPSESSID=session-basic3">test</a>
+<a href="/?foo&PHPSESSID=session-basic3#bar">test</a>
+<a href="/?foo=var&PHPSESSID=session-basic3">test</a>
+<a href="/?foo=var&PHPSESSID=session-basic3#bar">test</a>
+<a href="../?foo&PHPSESSID=session-basic3">test</a>
+<a href="../?foo&PHPSESSID=session-basic3#bar">test</a>
+<a href="../?foo=var&PHPSESSID=session-basic3">test</a>
+<a href="../?foo=var&PHPSESSID=session-basic3#bar">test</a>
-<a href="file.php?PHPSESSID=testid">test</a>
-<a href="file.php?foo&PHPSESSID=testid">test</a>
-<a href="file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../file.php?PHPSESSID=testid">test</a>
-<a href="../file.php?foo&PHPSESSID=testid">test</a>
-<a href="../file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="../file.php?foo=var&PHPSESSID=testid#bar">test</a>
+<a href="file.php?PHPSESSID=session-basic3">test</a>
+<a href="file.php?foo&PHPSESSID=session-basic3">test</a>
+<a href="file.php?foo=var&PHPSESSID=session-basic3">test</a>
+<a href="file.php?foo=var&PHPSESSID=session-basic3#bar">test</a>
+<a href="../file.php?PHPSESSID=session-basic3">test</a>
+<a href="../file.php?foo&PHPSESSID=session-basic3">test</a>
+<a href="../file.php?foo=var&PHPSESSID=session-basic3">test</a>
+<a href="../file.php?foo=var&PHPSESSID=session-basic3#bar">test</a>
<a href="http://php.net">test</a>
<a href="http://php.net/">test</a>
@@ -310,19 +310,19 @@ ob_end_flush();
<a href="//php.net/some/path/file.php?foo=var">test</a>
<a href="//php.net/some/path/file.php?foo=var#bar">test</a>
-<form action="script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic3" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="../script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="../script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic3" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="/path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="/path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic3" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="../path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="../path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic3" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
@@ -341,5 +341,5 @@ ob_end_flush();
bool(true)
*** Cleanup ***
bool(true)
-string(6) "testid"
+string(14) "session-basic3"
bool(true)
diff --git a/ext/session/tests/session_basic5.phpt b/ext/session/tests/session_basic5.phpt
index 50e6cde920..6a7511c317 100644
--- a/ext/session/tests/session_basic5.phpt
+++ b/ext/session/tests/session_basic5.phpt
@@ -24,7 +24,7 @@ ini_set('session.trans_sid_hosts','php.net,example.com');
echo "*** Testing basic session functionality : variation5 use_trans_sid ***\n";
echo "*** Test trans sid ***\n";
-$session_id = 'testid';
+$session_id = 'session-basic5';
session_id($session_id);
session_start();
// Should add session ID to allowed hosts only for SECURITY
@@ -238,116 +238,116 @@ ob_end_flush();
*** Testing basic session functionality : variation5 use_trans_sid ***
*** Test trans sid ***
-<a href="/?PHPSESSID=testid">test</a>
-<a href="/path?PHPSESSID=testid">test</a>
-<a href="/path/?PHPSESSID=testid">test</a>
-<a href="/path/?foo=var&PHPSESSID=testid">test</a>
-<a href="../?PHPSESSID=testid">test</a>
-<a href="../path?PHPSESSID=testid">test</a>
-<a href="../path/?PHPSESSID=testid">test</a>
-<a href="../path/?foo=var&PHPSESSID=testid">test</a>
-
-<a href="/?PHPSESSID=testid#bar">test</a>
-<a href="/path/?PHPSESSID=testid#bar">test</a>
-<a href="/path/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../?PHPSESSID=testid#bar">test</a>
-<a href="../path/?PHPSESSID=testid#bar">test</a>
-<a href="../path/?foo=var&PHPSESSID=testid#bar">test</a>
-
-<a href="/?foo&PHPSESSID=testid">test</a>
-<a href="/?foo&PHPSESSID=testid#bar">test</a>
-<a href="/?foo=var&PHPSESSID=testid">test</a>
-<a href="/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../?foo&PHPSESSID=testid">test</a>
-<a href="../?foo&PHPSESSID=testid#bar">test</a>
-<a href="../?foo=var&PHPSESSID=testid">test</a>
-<a href="../?foo=var&PHPSESSID=testid#bar">test</a>
-
-<a href="file.php?PHPSESSID=testid">test</a>
-<a href="file.php?foo&PHPSESSID=testid">test</a>
-<a href="file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../file.php?PHPSESSID=testid">test</a>
-<a href="../file.php?foo&PHPSESSID=testid">test</a>
-<a href="../file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="../file.php?foo=var&PHPSESSID=testid#bar">test</a>
-
-<a href="http://php.net/?PHPSESSID=testid">test</a>
-<a href="http://php.net/?PHPSESSID=testid">test</a>
-<a href="http://php.net/?PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/?foo&PHPSESSID=testid">test</a>
-<a href="http://php.net/?foo&PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/?foo=var&PHPSESSID=testid">test</a>
-<a href="http://php.net/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/file.php?PHPSESSID=testid">test</a>
-<a href="http://php.net/file.php?PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/file.php?foo&PHPSESSID=testid">test</a>
-<a href="http://php.net/file.php?foo&PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="http://php.net/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/some/path/file.php?PHPSESSID=testid">test</a>
-<a href="http://php.net/some/path/file.php?foo&PHPSESSID=testid">test</a>
-<a href="http://php.net/some/path/file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="http://php.net/some/path/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-
-<a href="https://php.net/?PHPSESSID=testid">test</a>
-<a href="https://php.net/?PHPSESSID=testid">test</a>
-<a href="https://php.net/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="https://php.net/file.php?PHPSESSID=testid">test</a>
-<a href="https://php.net/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="https://php.net/some/path/file.php?PHPSESSID=testid">test</a>
-<a href="https://php.net/some/path/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="https://php.net:8443/?PHPSESSID=testid">test</a>
-<a href="https://php.net:8443/?PHPSESSID=testid">test</a>
-<a href="https://php.net:8443/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="https://php.net:8443/file.php?PHPSESSID=testid">test</a>
-<a href="https://php.net:8443/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="https://php.net:8443/some/path/file.php?PHPSESSID=testid">test</a>
-<a href="https://php.net:8443/some/path/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-
-<a href="//php.net/?PHPSESSID=testid">test</a>
-<a href="//php.net/?PHPSESSID=testid">test</a>
-<a href="//php.net/?PHPSESSID=testid#bar">test</a>
-<a href="//php.net/?foo&PHPSESSID=testid">test</a>
-<a href="//php.net/?foo&PHPSESSID=testid#bar">test</a>
-<a href="//php.net/?foo=var&PHPSESSID=testid">test</a>
-<a href="//php.net/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="//php.net/file.php?PHPSESSID=testid">test</a>
-<a href="//php.net/file.php?PHPSESSID=testid#bar">test</a>
-<a href="//php.net/file.php?foo&PHPSESSID=testid">test</a>
-<a href="//php.net/file.php?foo&PHPSESSID=testid#bar">test</a>
-<a href="//php.net/file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="//php.net/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="//php.net/some/path/file.php?PHPSESSID=testid">test</a>
-<a href="//php.net/some/path/file.php?foo&PHPSESSID=testid">test</a>
-<a href="//php.net/some/path/file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="//php.net/some/path/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-
-<form action="script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<a href="/?PHPSESSID=session-basic5">test</a>
+<a href="/path?PHPSESSID=session-basic5">test</a>
+<a href="/path/?PHPSESSID=session-basic5">test</a>
+<a href="/path/?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="../?PHPSESSID=session-basic5">test</a>
+<a href="../path?PHPSESSID=session-basic5">test</a>
+<a href="../path/?PHPSESSID=session-basic5">test</a>
+<a href="../path/?foo=var&PHPSESSID=session-basic5">test</a>
+
+<a href="/?PHPSESSID=session-basic5#bar">test</a>
+<a href="/path/?PHPSESSID=session-basic5#bar">test</a>
+<a href="/path/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="../?PHPSESSID=session-basic5#bar">test</a>
+<a href="../path/?PHPSESSID=session-basic5#bar">test</a>
+<a href="../path/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<a href="/?foo&PHPSESSID=session-basic5">test</a>
+<a href="/?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="/?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="../?foo&PHPSESSID=session-basic5">test</a>
+<a href="../?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="../?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="../?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<a href="file.php?PHPSESSID=session-basic5">test</a>
+<a href="file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="../file.php?PHPSESSID=session-basic5">test</a>
+<a href="../file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="../file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="../file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<a href="http://php.net/?PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/?PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/?PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/?foo&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/file.php?PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/file.php?PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/file.php?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/some/path/file.php?PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/some/path/file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/some/path/file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/some/path/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<a href="https://php.net/?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net/?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="https://php.net/file.php?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="https://php.net/some/path/file.php?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net/some/path/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="https://php.net:8443/?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net:8443/?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net:8443/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="https://php.net:8443/file.php?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net:8443/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="https://php.net:8443/some/path/file.php?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net:8443/some/path/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<a href="//php.net/?PHPSESSID=session-basic5">test</a>
+<a href="//php.net/?PHPSESSID=session-basic5">test</a>
+<a href="//php.net/?PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/?foo&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/file.php?PHPSESSID=session-basic5">test</a>
+<a href="//php.net/file.php?PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/file.php?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/some/path/file.php?PHPSESSID=session-basic5">test</a>
+<a href="//php.net/some/path/file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/some/path/file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/some/path/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<form action="script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="../script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />r
+<form action="../script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic5" />r
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="/path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="/path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="../path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="../path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form method="post" action="http://php.net/script.php"><input type="hidden" name="PHPSESSID" value="testid" />
+<form method="post" action="http://php.net/script.php"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form method="post" action="https://php.net/script.php"><input type="hidden" name="PHPSESSID" value="testid" />
+<form method="post" action="https://php.net/script.php"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form method="post" action="//php.net/script.php"><input type="hidden" name="PHPSESSID" value="testid" />
+<form method="post" action="//php.net/script.php"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
@@ -436,5 +436,5 @@ ob_end_flush();
bool(true)
*** Cleanup ***
bool(true)
-string(6) "testid"
+string(14) "session-basic5"
bool(true)
diff --git a/ext/session/tests/session_commit_variation4.phpt b/ext/session/tests/session_commit_variation4.phpt
index 2633f543af..b0c3ad4a94 100644
--- a/ext/session/tests/session_commit_variation4.phpt
+++ b/ext/session/tests/session_commit_variation4.phpt
@@ -12,7 +12,7 @@ ob_start();
echo "*** Testing session_commit() : variation ***\n";
var_dump(ini_get('session.use_strict_mode'));
-var_dump(session_id("test"));
+var_dump(session_id("session-commit-variation4"));
var_dump(session_start());
var_dump(session_id());
var_dump(session_commit());
@@ -38,18 +38,18 @@ ob_end_flush();
string(1) "0"
string(0) ""
bool(true)
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
string(1) "0"
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
bool(true)
string(1) "0"
diff --git a/ext/session/tests/session_decode_variation3.phpt b/ext/session/tests/session_decode_variation3.phpt
index ef4eab2bd2..2916c727f9 100644
--- a/ext/session/tests/session_decode_variation3.phpt
+++ b/ext/session/tests/session_decode_variation3.phpt
@@ -31,7 +31,7 @@ ob_end_flush();
Warning: session_start(): Cannot find session serialization handler "blah" - session startup failed in %s on line %d
bool(false)
-Warning: Undefined variable $_SESSION in %s on line %d
+Warning: Undefined global variable $_SESSION in %s on line %d
NULL
array(3) {
["foo"]=>
diff --git a/ext/session/tests/session_module_name_variation4.phpt b/ext/session/tests/session_module_name_variation4.phpt
index 9b845151a8..7e58ddc6c4 100644
--- a/ext/session/tests/session_module_name_variation4.phpt
+++ b/ext/session/tests/session_module_name_variation4.phpt
@@ -15,6 +15,8 @@ echo "*** Testing session_module_name() : variation ***\n";
require_once "save_handler.inc";
$path = __DIR__;
+$path = __DIR__ . '/session_module_name_variation4';
+@mkdir($path);
session_save_path($path);
session_module_name("files");
@@ -35,6 +37,7 @@ var_dump($_SESSION);
var_dump(session_destroy());
ob_end_flush();
+rmdir($path);
?>
--EXPECT--
*** Testing session_module_name() : variation ***
diff --git a/ext/session/tests/session_save_path_variation4.phpt b/ext/session/tests/session_save_path_variation4.phpt
index 8b3df52262..ec22e92051 100644
--- a/ext/session/tests/session_save_path_variation4.phpt
+++ b/ext/session/tests/session_save_path_variation4.phpt
@@ -14,7 +14,7 @@ ob_start();
echo "*** Testing session_save_path() : variation ***\n";
$initdir = __DIR__;
-$sessions = ($initdir."/sessions");
+$sessions = ($initdir."/session_save_path_variation4");
chdir($initdir);
@@ -38,7 +38,7 @@ ob_end_flush();
--CLEAN--
<?php
$initdir = __DIR__;
-$sessions = ($initdir."/sessions");
+$sessions = ($initdir."/session_save_path_variation4");
var_dump(rmdir($sessions));
?>
--EXPECTF--
diff --git a/ext/session/tests/session_save_path_variation5.phpt b/ext/session/tests/session_save_path_variation5.phpt
index 446a472ab4..3977d0deab 100644
--- a/ext/session/tests/session_save_path_variation5.phpt
+++ b/ext/session/tests/session_save_path_variation5.phpt
@@ -15,7 +15,7 @@ session.name=PHPSESSID
ob_start();
echo "*** Testing session_save_path() : variation ***\n";
$directory = __DIR__;
-$sessions = ($directory."/sessions");
+$sessions = ($directory."/session_save_path_variation5");
chdir($directory);
ini_set('open_basedir', '.');
@@ -36,7 +36,7 @@ ob_end_flush();
--CLEAN--
<?php
$directory = __DIR__;
-$sessions = ($directory."/sessions");
+$sessions = ($directory."/session_save_path_variation5");
var_dump(rmdir($sessions));
?>
--EXPECTF--
diff --git a/ext/session/tests/session_set_save_handler_basic.phpt b/ext/session/tests/session_set_save_handler_basic.phpt
index 459f03c825..23865aa512 100644
--- a/ext/session/tests/session_set_save_handler_basic.phpt
+++ b/ext/session/tests/session_set_save_handler_basic.phpt
@@ -20,7 +20,8 @@ var_dump(session_module_name(FALSE));
var_dump(session_module_name("blah"));
var_dump(session_module_name("foo"));
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_basic';
+@mkdir($path);
session_save_path($path);
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
@@ -55,6 +56,7 @@ session_start();
session_destroy();
ob_end_flush();
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : basic functionality ***
diff --git a/ext/session/tests/session_set_save_handler_class_012.phpt b/ext/session/tests/session_set_save_handler_class_012.phpt
index 0849013a8f..2d55715544 100644
--- a/ext/session/tests/session_set_save_handler_class_012.phpt
+++ b/ext/session/tests/session_set_save_handler_class_012.phpt
@@ -45,7 +45,7 @@ var_dump(session_id(), $oldHandler, ini_get('session.save_handler'), $handler->i
Open
SessionHandler::open() expects exactly 2 arguments, 0 given
-Warning: Undefined variable $_SESSION in %s on line %d
+Warning: Undefined global variable $_SESSION in %s on line %d
string(0) ""
string(5) "files"
string(4) "user"
diff --git a/ext/session/tests/session_set_save_handler_variation2.phpt b/ext/session/tests/session_set_save_handler_variation2.phpt
index 224846466e..a4b7d4df6e 100644
--- a/ext/session/tests/session_set_save_handler_variation2.phpt
+++ b/ext/session/tests/session_set_save_handler_variation2.phpt
@@ -10,13 +10,15 @@ ob_start();
echo "*** Testing session_set_save_handler() : variation ***\n";
require_once "save_handler.inc";
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_variation2';
+@mkdir($path);
session_save_path($path);
var_dump(session_start());
var_dump(session_set_save_handler("open", "close", "read", "write", "destroy", "gc"));
var_dump(session_destroy());
ob_end_flush();
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : variation ***
diff --git a/ext/session/tests/session_set_save_handler_variation3.phpt b/ext/session/tests/session_set_save_handler_variation3.phpt
index be825cbe72..cc0ae1fb23 100644
--- a/ext/session/tests/session_set_save_handler_variation3.phpt
+++ b/ext/session/tests/session_set_save_handler_variation3.phpt
@@ -12,13 +12,15 @@ ob_start();
echo "*** Testing session_set_save_handler() : variation ***\n";
require_once "save_handler.inc";
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_variation3';
+@mkdir($path);
var_dump(session_status());
session_save_path($path);
var_dump(session_set_save_handler("open", "close", "read", "write", "destroy", "gc"));
var_dump(session_destroy());
-
ob_end_flush();
+
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : variation ***
diff --git a/ext/session/tests/session_set_save_handler_variation4.phpt b/ext/session/tests/session_set_save_handler_variation4.phpt
index e1b61f29a7..9930f7aaf2 100644
--- a/ext/session/tests/session_set_save_handler_variation4.phpt
+++ b/ext/session/tests/session_set_save_handler_variation4.phpt
@@ -23,7 +23,8 @@ function noisy_gc($maxlifetime) {
}
require_once "save_handler.inc";
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_variation4';
+@mkdir($path);
session_save_path($path);
session_set_save_handler("open", "close", "read", "write", "destroy", "noisy_gc");
@@ -42,13 +43,14 @@ var_dump($_SESSION);
var_dump(session_destroy());
ob_end_flush();
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : variation ***
Open [%s,PHPSESSID]
Read [%s,%s]
GC [0]
-2 deleted
+1 deleted
array(3) {
["Blah"]=>
string(12) "Hello World!"
diff --git a/ext/session/tests/session_set_save_handler_variation5.phpt b/ext/session/tests/session_set_save_handler_variation5.phpt
index 9860dcc04a..7cf7814259 100644
--- a/ext/session/tests/session_set_save_handler_variation5.phpt
+++ b/ext/session/tests/session_set_save_handler_variation5.phpt
@@ -24,7 +24,8 @@ function noisy_gc($maxlifetime) {
echo "*** Testing session_set_save_handler() : variation ***\n";
require_once "save_handler.inc";
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_variation5';
+@mkdir($path);
var_dump(session_save_path($path));
echo "*** Without lazy_write ***\n";
@@ -48,6 +49,7 @@ var_dump(session_start());
var_dump(session_destroy());
ob_end_flush();
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : variation ***
diff --git a/ext/session/tests/session_set_save_handler_variation6.phpt b/ext/session/tests/session_set_save_handler_variation6.phpt
index d65c0dc1c8..11af07f603 100644
--- a/ext/session/tests/session_set_save_handler_variation6.phpt
+++ b/ext/session/tests/session_set_save_handler_variation6.phpt
@@ -17,7 +17,8 @@ ob_start();
echo "*** Testing session_set_save_handler() : test write short circuit ***\n";
require_once "save_handler.inc";
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_variation6';
+@mkdir($path);
session_save_path($path);
session_set_save_handler("open", "close", "read", "write", "destroy", "gc", "create_sid", "validate_sid", "update");
@@ -53,6 +54,7 @@ session_start();
session_destroy();
ob_end_flush();
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : test write short circuit ***
diff --git a/ext/shmop/shmop.c b/ext/shmop/shmop.c
index 249359bbdd..c0413893d6 100644
--- a/ext/shmop/shmop.c
+++ b/ext/shmop/shmop.c
@@ -108,10 +108,7 @@ static void shmop_free_obj(zend_object *object)
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(shmop)
{
- zend_class_entry ce;
- INIT_CLASS_ENTRY(ce, "Shmop", class_Shmop_methods);
- shmop_ce = zend_register_internal_class(&ce);
- shmop_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ shmop_ce = register_class_Shmop();
shmop_ce->create_object = shmop_create_object;
shmop_ce->serialize = zend_class_serialize_deny;
shmop_ce->unserialize = zend_class_unserialize_deny;
diff --git a/ext/shmop/shmop.stub.php b/ext/shmop/shmop.stub.php
index 9485953502..dcf3e5ab03 100644
--- a/ext/shmop/shmop.stub.php
+++ b/ext/shmop/shmop.stub.php
@@ -1,7 +1,8 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+/** @strict-properties */
final class Shmop {}
function shmop_open(int $key, string $mode, int $permissions, int $size): Shmop|false {}
diff --git a/ext/shmop/shmop_arginfo.h b/ext/shmop/shmop_arginfo.h
index 3b92a62c2c..db2c922146 100644
--- a/ext/shmop/shmop_arginfo.h
+++ b/ext/shmop/shmop_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 81173e82e0378d5b5c729a3cce8561e0ca56e092 */
+ * Stub hash: be10d3d4ec73b674227600dcd975230290e4c2cd */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_shmop_open, 0, 4, Shmop, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, key, IS_LONG, 0)
@@ -55,3 +55,14 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_Shmop_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Shmop(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Shmop", class_Shmop_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/shmop/tests/002.phpt b/ext/shmop/tests/002.phpt
index 2cd9db6187..41f2ce5783 100644
--- a/ext/shmop/tests/002.phpt
+++ b/ext/shmop/tests/002.phpt
@@ -27,11 +27,11 @@ try {
}
// Warning outputs: Unable to attach or create shared memory segment
-var_dump(shmop_open(null, 'a', 0644, 1024));
+var_dump(shmop_open(0, 'a', 0644, 1024));
// Shared memory segment size must be greater than zero
try {
- shmop_open(null, 'a', 0644, 1024);
+ shmop_open(0, 'a', 0644, 1024);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c
index c941e43ad3..dc74967ede 100644
--- a/ext/simplexml/simplexml.c
+++ b/ext/simplexml/simplexml.c
@@ -218,7 +218,7 @@ next_iter:
/* }}} */
/* {{{ sxe_prop_dim_read() */
-static zval *sxe_prop_dim_read(zend_object *object, zval *member, zend_bool elements, zend_bool attribs, int type, zval *rv)
+static zval *sxe_prop_dim_read(zend_object *object, zval *member, bool elements, bool attribs, int type, zval *rv)
{
php_sxe_object *sxe;
char *name;
@@ -386,7 +386,7 @@ static void change_node_zval(xmlNodePtr node, zend_string *value)
/* }}} */
/* {{{ sxe_property_write() */
-static zval *sxe_prop_dim_write(zend_object *object, zval *member, zval *value, zend_bool elements, zend_bool attribs, xmlNodePtr *pnewnode)
+static zval *sxe_prop_dim_write(zend_object *object, zval *member, zval *value, bool elements, bool attribs, xmlNodePtr *pnewnode)
{
php_sxe_object *sxe;
xmlNodePtr node;
@@ -674,7 +674,7 @@ static zval *sxe_property_get_adr(zend_object *object, zend_string *zname, int f
/* }}} */
/* {{{ sxe_prop_dim_exists() */
-static int sxe_prop_dim_exists(zend_object *object, zval *member, int check_empty, zend_bool elements, zend_bool attribs)
+static int sxe_prop_dim_exists(zend_object *object, zval *member, int check_empty, bool elements, bool attribs)
{
php_sxe_object *sxe;
xmlNodePtr node;
@@ -795,7 +795,7 @@ static int sxe_dimension_exists(zend_object *object, zval *member, int check_emp
/* }}} */
/* {{{ sxe_prop_dim_delete() */
-static void sxe_prop_dim_delete(zend_object *object, zval *member, zend_bool elements, zend_bool attribs)
+static void sxe_prop_dim_delete(zend_object *object, zval *member, bool elements, bool attribs)
{
php_sxe_object *sxe;
xmlNodePtr node;
@@ -1479,7 +1479,7 @@ static inline void sxe_add_namespace_name(zval *return_value, xmlNsPtr ns) /* {{
}
/* }}} */
-static void sxe_add_namespaces(php_sxe_object *sxe, xmlNodePtr node, zend_bool recursive, zval *return_value) /* {{{ */
+static void sxe_add_namespaces(php_sxe_object *sxe, xmlNodePtr node, bool recursive, zval *return_value) /* {{{ */
{
xmlAttrPtr attr;
@@ -1509,7 +1509,7 @@ static void sxe_add_namespaces(php_sxe_object *sxe, xmlNodePtr node, zend_bool r
/* {{{ Return all namespaces in use */
SXE_METHOD(getNamespaces)
{
- zend_bool recursive = 0;
+ bool recursive = 0;
php_sxe_object *sxe;
xmlNodePtr node;
@@ -1533,7 +1533,7 @@ SXE_METHOD(getNamespaces)
}
/* }}} */
-static void sxe_add_registered_namespaces(php_sxe_object *sxe, xmlNodePtr node, zend_bool recursive, zval *return_value) /* {{{ */
+static void sxe_add_registered_namespaces(php_sxe_object *sxe, xmlNodePtr node, bool recursive, zval *return_value) /* {{{ */
{
xmlNsPtr ns;
@@ -1557,7 +1557,7 @@ static void sxe_add_registered_namespaces(php_sxe_object *sxe, xmlNodePtr node,
/* {{{ Return all namespaces registered with document */
SXE_METHOD(getDocNamespaces)
{
- zend_bool recursive = 0, from_root = 1;
+ bool recursive = 0, from_root = 1;
php_sxe_object *sxe;
xmlNodePtr node;
@@ -1593,7 +1593,7 @@ SXE_METHOD(children)
char *nsprefix = NULL;
size_t nsprefix_len = 0;
xmlNodePtr node;
- zend_bool isprefix = 0;
+ bool isprefix = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s!b", &nsprefix, &nsprefix_len, &isprefix) == FAILURE) {
RETURN_THROWS();
@@ -1647,7 +1647,7 @@ SXE_METHOD(attributes)
char *nsprefix = NULL;
size_t nsprefix_len = 0;
xmlNodePtr node;
- zend_bool isprefix = 0;
+ bool isprefix = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s!b", &nsprefix, &nsprefix_len, &isprefix) == FAILURE) {
RETURN_THROWS();
@@ -2109,7 +2109,7 @@ sxe_object_clone(zend_object *object)
php_sxe_object *clone;
xmlNodePtr nodep = NULL;
xmlDocPtr docp = NULL;
- zend_bool is_root_element = sxe->node && sxe->node->node && sxe->node->node->parent
+ bool is_root_element = sxe->node && sxe->node->node && sxe->node->node->parent
&& (sxe->node->node->parent->type == XML_DOCUMENT_NODE || sxe->node->node->parent->type == XML_HTML_DOCUMENT_NODE);
clone = php_sxe_object_new(sxe->zo.ce, sxe->fptr_count);
@@ -2267,7 +2267,7 @@ PHP_FUNCTION(simplexml_load_file)
zend_long options = 0;
zend_class_entry *ce= sxe_class_entry;
zend_function *fptr_count;
- zend_bool isprefix = 0;
+ bool isprefix = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|C!lsb", &filename, &filename_len, &ce, &options, &ns, &ns_len, &isprefix) == FAILURE) {
RETURN_THROWS();
@@ -2312,7 +2312,7 @@ PHP_FUNCTION(simplexml_load_string)
zend_long options = 0;
zend_class_entry *ce= sxe_class_entry;
zend_function *fptr_count;
- zend_bool isprefix = 0;
+ bool isprefix = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|C!lsb", &data, &data_len, &ce, &options, &ns, &ns_len, &isprefix) == FAILURE) {
RETURN_THROWS();
@@ -2361,7 +2361,7 @@ SXE_METHOD(__construct)
size_t data_len, ns_len = 0;
xmlDocPtr docp;
zend_long options = 0;
- zend_bool is_url = 0, isprefix = 0;
+ bool is_url = 0, isprefix = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lbsb", &data, &data_len, &options, &is_url, &ns, &ns_len, &isprefix) == FAILURE) {
RETURN_THROWS();
@@ -2682,14 +2682,9 @@ ZEND_GET_MODULE(simplexml)
/* {{{ PHP_MINIT_FUNCTION(simplexml) */
PHP_MINIT_FUNCTION(simplexml)
{
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY(ce, "SimpleXMLElement", class_SimpleXMLElement_methods);
- sxe_class_entry = zend_register_internal_class(&ce);
+ sxe_class_entry = register_class_SimpleXMLElement(zend_ce_stringable, zend_ce_countable, spl_ce_RecursiveIterator);
sxe_class_entry->create_object = sxe_object_new;
sxe_class_entry->get_iterator = php_sxe_get_iterator;
- zend_class_implements(sxe_class_entry, 3,
- zend_ce_countable, zend_ce_stringable, spl_ce_RecursiveIterator);
memcpy(&sxe_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
sxe_object_handlers.offset = XtOffsetOf(php_sxe_object, zo);
@@ -2719,8 +2714,7 @@ PHP_MINIT_FUNCTION(simplexml)
/* TODO: Why do we have two variables for this? */
ce_SimpleXMLElement = sxe_class_entry;
- INIT_CLASS_ENTRY(ce, "SimpleXMLIterator", NULL);
- ce_SimpleXMLIterator = zend_register_internal_class_ex(&ce, ce_SimpleXMLElement);
+ ce_SimpleXMLIterator = register_class_SimpleXMLIterator(ce_SimpleXMLElement);
php_libxml_register_export(sxe_class_entry, simplexml_export_node);
diff --git a/ext/simplexml/simplexml.stub.php b/ext/simplexml/simplexml.stub.php
index 7d56de88e9..ec4f1a61df 100644
--- a/ext/simplexml/simplexml.stub.php
+++ b/ext/simplexml/simplexml.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function simplexml_load_file(string $filename, ?string $class_name = SimpleXMLElement::class, int $options = 0, string $namespace_or_prefix = "", bool $is_prefix = false): SimpleXMLElement|false {}
diff --git a/ext/simplexml/simplexml_arginfo.h b/ext/simplexml/simplexml_arginfo.h
index 7da3c9f33c..92788bbc6c 100644
--- a/ext/simplexml/simplexml_arginfo.h
+++ b/ext/simplexml/simplexml_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: f8ca25a00ae1a5fed436851e88229b503c77bf31 */
+ * Stub hash: 4e4844b9cbac53c3fff061192f7e1ff703ac2f8c */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_simplexml_load_file, 0, 1, SimpleXMLElement, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@@ -154,3 +154,24 @@ static const zend_function_entry class_SimpleXMLElement_methods[] = {
static const zend_function_entry class_SimpleXMLIterator_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SimpleXMLElement(zend_class_entry *class_entry_Stringable, zend_class_entry *class_entry_Countable, zend_class_entry *class_entry_RecursiveIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SimpleXMLElement", class_SimpleXMLElement_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 3, class_entry_Stringable, class_entry_Countable, class_entry_RecursiveIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SimpleXMLIterator(zend_class_entry *class_entry_SimpleXMLElement)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SimpleXMLIterator", class_SimpleXMLIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_SimpleXMLElement);
+
+ return class_entry;
+}
diff --git a/ext/skeleton/skeleton.stub.php b/ext/skeleton/skeleton.stub.php
index 06740a0a78..c7907faea1 100644
--- a/ext/skeleton/skeleton.stub.php
+++ b/ext/skeleton/skeleton.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function test1(): void {}
diff --git a/ext/skeleton/skeleton_arginfo.h b/ext/skeleton/skeleton_arginfo.h
index 9157c66bfd..71a4a0feca 100644
--- a/ext/skeleton/skeleton_arginfo.h
+++ b/ext/skeleton/skeleton_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 7eb3fd4083c98e6dffc8b02b6373b7ce9cbf228d */
+ * Stub hash: efdd79c2c8ccff694699c86fdd6248a13839c744 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_test1, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO()
diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c
index 35d19c8738..8674acaf21 100644
--- a/ext/snmp/snmp.c
+++ b/ext/snmp/snmp.c
@@ -705,7 +705,7 @@ static int php_snmp_parse_oid(
objid_query->vars = (snmpobjarg *)safe_emalloc(sizeof(snmpobjarg), zend_hash_num_elements(oid_ht), 0);
objid_query->array_output = ( (st & SNMP_CMD_SET) ? FALSE : TRUE );
ZEND_HASH_FOREACH_VAL(oid_ht, tmp_oid) {
- convert_to_string_ex(tmp_oid);
+ convert_to_string(tmp_oid);
objid_query->vars[objid_query->count].oid = Z_STRVAL_P(tmp_oid);
if (st & SNMP_CMD_SET) {
if (type_str) {
@@ -720,7 +720,7 @@ static int php_snmp_parse_oid(
idx_type++;
}
if (idx_type < type_ht->nNumUsed) {
- convert_to_string_ex(tmp_type);
+ convert_to_string(tmp_type);
if (Z_STRLEN_P(tmp_type) != 1) {
zend_value_error("Type must be a single character");
efree(objid_query->vars);
@@ -747,7 +747,7 @@ static int php_snmp_parse_oid(
idx_value++;
}
if (idx_value < value_ht->nNumUsed) {
- convert_to_string_ex(tmp_value);
+ convert_to_string(tmp_value);
objid_query->vars[objid_query->count].value = Z_STRVAL_P(tmp_value);
idx_value++;
} else {
@@ -1101,7 +1101,7 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
HashTable *oid_ht, *type_ht = NULL, *value_ht = NULL;
char *a1 = NULL, *a2 = NULL, *a3 = NULL, *a4 = NULL, *a5 = NULL, *a6 = NULL, *a7 = NULL;
size_t a1_len, a2_len, a3_len, a4_len, a5_len, a6_len, a7_len;
- zend_bool use_orignames = 0, suffix_keys = 0;
+ bool use_orignames = 0, suffix_keys = 0;
zend_long timeout = SNMP_DEFAULT_TIMEOUT;
zend_long retries = SNMP_DEFAULT_RETRIES;
struct objid_query objid_query;
@@ -1324,7 +1324,7 @@ PHP_FUNCTION(snmp_get_quick_print)
/* {{{ Return all objects including their respective object id within the specified one */
PHP_FUNCTION(snmp_set_quick_print)
{
- zend_bool a1;
+ bool a1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &a1) == FAILURE) {
RETURN_THROWS();
@@ -1338,7 +1338,7 @@ PHP_FUNCTION(snmp_set_quick_print)
/* {{{ Return all values that are enums with their enum value instead of the raw integer */
PHP_FUNCTION(snmp_set_enum_print)
{
- zend_bool a1;
+ bool a1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &a1) == FAILURE) {
RETURN_THROWS();
@@ -1959,7 +1959,6 @@ const php_snmp_prop_handler php_snmp_property_entries[] = {
PHP_MINIT_FUNCTION(snmp)
{
netsnmp_log_handler *logh;
- zend_class_entry ce, cex;
init_snmp("snmpapp");
/* net-snmp corrupts the CTYPE locale during initialization. */
@@ -1985,12 +1984,11 @@ PHP_MINIT_FUNCTION(snmp)
php_snmp_object_handlers.get_gc = php_snmp_get_gc;
/* Register SNMP Class */
- INIT_CLASS_ENTRY(ce, "SNMP", class_SNMP_methods);
- ce.create_object = php_snmp_object_new;
+ php_snmp_ce = register_class_SNMP();
+ php_snmp_ce->create_object = php_snmp_object_new;
php_snmp_object_handlers.offset = XtOffsetOf(php_snmp_object, zo);
php_snmp_object_handlers.clone_obj = NULL;
php_snmp_object_handlers.free_obj = php_snmp_object_free_storage;
- php_snmp_ce = zend_register_internal_class(&ce);
/* Register SNMP Class properties */
zend_hash_init(&php_snmp_properties, 0, NULL, free_php_snmp_properties, 1);
@@ -2035,8 +2033,7 @@ PHP_MINIT_FUNCTION(snmp)
REGISTER_SNMP_CLASS_CONST_LONG("ERRNO_MULTIPLE_SET_QUERIES", PHP_SNMP_ERRNO_MULTIPLE_SET_QUERIES);
/* Register SNMPException class */
- INIT_CLASS_ENTRY(cex, "SNMPException", NULL);
- php_snmp_exception_ce = zend_register_internal_class_ex(&cex, spl_ce_RuntimeException);
+ php_snmp_exception_ce = register_class_SNMPException(spl_ce_RuntimeException);
return SUCCESS;
}
diff --git a/ext/snmp/snmp.stub.php b/ext/snmp/snmp.stub.php
index e6e0cb22eb..1378f34ff9 100644
--- a/ext/snmp/snmp.stub.php
+++ b/ext/snmp/snmp.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function snmpget(string $hostname, string $community, array|string $object_id, int $timeout = -1, int $retries = -1): stdClass|array|string|bool {}
diff --git a/ext/snmp/snmp_arginfo.h b/ext/snmp/snmp_arginfo.h
index 52e7e7040d..0f076ca2a4 100644
--- a/ext/snmp/snmp_arginfo.h
+++ b/ext/snmp/snmp_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 32433e63feea7cc46737000498e248da713ab5a3 */
+ * Stub hash: 08192d87d2ac5d35092cfcf4a2cdcc50f7ec4ada */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_snmpget, 0, 3, stdClass, MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_BOOL)
ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0)
@@ -241,3 +241,23 @@ static const zend_function_entry class_SNMP_methods[] = {
static const zend_function_entry class_SNMPException_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SNMP(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SNMP", class_SNMP_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SNMPException(zend_class_entry *class_entry_RuntimeException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SNMPException", class_SNMPException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException);
+
+ return class_entry;
+}
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index b3dd853298..9ed92672db 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -279,7 +279,7 @@ static encodePtr find_encoder_by_type_name(sdlPtr sdl, const char *type)
return NULL;
}
-static zend_bool soap_check_zval_ref(zval *data, xmlNodePtr node) {
+static bool soap_check_zval_ref(zval *data, xmlNodePtr node) {
xmlNodePtr node_ptr;
if (SOAP_GLOBAL(ref_map)) {
@@ -344,7 +344,7 @@ static zend_bool soap_check_zval_ref(zval *data, xmlNodePtr node) {
return 0;
}
-static zend_bool soap_check_xml_ref(zval *data, xmlNodePtr node)
+static bool soap_check_xml_ref(zval *data, xmlNodePtr node)
{
zval *data_ptr;
diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c
index 1da286ad87..9119fee9a7 100644
--- a/ext/soap/php_http.c
+++ b/ext/soap/php_http.c
@@ -88,9 +88,9 @@ int basic_authentication(zval* this_ptr, smart_str* soap_headers)
/* Additional HTTP headers */
void http_context_headers(php_stream_context* context,
- zend_bool has_authorization,
- zend_bool has_proxy_authorization,
- zend_bool has_cookies,
+ bool has_authorization,
+ bool has_proxy_authorization,
+ bool has_cookies,
smart_str* soap_headers)
{
zval *tmp;
@@ -359,11 +359,11 @@ int make_http_soap_request(zval *this_ptr,
zend_long redirect_max = 20;
char *content_encoding;
char *http_msg = NULL;
- zend_bool old_allow_url_fopen;
+ bool old_allow_url_fopen;
php_stream_context *context = NULL;
- zend_bool has_authorization = 0;
- zend_bool has_proxy_authorization = 0;
- zend_bool has_cookies = 0;
+ bool has_authorization = 0;
+ bool has_proxy_authorization = 0;
+ bool has_cookies = 0;
if (this_ptr == NULL || Z_TYPE_P(this_ptr) != IS_OBJECT) {
return FALSE;
@@ -491,7 +491,7 @@ try_again:
(((use_ssl && orig->scheme != NULL && zend_string_equals_literal(orig->scheme, "https")) ||
(!use_ssl && orig->scheme == NULL) ||
(!use_ssl && !zend_string_equals_literal(orig->scheme, "https"))) &&
- strcmp(ZSTR_VAL(orig->host), ZSTR_VAL(phpurl->host)) == 0 &&
+ zend_string_equals(orig->host, phpurl->host) &&
orig->port == phpurl->port))) {
} else {
php_stream_close(stream);
diff --git a/ext/soap/php_http.h b/ext/soap/php_http.h
index 8065fef7c9..685d9da180 100644
--- a/ext/soap/php_http.h
+++ b/ext/soap/php_http.h
@@ -29,8 +29,8 @@ int make_http_soap_request(zval *this_ptr,
int proxy_authentication(zval* this_ptr, smart_str* soap_headers);
int basic_authentication(zval* this_ptr, smart_str* soap_headers);
void http_context_headers(php_stream_context* context,
- zend_bool has_authorization,
- zend_bool has_proxy_authorization,
- zend_bool has_cookies,
+ bool has_authorization,
+ bool has_proxy_authorization,
+ bool has_cookies,
smart_str* soap_headers);
#endif
diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c
index a271ca8fcd..11c030afdd 100644
--- a/ext/soap/php_sdl.c
+++ b/ext/soap/php_sdl.c
@@ -2117,11 +2117,8 @@ static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr s
HashTable tmp_bindings;
HashTable tmp_functions;
-#ifdef ZEND_WIN32
f = open(fn,O_CREAT|O_WRONLY|O_EXCL|O_BINARY,S_IREAD|S_IWRITE);
-#else
- f = open(fn,O_CREAT|O_WRONLY|O_EXCL|O_BINARY,S_IREAD|S_IWRITE);
-#endif
+
if (f < 0) {return;}
zend_hash_init(&tmp_types, 0, NULL, NULL, 0);
@@ -3170,8 +3167,8 @@ sdlPtr get_sdl(zval *this_ptr, char *uri, zend_long cache_wsdl)
smart_str headers = {0};
char* key = NULL;
time_t t = time(0);
- zend_bool has_proxy_authorization = 0;
- zend_bool has_authorization = 0;
+ bool has_proxy_authorization = 0;
+ bool has_authorization = 0;
ZVAL_UNDEF(&orig_context);
ZVAL_UNDEF(&new_context);
diff --git a/ext/soap/php_sdl.h b/ext/soap/php_sdl.h
index bd55a9618c..e3b222ebdc 100644
--- a/ext/soap/php_sdl.h
+++ b/ext/soap/php_sdl.h
@@ -58,7 +58,7 @@ struct _sdl {
HashTable *groups; /* array of sdlTypesPtr */
char *target_ns;
char *source;
- zend_bool is_persistent;
+ bool is_persistent;
};
typedef struct sdlCtx {
diff --git a/ext/soap/php_soap.h b/ext/soap/php_soap.h
index 652174fb3d..0b30e7ea9c 100644
--- a/ext/soap/php_soap.h
+++ b/ext/soap/php_soap.h
@@ -159,7 +159,7 @@ ZEND_BEGIN_MODULE_GLOBALS(soap)
int cur_uniq_ns;
int soap_version;
sdlPtr sdl;
- zend_bool use_soap_error_handler;
+ bool use_soap_error_handler;
char* error_code;
zval error_object;
char cache;
diff --git a/ext/soap/php_xml.c b/ext/soap/php_xml.c
index e290786f7a..bc6a6a1638 100644
--- a/ext/soap/php_xml.c
+++ b/ext/soap/php_xml.c
@@ -78,7 +78,7 @@ xmlDocPtr soap_xmlParseFile(const char *filename)
{
xmlParserCtxtPtr ctxt = NULL;
xmlDocPtr ret;
- zend_bool old_allow_url_fopen;
+ bool old_allow_url_fopen;
/*
xmlInitParser();
@@ -89,7 +89,7 @@ xmlDocPtr soap_xmlParseFile(const char *filename)
ctxt = xmlCreateFileParserCtxt(filename);
PG(allow_url_fopen) = old_allow_url_fopen;
if (ctxt) {
- zend_bool old;
+ bool old;
ctxt->keepBlanks = 0;
ctxt->sax->ignorableWhitespace = soap_ignorableWhitespace;
@@ -137,7 +137,7 @@ xmlDocPtr soap_xmlParseMemory(const void *buf, size_t buf_size)
*/
ctxt = xmlCreateMemoryParserCtxt(buf, buf_size);
if (ctxt) {
- zend_bool old;
+ bool old;
ctxt->sax->ignorableWhitespace = soap_ignorableWhitespace;
ctxt->sax->comment = soap_Comment;
diff --git a/ext/soap/soap.c b/ext/soap/soap.c
index 57a08eb3d2..b1423bc60a 100644
--- a/ext/soap/soap.c
+++ b/ext/soap/soap.c
@@ -71,7 +71,7 @@ static void delete_hashtable(void *hashtable);
static void soap_error_handler(int error_num, const char *error_filename, const uint32_t error_lineno, zend_string *message);
#define SOAP_SERVER_BEGIN_CODE() \
- zend_bool _old_handler = SOAP_GLOBAL(use_soap_error_handler);\
+ bool _old_handler = SOAP_GLOBAL(use_soap_error_handler);\
char* _old_error_code = SOAP_GLOBAL(error_code);\
zend_object* _old_error_object = Z_OBJ(SOAP_GLOBAL(error_object));\
int _old_soap_version = SOAP_GLOBAL(soap_version);\
@@ -86,11 +86,11 @@ static void soap_error_handler(int error_num, const char *error_filename, const
SOAP_GLOBAL(soap_version) = _old_soap_version;
#define SOAP_CLIENT_BEGIN_CODE() \
- zend_bool _old_handler = SOAP_GLOBAL(use_soap_error_handler);\
+ bool _old_handler = SOAP_GLOBAL(use_soap_error_handler);\
char* _old_error_code = SOAP_GLOBAL(error_code);\
zend_object* _old_error_object = Z_OBJ(SOAP_GLOBAL(error_object));\
int _old_soap_version = SOAP_GLOBAL(soap_version);\
- zend_bool _old_in_compilation = CG(in_compilation); \
+ bool _old_in_compilation = CG(in_compilation); \
zend_execute_data *_old_current_execute_data = EG(current_execute_data); \
zval *_old_stack_top = EG(vm_stack_top); \
int _bailout = 0;\
@@ -166,13 +166,6 @@ ZEND_DECLARE_MODULE_GLOBALS(soap)
static void (*old_error_handler)(int, const char *, const uint32_t, zend_string *);
-#define PHP_SOAP_SERVER_CLASSNAME "SoapServer"
-#define PHP_SOAP_CLIENT_CLASSNAME "SoapClient"
-#define PHP_SOAP_VAR_CLASSNAME "SoapVar"
-#define PHP_SOAP_FAULT_CLASSNAME "SoapFault"
-#define PHP_SOAP_PARAM_CLASSNAME "SoapParam"
-#define PHP_SOAP_HEADER_CLASSNAME "SoapHeader"
-
PHP_RINIT_FUNCTION(soap);
PHP_MINIT_FUNCTION(soap);
PHP_MSHUTDOWN_FUNCTION(soap);
@@ -361,39 +354,27 @@ static void delete_hashtable_res(zend_resource *res)
PHP_MINIT_FUNCTION(soap)
{
- zend_class_entry ce;
-
/* TODO: add ini entry for always use soap errors */
php_soap_prepare_globals();
ZEND_INIT_MODULE_GLOBALS(soap, php_soap_init_globals, NULL);
REGISTER_INI_ENTRIES();
/* Register SoapClient class */
- /* BIG NOTE : THIS EMITS AN COMPILATION WARNING UNDER ZE2 - handle_function_call deprecated.
- soap_call_function_handler should be of type zend_function, not (*handle_function_call).
- */
- {
- INIT_CLASS_ENTRY(ce, PHP_SOAP_CLIENT_CLASSNAME, class_SoapClient_methods);
- soap_class_entry = zend_register_internal_class(&ce);
- }
+ soap_class_entry = register_class_SoapClient();
+
/* Register SoapVar class */
- INIT_CLASS_ENTRY(ce, PHP_SOAP_VAR_CLASSNAME, class_SoapVar_methods);
- soap_var_class_entry = zend_register_internal_class(&ce);
+ soap_var_class_entry = register_class_SoapVar();
/* Register SoapServer class */
- INIT_CLASS_ENTRY(ce, PHP_SOAP_SERVER_CLASSNAME, class_SoapServer_methods);
- soap_server_class_entry = zend_register_internal_class(&ce);
+ soap_server_class_entry = register_class_SoapServer();
/* Register SoapFault class */
- INIT_CLASS_ENTRY(ce, PHP_SOAP_FAULT_CLASSNAME, class_SoapFault_methods);
- soap_fault_class_entry = zend_register_internal_class_ex(&ce, zend_ce_exception);
+ soap_fault_class_entry = register_class_SoapFault(zend_ce_exception);
/* Register SoapParam class */
- INIT_CLASS_ENTRY(ce, PHP_SOAP_PARAM_CLASSNAME, class_SoapParam_methods);
- soap_param_class_entry = zend_register_internal_class(&ce);
+ soap_param_class_entry = register_class_SoapParam();
- INIT_CLASS_ENTRY(ce, PHP_SOAP_HEADER_CLASSNAME, class_SoapHeader_methods);
- soap_header_class_entry = zend_register_internal_class(&ce);
+ soap_header_class_entry = register_class_SoapHeader();
le_sdl = zend_register_list_destructors_ex(delete_sdl_res, NULL, "SOAP SDL", module_number);
le_url = zend_register_list_destructors_ex(delete_url_res, NULL, "SOAP URL", module_number);
@@ -544,10 +525,10 @@ PHP_METHOD(SoapHeader, __construct)
zval *data = NULL;
zend_string *actor_str = NULL;
zend_long actor_long;
- zend_bool actor_is_null = 1;
+ bool actor_is_null = 1;
char *name, *ns;
size_t name_len, ns_len;
- zend_bool must_understand = 0;
+ bool must_understand = 0;
zval *this_ptr;
ZEND_PARSE_PARAMETERS_START(2, 5)
@@ -689,7 +670,7 @@ PHP_METHOD(SoapVar, __construct)
{
zval *data, *this_ptr;
zend_long type;
- zend_bool type_is_null = 1;
+ bool type_is_null = 1;
char *stype = NULL, *ns = NULL, *name = NULL, *namens = NULL;
size_t stype_len = 0, ns_len = 0, name_len = 0, namens_len = 0;
@@ -1294,9 +1275,9 @@ PHP_METHOD(SoapServer, handle)
(encoding = zend_hash_str_find(Z_ARRVAL_P(server_vars), "HTTP_CONTENT_ENCODING", sizeof("HTTP_CONTENT_ENCODING")-1)) != NULL &&
Z_TYPE_P(encoding) == IS_STRING) {
- if (strcmp(Z_STRVAL_P(encoding),"gzip") == 0
- || strcmp(Z_STRVAL_P(encoding),"x-gzip") == 0
- || strcmp(Z_STRVAL_P(encoding),"deflate") == 0
+ if (zend_string_equals_literal(Z_STR_P(encoding), "gzip")
+ || zend_string_equals_literal(Z_STR_P(encoding), "x-gzip")
+ || zend_string_equals_literal(Z_STR_P(encoding), "deflate")
) {
zval filter_params;
@@ -1823,7 +1804,7 @@ static ZEND_NORETURN void soap_server_fault(char* code, char* string, char *acto
static zend_never_inline ZEND_COLD void soap_real_error_handler(int error_num, const char *error_filename, const uint32_t error_lineno, zend_string *message) /* {{{ */
{
- zend_bool _old_in_compilation;
+ bool _old_in_compilation;
zend_execute_data *_old_current_execute_data;
int _old_http_response_code;
char *_old_http_status_line;
@@ -1935,7 +1916,7 @@ static void soap_error_handler(int error_num, const char *error_filename, const
/* {{{ */
PHP_FUNCTION(use_soap_error_handler)
{
- zend_bool handler = 1;
+ bool handler = 1;
ZVAL_BOOL(return_value, SOAP_GLOBAL(use_soap_error_handler));
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &handler) == SUCCESS) {
@@ -2188,7 +2169,7 @@ PHP_METHOD(SoapClient, __construct)
}
/* }}} */
-static int do_request(zval *this_ptr, xmlDoc *request, char *location, char *action, int version, zend_bool one_way, zval *response) /* {{{ */
+static int do_request(zval *this_ptr, xmlDoc *request, char *location, char *action, int version, bool one_way, zval *response) /* {{{ */
{
int ret = TRUE;
char *buf;
@@ -2357,7 +2338,7 @@ static void do_soap_call(zend_execute_data *execute_data,
fn = get_function(sdl, function);
if (fn != NULL) {
sdlBindingPtr binding = fn->binding;
- zend_bool one_way = 0;
+ bool one_way = 0;
if (fn->responseName == NULL &&
fn->responseParameters == NULL &&
@@ -2498,7 +2479,7 @@ static void verify_soap_headers_array(HashTable *ht) /* {{{ */
/* }}} */
/* {{{ Calls a SOAP function */
-void soap_client_call_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_soap_call)
+void soap_client_call_impl(INTERNAL_FUNCTION_PARAMETERS, bool is_soap_call)
{
char *function, *location=NULL, *soap_action = NULL, *uri = NULL;
size_t function_len;
@@ -2512,7 +2493,7 @@ void soap_client_call_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_soap_call)
zval *param;
int arg_count;
zval *tmp;
- zend_bool free_soap_headers = 0;
+ bool free_soap_headers = 0;
zval *this_ptr;
if (is_soap_call) {
@@ -2755,7 +2736,7 @@ PHP_METHOD(SoapClient, __doRequest)
char *location, *action;
size_t location_size, action_size;
zend_long version;
- zend_bool one_way = 0;
+ bool one_way = 0;
zval *this_ptr = ZEND_THIS;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sssl|b",
diff --git a/ext/soap/soap.stub.php b/ext/soap/soap.stub.php
index 01e41b7e87..1e92dca751 100644
--- a/ext/soap/soap.stub.php
+++ b/ext/soap/soap.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function use_soap_error_handler(bool $enable = true): bool {}
diff --git a/ext/soap/soap_arginfo.h b/ext/soap/soap_arginfo.h
index da80ca6fdf..e656a15cbe 100644
--- a/ext/soap/soap_arginfo.h
+++ b/ext/soap/soap_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: c0d32b2d8f3c39203b437a01dc79cd4e934dc9f7 */
+ * Stub hash: b4f2354707bc7b992a3574f820edb329b16dd49e */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_use_soap_error_handler, 0, 0, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, enable, _IS_BOOL, 0, "true")
@@ -230,3 +230,63 @@ static const zend_function_entry class_SoapClient_methods[] = {
ZEND_ME(SoapClient, __setLocation, arginfo_class_SoapClient___setLocation, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SoapParam(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SoapParam", class_SoapParam_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SoapHeader(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SoapHeader", class_SoapHeader_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SoapFault(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SoapFault", class_SoapFault_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SoapVar(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SoapVar", class_SoapVar_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SoapServer(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SoapServer", class_SoapServer_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SoapClient(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SoapClient", class_SoapClient_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/soap/tests/bug73037.phpt b/ext/soap/tests/bug73037.phpt
index 4e72932862..8060575bd8 100644
--- a/ext/soap/tests/bug73037.phpt
+++ b/ext/soap/tests/bug73037.phpt
@@ -1,7 +1,5 @@
--TEST--
Bug #73037 SoapServer reports Bad Request when gzipped, var 0
---CONFLICTS--
-server
--SKIPIF--
<?php
require_once('skipif.inc');
diff --git a/ext/soap/tests/classmap003.phpt b/ext/soap/tests/classmap003.phpt
index 3150c4be81..c7ea7a02dd 100644
--- a/ext/soap/tests/classmap003.phpt
+++ b/ext/soap/tests/classmap003.phpt
@@ -49,6 +49,6 @@ print_r($client->f());
--EXPECT--
B Object
(
- [y] => 6
[x] => 5
+ [y] => 6
)
diff --git a/ext/soap/tests/custom_content_type.phpt b/ext/soap/tests/custom_content_type.phpt
index 17a074f102..9172d3d6ca 100644
--- a/ext/soap/tests/custom_content_type.phpt
+++ b/ext/soap/tests/custom_content_type.phpt
@@ -8,8 +8,6 @@ SOAP customized Content-Type, eg. SwA use case
echo "skip sapi/cli/tests/php_cli_server.inc required but not found";
}
?>
---CONFLICTS--
-server
--FILE--
<?php
diff --git a/ext/sockets/multicast.c b/ext/sockets/multicast.c
index 321efdc403..86ec5c14b6 100644
--- a/ext/sockets/multicast.c
+++ b/ext/sockets/multicast.c
@@ -159,7 +159,7 @@ mcast_req_fun: ;
php_sockaddr_storage group = {0};
socklen_t glen;
- convert_to_array_ex(arg4);
+ convert_to_array(arg4);
opt_ht = Z_ARRVAL_P(arg4);
if (php_get_address_from_array(opt_ht, "group", php_sock, &group,
@@ -195,7 +195,7 @@ mcast_req_fun: ;
socklen_t glen,
slen;
- convert_to_array_ex(arg4);
+ convert_to_array(arg4);
opt_ht = Z_ARRVAL_P(arg4);
if (php_get_address_from_array(opt_ht, "group", php_sock, &group,
@@ -272,12 +272,12 @@ int php_do_setsockopt_ip_mcast(php_socket *php_sock,
goto dosockopt;
case IP_MULTICAST_LOOP:
- convert_to_boolean_ex(arg4);
+ convert_to_boolean(arg4);
ipv4_mcast_ttl_lback = (unsigned char) (Z_TYPE_P(arg4) == IS_TRUE);
goto ipv4_loop_ttl;
case IP_MULTICAST_TTL:
- convert_to_long_ex(arg4);
+ convert_to_long(arg4);
if (Z_LVAL_P(arg4) < 0L || Z_LVAL_P(arg4) > 255L) {
zend_argument_value_error(4, "must be between 0 and 255");
return FAILURE;
@@ -337,11 +337,11 @@ int php_do_setsockopt_ipv6_mcast(php_socket *php_sock,
goto dosockopt;
case IPV6_MULTICAST_LOOP:
- convert_to_boolean_ex(arg4);
+ convert_to_boolean(arg4);
ov = (int) Z_TYPE_P(arg4) == IS_TRUE;
goto ipv6_loop_hops;
case IPV6_MULTICAST_HOPS:
- convert_to_long_ex(arg4);
+ convert_to_long(arg4);
if (Z_LVAL_P(arg4) < -1L || Z_LVAL_P(arg4) > 255L) {
zend_argument_value_error(4, "must be between -1 and 255");
return FAILURE;
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c
index 16ad3e8013..c41123dd94 100644
--- a/ext/sockets/sockets.c
+++ b/ext/sockets/sockets.c
@@ -432,10 +432,7 @@ static PHP_MINIT_FUNCTION(sockets)
ZEND_TSRMLS_CACHE_UPDATE();
#endif
- zend_class_entry ce_socket;
- INIT_CLASS_ENTRY(ce_socket, "Socket", class_Socket_methods);
- socket_ce = zend_register_internal_class(&ce_socket);
- socket_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ socket_ce = register_class_Socket();
socket_ce->create_object = socket_create_object;
socket_ce->serialize = zend_class_serialize_deny;
socket_ce->unserialize = zend_class_unserialize_deny;
@@ -448,10 +445,7 @@ static PHP_MINIT_FUNCTION(sockets)
socket_object_handlers.get_gc = socket_get_gc;
socket_object_handlers.compare = zend_objects_not_comparable;
- zend_class_entry ce_address_info;
- INIT_CLASS_ENTRY(ce_address_info, "AddressInfo", class_AddressInfo_methods);
- address_info_ce = zend_register_internal_class(&ce_address_info);
- address_info_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ address_info_ce = register_class_AddressInfo();
address_info_ce->create_object = address_info_create_object;
address_info_ce->serialize = zend_class_serialize_deny;
address_info_ce->unserialize = zend_class_unserialize_deny;
@@ -728,7 +722,7 @@ PHP_FUNCTION(socket_select)
PHP_SOCKET max_fd = 0;
int retval, sets = 0;
zend_long sec, usec = 0;
- zend_bool sec_is_null = 0;
+ bool sec_is_null = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "a!a!a!l!|l", &r_array, &w_array, &e_array, &sec, &sec_is_null, &usec) == FAILURE) {
RETURN_THROWS();
@@ -980,7 +974,7 @@ PHP_FUNCTION(socket_write)
int retval;
size_t str_len;
zend_long length = 0;
- zend_bool length_is_null = 1;
+ bool length_is_null = 1;
char *str;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|l!", &arg1, socket_ce, &str, &str_len, &length, &length_is_null) == FAILURE) {
@@ -1046,11 +1040,7 @@ PHP_FUNCTION(socket_read)
if (retval == -1) {
/* if the socket is in non-blocking mode and there's no data to read,
don't output any error, as this is a normal situation, and not an error */
- if (errno == EAGAIN
-#ifdef EWOULDBLOCK
- || errno == EWOULDBLOCK
-#endif
- ) {
+ if (PHP_IS_TRANSIENT_ERROR(errno)) {
php_sock->error = errno;
SOCKETS_G(last_error) = errno;
} else {
@@ -1271,7 +1261,7 @@ PHP_FUNCTION(socket_connect)
int retval;
size_t addr_len;
zend_long port;
- zend_bool port_is_null = 1;
+ bool port_is_null = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|l!", &resource_socket, socket_ce, &addr, &addr_len, &port, &port_is_null) == FAILURE) {
RETURN_THROWS();
@@ -1647,7 +1637,7 @@ PHP_FUNCTION(socket_sendto)
int retval;
size_t buf_len, addr_len;
zend_long len, flags, port;
- zend_bool port_is_null = 1;
+ bool port_is_null = 1;
char *buf, *addr;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oslls|l!", &arg1, socket_ce, &buf, &buf_len, &len, &flags, &addr, &addr_len, &port, &port_is_null) == FAILURE) {
@@ -1883,7 +1873,7 @@ PHP_FUNCTION(socket_set_option)
const char l_onoff_key[] = "l_onoff";
const char l_linger_key[] = "l_linger";
- convert_to_array_ex(arg4);
+ convert_to_array(arg4);
opt_ht = Z_ARRVAL_P(arg4);
if ((l_onoff = zend_hash_str_find(opt_ht, l_onoff_key, sizeof(l_onoff_key) - 1)) == NULL) {
@@ -1895,8 +1885,8 @@ PHP_FUNCTION(socket_set_option)
RETURN_THROWS();
}
- convert_to_long_ex(l_onoff);
- convert_to_long_ex(l_linger);
+ convert_to_long(l_onoff);
+ convert_to_long(l_linger);
lv.l_onoff = (unsigned short)Z_LVAL_P(l_onoff);
lv.l_linger = (unsigned short)Z_LVAL_P(l_linger);
@@ -1911,7 +1901,7 @@ PHP_FUNCTION(socket_set_option)
const char sec_key[] = "sec";
const char usec_key[] = "usec";
- convert_to_array_ex(arg4);
+ convert_to_array(arg4);
opt_ht = Z_ARRVAL_P(arg4);
if ((sec = zend_hash_str_find(opt_ht, sec_key, sizeof(sec_key) - 1)) == NULL) {
@@ -1923,8 +1913,8 @@ PHP_FUNCTION(socket_set_option)
RETURN_THROWS();
}
- convert_to_long_ex(sec);
- convert_to_long_ex(usec);
+ convert_to_long(sec);
+ convert_to_long(usec);
#ifndef PHP_WIN32
tv.tv_sec = Z_LVAL_P(sec);
tv.tv_usec = Z_LVAL_P(usec);
@@ -1952,7 +1942,7 @@ PHP_FUNCTION(socket_set_option)
default:
default_case:
- convert_to_long_ex(arg4);
+ convert_to_long(arg4);
ov = Z_LVAL_P(arg4);
optlen = sizeof(ov);
diff --git a/ext/sockets/sockets.stub.php b/ext/sockets/sockets.stub.php
index b345163bc7..967041e98e 100644
--- a/ext/sockets/sockets.stub.php
+++ b/ext/sockets/sockets.stub.php
@@ -1,11 +1,13 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+/** @strict-properties */
final class Socket
{
}
+/** @strict-properties */
final class AddressInfo
{
}
diff --git a/ext/sockets/sockets_arginfo.h b/ext/sockets/sockets_arginfo.h
index 343c19a563..2395fe0013 100644
--- a/ext/sockets/sockets_arginfo.h
+++ b/ext/sockets/sockets_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 90c3c470833947859433a2668d328fddfff94ae9 */
+ * Stub hash: aed25e8e90959fde6a454cf3b8d648feaf0ebad7 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_socket_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(1, read, IS_ARRAY, 1)
@@ -321,3 +321,25 @@ static const zend_function_entry class_Socket_methods[] = {
static const zend_function_entry class_AddressInfo_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Socket(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Socket", class_Socket_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_AddressInfo(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "AddressInfo", class_AddressInfo_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/sockets/tests/socket_create_pair-wrongparams-win32.phpt b/ext/sockets/tests/socket_create_pair-wrongparams-win32.phpt
index ff4dd5de06..399563fde1 100644
--- a/ext/sockets/tests/socket_create_pair-wrongparams-win32.phpt
+++ b/ext/sockets/tests/socket_create_pair-wrongparams-win32.phpt
@@ -11,10 +11,10 @@ if (!extension_loaded('sockets')) {
--FILE--
<?php
-var_dump(socket_create_pair(AF_INET, null, null, $sockets));
+var_dump(socket_create_pair(AF_INET, 0, 0, $sockets));
try {
- var_dump(socket_create_pair(31337, null, null, $sockets));
+ var_dump(socket_create_pair(31337, 0, 0, $sockets));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
diff --git a/ext/sockets/tests/socket_create_pair-wrongparams.phpt b/ext/sockets/tests/socket_create_pair-wrongparams.phpt
index 57111c83f1..d6a4d4562d 100644
--- a/ext/sockets/tests/socket_create_pair-wrongparams.phpt
+++ b/ext/sockets/tests/socket_create_pair-wrongparams.phpt
@@ -11,10 +11,10 @@ if (!extension_loaded('sockets')) {
--FILE--
<?php
-var_dump(socket_create_pair(AF_INET, null, null, $sockets));
+var_dump(socket_create_pair(AF_INET, 0, 0, $sockets));
try {
- var_dump(socket_create_pair(31337, null, null, $sockets));
+ var_dump(socket_create_pair(31337, 0, 0, $sockets));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
diff --git a/ext/sodium/config.m4 b/ext/sodium/config.m4
index 0676b66910..05d9ebd5a1 100644
--- a/ext/sodium/config.m4
+++ b/ext/sodium/config.m4
@@ -11,8 +11,9 @@ if test "$PHP_SODIUM" != "no"; then
AC_DEFINE(HAVE_LIBSODIUMLIB, 1, [ ])
- dnl Add -Wno-type-limits as this may arise on 32bits platforms
+ dnl Add -Wno-type-limits and -Wno-logical-op as this may arise on 32bits platforms
SODIUM_COMPILER_FLAGS="$LIBSODIUM_CFLAGS -Wno-type-limits"
+ AX_CHECK_COMPILE_FLAG([-Wno-logical-op], SODIUM_COMPILER_FLAGS="$SODIUM_COMPILER_FLAGS -Wno-logical-op", , [-Werror])
PHP_NEW_EXTENSION(sodium, libsodium.c sodium_pwhash.c, $ext_shared, , $SODIUM_COMPILER_FLAGS)
PHP_SUBST(SODIUM_SHARED_LIBADD)
fi
diff --git a/ext/sodium/libsodium.c b/ext/sodium/libsodium.c
index bbe88ba206..7cdae32468 100644
--- a/ext/sodium/libsodium.c
+++ b/ext/sodium/libsodium.c
@@ -129,14 +129,11 @@ static void sodium_separate_string(zval *zv) {
PHP_MINIT_FUNCTION(sodium)
{
- zend_class_entry ce;
-
if (sodium_init() < 0) {
zend_error(E_ERROR, "sodium_init()");
}
- INIT_CLASS_ENTRY(ce, "SodiumException", NULL);
- sodium_exception_ce = zend_register_internal_class_ex(&ce, zend_ce_exception);
+ sodium_exception_ce = register_class_SodiumException(zend_ce_exception);
sodium_exception_ce->create_object = sodium_exception_create_object;
REGISTER_STRING_CONSTANT("SODIUM_LIBRARY_VERSION",
diff --git a/ext/sodium/libsodium.stub.php b/ext/sodium/libsodium.stub.php
index e8f7b54ca2..a4029d04d0 100644
--- a/ext/sodium/libsodium.stub.php
+++ b/ext/sodium/libsodium.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function sodium_crypto_aead_aes256gcm_is_available(): bool {}
diff --git a/ext/sodium/libsodium_arginfo.h b/ext/sodium/libsodium_arginfo.h
index 07b78aba74..aad970b37e 100644
--- a/ext/sodium/libsodium_arginfo.h
+++ b/ext/sodium/libsodium_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: b34401e98646f1e85a8dd292477cac68c6e4ac97 */
+ * Stub hash: 457c4c5a0243f815d859bdc9728709b4a8dc84d7 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sodium_crypto_aead_aes256gcm_is_available, 0, 0, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
@@ -666,3 +666,13 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_SodiumException_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SodiumException(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SodiumException", class_SodiumException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+
+ return class_entry;
+}
diff --git a/ext/sodium/sodium_pwhash.c b/ext/sodium/sodium_pwhash.c
index e58a9514cc..174d1546de 100644
--- a/ext/sodium/sodium_pwhash.c
+++ b/ext/sodium/sodium_pwhash.c
@@ -95,14 +95,14 @@ static zend_string *php_sodium_argon2_hash(const zend_string *password, zend_arr
return ret;
}
-static zend_bool php_sodium_argon2_verify(const zend_string *password, const zend_string *hash) {
+static bool php_sodium_argon2_verify(const zend_string *password, const zend_string *hash) {
if ((ZSTR_LEN(password) >= 0xffffffff) || (ZSTR_LEN(hash) >= 0xffffffff)) {
return 0;
}
return crypto_pwhash_str_verify(ZSTR_VAL(hash), ZSTR_VAL(password), ZSTR_LEN(password)) == 0;
}
-static zend_bool php_sodium_argon2_needs_rehash(const zend_string *hash, zend_array *options) {
+static bool php_sodium_argon2_needs_rehash(const zend_string *hash, zend_array *options) {
size_t opslimit, memlimit;
if (get_options(options, &memlimit, &opslimit) == FAILURE) {
diff --git a/ext/sodium/tests/bug78114.phpt b/ext/sodium/tests/bug78114.phpt
index 6d7df4348f..b988c09ec2 100644
--- a/ext/sodium/tests/bug78114.phpt
+++ b/ext/sodium/tests/bug78114.phpt
@@ -1,9 +1,7 @@
--TEST--
Bug #78114 (segfault when calling sodium_* functions from eval)
---SKIPIF--
-<?php
-if (!extension_loaded('sodium')) die('skip sodium extension not available');
-?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
try {
diff --git a/ext/sodium/tests/bug78516.phpt b/ext/sodium/tests/bug78516.phpt
index 0347d33273..90852a6967 100644
--- a/ext/sodium/tests/bug78516.phpt
+++ b/ext/sodium/tests/bug78516.phpt
@@ -1,8 +1,9 @@
--TEST--
Bug #78516 (password_hash(): Memory cost is not in allowed range)
+--EXTENSIONS--
+sodium
--SKIPIF--
<?php
-if (!extension_loaded('sodium')) die('skip sodium extension not available');
if (!defined('PASSWORD_ARGON2ID')) die('skip PASSWORD_ARGON2ID not available');
?>
--FILE--
diff --git a/ext/sodium/tests/crypto_aead.phpt b/ext/sodium/tests/crypto_aead.phpt
index a54a1c7dc6..0da84194bb 100644
--- a/ext/sodium/tests/crypto_aead.phpt
+++ b/ext/sodium/tests/crypto_aead.phpt
@@ -1,8 +1,9 @@
--TEST--
Check for libsodium AEAD
+--EXTENSIONS--
+sodium
--SKIPIF--
<?php
-if (!extension_loaded("sodium")) print "skip extension not loaded";
if (!defined('SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES')) print "skip libsodium without AESGCM";
?>
--FILE--
diff --git a/ext/sodium/tests/crypto_auth.phpt b/ext/sodium/tests/crypto_auth.phpt
index 58d8350078..8f262414be 100644
--- a/ext/sodium/tests/crypto_auth.phpt
+++ b/ext/sodium/tests/crypto_auth.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium auth
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$msg = random_bytes(1000);
diff --git a/ext/sodium/tests/crypto_box.phpt b/ext/sodium/tests/crypto_box.phpt
index 3a55717d53..f77ec1601c 100644
--- a/ext/sodium/tests/crypto_box.phpt
+++ b/ext/sodium/tests/crypto_box.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium box
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$keypair = sodium_crypto_box_keypair();
diff --git a/ext/sodium/tests/crypto_generichash.phpt b/ext/sodium/tests/crypto_generichash.phpt
index 5a7b0c4285..58f519af5c 100644
--- a/ext/sodium/tests/crypto_generichash.phpt
+++ b/ext/sodium/tests/crypto_generichash.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium generichash
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$q = sodium_crypto_generichash('msg');
diff --git a/ext/sodium/tests/crypto_hex.phpt b/ext/sodium/tests/crypto_hex.phpt
index 0f872ee867..3f989a1f11 100644
--- a/ext/sodium/tests/crypto_hex.phpt
+++ b/ext/sodium/tests/crypto_hex.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium bin2hex
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$bin = random_bytes(random_int(1, 1000));
diff --git a/ext/sodium/tests/crypto_kdf.phpt b/ext/sodium/tests/crypto_kdf.phpt
index c9f0949ed0..970a87988d 100644
--- a/ext/sodium/tests/crypto_kdf.phpt
+++ b/ext/sodium/tests/crypto_kdf.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium KDF
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$key = sodium_crypto_kdf_keygen();
diff --git a/ext/sodium/tests/crypto_kx.phpt b/ext/sodium/tests/crypto_kx.phpt
index a1dd00a0a7..5a278f685b 100644
--- a/ext/sodium/tests/crypto_kx.phpt
+++ b/ext/sodium/tests/crypto_kx.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium-based key exchange
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$client_seed = sodium_hex2bin('0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef');
diff --git a/ext/sodium/tests/crypto_scalarmult.phpt b/ext/sodium/tests/crypto_scalarmult.phpt
index 2636963e32..8dda46c99e 100644
--- a/ext/sodium/tests/crypto_scalarmult.phpt
+++ b/ext/sodium/tests/crypto_scalarmult.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium scalarmult
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$n = sodium_hex2bin("5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb");
diff --git a/ext/sodium/tests/crypto_secretbox.phpt b/ext/sodium/tests/crypto_secretbox.phpt
index b9d4d1ccfe..075b0c60e3 100644
--- a/ext/sodium/tests/crypto_secretbox.phpt
+++ b/ext/sodium/tests/crypto_secretbox.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium secretbox
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
diff --git a/ext/sodium/tests/crypto_secretstream.phpt b/ext/sodium/tests/crypto_secretstream.phpt
index 24896e15b2..1267ecd8af 100644
--- a/ext/sodium/tests/crypto_secretstream.phpt
+++ b/ext/sodium/tests/crypto_secretstream.phpt
@@ -1,8 +1,9 @@
--TEST--
Check for libsodium secretstream
+--EXTENSIONS--
+sodium
--SKIPIF--
<?php
-if (!extension_loaded("sodium")) print "skip extension not loaded";
if (!defined('SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES')) print "skip libsodium without secretbytes";
?>
--FILE--
diff --git a/ext/sodium/tests/crypto_shorthash.phpt b/ext/sodium/tests/crypto_shorthash.phpt
index 68bffc823b..c5cc2334a6 100644
--- a/ext/sodium/tests/crypto_shorthash.phpt
+++ b/ext/sodium/tests/crypto_shorthash.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium shorthash
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$m1 = 'message';
diff --git a/ext/sodium/tests/crypto_sign.phpt b/ext/sodium/tests/crypto_sign.phpt
index 14e0c49e91..e1a2343a20 100644
--- a/ext/sodium/tests/crypto_sign.phpt
+++ b/ext/sodium/tests/crypto_sign.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium ed25519 signatures
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$keypair = sodium_crypto_sign_keypair();
diff --git a/ext/sodium/tests/crypto_stream.phpt b/ext/sodium/tests/crypto_stream.phpt
index 27e163c071..46f174e15b 100644
--- a/ext/sodium/tests/crypto_stream.phpt
+++ b/ext/sodium/tests/crypto_stream.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium stream
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$nonce = random_bytes(SODIUM_CRYPTO_STREAM_NONCEBYTES);
diff --git a/ext/sodium/tests/exception_trace_without_args.phpt b/ext/sodium/tests/exception_trace_without_args.phpt
index 4885f93093..aa39d5610f 100644
--- a/ext/sodium/tests/exception_trace_without_args.phpt
+++ b/ext/sodium/tests/exception_trace_without_args.phpt
@@ -1,7 +1,7 @@
--TEST--
SodiumException backtraces do not contain function arguments
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
diff --git a/ext/sodium/tests/inc_add.phpt b/ext/sodium/tests/inc_add.phpt
index 23410d140c..7652cf851e 100644
--- a/ext/sodium/tests/inc_add.phpt
+++ b/ext/sodium/tests/inc_add.phpt
@@ -1,7 +1,7 @@
--TEST--
increment and add edge cases
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
diff --git a/ext/sodium/tests/installed.phpt b/ext/sodium/tests/installed.phpt
index f004efa714..e2c3b73037 100644
--- a/ext/sodium/tests/installed.phpt
+++ b/ext/sodium/tests/installed.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for sodium presence
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
echo "sodium extension is available";
diff --git a/ext/sodium/tests/pwhash_argon2i.phpt b/ext/sodium/tests/pwhash_argon2i.phpt
index aee90bd6fa..90f7730419 100644
--- a/ext/sodium/tests/pwhash_argon2i.phpt
+++ b/ext/sodium/tests/pwhash_argon2i.phpt
@@ -1,7 +1,9 @@
--TEST--
Check for libsodium argon2i
+--EXTENSIONS--
+sodium
--SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip";
+<?php
if (!defined('SODIUM_CRYPTO_PWHASH_SALTBYTES')) print "skip libsodium without argon2i"; ?>
--FILE--
<?php
diff --git a/ext/sodium/tests/pwhash_scrypt.phpt b/ext/sodium/tests/pwhash_scrypt.phpt
index 8e02f7ba0e..59b5647a91 100644
--- a/ext/sodium/tests/pwhash_scrypt.phpt
+++ b/ext/sodium/tests/pwhash_scrypt.phpt
@@ -1,7 +1,9 @@
--TEST--
Check for libsodium scrypt
+--EXTENSIONS--
+sodium
--SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip";
+<?php
if (!defined('SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES')) print "skip libsodium without scrypt"; ?>
--FILE--
<?php
diff --git a/ext/sodium/tests/sodium_error_001.phpt b/ext/sodium/tests/sodium_error_001.phpt
index a78d071a10..b290ebd8a5 100644
--- a/ext/sodium/tests/sodium_error_001.phpt
+++ b/ext/sodium/tests/sodium_error_001.phpt
@@ -1,7 +1,7 @@
--TEST--
TypeErrors will not contain param values in backtrace
---SKIPIF--
-<?php if (!extension_loaded("sodium")) die("skip ext/sodium required"); ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
declare(strict_types=1);
diff --git a/ext/sodium/tests/utils.phpt b/ext/sodium/tests/utils.phpt
index eeca5363e1..66969a60bd 100644
--- a/ext/sodium/tests/utils.phpt
+++ b/ext/sodium/tests/utils.phpt
@@ -1,13 +1,13 @@
--TEST--
Check for libsodium utils
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
$a = 'test';
sodium_memzero($a);
if ($a !== 'test') {
- echo strlen($a);
+ var_dump($a);
} else {
echo $a;
}
@@ -107,7 +107,8 @@ try {
?>
--EXPECT--
-0
+NULL
+
bool(true)
bool(false)
string(22) "0000810102030405060708"
diff --git a/ext/sodium/tests/version.phpt b/ext/sodium/tests/version.phpt
index e9495d7a44..2c8b3a108e 100644
--- a/ext/sodium/tests/version.phpt
+++ b/ext/sodium/tests/version.phpt
@@ -1,7 +1,7 @@
--TEST--
Check for libsodium version
---SKIPIF--
-<?php if (!extension_loaded("sodium")) print "skip"; ?>
+--EXTENSIONS--
+sodium
--FILE--
<?php
echo strlen(SODIUM_LIBRARY_VERSION) >= 5;
diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c
index 09c876b45f..9520fb2a9e 100644
--- a/ext/spl/php_spl.c
+++ b/ext/spl/php_spl.c
@@ -55,7 +55,7 @@ static PHP_GINIT_FUNCTION(spl)
}
/* }}} */
-static zend_class_entry * spl_find_ce_by_name(zend_string *name, zend_bool autoload)
+static zend_class_entry * spl_find_ce_by_name(zend_string *name, bool autoload)
{
zend_class_entry *ce;
@@ -80,7 +80,7 @@ PHP_FUNCTION(class_parents)
{
zval *obj;
zend_class_entry *parent_class, *ce;
- zend_bool autoload = 1;
+ bool autoload = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|b", &obj, &autoload) == FAILURE) {
RETURN_THROWS();
@@ -112,7 +112,7 @@ PHP_FUNCTION(class_parents)
PHP_FUNCTION(class_implements)
{
zval *obj;
- zend_bool autoload = 1;
+ bool autoload = 1;
zend_class_entry *ce;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|b", &obj, &autoload) == FAILURE) {
@@ -140,7 +140,7 @@ PHP_FUNCTION(class_implements)
PHP_FUNCTION(class_uses)
{
zval *obj;
- zend_bool autoload = 1;
+ bool autoload = 1;
zend_class_entry *ce;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|b", &obj, &autoload) == FAILURE) {
@@ -239,20 +239,19 @@ PHP_FUNCTION(spl_classes)
static int spl_autoload(zend_string *class_name, zend_string *lc_name, const char *ext, int ext_len) /* {{{ */
{
- char *class_file;
- int class_file_len;
+ zend_string *class_file;
zval dummy;
zend_file_handle file_handle;
zend_op_array *new_op_array;
zval result;
int ret;
- class_file_len = (int)spprintf(&class_file, 0, "%s%.*s", ZSTR_VAL(lc_name), ext_len, ext);
+ class_file = zend_strpprintf(0, "%s%.*s", ZSTR_VAL(lc_name), ext_len, ext);
#if DEFAULT_SLASH != '\\'
{
- char *ptr = class_file;
- char *end = ptr + class_file_len;
+ char *ptr = ZSTR_VAL(class_file);
+ char *end = ptr + ZSTR_LEN(class_file);
while ((ptr = memchr(ptr, '\\', (end - ptr))) != NULL) {
*ptr = DEFAULT_SLASH;
@@ -260,21 +259,20 @@ static int spl_autoload(zend_string *class_name, zend_string *lc_name, const cha
}
#endif
- ret = php_stream_open_for_zend_ex(class_file, &file_handle, USE_PATH|STREAM_OPEN_FOR_INCLUDE);
+ zend_stream_init_filename_ex(&file_handle, class_file);
+ ret = php_stream_open_for_zend_ex(&file_handle, USE_PATH|STREAM_OPEN_FOR_INCLUDE);
if (ret == SUCCESS) {
zend_string *opened_path;
if (!file_handle.opened_path) {
- file_handle.opened_path = zend_string_init(class_file, class_file_len, 0);
+ file_handle.opened_path = zend_string_copy(class_file);
}
opened_path = zend_string_copy(file_handle.opened_path);
ZVAL_NULL(&dummy);
if (zend_hash_add(&EG(included_files), opened_path, &dummy)) {
new_op_array = zend_compile_file(&file_handle, ZEND_REQUIRE);
- zend_destroy_file_handle(&file_handle);
} else {
new_op_array = NULL;
- zend_file_handle_dtor(&file_handle);
}
zend_string_release_ex(opened_path, 0);
if (new_op_array) {
@@ -287,11 +285,13 @@ static int spl_autoload(zend_string *class_name, zend_string *lc_name, const cha
zval_ptr_dtor(&result);
}
- efree(class_file);
+ zend_destroy_file_handle(&file_handle);
+ zend_string_release(class_file);
return zend_hash_exists(EG(class_table), lc_name);
}
}
- efree(class_file);
+ zend_destroy_file_handle(&file_handle);
+ zend_string_release(class_file);
return 0;
} /* }}} */
@@ -404,7 +404,7 @@ static autoload_func_info *autoload_func_info_from_fci(
return alfi;
}
-static zend_bool autoload_func_info_equals(
+static bool autoload_func_info_equals(
const autoload_func_info *alfi1, const autoload_func_info *alfi2) {
return alfi1->func_ptr == alfi2->func_ptr
&& alfi1->obj == alfi2->obj
@@ -492,8 +492,8 @@ static Bucket *spl_find_registered_function(autoload_func_info *find_alfi) {
/* {{{ Register given function as autoloader */
PHP_FUNCTION(spl_autoload_register)
{
- zend_bool do_throw = 1;
- zend_bool prepend = 0;
+ bool do_throw = 1;
+ bool prepend = 0;
zend_fcall_info fci = {0};
zend_fcall_info_cache fcc;
autoload_func_info *alfi;
@@ -569,9 +569,9 @@ PHP_FUNCTION(spl_autoload_unregister)
zend_fcall_info fci;
zend_fcall_info_cache fcc;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "f", &fci, &fcc) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_FUNC(fci, fcc)
+ ZEND_PARSE_PARAMETERS_END();
if (fcc.function_handler && zend_string_equals_literal(
fcc.function_handler->common.function_name, "spl_autoload_call")) {
@@ -604,17 +604,15 @@ PHP_FUNCTION(spl_autoload_functions)
if (SPL_G(autoload_functions)) {
ZEND_HASH_FOREACH_PTR(SPL_G(autoload_functions), alfi) {
if (alfi->closure) {
- zval obj_zv;
- ZVAL_OBJ_COPY(&obj_zv, alfi->closure);
- add_next_index_zval(return_value, &obj_zv);
+ GC_ADDREF(alfi->closure);
+ add_next_index_object(return_value, alfi->closure);
} else if (alfi->func_ptr->common.scope) {
zval tmp;
array_init(&tmp);
if (alfi->obj) {
- zval obj_zv;
- ZVAL_OBJ_COPY(&obj_zv, alfi->obj);
- add_next_index_zval(&tmp, &obj_zv);
+ GC_ADDREF(alfi->obj);
+ add_next_index_object(&tmp, alfi->obj);
} else {
add_next_index_str(&tmp, zend_string_copy(alfi->ce->name));
}
@@ -630,11 +628,11 @@ PHP_FUNCTION(spl_autoload_functions)
/* {{{ Return hash id for given object */
PHP_FUNCTION(spl_object_hash)
{
- zval *obj;
+ zend_object *obj;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &obj) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_OBJ(obj)
+ ZEND_PARSE_PARAMETERS_END();
RETURN_NEW_STR(php_spl_object_hash(obj));
}
@@ -643,17 +641,17 @@ PHP_FUNCTION(spl_object_hash)
/* {{{ Returns the integer object handle for the given object */
PHP_FUNCTION(spl_object_id)
{
- zval *obj;
+ zend_object *obj;
ZEND_PARSE_PARAMETERS_START(1, 1)
- Z_PARAM_OBJECT(obj)
+ Z_PARAM_OBJ(obj)
ZEND_PARSE_PARAMETERS_END();
- RETURN_LONG((zend_long)Z_OBJ_HANDLE_P(obj));
+ RETURN_LONG((zend_long)obj->handle);
}
/* }}} */
-PHPAPI zend_string *php_spl_object_hash(zval *obj) /* {{{*/
+PHPAPI zend_string *php_spl_object_hash(zend_object *obj) /* {{{*/
{
intptr_t hash_handle, hash_handlers;
@@ -663,7 +661,7 @@ PHPAPI zend_string *php_spl_object_hash(zval *obj) /* {{{*/
SPL_G(hash_mask_init) = 1;
}
- hash_handle = SPL_G(hash_mask_handle)^(intptr_t)Z_OBJ_HANDLE_P(obj);
+ hash_handle = SPL_G(hash_mask_handle)^(intptr_t)obj->handle;
hash_handlers = SPL_G(hash_mask_handlers);
return strpprintf(32, "%016zx%016zx", hash_handle, hash_handlers);
diff --git a/ext/spl/php_spl.h b/ext/spl/php_spl.h
index aebf23ed39..8009cbbb06 100644
--- a/ext/spl/php_spl.h
+++ b/ext/spl/php_spl.h
@@ -62,6 +62,6 @@ ZEND_END_MODULE_GLOBALS(spl)
ZEND_EXTERN_MODULE_GLOBALS(spl)
#define SPL_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(spl, v)
-PHPAPI zend_string *php_spl_object_hash(zval *obj);
+PHPAPI zend_string *php_spl_object_hash(zend_object *obj);
#endif /* PHP_SPL_H */
diff --git a/ext/spl/php_spl.stub.php b/ext/spl/php_spl.stub.php
index 61b2165c9f..e7cc10dbc3 100644
--- a/ext/spl/php_spl.stub.php
+++ b/ext/spl/php_spl.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
/** @param object|string $object_or_class */
function class_implements($object_or_class, bool $autoload = true): array|false {}
diff --git a/ext/spl/php_spl_arginfo.h b/ext/spl/php_spl_arginfo.h
index 5711e6d699..bd2a180764 100644
--- a/ext/spl/php_spl_arginfo.h
+++ b/ext/spl/php_spl_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 920cc4fca334f59316fc4276277958c9738afb3e */
+ * Stub hash: 54d193c03c2652ce40adabd10d88666a86e32728 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_implements, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE)
ZEND_ARG_INFO(0, object_or_class)
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index 76e9fbae2b..83e4f014a1 100644
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -111,7 +111,7 @@ static inline HashTable *spl_array_get_hash_table(spl_array_object* intern) { /*
}
/* }}} */
-static inline zend_bool spl_array_is_object(spl_array_object *intern) /* {{{ */
+static inline bool spl_array_is_object(spl_array_object *intern) /* {{{ */
{
while (intern->ar_flags & SPL_ARRAY_USE_OTHER) {
intern = Z_SPLARRAY_P(&intern->array);
@@ -275,11 +275,74 @@ static zend_object *spl_array_object_clone(zend_object *old_object)
}
/* }}} */
+typedef struct {
+ zend_string *key;
+ zend_ulong h;
+ bool release_key;
+} spl_hash_key;
+
+static void spl_hash_key_release(spl_hash_key *key) {
+ if (key->release_key) {
+ zend_string_release_ex(key->key, 0);
+ }
+}
+
+static zend_result get_hash_key(spl_hash_key *key, spl_array_object *intern, zval *offset)
+{
+ key->release_key = false;
+try_again:
+ switch (Z_TYPE_P(offset)) {
+ case IS_NULL:
+ key->key = ZSTR_EMPTY_ALLOC();
+ return SUCCESS;
+ case IS_STRING:
+ key->key = Z_STR_P(offset);
+ if (ZEND_HANDLE_NUMERIC(key->key, key->h)) {
+ key->key = NULL;
+ break;
+ }
+ return SUCCESS;
+ case IS_RESOURCE:
+ zend_error(E_WARNING, "Resource ID#%d used as offset, casting to integer (%d)",
+ Z_RES_P(offset)->handle, Z_RES_P(offset)->handle);
+ key->key = NULL;
+ key->h = Z_RES_P(offset)->handle;
+ break;
+ case IS_DOUBLE:
+ key->key = NULL;
+ key->h = (zend_long) Z_DVAL_P(offset);
+ break;
+ case IS_FALSE:
+ key->key = NULL;
+ key->h = 0;
+ break;
+ case IS_TRUE:
+ key->key = NULL;
+ key->h = 1;
+ break;
+ case IS_LONG:
+ key->key = NULL;
+ key->h = Z_LVAL_P(offset);
+ break;
+ case IS_REFERENCE:
+ ZVAL_DEREF(offset);
+ goto try_again;
+ default:
+ zend_type_error("Illegal offset type");
+ return FAILURE;
+ }
+
+ if (spl_array_is_object(intern)) {
+ key->key = zend_long_to_str(key->h);
+ key->release_key = true;
+ }
+ return SUCCESS;
+}
+
static zval *spl_array_get_dimension_ptr(int check_inherited, spl_array_object *intern, zval *offset, int type) /* {{{ */
{
zval *retval;
- zend_long index;
- zend_string *offset_key;
+ spl_hash_key key;
HashTable *ht = spl_array_get_hash_table(intern);
if (!offset || Z_ISUNDEF_P(offset) || !ht) {
@@ -291,28 +354,27 @@ static zval *spl_array_get_dimension_ptr(int check_inherited, spl_array_object *
return &EG(error_zval);
}
-try_again:
- switch (Z_TYPE_P(offset)) {
- case IS_NULL:
- offset_key = ZSTR_EMPTY_ALLOC();
- goto fetch_dim_string;
- case IS_STRING:
- offset_key = Z_STR_P(offset);
-fetch_dim_string:
- retval = zend_symtable_find(ht, offset_key);
+ if (get_hash_key(&key, intern, offset) == FAILURE) {
+ zend_type_error("Illegal offset type");
+ return (type == BP_VAR_W || type == BP_VAR_RW) ?
+ &EG(error_zval) : &EG(uninitialized_zval);
+ }
+
+ if (key.key) {
+ retval = zend_hash_find(ht, key.key);
if (retval) {
if (Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
switch (type) {
case BP_VAR_R:
- zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(offset_key));
+ zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(key.key));
case BP_VAR_UNSET:
case BP_VAR_IS:
retval = &EG(uninitialized_zval);
break;
case BP_VAR_RW:
- zend_error(E_WARNING,"Undefined array key \"%s\"", ZSTR_VAL(offset_key));
+ zend_error(E_WARNING,"Undefined array key \"%s\"", ZSTR_VAL(key.key));
case BP_VAR_W: {
ZVAL_NULL(retval);
}
@@ -322,63 +384,41 @@ fetch_dim_string:
} else {
switch (type) {
case BP_VAR_R:
- zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(offset_key));
+ zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(key.key));
case BP_VAR_UNSET:
case BP_VAR_IS:
retval = &EG(uninitialized_zval);
break;
case BP_VAR_RW:
- zend_error(E_WARNING,"Undefined array key \"%s\"", ZSTR_VAL(offset_key));
+ zend_error(E_WARNING,"Undefined array key \"%s\"", ZSTR_VAL(key.key));
case BP_VAR_W: {
zval value;
ZVAL_NULL(&value);
- retval = zend_symtable_update(ht, offset_key, &value);
+ retval = zend_hash_update(ht, key.key, &value);
}
}
}
- return retval;
- case IS_RESOURCE:
- zend_error(E_WARNING, "Resource ID#%d used as offset, casting to integer (%d)", Z_RES_P(offset)->handle, Z_RES_P(offset)->handle);
- index = Z_RES_P(offset)->handle;
- goto num_index;
- case IS_DOUBLE:
- index = (zend_long)Z_DVAL_P(offset);
- goto num_index;
- case IS_FALSE:
- index = 0;
- goto num_index;
- case IS_TRUE:
- index = 1;
- goto num_index;
- case IS_LONG:
- index = Z_LVAL_P(offset);
-num_index:
- if ((retval = zend_hash_index_find(ht, index)) == NULL) {
+ spl_hash_key_release(&key);
+ } else {
+ if ((retval = zend_hash_index_find(ht, key.h)) == NULL) {
switch (type) {
case BP_VAR_R:
- zend_error(E_WARNING, "Undefined array key " ZEND_LONG_FMT, index);
+ zend_error(E_WARNING, "Undefined array key " ZEND_LONG_FMT, key.h);
case BP_VAR_UNSET:
case BP_VAR_IS:
retval = &EG(uninitialized_zval);
break;
case BP_VAR_RW:
- zend_error(E_WARNING, "Undefined array key " ZEND_LONG_FMT, index);
+ zend_error(E_WARNING, "Undefined array key " ZEND_LONG_FMT, key.h);
case BP_VAR_W: {
zval value;
ZVAL_NULL(&value);
- retval = zend_hash_index_update(ht, index, &value);
+ retval = zend_hash_index_update(ht, key.h, &value);
}
}
}
- return retval;
- case IS_REFERENCE:
- ZVAL_DEREF(offset);
- goto try_again;
- default:
- zend_type_error("Illegal offset type");
- return (type == BP_VAR_W || type == BP_VAR_RW) ?
- &EG(error_zval) : &EG(uninitialized_zval);
}
+ return retval;
} /* }}} */
static int spl_array_has_dimension(zend_object *object, zval *offset, int check_empty);
@@ -401,11 +441,8 @@ static zval *spl_array_read_dimension_ex(int check_inherited, zend_object *objec
if (!offset) {
ZVAL_UNDEF(&tmp);
offset = &tmp;
- } else {
- SEPARATE_ARG_IF_REF(offset);
}
zend_call_method_with_1_params(object, object->ce, &intern->fptr_offset_get, "offsetGet", rv, offset);
- zval_ptr_dtor(offset);
if (!Z_ISUNDEF_P(rv)) {
return rv;
@@ -438,8 +475,8 @@ static zval *spl_array_read_dimension(zend_object *object, zval *offset, int typ
static void spl_array_write_dimension_ex(int check_inherited, zend_object *object, zval *offset, zval *value) /* {{{ */
{
spl_array_object *intern = spl_array_from_obj(object);
- zend_long index;
HashTable *ht;
+ spl_hash_key key;
if (check_inherited && intern->fptr_offset_set) {
zval tmp;
@@ -447,11 +484,8 @@ static void spl_array_write_dimension_ex(int check_inherited, zend_object *objec
if (!offset) {
ZVAL_NULL(&tmp);
offset = &tmp;
- } else {
- SEPARATE_ARG_IF_REF(offset);
}
zend_call_method_with_2_params(object, object->ce, &intern->fptr_offset_set, "offsetSet", NULL, offset, value);
- zval_ptr_dtor(offset);
return;
}
@@ -461,47 +495,24 @@ static void spl_array_write_dimension_ex(int check_inherited, zend_object *objec
}
Z_TRY_ADDREF_P(value);
- if (!offset) {
+ if (!offset || Z_TYPE_P(offset) == IS_NULL) {
ht = spl_array_get_hash_table(intern);
zend_hash_next_index_insert(ht, value);
return;
}
-try_again:
- switch (Z_TYPE_P(offset)) {
- case IS_STRING:
- ht = spl_array_get_hash_table(intern);
- zend_symtable_update_ind(ht, Z_STR_P(offset), value);
- return;
- case IS_DOUBLE:
- index = (zend_long)Z_DVAL_P(offset);
- goto num_index;
- case IS_RESOURCE:
- index = Z_RES_HANDLE_P(offset);
- goto num_index;
- case IS_FALSE:
- index = 0;
- goto num_index;
- case IS_TRUE:
- index = 1;
- goto num_index;
- case IS_LONG:
- index = Z_LVAL_P(offset);
-num_index:
- ht = spl_array_get_hash_table(intern);
- zend_hash_index_update(ht, index, value);
- return;
- case IS_NULL:
- ht = spl_array_get_hash_table(intern);
- zend_hash_next_index_insert(ht, value);
- return;
- case IS_REFERENCE:
- ZVAL_DEREF(offset);
- goto try_again;
- default:
- zend_type_error("Illegal offset type");
- zval_ptr_dtor(value);
- return;
+ if (get_hash_key(&key, intern, offset) == FAILURE) {
+ zend_type_error("Illegal offset type");
+ zval_ptr_dtor(value);
+ return;
+ }
+
+ ht = spl_array_get_hash_table(intern);
+ if (key.key) {
+ zend_hash_update_ind(ht, key.key, value);
+ spl_hash_key_release(&key);
+ } else {
+ zend_hash_index_update(ht, key.h, value);
}
} /* }}} */
@@ -512,14 +523,12 @@ static void spl_array_write_dimension(zend_object *object, zval *offset, zval *v
static void spl_array_unset_dimension_ex(int check_inherited, zend_object *object, zval *offset) /* {{{ */
{
- zend_long index;
HashTable *ht;
spl_array_object *intern = spl_array_from_obj(object);
+ spl_hash_key key;
if (check_inherited && intern->fptr_offset_del) {
- SEPARATE_ARG_IF_REF(offset);
zend_call_method_with_1_params(object, object->ce, &intern->fptr_offset_del, "offsetUnset", NULL, offset);
- zval_ptr_dtor(offset);
return;
}
@@ -528,65 +537,39 @@ static void spl_array_unset_dimension_ex(int check_inherited, zend_object *objec
return;
}
-try_again:
- switch (Z_TYPE_P(offset)) {
- case IS_STRING:
- ht = spl_array_get_hash_table(intern);
- if (ht == &EG(symbol_table)) {
- if (zend_delete_global_variable(Z_STR_P(offset))) {
- zend_error(E_WARNING,"Undefined array key \"%s\"", Z_STRVAL_P(offset));
- }
- } else {
- zval *data = zend_symtable_find(ht, Z_STR_P(offset));
-
- if (data) {
- if (Z_TYPE_P(data) == IS_INDIRECT) {
- data = Z_INDIRECT_P(data);
- if (Z_TYPE_P(data) == IS_UNDEF) {
- zend_error(E_WARNING,"Undefined array key \"%s\"", Z_STRVAL_P(offset));
- } else {
- zval_ptr_dtor(data);
- ZVAL_UNDEF(data);
- HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND;
- zend_hash_move_forward_ex(ht, spl_array_get_pos_ptr(ht, intern));
- if (spl_array_is_object(intern)) {
- spl_array_skip_protected(intern, ht);
- }
+ if (get_hash_key(&key, intern, offset) == FAILURE) {
+ zend_type_error("Illegal offset type in unset");
+ return;
+ }
+
+ ht = spl_array_get_hash_table(intern);
+ if (key.key) {
+ zval *data = zend_hash_find(ht, key.key);
+ if (data) {
+ if (Z_TYPE_P(data) == IS_INDIRECT) {
+ data = Z_INDIRECT_P(data);
+ if (Z_TYPE_P(data) == IS_UNDEF) {
+ zend_error(E_WARNING,"Undefined array key \"%s\"", ZSTR_VAL(key.key));
+ } else {
+ zval_ptr_dtor(data);
+ ZVAL_UNDEF(data);
+ HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND;
+ zend_hash_move_forward_ex(ht, spl_array_get_pos_ptr(ht, intern));
+ if (spl_array_is_object(intern)) {
+ spl_array_skip_protected(intern, ht);
}
- } else if (zend_symtable_del(ht, Z_STR_P(offset)) == FAILURE) {
- zend_error(E_WARNING,"Undefined array key \"%s\"", Z_STRVAL_P(offset));
}
- } else {
- zend_error(E_WARNING,"Undefined array key \"%s\"", Z_STRVAL_P(offset));
+ } else if (zend_hash_del(ht, key.key) == FAILURE) {
+ zend_error(E_WARNING,"Undefined array key \"%s\"", ZSTR_VAL(key.key));
}
+ } else {
+ zend_error(E_WARNING,"Undefined array key \"%s\"", ZSTR_VAL(key.key));
}
- break;
- case IS_DOUBLE:
- index = (zend_long)Z_DVAL_P(offset);
- goto num_index;
- case IS_RESOURCE:
- index = Z_RES_HANDLE_P(offset);
- goto num_index;
- case IS_FALSE:
- index = 0;
- goto num_index;
- case IS_TRUE:
- index = 1;
- goto num_index;
- case IS_LONG:
- index = Z_LVAL_P(offset);
-num_index:
- ht = spl_array_get_hash_table(intern);
- if (zend_hash_index_del(ht, index) == FAILURE) {
- zend_error(E_WARNING,"Undefined array key " ZEND_LONG_FMT, index);
+ spl_hash_key_release(&key);
+ } else {
+ if (zend_hash_index_del(ht, key.h) == FAILURE) {
+ zend_error(E_WARNING, "Undefined array key " ZEND_LONG_FMT, key.h);
}
- break;
- case IS_REFERENCE:
- ZVAL_DEREF(offset);
- goto try_again;
- default:
- zend_type_error("Illegal offset type in unset");
- return;
}
} /* }}} */
@@ -598,13 +581,10 @@ static void spl_array_unset_dimension(zend_object *object, zval *offset) /* {{{
static int spl_array_has_dimension_ex(int check_inherited, zend_object *object, zval *offset, int check_empty) /* {{{ */
{
spl_array_object *intern = spl_array_from_obj(object);
- zend_long index;
zval rv, *value = NULL, *tmp;
if (check_inherited && intern->fptr_offset_has) {
- SEPARATE_ARG_IF_REF(offset);
zend_call_method_with_1_params(object, object->ce, &intern->fptr_offset_has, "offsetExists", &rv, offset);
- zval_ptr_dtor(offset);
if (zend_is_true(&rv)) {
zval_ptr_dtor(&rv);
@@ -621,48 +601,26 @@ static int spl_array_has_dimension_ex(int check_inherited, zend_object *object,
if (!value) {
HashTable *ht = spl_array_get_hash_table(intern);
+ spl_hash_key key;
-try_again:
- switch (Z_TYPE_P(offset)) {
- case IS_STRING:
- if ((tmp = zend_symtable_find(ht, Z_STR_P(offset))) != NULL) {
- if (check_empty == 2) {
- return 1;
- }
- } else {
- return 0;
- }
- break;
-
- case IS_DOUBLE:
- index = (zend_long)Z_DVAL_P(offset);
- goto num_index;
- case IS_RESOURCE:
- index = Z_RES_HANDLE_P(offset);
- goto num_index;
- case IS_FALSE:
- index = 0;
- goto num_index;
- case IS_TRUE:
- index = 1;
- goto num_index;
- case IS_LONG:
- index = Z_LVAL_P(offset);
-num_index:
- if ((tmp = zend_hash_index_find(ht, index)) != NULL) {
- if (check_empty == 2) {
- return 1;
- }
- } else {
- return 0;
- }
- break;
- case IS_REFERENCE:
- ZVAL_DEREF(offset);
- goto try_again;
- default:
- zend_type_error("Illegal offset type in isset or empty");
- return 0;
+ if (get_hash_key(&key, intern, offset) == FAILURE) {
+ zend_type_error("Illegal offset type in isset or empty");
+ return 0;
+ }
+
+ if (key.key) {
+ tmp = zend_hash_find(ht, key.key);
+ spl_hash_key_release(&key);
+ } else {
+ tmp = zend_hash_index_find(ht, key.h);
+ }
+
+ if (tmp) {
+ if (check_empty == 2) {
+ return 1;
+ }
+ } else {
+ return 0;
}
if (check_empty && check_inherited && intern->fptr_offset_get) {
@@ -673,7 +631,7 @@ num_index:
}
{
- zend_bool result = check_empty ? zend_is_true(value) : Z_TYPE_P(value) != IS_NULL;
+ bool result = check_empty ? zend_is_true(value) : Z_TYPE_P(value) != IS_NULL;
if (value == &rv) {
zval_ptr_dtor(&rv);
}
@@ -769,7 +727,7 @@ static HashTable *spl_array_get_properties_for(zend_object *object, zend_prop_pu
{
spl_array_object *intern = spl_array_from_obj(object);
HashTable *ht;
- zend_bool dup;
+ bool dup;
if (intern->ar_flags & SPL_ARRAY_STD_PROP_LIST) {
return zend_std_get_properties_for(object, purpose);
@@ -1795,8 +1753,8 @@ PHP_METHOD(ArrayObject, __serialize)
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
/* members */
- ZVAL_ARR(&tmp, zend_std_get_properties(&intern->std));
- Z_TRY_ADDREF(tmp);
+ ZVAL_ARR(&tmp, zend_proptable_to_symtable(
+ zend_std_get_properties(&intern->std), /* always_duplicate */ 1));
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
/* iterator class */
@@ -1859,7 +1817,7 @@ PHP_METHOD(ArrayObject, __unserialize)
RETURN_THROWS();
}
- if (!instanceof_function(ce, spl_ce_Iterator)) {
+ if (!instanceof_function(ce, zend_ce_iterator)) {
zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
"Cannot deserialize ArrayObject with iterator class '%s'; this class does not implement the Iterator interface",
ZSTR_VAL(Z_STR_P(iterator_class_zv)));
@@ -1884,11 +1842,9 @@ PHP_METHOD(ArrayObject, __debugInfo)
/* {{{ PHP_MINIT_FUNCTION(spl_array) */
PHP_MINIT_FUNCTION(spl_array)
{
- REGISTER_SPL_STD_CLASS_EX(ArrayObject, spl_array_object_new, class_ArrayObject_methods);
- REGISTER_SPL_IMPLEMENTS(ArrayObject, Aggregate);
- REGISTER_SPL_IMPLEMENTS(ArrayObject, ArrayAccess);
- REGISTER_SPL_IMPLEMENTS(ArrayObject, Serializable);
- REGISTER_SPL_IMPLEMENTS(ArrayObject, Countable);
+ spl_ce_ArrayObject = register_class_ArrayObject(zend_ce_aggregate, zend_ce_arrayaccess, zend_ce_serializable, zend_ce_countable);
+ spl_ce_ArrayObject->create_object = spl_array_object_new;
+
memcpy(&spl_handler_ArrayObject, &std_object_handlers, sizeof(zend_object_handlers));
spl_handler_ArrayObject.offset = XtOffsetOf(spl_array_object, std);
@@ -1912,16 +1868,12 @@ PHP_MINIT_FUNCTION(spl_array)
spl_handler_ArrayObject.dtor_obj = zend_objects_destroy_object;
spl_handler_ArrayObject.free_obj = spl_array_object_free_storage;
- REGISTER_SPL_STD_CLASS_EX(ArrayIterator, spl_array_object_new, class_ArrayIterator_methods);
- REGISTER_SPL_IMPLEMENTS(ArrayIterator, Iterator);
- REGISTER_SPL_IMPLEMENTS(ArrayIterator, ArrayAccess);
- REGISTER_SPL_IMPLEMENTS(ArrayIterator, SeekableIterator);
- REGISTER_SPL_IMPLEMENTS(ArrayIterator, Serializable);
- REGISTER_SPL_IMPLEMENTS(ArrayIterator, Countable);
- memcpy(&spl_handler_ArrayIterator, &spl_handler_ArrayObject, sizeof(zend_object_handlers));
+ spl_ce_ArrayIterator = register_class_ArrayIterator(spl_ce_SeekableIterator, zend_ce_arrayaccess, zend_ce_serializable, zend_ce_countable);
+ spl_ce_ArrayIterator->create_object = spl_array_object_new;
spl_ce_ArrayIterator->get_iterator = spl_array_get_iterator;
spl_ce_ArrayIterator->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR;
+ memcpy(&spl_handler_ArrayIterator, &spl_handler_ArrayObject, sizeof(zend_object_handlers));
REGISTER_SPL_CLASS_CONST_LONG(ArrayObject, "STD_PROP_LIST", SPL_ARRAY_STD_PROP_LIST);
REGISTER_SPL_CLASS_CONST_LONG(ArrayObject, "ARRAY_AS_PROPS", SPL_ARRAY_ARRAY_AS_PROPS);
@@ -1929,8 +1881,8 @@ PHP_MINIT_FUNCTION(spl_array)
REGISTER_SPL_CLASS_CONST_LONG(ArrayIterator, "STD_PROP_LIST", SPL_ARRAY_STD_PROP_LIST);
REGISTER_SPL_CLASS_CONST_LONG(ArrayIterator, "ARRAY_AS_PROPS", SPL_ARRAY_ARRAY_AS_PROPS);
- REGISTER_SPL_SUB_CLASS_EX(RecursiveArrayIterator, ArrayIterator, spl_array_object_new, class_RecursiveArrayIterator_methods);
- REGISTER_SPL_IMPLEMENTS(RecursiveArrayIterator, RecursiveIterator);
+ spl_ce_RecursiveArrayIterator = register_class_RecursiveArrayIterator(spl_ce_ArrayIterator, spl_ce_RecursiveIterator);
+ spl_ce_RecursiveArrayIterator->create_object = spl_array_object_new;
spl_ce_RecursiveArrayIterator->get_iterator = spl_array_get_iterator;
spl_ce_RecursiveArrayIterator->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR;
diff --git a/ext/spl/spl_array.stub.php b/ext/spl/spl_array.stub.php
index 1567d107f2..f6f1427011 100644
--- a/ext/spl/spl_array.stub.php
+++ b/ext/spl/spl_array.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable
{
diff --git a/ext/spl/spl_array_arginfo.h b/ext/spl/spl_array_arginfo.h
index 860b2e363d..8dce2260e2 100644
--- a/ext/spl/spl_array_arginfo.h
+++ b/ext/spl/spl_array_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: da85db1e5e985ddbefaf38598133e3cba46475f2 */
+ * Stub hash: 38cb41de1caa42ba96573cbbd33e5ae971065b8a */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject___construct, 0, 0, 0)
ZEND_ARG_TYPE_MASK(0, array, MAY_BE_ARRAY|MAY_BE_OBJECT, "[]")
@@ -244,3 +244,36 @@ static const zend_function_entry class_RecursiveArrayIterator_methods[] = {
ZEND_ME(RecursiveArrayIterator, getChildren, arginfo_class_RecursiveArrayIterator_getChildren, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_ArrayObject(zend_class_entry *class_entry_IteratorAggregate, zend_class_entry *class_entry_ArrayAccess, zend_class_entry *class_entry_Serializable, zend_class_entry *class_entry_Countable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ArrayObject", class_ArrayObject_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 4, class_entry_IteratorAggregate, class_entry_ArrayAccess, class_entry_Serializable, class_entry_Countable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ArrayIterator(zend_class_entry *class_entry_SeekableIterator, zend_class_entry *class_entry_ArrayAccess, zend_class_entry *class_entry_Serializable, zend_class_entry *class_entry_Countable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ArrayIterator", class_ArrayIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 4, class_entry_SeekableIterator, class_entry_ArrayAccess, class_entry_Serializable, class_entry_Countable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RecursiveArrayIterator(zend_class_entry *class_entry_ArrayIterator, zend_class_entry *class_entry_RecursiveIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RecursiveArrayIterator", class_RecursiveArrayIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_ArrayIterator);
+ zend_class_implements(class_entry, 1, class_entry_RecursiveIterator);
+
+ return class_entry;
+}
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index 236e98b6b4..15d792360f 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -114,18 +114,18 @@ static void spl_filesystem_object_free_storage(zend_object *object) /* {{{ */
zend_object_std_dtor(&intern->std);
- if (intern->_path) {
- efree(intern->_path);
+ if (intern->path) {
+ zend_string_release(intern->path);
}
if (intern->file_name) {
- efree(intern->file_name);
+ zend_string_release(intern->file_name);
}
switch(intern->type) {
case SPL_FS_INFO:
break;
case SPL_FS_DIR:
if (intern->u.dir.sub_path) {
- efree(intern->u.dir.sub_path);
+ zend_string_release(intern->u.dir.sub_path);
}
break;
case SPL_FS_FILE:
@@ -133,7 +133,7 @@ static void spl_filesystem_object_free_storage(zend_object *object) /* {{{ */
efree(intern->u.file.open_mode);
}
if (intern->orig_path) {
- efree(intern->orig_path);
+ zend_string_release(intern->orig_path);
}
spl_filesystem_file_free_line(intern);
break;
@@ -195,37 +195,43 @@ PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, size_
}
#endif
if (len) {
- *len = intern->_path_len;
+ *len = intern->path ? ZSTR_LEN(intern->path) : 0;
}
- return intern->_path;
+ return intern->path ? ZSTR_VAL(intern->path) : NULL;
} /* }}} */
static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *intern) /* {{{ */
{
- char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
+ if (intern->file_name) {
+ /* already known */
+ return SUCCESS;
+ }
switch (intern->type) {
case SPL_FS_INFO:
case SPL_FS_FILE:
- if (!intern->file_name) {
- zend_throw_error(NULL, "Object not initialized");
- return FAILURE;
- }
+ zend_throw_error(NULL, "Object not initialized");
+ return FAILURE;
break;
case SPL_FS_DIR:
{
+ size_t name_len;
size_t path_len = 0;
- char *path = spl_filesystem_object_get_path(intern, &path_len);
- if (intern->file_name) {
- efree(intern->file_name);
- }
+ char *path;
+ char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
+
+ path = spl_filesystem_object_get_path(intern, &path_len);
/* if there is parent path, amend it, otherwise just use the given path as is */
+ name_len = strlen(intern->u.dir.entry.d_name);
if (path_len == 0) {
- intern->file_name_len = spprintf(
- &intern->file_name, 0, "%s", intern->u.dir.entry.d_name);
+ intern->file_name = zend_string_init(intern->u.dir.entry.d_name, name_len, 0);
} else {
- intern->file_name_len = spprintf(
- &intern->file_name, 0, "%s%c%s", path, slash, intern->u.dir.entry.d_name);
+ zend_string *file_name = zend_string_alloc(path_len + 1 + name_len, 0);
+ memcpy(ZSTR_VAL(file_name), path, path_len);
+ ZSTR_VAL(file_name)[path_len] = slash;
+ memcpy(ZSTR_VAL(file_name) + path_len + 1, intern->u.dir.entry.d_name, name_len);
+ ZSTR_VAL(file_name)[path_len + 1 + name_len] = 0;
+ intern->file_name = file_name;
}
}
break;
@@ -235,6 +241,11 @@ static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *int
static int spl_filesystem_dir_read(spl_filesystem_object *intern) /* {{{ */
{
+ if (intern->file_name) {
+ /* invalidate */
+ zend_string_release(intern->file_name);
+ intern->file_name = NULL;
+ }
if (!intern->u.dir.dirp || !php_stream_readdir(intern->u.dir.dirp, &intern->u.dir.entry)) {
intern->u.dir.entry.d_name[0] = '\0';
return 0;
@@ -254,18 +265,17 @@ static inline int spl_filesystem_is_dot(const char * d_name) /* {{{ */
/* {{{ spl_filesystem_dir_open */
/* open a directory resource */
-static void spl_filesystem_dir_open(spl_filesystem_object* intern, char *path)
+static void spl_filesystem_dir_open(spl_filesystem_object* intern, zend_string *path)
{
int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS);
intern->type = SPL_FS_DIR;
- intern->_path_len = strlen(path);
- intern->u.dir.dirp = php_stream_opendir(path, REPORT_ERRORS, FG(default_context));
+ intern->u.dir.dirp = php_stream_opendir(ZSTR_VAL(path), REPORT_ERRORS, FG(default_context));
- if (intern->_path_len > 1 && IS_SLASH_AT(path, intern->_path_len-1)) {
- intern->_path = estrndup(path, --intern->_path_len);
+ if (ZSTR_LEN(path) > 1 && IS_SLASH_AT(ZSTR_VAL(path), ZSTR_LEN(path)-1)) {
+ intern->path = zend_string_init(ZSTR_VAL(path), ZSTR_LEN(path)-1, 0);
} else {
- intern->_path = estrndup(path, intern->_path_len);
+ intern->path = zend_string_copy(path);
}
intern->u.dir.index = 0;
@@ -274,7 +284,7 @@ static void spl_filesystem_dir_open(spl_filesystem_object* intern, char *path)
if (!EG(exception)) {
/* open failed w/out notice (turned to exception due to EH_THROW) */
zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
- "Failed to open directory \"%s\"", path);
+ "Failed to open directory \"%s\"", ZSTR_VAL(path));
}
} else {
do {
@@ -289,8 +299,7 @@ static int spl_filesystem_file_open(spl_filesystem_object *intern, int use_inclu
zval tmp;
intern->type = SPL_FS_FILE;
-
- php_stat(intern->file_name, intern->file_name_len, FS_IS_DIR, &tmp);
+ php_stat(intern->file_name, FS_IS_DIR, &tmp);
if (Z_TYPE(tmp) == IS_TRUE) {
intern->u.file.open_mode = NULL;
intern->file_name = NULL;
@@ -299,11 +308,11 @@ static int spl_filesystem_file_open(spl_filesystem_object *intern, int use_inclu
}
intern->u.file.context = php_stream_context_from_zval(intern->u.file.zcontext, 0);
- intern->u.file.stream = php_stream_open_wrapper_ex(intern->file_name, intern->u.file.open_mode, (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, NULL, intern->u.file.context);
+ intern->u.file.stream = php_stream_open_wrapper_ex(ZSTR_VAL(intern->file_name), intern->u.file.open_mode, (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, NULL, intern->u.file.context);
- if (!intern->file_name_len || !intern->u.file.stream) {
+ if (!ZSTR_LEN(intern->file_name) || !intern->u.file.stream) {
if (!EG(exception)) {
- zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Cannot open file '%s'", intern->file_name_len ? intern->file_name : "");
+ zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Cannot open file '%s'", ZSTR_VAL(intern->file_name));
}
intern->file_name = NULL; /* until here it is not a copy */
intern->u.file.open_mode = NULL;
@@ -317,13 +326,14 @@ static int spl_filesystem_file_open(spl_filesystem_object *intern, int use_inclu
}
*/
- if (intern->file_name_len > 1 && IS_SLASH_AT(intern->file_name, intern->file_name_len-1)) {
- intern->file_name_len--;
+ if (ZSTR_LEN(intern->file_name) > 1 && IS_SLASH_AT(ZSTR_VAL(intern->file_name), ZSTR_LEN(intern->file_name)-1)) {
+ intern->file_name = zend_string_init(ZSTR_VAL(intern->file_name), ZSTR_LEN(intern->file_name)-1, 0);
+ } else {
+ intern->file_name = zend_string_copy(intern->file_name);
}
- intern->orig_path = estrndup(intern->u.file.stream->orig_path, strlen(intern->u.file.stream->orig_path));
+ intern->orig_path = zend_string_init(intern->u.file.stream->orig_path, strlen(intern->u.file.stream->orig_path), 0);
- intern->file_name = estrndup(intern->file_name, intern->file_name_len);
intern->u.file.open_mode = estrndup(intern->u.file.open_mode, intern->u.file.open_mode_len);
/* avoid reference counting in debug mode, thus do it manually */
@@ -363,13 +373,11 @@ static zend_object *spl_filesystem_object_clone(zend_object *old_object)
switch (source->type) {
case SPL_FS_INFO:
- intern->_path_len = source->_path_len;
- intern->_path = estrndup(source->_path, source->_path_len);
- intern->file_name_len = source->file_name_len;
- intern->file_name = estrndup(source->file_name, intern->file_name_len);
+ intern->path = zend_string_copy(source->path);
+ intern->file_name = zend_string_copy(source->file_name);
break;
case SPL_FS_DIR:
- spl_filesystem_dir_open(intern, source->_path);
+ spl_filesystem_dir_open(intern, source->path);
/* read until we hit the position in which we were before */
skip_dots = SPL_HAS_FLAG(source->flags, SPL_FILE_DIR_SKIPDOTS);
for(index = 0; index < source->u.dir.index; ++index) {
@@ -398,58 +406,43 @@ static zend_object *spl_filesystem_object_clone(zend_object *old_object)
}
/* }}} */
-void spl_filesystem_info_set_filename(spl_filesystem_object *intern, char *path, size_t len, size_t use_copy) /* {{{ */
+static void spl_filesystem_info_set_filename(spl_filesystem_object *intern, zend_string *path) /* {{{ */
{
- char *p1, *p2;
+ size_t path_len;
if (intern->file_name) {
- efree(intern->file_name);
+ zend_string_release(intern->file_name);
}
- intern->file_name = use_copy ? estrndup(path, len) : path;
- intern->file_name_len = len;
-
- while (intern->file_name_len > 1 && IS_SLASH_AT(intern->file_name, intern->file_name_len-1)) {
- intern->file_name[intern->file_name_len-1] = 0;
- intern->file_name_len--;
- }
-
- p1 = strrchr(intern->file_name, '/');
-#ifdef PHP_WIN32
- p2 = strrchr(intern->file_name, '\\');
-#else
- p2 = 0;
-#endif
- if (p1 || p2) {
- intern->_path_len = ((p1 > p2 ? p1 : p2) - intern->file_name);
+ path_len = ZSTR_LEN(path);
+ if (path_len > 1 && IS_SLASH_AT(ZSTR_VAL(path), path_len-1)) {
+ path_len--;
+ intern->file_name = zend_string_init(ZSTR_VAL(path), path_len, 0);
} else {
- intern->_path_len = 0;
+ intern->file_name = zend_string_copy(path);
+ }
+ while (path_len > 1 && !IS_SLASH_AT(ZSTR_VAL(path), path_len-1)) {
+ path_len--;
+ }
+ if (path_len) {
+ path_len--;
}
- if (intern->_path) {
- efree(intern->_path);
+ if (intern->path) {
+ zend_string_release(intern->path);
}
- intern->_path = estrndup(path, intern->_path_len);
+ intern->path = zend_string_init(ZSTR_VAL(path), path_len, 0);
} /* }}} */
-static spl_filesystem_object *spl_filesystem_object_create_info(spl_filesystem_object *source, char *file_path, size_t file_path_len, int use_copy, zend_class_entry *ce, zval *return_value) /* {{{ */
+static spl_filesystem_object *spl_filesystem_object_create_info(spl_filesystem_object *source, zend_string *file_path, zend_class_entry *ce, zval *return_value) /* {{{ */
{
spl_filesystem_object *intern;
zval arg1;
zend_error_handling error_handling;
- if (!file_path || !file_path_len) {
+ if (!file_path || !ZSTR_LEN(file_path)) {
#ifdef PHP_WIN32
zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Cannot create SplFileInfo for empty path");
- if (file_path && !use_copy) {
- efree(file_path);
- }
-#else
- if (file_path && !use_copy) {
- efree(file_path);
- }
- file_path_len = 1;
- file_path = "/";
#endif
return NULL;
}
@@ -458,17 +451,15 @@ static spl_filesystem_object *spl_filesystem_object_create_info(spl_filesystem_o
ce = ce ? ce : source->info_class;
- zend_update_class_constants(ce);
-
intern = spl_filesystem_from_obj(spl_filesystem_object_new_ex(ce));
RETVAL_OBJ(&intern->std);
if (ce->constructor->common.scope != spl_ce_SplFileInfo) {
- ZVAL_STRINGL(&arg1, file_path, file_path_len);
+ ZVAL_STR_COPY(&arg1, file_path);
zend_call_method_with_1_params(Z_OBJ_P(return_value), ce, &ce->constructor, "__construct", NULL, &arg1);
zval_ptr_dtor(&arg1);
} else {
- spl_filesystem_info_set_filename(intern, file_path, file_path_len, use_copy);
+ spl_filesystem_info_set_filename(intern, file_path);
}
zend_restore_error_handling(&error_handling);
@@ -478,7 +469,7 @@ static spl_filesystem_object *spl_filesystem_object_create_info(spl_filesystem_o
static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, spl_filesystem_object *source, int type, zend_class_entry *ce, zval *return_value) /* {{{ */
{
spl_filesystem_object *intern;
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
zval arg1, arg2;
zend_error_handling error_handling;
@@ -497,10 +488,6 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp
case SPL_FS_INFO:
ce = ce ? ce : source->info_class;
- if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) {
- return NULL;
- }
-
intern = spl_filesystem_from_obj(spl_filesystem_object_new_ex(ce));
RETVAL_OBJ(&intern->std);
@@ -509,24 +496,26 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp
}
if (ce->constructor->common.scope != spl_ce_SplFileInfo) {
- ZVAL_STRINGL(&arg1, source->file_name, source->file_name_len);
+ ZVAL_STR_COPY(&arg1, source->file_name);
zend_call_method_with_1_params(Z_OBJ_P(return_value), ce, &ce->constructor, "__construct", NULL, &arg1);
zval_ptr_dtor(&arg1);
} else {
- intern->file_name = estrndup(source->file_name, source->file_name_len);
- intern->file_name_len = source->file_name_len;
- intern->_path = spl_filesystem_object_get_path(source, &intern->_path_len);
- intern->_path = estrndup(intern->_path, intern->_path_len);
+ char *path;
+ size_t path_len;
+
+ intern->file_name = zend_string_copy(source->file_name);
+ path = spl_filesystem_object_get_path(source, &path_len);
+ if (source->path && ZSTR_VAL(source->path) == path) {
+ intern->path = zend_string_copy(source->path);
+ } else {
+ intern->path = zend_string_init(path, path_len, 0);
+ }
}
break;
case SPL_FS_FILE:
{
ce = ce ? ce : source->file_class;
- if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) {
- return NULL;
- }
-
char *open_mode = "r";
size_t open_mode_len = 1;
zval *resource = NULL;
@@ -545,16 +534,22 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp
}
if (ce->constructor->common.scope != spl_ce_SplFileObject) {
- ZVAL_STRINGL(&arg1, source->file_name, source->file_name_len);
+ ZVAL_STR_COPY(&arg1, source->file_name);
ZVAL_STRINGL(&arg2, open_mode, open_mode_len);
zend_call_method_with_2_params(Z_OBJ_P(return_value), ce, &ce->constructor, "__construct", NULL, &arg1, &arg2);
zval_ptr_dtor(&arg1);
zval_ptr_dtor(&arg2);
} else {
+ char *path;
+ size_t path_len;
+
intern->file_name = source->file_name;
- intern->file_name_len = source->file_name_len;
- intern->_path = spl_filesystem_object_get_path(source, &intern->_path_len);
- intern->_path = estrndup(intern->_path, intern->_path_len);
+ path = spl_filesystem_object_get_path(source, &path_len);
+ if (source->path && ZSTR_VAL(source->path) == path) {
+ intern->path = zend_string_copy(source->path);
+ } else {
+ intern->path = zend_string_init(path, path_len, 0);
+ }
intern->u.file.open_mode = open_mode;
intern->u.file.open_mode_len = open_mode_len;
@@ -584,20 +579,17 @@ static int spl_filesystem_is_invalid_or_dot(const char * d_name) /* {{{ */
}
/* }}} */
-static char *spl_filesystem_object_get_pathname(spl_filesystem_object *intern, size_t *len) { /* {{{ */
+static zend_string *spl_filesystem_object_get_pathname(spl_filesystem_object *intern) { /* {{{ */
switch (intern->type) {
case SPL_FS_INFO:
case SPL_FS_FILE:
- *len = intern->file_name_len;
return intern->file_name;
case SPL_FS_DIR:
if (intern->u.dir.entry.d_name[0]) {
spl_filesystem_object_get_file_name(intern);
- *len = intern->file_name_len;
return intern->file_name;
}
}
- *len = 0;
return NULL;
}
/* }}} */
@@ -608,8 +600,7 @@ static inline HashTable *spl_filesystem_object_get_debug_info(zend_object *objec
zval tmp;
HashTable *rv;
zend_string *pnstr;
- char *path;
- size_t path_len;
+ zend_string *path;
char stmp[2];
if (!intern->std.properties) {
@@ -619,19 +610,25 @@ static inline HashTable *spl_filesystem_object_get_debug_info(zend_object *objec
rv = zend_array_dup(intern->std.properties);
pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "pathName", sizeof("pathName")-1);
- path = spl_filesystem_object_get_pathname(intern, &path_len);
- ZVAL_STRINGL(&tmp, path ? path : "", path_len);
+ path = spl_filesystem_object_get_pathname(intern);
+ if (path) {
+ ZVAL_STR_COPY(&tmp, path);
+ } else {
+ ZVAL_EMPTY_STRING(&tmp);
+ }
zend_symtable_update(rv, pnstr, &tmp);
zend_string_release_ex(pnstr, 0);
if (intern->file_name) {
+ size_t path_len;
+
pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "fileName", sizeof("fileName")-1);
spl_filesystem_object_get_path(intern, &path_len);
- if (path_len && path_len < intern->file_name_len) {
- ZVAL_STRINGL(&tmp, intern->file_name + path_len + 1, intern->file_name_len - (path_len + 1));
+ if (path_len && path_len < ZSTR_LEN(intern->file_name)) {
+ ZVAL_STRINGL(&tmp, ZSTR_VAL(intern->file_name) + path_len + 1, ZSTR_LEN(intern->file_name) - (path_len + 1));
} else {
- ZVAL_STRINGL(&tmp, intern->file_name, intern->file_name_len);
+ ZVAL_STR_COPY(&tmp, intern->file_name);
}
zend_symtable_update(rv, pnstr, &tmp);
zend_string_release_ex(pnstr, 0);
@@ -640,7 +637,7 @@ static inline HashTable *spl_filesystem_object_get_debug_info(zend_object *objec
#ifdef HAVE_GLOB
pnstr = spl_gen_private_prop_name(spl_ce_DirectoryIterator, "glob", sizeof("glob")-1);
if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) {
- ZVAL_STRINGL(&tmp, intern->_path, intern->_path_len);
+ ZVAL_STR_COPY(&tmp, intern->path);
} else {
ZVAL_FALSE(&tmp);
}
@@ -649,7 +646,7 @@ static inline HashTable *spl_filesystem_object_get_debug_info(zend_object *objec
#endif
pnstr = spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "subPathName", sizeof("subPathName")-1);
if (intern->u.dir.sub_path) {
- ZVAL_STRINGL(&tmp, intern->u.dir.sub_path, intern->u.dir.sub_path_len);
+ ZVAL_STR_COPY(&tmp, intern->u.dir.sub_path);
} else {
ZVAL_EMPTY_STRING(&tmp);
}
@@ -700,18 +697,17 @@ zend_function *spl_filesystem_object_get_method_check(zend_object **object, zend
void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, zend_long ctor_flags) /* {{{ */
{
spl_filesystem_object *intern;
- char *path;
+ zend_string *path;
int parsed;
- size_t len;
zend_long flags;
zend_error_handling error_handling;
if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_FLAGS)) {
flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO;
- parsed = zend_parse_parameters(ZEND_NUM_ARGS(), "p|l", &path, &len, &flags);
+ parsed = zend_parse_parameters(ZEND_NUM_ARGS(), "P|l", &path, &flags);
} else {
flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_SELF;
- parsed = zend_parse_parameters(ZEND_NUM_ARGS(), "p", &path, &len);
+ parsed = zend_parse_parameters(ZEND_NUM_ARGS(), "P", &path);
}
if (SPL_HAS_FLAG(ctor_flags, SPL_FILE_DIR_SKIPDOTS)) {
flags |= SPL_FILE_DIR_SKIPDOTS;
@@ -723,13 +719,13 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, zend_long cto
RETURN_THROWS();
}
- if (len == 0) {
+ if (ZSTR_LEN(path) == 0) {
zend_argument_value_error(1, "cannot be empty");
RETURN_THROWS();
}
intern = Z_SPLFILESYSTEM_P(ZEND_THIS);
- if (intern->_path) {
+ if (intern->path) {
/* object is already initialized */
zend_throw_error(NULL, "Directory object is already initialized");
RETURN_THROWS();
@@ -738,10 +734,10 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, zend_long cto
zend_replace_error_handling(EH_THROW, spl_ce_UnexpectedValueException, &error_handling);
#ifdef HAVE_GLOB
- if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_GLOB) && strstr(path, "glob://") != path) {
- spprintf(&path, 0, "glob://%s", path);
+ if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_GLOB) && memcmp(ZSTR_VAL(path), "glob://", sizeof("glob://")-1) != 0) {
+ path = zend_strpprintf(0, "glob://%s", ZSTR_VAL(path));
spl_filesystem_dir_open(intern, path);
- efree(path);
+ zend_string_release(path);
} else
#endif
{
@@ -821,7 +817,7 @@ PHP_METHOD(DirectoryIterator, next)
spl_filesystem_dir_read(intern);
} while (skip_dots && spl_filesystem_is_dot(intern->u.dir.entry.d_name));
if (intern->file_name) {
- efree(intern->file_name);
+ zend_string_release(intern->file_name);
intern->file_name = NULL;
}
}
@@ -906,10 +902,10 @@ PHP_METHOD(SplFileInfo, getFilename)
spl_filesystem_object_get_path(intern, &path_len);
- if (path_len && path_len < intern->file_name_len) {
- RETURN_STRINGL(intern->file_name + path_len + 1, intern->file_name_len - (path_len + 1));
+ if (path_len && path_len < ZSTR_LEN(intern->file_name)) {
+ RETURN_STRINGL(ZSTR_VAL(intern->file_name) + path_len + 1, ZSTR_LEN(intern->file_name) - (path_len + 1));
} else {
- RETURN_STRINGL(intern->file_name, intern->file_name_len);
+ RETURN_STR_COPY(intern->file_name);
}
}
/* }}} */
@@ -949,12 +945,12 @@ PHP_METHOD(SplFileInfo, getExtension)
spl_filesystem_object_get_path(intern, &path_len);
- if (path_len && path_len < intern->file_name_len) {
- fname = intern->file_name + path_len + 1;
- flen = intern->file_name_len - (path_len + 1);
+ if (path_len && path_len < ZSTR_LEN(intern->file_name)) {
+ fname = ZSTR_VAL(intern->file_name) + path_len + 1;
+ flen = ZSTR_LEN(intern->file_name) - (path_len + 1);
} else {
- fname = intern->file_name;
- flen = intern->file_name_len;
+ fname = ZSTR_VAL(intern->file_name);
+ flen = ZSTR_LEN(intern->file_name);
}
ret = php_basename(fname, flen, NULL, 0);
@@ -1017,12 +1013,12 @@ PHP_METHOD(SplFileInfo, getBasename)
spl_filesystem_object_get_path(intern, &path_len);
- if (path_len && path_len < intern->file_name_len) {
- fname = intern->file_name + path_len + 1;
- flen = intern->file_name_len - (path_len + 1);
+ if (path_len && path_len < ZSTR_LEN(intern->file_name)) {
+ fname = ZSTR_VAL(intern->file_name) + path_len + 1;
+ flen = ZSTR_LEN(intern->file_name) - (path_len + 1);
} else {
- fname = intern->file_name;
- flen = intern->file_name_len;
+ fname = ZSTR_VAL(intern->file_name);
+ flen = ZSTR_LEN(intern->file_name);
}
RETURN_STR(php_basename(fname, flen, suffix, slen));
@@ -1051,15 +1047,14 @@ PHP_METHOD(DirectoryIterator, getBasename)
PHP_METHOD(SplFileInfo, getPathname)
{
spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS);
- char *path;
- size_t path_len;
+ zend_string *path;
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
- path = spl_filesystem_object_get_pathname(intern, &path_len);
- if (path != NULL) {
- RETURN_STRINGL(path, path_len);
+ path = spl_filesystem_object_get_pathname(intern);
+ if (path) {
+ RETURN_STR_COPY(path);
} else {
RETURN_EMPTY_STRING();
}
@@ -1081,7 +1076,7 @@ PHP_METHOD(FilesystemIterator, key)
if (spl_filesystem_object_get_file_name(intern) != SUCCESS) {
RETURN_THROWS();
}
- RETURN_STRINGL(intern->file_name, intern->file_name_len);
+ RETURN_STR_COPY(intern->file_name);
}
}
/* }}} */
@@ -1099,7 +1094,7 @@ PHP_METHOD(FilesystemIterator, current)
if (spl_filesystem_object_get_file_name(intern) != SUCCESS) {
RETURN_THROWS();
}
- RETURN_STRINGL(intern->file_name, intern->file_name_len);
+ RETURN_STR_COPY(intern->file_name);
} else if (SPL_FILE_DIR_CURRENT(intern, SPL_FILE_DIR_CURRENT_AS_FILEINFO)) {
if (spl_filesystem_object_get_file_name(intern) != SUCCESS) {
RETURN_THROWS();
@@ -1131,16 +1126,15 @@ PHP_METHOD(DirectoryIterator, isDot)
PHP_METHOD(SplFileInfo, __construct)
{
spl_filesystem_object *intern;
- char *path;
- size_t len;
+ zend_string *path;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "p", &path, &len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P", &path) == FAILURE) {
RETURN_THROWS();
}
intern = Z_SPLFILESYSTEM_P(ZEND_THIS);
- spl_filesystem_info_set_filename(intern, path, len, 1);
+ spl_filesystem_info_set_filename(intern, path);
/* intern->type = SPL_FS_INFO; already set */
}
@@ -1159,7 +1153,7 @@ PHP_METHOD(SplFileInfo, func_name) \
RETURN_THROWS(); \
} \
zend_replace_error_handling(EH_THROW, spl_ce_RuntimeException, &error_handling);\
- php_stat(intern->file_name, intern->file_name_len, func_num, return_value); \
+ php_stat(intern->file_name, func_num, return_value); \
zend_restore_error_handling(&error_handling); \
}
/* }}} */
@@ -1249,23 +1243,23 @@ PHP_METHOD(SplFileInfo, getLinkTarget)
zend_value_error("Filename cannot be empty");
RETURN_THROWS();
}
- if (!IS_ABSOLUTE_PATH(intern->file_name, intern->file_name_len)) {
+ if (!IS_ABSOLUTE_PATH(ZSTR_VAL(intern->file_name), ZSTR_LEN(intern->file_name))) {
char expanded_path[MAXPATHLEN];
- if (!expand_filepath_with_mode(intern->file_name, expanded_path, NULL, 0, CWD_EXPAND )) {
+ if (!expand_filepath_with_mode(ZSTR_VAL(intern->file_name), expanded_path, NULL, 0, CWD_EXPAND )) {
zend_restore_error_handling(&error_handling);
php_error_docref(NULL, E_WARNING, "No such file or directory");
RETURN_FALSE;
}
ret = php_sys_readlink(expanded_path, buff, MAXPATHLEN - 1);
} else {
- ret = php_sys_readlink(intern->file_name, buff, MAXPATHLEN-1);
+ ret = php_sys_readlink(ZSTR_VAL(intern->file_name), buff, MAXPATHLEN-1);
}
#else
ret = -1; /* always fail if not implemented */
#endif
if (ret == -1) {
- zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Unable to read link %s, error: %s", intern->file_name, strerror(errno));
+ zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Unable to read link %s, error: %s", ZSTR_VAL(intern->file_name), strerror(errno));
RETVAL_FALSE;
} else {
/* Append NULL to the end of the string */
@@ -1300,9 +1294,9 @@ PHP_METHOD(SplFileInfo, getRealPath)
}
if (intern->orig_path) {
- filename = intern->orig_path;
+ filename = ZSTR_VAL(intern->orig_path);
} else {
- filename = intern->file_name;
+ filename = intern->file_name ? ZSTR_VAL(intern->file_name) : NULL;
}
@@ -1377,19 +1371,18 @@ PHP_METHOD(SplFileInfo, getPathInfo)
{
spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS);
zend_class_entry *ce = intern->info_class;
- size_t path_len;
- char *path;
+ zend_string *path;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|C!", &ce) == FAILURE) {
RETURN_THROWS();
}
- path = spl_filesystem_object_get_pathname(intern, &path_len);
- if (path) {
- char *dpath = estrndup(path, path_len);
- path_len = php_dirname(dpath, path_len);
- spl_filesystem_object_create_info(intern, dpath, path_len, 1, ce, return_value);
- efree(dpath);
+ path = spl_filesystem_object_get_pathname(intern);
+ if (path && ZSTR_LEN(path)) {
+ zend_string *dpath = zend_string_init(ZSTR_VAL(path), ZSTR_LEN(path), 0);
+ ZSTR_LEN(dpath) = php_dirname(ZSTR_VAL(dpath), ZSTR_LEN(path));
+ spl_filesystem_object_create_info(intern, dpath, ce, return_value);
+ zend_string_release(dpath);
}
}
/* }}} */
@@ -1467,12 +1460,14 @@ PHP_METHOD(FilesystemIterator, setFlags)
/* {{{ Returns whether current entry is a directory and not '.' or '..' */
PHP_METHOD(RecursiveDirectoryIterator, hasChildren)
{
- zend_bool allow_links = 0;
+ bool allow_links = 0;
spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &allow_links) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(0, 1)
+ Z_PARAM_OPTIONAL
+ Z_PARAM_BOOL(allow_links)
+ ZEND_PARSE_PARAMETERS_END();
+
if (spl_filesystem_is_invalid_or_dot(intern->u.dir.entry.d_name)) {
RETURN_FALSE;
} else {
@@ -1480,12 +1475,12 @@ PHP_METHOD(RecursiveDirectoryIterator, hasChildren)
RETURN_THROWS();
}
if (!allow_links && !(intern->flags & SPL_FILE_DIR_FOLLOW_SYMLINKS)) {
- php_stat(intern->file_name, intern->file_name_len, FS_IS_LINK, return_value);
+ php_stat(intern->file_name, FS_IS_LINK, return_value);
if (zend_is_true(return_value)) {
RETURN_FALSE;
}
}
- php_stat(intern->file_name, intern->file_name_len, FS_IS_DIR, return_value);
+ php_stat(intern->file_name, FS_IS_DIR, return_value);
}
}
/* }}} */
@@ -1507,17 +1502,22 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren)
}
ZVAL_LONG(&zflags, intern->flags);
- ZVAL_STRINGL(&zpath, intern->file_name, intern->file_name_len);
+ ZVAL_STR_COPY(&zpath, intern->file_name);
spl_instantiate_arg_ex2(Z_OBJCE_P(ZEND_THIS), return_value, &zpath, &zflags);
zval_ptr_dtor(&zpath);
subdir = Z_SPLFILESYSTEM_P(return_value);
if (subdir) {
- if (intern->u.dir.sub_path && intern->u.dir.sub_path[0]) {
- subdir->u.dir.sub_path_len = spprintf(&subdir->u.dir.sub_path, 0, "%s%c%s", intern->u.dir.sub_path, slash, intern->u.dir.entry.d_name);
+ size_t name_len = strlen(intern->u.dir.entry.d_name);
+ if (intern->u.dir.sub_path && ZSTR_LEN(intern->u.dir.sub_path)) {
+ zend_string *sub_path = zend_string_alloc(ZSTR_LEN(intern->u.dir.sub_path) + 1 + name_len, 0);
+ memcpy(ZSTR_VAL(sub_path), ZSTR_VAL(intern->u.dir.sub_path), ZSTR_LEN(intern->u.dir.sub_path));
+ ZSTR_VAL(sub_path)[ZSTR_LEN(intern->u.dir.sub_path)] = slash;
+ memcpy(ZSTR_VAL(sub_path) + ZSTR_LEN(intern->u.dir.sub_path) + 1, intern->u.dir.entry.d_name, name_len);
+ ZSTR_VAL(sub_path)[ZSTR_LEN(intern->u.dir.sub_path) + 1 + name_len] = 0;
+ subdir->u.dir.sub_path = sub_path;
} else {
- subdir->u.dir.sub_path_len = strlen(intern->u.dir.entry.d_name);
- subdir->u.dir.sub_path = estrndup(intern->u.dir.entry.d_name, subdir->u.dir.sub_path_len);
+ subdir->u.dir.sub_path = zend_string_init(intern->u.dir.entry.d_name, name_len, 0);
}
subdir->info_class = intern->info_class;
subdir->file_class = intern->file_class;
@@ -1536,7 +1536,7 @@ PHP_METHOD(RecursiveDirectoryIterator, getSubPath)
}
if (intern->u.dir.sub_path) {
- RETURN_STRINGL(intern->u.dir.sub_path, intern->u.dir.sub_path_len);
+ RETURN_STR_COPY(intern->u.dir.sub_path);
} else {
RETURN_EMPTY_STRING();
}
@@ -1554,7 +1554,7 @@ PHP_METHOD(RecursiveDirectoryIterator, getSubPathname)
}
if (intern->u.dir.sub_path) {
- RETURN_NEW_STR(strpprintf(0, "%s%c%s", intern->u.dir.sub_path, slash, intern->u.dir.entry.d_name));
+ RETURN_NEW_STR(strpprintf(0, "%s%c%s", ZSTR_VAL(intern->u.dir.sub_path), slash, intern->u.dir.entry.d_name));
} else {
RETURN_STRING(intern->u.dir.entry.d_name);
}
@@ -1682,7 +1682,7 @@ static void spl_filesystem_dir_it_move_forward(zend_object_iterator *iter)
object->u.dir.index++;
spl_filesystem_dir_read(object);
if (object->file_name) {
- efree(object->file_name);
+ zend_string_release(object->file_name);
object->file_name = NULL;
}
}
@@ -1721,7 +1721,7 @@ static zval *spl_filesystem_tree_it_current_data(zend_object_iterator *iter)
if (spl_filesystem_object_get_file_name(object) != SUCCESS) {
return NULL;
}
- ZVAL_STRINGL(&iterator->current, object->file_name, object->file_name_len);
+ ZVAL_STR_COPY(&iterator->current, object->file_name);
}
return &iterator->current;
} else if (SPL_FILE_DIR_CURRENT(object, SPL_FILE_DIR_CURRENT_AS_FILEINFO)) {
@@ -1749,7 +1749,7 @@ static void spl_filesystem_tree_it_current_key(zend_object_iterator *iter, zval
if (spl_filesystem_object_get_file_name(object) != SUCCESS) {
return;
}
- ZVAL_STRINGL(key, object->file_name, object->file_name_len);
+ ZVAL_STR_COPY(key, object->file_name);
}
}
/* }}} */
@@ -1765,7 +1765,7 @@ static void spl_filesystem_tree_it_move_forward(zend_object_iterator *iter)
spl_filesystem_dir_read(object);
} while (spl_filesystem_is_dot(object->u.dir.entry.d_name));
if (object->file_name) {
- efree(object->file_name);
+ zend_string_release(object->file_name);
object->file_name = NULL;
}
if (!Z_ISUNDEF(iterator->current)) {
@@ -1841,7 +1841,7 @@ static int spl_filesystem_object_cast(zend_object *readobj, zval *writeobj, int
switch (intern->type) {
case SPL_FS_INFO:
case SPL_FS_FILE:
- ZVAL_STRINGL(writeobj, intern->file_name, intern->file_name_len);
+ ZVAL_STR_COPY(writeobj, intern->file_name);
return SUCCESS;
case SPL_FS_DIR:
ZVAL_STRING(writeobj, intern->u.dir.entry.d_name);
@@ -1866,7 +1866,7 @@ static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent) /
if (php_stream_eof(intern->u.file.stream)) {
if (!silent) {
- zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Cannot read from file %s", intern->file_name);
+ zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Cannot read from file %s", ZSTR_VAL(intern->file_name));
}
return FAILURE;
}
@@ -1936,7 +1936,7 @@ static int spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_obje
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV) || intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
if (php_stream_eof(intern->u.file.stream)) {
if (!silent) {
- zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Cannot read from file %s", intern->file_name);
+ zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Cannot read from file %s", ZSTR_VAL(intern->file_name));
}
return FAILURE;
}
@@ -2021,7 +2021,7 @@ static void spl_filesystem_file_rewind(zval * this_ptr, spl_filesystem_object *i
return;
}
if (-1 == php_stream_rewind(intern->u.file.stream)) {
- zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Cannot rewind file %s", intern->file_name);
+ zend_throw_exception_ex(spl_ce_RuntimeException, 0, "Cannot rewind file %s", ZSTR_VAL(intern->file_name));
} else {
spl_filesystem_file_free_line(intern);
intern->u.file.current_line_num = 0;
@@ -2035,17 +2035,15 @@ static void spl_filesystem_file_rewind(zval * this_ptr, spl_filesystem_object *i
PHP_METHOD(SplFileObject, __construct)
{
spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS);
- zend_bool use_include_path = 0;
- char *p1, *p2;
- char *tmp_path;
- size_t tmp_path_len;
+ bool use_include_path = 0;
+ size_t path_len;
zend_error_handling error_handling;
intern->u.file.open_mode = NULL;
intern->u.file.open_mode_len = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|sbr!",
- &intern->file_name, &intern->file_name_len,
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|sbr!",
+ &intern->file_name,
&intern->u.file.open_mode, &intern->u.file.open_mode_len,
&use_include_path, &intern->u.file.zcontext) == FAILURE) {
intern->u.file.open_mode = NULL;
@@ -2061,29 +2059,21 @@ PHP_METHOD(SplFileObject, __construct)
zend_replace_error_handling(EH_THROW, spl_ce_RuntimeException, &error_handling);
if (spl_filesystem_file_open(intern, use_include_path, 0) == SUCCESS) {
- tmp_path_len = strlen(intern->u.file.stream->orig_path);
+ path_len = strlen(intern->u.file.stream->orig_path);
- if (tmp_path_len > 1 && IS_SLASH_AT(intern->u.file.stream->orig_path, tmp_path_len-1)) {
- tmp_path_len--;
+ if (path_len > 1 && IS_SLASH_AT(intern->u.file.stream->orig_path, path_len-1)) {
+ path_len--;
}
- tmp_path = estrndup(intern->u.file.stream->orig_path, tmp_path_len);
-
- p1 = strrchr(tmp_path, '/');
-#ifdef PHP_WIN32
- p2 = strrchr(tmp_path, '\\');
-#else
- p2 = 0;
-#endif
- if (p1 || p2) {
- intern->_path_len = ((p1 > p2 ? p1 : p2) - tmp_path);
- } else {
- intern->_path_len = 0;
+ while (path_len > 1 && !IS_SLASH_AT(intern->u.file.stream->orig_path, path_len-1)) {
+ path_len--;
}
- efree(tmp_path);
+ if (path_len) {
+ path_len--;
+ }
- intern->_path = estrndup(intern->u.file.stream->orig_path, intern->_path_len);
+ intern->path = zend_string_init(intern->u.file.stream->orig_path, path_len, 0);
}
zend_restore_error_handling(&error_handling);
@@ -2093,8 +2083,8 @@ PHP_METHOD(SplFileObject, __construct)
/* {{{ Construct a new temp file object */
PHP_METHOD(SplTempFileObject, __construct)
{
+ zend_string *file_name;
zend_long max_memory = PHP_STREAM_MAX_MEM;
- char tmp_fname[48];
spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS);
zend_error_handling error_handling;
@@ -2103,23 +2093,21 @@ PHP_METHOD(SplTempFileObject, __construct)
}
if (max_memory < 0) {
- intern->file_name = "php://memory";
- intern->file_name_len = 12;
+ file_name = zend_string_init("php://memory", sizeof("php://memory")-1, 0);
} else if (ZEND_NUM_ARGS()) {
- intern->file_name_len = slprintf(tmp_fname, sizeof(tmp_fname), "php://temp/maxmemory:" ZEND_LONG_FMT, max_memory);
- intern->file_name = tmp_fname;
+ file_name = zend_strpprintf(0, "php://temp/maxmemory:" ZEND_LONG_FMT, max_memory);
} else {
- intern->file_name = "php://temp";
- intern->file_name_len = 10;
+ file_name = zend_string_init("php://temp", sizeof("php://temp")-1, 0);
}
+ intern->file_name = file_name;
intern->u.file.open_mode = "wb";
intern->u.file.open_mode_len = 1;
zend_replace_error_handling(EH_THROW, spl_ce_RuntimeException, &error_handling);
if (spl_filesystem_file_open(intern, 0, 0) == SUCCESS) {
- intern->_path_len = 0;
- intern->_path = estrndup("", 0);
+ intern->path = ZSTR_EMPTY_ALLOC();
}
+ zend_string_release(file_name);
zend_restore_error_handling(&error_handling);
} /* }}} */
@@ -2700,7 +2688,7 @@ PHP_METHOD(SplFileObject, ftruncate)
CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern);
if (!php_stream_truncate_supported(intern->u.file.stream)) {
- zend_throw_exception_ex(spl_ce_LogicException, 0, "Can't truncate file %s", intern->file_name);
+ zend_throw_exception_ex(spl_ce_LogicException, 0, "Can't truncate file %s", ZSTR_VAL(intern->file_name));
RETURN_THROWS();
}
@@ -2740,7 +2728,9 @@ PHP_METHOD(SplFileObject, seek)
/* {{{ PHP_MINIT_FUNCTION(spl_directory) */
PHP_MINIT_FUNCTION(spl_directory)
{
- REGISTER_SPL_STD_CLASS_EX(SplFileInfo, spl_filesystem_object_new, class_SplFileInfo_methods);
+ spl_ce_SplFileInfo = register_class_SplFileInfo(zend_ce_stringable);
+ spl_ce_SplFileInfo->create_object = spl_filesystem_object_new;
+
memcpy(&spl_filesystem_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
spl_filesystem_object_handlers.offset = XtOffsetOf(spl_filesystem_object, std);
spl_filesystem_object_handlers.clone_obj = spl_filesystem_object_clone;
@@ -2749,16 +2739,14 @@ PHP_MINIT_FUNCTION(spl_directory)
spl_filesystem_object_handlers.free_obj = spl_filesystem_object_free_storage;
spl_ce_SplFileInfo->serialize = zend_class_serialize_deny;
spl_ce_SplFileInfo->unserialize = zend_class_unserialize_deny;
- REGISTER_SPL_IMPLEMENTS(SplFileInfo, Stringable);
-
-
- REGISTER_SPL_SUB_CLASS_EX(DirectoryIterator, SplFileInfo, spl_filesystem_object_new, class_DirectoryIterator_methods);
- zend_class_implements(spl_ce_DirectoryIterator, 1, zend_ce_iterator);
- REGISTER_SPL_IMPLEMENTS(DirectoryIterator, SeekableIterator);
+ spl_ce_DirectoryIterator = register_class_DirectoryIterator(spl_ce_SplFileInfo, spl_ce_SeekableIterator);
+ spl_ce_DirectoryIterator->create_object = spl_filesystem_object_new;
spl_ce_DirectoryIterator->get_iterator = spl_filesystem_dir_get_iterator;
- REGISTER_SPL_SUB_CLASS_EX(FilesystemIterator, DirectoryIterator, spl_filesystem_object_new, class_FilesystemIterator_methods);
+ spl_ce_FilesystemIterator = register_class_FilesystemIterator(spl_ce_DirectoryIterator);
+ spl_ce_FilesystemIterator->create_object = spl_filesystem_object_new;
+ spl_ce_FilesystemIterator->get_iterator = spl_filesystem_tree_get_iterator;
REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "CURRENT_MODE_MASK", SPL_FILE_DIR_CURRENT_MODE_MASK);
REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "CURRENT_AS_PATHNAME", SPL_FILE_DIR_CURRENT_AS_PATHNAME);
@@ -2773,30 +2761,29 @@ PHP_MINIT_FUNCTION(spl_directory)
REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "SKIP_DOTS", SPL_FILE_DIR_SKIPDOTS);
REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "UNIX_PATHS", SPL_FILE_DIR_UNIXPATHS);
- spl_ce_FilesystemIterator->get_iterator = spl_filesystem_tree_get_iterator;
-
- REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator, FilesystemIterator, spl_filesystem_object_new, class_RecursiveDirectoryIterator_methods);
- REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator);
+ spl_ce_RecursiveDirectoryIterator = register_class_RecursiveDirectoryIterator(spl_ce_FilesystemIterator, spl_ce_RecursiveIterator);
+ spl_ce_RecursiveDirectoryIterator->create_object = spl_filesystem_object_new;
memcpy(&spl_filesystem_object_check_handlers, &spl_filesystem_object_handlers, sizeof(zend_object_handlers));
spl_filesystem_object_check_handlers.clone_obj = NULL;
spl_filesystem_object_check_handlers.get_method = spl_filesystem_object_get_method_check;
#ifdef HAVE_GLOB
- REGISTER_SPL_SUB_CLASS_EX(GlobIterator, FilesystemIterator, spl_filesystem_object_new_check, class_GlobIterator_methods);
- REGISTER_SPL_IMPLEMENTS(GlobIterator, Countable);
+ spl_ce_GlobIterator = register_class_GlobIterator(spl_ce_FilesystemIterator, zend_ce_countable);
+ spl_ce_GlobIterator->create_object = spl_filesystem_object_new_check;
#endif
- REGISTER_SPL_SUB_CLASS_EX(SplFileObject, SplFileInfo, spl_filesystem_object_new_check, class_SplFileObject_methods);
- REGISTER_SPL_IMPLEMENTS(SplFileObject, RecursiveIterator);
- REGISTER_SPL_IMPLEMENTS(SplFileObject, SeekableIterator);
+ spl_ce_SplFileObject = register_class_SplFileObject(spl_ce_SplFileInfo, spl_ce_RecursiveIterator, spl_ce_SeekableIterator);
+ spl_ce_SplFileObject->create_object = spl_filesystem_object_new_check;
REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "DROP_NEW_LINE", SPL_FILE_OBJECT_DROP_NEW_LINE);
REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "READ_AHEAD", SPL_FILE_OBJECT_READ_AHEAD);
REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "SKIP_EMPTY", SPL_FILE_OBJECT_SKIP_EMPTY);
REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "READ_CSV", SPL_FILE_OBJECT_READ_CSV);
- REGISTER_SPL_SUB_CLASS_EX(SplTempFileObject, SplFileObject, spl_filesystem_object_new_check, class_SplTempFileObject_methods);
+ spl_ce_SplTempFileObject = register_class_SplTempFileObject(spl_ce_SplFileObject);
+ spl_ce_SplTempFileObject->create_object = spl_filesystem_object_new_check;
+
return SUCCESS;
}
/* }}} */
diff --git a/ext/spl/spl_directory.h b/ext/spl/spl_directory.h
index 88fbd0f052..9c93aa2608 100644
--- a/ext/spl/spl_directory.h
+++ b/ext/spl/spl_directory.h
@@ -58,11 +58,9 @@ typedef struct {
struct _spl_filesystem_object {
void *oth;
const spl_other_handler *oth_handler;
- char *_path;
- size_t _path_len;
- char *orig_path;
- char *file_name;
- size_t file_name_len;
+ zend_string *path;
+ zend_string *orig_path;
+ zend_string *file_name;
SPL_FS_OBJ_TYPE type;
zend_long flags;
zend_class_entry *file_class;
@@ -71,8 +69,7 @@ struct _spl_filesystem_object {
struct {
php_stream *dirp;
php_stream_dirent entry;
- char *sub_path;
- size_t sub_path_len;
+ zend_string *sub_path;
int index;
int is_recursive;
zend_function *func_rewind;
@@ -136,12 +133,12 @@ static inline spl_filesystem_object* spl_filesystem_iterator_to_object(spl_files
#define SPL_FILE_DIR_KEY_AS_PATHNAME 0x00000000 /* make RecursiveDirectoryTree::key() return getPathname() */
#define SPL_FILE_DIR_KEY_AS_FILENAME 0x00000100 /* make RecursiveDirectoryTree::key() return getFilename() */
-#define SPL_FILE_DIR_FOLLOW_SYMLINKS 0x00000200 /* make RecursiveDirectoryTree::hasChildren() follow symlinks */
#define SPL_FILE_DIR_KEY_MODE_MASK 0x00000F00 /* mask RecursiveDirectoryTree::key() */
#define SPL_FILE_DIR_KEY(intern,mode) ((intern->flags&SPL_FILE_DIR_KEY_MODE_MASK)==mode)
#define SPL_FILE_DIR_SKIPDOTS 0x00001000 /* Tells whether it should skip dots or not */
#define SPL_FILE_DIR_UNIXPATHS 0x00002000 /* Whether to unixify path separators */
-#define SPL_FILE_DIR_OTHERS_MASK 0x00003000 /* mask used for get/setFlags */
+#define SPL_FILE_DIR_FOLLOW_SYMLINKS 0x00004000 /* make RecursiveDirectoryTree::hasChildren() follow symlinks */
+#define SPL_FILE_DIR_OTHERS_MASK 0x00007000 /* mask used for get/setFlags */
#endif /* SPL_DIRECTORY_H */
diff --git a/ext/spl/spl_directory.stub.php b/ext/spl/spl_directory.stub.php
index 681547e55f..80b708a3f4 100644
--- a/ext/spl/spl_directory.stub.php
+++ b/ext/spl/spl_directory.stub.php
@@ -1,8 +1,8 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
-class SplFileInfo
+class SplFileInfo implements Stringable
{
public function __construct(string $filename) {}
diff --git a/ext/spl/spl_directory_arginfo.h b/ext/spl/spl_directory_arginfo.h
index a16c4d45d0..252a82fb74 100644
--- a/ext/spl/spl_directory_arginfo.h
+++ b/ext/spl/spl_directory_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 285af54cf7b3f3ef3f0d673b248c5afbd4cc440e */
+ * Stub hash: de510a0512057bfaecbac8228107600ed14e2ba5 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFileInfo___construct, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@@ -471,3 +471,78 @@ static const zend_function_entry class_SplTempFileObject_methods[] = {
ZEND_ME(SplTempFileObject, __construct, arginfo_class_SplTempFileObject___construct, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SplFileInfo(zend_class_entry *class_entry_Stringable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplFileInfo", class_SplFileInfo_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Stringable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DirectoryIterator(zend_class_entry *class_entry_SplFileInfo, zend_class_entry *class_entry_SeekableIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DirectoryIterator", class_DirectoryIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_SplFileInfo);
+ zend_class_implements(class_entry, 1, class_entry_SeekableIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_FilesystemIterator(zend_class_entry *class_entry_DirectoryIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "FilesystemIterator", class_FilesystemIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_DirectoryIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RecursiveDirectoryIterator(zend_class_entry *class_entry_FilesystemIterator, zend_class_entry *class_entry_RecursiveIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RecursiveDirectoryIterator", class_RecursiveDirectoryIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_FilesystemIterator);
+ zend_class_implements(class_entry, 1, class_entry_RecursiveIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_GlobIterator(zend_class_entry *class_entry_FilesystemIterator, zend_class_entry *class_entry_Countable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "GlobIterator", class_GlobIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_FilesystemIterator);
+ zend_class_implements(class_entry, 1, class_entry_Countable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SplFileObject(zend_class_entry *class_entry_SplFileInfo, zend_class_entry *class_entry_RecursiveIterator, zend_class_entry *class_entry_SeekableIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplFileObject", class_SplFileObject_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_SplFileInfo);
+ zend_class_implements(class_entry, 2, class_entry_RecursiveIterator, class_entry_SeekableIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SplTempFileObject(zend_class_entry *class_entry_SplFileObject)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplTempFileObject", class_SplTempFileObject_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_SplFileObject);
+
+ return class_entry;
+}
diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c
index c576104139..5e42c44d42 100644
--- a/ext/spl/spl_dllist.c
+++ b/ext/spl/spl_dllist.c
@@ -764,7 +764,7 @@ PHP_METHOD(SplDoublyLinkedList, offsetGet)
PHP_METHOD(SplDoublyLinkedList, offsetSet)
{
zend_long index;
- zend_bool index_is_null = 1;
+ bool index_is_null = 1;
zval *value;
spl_dllist_object *intern;
@@ -1193,8 +1193,8 @@ PHP_METHOD(SplDoublyLinkedList, __serialize)
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
/* members */
- ZVAL_ARR(&tmp, zend_std_get_properties(&intern->std));
- Z_TRY_ADDREF(tmp);
+ ZVAL_ARR(&tmp, zend_proptable_to_symtable(
+ zend_std_get_properties(&intern->std), /* always_duplicate */ 1));
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
} /* }}} */
@@ -1332,7 +1332,12 @@ zend_object_iterator *spl_dllist_get_iterator(zend_class_entry *ce, zval *object
PHP_MINIT_FUNCTION(spl_dllist) /* {{{ */
{
- REGISTER_SPL_STD_CLASS_EX(SplDoublyLinkedList, spl_dllist_object_new, class_SplDoublyLinkedList_methods);
+ spl_ce_SplDoublyLinkedList = register_class_SplDoublyLinkedList(
+ zend_ce_iterator, zend_ce_countable, zend_ce_arrayaccess, zend_ce_serializable
+ );
+ spl_ce_SplDoublyLinkedList->create_object = spl_dllist_object_new;
+ spl_ce_SplDoublyLinkedList->get_iterator = spl_dllist_get_iterator;
+
memcpy(&spl_handler_SplDoublyLinkedList, &std_object_handlers, sizeof(zend_object_handlers));
spl_handler_SplDoublyLinkedList.offset = XtOffsetOf(spl_dllist_object, std);
@@ -1347,17 +1352,12 @@ PHP_MINIT_FUNCTION(spl_dllist) /* {{{ */
REGISTER_SPL_CLASS_CONST_LONG(SplDoublyLinkedList, "IT_MODE_DELETE",SPL_DLLIST_IT_DELETE);
REGISTER_SPL_CLASS_CONST_LONG(SplDoublyLinkedList, "IT_MODE_KEEP", 0);
- REGISTER_SPL_IMPLEMENTS(SplDoublyLinkedList, Iterator);
- REGISTER_SPL_IMPLEMENTS(SplDoublyLinkedList, Countable);
- REGISTER_SPL_IMPLEMENTS(SplDoublyLinkedList, ArrayAccess);
- REGISTER_SPL_IMPLEMENTS(SplDoublyLinkedList, Serializable);
-
- spl_ce_SplDoublyLinkedList->get_iterator = spl_dllist_get_iterator;
-
- REGISTER_SPL_SUB_CLASS_EX(SplQueue, SplDoublyLinkedList, spl_dllist_object_new, class_SplQueue_methods);
- REGISTER_SPL_SUB_CLASS_EX(SplStack, SplDoublyLinkedList, spl_dllist_object_new, class_SplStack_methods);
-
+ spl_ce_SplQueue = register_class_SplQueue(spl_ce_SplDoublyLinkedList);
+ spl_ce_SplQueue->create_object = spl_dllist_object_new;
spl_ce_SplQueue->get_iterator = spl_dllist_get_iterator;
+
+ spl_ce_SplStack = register_class_SplStack(spl_ce_SplDoublyLinkedList);
+ spl_ce_SplStack->create_object = spl_dllist_object_new;
spl_ce_SplStack->get_iterator = spl_dllist_get_iterator;
return SUCCESS;
diff --git a/ext/spl/spl_dllist.stub.php b/ext/spl/spl_dllist.stub.php
index 05f122204e..36b945afb7 100644
--- a/ext/spl/spl_dllist.stub.php
+++ b/ext/spl/spl_dllist.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class SplDoublyLinkedList implements Iterator, Countable, ArrayAccess, Serializable
{
diff --git a/ext/spl/spl_dllist_arginfo.h b/ext/spl/spl_dllist_arginfo.h
index eb612acb83..5162ff2957 100644
--- a/ext/spl/spl_dllist_arginfo.h
+++ b/ext/spl/spl_dllist_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 404df73577d733275e386226e11887b37a500ade */
+ * Stub hash: d0c98e1628895a81ac0b4abe62dede9ed2c7f55e */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplDoublyLinkedList_add, 0, 0, 2)
ZEND_ARG_TYPE_INFO(0, index, IS_LONG, 0)
@@ -144,3 +144,34 @@ static const zend_function_entry class_SplQueue_methods[] = {
static const zend_function_entry class_SplStack_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SplDoublyLinkedList(zend_class_entry *class_entry_Iterator, zend_class_entry *class_entry_Countable, zend_class_entry *class_entry_ArrayAccess, zend_class_entry *class_entry_Serializable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplDoublyLinkedList", class_SplDoublyLinkedList_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 4, class_entry_Iterator, class_entry_Countable, class_entry_ArrayAccess, class_entry_Serializable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SplQueue(zend_class_entry *class_entry_SplDoublyLinkedList)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplQueue", class_SplQueue_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_SplDoublyLinkedList);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SplStack(zend_class_entry *class_entry_SplDoublyLinkedList)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplStack", class_SplStack_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_SplDoublyLinkedList);
+
+ return class_entry;
+}
diff --git a/ext/spl/spl_exceptions.c b/ext/spl/spl_exceptions.c
index e176776a1f..c4f39aeb16 100644
--- a/ext/spl/spl_exceptions.c
+++ b/ext/spl/spl_exceptions.c
@@ -23,6 +23,7 @@
#include "ext/standard/info.h"
#include "zend_interfaces.h"
#include "zend_exceptions.h"
+#include "spl_exceptions_arginfo.h"
#include "php_spl.h"
#include "spl_functions.h"
@@ -48,20 +49,20 @@ PHPAPI zend_class_entry *spl_ce_UnexpectedValueException;
/* {{{ PHP_MINIT_FUNCTION(spl_exceptions) */
PHP_MINIT_FUNCTION(spl_exceptions)
{
- REGISTER_SPL_SUB_CLASS_EX(LogicException, Exception, NULL, NULL);
- REGISTER_SPL_SUB_CLASS_EX(BadFunctionCallException, LogicException, NULL, NULL);
- REGISTER_SPL_SUB_CLASS_EX(BadMethodCallException, BadFunctionCallException, NULL, NULL);
- REGISTER_SPL_SUB_CLASS_EX(DomainException, LogicException, NULL, NULL);
- REGISTER_SPL_SUB_CLASS_EX(InvalidArgumentException, LogicException, NULL, NULL);
- REGISTER_SPL_SUB_CLASS_EX(LengthException, LogicException, NULL, NULL);
- REGISTER_SPL_SUB_CLASS_EX(OutOfRangeException, LogicException, NULL, NULL);
+ spl_ce_LogicException = register_class_LogicException(zend_ce_exception);
+ spl_ce_BadFunctionCallException = register_class_BadFunctionCallException(spl_ce_LogicException);
+ spl_ce_BadMethodCallException = register_class_BadMethodCallException(spl_ce_BadFunctionCallException);
+ spl_ce_DomainException = register_class_DomainException(spl_ce_LogicException);
+ spl_ce_InvalidArgumentException = register_class_InvalidArgumentException(spl_ce_LogicException);
+ spl_ce_LengthException = register_class_LengthException(spl_ce_LogicException);
+ spl_ce_OutOfRangeException = register_class_OutOfRangeException(spl_ce_LogicException);
- REGISTER_SPL_SUB_CLASS_EX(RuntimeException, Exception, NULL, NULL);
- REGISTER_SPL_SUB_CLASS_EX(OutOfBoundsException, RuntimeException, NULL, NULL);
- REGISTER_SPL_SUB_CLASS_EX(OverflowException, RuntimeException, NULL, NULL);
- REGISTER_SPL_SUB_CLASS_EX(RangeException, RuntimeException, NULL, NULL);
- REGISTER_SPL_SUB_CLASS_EX(UnderflowException, RuntimeException, NULL, NULL);
- REGISTER_SPL_SUB_CLASS_EX(UnexpectedValueException, RuntimeException, NULL, NULL);
+ spl_ce_RuntimeException = register_class_RuntimeException(zend_ce_exception);
+ spl_ce_OutOfBoundsException = register_class_OutOfBoundsException(spl_ce_RuntimeException);
+ spl_ce_OverflowException = register_class_OverflowException(spl_ce_RuntimeException);
+ spl_ce_RangeException = register_class_RangeException(spl_ce_RuntimeException);
+ spl_ce_UnderflowException = register_class_UnderflowException(spl_ce_RuntimeException);
+ spl_ce_UnexpectedValueException = register_class_UnexpectedValueException(spl_ce_RuntimeException);
return SUCCESS;
}
diff --git a/ext/spl/spl_exceptions.stub.php b/ext/spl/spl_exceptions.stub.php
new file mode 100644
index 0000000000..09ca1b1326
--- /dev/null
+++ b/ext/spl/spl_exceptions.stub.php
@@ -0,0 +1,55 @@
+<?php
+
+/** @generate-class-entries */
+
+class LogicException extends Exception
+{
+}
+
+class BadFunctionCallException extends LogicException
+{
+}
+
+class BadMethodCallException extends BadFunctionCallException
+{
+}
+
+class DomainException extends LogicException
+{
+}
+
+class InvalidArgumentException extends LogicException
+{
+}
+
+class LengthException extends LogicException
+{
+}
+
+class OutOfRangeException extends LogicException
+{
+}
+
+class RuntimeException extends Exception
+{
+}
+
+class OutOfBoundsException extends RuntimeException
+{
+}
+
+class OverflowException extends RuntimeException
+{
+}
+
+class RangeException extends RuntimeException
+{
+}
+
+class UnderflowException extends RuntimeException
+{
+}
+
+class UnexpectedValueException extends RuntimeException
+{
+}
diff --git a/ext/spl/spl_exceptions_arginfo.h b/ext/spl/spl_exceptions_arginfo.h
new file mode 100644
index 0000000000..a35fdc8411
--- /dev/null
+++ b/ext/spl/spl_exceptions_arginfo.h
@@ -0,0 +1,199 @@
+/* This is a generated file, edit the .stub.php file instead.
+ * Stub hash: 07475caecc81ab3b38a04905f874615af1126289 */
+
+
+
+
+static const zend_function_entry class_LogicException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_BadFunctionCallException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_BadMethodCallException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_DomainException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_InvalidArgumentException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_LengthException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_OutOfRangeException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_RuntimeException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_OutOfBoundsException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_OverflowException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_RangeException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_UnderflowException_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_UnexpectedValueException_methods[] = {
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class_LogicException(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "LogicException", class_LogicException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_BadFunctionCallException(zend_class_entry *class_entry_LogicException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "BadFunctionCallException", class_BadFunctionCallException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_LogicException);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_BadMethodCallException(zend_class_entry *class_entry_BadFunctionCallException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "BadMethodCallException", class_BadMethodCallException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_BadFunctionCallException);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DomainException(zend_class_entry *class_entry_LogicException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DomainException", class_DomainException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_LogicException);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_InvalidArgumentException(zend_class_entry *class_entry_LogicException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "InvalidArgumentException", class_InvalidArgumentException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_LogicException);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_LengthException(zend_class_entry *class_entry_LogicException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "LengthException", class_LengthException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_LogicException);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_OutOfRangeException(zend_class_entry *class_entry_LogicException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "OutOfRangeException", class_OutOfRangeException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_LogicException);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RuntimeException(zend_class_entry *class_entry_Exception)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RuntimeException", class_RuntimeException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_OutOfBoundsException(zend_class_entry *class_entry_RuntimeException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "OutOfBoundsException", class_OutOfBoundsException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_OverflowException(zend_class_entry *class_entry_RuntimeException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "OverflowException", class_OverflowException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RangeException(zend_class_entry *class_entry_RuntimeException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RangeException", class_RangeException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_UnderflowException(zend_class_entry *class_entry_RuntimeException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "UnderflowException", class_UnderflowException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_UnexpectedValueException(zend_class_entry *class_entry_RuntimeException)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "UnexpectedValueException", class_UnexpectedValueException_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException);
+
+ return class_entry;
+}
diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c
index 4b0d186a78..d3726b4c3f 100644
--- a/ext/spl/spl_fixedarray.c
+++ b/ext/spl/spl_fixedarray.c
@@ -41,17 +41,22 @@ ZEND_GET_MODULE(spl_fixedarray)
typedef struct _spl_fixedarray {
zend_long size;
+ /* It is possible to resize this, so this can't be combined with the object */
zval *elements;
} spl_fixedarray;
-typedef struct _spl_fixedarray_object {
- spl_fixedarray array;
+typedef struct _spl_fixedarray_methods {
zend_function *fptr_offset_get;
zend_function *fptr_offset_set;
zend_function *fptr_offset_has;
zend_function *fptr_offset_del;
zend_function *fptr_count;
- zend_object std;
+} spl_fixedarray_methods;
+
+typedef struct _spl_fixedarray_object {
+ spl_fixedarray array;
+ spl_fixedarray_methods *methods;
+ zend_object std;
} spl_fixedarray_object;
typedef struct _spl_fixedarray_it {
@@ -222,6 +227,9 @@ static void spl_fixedarray_object_free_storage(zend_object *object)
spl_fixedarray_object *intern = spl_fixed_array_from_obj(object);
spl_fixedarray_dtor(&intern->array);
zend_object_std_dtor(&intern->std);
+ if (intern->methods) {
+ efree(intern->methods);
+ }
}
static zend_object *spl_fixedarray_object_new_ex(zend_class_entry *class_type, zend_object *orig, bool clone_orig)
@@ -252,26 +260,34 @@ static zend_object *spl_fixedarray_object_new_ex(zend_class_entry *class_type, z
ZEND_ASSERT(parent);
- if (inherited) {
- intern->fptr_offset_get = zend_hash_str_find_ptr(&class_type->function_table, "offsetget", sizeof("offsetget") - 1);
- if (intern->fptr_offset_get->common.scope == parent) {
- intern->fptr_offset_get = NULL;
+ if (UNEXPECTED(inherited)) {
+ spl_fixedarray_methods methods;
+ methods.fptr_offset_get = zend_hash_str_find_ptr(&class_type->function_table, "offsetget", sizeof("offsetget") - 1);
+ if (methods.fptr_offset_get->common.scope == parent) {
+ methods.fptr_offset_get = NULL;
}
- intern->fptr_offset_set = zend_hash_str_find_ptr(&class_type->function_table, "offsetset", sizeof("offsetset") - 1);
- if (intern->fptr_offset_set->common.scope == parent) {
- intern->fptr_offset_set = NULL;
+ methods.fptr_offset_set = zend_hash_str_find_ptr(&class_type->function_table, "offsetset", sizeof("offsetset") - 1);
+ if (methods.fptr_offset_set->common.scope == parent) {
+ methods.fptr_offset_set = NULL;
}
- intern->fptr_offset_has = zend_hash_str_find_ptr(&class_type->function_table, "offsetexists", sizeof("offsetexists") - 1);
- if (intern->fptr_offset_has->common.scope == parent) {
- intern->fptr_offset_has = NULL;
+ methods.fptr_offset_has = zend_hash_str_find_ptr(&class_type->function_table, "offsetexists", sizeof("offsetexists") - 1);
+ if (methods.fptr_offset_has->common.scope == parent) {
+ methods.fptr_offset_has = NULL;
}
- intern->fptr_offset_del = zend_hash_str_find_ptr(&class_type->function_table, "offsetunset", sizeof("offsetunset") - 1);
- if (intern->fptr_offset_del->common.scope == parent) {
- intern->fptr_offset_del = NULL;
+ methods.fptr_offset_del = zend_hash_str_find_ptr(&class_type->function_table, "offsetunset", sizeof("offsetunset") - 1);
+ if (methods.fptr_offset_del->common.scope == parent) {
+ methods.fptr_offset_del = NULL;
}
- intern->fptr_count = zend_hash_str_find_ptr(&class_type->function_table, "count", sizeof("count") - 1);
- if (intern->fptr_count->common.scope == parent) {
- intern->fptr_count = NULL;
+ methods.fptr_count = zend_hash_str_find_ptr(&class_type->function_table, "count", sizeof("count") - 1);
+ if (methods.fptr_count->common.scope == parent) {
+ methods.fptr_count = NULL;
+ }
+ /* Assume that most of the time in performance-sensitive code, SplFixedArray won't be subclassed with overrides for these ArrayAccess methods. */
+ /* Save 32 bytes per object on 64-bit systems by combining the 5 null pointers into 1 null pointer */
+ /* (This is already looking up 5 functions when any subclass of SplFixedArray is instantiated, which is inefficient) */
+ if (methods.fptr_offset_get || methods.fptr_offset_set || methods.fptr_offset_del || methods.fptr_offset_has || methods.fptr_count) {
+ intern->methods = emalloc(sizeof(spl_fixedarray_methods));
+ *intern->methods = methods;
}
}
@@ -329,16 +345,13 @@ static zval *spl_fixedarray_object_read_dimension(zend_object *object, zval *off
return &EG(uninitialized_zval);
}
- if (intern->fptr_offset_get) {
+ if (UNEXPECTED(intern->methods && intern->methods->fptr_offset_get)) {
zval tmp;
if (!offset) {
ZVAL_NULL(&tmp);
offset = &tmp;
- } else {
- SEPARATE_ARG_IF_REF(offset);
}
- zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_get, "offsetGet", rv, offset);
- zval_ptr_dtor(offset);
+ zend_call_method_with_1_params(object, intern->std.ce, &intern->methods->fptr_offset_get, "offsetGet", rv, offset);
if (!Z_ISUNDEF_P(rv)) {
return rv;
}
@@ -380,17 +393,12 @@ static void spl_fixedarray_object_write_dimension(zend_object *object, zval *off
intern = spl_fixed_array_from_obj(object);
- if (intern->fptr_offset_set) {
+ if (UNEXPECTED(intern->methods && intern->methods->fptr_offset_set)) {
if (!offset) {
ZVAL_NULL(&tmp);
offset = &tmp;
- } else {
- SEPARATE_ARG_IF_REF(offset);
}
- SEPARATE_ARG_IF_REF(value);
- zend_call_method_with_2_params(object, intern->std.ce, &intern->fptr_offset_set, "offsetSet", NULL, offset, value);
- zval_ptr_dtor(value);
- zval_ptr_dtor(offset);
+ zend_call_method_with_2_params(object, intern->std.ce, &intern->methods->fptr_offset_set, "offsetSet", NULL, offset, value);
return;
}
@@ -422,10 +430,8 @@ static void spl_fixedarray_object_unset_dimension(zend_object *object, zval *off
intern = spl_fixed_array_from_obj(object);
- if (intern->fptr_offset_del) {
- SEPARATE_ARG_IF_REF(offset);
- zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_del, "offsetUnset", NULL, offset);
- zval_ptr_dtor(offset);
+ if (UNEXPECTED(intern->methods && intern->methods->fptr_offset_del)) {
+ zend_call_method_with_1_params(object, intern->std.ce, &intern->methods->fptr_offset_del, "offsetUnset", NULL, offset);
return;
}
@@ -462,13 +468,11 @@ static int spl_fixedarray_object_has_dimension(zend_object *object, zval *offset
intern = spl_fixed_array_from_obj(object);
- if (intern->fptr_offset_has) {
+ if (UNEXPECTED(intern->methods && intern->methods->fptr_offset_has)) {
zval rv;
- zend_bool result;
+ bool result;
- SEPARATE_ARG_IF_REF(offset);
- zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_has, "offsetExists", &rv, offset);
- zval_ptr_dtor(offset);
+ zend_call_method_with_1_params(object, intern->std.ce, &intern->methods->fptr_offset_has, "offsetExists", &rv, offset);
result = zend_is_true(&rv);
zval_ptr_dtor(&rv);
return result;
@@ -482,9 +486,9 @@ static int spl_fixedarray_object_count_elements(zend_object *object, zend_long *
spl_fixedarray_object *intern;
intern = spl_fixed_array_from_obj(object);
- if (intern->fptr_count) {
+ if (UNEXPECTED(intern->methods && intern->methods->fptr_count)) {
zval rv;
- zend_call_method_with_0_params(object, intern->std.ce, &intern->fptr_count, "count", &rv);
+ zend_call_method_with_0_params(object, intern->std.ce, &intern->methods->fptr_count, "count", &rv);
if (!Z_ISUNDEF(rv)) {
*count = zval_get_long(&rv);
zval_ptr_dtor(&rv);
@@ -589,7 +593,7 @@ PHP_METHOD(SplFixedArray, fromArray)
spl_fixedarray array;
spl_fixedarray_object *intern;
int num;
- zend_bool save_indexes = 1;
+ bool save_indexes = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|b", &data, &save_indexes) == FAILURE) {
RETURN_THROWS();
@@ -834,7 +838,11 @@ zend_object_iterator *spl_fixedarray_get_iterator(zend_class_entry *ce, zval *ob
PHP_MINIT_FUNCTION(spl_fixedarray)
{
- REGISTER_SPL_STD_CLASS_EX(SplFixedArray, spl_fixedarray_new, class_SplFixedArray_methods);
+ spl_ce_SplFixedArray = register_class_SplFixedArray(zend_ce_aggregate, zend_ce_arrayaccess, zend_ce_countable);
+ spl_ce_SplFixedArray->create_object = spl_fixedarray_new;
+ spl_ce_SplFixedArray->get_iterator = spl_fixedarray_get_iterator;
+ spl_ce_SplFixedArray->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR;
+
memcpy(&spl_handler_SplFixedArray, &std_object_handlers, sizeof(zend_object_handlers));
spl_handler_SplFixedArray.offset = XtOffsetOf(spl_fixedarray_object, std);
@@ -849,12 +857,5 @@ PHP_MINIT_FUNCTION(spl_fixedarray)
spl_handler_SplFixedArray.dtor_obj = zend_objects_destroy_object;
spl_handler_SplFixedArray.free_obj = spl_fixedarray_object_free_storage;
- REGISTER_SPL_IMPLEMENTS(SplFixedArray, Aggregate);
- REGISTER_SPL_IMPLEMENTS(SplFixedArray, ArrayAccess);
- REGISTER_SPL_IMPLEMENTS(SplFixedArray, Countable);
-
- spl_ce_SplFixedArray->get_iterator = spl_fixedarray_get_iterator;
- spl_ce_SplFixedArray->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR;
-
return SUCCESS;
}
diff --git a/ext/spl/spl_fixedarray.stub.php b/ext/spl/spl_fixedarray.stub.php
index f2bb378f7a..32489d7199 100644
--- a/ext/spl/spl_fixedarray.stub.php
+++ b/ext/spl/spl_fixedarray.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class SplFixedArray implements IteratorAggregate, ArrayAccess, Countable
{
diff --git a/ext/spl/spl_fixedarray_arginfo.h b/ext/spl/spl_fixedarray_arginfo.h
index 6067a3ebde..627400cb4d 100644
--- a/ext/spl/spl_fixedarray_arginfo.h
+++ b/ext/spl/spl_fixedarray_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 831fe70055eb62135ae49321e5e5f3fe08c3d95f */
+ * Stub hash: aeac254f38638c19a11f7d79ac2e5c2d40924e58 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFixedArray___construct, 0, 0, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, size, IS_LONG, 0, "0")
@@ -69,3 +69,14 @@ static const zend_function_entry class_SplFixedArray_methods[] = {
ZEND_ME(SplFixedArray, getIterator, arginfo_class_SplFixedArray_getIterator, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SplFixedArray(zend_class_entry *class_entry_IteratorAggregate, zend_class_entry *class_entry_ArrayAccess, zend_class_entry *class_entry_Countable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplFixedArray", class_SplFixedArray_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 3, class_entry_IteratorAggregate, class_entry_ArrayAccess, class_entry_Countable);
+
+ return class_entry;
+}
diff --git a/ext/spl/spl_functions.c b/ext/spl/spl_functions.c
index 946f6e0ad9..61ca426312 100644
--- a/ext/spl/spl_functions.c
+++ b/ext/spl/spl_functions.c
@@ -23,55 +23,6 @@
#include "ext/standard/info.h"
#include "php_spl.h"
-/* {{{ spl_register_interface */
-void spl_register_interface(zend_class_entry ** ppce, char * class_name, const zend_function_entry * functions)
-{
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY_EX(ce, class_name, strlen(class_name), functions);
- *ppce = zend_register_internal_interface(&ce);
-}
-/* }}} */
-
-/* {{{ spl_register_std_class */
-PHPAPI void spl_register_std_class(zend_class_entry ** ppce, char * class_name, void * obj_ctor, const zend_function_entry * function_list)
-{
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY_EX(ce, class_name, strlen(class_name), function_list);
- *ppce = zend_register_internal_class(&ce);
-
- /* entries changed by initialize */
- if (obj_ctor) {
- (*ppce)->create_object = obj_ctor;
- }
-}
-/* }}} */
-
-/* {{{ spl_register_sub_class */
-PHPAPI void spl_register_sub_class(zend_class_entry ** ppce, zend_class_entry * parent_ce, char * class_name, void *obj_ctor, const zend_function_entry * function_list)
-{
- zend_class_entry ce;
-
- INIT_CLASS_ENTRY_EX(ce, class_name, strlen(class_name), function_list);
- *ppce = zend_register_internal_class_ex(&ce, parent_ce);
-
- /* entries changed by initialize */
- if (obj_ctor) {
- (*ppce)->create_object = obj_ctor;
- } else {
- (*ppce)->create_object = parent_ce->create_object;
- }
-}
-/* }}} */
-
-/* {{{ spl_register_property */
-void spl_register_property( zend_class_entry * class_entry, char *prop_name, int prop_name_len, int prop_flags)
-{
- zend_declare_property_null(class_entry, prop_name, prop_name_len, prop_flags);
-}
-/* }}} */
-
/* {{{ spl_add_class_name */
void spl_add_class_name(zval *list, zend_class_entry *pce, int allow, int ce_flags)
{
diff --git a/ext/spl/spl_functions.h b/ext/spl/spl_functions.h
index b1f0653607..576117c4c8 100644
--- a/ext/spl/spl_functions.h
+++ b/ext/spl/spl_functions.h
@@ -21,36 +21,9 @@
typedef zend_object* (*create_object_func_t)(zend_class_entry *class_type);
-#define REGISTER_SPL_STD_CLASS(class_name, obj_ctor) \
- spl_register_std_class(&spl_ce_ ## class_name, # class_name, obj_ctor, NULL);
-
-#define REGISTER_SPL_STD_CLASS_EX(class_name, obj_ctor, funcs) \
- spl_register_std_class(&spl_ce_ ## class_name, # class_name, obj_ctor, funcs);
-
-#define REGISTER_SPL_SUB_CLASS_EX(class_name, parent_class_name, obj_ctor, funcs) \
- spl_register_sub_class(&spl_ce_ ## class_name, spl_ce_ ## parent_class_name, # class_name, obj_ctor, funcs);
-
-#define REGISTER_SPL_INTERFACE(class_name) \
- spl_register_interface(&spl_ce_ ## class_name, # class_name, class_ ## class_name ## _methods);
-
-#define REGISTER_SPL_IMPLEMENTS(class_name, interface_name) \
- zend_class_implements(spl_ce_ ## class_name, 1, spl_ce_ ## interface_name);
-
-#define REGISTER_SPL_ITERATOR(class_name) \
- zend_class_implements(spl_ce_ ## class_name, 1, zend_ce_iterator);
-
-#define REGISTER_SPL_PROPERTY(class_name, prop_name, prop_flags) \
- spl_register_property(spl_ce_ ## class_name, prop_name, sizeof(prop_name)-1, prop_flags);
-
#define REGISTER_SPL_CLASS_CONST_LONG(class_name, const_name, value) \
zend_declare_class_constant_long(spl_ce_ ## class_name, const_name, sizeof(const_name)-1, (zend_long)value);
-void spl_register_std_class(zend_class_entry ** ppce, char * class_name, create_object_func_t ctor, const zend_function_entry * function_list);
-void spl_register_sub_class(zend_class_entry ** ppce, zend_class_entry * parent_ce, char * class_name, create_object_func_t ctor, const zend_function_entry * function_list);
-void spl_register_interface(zend_class_entry ** ppce, char * class_name, const zend_function_entry *functions);
-
-void spl_register_property( zend_class_entry * class_entry, char *prop_name, int prop_name_len, int prop_flags);
-
/* sub: whether to allow subclasses/interfaces
allow = 0: allow all classes and interfaces
allow > 0: allow all that match and mask ce_flags
diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c
index ba1b0fd681..61a24f8b3b 100644
--- a/ext/spl/spl_heap.c
+++ b/ext/spl/spl_heap.c
@@ -1113,7 +1113,10 @@ zend_object_iterator *spl_pqueue_get_iterator(zend_class_entry *ce, zval *object
PHP_MINIT_FUNCTION(spl_heap) /* {{{ */
{
- REGISTER_SPL_STD_CLASS_EX(SplHeap, spl_heap_object_new, class_SplHeap_methods);
+ spl_ce_SplHeap = register_class_SplHeap(zend_ce_iterator, zend_ce_countable);
+ spl_ce_SplHeap->create_object = spl_heap_object_new;
+ spl_ce_SplHeap->get_iterator = spl_heap_get_iterator;
+
memcpy(&spl_handler_SplHeap, &std_object_handlers, sizeof(zend_object_handlers));
spl_handler_SplHeap.offset = XtOffsetOf(spl_heap_object, std);
@@ -1123,18 +1126,18 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */
spl_handler_SplHeap.dtor_obj = zend_objects_destroy_object;
spl_handler_SplHeap.free_obj = spl_heap_object_free_storage;
- REGISTER_SPL_IMPLEMENTS(SplHeap, Iterator);
- REGISTER_SPL_IMPLEMENTS(SplHeap, Countable);
-
- spl_ce_SplHeap->get_iterator = spl_heap_get_iterator;
-
- REGISTER_SPL_SUB_CLASS_EX(SplMinHeap, SplHeap, spl_heap_object_new, class_SplMinHeap_methods);
- REGISTER_SPL_SUB_CLASS_EX(SplMaxHeap, SplHeap, spl_heap_object_new, class_SplMaxHeap_methods);
+ spl_ce_SplMinHeap = register_class_SplMinHeap(spl_ce_SplHeap);
+ spl_ce_SplMinHeap->create_object = spl_heap_object_new;
+ spl_ce_SplMinHeap->get_iterator = spl_heap_get_iterator;
+ spl_ce_SplMaxHeap = register_class_SplMaxHeap(spl_ce_SplHeap);
+ spl_ce_SplMaxHeap->create_object = spl_heap_object_new;
spl_ce_SplMaxHeap->get_iterator = spl_heap_get_iterator;
- spl_ce_SplMinHeap->get_iterator = spl_heap_get_iterator;
- REGISTER_SPL_STD_CLASS_EX(SplPriorityQueue, spl_heap_object_new, class_SplPriorityQueue_methods);
+ spl_ce_SplPriorityQueue = register_class_SplPriorityQueue(zend_ce_iterator, zend_ce_countable);
+ spl_ce_SplPriorityQueue->create_object = spl_heap_object_new;
+ spl_ce_SplPriorityQueue->get_iterator = spl_pqueue_get_iterator;
+
memcpy(&spl_handler_SplPriorityQueue, &std_object_handlers, sizeof(zend_object_handlers));
spl_handler_SplPriorityQueue.offset = XtOffsetOf(spl_heap_object, std);
@@ -1144,11 +1147,6 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */
spl_handler_SplPriorityQueue.dtor_obj = zend_objects_destroy_object;
spl_handler_SplPriorityQueue.free_obj = spl_heap_object_free_storage;
- REGISTER_SPL_IMPLEMENTS(SplPriorityQueue, Iterator);
- REGISTER_SPL_IMPLEMENTS(SplPriorityQueue, Countable);
-
- spl_ce_SplPriorityQueue->get_iterator = spl_pqueue_get_iterator;
-
REGISTER_SPL_CLASS_CONST_LONG(SplPriorityQueue, "EXTR_BOTH", SPL_PQUEUE_EXTR_BOTH);
REGISTER_SPL_CLASS_CONST_LONG(SplPriorityQueue, "EXTR_PRIORITY", SPL_PQUEUE_EXTR_PRIORITY);
REGISTER_SPL_CLASS_CONST_LONG(SplPriorityQueue, "EXTR_DATA", SPL_PQUEUE_EXTR_DATA);
diff --git a/ext/spl/spl_heap.stub.php b/ext/spl/spl_heap.stub.php
index 8c01068eae..2f31ded011 100644
--- a/ext/spl/spl_heap.stub.php
+++ b/ext/spl/spl_heap.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class SplPriorityQueue implements Iterator, Countable
{
diff --git a/ext/spl/spl_heap_arginfo.h b/ext/spl/spl_heap_arginfo.h
index aede7a3daf..2afc289a1e 100644
--- a/ext/spl/spl_heap_arginfo.h
+++ b/ext/spl/spl_heap_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 510a58000a5473c4cbb33886f43b9f3050b3a36d */
+ * Stub hash: 9a733260823a95ba1ab987154e23d72b6210999d */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplPriorityQueue_compare, 0, 0, 2)
ZEND_ARG_TYPE_INFO(0, priority1, IS_MIXED, 0)
@@ -155,3 +155,46 @@ static const zend_function_entry class_SplMaxHeap_methods[] = {
ZEND_ME(SplMaxHeap, compare, arginfo_class_SplMaxHeap_compare, ZEND_ACC_PROTECTED)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SplPriorityQueue(zend_class_entry *class_entry_Iterator, zend_class_entry *class_entry_Countable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplPriorityQueue", class_SplPriorityQueue_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 2, class_entry_Iterator, class_entry_Countable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SplHeap(zend_class_entry *class_entry_Iterator, zend_class_entry *class_entry_Countable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplHeap", class_SplHeap_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_ABSTRACT;
+ zend_class_implements(class_entry, 2, class_entry_Iterator, class_entry_Countable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SplMinHeap(zend_class_entry *class_entry_SplHeap)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplMinHeap", class_SplMinHeap_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_SplHeap);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SplMaxHeap(zend_class_entry *class_entry_SplHeap)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplMaxHeap", class_SplMaxHeap_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_SplHeap);
+
+ return class_entry;
+}
diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c
index 40538cda8e..051b96bf9f 100644
--- a/ext/spl/spl_iterators.c
+++ b/ext/spl/spl_iterators.c
@@ -85,6 +85,8 @@ typedef struct _spl_sub_iterator {
zval zobject;
zend_class_entry *ce;
RecursiveIteratorState state;
+ zend_function *haschildren;
+ zend_function *getchildren;
} spl_sub_iterator;
typedef struct _spl_recursive_it_object {
@@ -93,7 +95,7 @@ typedef struct _spl_recursive_it_object {
RecursiveIteratorMode mode;
int flags;
int max_depth;
- zend_bool in_iteration;
+ bool in_iteration;
zend_function *beginIteration;
zend_function *endIteration;
zend_function *callHasChildren;
@@ -222,7 +224,6 @@ static void spl_recursive_it_get_current_key(zend_object_iterator *iter, zval *k
static void spl_recursive_it_move_forward_ex(spl_recursive_it_object *object, zval *zthis)
{
zend_object_iterator *iterator;
- zval *zobject;
zend_class_entry *ce;
zval retval, child;
zend_object_iterator *sub_iter;
@@ -251,12 +252,14 @@ next_step:
object->iterators[object->level].state = RS_TEST;
/* break; */
case RS_TEST:
- ce = object->iterators[object->level].ce;
- zobject = &object->iterators[object->level].zobject;
if (object->callHasChildren) {
zend_call_method_with_0_params(Z_OBJ_P(zthis), object->ce, &object->callHasChildren, "callHasChildren", &retval);
} else {
- zend_call_method_with_0_params(Z_OBJ_P(zobject), ce, NULL, "haschildren", &retval);
+ zend_class_entry *ce = object->iterators[object->level].ce;
+ zend_object *obj = Z_OBJ(object->iterators[object->level].zobject);
+ zend_function **cache = &object->iterators[object->level].haschildren;
+
+ zend_call_method_with_0_params(obj, ce, cache, "haschildren", &retval);
}
if (EG(exception)) {
if (!(object->flags & RIT_CATCH_GET_CHILD)) {
@@ -313,12 +316,14 @@ next_step:
}
return /* self */;
case RS_CHILD:
- ce = object->iterators[object->level].ce;
- zobject = &object->iterators[object->level].zobject;
if (object->callGetChildren) {
zend_call_method_with_0_params(Z_OBJ_P(zthis), object->ce, &object->callGetChildren, "callGetChildren", &child);
} else {
- zend_call_method_with_0_params(Z_OBJ_P(zobject), ce, NULL, "getchildren", &child);
+ zend_class_entry *ce = object->iterators[object->level].ce;
+ zend_object *obj = Z_OBJ(object->iterators[object->level].zobject);
+ zend_function **cache = &object->iterators[object->level].getchildren;
+
+ zend_call_method_with_0_params(obj, ce, cache, "getchildren", &child);
}
if (EG(exception)) {
@@ -350,6 +355,16 @@ next_step:
object->iterators[object->level].iterator = sub_iter;
object->iterators[object->level].ce = ce;
object->iterators[object->level].state = RS_START;
+ if (object->level > 0
+ && object->iterators[object->level - 1].ce == 0) {
+ object->iterators[object->level].haschildren =
+ object->iterators[object->level - 1].haschildren;
+ object->iterators[object->level].getchildren =
+ object->iterators[object->level - 1].getchildren;
+ } else {
+ object->iterators[object->level].haschildren = NULL;
+ object->iterators[object->level].getchildren = NULL;
+ }
if (sub_iter->funcs->rewind) {
sub_iter->funcs->rewind(sub_iter);
}
@@ -572,6 +587,8 @@ static void spl_recursive_it_it_construct(INTERNAL_FUNCTION_PARAMETERS, zend_cla
ZVAL_OBJ(&intern->iterators[0].zobject, Z_OBJ_P(iterator));
intern->iterators[0].ce = ce_iterator;
intern->iterators[0].state = RS_START;
+ intern->iterators[0].haschildren = NULL;
+ intern->iterators[0].getchildren = NULL;
zend_restore_error_handling(&error_handling);
@@ -685,7 +702,7 @@ PHP_METHOD(RecursiveIteratorIterator, getSubIterator)
{
spl_recursive_it_object *object = Z_SPLRECURSIVE_IT_P(ZEND_THIS);
zend_long level;
- zend_bool level_is_null = 1;
+ bool level_is_null = 1;
zval *value;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!", &level, &level_is_null) == FAILURE) {
@@ -761,7 +778,7 @@ PHP_METHOD(RecursiveIteratorIterator, callHasChildren)
if (Z_TYPE_P(zobject) == IS_UNDEF) {
RETURN_FALSE;
} else {
- zend_call_method_with_0_params(Z_OBJ_P(zobject), ce, NULL, "haschildren", return_value);
+ zend_call_method_with_0_params(Z_OBJ_P(zobject), ce, &object->iterators[object->level].haschildren, "haschildren", return_value);
if (Z_TYPE_P(return_value) == IS_UNDEF) {
RETURN_FALSE;
}
@@ -785,7 +802,7 @@ PHP_METHOD(RecursiveIteratorIterator, callGetChildren)
if (Z_TYPE_P(zobject) == IS_UNDEF) {
return;
} else {
- zend_call_method_with_0_params(Z_OBJ_P(zobject), ce, NULL, "getchildren", return_value);
+ zend_call_method_with_0_params(Z_OBJ_P(zobject), ce, &object->iterators[object->level].getchildren, "getchildren", return_value);
if (Z_TYPE_P(return_value) == IS_UNDEF) {
RETURN_NULL();
}
@@ -3135,7 +3152,7 @@ static int spl_iterator_to_values_apply(zend_object_iterator *iter, void *puser)
PHP_FUNCTION(iterator_to_array)
{
zval *obj;
- zend_bool use_keys = 1;
+ bool use_keys = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|b", &obj, zend_ce_traversable, &use_keys) == FAILURE) {
RETURN_THROWS();
@@ -3217,11 +3234,13 @@ PHP_FUNCTION(iterator_apply)
/* {{{ PHP_MINIT_FUNCTION(spl_iterators) */
PHP_MINIT_FUNCTION(spl_iterators)
{
- REGISTER_SPL_INTERFACE(RecursiveIterator);
- REGISTER_SPL_ITERATOR(RecursiveIterator);
+ spl_ce_RecursiveIterator = register_class_RecursiveIterator(zend_ce_iterator);
- REGISTER_SPL_STD_CLASS_EX(RecursiveIteratorIterator, spl_RecursiveIteratorIterator_new, class_RecursiveIteratorIterator_methods);
- REGISTER_SPL_ITERATOR(RecursiveIteratorIterator);
+ spl_ce_OuterIterator = register_class_OuterIterator(zend_ce_iterator);
+
+ spl_ce_RecursiveIteratorIterator = register_class_RecursiveIteratorIterator(spl_ce_OuterIterator);
+ spl_ce_RecursiveIteratorIterator->create_object = spl_RecursiveIteratorIterator_new;
+ spl_ce_RecursiveIteratorIterator->get_iterator = spl_recursive_it_get_iterator;
memcpy(&spl_handlers_rec_it_it, &std_object_handlers, sizeof(zend_object_handlers));
spl_handlers_rec_it_it.offset = XtOffsetOf(spl_recursive_it_object, std);
@@ -3238,43 +3257,36 @@ PHP_MINIT_FUNCTION(spl_iterators)
spl_handlers_dual_it.free_obj = spl_dual_it_free_storage;
spl_handlers_dual_it.get_gc = spl_dual_it_get_gc;
- spl_ce_RecursiveIteratorIterator->get_iterator = spl_recursive_it_get_iterator;
-
REGISTER_SPL_CLASS_CONST_LONG(RecursiveIteratorIterator, "LEAVES_ONLY", RIT_LEAVES_ONLY);
REGISTER_SPL_CLASS_CONST_LONG(RecursiveIteratorIterator, "SELF_FIRST", RIT_SELF_FIRST);
REGISTER_SPL_CLASS_CONST_LONG(RecursiveIteratorIterator, "CHILD_FIRST", RIT_CHILD_FIRST);
REGISTER_SPL_CLASS_CONST_LONG(RecursiveIteratorIterator, "CATCH_GET_CHILD", RIT_CATCH_GET_CHILD);
- REGISTER_SPL_INTERFACE(OuterIterator);
- REGISTER_SPL_ITERATOR(OuterIterator);
-
- REGISTER_SPL_STD_CLASS_EX(IteratorIterator, spl_dual_it_new, class_IteratorIterator_methods);
- REGISTER_SPL_ITERATOR(IteratorIterator);
- REGISTER_SPL_IMPLEMENTS(IteratorIterator, OuterIterator);
-
- REGISTER_SPL_SUB_CLASS_EX(FilterIterator, IteratorIterator, spl_dual_it_new, class_FilterIterator_methods);
- spl_ce_FilterIterator->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS;
+ spl_ce_IteratorIterator = register_class_IteratorIterator(spl_ce_OuterIterator);
+ spl_ce_IteratorIterator->create_object = spl_dual_it_new;
- REGISTER_SPL_SUB_CLASS_EX(RecursiveFilterIterator, FilterIterator, spl_dual_it_new, class_RecursiveFilterIterator_methods);
- REGISTER_SPL_IMPLEMENTS(RecursiveFilterIterator, RecursiveIterator);
+ spl_ce_FilterIterator = register_class_FilterIterator(spl_ce_IteratorIterator);
+ spl_ce_FilterIterator->create_object = spl_dual_it_new;
- REGISTER_SPL_SUB_CLASS_EX(CallbackFilterIterator, FilterIterator, spl_dual_it_new, class_CallbackFilterIterator_methods);
+ spl_ce_RecursiveFilterIterator = register_class_RecursiveFilterIterator(spl_ce_FilterIterator, spl_ce_RecursiveIterator);
+ spl_ce_RecursiveFilterIterator->create_object = spl_dual_it_new;
- REGISTER_SPL_SUB_CLASS_EX(RecursiveCallbackFilterIterator, CallbackFilterIterator, spl_dual_it_new, class_RecursiveCallbackFilterIterator_methods);
- REGISTER_SPL_IMPLEMENTS(RecursiveCallbackFilterIterator, RecursiveIterator);
+ spl_ce_CallbackFilterIterator = register_class_CallbackFilterIterator(spl_ce_FilterIterator);
+ spl_ce_CallbackFilterIterator->create_object = spl_dual_it_new;
+ spl_ce_RecursiveCallbackFilterIterator = register_class_RecursiveCallbackFilterIterator(spl_ce_CallbackFilterIterator, spl_ce_RecursiveIterator);
+ spl_ce_RecursiveCallbackFilterIterator->create_object = spl_dual_it_new;
- REGISTER_SPL_SUB_CLASS_EX(ParentIterator, RecursiveFilterIterator, spl_dual_it_new, class_ParentIterator_methods);
+ spl_ce_ParentIterator = register_class_ParentIterator(spl_ce_RecursiveFilterIterator);
+ spl_ce_ParentIterator->create_object = spl_dual_it_new;
- REGISTER_SPL_INTERFACE(SeekableIterator);
- REGISTER_SPL_ITERATOR(SeekableIterator);
+ spl_ce_SeekableIterator = register_class_SeekableIterator(zend_ce_iterator);
- REGISTER_SPL_SUB_CLASS_EX(LimitIterator, IteratorIterator, spl_dual_it_new, class_LimitIterator_methods);
+ spl_ce_LimitIterator = register_class_LimitIterator(spl_ce_IteratorIterator);
+ spl_ce_LimitIterator->create_object = spl_dual_it_new;
- REGISTER_SPL_SUB_CLASS_EX(CachingIterator, IteratorIterator, spl_dual_it_new, class_CachingIterator_methods);
- REGISTER_SPL_IMPLEMENTS(CachingIterator, ArrayAccess);
- REGISTER_SPL_IMPLEMENTS(CachingIterator, Countable);
- REGISTER_SPL_IMPLEMENTS(CachingIterator, Stringable);
+ spl_ce_CachingIterator = register_class_CachingIterator(spl_ce_IteratorIterator, zend_ce_arrayaccess, zend_ce_countable, zend_ce_stringable);
+ spl_ce_CachingIterator->create_object = spl_dual_it_new;
REGISTER_SPL_CLASS_CONST_LONG(CachingIterator, "CALL_TOSTRING", CIT_CALL_TOSTRING);
REGISTER_SPL_CLASS_CONST_LONG(CachingIterator, "CATCH_GET_CHILD", CIT_CATCH_GET_CHILD);
@@ -3283,17 +3295,21 @@ PHP_MINIT_FUNCTION(spl_iterators)
REGISTER_SPL_CLASS_CONST_LONG(CachingIterator, "TOSTRING_USE_INNER", CIT_TOSTRING_USE_INNER);
REGISTER_SPL_CLASS_CONST_LONG(CachingIterator, "FULL_CACHE", CIT_FULL_CACHE);
- REGISTER_SPL_SUB_CLASS_EX(RecursiveCachingIterator, CachingIterator, spl_dual_it_new, class_RecursiveCachingIterator_methods);
- REGISTER_SPL_IMPLEMENTS(RecursiveCachingIterator, RecursiveIterator);
+ spl_ce_RecursiveCachingIterator = register_class_RecursiveCachingIterator(spl_ce_CachingIterator, spl_ce_RecursiveIterator);
+ spl_ce_RecursiveCachingIterator->create_object = spl_dual_it_new;
- REGISTER_SPL_SUB_CLASS_EX(NoRewindIterator, IteratorIterator, spl_dual_it_new, class_NoRewindIterator_methods);
+ spl_ce_NoRewindIterator = register_class_NoRewindIterator(spl_ce_IteratorIterator);
+ spl_ce_NoRewindIterator->create_object = spl_dual_it_new;
- REGISTER_SPL_SUB_CLASS_EX(AppendIterator, IteratorIterator, spl_dual_it_new, class_AppendIterator_methods);
+ spl_ce_AppendIterator = register_class_AppendIterator(spl_ce_IteratorIterator);
+ spl_ce_AppendIterator->create_object = spl_dual_it_new;
- REGISTER_SPL_IMPLEMENTS(RecursiveIteratorIterator, OuterIterator);
+ spl_ce_InfiniteIterator = register_class_InfiniteIterator(spl_ce_IteratorIterator);
+ spl_ce_InfiniteIterator->create_object = spl_dual_it_new;
+
+ spl_ce_RegexIterator = register_class_RegexIterator(spl_ce_FilterIterator);
+ spl_ce_RegexIterator->create_object = spl_dual_it_new;
- REGISTER_SPL_SUB_CLASS_EX(InfiniteIterator, IteratorIterator, spl_dual_it_new, class_InfiniteIterator_methods);
- REGISTER_SPL_SUB_CLASS_EX(RegexIterator, FilterIterator, spl_dual_it_new, class_RegexIterator_methods);
REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "USE_KEY", REGIT_USE_KEY);
REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "INVERT_MATCH",REGIT_INVERTED);
REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "MATCH", REGIT_MODE_MATCH);
@@ -3301,14 +3317,15 @@ PHP_MINIT_FUNCTION(spl_iterators)
REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "ALL_MATCHES", REGIT_MODE_ALL_MATCHES);
REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "SPLIT", REGIT_MODE_SPLIT);
REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "REPLACE", REGIT_MODE_REPLACE);
- REGISTER_SPL_PROPERTY(RegexIterator, "replacement", 0);
- REGISTER_SPL_SUB_CLASS_EX(RecursiveRegexIterator, RegexIterator, spl_dual_it_new, class_RecursiveRegexIterator_methods);
- REGISTER_SPL_IMPLEMENTS(RecursiveRegexIterator, RecursiveIterator);
- REGISTER_SPL_STD_CLASS_EX(EmptyIterator, NULL, class_EmptyIterator_methods);
- REGISTER_SPL_ITERATOR(EmptyIterator);
+ spl_ce_RecursiveRegexIterator = register_class_RecursiveRegexIterator(spl_ce_RegexIterator, spl_ce_RecursiveIterator);
+ spl_ce_RecursiveRegexIterator->create_object = spl_dual_it_new;
+
+ spl_ce_EmptyIterator = register_class_EmptyIterator(zend_ce_iterator);
+
+ spl_ce_RecursiveTreeIterator = register_class_RecursiveTreeIterator(spl_ce_RecursiveIteratorIterator);
+ spl_ce_RecursiveTreeIterator->create_object = spl_RecursiveTreeIterator_new;
- REGISTER_SPL_SUB_CLASS_EX(RecursiveTreeIterator, RecursiveIteratorIterator, spl_RecursiveTreeIterator_new, class_RecursiveTreeIterator_methods);
REGISTER_SPL_CLASS_CONST_LONG(RecursiveTreeIterator, "BYPASS_CURRENT", RTIT_BYPASS_CURRENT);
REGISTER_SPL_CLASS_CONST_LONG(RecursiveTreeIterator, "BYPASS_KEY", RTIT_BYPASS_KEY);
REGISTER_SPL_CLASS_CONST_LONG(RecursiveTreeIterator, "PREFIX_LEFT", 0);
diff --git a/ext/spl/spl_iterators.h b/ext/spl/spl_iterators.h
index 5d890bb2b9..d733fb18a1 100644
--- a/ext/spl/spl_iterators.h
+++ b/ext/spl/spl_iterators.h
@@ -21,40 +21,32 @@
#include "php_spl.h"
#include "ext/pcre/php_pcre.h"
-#define spl_ce_Traversable zend_ce_traversable
-#define spl_ce_Iterator zend_ce_iterator
-#define spl_ce_Aggregate zend_ce_aggregate
-#define spl_ce_ArrayAccess zend_ce_arrayaccess
-#define spl_ce_Serializable zend_ce_serializable
-#define spl_ce_Countable zend_ce_countable
-#define spl_ce_Stringable zend_ce_stringable
-
-extern PHPAPI zend_class_entry *spl_ce_RecursiveIterator;
-extern PHPAPI zend_class_entry *spl_ce_RecursiveIteratorIterator;
-extern PHPAPI zend_class_entry *spl_ce_RecursiveTreeIterator;
-extern PHPAPI zend_class_entry *spl_ce_FilterIterator;
-extern PHPAPI zend_class_entry *spl_ce_RecursiveFilterIterator;
-extern PHPAPI zend_class_entry *spl_ce_ParentIterator;
-extern PHPAPI zend_class_entry *spl_ce_SeekableIterator;
-extern PHPAPI zend_class_entry *spl_ce_LimitIterator;
+extern PHPAPI zend_class_entry *spl_ce_AppendIterator;
extern PHPAPI zend_class_entry *spl_ce_CachingIterator;
-extern PHPAPI zend_class_entry *spl_ce_RecursiveCachingIterator;
-extern PHPAPI zend_class_entry *spl_ce_OuterIterator;
+extern PHPAPI zend_class_entry *spl_ce_CallbackFilterIterator;
+extern PHPAPI zend_class_entry *spl_ce_EmptyIterator;
+extern PHPAPI zend_class_entry *spl_ce_FilterIterator;
+extern PHPAPI zend_class_entry *spl_ce_InfiniteIterator;
extern PHPAPI zend_class_entry *spl_ce_IteratorIterator;
+extern PHPAPI zend_class_entry *spl_ce_LimitIterator;
extern PHPAPI zend_class_entry *spl_ce_NoRewindIterator;
-extern PHPAPI zend_class_entry *spl_ce_InfiniteIterator;
-extern PHPAPI zend_class_entry *spl_ce_EmptyIterator;
-extern PHPAPI zend_class_entry *spl_ce_AppendIterator;
-extern PHPAPI zend_class_entry *spl_ce_RegexIterator;
-extern PHPAPI zend_class_entry *spl_ce_RecursiveRegexIterator;
-extern PHPAPI zend_class_entry *spl_ce_CallbackFilterIterator;
+extern PHPAPI zend_class_entry *spl_ce_OuterIterator;
+extern PHPAPI zend_class_entry *spl_ce_ParentIterator;
+extern PHPAPI zend_class_entry *spl_ce_RecursiveCachingIterator;
extern PHPAPI zend_class_entry *spl_ce_RecursiveCallbackFilterIterator;
+extern PHPAPI zend_class_entry *spl_ce_RecursiveFilterIterator;
+extern PHPAPI zend_class_entry *spl_ce_RecursiveIterator;
+extern PHPAPI zend_class_entry *spl_ce_RecursiveIteratorIterator;
+extern PHPAPI zend_class_entry *spl_ce_RecursiveRegexIterator;
+extern PHPAPI zend_class_entry *spl_ce_RecursiveTreeIterator;
+extern PHPAPI zend_class_entry *spl_ce_RegexIterator;
+extern PHPAPI zend_class_entry *spl_ce_SeekableIterator;
PHP_MINIT_FUNCTION(spl_iterators);
-PHP_FUNCTION(iterator_to_array);
-PHP_FUNCTION(iterator_count);
PHP_FUNCTION(iterator_apply);
+PHP_FUNCTION(iterator_count);
+PHP_FUNCTION(iterator_to_array);
typedef enum {
DIT_Default = 0,
diff --git a/ext/spl/spl_iterators.stub.php b/ext/spl/spl_iterators.stub.php
index 437efec46b..2038fd6499 100644
--- a/ext/spl/spl_iterators.stub.php
+++ b/ext/spl/spl_iterators.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class EmptyIterator implements Iterator
{
@@ -198,7 +198,7 @@ class LimitIterator extends IteratorIterator
public function getPosition() {}
}
-class CachingIterator extends IteratorIterator implements ArrayAccess, Countable
+class CachingIterator extends IteratorIterator implements ArrayAccess, Countable, Stringable
{
public function __construct(Iterator $iterator, int $flags = self::CALL_TOSTRING) {}
@@ -320,6 +320,9 @@ class InfiniteIterator extends IteratorIterator
class RegexIterator extends FilterIterator
{
+ /** @var string|null */
+ public $replacement;
+
public function __construct(Iterator $iterator, string $pattern, int $mode = self::MATCH, int $flags = 0, int $pregFlags = 0) {}
/** @return bool */
diff --git a/ext/spl/spl_iterators_arginfo.h b/ext/spl/spl_iterators_arginfo.h
index 999528883a..71738cad89 100644
--- a/ext/spl/spl_iterators_arginfo.h
+++ b/ext/spl/spl_iterators_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: ae7df94646bf08874d7b9804833d0081c40e0348 */
+ * Stub hash: a2f4e91b58d1af4954a2665a8fac10a4e0d9e31d */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_EmptyIterator_current, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -591,3 +591,222 @@ static const zend_function_entry class_RecursiveTreeIterator_methods[] = {
ZEND_ME(RecursiveTreeIterator, getPostfix, arginfo_class_RecursiveTreeIterator_getPostfix, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_EmptyIterator(zend_class_entry *class_entry_Iterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "EmptyIterator", class_EmptyIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Iterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_CallbackFilterIterator(zend_class_entry *class_entry_FilterIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "CallbackFilterIterator", class_CallbackFilterIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_FilterIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RecursiveCallbackFilterIterator(zend_class_entry *class_entry_CallbackFilterIterator, zend_class_entry *class_entry_RecursiveIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RecursiveCallbackFilterIterator", class_RecursiveCallbackFilterIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_CallbackFilterIterator);
+ zend_class_implements(class_entry, 1, class_entry_RecursiveIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RecursiveIterator(zend_class_entry *class_entry_Iterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RecursiveIterator", class_RecursiveIterator_methods);
+ class_entry = zend_register_internal_interface(&ce);
+ zend_class_implements(class_entry, 1, class_entry_Iterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RecursiveIteratorIterator(zend_class_entry *class_entry_OuterIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RecursiveIteratorIterator", class_RecursiveIteratorIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_OuterIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_OuterIterator(zend_class_entry *class_entry_Iterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "OuterIterator", class_OuterIterator_methods);
+ class_entry = zend_register_internal_interface(&ce);
+ zend_class_implements(class_entry, 1, class_entry_Iterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_IteratorIterator(zend_class_entry *class_entry_OuterIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "IteratorIterator", class_IteratorIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_OuterIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_FilterIterator(zend_class_entry *class_entry_IteratorIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "FilterIterator", class_FilterIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_IteratorIterator);
+ class_entry->ce_flags |= ZEND_ACC_ABSTRACT;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RecursiveFilterIterator(zend_class_entry *class_entry_FilterIterator, zend_class_entry *class_entry_RecursiveIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RecursiveFilterIterator", class_RecursiveFilterIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_FilterIterator);
+ class_entry->ce_flags |= ZEND_ACC_ABSTRACT;
+ zend_class_implements(class_entry, 1, class_entry_RecursiveIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ParentIterator(zend_class_entry *class_entry_RecursiveFilterIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ParentIterator", class_ParentIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RecursiveFilterIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SeekableIterator(zend_class_entry *class_entry_Iterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SeekableIterator", class_SeekableIterator_methods);
+ class_entry = zend_register_internal_interface(&ce);
+ zend_class_implements(class_entry, 1, class_entry_Iterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_LimitIterator(zend_class_entry *class_entry_IteratorIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "LimitIterator", class_LimitIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_IteratorIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_CachingIterator(zend_class_entry *class_entry_IteratorIterator, zend_class_entry *class_entry_ArrayAccess, zend_class_entry *class_entry_Countable, zend_class_entry *class_entry_Stringable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "CachingIterator", class_CachingIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_IteratorIterator);
+ zend_class_implements(class_entry, 3, class_entry_ArrayAccess, class_entry_Countable, class_entry_Stringable);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RecursiveCachingIterator(zend_class_entry *class_entry_CachingIterator, zend_class_entry *class_entry_RecursiveIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RecursiveCachingIterator", class_RecursiveCachingIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_CachingIterator);
+ zend_class_implements(class_entry, 1, class_entry_RecursiveIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_NoRewindIterator(zend_class_entry *class_entry_IteratorIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "NoRewindIterator", class_NoRewindIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_IteratorIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_AppendIterator(zend_class_entry *class_entry_IteratorIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "AppendIterator", class_AppendIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_IteratorIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_InfiniteIterator(zend_class_entry *class_entry_IteratorIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "InfiniteIterator", class_InfiniteIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_IteratorIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RegexIterator(zend_class_entry *class_entry_FilterIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RegexIterator", class_RegexIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_FilterIterator);
+
+ zval property_replacement_default_value;
+ ZVAL_NULL(&property_replacement_default_value);
+ zend_string *property_replacement_name = zend_string_init("replacement", sizeof("replacement") - 1, 1);
+ zend_declare_property_ex(class_entry, property_replacement_name, &property_replacement_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_replacement_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RecursiveRegexIterator(zend_class_entry *class_entry_RegexIterator, zend_class_entry *class_entry_RecursiveIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RecursiveRegexIterator", class_RecursiveRegexIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RegexIterator);
+ zend_class_implements(class_entry, 1, class_entry_RecursiveIterator);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_RecursiveTreeIterator(zend_class_entry *class_entry_RecursiveIteratorIterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "RecursiveTreeIterator", class_RecursiveTreeIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_RecursiveIteratorIterator);
+
+ return class_entry;
+}
diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c
index 3f134b77db..999c54d1f4 100644
--- a/ext/spl/spl_observer.c
+++ b/ext/spl/spl_observer.c
@@ -55,7 +55,7 @@ typedef struct _spl_SplObjectStorage { /* {{{ */
/* {{{ storage is an assoc array of [zend_object*]=>[zval *obj, zval *inf] */
typedef struct _spl_SplObjectStorageElement {
- zval obj;
+ zend_object *obj;
zval inf;
} spl_SplObjectStorageElement; /* }}} */
@@ -75,11 +75,13 @@ void spl_SplObjectStorage_free_storage(zend_object *object) /* {{{ */
zend_hash_destroy(&intern->storage);
} /* }}} */
-static int spl_object_storage_get_hash(zend_hash_key *key, spl_SplObjectStorage *intern, zval *obj) {
+static int spl_object_storage_get_hash(zend_hash_key *key, spl_SplObjectStorage *intern, zend_object *obj) {
if (intern->fptr_get_hash) {
+ zval param;
zval rv;
+ ZVAL_OBJ(&param, obj);
zend_call_method_with_1_params(
- &intern->std, intern->std.ce, &intern->fptr_get_hash, "getHash", &rv, obj);
+ &intern->std, intern->std.ce, &intern->fptr_get_hash, "getHash", &rv, &param);
if (!Z_ISUNDEF(rv)) {
if (Z_TYPE(rv) == IS_STRING) {
key->key = Z_STR(rv);
@@ -95,7 +97,7 @@ static int spl_object_storage_get_hash(zend_hash_key *key, spl_SplObjectStorage
}
} else {
key->key = NULL;
- key->h = Z_OBJ_HANDLE_P(obj);
+ key->h = obj->handle;
return SUCCESS;
}
}
@@ -109,7 +111,7 @@ static void spl_object_storage_free_hash(spl_SplObjectStorage *intern, zend_hash
static void spl_object_storage_dtor(zval *element) /* {{{ */
{
spl_SplObjectStorageElement *el = Z_PTR_P(element);
- zval_ptr_dtor(&el->obj);
+ zend_object_release(el->obj);
zval_ptr_dtor(&el->inf);
efree(el);
} /* }}} */
@@ -123,7 +125,7 @@ static spl_SplObjectStorageElement* spl_object_storage_get(spl_SplObjectStorage
}
} /* }}} */
-spl_SplObjectStorageElement *spl_object_storage_attach(spl_SplObjectStorage *intern, zval *obj, zval *inf) /* {{{ */
+spl_SplObjectStorageElement *spl_object_storage_attach(spl_SplObjectStorage *intern, zend_object *obj, zval *inf) /* {{{ */
{
spl_SplObjectStorageElement *pelement, element;
zend_hash_key key;
@@ -144,7 +146,8 @@ spl_SplObjectStorageElement *spl_object_storage_attach(spl_SplObjectStorage *int
return pelement;
}
- ZVAL_COPY(&element.obj, obj);
+ element.obj = obj;
+ GC_ADDREF(obj);
if (inf) {
ZVAL_COPY(&element.inf, inf);
} else {
@@ -159,7 +162,7 @@ spl_SplObjectStorageElement *spl_object_storage_attach(spl_SplObjectStorage *int
return pelement;
} /* }}} */
-static int spl_object_storage_detach(spl_SplObjectStorage *intern, zval *obj) /* {{{ */
+static int spl_object_storage_detach(spl_SplObjectStorage *intern, zend_object *obj) /* {{{ */
{
int ret = FAILURE;
zend_hash_key key;
@@ -180,7 +183,7 @@ void spl_object_storage_addall(spl_SplObjectStorage *intern, spl_SplObjectStorag
spl_SplObjectStorageElement *element;
ZEND_HASH_FOREACH_PTR(&other->storage, element) {
- spl_object_storage_attach(intern, &element->obj, &element->inf);
+ spl_object_storage_attach(intern, element->obj, &element->inf);
} ZEND_HASH_FOREACH_END();
intern->index = 0;
@@ -256,12 +259,14 @@ static inline HashTable* spl_object_storage_debug_info(zend_object *obj) /* {{{
array_init(&storage);
ZEND_HASH_FOREACH_PTR(&intern->storage, element) {
- md5str = php_spl_object_hash(&element->obj);
+ md5str = php_spl_object_hash(element->obj);
array_init(&tmp);
/* Incrementing the refcount of obj and inf would confuse the garbage collector.
* Prefer to null the destructor */
Z_ARRVAL_P(&tmp)->pDestructor = NULL;
- add_assoc_zval_ex(&tmp, "obj", sizeof("obj") - 1, &element->obj);
+ zval obj;
+ ZVAL_OBJ(&obj, element->obj);
+ add_assoc_zval_ex(&tmp, "obj", sizeof("obj") - 1, &obj);
add_assoc_zval_ex(&tmp, "inf", sizeof("inf") - 1, &element->inf);
zend_hash_update(Z_ARRVAL(storage), md5str, &tmp);
zend_string_release_ex(md5str, 0);
@@ -283,7 +288,7 @@ static HashTable *spl_object_storage_get_gc(zend_object *obj, zval **table, int
zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create();
ZEND_HASH_FOREACH_PTR(&intern->storage, element) {
- zend_get_gc_buffer_add_zval(gc_buffer, &element->obj);
+ zend_get_gc_buffer_add_obj(gc_buffer, element->obj);
zend_get_gc_buffer_add_zval(gc_buffer, &element->inf);
} ZEND_HASH_FOREACH_END();
@@ -326,7 +331,7 @@ static zend_object *spl_SplObjectStorage_new(zend_class_entry *class_type)
}
/* }}} */
-int spl_object_storage_contains(spl_SplObjectStorage *intern, zval *obj) /* {{{ */
+int spl_object_storage_contains(spl_SplObjectStorage *intern, zend_object *obj) /* {{{ */
{
int found;
zend_hash_key key;
@@ -346,25 +351,28 @@ int spl_object_storage_contains(spl_SplObjectStorage *intern, zval *obj) /* {{{
/* {{{ Attaches an object to the storage if not yet contained */
PHP_METHOD(SplObjectStorage, attach)
{
- zval *obj, *inf = NULL;
+ zend_object *obj;
+ zval *inf = NULL;
spl_SplObjectStorage *intern = Z_SPLOBJSTORAGE_P(ZEND_THIS);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "o|z!", &obj, &inf) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 2)
+ Z_PARAM_OBJ(obj)
+ Z_PARAM_OPTIONAL
+ Z_PARAM_ZVAL(inf)
+ ZEND_PARSE_PARAMETERS_END();
spl_object_storage_attach(intern, obj, inf);
} /* }}} */
/* {{{ Detaches an object from the storage */
PHP_METHOD(SplObjectStorage, detach)
{
- zval *obj;
+ zend_object *obj;
spl_SplObjectStorage *intern = Z_SPLOBJSTORAGE_P(ZEND_THIS);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &obj) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_OBJ(obj)
+ ZEND_PARSE_PARAMETERS_END();
spl_object_storage_detach(intern, obj);
zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
@@ -374,11 +382,11 @@ PHP_METHOD(SplObjectStorage, detach)
/* {{{ Returns the hash of an object */
PHP_METHOD(SplObjectStorage, getHash)
{
- zval *obj;
+ zend_object *obj;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &obj) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_OBJ(obj)
+ ZEND_PARSE_PARAMETERS_END();
RETURN_NEW_STR(php_spl_object_hash(obj));
@@ -387,14 +395,14 @@ PHP_METHOD(SplObjectStorage, getHash)
/* {{{ Returns associated information for a stored object */
PHP_METHOD(SplObjectStorage, offsetGet)
{
- zval *obj;
+ zend_object *obj;
spl_SplObjectStorageElement *element;
spl_SplObjectStorage *intern = Z_SPLOBJSTORAGE_P(ZEND_THIS);
zend_hash_key key;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &obj) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_OBJ(obj)
+ ZEND_PARSE_PARAMETERS_END();
if (spl_object_storage_get_hash(&key, intern, obj) == FAILURE) {
return;
@@ -446,7 +454,7 @@ PHP_METHOD(SplObjectStorage, removeAll)
zend_hash_internal_pointer_reset(&other->storage);
while ((element = zend_hash_get_current_data_ptr(&other->storage)) != NULL) {
- if (spl_object_storage_detach(intern, &element->obj) == FAILURE) {
+ if (spl_object_storage_detach(intern, element->obj) == FAILURE) {
zend_hash_move_forward(&other->storage);
}
}
@@ -472,8 +480,8 @@ PHP_METHOD(SplObjectStorage, removeAllExcept)
other = Z_SPLOBJSTORAGE_P(obj);
ZEND_HASH_FOREACH_PTR(&intern->storage, element) {
- if (!spl_object_storage_contains(other, &element->obj)) {
- spl_object_storage_detach(intern, &element->obj);
+ if (!spl_object_storage_contains(other, element->obj)) {
+ spl_object_storage_detach(intern, element->obj);
}
} ZEND_HASH_FOREACH_END();
@@ -487,12 +495,12 @@ PHP_METHOD(SplObjectStorage, removeAllExcept)
/* {{{ Determine whether an object is contained in the storage */
PHP_METHOD(SplObjectStorage, contains)
{
- zval *obj;
+ zend_object *obj;
spl_SplObjectStorage *intern = Z_SPLOBJSTORAGE_P(ZEND_THIS);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &obj) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_OBJ(obj)
+ ZEND_PARSE_PARAMETERS_END();
RETURN_BOOL(spl_object_storage_contains(intern, obj));
} /* }}} */
@@ -507,16 +515,7 @@ PHP_METHOD(SplObjectStorage, count)
}
if (mode == COUNT_RECURSIVE) {
- zend_long ret;
-
- if (mode != COUNT_RECURSIVE) {
- ret = zend_hash_num_elements(&intern->storage);
- } else {
- ret = php_count_recursive(&intern->storage);
- }
-
- RETURN_LONG(ret);
- return;
+ RETURN_LONG(php_count_recursive(&intern->storage));
}
RETURN_LONG(zend_hash_num_elements(&intern->storage));
@@ -572,7 +571,7 @@ PHP_METHOD(SplObjectStorage, current)
if ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) == NULL) {
return;
}
- ZVAL_COPY(return_value, &element->obj);
+ ZVAL_OBJ_COPY(return_value, element->obj);
} /* }}} */
/* {{{ Returns associated information to current element */
@@ -647,12 +646,14 @@ PHP_METHOD(SplObjectStorage, serialize)
zend_hash_internal_pointer_reset_ex(&intern->storage, &pos);
while (zend_hash_has_more_elements_ex(&intern->storage, &pos) == SUCCESS) {
+ zval obj;
if ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &pos)) == NULL) {
smart_str_free(&buf);
PHP_VAR_SERIALIZE_DESTROY(var_hash);
RETURN_NULL();
}
- php_var_serialize(&buf, &element->obj, &var_hash);
+ ZVAL_OBJ(&obj, element->obj);
+ php_var_serialize(&buf, &obj, &var_hash);
smart_str_appendc(&buf, ',');
php_var_serialize(&buf, &element->inf, &var_hash);
smart_str_appendc(&buf, ';');
@@ -681,7 +682,6 @@ PHP_METHOD(SplObjectStorage, unserialize)
size_t buf_len;
const unsigned char *p, *s;
php_unserialize_data_t var_hash;
- zval entry, inf;
zval *pcount, *pmembers;
spl_SplObjectStorageElement *element;
zend_long count;
@@ -714,12 +714,12 @@ PHP_METHOD(SplObjectStorage, unserialize)
goto outexcept;
}
- ZVAL_UNDEF(&entry);
- ZVAL_UNDEF(&inf);
-
while (count-- > 0) {
spl_SplObjectStorageElement *pelement;
zend_hash_key key;
+ zval *entry = var_tmp_var(&var_hash);
+ zval inf;
+ ZVAL_UNDEF(&inf);
if (*p != ';') {
goto outexcept;
@@ -729,46 +729,38 @@ PHP_METHOD(SplObjectStorage, unserialize)
goto outexcept;
}
/* store reference to allow cross-references between different elements */
- if (!php_var_unserialize(&entry, &p, s + buf_len, &var_hash)) {
- zval_ptr_dtor(&entry);
+ if (!php_var_unserialize(entry, &p, s + buf_len, &var_hash)) {
goto outexcept;
}
if (*p == ',') { /* new version has inf */
++p;
if (!php_var_unserialize(&inf, &p, s + buf_len, &var_hash)) {
- zval_ptr_dtor(&entry);
zval_ptr_dtor(&inf);
goto outexcept;
}
}
- if (Z_TYPE(entry) != IS_OBJECT) {
- zval_ptr_dtor(&entry);
+ if (Z_TYPE_P(entry) != IS_OBJECT) {
zval_ptr_dtor(&inf);
goto outexcept;
}
- if (spl_object_storage_get_hash(&key, intern, &entry) == FAILURE) {
- zval_ptr_dtor(&entry);
+ if (spl_object_storage_get_hash(&key, intern, Z_OBJ_P(entry)) == FAILURE) {
zval_ptr_dtor(&inf);
goto outexcept;
}
pelement = spl_object_storage_get(intern, &key);
spl_object_storage_free_hash(intern, &key);
if (pelement) {
+ zval obj;
if (!Z_ISUNDEF(pelement->inf)) {
var_push_dtor(&var_hash, &pelement->inf);
}
- if (!Z_ISUNDEF(pelement->obj)) {
- var_push_dtor(&var_hash, &pelement->obj);
- }
+ ZVAL_OBJ(&obj, pelement->obj);
+ var_push_dtor(&var_hash, &obj);
}
- element = spl_object_storage_attach(intern, &entry, Z_ISUNDEF(inf)?NULL:&inf);
- var_replace(&var_hash, &entry, &element->obj);
+ element = spl_object_storage_attach(intern, Z_OBJ_P(entry), Z_ISUNDEF(inf)?NULL:&inf);
var_replace(&var_hash, &inf, &element->inf);
- zval_ptr_dtor(&entry);
- ZVAL_UNDEF(&entry);
zval_ptr_dtor(&inf);
- ZVAL_UNDEF(&inf);
}
if (*p != ';') {
@@ -816,16 +808,17 @@ PHP_METHOD(SplObjectStorage, __serialize)
/* storage */
array_init_size(&tmp, 2 * zend_hash_num_elements(&intern->storage));
ZEND_HASH_FOREACH_PTR(&intern->storage, elem) {
- Z_TRY_ADDREF(elem->obj);
- zend_hash_next_index_insert(Z_ARRVAL(tmp), &elem->obj);
+ zval obj;
+ ZVAL_OBJ_COPY(&obj, elem->obj);
+ zend_hash_next_index_insert(Z_ARRVAL(tmp), &obj);
Z_TRY_ADDREF(elem->inf);
zend_hash_next_index_insert(Z_ARRVAL(tmp), &elem->inf);
} ZEND_HASH_FOREACH_END();
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
/* members */
- ZVAL_ARR(&tmp, zend_std_get_properties(&intern->std));
- Z_TRY_ADDREF(tmp);
+ ZVAL_ARR(&tmp, zend_proptable_to_symtable(
+ zend_std_get_properties(&intern->std), /* always_duplicate */ 1));
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
} /* }}} */
@@ -862,7 +855,7 @@ PHP_METHOD(SplObjectStorage, __unserialize)
RETURN_THROWS();
}
- spl_object_storage_attach(intern, key, val);
+ spl_object_storage_attach(intern, Z_OBJ_P(key), val);
key = NULL;
} else {
key = val;
@@ -936,14 +929,14 @@ PHP_METHOD(MultipleIterator, setFlags)
PHP_METHOD(MultipleIterator, attachIterator)
{
spl_SplObjectStorage *intern;
- zval *iterator = NULL;
+ zend_object *iterator = NULL;
zval zinfo;
zend_string *info_str;
zend_long info_long;
- zend_bool info_is_null = 1;
+ bool info_is_null = 1;
ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_OBJECT_OF_CLASS(iterator, zend_ce_iterator)
+ Z_PARAM_OBJ_OF_CLASS(iterator, zend_ce_iterator)
Z_PARAM_OPTIONAL
Z_PARAM_STR_OR_LONG_OR_NULL(info_str, info_long, info_is_null)
ZEND_PARSE_PARAMETERS_END();
@@ -984,7 +977,7 @@ PHP_METHOD(MultipleIterator, detachIterator)
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &iterator, zend_ce_iterator) == FAILURE) {
RETURN_THROWS();
}
- spl_object_storage_detach(intern, iterator);
+ spl_object_storage_detach(intern, Z_OBJ_P(iterator));
zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
intern->index = 0;
@@ -999,7 +992,7 @@ PHP_METHOD(MultipleIterator, containsIterator)
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &iterator, zend_ce_iterator) == FAILURE) {
RETURN_THROWS();
}
- RETURN_BOOL(spl_object_storage_contains(intern, iterator));
+ RETURN_BOOL(spl_object_storage_contains(intern, Z_OBJ_P(iterator)));
} /* }}} */
PHP_METHOD(MultipleIterator, countIterators)
@@ -1018,7 +1011,6 @@ PHP_METHOD(MultipleIterator, rewind)
{
spl_SplObjectStorage *intern;
spl_SplObjectStorageElement *element;
- zval *it;
intern = Z_SPLOBJSTORAGE_P(ZEND_THIS);
@@ -1028,8 +1020,8 @@ PHP_METHOD(MultipleIterator, rewind)
zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) {
- it = &element->obj;
- zend_call_method_with_0_params(Z_OBJ_P(it), Z_OBJCE_P(it), &Z_OBJCE_P(it)->iterator_funcs_ptr->zf_rewind, "rewind", NULL);
+ zend_object *it = element->obj;
+ zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_rewind, "rewind", NULL);
zend_hash_move_forward_ex(&intern->storage, &intern->pos);
}
}
@@ -1040,7 +1032,6 @@ PHP_METHOD(MultipleIterator, next)
{
spl_SplObjectStorage *intern;
spl_SplObjectStorageElement *element;
- zval *it;
intern = Z_SPLOBJSTORAGE_P(ZEND_THIS);
@@ -1050,8 +1041,8 @@ PHP_METHOD(MultipleIterator, next)
zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) {
- it = &element->obj;
- zend_call_method_with_0_params(Z_OBJ_P(it), Z_OBJCE_P(it), &Z_OBJCE_P(it)->iterator_funcs_ptr->zf_next, "next", NULL);
+ zend_object *it = element->obj;
+ zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_next, "next", NULL);
zend_hash_move_forward_ex(&intern->storage, &intern->pos);
}
}
@@ -1062,7 +1053,7 @@ PHP_METHOD(MultipleIterator, valid)
{
spl_SplObjectStorage *intern;
spl_SplObjectStorageElement *element;
- zval *it, retval;
+ zval retval;
zend_long expect, valid;
intern = Z_SPLOBJSTORAGE_P(ZEND_THIS);
@@ -1079,8 +1070,8 @@ PHP_METHOD(MultipleIterator, valid)
zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) {
- it = &element->obj;
- zend_call_method_with_0_params(Z_OBJ_P(it), Z_OBJCE_P(it), &Z_OBJCE_P(it)->iterator_funcs_ptr->zf_valid, "valid", &retval);
+ zend_object *it = element->obj;
+ zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_valid, "valid", &retval);
if (!Z_ISUNDEF(retval)) {
valid = (Z_TYPE(retval) == IS_TRUE);
@@ -1103,7 +1094,7 @@ PHP_METHOD(MultipleIterator, valid)
static void spl_multiple_iterator_get_all(spl_SplObjectStorage *intern, int get_type, zval *return_value) /* {{{ */
{
spl_SplObjectStorageElement *element;
- zval *it, retval;
+ zval retval;
int valid = 1, num_elements;
num_elements = zend_hash_num_elements(&intern->storage);
@@ -1115,8 +1106,8 @@ static void spl_multiple_iterator_get_all(spl_SplObjectStorage *intern, int get_
zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) {
- it = &element->obj;
- zend_call_method_with_0_params(Z_OBJ_P(it), Z_OBJCE_P(it), &Z_OBJCE_P(it)->iterator_funcs_ptr->zf_valid, "valid", &retval);
+ zend_object *it = element->obj;
+ zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_valid, "valid", &retval);
if (!Z_ISUNDEF(retval)) {
valid = Z_TYPE(retval) == IS_TRUE;
@@ -1127,9 +1118,9 @@ static void spl_multiple_iterator_get_all(spl_SplObjectStorage *intern, int get_
if (valid) {
if (SPL_MULTIPLE_ITERATOR_GET_ALL_CURRENT == get_type) {
- zend_call_method_with_0_params(Z_OBJ_P(it), Z_OBJCE_P(it), &Z_OBJCE_P(it)->iterator_funcs_ptr->zf_current, "current", &retval);
+ zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_current, "current", &retval);
} else {
- zend_call_method_with_0_params(Z_OBJ_P(it), Z_OBJCE_P(it), &Z_OBJCE_P(it)->iterator_funcs_ptr->zf_key, "key", &retval);
+ zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_key, "key", &retval);
}
if (Z_ISUNDEF(retval)) {
zend_throw_exception(spl_ce_RuntimeException, "Failed to call sub iterator method", 0);
@@ -1199,10 +1190,12 @@ PHP_METHOD(MultipleIterator, key)
/* {{{ PHP_MINIT_FUNCTION(spl_observer) */
PHP_MINIT_FUNCTION(spl_observer)
{
- REGISTER_SPL_INTERFACE(SplObserver);
- REGISTER_SPL_INTERFACE(SplSubject);
+ spl_ce_SplObserver = register_class_SplObserver();
+ spl_ce_SplSubject = register_class_SplSubject();
+
+ spl_ce_SplObjectStorage = register_class_SplObjectStorage(zend_ce_countable, zend_ce_iterator, zend_ce_serializable, zend_ce_arrayaccess);
+ spl_ce_SplObjectStorage->create_object = spl_SplObjectStorage_new;
- REGISTER_SPL_STD_CLASS_EX(SplObjectStorage, spl_SplObjectStorage_new, class_SplObjectStorage_methods);
memcpy(&spl_handler_SplObjectStorage, &std_object_handlers, sizeof(zend_object_handlers));
spl_handler_SplObjectStorage.offset = XtOffsetOf(spl_SplObjectStorage, std);
@@ -1212,13 +1205,8 @@ PHP_MINIT_FUNCTION(spl_observer)
spl_handler_SplObjectStorage.dtor_obj = zend_objects_destroy_object;
spl_handler_SplObjectStorage.free_obj = spl_SplObjectStorage_free_storage;
- REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Countable);
- REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Iterator);
- REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Serializable);
- REGISTER_SPL_IMPLEMENTS(SplObjectStorage, ArrayAccess);
-
- REGISTER_SPL_STD_CLASS_EX(MultipleIterator, spl_SplObjectStorage_new, class_MultipleIterator_methods);
- REGISTER_SPL_ITERATOR(MultipleIterator);
+ spl_ce_MultipleIterator = register_class_MultipleIterator(zend_ce_iterator);
+ spl_ce_MultipleIterator->create_object = spl_SplObjectStorage_new;
REGISTER_SPL_CLASS_CONST_LONG(MultipleIterator, "MIT_NEED_ANY", MIT_NEED_ANY);
REGISTER_SPL_CLASS_CONST_LONG(MultipleIterator, "MIT_NEED_ALL", MIT_NEED_ALL);
diff --git a/ext/spl/spl_observer.stub.php b/ext/spl/spl_observer.stub.php
index 6fcd3c4c69..4baab933ef 100644
--- a/ext/spl/spl_observer.stub.php
+++ b/ext/spl/spl_observer.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
interface SplObserver
{
@@ -74,6 +74,7 @@ class SplObjectStorage implements Countable, Iterator, Serializable, ArrayAccess
* @param object $object
* @return bool
* @implementation-alias SplObjectStorage::contains
+ * @no-verify Cannot specify arg type because ArrayAccess does not
*/
public function offsetExists($object) {}
@@ -87,6 +88,7 @@ class SplObjectStorage implements Countable, Iterator, Serializable, ArrayAccess
* @param object $object
* @return void
* @implementation-alias SplObjectStorage::attach
+ * @no-verify Cannot specify arg type because ArrayAccess does not
*/
public function offsetSet($object, mixed $info = null) {}
@@ -94,6 +96,7 @@ class SplObjectStorage implements Countable, Iterator, Serializable, ArrayAccess
* @param object $object
* @return void
* @implementation-alias SplObjectStorage::detach
+ * @no-verify Cannot specify arg type because ArrayAccess does not
*/
public function offsetUnset($object) {}
diff --git a/ext/spl/spl_observer_arginfo.h b/ext/spl/spl_observer_arginfo.h
index db9b1d1125..007ecbe208 100644
--- a/ext/spl/spl_observer_arginfo.h
+++ b/ext/spl/spl_observer_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: aaefa4d4ac3b795212191d9fe06982d29948f552 */
+ * Stub hash: a469366b28d26706862ecddae69497fe3e06f137 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplObserver_update, 0, 0, 1)
ZEND_ARG_OBJ_INFO(0, subject, SplSubject, 0)
@@ -212,3 +212,45 @@ static const zend_function_entry class_MultipleIterator_methods[] = {
ZEND_MALIAS(SplObjectStorage, __debugInfo, __debugInfo, arginfo_class_MultipleIterator___debugInfo, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SplObserver(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplObserver", class_SplObserver_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SplSubject(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplSubject", class_SplSubject_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SplObjectStorage(zend_class_entry *class_entry_Countable, zend_class_entry *class_entry_Iterator, zend_class_entry *class_entry_Serializable, zend_class_entry *class_entry_ArrayAccess)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SplObjectStorage", class_SplObjectStorage_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 4, class_entry_Countable, class_entry_Iterator, class_entry_Serializable, class_entry_ArrayAccess);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_MultipleIterator(zend_class_entry *class_entry_Iterator)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "MultipleIterator", class_MultipleIterator_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Iterator);
+
+ return class_entry;
+}
diff --git a/ext/spl/tests/ArrayObject_proptable_canonicalization.phpt b/ext/spl/tests/ArrayObject_proptable_canonicalization.phpt
new file mode 100644
index 0000000000..006a152602
--- /dev/null
+++ b/ext/spl/tests/ArrayObject_proptable_canonicalization.phpt
@@ -0,0 +1,33 @@
+--TEST--
+When ArrayObject wraps an object, we should use proptable canonicalization
+--FILE--
+<?php
+
+$o = new stdClass;
+$ao = new ArrayObject($o);
+$ao[0] = 1;
+var_dump($o);
+$ao[0] += 1;
+var_dump($o);
+var_dump(isset($ao[0]));
+var_dump((array) $ao);
+unset($ao[0]);
+var_dump($o);
+
+?>
+--EXPECT--
+object(stdClass)#1 (1) {
+ ["0"]=>
+ int(1)
+}
+object(stdClass)#1 (1) {
+ ["0"]=>
+ int(2)
+}
+bool(true)
+array(1) {
+ [0]=>
+ int(2)
+}
+object(stdClass)#1 (0) {
+}
diff --git a/ext/spl/tests/RecursiveDirectoryIterator_hasChildren.phpt b/ext/spl/tests/RecursiveDirectoryIterator_hasChildren.phpt
new file mode 100644
index 0000000000..a4bad9b52d
--- /dev/null
+++ b/ext/spl/tests/RecursiveDirectoryIterator_hasChildren.phpt
@@ -0,0 +1,35 @@
+--TEST--
+SPL: RecursiveDirectoryIterator::hasChildren() follow symlinks test
+--FILE--
+<?php
+
+$dir = __DIR__ . DIRECTORY_SEPARATOR . 'symlinktest';
+
+if (!mkdir($dir)) {
+ die('Failed to create temporary directory for testing');
+} elseif (!symlink(__DIR__, $dir . DIRECTORY_SEPARATOR . 'symlink')) {
+ die('Failed to create symbolic link');
+}
+
+$it = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS | FilesystemIterator::FOLLOW_SYMLINKS | FilesystemIterator::KEY_AS_FILENAME);
+
+var_dump($it->key());
+var_dump($it->hasChildren());
+
+$it->setFlags(FilesystemIterator::SKIP_DOTS | FilesystemIterator::KEY_AS_FILENAME);
+
+var_dump($it->key());
+var_dump($it->hasChildren());
+
+?>
+--EXPECT--
+string(7) "symlink"
+bool(true)
+string(7) "symlink"
+bool(false)
+--CLEAN--
+<?php
+$dir = __DIR__ . DIRECTORY_SEPARATOR . 'symlinktest';
+unlink($dir . DIRECTORY_SEPARATOR . 'symlink');
+rmdir($dir);
+?>
diff --git a/ext/spl/tests/SplFixedArray__construct_param_null.phpt b/ext/spl/tests/SplFixedArray__construct_param_null.phpt
index 919c72021a..acd9d44af5 100644
--- a/ext/spl/tests/SplFixedArray__construct_param_null.phpt
+++ b/ext/spl/tests/SplFixedArray__construct_param_null.phpt
@@ -10,7 +10,8 @@ $array = new SplFixedArray( NULL );
print_r( $array );
?>
---EXPECT--
+--EXPECTF--
+Deprecated: SplFixedArray::__construct(): Passing null to parameter #1 ($size) of type int is deprecated in %s on line %d
SplFixedArray Object
(
)
diff --git a/ext/spl/tests/SplFixedArray_setSize_param_null.phpt b/ext/spl/tests/SplFixedArray_setSize_param_null.phpt
index ddb37be9f0..dd98935f2f 100644
--- a/ext/spl/tests/SplFixedArray_setSize_param_null.phpt
+++ b/ext/spl/tests/SplFixedArray_setSize_param_null.phpt
@@ -8,6 +8,7 @@ $fixed_array = new SplFixedArray(2);
$fixed_array->setSize(null);
var_dump($fixed_array);
?>
---EXPECT--
+--EXPECTF--
+Deprecated: SplFixedArray::setSize(): Passing null to parameter #1 ($size) of type int is deprecated in %s on line %d
object(SplFixedArray)#1 (0) {
}
diff --git a/ext/spl/tests/SplObjectStorage_unserialize_invalid_parameter3.phpt b/ext/spl/tests/SplObjectStorage_unserialize_invalid_parameter3.phpt
index bc9f78a1ca..6934c3af1b 100644
--- a/ext/spl/tests/SplObjectStorage_unserialize_invalid_parameter3.phpt
+++ b/ext/spl/tests/SplObjectStorage_unserialize_invalid_parameter3.phpt
@@ -1,5 +1,5 @@
--TEST--
-Check that SplObjectStorage::unserialize doesn't throws exception when NULL passed
+Check that SplObjectStorage::unserialize doesn't throws exception when empty string passed
--CREDITS--
PHPNW Testfest 2009 - Simon Westcott (swestcott@gmail.com)
--FILE--
@@ -8,7 +8,7 @@ PHPNW Testfest 2009 - Simon Westcott (swestcott@gmail.com)
$s = new SplObjectStorage();
try {
- $s->unserialize(NULL);
+ $s->unserialize('');
} catch(UnexpectedValueException $e) {
echo $e->getMessage();
}
diff --git a/ext/spl/tests/bug46051.phpt b/ext/spl/tests/bug46051.phpt
index cebe8a52d7..535dd2ddae 100644
--- a/ext/spl/tests/bug46051.phpt
+++ b/ext/spl/tests/bug46051.phpt
@@ -6,7 +6,7 @@ Bug #46051 (SplFileInfo::openFile - memory overlap)
$x = new splfileinfo(__FILE__);
try {
- $x->openFile(NULL, NULL, []);
+ $x->openFile("", false, []);
} catch (TypeError $e) { }
var_dump($x->getPathName());
diff --git a/ext/spl/tests/bug61527.phpt b/ext/spl/tests/bug61527.phpt
index fa8291228c..f068897246 100644
--- a/ext/spl/tests/bug61527.phpt
+++ b/ext/spl/tests/bug61527.phpt
@@ -42,12 +42,12 @@ var_dump($ai2->next());
var_dump($ai2->key());
/* testing RecursiveArrayIterator */
-$ao3 = new ArrayObject(array(), NULL, 'RecursiveArrayIterator');
+$ao3 = new ArrayObject(array(), 0, 'RecursiveArrayIterator');
$ai3 = $ao3->getIterator();
var_dump($ai3->getChildren());
-$ao4 = new ArrayObject(array(1, 2), NULL, 'RecursiveArrayIterator');
+$ao4 = new ArrayObject(array(1, 2), 0, 'RecursiveArrayIterator');
$ai4 = $ao4->getIterator();
$ai4->next();
diff --git a/ext/spl/tests/bug65387.phpt b/ext/spl/tests/bug65387.phpt
index a5b028954c..e5d501ccf1 100644
--- a/ext/spl/tests/bug65387.phpt
+++ b/ext/spl/tests/bug65387.phpt
@@ -31,13 +31,13 @@ $it2 = new RecursiveCallbackFilterIterator($it, function($elem) use(&$it2) {
// Cache
$it = new ArrayIterator();
$it2 = new CachingIterator($it, CachingIterator::FULL_CACHE);
-$it2[] = $it2;
+$it2['x'] = $it2;
$it2->next();
// Recursive cache
$it = new RecursiveArrayIterator();
$it2 = new RecursiveCachingIterator($it, CachingIterator::FULL_CACHE);
-$it2[] = $it2;
+$it2['x'] = $it2;
$it2->next();
// Append
diff --git a/ext/spl/tests/bug75717.phpt b/ext/spl/tests/bug75717.phpt
index 77226e1099..920dda9c53 100644
--- a/ext/spl/tests/bug75717.phpt
+++ b/ext/spl/tests/bug75717.phpt
@@ -8,7 +8,7 @@ function flatten(array $nestedArraysAndStrings){
$iter = new RecursiveIteratorIterator(
new RecursiveArrayIterator($nestedArraysAndStrings));
foreach($iter as $leaf){ $flat[] = $leaf; }
- return join(null, $flat);
+ return join('', $flat);
}
$noRefs = [[[['some']]],[' nested '],"items"];
diff --git a/ext/spl/tests/bug80724.phpt b/ext/spl/tests/bug80724.phpt
new file mode 100644
index 0000000000..7ff118e31b
--- /dev/null
+++ b/ext/spl/tests/bug80724.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Bug #80724 (FOLLOW_SYMLINKS interfering with FilesystemIterator key flags)
+--FILE--
+<?php
+$iterator = new FilesystemIterator(__DIR__, FilesystemIterator::KEY_AS_FILENAME);
+foreach ($iterator as $key => $value) {
+ echo var_dump(hasSeparator($key));
+ break;
+}
+$iterator->rewind();
+echo var_dump(hasSeparator($iterator->key()));
+
+$iterator->setFlags(0);
+echo var_dump(hasSeparator($iterator->key()));
+
+$iterator->setFlags(FilesystemIterator::KEY_AS_FILENAME);
+echo var_dump(hasSeparator($iterator->key()));
+
+$iterator2 = new FilesystemIterator(__DIR__, FilesystemIterator::FOLLOW_SYMLINKS | FilesystemIterator::KEY_AS_FILENAME);
+foreach ($iterator2 as $key => $value) {
+ echo var_dump(hasSeparator($key));
+ break;
+}
+$iterator2->rewind();
+echo var_dump(hasSeparator($iterator2->key()));
+
+$iterator2->setFlags(0);
+echo var_dump(hasSeparator($iterator2->key()));
+
+$iterator2->setFlags(FilesystemIterator::KEY_AS_FILENAME);
+echo var_dump(hasSeparator($iterator2->key()));
+
+function hasSeparator($key) {
+ return str_contains($key, __DIR__ . DIRECTORY_SEPARATOR);
+}
+
+?>
+--EXPECT--
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
diff --git a/ext/spl/tests/filesystemiterator_flags.phpt b/ext/spl/tests/filesystemiterator_flags.phpt
index 1a8cce034e..b4e582b77a 100644
--- a/ext/spl/tests/filesystemiterator_flags.phpt
+++ b/ext/spl/tests/filesystemiterator_flags.phpt
@@ -34,7 +34,7 @@ function printflags($it) {
00000010
00000100
00003000
-00003FF0
+00007FF0
000000F0
00000F00
-00003000
+00007000
diff --git a/ext/spl/tests/fixedarray_011.phpt b/ext/spl/tests/fixedarray_011.phpt
deleted file mode 100644
index eddf320fcc..0000000000
--- a/ext/spl/tests/fixedarray_011.phpt
+++ /dev/null
@@ -1,14 +0,0 @@
---TEST--
-SPL: FixedArray: Testing setSize() with NULL
---FILE--
-<?php
-
-$a = new SplFixedArray(100);
-
-$a->setSize(NULL);
-
-print "ok\n";
-
-?>
---EXPECT--
-ok
diff --git a/ext/spl/tests/fixedarray_014.phpt b/ext/spl/tests/fixedarray_014.phpt
index a6f2fc188c..75108b5868 100644
--- a/ext/spl/tests/fixedarray_014.phpt
+++ b/ext/spl/tests/fixedarray_014.phpt
@@ -4,7 +4,7 @@ SPL: FixedArray: Trying to access inexistent item
<?php
try {
- $a = new SplFixedArray(NULL);
+ $a = new SplFixedArray(0);
echo $a[0]++;
} catch (Exception $e) {
echo $e->getMessage();
diff --git a/ext/spl/tests/iterator_044.phpt b/ext/spl/tests/iterator_044.phpt
index 66f722af9a..74321194e0 100644
--- a/ext/spl/tests/iterator_044.phpt
+++ b/ext/spl/tests/iterator_044.phpt
@@ -94,8 +94,12 @@ Warning: Undefined array key "foo" in %s on line %d
NULL
===3===
NULL
+
+Deprecated: CachingIterator::offsetExists(): Passing null to parameter #1 ($key) of type string is deprecated in %s on line %d
bool(false)
+Deprecated: CachingIterator::offsetGet(): Passing null to parameter #1 ($key) of type string is deprecated in %s on line %d
+
Warning: Undefined array key "" in %s on line %d
NULL
===4===
@@ -133,8 +137,12 @@ bool(true)
int(1)
===3===
NULL
+
+Deprecated: CachingIterator::offsetExists(): Passing null to parameter #1 ($key) of type string is deprecated in %s on line %d
bool(false)
+Deprecated: CachingIterator::offsetGet(): Passing null to parameter #1 ($key) of type string is deprecated in %s on line %d
+
Warning: Undefined array key "" in %s on line %d
NULL
===4===
diff --git a/ext/spl/tests/regexIterator_flags_basic.phpt b/ext/spl/tests/regexIterator_flags_basic.phpt
index 535be00035..d5b778f86b 100644
--- a/ext/spl/tests/regexIterator_flags_basic.phpt
+++ b/ext/spl/tests/regexIterator_flags_basic.phpt
@@ -7,7 +7,7 @@ Felix De Vliegher <felix.devliegher@gmail.com>
$array = array('foo', 'bar', 'baz');
$iterator = new ArrayIterator($array);
-$regexIterator = new RegexIterator($iterator, "/f/", null, RegexIterator::USE_KEY);
+$regexIterator = new RegexIterator($iterator, "/f/", RegexIterator::MATCH, RegexIterator::USE_KEY);
var_dump($regexIterator->getFlags() === RegexIterator::USE_KEY);
diff --git a/ext/spl/tests/serialize_property_tables.phpt b/ext/spl/tests/serialize_property_tables.phpt
new file mode 100644
index 0000000000..9b507e6f8e
--- /dev/null
+++ b/ext/spl/tests/serialize_property_tables.phpt
Binary files differ
diff --git a/ext/spl/tests/spl_autoload_001.phpt b/ext/spl/tests/spl_autoload_001.phpt
index c7f5e573f3..befb965709 100644
--- a/ext/spl/tests/spl_autoload_001.phpt
+++ b/ext/spl/tests/spl_autoload_001.phpt
@@ -100,4 +100,4 @@ TestFunc2(TestClass)
%stestclass.class.inc
bool(true)
===NOFUNCTION===
-spl_autoload_register(): Argument #1 ($callback) must be a valid callback, function "unavailable_autoload_function" not found or invalid function name
+spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, function "unavailable_autoload_function" not found or invalid function name
diff --git a/ext/spl/tests/spl_autoload_005.phpt b/ext/spl/tests/spl_autoload_005.phpt
index 6eb8510325..0f2c5ed2c3 100644
--- a/ext/spl/tests/spl_autoload_005.phpt
+++ b/ext/spl/tests/spl_autoload_005.phpt
@@ -43,7 +43,7 @@ catch(Exception $e)
?>
--EXPECT--
-spl_autoload_register(): Argument #1 ($callback) must be a valid callback, non-static method MyAutoLoader::autoLoad() cannot be called statically
+spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, non-static method MyAutoLoader::autoLoad() cannot be called statically
MyAutoLoader::autoLoad(TestClass)
MyAutoLoader::autoThrow(TestClass)
Exception: Unavailable
diff --git a/ext/spl/tests/spl_autoload_007.phpt b/ext/spl/tests/spl_autoload_007.phpt
index 589ce74b7f..0a8183dfb4 100644
--- a/ext/spl/tests/spl_autoload_007.phpt
+++ b/ext/spl/tests/spl_autoload_007.phpt
@@ -52,16 +52,16 @@ foreach($funcs as $idx => $func)
?>
--EXPECTF--
string(22) "MyAutoLoader::notExist"
-spl_autoload_register(): Argument #1 ($callback) must be a valid callback, class MyAutoLoader does not have a method "notExist"
+spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, class MyAutoLoader does not have a method "notExist"
string(22) "MyAutoLoader::noAccess"
-spl_autoload_register(): Argument #1 ($callback) must be a valid callback, cannot access protected method MyAutoLoader::noAccess()
+spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, cannot access protected method MyAutoLoader::noAccess()
string(22) "MyAutoLoader::autoLoad"
ok
string(22) "MyAutoLoader::dynaLoad"
-spl_autoload_register(): Argument #1 ($callback) must be a valid callback, non-static method MyAutoLoader::dynaLoad() cannot be called statically
+spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, non-static method MyAutoLoader::dynaLoad() cannot be called statically
array(2) {
[0]=>
@@ -69,7 +69,7 @@ array(2) {
[1]=>
string(8) "notExist"
}
-spl_autoload_register(): Argument #1 ($callback) must be a valid callback, class MyAutoLoader does not have a method "notExist"
+spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, class MyAutoLoader does not have a method "notExist"
array(2) {
[0]=>
@@ -77,7 +77,7 @@ array(2) {
[1]=>
string(8) "noAccess"
}
-spl_autoload_register(): Argument #1 ($callback) must be a valid callback, cannot access protected method MyAutoLoader::noAccess()
+spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, cannot access protected method MyAutoLoader::noAccess()
array(2) {
[0]=>
@@ -93,7 +93,7 @@ array(2) {
[1]=>
string(8) "dynaLoad"
}
-spl_autoload_register(): Argument #1 ($callback) must be a valid callback, non-static method MyAutoLoader::dynaLoad() cannot be called statically
+spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, non-static method MyAutoLoader::dynaLoad() cannot be called statically
array(2) {
[0]=>
@@ -102,7 +102,7 @@ array(2) {
[1]=>
string(8) "notExist"
}
-spl_autoload_register(): Argument #1 ($callback) must be a valid callback, class MyAutoLoader does not have a method "notExist"
+spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, class MyAutoLoader does not have a method "notExist"
array(2) {
[0]=>
@@ -111,7 +111,7 @@ array(2) {
[1]=>
string(8) "noAccess"
}
-spl_autoload_register(): Argument #1 ($callback) must be a valid callback, cannot access protected method MyAutoLoader::noAccess()
+spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, cannot access protected method MyAutoLoader::noAccess()
array(2) {
[0]=>
diff --git a/ext/spl/tests/spl_autoload_008.phpt b/ext/spl/tests/spl_autoload_008.phpt
index 99f61cd561..738c691ddf 100644
--- a/ext/spl/tests/spl_autoload_008.phpt
+++ b/ext/spl/tests/spl_autoload_008.phpt
@@ -81,7 +81,7 @@ Exception: Bla
int(0)
====2====
string(22) "MyAutoLoader::dynaLoad"
-TypeError: spl_autoload_register(): Argument #1 ($callback) must be a valid callback, non-static method MyAutoLoader::dynaLoad() cannot be called statically
+TypeError: spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, non-static method MyAutoLoader::dynaLoad() cannot be called statically
int(0)
====3====
array(2) {
@@ -101,7 +101,7 @@ array(2) {
[1]=>
string(8) "dynaLoad"
}
-TypeError: spl_autoload_register(): Argument #1 ($callback) must be a valid callback, non-static method MyAutoLoader::dynaLoad() cannot be called statically
+TypeError: spl_autoload_register(): Argument #1 ($callback) must be a valid callback or null, non-static method MyAutoLoader::dynaLoad() cannot be called statically
int(0)
====5====
array(2) {
diff --git a/ext/sqlite3/php_sqlite3_structs.h b/ext/sqlite3/php_sqlite3_structs.h
index 80e915da68..07b0c8ba95 100644
--- a/ext/sqlite3/php_sqlite3_structs.h
+++ b/ext/sqlite3/php_sqlite3_structs.h
@@ -74,7 +74,7 @@ typedef struct _php_sqlite3_db_object {
zend_fcall_info authorizer_fci;
zend_fcall_info_cache authorizer_fcc;
- zend_bool exception;
+ bool exception;
zend_llist free_list;
zend_object zo;
diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c
index cd91e68fd3..1db9841252 100644
--- a/ext/sqlite3/sqlite3.c
+++ b/ext/sqlite3/sqlite3.c
@@ -306,7 +306,7 @@ PHP_METHOD(SQLite3, enableExtendedResultCodes)
{
php_sqlite3_db_object *db_obj;
zval *object = ZEND_THIS;
- zend_bool enable = 1;
+ bool enable = 1;
db_obj = Z_SQLITE3_DB_P(object);
int ret;
@@ -660,7 +660,7 @@ PHP_METHOD(SQLite3, querySingle)
zend_string *sql;
char *errtext = NULL;
int return_code;
- zend_bool entire_row = 0;
+ bool entire_row = 0;
sqlite3_stmt *stmt;
db_obj = Z_SQLITE3_DB_P(object);
@@ -1281,7 +1281,7 @@ PHP_METHOD(SQLite3, enableExceptions)
{
php_sqlite3_db_object *db_obj;
zval *object = ZEND_THIS;
- zend_bool enableExceptions = 0;
+ bool enableExceptions = 0;
db_obj = Z_SQLITE3_DB_P(object);
@@ -1607,7 +1607,7 @@ static int php_sqlite3_bind_params(php_sqlite3_stmt *stmt_obj) /* {{{ */
PHP_METHOD(SQLite3Stmt, getSQL)
{
php_sqlite3_stmt *stmt_obj;
- zend_bool expanded = 0;
+ bool expanded = 0;
zval *object = getThis();
stmt_obj = Z_SQLITE3_STMT_P(object);
int bind_rc;
@@ -2332,8 +2332,6 @@ static void sqlite3_param_dtor(zval *data) /* {{{ */
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(sqlite3)
{
- zend_class_entry ce;
-
#ifdef ZTS
/* Refuse to load if this wasn't a threasafe library loaded */
if (!sqlite3_threadsafe()) {
@@ -2347,32 +2345,29 @@ PHP_MINIT_FUNCTION(sqlite3)
memcpy(&sqlite3_result_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
/* Register SQLite 3 Class */
- INIT_CLASS_ENTRY(ce, "SQLite3", class_SQLite3_methods);
- ce.create_object = php_sqlite3_object_new;
sqlite3_object_handlers.offset = XtOffsetOf(php_sqlite3_db_object, zo);
sqlite3_object_handlers.clone_obj = NULL;
sqlite3_object_handlers.free_obj = php_sqlite3_object_free_storage;
- php_sqlite3_sc_entry = zend_register_internal_class(&ce);
+ php_sqlite3_sc_entry = register_class_SQLite3();
+ php_sqlite3_sc_entry->create_object = php_sqlite3_object_new;
php_sqlite3_sc_entry->serialize = zend_class_serialize_deny;
php_sqlite3_sc_entry->unserialize = zend_class_unserialize_deny;
/* Register SQLite 3 Prepared Statement Class */
- INIT_CLASS_ENTRY(ce, "SQLite3Stmt", class_SQLite3Stmt_methods);
- ce.create_object = php_sqlite3_stmt_object_new;
sqlite3_stmt_object_handlers.offset = XtOffsetOf(php_sqlite3_stmt, zo);
sqlite3_stmt_object_handlers.clone_obj = NULL;
sqlite3_stmt_object_handlers.free_obj = php_sqlite3_stmt_object_free_storage;
- php_sqlite3_stmt_entry = zend_register_internal_class(&ce);
+ php_sqlite3_stmt_entry = register_class_SQLite3Stmt();
+ php_sqlite3_stmt_entry->create_object = php_sqlite3_stmt_object_new;
php_sqlite3_stmt_entry->serialize = zend_class_serialize_deny;
php_sqlite3_stmt_entry->unserialize = zend_class_unserialize_deny;
/* Register SQLite 3 Result Class */
- INIT_CLASS_ENTRY(ce, "SQLite3Result", class_SQLite3Result_methods);
- ce.create_object = php_sqlite3_result_object_new;
sqlite3_result_object_handlers.offset = XtOffsetOf(php_sqlite3_result, zo);
sqlite3_result_object_handlers.clone_obj = NULL;
sqlite3_result_object_handlers.free_obj = php_sqlite3_result_object_free_storage;
- php_sqlite3_result_entry = zend_register_internal_class(&ce);
+ php_sqlite3_result_entry = register_class_SQLite3Result();
+ php_sqlite3_result_entry->create_object = php_sqlite3_result_object_new;
php_sqlite3_result_entry->serialize = zend_class_serialize_deny;
php_sqlite3_result_entry->unserialize = zend_class_unserialize_deny;
diff --git a/ext/sqlite3/sqlite3.stub.php b/ext/sqlite3/sqlite3.stub.php
index 95bfb312d8..37776aea66 100644
--- a/ext/sqlite3/sqlite3.stub.php
+++ b/ext/sqlite3/sqlite3.stub.php
@@ -1,10 +1,13 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class SQLite3
{
- /** @implementation-alias SQLite3::open */
+ /**
+ * @implementation-alias SQLite3::open
+ * @no-verify SQLite3::open should really be static
+ */
public function __construct(string $filename, int $flags = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, string $encryptionKey = "") {}
/** @return void */
diff --git a/ext/sqlite3/sqlite3_arginfo.h b/ext/sqlite3/sqlite3_arginfo.h
index 39e026c52d..1588aa5048 100644
--- a/ext/sqlite3/sqlite3_arginfo.h
+++ b/ext/sqlite3/sqlite3_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 61a684b6c221a15538a5f8cc32bc4e7d4cf3c8fd */
+ * Stub hash: edb21146ffbfccc998f922f9e6967738134b8b07 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SQLite3___construct, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@@ -254,3 +254,33 @@ static const zend_function_entry class_SQLite3Result_methods[] = {
ZEND_ME(SQLite3Result, finalize, arginfo_class_SQLite3Result_finalize, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SQLite3(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SQLite3", class_SQLite3_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SQLite3Stmt(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SQLite3Stmt", class_SQLite3Stmt_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_SQLite3Result(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SQLite3Result", class_SQLite3Result_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/sqlite3/tests/sqlite3_busyTimeout.phpt b/ext/sqlite3/tests/sqlite3_busyTimeout.phpt
index ea97d8ee00..e27235a6af 100644
--- a/ext/sqlite3/tests/sqlite3_busyTimeout.phpt
+++ b/ext/sqlite3/tests/sqlite3_busyTimeout.phpt
@@ -8,7 +8,6 @@ marcosptf - <marcosptf@yahoo.com.br> - @phpsp - sao paulo - br
<?php
require_once(__DIR__ . '/new_db.inc');
var_dump($db->busyTimeout(0));
-var_dump($db->busyTimeout(null));
var_dump($db->busyTimeout(-1000));
var_dump($db->busyTimeout(1000));
$db->close();
@@ -17,4 +16,3 @@ $db->close();
bool(true)
bool(true)
bool(true)
-bool(true)
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 3967d83242..e0b52ca169 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -345,64 +345,25 @@ static zend_always_inline int php_array_key_compare_string_locale_unstable_i(Buc
static zend_always_inline int php_array_data_compare_unstable_i(Bucket *f, Bucket *s) /* {{{ */
{
- zval *first = &f->val;
- zval *second = &s->val;
-
- if (UNEXPECTED(Z_TYPE_P(first) == IS_INDIRECT)) {
- first = Z_INDIRECT_P(first);
- }
- if (UNEXPECTED(Z_TYPE_P(second) == IS_INDIRECT)) {
- second = Z_INDIRECT_P(second);
- }
- return zend_compare(first, second);
+ return zend_compare(&f->val, &s->val);
}
/* }}} */
static zend_always_inline int php_array_data_compare_numeric_unstable_i(Bucket *f, Bucket *s) /* {{{ */
{
- zval *first = &f->val;
- zval *second = &s->val;
-
- if (UNEXPECTED(Z_TYPE_P(first) == IS_INDIRECT)) {
- first = Z_INDIRECT_P(first);
- }
- if (UNEXPECTED(Z_TYPE_P(second) == IS_INDIRECT)) {
- second = Z_INDIRECT_P(second);
- }
-
- return numeric_compare_function(first, second);
+ return numeric_compare_function(&f->val, &s->val);
}
/* }}} */
static zend_always_inline int php_array_data_compare_string_case_unstable_i(Bucket *f, Bucket *s) /* {{{ */
{
- zval *first = &f->val;
- zval *second = &s->val;
-
- if (UNEXPECTED(Z_TYPE_P(first) == IS_INDIRECT)) {
- first = Z_INDIRECT_P(first);
- }
- if (UNEXPECTED(Z_TYPE_P(second) == IS_INDIRECT)) {
- second = Z_INDIRECT_P(second);
- }
-
- return string_case_compare_function(first, second);
+ return string_case_compare_function(&f->val, &s->val);
}
/* }}} */
static zend_always_inline int php_array_data_compare_string_unstable_i(Bucket *f, Bucket *s) /* {{{ */
{
- zval *first = &f->val;
- zval *second = &s->val;
-
- if (UNEXPECTED(Z_TYPE_P(first) == IS_INDIRECT)) {
- first = Z_INDIRECT_P(first);
- }
- if (UNEXPECTED(Z_TYPE_P(second) == IS_INDIRECT)) {
- second = Z_INDIRECT_P(second);
- }
-
- return string_compare_function(first, second);
+ return string_compare_function(&f->val, &s->val);
}
/* }}} */
@@ -434,17 +395,7 @@ static zend_always_inline int php_array_natural_case_compare_unstable_i(Bucket *
static int php_array_data_compare_string_locale_unstable_i(Bucket *f, Bucket *s) /* {{{ */
{
- zval *first = &f->val;
- zval *second = &s->val;
-
- if (UNEXPECTED(Z_TYPE_P(first) == IS_INDIRECT)) {
- first = Z_INDIRECT_P(first);
- }
- if (UNEXPECTED(Z_TYPE_P(second) == IS_INDIRECT)) {
- second = Z_INDIRECT_P(second);
- }
-
- return string_locale_compare_function(first, second);
+ return string_locale_compare_function(&f->val, &s->val);
}
/* }}} */
@@ -708,7 +659,7 @@ PHPAPI zend_long php_count_recursive(HashTable *ht) /* {{{ */
GC_PROTECT_RECURSION(ht);
}
- cnt = zend_array_count(ht);
+ cnt = zend_hash_num_elements(ht);
ZEND_HASH_FOREACH_VAL(ht, element) {
ZVAL_DEREF(element);
if (Z_TYPE_P(element) == IS_ARRAY) {
@@ -742,7 +693,7 @@ PHP_FUNCTION(count)
switch (Z_TYPE_P(array)) {
case IS_ARRAY:
if (mode != COUNT_RECURSIVE) {
- cnt = zend_array_count(Z_ARRVAL_P(array));
+ cnt = zend_hash_num_elements(Z_ARRVAL_P(array));
} else {
cnt = php_count_recursive(Z_ARRVAL_P(array));
}
@@ -898,7 +849,7 @@ static inline int php_array_user_compare_unstable(Bucket *f, Bucket *s) /* {{{ *
{
zval args[2];
zval retval;
- zend_bool call_failed;
+ bool call_failed;
ZVAL_COPY(&args[0], &f->val);
ZVAL_COPY(&args[1], &s->val);
@@ -964,7 +915,7 @@ static int php_array_user_compare(Bucket *a, Bucket *b) /* {{{ */
BG(user_compare_fci) = old_user_compare_fci; \
BG(user_compare_fci_cache) = old_user_compare_fci_cache; \
-static void php_usort(INTERNAL_FUNCTION_PARAMETERS, bucket_compare_func_t compare_func, zend_bool renumber) /* {{{ */
+static void php_usort(INTERNAL_FUNCTION_PARAMETERS, bucket_compare_func_t compare_func, bool renumber) /* {{{ */
{
zval *array;
zend_array *arr;
@@ -1014,7 +965,7 @@ static inline int php_array_user_key_compare_unstable(Bucket *f, Bucket *s) /* {
{
zval args[2];
zval retval;
- zend_bool call_failed;
+ bool call_failed;
if (f->key == NULL) {
ZVAL_LONG(&args[0], f->h);
@@ -1321,7 +1272,13 @@ PHP_FUNCTION(max)
}
/* }}} */
-static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
+typedef struct {
+ zend_fcall_info fci;
+ zend_fcall_info_cache fci_cache;
+} php_array_walk_context;
+
+static int php_array_walk(
+ php_array_walk_context *context, zval *array, zval *userdata, int recursive)
{
zval args[3], /* Arguments to userland function */
retval, /* Return value - unused */
@@ -1331,15 +1288,19 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
uint32_t ht_iter;
int result = SUCCESS;
+ /* Create a local copy of fci, as we want to use different arguments at different
+ * levels of recursion. */
+ zend_fcall_info fci = context->fci;
+
/* Set up known arguments */
ZVAL_UNDEF(&args[1]);
if (userdata) {
ZVAL_COPY(&args[2], userdata);
}
- BG(array_walk_fci).retval = &retval;
- BG(array_walk_fci).param_count = userdata ? 3 : 2;
- BG(array_walk_fci).params = args;
+ fci.retval = &retval;
+ fci.param_count = userdata ? 3 : 2;
+ fci.params = args;
zend_hash_internal_pointer_reset_ex(target_hash, &pos);
ht_iter = zend_hash_iterator_add(target_hash, pos);
@@ -1386,8 +1347,6 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
if (recursive && Z_TYPE_P(Z_REFVAL_P(zv)) == IS_ARRAY) {
HashTable *thash;
- zend_fcall_info orig_array_walk_fci;
- zend_fcall_info_cache orig_array_walk_fci_cache;
zval ref;
ZVAL_COPY_VALUE(&ref, zv);
@@ -1400,28 +1359,20 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
break;
}
- /* backup the fcall info and cache */
- orig_array_walk_fci = BG(array_walk_fci);
- orig_array_walk_fci_cache = BG(array_walk_fci_cache);
-
Z_ADDREF(ref);
GC_PROTECT_RECURSION(thash);
- result = php_array_walk(zv, userdata, recursive);
+ result = php_array_walk(context, zv, userdata, recursive);
if (Z_TYPE_P(Z_REFVAL(ref)) == IS_ARRAY && thash == Z_ARRVAL_P(Z_REFVAL(ref))) {
/* If the hashtable changed in the meantime, we'll "leak" this apply count
* increment -- our reference to thash is no longer valid. */
GC_UNPROTECT_RECURSION(thash);
}
zval_ptr_dtor(&ref);
-
- /* restore the fcall info and cache */
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
} else {
ZVAL_COPY(&args[0], zv);
/* Call the userland function */
- result = zend_call_function(&BG(array_walk_fci), &BG(array_walk_fci_cache));
+ result = zend_call_function(&fci, &context->fci_cache);
if (result == SUCCESS) {
zval_ptr_dtor(&retval);
}
@@ -1458,33 +1409,22 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
zend_hash_iterator_del(ht_iter);
return result;
}
-/* }}} */
/* {{{ Apply a user function to every member of an array */
PHP_FUNCTION(array_walk)
{
zval *array;
zval *userdata = NULL;
- zend_fcall_info orig_array_walk_fci;
- zend_fcall_info_cache orig_array_walk_fci_cache;
-
- orig_array_walk_fci = BG(array_walk_fci);
- orig_array_walk_fci_cache = BG(array_walk_fci_cache);
+ php_array_walk_context context;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ARRAY_OR_OBJECT_EX(array, 0, 1)
- Z_PARAM_FUNC(BG(array_walk_fci), BG(array_walk_fci_cache))
+ Z_PARAM_FUNC(context.fci, context.fci_cache)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(userdata)
- ZEND_PARSE_PARAMETERS_END_EX(
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
- return
- );
-
- php_array_walk(array, userdata, 0);
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
+ ZEND_PARSE_PARAMETERS_END();
+
+ php_array_walk(&context, array, userdata, 0);
RETURN_TRUE;
}
/* }}} */
@@ -1494,26 +1434,16 @@ PHP_FUNCTION(array_walk_recursive)
{
zval *array;
zval *userdata = NULL;
- zend_fcall_info orig_array_walk_fci;
- zend_fcall_info_cache orig_array_walk_fci_cache;
-
- orig_array_walk_fci = BG(array_walk_fci);
- orig_array_walk_fci_cache = BG(array_walk_fci_cache);
+ php_array_walk_context context;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ARRAY_OR_OBJECT_EX(array, 0, 1)
- Z_PARAM_FUNC(BG(array_walk_fci), BG(array_walk_fci_cache))
+ Z_PARAM_FUNC(context.fci, context.fci_cache)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(userdata)
- ZEND_PARSE_PARAMETERS_END_EX(
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
- return
- );
-
- php_array_walk(array, userdata, 1);
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
+ ZEND_PARSE_PARAMETERS_END();
+
+ php_array_walk(&context, array, userdata, 1);
RETURN_TRUE;
}
/* }}} */
@@ -1529,7 +1459,7 @@ static inline void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior)
*entry; /* pointer to array entry */
zend_ulong num_idx;
zend_string *str_idx;
- zend_bool strict = 0; /* strict comparison or not */
+ bool strict = 0; /* strict comparison or not */
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ZVAL(value)
@@ -1540,81 +1470,76 @@ static inline void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior)
if (strict) {
if (Z_TYPE_P(value) == IS_LONG) {
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
ZVAL_DEREF(entry);
if (Z_TYPE_P(entry) == IS_LONG && Z_LVAL_P(entry) == Z_LVAL_P(value)) {
if (behavior == 0) {
RETURN_TRUE;
} else {
if (str_idx) {
- RETVAL_STR_COPY(str_idx);
+ RETURN_STR_COPY(str_idx);
} else {
- RETVAL_LONG(num_idx);
+ RETURN_LONG(num_idx);
}
- return;
}
}
} ZEND_HASH_FOREACH_END();
} else {
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
ZVAL_DEREF(entry);
if (fast_is_identical_function(value, entry)) {
if (behavior == 0) {
RETURN_TRUE;
} else {
if (str_idx) {
- RETVAL_STR_COPY(str_idx);
+ RETURN_STR_COPY(str_idx);
} else {
- RETVAL_LONG(num_idx);
+ RETURN_LONG(num_idx);
}
- return;
}
}
} ZEND_HASH_FOREACH_END();
}
} else {
if (Z_TYPE_P(value) == IS_LONG) {
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
if (fast_equal_check_long(value, entry)) {
if (behavior == 0) {
RETURN_TRUE;
} else {
if (str_idx) {
- RETVAL_STR_COPY(str_idx);
+ RETURN_STR_COPY(str_idx);
} else {
- RETVAL_LONG(num_idx);
+ RETURN_LONG(num_idx);
}
- return;
}
}
} ZEND_HASH_FOREACH_END();
} else if (Z_TYPE_P(value) == IS_STRING) {
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
if (fast_equal_check_string(value, entry)) {
if (behavior == 0) {
RETURN_TRUE;
} else {
if (str_idx) {
- RETVAL_STR_COPY(str_idx);
+ RETURN_STR_COPY(str_idx);
} else {
- RETVAL_LONG(num_idx);
+ RETURN_LONG(num_idx);
}
- return;
}
}
} ZEND_HASH_FOREACH_END();
} else {
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_idx, str_idx, entry) {
if (fast_equal_check_function(value, entry)) {
if (behavior == 0) {
RETURN_TRUE;
} else {
if (str_idx) {
- RETVAL_STR_COPY(str_idx);
+ RETURN_STR_COPY(str_idx);
} else {
- RETVAL_LONG(num_idx);
+ RETURN_LONG(num_idx);
}
- return;
}
}
} ZEND_HASH_FOREACH_END();
@@ -1696,7 +1621,7 @@ static zend_always_inline int php_valid_var_name(const char *var_name, size_t va
}
/* }}} */
-PHPAPI int php_prefix_varname(zval *result, zend_string *prefix, const char *var_name, size_t var_name_len, zend_bool add_underscore) /* {{{ */
+PHPAPI int php_prefix_varname(zval *result, zend_string *prefix, const char *var_name, size_t var_name_len, bool add_underscore) /* {{{ */
{
ZVAL_NEW_STR(result, zend_string_alloc(ZSTR_LEN(prefix) + (add_underscore ? 1 : 0) + var_name_len, 0));
memcpy(Z_STRVAL_P(result), ZSTR_VAL(prefix), ZSTR_LEN(prefix));
@@ -1717,7 +1642,7 @@ static zend_long php_extract_ref_if_exists(zend_array *arr, zend_array *symbol_t
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1760,7 +1685,7 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1801,7 +1726,7 @@ static zend_long php_extract_ref_overwrite(zend_array *arr, zend_array *symbol_t
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1848,7 +1773,7 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1890,7 +1815,7 @@ static zend_long php_extract_ref_prefix_if_exists(zend_array *arr, zend_array *s
zend_string *var_name;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1946,7 +1871,7 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo
zend_string *var_name;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -1997,7 +1922,7 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol
zend_string *var_name;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -2071,7 +1996,7 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab
zend_string *var_name;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -2138,7 +2063,7 @@ static zend_long php_extract_ref_prefix_all(zend_array *arr, zend_array *symbol_
zend_ulong num_key;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_KEY_VAL_IND(arr, num_key, var_name, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arr, num_key, var_name, entry) {
if (var_name) {
if (ZSTR_LEN(var_name) == 0) {
continue;
@@ -2185,7 +2110,7 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl
zend_ulong num_key;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_KEY_VAL_IND(arr, num_key, var_name, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arr, num_key, var_name, entry) {
if (var_name) {
if (ZSTR_LEN(var_name) == 0) {
continue;
@@ -2232,7 +2157,7 @@ static zend_long php_extract_ref_prefix_invalid(zend_array *arr, zend_array *sym
zend_ulong num_key;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_KEY_VAL_IND(arr, num_key, var_name, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arr, num_key, var_name, entry) {
if (var_name) {
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))
|| zend_string_equals_literal(var_name, "this")) {
@@ -2287,7 +2212,7 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_
zend_ulong num_key;
zval *entry, *orig_var, final_name;
- ZEND_HASH_FOREACH_KEY_VAL_IND(arr, num_key, var_name, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arr, num_key, var_name, entry) {
if (var_name) {
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))
|| zend_string_equals_literal(var_name, "this")) {
@@ -2341,7 +2266,7 @@ static zend_long php_extract_ref_skip(zend_array *arr, zend_array *symbol_table)
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -2386,7 +2311,7 @@ static zend_long php_extract_skip(zend_array *arr, zend_array *symbol_table) /*
zend_string *var_name;
zval *entry, *orig_var;
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(arr, var_name, entry) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) {
if (!var_name) {
continue;
}
@@ -2549,7 +2474,7 @@ static void php_compact_var(HashTable *eg_active_symbol_table, zval *return_valu
}
Z_PROTECT_RECURSION_P(entry);
}
- ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(entry), value_ptr) {
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(entry), value_ptr) {
php_compact_var(eg_active_symbol_table, return_value, value_ptr);
} ZEND_HASH_FOREACH_END();
if (Z_REFCOUNTED_P(entry)) {
@@ -3033,7 +2958,6 @@ static void php_splice(HashTable *in_hash, zend_long offset, zend_long length, H
for (pos = 0, idx = 0; pos < offset && idx < in_hash->nNumUsed; idx++) {
p = in_hash->arData + idx;
if (Z_TYPE(p->val) == IS_UNDEF) continue;
- /* Get entry and increase reference count */
entry = &p->val;
/* Update output hash depending on key type */
@@ -3061,15 +2985,10 @@ static void php_splice(HashTable *in_hash, zend_long offset, zend_long length, H
Z_TRY_ADDREF_P(entry);
if (p->key == NULL) {
zend_hash_next_index_insert_new(removed, entry);
- zend_hash_del_bucket(in_hash, p);
} else {
zend_hash_add_new(removed, p->key, entry);
- if (in_hash == &EG(symbol_table)) {
- zend_delete_global_variable(p->key);
- } else {
- zend_hash_del_bucket(in_hash, p);
- }
}
+ zend_hash_del_bucket(in_hash, p);
}
} else { /* otherwise just skip those entries */
int pos2 = pos;
@@ -3078,18 +2997,14 @@ static void php_splice(HashTable *in_hash, zend_long offset, zend_long length, H
p = in_hash->arData + idx;
if (Z_TYPE(p->val) == IS_UNDEF) continue;
pos2++;
- if (p->key && in_hash == &EG(symbol_table)) {
- zend_delete_global_variable(p->key);
- } else {
- zend_hash_del_bucket(in_hash, p);
- }
+ zend_hash_del_bucket(in_hash, p);
}
}
iter_pos = zend_hash_iterators_lower_pos(in_hash, iter_pos);
/* If there are entries to insert.. */
if (replace) {
- ZEND_HASH_FOREACH_VAL_IND(replace, entry) {
+ ZEND_HASH_FOREACH_VAL(replace, entry) {
Z_TRY_ADDREF_P(entry);
zend_hash_next_index_insert_new(&out_hash, entry);
pos++;
@@ -3190,9 +3105,6 @@ PHP_FUNCTION(array_pop)
idx--;
p = Z_ARRVAL_P(stack)->arData + idx;
val = &p->val;
- if (Z_TYPE_P(val) == IS_INDIRECT) {
- val = Z_INDIRECT_P(val);
- }
if (Z_TYPE_P(val) != IS_UNDEF) {
break;
}
@@ -3204,12 +3116,7 @@ PHP_FUNCTION(array_pop)
}
/* Delete the last value */
- if (p->key && Z_ARRVAL_P(stack) == &EG(symbol_table)) {
- zend_delete_global_variable(p->key);
- } else {
- zend_hash_del_bucket(Z_ARRVAL_P(stack), p);
- }
-
+ zend_hash_del_bucket(Z_ARRVAL_P(stack), p);
zend_hash_internal_pointer_reset(Z_ARRVAL_P(stack));
}
/* }}} */
@@ -3238,9 +3145,6 @@ PHP_FUNCTION(array_shift)
}
p = Z_ARRVAL_P(stack)->arData + idx;
val = &p->val;
- if (Z_TYPE_P(val) == IS_INDIRECT) {
- val = Z_INDIRECT_P(val);
- }
if (Z_TYPE_P(val) != IS_UNDEF) {
break;
}
@@ -3249,11 +3153,7 @@ PHP_FUNCTION(array_shift)
ZVAL_COPY_DEREF(return_value, val);
/* Delete the first value */
- if (p->key && Z_ARRVAL_P(stack) == &EG(symbol_table)) {
- zend_delete_global_variable(p->key);
- } else {
- zend_hash_del_bucket(Z_ARRVAL_P(stack), p);
- }
+ zend_hash_del_bucket(Z_ARRVAL_P(stack), p);
/* re-index like it did before */
if (HT_FLAGS(Z_ARRVAL_P(stack)) & HASH_FLAG_PACKED) {
@@ -3384,7 +3284,7 @@ PHP_FUNCTION(array_splice)
HashTable *rem_hash = NULL;
zend_long offset,
length = 0;
- zend_bool length_is_null = 1;
+ bool length_is_null = 1;
int num_in; /* Number of elements in the input array */
ZEND_PARSE_PARAMETERS_START(2, 4)
@@ -3403,7 +3303,7 @@ PHP_FUNCTION(array_splice)
if (ZEND_NUM_ARGS() == 4) {
/* Make sure the last argument, if passed, is an array */
- convert_to_array_ex(repl_array);
+ convert_to_array(repl_array);
}
/* Don't create the array of removed elements if it's not going
@@ -3472,8 +3372,8 @@ PHP_FUNCTION(array_slice)
zval *entry; /* An array entry */
zend_long offset; /* Offset to get elements from */
zend_long length = 0; /* How many elements to get */
- zend_bool length_is_null = 1; /* Whether an explicit length has been omitted */
- zend_bool preserve_keys = 0; /* Whether to preserve keys while copying to the new array */
+ bool length_is_null = 1; /* Whether an explicit length has been omitted */
+ bool preserve_keys = 0; /* Whether to preserve keys while copying to the new array */
uint32_t num_in; /* Number of elements in the input array */
zend_string *string_key;
zend_ulong num_key;
@@ -3601,10 +3501,10 @@ PHPAPI int php_array_merge_recursive(HashTable *dest, HashTable *src) /* {{{ */
dest_zval = dest_entry;
if (Z_TYPE_P(dest_zval) == IS_NULL) {
- convert_to_array_ex(dest_zval);
+ convert_to_array(dest_zval);
add_next_index_null(dest_zval);
} else {
- convert_to_array_ex(dest_zval);
+ convert_to_array(dest_zval);
}
ZVAL_UNDEF(&tmp);
if (Z_TYPE_P(src_zval) == IS_OBJECT) {
@@ -3827,7 +3727,7 @@ static zend_always_inline void php_array_merge_wrapper(INTERNAL_FUNCTION_PARAMET
return;
}
} else {
- zend_bool copy = 1;
+ bool copy = 1;
zend_string *string_key;
ZEND_HASH_FOREACH_STR_KEY(Z_ARRVAL_P(ret), string_key) {
@@ -3926,7 +3826,7 @@ PHP_FUNCTION(array_keys)
*search_value = NULL, /* Value to search for */
*entry, /* An entry in the input array */
new_val; /* New value */
- zend_bool strict = 0; /* do strict comparison */
+ bool strict = 0; /* do strict comparison */
zend_ulong num_idx;
zend_string *str_idx;
zend_array *arrval;
@@ -3951,7 +3851,7 @@ PHP_FUNCTION(array_keys)
array_init(return_value);
if (strict) {
- ZEND_HASH_FOREACH_KEY_VAL_IND(arrval, num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arrval, num_idx, str_idx, entry) {
ZVAL_DEREF(entry);
if (fast_is_identical_function(search_value, entry)) {
if (str_idx) {
@@ -3963,7 +3863,7 @@ PHP_FUNCTION(array_keys)
}
} ZEND_HASH_FOREACH_END();
} else {
- ZEND_HASH_FOREACH_KEY_VAL_IND(arrval, num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(arrval, num_idx, str_idx, entry) {
if (fast_equal_check_function(search_value, entry)) {
if (str_idx) {
ZVAL_STR_COPY(&new_val, str_idx);
@@ -3988,7 +3888,7 @@ PHP_FUNCTION(array_keys)
}
} else {
/* Go through input array and add keys to the return array */
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(input), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(input), num_idx, str_idx, entry) {
if (str_idx) {
ZEND_HASH_FILL_SET_STR_COPY(str_idx);
} else {
@@ -4169,10 +4069,10 @@ PHP_FUNCTION(array_column)
zval *colval, *data, rv;
zend_string *column_str = NULL;
zend_long column_long;
- zend_bool column_is_null = 0;
+ bool column_is_null = 0;
zend_string *index_str = NULL;
zend_long index_long;
- zend_bool index_is_null = 1;
+ bool index_is_null = 1;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ARRAY_HT(input)
@@ -4229,7 +4129,7 @@ PHP_FUNCTION(array_reverse)
*entry; /* An entry in the input array */
zend_string *string_key;
zend_ulong num_key;
- zend_bool preserve_keys = 0; /* whether to preserve keys */
+ bool preserve_keys = 0; /* whether to preserve keys */
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_ARRAY(input)
@@ -4339,7 +4239,7 @@ PHP_FUNCTION(array_pad)
}
}
- ZEND_HASH_FOREACH_STR_KEY_VAL_IND(Z_ARRVAL_P(input), key, value) {
+ ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(input), key, value) {
Z_TRY_ADDREF_P(value);
if (key) {
zend_hash_add_new(Z_ARRVAL_P(return_value), key, value);
@@ -4473,7 +4373,7 @@ PHP_FUNCTION(array_unique)
zend_hash_init(&seen, zend_hash_num_elements(Z_ARRVAL_P(array)), NULL, NULL, 0);
array_init(return_value);
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_key, str_key, val) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_key, str_key, val) {
zval *retval;
if (Z_TYPE_P(val) == IS_STRING) {
retval = zend_hash_add_empty_element(&seen, Z_STR_P(val));
@@ -4512,7 +4412,6 @@ PHP_FUNCTION(array_unique)
for (i = 0, idx = 0; idx < Z_ARRVAL_P(array)->nNumUsed; idx++) {
p = Z_ARRVAL_P(array)->arData + idx;
if (Z_TYPE(p->val) == IS_UNDEF) continue;
- if (Z_TYPE(p->val) == IS_INDIRECT && Z_TYPE_P(Z_INDIRECT(p->val)) == IS_UNDEF) continue;
arTmp[i].b = *p;
arTmp[i].i = i;
i++;
@@ -4535,11 +4434,7 @@ PHP_FUNCTION(array_unique)
if (p->key == NULL) {
zend_hash_index_del(Z_ARRVAL_P(return_value), p->h);
} else {
- if (Z_ARRVAL_P(return_value) == &EG(symbol_table)) {
- zend_delete_global_variable(p->key);
- } else {
- zend_hash_del(Z_ARRVAL_P(return_value), p->key);
- }
+ zend_hash_del(Z_ARRVAL_P(return_value), p->key);
}
}
}
@@ -4580,7 +4475,7 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
int argc, i;
zval *args;
int (*intersect_data_compare_func)(zval *, zval *) = NULL;
- zend_bool ok;
+ bool ok;
zval *val, *data;
char *param_spec;
zend_string *key;
@@ -4615,8 +4510,8 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
array_init(return_value);
- /* Iterate over keys of the first array (handling possibility of indirects such as in $GLOBALS), to compute keys that are in all of the other arrays. */
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL(args[0]), h, key, val) {
+ /* Iterate over keys of the first array, to compute keys that are in all of the other arrays. */
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(args[0]), h, key, val) {
if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
val = Z_REFVAL_P(val);
}
@@ -4638,7 +4533,7 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
} else {
ok = 1;
for (i = 1; i < argc; i++) {
- if ((data = zend_hash_find_ex_ind(Z_ARRVAL(args[i]), key, 1)) == NULL ||
+ if ((data = zend_hash_find_ex(Z_ARRVAL(args[i]), key, 1)) == NULL ||
(intersect_data_compare_func &&
intersect_data_compare_func(val, data) != 0)
) {
@@ -4959,7 +4854,7 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty
int argc, i;
zval *args;
int (*diff_data_compare_func)(zval *, zval *) = NULL;
- zend_bool ok;
+ bool ok;
zval *val, *data;
zend_string *key;
zend_ulong h;
@@ -4989,8 +4884,8 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty
array_init(return_value);
- /* Iterate over keys of the first array (handling possibility of indirects such as in $GLOBALS), to compute keys that aren't in the other arrays. */
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL(args[0]), h, key, val) {
+ /* Iterate over keys of the first array, to compute keys that aren't in the other arrays. */
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(args[0]), h, key, val) {
if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
val = Z_REFVAL_P(val);
}
@@ -5012,7 +4907,7 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty
} else {
ok = 1;
for (i = 1; i < argc; i++) {
- if ((data = zend_hash_find_ex_ind(Z_ARRVAL(args[i]), key, 1)) != NULL &&
+ if ((data = zend_hash_find_ex(Z_ARRVAL(args[i]), key, 1)) != NULL &&
(!diff_data_compare_func ||
diff_data_compare_func(val, data) == 0)
) {
@@ -5319,7 +5214,7 @@ PHP_FUNCTION(array_diff)
zend_string *search_str, *tmp_search_str;
value = NULL;
- ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(args[0]), value) {
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL(args[0]), value) {
break;
} ZEND_HASH_FOREACH_END();
@@ -5341,7 +5236,7 @@ PHP_FUNCTION(array_diff)
RETURN_THROWS();
}
if (!found) {
- ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(args[i]), value) {
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL(args[i]), value) {
str = zval_get_tmp_string(value, &tmp_str);
if (zend_string_equals(search_str, str)) {
zend_tmp_string_release(tmp_str);
@@ -5382,7 +5277,7 @@ PHP_FUNCTION(array_diff)
/* create exclude map */
zend_hash_init(&exclude, num, NULL, NULL, 0);
for (i = 1; i < argc; i++) {
- ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(args[i]), value) {
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL(args[i]), value) {
str = zval_get_tmp_string(value, &tmp_str);
zend_hash_add(&exclude, str, &dummy);
zend_tmp_string_release(tmp_str);
@@ -5391,7 +5286,7 @@ PHP_FUNCTION(array_diff)
/* copy all elements of first array that are not in exclude set */
array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL(args[0])));
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL(args[0]), idx, key, value) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(args[0]), idx, key, value) {
str = zval_get_tmp_string(value, &tmp_str);
if (!zend_hash_exists(&exclude, str)) {
if (key) {
@@ -5894,7 +5789,7 @@ PHP_FUNCTION(array_filter)
zval *key;
zval args[2];
zval retval;
- zend_bool have_callback = 0;
+ bool have_callback = 0;
zend_long use_type = 0;
zend_string *string_key;
zend_fcall_info fci = empty_fcall_info;
@@ -5926,7 +5821,7 @@ PHP_FUNCTION(array_filter)
}
}
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(array), num_key, string_key, operand) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_key, string_key, operand) {
if (have_callback) {
if (use_type) {
/* Set up the key */
@@ -6011,7 +5906,7 @@ PHP_FUNCTION(array_map)
array_init_size(return_value, maxlen);
zend_hash_real_init(Z_ARRVAL_P(return_value), HT_FLAGS(Z_ARRVAL(arrays[0])) & HASH_FLAG_PACKED);
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL(arrays[0]), num_key, str_key, zv) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(arrays[0]), num_key, str_key, zv) {
fci.retval = &result;
fci.param_count = 1;
fci.params = &arg;
@@ -6139,13 +6034,13 @@ PHP_FUNCTION(array_key_exists)
switch (Z_TYPE_P(key)) {
case IS_STRING:
- RETVAL_BOOL(zend_symtable_exists_ind(ht, Z_STR_P(key)));
+ RETVAL_BOOL(zend_symtable_exists(ht, Z_STR_P(key)));
break;
case IS_LONG:
RETVAL_BOOL(zend_hash_index_exists(ht, Z_LVAL_P(key)));
break;
case IS_NULL:
- RETVAL_BOOL(zend_hash_exists_ind(ht, ZSTR_EMPTY_ALLOC()));
+ RETVAL_BOOL(zend_hash_exists(ht, ZSTR_EMPTY_ALLOC()));
break;
case IS_DOUBLE:
RETVAL_BOOL(zend_hash_index_exists(ht, zend_dval_to_lval(Z_DVAL_P(key))));
@@ -6174,7 +6069,7 @@ PHP_FUNCTION(array_chunk)
zend_long size, current = 0;
zend_string *str_key;
zend_ulong num_key;
- zend_bool preserve_keys = 0;
+ bool preserve_keys = 0;
zval *input = NULL;
zval chunk;
zval *entry;
diff --git a/ext/standard/assert.c b/ext/standard/assert.c
index 86acaec389..8b2e25fcc5 100644
--- a/ext/standard/assert.c
+++ b/ext/standard/assert.c
@@ -24,16 +24,14 @@
ZEND_BEGIN_MODULE_GLOBALS(assert)
zval callback;
char *cb;
- zend_bool active;
- zend_bool bail;
- zend_bool warning;
- zend_bool exception;
+ bool active;
+ bool bail;
+ bool warning;
+ bool exception;
ZEND_END_MODULE_GLOBALS(assert)
ZEND_DECLARE_MODULE_GLOBALS(assert)
-static zend_class_entry *assertion_error_ce;
-
#define ASSERTG(v) ZEND_MODULE_GLOBALS_ACCESSOR(assert, v)
#define SAFE_STRING(s) ((s)?(s):"")
@@ -46,6 +44,8 @@ enum {
ASSERT_EXCEPTION
};
+PHPAPI zend_class_entry *assertion_error_ce;
+
static PHP_INI_MH(OnChangeCallback) /* {{{ */
{
if (EG(current_execute_data)) {
@@ -89,8 +89,6 @@ static void php_assert_init_globals(zend_assert_globals *assert_globals_p) /* {{
PHP_MINIT_FUNCTION(assert) /* {{{ */
{
- zend_class_entry ce;
-
ZEND_INIT_MODULE_GLOBALS(assert, php_assert_init_globals, NULL);
REGISTER_INI_ENTRIES();
@@ -101,9 +99,6 @@ PHP_MINIT_FUNCTION(assert) /* {{{ */
REGISTER_LONG_CONSTANT("ASSERT_WARNING", ASSERT_WARNING, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("ASSERT_EXCEPTION", ASSERT_EXCEPTION, CONST_CS|CONST_PERSISTENT);
- INIT_CLASS_ENTRY(ce, "AssertionError", NULL);
- assertion_error_ce = zend_register_internal_class_ex(&ce, zend_ce_error);
-
return SUCCESS;
}
/* }}} */
@@ -208,7 +203,7 @@ PHP_FUNCTION(assert_options)
{
zval *value = NULL;
zend_long what;
- zend_bool oldint;
+ bool oldint;
int ac = ZEND_NUM_ARGS();
zend_string *key;
diff --git a/ext/standard/base64.c b/ext/standard/base64.c
index 2d67f88f66..234d61226f 100644
--- a/ext/standard/base64.c
+++ b/ext/standard/base64.c
@@ -243,7 +243,7 @@ static zend_always_inline size_t neon_base64_decode(const unsigned char *in, siz
}
#endif /* __aarch64__ */
-static zend_always_inline int php_base64_decode_impl(const unsigned char *in, size_t inl, unsigned char *out, size_t *outl, zend_bool strict) /* {{{ */
+static zend_always_inline int php_base64_decode_impl(const unsigned char *in, size_t inl, unsigned char *out, size_t *outl, bool strict) /* {{{ */
{
int ch;
size_t i = 0, padding = 0, j = *outl;
@@ -368,23 +368,23 @@ fail:
# if ZEND_INTRIN_AVX2_RESOLVER
ZEND_INTRIN_AVX2_FUNC_DECL(zend_string *php_base64_encode_avx2(const unsigned char *str, size_t length));
-ZEND_INTRIN_AVX2_FUNC_DECL(zend_string *php_base64_decode_ex_avx2(const unsigned char *str, size_t length, zend_bool strict));
+ZEND_INTRIN_AVX2_FUNC_DECL(zend_string *php_base64_decode_ex_avx2(const unsigned char *str, size_t length, bool strict));
# endif
# if ZEND_INTRIN_SSSE3_RESOLVER
ZEND_INTRIN_SSSE3_FUNC_DECL(zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length));
-ZEND_INTRIN_SSSE3_FUNC_DECL(zend_string *php_base64_decode_ex_ssse3(const unsigned char *str, size_t length, zend_bool strict));
+ZEND_INTRIN_SSSE3_FUNC_DECL(zend_string *php_base64_decode_ex_ssse3(const unsigned char *str, size_t length, bool strict));
# endif
zend_string *php_base64_encode_default(const unsigned char *str, size_t length);
-zend_string *php_base64_decode_ex_default(const unsigned char *str, size_t length, zend_bool strict);
+zend_string *php_base64_decode_ex_default(const unsigned char *str, size_t length, bool strict);
# if (ZEND_INTRIN_AVX2_FUNC_PROTO || ZEND_INTRIN_SSSE3_FUNC_PROTO)
PHPAPI zend_string *php_base64_encode(const unsigned char *str, size_t length) __attribute__((ifunc("resolve_base64_encode")));
-PHPAPI zend_string *php_base64_decode_ex(const unsigned char *str, size_t length, zend_bool strict) __attribute__((ifunc("resolve_base64_decode")));
+PHPAPI zend_string *php_base64_decode_ex(const unsigned char *str, size_t length, bool strict) __attribute__((ifunc("resolve_base64_decode")));
typedef zend_string *(*base64_encode_func_t)(const unsigned char *, size_t);
-typedef zend_string *(*base64_decode_func_t)(const unsigned char *, size_t, zend_bool);
+typedef zend_string *(*base64_decode_func_t)(const unsigned char *, size_t, bool);
ZEND_NO_SANITIZE_ADDRESS
ZEND_ATTRIBUTE_UNUSED /* clang mistakenly warns about this */
@@ -420,12 +420,12 @@ static base64_decode_func_t resolve_base64_decode() {
# else /* (ZEND_INTRIN_AVX2_FUNC_PROTO || ZEND_INTRIN_SSSE3_FUNC_PROTO) */
PHPAPI zend_string *(*php_base64_encode_ptr)(const unsigned char *str, size_t length) = NULL;
-PHPAPI zend_string *(*php_base64_decode_ex_ptr)(const unsigned char *str, size_t length, zend_bool strict) = NULL;
+PHPAPI zend_string *(*php_base64_decode_ex_ptr)(const unsigned char *str, size_t length, bool strict) = NULL;
PHPAPI zend_string *php_base64_encode(const unsigned char *str, size_t length) {
return php_base64_encode_ptr(str, length);
}
-PHPAPI zend_string *php_base64_decode_ex(const unsigned char *str, size_t length, zend_bool strict) {
+PHPAPI zend_string *php_base64_decode_ex(const unsigned char *str, size_t length, bool strict) {
return php_base64_decode_ex_ptr(str, length, strict);
}
@@ -775,11 +775,11 @@ static __m128i php_base64_decode_ssse3_reshuffle(__m128i in)
#if ZEND_INTRIN_AVX2_NATIVE || ZEND_INTRIN_AVX2_RESOLVER || ZEND_INTRIN_SSSE3_NATIVE || ZEND_INTRIN_SSSE3_RESOLVER
# if ZEND_INTRIN_AVX2_NATIVE || ZEND_INTRIN_SSSE3_NATIVE
-PHPAPI zend_string *php_base64_decode_ex(const unsigned char *str, size_t length, zend_bool strict)
+PHPAPI zend_string *php_base64_decode_ex(const unsigned char *str, size_t length, bool strict)
# elif ZEND_INTRIN_AVX2_RESOLVER
-zend_string *php_base64_decode_ex_avx2(const unsigned char *str, size_t length, zend_bool strict)
+zend_string *php_base64_decode_ex_avx2(const unsigned char *str, size_t length, bool strict)
# else
-zend_string *php_base64_decode_ex_ssse3(const unsigned char *str, size_t length, zend_bool strict)
+zend_string *php_base64_decode_ex_ssse3(const unsigned char *str, size_t length, bool strict)
# endif
{
const unsigned char *c = str;
@@ -856,7 +856,7 @@ zend_string *php_base64_decode_ex_ssse3(const unsigned char *str, size_t length,
}
# if ZEND_INTRIN_SSSE3_RESOLVER && ZEND_INTRIN_AVX2_RESOLVER
-zend_string *php_base64_decode_ex_ssse3(const unsigned char *str, size_t length, zend_bool strict)
+zend_string *php_base64_decode_ex_ssse3(const unsigned char *str, size_t length, bool strict)
{
const unsigned char *c = str;
unsigned char *o;
@@ -903,9 +903,9 @@ PHPAPI zend_string *php_base64_encode(const unsigned char *str, size_t length)
#if !ZEND_INTRIN_AVX2_NATIVE && !ZEND_INTRIN_SSSE3_NATIVE
#if ZEND_INTRIN_AVX2_RESOLVER || ZEND_INTRIN_SSSE3_RESOLVER
-zend_string *php_base64_decode_ex_default(const unsigned char *str, size_t length, zend_bool strict)
+zend_string *php_base64_decode_ex_default(const unsigned char *str, size_t length, bool strict)
#else
-PHPAPI zend_string *php_base64_decode_ex(const unsigned char *str, size_t length, zend_bool strict)
+PHPAPI zend_string *php_base64_decode_ex(const unsigned char *str, size_t length, bool strict)
#endif
{
zend_string *result;
@@ -945,7 +945,7 @@ PHP_FUNCTION(base64_encode)
PHP_FUNCTION(base64_decode)
{
char *str;
- zend_bool strict = 0;
+ bool strict = 0;
size_t str_len;
zend_string *result;
diff --git a/ext/standard/base64.h b/ext/standard/base64.h
index 170c0b0c61..a6ce0e22c6 100644
--- a/ext/standard/base64.h
+++ b/ext/standard/base64.h
@@ -62,7 +62,7 @@ PHP_MINIT_FUNCTION(base64_intrin);
#endif
PHPAPI extern zend_string *php_base64_encode(const unsigned char *, size_t);
-PHPAPI extern zend_string *php_base64_decode_ex(const unsigned char *, size_t, zend_bool);
+PHPAPI extern zend_string *php_base64_decode_ex(const unsigned char *, size_t, bool);
static inline zend_string *php_base64_encode_str(const zend_string *str) {
return php_base64_encode((const unsigned char*)(ZSTR_VAL(str)), ZSTR_LEN(str));
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 876ef347eb..1f598aa540 100755
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -283,7 +283,10 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */
#endif
#endif
- php_register_incomplete_class();
+ php_ce_incomplete_class = register_class___PHP_Incomplete_Class();
+ php_register_incomplete_class_handlers();
+
+ assertion_error_ce = register_class_AssertionError(zend_ce_error);
REGISTER_LONG_CONSTANT("CONNECTION_ABORTED", PHP_CONNECTION_ABORTED, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("CONNECTION_NORMAL", PHP_CONNECTION_NORMAL, CONST_CS | CONST_PERSISTENT);
@@ -463,8 +466,6 @@ PHP_RINIT_FUNCTION(basic) /* {{{ */
BG(strtok_last) = NULL;
BG(ctype_string) = NULL;
BG(locale_changed) = 0;
- BG(array_walk_fci) = empty_fcall_info;
- BG(array_walk_fci_cache) = empty_fcall_info_cache;
BG(user_compare_fci) = empty_fcall_info;
BG(user_compare_fci_cache) = empty_fcall_info_cache;
BG(page_uid) = -1;
@@ -729,98 +730,98 @@ PHP_FUNCTION(long2ip)
* System Functions *
********************/
-/* {{{ Get the value of an environment variable or every available environment variable
- if no varname is present */
-PHP_FUNCTION(getenv)
-{
- char *ptr, *str = NULL;
- size_t str_len;
- zend_bool local_only = 0;
-
- ZEND_PARSE_PARAMETERS_START(0, 2)
- Z_PARAM_OPTIONAL
- Z_PARAM_STRING_OR_NULL(str, str_len)
- Z_PARAM_BOOL(local_only)
- ZEND_PARSE_PARAMETERS_END();
-
- if (!str) {
- array_init(return_value);
- php_import_environment_variables(return_value);
- return;
- }
-
- if (!local_only) {
- /* SAPI method returns an emalloc()'d string */
- ptr = sapi_getenv(str, str_len);
- if (ptr) {
- // TODO: avoid reallocation ???
- RETVAL_STRING(ptr);
- efree(ptr);
- return;
- }
- }
+PHPAPI zend_string *php_getenv(const char *str, size_t str_len) {
#ifdef PHP_WIN32
{
- wchar_t dummybuf;
- DWORD size;
- wchar_t *keyw, *valw;
-
- keyw = php_win32_cp_conv_any_to_w(str, str_len, PHP_WIN32_CP_IGNORE_LEN_P);
+ wchar_t *keyw = php_win32_cp_conv_any_to_w(str, str_len, PHP_WIN32_CP_IGNORE_LEN_P);
if (!keyw) {
- RETURN_FALSE;
+ return NULL;
}
SetLastError(0);
- /*If the given buffer is not large enough to hold the data, the return value is
- the buffer size, in characters, required to hold the string and its terminating
- null character. We use this return value to alloc the final buffer. */
- size = GetEnvironmentVariableW(keyw, &dummybuf, 0);
+ /* If the given buffer is not large enough to hold the data, the return value is
+ * the buffer size, in characters, required to hold the string and its terminating
+ * null character. We use this return value to alloc the final buffer. */
+ wchar_t dummybuf;
+ DWORD size = GetEnvironmentVariableW(keyw, &dummybuf, 0);
if (GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
- /* The environment variable doesn't exist. */
- free(keyw);
- RETURN_FALSE;
+ /* The environment variable doesn't exist. */
+ free(keyw);
+ return NULL;
}
if (size == 0) {
- /* env exists, but it is empty */
- free(keyw);
- RETURN_EMPTY_STRING();
+ /* env exists, but it is empty */
+ free(keyw);
+ return ZSTR_EMPTY_ALLOC();
}
- valw = emalloc((size + 1) * sizeof(wchar_t));
+ wchar_t *valw = emalloc((size + 1) * sizeof(wchar_t));
size = GetEnvironmentVariableW(keyw, valw, size);
if (size == 0) {
- /* has been removed between the two calls */
- free(keyw);
- efree(valw);
- RETURN_EMPTY_STRING();
+ /* has been removed between the two calls */
+ free(keyw);
+ efree(valw);
+ return ZSTR_EMPTY_ALLOC();
} else {
- ptr = php_win32_cp_w_to_any(valw);
- RETVAL_STRING(ptr);
+ char *ptr = php_win32_cp_w_to_any(valw);
+ zend_string *result = zend_string_init(ptr, strlen(ptr), 0);
free(ptr);
free(keyw);
efree(valw);
- return;
+ return result;
}
}
#else
-
tsrm_env_lock();
/* system method returns a const */
- ptr = getenv(str);
-
+ char *ptr = getenv(str);
+ zend_string *result = NULL;
if (ptr) {
- RETVAL_STRING(ptr);
+ result = zend_string_init(ptr, strlen(ptr), 0);
}
tsrm_env_unlock();
+ return result;
+#endif
+}
- if (ptr) {
- return;
- }
+/* {{{ Get the value of an environment variable or every available environment variable
+ if no varname is present */
+PHP_FUNCTION(getenv)
+{
+ char *str = NULL;
+ size_t str_len;
+ bool local_only = 0;
-#endif
+ ZEND_PARSE_PARAMETERS_START(0, 2)
+ Z_PARAM_OPTIONAL
+ Z_PARAM_STRING_OR_NULL(str, str_len)
+ Z_PARAM_BOOL(local_only)
+ ZEND_PARSE_PARAMETERS_END();
+
+ if (!str) {
+ array_init(return_value);
+ php_import_environment_variables(return_value);
+ return;
+ }
+
+ if (!local_only) {
+ /* SAPI method returns an emalloc()'d string */
+ char *ptr = sapi_getenv(str, str_len);
+ if (ptr) {
+ // TODO: avoid reallocation ???
+ RETVAL_STRING(ptr);
+ efree(ptr);
+ return;
+ }
+ }
+
+ zend_string *res = php_getenv(str, str_len);
+ if (res) {
+ RETURN_STR(res);
+ }
RETURN_FALSE;
}
/* }}} */
@@ -1172,7 +1173,7 @@ PHP_FUNCTION(getopt)
int optname_int = atoi(optname);
if ((args = zend_hash_index_find(Z_ARRVAL_P(return_value), optname_int)) != NULL) {
if (Z_TYPE_P(args) != IS_ARRAY) {
- convert_to_array_ex(args);
+ convert_to_array(args);
}
zend_hash_next_index_insert(Z_ARRVAL_P(args), &val);
} else {
@@ -1182,7 +1183,7 @@ PHP_FUNCTION(getopt)
/* other strings */
if ((args = zend_hash_str_find(Z_ARRVAL_P(return_value), optname, strlen(optname))) != NULL) {
if (Z_TYPE_P(args) != IS_ARRAY) {
- convert_to_array_ex(args);
+ convert_to_array(args);
}
zend_hash_next_index_insert(Z_ARRVAL_P(args), &val);
} else {
@@ -1472,7 +1473,7 @@ PHPAPI int _php_error_log_ex(int opt_err, const char *message, size_t message_le
return FAILURE;
case 3: /*save to a file */
- stream = php_stream_open_wrapper(opt, "a", IGNORE_URL_WIN | REPORT_ERRORS, NULL);
+ stream = php_stream_open_wrapper(opt, "a", REPORT_ERRORS, NULL);
if (!stream) {
return FAILURE;
}
@@ -1809,7 +1810,7 @@ PHP_FUNCTION(register_shutdown_function)
}
/* }}} */
-PHPAPI zend_bool register_user_shutdown_function(const char *function_name, size_t function_len, php_shutdown_function_entry *shutdown_function_entry) /* {{{ */
+PHPAPI bool register_user_shutdown_function(const char *function_name, size_t function_len, php_shutdown_function_entry *shutdown_function_entry) /* {{{ */
{
if (!BG(user_shutdown_function_names)) {
ALLOC_HASHTABLE(BG(user_shutdown_function_names));
@@ -1821,7 +1822,7 @@ PHPAPI zend_bool register_user_shutdown_function(const char *function_name, size
}
/* }}} */
-PHPAPI zend_bool remove_user_shutdown_function(const char *function_name, size_t function_len) /* {{{ */
+PHPAPI bool remove_user_shutdown_function(const char *function_name, size_t function_len) /* {{{ */
{
if (BG(user_shutdown_function_names)) {
return zend_hash_str_del(BG(user_shutdown_function_names), function_name, function_len) != FAILURE;
@@ -1831,7 +1832,7 @@ PHPAPI zend_bool remove_user_shutdown_function(const char *function_name, size_t
}
/* }}} */
-PHPAPI zend_bool append_user_shutdown_function(php_shutdown_function_entry *shutdown_function_entry) /* {{{ */
+PHPAPI bool append_user_shutdown_function(php_shutdown_function_entry *shutdown_function_entry) /* {{{ */
{
if (!BG(user_shutdown_function_names)) {
ALLOC_HASHTABLE(BG(user_shutdown_function_names));
@@ -1859,7 +1860,7 @@ PHP_FUNCTION(highlight_file)
size_t filename_len;
int ret;
zend_syntax_highlighter_ini syntax_highlighter_ini;
- zend_bool i = 0;
+ bool i = 0;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_PATH(filename, filename_len)
@@ -1899,32 +1900,32 @@ PHP_FUNCTION(highlight_file)
/* {{{ Return source with stripped comments and whitespace */
PHP_FUNCTION(php_strip_whitespace)
{
- char *filename;
- size_t filename_len;
+ zend_string *filename;
zend_lex_state original_lex_state;
zend_file_handle file_handle;
ZEND_PARSE_PARAMETERS_START(1, 1)
- Z_PARAM_PATH(filename, filename_len)
+ Z_PARAM_PATH_STR(filename)
ZEND_PARSE_PARAMETERS_END();
php_output_start_default();
- zend_stream_init_filename(&file_handle, filename);
+ zend_stream_init_filename_ex(&file_handle, filename);
zend_save_lexical_state(&original_lex_state);
if (open_file_for_scanning(&file_handle) == FAILURE) {
zend_restore_lexical_state(&original_lex_state);
php_output_end();
+ zend_destroy_file_handle(&file_handle);
RETURN_EMPTY_STRING();
}
zend_strip();
- zend_destroy_file_handle(&file_handle);
zend_restore_lexical_state(&original_lex_state);
php_output_get_contents(return_value);
php_output_discard();
+ zend_destroy_file_handle(&file_handle);
}
/* }}} */
@@ -1934,7 +1935,7 @@ PHP_FUNCTION(highlight_string)
zend_string *str;
zend_syntax_highlighter_ini syntax_highlighter_ini;
char *hicompiled_string_description;
- zend_bool i = 0;
+ bool i = 0;
int old_error_reporting = EG(error_reporting);
ZEND_PARSE_PARAMETERS_START(1, 2)
@@ -1953,12 +1954,8 @@ PHP_FUNCTION(highlight_string)
hicompiled_string_description = zend_make_compiled_string_description("highlighted code");
- // TODO: Accept zend_string in highlight_string API.
- zval str_zv;
- ZVAL_STR_COPY(&str_zv, str);
- highlight_string(&str_zv, &syntax_highlighter_ini, hicompiled_string_description);
+ highlight_string(str, &syntax_highlighter_ini, hicompiled_string_description);
efree(hicompiled_string_description);
- zval_ptr_dtor(&str_zv);
EG(error_reporting) = old_error_reporting;
@@ -2013,7 +2010,7 @@ PHP_FUNCTION(ini_get_all)
char *extname = NULL;
size_t extname_len = 0, module_number = 0;
zend_module_entry *module;
- zend_bool details = 1;
+ bool details = 1;
zend_string *key;
zend_ini_entry *ini_entry;
@@ -2092,14 +2089,19 @@ static int php_ini_check_path(char *option_name, size_t option_len, char *new_op
PHP_FUNCTION(ini_set)
{
zend_string *varname;
- zend_string *new_value;
+ zval *new_value;
zend_string *val;
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_STR(varname)
- Z_PARAM_STR(new_value)
+ Z_PARAM_ZVAL(new_value)
ZEND_PARSE_PARAMETERS_END();
+ if (Z_TYPE_P(new_value) > IS_STRING) {
+ zend_argument_type_error(2, "must be of type string|int|float|bool|null");
+ RETURN_THROWS();
+ }
+
val = zend_ini_get_value(varname);
if (val) {
@@ -2108,6 +2110,9 @@ PHP_FUNCTION(ini_set)
RETVAL_FALSE;
}
+ zend_string *new_value_tmp_str;
+ zend_string *new_value_str = zval_get_tmp_string(new_value, &new_value_tmp_str);
+
#define _CHECK_PATH(var, var_len, ini) php_ini_check_path(var, var_len, ini, sizeof(ini))
/* open basedir check */
if (PG(open_basedir)) {
@@ -2117,18 +2122,20 @@ PHP_FUNCTION(ini_set)
_CHECK_PATH(ZSTR_VAL(varname), ZSTR_LEN(varname), "mail.log") ||
_CHECK_PATH(ZSTR_VAL(varname), ZSTR_LEN(varname), "java.library.path") ||
_CHECK_PATH(ZSTR_VAL(varname), ZSTR_LEN(varname), "vpopmail.directory")) {
- if (php_check_open_basedir(ZSTR_VAL(new_value))) {
+ if (php_check_open_basedir(ZSTR_VAL(new_value_str))) {
zval_ptr_dtor_str(return_value);
+ zend_tmp_string_release(new_value_tmp_str);
RETURN_FALSE;
}
}
}
#undef _CHECK_PATH
- if (zend_alter_ini_entry_ex(varname, new_value, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0) == FAILURE) {
+ if (zend_alter_ini_entry_ex(varname, new_value_str, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0) == FAILURE) {
zval_ptr_dtor_str(return_value);
- RETURN_FALSE;
+ RETVAL_FALSE;
}
+ zend_tmp_string_release(new_value_tmp_str);
}
/* }}} */
@@ -2197,7 +2204,7 @@ PHP_FUNCTION(get_include_path)
PHP_FUNCTION(print_r)
{
zval *var;
- zend_bool do_return = 0;
+ bool do_return = 0;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_ZVAL(var)
@@ -2235,8 +2242,8 @@ PHP_FUNCTION(connection_status)
/* {{{ Set whether we want to ignore a user abort event or not */
PHP_FUNCTION(ignore_user_abort)
{
- zend_bool arg = 0;
- zend_bool arg_is_null = 1;
+ bool arg = 0;
+ bool arg_is_null = 1;
int old_setting;
ZEND_PARSE_PARAMETERS_START(0, 1)
@@ -2399,7 +2406,7 @@ PHP_FUNCTION(register_tick_function)
}
if (Z_TYPE(tick_fe.arguments[0]) != IS_ARRAY && Z_TYPE(tick_fe.arguments[0]) != IS_OBJECT) {
- convert_to_string_ex(&tick_fe.arguments[0]);
+ convert_to_string(&tick_fe.arguments[0]);
}
if (!BG(user_tick_functions)) {
@@ -2470,7 +2477,7 @@ PHP_FUNCTION(move_uploaded_file)
{
char *path, *new_path;
size_t path_len, new_path_len;
- zend_bool successful = 0;
+ bool successful = 0;
#ifndef PHP_WIN32
int oldmask; int ret;
@@ -2599,21 +2606,20 @@ static void php_ini_parser_cb_with_sections(zval *arg1, zval *arg2, zval *arg3,
/* {{{ Parse configuration file */
PHP_FUNCTION(parse_ini_file)
{
- char *filename = NULL;
- size_t filename_len = 0;
- zend_bool process_sections = 0;
+ zend_string *filename = NULL;
+ bool process_sections = 0;
zend_long scanner_mode = ZEND_INI_SCANNER_NORMAL;
zend_file_handle fh;
zend_ini_parser_cb_t ini_parser_cb;
ZEND_PARSE_PARAMETERS_START(1, 3)
- Z_PARAM_PATH(filename, filename_len)
+ Z_PARAM_PATH_STR(filename)
Z_PARAM_OPTIONAL
Z_PARAM_BOOL(process_sections)
Z_PARAM_LONG(scanner_mode)
ZEND_PARSE_PARAMETERS_END();
- if (filename_len == 0) {
+ if (ZSTR_LEN(filename) == 0) {
zend_argument_value_error(1, "cannot be empty");
RETURN_THROWS();
}
@@ -2627,13 +2633,14 @@ PHP_FUNCTION(parse_ini_file)
}
/* Setup filehandle */
- zend_stream_init_filename(&fh, filename);
+ zend_stream_init_filename_ex(&fh, filename);
array_init(return_value);
if (zend_parse_ini_file(&fh, 0, (int)scanner_mode, ini_parser_cb, return_value) == FAILURE) {
zend_array_destroy(Z_ARR_P(return_value));
- RETURN_FALSE;
+ RETVAL_FALSE;
}
+ zend_destroy_file_handle(&fh);
}
/* }}} */
@@ -2642,7 +2649,7 @@ PHP_FUNCTION(parse_ini_string)
{
char *string = NULL, *str = NULL;
size_t str_len = 0;
- zend_bool process_sections = 0;
+ bool process_sections = 0;
zend_long scanner_mode = ZEND_INI_SCANNER_NORMAL;
zend_ini_parser_cb_t ini_parser_cb;
diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h
index 97faf50fd9..6df50d42e1 100644
--- a/ext/standard/basic_functions.h
+++ b/ext/standard/basic_functions.h
@@ -49,7 +49,7 @@ PHP_RSHUTDOWN_FUNCTION(browscap);
/* Left for BC (not binary safe!) */
PHPAPI int _php_error_log(int opt_err, const char *message, const char *opt, const char *headers);
PHPAPI int _php_error_log_ex(int opt_err, const char *message, size_t message_len, const char *opt, const char *headers);
-PHPAPI int php_prefix_varname(zval *result, zend_string *prefix, const char *var_name, size_t var_name_len, zend_bool add_underscore);
+PHPAPI int php_prefix_varname(zval *result, zend_string *prefix, const char *var_name, size_t var_name_len, bool add_underscore);
#define MT_N (624)
@@ -62,12 +62,10 @@ typedef struct _php_basic_globals {
HashTable putenv_ht;
zend_string *strtok_string;
zend_string *ctype_string; /* current LC_CTYPE locale (or NULL for 'C') */
- zend_bool locale_changed; /* locale was changed and has to be restored */
+ bool locale_changed; /* locale was changed and has to be restored */
char *strtok_last;
char strtok_table[256];
size_t strtok_len;
- zend_fcall_info array_walk_fci;
- zend_fcall_info_cache array_walk_fci_cache;
zend_fcall_info user_compare_fci;
zend_fcall_info_cache user_compare_fci_cache;
zend_llist *user_tick_functions;
@@ -81,7 +79,7 @@ typedef struct _php_basic_globals {
time_t page_mtime;
/* filestat.c && main/streams/streams.c */
- char *CurrentStatFile, *CurrentLStatFile;
+ zend_string *CurrentStatFile, *CurrentLStatFile;
php_stream_statbuf ssb, lssb;
/* mt_rand.c */
@@ -89,7 +87,7 @@ typedef struct _php_basic_globals {
uint32_t *next; /* next random value is computed from here */
int left; /* can *next++ this many times before reloading */
- zend_bool mt_rand_is_seeded; /* Whether mt_rand() has been seeded */
+ bool mt_rand_is_seeded; /* Whether mt_rand() has been seeded */
zend_long mt_rand_mode;
/* syslog.c */
@@ -139,6 +137,8 @@ typedef struct {
} putenv_entry;
#endif
+PHPAPI zend_string *php_getenv(const char *str, size_t str_len);
+
PHPAPI double php_get_nan(void);
PHPAPI double php_get_inf(void);
@@ -148,9 +148,9 @@ typedef struct _php_shutdown_function_entry {
int arg_count;
} php_shutdown_function_entry;
-PHPAPI extern zend_bool register_user_shutdown_function(const char *function_name, size_t function_len, php_shutdown_function_entry *shutdown_function_entry);
-PHPAPI extern zend_bool remove_user_shutdown_function(const char *function_name, size_t function_len);
-PHPAPI extern zend_bool append_user_shutdown_function(php_shutdown_function_entry *shutdown_function_entry);
+PHPAPI extern bool register_user_shutdown_function(const char *function_name, size_t function_len, php_shutdown_function_entry *shutdown_function_entry);
+PHPAPI extern bool remove_user_shutdown_function(const char *function_name, size_t function_len);
+PHPAPI extern bool append_user_shutdown_function(php_shutdown_function_entry *shutdown_function_entry);
PHPAPI void php_call_shutdown_functions(void);
PHPAPI void php_free_shutdown_functions(void);
diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php
index e83c89d4bf..83000d5b09 100755
--- a/ext/standard/basic_functions.stub.php
+++ b/ext/standard/basic_functions.stub.php
@@ -1,6 +1,14 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+
+final class __PHP_Incomplete_Class
+{
+}
+
+class AssertionError extends Error
+{
+}
/* main/main.c */
@@ -248,6 +256,8 @@ function array_chunk(array $array, int $length, bool $preserve_keys = false): ar
function array_combine(array $keys, array $values): array {}
+function array_is_list(array $array): bool {}
+
/* base64.c */
function base64_encode(string $string): string {}
@@ -316,7 +326,7 @@ function ini_get(string $option): string|false {}
function ini_get_all(?string $extension = null, bool $details = true): array|false {}
-function ini_set(string $option, string $value): string|false {}
+function ini_set(string $option, string|int|float|bool|null $value): string|false {}
/** @alias ini_set */
function ini_alter(string $option, string $value): string|false {}
@@ -512,15 +522,15 @@ function headers_list(): array {}
/* {{{ html.c */
-function htmlspecialchars(string $string, int $flags = ENT_COMPAT, ?string $encoding = null, bool $double_encode = true): string {}
+function htmlspecialchars(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE, ?string $encoding = null, bool $double_encode = true): string {}
-function htmlspecialchars_decode(string $string, int $flags = ENT_COMPAT): string {}
+function htmlspecialchars_decode(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE): string {}
-function html_entity_decode(string $string, int $flags = ENT_COMPAT, ?string $encoding = null): string {}
+function html_entity_decode(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE, ?string $encoding = null): string {}
-function htmlentities(string $string, int $flags = ENT_COMPAT, ?string $encoding = null, bool $double_encode = true): string {}
+function htmlentities(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE, ?string $encoding = null, bool $double_encode = true): string {}
-function get_html_translation_table(int $table = HTML_SPECIALCHARS, int $flags = ENT_COMPAT, string $encoding = "UTF-8"): array {}
+function get_html_translation_table(int $table = HTML_SPECIALCHARS, int $flags = ENT_QUOTES | ENT_SUBSTITUTE, string $encoding = "UTF-8"): array {}
/* }}} */
diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h
index 801fb2bcb1..f44a322267 100644
--- a/ext/standard/basic_functions_arginfo.h
+++ b/ext/standard/basic_functions_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 39cd1ddd82efd6b62605218faff8b720d8b97170 */
+ * Stub hash: 97edf8c87780c892984099e52ad1c6c745b919f8 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0)
@@ -360,6 +360,10 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_combine, 0, 2, IS_ARRAY, 0
ZEND_ARG_TYPE_INFO(0, values, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_is_list, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_TYPE_INFO(0, array, IS_ARRAY, 0)
+ZEND_END_ARG_INFO()
+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_base64_encode, 0, 1, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -487,10 +491,13 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ini_set, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, option, IS_STRING, 0)
- ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0)
+ ZEND_ARG_TYPE_MASK(0, value, MAY_BE_STRING|MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_BOOL|MAY_BE_NULL, NULL)
ZEND_END_ARG_INFO()
-#define arginfo_ini_alter arginfo_ini_set
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ini_alter, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
+ ZEND_ARG_TYPE_INFO(0, option, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0)
+ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ini_restore, 0, 1, IS_VOID, 0)
ZEND_ARG_TYPE_INFO(0, option, IS_STRING, 0)
@@ -765,19 +772,19 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_htmlspecialchars, 0, 1, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
- ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "ENT_COMPAT")
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "ENT_QUOTES | ENT_SUBSTITUTE")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, double_encode, _IS_BOOL, 0, "true")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_htmlspecialchars_decode, 0, 1, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
- ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "ENT_COMPAT")
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "ENT_QUOTES | ENT_SUBSTITUTE")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_html_entity_decode, 0, 1, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
- ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "ENT_COMPAT")
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "ENT_QUOTES | ENT_SUBSTITUTE")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 1, "null")
ZEND_END_ARG_INFO()
@@ -785,7 +792,7 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_get_html_translation_table, 0, 0, IS_ARRAY, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, table, IS_LONG, 0, "HTML_SPECIALCHARS")
- ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "ENT_COMPAT")
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "ENT_QUOTES | ENT_SUBSTITUTE")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 0, "\"UTF-8\"")
ZEND_END_ARG_INFO()
@@ -2309,6 +2316,7 @@ ZEND_FUNCTION(array_map);
ZEND_FUNCTION(array_key_exists);
ZEND_FUNCTION(array_chunk);
ZEND_FUNCTION(array_combine);
+ZEND_FUNCTION(array_is_list);
ZEND_FUNCTION(base64_encode);
ZEND_FUNCTION(base64_decode);
ZEND_FUNCTION(constant);
@@ -2933,6 +2941,7 @@ static const zend_function_entry ext_functions[] = {
ZEND_FALIAS(key_exists, array_key_exists, arginfo_key_exists)
ZEND_FE(array_chunk, arginfo_array_chunk)
ZEND_FE(array_combine, arginfo_array_combine)
+ ZEND_FE(array_is_list, arginfo_array_is_list)
ZEND_FE(base64_encode, arginfo_base64_encode)
ZEND_FE(base64_decode, arginfo_base64_decode)
ZEND_FE(constant, arginfo_constant)
@@ -3482,3 +3491,34 @@ static const zend_function_entry ext_functions[] = {
#endif
ZEND_FE_END
};
+
+
+static const zend_function_entry class___PHP_Incomplete_Class_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_AssertionError_methods[] = {
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class___PHP_Incomplete_Class(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "__PHP_Incomplete_Class", class___PHP_Incomplete_Class_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_AssertionError(zend_class_entry *class_entry_Error)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "AssertionError", class_AssertionError_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
+
+ return class_entry;
+}
diff --git a/ext/standard/browscap.c b/ext/standard/browscap.c
index f4e38c5860..8b53c29c09 100644
--- a/ext/standard/browscap.c
+++ b/ext/standard/browscap.c
@@ -85,7 +85,7 @@ static void browscap_entry_dtor_persistent(zval *zvalue)
pefree(entry, 1);
}
-static inline zend_bool is_placeholder(char c) {
+static inline bool is_placeholder(char c) {
return c == '?' || c == '*';
}
@@ -221,7 +221,7 @@ typedef struct _browscap_parser_ctx {
} browscap_parser_ctx;
static zend_string *browscap_intern_str(
- browscap_parser_ctx *ctx, zend_string *str, zend_bool persistent) {
+ browscap_parser_ctx *ctx, zend_string *str, bool persistent) {
zend_string *interned = zend_hash_find_ptr(&ctx->str_interned, str);
if (interned) {
zend_string_addref(interned);
@@ -237,7 +237,7 @@ static zend_string *browscap_intern_str(
}
static zend_string *browscap_intern_str_ci(
- browscap_parser_ctx *ctx, zend_string *str, zend_bool persistent) {
+ browscap_parser_ctx *ctx, zend_string *str, bool persistent) {
zend_string *lcname;
zend_string *interned;
ALLOCA_FLAG(use_heap);
@@ -261,7 +261,7 @@ static zend_string *browscap_intern_str_ci(
}
static void browscap_add_kv(
- browser_data *bdata, zend_string *key, zend_string *value, zend_bool persistent) {
+ browser_data *bdata, zend_string *key, zend_string *value, bool persistent) {
if (bdata->kv_used == bdata->kv_size) {
bdata->kv_size *= 2;
bdata->kv = safe_perealloc(bdata->kv, sizeof(browscap_kv), bdata->kv_size, 0, persistent);
@@ -406,16 +406,18 @@ static int browscap_read_file(char *filename, browser_data *browdata, int persis
{
zend_file_handle fh;
browscap_parser_ctx ctx = {0};
+ FILE *fp;
if (filename == NULL || filename[0] == '\0') {
return FAILURE;
}
- zend_stream_init_fp(&fh, VCWD_FOPEN(filename, "r"), filename);
- if (!fh.handle.fp) {
+ fp = VCWD_FOPEN(filename, "r");
+ if (!fp) {
zend_error(E_CORE_WARNING, "Cannot open \"%s\" for reading", filename);
return FAILURE;
}
+ zend_stream_init_fp(&fh, fp, filename);
browdata->htab = pemalloc(sizeof *browdata->htab, persistent);
zend_hash_init(browdata->htab, 0, NULL,
@@ -439,6 +441,7 @@ static int browscap_read_file(char *filename, browser_data *browdata, int persis
zend_string_release(ctx.current_section_name);
}
zend_hash_destroy(&ctx.str_interned);
+ zend_destroy_file_handle(&fh);
return SUCCESS;
}
@@ -679,14 +682,14 @@ static void browscap_zval_copy_ctor(zval *p) /* {{{ */
PHP_FUNCTION(get_browser)
{
zend_string *agent_name = NULL, *lookup_browser_name;
- zend_bool return_array = 0;
+ bool return_array = 0;
browser_data *bdata;
browscap_entry *found_entry = NULL;
HashTable *agent_ht;
ZEND_PARSE_PARAMETERS_START(0, 2)
Z_PARAM_OPTIONAL
- Z_PARAM_STR_EX(agent_name, 1, 0)
+ Z_PARAM_STR_OR_NULL(agent_name)
Z_PARAM_BOOL(return_array)
ZEND_PARSE_PARAMETERS_END();
diff --git a/ext/standard/config.m4 b/ext/standard/config.m4
index 301540db58..d04add9629 100644
--- a/ext/standard/config.m4
+++ b/ext/standard/config.m4
@@ -390,34 +390,13 @@ dnl Check for argon2
dnl
PHP_ARG_WITH([password-argon2],
[for Argon2 support],
- [AS_HELP_STRING([[--with-password-argon2[=DIR]]],
- [Include Argon2 support in password_*. DIR is the Argon2 shared library
- path])])
+ [AS_HELP_STRING([[--with-password-argon2]],
+ [Include Argon2 support in password_*])])
if test "$PHP_PASSWORD_ARGON2" != "no"; then
- AC_MSG_CHECKING([for Argon2 library])
- for i in $PHP_PASSWORD_ARGON2 /usr /usr/local ; do
- if test -r $i/include/argon2.h; then
- ARGON2_DIR=$i;
- AC_MSG_RESULT(found in $i)
- break
- fi
- done
-
- if test -z "$ARGON2_DIR"; then
- AC_MSG_RESULT([not found])
- AC_MSG_ERROR([Please ensure the argon2 header and library are installed])
- fi
-
- PHP_ADD_LIBRARY_WITH_PATH(argon2, $ARGON2_DIR/$PHP_LIBDIR)
- PHP_ADD_INCLUDE($ARGON2_DIR/include)
-
- AC_CHECK_LIB(argon2, argon2id_hash_raw, [
- LIBS="$LIBS -largon2"
- AC_DEFINE(HAVE_ARGON2LIB, 1, [ Define to 1 if you have the <argon2.h> header file ])
- ], [
- AC_MSG_ERROR([Problem with libargon2.(a|so). Please verify that Argon2 header and libraries >= 20161029 are installed])
- ])
+ PKG_CHECK_MODULES([ARGON2], [libargon2])
+ PHP_EVAL_INCLINE($ARGON2_CFLAGS)
+ PHP_EVAL_LIBLINE($ARGON2_LIBS)
fi
dnl
diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c
index 8c105cf910..b3055bacd4 100644
--- a/ext/standard/crypt.c
+++ b/ext/standard/crypt.c
@@ -79,7 +79,7 @@ PHP_MSHUTDOWN_FUNCTION(crypt) /* {{{ */
}
/* }}} */
-PHPAPI zend_string *php_crypt(const char *password, const int pass_len, const char *salt, int salt_len, zend_bool quiet)
+PHPAPI zend_string *php_crypt(const char *password, const int pass_len, const char *salt, int salt_len, bool quiet)
{
char *crypt_res;
zend_string *result;
diff --git a/ext/standard/crypt_sha256.c b/ext/standard/crypt_sha256.c
index f64cf00868..4ba4f6c3dd 100644
--- a/ext/standard/crypt_sha256.c
+++ b/ext/standard/crypt_sha256.c
@@ -344,7 +344,7 @@ char * php_sha256_crypt_r(const char *key, const char *salt, char *buffer, int b
char *s_bytes;
/* Default number of rounds. */
size_t rounds = ROUNDS_DEFAULT;
- zend_bool rounds_custom = 0;
+ bool rounds_custom = 0;
/* Find beginning of salt string. The prefix should normally always
be present. Just in case it is not. */
diff --git a/ext/standard/crypt_sha512.c b/ext/standard/crypt_sha512.c
index 94dc772fd9..f896dad5a8 100644
--- a/ext/standard/crypt_sha512.c
+++ b/ext/standard/crypt_sha512.c
@@ -377,7 +377,7 @@ php_sha512_crypt_r(const char *key, const char *salt, char *buffer, int buflen)
char *s_bytes;
/* Default number of rounds. */
size_t rounds = ROUNDS_DEFAULT;
- zend_bool rounds_custom = 0;
+ bool rounds_custom = 0;
/* Find beginning of salt string. The prefix should normally always
be present. Just in case it is not. */
diff --git a/ext/standard/dir.c b/ext/standard/dir.c
index 6807c534ba..7d3af07697 100644
--- a/ext/standard/dir.c
+++ b/ext/standard/dir.c
@@ -112,10 +112,8 @@ PHP_RINIT_FUNCTION(dir)
PHP_MINIT_FUNCTION(dir)
{
static char dirsep_str[2], pathsep_str[2];
- zend_class_entry dir_class_entry;
- INIT_CLASS_ENTRY(dir_class_entry, "Directory", class_Directory_methods);
- dir_class_entry_ptr = zend_register_internal_class(&dir_class_entry);
+ dir_class_entry_ptr = register_class_Directory();
#ifdef ZTS
ts_allocate_id(&dir_globals_id, sizeof(php_dir_globals), NULL, NULL);
@@ -319,12 +317,12 @@ PHP_FUNCTION(chdir)
RETURN_FALSE;
}
- if (BG(CurrentStatFile) && !IS_ABSOLUTE_PATH(BG(CurrentStatFile), strlen(BG(CurrentStatFile)))) {
- efree(BG(CurrentStatFile));
+ if (BG(CurrentStatFile) && !IS_ABSOLUTE_PATH(ZSTR_VAL(BG(CurrentStatFile)), ZSTR_LEN(BG(CurrentStatFile)))) {
+ zend_string_release(BG(CurrentStatFile));
BG(CurrentStatFile) = NULL;
}
- if (BG(CurrentLStatFile) && !IS_ABSOLUTE_PATH(BG(CurrentLStatFile), strlen(BG(CurrentLStatFile)))) {
- efree(BG(CurrentLStatFile));
+ if (BG(CurrentLStatFile) && !IS_ABSOLUTE_PATH(ZSTR_VAL(BG(CurrentLStatFile)), ZSTR_LEN(BG(CurrentLStatFile)))) {
+ zend_string_release(BG(CurrentLStatFile));
BG(CurrentLStatFile) = NULL;
}
@@ -408,7 +406,7 @@ PHP_FUNCTION(glob)
glob_t globbuf;
size_t n;
int ret;
- zend_bool basedir_limit = 0;
+ bool basedir_limit = 0;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_PATH(pattern, pattern_len)
diff --git a/ext/standard/dir.stub.php b/ext/standard/dir.stub.php
index 9904c6bc99..9cafa29c37 100755
--- a/ext/standard/dir.stub.php
+++ b/ext/standard/dir.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class Directory
{
diff --git a/ext/standard/dir_arginfo.h b/ext/standard/dir_arginfo.h
index a2fa03611c..1ad629204c 100644
--- a/ext/standard/dir_arginfo.h
+++ b/ext/standard/dir_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: a715bf6a8d5fe69732623cc17f03bd463f369648 */
+ * Stub hash: 1fd5cc5147c7272006e59d63d68c12caec84589f */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Directory_close, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -20,3 +20,13 @@ static const zend_function_entry class_Directory_methods[] = {
ZEND_ME_MAPPING(read, readdir, arginfo_class_Directory_read, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_Directory(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "Directory", class_Directory_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/standard/dns.c b/ext/standard/dns.c
index 41b98424ed..105e0f0f26 100644
--- a/ext/standard/dns.c
+++ b/ext/standard/dns.c
@@ -811,7 +811,7 @@ PHP_FUNCTION(dns_get_record)
u_char *cp = NULL, *end = NULL;
int n, qd, an, ns = 0, ar = 0;
int type, first_query = 1, store_results = 1;
- zend_bool raw = 0;
+ bool raw = 0;
ZEND_PARSE_PARAMETERS_START(1, 5)
Z_PARAM_STRING(hostname, hostname_len)
diff --git a/ext/standard/dns_win32.c b/ext/standard/dns_win32.c
index afeab23a08..afd6b7eab6 100644
--- a/ext/standard/dns_win32.c
+++ b/ext/standard/dns_win32.c
@@ -351,7 +351,7 @@ PHP_FUNCTION(dns_get_record)
zend_long type_param = PHP_DNS_ANY;
zval *authns = NULL, *addtl = NULL;
int type, type_to_fetch, first_query = 1, store_results = 1;
- zend_bool raw = 0;
+ bool raw = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz!z!b",
&hostname, &hostname_len, &type_param, &authns, &addtl, &raw) == FAILURE) {
diff --git a/ext/standard/file.c b/ext/standard/file.c
index adca64eecb..ff29bf1b1c 100644
--- a/ext/standard/file.c
+++ b/ext/standard/file.c
@@ -379,7 +379,7 @@ PHP_FUNCTION(get_meta_tags)
{
char *filename;
size_t filename_len;
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
int in_tag = 0, done = 0;
int looking_for_val = 0, have_name = 0, have_content = 0;
int saw_name = 0, saw_content = 0;
@@ -523,11 +523,11 @@ PHP_FUNCTION(file_get_contents)
{
char *filename;
size_t filename_len;
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
php_stream *stream;
zend_long offset = 0;
zend_long maxlen;
- zend_bool maxlen_is_null = 1;
+ bool maxlen_is_null = 1;
zval *zcontext = NULL;
php_stream_context *context = NULL;
zend_string *contents;
@@ -650,7 +650,7 @@ PHP_FUNCTION(file_put_contents)
case IS_DOUBLE:
case IS_FALSE:
case IS_TRUE:
- convert_to_string_ex(data);
+ convert_to_string(data);
case IS_STRING:
if (Z_STRLEN_P(data)) {
@@ -724,9 +724,9 @@ PHP_FUNCTION(file)
register int i = 0;
char eol_marker = '\n';
zend_long flags = 0;
- zend_bool use_include_path;
- zend_bool include_new_line;
- zend_bool skip_blank_lines;
+ bool use_include_path;
+ bool include_new_line;
+ bool skip_blank_lines;
php_stream *stream;
zval *zcontext = NULL;
php_stream_context *context = NULL;
@@ -861,7 +861,7 @@ PHP_FUNCTION(fopen)
{
char *filename, *mode;
size_t filename_len, mode_len;
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
zval *zcontext = NULL;
php_stream *stream;
php_stream_context *context = NULL;
@@ -1010,7 +1010,7 @@ PHPAPI PHP_FUNCTION(fgets)
{
zval *res;
zend_long len = 1024;
- zend_bool len_is_null = 1;
+ bool len_is_null = 1;
char *buf = NULL;
size_t line_len = 0;
zend_string *str;
@@ -1133,7 +1133,7 @@ PHPAPI PHP_FUNCTION(fwrite)
ssize_t ret;
size_t num_bytes;
zend_long maxlen = 0;
- zend_bool maxlen_is_null = 1;
+ bool maxlen_is_null = 1;
php_stream *stream;
ZEND_PARSE_PARAMETERS_START(2, 3)
@@ -1278,7 +1278,7 @@ PHP_FUNCTION(mkdir)
size_t dir_len;
zval *zcontext = NULL;
zend_long mode = 0777;
- zend_bool recursive = 0;
+ bool recursive = 0;
php_stream_context *context;
ZEND_PARSE_PARAMETERS_START(1, 4)
@@ -1321,7 +1321,7 @@ PHP_FUNCTION(readfile)
char *filename;
size_t filename_len;
size_t size = 0;
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
zval *zcontext = NULL;
php_stream *stream;
php_stream_context *context = NULL;
@@ -1350,7 +1350,7 @@ PHP_FUNCTION(readfile)
PHP_FUNCTION(umask)
{
zend_long mask = 0;
- zend_bool mask_is_null = 1;
+ bool mask_is_null = 1;
int oldumask;
ZEND_PARSE_PARAMETERS_START(0, 1)
@@ -1643,7 +1643,7 @@ PHPAPI int php_copy_file_ctx(const char *src, const char *dest, int src_flg, php
return FAILURE;
}
- switch (php_stream_stat_path_ex(dest, PHP_STREAM_URL_STAT_QUIET | PHP_STREAM_URL_STAT_NOCACHE, &dest_s, ctx)) {
+ switch (php_stream_stat_path_ex(dest, PHP_STREAM_URL_STAT_QUIET, &dest_s, ctx)) {
case -1:
/* non-statable stream */
goto safe_to_copy;
@@ -1923,7 +1923,7 @@ PHP_FUNCTION(fgetcsv)
{
zval *fd;
- zend_bool len_is_null = 1;
+ bool len_is_null = 1;
char *delimiter_str = NULL;
size_t delimiter_str_len = 0;
char *enclosure_str = NULL;
@@ -2005,7 +2005,7 @@ PHPAPI void php_fgetcsv(php_stream *stream, char delimiter, char enclosure, int
char *temp, *tptr, *bptr, *line_end, *limit;
size_t temp_len, line_end_len;
int inc_len;
- zend_bool first_field = 1;
+ bool first_field = 1;
ZEND_ASSERT((escape_char >= 0 && escape_char <= UCHAR_MAX) || escape_char == PHP_CSV_NO_ESCAPE);
diff --git a/ext/standard/file.h b/ext/standard/file.h
index c51a953086..f9d153a52a 100644
--- a/ext/standard/file.h
+++ b/ext/standard/file.h
@@ -86,7 +86,7 @@ php_meta_tags_token php_next_meta_token(php_meta_tags_data *);
typedef struct {
int pclose_ret;
size_t def_chunk_size;
- zend_bool auto_detect_line_endings;
+ bool auto_detect_line_endings;
zend_long default_socket_timeout;
char *user_agent; /* for the http wrapper */
char *from_address; /* for the ftp and http wrappers */
diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c
index 303e919c19..0b488df4b2 100644
--- a/ext/standard/filestat.c
+++ b/ext/standard/filestat.c
@@ -88,11 +88,11 @@ PHP_RINIT_FUNCTION(filestat) /* {{{ */
PHP_RSHUTDOWN_FUNCTION(filestat) /* {{{ */
{
if (BG(CurrentStatFile)) {
- efree (BG(CurrentStatFile));
+ zend_string_release(BG(CurrentStatFile));
BG(CurrentStatFile) = NULL;
}
if (BG(CurrentLStatFile)) {
- efree (BG(CurrentLStatFile));
+ zend_string_release(BG(CurrentLStatFile));
BG(CurrentLStatFile) = NULL;
}
return SUCCESS;
@@ -594,7 +594,7 @@ PHP_FUNCTION(touch)
char *filename;
size_t filename_len;
zend_long filetime = 0, fileatime = 0;
- zend_bool filetime_is_null = 1, fileatime_is_null = 1;
+ bool filetime_is_null = 1, fileatime_is_null = 1;
int ret;
FILE *file;
struct utimbuf newtimebuf;
@@ -674,17 +674,17 @@ PHP_FUNCTION(touch)
#endif
/* {{{ php_clear_stat_cache() */
-PHPAPI void php_clear_stat_cache(zend_bool clear_realpath_cache, const char *filename, size_t filename_len)
+PHPAPI void php_clear_stat_cache(bool clear_realpath_cache, const char *filename, size_t filename_len)
{
/* always clear CurrentStatFile and CurrentLStatFile even if filename is not NULL
* as it may contain outdated data (e.g. "nlink" for a directory when deleting a file
* in this directory, as shown by lstat_stat_variation9.phpt) */
if (BG(CurrentStatFile)) {
- efree(BG(CurrentStatFile));
+ zend_string_release(BG(CurrentStatFile));
BG(CurrentStatFile) = NULL;
}
if (BG(CurrentLStatFile)) {
- efree(BG(CurrentLStatFile));
+ zend_string_release(BG(CurrentLStatFile));
BG(CurrentLStatFile) = NULL;
}
if (clear_realpath_cache) {
@@ -700,7 +700,7 @@ PHPAPI void php_clear_stat_cache(zend_bool clear_realpath_cache, const char *fil
/* {{{ Clear file stat cache */
PHP_FUNCTION(clearstatcache)
{
- zend_bool clear_realpath_cache = 0;
+ bool clear_realpath_cache = 0;
char *filename = NULL;
size_t filename_len = 0;
@@ -720,26 +720,27 @@ PHP_FUNCTION(clearstatcache)
#define IS_ACCESS_CHECK(__t) (IS_ABLE_CHECK(type) || (__t) == FS_EXISTS)
/* {{{ php_stat */
-PHPAPI void php_stat(const char *filename, size_t filename_length, int type, zval *return_value)
+PHPAPI void php_stat(zend_string *filename, int type, zval *return_value)
{
zend_stat_t *stat_sb;
php_stream_statbuf ssb;
int flags = 0, rmask=S_IROTH, wmask=S_IWOTH, xmask=S_IXOTH; /* access rights defaults to other */
- const char *local;
- php_stream_wrapper *wrapper;
+ const char *local = NULL;
+ php_stream_wrapper *wrapper = NULL;
- if (!filename_length || CHECK_NULL_PATH(filename, filename_length)) {
- if (filename_length && !IS_EXISTS_CHECK(type)) {
- php_error_docref(NULL, E_WARNING, "Filename contains null byte");
+ if (IS_ACCESS_CHECK(type)) {
+ if (!ZSTR_LEN(filename) || CHECK_NULL_PATH(ZSTR_VAL(filename), ZSTR_LEN(filename))) {
+ if (ZSTR_LEN(filename) && !IS_EXISTS_CHECK(type)) {
+ php_error_docref(NULL, E_WARNING, "Filename contains null byte");
+ }
+ RETURN_FALSE;
}
- RETURN_FALSE;
- }
- if ((wrapper = php_stream_locate_url_wrapper(filename, &local, 0)) == &php_plain_files_wrapper && php_check_open_basedir(local)) {
- RETURN_FALSE;
- }
+ if ((wrapper = php_stream_locate_url_wrapper(ZSTR_VAL(filename), &local, 0)) == &php_plain_files_wrapper
+ && php_check_open_basedir(local)) {
+ RETURN_FALSE;
+ }
- if (IS_ACCESS_CHECK(type)) {
if (wrapper == &php_plain_files_wrapper) {
switch (type) {
@@ -774,13 +775,63 @@ PHPAPI void php_stat(const char *filename, size_t filename_length, int type, zva
flags |= PHP_STREAM_URL_STAT_QUIET;
}
- if (php_stream_stat_path_ex((char *)filename, flags, &ssb, NULL)) {
- /* Error Occurred */
- if (!IS_EXISTS_CHECK(type)) {
- php_error_docref(NULL, E_WARNING, "%sstat failed for %s", IS_LINK_OPERATION(type) ? "L" : "", filename);
+ do {
+ /* Try to hit the cache first */
+ if (flags & PHP_STREAM_URL_STAT_LINK) {
+ if (filename == BG(CurrentLStatFile)
+ || (BG(CurrentLStatFile)
+ && zend_string_equal_content(filename, BG(CurrentLStatFile)))) {
+ memcpy(&ssb, &BG(lssb), sizeof(php_stream_statbuf));
+ break;
+ }
+ } else {
+ if (filename == BG(CurrentStatFile)
+ || (BG(CurrentStatFile)
+ && zend_string_equal_content(filename, BG(CurrentStatFile)))) {
+ memcpy(&ssb, &BG(ssb), sizeof(php_stream_statbuf));
+ break;
+ }
}
- RETURN_FALSE;
- }
+
+ if (!wrapper) {
+ if (!ZSTR_LEN(filename) || CHECK_NULL_PATH(ZSTR_VAL(filename), ZSTR_LEN(filename))) {
+ if (ZSTR_LEN(filename) && !IS_EXISTS_CHECK(type)) {
+ php_error_docref(NULL, E_WARNING, "Filename contains null byte");
+ }
+ RETURN_FALSE;
+ }
+
+ if ((wrapper = php_stream_locate_url_wrapper(ZSTR_VAL(filename), &local, 0)) == &php_plain_files_wrapper
+ && php_check_open_basedir(local)) {
+ RETURN_FALSE;
+ }
+ }
+
+ if (!wrapper
+ || !wrapper->wops->url_stat
+ || wrapper->wops->url_stat(wrapper, local, flags | PHP_STREAM_URL_STAT_IGNORE_OPEN_BASEDIR, &ssb, NULL)) {
+ /* Error Occurred */
+ if (!IS_EXISTS_CHECK(type)) {
+ php_error_docref(NULL, E_WARNING, "%sstat failed for %s", IS_LINK_OPERATION(type) ? "L" : "", ZSTR_VAL(filename));
+ }
+ RETURN_FALSE;
+ }
+
+ /* Drop into cache */
+ if (flags & PHP_STREAM_URL_STAT_LINK) {
+ if (BG(CurrentLStatFile)) {
+ zend_string_release(BG(CurrentLStatFile));
+ }
+ BG(CurrentLStatFile) = zend_string_copy(filename);
+ memcpy(&BG(lssb), &ssb, sizeof(php_stream_statbuf));
+ } else {
+ if (BG(CurrentStatFile)) {
+ zend_string_release(BG(CurrentStatFile));
+ }
+ BG(CurrentStatFile) = zend_string_copy(filename);
+ memcpy(&BG(ssb), &ssb, sizeof(php_stream_statbuf));
+ }
+ } while (0);
stat_sb = &ssb.sb;
@@ -936,14 +987,13 @@ PHPAPI void php_stat(const char *filename, size_t filename_length, int type, zva
/* {{{ FileFunction(name, funcnum) */
#define FileFunction(name, funcnum) \
ZEND_NAMED_FUNCTION(name) { \
- char *filename; \
- size_t filename_len; \
+ zend_string *filename; \
\
ZEND_PARSE_PARAMETERS_START(1, 1) \
- Z_PARAM_STRING(filename, filename_len) \
+ Z_PARAM_STR(filename) \
ZEND_PARSE_PARAMETERS_END(); \
\
- php_stat(filename, filename_len, funcnum, return_value); \
+ php_stat(filename, funcnum, return_value); \
}
/* }}} */
diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c
index a9c3cb0bf5..a4c5d6fe66 100644
--- a/ext/standard/fsock.c
+++ b/ext/standard/fsock.c
@@ -32,7 +32,7 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent)
zend_long port = -1;
zval *zerrno = NULL, *zerrstr = NULL;
double timeout;
- zend_bool timeout_is_null = 1;
+ bool timeout_is_null = 1;
#ifndef PHP_WIN32
time_t conv;
#else
diff --git a/ext/standard/ftp_fopen_wrapper.c b/ext/standard/ftp_fopen_wrapper.c
index 4dd38c4cba..896473b2d4 100644
--- a/ext/standard/ftp_fopen_wrapper.c
+++ b/ext/standard/ftp_fopen_wrapper.c
@@ -415,7 +415,7 @@ php_stream * php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, const char *pa
php_stream *reuseid=NULL;
size_t file_size = 0;
zval *tmpzval;
- zend_bool allow_overwrite = 0;
+ bool allow_overwrite = 0;
int8_t read_write = 0;
char *transport;
int transport_len;
diff --git a/ext/standard/head.c b/ext/standard/head.c
index 36f64fcb4d..19ed36c52c 100644
--- a/ext/standard/head.c
+++ b/ext/standard/head.c
@@ -31,7 +31,7 @@
/* {{{ Sends a raw HTTP header */
PHP_FUNCTION(header)
{
- zend_bool rep = 1;
+ bool rep = 1;
sapi_header_line ctr = {0};
char *line;
size_t len;
@@ -193,7 +193,7 @@ PHPAPI zend_result php_setcookie(zend_string *name, zend_string *value, time_t e
}
static zend_result php_head_parse_cookie_options_array(HashTable *options, zend_long *expires, zend_string **path,
- zend_string **domain, zend_bool *secure, zend_bool *httponly, zend_string **samesite)
+ zend_string **domain, bool *secure, bool *httponly, zend_string **samesite)
{
zend_string *key;
zval *value;
@@ -228,7 +228,7 @@ static void php_setcookie_common(INTERNAL_FUNCTION_PARAMETERS, bool is_raw)
HashTable *options = NULL;
zend_long expires = 0;
zend_string *name, *value = NULL, *path = NULL, *domain = NULL, *samesite = NULL;
- zend_bool secure = 0, httponly = 0;
+ bool secure = 0, httponly = 0;
ZEND_PARSE_PARAMETERS_START(1, 7)
Z_PARAM_STR(name)
diff --git a/ext/standard/hrtime.c b/ext/standard/hrtime.c
index 29a1132209..20604baa1d 100644
--- a/ext/standard/hrtime.c
+++ b/ext/standard/hrtime.c
@@ -34,12 +34,6 @@
static double _timer_scale = .0;
-#elif PHP_HRTIME_PLATFORM_APPLE
-
-# include <mach/mach_time.h>
-# include <string.h>
-static mach_timebase_info_data_t _timerlib_info;
-
#elif PHP_HRTIME_PLATFORM_HPUX
# include <sys/time.h>
@@ -66,9 +60,7 @@ static int _timer_init()
#elif PHP_HRTIME_PLATFORM_APPLE
- if (mach_timebase_info(&_timerlib_info)) {
- return -1;
- }
+ /* pass */
#elif PHP_HRTIME_PLATFORM_POSIX
@@ -115,7 +107,8 @@ static zend_always_inline php_hrtime_t _timer_current(void)
QueryPerformanceCounter(&lt);
return (php_hrtime_t)((php_hrtime_t)lt.QuadPart * _timer_scale);
#elif PHP_HRTIME_PLATFORM_APPLE
- return (php_hrtime_t)mach_absolute_time() * _timerlib_info.numer / _timerlib_info.denom;
+ /* the value is of php_hrtime_t type already */
+ return clock_gettime_nsec_np(CLOCK_MONOTONIC_RAW);
#elif PHP_HRTIME_PLATFORM_POSIX
struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 };
if (0 == clock_gettime(CLOCK_MONOTONIC, &ts)) {
@@ -163,7 +156,7 @@ static zend_always_inline php_hrtime_t _timer_current(void)
PHP_FUNCTION(hrtime)
{
#if HRTIME_AVAILABLE
- zend_bool get_as_num = 0;
+ bool get_as_num = 0;
php_hrtime_t t = _timer_current();
ZEND_PARSE_PARAMETERS_START(0, 1)
diff --git a/ext/standard/html.c b/ext/standard/html.c
index c949e058c1..b5e2cc4e66 100644
--- a/ext/standard/html.c
+++ b/ext/standard/html.c
@@ -365,7 +365,7 @@ static inline unsigned int get_next_char(
/* {{{ entity_charset determine_charset
* Returns the charset identifier based on an explicitly provided charset,
* the internal_encoding and default_charset ini settings, or UTF-8 by default. */
-static enum entity_charset determine_charset(const char *charset_hint, zend_bool quiet)
+static enum entity_charset determine_charset(const char *charset_hint, bool quiet)
{
if (!charset_hint || !*charset_hint) {
charset_hint = get_default_charset();
@@ -1100,7 +1100,7 @@ static inline void find_entity_for_char_basic(
/* }}} */
/* {{{ php_escape_html_entities */
-PHPAPI zend_string *php_escape_html_entities_ex(const unsigned char *old, size_t oldlen, int all, int flags, const char *hint_charset, zend_bool double_encode, zend_bool quiet)
+PHPAPI zend_string *php_escape_html_entities_ex(const unsigned char *old, size_t oldlen, int all, int flags, const char *hint_charset, bool double_encode, bool quiet)
{
size_t cursor, maxlen, len;
zend_string *replaced;
@@ -1316,15 +1316,15 @@ encode_amp:
static void php_html_entities(INTERNAL_FUNCTION_PARAMETERS, int all)
{
zend_string *str, *hint_charset = NULL;
- zend_long flags = ENT_COMPAT;
+ zend_long flags = ENT_QUOTES|ENT_SUBSTITUTE;
zend_string *replaced;
- zend_bool double_encode = 1;
+ bool double_encode = 1;
ZEND_PARSE_PARAMETERS_START(1, 4)
Z_PARAM_STR(str)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(flags)
- Z_PARAM_STR_EX(hint_charset, 1, 0)
+ Z_PARAM_STR_OR_NULL(hint_charset)
Z_PARAM_BOOL(double_encode);
ZEND_PARSE_PARAMETERS_END();
@@ -1367,7 +1367,7 @@ PHP_FUNCTION(htmlspecialchars)
PHP_FUNCTION(htmlspecialchars_decode)
{
zend_string *str;
- zend_long quote_style = ENT_COMPAT;
+ zend_long quote_style = ENT_QUOTES|ENT_SUBSTITUTE;
zend_string *replaced;
ZEND_PARSE_PARAMETERS_START(1, 2)
@@ -1385,7 +1385,7 @@ PHP_FUNCTION(htmlspecialchars_decode)
PHP_FUNCTION(html_entity_decode)
{
zend_string *str, *hint_charset = NULL;
- zend_long quote_style = ENT_COMPAT;
+ zend_long quote_style = ENT_QUOTES|ENT_SUBSTITUTE;
zend_string *replaced;
ZEND_PARSE_PARAMETERS_START(1, 3)
@@ -1468,7 +1468,7 @@ static inline void write_s3row_data(
PHP_FUNCTION(get_html_translation_table)
{
zend_long all = HTML_SPECIALCHARS,
- flags = ENT_COMPAT;
+ flags = ENT_QUOTES|ENT_SUBSTITUTE;
int doctype;
entity_table_opt entity_table;
const enc_to_uni *to_uni_table = NULL;
diff --git a/ext/standard/html.h b/ext/standard/html.h
index 3aee85cd87..63067e72ee 100644
--- a/ext/standard/html.h
+++ b/ext/standard/html.h
@@ -45,7 +45,7 @@
void register_html_constants(INIT_FUNC_ARGS);
PHPAPI zend_string *php_escape_html_entities(const unsigned char *old, size_t oldlen, int all, int flags, const char *hint_charset);
-PHPAPI zend_string *php_escape_html_entities_ex(const unsigned char *old, size_t oldlen, int all, int flags, const char *hint_charset, zend_bool double_encode, zend_bool quiet);
+PHPAPI zend_string *php_escape_html_entities_ex(const unsigned char *old, size_t oldlen, int all, int flags, const char *hint_charset, bool double_encode, bool quiet);
PHPAPI zend_string *php_unescape_html_entities(zend_string *str, int all, int flags, const char *hint_charset);
PHPAPI unsigned int php_next_utf8_char(const unsigned char *str, size_t str_len, size_t *cursor, int *status);
diff --git a/ext/standard/http.c b/ext/standard/http.c
index 18b7c6070b..b9a1605e7e 100644
--- a/ext/standard/http.c
+++ b/ext/standard/http.c
@@ -49,7 +49,7 @@ PHPAPI void php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
arg_sep_len = strlen(arg_sep);
ZEND_HASH_FOREACH_KEY_VAL(ht, idx, key, zdata) {
- zend_bool is_dynamic = 1;
+ bool is_dynamic = 1;
if (Z_TYPE_P(zdata) == IS_INDIRECT) {
zdata = Z_INDIRECT_P(zdata);
if (Z_ISUNDEF_P(zdata)) {
diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c
index da822d9160..0fc6e7e14d 100644
--- a/ext/standard/http_fopen_wrapper.c
+++ b/ext/standard/http_fopen_wrapper.c
@@ -103,7 +103,7 @@ static inline void strip_header(char *header_bag, char *lc_header_bag,
}
}
-static zend_bool check_has_header(const char *headers, const char *header) {
+static bool check_has_header(const char *headers, const char *header) {
const char *s = headers;
while ((s = strstr(s, header))) {
if (s == headers || *(s-1) == '\n') {
@@ -136,16 +136,16 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
zend_string *errstr = NULL;
size_t transport_len;
int have_header = 0;
- zend_bool request_fulluri = 0, ignore_errors = 0;
+ bool request_fulluri = 0, ignore_errors = 0;
struct timeval timeout;
char *user_headers = NULL;
int header_init = ((flags & HTTP_WRAPPER_HEADER_INIT) != 0);
int redirected = ((flags & HTTP_WRAPPER_REDIRECTED) != 0);
- zend_bool follow_location = 1;
+ bool follow_location = 1;
php_stream_filter *transfer_encoding = NULL;
int response_code;
smart_str req_buf = {0};
- zend_bool custom_request_method;
+ bool custom_request_method;
tmp_line[0] = '\0';
diff --git a/ext/standard/image.c b/ext/standard/image.c
index f34f14a7aa..2154f8e322 100644
--- a/ext/standard/image.c
+++ b/ext/standard/image.c
@@ -1207,7 +1207,7 @@ PHP_FUNCTION(image_type_to_mime_type)
PHP_FUNCTION(image_type_to_extension)
{
zend_long image_type;
- zend_bool inc_dot=1;
+ bool inc_dot=1;
const char *imgext = NULL;
ZEND_PARSE_PARAMETERS_START(1, 2)
@@ -1465,17 +1465,16 @@ static void php_getimagesize_from_stream(php_stream *stream, char *input, zval *
static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) { /* {{{ */
zval *info = NULL;
php_stream *stream = NULL;
- char *input;
- size_t input_len;
+ zend_string *input;
const int argc = ZEND_NUM_ARGS();
ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_STRING(input, input_len)
+ Z_PARAM_STR(input)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(info)
ZEND_PARSE_PARAMETERS_END();
- if (mode == FROM_PATH && CHECK_NULL_PATH(input, input_len)) {
+ if (mode == FROM_PATH && CHECK_NULL_PATH(ZSTR_VAL(input), ZSTR_LEN(input))) {
zend_argument_value_error(1, "must not contain any null bytes");
RETURN_THROWS();
}
@@ -1488,16 +1487,16 @@ static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) {
}
if (mode == FROM_PATH) {
- stream = php_stream_open_wrapper(input, "rb", STREAM_MUST_SEEK|REPORT_ERRORS|IGNORE_PATH, NULL);
+ stream = php_stream_open_wrapper(ZSTR_VAL(input), "rb", STREAM_MUST_SEEK|REPORT_ERRORS|IGNORE_PATH, NULL);
} else {
- stream = php_stream_memory_open(TEMP_STREAM_READONLY, input, input_len);
+ stream = php_stream_memory_open(TEMP_STREAM_READONLY, input);
}
if (!stream) {
RETURN_FALSE;
}
- php_getimagesize_from_stream(stream, input, info, INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ php_getimagesize_from_stream(stream, ZSTR_VAL(input), info, INTERNAL_FUNCTION_PARAM_PASSTHRU);
php_stream_close(stream);
}
/* }}} */
diff --git a/ext/standard/incomplete_class.c b/ext/standard/incomplete_class.c
index 0ca2443eb2..c59eb2d52c 100644
--- a/ext/standard/incomplete_class.c
+++ b/ext/standard/incomplete_class.c
@@ -108,14 +108,8 @@ static zend_object *php_create_incomplete_object(zend_class_entry *class_type)
return object;
}
-PHPAPI void php_register_incomplete_class(void)
+PHPAPI void php_register_incomplete_class_handlers(void)
{
- zend_class_entry incomplete_class;
-
- INIT_CLASS_ENTRY(incomplete_class, INCOMPLETE_CLASS, NULL);
-
- incomplete_class.create_object = php_create_incomplete_object;
-
memcpy(&php_incomplete_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
php_incomplete_object_handlers.read_property = incomplete_class_get_property;
php_incomplete_object_handlers.has_property = incomplete_class_has_property;
@@ -124,8 +118,7 @@ PHPAPI void php_register_incomplete_class(void)
php_incomplete_object_handlers.get_property_ptr_ptr = incomplete_class_get_property_ptr_ptr;
php_incomplete_object_handlers.get_method = incomplete_class_get_method;
- php_ce_incomplete_class = zend_register_internal_class(&incomplete_class);
- php_ce_incomplete_class->ce_flags |= ZEND_ACC_FINAL;
+ php_ce_incomplete_class->create_object = php_create_incomplete_object;
}
/* }}} */
diff --git a/ext/standard/info.c b/ext/standard/info.c
index 0e461117f0..cf2273e719 100644
--- a/ext/standard/info.c
+++ b/ext/standard/info.c
@@ -798,11 +798,11 @@ PHPAPI ZEND_COLD void php_print_info(int flag)
#ifdef PHP_BUILD_PROVIDER
php_info_print_table_row(2, "Build Provider", PHP_BUILD_PROVIDER);
#endif
-#ifdef COMPILER
- php_info_print_table_row(2, "Compiler", COMPILER);
+#ifdef PHP_BUILD_COMPILER
+ php_info_print_table_row(2, "Compiler", PHP_BUILD_COMPILER);
#endif
-#ifdef ARCHITECTURE
- php_info_print_table_row(2, "Architecture", ARCHITECTURE);
+#ifdef PHP_BUILD_ARCH
+ php_info_print_table_row(2, "Architecture", PHP_BUILD_ARCH);
#endif
#ifdef CONFIGURE_COMMAND
php_info_print_table_row(2, "Configure Command", CONFIGURE_COMMAND );
diff --git a/ext/standard/iptc.c b/ext/standard/iptc.c
index b4890238f8..8bdb04bf67 100644
--- a/ext/standard/iptc.c
+++ b/ext/standard/iptc.c
@@ -179,7 +179,7 @@ PHP_FUNCTION(iptcembed)
zend_string *spoolbuf = NULL;
unsigned char *poi = NULL;
zend_stat_t sb;
- zend_bool written = 0;
+ bool written = 0;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_STRING(iptcdata, iptcdata_len)
diff --git a/ext/standard/mail.c b/ext/standard/mail.c
index 3080a3957b..9301d22ab7 100644
--- a/ext/standard/mail.c
+++ b/ext/standard/mail.c
@@ -57,7 +57,7 @@
extern zend_long php_getuid(void);
-static zend_bool php_mail_build_headers_check_field_value(zval *val)
+static bool php_mail_build_headers_check_field_value(zval *val)
{
size_t len = 0;
zend_string *value = Z_STR_P(val);
@@ -83,7 +83,7 @@ static zend_bool php_mail_build_headers_check_field_value(zval *val)
}
-static zend_bool php_mail_build_headers_check_field_name(zend_string *key)
+static bool php_mail_build_headers_check_field_name(zend_string *key)
{
size_t len = 0;
@@ -371,7 +371,7 @@ void php_mail_log_to_syslog(char *message) {
void php_mail_log_to_file(char *filename, char *message, size_t message_size) {
/* Write 'message' to the given file. */
- uint32_t flags = IGNORE_URL_WIN | REPORT_ERRORS | STREAM_DISABLE_OPEN_BASEDIR;
+ uint32_t flags = REPORT_ERRORS | STREAM_DISABLE_OPEN_BASEDIR;
php_stream *stream = php_stream_open_wrapper(filename, "a", flags, NULL);
if (stream) {
php_stream_write(stream, message, message_size);
diff --git a/ext/standard/md5.c b/ext/standard/md5.c
index ec07ae2ed3..1452d57afb 100644
--- a/ext/standard/md5.c
+++ b/ext/standard/md5.c
@@ -42,7 +42,7 @@ PHPAPI void make_digest_ex(char *md5str, const unsigned char *digest, int len) /
PHP_FUNCTION(md5)
{
zend_string *arg;
- zend_bool raw_output = 0;
+ bool raw_output = 0;
PHP_MD5_CTX context;
unsigned char digest[16];
@@ -70,7 +70,7 @@ PHP_FUNCTION(md5_file)
{
char *arg;
size_t arg_len;
- zend_bool raw_output = 0;
+ bool raw_output = 0;
unsigned char buf[1024];
unsigned char digest[16];
PHP_MD5_CTX context;
@@ -290,7 +290,7 @@ static const void *body(PHP_MD5_CTX *ctx, const void *data, size_t size)
return ptr;
}
-PHPAPI void PHP_MD5Init(PHP_MD5_CTX *ctx)
+PHPAPI void PHP_MD5InitArgs(PHP_MD5_CTX *ctx, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
ctx->a = 0x67452301;
ctx->b = 0xefcdab89;
diff --git a/ext/standard/md5.h b/ext/standard/md5.h
index ac60d7fca4..09bcff1cf1 100644
--- a/ext/standard/md5.h
+++ b/ext/standard/md5.h
@@ -42,7 +42,8 @@ typedef struct {
} PHP_MD5_CTX;
#define PHP_MD5_SPEC "llllllb64l16."
-PHPAPI void PHP_MD5Init(PHP_MD5_CTX *ctx);
+#define PHP_MD5Init(ctx) PHP_MD5InitArgs(ctx, NULL)
+PHPAPI void PHP_MD5InitArgs(PHP_MD5_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args);
PHPAPI void PHP_MD5Update(PHP_MD5_CTX *ctx, const void *data, size_t size);
PHPAPI void PHP_MD5Final(unsigned char *result, PHP_MD5_CTX *ctx);
diff --git a/ext/standard/microtime.c b/ext/standard/microtime.c
index 1817da00bf..592e1fd4fb 100644
--- a/ext/standard/microtime.c
+++ b/ext/standard/microtime.c
@@ -45,7 +45,7 @@
#ifdef HAVE_GETTIMEOFDAY
static void _php_gettimeofday(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
- zend_bool get_as_float = 0;
+ bool get_as_float = 0;
struct timeval tp = {0};
ZEND_PARSE_PARAMETERS_START(0, 1)
diff --git a/ext/standard/mt_rand.c b/ext/standard/mt_rand.c
index 3c33a42df3..d49740d40e 100644
--- a/ext/standard/mt_rand.c
+++ b/ext/standard/mt_rand.c
@@ -24,6 +24,7 @@
#include "php.h"
#include "php_rand.h"
+#include "php_random.h"
#include "php_mt_rand.h"
/* MT RAND FUNCTIONS */
@@ -161,7 +162,11 @@ PHPAPI uint32_t php_mt_rand(void)
register uint32_t s1;
if (UNEXPECTED(!BG(mt_rand_is_seeded))) {
- php_mt_srand(GENERATE_SEED());
+ zend_long bytes;
+ if (php_random_bytes_silent(&bytes, sizeof(zend_long)) == FAILURE) {
+ bytes = GENERATE_SEED();
+ }
+ php_mt_srand(bytes);
}
if (BG(left) == 0) {
@@ -189,8 +194,11 @@ PHP_FUNCTION(mt_srand)
Z_PARAM_LONG(mode)
ZEND_PARSE_PARAMETERS_END();
- if (ZEND_NUM_ARGS() == 0)
- seed = GENERATE_SEED();
+ if (ZEND_NUM_ARGS() == 0) {
+ if (php_random_bytes_silent(&seed, sizeof(zend_long)) == FAILURE) {
+ seed = GENERATE_SEED();
+ }
+ }
switch (mode) {
case MT_RAND_PHP:
diff --git a/ext/standard/pack.c b/ext/standard/pack.c
index e14bbbcedb..b14eb64d29 100644
--- a/ext/standard/pack.c
+++ b/ext/standard/pack.c
@@ -84,7 +84,7 @@ static void php_pack(zval *val, size_t size, int *map, char *output)
size_t i;
char *v;
- convert_to_long_ex(val);
+ convert_to_long(val);
v = (char *) &Z_LVAL_P(val);
for (i = 0; i < size; i++) {
diff --git a/ext/standard/password.c b/ext/standard/password.c
index c108f8d71a..a14dc8dff4 100644
--- a/ext/standard/password.c
+++ b/ext/standard/password.c
@@ -117,7 +117,7 @@ static zend_string* php_password_get_salt(zval *unused_, size_t required_salt_le
/* bcrypt implementation */
-static zend_bool php_password_bcrypt_valid(const zend_string *hash) {
+static bool php_password_bcrypt_valid(const zend_string *hash) {
const char *h = ZSTR_VAL(hash);
return (ZSTR_LEN(hash) == 60) &&
(h[0] == '$') && (h[1] == '2') && (h[2] == 'y');
@@ -137,7 +137,7 @@ static int php_password_bcrypt_get_info(zval *return_value, const zend_string *h
return SUCCESS;
}
-static zend_bool php_password_bcrypt_needs_rehash(const zend_string *hash, zend_array *options) {
+static bool php_password_bcrypt_needs_rehash(const zend_string *hash, zend_array *options) {
zval *znew_cost;
zend_long old_cost = PHP_PASSWORD_BCRYPT_COST;
zend_long new_cost = PHP_PASSWORD_BCRYPT_COST;
@@ -155,7 +155,7 @@ static zend_bool php_password_bcrypt_needs_rehash(const zend_string *hash, zend_
return old_cost != new_cost;
}
-static zend_bool php_password_bcrypt_verify(const zend_string *password, const zend_string *hash) {
+static bool php_password_bcrypt_verify(const zend_string *password, const zend_string *hash) {
size_t i;
int status = 0;
zend_string *ret = php_crypt(ZSTR_VAL(password), (int)ZSTR_LEN(password), ZSTR_VAL(hash), (int)ZSTR_LEN(hash), 1);
@@ -276,7 +276,7 @@ static int php_password_argon2_get_info(zval *return_value, const zend_string *h
return SUCCESS;
}
-static zend_bool php_password_argon2_needs_rehash(const zend_string *hash, zend_array *options) {
+static bool php_password_argon2_needs_rehash(const zend_string *hash, zend_array *options) {
zend_long v = 0;
zend_long new_memory_cost = PHP_PASSWORD_ARGON2_MEMORY_COST, memory_cost = 0;
zend_long new_time_cost = PHP_PASSWORD_ARGON2_TIME_COST, time_cost = 0;
@@ -384,7 +384,7 @@ static zend_string *php_password_argon2_hash(const zend_string *password, zend_a
/* argon2i specific methods */
-static zend_bool php_password_argon2i_verify(const zend_string *password, const zend_string *hash) {
+static bool php_password_argon2i_verify(const zend_string *password, const zend_string *hash) {
return ARGON2_OK == argon2_verify(ZSTR_VAL(hash), ZSTR_VAL(password), ZSTR_LEN(password), Argon2_i);
}
@@ -403,7 +403,7 @@ const php_password_algo php_password_algo_argon2i = {
/* argon2id specific methods */
-static zend_bool php_password_argon2id_verify(const zend_string *password, const zend_string *hash) {
+static bool php_password_argon2id_verify(const zend_string *password, const zend_string *hash) {
return ARGON2_OK == argon2_verify(ZSTR_VAL(hash), ZSTR_VAL(password), ZSTR_LEN(password), Argon2_id);
}
@@ -487,7 +487,7 @@ const php_password_algo* php_password_algo_find(const zend_string *ident) {
return Z_PTR_P(tmp);
}
-static const php_password_algo* php_password_algo_find_zval(zend_string *arg_str, zend_long arg_long, zend_bool arg_is_null) {
+static const php_password_algo* php_password_algo_find_zval(zend_string *arg_str, zend_long arg_long, bool arg_is_null) {
if (arg_is_null) {
return php_password_algo_default();
}
@@ -598,7 +598,7 @@ PHP_FUNCTION(password_needs_rehash)
zend_string *hash;
zend_string *new_algo_str;
zend_long new_algo_long;
- zend_bool new_algo_is_null;
+ bool new_algo_is_null;
zend_array *options = 0;
ZEND_PARSE_PARAMETERS_START(2, 3)
@@ -646,7 +646,7 @@ PHP_FUNCTION(password_hash)
zend_string *password, *digest = NULL;
zend_string *algo_str;
zend_long algo_long;
- zend_bool algo_is_null;
+ bool algo_is_null;
const php_password_algo *algo;
zend_array *options = NULL;
diff --git a/ext/standard/php_array.h b/ext/standard/php_array.h
index a49e12488f..e1e43b5aaf 100644
--- a/ext/standard/php_array.h
+++ b/ext/standard/php_array.h
@@ -46,7 +46,7 @@ PHPAPI zend_long php_count_recursive(HashTable *ht);
ZEND_BEGIN_MODULE_GLOBALS(array)
bucket_compare_func_t *multisort_func;
- zend_bool compare_deprecation_thrown;
+ bool compare_deprecation_thrown;
ZEND_END_MODULE_GLOBALS(array)
#define ARRAYG(v) ZEND_MODULE_GLOBALS_ACCESSOR(array, v)
diff --git a/ext/standard/php_assert.h b/ext/standard/php_assert.h
index a0d81ed84e..596632d9a5 100644
--- a/ext/standard/php_assert.h
+++ b/ext/standard/php_assert.h
@@ -23,4 +23,6 @@ PHP_RINIT_FUNCTION(assert);
PHP_RSHUTDOWN_FUNCTION(assert);
PHP_MINFO_FUNCTION(assert);
+extern PHPAPI zend_class_entry *assertion_error_ce;
+
#endif /* PHP_ASSERT_H */
diff --git a/ext/standard/php_crypt.h b/ext/standard/php_crypt.h
index a7eabbdd66..572248655e 100644
--- a/ext/standard/php_crypt.h
+++ b/ext/standard/php_crypt.h
@@ -19,7 +19,7 @@
#ifndef PHP_CRYPT_H
#define PHP_CRYPT_H
-PHPAPI zend_string *php_crypt(const char *password, const int pass_len, const char *salt, int salt_len, zend_bool quiet);
+PHPAPI zend_string *php_crypt(const char *password, const int pass_len, const char *salt, int salt_len, bool quiet);
PHP_MINIT_FUNCTION(crypt);
PHP_MSHUTDOWN_FUNCTION(crypt);
PHP_RINIT_FUNCTION(crypt);
diff --git a/ext/standard/php_filestat.h b/ext/standard/php_filestat.h
index 13b79a4e07..ab4e32729d 100644
--- a/ext/standard/php_filestat.h
+++ b/ext/standard/php_filestat.h
@@ -40,8 +40,8 @@ PHP_RSHUTDOWN_FUNCTION(filestat);
/* Compatibility. */
typedef size_t php_stat_len;
-PHPAPI void php_clear_stat_cache(zend_bool clear_realpath_cache, const char *filename, size_t filename_len);
-PHPAPI void php_stat(const char *filename, size_t filename_length, int type, zval *return_value);
+PHPAPI void php_clear_stat_cache(bool clear_realpath_cache, const char *filename, size_t filename_len);
+PHPAPI void php_stat(zend_string *filename, int type, zval *return_value);
/* Switches for various filestat functions: */
#define FS_PERMS 0
diff --git a/ext/standard/php_http.h b/ext/standard/php_http.h
index 1df941ee00..3f764c18a6 100644
--- a/ext/standard/php_http.h
+++ b/ext/standard/php_http.h
@@ -25,6 +25,5 @@ PHPAPI void php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
const char *key_prefix, size_t key_prefix_len,
const char *key_suffix, size_t key_suffix_len,
zval *type, const char *arg_sep, int enc_type);
-#define php_url_encode_hash(ht, formstr) php_url_encode_hash_ex((ht), (formstr), NULL, 0, NULL, 0, NULL, 0, NULL)
#endif
diff --git a/ext/standard/php_incomplete_class.h b/ext/standard/php_incomplete_class.h
index f36fd43cfc..0464358d1b 100644
--- a/ext/standard/php_incomplete_class.h
+++ b/ext/standard/php_incomplete_class.h
@@ -40,7 +40,7 @@ extern PHPAPI zend_class_entry *php_ce_incomplete_class;
#define PHP_CLASS_ATTRIBUTES \
zend_string *class_name; \
- zend_bool incomplete_class ZEND_ATTRIBUTE_UNUSED = 0
+ bool incomplete_class ZEND_ATTRIBUTE_UNUSED = 0
#define INCOMPLETE_CLASS "__PHP_Incomplete_Class"
#define MAGIC_MEMBER "__PHP_Incomplete_Class_Name"
@@ -49,7 +49,7 @@ extern PHPAPI zend_class_entry *php_ce_incomplete_class;
extern "C" {
#endif
-PHPAPI void php_register_incomplete_class(void);
+PHPAPI void php_register_incomplete_class_handlers(void);
PHPAPI zend_string *php_lookup_class_name(zend_object *object);
PHPAPI void php_store_class_name(zval *object, zend_string *name);
diff --git a/ext/standard/php_password.h b/ext/standard/php_password.h
index 45a21c5c34..2f40e18a34 100644
--- a/ext/standard/php_password.h
+++ b/ext/standard/php_password.h
@@ -37,10 +37,10 @@ PHP_MSHUTDOWN_FUNCTION(password);
typedef struct _php_password_algo {
const char *name;
zend_string *(*hash)(const zend_string *password, zend_array *options);
- zend_bool (*verify)(const zend_string *password, const zend_string *hash);
- zend_bool (*needs_rehash)(const zend_string *password, zend_array *options);
+ bool (*verify)(const zend_string *password, const zend_string *hash);
+ bool (*needs_rehash)(const zend_string *password, zend_array *options);
int (*get_info)(zval *return_value, const zend_string *hash);
- zend_bool (*valid)(const zend_string *hash);
+ bool (*valid)(const zend_string *hash);
} php_password_algo;
extern const php_password_algo php_password_algo_bcrypt;
diff --git a/ext/standard/php_random.h b/ext/standard/php_random.h
index 290b37873d..0732e74031 100644
--- a/ext/standard/php_random.h
+++ b/ext/standard/php_random.h
@@ -34,8 +34,8 @@ typedef struct {
#define php_random_int_silent(min, max, result) \
php_random_int((min), (max), (result), 0)
-PHPAPI int php_random_bytes(void *bytes, size_t size, zend_bool should_throw);
-PHPAPI int php_random_int(zend_long min, zend_long max, zend_long *result, zend_bool should_throw);
+PHPAPI int php_random_bytes(void *bytes, size_t size, bool should_throw);
+PHPAPI int php_random_int(zend_long min, zend_long max, zend_long *result, bool should_throw);
#ifdef ZTS
# define RANDOM_G(v) ZEND_TSRMG(random_globals_id, php_random_globals *, v)
diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h
index 43e50dffc1..fa1ebe4411 100644
--- a/ext/standard/php_string.h
+++ b/ext/standard/php_string.h
@@ -52,14 +52,14 @@ PHPAPI zend_string *php_str_to_str(const char *haystack, size_t length, const ch
size_t needle_len, const char *str, size_t str_len);
PHPAPI zend_string *php_trim(zend_string *str, const char *what, size_t what_len, int mode);
PHPAPI size_t php_strip_tags(char *rbuf, size_t len, const char *allow, size_t allow_len);
-PHPAPI size_t php_strip_tags_ex(char *rbuf, size_t len, const char *allow, size_t allow_len, zend_bool allow_tag_spaces);
+PHPAPI size_t php_strip_tags_ex(char *rbuf, size_t len, const char *allow, size_t allow_len, bool allow_tag_spaces);
PHPAPI void php_implode(const zend_string *delim, HashTable *arr, zval *return_value);
PHPAPI void php_explode(const zend_string *delim, zend_string *str, zval *return_value, zend_long limit);
PHPAPI size_t php_strspn(const char *s1, const char *s2, const char *s1_end, const char *s2_end);
PHPAPI size_t php_strcspn(const char *s1, const char *s2, const char *s1_end, const char *s2_end);
-PHPAPI int string_natural_compare_function_ex(zval *result, zval *op1, zval *op2, zend_bool case_insensitive);
+PHPAPI int string_natural_compare_function_ex(zval *result, zval *op1, zval *op2, bool case_insensitive);
PHPAPI int string_natural_compare_function(zval *result, zval *op1, zval *op2);
PHPAPI int string_natural_case_compare_function(zval *result, zval *op1, zval *op2);
diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c
index 03b55c3eac..bcf4a3a35d 100644
--- a/ext/standard/proc_open.c
+++ b/ext/standard/proc_open.c
@@ -520,7 +520,7 @@ static char *create_win_command_from_args(HashTable *args)
{
smart_string str = {0};
zval *arg_zv;
- zend_bool is_prog_name = 1;
+ bool is_prog_name = 1;
int elem_num = 0;
ZEND_HASH_FOREACH_VAL(args, arg_zv) {
diff --git a/ext/standard/random.c b/ext/standard/random.c
index 526347f565..8ab637af7d 100644
--- a/ext/standard/random.c
+++ b/ext/standard/random.c
@@ -84,7 +84,7 @@ PHP_MSHUTDOWN_FUNCTION(random)
/* }}} */
/* {{{ php_random_bytes */
-PHPAPI int php_random_bytes(void *bytes, size_t size, zend_bool should_throw)
+PHPAPI int php_random_bytes(void *bytes, size_t size, bool should_throw)
{
#ifdef PHP_WIN32
/* Defer to CryptGenRandom on Windows */
@@ -222,7 +222,7 @@ PHP_FUNCTION(random_bytes)
/* }}} */
/* {{{ */
-PHPAPI int php_random_int(zend_long min, zend_long max, zend_long *result, zend_bool should_throw)
+PHPAPI int php_random_int(zend_long min, zend_long max, zend_long *result, bool should_throw)
{
zend_ulong umax;
zend_ulong trial;
diff --git a/ext/standard/sha1.c b/ext/standard/sha1.c
index 58bd91385c..810871212c 100644
--- a/ext/standard/sha1.c
+++ b/ext/standard/sha1.c
@@ -30,7 +30,7 @@ PHPAPI void make_sha1_digest(char *sha1str, const unsigned char *digest)
PHP_FUNCTION(sha1)
{
zend_string *arg;
- zend_bool raw_output = 0;
+ bool raw_output = 0;
PHP_SHA1_CTX context;
unsigned char digest[20];
@@ -60,7 +60,7 @@ PHP_FUNCTION(sha1_file)
{
char *arg;
size_t arg_len;
- zend_bool raw_output = 0;
+ bool raw_output = 0;
unsigned char buf[1024];
unsigned char digest[20];
PHP_SHA1_CTX context;
@@ -152,7 +152,7 @@ static const unsigned char PADDING[64] =
/* {{{ PHP_SHA1Init
* SHA1 initialization. Begins an SHA1 operation, writing a new context.
*/
-PHPAPI void PHP_SHA1Init(PHP_SHA1_CTX * context)
+PHPAPI void PHP_SHA1InitArgs(PHP_SHA1_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants.
diff --git a/ext/standard/sha1.h b/ext/standard/sha1.h
index ef98ecc29c..3ae3ec219e 100644
--- a/ext/standard/sha1.h
+++ b/ext/standard/sha1.h
@@ -27,7 +27,8 @@ typedef struct {
} PHP_SHA1_CTX;
#define PHP_SHA1_SPEC "l5l2b64."
-PHPAPI void PHP_SHA1Init(PHP_SHA1_CTX *);
+#define PHP_SHA1Init(ctx) PHP_SHA1InitArgs(ctx, NULL)
+PHPAPI void PHP_SHA1InitArgs(PHP_SHA1_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *);
PHPAPI void PHP_SHA1Update(PHP_SHA1_CTX *, const unsigned char *, size_t);
PHPAPI void PHP_SHA1Final(unsigned char[20], PHP_SHA1_CTX *);
PHPAPI void make_sha1_digest(char *sha1str, const unsigned char *digest);
diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c
index fb4911bcbe..128004bfc2 100644
--- a/ext/standard/streamsfuncs.c
+++ b/ext/standard/streamsfuncs.c
@@ -89,7 +89,7 @@ PHP_FUNCTION(stream_socket_client)
zend_string *host;
zval *zerrno = NULL, *zerrstr = NULL, *zcontext = NULL;
double timeout;
- zend_bool timeout_is_null = 1;
+ bool timeout_is_null = 1;
php_timeout_ull conv;
struct timeval tv;
char *hashkey = NULL;
@@ -244,7 +244,7 @@ PHP_FUNCTION(stream_socket_server)
PHP_FUNCTION(stream_socket_accept)
{
double timeout;
- zend_bool timeout_is_null = 1;
+ bool timeout_is_null = 1;
zval *zpeername = NULL;
zend_string *peername = NULL;
php_timeout_ull conv;
@@ -305,7 +305,7 @@ PHP_FUNCTION(stream_socket_get_name)
{
php_stream *stream;
zval *zstream;
- zend_bool want_peer;
+ bool want_peer;
zend_string *name = NULL;
ZEND_PARSE_PARAMETERS_START(2, 2)
@@ -419,7 +419,7 @@ PHP_FUNCTION(stream_get_contents)
php_stream *stream;
zval *zsrc;
zend_long maxlen, desiredpos = -1L;
- zend_bool maxlen_is_null = 1;
+ bool maxlen_is_null = 1;
zend_string *contents;
ZEND_PARSE_PARAMETERS_START(1, 3)
@@ -472,7 +472,7 @@ PHP_FUNCTION(stream_copy_to_stream)
php_stream *src, *dest;
zval *zsrc, *zdest;
zend_long maxlen, pos = 0;
- zend_bool maxlen_is_null = 1;
+ bool maxlen_is_null = 1;
size_t len;
int ret;
@@ -744,7 +744,7 @@ PHP_FUNCTION(stream_select)
php_socket_t max_fd = 0;
int retval, sets = 0;
zend_long sec, usec = 0;
- zend_bool secnull;
+ bool secnull;
int set_count, max_set_count = 0;
ZEND_PARSE_PARAMETERS_START(4, 5)
@@ -1309,7 +1309,7 @@ PHP_FUNCTION(stream_get_line)
PHP_FUNCTION(stream_set_blocking)
{
zval *zstream;
- zend_bool block;
+ bool block;
php_stream *stream;
ZEND_PARSE_PARAMETERS_START(2, 2)
@@ -1474,7 +1474,7 @@ PHP_FUNCTION(stream_socket_enable_crypto)
zend_long cryptokind = 0;
zval *zstream, *zsessstream = NULL;
php_stream *stream, *sessstream = NULL;
- zend_bool enable, cryptokindnull = 1;
+ bool enable, cryptokindnull = 1;
int ret;
ZEND_PARSE_PARAMETERS_START(2, 4)
@@ -1525,15 +1525,14 @@ PHP_FUNCTION(stream_socket_enable_crypto)
/* {{{ Determine what file will be opened by calls to fopen() with a relative path */
PHP_FUNCTION(stream_resolve_include_path)
{
- char *filename;
- size_t filename_len;
+ zend_string *filename;
zend_string *resolved_path;
ZEND_PARSE_PARAMETERS_START(1, 1)
- Z_PARAM_PATH(filename, filename_len)
+ Z_PARAM_PATH_STR(filename)
ZEND_PARSE_PARAMETERS_END();
- resolved_path = zend_resolve_path(filename, filename_len);
+ resolved_path = zend_resolve_path(filename);
if (resolved_path) {
RETURN_STR(resolved_path);
@@ -1637,7 +1636,7 @@ PHP_FUNCTION(sapi_windows_vt100_support)
{
zval *zsrc;
php_stream *stream;
- zend_bool enable, enable_is_null = 1;
+ bool enable, enable_is_null = 1;
zend_long fileno;
ZEND_PARSE_PARAMETERS_START(1, 2)
diff --git a/ext/standard/string.c b/ext/standard/string.c
index cf77435f80..e09780a307 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -248,7 +248,7 @@ static void php_spn_common_handler(INTERNAL_FUNCTION_PARAMETERS, int behavior) /
{
zend_string *s11, *s22;
zend_long start = 0, len = 0;
- zend_bool len_is_null = 1;
+ bool len_is_null = 1;
ZEND_PARSE_PARAMETERS_START(2, 4)
Z_PARAM_STR(s11)
@@ -886,7 +886,7 @@ PHP_FUNCTION(wordwrap)
size_t alloced;
zend_long current = 0, laststart = 0, lastspace = 0;
zend_long linelength = 75;
- zend_bool docut = 0;
+ bool docut = 0;
zend_string *newtext;
ZEND_PARSE_PARAMETERS_START(1, 4)
@@ -1151,14 +1151,14 @@ PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return
RETURN_EMPTY_STRING();
} else if (numelems == 1) {
/* loop to search the first not undefined element... */
- ZEND_HASH_FOREACH_VAL_IND(pieces, tmp) {
+ ZEND_HASH_FOREACH_VAL(pieces, tmp) {
RETURN_STR(zval_get_string(tmp));
} ZEND_HASH_FOREACH_END();
}
ptr = strings = do_alloca((sizeof(*strings)) * numelems, use_heap);
- ZEND_HASH_FOREACH_VAL_IND(pieces, tmp) {
+ ZEND_HASH_FOREACH_VAL(pieces, tmp) {
if (EXPECTED(Z_TYPE_P(tmp) == IS_STRING)) {
ptr->str = Z_STR_P(tmp);
len += ZSTR_LEN(ptr->str);
@@ -1462,69 +1462,130 @@ PHP_FUNCTION(strtolower)
}
/* }}} */
+#if defined(PHP_WIN32)
+static bool _is_basename_start(const char *start, const char *pos)
+{
+ if (pos - start >= 1
+ && *(pos-1) != '/'
+ && *(pos-1) != '\\') {
+ if (pos - start == 1) {
+ return 1;
+ } else if (*(pos-2) == '/' || *(pos-2) == '\\') {
+ return 1;
+ } else if (*(pos-2) == ':'
+ && _is_basename_start(start, pos - 2)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+#endif
+
/* {{{ php_basename */
PHPAPI zend_string *php_basename(const char *s, size_t len, const char *suffix, size_t suffix_len)
{
- /* State 0 is directly after a directory separator (or at the start of the string).
- * State 1 is everything else. */
- int state = 0;
- const char *basename_start = s;
- const char *basename_end = s;
- while (len > 0) {
- int inc_len = (*s == '\0' ? 1 : php_mblen(s, len));
+ const char *basename_start;
+ const char *basename_end;
- switch (inc_len) {
- case 0:
- goto quit_loop;
- case 1:
+ if (CG(ascii_compatible_locale)) {
+ basename_end = s + len - 1;
+
+ /* Strip trailing slashes */
+ while (basename_end >= s
#if defined(PHP_WIN32)
- if (*s == '/' || *s == '\\') {
+ && (*basename_end == '/'
+ || *basename_end == '\\'
+ || (*basename_end == ':'
+ && _is_basename_start(s, basename_end)))) {
#else
- if (*s == '/') {
+ && *basename_end == '/') {
#endif
- if (state == 1) {
- state = 0;
- basename_end = s;
- }
+ basename_end--;
+ }
+ if (basename_end < s) {
+ return ZSTR_EMPTY_ALLOC();
+ }
+
+ /* Extract filename */
+ basename_start = basename_end;
+ basename_end++;
+ while (basename_start > s
#if defined(PHP_WIN32)
- /* Catch relative paths in c:file.txt style. They're not to confuse
- with the NTFS streams. This part ensures also, that no drive
- letter traversing happens. */
- } else if ((*s == ':' && (s - basename_start == 1))) {
- if (state == 0) {
- basename_start = s;
- state = 1;
+ && *(basename_start-1) != '/'
+ && *(basename_start-1) != '\\') {
+
+ if (*(basename_start-1) == ':' &&
+ _is_basename_start(s, basename_start - 1)) {
+ break;
+ }
+#else
+ && *(basename_start-1) != '/') {
+#endif
+ basename_start--;
+ }
+ } else {
+ /* State 0 is directly after a directory separator (or at the start of the string).
+ * State 1 is everything else. */
+ int state = 0;
+
+ basename_start = s;
+ basename_end = s;
+ while (len > 0) {
+ int inc_len = (*s == '\0' ? 1 : php_mblen(s, len));
+
+ switch (inc_len) {
+ case 0:
+ goto quit_loop;
+ case 1:
+#if defined(PHP_WIN32)
+ if (*s == '/' || *s == '\\') {
+#else
+ if (*s == '/') {
+#endif
+ if (state == 1) {
+ state = 0;
+ basename_end = s;
+ }
+#if defined(PHP_WIN32)
+ /* Catch relative paths in c:file.txt style. They're not to confuse
+ with the NTFS streams. This part ensures also, that no drive
+ letter traversing happens. */
+ } else if ((*s == ':' && (s - basename_start == 1))) {
+ if (state == 0) {
+ basename_start = s;
+ state = 1;
+ } else {
+ basename_end = s;
+ state = 0;
+ }
+#endif
} else {
- basename_end = s;
- state = 0;
+ if (state == 0) {
+ basename_start = s;
+ state = 1;
+ }
+ }
+ break;
+ default:
+ if (inc_len < 0) {
+ /* If character is invalid, treat it like other non-significant characters. */
+ inc_len = 1;
+ php_mb_reset();
}
-#endif
- } else {
if (state == 0) {
basename_start = s;
state = 1;
}
- }
- break;
- default:
- if (inc_len < 0) {
- /* If character is invalid, treat it like other non-significant characters. */
- inc_len = 1;
- php_mb_reset();
- }
- if (state == 0) {
- basename_start = s;
- state = 1;
- }
- break;
+ break;
+ }
+ s += inc_len;
+ len -= inc_len;
}
- s += inc_len;
- len -= inc_len;
- }
quit_loop:
- if (state == 1) {
- basename_end = s;
+ if (state == 1) {
+ basename_end = s;
+ }
}
if (suffix != NULL && suffix_len < (size_t)(basename_end - basename_start) &&
@@ -1739,7 +1800,7 @@ PHP_FUNCTION(stristr)
size_t found_offset;
char *haystack_dup;
char *orig_needle;
- zend_bool part = 0;
+ bool part = 0;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_STR(haystack)
@@ -1774,7 +1835,7 @@ PHP_FUNCTION(strstr)
zend_string *haystack, *needle;
const char *found = NULL;
zend_long found_offset;
- zend_bool part = 0;
+ bool part = 0;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_STR(haystack)
@@ -2164,7 +2225,7 @@ PHP_FUNCTION(substr)
{
zend_string *str;
zend_long l = 0, f;
- zend_bool len_is_null = 1;
+ bool len_is_null = 1;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_STR(str)
@@ -2220,7 +2281,7 @@ PHP_FUNCTION(substr_replace)
zend_long from_long;
HashTable *len_ht = NULL;
zend_long len_long;
- zend_bool len_is_null = 1;
+ bool len_is_null = 1;
zend_long l = 0;
zend_long f;
zend_string *result;
@@ -2329,7 +2390,7 @@ PHP_FUNCTION(substr_replace)
from_idx = len_idx = repl_idx = 0;
- ZEND_HASH_FOREACH_KEY_VAL_IND(str_ht, num_index, str_index, tmp_str) {
+ ZEND_HASH_FOREACH_KEY_VAL(str_ht, num_index, str_index, tmp_str) {
zend_string *tmp_orig_str;
zend_string *orig_str = zval_get_tmp_string(tmp_str, &tmp_orig_str);
@@ -2647,16 +2708,16 @@ PHPAPI char *php_strtr(char *str, size_t len, const char *str_from, const char *
}
}
} else {
- unsigned char xlat[256], j = 0;
+ unsigned char xlat[256];
- do { xlat[j] = j; } while (++j != 0);
+ memset(xlat, 0, sizeof(xlat));
for (i = 0; i < trlen; i++) {
- xlat[(size_t)(unsigned char) str_from[i]] = str_to[i];
+ xlat[(size_t)(unsigned char) str_from[i]] = str_to[i] - str_from[i];
}
for (i = 0; i < len; i++) {
- str[i] = xlat[(size_t)(unsigned char) str[i]];
+ str[i] += xlat[(size_t)(unsigned char) str[i]];
}
}
@@ -2681,41 +2742,38 @@ static zend_string *php_strtr_ex(zend_string *str, const char *str_from, const c
new_str = zend_string_alloc(ZSTR_LEN(str), 0);
memcpy(ZSTR_VAL(new_str), ZSTR_VAL(str), i);
ZSTR_VAL(new_str)[i] = ch_to;
- break;
+ i++;
+ for (; i < ZSTR_LEN(str); i++) {
+ ZSTR_VAL(new_str)[i] = (ZSTR_VAL(str)[i] != ch_from) ? ZSTR_VAL(str)[i] : ch_to;
+ }
+ ZSTR_VAL(new_str)[i] = 0;
+ return new_str;
}
}
- for (; i < ZSTR_LEN(str); i++) {
- ZSTR_VAL(new_str)[i] = (ZSTR_VAL(str)[i] != ch_from) ? ZSTR_VAL(str)[i] : ch_to;
- }
} else {
- unsigned char xlat[256], j = 0;
+ unsigned char xlat[256];
- do { xlat[j] = j; } while (++j != 0);
+ memset(xlat, 0, sizeof(xlat));;
for (i = 0; i < trlen; i++) {
- xlat[(size_t)(unsigned char) str_from[i]] = str_to[i];
+ xlat[(size_t)(unsigned char) str_from[i]] = str_to[i] - str_from[i];
}
for (i = 0; i < ZSTR_LEN(str); i++) {
- if (ZSTR_VAL(str)[i] != xlat[(size_t)(unsigned char) ZSTR_VAL(str)[i]]) {
+ if (xlat[(size_t)(unsigned char) ZSTR_VAL(str)[i]]) {
new_str = zend_string_alloc(ZSTR_LEN(str), 0);
memcpy(ZSTR_VAL(new_str), ZSTR_VAL(str), i);
- ZSTR_VAL(new_str)[i] = xlat[(size_t)(unsigned char) ZSTR_VAL(str)[i]];
- break;
+ do {
+ ZSTR_VAL(new_str)[i] = ZSTR_VAL(str)[i] + xlat[(size_t)(unsigned char) ZSTR_VAL(str)[i]];
+ i++;
+ } while (i < ZSTR_LEN(str));
+ ZSTR_VAL(new_str)[i] = 0;
+ return new_str;
}
}
-
- for (;i < ZSTR_LEN(str); i++) {
- ZSTR_VAL(new_str)[i] = xlat[(size_t)(unsigned char) ZSTR_VAL(str)[i]];
- }
}
- if (!new_str) {
- return zend_string_copy(str);
- }
-
- ZSTR_VAL(new_str)[ZSTR_LEN(new_str)] = 0;
- return new_str;
+ return zend_string_copy(str);
}
/* }}} */
@@ -2770,7 +2828,7 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p
zend_string *key_used;
/* we have to rebuild HashTable with numeric keys */
zend_hash_init(&str_hash, zend_hash_num_elements(pats), NULL, NULL, 0);
- ZEND_HASH_FOREACH_KEY_VAL_IND(pats, num_key, str_key, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(pats, num_key, str_key, entry) {
if (UNEXPECTED(!str_key)) {
key_used = zend_long_to_str(num_key);
len = ZSTR_LEN(key_used);
@@ -3203,7 +3261,7 @@ PHP_FUNCTION(strtr)
zend_string *str_key, *tmp_str, *replace, *tmp_replace;
zval *entry;
- ZEND_HASH_FOREACH_KEY_VAL_IND(from_ht, num_key, str_key, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(from_ht, num_key, str_key, entry) {
tmp_str = NULL;
if (UNEXPECTED(!str_key)) {
str_key = tmp_str = zend_long_to_str(num_key);
@@ -4083,7 +4141,7 @@ static zend_long php_str_replace_in_subject(
}
/* For each entry in the search array, get the entry */
- ZEND_HASH_FOREACH_VAL_IND(search_ht, search_entry) {
+ ZEND_HASH_FOREACH_VAL(search_ht, search_entry) {
/* Make sure we're dealing with strings. */
zend_string *tmp_search_str;
zend_string *search_str = zval_get_tmp_string(search_entry, &tmp_search_str);
@@ -4241,7 +4299,7 @@ static void php_str_replace_common(INTERNAL_FUNCTION_PARAMETERS, int case_sensit
/* For each subject entry, convert it to string, then perform replacement
and add the result to the return_value array. */
- ZEND_HASH_FOREACH_KEY_VAL_IND(subject_ht, num_key, string_key, subject_entry) {
+ ZEND_HASH_FOREACH_KEY_VAL(subject_ht, num_key, string_key, subject_entry) {
zend_string *tmp_subject_str;
ZVAL_DEREF(subject_entry);
subject_str = zval_get_tmp_string(subject_entry, &tmp_subject_str);
@@ -4451,7 +4509,7 @@ PHP_FUNCTION(nl2br)
zend_string *str;
char *target;
size_t repl_cnt = 0;
- zend_bool is_xhtml = 1;
+ bool is_xhtml = 1;
zend_string *result;
ZEND_PARSE_PARAMETERS_START(1, 2)
@@ -4573,7 +4631,7 @@ PHP_FUNCTION(strip_tags)
static zend_string *try_setlocale_str(zend_long cat, zend_string *loc) {
const char *retval;
- if (!strcmp("0", ZSTR_VAL(loc))) {
+ if (zend_string_equals_literal(loc, "0")) {
loc = NULL;
} else {
if (ZSTR_LEN(loc) >= 255) {
@@ -4604,7 +4662,6 @@ static zend_string *try_setlocale_str(zend_long cat, zend_string *loc) {
retval = setlocale(cat, NULL);
}
# endif
- zend_update_current_locale();
if (!retval) {
return NULL;
}
@@ -4615,6 +4672,7 @@ static zend_string *try_setlocale_str(zend_long cat, zend_string *loc) {
BG(locale_changed) = 1;
if (cat == LC_CTYPE || cat == LC_ALL) {
+ zend_update_current_locale();
if (BG(ctype_string)) {
zend_string_release_ex(BG(ctype_string), 0);
}
@@ -4658,7 +4716,7 @@ PHP_FUNCTION(setlocale)
for (uint32_t i = 0; i < num_args; i++) {
if (Z_TYPE(args[i]) == IS_ARRAY) {
zval *elem;
- ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(args[i]), elem) {
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL(args[i]), elem) {
zend_string *result = try_setlocale_zval(cat, elem);
if (EG(exception)) {
RETURN_THROWS();
@@ -4798,7 +4856,7 @@ PHPAPI size_t php_strip_tags(char *rbuf, size_t len, const char *allow, size_t a
swm: Added ability to strip <?xml tags without assuming it PHP
code.
*/
-PHPAPI size_t php_strip_tags_ex(char *rbuf, size_t len, const char *allow, size_t allow_len, zend_bool allow_tag_spaces)
+PHPAPI size_t php_strip_tags_ex(char *rbuf, size_t len, const char *allow, size_t allow_len, bool allow_tag_spaces)
{
char *tbuf, *tp, *rp, c, lc;
const char *buf, *p, *end;
@@ -5286,7 +5344,7 @@ static void php_strnatcmp(INTERNAL_FUNCTION_PARAMETERS, int fold_case)
}
/* }}} */
-PHPAPI int string_natural_compare_function_ex(zval *result, zval *op1, zval *op2, zend_bool case_insensitive) /* {{{ */
+PHPAPI int string_natural_compare_function_ex(zval *result, zval *op1, zval *op2, bool case_insensitive) /* {{{ */
{
zend_string *tmp_str1, *tmp_str2;
zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
@@ -5385,7 +5443,7 @@ PHP_FUNCTION(substr_count)
{
char *haystack, *needle;
zend_long offset = 0, length = 0;
- zend_bool length_is_null = 1;
+ bool length_is_null = 1;
zend_long count = 0;
size_t haystack_len, needle_len;
const char *p, *endp;
@@ -5859,8 +5917,8 @@ PHP_FUNCTION(substr_compare)
{
zend_string *s1, *s2;
zend_long offset, len=0;
- zend_bool len_is_default=1;
- zend_bool cs=0;
+ bool len_is_default=1;
+ bool cs=0;
size_t cmp_len;
ZEND_PARSE_PARAMETERS_START(3, 5)
diff --git a/ext/standard/strnatcmp.c b/ext/standard/strnatcmp.c
index 3cdba2adf2..8171b802e9 100644
--- a/ext/standard/strnatcmp.c
+++ b/ext/standard/strnatcmp.c
@@ -92,7 +92,6 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len
char const *aend = a + a_len,
*bend = b + b_len;
int fractional, result;
- short leading = 1;
if (a_len == 0 || b_len == 0) {
return (a_len == b_len ? 0 : (a_len > b_len ? 1 : -1));
@@ -100,19 +99,19 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len
ap = a;
bp = b;
- while (1) {
- ca = *ap; cb = *bp;
- /* skip over leading zeros */
- while (leading && ca == '0' && (ap+1 < aend) && isdigit((int)(unsigned char)*(ap+1))) {
- ca = *++ap;
- }
+ ca = *ap; cb = *bp;
- while (leading && cb == '0' && (bp+1 < bend) && isdigit((int)(unsigned char)*(bp+1))) {
- cb = *++bp;
- }
+ /* skip over leading zeros */
+ while (ca == '0' && (ap+1 < aend) && isdigit((int)(unsigned char)*(ap+1))) {
+ ca = *++ap;
+ }
+
+ while (cb == '0' && (bp+1 < bend) && isdigit((int)(unsigned char)*(bp+1))) {
+ cb = *++bp;
+ }
- leading = 0;
+ while (1) {
/* Skip consecutive whitespace */
while (isspace((int)(unsigned char)ca)) {
@@ -166,6 +165,8 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len
return -1;
else if (bp >= bend)
return 1;
+
+ ca = *ap; cb = *bp;
}
}
/* }}} */
diff --git a/ext/standard/tests/array/005.phpt b/ext/standard/tests/array/005.phpt
index 29deed8a12..40e9eac265 100644
--- a/ext/standard/tests/array/005.phpt
+++ b/ext/standard/tests/array/005.phpt
@@ -2,7 +2,6 @@
Test array_shift() function
--FILE--
<?php
-array_shift($GLOBALS);
$empty_array = array();
$number = 5;
@@ -18,12 +17,12 @@ $mixed_array = array(
array( "a" => "aaa", "A" => "AAA", "c" => "ccc", "d" => "ddd", "e" => "eee" ),
array( "1" => "one", "2" => "two", "3" => "three", "4" => "four", "5" => "five" ),
array( 1 => "one", 2 => "two", 3 => 7, 4 => "four", 5 => "five" ),
- array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2.4 => "float", "F" => "FFF",
- "blank" => "", 3.7 => 3.7, 5.4 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
+ array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2 => "float", "F" => "FFF",
+ "blank" => "", 3 => 3.7, 5 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
array( 12, "name", 'age', '45' ),
array( array("oNe", "tWo", 4), array(10, 20, 30, 40, 50), array() ),
array( "one" => 1, "one" => 2, "three" => 3, 3, 4, 3 => 33, 4 => 44, 5, 6,
- 5.4 => 54, 5.7 => 57, "5.4" => 554, "5.7" => 557 )
+ 5 => 57, "5.4" => 554, "5.7" => 557 )
);
/* Testing Error Conditions */
@@ -37,8 +36,8 @@ echo "\n*** Testing with various array inputs ***\n";
$counter = 1;
foreach( $mixed_array as $sub_array ) {
- echo "\n-- Input Array for Iteration $counter is -- \n";
- print_r( $sub_array );
+ echo "\n-- Input Array for Iteration $counter is --\n";
+ var_dump( $sub_array );
echo "\nOutput after shift is :\n";
var_dump( array_shift($sub_array) );
$counter++;
@@ -48,19 +47,19 @@ foreach( $mixed_array as $sub_array ) {
echo"\n*** Checking for internal array pointer being reset when shift is called ***\n";
-echo "\nCurrent Element is : ";
+echo "\nCurrent Element is :";
var_dump( current($mixed_array[1]) );
-echo "\nNext Element is : ";
+echo "\nNext Element is :";
var_dump( next($mixed_array[1]) );
-echo "\nNext Element is : ";
+echo "\nNext Element is :";
var_dump( next($mixed_array[1]) );
-echo "\nshifted Element is : ";
+echo "\nshifted Element is :";
var_dump( array_shift($mixed_array[1]) );
-echo "\nCurrent Element after shift operation is: ";
+echo "\nCurrent Element after shift operation is:";
var_dump( current($mixed_array[1]) );
echo"Done";
@@ -71,155 +70,203 @@ NULL
*** Testing with various array inputs ***
--- Input Array for Iteration 1 is --
-Array
-(
-)
+-- Input Array for Iteration 1 is --
+array(0) {
+}
Output after shift is :
NULL
--- Input Array for Iteration 2 is --
-Array
-(
- [0] => 1
- [1] => 2
- [2] => 3
- [3] => 4
- [4] => 5
- [5] => 6
- [6] => 7
- [7] => 8
- [8] => 9
-)
+-- Input Array for Iteration 2 is --
+array(9) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+ [3]=>
+ int(4)
+ [4]=>
+ int(5)
+ [5]=>
+ int(6)
+ [6]=>
+ int(7)
+ [7]=>
+ int(8)
+ [8]=>
+ int(9)
+}
Output after shift is :
int(1)
--- Input Array for Iteration 3 is --
-Array
-(
- [0] => One
- [1] => _Two
- [2] => Three
- [3] => Four
- [4] => Five
-)
+-- Input Array for Iteration 3 is --
+array(5) {
+ [0]=>
+ string(3) "One"
+ [1]=>
+ string(4) "_Two"
+ [2]=>
+ string(5) "Three"
+ [3]=>
+ string(4) "Four"
+ [4]=>
+ string(4) "Five"
+}
Output after shift is :
string(3) "One"
--- Input Array for Iteration 4 is --
-Array
-(
- [0] => 6
- [1] => six
- [2] => 7
- [3] => seven
- [4] => 8
- [5] => eight
- [6] => 9
- [7] => nine
-)
+-- Input Array for Iteration 4 is --
+array(8) {
+ [0]=>
+ int(6)
+ [1]=>
+ string(3) "six"
+ [2]=>
+ int(7)
+ [3]=>
+ string(5) "seven"
+ [4]=>
+ int(8)
+ [5]=>
+ string(5) "eight"
+ [6]=>
+ int(9)
+ [7]=>
+ string(4) "nine"
+}
Output after shift is :
int(6)
--- Input Array for Iteration 5 is --
-Array
-(
- [a] => aaa
- [A] => AAA
- [c] => ccc
- [d] => ddd
- [e] => eee
-)
+-- Input Array for Iteration 5 is --
+array(5) {
+ ["a"]=>
+ string(3) "aaa"
+ ["A"]=>
+ string(3) "AAA"
+ ["c"]=>
+ string(3) "ccc"
+ ["d"]=>
+ string(3) "ddd"
+ ["e"]=>
+ string(3) "eee"
+}
Output after shift is :
string(3) "aaa"
--- Input Array for Iteration 6 is --
-Array
-(
- [1] => one
- [2] => two
- [3] => three
- [4] => four
- [5] => five
-)
+-- Input Array for Iteration 6 is --
+array(5) {
+ [1]=>
+ string(3) "one"
+ [2]=>
+ string(3) "two"
+ [3]=>
+ string(5) "three"
+ [4]=>
+ string(4) "four"
+ [5]=>
+ string(4) "five"
+}
Output after shift is :
string(3) "one"
--- Input Array for Iteration 7 is --
-Array
-(
- [1] => one
- [2] => two
- [3] => 7
- [4] => four
- [5] => five
-)
+-- Input Array for Iteration 7 is --
+array(5) {
+ [1]=>
+ string(3) "one"
+ [2]=>
+ string(3) "two"
+ [3]=>
+ int(7)
+ [4]=>
+ string(4) "four"
+ [5]=>
+ string(4) "five"
+}
Output after shift is :
string(3) "one"
--- Input Array for Iteration 8 is --
-Array
-(
- [f] => fff
- [1] => one
- [4] => 6
- [] => 3
- [2] => float
- [F] => FFF
- [blank] =>
- [3] => 3.7
- [5] => Five
- [6] => 8.6
- [4name] => jonny
- [a] =>
-)
+-- Input Array for Iteration 8 is --
+array(12) {
+ ["f"]=>
+ string(3) "fff"
+ [1]=>
+ string(3) "one"
+ [4]=>
+ int(6)
+ [""]=>
+ int(3)
+ [2]=>
+ string(5) "float"
+ ["F"]=>
+ string(3) "FFF"
+ ["blank"]=>
+ string(0) ""
+ [3]=>
+ float(3.7)
+ [5]=>
+ string(4) "Five"
+ [6]=>
+ float(8.6)
+ ["4name"]=>
+ string(5) "jonny"
+ ["a"]=>
+ NULL
+}
Output after shift is :
string(3) "fff"
--- Input Array for Iteration 9 is --
-Array
-(
- [0] => 12
- [1] => name
- [2] => age
- [3] => 45
-)
+-- Input Array for Iteration 9 is --
+array(4) {
+ [0]=>
+ int(12)
+ [1]=>
+ string(4) "name"
+ [2]=>
+ string(3) "age"
+ [3]=>
+ string(2) "45"
+}
Output after shift is :
int(12)
--- Input Array for Iteration 10 is --
-Array
-(
- [0] => Array
- (
- [0] => oNe
- [1] => tWo
- [2] => 4
- )
-
- [1] => Array
- (
- [0] => 10
- [1] => 20
- [2] => 30
- [3] => 40
- [4] => 50
- )
-
- [2] => Array
- (
- )
-
-)
+-- Input Array for Iteration 10 is --
+array(3) {
+ [0]=>
+ array(3) {
+ [0]=>
+ string(3) "oNe"
+ [1]=>
+ string(3) "tWo"
+ [2]=>
+ int(4)
+ }
+ [1]=>
+ array(5) {
+ [0]=>
+ int(10)
+ [1]=>
+ int(20)
+ [2]=>
+ int(30)
+ [3]=>
+ int(40)
+ [4]=>
+ int(50)
+ }
+ [2]=>
+ array(0) {
+ }
+}
Output after shift is :
array(3) {
@@ -231,33 +278,42 @@ array(3) {
int(4)
}
--- Input Array for Iteration 11 is --
-Array
-(
- [one] => 2
- [three] => 3
- [0] => 3
- [1] => 4
- [3] => 33
- [4] => 44
- [5] => 57
- [6] => 6
- [5.4] => 554
- [5.7] => 557
-)
+-- Input Array for Iteration 11 is --
+array(10) {
+ ["one"]=>
+ int(2)
+ ["three"]=>
+ int(3)
+ [0]=>
+ int(3)
+ [1]=>
+ int(4)
+ [3]=>
+ int(33)
+ [4]=>
+ int(44)
+ [5]=>
+ int(57)
+ [6]=>
+ int(6)
+ ["5.4"]=>
+ int(554)
+ ["5.7"]=>
+ int(557)
+}
Output after shift is :
int(2)
*** Checking for internal array pointer being reset when shift is called ***
-Current Element is : int(1)
+Current Element is :int(1)
-Next Element is : int(2)
+Next Element is :int(2)
-Next Element is : int(3)
+Next Element is :int(3)
-shifted Element is : int(1)
+shifted Element is :int(1)
-Current Element after shift operation is: int(2)
+Current Element after shift operation is:int(2)
Done
diff --git a/ext/standard/tests/array/006.phpt b/ext/standard/tests/array/006.phpt
index 4893ad3f06..c7eb528bfb 100644
--- a/ext/standard/tests/array/006.phpt
+++ b/ext/standard/tests/array/006.phpt
@@ -3,8 +3,6 @@ Test array_pop behaviour
--FILE--
<?php
-array_pop($GLOBALS);
-
$a = array("foo", "bar", "fubar");
$b = array("3" => "foo", "4" => "bar", "5" => "fubar");
$c = array("a" => "foo", "b" => "bar", "c" => "fubar");
diff --git a/ext/standard/tests/array/009.phpt b/ext/standard/tests/array/009.phpt
index 42cecc51ea..f4aab2fa93 100644
--- a/ext/standard/tests/array/009.phpt
+++ b/ext/standard/tests/array/009.phpt
@@ -20,7 +20,7 @@ $varient_arrays = array (
array(NULL),// array with NULL
array(null),// array with null
array(NULL, true, null, "", 1), // mixed array
- array(-1.5 => "test", -2 => "rest", 2.5 => "two",
+ array(-1 => "test", -2 => "rest", 2 => "two",
"" => "string", 0 => "zero", "" => "" ) // mixed array
);
diff --git a/ext/standard/tests/array/array_change_key_case_variation3.phpt b/ext/standard/tests/array/array_change_key_case_variation3.phpt
index bd5ad8557b..0c3ed4eb0d 100644
--- a/ext/standard/tests/array/array_change_key_case_variation3.phpt
+++ b/ext/standard/tests/array/array_change_key_case_variation3.phpt
@@ -29,18 +29,6 @@ $inputs = array(
-2345 => 'negative',
),
- // float data
-/*2*/ 'float' => array(
- 10.5 => 'positive',
- -10.5 => 'negative',
- .5 => 'half',
- ),
-
- 'extreme floats' => array(
- 12.3456789000e6 => 'large',
- 12.3456789000E-10 => 'small',
- ),
-
// null data
/*3*/ 'null uppercase' => array(
NULL => 'null 1',
@@ -110,37 +98,19 @@ array(4) {
string(8) "negative"
}
--- Iteration 2 : float data --
-array(3) {
- [10]=>
- string(8) "positive"
- [-10]=>
- string(8) "negative"
- [0]=>
- string(4) "half"
-}
-
--- Iteration 3 : extreme floats data --
-array(2) {
- [12345678]=>
- string(5) "large"
- [0]=>
- string(5) "small"
-}
-
--- Iteration 4 : null uppercase data --
+-- Iteration 2 : null uppercase data --
array(1) {
[""]=>
string(6) "null 1"
}
--- Iteration 5 : null lowercase data --
+-- Iteration 3 : null lowercase data --
array(1) {
[""]=>
string(6) "null 2"
}
--- Iteration 6 : bool lowercase data --
+-- Iteration 4 : bool lowercase data --
array(2) {
[1]=>
string(6) "lowert"
@@ -148,7 +118,7 @@ array(2) {
string(6) "lowerf"
}
--- Iteration 7 : bool uppercase data --
+-- Iteration 5 : bool uppercase data --
array(2) {
[1]=>
string(6) "uppert"
@@ -156,19 +126,19 @@ array(2) {
string(6) "upperf"
}
--- Iteration 8 : empty double quotes data --
+-- Iteration 6 : empty double quotes data --
array(1) {
[""]=>
string(6) "emptyd"
}
--- Iteration 9 : empty single quotes data --
+-- Iteration 7 : empty single quotes data --
array(1) {
[""]=>
string(6) "emptys"
}
--- Iteration 10 : string data --
+-- Iteration 8 : string data --
array(3) {
["STRINGD"]=>
string(7) "stringd"
@@ -178,13 +148,13 @@ array(3) {
string(7) "stringh"
}
--- Iteration 11 : undefined data --
+-- Iteration 9 : undefined data --
array(1) {
[""]=>
string(9) "undefined"
}
--- Iteration 12 : unset data --
+-- Iteration 10 : unset data --
array(1) {
[""]=>
string(5) "unset"
diff --git a/ext/standard/tests/array/array_chunk_variation5.phpt b/ext/standard/tests/array/array_chunk_variation5.phpt
index 24123b0370..dfae48974d 100644
--- a/ext/standard/tests/array/array_chunk_variation5.phpt
+++ b/ext/standard/tests/array/array_chunk_variation5.phpt
@@ -16,7 +16,7 @@ echo "*** Testing array_chunk() : usage variations ***\n";
$input_array = array(1, 2, 3);
// different magnitude's
-$sizes = array(-1, count($input_array) + 1, 0, 1.5);
+$sizes = array(-1, count($input_array) + 1, 0, 1);
// loop through the array for size argument
foreach ($sizes as $size){
@@ -86,7 +86,7 @@ array_chunk(): Argument #2 ($length) must be greater than 0
array_chunk(): Argument #2 ($length) must be greater than 0
array_chunk(): Argument #2 ($length) must be greater than 0
--- Testing array_chunk() when size = 1.5 --
+-- Testing array_chunk() when size = 1 --
array(3) {
[0]=>
array(1) {
diff --git a/ext/standard/tests/array/array_combine_variation4.phpt b/ext/standard/tests/array/array_combine_variation4.phpt
index e853d9e2fe..ae4d54a626 100644
--- a/ext/standard/tests/array/array_combine_variation4.phpt
+++ b/ext/standard/tests/array/array_combine_variation4.phpt
@@ -40,12 +40,6 @@ $arrays = array (
array(1 => "1"),
array(1 => "1", 2 => "2", 3 => "3", 4 => "4"),
- // arrays with float keys
-/*5*/ array(2.3333 => "float"),
- array(1.2 => "f1", 3.33 => "f2",
- 4.89999922839999 => "f3",
- 33333333.333333 => "f4"),
-
// arrays with string keys
/*7*/ array('\tHello' => 111, 're\td' => "color",
'\v\fworld' => 2.2, 'pen\n' => 33),
@@ -112,22 +106,6 @@ array(4) {
string(1) "4"
}
-- Iteration 5 --
-array(1) {
- ["float"]=>
- string(5) "float"
-}
--- Iteration 6 --
-array(4) {
- ["f1"]=>
- string(2) "f1"
- ["f2"]=>
- string(2) "f2"
- ["f3"]=>
- string(2) "f3"
- ["f4"]=>
- string(2) "f4"
-}
--- Iteration 7 --
array(4) {
[111]=>
int(111)
@@ -138,7 +116,7 @@ array(4) {
[33]=>
int(33)
}
--- Iteration 8 --
+-- Iteration 6 --
array(4) {
[111]=>
int(111)
@@ -149,21 +127,21 @@ array(4) {
[33]=>
int(33)
}
--- Iteration 9 --
+-- Iteration 7 --
array(2) {
["hello"]=>
string(5) "hello"
["string"]=>
string(6) "string"
}
--- Iteration 10 --
+-- Iteration 8 --
array(2) {
["hello"]=>
string(5) "hello"
["resource"]=>
string(8) "resource"
}
--- Iteration 11 --
+-- Iteration 9 --
array(7) {
[1]=>
int(1)
diff --git a/ext/standard/tests/array/array_combine_variation5.phpt b/ext/standard/tests/array/array_combine_variation5.phpt
index ec92352a07..ef0859373e 100644
--- a/ext/standard/tests/array/array_combine_variation5.phpt
+++ b/ext/standard/tests/array/array_combine_variation5.phpt
@@ -46,8 +46,8 @@ $arrays = array (
array("f1" => 1.2, 'f2' => 3.33, 3 => 4.89999922839999, 'f4' => 33333333.333),
// arrays with string values
-/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3.3 => "pen\n"),
- array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3.3 => 'pen\n'),
+/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3 => "pen\n"),
+ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3 => 'pen\n'),
array(1 => "hello", "heredoc" => $heredoc),
// array with object, unset variable and resource variable
diff --git a/ext/standard/tests/array/array_diff_assoc_variation4.phpt b/ext/standard/tests/array/array_diff_assoc_variation4.phpt
index 01b2e56a05..65b76dd9eb 100644
--- a/ext/standard/tests/array/array_diff_assoc_variation4.phpt
+++ b/ext/standard/tests/array/array_diff_assoc_variation4.phpt
@@ -31,13 +31,6 @@ $inputs = array(
12345 => 'positive',
-2345 => 'negative'),
- // float data
-/*2*/
-'float' => array(
- 10.5 => 'float 1',
- -10.5 => 'float 2',
- .5 => 'float 3'),
-
// null data
/*3*/
'null' => array(
@@ -109,22 +102,12 @@ array(4) {
}
-- Iteration 2 --
-array(3) {
- [10]=>
- string(7) "float 1"
- [-10]=>
- string(7) "float 2"
- [0]=>
- string(7) "float 3"
-}
-
--- Iteration 3 --
array(1) {
[""]=>
string(6) "null 2"
}
--- Iteration 4 --
+-- Iteration 3 --
array(2) {
[1]=>
string(5) "boolT"
@@ -132,13 +115,13 @@ array(2) {
string(5) "boolF"
}
--- Iteration 5 --
+-- Iteration 4 --
array(1) {
[""]=>
string(6) "emptys"
}
--- Iteration 6 --
+-- Iteration 5 --
array(2) {
["string"]=>
string(7) "strings"
@@ -146,7 +129,7 @@ array(2) {
string(7) "stringh"
}
--- Iteration 7 --
+-- Iteration 6 --
array(2) {
["binary1"]=>
string(8) "binary 1"
@@ -154,13 +137,13 @@ array(2) {
string(8) "binary 2"
}
--- Iteration 8 --
+-- Iteration 7 --
array(1) {
[""]=>
string(9) "undefined"
}
--- Iteration 9 --
+-- Iteration 8 --
array(1) {
[""]=>
string(5) "unset"
diff --git a/ext/standard/tests/array/array_diff_assoc_variation5.phpt b/ext/standard/tests/array/array_diff_assoc_variation5.phpt
index df05e3db61..09af9cb4a5 100644
--- a/ext/standard/tests/array/array_diff_assoc_variation5.phpt
+++ b/ext/standard/tests/array/array_diff_assoc_variation5.phpt
@@ -8,7 +8,7 @@ Test array_diff_assoc() function : usage variations - compare integers, floats a
echo "*** Testing array_diff_assoc() : usage variations ***\n";
$arr_default_int = array(1, 2, 3, 'a');
-$arr_float = array(0 => 1.00, 1.00 => 2.00, 2.00 => 3.00, 'b');
+$arr_float = array(0 => 1.00, 1 => 2.00, 2 => 3.00, 'b');
$arr_string = array('1', '2', '3', 'c');
$arr_string_float = array('0' => '1.00', '1.00' => '2.00', '2.00' => '3.00', 'd');
diff --git a/ext/standard/tests/array/array_diff_key_variation5.phpt b/ext/standard/tests/array/array_diff_key_variation5.phpt
deleted file mode 100644
index 2ba1da22b9..0000000000
--- a/ext/standard/tests/array/array_diff_key_variation5.phpt
+++ /dev/null
@@ -1,27 +0,0 @@
---TEST--
-Test array_diff_key() function : usage variation - Passing float indexed array
---FILE--
-<?php
-echo "*** Testing array_diff_key() : usage variation ***\n";
-
-// Initialise function arguments not being substituted (if any)
-$input_array = array(0 => '0', 10 => '10', -10 => '-10', 20 =>'20', -20 => '-20');
-$float_indx_array = array(0.0 => '0.0', 10.5 => '10.5', -10.5 => '-10.5', 0.5 => '0.5');
-
-echo "\n-- Testing array_diff_key() function with float indexed array --\n";
-// loop through each element of the array for arr1
-var_dump( array_diff_key($input_array, $float_indx_array) );
-var_dump( array_diff_key($float_indx_array, $input_array) );
-?>
---EXPECT--
-*** Testing array_diff_key() : usage variation ***
-
--- Testing array_diff_key() function with float indexed array --
-array(2) {
- [20]=>
- string(2) "20"
- [-20]=>
- string(3) "-20"
-}
-array(0) {
-}
diff --git a/ext/standard/tests/array/array_diff_uassoc_variation10.phpt b/ext/standard/tests/array/array_diff_uassoc_variation10.phpt
deleted file mode 100644
index 79e5a202c6..0000000000
--- a/ext/standard/tests/array/array_diff_uassoc_variation10.phpt
+++ /dev/null
@@ -1,39 +0,0 @@
---TEST--
-Test array_diff_uassoc() function : usage variation - Passing float indexed array
---FILE--
-<?php
-echo "*** Testing array_diff_uassoc() : usage variation ***\n";
-
-// Initialise function arguments not being substituted (if any)
-$input_array = array(0 => '0', 10 => '10', -10 => '-10', 20 =>'20', -20 => '-20');
-$float_indx_array = array(0.0 => '0.0', 10.5 => '10.5', -10.5 => '-10.5', 0.5 => '0.5');
-
-echo "\n-- Testing array_diff_key() function with float indexed array --\n";
-var_dump( array_diff_uassoc($input_array, $float_indx_array, "strcasecmp") );
-var_dump( array_diff_uassoc($float_indx_array, $input_array, "strcasecmp") );
-
-?>
---EXPECT--
-*** Testing array_diff_uassoc() : usage variation ***
-
--- Testing array_diff_key() function with float indexed array --
-array(5) {
- [0]=>
- string(1) "0"
- [10]=>
- string(2) "10"
- [-10]=>
- string(3) "-10"
- [20]=>
- string(2) "20"
- [-20]=>
- string(3) "-20"
-}
-array(3) {
- [0]=>
- string(3) "0.5"
- [10]=>
- string(4) "10.5"
- [-10]=>
- string(5) "-10.5"
-}
diff --git a/ext/standard/tests/array/array_diff_uassoc_variation5.phpt b/ext/standard/tests/array/array_diff_uassoc_variation5.phpt
index d2500113de..ee7b96d4e3 100644
--- a/ext/standard/tests/array/array_diff_uassoc_variation5.phpt
+++ b/ext/standard/tests/array/array_diff_uassoc_variation5.phpt
@@ -6,7 +6,7 @@ echo "*** Testing array_diff_uassoc() : usage variation ***\n";
//Initialize variables
$arr_default_int = array(1, 2, 3, 4);
-$arr_float = array(0 => 1.00, 1.00 => 2.00, 2.00 => 3.00, 3.00 => 4.00);
+$arr_float = array(0 => 1.00, 1 => 2.00, 2 => 3.00, 3 => 4.00);
function key_compare_func($key1, $key2)
diff --git a/ext/standard/tests/array/array_diff_uassoc_variation6.phpt b/ext/standard/tests/array/array_diff_uassoc_variation6.phpt
index 9e21fa0de3..177f7522e4 100644
--- a/ext/standard/tests/array/array_diff_uassoc_variation6.phpt
+++ b/ext/standard/tests/array/array_diff_uassoc_variation6.phpt
@@ -5,7 +5,7 @@ Test array_diff_uassoc() function : usage variation - Comparing floating points
echo "*** Testing array_diff_uassoc() : usage variation ***\n";
//Initialize variables
-$arr_float = array(0 => 1.00, 1.00 => 2.00);
+$arr_float = array(0 => 1.00, 1 => 2.00);
$arr_string_int = array('1', '2');
$arr_string_float = array('0' => '1.00', '1.00' => '2.00');
diff --git a/ext/standard/tests/array/array_diff_ukey_variation7.phpt b/ext/standard/tests/array/array_diff_ukey_variation7.phpt
deleted file mode 100644
index c534c2b36e..0000000000
--- a/ext/standard/tests/array/array_diff_ukey_variation7.phpt
+++ /dev/null
@@ -1,35 +0,0 @@
---TEST--
-Test array_diff_ukey() function : usage variation - Passing float indexed array
---FILE--
-<?php
-echo "*** Testing array_diff_ukey() : usage variation ***\n";
-
-// Initialise function arguments not being substituted (if any)
-$input_array = array(0 => '0', 10 => '10', -10 => '-10', 20 =>'20');
-$float_indx_array = array(0.0 => '0.0', 10.5 => '10.5', -30.5 => '-30.5');
-
-function key_compare_func($key1, $key2)
-{
- return strcasecmp($key1, $key2);
-}
-
-echo "\n-- Testing array_diff_ukey() function with float indexed array --\n";
-
-var_dump( array_diff_ukey($float_indx_array, $input_array, 'key_compare_func') );
-var_dump( array_diff_ukey($input_array, $float_indx_array, 'key_compare_func') );
-
-?>
---EXPECT--
-*** Testing array_diff_ukey() : usage variation ***
-
--- Testing array_diff_ukey() function with float indexed array --
-array(1) {
- [-30]=>
- string(5) "-30.5"
-}
-array(2) {
- [-10]=>
- string(3) "-10"
- [20]=>
- string(2) "20"
-}
diff --git a/ext/standard/tests/array/array_diff_variation8.phpt b/ext/standard/tests/array/array_diff_variation8.phpt
index 80d3bf87ec..5a1b2c4f30 100644
--- a/ext/standard/tests/array/array_diff_variation8.phpt
+++ b/ext/standard/tests/array/array_diff_variation8.phpt
@@ -41,8 +41,8 @@ $inputs = array (
array("f1" => 1.2, 'f2' => 3.33, 3 => 4.89999922839999, 'f4' => 1.2),
// arrays with string values
-/*5*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3.3 => "\tHello"),
- array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3.3 => '\tHello'),
+/*5*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3 => "\tHello"),
+ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3 => '\tHello'),
array(1 => "hello", "heredoc" => $heredoc, $heredoc),
// array with object, unset variable and resource variable
diff --git a/ext/standard/tests/array/array_fill.phpt b/ext/standard/tests/array/array_fill.phpt
index 4f2aa41b01..901b03b8b5 100644
--- a/ext/standard/tests/array/array_fill.phpt
+++ b/ext/standard/tests/array/array_fill.phpt
@@ -11,7 +11,7 @@ foreach($array1 as $start)
foreach($array2 as $value)
{
echo '==========================='."\n";
- echo 'start: '.$start.' num: '.$num.' value: '.$value."\n";
+ echo 'start: '.$start.' num: '.$num.' value: '. var_dump($value);
$output = array_fill($start, $num, $value);
var_dump($output);
}
@@ -20,324 +20,324 @@ foreach($array1 as $start)
?>
--EXPECT--
===========================
-start: 0 num: 0 value: 1
-array(0) {
+bool(true)
+start: 0 num: 0 value: array(0) {
}
===========================
-start: 0 num: 0 value:
-array(0) {
+bool(false)
+start: 0 num: 0 value: array(0) {
}
===========================
-start: 0 num: 0 value:
-array(0) {
+NULL
+start: 0 num: 0 value: array(0) {
}
===========================
-start: 0 num: 0 value: d
-array(0) {
+string(1) "d"
+start: 0 num: 0 value: array(0) {
}
===========================
-start: 0 num: 0 value: e
-array(0) {
+string(1) "e"
+start: 0 num: 0 value: array(0) {
}
===========================
-start: 0 num: 0 value: f
-array(0) {
+string(1) "f"
+start: 0 num: 0 value: array(0) {
}
===========================
-start: 0 num: 1 value: 1
-array(1) {
+bool(true)
+start: 0 num: 1 value: array(1) {
[0]=>
bool(true)
}
===========================
-start: 0 num: 1 value:
-array(1) {
+bool(false)
+start: 0 num: 1 value: array(1) {
[0]=>
bool(false)
}
===========================
-start: 0 num: 1 value:
-array(1) {
+NULL
+start: 0 num: 1 value: array(1) {
[0]=>
NULL
}
===========================
-start: 0 num: 1 value: d
-array(1) {
+string(1) "d"
+start: 0 num: 1 value: array(1) {
[0]=>
string(1) "d"
}
===========================
-start: 0 num: 1 value: e
-array(1) {
+string(1) "e"
+start: 0 num: 1 value: array(1) {
[0]=>
string(1) "e"
}
===========================
-start: 0 num: 1 value: f
-array(1) {
+string(1) "f"
+start: 0 num: 1 value: array(1) {
[0]=>
string(1) "f"
}
===========================
-start: 0 num: 2.5 value: 1
-array(2) {
+bool(true)
+start: 0 num: 2.5 value: array(2) {
[0]=>
bool(true)
[1]=>
bool(true)
}
===========================
-start: 0 num: 2.5 value:
-array(2) {
+bool(false)
+start: 0 num: 2.5 value: array(2) {
[0]=>
bool(false)
[1]=>
bool(false)
}
===========================
-start: 0 num: 2.5 value:
-array(2) {
+NULL
+start: 0 num: 2.5 value: array(2) {
[0]=>
NULL
[1]=>
NULL
}
===========================
-start: 0 num: 2.5 value: d
-array(2) {
+string(1) "d"
+start: 0 num: 2.5 value: array(2) {
[0]=>
string(1) "d"
[1]=>
string(1) "d"
}
===========================
-start: 0 num: 2.5 value: e
-array(2) {
+string(1) "e"
+start: 0 num: 2.5 value: array(2) {
[0]=>
string(1) "e"
[1]=>
string(1) "e"
}
===========================
-start: 0 num: 2.5 value: f
-array(2) {
+string(1) "f"
+start: 0 num: 2.5 value: array(2) {
[0]=>
string(1) "f"
[1]=>
string(1) "f"
}
===========================
-start: 1 num: 0 value: 1
-array(0) {
+bool(true)
+start: 1 num: 0 value: array(0) {
}
===========================
-start: 1 num: 0 value:
-array(0) {
+bool(false)
+start: 1 num: 0 value: array(0) {
}
===========================
-start: 1 num: 0 value:
-array(0) {
+NULL
+start: 1 num: 0 value: array(0) {
}
===========================
-start: 1 num: 0 value: d
-array(0) {
+string(1) "d"
+start: 1 num: 0 value: array(0) {
}
===========================
-start: 1 num: 0 value: e
-array(0) {
+string(1) "e"
+start: 1 num: 0 value: array(0) {
}
===========================
-start: 1 num: 0 value: f
-array(0) {
+string(1) "f"
+start: 1 num: 0 value: array(0) {
}
===========================
-start: 1 num: 1 value: 1
-array(1) {
+bool(true)
+start: 1 num: 1 value: array(1) {
[1]=>
bool(true)
}
===========================
-start: 1 num: 1 value:
-array(1) {
+bool(false)
+start: 1 num: 1 value: array(1) {
[1]=>
bool(false)
}
===========================
-start: 1 num: 1 value:
-array(1) {
+NULL
+start: 1 num: 1 value: array(1) {
[1]=>
NULL
}
===========================
-start: 1 num: 1 value: d
-array(1) {
+string(1) "d"
+start: 1 num: 1 value: array(1) {
[1]=>
string(1) "d"
}
===========================
-start: 1 num: 1 value: e
-array(1) {
+string(1) "e"
+start: 1 num: 1 value: array(1) {
[1]=>
string(1) "e"
}
===========================
-start: 1 num: 1 value: f
-array(1) {
+string(1) "f"
+start: 1 num: 1 value: array(1) {
[1]=>
string(1) "f"
}
===========================
-start: 1 num: 2.5 value: 1
-array(2) {
+bool(true)
+start: 1 num: 2.5 value: array(2) {
[1]=>
bool(true)
[2]=>
bool(true)
}
===========================
-start: 1 num: 2.5 value:
-array(2) {
+bool(false)
+start: 1 num: 2.5 value: array(2) {
[1]=>
bool(false)
[2]=>
bool(false)
}
===========================
-start: 1 num: 2.5 value:
-array(2) {
+NULL
+start: 1 num: 2.5 value: array(2) {
[1]=>
NULL
[2]=>
NULL
}
===========================
-start: 1 num: 2.5 value: d
-array(2) {
+string(1) "d"
+start: 1 num: 2.5 value: array(2) {
[1]=>
string(1) "d"
[2]=>
string(1) "d"
}
===========================
-start: 1 num: 2.5 value: e
-array(2) {
+string(1) "e"
+start: 1 num: 2.5 value: array(2) {
[1]=>
string(1) "e"
[2]=>
string(1) "e"
}
===========================
-start: 1 num: 2.5 value: f
-array(2) {
+string(1) "f"
+start: 1 num: 2.5 value: array(2) {
[1]=>
string(1) "f"
[2]=>
string(1) "f"
}
===========================
-start: 2.5 num: 0 value: 1
-array(0) {
+bool(true)
+start: 2.5 num: 0 value: array(0) {
}
===========================
-start: 2.5 num: 0 value:
-array(0) {
+bool(false)
+start: 2.5 num: 0 value: array(0) {
}
===========================
-start: 2.5 num: 0 value:
-array(0) {
+NULL
+start: 2.5 num: 0 value: array(0) {
}
===========================
-start: 2.5 num: 0 value: d
-array(0) {
+string(1) "d"
+start: 2.5 num: 0 value: array(0) {
}
===========================
-start: 2.5 num: 0 value: e
-array(0) {
+string(1) "e"
+start: 2.5 num: 0 value: array(0) {
}
===========================
-start: 2.5 num: 0 value: f
-array(0) {
+string(1) "f"
+start: 2.5 num: 0 value: array(0) {
}
===========================
-start: 2.5 num: 1 value: 1
-array(1) {
+bool(true)
+start: 2.5 num: 1 value: array(1) {
[2]=>
bool(true)
}
===========================
-start: 2.5 num: 1 value:
-array(1) {
+bool(false)
+start: 2.5 num: 1 value: array(1) {
[2]=>
bool(false)
}
===========================
-start: 2.5 num: 1 value:
-array(1) {
+NULL
+start: 2.5 num: 1 value: array(1) {
[2]=>
NULL
}
===========================
-start: 2.5 num: 1 value: d
-array(1) {
+string(1) "d"
+start: 2.5 num: 1 value: array(1) {
[2]=>
string(1) "d"
}
===========================
-start: 2.5 num: 1 value: e
-array(1) {
+string(1) "e"
+start: 2.5 num: 1 value: array(1) {
[2]=>
string(1) "e"
}
===========================
-start: 2.5 num: 1 value: f
-array(1) {
+string(1) "f"
+start: 2.5 num: 1 value: array(1) {
[2]=>
string(1) "f"
}
===========================
-start: 2.5 num: 2.5 value: 1
-array(2) {
+bool(true)
+start: 2.5 num: 2.5 value: array(2) {
[2]=>
bool(true)
[3]=>
bool(true)
}
===========================
-start: 2.5 num: 2.5 value:
-array(2) {
+bool(false)
+start: 2.5 num: 2.5 value: array(2) {
[2]=>
bool(false)
[3]=>
bool(false)
}
===========================
-start: 2.5 num: 2.5 value:
-array(2) {
+NULL
+start: 2.5 num: 2.5 value: array(2) {
[2]=>
NULL
[3]=>
NULL
}
===========================
-start: 2.5 num: 2.5 value: d
-array(2) {
+string(1) "d"
+start: 2.5 num: 2.5 value: array(2) {
[2]=>
string(1) "d"
[3]=>
string(1) "d"
}
===========================
-start: 2.5 num: 2.5 value: e
-array(2) {
+string(1) "e"
+start: 2.5 num: 2.5 value: array(2) {
[2]=>
string(1) "e"
[3]=>
string(1) "e"
}
===========================
-start: 2.5 num: 2.5 value: f
-array(2) {
+string(1) "f"
+start: 2.5 num: 2.5 value: array(2) {
[2]=>
string(1) "f"
[3]=>
diff --git a/ext/standard/tests/array/array_fill_object.phpt b/ext/standard/tests/array/array_fill_object.phpt
index 58fd532632..b7b6d348f5 100644
--- a/ext/standard/tests/array/array_fill_object.phpt
+++ b/ext/standard/tests/array/array_fill_object.phpt
@@ -235,25 +235,25 @@ array(2) {
array(2) {
[0]=>
object(Child_test1)#%d (4) {
- ["member2"]=>
- int(102)
["member1"]=>
int(100)
["var1"]=>
int(30)
["var2"]=>
int(101)
+ ["member2"]=>
+ int(102)
}
[1]=>
object(Child_test1)#%d (4) {
- ["member2"]=>
- int(102)
["member1"]=>
int(100)
["var1"]=>
int(30)
["var2"]=>
int(101)
+ ["member2"]=>
+ int(102)
}
}
-- Iteration 4 --
@@ -281,25 +281,25 @@ array(2) {
array(2) {
[0]=>
object(Child_test2)#%d (4) {
- ["member1":"Child_test2":private]=>
- int(102)
+ ["member1":"Test2":private]=>
+ int(100)
["var1"]=>
int(30)
["var2"]=>
int(101)
- ["member1":"Test2":private]=>
- int(100)
+ ["member1":"Child_test2":private]=>
+ int(102)
}
[1]=>
object(Child_test2)#%d (4) {
- ["member1":"Child_test2":private]=>
- int(102)
+ ["member1":"Test2":private]=>
+ int(100)
["var1"]=>
int(30)
["var2"]=>
int(101)
- ["member1":"Test2":private]=>
- int(100)
+ ["member1":"Child_test2":private]=>
+ int(102)
}
}
-- Iteration 6 --
@@ -369,25 +369,25 @@ array(2) {
array(2) {
[0]=>
object(Child_test4)#%d (4) {
- ["var1"]=>
- int(103)
["member1"]=>
int(100)
["member2":"Test4":private]=>
int(101)
["member3":protected]=>
int(102)
+ ["var1"]=>
+ int(103)
}
[1]=>
object(Child_test4)#%d (4) {
- ["var1"]=>
- int(103)
["member1"]=>
int(100)
["member2":"Test4":private]=>
int(101)
["member3":protected]=>
int(102)
+ ["var1"]=>
+ int(103)
}
}
-- Iteration 10 --
diff --git a/ext/standard/tests/array/array_filter_object.phpt b/ext/standard/tests/array/array_filter_object.phpt
index 9b10d20aea..0c2b175e25 100644
--- a/ext/standard/tests/array/array_filter_object.phpt
+++ b/ext/standard/tests/array/array_filter_object.phpt
@@ -105,10 +105,10 @@ array(5) {
}
[2]=>
object(ChildClass)#%d (2) {
- ["var3":"ChildClass":private]=>
- NULL
["var2":protected]=>
int(5)
+ ["var3":"ChildClass":private]=>
+ NULL
}
[3]=>
object(FinalClass)#%d (1) {
@@ -130,10 +130,10 @@ array(5) {
}
[2]=>
object(ChildClass)#%d (2) {
- ["var3":"ChildClass":private]=>
- NULL
["var2":protected]=>
int(5)
+ ["var3":"ChildClass":private]=>
+ NULL
}
[3]=>
object(FinalClass)#%d (1) {
diff --git a/ext/standard/tests/array/array_filter_variation3.phpt b/ext/standard/tests/array/array_filter_variation3.phpt
index 087267f566..a81bb35951 100644
--- a/ext/standard/tests/array/array_filter_variation3.phpt
+++ b/ext/standard/tests/array/array_filter_variation3.phpt
@@ -27,7 +27,7 @@ $input_values = array(
array(true, false, TRUE, FALSE), // bool values
array(null, NULL), // null values
array(1 => 'one', 'zero' => 0, -2 => "value"), //associative array
- array("one" => 1, null => 'null', 5.2 => "float", true => 1, "" => 'empty'), // associative array with different keys
+ array("one" => 1, null => 'null', 5 => "float", true => 1, "" => 'empty'), // associative array with different keys
array(1 => 'one', 2, "key" => 'value') // combinition of associative and non-associative array
);
diff --git a/ext/standard/tests/array/array_filter_variation9.phpt b/ext/standard/tests/array/array_filter_variation9.phpt
index f5158e337c..d9c1f9258f 100644
--- a/ext/standard/tests/array/array_filter_variation9.phpt
+++ b/ext/standard/tests/array/array_filter_variation9.phpt
@@ -8,7 +8,7 @@ Test array_filter() function : usage variations - built-in functions as 'callbac
echo "*** Testing array_filter() : usage variations - built-in functions as 'callback' argument ***\n";
-$input = array(0, 1, -1, 10, 100, 1000, null);
+$input = array(0, 1, -1, 10, 100, 1000);
// using built-in function 'is_int' as 'callback'
var_dump( array_filter($input, 'is_int') );
@@ -48,7 +48,7 @@ array(6) {
[5]=>
int(1000)
}
-array(7) {
+array(6) {
[0]=>
int(0)
[1]=>
@@ -61,9 +61,7 @@ array(7) {
int(100)
[5]=>
int(1000)
- [6]=>
- NULL
}
-array_filter(): Argument #2 ($callback) must be a valid callback, function "echo" not found or invalid function name
-array_filter(): Argument #2 ($callback) must be a valid callback, function "exit" not found or invalid function name
+array_filter(): Argument #2 ($callback) must be a valid callback or null, function "echo" not found or invalid function name
+array_filter(): Argument #2 ($callback) must be a valid callback or null, function "exit" not found or invalid function name
Done
diff --git a/ext/standard/tests/array/array_flip_variation5.phpt b/ext/standard/tests/array/array_flip_variation5.phpt
index 49be7de903..e7c47dffa5 100644
--- a/ext/standard/tests/array/array_flip_variation5.phpt
+++ b/ext/standard/tests/array/array_flip_variation5.phpt
@@ -9,7 +9,7 @@ Test array_flip() function : usage variations - 'input' argument with repeatitiv
echo "*** Testing array_flip() : 'input' array with repeatitive keys/values ***\n";
// array with numeric key repeatition
-$input = array(1 => 'value', 2 => 'VALUE', 1 => "VaLuE", 3.4 => 4, 3.4 => 5);
+$input = array(1 => 'value', 2 => 'VALUE', 1 => "VaLuE", 3 => 4, 3 => 5);
var_dump( array_flip($input) );
// array with string key repeatition
diff --git a/ext/standard/tests/array/array_intersect_assoc_variation5.phpt b/ext/standard/tests/array/array_intersect_assoc_variation5.phpt
index 78b22b8ca6..ad0c29b6b5 100644
--- a/ext/standard/tests/array/array_intersect_assoc_variation5.phpt
+++ b/ext/standard/tests/array/array_intersect_assoc_variation5.phpt
@@ -30,12 +30,6 @@ $arrays = array (
array(1 => "1"),
array(1 => "1", 2 => "2", 3 => "3", 4 => "4"),
- // arrays with float keys
-/*5*/ array(2.3333 => "float"),
- array(1.2 => "f1", 3.33 => "f2",
- 4.89999922839999 => "f3",
- 33333333.333333 => "f4"),
-
// arrays with string keys
/*7*/ array('\tHello' => 111, 're\td' => "color",
'\v\fworld' => 2.2, 'pen\n' => 33),
@@ -100,33 +94,11 @@ array(0) {
array(0) {
}
-- Iteration 5 --
-array(1) {
- [2]=>
- string(5) "float"
-}
-array(1) {
- [2]=>
- string(5) "float"
-}
--- Iteration 6 --
-array(2) {
- [4]=>
- string(2) "f3"
- [33333333]=>
- string(2) "f4"
-}
-array(2) {
- [4]=>
- string(2) "f3"
- [33333333]=>
- string(2) "f4"
-}
--- Iteration 7 --
array(0) {
}
array(0) {
}
--- Iteration 8 --
+-- Iteration 6 --
array(2) {
[" Hello"]=>
int(111)
@@ -141,7 +113,7 @@ array(2) {
"]=>
int(33)
}
--- Iteration 9 --
+-- Iteration 7 --
array(1) {
["Hello world"]=>
string(6) "string"
@@ -150,12 +122,12 @@ array(1) {
["Hello world"]=>
string(6) "string"
}
--- Iteration 10 --
+-- Iteration 8 --
array(0) {
}
array(0) {
}
--- Iteration 11 --
+-- Iteration 9 --
array(1) {
[133]=>
string(3) "int"
diff --git a/ext/standard/tests/array/array_intersect_assoc_variation6.phpt b/ext/standard/tests/array/array_intersect_assoc_variation6.phpt
index 396fe1fadc..57c3843d1f 100644
--- a/ext/standard/tests/array/array_intersect_assoc_variation6.phpt
+++ b/ext/standard/tests/array/array_intersect_assoc_variation6.phpt
@@ -30,12 +30,6 @@ $arrays = array (
array(1 => "1"),
array(1 => "1", 2 => "2", 3 => "3", 4 => "4"),
- // arrays with float keys
-/*5*/ array(2.3333 => "float"),
- array(1.2 => "f1", 3.33 => "f2",
- 4.89999922839999 => "f3",
- 33333333.333333 => "f4"),
-
// arrays with string keys
/*7*/ array('\tHello' => 111, 're\td' => "color",
'\v\fworld' => 2.2, 'pen\n' => 33),
@@ -100,33 +94,11 @@ array(0) {
array(0) {
}
-- Iteration 5 --
-array(1) {
- [2]=>
- string(5) "float"
-}
-array(1) {
- [2]=>
- string(5) "float"
-}
--- Iteration 6 --
-array(2) {
- [4]=>
- string(2) "f3"
- [33333333]=>
- string(2) "f4"
-}
-array(2) {
- [4]=>
- string(2) "f3"
- [33333333]=>
- string(2) "f4"
-}
--- Iteration 7 --
array(0) {
}
array(0) {
}
--- Iteration 8 --
+-- Iteration 6 --
array(2) {
[" Hello"]=>
int(111)
@@ -141,7 +113,7 @@ array(2) {
"]=>
int(33)
}
--- Iteration 9 --
+-- Iteration 7 --
array(1) {
["Hello world"]=>
string(6) "string"
@@ -150,12 +122,12 @@ array(1) {
["Hello world"]=>
string(6) "string"
}
--- Iteration 10 --
+-- Iteration 8 --
array(0) {
}
array(0) {
}
--- Iteration 11 --
+-- Iteration 9 --
array(1) {
[133]=>
string(3) "int"
diff --git a/ext/standard/tests/array/array_intersect_assoc_variation7.phpt b/ext/standard/tests/array/array_intersect_assoc_variation7.phpt
index f512bf497d..f971b356ba 100644
--- a/ext/standard/tests/array/array_intersect_assoc_variation7.phpt
+++ b/ext/standard/tests/array/array_intersect_assoc_variation7.phpt
@@ -46,8 +46,8 @@ $arrays = array (
array("f1" => 1.2, 'f2' => 3.33, 3 => 4.89999922839999, 'f4' => 33333333.333),
// arrays with string values
-/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3.3 => "pen\n"),
- array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3.3 => 'pen\n'),
+/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3 => "pen\n"),
+ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3 => 'pen\n'),
array(1 => "hello", "heredoc" => $heredoc),
// array with object, unset variable and resource variable
@@ -61,7 +61,7 @@ $arrays = array (
// array to be passsed to $arr2 argument
$arr2 = array(0 => "0", 1, "two" => 2, "float" => 2.3333, "f1" => 1.2,
- "f4" => 33333333.333, 111 => "\tHello", 3.3 => 'pen\n', '\v\fworld',
+ "f4" => 33333333.333, 111 => "\tHello", 3 => 'pen\n', '\v\fworld',
"heredoc" => "Hello world", 11 => new classA(), "resource" => $fp,
"int" => 133, 222 => "fruit");
diff --git a/ext/standard/tests/array/array_intersect_assoc_variation8.phpt b/ext/standard/tests/array/array_intersect_assoc_variation8.phpt
index 8f46864c89..c4a26c09d5 100644
--- a/ext/standard/tests/array/array_intersect_assoc_variation8.phpt
+++ b/ext/standard/tests/array/array_intersect_assoc_variation8.phpt
@@ -46,8 +46,8 @@ $arrays = array (
array("f1" => 1.2, 'f2' => 3.33, 3 => 4.89999922839999, 'f4' => 33333333.333),
// arrays with string values
-/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3.3 => "pen\n"),
- array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3.3 => 'pen\n'),
+/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3 => "pen\n"),
+ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3 => 'pen\n'),
array(1 => "hello", "heredoc" => $heredoc),
// array with object, unset variable and resource variable
@@ -61,7 +61,7 @@ $arrays = array (
// array to be passsed to $arr1 argument
$arr1 = array(0 => "0", 1, "two" => 2, "float" => 2.3333, "f1" => 1.2,
- "f4" => 33333333.333, 111 => "\tHello", 3.3 => 'pen\n', '\v\fworld',
+ "f4" => 33333333.333, 111 => "\tHello", 3 => 'pen\n', '\v\fworld',
"heredoc" => "Hello world", 11 => new classA(), "resource" => $fp,
"int" => 133, 222 => "fruit");
diff --git a/ext/standard/tests/array/array_intersect_key_variation5.phpt b/ext/standard/tests/array/array_intersect_key_variation5.phpt
deleted file mode 100644
index 05788d7abb..0000000000
--- a/ext/standard/tests/array/array_intersect_key_variation5.phpt
+++ /dev/null
@@ -1,34 +0,0 @@
---TEST--
-Test array_intersect_key() function : usage variation - Passing float indexed array
---FILE--
-<?php
-echo "*** Testing array_intersect_key() : usage variation ***\n";
-
-// Initialise function arguments not being substituted (if any)
-$input_array = array(0 => '0', 10 => '10' , -10 => '-10');
-$float_indx_array = array(0.0 => '0.0', 10.5 => '10.5' , -10.5 => '-10.5', 0.5 => '0.5');
-
-echo "\n-- Testing array_intersect_key() function with float indexed array --\n";
-var_dump( array_intersect_key($input_array, $float_indx_array) );
-var_dump( array_intersect_key($float_indx_array,$input_array ) );
-?>
---EXPECT--
-*** Testing array_intersect_key() : usage variation ***
-
--- Testing array_intersect_key() function with float indexed array --
-array(3) {
- [0]=>
- string(1) "0"
- [10]=>
- string(2) "10"
- [-10]=>
- string(3) "-10"
-}
-array(3) {
- [0]=>
- string(3) "0.5"
- [10]=>
- string(4) "10.5"
- [-10]=>
- string(5) "-10.5"
-}
diff --git a/ext/standard/tests/array/array_intersect_uassoc_variation5.phpt b/ext/standard/tests/array/array_intersect_uassoc_variation5.phpt
index e936f8a883..c46aaa3162 100644
--- a/ext/standard/tests/array/array_intersect_uassoc_variation5.phpt
+++ b/ext/standard/tests/array/array_intersect_uassoc_variation5.phpt
@@ -6,7 +6,7 @@ echo "*** Testing array_intersect_uassoc() : usage variation ***\n";
//Initialize variables
$arr_default_int = array(1, 2 );
-$arr_float = array(0 => 1.00, 1.00 => 2.00, 2.00 => 3.00);
+$arr_float = array(0 => 1.00, 1 => 2.00, 2 => 3.00);
$arr_string = array('1', '2', '3');
$arr_string_float = array('1.00', '2.00');
diff --git a/ext/standard/tests/array/array_intersect_uassoc_variation6.phpt b/ext/standard/tests/array/array_intersect_uassoc_variation6.phpt
index 7a6a2ea714..e286c8e9e7 100644
--- a/ext/standard/tests/array/array_intersect_uassoc_variation6.phpt
+++ b/ext/standard/tests/array/array_intersect_uassoc_variation6.phpt
@@ -5,7 +5,7 @@ Test array_intersect_uassoc() function : usage variation - Intersection of float
echo "*** Testing array_intersect_uassoc() : usage variation ***\n";
//Initialize variables
-$arr_float = array(0 => 1.00, 1.00 => 2.00);
+$arr_float = array(0 => 1.00, 1 => 2.00);
$arr_string = array('1', '2', '3');
$arr_string_float = array('1.00', '2.00');
diff --git a/ext/standard/tests/array/array_intersect_ukey_variation5.phpt b/ext/standard/tests/array/array_intersect_ukey_variation5.phpt
index 1839e7b4ba..f3fd8abd5c 100644
--- a/ext/standard/tests/array/array_intersect_ukey_variation5.phpt
+++ b/ext/standard/tests/array/array_intersect_ukey_variation5.phpt
@@ -6,7 +6,7 @@ echo "*** Testing array_intersect_ukey() : usage variation ***\n";
//Initialize variables
$arr_default_int = array(1, 2 );
-$arr_float = array(0 => 1.00, 1.00 => 2.00, 2.00 => 3.00);
+$arr_float = array(0 => 1.00, 1 => 2.00, 2 => 3.00);
$arr_string = array('0' => '1', '1' => '2', '2' => '3');
$arr_string_float = array('0.00' => '1.00', '1.00' => '2.00');
diff --git a/ext/standard/tests/array/array_intersect_ukey_variation6.phpt b/ext/standard/tests/array/array_intersect_ukey_variation6.phpt
index abdf7e96ad..e843da4277 100644
--- a/ext/standard/tests/array/array_intersect_ukey_variation6.phpt
+++ b/ext/standard/tests/array/array_intersect_ukey_variation6.phpt
@@ -5,7 +5,7 @@ Test array_intersect_ukey() function : usage variation - Intersection of floatin
echo "*** Testing array_intersect_ukey() : usage variation ***\n";
//Initialize variables
-$arr_float = array(0.00 => 1.00, 1.00 => 2.00);
+$arr_float = array(0 => 1.00, 1 => 2.00);
$arr_string = array('0' => '1', '1' => '2', '2' => '3');
$arr_string_float = array('0.00' => '1.00', '1.00' => '2.00');
diff --git a/ext/standard/tests/array/array_intersect_variation5.phpt b/ext/standard/tests/array/array_intersect_variation5.phpt
index 67efa2bf75..04eb9b43c3 100644
--- a/ext/standard/tests/array/array_intersect_variation5.phpt
+++ b/ext/standard/tests/array/array_intersect_variation5.phpt
@@ -30,12 +30,6 @@ $arrays = array (
array(1 => "1"),
array(1 => "1", 2 => "2", 3 => "3", 4 => "4"),
- // arrays with float keys
-/*5*/ array(2.3333 => "float"),
- array(1.2 => "f1", 3.33 => "f2",
- 4.89999922839999 => "f3",
- 33333333.333333 => "f4"),
-
// arrays with string keys
/*7*/ array('\tHello' => 111, 're\td' => "color",
'\v\fworld' => 2.2, 'pen\n' => 33),
@@ -102,24 +96,6 @@ array(1) {
string(1) "1"
}
-- Iterator 5 --
-array(1) {
- [2]=>
- string(5) "float"
-}
-array(1) {
- [2]=>
- string(5) "float"
-}
--- Iterator 6 --
-array(1) {
- [33333333]=>
- string(2) "f4"
-}
-array(1) {
- [33333333]=>
- string(2) "f4"
-}
--- Iterator 7 --
array(2) {
["re\td"]=>
string(5) "color"
@@ -132,7 +108,7 @@ array(2) {
["\v\fworld"]=>
float(2.2)
}
--- Iterator 8 --
+-- Iterator 6 --
array(2) {
["re d"]=>
string(5) "color"
@@ -145,7 +121,7 @@ array(2) {
[" world"]=>
float(2.2)
}
--- Iterator 9 --
+-- Iterator 7 --
array(2) {
[0]=>
string(5) "hello"
@@ -158,7 +134,7 @@ array(2) {
["Hello world"]=>
string(6) "string"
}
--- Iterator 10 --
+-- Iterator 8 --
array(1) {
[""]=>
string(5) "hello"
@@ -167,7 +143,7 @@ array(1) {
[""]=>
string(5) "hello"
}
--- Iterator 11 --
+-- Iterator 9 --
array(3) {
["hello"]=>
int(1)
diff --git a/ext/standard/tests/array/array_intersect_variation6.phpt b/ext/standard/tests/array/array_intersect_variation6.phpt
index 0dea24b7cb..b35a6ce076 100644
--- a/ext/standard/tests/array/array_intersect_variation6.phpt
+++ b/ext/standard/tests/array/array_intersect_variation6.phpt
@@ -30,12 +30,6 @@ $arrays = array (
array(1 => "1"),
array(1 => "1", 2 => "2", 3 => "3", 4 => "4"),
- // arrays with float keys
-/*5*/ array(2.3333 => "float"),
- array(1.2 => "f1", 3.33 => "f2",
- 4.89999922839999 => "f3",
- 33333333.333333 => "f4"),
-
// arrays with string keys
/*7*/ array('\tHello' => 111, 're\td' => "color",
'\v\fworld' => 2.2, 'pen\n' => 33),
@@ -102,24 +96,6 @@ array(1) {
int(1)
}
-- Iterator 5 --
-array(1) {
- [1]=>
- string(5) "float"
-}
-array(1) {
- [1]=>
- string(5) "float"
-}
--- Iterator 6 --
-array(1) {
- [2]=>
- string(2) "f4"
-}
-array(1) {
- [2]=>
- string(2) "f4"
-}
--- Iterator 7 --
array(2) {
[4]=>
float(2.2)
@@ -132,7 +108,7 @@ array(2) {
[5]=>
string(5) "color"
}
--- Iterator 8 --
+-- Iterator 6 --
array(2) {
[4]=>
float(2.2)
@@ -145,7 +121,7 @@ array(2) {
[5]=>
string(5) "color"
}
--- Iterator 9 --
+-- Iterator 7 --
array(2) {
[3]=>
string(5) "hello"
@@ -158,7 +134,7 @@ array(2) {
[6]=>
string(6) "string"
}
--- Iterator 10 --
+-- Iterator 8 --
array(1) {
[3]=>
string(5) "hello"
@@ -167,7 +143,7 @@ array(1) {
[3]=>
string(5) "hello"
}
--- Iterator 11 --
+-- Iterator 9 --
array(3) {
[0]=>
int(1)
diff --git a/ext/standard/tests/array/array_intersect_variation7.phpt b/ext/standard/tests/array/array_intersect_variation7.phpt
index 5e3b19aac8..559783b96c 100644
--- a/ext/standard/tests/array/array_intersect_variation7.phpt
+++ b/ext/standard/tests/array/array_intersect_variation7.phpt
@@ -46,8 +46,8 @@ $arrays = array (
array("f1" => 1.2, 'f2' => 3.33, 3 => 4.89999922839999, 'f4' => 33333333.333333),
// arrays with string values
-/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3.3 => "pen\n"),
- array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3.3 => 'pen\n'),
+/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3 => "pen\n"),
+ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3 => 'pen\n'),
array(1 => "hello", "heredoc" => $heredoc),
// array with object, unset variable and resource variable
diff --git a/ext/standard/tests/array/array_intersect_variation8.phpt b/ext/standard/tests/array/array_intersect_variation8.phpt
index bdd98d92a9..319804bbc7 100644
--- a/ext/standard/tests/array/array_intersect_variation8.phpt
+++ b/ext/standard/tests/array/array_intersect_variation8.phpt
@@ -46,8 +46,8 @@ $arrays = array (
array("f1" => 1.2, 'f2' => 3.33, 3 => 4.89999922839999, 'f4' => 33333333.333333),
// arrays with string values
-/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3.3 => "pen\n"),
- array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3.3 => 'pen\n'),
+/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3 => "pen\n"),
+ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3 => 'pen\n'),
array(1 => "hello", "heredoc" => $heredoc),
// array with object, unset variable and resource variable
diff --git a/ext/standard/tests/array/array_key_exists.phpt b/ext/standard/tests/array/array_key_exists.phpt
index 3e0e5ffaaa..d6f9ca13de 100644
--- a/ext/standard/tests/array/array_key_exists.phpt
+++ b/ext/standard/tests/array/array_key_exists.phpt
@@ -12,7 +12,6 @@ $search_arrays = array(
array("Name" => "Jack", "Loc" => "Mars", "Id" => "MS123"),
array('Red' => 'Rose', 'I' => 'You'),
array(0 => 'Zero', 1 => 'One', 2 => 'Two', 3 => "Three" ),
- array(0.1 => 'Zero', 1.1 => 'One', 2.2 => 'Two', 3.3 => "Three" )
);
/* keys to search in $search_arrays. $keys[0]
is the key to be searched in $search_arrays[0] and so on */
@@ -99,8 +98,6 @@ bool(true)
bool(true)
-- Iteration 7 --
bool(true)
--- Iteration 8 --
-bool(true)
*** Testing possible variations ***
@@ -161,14 +158,6 @@ bool(false)
bool(false)
bool(false)
bool(true)
--- Iteration 8 --
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(true)
** Variation loop 2 **
-- Iteration 1 --
diff --git a/ext/standard/tests/array/array_key_exists_variation1.phpt b/ext/standard/tests/array/array_key_exists_variation1.phpt
index eef48998fb..3a410258bb 100644
--- a/ext/standard/tests/array/array_key_exists_variation1.phpt
+++ b/ext/standard/tests/array/array_key_exists_variation1.phpt
@@ -40,13 +40,6 @@ $inputs = array(
12345,
-2345,
- // float data
-/*5*/ 10.5,
- -10.5,
- 12.3456789000e10,
- 12.3456789000E-10,
- .5,
-
// null data
/*10*/ NULL,
null,
@@ -112,13 +105,13 @@ bool(false)
bool(false)
-- Iteration 5 --
-bool(true)
+bool(false)
-- Iteration 6 --
bool(false)
-- Iteration 7 --
-bool(false)
+bool(true)
-- Iteration 8 --
bool(true)
@@ -127,16 +120,16 @@ bool(true)
bool(true)
-- Iteration 10 --
-bool(false)
+bool(true)
-- Iteration 11 --
bool(false)
-- Iteration 12 --
-bool(true)
+bool(false)
-- Iteration 13 --
-bool(true)
+Illegal offset type
-- Iteration 14 --
bool(true)
@@ -145,33 +138,18 @@ bool(true)
bool(true)
-- Iteration 16 --
-bool(false)
-
--- Iteration 17 --
-bool(false)
-
--- Iteration 18 --
-Illegal offset type
-
--- Iteration 19 --
-bool(true)
-
--- Iteration 20 --
-bool(true)
-
--- Iteration 21 --
bool(true)
--- Iteration 22 --
+-- Iteration 17 --
Illegal offset type
--- Iteration 23 --
+-- Iteration 18 --
bool(false)
--- Iteration 24 --
+-- Iteration 19 --
bool(false)
--- Iteration 25 --
+-- Iteration 20 --
Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
bool(false)
diff --git a/ext/standard/tests/array/array_key_exists_variation8.phpt b/ext/standard/tests/array/array_key_exists_variation8.phpt
index 8aa4c74896..417b56aae8 100644
--- a/ext/standard/tests/array/array_key_exists_variation8.phpt
+++ b/ext/standard/tests/array/array_key_exists_variation8.phpt
@@ -30,18 +30,6 @@ $inputs = array(
-2345 => 'negative',
),
- // float data
-/*2*/ 'float' => array(
- 10.5 => 'positive',
- -10.5 => 'negative',
- .5 => 'half',
- ),
-
- 'extreme floats' => array(
- 12.3456789000e10 => 'large',
- 12.3456789000E-10 => 'small',
- ),
-
// null data
/*3*/ 'null uppercase' => array(
NULL => 'null 1',
@@ -112,13 +100,6 @@ bool(true)
bool(true)
bool(true)
bool(true)
--- $key arguments are float data:
-bool(false)
-bool(false)
-bool(true)
--- $key arguments are extreme floats data:
-bool(false)
-bool(true)
-- $key arguments are null uppercase data:
bool(false)
-- $key arguments are null lowercase data:
@@ -142,91 +123,12 @@ bool(false)
-- $key arguments are unset data:
bool(false)
--- Iteration 2: float data --
--- $key arguments are int data:
-bool(true)
-bool(false)
-bool(false)
-bool(false)
--- $key arguments are float data:
-bool(true)
-bool(true)
-bool(true)
--- $key arguments are extreme floats data:
-bool(false)
-bool(true)
--- $key arguments are null uppercase data:
-bool(false)
--- $key arguments are null lowercase data:
-bool(false)
--- $key arguments are bool lowercase data:
-bool(false)
-bool(true)
--- $key arguments are bool uppercase data:
-bool(false)
-bool(true)
--- $key arguments are empty double quotes data:
-bool(false)
--- $key arguments are empty single quotes data:
-bool(false)
--- $key arguments are string data:
-bool(false)
-bool(false)
-bool(false)
--- $key arguments are undefined data:
-bool(false)
--- $key arguments are unset data:
-bool(false)
-
--- Iteration 3: extreme floats data --
--- $key arguments are int data:
-bool(true)
-bool(false)
-bool(false)
-bool(false)
--- $key arguments are float data:
-bool(false)
-bool(false)
-bool(true)
--- $key arguments are extreme floats data:
-bool(true)
-bool(true)
--- $key arguments are null uppercase data:
-bool(false)
--- $key arguments are null lowercase data:
-bool(false)
--- $key arguments are bool lowercase data:
-bool(false)
-bool(true)
--- $key arguments are bool uppercase data:
-bool(false)
-bool(true)
--- $key arguments are empty double quotes data:
-bool(false)
--- $key arguments are empty single quotes data:
-bool(false)
--- $key arguments are string data:
-bool(false)
-bool(false)
-bool(false)
--- $key arguments are undefined data:
-bool(false)
--- $key arguments are unset data:
-bool(false)
-
--- Iteration 4: null uppercase data --
+-- Iteration 2: null uppercase data --
-- $key arguments are int data:
bool(false)
bool(false)
bool(false)
bool(false)
--- $key arguments are float data:
-bool(false)
-bool(false)
-bool(false)
--- $key arguments are extreme floats data:
-bool(false)
-bool(false)
-- $key arguments are null uppercase data:
bool(true)
-- $key arguments are null lowercase data:
@@ -250,19 +152,12 @@ bool(true)
-- $key arguments are unset data:
bool(true)
--- Iteration 5: null lowercase data --
+-- Iteration 3: null lowercase data --
-- $key arguments are int data:
bool(false)
bool(false)
bool(false)
bool(false)
--- $key arguments are float data:
-bool(false)
-bool(false)
-bool(false)
--- $key arguments are extreme floats data:
-bool(false)
-bool(false)
-- $key arguments are null uppercase data:
bool(true)
-- $key arguments are null lowercase data:
@@ -286,19 +181,12 @@ bool(true)
-- $key arguments are unset data:
bool(true)
--- Iteration 6: bool lowercase data --
+-- Iteration 4: bool lowercase data --
-- $key arguments are int data:
bool(true)
bool(true)
bool(false)
bool(false)
--- $key arguments are float data:
-bool(false)
-bool(false)
-bool(true)
--- $key arguments are extreme floats data:
-bool(false)
-bool(true)
-- $key arguments are null uppercase data:
bool(false)
-- $key arguments are null lowercase data:
@@ -322,19 +210,12 @@ bool(false)
-- $key arguments are unset data:
bool(false)
--- Iteration 7: bool uppercase data --
+-- Iteration 5: bool uppercase data --
-- $key arguments are int data:
bool(true)
bool(true)
bool(false)
bool(false)
--- $key arguments are float data:
-bool(false)
-bool(false)
-bool(true)
--- $key arguments are extreme floats data:
-bool(false)
-bool(true)
-- $key arguments are null uppercase data:
bool(false)
-- $key arguments are null lowercase data:
@@ -358,19 +239,12 @@ bool(false)
-- $key arguments are unset data:
bool(false)
--- Iteration 8: empty double quotes data --
+-- Iteration 6: empty double quotes data --
-- $key arguments are int data:
bool(false)
bool(false)
bool(false)
bool(false)
--- $key arguments are float data:
-bool(false)
-bool(false)
-bool(false)
--- $key arguments are extreme floats data:
-bool(false)
-bool(false)
-- $key arguments are null uppercase data:
bool(true)
-- $key arguments are null lowercase data:
@@ -394,19 +268,12 @@ bool(true)
-- $key arguments are unset data:
bool(true)
--- Iteration 9: empty single quotes data --
+-- Iteration 7: empty single quotes data --
-- $key arguments are int data:
bool(false)
bool(false)
bool(false)
bool(false)
--- $key arguments are float data:
-bool(false)
-bool(false)
-bool(false)
--- $key arguments are extreme floats data:
-bool(false)
-bool(false)
-- $key arguments are null uppercase data:
bool(true)
-- $key arguments are null lowercase data:
@@ -430,19 +297,12 @@ bool(true)
-- $key arguments are unset data:
bool(true)
--- Iteration 10: string data --
+-- Iteration 8: string data --
-- $key arguments are int data:
bool(false)
bool(false)
bool(false)
bool(false)
--- $key arguments are float data:
-bool(false)
-bool(false)
-bool(false)
--- $key arguments are extreme floats data:
-bool(false)
-bool(false)
-- $key arguments are null uppercase data:
bool(false)
-- $key arguments are null lowercase data:
@@ -466,19 +326,12 @@ bool(false)
-- $key arguments are unset data:
bool(false)
--- Iteration 11: undefined data --
+-- Iteration 9: undefined data --
-- $key arguments are int data:
bool(false)
bool(false)
bool(false)
bool(false)
--- $key arguments are float data:
-bool(false)
-bool(false)
-bool(false)
--- $key arguments are extreme floats data:
-bool(false)
-bool(false)
-- $key arguments are null uppercase data:
bool(true)
-- $key arguments are null lowercase data:
@@ -502,19 +355,12 @@ bool(true)
-- $key arguments are unset data:
bool(true)
--- Iteration 12: unset data --
+-- Iteration 10: unset data --
-- $key arguments are int data:
bool(false)
bool(false)
bool(false)
bool(false)
--- $key arguments are float data:
-bool(false)
-bool(false)
-bool(false)
--- $key arguments are extreme floats data:
-bool(false)
-bool(false)
-- $key arguments are null uppercase data:
bool(true)
-- $key arguments are null lowercase data:
diff --git a/ext/standard/tests/array/array_key_first.phpt b/ext/standard/tests/array/array_key_first.phpt
index 6235386004..d3360f6bfe 100644
--- a/ext/standard/tests/array/array_key_first.phpt
+++ b/ext/standard/tests/array/array_key_first.phpt
@@ -14,12 +14,12 @@ $mixed_array = array(
array( "a" => "aaa", "A" => "AAA", "c" => "ccc", "d" => "ddd", "e" => "eee" ),
array( "1" => "one", "2" => "two", "3" => "three", "4" => "four", "5" => "five" ),
array( 1 => "one", 2 => "two", 3 => 7, 4 => "four", 5 => "five" ),
- array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2.4 => "float", "F" => "FFF",
- "blank" => "", 3.7 => 3.7, 5.4 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
+ array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2 => "float", "F" => "FFF",
+ "blank" => "", 3 => 3.7, 5 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
array( 12, "name", 'age', '45' ),
array( array("oNe", "tWo", 4), array(10, 20, 30, 40, 50), array() ),
array( "one" => 1, "one" => 2, "three" => 3, 3, 4, 3 => 33, 4 => 44, 5, 6,
- 5.4 => 54, 5.7 => 57, "5.4" => 554, "5.7" => 557 ),
+ 5 => 57, "5.4" => 554, "5.7" => 557 ),
array( "foo" ),
array( 1 => "42" )
);
@@ -31,7 +31,7 @@ $counter = 1;
foreach( $mixed_array as $sub_array )
{
echo "\n-- Input Array for Iteration $counter is --\n";
- print_r( $sub_array );
+ var_dump( $sub_array );
echo "\nFirst key is :\n";
var_dump( array_key_first($sub_array) );
$counter++;
@@ -43,190 +43,247 @@ echo"\nDone";
*** Normal testing with various array inputs ***
-- Input Array for Iteration 1 is --
-Array
-(
-)
+array(0) {
+}
First key is :
NULL
-- Input Array for Iteration 2 is --
-Array
-(
- [0] => 1
- [1] => 2
- [2] => 3
- [3] => 4
- [4] => 5
- [5] => 6
- [6] => 7
- [7] => 8
- [8] => 9
-)
+array(9) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+ [3]=>
+ int(4)
+ [4]=>
+ int(5)
+ [5]=>
+ int(6)
+ [6]=>
+ int(7)
+ [7]=>
+ int(8)
+ [8]=>
+ int(9)
+}
First key is :
int(0)
-- Input Array for Iteration 3 is --
-Array
-(
- [0] => One
- [1] => _Two
- [2] => Three
- [3] => Four
- [4] => Five
-)
+array(5) {
+ [0]=>
+ string(3) "One"
+ [1]=>
+ string(4) "_Two"
+ [2]=>
+ string(5) "Three"
+ [3]=>
+ string(4) "Four"
+ [4]=>
+ string(4) "Five"
+}
First key is :
int(0)
-- Input Array for Iteration 4 is --
-Array
-(
- [0] => 6
- [1] => six
- [2] => 7
- [3] => seven
- [4] => 8
- [5] => eight
- [6] => 9
- [7] => nine
-)
+array(8) {
+ [0]=>
+ int(6)
+ [1]=>
+ string(3) "six"
+ [2]=>
+ int(7)
+ [3]=>
+ string(5) "seven"
+ [4]=>
+ int(8)
+ [5]=>
+ string(5) "eight"
+ [6]=>
+ int(9)
+ [7]=>
+ string(4) "nine"
+}
First key is :
int(0)
-- Input Array for Iteration 5 is --
-Array
-(
- [a] => aaa
- [A] => AAA
- [c] => ccc
- [d] => ddd
- [e] => eee
-)
+array(5) {
+ ["a"]=>
+ string(3) "aaa"
+ ["A"]=>
+ string(3) "AAA"
+ ["c"]=>
+ string(3) "ccc"
+ ["d"]=>
+ string(3) "ddd"
+ ["e"]=>
+ string(3) "eee"
+}
First key is :
string(1) "a"
-- Input Array for Iteration 6 is --
-Array
-(
- [1] => one
- [2] => two
- [3] => three
- [4] => four
- [5] => five
-)
+array(5) {
+ [1]=>
+ string(3) "one"
+ [2]=>
+ string(3) "two"
+ [3]=>
+ string(5) "three"
+ [4]=>
+ string(4) "four"
+ [5]=>
+ string(4) "five"
+}
First key is :
int(1)
-- Input Array for Iteration 7 is --
-Array
-(
- [1] => one
- [2] => two
- [3] => 7
- [4] => four
- [5] => five
-)
+array(5) {
+ [1]=>
+ string(3) "one"
+ [2]=>
+ string(3) "two"
+ [3]=>
+ int(7)
+ [4]=>
+ string(4) "four"
+ [5]=>
+ string(4) "five"
+}
First key is :
int(1)
-- Input Array for Iteration 8 is --
-Array
-(
- [f] => fff
- [1] => one
- [4] => 6
- [] => 3
- [2] => float
- [F] => FFF
- [blank] =>
- [3] => 3.7
- [5] => Five
- [6] => 8.6
- [4name] => jonny
- [a] =>
-)
+array(12) {
+ ["f"]=>
+ string(3) "fff"
+ [1]=>
+ string(3) "one"
+ [4]=>
+ int(6)
+ [""]=>
+ int(3)
+ [2]=>
+ string(5) "float"
+ ["F"]=>
+ string(3) "FFF"
+ ["blank"]=>
+ string(0) ""
+ [3]=>
+ float(3.7)
+ [5]=>
+ string(4) "Five"
+ [6]=>
+ float(8.6)
+ ["4name"]=>
+ string(5) "jonny"
+ ["a"]=>
+ NULL
+}
First key is :
string(1) "f"
-- Input Array for Iteration 9 is --
-Array
-(
- [0] => 12
- [1] => name
- [2] => age
- [3] => 45
-)
+array(4) {
+ [0]=>
+ int(12)
+ [1]=>
+ string(4) "name"
+ [2]=>
+ string(3) "age"
+ [3]=>
+ string(2) "45"
+}
First key is :
int(0)
-- Input Array for Iteration 10 is --
-Array
-(
- [0] => Array
- (
- [0] => oNe
- [1] => tWo
- [2] => 4
- )
-
- [1] => Array
- (
- [0] => 10
- [1] => 20
- [2] => 30
- [3] => 40
- [4] => 50
- )
-
- [2] => Array
- (
- )
-
-)
+array(3) {
+ [0]=>
+ array(3) {
+ [0]=>
+ string(3) "oNe"
+ [1]=>
+ string(3) "tWo"
+ [2]=>
+ int(4)
+ }
+ [1]=>
+ array(5) {
+ [0]=>
+ int(10)
+ [1]=>
+ int(20)
+ [2]=>
+ int(30)
+ [3]=>
+ int(40)
+ [4]=>
+ int(50)
+ }
+ [2]=>
+ array(0) {
+ }
+}
First key is :
int(0)
-- Input Array for Iteration 11 is --
-Array
-(
- [one] => 2
- [three] => 3
- [0] => 3
- [1] => 4
- [3] => 33
- [4] => 44
- [5] => 57
- [6] => 6
- [5.4] => 554
- [5.7] => 557
-)
+array(10) {
+ ["one"]=>
+ int(2)
+ ["three"]=>
+ int(3)
+ [0]=>
+ int(3)
+ [1]=>
+ int(4)
+ [3]=>
+ int(33)
+ [4]=>
+ int(44)
+ [5]=>
+ int(57)
+ [6]=>
+ int(6)
+ ["5.4"]=>
+ int(554)
+ ["5.7"]=>
+ int(557)
+}
First key is :
string(3) "one"
-- Input Array for Iteration 12 is --
-Array
-(
- [0] => foo
-)
+array(1) {
+ [0]=>
+ string(3) "foo"
+}
First key is :
int(0)
-- Input Array for Iteration 13 is --
-Array
-(
- [1] => 42
-)
+array(1) {
+ [1]=>
+ string(2) "42"
+}
First key is :
int(1)
diff --git a/ext/standard/tests/array/array_key_last.phpt b/ext/standard/tests/array/array_key_last.phpt
index 599d80eac4..c325be6560 100644
--- a/ext/standard/tests/array/array_key_last.phpt
+++ b/ext/standard/tests/array/array_key_last.phpt
@@ -14,12 +14,12 @@ $mixed_array = array(
array( "a" => "aaa", "A" => "AAA", "c" => "ccc", "d" => "ddd", "e" => "eee" ),
array( "1" => "one", "2" => "two", "3" => "three", "4" => "four", "5" => "five" ),
array( 1 => "one", 2 => "two", 3 => 7, 4 => "four", 5 => "five" ),
- array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2.4 => "float", "F" => "FFF",
- "blank" => "", 3.7 => 3.7, 5.4 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
+ array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2 => "float", "F" => "FFF",
+ "blank" => "", 3 => 3.7, 5 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
array( 12, "name", 'age', '45' ),
array( array("oNe", "tWo", 4), array(10, 20, 30, 40, 50), array() ),
array( "one" => 1, "one" => 2, "three" => 3, 3, 4, 3 => 33, 4 => 44, 5, 6,
- 5.4 => 54, 5.7 => 57, "5.4" => 554, "5.7" => 557 ),
+ 5 => 57, "5.4" => 554, "5.7" => 557 ),
array( "foo" ),
array( 1 => "42" )
);
@@ -31,7 +31,7 @@ $counter = 1;
foreach( $mixed_array as $sub_array )
{
echo "\n-- Input Array for Iteration $counter is --\n";
- print_r( $sub_array );
+ var_dump( $sub_array );
echo "\nLast key is :\n";
var_dump( array_key_last($sub_array) );
$counter++;
@@ -43,190 +43,247 @@ echo"\nDone";
*** Normal testing with various array inputs ***
-- Input Array for Iteration 1 is --
-Array
-(
-)
+array(0) {
+}
Last key is :
NULL
-- Input Array for Iteration 2 is --
-Array
-(
- [0] => 1
- [1] => 2
- [2] => 3
- [3] => 4
- [4] => 5
- [5] => 6
- [6] => 7
- [7] => 8
- [8] => 9
-)
+array(9) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+ [3]=>
+ int(4)
+ [4]=>
+ int(5)
+ [5]=>
+ int(6)
+ [6]=>
+ int(7)
+ [7]=>
+ int(8)
+ [8]=>
+ int(9)
+}
Last key is :
int(8)
-- Input Array for Iteration 3 is --
-Array
-(
- [0] => One
- [1] => _Two
- [2] => Three
- [3] => Four
- [4] => Five
-)
+array(5) {
+ [0]=>
+ string(3) "One"
+ [1]=>
+ string(4) "_Two"
+ [2]=>
+ string(5) "Three"
+ [3]=>
+ string(4) "Four"
+ [4]=>
+ string(4) "Five"
+}
Last key is :
int(4)
-- Input Array for Iteration 4 is --
-Array
-(
- [0] => 6
- [1] => six
- [2] => 7
- [3] => seven
- [4] => 8
- [5] => eight
- [6] => 9
- [7] => nine
-)
+array(8) {
+ [0]=>
+ int(6)
+ [1]=>
+ string(3) "six"
+ [2]=>
+ int(7)
+ [3]=>
+ string(5) "seven"
+ [4]=>
+ int(8)
+ [5]=>
+ string(5) "eight"
+ [6]=>
+ int(9)
+ [7]=>
+ string(4) "nine"
+}
Last key is :
int(7)
-- Input Array for Iteration 5 is --
-Array
-(
- [a] => aaa
- [A] => AAA
- [c] => ccc
- [d] => ddd
- [e] => eee
-)
+array(5) {
+ ["a"]=>
+ string(3) "aaa"
+ ["A"]=>
+ string(3) "AAA"
+ ["c"]=>
+ string(3) "ccc"
+ ["d"]=>
+ string(3) "ddd"
+ ["e"]=>
+ string(3) "eee"
+}
Last key is :
string(1) "e"
-- Input Array for Iteration 6 is --
-Array
-(
- [1] => one
- [2] => two
- [3] => three
- [4] => four
- [5] => five
-)
+array(5) {
+ [1]=>
+ string(3) "one"
+ [2]=>
+ string(3) "two"
+ [3]=>
+ string(5) "three"
+ [4]=>
+ string(4) "four"
+ [5]=>
+ string(4) "five"
+}
Last key is :
int(5)
-- Input Array for Iteration 7 is --
-Array
-(
- [1] => one
- [2] => two
- [3] => 7
- [4] => four
- [5] => five
-)
+array(5) {
+ [1]=>
+ string(3) "one"
+ [2]=>
+ string(3) "two"
+ [3]=>
+ int(7)
+ [4]=>
+ string(4) "four"
+ [5]=>
+ string(4) "five"
+}
Last key is :
int(5)
-- Input Array for Iteration 8 is --
-Array
-(
- [f] => fff
- [1] => one
- [4] => 6
- [] => 3
- [2] => float
- [F] => FFF
- [blank] =>
- [3] => 3.7
- [5] => Five
- [6] => 8.6
- [4name] => jonny
- [a] =>
-)
+array(12) {
+ ["f"]=>
+ string(3) "fff"
+ [1]=>
+ string(3) "one"
+ [4]=>
+ int(6)
+ [""]=>
+ int(3)
+ [2]=>
+ string(5) "float"
+ ["F"]=>
+ string(3) "FFF"
+ ["blank"]=>
+ string(0) ""
+ [3]=>
+ float(3.7)
+ [5]=>
+ string(4) "Five"
+ [6]=>
+ float(8.6)
+ ["4name"]=>
+ string(5) "jonny"
+ ["a"]=>
+ NULL
+}
Last key is :
string(1) "a"
-- Input Array for Iteration 9 is --
-Array
-(
- [0] => 12
- [1] => name
- [2] => age
- [3] => 45
-)
+array(4) {
+ [0]=>
+ int(12)
+ [1]=>
+ string(4) "name"
+ [2]=>
+ string(3) "age"
+ [3]=>
+ string(2) "45"
+}
Last key is :
int(3)
-- Input Array for Iteration 10 is --
-Array
-(
- [0] => Array
- (
- [0] => oNe
- [1] => tWo
- [2] => 4
- )
-
- [1] => Array
- (
- [0] => 10
- [1] => 20
- [2] => 30
- [3] => 40
- [4] => 50
- )
-
- [2] => Array
- (
- )
-
-)
+array(3) {
+ [0]=>
+ array(3) {
+ [0]=>
+ string(3) "oNe"
+ [1]=>
+ string(3) "tWo"
+ [2]=>
+ int(4)
+ }
+ [1]=>
+ array(5) {
+ [0]=>
+ int(10)
+ [1]=>
+ int(20)
+ [2]=>
+ int(30)
+ [3]=>
+ int(40)
+ [4]=>
+ int(50)
+ }
+ [2]=>
+ array(0) {
+ }
+}
Last key is :
int(2)
-- Input Array for Iteration 11 is --
-Array
-(
- [one] => 2
- [three] => 3
- [0] => 3
- [1] => 4
- [3] => 33
- [4] => 44
- [5] => 57
- [6] => 6
- [5.4] => 554
- [5.7] => 557
-)
+array(10) {
+ ["one"]=>
+ int(2)
+ ["three"]=>
+ int(3)
+ [0]=>
+ int(3)
+ [1]=>
+ int(4)
+ [3]=>
+ int(33)
+ [4]=>
+ int(44)
+ [5]=>
+ int(57)
+ [6]=>
+ int(6)
+ ["5.4"]=>
+ int(554)
+ ["5.7"]=>
+ int(557)
+}
Last key is :
string(3) "5.7"
-- Input Array for Iteration 12 is --
-Array
-(
- [0] => foo
-)
+array(1) {
+ [0]=>
+ string(3) "foo"
+}
Last key is :
int(0)
-- Input Array for Iteration 13 is --
-Array
-(
- [1] => 42
-)
+array(1) {
+ [1]=>
+ string(2) "42"
+}
Last key is :
int(1)
diff --git a/ext/standard/tests/array/array_keys_basic.phpt b/ext/standard/tests/array/array_keys_basic.phpt
index 0aa84d984d..dc54976d1d 100644
--- a/ext/standard/tests/array/array_keys_basic.phpt
+++ b/ext/standard/tests/array/array_keys_basic.phpt
@@ -4,7 +4,7 @@ Test array_keys() function (basic)
<?php
echo "*** Testing array_keys() on basic array operation ***\n";
-$basic_arr = array("a" => 1, "b" => 2, 2.0 => 2.0, -23.45 => "asdasd",
+$basic_arr = array("a" => 1, "b" => 2, 2 => 2.0, -23 => "asdasd",
array(1,2,3));
var_dump(array_keys($basic_arr));
diff --git a/ext/standard/tests/array/array_keys_variation_001.phpt b/ext/standard/tests/array/array_keys_variation_001.phpt
index e9944ed112..fdba88afbd 100644
--- a/ext/standard/tests/array/array_keys_variation_001.phpt
+++ b/ext/standard/tests/array/array_keys_variation_001.phpt
@@ -13,7 +13,7 @@ $arrays = array(
array(1,2,3, "d" => array(4,6, "d")),
array("a" => 1, "b" => 2, "c" =>3, "d" => array()),
array(0 => 0, 1 => 1, 2 => 2, 3 => 3),
- array(0.001=>3.000, 1.002=>2, 1.999=>3, "a"=>3, 3=>5, "5"=>3.000),
+ array(0 =>3.000, 1 =>2, 1 =>3, "a"=>3, 3=>5, "5"=>3.000),
array(TRUE => TRUE, FALSE => FALSE, NULL => NULL, "\x000", "\000"),
array("a" => "abcd", "a" => "", "ab" => -6, "cd" => -0.5 ),
array(0 => array(), 1=> array(0), 2 => array(1), ""=> array(),""=>"" )
diff --git a/ext/standard/tests/array/array_map_object1.phpt b/ext/standard/tests/array/array_map_object1.phpt
index b5da9798e4..88ebe2414b 100644
--- a/ext/standard/tests/array/array_map_object1.phpt
+++ b/ext/standard/tests/array/array_map_object1.phpt
@@ -132,15 +132,15 @@ array(2) {
-- simple class with private variable and method --
SimpleClassPri::add
-array_map(): Argument #1 ($callback) must be a valid callback, cannot access private method SimpleClassPri::add()
+array_map(): Argument #1 ($callback) must be a valid callback or null, cannot access private method SimpleClassPri::add()
-- simple class with protected variable and method --
SimpleClassPro::mul
-array_map(): Argument #1 ($callback) must be a valid callback, cannot access protected method SimpleClassPro::mul()
+array_map(): Argument #1 ($callback) must be a valid callback or null, cannot access protected method SimpleClassPro::mul()
-- class without members --
EmptyClass
-array_map(): Argument #1 ($callback) must be a valid callback, array must have exactly two members
+array_map(): Argument #1 ($callback) must be a valid callback or null, array must have exactly two members
-- abstract class --
ChildClass::emptyFunction
@@ -173,9 +173,9 @@ array(2) {
int(4)
}
StaticClass::cube
-array_map(): Argument #1 ($callback) must be a valid callback, cannot access private method StaticClass::cube()
+array_map(): Argument #1 ($callback) must be a valid callback or null, cannot access private method StaticClass::cube()
StaticClass::retVal
-array_map(): Argument #1 ($callback) must be a valid callback, cannot access protected method StaticClass::retVal()
+array_map(): Argument #1 ($callback) must be a valid callback or null, cannot access protected method StaticClass::retVal()
-- class implementing an interface --
InterClass::square
array(2) {
diff --git a/ext/standard/tests/array/array_map_object2.phpt b/ext/standard/tests/array/array_map_object2.phpt
index 53524fc819..3b9666ce50 100644
--- a/ext/standard/tests/array/array_map_object2.phpt
+++ b/ext/standard/tests/array/array_map_object2.phpt
@@ -39,7 +39,7 @@ echo "Done";
--EXPECT--
*** Testing array_map() : with non-existent class and method ***
-- with non-existent class --
-array_map(): Argument #1 ($callback) must be a valid callback, class "non-existent" not found
+array_map(): Argument #1 ($callback) must be a valid callback or null, class "non-existent" not found
-- with existent class and non-existent method --
-array_map(): Argument #1 ($callback) must be a valid callback, class SimpleClass does not have a method "non-existent"
+array_map(): Argument #1 ($callback) must be a valid callback or null, class SimpleClass does not have a method "non-existent"
Done
diff --git a/ext/standard/tests/array/array_map_object3.phpt b/ext/standard/tests/array/array_map_object3.phpt
index b5528c9e7c..55a97a317f 100644
--- a/ext/standard/tests/array/array_map_object3.phpt
+++ b/ext/standard/tests/array/array_map_object3.phpt
@@ -76,7 +76,7 @@ array(3) {
int(7)
}
-- accessing child method from parent class --
-array_map(): Argument #1 ($callback) must be a valid callback, class ParentClass does not have a method "staticChild"
+array_map(): Argument #1 ($callback) must be a valid callback or null, class ParentClass does not have a method "staticChild"
-- accessing parent method using child class object --
array(3) {
[0]=>
@@ -87,5 +87,5 @@ array(3) {
int(7)
}
-- accessing child method using parent class object --
-array_map(): Argument #1 ($callback) must be a valid callback, class ParentClass does not have a method "staticChild"
+array_map(): Argument #1 ($callback) must be a valid callback or null, class ParentClass does not have a method "staticChild"
Done
diff --git a/ext/standard/tests/array/array_map_variation12.phpt b/ext/standard/tests/array/array_map_variation12.phpt
index b642bd0cb5..d3fa62e93d 100644
--- a/ext/standard/tests/array/array_map_variation12.phpt
+++ b/ext/standard/tests/array/array_map_variation12.phpt
@@ -44,5 +44,5 @@ array(3) {
-- with built-in function 'pow' and one parameter --
pow() expects exactly 2 arguments, 1 given
-- with language construct --
-array_map(): Argument #1 ($callback) must be a valid callback, function "echo" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "echo" not found or invalid function name
Done
diff --git a/ext/standard/tests/array/array_map_variation14.phpt b/ext/standard/tests/array/array_map_variation14.phpt
index 2670537b46..d1f0b517ea 100644
--- a/ext/standard/tests/array/array_map_variation14.phpt
+++ b/ext/standard/tests/array/array_map_variation14.phpt
@@ -118,7 +118,7 @@ array(2) {
int(2)
}
-- with empty string --
-array_map(): Argument #1 ($callback) must be a valid callback, function "" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "" not found or invalid function name
-- with empty array --
-array_map(): Argument #1 ($callback) must be a valid callback, array must have exactly two members
+array_map(): Argument #1 ($callback) must be a valid callback or null, array must have exactly two members
Done
diff --git a/ext/standard/tests/array/array_map_variation15.phpt b/ext/standard/tests/array/array_map_variation15.phpt
index f10be3cc32..d053a72046 100644
--- a/ext/standard/tests/array/array_map_variation15.phpt
+++ b/ext/standard/tests/array/array_map_variation15.phpt
@@ -23,5 +23,5 @@ echo "Done";
?>
--EXPECT--
*** Testing array_map() : non existent 'callback' function ***
-array_map(): Argument #1 ($callback) must be a valid callback, function "non_existent" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "non_existent" not found or invalid function name
Done
diff --git a/ext/standard/tests/array/array_map_variation16.phpt b/ext/standard/tests/array/array_map_variation16.phpt
index 21034375b9..b7c6690040 100644
--- a/ext/standard/tests/array/array_map_variation16.phpt
+++ b/ext/standard/tests/array/array_map_variation16.phpt
@@ -38,19 +38,19 @@ echo "Done";
--EXPECT--
*** Testing array_map() : non-permmited built-in functions ***
-- Iteration 1 --
-array_map(): Argument #1 ($callback) must be a valid callback, function "echo" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "echo" not found or invalid function name
-- Iteration 2 --
-array_map(): Argument #1 ($callback) must be a valid callback, function "array" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "array" not found or invalid function name
-- Iteration 3 --
-array_map(): Argument #1 ($callback) must be a valid callback, function "empty" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "empty" not found or invalid function name
-- Iteration 4 --
-array_map(): Argument #1 ($callback) must be a valid callback, function "eval" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "eval" not found or invalid function name
-- Iteration 5 --
-array_map(): Argument #1 ($callback) must be a valid callback, function "exit" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "exit" not found or invalid function name
-- Iteration 6 --
-array_map(): Argument #1 ($callback) must be a valid callback, function "isset" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "isset" not found or invalid function name
-- Iteration 7 --
-array_map(): Argument #1 ($callback) must be a valid callback, function "list" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "list" not found or invalid function name
-- Iteration 8 --
-array_map(): Argument #1 ($callback) must be a valid callback, function "print" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "print" not found or invalid function name
Done
diff --git a/ext/standard/tests/array/array_map_variation17.phpt b/ext/standard/tests/array/array_map_variation17.phpt
index a3aeb9f22a..78b8d8c5c8 100644
--- a/ext/standard/tests/array/array_map_variation17.phpt
+++ b/ext/standard/tests/array/array_map_variation17.phpt
@@ -76,62 +76,62 @@ echo "Done";
*** Testing array_map() : unexpected values for 'callback' argument ***
-- Iteration 1 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 2 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 3 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 4 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 5 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 6 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 7 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 8 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 9 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 10 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 11 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 12 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 13 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 14 --
-array_map(): Argument #1 ($callback) must be a valid callback, function "" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "" not found or invalid function name
-- Iteration 15 --
-array_map(): Argument #1 ($callback) must be a valid callback, function "" not found or invalid function name
+array_map(): Argument #1 ($callback) must be a valid callback or null, function "" not found or invalid function name
-- Iteration 16 --
-array_map(): Argument #1 ($callback) must be a valid callback, array must have exactly two members
+array_map(): Argument #1 ($callback) must be a valid callback or null, array must have exactly two members
-- Iteration 17 --
-array_map(): Argument #1 ($callback) must be a valid callback, first array member is not a valid class name or object
+array_map(): Argument #1 ($callback) must be a valid callback or null, first array member is not a valid class name or object
-- Iteration 18 --
-array_map(): Argument #1 ($callback) must be a valid callback, first array member is not a valid class name or object
+array_map(): Argument #1 ($callback) must be a valid callback or null, first array member is not a valid class name or object
-- Iteration 19 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
-- Iteration 20 --
-array_map(): Argument #1 ($callback) must be a valid callback, no array or string given
+array_map(): Argument #1 ($callback) must be a valid callback or null, no array or string given
Done
diff --git a/ext/standard/tests/array/array_map_variation4.phpt b/ext/standard/tests/array/array_map_variation4.phpt
index dadfbaafa1..ea495cbcd8 100644
--- a/ext/standard/tests/array/array_map_variation4.phpt
+++ b/ext/standard/tests/array/array_map_variation4.phpt
@@ -43,10 +43,6 @@ $arrays = array (
array(1 => "1"),
array(1 => "1", 2 => "2", 3 => "3", 4 => "4"),
- // arrays with float keys
-/*5*/ array(2.3333 => "float"),
- array(1.2 => "f1", 3.33 => "f2", 4.89999922839999 => "f3", 33333333.333333 => "f4"),
-
// arrays with string keys
array('\tHello' => 111, 're\td' => 'color', '\v\fworld' => 2.2, 'pen\n' => 33),
/*8*/ array("\tHello" => 111, "re\td" => "color", "\v\fworld" => 2.2, "pen\n" => 33),
@@ -102,22 +98,6 @@ array(4) {
string(1) "4"
}
-- Iteration 5 --
-array(1) {
- [2]=>
- string(5) "float"
-}
--- Iteration 6 --
-array(4) {
- [1]=>
- string(2) "f1"
- [3]=>
- string(2) "f2"
- [4]=>
- string(2) "f3"
- [33333333]=>
- string(2) "f4"
-}
--- Iteration 7 --
array(4) {
["\tHello"]=>
int(111)
@@ -128,7 +108,7 @@ array(4) {
["pen\n"]=>
int(33)
}
--- Iteration 8 --
+-- Iteration 6 --
array(4) {
[" Hello"]=>
int(111)
@@ -140,21 +120,21 @@ array(4) {
"]=>
int(33)
}
--- Iteration 9 --
+-- Iteration 7 --
array(2) {
[0]=>
string(5) "hello"
["Hello world"]=>
string(6) "string"
}
--- Iteration 10 --
+-- Iteration 8 --
array(2) {
[""]=>
string(5) "hello"
[5]=>
string(8) "resource"
}
--- Iteration 11 --
+-- Iteration 9 --
array(7) {
["hello"]=>
int(1)
diff --git a/ext/standard/tests/array/array_map_variation5.phpt b/ext/standard/tests/array/array_map_variation5.phpt
index 9b6a896fa9..c7ff35d9b2 100644
--- a/ext/standard/tests/array/array_map_variation5.phpt
+++ b/ext/standard/tests/array/array_map_variation5.phpt
@@ -48,8 +48,8 @@ $arrays = array (
array("f1" => 1.2, 'f2' => 3.33, 3 => 4.89999922839999, 'f4' => 33333333.3333),
// arrays with string values
- array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3.3 => "pen\n"),
-/*8*/ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3.3 => 'pen\n'),
+ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3 => "pen\n"),
+/*8*/ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3 => 'pen\n'),
array(1 => "hello", "heredoc" => $heredoc),
// array with object, unset variable and resource variable
diff --git a/ext/standard/tests/array/array_merge.phpt b/ext/standard/tests/array/array_merge.phpt
index b78da3082a..eced097818 100644
--- a/ext/standard/tests/array/array_merge.phpt
+++ b/ext/standard/tests/array/array_merge.phpt
@@ -9,10 +9,10 @@ $begin_array = array(
array(),
array( 1 => "string"),
array( "" => "string"),
- array( -2.44444 => 12),
+ array( -2 => 12),
array( "a" => 1, "b" => -2.344, "b" => "string", "c" => NULL, "d" => -2.344),
array( 4 => 1, 3 => -2.344, "3" => "string", "2" => NULL,1 => -2.344),
- array( NULL, 1.23 => "Hi", "string" => "hello",
+ array( NULL, 1 => "Hi", "string" => "hello",
array("" => "World", "-2.34" => "a", "0" => "b"))
);
@@ -20,10 +20,10 @@ $end_array = array(
array(),
array( 1 => "string"),
array( "" => "string"),
- array( -2.44444 => 12),
+ array( -2 => 12),
array( "a" => 1, "b" => -2.344, "b" => "string", "c" => NULL, "d" => -2.344),
array( 4 => 1, 3 => -2.344, "3" => "string", "2" => NULL, 1=> -2.344),
- array( NULL, 1.23 => "Hi", "string" => "hello",
+ array( NULL, 1 => "Hi", "string" => "hello",
array("" => "World", "-2.34" => "a", "0" => "b"))
);
@@ -35,7 +35,7 @@ foreach($begin_array as $first) {
foreach($end_array as $second) {
echo "\n-- Inner iteration $count_inner of Iteration $count_outer --\n";
$result = array_merge($first, $second);
- print_r($result);
+ var_dump($result);
$count_inner++;
}
$count_outer++;
@@ -84,549 +84,718 @@ echo "Done\n";
--- Iteration 0 ---
-- Inner iteration 0 of Iteration 0 --
-Array
-(
-)
+array(0) {
+}
-- Inner iteration 1 of Iteration 0 --
-Array
-(
- [0] => string
-)
+array(1) {
+ [0]=>
+ string(6) "string"
+}
-- Inner iteration 2 of Iteration 0 --
-Array
-(
- [] => string
-)
+array(1) {
+ [""]=>
+ string(6) "string"
+}
-- Inner iteration 3 of Iteration 0 --
-Array
-(
- [0] => 12
-)
+array(1) {
+ [0]=>
+ int(12)
+}
-- Inner iteration 4 of Iteration 0 --
-Array
-(
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
-)
+array(4) {
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+}
-- Inner iteration 5 of Iteration 0 --
-Array
-(
- [0] => 1
- [1] => string
- [2] =>
- [3] => -2.344
-)
+array(4) {
+ [0]=>
+ int(1)
+ [1]=>
+ string(6) "string"
+ [2]=>
+ NULL
+ [3]=>
+ float(-2.344)
+}
-- Inner iteration 6 of Iteration 0 --
-Array
-(
- [0] =>
- [1] => Hi
- [string] => hello
- [2] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
-)
+array(4) {
+ [0]=>
+ NULL
+ [1]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [2]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+}
--- Iteration 1 ---
-- Inner iteration 0 of Iteration 1 --
-Array
-(
- [0] => string
-)
+array(1) {
+ [0]=>
+ string(6) "string"
+}
-- Inner iteration 1 of Iteration 1 --
-Array
-(
- [0] => string
- [1] => string
-)
+array(2) {
+ [0]=>
+ string(6) "string"
+ [1]=>
+ string(6) "string"
+}
-- Inner iteration 2 of Iteration 1 --
-Array
-(
- [0] => string
- [] => string
-)
+array(2) {
+ [0]=>
+ string(6) "string"
+ [""]=>
+ string(6) "string"
+}
-- Inner iteration 3 of Iteration 1 --
-Array
-(
- [0] => string
- [1] => 12
-)
+array(2) {
+ [0]=>
+ string(6) "string"
+ [1]=>
+ int(12)
+}
-- Inner iteration 4 of Iteration 1 --
-Array
-(
- [0] => string
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
-)
+array(5) {
+ [0]=>
+ string(6) "string"
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+}
-- Inner iteration 5 of Iteration 1 --
-Array
-(
- [0] => string
- [1] => 1
- [2] => string
- [3] =>
- [4] => -2.344
-)
+array(5) {
+ [0]=>
+ string(6) "string"
+ [1]=>
+ int(1)
+ [2]=>
+ string(6) "string"
+ [3]=>
+ NULL
+ [4]=>
+ float(-2.344)
+}
-- Inner iteration 6 of Iteration 1 --
-Array
-(
- [0] => string
- [1] =>
- [2] => Hi
- [string] => hello
- [3] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
-)
+array(5) {
+ [0]=>
+ string(6) "string"
+ [1]=>
+ NULL
+ [2]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [3]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+}
--- Iteration 2 ---
-- Inner iteration 0 of Iteration 2 --
-Array
-(
- [] => string
-)
+array(1) {
+ [""]=>
+ string(6) "string"
+}
-- Inner iteration 1 of Iteration 2 --
-Array
-(
- [] => string
- [0] => string
-)
+array(2) {
+ [""]=>
+ string(6) "string"
+ [0]=>
+ string(6) "string"
+}
-- Inner iteration 2 of Iteration 2 --
-Array
-(
- [] => string
-)
+array(1) {
+ [""]=>
+ string(6) "string"
+}
-- Inner iteration 3 of Iteration 2 --
-Array
-(
- [] => string
- [0] => 12
-)
+array(2) {
+ [""]=>
+ string(6) "string"
+ [0]=>
+ int(12)
+}
-- Inner iteration 4 of Iteration 2 --
-Array
-(
- [] => string
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
-)
+array(5) {
+ [""]=>
+ string(6) "string"
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+}
-- Inner iteration 5 of Iteration 2 --
-Array
-(
- [] => string
- [0] => 1
- [1] => string
- [2] =>
- [3] => -2.344
-)
+array(5) {
+ [""]=>
+ string(6) "string"
+ [0]=>
+ int(1)
+ [1]=>
+ string(6) "string"
+ [2]=>
+ NULL
+ [3]=>
+ float(-2.344)
+}
-- Inner iteration 6 of Iteration 2 --
-Array
-(
- [] => string
- [0] =>
- [1] => Hi
- [string] => hello
- [2] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
-)
+array(5) {
+ [""]=>
+ string(6) "string"
+ [0]=>
+ NULL
+ [1]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [2]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+}
--- Iteration 3 ---
-- Inner iteration 0 of Iteration 3 --
-Array
-(
- [0] => 12
-)
+array(1) {
+ [0]=>
+ int(12)
+}
-- Inner iteration 1 of Iteration 3 --
-Array
-(
- [0] => 12
- [1] => string
-)
+array(2) {
+ [0]=>
+ int(12)
+ [1]=>
+ string(6) "string"
+}
-- Inner iteration 2 of Iteration 3 --
-Array
-(
- [0] => 12
- [] => string
-)
+array(2) {
+ [0]=>
+ int(12)
+ [""]=>
+ string(6) "string"
+}
-- Inner iteration 3 of Iteration 3 --
-Array
-(
- [0] => 12
- [1] => 12
-)
+array(2) {
+ [0]=>
+ int(12)
+ [1]=>
+ int(12)
+}
-- Inner iteration 4 of Iteration 3 --
-Array
-(
- [0] => 12
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
-)
+array(5) {
+ [0]=>
+ int(12)
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+}
-- Inner iteration 5 of Iteration 3 --
-Array
-(
- [0] => 12
- [1] => 1
- [2] => string
- [3] =>
- [4] => -2.344
-)
+array(5) {
+ [0]=>
+ int(12)
+ [1]=>
+ int(1)
+ [2]=>
+ string(6) "string"
+ [3]=>
+ NULL
+ [4]=>
+ float(-2.344)
+}
-- Inner iteration 6 of Iteration 3 --
-Array
-(
- [0] => 12
- [1] =>
- [2] => Hi
- [string] => hello
- [3] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
-)
+array(5) {
+ [0]=>
+ int(12)
+ [1]=>
+ NULL
+ [2]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [3]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+}
--- Iteration 4 ---
-- Inner iteration 0 of Iteration 4 --
-Array
-(
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
-)
+array(4) {
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+}
-- Inner iteration 1 of Iteration 4 --
-Array
-(
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
- [0] => string
-)
+array(5) {
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+ [0]=>
+ string(6) "string"
+}
-- Inner iteration 2 of Iteration 4 --
-Array
-(
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
- [] => string
-)
+array(5) {
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+ [""]=>
+ string(6) "string"
+}
-- Inner iteration 3 of Iteration 4 --
-Array
-(
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
- [0] => 12
-)
+array(5) {
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+ [0]=>
+ int(12)
+}
-- Inner iteration 4 of Iteration 4 --
-Array
-(
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
-)
+array(4) {
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+}
-- Inner iteration 5 of Iteration 4 --
-Array
-(
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
- [0] => 1
- [1] => string
- [2] =>
- [3] => -2.344
-)
+array(8) {
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+ [0]=>
+ int(1)
+ [1]=>
+ string(6) "string"
+ [2]=>
+ NULL
+ [3]=>
+ float(-2.344)
+}
-- Inner iteration 6 of Iteration 4 --
-Array
-(
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
- [0] =>
- [1] => Hi
- [string] => hello
- [2] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
-)
+array(8) {
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+ [0]=>
+ NULL
+ [1]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [2]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+}
--- Iteration 5 ---
-- Inner iteration 0 of Iteration 5 --
-Array
-(
- [0] => 1
- [1] => string
- [2] =>
- [3] => -2.344
-)
+array(4) {
+ [0]=>
+ int(1)
+ [1]=>
+ string(6) "string"
+ [2]=>
+ NULL
+ [3]=>
+ float(-2.344)
+}
-- Inner iteration 1 of Iteration 5 --
-Array
-(
- [0] => 1
- [1] => string
- [2] =>
- [3] => -2.344
- [4] => string
-)
+array(5) {
+ [0]=>
+ int(1)
+ [1]=>
+ string(6) "string"
+ [2]=>
+ NULL
+ [3]=>
+ float(-2.344)
+ [4]=>
+ string(6) "string"
+}
-- Inner iteration 2 of Iteration 5 --
-Array
-(
- [0] => 1
- [1] => string
- [2] =>
- [3] => -2.344
- [] => string
-)
+array(5) {
+ [0]=>
+ int(1)
+ [1]=>
+ string(6) "string"
+ [2]=>
+ NULL
+ [3]=>
+ float(-2.344)
+ [""]=>
+ string(6) "string"
+}
-- Inner iteration 3 of Iteration 5 --
-Array
-(
- [0] => 1
- [1] => string
- [2] =>
- [3] => -2.344
- [4] => 12
-)
+array(5) {
+ [0]=>
+ int(1)
+ [1]=>
+ string(6) "string"
+ [2]=>
+ NULL
+ [3]=>
+ float(-2.344)
+ [4]=>
+ int(12)
+}
-- Inner iteration 4 of Iteration 5 --
-Array
-(
- [0] => 1
- [1] => string
- [2] =>
- [3] => -2.344
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
-)
+array(8) {
+ [0]=>
+ int(1)
+ [1]=>
+ string(6) "string"
+ [2]=>
+ NULL
+ [3]=>
+ float(-2.344)
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+}
-- Inner iteration 5 of Iteration 5 --
-Array
-(
- [0] => 1
- [1] => string
- [2] =>
- [3] => -2.344
- [4] => 1
- [5] => string
- [6] =>
- [7] => -2.344
-)
+array(8) {
+ [0]=>
+ int(1)
+ [1]=>
+ string(6) "string"
+ [2]=>
+ NULL
+ [3]=>
+ float(-2.344)
+ [4]=>
+ int(1)
+ [5]=>
+ string(6) "string"
+ [6]=>
+ NULL
+ [7]=>
+ float(-2.344)
+}
-- Inner iteration 6 of Iteration 5 --
-Array
-(
- [0] => 1
- [1] => string
- [2] =>
- [3] => -2.344
- [4] =>
- [5] => Hi
- [string] => hello
- [6] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
-)
+array(8) {
+ [0]=>
+ int(1)
+ [1]=>
+ string(6) "string"
+ [2]=>
+ NULL
+ [3]=>
+ float(-2.344)
+ [4]=>
+ NULL
+ [5]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [6]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+}
--- Iteration 6 ---
-- Inner iteration 0 of Iteration 6 --
-Array
-(
- [0] =>
- [1] => Hi
- [string] => hello
- [2] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
-)
+array(4) {
+ [0]=>
+ NULL
+ [1]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [2]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+}
-- Inner iteration 1 of Iteration 6 --
-Array
-(
- [0] =>
- [1] => Hi
- [string] => hello
- [2] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
- [3] => string
-)
+array(5) {
+ [0]=>
+ NULL
+ [1]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [2]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+ [3]=>
+ string(6) "string"
+}
-- Inner iteration 2 of Iteration 6 --
-Array
-(
- [0] =>
- [1] => Hi
- [string] => hello
- [2] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
- [] => string
-)
+array(5) {
+ [0]=>
+ NULL
+ [1]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [2]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+ [""]=>
+ string(6) "string"
+}
-- Inner iteration 3 of Iteration 6 --
-Array
-(
- [0] =>
- [1] => Hi
- [string] => hello
- [2] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
- [3] => 12
-)
+array(5) {
+ [0]=>
+ NULL
+ [1]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [2]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+ [3]=>
+ int(12)
+}
-- Inner iteration 4 of Iteration 6 --
-Array
-(
- [0] =>
- [1] => Hi
- [string] => hello
- [2] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
- [a] => 1
- [b] => string
- [c] =>
- [d] => -2.344
-)
+array(8) {
+ [0]=>
+ NULL
+ [1]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [2]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ string(6) "string"
+ ["c"]=>
+ NULL
+ ["d"]=>
+ float(-2.344)
+}
-- Inner iteration 5 of Iteration 6 --
-Array
-(
- [0] =>
- [1] => Hi
- [string] => hello
- [2] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
- [3] => 1
- [4] => string
- [5] =>
- [6] => -2.344
-)
+array(8) {
+ [0]=>
+ NULL
+ [1]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [2]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+ [3]=>
+ int(1)
+ [4]=>
+ string(6) "string"
+ [5]=>
+ NULL
+ [6]=>
+ float(-2.344)
+}
-- Inner iteration 6 of Iteration 6 --
-Array
-(
- [0] =>
- [1] => Hi
- [string] => hello
- [2] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
- [3] =>
- [4] => Hi
- [5] => Array
- (
- [] => World
- [-2.34] => a
- [0] => b
- )
-
-)
+array(7) {
+ [0]=>
+ NULL
+ [1]=>
+ string(2) "Hi"
+ ["string"]=>
+ string(5) "hello"
+ [2]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+ [3]=>
+ NULL
+ [4]=>
+ string(2) "Hi"
+ [5]=>
+ array(3) {
+ [""]=>
+ string(5) "World"
+ ["-2.34"]=>
+ string(1) "a"
+ [0]=>
+ string(1) "b"
+ }
+}
*** Testing array_merge() with three or more arrays ***
array(12) {
diff --git a/ext/standard/tests/array/array_merge_recursive_variation4.phpt b/ext/standard/tests/array/array_merge_recursive_variation4.phpt
index 6208adabed..71f4a4d66f 100644
--- a/ext/standard/tests/array/array_merge_recursive_variation4.phpt
+++ b/ext/standard/tests/array/array_merge_recursive_variation4.phpt
@@ -35,10 +35,6 @@ $arrays = array (
array(0 => "0", 1 => array(1 => "one")),
array(1 => "1", 2 => array(1 => "one", 2 => "two", 3 => 1, 4 => "4")),
- // arrays with float keys
-/*3*/ array(2.3333 => "float", 44.44 => array(1.1 => "float")),
- array(1.2 => "f1", 3.33 => "f2", 4.89999922839999 => array(1.1 => "f1"), 3333333.333333 => "f4"),
-
// arrays with string keys
/*5*/ array('\tHello' => array("hello", 'world'), '\v\fworld' => 2.2, 'pen\n' => 111),
array("\tHello" => array("hello", 'world'), "\v\fworld" => 2.2, "pen\n" => 111),
@@ -162,86 +158,6 @@ array(6) {
}
-- Iteration 3 --
-- With default argument --
-array(2) {
- [0]=>
- string(5) "float"
- [1]=>
- array(1) {
- [1]=>
- string(5) "float"
- }
-}
--- With more arguments --
-array(6) {
- [0]=>
- string(5) "float"
- [1]=>
- array(1) {
- [1]=>
- string(5) "float"
- }
- [2]=>
- string(3) "one"
- [3]=>
- int(2)
- ["string"]=>
- string(5) "hello"
- ["array"]=>
- array(3) {
- [0]=>
- string(1) "a"
- [1]=>
- string(1) "b"
- [2]=>
- string(1) "c"
- }
-}
--- Iteration 4 --
--- With default argument --
-array(4) {
- [0]=>
- string(2) "f1"
- [1]=>
- string(2) "f2"
- [2]=>
- array(1) {
- [1]=>
- string(2) "f1"
- }
- [3]=>
- string(2) "f4"
-}
--- With more arguments --
-array(8) {
- [0]=>
- string(2) "f1"
- [1]=>
- string(2) "f2"
- [2]=>
- array(1) {
- [1]=>
- string(2) "f1"
- }
- [3]=>
- string(2) "f4"
- [4]=>
- string(3) "one"
- [5]=>
- int(2)
- ["string"]=>
- string(5) "hello"
- ["array"]=>
- array(3) {
- [0]=>
- string(1) "a"
- [1]=>
- string(1) "b"
- [2]=>
- string(1) "c"
- }
-}
--- Iteration 5 --
--- With default argument --
array(3) {
["\tHello"]=>
array(2) {
@@ -284,7 +200,7 @@ array(7) {
string(1) "c"
}
}
--- Iteration 6 --
+-- Iteration 4 --
-- With default argument --
array(3) {
[" Hello"]=>
@@ -330,7 +246,7 @@ array(7) {
string(1) "c"
}
}
--- Iteration 7 --
+-- Iteration 5 --
-- With default argument --
array(3) {
[0]=>
@@ -374,7 +290,7 @@ array(7) {
string(1) "c"
}
}
--- Iteration 8 --
+-- Iteration 6 --
-- With default argument --
array(4) {
[""]=>
diff --git a/ext/standard/tests/array/array_merge_recursive_variation5.phpt b/ext/standard/tests/array/array_merge_recursive_variation5.phpt
index 701817730c..617811b5f6 100644
--- a/ext/standard/tests/array/array_merge_recursive_variation5.phpt
+++ b/ext/standard/tests/array/array_merge_recursive_variation5.phpt
@@ -40,8 +40,8 @@ $arrays = array (
array("f1" => 1.2, 'f2' => 3.33, 3 => 4.89999922839999, 'f4' => array(1.2, 'f4' => 1.2)),
// arrays with string values
-/*5*/ array(111 => "\tHello", "array" => "col\tor", 2 => "\v\fworld", 3.3 => "\tHello"),
- array(111 => '\tHello', 'array' => 'col\tor', 2 => '\v\fworld', 3.3 => '\tHello'),
+/*5*/ array(111 => "\tHello", "array" => "col\tor", 2 => "\v\fworld", 3 => "\tHello"),
+ array(111 => '\tHello', 'array' => 'col\tor', 2 => '\v\fworld', 3 => '\tHello'),
array(1 => "hello", "string" => $heredoc, $heredoc),
// array with object, unset variable and resource variable
diff --git a/ext/standard/tests/array/array_merge_variation4.phpt b/ext/standard/tests/array/array_merge_variation4.phpt
index 456d80a2c7..e34bf73526 100644
--- a/ext/standard/tests/array/array_merge_variation4.phpt
+++ b/ext/standard/tests/array/array_merge_variation4.phpt
@@ -32,18 +32,6 @@ $inputs = array(
-2345 => 'negative',
),
- // float data
-/*2*/ 'float' => array(
- 10.5 => 'positive',
- -10.5 => 'negative',
- .5 => 'half',
- ),
-
-/*3*/ 'extreme floats' => array(
- 12.3456789000e10 => 'large',
- 12.3456789000E-10 => 'small',
- ),
-
// null data
/*4*/ 'null uppercase' => array(
NULL => 'null 1',
@@ -135,55 +123,7 @@ array(6) {
string(8) "negative"
}
--- Iteration 2: float data --
-array(5) {
- [0]=>
- string(8) "positive"
- [1]=>
- string(8) "negative"
- [2]=>
- string(4) "half"
- ["one"]=>
- int(1)
- ["two"]=>
- int(2)
-}
-array(5) {
- ["one"]=>
- int(1)
- ["two"]=>
- int(2)
- [0]=>
- string(8) "positive"
- [1]=>
- string(8) "negative"
- [2]=>
- string(4) "half"
-}
-
--- Iteration 3: extreme floats data --
-array(4) {
- [0]=>
- string(5) "large"
- [1]=>
- string(5) "small"
- ["one"]=>
- int(1)
- ["two"]=>
- int(2)
-}
-array(4) {
- ["one"]=>
- int(1)
- ["two"]=>
- int(2)
- [0]=>
- string(5) "large"
- [1]=>
- string(5) "small"
-}
-
--- Iteration 4: null uppercase data --
+-- Iteration 2: null uppercase data --
array(3) {
[""]=>
string(6) "null 1"
@@ -201,7 +141,7 @@ array(3) {
string(6) "null 1"
}
--- Iteration 5: null lowercase data --
+-- Iteration 3: null lowercase data --
array(3) {
[""]=>
string(6) "null 2"
@@ -219,7 +159,7 @@ array(3) {
string(6) "null 2"
}
--- Iteration 6: bool lowercase data --
+-- Iteration 4: bool lowercase data --
array(4) {
[0]=>
string(6) "lowert"
@@ -241,7 +181,7 @@ array(4) {
string(6) "lowerf"
}
--- Iteration 7: bool uppercase data --
+-- Iteration 5: bool uppercase data --
array(4) {
[0]=>
string(6) "uppert"
@@ -263,7 +203,7 @@ array(4) {
string(6) "upperf"
}
--- Iteration 8: empty double quotes data --
+-- Iteration 6: empty double quotes data --
array(3) {
[""]=>
string(6) "emptyd"
@@ -281,7 +221,7 @@ array(3) {
string(6) "emptyd"
}
--- Iteration 9: empty single quotes data --
+-- Iteration 7: empty single quotes data --
array(3) {
[""]=>
string(6) "emptys"
@@ -299,7 +239,7 @@ array(3) {
string(6) "emptys"
}
--- Iteration 10: string data --
+-- Iteration 8: string data --
array(5) {
["stringd"]=>
string(7) "stringd"
@@ -325,7 +265,7 @@ array(5) {
string(7) "stringh"
}
--- Iteration 11: undefined data --
+-- Iteration 9: undefined data --
array(3) {
[""]=>
string(9) "undefined"
@@ -343,7 +283,7 @@ array(3) {
string(9) "undefined"
}
--- Iteration 12: unset data --
+-- Iteration 10: unset data --
array(3) {
[""]=>
string(5) "unset"
diff --git a/ext/standard/tests/array/array_merge_variation7.phpt b/ext/standard/tests/array/array_merge_variation7.phpt
index 60642fc43e..a196effc75 100644
--- a/ext/standard/tests/array/array_merge_variation7.phpt
+++ b/ext/standard/tests/array/array_merge_variation7.phpt
@@ -11,7 +11,7 @@ echo "*** Testing array_merge() : usage variations ***\n";
//mixed keys
$arr1 = array('zero', 20 => 'twenty', 'thirty' => 30, true => 'bool');
-$arr2 = array(0, 1, 2, null => 'null', 1.234E-10 => 'float');
+$arr2 = array(0, 1, 2, null => 'null', 0 => 'float');
var_dump(array_merge($arr1, $arr2));
var_dump(array_merge($arr2, $arr1));
diff --git a/ext/standard/tests/array/array_pop.phpt b/ext/standard/tests/array/array_pop.phpt
index 843a618f2e..2066f1acb6 100644
--- a/ext/standard/tests/array/array_pop.phpt
+++ b/ext/standard/tests/array/array_pop.phpt
@@ -3,8 +3,6 @@ Test array_pop() function
--FILE--
<?php
-array_pop($GLOBALS);
-
$empty_array = array();
$number = 5;
$str = "abc";
@@ -19,12 +17,12 @@ $mixed_array = array(
array( "a" => "aaa", "A" => "AAA", "c" => "ccc", "d" => "ddd", "e" => "eee" ),
array( "1" => "one", "2" => "two", "3" => "three", "4" => "four", "5" => "five" ),
array( 1 => "one", 2 => "two", 3 => 7, 4 => "four", 5 => "five" ),
- array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2.4 => "float", "F" => "FFF",
- "blank" => "", 3.7 => 3.7, 5.4 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
+ array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2 => "float", "F" => "FFF",
+ "blank" => "", 3 => 3.7, 5 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
array( 12, "name", 'age', '45' ),
array( array("oNe", "tWo", 4), array(10, 20, 30, 40, 50), array() ),
array( "one" => 1, "one" => 2, "three" => 3, 3, 4, 3 => 33, 4 => 44, 5, 6,
- 5.4 => 54, 5.7 => 57, "5.4" => 554, "5.7" => 557 )
+ 5 => 57, "5.4" => 554, "5.7" => 557 )
);
/* Loop to test normal functionality with different arrays inputs */
@@ -34,7 +32,7 @@ $counter = 1;
foreach( $mixed_array as $sub_array )
{
echo "\n-- Input Array for Iteration $counter is --\n";
- print_r( $sub_array );
+ var_dump( $sub_array );
echo "\nOutput after Pop is :\n";
var_dump( array_pop($sub_array) );
$counter++;
@@ -46,173 +44,230 @@ echo"\nDone";
*** Normal testing with various array inputs ***
-- Input Array for Iteration 1 is --
-Array
-(
-)
+array(0) {
+}
Output after Pop is :
NULL
-- Input Array for Iteration 2 is --
-Array
-(
- [0] => 1
- [1] => 2
- [2] => 3
- [3] => 4
- [4] => 5
- [5] => 6
- [6] => 7
- [7] => 8
- [8] => 9
-)
+array(9) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+ [3]=>
+ int(4)
+ [4]=>
+ int(5)
+ [5]=>
+ int(6)
+ [6]=>
+ int(7)
+ [7]=>
+ int(8)
+ [8]=>
+ int(9)
+}
Output after Pop is :
int(9)
-- Input Array for Iteration 3 is --
-Array
-(
- [0] => One
- [1] => _Two
- [2] => Three
- [3] => Four
- [4] => Five
-)
+array(5) {
+ [0]=>
+ string(3) "One"
+ [1]=>
+ string(4) "_Two"
+ [2]=>
+ string(5) "Three"
+ [3]=>
+ string(4) "Four"
+ [4]=>
+ string(4) "Five"
+}
Output after Pop is :
string(4) "Five"
-- Input Array for Iteration 4 is --
-Array
-(
- [0] => 6
- [1] => six
- [2] => 7
- [3] => seven
- [4] => 8
- [5] => eight
- [6] => 9
- [7] => nine
-)
+array(8) {
+ [0]=>
+ int(6)
+ [1]=>
+ string(3) "six"
+ [2]=>
+ int(7)
+ [3]=>
+ string(5) "seven"
+ [4]=>
+ int(8)
+ [5]=>
+ string(5) "eight"
+ [6]=>
+ int(9)
+ [7]=>
+ string(4) "nine"
+}
Output after Pop is :
string(4) "nine"
-- Input Array for Iteration 5 is --
-Array
-(
- [a] => aaa
- [A] => AAA
- [c] => ccc
- [d] => ddd
- [e] => eee
-)
+array(5) {
+ ["a"]=>
+ string(3) "aaa"
+ ["A"]=>
+ string(3) "AAA"
+ ["c"]=>
+ string(3) "ccc"
+ ["d"]=>
+ string(3) "ddd"
+ ["e"]=>
+ string(3) "eee"
+}
Output after Pop is :
string(3) "eee"
-- Input Array for Iteration 6 is --
-Array
-(
- [1] => one
- [2] => two
- [3] => three
- [4] => four
- [5] => five
-)
+array(5) {
+ [1]=>
+ string(3) "one"
+ [2]=>
+ string(3) "two"
+ [3]=>
+ string(5) "three"
+ [4]=>
+ string(4) "four"
+ [5]=>
+ string(4) "five"
+}
Output after Pop is :
string(4) "five"
-- Input Array for Iteration 7 is --
-Array
-(
- [1] => one
- [2] => two
- [3] => 7
- [4] => four
- [5] => five
-)
+array(5) {
+ [1]=>
+ string(3) "one"
+ [2]=>
+ string(3) "two"
+ [3]=>
+ int(7)
+ [4]=>
+ string(4) "four"
+ [5]=>
+ string(4) "five"
+}
Output after Pop is :
string(4) "five"
-- Input Array for Iteration 8 is --
-Array
-(
- [f] => fff
- [1] => one
- [4] => 6
- [] => 3
- [2] => float
- [F] => FFF
- [blank] =>
- [3] => 3.7
- [5] => Five
- [6] => 8.6
- [4name] => jonny
- [a] =>
-)
+array(12) {
+ ["f"]=>
+ string(3) "fff"
+ [1]=>
+ string(3) "one"
+ [4]=>
+ int(6)
+ [""]=>
+ int(3)
+ [2]=>
+ string(5) "float"
+ ["F"]=>
+ string(3) "FFF"
+ ["blank"]=>
+ string(0) ""
+ [3]=>
+ float(3.7)
+ [5]=>
+ string(4) "Five"
+ [6]=>
+ float(8.6)
+ ["4name"]=>
+ string(5) "jonny"
+ ["a"]=>
+ NULL
+}
Output after Pop is :
NULL
-- Input Array for Iteration 9 is --
-Array
-(
- [0] => 12
- [1] => name
- [2] => age
- [3] => 45
-)
+array(4) {
+ [0]=>
+ int(12)
+ [1]=>
+ string(4) "name"
+ [2]=>
+ string(3) "age"
+ [3]=>
+ string(2) "45"
+}
Output after Pop is :
string(2) "45"
-- Input Array for Iteration 10 is --
-Array
-(
- [0] => Array
- (
- [0] => oNe
- [1] => tWo
- [2] => 4
- )
-
- [1] => Array
- (
- [0] => 10
- [1] => 20
- [2] => 30
- [3] => 40
- [4] => 50
- )
-
- [2] => Array
- (
- )
-
-)
+array(3) {
+ [0]=>
+ array(3) {
+ [0]=>
+ string(3) "oNe"
+ [1]=>
+ string(3) "tWo"
+ [2]=>
+ int(4)
+ }
+ [1]=>
+ array(5) {
+ [0]=>
+ int(10)
+ [1]=>
+ int(20)
+ [2]=>
+ int(30)
+ [3]=>
+ int(40)
+ [4]=>
+ int(50)
+ }
+ [2]=>
+ array(0) {
+ }
+}
Output after Pop is :
array(0) {
}
-- Input Array for Iteration 11 is --
-Array
-(
- [one] => 2
- [three] => 3
- [0] => 3
- [1] => 4
- [3] => 33
- [4] => 44
- [5] => 57
- [6] => 6
- [5.4] => 554
- [5.7] => 557
-)
+array(10) {
+ ["one"]=>
+ int(2)
+ ["three"]=>
+ int(3)
+ [0]=>
+ int(3)
+ [1]=>
+ int(4)
+ [3]=>
+ int(33)
+ [4]=>
+ int(44)
+ [5]=>
+ int(57)
+ [6]=>
+ int(6)
+ ["5.4"]=>
+ int(554)
+ ["5.7"]=>
+ int(557)
+}
Output after Pop is :
int(557)
diff --git a/ext/standard/tests/array/array_pop_variation.phpt b/ext/standard/tests/array/array_pop_variation.phpt
index c2e30cb7a3..af8b0cc0f9 100644
--- a/ext/standard/tests/array/array_pop_variation.phpt
+++ b/ext/standard/tests/array/array_pop_variation.phpt
@@ -12,12 +12,12 @@ $mixed_array = array(
array( "a" => "aaa", "A" => "AAA", "c" => "ccc", "d" => "ddd", "e" => "eee" ),
array( "1" => "one", "2" => "two", "3" => "three", "4" => "four", "5" => "five" ),
array( 1 => "one", 2 => "two", 3 => 7, 4 => "four", 5 => "five" ),
- array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2.4 => "float", "F" => "FFF",
- "blank" => "", 3.7 => 3.7, 5.4 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
+ array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2 => "float", "F" => "FFF",
+ "blank" => "", 3 => 3.7, 5 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
array( 12, "name", 'age', '45' ),
array( array("oNe", "tWo", 4), array(10, 20, 30, 40, 50), array() ),
array( "one" => 1, "one" => 2, "three" => 3, 3, 4, 3 => 33, 4 => 44, 5, 6,
- 5.4 => 54, 5.7 => 57, "5.4" => 554, "5.7" => 557 )
+ 5 => 57, "5.4" => 554, "5.7" => 557 )
);
echo"\n*** Checking for internal array pointer being reset when pop is called ***\n";
diff --git a/ext/standard/tests/array/array_push.phpt b/ext/standard/tests/array/array_push.phpt
index 67a2f2019b..1c560adc51 100644
--- a/ext/standard/tests/array/array_push.phpt
+++ b/ext/standard/tests/array/array_push.phpt
@@ -17,12 +17,12 @@ $mixed_array = array(
array( "a" => "aaa", "A" => "AAA", "c" => "ccc", "d" => "ddd", "e" => "eee" ),
array( "1" => "one", "2" => "two", "3" => "three", "4" => "four", "5" => "five" ),
array( 1 => "one", 2 => "two", 3 => 7, 4 => "four", 5 => "five" ),
- array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2.4 => "float", "F" => "FFF",
- "blank" => "", 3.7 => 3.7, 5.4 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
+ array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2 => "float", "F" => "FFF",
+ "blank" => "", 3 => 3.7, 5 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
array( 12, "name", 'age', '45' ),
array( array("oNe", "tWo", 4), array(10, 20, 30, 40, 50), array() ),
array( "one" => 1, "one" => 2, "three" => 3, 3, 4, 3 => 33, 4 => 44, 5, 6,
- 5.4 => 54, 5.7 => 57, "5.4" => 554, "5.7" => 557 )
+ 5 => 57, "5.4" => 554, "5.7" => 557 )
);
/* Error Conditions */
@@ -42,7 +42,7 @@ $counter = 1;
foreach( $mixed_array as $sub_array )
{
echo "\n-- Input Array for Iteration $counter is --\n";
- print_r( $sub_array );
+ var_dump( $sub_array );
echo "\nOutput after push is :\n";
var_dump( array_push($sub_array, 22, "abc") );
$counter++;
@@ -63,174 +63,233 @@ int(1)
*** Testing with various array inputs ***
-- Input Array for Iteration 1 is --
-Array
-(
-)
+array(0) {
+}
Output after push is :
int(2)
-- Input Array for Iteration 2 is --
-Array
-(
- [0] => 1
- [1] => 2
- [2] => 3
- [3] => 4
- [4] => 5
- [5] => 6
- [6] => 7
- [7] => 8
- [8] => 9
- [9] => 1
- [10] => 2
-)
+array(11) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+ [3]=>
+ int(4)
+ [4]=>
+ int(5)
+ [5]=>
+ int(6)
+ [6]=>
+ int(7)
+ [7]=>
+ int(8)
+ [8]=>
+ int(9)
+ [9]=>
+ int(1)
+ [10]=>
+ int(2)
+}
Output after push is :
int(13)
-- Input Array for Iteration 3 is --
-Array
-(
- [0] => One
- [1] => _Two
- [2] => Three
- [3] => Four
- [4] => Five
-)
+array(5) {
+ [0]=>
+ string(3) "One"
+ [1]=>
+ string(4) "_Two"
+ [2]=>
+ string(5) "Three"
+ [3]=>
+ string(4) "Four"
+ [4]=>
+ string(4) "Five"
+}
Output after push is :
int(7)
-- Input Array for Iteration 4 is --
-Array
-(
- [0] => 6
- [1] => six
- [2] => 7
- [3] => seven
- [4] => 8
- [5] => eight
- [6] => 9
- [7] => nine
-)
+array(8) {
+ [0]=>
+ int(6)
+ [1]=>
+ string(3) "six"
+ [2]=>
+ int(7)
+ [3]=>
+ string(5) "seven"
+ [4]=>
+ int(8)
+ [5]=>
+ string(5) "eight"
+ [6]=>
+ int(9)
+ [7]=>
+ string(4) "nine"
+}
Output after push is :
int(10)
-- Input Array for Iteration 5 is --
-Array
-(
- [a] => aaa
- [A] => AAA
- [c] => ccc
- [d] => ddd
- [e] => eee
-)
+array(5) {
+ ["a"]=>
+ string(3) "aaa"
+ ["A"]=>
+ string(3) "AAA"
+ ["c"]=>
+ string(3) "ccc"
+ ["d"]=>
+ string(3) "ddd"
+ ["e"]=>
+ string(3) "eee"
+}
Output after push is :
int(7)
-- Input Array for Iteration 6 is --
-Array
-(
- [1] => one
- [2] => two
- [3] => three
- [4] => four
- [5] => five
-)
+array(5) {
+ [1]=>
+ string(3) "one"
+ [2]=>
+ string(3) "two"
+ [3]=>
+ string(5) "three"
+ [4]=>
+ string(4) "four"
+ [5]=>
+ string(4) "five"
+}
Output after push is :
int(7)
-- Input Array for Iteration 7 is --
-Array
-(
- [1] => one
- [2] => two
- [3] => 7
- [4] => four
- [5] => five
-)
+array(5) {
+ [1]=>
+ string(3) "one"
+ [2]=>
+ string(3) "two"
+ [3]=>
+ int(7)
+ [4]=>
+ string(4) "four"
+ [5]=>
+ string(4) "five"
+}
Output after push is :
int(7)
-- Input Array for Iteration 8 is --
-Array
-(
- [f] => fff
- [1] => one
- [4] => 6
- [] => 3
- [2] => float
- [F] => FFF
- [blank] =>
- [3] => 3.7
- [5] => Five
- [6] => 8.6
- [4name] => jonny
- [a] =>
-)
+array(12) {
+ ["f"]=>
+ string(3) "fff"
+ [1]=>
+ string(3) "one"
+ [4]=>
+ int(6)
+ [""]=>
+ int(3)
+ [2]=>
+ string(5) "float"
+ ["F"]=>
+ string(3) "FFF"
+ ["blank"]=>
+ string(0) ""
+ [3]=>
+ float(3.7)
+ [5]=>
+ string(4) "Five"
+ [6]=>
+ float(8.6)
+ ["4name"]=>
+ string(5) "jonny"
+ ["a"]=>
+ NULL
+}
Output after push is :
int(14)
-- Input Array for Iteration 9 is --
-Array
-(
- [0] => 12
- [1] => name
- [2] => age
- [3] => 45
-)
+array(4) {
+ [0]=>
+ int(12)
+ [1]=>
+ string(4) "name"
+ [2]=>
+ string(3) "age"
+ [3]=>
+ string(2) "45"
+}
Output after push is :
int(6)
-- Input Array for Iteration 10 is --
-Array
-(
- [0] => Array
- (
- [0] => oNe
- [1] => tWo
- [2] => 4
- )
-
- [1] => Array
- (
- [0] => 10
- [1] => 20
- [2] => 30
- [3] => 40
- [4] => 50
- )
-
- [2] => Array
- (
- )
-
-)
+array(3) {
+ [0]=>
+ array(3) {
+ [0]=>
+ string(3) "oNe"
+ [1]=>
+ string(3) "tWo"
+ [2]=>
+ int(4)
+ }
+ [1]=>
+ array(5) {
+ [0]=>
+ int(10)
+ [1]=>
+ int(20)
+ [2]=>
+ int(30)
+ [3]=>
+ int(40)
+ [4]=>
+ int(50)
+ }
+ [2]=>
+ array(0) {
+ }
+}
Output after push is :
int(5)
-- Input Array for Iteration 11 is --
-Array
-(
- [one] => 2
- [three] => 3
- [0] => 3
- [1] => 4
- [3] => 33
- [4] => 44
- [5] => 57
- [6] => 6
- [5.4] => 554
- [5.7] => 557
-)
+array(10) {
+ ["one"]=>
+ int(2)
+ ["three"]=>
+ int(3)
+ [0]=>
+ int(3)
+ [1]=>
+ int(4)
+ [3]=>
+ int(33)
+ [4]=>
+ int(44)
+ [5]=>
+ int(57)
+ [6]=>
+ int(6)
+ ["5.4"]=>
+ int(554)
+ ["5.7"]=>
+ int(557)
+}
Output after push is :
int(12)
diff --git a/ext/standard/tests/array/array_push_variation6.phpt b/ext/standard/tests/array/array_push_variation6.phpt
index b8cce79821..610e4efaa0 100644
--- a/ext/standard/tests/array/array_push_variation6.phpt
+++ b/ext/standard/tests/array/array_push_variation6.phpt
@@ -31,18 +31,6 @@ $inputs = array(
-2345 => 'negative',
),
- // float data
-/*2*/ 'float' => array(
- 10.5 => 'positive',
- -10.5 => 'negative',
- .5 => 'half',
- ),
-
- 'extreme floats' => array(
- 12.3456789000e10 => 'large',
- 12.3456789000E-10 => 'small',
- ),
-
// null data
/*3*/ 'null uppercase' => array(
NULL => 'null 1',
@@ -107,47 +95,39 @@ echo "Done";
Before : int(4)
After : int(5)
--- Iteration 2 : float data --
-Before : int(3)
-After : int(4)
-
--- Iteration 3 : extreme floats data --
-Before : int(2)
-After : int(3)
-
--- Iteration 4 : null uppercase data --
+-- Iteration 2 : null uppercase data --
Before : int(1)
After : int(2)
--- Iteration 5 : null lowercase data --
+-- Iteration 3 : null lowercase data --
Before : int(1)
After : int(2)
--- Iteration 6 : bool lowercase data --
+-- Iteration 4 : bool lowercase data --
Before : int(2)
After : int(3)
--- Iteration 7 : bool uppercase data --
+-- Iteration 5 : bool uppercase data --
Before : int(2)
After : int(3)
--- Iteration 8 : empty double quotes data --
+-- Iteration 6 : empty double quotes data --
Before : int(1)
After : int(2)
--- Iteration 9 : empty single quotes data --
+-- Iteration 7 : empty single quotes data --
Before : int(1)
After : int(2)
--- Iteration 10 : string data --
+-- Iteration 8 : string data --
Before : int(3)
After : int(4)
--- Iteration 11 : undefined data --
+-- Iteration 9 : undefined data --
Before : int(1)
After : int(2)
--- Iteration 12 : unset data --
+-- Iteration 10 : unset data --
Before : int(1)
After : int(2)
Done
diff --git a/ext/standard/tests/array/array_rand_variation4.phpt b/ext/standard/tests/array/array_rand_variation4.phpt
index 1ddcec1933..a714244766 100644
--- a/ext/standard/tests/array/array_rand_variation4.phpt
+++ b/ext/standard/tests/array/array_rand_variation4.phpt
@@ -14,8 +14,7 @@ $asso_arrays = array(
// array with numeric keys
/*1*/ array(1 => 'one', 2 => 2, 1234567890 => 'big', -1 => 'negative key',
- 2.3 => 'float key', 0 => "zero key", 0.2 => 'decimal key',
- 2e2 => 'exp key1', -2e3 => 'negative exp key'),
+ 0 => "zero key"),
// array with string keys
array('one' => 1, "two" => 2.0, "three" => 'three',
diff --git a/ext/standard/tests/array/array_rand_variation5.phpt b/ext/standard/tests/array/array_rand_variation5.phpt
index 4a4295c615..57f5ee03af 100644
--- a/ext/standard/tests/array/array_rand_variation5.phpt
+++ b/ext/standard/tests/array/array_rand_variation5.phpt
@@ -12,8 +12,7 @@ echo "*** Testing array_rand() : with invalid values for 'req_num' ***\n";
// initialise associative arrays
$input = array(
- 1 => 'one', 2.2 => 'float key', 0.9 => 'decimal key',
- 2e2 => 'exp key1', 2000e-3 => 'negative exp key',
+ 1 => 'one',
0xabc => 2748, 0x12f => '303', 0xff => "255",
0123 => 83, 012 => 10, 010 => "8"
);
diff --git a/ext/standard/tests/array/array_reverse_variation4.phpt b/ext/standard/tests/array/array_reverse_variation4.phpt
index 861b5972a4..9a4fcbffbb 100644
--- a/ext/standard/tests/array/array_reverse_variation4.phpt
+++ b/ext/standard/tests/array/array_reverse_variation4.phpt
@@ -39,10 +39,6 @@ $arrays = array (
array(1 => "1"),
array(1 => "1", 2 => "2", 3 => "3", 4 => "4"),
- // arrays with float keys
-/*5*/ array(2.3333 => "float"),
- array(1.2 => "f1", 3.33 => "f2", 4.89999922839999 => "f3", 33333333.333333 => "f4"),
-
// arrays with string keys
array("\tHello" => 111, "re\td" => "color", "\v\fworld" => 2.2, "pen\n" => 33),
/*8*/ array("\tHello" => 111, "re\td" => "color", "\v\fworld" => 2.2, "pen\n" => 33),
@@ -159,56 +155,6 @@ array(4) {
}
-- Iteration 5 --
- default argument -
-array(1) {
- [0]=>
- string(5) "float"
-}
-- $preserve keys = true -
-array(1) {
- [2]=>
- string(5) "float"
-}
-- $preserve_keys = false -
-array(1) {
- [0]=>
- string(5) "float"
-}
--- Iteration 6 --
-- default argument -
-array(4) {
- [0]=>
- string(2) "f4"
- [1]=>
- string(2) "f3"
- [2]=>
- string(2) "f2"
- [3]=>
- string(2) "f1"
-}
-- $preserve keys = true -
-array(4) {
- [33333333]=>
- string(2) "f4"
- [4]=>
- string(2) "f3"
- [3]=>
- string(2) "f2"
- [1]=>
- string(2) "f1"
-}
-- $preserve_keys = false -
-array(4) {
- [0]=>
- string(2) "f4"
- [1]=>
- string(2) "f3"
- [2]=>
- string(2) "f2"
- [3]=>
- string(2) "f1"
-}
--- Iteration 7 --
-- default argument -
array(4) {
["pen
"]=>
@@ -244,7 +190,7 @@ array(4) {
[" Hello"]=>
int(111)
}
--- Iteration 8 --
+-- Iteration 6 --
- default argument -
array(4) {
["pen
@@ -281,7 +227,7 @@ array(4) {
[" Hello"]=>
int(111)
}
--- Iteration 9 --
+-- Iteration 7 --
- default argument -
array(2) {
["Hello world"]=>
@@ -303,7 +249,7 @@ array(2) {
[0]=>
string(5) "hello"
}
--- Iteration 10 --
+-- Iteration 8 --
- default argument -
array(2) {
[0]=>
@@ -325,7 +271,7 @@ array(2) {
[""]=>
string(5) "hello"
}
--- Iteration 11 --
+-- Iteration 9 --
- default argument -
array(7) {
["Hello world"]=>
diff --git a/ext/standard/tests/array/array_reverse_variation5.phpt b/ext/standard/tests/array/array_reverse_variation5.phpt
index d5651e4551..dcefab26a3 100644
--- a/ext/standard/tests/array/array_reverse_variation5.phpt
+++ b/ext/standard/tests/array/array_reverse_variation5.phpt
@@ -47,8 +47,8 @@ $arrays = array (
array("f1" => 1.2, 'f2' => 3.33, 3 => 4.89999922839999, 'f4' => 33333333.333333),
// arrays with string values
- array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3.3 => "pen\n"),
-/*8*/ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3.3 => 'pen\n'),
+ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3 => "pen\n"),
+/*8*/ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3 => 'pen\n'),
array(1 => "hello", "heredoc" => $heredoc),
// array with object, unset variable and resource variable
diff --git a/ext/standard/tests/array/array_search_variation1.phpt b/ext/standard/tests/array/array_search_variation1.phpt
index d62501f418..a2838810a1 100644
--- a/ext/standard/tests/array/array_search_variation1.phpt
+++ b/ext/standard/tests/array/array_search_variation1.phpt
@@ -9,7 +9,7 @@ $arrays = array (
array(0),
array("a" => "A", 2 => "B", "C" => 3, 4 => 4, "one" => 1, "" => NULL, "b", "ab", "abcd"),
array(4, array(1, 2 => 3), "one" => 1, "5" => 5 ),
- array(-1, -2, -3, -4, -2.989888, "-0.005" => "neg0.005", 2.0 => "float2", "-.9" => -.9),
+ array(-1, -2, -3, -4, -2.989888, "-0.005" => "neg0.005", 2 => "float2", "-.9" => -.9),
array(TRUE, FALSE),
array("", array()),
array("abcd\x00abcd\x00abcd"),
diff --git a/ext/standard/tests/array/array_search_variation2.phpt b/ext/standard/tests/array/array_search_variation2.phpt
index 84928c5922..c391989f32 100644
--- a/ext/standard/tests/array/array_search_variation2.phpt
+++ b/ext/standard/tests/array/array_search_variation2.phpt
@@ -12,7 +12,7 @@ $misc_array = array (
3,
".001" =>-67,
"-.051" =>"k",
- 0.091 =>"-.08",
+ 0 =>"-.08",
"e" =>"5",
"y" =>NULL,
NULL =>"",
diff --git a/ext/standard/tests/array/array_shift_variation3.phpt b/ext/standard/tests/array/array_shift_variation3.phpt
index bc06b41d01..e43bc86858 100644
--- a/ext/standard/tests/array/array_shift_variation3.phpt
+++ b/ext/standard/tests/array/array_shift_variation3.phpt
@@ -28,18 +28,6 @@ $inputs = array(
-2345 => 'negative',
),
- // float data
-/*2*/ 'float' => array(
- 10.5 => 'positive',
- -10.5 => 'negative',
- .5 => 'half',
- ),
-
-/*3*/ 'extreme floats' => array(
- 12.3456789000e10 => 'large',
- 12.3456789000E-10 => 'small',
- ),
-
// null data
/*4*/ 'null uppercase' => array(
NULL => 'null 1',
@@ -112,57 +100,41 @@ array(3) {
string(8) "negative"
}
--- Iteration 2 : float data --
-string(8) "positive"
-array(2) {
- [0]=>
- string(8) "negative"
- [1]=>
- string(4) "half"
-}
-
--- Iteration 3 : extreme floats data --
-string(5) "large"
-array(1) {
- [0]=>
- string(5) "small"
-}
-
--- Iteration 4 : null uppercase data --
+-- Iteration 2 : null uppercase data --
string(6) "null 1"
array(0) {
}
--- Iteration 5 : null lowercase data --
+-- Iteration 3 : null lowercase data --
string(6) "null 2"
array(0) {
}
--- Iteration 6 : bool lowercase data --
+-- Iteration 4 : bool lowercase data --
string(6) "lowert"
array(1) {
[0]=>
string(6) "lowerf"
}
--- Iteration 7 : bool uppercase data --
+-- Iteration 5 : bool uppercase data --
string(6) "uppert"
array(1) {
[0]=>
string(6) "upperf"
}
--- Iteration 8 : empty double quotes data --
+-- Iteration 6 : empty double quotes data --
string(6) "emptyd"
array(0) {
}
--- Iteration 9 : empty single quotes data --
+-- Iteration 7 : empty single quotes data --
string(6) "emptys"
array(0) {
}
--- Iteration 10 : string data --
+-- Iteration 8 : string data --
string(7) "stringd"
array(2) {
["strings"]=>
@@ -171,12 +143,12 @@ array(2) {
string(7) "stringh"
}
--- Iteration 11 : undefined data --
+-- Iteration 9 : undefined data --
string(9) "undefined"
array(0) {
}
--- Iteration 12 : unset data --
+-- Iteration 10 : unset data --
string(5) "unset"
array(0) {
}
diff --git a/ext/standard/tests/array/array_slice.phpt b/ext/standard/tests/array/array_slice.phpt
index a76277883a..f12f6d62fa 100644
--- a/ext/standard/tests/array/array_slice.phpt
+++ b/ext/standard/tests/array/array_slice.phpt
@@ -11,8 +11,8 @@ $var_array = array(
array( "a" => "aaa", "A" => "AAA", "c" => "ccc", "d" => "ddd", "e" => "eee"),
array("1" => "one", "2" => "two", "3" => "three", "4" => "four", "5" => "five"),
array(1 => "one", 2 => "two", 3 => 7, 4 => "four", 5 => "five"),
- array("f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2.4 => "float", "F" => "FFF",
- "blank" => "", 3.7 => 3.7, 5.4 => 7, 6 => 8.6, '5' => "Five"),
+ array("f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2 => "float", "F" => "FFF",
+ "blank" => "", 3 => 3.7, 5 => 7, 6 => 8.6, '5' => "Five"),
array(12, "name", 'age', '45'),
array( array("oNe", "tWo", 4), array(10, 20, 30, 40, 50), array())
);
diff --git a/ext/standard/tests/array/array_slice_variation7.phpt b/ext/standard/tests/array/array_slice_variation7.phpt
index a579f292ef..d0db376ad5 100644
--- a/ext/standard/tests/array/array_slice_variation7.phpt
+++ b/ext/standard/tests/array/array_slice_variation7.phpt
@@ -33,18 +33,6 @@ $inputs = array(
-2345 => 'negative',
),
- // float data
-/*2*/ 'float' => array(
- 10.5 => 'positive',
- -10.5 => 'negative',
- .5 => 'half',
- ),
-
-/*3*/ 'extreme floats' => array(
- 12.3456789000e6 => 'large',
- 12.3456789000E-10 => 'small',
- ),
-
// null data
/*4*/ 'null uppercase' => array(
NULL => 'null 1',
@@ -132,43 +120,7 @@ array(4) {
string(8) "negative"
}
--- Iteration 2 : key type is float --
-$preserve_keys = TRUE
-array(3) {
- [10]=>
- string(8) "positive"
- [-10]=>
- string(8) "negative"
- [0]=>
- string(4) "half"
-}
-$preserve_keys = FALSE
-array(3) {
- [0]=>
- string(8) "positive"
- [1]=>
- string(8) "negative"
- [2]=>
- string(4) "half"
-}
-
--- Iteration 3 : key type is extreme floats --
-$preserve_keys = TRUE
-array(2) {
- [12345678]=>
- string(5) "large"
- [0]=>
- string(5) "small"
-}
-$preserve_keys = FALSE
-array(2) {
- [0]=>
- string(5) "large"
- [1]=>
- string(5) "small"
-}
-
--- Iteration 4 : key type is null uppercase --
+-- Iteration 2 : key type is null uppercase --
$preserve_keys = TRUE
array(1) {
[""]=>
@@ -180,7 +132,7 @@ array(1) {
string(6) "null 1"
}
--- Iteration 5 : key type is null lowercase --
+-- Iteration 3 : key type is null lowercase --
$preserve_keys = TRUE
array(1) {
[""]=>
@@ -192,7 +144,7 @@ array(1) {
string(6) "null 2"
}
--- Iteration 6 : key type is bool lowercase --
+-- Iteration 4 : key type is bool lowercase --
$preserve_keys = TRUE
array(2) {
[1]=>
@@ -208,7 +160,7 @@ array(2) {
string(6) "lowerf"
}
--- Iteration 7 : key type is bool uppercase --
+-- Iteration 5 : key type is bool uppercase --
$preserve_keys = TRUE
array(2) {
[1]=>
@@ -224,7 +176,7 @@ array(2) {
string(6) "upperf"
}
--- Iteration 8 : key type is empty double quotes --
+-- Iteration 6 : key type is empty double quotes --
$preserve_keys = TRUE
array(1) {
[""]=>
@@ -236,7 +188,7 @@ array(1) {
string(6) "emptyd"
}
--- Iteration 9 : key type is empty single quotes --
+-- Iteration 7 : key type is empty single quotes --
$preserve_keys = TRUE
array(1) {
[""]=>
@@ -248,7 +200,7 @@ array(1) {
string(6) "emptys"
}
--- Iteration 10 : key type is string --
+-- Iteration 8 : key type is string --
$preserve_keys = TRUE
array(3) {
["stringd"]=>
@@ -268,7 +220,7 @@ array(3) {
string(7) "stringh"
}
--- Iteration 11 : key type is undefined --
+-- Iteration 9 : key type is undefined --
$preserve_keys = TRUE
array(1) {
[""]=>
@@ -280,7 +232,7 @@ array(1) {
string(9) "undefined"
}
--- Iteration 12 : key type is unset --
+-- Iteration 10 : key type is unset --
$preserve_keys = TRUE
array(1) {
[""]=>
diff --git a/ext/standard/tests/array/array_udiff_assoc_variation.phpt b/ext/standard/tests/array/array_udiff_assoc_variation.phpt
index 83af4bce95..9250f5957b 100644
--- a/ext/standard/tests/array/array_udiff_assoc_variation.phpt
+++ b/ext/standard/tests/array/array_udiff_assoc_variation.phpt
@@ -8,7 +8,7 @@ include('compare_function.inc');
$key_compare_function = 'compare_function';
// Initialise all required variables
-$arr1 = array("one" => "one", "02" => "two", '3' => "three", "four", "0.5" => 5, 6.0 => 6, "seven" => "07");
+$arr1 = array("one" => "one", "02" => "two", '3' => "three", "four", "0.5" => 5, 6 => 6, "seven" => "07");
$arr2 = array("one" => "one", "02" => "two", '3' => "three");
$arr3 = array("four", "0.5" => "five", 6 => 6, "seven" => 7);
$arr4 = array("four", "0.5" => "five", 6 => 6, "seven" => 7);
diff --git a/ext/standard/tests/array/array_uintersect_assoc_basic2.phpt b/ext/standard/tests/array/array_uintersect_assoc_basic2.phpt
index bd8163c82d..57a735b864 100644
--- a/ext/standard/tests/array/array_uintersect_assoc_basic2.phpt
+++ b/ext/standard/tests/array/array_uintersect_assoc_basic2.phpt
@@ -8,7 +8,7 @@ include('compare_function.inc');
$data_compare_function = 'compare_function';
// Initialise all required variables
-$arr1 = array("one" => "one", "02" => "two", '3' => "three", "four", "0.5" => 5, 0.6 => 6, "0x7" => "seven");
+$arr1 = array("one" => "one", "02" => "two", '3' => "three", "four", "0.5" => 5, 0 => 6, "0x7" => "seven");
$arr2 = array("one" => "one", "02" => "two", '3' => "three");
$arr3 = array("one" => "one", '3' => "three", "0.5" => 5);
$arr4 = array("one" => "one", '3' => "three", "0.5" => 5);
diff --git a/ext/standard/tests/array/array_unique_variation3.phpt b/ext/standard/tests/array/array_unique_variation3.phpt
index fb38929909..b412a19a42 100644
--- a/ext/standard/tests/array/array_unique_variation3.phpt
+++ b/ext/standard/tests/array/array_unique_variation3.phpt
@@ -35,10 +35,6 @@ $inputs = array (
array(0 => "0", 1 => "0"),
array(1 => "1", 2 => "2", 3 => 1, 4 => "4"),
- // arrays with float keys
-/*3*/ array(2.3333 => "float", 44.44 => "float"),
- array(1.2 => "f1", 3.33 => "f2", 4.89999922839999 => "f1", 3333333.333333 => "f4"),
-
// arrays with string keys
/*5*/ array('\tHello' => 111, 're\td' => "color", '\v\fworld' => 2.2, 'pen\n' => 111),
array("\tHello" => 111, "re\td" => "color", "\v\fworld" => 2.2, "pen\n" => 111),
@@ -79,20 +75,6 @@ array(3) {
string(1) "4"
}
-- Iteration 3 --
-array(1) {
- [2]=>
- string(5) "float"
-}
--- Iteration 4 --
-array(3) {
- [1]=>
- string(2) "f1"
- [3]=>
- string(2) "f2"
- [3333333]=>
- string(2) "f4"
-}
--- Iteration 5 --
array(3) {
["\tHello"]=>
int(111)
@@ -101,7 +83,7 @@ array(3) {
["\v\fworld"]=>
float(2.2)
}
--- Iteration 6 --
+-- Iteration 4 --
array(3) {
[" Hello"]=>
int(111)
@@ -110,14 +92,14 @@ array(3) {
[" world"]=>
float(2.2)
}
--- Iteration 7 --
+-- Iteration 5 --
array(2) {
[0]=>
string(5) "hello"
["Hello world"]=>
string(6) "string"
}
--- Iteration 8 --
+-- Iteration 6 --
array(3) {
[""]=>
string(5) "hello"
diff --git a/ext/standard/tests/array/array_unique_variation4.phpt b/ext/standard/tests/array/array_unique_variation4.phpt
index 1912fe26ac..7b4f8bd443 100644
--- a/ext/standard/tests/array/array_unique_variation4.phpt
+++ b/ext/standard/tests/array/array_unique_variation4.phpt
@@ -35,13 +35,9 @@ $inputs = array (
/*1*/ array('0' => 0, '1' => 0),
array("one" => 1, 'two' => 2, "three" => 1, 4 => 1),
- // arrays with float values
-/*3*/ array("float1" => 2.3333, "float2" => 2.3333),
- array("f1" => 1.2, 'f2' => 3.33, 3 => 4.89999922839999, 'f4' => 1.2),
-
// arrays with string values
-/*5*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3.3 => "\tHello"),
- array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3.3 => '\tHello'),
+/*5*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3 => "\tHello"),
+ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3 => '\tHello'),
array(1 => "hello", "heredoc" => $heredoc, $heredoc),
// array with object, unset variable and resource variable
@@ -75,20 +71,6 @@ array(2) {
int(2)
}
-- Iteration 3 --
-array(1) {
- ["float1"]=>
- float(2.3333)
-}
--- Iteration 4 --
-array(3) {
- ["f1"]=>
- float(1.2)
- ["f2"]=>
- float(3.33)
- [3]=>
- float(4.89999922839999)
-}
--- Iteration 5 --
array(3) {
[111]=>
string(6) " Hello"
@@ -97,7 +79,7 @@ array(3) {
[2]=>
string(7) " world"
}
--- Iteration 6 --
+-- Iteration 4 --
array(3) {
[111]=>
string(7) "\tHello"
@@ -106,14 +88,14 @@ array(3) {
[2]=>
string(9) "\v\fworld"
}
--- Iteration 7 --
+-- Iteration 5 --
array(2) {
[1]=>
string(5) "hello"
["heredoc"]=>
string(11) "Hello world"
}
--- Iteration 8 --
+-- Iteration 6 --
array(3) {
[11]=>
object(classA)#%d (0) {
diff --git a/ext/standard/tests/array/array_unshift_object.phpt b/ext/standard/tests/array/array_unshift_object.phpt
index 1feda5bf96..02abff3d1e 100644
--- a/ext/standard/tests/array/array_unshift_object.phpt
+++ b/ext/standard/tests/array/array_unshift_object.phpt
@@ -173,10 +173,10 @@ int(5)
array(5) {
[0]=>
object(ChildClass)#%d (2) {
- ["var3":"ChildClass":private]=>
- NULL
["var2":protected]=>
int(5)
+ ["var3":"ChildClass":private]=>
+ NULL
}
["f"]=>
string(5) "first"
@@ -191,10 +191,10 @@ int(7)
array(7) {
[0]=>
object(ChildClass)#%d (2) {
- ["var3":"ChildClass":private]=>
- NULL
["var2":protected]=>
int(5)
+ ["var3":"ChildClass":private]=>
+ NULL
}
[1]=>
string(5) "hello"
diff --git a/ext/standard/tests/array/array_unshift_variation4.phpt b/ext/standard/tests/array/array_unshift_variation4.phpt
index 0be7ab18e2..4a5c53c472 100644
--- a/ext/standard/tests/array/array_unshift_variation4.phpt
+++ b/ext/standard/tests/array/array_unshift_variation4.phpt
@@ -44,12 +44,6 @@ $arrays = array (
array(1 => "1"),
array(1 => "1", 2 => "2", 3 => "3", 4 => "4"),
- // arrays with float keys
-/*5*/ array(2.3333 => "float"),
- array(1.2 => "f1", 3.33 => "f2",
- 4.89999922839999 => "f3",
- 33333333.333333 => "f4"),
-
// arrays with string keys
/*7*/ array('\tHello' => 111, 're\td' => "color",
'\v\fworld' => 2.2, 'pen\n' => 33),
@@ -184,56 +178,6 @@ array(7) {
string(1) "4"
}
-- Iteration 5 --
-int(2)
-array(2) {
- [0]=>
- int(10)
- [1]=>
- string(5) "float"
-}
-int(4)
-array(4) {
- [0]=>
- int(10)
- [1]=>
- string(5) "hello"
- [2]=>
- string(5) "world"
- [3]=>
- string(5) "float"
-}
--- Iteration 6 --
-int(5)
-array(5) {
- [0]=>
- int(10)
- [1]=>
- string(2) "f1"
- [2]=>
- string(2) "f2"
- [3]=>
- string(2) "f3"
- [4]=>
- string(2) "f4"
-}
-int(7)
-array(7) {
- [0]=>
- int(10)
- [1]=>
- string(5) "hello"
- [2]=>
- string(5) "world"
- [3]=>
- string(2) "f1"
- [4]=>
- string(2) "f2"
- [5]=>
- string(2) "f3"
- [6]=>
- string(2) "f4"
-}
--- Iteration 7 --
int(5)
array(5) {
[0]=>
@@ -264,7 +208,7 @@ array(7) {
["pen\n"]=>
int(33)
}
--- Iteration 8 --
+-- Iteration 6 --
int(5)
array(5) {
[0]=>
@@ -297,7 +241,7 @@ array(7) {
"]=>
int(33)
}
--- Iteration 9 --
+-- Iteration 7 --
int(3)
array(3) {
[0]=>
@@ -320,7 +264,7 @@ array(5) {
["Hello world"]=>
string(6) "string"
}
--- Iteration 10 --
+-- Iteration 8 --
int(3)
array(3) {
[0]=>
@@ -343,7 +287,7 @@ array(5) {
[3]=>
string(8) "resource"
}
--- Iteration 11 --
+-- Iteration 9 --
int(8)
array(8) {
[0]=>
diff --git a/ext/standard/tests/array/array_unshift_variation5.phpt b/ext/standard/tests/array/array_unshift_variation5.phpt
index 6f642ed53e..ed3087cb57 100644
--- a/ext/standard/tests/array/array_unshift_variation5.phpt
+++ b/ext/standard/tests/array/array_unshift_variation5.phpt
@@ -51,8 +51,8 @@ $arrays = array (
array("f1" => 1.2, 'f2' => 3.33, 3 => 4.89999922839999, 'f4' => 33333333.333333),
// arrays with string values
-/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3.3 => "pen\n"),
- array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3.3 => 'pen\n'),
+/*7*/ array(111 => "\tHello", "red" => "col\tor", 2 => "\v\fworld", 3 => "pen\n"),
+ array(111 => '\tHello', "red" => 'col\tor', 2 => '\v\fworld', 3 => 'pen\n'),
array(1 => "hello", "heredoc" => $heredoc),
// array with object, unset variable and resource variable
diff --git a/ext/standard/tests/array/array_values_variation3.phpt b/ext/standard/tests/array/array_values_variation3.phpt
index 9d5f322404..4d09a31fb8 100644
--- a/ext/standard/tests/array/array_values_variation3.phpt
+++ b/ext/standard/tests/array/array_values_variation3.phpt
@@ -29,18 +29,6 @@ $inputs = array(
-2345 => 'negative',
),
- // float data
-/*2*/ 'float' => array(
- 10.5 => 'positive',
- -10.5 => 'negative',
- .5 => 'half',
- ),
-
-/*3*/ 'extreme floats' => array(
- 12.3456789000e10 => 'large',
- 12.3456789000E-10 => 'small',
- ),
-
// null data
/*4*/ 'null uppercase' => array(
NULL => 'null 1',
@@ -112,37 +100,19 @@ array(4) {
string(8) "negative"
}
--- Iteration 2: float data --
-array(3) {
- [0]=>
- string(8) "positive"
- [1]=>
- string(8) "negative"
- [2]=>
- string(4) "half"
-}
-
--- Iteration 3: extreme floats data --
-array(2) {
- [0]=>
- string(5) "large"
- [1]=>
- string(5) "small"
-}
-
--- Iteration 4: null uppercase data --
+-- Iteration 2: null uppercase data --
array(1) {
[0]=>
string(6) "null 1"
}
--- Iteration 5: null lowercase data --
+-- Iteration 3: null lowercase data --
array(1) {
[0]=>
string(6) "null 2"
}
--- Iteration 6: bool lowercase data --
+-- Iteration 4: bool lowercase data --
array(2) {
[0]=>
string(6) "lowert"
@@ -150,7 +120,7 @@ array(2) {
string(6) "lowerf"
}
--- Iteration 7: bool uppercase data --
+-- Iteration 5: bool uppercase data --
array(2) {
[0]=>
string(6) "uppert"
@@ -158,19 +128,19 @@ array(2) {
string(6) "upperf"
}
--- Iteration 8: empty double quotes data --
+-- Iteration 6: empty double quotes data --
array(1) {
[0]=>
string(6) "emptyd"
}
--- Iteration 9: empty single quotes data --
+-- Iteration 7: empty single quotes data --
array(1) {
[0]=>
string(6) "emptys"
}
--- Iteration 10: string data --
+-- Iteration 8: string data --
array(3) {
[0]=>
string(7) "stringd"
@@ -180,13 +150,13 @@ array(3) {
string(7) "stringh"
}
--- Iteration 11: undefined data --
+-- Iteration 9: undefined data --
array(1) {
[0]=>
string(9) "undefined"
}
--- Iteration 12: unset data --
+-- Iteration 10: unset data --
array(1) {
[0]=>
string(5) "unset"
diff --git a/ext/standard/tests/array/arsort_variation11.phpt b/ext/standard/tests/array/arsort_variation11.phpt
index 10958375d9..2da7a6fce3 100644
--- a/ext/standard/tests/array/arsort_variation11.phpt
+++ b/ext/standard/tests/array/arsort_variation11.phpt
Binary files differ
diff --git a/ext/standard/tests/array/asort_variation11.phpt b/ext/standard/tests/array/asort_variation11.phpt
index e614d15433..e6112672a6 100644
--- a/ext/standard/tests/array/asort_variation11.phpt
+++ b/ext/standard/tests/array/asort_variation11.phpt
Binary files differ
diff --git a/ext/standard/tests/array/bug24766.phpt b/ext/standard/tests/array/bug24766.phpt
index 2b5f8e0830..ebe2f3928f 100644
--- a/ext/standard/tests/array/bug24766.phpt
+++ b/ext/standard/tests/array/bug24766.phpt
@@ -7,35 +7,35 @@ error_reporting(E_ALL);
$a = unpack('C2', "\0224V");
$b = array(1 => 18, 2 => 52);
-debug_zval_dump($a, $b);
+var_dump($a, $b);
$k = array_keys($a);
$l = array_keys($b);
-debug_zval_dump($k, $l);
+var_dump($k, $l);
$i=$k[0];
var_dump($a[$i]);
$i=$l[0];
var_dump($b[$i]);
?>
---EXPECTF--
-array(2) refcount(%d){
+--EXPECT--
+array(2) {
[1]=>
int(18)
[2]=>
int(52)
}
-array(2) refcount(%d){
+array(2) {
[1]=>
int(18)
[2]=>
int(52)
}
-array(2) refcount(%d){
+array(2) {
[0]=>
int(1)
[1]=>
int(2)
}
-array(2) refcount(%d){
+array(2) {
[0]=>
int(1)
[1]=>
diff --git a/ext/standard/tests/array/bug25708.phpt b/ext/standard/tests/array/bug25708.phpt
index 0e695b69c9..89cb1f2dbf 100644
--- a/ext/standard/tests/array/bug25708.phpt
+++ b/ext/standard/tests/array/bug25708.phpt
@@ -21,7 +21,7 @@ function foo($ref, $alt) {
$b = NULL;
}
- debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
+ var_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
echo "--\n";
if ($alt) {
$a = &$GLOBALS['a'];
@@ -29,25 +29,25 @@ function foo($ref, $alt) {
} else {
extract($GLOBALS, EXTR_REFS);
}
- debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
+ var_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
echo "--\n";
$a = &$GLOBALS['a'];
$b = &$GLOBALS['b'];
- debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
+ var_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
echo "--\n";
$GLOBALS['b'] = 3;
- debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
+ var_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
echo "--\n";
$a = 4;
- debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
+ var_dump($a, $b, $GLOBALS['a'], $GLOBALS['b']);
echo "--\n";
$c = $b;
- debug_zval_dump($b, $GLOBALS['b'], $c);
+ var_dump($b, $GLOBALS['b'], $c);
echo "--\n";
$b = 'x';
- debug_zval_dump($a, $b, $GLOBALS['a'], $GLOBALS['b'], $c);
+ var_dump($a, $b, $GLOBALS['a'], $GLOBALS['b'], $c);
echo "--\n";
- debug_zval_dump($org_a, $org_b);
+ var_dump($org_a, $org_b);
echo "----";
if ($ref) echo 'r';
if ($alt) echo 'a';
@@ -64,9 +64,9 @@ foo(true, true);
foo(false, false);
foo(true, false);
-debug_zval_dump($_a, $_b);
+var_dump($_a, $_b);
?>
---EXPECTF--
+--EXPECT--
NULL
NULL
int(1)
@@ -97,9 +97,9 @@ int(3)
int(3)
--
int(4)
-string(1) "x" refcount(%d)
+string(1) "x"
int(4)
-string(1) "x" refcount(%d)
+string(1) "x"
int(3)
--
int(1)
@@ -135,9 +135,9 @@ int(3)
int(3)
--
int(4)
-string(1) "x" refcount(%d)
+string(1) "x"
int(4)
-string(1) "x" refcount(%d)
+string(1) "x"
int(3)
--
int(1)
@@ -173,9 +173,9 @@ int(3)
int(3)
--
int(4)
-string(1) "x" refcount(%d)
+string(1) "x"
int(4)
-string(1) "x" refcount(%d)
+string(1) "x"
int(3)
--
int(1)
@@ -211,13 +211,13 @@ int(3)
int(3)
--
int(4)
-string(1) "x" refcount(%d)
+string(1) "x"
int(4)
-string(1) "x" refcount(%d)
+string(1) "x"
int(3)
--
int(1)
int(2)
----r
-string(2) "ok" refcount(%d)
-string(2) "ok" refcount(%d)
+string(2) "ok"
+string(2) "ok"
diff --git a/ext/standard/tests/array/bug26458.phpt b/ext/standard/tests/array/bug26458.phpt
index 455ab2b345..87c8b519bf 100644
--- a/ext/standard/tests/array/bug26458.phpt
+++ b/ext/standard/tests/array/bug26458.phpt
Binary files differ
diff --git a/ext/standard/tests/array/bug29253.phpt b/ext/standard/tests/array/bug29253.phpt
index 4a1a90ebea..f97b1673ff 100644
--- a/ext/standard/tests/array/bug29253.phpt
+++ b/ext/standard/tests/array/bug29253.phpt
@@ -7,7 +7,11 @@ $gg = 'afad';
var_dump(@array_diff_assoc($GLOBALS, $zz));
var_dump($gg);
?>
---EXPECT--
-array(0) {
+--EXPECTF--
+array(2) {
+ ["zz"]=>
+ %A
+ ["gg"]=>
+ string(4) "afad"
}
string(4) "afad"
diff --git a/ext/standard/tests/array/bug31158.phpt b/ext/standard/tests/array/bug31158.phpt
index 02d74875d3..9c4ddad338 100644
--- a/ext/standard/tests/array/bug31158.phpt
+++ b/ext/standard/tests/array/bug31158.phpt
@@ -14,7 +14,8 @@ __();
echo "ok\n";
?>
--EXPECTF--
-Warning: Undefined variable $GLOBALS in %s on line %d
-
-Warning: Trying to access array offset on value of type null in %s on line %d
-ok
+Fatal error: Uncaught Error: array_splice(): Argument #1 ($array) cannot be passed by reference in %s:%d
+Stack trace:
+#0 %s(%d): __()
+#1 {main}
+ thrown in %s on line %d
diff --git a/ext/standard/tests/array/bug65251.phpt b/ext/standard/tests/array/bug65251.phpt
index 3e0f3a1e27..6d9cded21c 100644
--- a/ext/standard/tests/array/bug65251.phpt
+++ b/ext/standard/tests/array/bug65251.phpt
@@ -3,6 +3,7 @@ Bug #65251: array_merge_recursive() recursion detection broken
--FILE--
<?php
+/* This no longer involves any recursion. */
try {
array_merge_recursive($GLOBALS, $GLOBALS);
} catch (\Error $e) {
@@ -10,5 +11,6 @@ try {
}
?>
+===DONE===
--EXPECT--
-Recursion detected
+===DONE===
diff --git a/ext/standard/tests/array/bug72369.phpt b/ext/standard/tests/array/bug72369.phpt
index 63bb5625de..87d9aac357 100644
--- a/ext/standard/tests/array/bug72369.phpt
+++ b/ext/standard/tests/array/bug72369.phpt
@@ -12,5 +12,5 @@ debug_zval_dump($a);
--EXPECTF--
array(1) refcount(%d){
["test"]=>
- string(3) "xxx" refcount(%d)
+ string(3) "xxx" interned
}
diff --git a/ext/standard/tests/array/count_invalid_mode.phpt b/ext/standard/tests/array/count_invalid_mode.phpt
index 4f7950e727..be39690e85 100644
--- a/ext/standard/tests/array/count_invalid_mode.phpt
+++ b/ext/standard/tests/array/count_invalid_mode.phpt
@@ -9,11 +9,9 @@ $modes = [
0,
1,
-1,
- -1.45,
2,
TRUE,
FALSE,
- NULL,
];
foreach ($modes as $mode) {
@@ -31,7 +29,5 @@ int(0)
int(0)
count(): Argument #2 ($mode) must be either COUNT_NORMAL or COUNT_RECURSIVE
count(): Argument #2 ($mode) must be either COUNT_NORMAL or COUNT_RECURSIVE
-count(): Argument #2 ($mode) must be either COUNT_NORMAL or COUNT_RECURSIVE
-int(0)
int(0)
int(0)
diff --git a/ext/standard/tests/array/count_recursive.phpt b/ext/standard/tests/array/count_recursive.phpt
index 321706bc24..278307aca0 100644
--- a/ext/standard/tests/array/count_recursive.phpt
+++ b/ext/standard/tests/array/count_recursive.phpt
@@ -27,15 +27,15 @@ echo "\n*** Testing possible variations of count() function on arrays ***";
$count_array = array(
array(),
array( 1 => "string"),
- array( "" => "string", 0 => "a", NULL => "b", -1.00 => "c",
+ array( "" => "string", 0 => "a", NULL => "b", -1 => "c",
array(array(array(NULL)))),
- array( -2.44444 => 12, array(array(1, 2, array(array("0"))))),
+ array( -2 => 12, array(array(1, 2, array(array("0"))))),
array( "a" => 1, "b" => -2.344, "b" => "string", "c" => NULL, "d" => -2.344),
array( 4 => 1, 3 => -2.344, "3" => "string", "2" => NULL,
1 => -2.344, array()),
array( TRUE => TRUE, FALSE => FALSE, "" => "", " " => " ",
NULL => NULL, "\x000" => "\x000", "\000" => "\000"),
- array( NULL, 1.23 => "Hi", "string" => "hello",
+ array( NULL, 1 => "Hi", "string" => "hello",
array("" => "World", "-2.34" => "a", "0" => "b"))
);
diff --git a/ext/standard/tests/array/end_64bit.phpt b/ext/standard/tests/array/end_64bit.phpt
index d4bc3c143e..5069c34629 100644
--- a/ext/standard/tests/array/end_64bit.phpt
+++ b/ext/standard/tests/array/end_64bit.phpt
@@ -14,7 +14,7 @@ $arrays = array (
range('a', 'z', 2 ),
array("a" => "A", 2 => "B", "C" => 3, 4 => 4, "one" => 1, "" => NULL ),
array(1, array(1, 2 => 3 ), "one" => 1, "5" => 5 ),
- array(-1, -2, -3, -4, "-0.005" => "neg0.005", 2.0 => "float2", "neg.9" => -.9 ),
+ array(-1, -2, -3, -4, "-0.005" => "neg0.005", 2 => "float2", "neg.9" => -.9 ),
array(1.0005, 2.000000, -3.000000, -4.9999999 ),
array(true, false),
array("PHP", "Web2.0", "SOA"),
diff --git a/ext/standard/tests/array/extract_safety.phpt b/ext/standard/tests/array/extract_safety.phpt
index bebbaa1988..a9200d25c4 100644
--- a/ext/standard/tests/array/extract_safety.phpt
+++ b/ext/standard/tests/array/extract_safety.phpt
@@ -3,7 +3,7 @@ Test extract() for overwrite of GLOBALS
--FILE--
<?php
$str = "John";
-debug_zval_dump($GLOBALS["str"]);
+var_dump($GLOBALS["str"]);
/* Extracting Global Variables */
$splat = array("foo" => "bar");
@@ -11,13 +11,13 @@ var_dump(extract(array("GLOBALS" => $splat, EXTR_OVERWRITE)));
unset ($splat);
-debug_zval_dump($GLOBALS["str"]);
+var_dump($GLOBALS["str"]);
echo "\nDone";
?>
---EXPECTF--
-string(4) "John" refcount(%d)
-int(0)
-string(4) "John" refcount(%d)
+--EXPECT--
+string(4) "John"
+int(1)
+string(4) "John"
Done
diff --git a/ext/standard/tests/array/extract_variation1.phpt b/ext/standard/tests/array/extract_variation1.phpt
index a1f1faa303..a629ae0360 100644
--- a/ext/standard/tests/array/extract_variation1.phpt
+++ b/ext/standard/tests/array/extract_variation1.phpt
@@ -6,21 +6,21 @@ Test extract() function (variation 1)
$val = 4;
$str = "John";
-debug_zval_dump($val);
-debug_zval_dump($str);
+var_dump($val);
+var_dump($str);
/* Extracting Global Variables */
var_dump(extract($GLOBALS, EXTR_REFS));
-debug_zval_dump($val);
-debug_zval_dump($str);
+var_dump($val);
+var_dump($str);
echo "\nDone";
?>
--EXPECTF--
int(4)
-string(4) "John" refcount(%d)
+string(4) "John"
int(%d)
int(4)
-string(4) "John" refcount(%d)
+string(4) "John"
Done
diff --git a/ext/standard/tests/array/extract_variation4.phpt b/ext/standard/tests/array/extract_variation4.phpt
index d755a6a214..cdbbce225c 100644
--- a/ext/standard/tests/array/extract_variation4.phpt
+++ b/ext/standard/tests/array/extract_variation4.phpt
@@ -5,8 +5,8 @@ Test extract() function (variation 4)
$mixed_array = array(
array( 1 => "one", 2 => "two", 3 => 7, 4 => "four", 5 => "five" ),
- array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2.4 => "float", "F" => "FFF",
- "blank" => "", 3.7 => 3.7, 5.4 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
+ array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2 => "float", "F" => "FFF",
+ "blank" => "", 3 => 3.7, 5 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 ),
array( 12, "name", 'age', '45' ),
);
diff --git a/ext/standard/tests/array/extract_variation5.phpt b/ext/standard/tests/array/extract_variation5.phpt
index 91867b1112..9ddefd4aaa 100644
--- a/ext/standard/tests/array/extract_variation5.phpt
+++ b/ext/standard/tests/array/extract_variation5.phpt
@@ -6,7 +6,7 @@ Test extract() function (variation 5)
$mixed_array = array(
array( array("oNe", "tWo", 4), array(10, 20, 30, 40, 50), array() ),
array( "one" => 1, "one" => 2, "three" => 3, 3, 4, 3 => 33, 4 => 44, 5, 6,
- 5.4 => 54, 5.7 => 57, "5.4" => 554, "5.7" => 557 )
+ 5 => 57, "5.4" => 554, "5.7" => 557 )
);
$counter = 0;
diff --git a/ext/standard/tests/array/extract_variation7.phpt b/ext/standard/tests/array/extract_variation7.phpt
index eb5171bfc7..268a247736 100644
--- a/ext/standard/tests/array/extract_variation7.phpt
+++ b/ext/standard/tests/array/extract_variation7.phpt
@@ -8,8 +8,8 @@ echo "\n*** Testing for EXTR_PREFIX_ALL called twice with same prefix string ***
$a = array( "1" => "one", "2" => "two", "3" => "three", "4" => "four", "5" => "five" );
var_dump ( extract($a, EXTR_PREFIX_ALL, "same"));
-$b = array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2.4 => "float", "F" => "FFF",
- "blank" => "", 3.7 => 3.7, 5.4 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 );
+$b = array( "f" => "fff", "1" => "one", 4 => 6, "" => "blank", 2 => "float", "F" => "FFF",
+ "blank" => "", 3 => 3.7, 5 => 7, 6 => 8.6, '5' => "Five", "4name" => "jonny", "a" => NULL, NULL => 3 );
var_dump ( extract($b, EXTR_PREFIX_ALL, "same"));
var_dump ( extract($b, EXTR_PREFIX_ALL, "diff"));
diff --git a/ext/standard/tests/array/in_array_variation1.phpt b/ext/standard/tests/array/in_array_variation1.phpt
index 6bb0b36d34..0c88a45332 100644
--- a/ext/standard/tests/array/in_array_variation1.phpt
+++ b/ext/standard/tests/array/in_array_variation1.phpt
@@ -9,7 +9,7 @@ $arrays = array (
array(0),
array("a" => "A", 2 => "B", "C" => 3, 4 => 4, "one" => 1, "" => NULL, "b", "ab", "abcd"),
array(4, array(1, 2 => 3), "one" => 1, "5" => 5 ),
- array(-1, -2, -3, -4, -2.989888, "-0.005" => "neg0.005", 2.0 => "float2", "-.9" => -.9),
+ array(-1, -2, -3, -4, -2.989888, "-0.005" => "neg0.005", 2 => "float2", "-.9" => -.9),
array(TRUE, FALSE),
array("", array()),
array("abcd\x00abcd\x00abcd"),
diff --git a/ext/standard/tests/array/in_array_variation2.phpt b/ext/standard/tests/array/in_array_variation2.phpt
index af4191577a..3976232243 100644
--- a/ext/standard/tests/array/in_array_variation2.phpt
+++ b/ext/standard/tests/array/in_array_variation2.phpt
@@ -11,7 +11,7 @@ $misc_array = array (
3,
".001" =>-67,
"-.051" =>"k",
- 0.091 =>"-.08",
+ 0 =>"-.08",
"e" =>"5",
"y" =>NULL,
NULL =>"",
diff --git a/ext/standard/tests/array/key_variation2.phpt b/ext/standard/tests/array/key_variation2.phpt
index 1107999c10..d1eed890ff 100644
--- a/ext/standard/tests/array/key_variation2.phpt
+++ b/ext/standard/tests/array/key_variation2.phpt
@@ -28,18 +28,6 @@ $inputs = array(
-2345 => 'negative',
),
- // float data
-/*2*/ 'float' => array(
- 10.5 => 'positive',
- -10.5 => 'negative',
- .5 => 'half',
- ),
-
-/*3*/ 'extreme floats' => array(
- 12.3456789000e6 => 'large',
- 12.3456789000E-10 => 'small',
- ),
-
// null data
/*4*/ 'null uppercase' => array(
NULL => 'null 1',
@@ -107,42 +95,33 @@ int(1)
int(12345)
int(-2345)
--- Iteration 2 : float data --
-int(10)
-int(-10)
-int(0)
-
--- Iteration 3 : extreme floats data --
-int(12345678)
-int(0)
-
--- Iteration 4 : null uppercase data --
+-- Iteration 2 : null uppercase data --
string(0) ""
--- Iteration 5 : null lowercase data --
+-- Iteration 3 : null lowercase data --
string(0) ""
--- Iteration 6 : bool lowercase data --
+-- Iteration 4 : bool lowercase data --
int(1)
int(0)
--- Iteration 7 : bool uppercase data --
+-- Iteration 5 : bool uppercase data --
int(1)
int(0)
--- Iteration 8 : empty double quotes data --
+-- Iteration 6 : empty double quotes data --
string(0) ""
--- Iteration 9 : empty single quotes data --
+-- Iteration 7 : empty single quotes data --
string(0) ""
--- Iteration 10 : string data --
+-- Iteration 8 : string data --
string(7) "stringd"
string(7) "strings"
string(11) "hello world"
--- Iteration 11 : undefined data --
+-- Iteration 9 : undefined data --
string(0) ""
--- Iteration 12 : unset data --
+-- Iteration 10 : unset data --
string(0) ""
diff --git a/ext/standard/tests/array/krsort_variation3.phpt b/ext/standard/tests/array/krsort_variation3.phpt
index ffc6cc356e..979d38442e 100644
--- a/ext/standard/tests/array/krsort_variation3.phpt
+++ b/ext/standard/tests/array/krsort_variation3.phpt
@@ -14,12 +14,9 @@ echo "*** Testing krsort() : usage variations ***\n";
// diff. associative arrays to sort
$various_arrays = array(
- // negative/posative integer key value array
+ // negative/positive integer key value array
array(1 => 11, -2 => -11, 3 => 21, -4 => -21, 5 => 31, -6 => -31, 7 => 0, 8 => 41, -10 =>-41),
- // float key values
- array(1.0 => 10.5, 0.2 => -10.5, 3.1 => 10.5e2, 4 => 10.6E-2, .5 => .5, 6 => .0001, -7 => -.1),
-
// mixed value array with different types of keys
array(1 => .0001, 2 => .0021, -3 => -.01, 4 => -1, 5 => 0, 6 => .09, 7 => 2, -8 => -.9, 9 => 10.6E-2,
-10 => -10.6E-2, 11 => 33)
@@ -128,56 +125,6 @@ array(9) {
-- Iteration 2 --
- With default sort flag -
bool(true)
-array(6) {
- [6]=>
- float(0.0001)
- [4]=>
- float(0.106)
- [3]=>
- float(1050)
- [1]=>
- float(10.5)
- [0]=>
- float(0.5)
- [-7]=>
- float(-0.1)
-}
-- Sort flag = SORT_REGULAR -
-bool(true)
-array(6) {
- [6]=>
- float(0.0001)
- [4]=>
- float(0.106)
- [3]=>
- float(1050)
- [1]=>
- float(10.5)
- [0]=>
- float(0.5)
- [-7]=>
- float(-0.1)
-}
-- Sort flag = SORT_NUMERIC -
-bool(true)
-array(6) {
- [6]=>
- float(0.0001)
- [4]=>
- float(0.106)
- [3]=>
- float(1050)
- [1]=>
- float(10.5)
- [0]=>
- float(0.5)
- [-7]=>
- float(-0.1)
-}
-
--- Iteration 3 --
-- With default sort flag -
-bool(true)
array(11) {
[11]=>
int(33)
diff --git a/ext/standard/tests/array/krsort_variation8.phpt b/ext/standard/tests/array/krsort_variation8.phpt
index 1483e6fd1b..ff843f0b97 100644
--- a/ext/standard/tests/array/krsort_variation8.phpt
+++ b/ext/standard/tests/array/krsort_variation8.phpt
Binary files differ
diff --git a/ext/standard/tests/array/ksort_variation3.phpt b/ext/standard/tests/array/ksort_variation3.phpt
index db3d558be1..35954ba656 100644
--- a/ext/standard/tests/array/ksort_variation3.phpt
+++ b/ext/standard/tests/array/ksort_variation3.phpt
@@ -17,9 +17,6 @@ $various_arrays = array(
// negative/posative integer key value array
array(1 => 11, -2 => -11, 3 => 21, -4 => -21, 5 => 31, -6 => -31, 7 => 0, 8 => 41, -10 =>-41),
- // float key values
- array(1.0 => 10.5, 0.2 => -10.5, 3.1 => 10.5e2, 4 => 10.6E-2, .5 => .5, 6 => .0001, -7 => -.1),
-
// mixed value array with different types of keys
array(1 => .0001, 2 => .0021, -3 => -.01, 4 => -1, 5 => 0, 6 => .09, 7 => 2, -8 => -.9,
9 => 10.6E-2, -10 => -10.6E-2, 11 => 33)
@@ -128,56 +125,6 @@ array(9) {
-- Iteration 2 --
- With default sort flag -
bool(true)
-array(6) {
- [-7]=>
- float(-0.1)
- [0]=>
- float(0.5)
- [1]=>
- float(10.5)
- [3]=>
- float(1050)
- [4]=>
- float(0.106)
- [6]=>
- float(0.0001)
-}
-- Sort flag = SORT_REGULAR -
-bool(true)
-array(6) {
- [-7]=>
- float(-0.1)
- [0]=>
- float(0.5)
- [1]=>
- float(10.5)
- [3]=>
- float(1050)
- [4]=>
- float(0.106)
- [6]=>
- float(0.0001)
-}
-- Sort flag = SORT_NUMERIC -
-bool(true)
-array(6) {
- [-7]=>
- float(-0.1)
- [0]=>
- float(0.5)
- [1]=>
- float(10.5)
- [3]=>
- float(1050)
- [4]=>
- float(0.106)
- [6]=>
- float(0.0001)
-}
-
--- Iteration 3 --
-- With default sort flag -
-bool(true)
array(11) {
[-10]=>
float(-0.106)
diff --git a/ext/standard/tests/array/ksort_variation8.phpt b/ext/standard/tests/array/ksort_variation8.phpt
index 7b7e1c003e..fe27e6328d 100644
--- a/ext/standard/tests/array/ksort_variation8.phpt
+++ b/ext/standard/tests/array/ksort_variation8.phpt
Binary files differ
diff --git a/ext/standard/tests/array/natcasesort_variation11.phpt b/ext/standard/tests/array/natcasesort_variation11.phpt
index c47cda6ab3..5934b5230c 100644
--- a/ext/standard/tests/array/natcasesort_variation11.phpt
+++ b/ext/standard/tests/array/natcasesort_variation11.phpt
@@ -28,18 +28,6 @@ $inputs = array(
-2345 => 'negative',
),
- // float data
-/*2*/ 'float' => array(
- 10.5 => 'positive',
- -10.5 => 'negative',
- .5 => 'half',
- ),
-
-/*3*/ 'extreme floats' => array(
- 12.3456789000e6 => 'large',
- 12.3456789000E-10 => 'small',
- ),
-
// null data
/*4*/ 'null uppercase' => array(
NULL => 'null 1',
@@ -124,39 +112,19 @@ array(4) {
-- Iteration 2 --
bool(true)
-array(3) {
- [0]=>
- string(4) "half"
- [-10]=>
- string(8) "negative"
- [10]=>
- string(8) "positive"
-}
-
--- Iteration 3 --
-bool(true)
-array(2) {
- [12345678]=>
- string(5) "large"
- [0]=>
- string(5) "small"
-}
-
--- Iteration 4 --
-bool(true)
array(1) {
[""]=>
string(6) "null 1"
}
--- Iteration 5 --
+-- Iteration 3 --
bool(true)
array(1) {
[""]=>
string(6) "null 2"
}
--- Iteration 6 --
+-- Iteration 4 --
bool(true)
array(2) {
[0]=>
@@ -165,7 +133,7 @@ array(2) {
string(6) "lowert"
}
--- Iteration 7 --
+-- Iteration 5 --
bool(true)
array(2) {
[0]=>
@@ -174,21 +142,21 @@ array(2) {
string(6) "uppert"
}
--- Iteration 8 --
+-- Iteration 6 --
bool(true)
array(1) {
[""]=>
string(6) "emptyd"
}
--- Iteration 9 --
+-- Iteration 7 --
bool(true)
array(1) {
[""]=>
string(6) "emptys"
}
--- Iteration 10 --
+-- Iteration 8 --
bool(true)
array(3) {
["stringd"]=>
@@ -199,21 +167,21 @@ array(3) {
string(7) "strings"
}
--- Iteration 11 --
+-- Iteration 9 --
bool(true)
array(1) {
[""]=>
string(9) "undefined"
}
--- Iteration 12 --
+-- Iteration 10 --
bool(true)
array(1) {
[""]=>
string(5) "unset"
}
--- Iteration 13 --
+-- Iteration 11 --
bool(true)
array(3) {
["foo"]=>
diff --git a/ext/standard/tests/array/range_errors.phpt b/ext/standard/tests/array/range_errors.phpt
index 7bc552ee97..e8bdf376e3 100644
--- a/ext/standard/tests/array/range_errors.phpt
+++ b/ext/standard/tests/array/range_errors.phpt
@@ -91,7 +91,7 @@ foreach( $step_arr as $step ) {
}
}
?>
---EXPECT--
+--EXPECTF--
*** Testing error conditions ***
-- Testing ( (low < high) && (step = 0) ) --
@@ -126,6 +126,8 @@ range(): Argument #3 ($step) must not exceed the specified range
-- Testing Invalid steps --
range(): Argument #3 ($step) must be of type int|float, string given
+
+Deprecated: range(): Passing null to parameter #3 ($step) of type int|float is deprecated in %s on line %d
range(): Argument #3 ($step) must not exceed the specified range
range(): Argument #3 ($step) must not exceed the specified range
range(): Argument #3 ($step) must be of type int|float, string given
diff --git a/ext/standard/tests/array/shuffle_variation4.phpt b/ext/standard/tests/array/shuffle_variation4.phpt
index 629c449b7f..1d3269e76e 100644
--- a/ext/standard/tests/array/shuffle_variation4.phpt
+++ b/ext/standard/tests/array/shuffle_variation4.phpt
@@ -21,7 +21,7 @@ $array_arg = array(
/*3*/ array("float1" => 0.23, 'float2' => 1.34, "exp1" => 0e2, 'exp2' => 200e-2, "exp3" => 10e0),
// array with negative float values
- array(-0.23 => -0.23, -1.34 => -1.34, -200e-2 => -200e-2, -30 => -30e0, -2147473649.80),
+ array(-0 => -0.23, -1 => -1.34, -200 => -200e-2, -30 => -30e0, -2147473649.80),
// array with single and double quoted strings
/*5*/ array('1' => 'one', "str1" => "123numbers", '' => 'hello\tworld', "" => "hello world\0", "12.34floatnum"),
diff --git a/ext/standard/tests/array/uasort_object2.phpt b/ext/standard/tests/array/uasort_object2.phpt
index 82a9cb908b..6217a44b9b 100644
--- a/ext/standard/tests/array/uasort_object2.phpt
+++ b/ext/standard/tests/array/uasort_object2.phpt
@@ -146,31 +146,31 @@ bool(true)
array(4) {
[2]=>
object(ChildClass)#%d (2) {
- ["child_value"]=>
- int(15)
["pub_value"]=>
NULL
+ ["child_value"]=>
+ int(15)
}
[0]=>
object(ChildClass)#%d (2) {
- ["child_value"]=>
- int(20)
["pub_value"]=>
NULL
+ ["child_value"]=>
+ int(20)
}
[1]=>
object(ChildClass)#%d (2) {
- ["child_value"]=>
- int(500)
["pub_value"]=>
NULL
+ ["child_value"]=>
+ int(500)
}
[3]=>
object(ChildClass)#%d (2) {
- ["child_value"]=>
- int(700)
["pub_value"]=>
NULL
+ ["child_value"]=>
+ int(700)
}
}
Done
diff --git a/ext/standard/tests/array/usort_object2.phpt b/ext/standard/tests/array/usort_object2.phpt
index cdb91d4027..abc42b736b 100644
--- a/ext/standard/tests/array/usort_object2.phpt
+++ b/ext/standard/tests/array/usort_object2.phpt
@@ -129,30 +129,30 @@ bool(true)
array(4) {
[0]=>
object(ChildClass)#%d (2) {
- ["child_value"]=>
- int(15)
["pub_value"]=>
NULL
+ ["child_value"]=>
+ int(15)
}
[1]=>
object(ChildClass)#%d (2) {
- ["child_value"]=>
- int(20)
["pub_value"]=>
NULL
+ ["child_value"]=>
+ int(20)
}
[2]=>
object(ChildClass)#%d (2) {
- ["child_value"]=>
- int(500)
["pub_value"]=>
NULL
+ ["child_value"]=>
+ int(500)
}
[3]=>
object(ChildClass)#%d (2) {
- ["child_value"]=>
- int(700)
["pub_value"]=>
NULL
+ ["child_value"]=>
+ int(700)
}
}
diff --git a/ext/standard/tests/class_object/get_object_vars_basic_001.phpt b/ext/standard/tests/class_object/get_object_vars_basic_001.phpt
index babd381a08..8f647ace0b 100644
--- a/ext/standard/tests/class_object/get_object_vars_basic_001.phpt
+++ b/ext/standard/tests/class_object/get_object_vars_basic_001.phpt
@@ -84,12 +84,12 @@ array(2) {
---( Superclass: )---
A::test
array(3) {
+ ["hiddenPriv"]=>
+ string(13) "A::hiddenPriv"
["prot"]=>
string(7) "B::prot"
["pub"]=>
string(6) "B::pub"
- ["hiddenPriv"]=>
- string(13) "A::hiddenPriv"
}
---( Unrelated class: )---
diff --git a/ext/standard/tests/class_object/get_object_vars_basic_002.phpt b/ext/standard/tests/class_object/get_object_vars_basic_002.phpt
index 313a53ac88..5e7ef736f7 100644
--- a/ext/standard/tests/class_object/get_object_vars_basic_002.phpt
+++ b/ext/standard/tests/class_object/get_object_vars_basic_002.phpt
@@ -48,10 +48,10 @@ array(4) {
---( Superclass: )---
A::testA
array(3) {
+ ["hiddenPriv"]=>
+ string(13) "A::hiddenPriv"
["prot"]=>
string(7) "B::prot"
["pub"]=>
string(6) "B::pub"
- ["hiddenPriv"]=>
- string(13) "A::hiddenPriv"
}
diff --git a/ext/standard/tests/file/005_variation2-win32.phpt b/ext/standard/tests/file/005_variation2-win32.phpt
index 407f51a4d1..9f5b7ba679 100644
--- a/ext/standard/tests/file/005_variation2-win32.phpt
+++ b/ext/standard/tests/file/005_variation2-win32.phpt
@@ -28,13 +28,11 @@ function stat_fn( $filename ) {
echo "*** Testing fileattime(), filemtime(), filectime() & touch() : usage variations ***\n";
echo "\n*** testing file info ***";
-stat_fn(NULL);
stat_fn(false);
stat_fn('');
stat_fn(' ');
stat_fn('|');
-echo "\n*** testing touch ***";
-var_dump(touch(NULL));
+echo "\n*** testing touch ***\n";
var_dump(touch(false));
var_dump(touch(''));
@@ -59,11 +57,6 @@ echo "Done";
-- File modification time is =>
-- inode change time is =>
--- File '' --
--- File access time is =>
--- File modification time is =>
--- inode change time is =>
-
-- File ' ' --
-- File access time is =>
Warning: fileatime(): stat failed for in %s on line %d
@@ -86,7 +79,7 @@ Warning: filemtime(): stat failed for | in %s on line %d
Warning: filectime(): stat failed for | in %s on line %d
-*** testing touch ***bool(false)
+*** testing touch ***
bool(false)
bool(false)
diff --git a/ext/standard/tests/file/005_variation2.phpt b/ext/standard/tests/file/005_variation2.phpt
index 5a878a687b..55d1d66660 100644
--- a/ext/standard/tests/file/005_variation2.phpt
+++ b/ext/standard/tests/file/005_variation2.phpt
@@ -28,7 +28,6 @@ function stat_fn( $filename ) {
echo "*** Testing fileattime(), filemtime(), filectime() & touch() : usage variations ***\n";
echo "\n*** testing touch ***\n";
-$a = touch(NULL);
$b = touch(false);
$c = touch('');
$d = touch(' ');
@@ -41,7 +40,6 @@ var_dump($d);
var_dump($e);
echo "\n*** testing file info ***";
-stat_fn(NULL);
stat_fn(false);
stat_fn('');
stat_fn(' ');
@@ -56,7 +54,9 @@ echo "Done";
*** Testing fileattime(), filemtime(), filectime() & touch() : usage variations ***
*** testing touch ***
-bool(false)
+
+Warning: Undefined variable $a in %s on line %d
+NULL
bool(false)
bool(false)
bool(true)
@@ -73,11 +73,6 @@ bool(true)
-- File modification time is =>
-- inode change time is =>
--- File '' --
--- File access time is =>
--- File modification time is =>
--- inode change time is =>
-
-- File ' ' --
-- File access time is => %d
-- File modification time is => %d
diff --git a/ext/standard/tests/file/basename-win32.phpt b/ext/standard/tests/file/basename-win32.phpt
index 4d6cf7e089..53f243a634 100644
--- a/ext/standard/tests/file/basename-win32.phpt
+++ b/ext/standard/tests/file/basename-win32.phpt
@@ -56,13 +56,11 @@ $file_path_variations = array (
/* paths with shortcut home dir char, with suffix variation */
array("C:\\temp\\bar"),
array("C:\\temp\\bar", ""),
- array("C:\\temp\\bar", NULL),
array("C:\\temp\\bar", ' '),
array("C:\\temp\\bar.tar", ".tar"),
array("C:\\temp\\bar.tar", "~"),
array("C:\\temp\\bar.tar\\", "~"),
array("C:\\temp\\bar.tar\\", ""),
- array("C:\\temp\\bar.tar", NULL),
array("C:\\temp\\bar.tar", ''),
array("C:\\temp\\bar.tar", " "),
@@ -84,7 +82,6 @@ $file_path_variations = array (
array("\\bar.zip\\", "\\bar.zip\\"),
array(" ", " "),
array(' ', ' '),
- array(NULL, NULL),
/* path with spaces */
array(" "),
@@ -93,7 +90,6 @@ $file_path_variations = array (
/* empty paths */
array(""),
array(''),
- array(NULL)
);
function check_basename( $path_arrays ) {
@@ -209,7 +205,7 @@ string(3) "bar"
string(3) "bar"
--Iteration 5--
-string(3) "bar"
+string(7) "bar.tar"
--Iteration 6--
string(7) "bar.tar"
@@ -224,10 +220,10 @@ string(7) "bar.tar"
string(7) "bar.tar"
--Iteration 10--
-string(7) "bar.tar"
+string(4) "10.5"
--Iteration 11--
-string(7) "bar.tar"
+string(2) "10"
--Iteration 12--
string(4) "10.5"
@@ -236,37 +232,37 @@ string(4) "10.5"
string(2) "10"
--Iteration 14--
-string(4) "10.5"
+string(2) "10"
--Iteration 15--
-string(2) "10"
+string(4) "10.5"
--Iteration 16--
-string(2) "10"
+string(4) "10.5"
--Iteration 17--
-string(4) "10.5"
+string(6) "10.zip"
--Iteration 18--
-string(4) "10.5"
+string(1) "0"
--Iteration 19--
-string(6) "10.zip"
+string(1) "0"
--Iteration 20--
-string(1) "0"
+string(7) "bar.zip"
--Iteration 21--
-string(1) "0"
+string(7) "bar.zip"
--Iteration 22--
string(7) "bar.zip"
--Iteration 23--
-string(7) "bar.zip"
+string(1) " "
--Iteration 24--
-string(7) "bar.zip"
+string(1) " "
--Iteration 25--
string(1) " "
@@ -278,17 +274,5 @@ string(1) " "
string(0) ""
--Iteration 28--
-string(1) " "
-
---Iteration 29--
-string(1) " "
-
---Iteration 30--
-string(0) ""
-
---Iteration 31--
-string(0) ""
-
---Iteration 32--
string(0) ""
Done
diff --git a/ext/standard/tests/file/basename.phpt b/ext/standard/tests/file/basename.phpt
index 2b8507fa2d..c2dbf34f51 100644
--- a/ext/standard/tests/file/basename.phpt
+++ b/ext/standard/tests/file/basename.phpt
Binary files differ
diff --git a/ext/standard/tests/file/basename_basic-win32.phpt b/ext/standard/tests/file/basename_basic-win32.phpt
index 79de350eae..0678a7fd95 100644
--- a/ext/standard/tests/file/basename_basic-win32.phpt
+++ b/ext/standard/tests/file/basename_basic-win32.phpt
@@ -56,7 +56,6 @@ $file_paths = array (
/* empty paths */
"",
'',
- NULL,
);
foreach ($file_paths as $file_path) {
@@ -98,4 +97,3 @@ string(1) " "
string(1) " "
string(0) ""
string(0) ""
-string(0) ""
diff --git a/ext/standard/tests/file/basename_basic.phpt b/ext/standard/tests/file/basename_basic.phpt
index 55bd868c55..bd86695b92 100644
--- a/ext/standard/tests/file/basename_basic.phpt
+++ b/ext/standard/tests/file/basename_basic.phpt
@@ -56,7 +56,6 @@ $file_paths = array (
/* empty paths */
"",
'',
- NULL,
);
foreach ($file_paths as $file_path) {
@@ -98,4 +97,3 @@ string(1) " "
string(1) " "
string(0) ""
string(0) ""
-string(0) ""
diff --git a/ext/standard/tests/file/bug51094.phpt b/ext/standard/tests/file/bug51094.phpt
index cf2bb254c9..77d7470cb5 100644
--- a/ext/standard/tests/file/bug51094.phpt
+++ b/ext/standard/tests/file/bug51094.phpt
@@ -3,15 +3,15 @@ Fixed bug #51094 (parse_ini_file() with INI_SCANNER_RAW cuts a value that includ
--FILE--
<?php
-$ini = parse_ini_string('ini="ini;raw"', null, INI_SCANNER_RAW);
+$ini = parse_ini_string('ini="ini;raw"', false, INI_SCANNER_RAW);
var_dump($ini['ini']);
-$ini = parse_ini_string('ini="ini;raw', null, INI_SCANNER_RAW);
+$ini = parse_ini_string('ini="ini;raw', false, INI_SCANNER_RAW);
var_dump($ini['ini']);
-$ini = parse_ini_string('ini=ini;raw', null, INI_SCANNER_RAW);
+$ini = parse_ini_string('ini=ini;raw', false, INI_SCANNER_RAW);
var_dump($ini['ini']);
-$ini = parse_ini_string('ini=ini"raw', null, INI_SCANNER_RAW);
+$ini = parse_ini_string('ini=ini"raw', false, INI_SCANNER_RAW);
var_dump($ini['ini']);
-$ini = parse_ini_string("ini=\r\niniraw", null, INI_SCANNER_RAW);
+$ini = parse_ini_string("ini=\r\niniraw", false, INI_SCANNER_RAW);
var_dump($ini['ini']);
?>
--EXPECT--
diff --git a/ext/standard/tests/file/bug61961.phpt b/ext/standard/tests/file/bug61961.phpt
index c9ae4c8880..fbef22ba4c 100644
--- a/ext/standard/tests/file/bug61961.phpt
+++ b/ext/standard/tests/file/bug61961.phpt
@@ -5,7 +5,7 @@ Bug #61961 (file_get_content leaks when access empty file with max length)
$tmp_empty_file = __FILE__ . ".tmp";
file_put_contents($tmp_empty_file, "");
-var_dump(file_get_contents($tmp_empty_file, NULL, NULL, NULL, 10));
+var_dump(file_get_contents($tmp_empty_file, false, NULL, 0, 10));
unlink($tmp_empty_file);
?>
--EXPECT--
diff --git a/ext/standard/tests/file/chgrp.phpt b/ext/standard/tests/file/chgrp.phpt
index b94def684a..1e4899e465 100644
--- a/ext/standard/tests/file/chgrp.phpt
+++ b/ext/standard/tests/file/chgrp.phpt
@@ -8,7 +8,7 @@ if(substr(PHP_OS, 0, 3) == "WIN")
--FILE--
<?php
try {
- chgrp("sjhgfskhagkfdgskjfhgskfsdgfkdsajf", null);
+ chgrp("sjhgfskhagkfdgskjfhgskfsdgfkdsajf", 0);
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
diff --git a/ext/standard/tests/file/chown.phpt b/ext/standard/tests/file/chown.phpt
index 05cd4e4d7d..5791c04c9b 100644
--- a/ext/standard/tests/file/chown.phpt
+++ b/ext/standard/tests/file/chown.phpt
@@ -7,7 +7,7 @@ if(substr(PHP_OS, 0, 3) == "WIN")
?>
--FILE--
<?php
-chown("sjhgfskhagkfdgskjfhgskfsdgfkdsajf", NULL);
+chown("sjhgfskhagkfdgskjfhgskfsdgfkdsajf", 0);
echo "ALIVE\n";
?>
--EXPECTF--
diff --git a/ext/standard/tests/file/fgetcsv_error_conditions.phpt b/ext/standard/tests/file/fgetcsv_error_conditions.phpt
index dd2b4d61d9..9bb090246a 100644
--- a/ext/standard/tests/file/fgetcsv_error_conditions.phpt
+++ b/ext/standard/tests/file/fgetcsv_error_conditions.phpt
@@ -27,23 +27,23 @@ try {
echo $e->getMessage() . \PHP_EOL;
}
-echo 'fgetcsv() with delimiter as NULL' . \PHP_EOL;
+echo 'fgetcsv() with delimiter as empty string' . \PHP_EOL;
try {
- var_dump( fgetcsv($file_handle, $length, NULL, $enclosure) );
+ var_dump( fgetcsv($file_handle, $length, '', $enclosure) );
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
-echo 'fgetcsv() with enclosure as NULL' . \PHP_EOL;
+echo 'fgetcsv() with enclosure as empty string' . \PHP_EOL;
try {
- var_dump( fgetcsv($file_handle, $length, $delimiter, NULL) );
+ var_dump( fgetcsv($file_handle, $length, $delimiter, '') );
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
-echo 'fgetcsv() with delimiter & enclosure as NULL' . \PHP_EOL;
+echo 'fgetcsv() with delimiter & enclosure as empty string' . \PHP_EOL;
try {
- var_dump( fgetcsv($file_handle, $length, NULL, NULL) );
+ var_dump( fgetcsv($file_handle, $length, '', '') );
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
@@ -53,9 +53,9 @@ fgetcsv() with negative length
fgetcsv(): Argument #2 ($length) must be a greater than or equal to 0
fgetcsv(): Argument #2 ($length) must be a greater than or equal to 0
fgetcsv(): Argument #2 ($length) must be a greater than or equal to 0
-fgetcsv() with delimiter as NULL
+fgetcsv() with delimiter as empty string
fgetcsv(): Argument #3 ($separator) must be a single character
-fgetcsv() with enclosure as NULL
+fgetcsv() with enclosure as empty string
fgetcsv(): Argument #4 ($enclosure) must be a single character
-fgetcsv() with delimiter & enclosure as NULL
+fgetcsv() with delimiter & enclosure as empty string
fgetcsv(): Argument #3 ($separator) must be a single character
diff --git a/ext/standard/tests/file/file_exists_variation1.phpt b/ext/standard/tests/file/file_exists_variation1.phpt
index 55c6c94981..446e7fac16 100644
--- a/ext/standard/tests/file/file_exists_variation1.phpt
+++ b/ext/standard/tests/file/file_exists_variation1.phpt
@@ -6,7 +6,6 @@ Dave Kelsey <d_kelsey@uk.ibm.com>
<?php
echo "*** Testing file_exists() : usage variations ***\n";
-var_dump(file_exists(NULL));
var_dump(file_exists(false));
var_dump(file_exists(''));
var_dump(file_exists(' '));
@@ -19,5 +18,4 @@ bool(false)
bool(false)
bool(false)
bool(false)
-bool(false)
Done
diff --git a/ext/standard/tests/file/file_get_contents_error_folder-win.phpt b/ext/standard/tests/file/file_get_contents_error_folder-win.phpt
new file mode 100644
index 0000000000..ea3902fdbe
--- /dev/null
+++ b/ext/standard/tests/file/file_get_contents_error_folder-win.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Test file_get_contents() function : error when passing folder - on Windows
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) != "WIN") { print "skip - Windows only"; }
+?>
+--FILE--
+<?php
+file_get_contents(__DIR__);
+?>
+--EXPECTF--
+Warning: file_get_contents(%s): Failed to open stream: Permission denied in %s on line %d
diff --git a/ext/standard/tests/file/file_get_contents_error_folder.phpt b/ext/standard/tests/file/file_get_contents_error_folder.phpt
new file mode 100644
index 0000000000..32f0210d3b
--- /dev/null
+++ b/ext/standard/tests/file/file_get_contents_error_folder.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Test file_get_contents() function : error when passing folder
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) === "WIN") { print "skip - not valid for Windows"; }
+?>
+--FILE--
+<?php
+file_get_contents(__DIR__);
+?>
+--EXPECTF--
+Notice: file_get_contents(): Read of %d bytes failed with errno=21 Is a directory in %s on line %d
diff --git a/ext/standard/tests/file/file_get_contents_variation8-win32.phpt b/ext/standard/tests/file/file_get_contents_variation8-win32.phpt
index 2c7033be6d..b6d801e9e7 100644
--- a/ext/standard/tests/file/file_get_contents_variation8-win32.phpt
+++ b/ext/standard/tests/file/file_get_contents_variation8-win32.phpt
@@ -20,7 +20,6 @@ $names_arr = array(
"-1" => -1,
"TRUE" => TRUE,
"FALSE" => FALSE,
- "NULL" => NULL,
"\"\"" => "",
"\" \"" => " ",
"\\0" => "\0",
@@ -58,9 +57,6 @@ bool(false)
-- Filename: FALSE --
ValueError: Path cannot be empty
--- Filename: NULL --
-ValueError: Path cannot be empty
-
-- Filename: "" --
ValueError: Path cannot be empty
diff --git a/ext/standard/tests/file/file_get_contents_variation8.phpt b/ext/standard/tests/file/file_get_contents_variation8.phpt
index 126f7b9fd7..ad23a13bb6 100644
--- a/ext/standard/tests/file/file_get_contents_variation8.phpt
+++ b/ext/standard/tests/file/file_get_contents_variation8.phpt
@@ -19,7 +19,6 @@ $names_arr = array(
-1,
TRUE,
FALSE,
- NULL,
"",
" ",
"\0",
@@ -57,20 +56,18 @@ ValueError: Path cannot be empty
-- Iteration 3 --
ValueError: Path cannot be empty
-- Iteration 4 --
-ValueError: Path cannot be empty
--- Iteration 5 --
Warning: file_get_contents( ): Failed to open stream: No such file or directory in %s on line %d
bool(false)
--- Iteration 6 --
+-- Iteration 5 --
ValueError: file_get_contents(): Argument #1 ($filename) must not contain any null bytes
--- Iteration 7 --
+-- Iteration 6 --
TypeError: file_get_contents(): Argument #1 ($filename) must be of type string, array given
--- Iteration 8 --
+-- Iteration 7 --
Warning: file_get_contents(/no/such/file/dir): Failed to open stream: No such file or directory in %s on line %d
bool(false)
--- Iteration 9 --
+-- Iteration 8 --
Warning: file_get_contents(php/php): Failed to open stream: No such file or directory in %s on line %d
bool(false)
diff --git a/ext/standard/tests/file/file_put_contents_variation5.phpt b/ext/standard/tests/file/file_put_contents_variation5.phpt
index d16db38b14..97eb2604e0 100644
--- a/ext/standard/tests/file/file_put_contents_variation5.phpt
+++ b/ext/standard/tests/file/file_put_contents_variation5.phpt
@@ -19,7 +19,7 @@ runtest();
$newpath = "";
set_include_path($newpath);
runtest();
-set_include_path(null);
+set_include_path("");
runtest();
set_include_path(";; ; ;c:\\rubbish");
runtest();
diff --git a/ext/standard/tests/file/file_put_contents_variation8-win32.phpt b/ext/standard/tests/file/file_put_contents_variation8-win32.phpt
index e3cd4609d4..dac2ba6d37 100644
--- a/ext/standard/tests/file/file_put_contents_variation8-win32.phpt
+++ b/ext/standard/tests/file/file_put_contents_variation8-win32.phpt
@@ -18,7 +18,6 @@ $names_arr = array(
"-1" => -1,
"TRUE" => TRUE,
"FALSE" => FALSE,
- "NULL" => NULL,
"\"\"" => "",
"\" \"" => " ",
"\\0" => "\0",
@@ -58,9 +57,6 @@ foreach($names_arr as $key =>$value) {
-- Filename: FALSE --
ValueError: Path cannot be empty
--- Filename: NULL --
-ValueError: Path cannot be empty
-
-- Filename: "" --
ValueError: Path cannot be empty
diff --git a/ext/standard/tests/file/file_put_contents_variation8.phpt b/ext/standard/tests/file/file_put_contents_variation8.phpt
index f5b956faee..70456fad9f 100644
--- a/ext/standard/tests/file/file_put_contents_variation8.phpt
+++ b/ext/standard/tests/file/file_put_contents_variation8.phpt
@@ -22,7 +22,6 @@ $names_arr = array(
-1,
TRUE,
FALSE,
- NULL,
"",
" ",
//this one also generates a java message rather than our own so we don't replicate php message
@@ -64,18 +63,16 @@ ValueError: Path cannot be empty
-- Iteration 3 --
ValueError: Path cannot be empty
-- Iteration 4 --
-ValueError: Path cannot be empty
--- Iteration 5 --
9 bytes written to: ' '
--- Iteration 6 --
+-- Iteration 5 --
ValueError: file_put_contents(): Argument #1 ($filename) must not contain any null bytes
--- Iteration 7 --
+-- Iteration 6 --
TypeError: file_put_contents(): Argument #1 ($filename) must be of type string, array given
--- Iteration 8 --
+-- Iteration 7 --
Warning: file_put_contents(%sdir): Failed to open stream: %s in %s on line %d
Failed to write data to: '%sir'
--- Iteration 9 --
+-- Iteration 8 --
Warning: file_put_contents(%sphp): Failed to open stream: %s in %s on line %d
Failed to write data to: '%sphp'
diff --git a/ext/standard/tests/file/filegroup_variation2.phpt b/ext/standard/tests/file/filegroup_variation2.phpt
index 85ee170660..7d0a87d247 100644
--- a/ext/standard/tests/file/filegroup_variation2.phpt
+++ b/ext/standard/tests/file/filegroup_variation2.phpt
@@ -18,7 +18,6 @@ $filenames = array(
"",
TRUE,
FALSE,
- NULL,
/* scalars */
1234,
@@ -49,7 +48,6 @@ bool(false)
Warning: filegroup(): stat failed for 1 in %s on line %d
bool(false)
bool(false)
-bool(false)
Warning: filegroup(): stat failed for 1234 in %s on line %d
bool(false)
diff --git a/ext/standard/tests/file/fileinode_variation2.phpt b/ext/standard/tests/file/fileinode_variation2.phpt
index d8593733a8..2dace6413c 100644
--- a/ext/standard/tests/file/fileinode_variation2.phpt
+++ b/ext/standard/tests/file/fileinode_variation2.phpt
@@ -18,7 +18,6 @@ $filenames = array(
"",
TRUE,
FALSE,
- NULL,
/* scalars */
1234,
@@ -49,7 +48,6 @@ bool(false)
Warning: fileinode(): stat failed for 1 in %s on line %d
bool(false)
bool(false)
-bool(false)
Warning: fileinode(): stat failed for 1234 in %s on line %d
bool(false)
diff --git a/ext/standard/tests/file/fileowner_variation2.phpt b/ext/standard/tests/file/fileowner_variation2.phpt
index 752fa1d6ef..05cc8495b1 100644
--- a/ext/standard/tests/file/fileowner_variation2.phpt
+++ b/ext/standard/tests/file/fileowner_variation2.phpt
@@ -19,7 +19,6 @@ $filenames = array(
"",
TRUE,
FALSE,
- NULL,
/* scalars */
1234,
@@ -50,7 +49,6 @@ bool(false)
Warning: fileowner(): stat failed for 1 in %s on line %d
bool(false)
bool(false)
-bool(false)
Warning: fileowner(): stat failed for 1234 in %s on line %d
bool(false)
diff --git a/ext/standard/tests/file/fileperms_variation2.phpt b/ext/standard/tests/file/fileperms_variation2.phpt
index 9c9d263ebe..c46ce617ae 100644
--- a/ext/standard/tests/file/fileperms_variation2.phpt
+++ b/ext/standard/tests/file/fileperms_variation2.phpt
@@ -18,7 +18,6 @@ $filenames = array(
"",
TRUE,
FALSE,
- NULL,
/* scalars */
1234,
@@ -49,7 +48,6 @@ bool(false)
Warning: fileperms(): stat failed for 1 in %s on line %d
bool(false)
bool(false)
-bool(false)
Warning: fileperms(): stat failed for 1234 in %s on line %d
bool(false)
diff --git a/ext/standard/tests/file/filesize_variation5.phpt b/ext/standard/tests/file/filesize_variation5.phpt
index ab1fc6c9ff..7da6e73e06 100644
--- a/ext/standard/tests/file/filesize_variation5.phpt
+++ b/ext/standard/tests/file/filesize_variation5.phpt
@@ -7,7 +7,6 @@ Dave Kelsey <d_kelsey@uk.ibm.com>
echo "*** Testing filesize(): usage variations ***\n";
/* null, false, "", " " */
-var_dump( filesize(NULL) );
var_dump( filesize(false) );
var_dump( filesize('') );
var_dump( filesize(' ') );
@@ -18,7 +17,6 @@ echo "*** Done ***\n";
*** Testing filesize(): usage variations ***
bool(false)
bool(false)
-bool(false)
Warning: filesize(): stat failed for in %s on line %d
bool(false)
diff --git a/ext/standard/tests/file/flock_basic.phpt b/ext/standard/tests/file/flock_basic.phpt
index df1199d468..8b4ae30e0f 100644
--- a/ext/standard/tests/file/flock_basic.phpt
+++ b/ext/standard/tests/file/flock_basic.phpt
@@ -9,7 +9,7 @@ Description: PHP supports a portable way of locking complete files
echo "*** Testing flock() fun with file and dir ***\n";
-$lock_file = preg_replace("~\.phpt?$~", null, __FILE__);
+$lock_file = preg_replace("~\.phpt?$~", '', __FILE__);
$file_handle = fopen($lock_file, "w");
var_dump(flock($file_handle, LOCK_SH|LOCK_NB));
@@ -19,7 +19,7 @@ var_dump(flock($file_handle, LOCK_UN));
fclose($file_handle);
unlink($lock_file);
-$lock_dir = sprintf("%s.dir", preg_replace("~\.phpt?$~", null, __FILE__));
+$lock_dir = sprintf("%s.dir", preg_replace("~\.phpt?$~", '', __FILE__));
mkdir($lock_dir);
$dir_handle = opendir($lock_dir);
diff --git a/ext/standard/tests/file/flock_error.phpt b/ext/standard/tests/file/flock_error.phpt
index add2295981..753aaa6fb3 100644
--- a/ext/standard/tests/file/flock_error.phpt
+++ b/ext/standard/tests/file/flock_error.phpt
@@ -19,7 +19,6 @@ $operations = array(
0,
LOCK_NB,
FALSE,
- NULL,
array(1,2,3),
array(),
"string",
@@ -62,15 +61,13 @@ flock(): Argument #2 ($operation) must be one of LOCK_SH, LOCK_EX, or LOCK_UN
--- Iteration 2 ---
flock(): Argument #2 ($operation) must be one of LOCK_SH, LOCK_EX, or LOCK_UN
--- Iteration 3 ---
-flock(): Argument #2 ($operation) must be one of LOCK_SH, LOCK_EX, or LOCK_UN
+flock(): Argument #2 ($operation) must be of type int, array given
--- Iteration 4 ---
flock(): Argument #2 ($operation) must be of type int, array given
--- Iteration 5 ---
-flock(): Argument #2 ($operation) must be of type int, array given
+flock(): Argument #2 ($operation) must be of type int, string given
--- Iteration 6 ---
flock(): Argument #2 ($operation) must be of type int, string given
--- Iteration 7 ---
flock(): Argument #2 ($operation) must be of type int, string given
---- Iteration 8 ---
-flock(): Argument #2 ($operation) must be of type int, string given
flock(): supplied resource is not a valid stream resource
diff --git a/ext/standard/tests/file/flock_variation.phpt b/ext/standard/tests/file/flock_variation.phpt
index 40945be58e..f4a5199959 100644
--- a/ext/standard/tests/file/flock_variation.phpt
+++ b/ext/standard/tests/file/flock_variation.phpt
@@ -5,7 +5,7 @@ Test flock() function: Variations
echo "*** Testing flock() fun with the various operation and
wouldblock values ***\n";
-$file = preg_replace("~\.phpt?$~", null, __FILE__);
+$file = preg_replace("~\.phpt?$~", '', __FILE__);
$fp = fopen($file, "w");
/* array of operations */
diff --git a/ext/standard/tests/file/fnmatch_basic.phpt b/ext/standard/tests/file/fnmatch_basic.phpt
index 18a8161966..8b74bb430b 100644
--- a/ext/standard/tests/file/fnmatch_basic.phpt
+++ b/ext/standard/tests/file/fnmatch_basic.phpt
@@ -23,7 +23,6 @@ var_dump( fnmatch(100, 100) );
var_dump( fnmatch("string", "string") );
var_dump( fnmatch(TRUE, TRUE) );
var_dump( fnmatch(FALSE, FALSE) );
-var_dump( fnmatch(NULL, NULL) );
echo "\n*** Done ***\n";
?>
@@ -40,6 +39,5 @@ bool(true)
bool(true)
bool(true)
bool(true)
-bool(true)
*** Done ***
diff --git a/ext/standard/tests/file/fnmatch_variation.phpt b/ext/standard/tests/file/fnmatch_variation.phpt
index 2d6a08e72f..3413c3e6f7 100644
--- a/ext/standard/tests/file/fnmatch_variation.phpt
+++ b/ext/standard/tests/file/fnmatch_variation.phpt
@@ -127,8 +127,6 @@ match_($bool_arr, $bool_arr);
echo "\n--- With NULL ---\n";
$null_arr = array(
- NULL,
- null,
"",
"\0",
"string",
@@ -399,42 +397,20 @@ bool(true)
--- With NULL ---
-- Iteration 0 --
bool(true)
-bool(true)
-bool(true)
fnmatch(): Argument #2 ($filename) must not contain any null bytes
bool(false)
bool(false)
-- Iteration 1 --
-bool(true)
-bool(true)
-bool(true)
-fnmatch(): Argument #2 ($filename) must not contain any null bytes
-bool(false)
-bool(false)
--- Iteration 2 --
-bool(true)
-bool(true)
-bool(true)
-fnmatch(): Argument #2 ($filename) must not contain any null bytes
-bool(false)
-bool(false)
--- Iteration 3 --
-fnmatch(): Argument #1 ($pattern) must not contain any null bytes
fnmatch(): Argument #1 ($pattern) must not contain any null bytes
fnmatch(): Argument #1 ($pattern) must not contain any null bytes
fnmatch(): Argument #1 ($pattern) must not contain any null bytes
fnmatch(): Argument #1 ($pattern) must not contain any null bytes
-fnmatch(): Argument #1 ($pattern) must not contain any null bytes
--- Iteration 4 --
-bool(false)
-bool(false)
+-- Iteration 2 --
bool(false)
fnmatch(): Argument #2 ($filename) must not contain any null bytes
bool(true)
bool(false)
--- Iteration 5 --
-bool(false)
-bool(false)
+-- Iteration 3 --
bool(false)
fnmatch(): Argument #2 ($filename) must not contain any null bytes
bool(false)
diff --git a/ext/standard/tests/file/fputcsv_variation2.phpt b/ext/standard/tests/file/fputcsv_variation2.phpt
deleted file mode 100644
index 77b075a5f0..0000000000
--- a/ext/standard/tests/file/fputcsv_variation2.phpt
+++ /dev/null
@@ -1,724 +0,0 @@
---TEST--
-Test fputcsv() : usage variations - with delimiter as NULL
---FILE--
-<?php
-/* Testing fputcsv() to write to a file when delimiter is NULL */
-
-echo "*** Testing fputcsv() : with delimiter as NULL ***\n";
-
-/* the array is with three elements in it. Each element should be read as
- 1st element is delimiter, 2nd element is enclosure
- and 3rd element is csv fields
-*/
-$csv_lists = array (
- array(',', '"', array('water','fruit') ),
- array(',', '"', array('"water","fruit') ),
- array(',', '"', array('"water","fruit"') ),
- array(' ', '^', array('^water^ ^fruit^')),
- array(':', '&', array('&water&:&fruit&')),
- array('=', '=', array('=water===fruit=')),
- array('-', '-', array('-water--fruit-air')),
- array('-', '-', array('-water---fruit---air-')),
- array(':', '&', array('&""""&:&"&:,:":&,&:,,,,'))
-
-);
-$file_path = __DIR__;
-$filename = "$file_path/fputcsv_variation2.tmp";
-
-$file_modes = array ("r+", "r+b", "r+t",
- "a+", "a+b", "a+t",
- "w+", "w+b", "w+t",
- "x+", "x+b", "x+t");
-
-$loop_counter = 1;
-foreach ($csv_lists as $csv_list) {
- for($mode_counter = 0; $mode_counter < count($file_modes); $mode_counter++) {
-
- echo "\n-- file opened in $file_modes[$mode_counter] --\n";
- // create the file and add the content with has csv fields
- if ( strstr($file_modes[$mode_counter], "r") ) {
- $file_handle = fopen($filename, "w");
- } else {
- $file_handle = fopen($filename, $file_modes[$mode_counter] );
- }
- if ( !$file_handle ) {
- echo "Error: failed to create file $filename!\n";
- exit();
- }
- $delimiter = $csv_list[0];
- $enclosure = $csv_list[1];
- $csv_field = $csv_list[2];
-
- // write to a file in csv format
- try {
- var_dump( fputcsv($file_handle, $csv_field, NULL, $enclosure) );
- } catch (\ValueError $e) {
- echo $e->getMessage() . \PHP_EOL;
- }
- // check the file pointer position and eof
- var_dump( ftell($file_handle) );
- var_dump( feof($file_handle) );
- //close the file
- fclose($file_handle);
-
- // print the file contents
- var_dump( file_get_contents($filename) );
-
- //delete file
- unlink($filename);
- } //end of mode loop
-} // end of foreach
-
-echo "Done\n";
-?>
---EXPECT--
-*** Testing fputcsv() : with delimiter as NULL ***
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-Done
diff --git a/ext/standard/tests/file/fputcsv_variation3.phpt b/ext/standard/tests/file/fputcsv_variation3.phpt
deleted file mode 100644
index eb8771aa4a..0000000000
--- a/ext/standard/tests/file/fputcsv_variation3.phpt
+++ /dev/null
@@ -1,724 +0,0 @@
---TEST--
-Test fputcsv() : usage variations - with enclosure as NULL
---FILE--
-<?php
-/* Testing fputcsv() to write to a file when enclosure is NULL */
-
-echo "*** Testing fputcsv() : with enclosure as NULL ***\n";
-
-/* the array is with three elements in it. Each element should be read as
- 1st element is delimiter, 2nd element is enclosure
- and 3rd element is csv fields
-*/
-$csv_lists = array (
- array(',', '"', array('water','fruit') ),
- array(',', '"', array('"water","fruit') ),
- array(',', '"', array('"water","fruit"') ),
- array(' ', '^', array('^water^ ^fruit^')),
- array(':', '&', array('&water&:&fruit&')),
- array('=', '=', array('=water===fruit=')),
- array('-', '-', array('-water--fruit-air')),
- array('-', '-', array('-water---fruit---air-')),
- array(':', '&', array('&""""&:&"&:,:":&,&:,,,,'))
-
-);
-$file_path = __DIR__;
-$filename = "$file_path/fputcsv_variation3.tmp";
-
-$file_modes = array ("r+", "r+b", "r+t",
- "a+", "a+b", "a+t",
- "w+", "w+b", "w+t",
- "x+", "x+b", "x+t");
-
-$loop_counter = 1;
-foreach ($csv_lists as $csv_list) {
- for($mode_counter = 0; $mode_counter < count($file_modes); $mode_counter++) {
-
- echo "\n-- file opened in $file_modes[$mode_counter] --\n";
- // create the file and add the content with has csv fields
- if ( strstr($file_modes[$mode_counter], "r") ) {
- $file_handle = fopen($filename, "w");
- } else {
- $file_handle = fopen($filename, $file_modes[$mode_counter] );
- }
- if ( !$file_handle ) {
- echo "Error: failed to create file $filename!\n";
- exit();
- }
- $delimiter = $csv_list[0];
- $enclosure = $csv_list[1];
- $csv_field = $csv_list[2];
-
- // write to a file in csv format
- try {
- var_dump( fputcsv($file_handle, $csv_field, $delimiter, NULL) );
- } catch (\ValueError $e) {
- echo $e->getMessage() . \PHP_EOL;
- }
- // check the file pointer position and eof
- var_dump( ftell($file_handle) );
- var_dump( feof($file_handle) );
- //close the file
- fclose($file_handle);
-
- // print the file contents
- var_dump( file_get_contents($filename) );
-
- //delete file
- unlink($filename);
- } //end of mode loop
-} // end of foreach
-
-echo "Done\n";
-?>
---EXPECT--
-*** Testing fputcsv() : with enclosure as NULL ***
-
--- file opened in r+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #4 ($enclosure) must be a single character
-int(0)
-bool(false)
-string(0) ""
-Done
diff --git a/ext/standard/tests/file/fputcsv_variation4.phpt b/ext/standard/tests/file/fputcsv_variation4.phpt
deleted file mode 100644
index dc78796158..0000000000
--- a/ext/standard/tests/file/fputcsv_variation4.phpt
+++ /dev/null
@@ -1,724 +0,0 @@
---TEST--
-Test fputcsv() : usage variations - with delimiter and enclosure as NULL
---FILE--
-<?php
-/* Testing fputcsv() to write to a file when delimiter and enclosure is NULL */
-
-echo "*** Testing fputcsv() : with delimiter and enclosure as NULL ***\n";
-
-/* the array is with three elements in it. Each element should be read as
- 1st element is delimiter, 2nd element is enclosure
- and 3rd element is csv fields
-*/
-$csv_lists = array (
- array(',', '"', array('water','fruit') ),
- array(',', '"', array('"water","fruit') ),
- array(',', '"', array('"water","fruit"') ),
- array(' ', '^', array('^water^ ^fruit^')),
- array(':', '&', array('&water&:&fruit&')),
- array('=', '=', array('=water===fruit=')),
- array('-', '-', array('-water--fruit-air')),
- array('-', '-', array('-water---fruit---air-')),
- array(':', '&', array('&""""&:&"&:,:":&,&:,,,,'))
-
-);
-$file_path = __DIR__;
-$filename = "$file_path/fputcsv_variation4.tmp";
-
-$file_modes = array ("r+", "r+b", "r+t",
- "a+", "a+b", "a+t",
- "w+", "w+b", "w+t",
- "x+", "x+b", "x+t");
-
-$loop_counter = 1;
-foreach ($csv_lists as $csv_list) {
- for($mode_counter = 0; $mode_counter < count($file_modes); $mode_counter++) {
-
- echo "\n-- file opened in $file_modes[$mode_counter] --\n";
- // create the file and add the content with has csv fields
- if ( strstr($file_modes[$mode_counter], "r") ) {
- $file_handle = fopen($filename, "w");
- } else {
- $file_handle = fopen($filename, $file_modes[$mode_counter] );
- }
- if ( !$file_handle ) {
- echo "Error: failed to create file $filename!\n";
- exit();
- }
- $delimiter = $csv_list[0];
- $enclosure = $csv_list[1];
- $csv_field = $csv_list[2];
-
- // write to a file in csv format
- try {
- var_dump( fputcsv($file_handle, $csv_field, NULL, NULL) );
- } catch (\ValueError $e) {
- echo $e->getMessage() . \PHP_EOL;
- }
- // check the file pointer position and eof
- var_dump( ftell($file_handle) );
- var_dump( feof($file_handle) );
- //close the file
- fclose($file_handle);
-
- // print the file contents
- var_dump( file_get_contents($filename) );
-
- //delete file
- unlink($filename);
- } //end of mode loop
-} // end of foreach
-
-echo "Done\n";
-?>
---EXPECT--
-*** Testing fputcsv() : with delimiter and enclosure as NULL ***
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in r+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in a+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in w+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+ --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+b --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-
--- file opened in x+t --
-fputcsv(): Argument #3 ($separator) must be a single character
-int(0)
-bool(false)
-string(0) ""
-Done
diff --git a/ext/standard/tests/file/fscanf_error.phpt b/ext/standard/tests/file/fscanf_error.phpt
index c50af50b6d..da586555be 100644
--- a/ext/standard/tests/file/fscanf_error.phpt
+++ b/ext/standard/tests/file/fscanf_error.phpt
@@ -31,9 +31,7 @@ try {
fclose($file_handle);
// different invalid format strings
-$invalid_formats = array( $undefined_var,
- "%", "%h", "%.", "%d%m"
- );
+$invalid_formats = array("", "%", "%h", "%.", "%d%m");
// looping to use various invalid formats with fscanf()
@@ -57,12 +55,10 @@ $file_path = __DIR__;
$filename = "$file_path/fscanf_error.tmp";
unlink($filename);
?>
---EXPECTF--
+--EXPECT--
*** Testing fscanf() for error conditions ***
fscanf(): supplied resource is not a valid File-Handle resource
Different numbers of variable names and field specifiers
-
-Warning: Undefined variable $undefined_var in %s on line %d
array(0) {
}
Bad scan conversion character "
diff --git a/ext/standard/tests/file/glob_variation3.phpt b/ext/standard/tests/file/glob_variation3.phpt
index 4bf008a9a7..891bbb6fa1 100644
--- a/ext/standard/tests/file/glob_variation3.phpt
+++ b/ext/standard/tests/file/glob_variation3.phpt
@@ -4,7 +4,7 @@ Test glob() function: ensure no platform difference
<?php
$path = __DIR__;
-ini_set('open_basedir', NULL);
+ini_set('open_basedir', '');
var_dump(glob("$path/*.none"));
var_dump(glob("$path/?.none"));
diff --git a/ext/standard/tests/file/is_dir_variation3.phpt b/ext/standard/tests/file/is_dir_variation3.phpt
index ef875c34f8..730a2bcfea 100644
--- a/ext/standard/tests/file/is_dir_variation3.phpt
+++ b/ext/standard/tests/file/is_dir_variation3.phpt
@@ -12,7 +12,6 @@ $dirnames = array(
-2.34555,
TRUE,
FALSE,
- NULL,
" ",
/* scalars */
@@ -33,4 +32,3 @@ bool(false)
bool(false)
bool(false)
bool(false)
-bool(false)
diff --git a/ext/standard/tests/file/is_executable_variation3.phpt b/ext/standard/tests/file/is_executable_variation3.phpt
index 42e37f5731..b9b3a98e5c 100644
--- a/ext/standard/tests/file/is_executable_variation3.phpt
+++ b/ext/standard/tests/file/is_executable_variation3.phpt
@@ -23,9 +23,7 @@ $invalid_files = array(
-2.34555,
TRUE,
FALSE,
- NULL,
" ",
- @$file_handle
);
/* loop through to test each element in the above array
is an executable file */
@@ -46,6 +44,4 @@ bool(false)
bool(false)
bool(false)
bool(false)
-bool(false)
-bool(false)
Done
diff --git a/ext/standard/tests/file/is_readable_variation3.phpt b/ext/standard/tests/file/is_readable_variation3.phpt
index 320e6d49b9..e4a5766762 100644
--- a/ext/standard/tests/file/is_readable_variation3.phpt
+++ b/ext/standard/tests/file/is_readable_variation3.phpt
@@ -10,9 +10,6 @@ require __DIR__ . '/../skipif_root.inc';
echo "*** Testing is_readable(): usage variations ***\n";
-$file_handle = fopen(__FILE__, "r");
-unset($file_handle);
-
echo "\n*** Testing is_readable() on miscellaneous filenames ***\n";
$misc_files = array(
0,
@@ -20,9 +17,7 @@ $misc_files = array(
-2.34555,
TRUE,
FALSE,
- NULL,
" ",
- @$file_handle
);
/* loop through to test each element in the above array
is a readable file */
@@ -43,6 +38,4 @@ bool(false)
bool(false)
bool(false)
bool(false)
-bool(false)
-bool(false)
Done
diff --git a/ext/standard/tests/file/is_writable_variation3.phpt b/ext/standard/tests/file/is_writable_variation3.phpt
index 286b64c4d3..021d6e5645 100644
--- a/ext/standard/tests/file/is_writable_variation3.phpt
+++ b/ext/standard/tests/file/is_writable_variation3.phpt
@@ -19,9 +19,7 @@ $misc_files = array(
-2.34555,
TRUE,
FALSE,
- NULL,
" ",
- @$file_handle
);
/* loop through to test each element in the above array
is a writable file */
@@ -47,7 +45,3 @@ bool(false)
bool(false)
bool(false)
bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
diff --git a/ext/standard/tests/file/lstat_stat_variation22.phpt b/ext/standard/tests/file/lstat_stat_variation22.phpt
index b89c5c5298..9efb23fc41 100644
--- a/ext/standard/tests/file/lstat_stat_variation22.phpt
+++ b/ext/standard/tests/file/lstat_stat_variation22.phpt
@@ -13,14 +13,12 @@ obscure_filename
--FILE--
<?php
echo "*** testing stat ***\n";
-var_dump(stat(NULL));
var_dump(stat(false));
var_dump(stat(''));
var_dump(stat(' '));
var_dump(stat('|'));
echo "*** testing lstat ***\n";
-var_dump(lstat(NULL));
var_dump(lstat(false));
var_dump(lstat(''));
var_dump(lstat(' '));
@@ -30,7 +28,6 @@ var_dump(lstat('|'));
*** testing stat ***
bool(false)
bool(false)
-bool(false)
Warning: stat(): stat failed for in %s on line %d
bool(false)
@@ -40,7 +37,6 @@ bool(false)
*** testing lstat ***
bool(false)
bool(false)
-bool(false)
Warning: lstat(): Lstat failed for in %s on line %d
bool(false)
diff --git a/ext/standard/tests/file/pathinfo_variaton.phpt b/ext/standard/tests/file/pathinfo_variaton.phpt
index 4447d07d6c..04e1f15c69 100644
--- a/ext/standard/tests/file/pathinfo_variaton.phpt
+++ b/ext/standard/tests/file/pathinfo_variaton.phpt
@@ -4,9 +4,6 @@ Test pathinfo() function: usage variations
<?php
echo "*** Testing pathinfo() with miscellaneous input arguments ***\n";
-$fp = fopen(__FILE__, "r");
-unset($fp);
-
class object_temp {
public $url_var = "www.foo.com";
var $html_var = "/var/html/testdir/example.html";
@@ -47,13 +44,6 @@ $paths = array (
"",
'',
- /* pathname as NULL */
- NULL,
- null,
-
- /* filename as resource */
- $fp,
-
/* pathname as members of object */
$obj->url_var,
$obj->html_var,
@@ -83,10 +73,8 @@ foreach($paths as $path) {
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
*** Testing pathinfo() with miscellaneous input arguments ***
-
-Warning: Undefined variable $fp in %s on line %d
-- Iteration 1 --
array(3) {
["dirname"]=>
@@ -240,39 +228,6 @@ string(0) ""
string(0) ""
string(0) ""
-- Iteration 13 --
-array(2) {
- ["basename"]=>
- string(0) ""
- ["filename"]=>
- string(0) ""
-}
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
--- Iteration 14 --
-array(2) {
- ["basename"]=>
- string(0) ""
- ["filename"]=>
- string(0) ""
-}
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
--- Iteration 15 --
-array(2) {
- ["basename"]=>
- string(0) ""
- ["filename"]=>
- string(0) ""
-}
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
--- Iteration 16 --
array(4) {
["dirname"]=>
string(1) "."
@@ -287,7 +242,7 @@ string(1) "."
string(11) "www.foo.com"
string(3) "com"
string(7) "www.foo"
--- Iteration 17 --
+-- Iteration 14 --
array(4) {
["dirname"]=>
string(17) "/var/html/testdir"
@@ -302,7 +257,7 @@ string(17) "/var/html/testdir"
string(12) "example.html"
string(4) "html"
string(7) "example"
--- Iteration 18 --
+-- Iteration 15 --
array(3) {
["dirname"]=>
string(12) "/testdir/foo"
@@ -315,7 +270,7 @@ string(12) "/testdir/foo"
string(4) "test"
string(0) ""
string(4) "test"
--- Iteration 19 --
+-- Iteration 16 --
array(4) {
["dirname"]=>
string(4) "/foo"
@@ -330,7 +285,7 @@ string(4) "/foo"
string(12) "symlink.link"
string(4) "link"
string(7) "symlink"
--- Iteration 20 --
+-- Iteration 17 --
array(3) {
["dirname"]=>
string(1) "."
@@ -343,7 +298,7 @@ string(1) "."
string(5) "12345"
string(0) ""
string(5) "12345"
--- Iteration 21 --
+-- Iteration 18 --
array(4) {
["dirname"]=>
string(1) "."
@@ -358,7 +313,7 @@ string(1) "."
string(15) "www.example.com"
string(3) "com"
string(11) "www.example"
--- Iteration 22 --
+-- Iteration 19 --
array(3) {
["dirname"]=>
string(12) "/testdir/foo"
@@ -371,7 +326,7 @@ string(12) "/testdir/foo"
string(4) "test"
string(0) ""
string(4) "test"
--- Iteration 23 --
+-- Iteration 20 --
array(4) {
["dirname"]=>
string(6) "../foo"
@@ -386,7 +341,7 @@ string(6) "../foo"
string(9) "test.link"
string(4) "link"
string(4) "test"
--- Iteration 24 --
+-- Iteration 21 --
array(4) {
["dirname"]=>
string(76) "./test/work/scratch/mydir/yourdir/ourdir/test1/test2/test3/test4/test5/test6"
@@ -401,7 +356,7 @@ string(76) "./test/work/scratch/mydir/yourdir/ourdir/test1/test2/test3/test4/tes
string(8) "test.tmp"
string(3) "tmp"
string(4) "test"
--- Iteration 25 --
+-- Iteration 22 --
array(4) {
["dirname"]=>
string(1) "."
diff --git a/ext/standard/tests/file/php_fd_wrapper_04.phpt b/ext/standard/tests/file/php_fd_wrapper_04.phpt
index 458f6cd9bd..e1f9927ee9 100644
--- a/ext/standard/tests/file/php_fd_wrapper_04.phpt
+++ b/ext/standard/tests/file/php_fd_wrapper_04.phpt
@@ -1,5 +1,10 @@
--TEST--
php://fd wrapper: invalid file descriptor
+--SKIPIF--
+<?php
+// At least on Mac 10.14 Mojave; not sure about older versions
+if (strtolower(PHP_OS) == 'darwin') die('skip: the warning output is different on MacOS');
+?>
--FILE--
<?php
fopen("php://fd/1023", "w");
diff --git a/ext/standard/tests/file/readfile_error.phpt b/ext/standard/tests/file/readfile_error.phpt
index bec5b383d7..9e47e68fac 100644
--- a/ext/standard/tests/file/readfile_error.phpt
+++ b/ext/standard/tests/file/readfile_error.phpt
@@ -9,11 +9,6 @@ echo "*** Test readfile(): error conditions ***\n";
echo "\n-- Testing readfile() with invalid arguments --\n";
// invalid arguments
try {
- var_dump( readfile(NULL) ); // NULL as $filename
-} catch (\ValueError $e) {
- echo $e->getMessage() . \PHP_EOL;
-}
-try {
var_dump( readfile('') ); // empty string as $filename
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
@@ -36,7 +31,6 @@ echo "Done\n";
-- Testing readfile() with invalid arguments --
Path cannot be empty
Path cannot be empty
-Path cannot be empty
-- Testing readfile() with non-existent file --
diff --git a/ext/standard/tests/file/readfile_variation10-win32.phpt b/ext/standard/tests/file/readfile_variation10-win32.phpt
index add9afd58d..325e47224d 100644
--- a/ext/standard/tests/file/readfile_variation10-win32.phpt
+++ b/ext/standard/tests/file/readfile_variation10-win32.phpt
@@ -19,7 +19,6 @@ $names_arr = array(
"-1" => -1,
"TRUE" => TRUE,
"FALSE" => FALSE,
- "NULL" => NULL,
"\"\"" => "",
"\" \"" => " ",
"\\0" => "\0",
@@ -54,9 +53,6 @@ Warning: readfile(1): Failed to open stream: No such file or directory in %s on
-- Filename: FALSE --
ValueError: Path cannot be empty
--- Filename: NULL --
-ValueError: Path cannot be empty
-
-- Filename: "" --
ValueError: Path cannot be empty
diff --git a/ext/standard/tests/file/readfile_variation10.phpt b/ext/standard/tests/file/readfile_variation10.phpt
index 99cb0b2d6b..a2fc2d79cb 100644
--- a/ext/standard/tests/file/readfile_variation10.phpt
+++ b/ext/standard/tests/file/readfile_variation10.phpt
Binary files differ
diff --git a/ext/standard/tests/file/readlink_realpath_variation3.phpt b/ext/standard/tests/file/readlink_realpath_variation3.phpt
index f256ffea42..44a53f0dfb 100644
--- a/ext/standard/tests/file/readlink_realpath_variation3.phpt
+++ b/ext/standard/tests/file/readlink_realpath_variation3.phpt
@@ -13,8 +13,6 @@ $link_string = array (
/* empty linkname */
"",
'',
- NULL,
- null
);
for($loop_counter = 0; $loop_counter < count($link_string); $loop_counter++) {
echo "-- Iteration";
@@ -51,14 +49,4 @@ string(%d) "%s"
Warning: readlink(): %s in %s on line %d
bool(false)
string(%d) "%s"
--- Iteration5 --
-
-Warning: readlink(): %s in %s on line %d
-bool(false)
-string(%d) "%s"
--- Iteration6 --
-
-Warning: readlink(): %s in %s on line %d
-bool(false)
-string(%d) "%s"
Done
diff --git a/ext/standard/tests/file/readlink_variation1.phpt b/ext/standard/tests/file/readlink_variation1.phpt
index b129de364f..6697286de2 100644
--- a/ext/standard/tests/file/readlink_variation1.phpt
+++ b/ext/standard/tests/file/readlink_variation1.phpt
@@ -17,7 +17,6 @@ $filenames = array(
"",
TRUE,
FALSE,
- NULL,
/* scalars */
1234,
@@ -55,6 +54,3 @@ bool(false)
Warning: readlink(): %s in %s on line %d
bool(false)
-
-Warning: readlink(): %s in %s on line %d
-bool(false)
diff --git a/ext/standard/tests/file/realpath_bug77484.phpt b/ext/standard/tests/file/realpath_bug77484.phpt
index 85595d09e3..9aa3a335c2 100644
--- a/ext/standard/tests/file/realpath_bug77484.phpt
+++ b/ext/standard/tests/file/realpath_bug77484.phpt
@@ -9,6 +9,10 @@ if (PHP_ZTS) {
/* TODO eliminate difference in TS build. */
die("skip Not for ZTS");
}
+if (getenv('SKIP_REPEAT')) {
+ /* The cwd is persistent across repeats */
+ die("skip Not repeatable");
+}
?>
--FILE--
<?php
diff --git a/ext/standard/tests/file/realpath_variation-win32-mb.phpt b/ext/standard/tests/file/realpath_variation-win32-mb.phpt
index a3539f6106..ea2f1c6fec 100644
--- a/ext/standard/tests/file/realpath_variation-win32-mb.phpt
+++ b/ext/standard/tests/file/realpath_variation-win32-mb.phpt
@@ -51,8 +51,6 @@ $file_string = array (
/* empty filename */
"",
'',
- NULL,
- null
);
for($loop_counter = 0; $loop_counter < count($file_string); $loop_counter++) {
echo "-- Iteration";
@@ -91,8 +89,4 @@ bool(false)
string(%d) "%s"
-- Iteration4 --
string(%d) "%s"
--- Iteration5 --
-string(%d) "%s"
--- Iteration6 --
-string(%d) "%s"
Done
diff --git a/ext/standard/tests/file/realpath_variation-win32.phpt b/ext/standard/tests/file/realpath_variation-win32.phpt
index 9f46c62e7c..1ea8ced7d0 100644
--- a/ext/standard/tests/file/realpath_variation-win32.phpt
+++ b/ext/standard/tests/file/realpath_variation-win32.phpt
@@ -51,8 +51,6 @@ $file_string = array (
/* empty filename */
"",
'',
- NULL,
- null
);
for($loop_counter = 0; $loop_counter < count($file_string); $loop_counter++) {
echo "-- Iteration";
@@ -91,8 +89,4 @@ bool(false)
string(%d) "%s"
-- Iteration4 --
string(%d) "%s"
--- Iteration5 --
-string(%d) "%s"
--- Iteration6 --
-string(%d) "%s"
Done
diff --git a/ext/standard/tests/file/rename_variation13-win32.phpt b/ext/standard/tests/file/rename_variation13-win32.phpt
index 65dbdfb8d6..a2cf9a528d 100644
--- a/ext/standard/tests/file/rename_variation13-win32.phpt
+++ b/ext/standard/tests/file/rename_variation13-win32.phpt
@@ -17,7 +17,6 @@ $names_arr = array(
-1, /* -1 is just a valid filename on windows */
TRUE, /* 1 as well, (string)TRUE > "1" */
FALSE,
- NULL,
"", // I think both p8 and php are wrong on the messages here
//p8 generates different messages to php, php is probably wrong
//php has either "File Exists" or "Permission Denied".
@@ -80,35 +79,28 @@ bool(false)
Warning: rename(,%safile.tmp): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified) \(code: \d+\))%r in %srename_variation13-win32.php on line %d
bool(false)
--- 3 testing '' NULL --
+-- 3 testing '' string --
Warning: rename(%safile.tmp,): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified) \(code: \d+\))%r in %srename_variation13-win32.php on line %d
bool(false)
Warning: rename(,%safile.tmp): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified) \(code: \d+\))%r in %srename_variation13-win32.php on line %d
bool(false)
--- 4 testing '' string --
-
-Warning: rename(%safile.tmp,): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified) \(code: \d+\))%r in %srename_variation13-win32.php on line %d
-bool(false)
-
-Warning: rename(,%safile.tmp): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified) \(code: \d+\))%r in %srename_variation13-win32.php on line %d
-bool(false)
--- 5 testing ' ' string --
+-- 4 testing ' ' string --
Warning: rename(%s): The filename, directory name, or volume label syntax is incorrect (code: 123) in %srename_variation13-win32.php on line %d
bool(false)
Warning: rename(%s): The filename, directory name, or volume label syntax is incorrect (code: 123) in %srename_variation13-win32.php on line %d
bool(false)
--- 6 testing '/no/such/file/dir' string --
+-- 5 testing '/no/such/file/dir' string --
Warning: rename(%safile.tmp,/no/such/file/dir): The system cannot find the path specified (code: 3) in %srename_variation13-win32.php on line %d
bool(false)
Warning: rename(/no/such/file/dir,%safile.tmp): The system cannot find the path specified (code: 3) in %srename_variation13-win32.php on line %d
bool(false)
--- 7 testing 'php/php' string --
+-- 6 testing 'php/php' string --
Warning: rename(%safile.tmp,php/php): The system cannot find the path specified (code: 3) in %srename_variation13-win32.php on line %d
bool(false)
diff --git a/ext/standard/tests/file/rename_variation13.phpt b/ext/standard/tests/file/rename_variation13.phpt
index 83de25cd84..1fa95f3726 100644
--- a/ext/standard/tests/file/rename_variation13.phpt
+++ b/ext/standard/tests/file/rename_variation13.phpt
@@ -23,7 +23,6 @@ $names_arr = array(
-1,
TRUE,
FALSE,
- NULL,
"",
" ",
@@ -78,13 +77,6 @@ bool(false)
Warning: rename(,%s/renameVar13/afile.tmp): %s in %s on line %d
bool(false)
--- testing '' --
-
-Warning: rename(%s/renameVar13/afile.tmp,): %s in %s on line %d
-bool(false)
-
-Warning: rename(,%s/renameVar13/afile.tmp): %s in %s on line %d
-bool(false)
-- testing ' ' --
bool(true)
diff --git a/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt b/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt
index 72737d1a8e..f4035f8f40 100644
--- a/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt
+++ b/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt
@@ -19,17 +19,14 @@ $linkname = __DIR__."/symlink_link_linkinfo_is_link_link_error1.tmp";
echo "*** Testing symlink() for error conditions ***\n";
//invalid arguments
-var_dump( symlink(NULL, $linkname) ); // NULL as filename
var_dump( symlink('', $linkname) ); // empty string as filename
var_dump( symlink(false, $linkname) ); // boolean false as filename
-var_dump( symlink($filename, NULL) ); // NULL as linkname
var_dump( symlink($filename, '') ); // '' as linkname
var_dump( symlink($filename, false) ); // false as linkname
echo "\n*** Testing linkinfo() for error conditions ***\n";
//invalid arguments
-var_dump( linkinfo(NULL) ); // NULL as linkname
var_dump( linkinfo('') ); // empty string as linkname
var_dump( linkinfo(false) ); // boolean false as linkname
@@ -55,12 +52,6 @@ bool(false)
Warning: symlink(): %s in %s on line %d
bool(false)
-Warning: symlink(): %s in %s on line %d
-bool(false)
-
-Warning: symlink(): %s in %s on line %d
-bool(false)
-
*** Testing linkinfo() for error conditions ***
Warning: linkinfo(): %s in %s on line %d
@@ -68,7 +59,4 @@ int(-1)
Warning: linkinfo(): %s in %s on line %d
int(-1)
-
-Warning: linkinfo(): %s in %s on line %d
-int(-1)
Done
diff --git a/ext/standard/tests/file/symlink_link_linkinfo_is_link_error2.phpt b/ext/standard/tests/file/symlink_link_linkinfo_is_link_error2.phpt
index c5b21c0d21..fcc64d4098 100644
--- a/ext/standard/tests/file/symlink_link_linkinfo_is_link_error2.phpt
+++ b/ext/standard/tests/file/symlink_link_linkinfo_is_link_error2.phpt
@@ -19,18 +19,15 @@ $linkname = __DIR__."/symlink_link_linkinfo_is_link_link_error2.tmp";
echo "*** Testing link() for error conditions ***\n";
//invalid arguments
-var_dump( link(NULL, $linkname) ); // NULL as filename
var_dump( link('', $linkname) ); // empty string as filename
var_dump( link(' ', $linkname) ); // space as filename
var_dump( link(false, $linkname) ); // boolean false as filename
-var_dump( link($filename, NULL) ); // NULL as linkname
var_dump( link($filename, '') ); // '' as linkname
var_dump( link($filename, false) ); // false as linkname
echo "\n*** Testing is_link() for error conditions ***\n";
//invalid arguments
-var_dump( is_link(NULL) ); // NULL as linkname
var_dump( is_link('') ); // empty string as linkname
var_dump( is_link(' ') ); // space as linkname
var_dump( is_link(false) ); // boolean false as linkname
@@ -60,16 +57,9 @@ bool(false)
Warning: link(): No such file or directory in %s on line %d
bool(false)
-Warning: link(): No such file or directory in %s on line %d
-bool(false)
-
-Warning: link(): No such file or directory in %s on line %d
-bool(false)
-
*** Testing is_link() for error conditions ***
bool(false)
bool(false)
bool(false)
bool(false)
-bool(false)
Done
diff --git a/ext/standard/tests/file/tempnam_variation3-win32.phpt b/ext/standard/tests/file/tempnam_variation3-win32.phpt
index 86990f0341..5bc4f5ec88 100644
--- a/ext/standard/tests/file/tempnam_variation3-win32.phpt
+++ b/ext/standard/tests/file/tempnam_variation3-win32.phpt
@@ -26,7 +26,6 @@ $names_arr = array(
-1,
TRUE,
FALSE,
- NULL,
"",
" ",
"\0",
@@ -47,7 +46,6 @@ $res_arr = array(
true,
true,
true,
- true,
false,
/* prefix with path separator of a non existing directory*/
@@ -99,17 +97,15 @@ OK
-- Iteration 3 --
OK
-- Iteration 4 --
-OK
--- Iteration 5 --
Notice: tempnam(): file created in the system's temporary directory in %stempnam_variation3-win32.php on line %d
Failed, not created in the correct directory %s vs %s
0
--- Iteration 6 --
+-- Iteration 5 --
tempnam(): Argument #2 ($prefix) must not contain any null bytes
--- Iteration 7 --
+-- Iteration 6 --
tempnam(): Argument #2 ($prefix) must be of type string, array given
--- Iteration 8 --
+-- Iteration 7 --
OK
--- Iteration 9 --
+-- Iteration 8 --
OK
diff --git a/ext/standard/tests/file/tempnam_variation3.phpt b/ext/standard/tests/file/tempnam_variation3.phpt
index baf0a5a868..6f20ec140e 100644
--- a/ext/standard/tests/file/tempnam_variation3.phpt
+++ b/ext/standard/tests/file/tempnam_variation3.phpt
@@ -21,7 +21,6 @@ $names_arr = array(
-1,
TRUE,
FALSE,
- NULL,
"",
" ",
"\0",
@@ -98,18 +97,14 @@ File name is => %s/%s
File permissions are => 100600
File created in => directory specified
-- Iteration 5 --
-File name is => %s/%s
-File permissions are => 100600
-File created in => directory specified
--- Iteration 6 --
tempnam(): Argument #2 ($prefix) must not contain any null bytes
--- Iteration 7 --
+-- Iteration 6 --
tempnam(): Argument #2 ($prefix) must be of type string, array given
--- Iteration 8 --
+-- Iteration 7 --
File name is => %s/dir%s
File permissions are => 100600
File created in => directory specified
--- Iteration 9 --
+-- Iteration 8 --
File name is => %s/php%s
File permissions are => 100600
File created in => directory specified
diff --git a/ext/standard/tests/file/tempnam_variation7-win32.phpt b/ext/standard/tests/file/tempnam_variation7-win32.phpt
index 0c951e2657..b731c76449 100644
--- a/ext/standard/tests/file/tempnam_variation7-win32.phpt
+++ b/ext/standard/tests/file/tempnam_variation7-win32.phpt
@@ -19,7 +19,6 @@ $names_arr = array(
-1,
TRUE,
FALSE,
- NULL,
"",
" ",
"\0",
@@ -86,26 +85,22 @@ File name is => %s%et%s
File permissions are => 100666
File created in => temp dir
-- Iteration 4 --
-File name is => %s%et%s
-File permissions are => 100666
-File created in => temp dir
--- Iteration 5 --
Notice: tempnam(): file created in the system's temporary directory in %stempnam_variation7-win32.php on line %d
File name is => %s%et%s
File permissions are => 100666
File created in => temp dir
--- Iteration 6 --
+-- Iteration 5 --
tempnam(): Argument #1 ($directory) must not contain any null bytes
--- Iteration 7 --
+-- Iteration 6 --
tempnam(): Argument #1 ($directory) must be of type string, array given
--- Iteration 8 --
+-- Iteration 7 --
Notice: tempnam(): file created in the system's temporary directory in %stempnam_variation7-win32.php on line %d
File name is => %s%et%s
File permissions are => 100666
File created in => temp dir
--- Iteration 9 --
+-- Iteration 8 --
Notice: tempnam(): file created in the system's temporary directory in %stempnam_variation7-win32.php on line %d
File name is => %s%et%s
diff --git a/ext/standard/tests/file/tempnam_variation7.phpt b/ext/standard/tests/file/tempnam_variation7.phpt
index 9a0b1151c6..1928da4f89 100644
--- a/ext/standard/tests/file/tempnam_variation7.phpt
+++ b/ext/standard/tests/file/tempnam_variation7.phpt
@@ -19,7 +19,6 @@ $names_arr = array(
-1,
TRUE,
FALSE,
- NULL,
"",
" ",
"\0",
@@ -91,26 +90,22 @@ File name is => %s%etempnam_variation3.tmp%s
File permissions are => 100600
File created in => temp dir
-- Iteration 4 --
-File name is => %s%etempnam_variation3.tmp%s
-File permissions are => 100600
-File created in => temp dir
--- Iteration 5 --
Notice: tempnam(): file created in the system's temporary directory in %stempnam_variation7.php on line %d
File name is => %s%etempnam_variation3.tmp%s
File permissions are => 100600
File created in => temp dir
--- Iteration 6 --
+-- Iteration 5 --
tempnam(): Argument #1 ($directory) must not contain any null bytes
--- Iteration 7 --
+-- Iteration 6 --
tempnam(): Argument #1 ($directory) must be of type string, array given
--- Iteration 8 --
+-- Iteration 7 --
Notice: tempnam(): file created in the system's temporary directory in %stempnam_variation7.php on line %d
File name is => %s/tempnam_variation3.tmp%s
File permissions are => 100600
File created in => temp dir
--- Iteration 9 --
+-- Iteration 8 --
Notice: tempnam(): file created in the system's temporary directory in %stempnam_variation7.php on line %d
File name is => %s/tempnam_variation3.tmp%s
diff --git a/ext/standard/tests/file/unlink_error-win32-mb.phpt b/ext/standard/tests/file/unlink_error-win32-mb.phpt
index e85db00600..df98e2e367 100644
--- a/ext/standard/tests/file/unlink_error-win32-mb.phpt
+++ b/ext/standard/tests/file/unlink_error-win32-mb.phpt
@@ -27,9 +27,6 @@ echo "\n-- Testing unlink() on invalid arguments --\n";
var_dump( unlink('') ); // $filename as empty string
var_dump( file_exists('') ); // confirm file doesn't exist
-var_dump( unlink(NULL) ); // $filename as NULL
-var_dump( file_exists(NULL) ); // confirm file doesn't exist
-
var_dump( unlink(false) ); // $filename as boolean false
var_dump( file_exists(false) ); // confirm file doesn't exist
@@ -66,10 +63,6 @@ Warning: unlink(): %s in %s on line %d
bool(false)
bool(false)
-Warning: unlink(): %s in %s on line %d
-bool(false)
-bool(false)
-
-- Testing unlink() on non-existent file --
Warning: unlink(%s/non_existent_file.tmp): No such file or directory in %s on line %d
diff --git a/ext/standard/tests/file/unlink_error-win32.phpt b/ext/standard/tests/file/unlink_error-win32.phpt
index af579be58d..6bce3d4b80 100644
--- a/ext/standard/tests/file/unlink_error-win32.phpt
+++ b/ext/standard/tests/file/unlink_error-win32.phpt
@@ -25,9 +25,6 @@ echo "\n-- Testing unlink() on invalid arguments --\n";
var_dump( unlink('') ); // $filename as empty string
var_dump( file_exists('') ); // confirm file doesn't exist
-var_dump( unlink(NULL) ); // $filename as NULL
-var_dump( file_exists(NULL) ); // confirm file doesn't exist
-
var_dump( unlink(false) ); // $filename as boolean false
var_dump( file_exists(false) ); // confirm file doesn't exist
@@ -63,10 +60,6 @@ Warning: unlink(): %s in %s on line %d
bool(false)
bool(false)
-Warning: unlink(): %s in %s on line %d
-bool(false)
-bool(false)
-
-- Testing unlink() on non-existent file --
Warning: unlink(%s/non_existent_file.tmp): No such file or directory in %s on line %d
diff --git a/ext/standard/tests/file/unlink_error.phpt b/ext/standard/tests/file/unlink_error.phpt
index e5f809df05..1dd8ef1a25 100644
--- a/ext/standard/tests/file/unlink_error.phpt
+++ b/ext/standard/tests/file/unlink_error.phpt
@@ -25,9 +25,6 @@ echo "\n-- Testing unlink() on invalid arguments --\n";
var_dump( unlink('') ); // $filename as empty string
var_dump( file_exists('') ); // confirm file doesn't exist
-var_dump( unlink(NULL) ); // $filename as NULL
-var_dump( file_exists(NULL) ); // confirm file doesn't exist
-
var_dump( unlink(false) ); // $filename as boolean false
var_dump( file_exists(false) ); // confirm file doesn't exist
@@ -62,10 +59,6 @@ Warning: unlink(): %s in %s on line %d
bool(false)
bool(false)
-Warning: unlink(): %s in %s on line %d
-bool(false)
-bool(false)
-
-- Testing unlink() on non-existent file --
Warning: unlink(%s/non_existent_file.tmp): No such file or directory in %s on line %d
diff --git a/ext/standard/tests/file/windows_mb_path/test_long_path_bug71103.phpt b/ext/standard/tests/file/windows_mb_path/test_long_path_bug71103.phpt
index a81ff66dfb..3e024c5e56 100644
--- a/ext/standard/tests/file/windows_mb_path/test_long_path_bug71103.phpt
+++ b/ext/standard/tests/file/windows_mb_path/test_long_path_bug71103.phpt
@@ -17,7 +17,7 @@ $d = $base . '\\dev\\http\\tproj\\app\\cache\\dev_old\\annotations\\72';
$foo = $d . '\\5b53796d666f6e795c42756e646c655c5477696742756e646c655c436f6e74726f6c6c65725c457863657074696f6e436f6e74726f6c6c657223676574416e64436c65616e4f7574707574427566666572696e67405b416e6e6f745d5d5b.doctrinecache.data';
$bar = $d . '\\5b53796d666f6e795c42756e646c655c5477696742756e646c655c436f6e74726f6c6c65725c457863657074696f6e436f6e74726f6c6c657223676574416e64436c65616e4f7574707574427566666572696e67405b416e6e6f745d5d5b315d.doctrinecache.data';
-mkdir($d, NULL, true);
+mkdir($d, 0777, true);
foreach (array($foo, $bar) as $f) {
touch($f);
diff --git a/ext/standard/tests/general_functions/array_is_list.phpt b/ext/standard/tests/general_functions/array_is_list.phpt
new file mode 100644
index 0000000000..1cc2886f96
--- /dev/null
+++ b/ext/standard/tests/general_functions/array_is_list.phpt
@@ -0,0 +1,98 @@
+--TEST--
+Test array_is_list() function
+--FILE--
+<?php
+
+function test_is_list(string $desc, $val) : void {
+ try {
+ printf("%s: %s\n", $desc, json_encode(array_is_list($val)));
+ } catch (TypeError $e) {
+ printf("%s: threw %s\n", $desc, $e->getMessage());
+ }
+}
+
+test_is_list("empty", []);
+test_is_list("one", [1]);
+test_is_list("two", [1,2]);
+test_is_list("three", [1,2,3]);
+test_is_list("four", [1,2,3,4]);
+test_is_list("ten", range(0, 10));
+
+test_is_list("null", null);
+test_is_list("int", 123);
+test_is_list("float", 1.23);
+test_is_list("string", "string");
+test_is_list("object", new stdClass());
+test_is_list("true", true);
+test_is_list("false", false);
+
+test_is_list("string key", ["a" => 1]);
+test_is_list("mixed keys", [0 => 0, "a" => 1]);
+test_is_list("ordered keys", [0 => 0, 1 => 1]);
+test_is_list("shuffled keys", [1 => 0, 0 => 1]);
+test_is_list("skipped keys", [0 => 0, 2 => 2]);
+
+$arr = [1, 2, 3];
+unset($arr[0]);
+test_is_list("unset first", $arr);
+
+$arr = [1, 2, 3];
+unset($arr[1]);
+test_is_list("unset middle", $arr);
+
+$arr = [1, 2, 3];
+unset($arr[2]);
+test_is_list("unset end", $arr);
+
+$arr = [1, "a" => "a", 2];
+unset($arr["a"]);
+test_is_list("unset string key", $arr);
+
+$arr = [1 => 1, 0 => 0];
+unset($arr[1]);
+test_is_list("unset into order", $arr);
+
+$arr = ["a" => 1];
+unset($arr["a"]);
+test_is_list("unset to empty", $arr);
+
+$arr = [1, 2, 3];
+$arr[] = 4;
+test_is_list("append implicit", $arr);
+
+$arr = [1, 2, 3];
+$arr[3] = 4;
+test_is_list("append explicit", $arr);
+
+$arr = [1, 2, 3];
+$arr[4] = 5;
+test_is_list("append with gap", $arr);
+
+--EXPECT--
+empty: true
+one: true
+two: true
+three: true
+four: true
+ten: true
+null: threw array_is_list(): Argument #1 ($array) must be of type array, null given
+int: threw array_is_list(): Argument #1 ($array) must be of type array, int given
+float: threw array_is_list(): Argument #1 ($array) must be of type array, float given
+string: threw array_is_list(): Argument #1 ($array) must be of type array, string given
+object: threw array_is_list(): Argument #1 ($array) must be of type array, stdClass given
+true: threw array_is_list(): Argument #1 ($array) must be of type array, bool given
+false: threw array_is_list(): Argument #1 ($array) must be of type array, bool given
+string key: false
+mixed keys: false
+ordered keys: true
+shuffled keys: false
+skipped keys: false
+unset first: false
+unset middle: false
+unset end: true
+unset string key: true
+unset into order: true
+unset to empty: true
+append implicit: true
+append explicit: true
+append with gap: false \ No newline at end of file
diff --git a/ext/standard/tests/general_functions/call_user_func_return.phpt b/ext/standard/tests/general_functions/call_user_func_return.phpt
index 4719587ffc..f4aaec13a5 100644
--- a/ext/standard/tests/general_functions/call_user_func_return.phpt
+++ b/ext/standard/tests/general_functions/call_user_func_return.phpt
@@ -23,20 +23,20 @@ function & test2($arg1, $arg2)
function test($func)
{
- debug_zval_dump($func('Direct', 'Call'));
- debug_zval_dump(call_user_func_array($func, array('User', 'Func')));
+ var_dump($func('Direct', 'Call'));
+ var_dump(call_user_func_array($func, array('User', 'Func')));
}
test('test1');
test('test2');
?>
---EXPECTF--
+--EXPECT--
Direct Call
-string(5) "test1" refcount(%d)
+string(5) "test1"
User Func
-string(5) "test1" refcount(%d)
+string(5) "test1"
Direct Call
-string(5) "test2" refcount(%d)
+string(5) "test2"
User Func
-string(5) "test2" refcount(%d)
+string(5) "test2"
diff --git a/ext/standard/tests/general_functions/debug_zval_dump_b.phpt b/ext/standard/tests/general_functions/debug_zval_dump_b.phpt
index 5ce121b6a7..0444ade190 100644
--- a/ext/standard/tests/general_functions/debug_zval_dump_b.phpt
+++ b/ext/standard/tests/general_functions/debug_zval_dump_b.phpt
Binary files differ
diff --git a/ext/standard/tests/general_functions/debug_zval_dump_b_64bit.phpt b/ext/standard/tests/general_functions/debug_zval_dump_b_64bit.phpt
index 6425249ca6..9302593cb2 100644
--- a/ext/standard/tests/general_functions/debug_zval_dump_b_64bit.phpt
+++ b/ext/standard/tests/general_functions/debug_zval_dump_b_64bit.phpt
Binary files differ
diff --git a/ext/standard/tests/general_functions/debug_zval_dump_o.phpt b/ext/standard/tests/general_functions/debug_zval_dump_o.phpt
index b195353703..89ed4a63d2 100644
--- a/ext/standard/tests/general_functions/debug_zval_dump_o.phpt
+++ b/ext/standard/tests/general_functions/debug_zval_dump_o.phpt
@@ -2,6 +2,8 @@
Test debug_zval_dump() function : working on objects
--SKIPIF--
<?php if (PHP_ZTS) { print "skip only for no-zts build"; }
+--INI--
+opcache.enable=0
--FILE--
<?php
function zval_dump( $values ) {
@@ -343,26 +345,30 @@ object(object_class)#%d (7) refcount(%d){
["object_class1"]=>
*RECURSION*
["obj"]=>
- &object(object_class)#%d (7) refcount(%d){
- ["value1"]=>
- int(5)
- ["value2":"object_class":private]=>
- int(10)
- ["value3":protected]=>
- int(20)
- ["value4"]=>
- int(30)
- ["array_var"]=>
- array(2) refcount(%d){
- ["key1"]=>
- int(1)
- ["key2 "]=>
- int(3)
+ reference refcount(2) {
+ object(object_class)#8 (7) refcount(2){
+ ["value1"]=>
+ int(5)
+ ["value2":"object_class":private]=>
+ int(10)
+ ["value3":protected]=>
+ int(20)
+ ["value4"]=>
+ int(30)
+ ["array_var"]=>
+ array(2) refcount(7){
+ ["key1"]=>
+ int(1)
+ ["key2 "]=>
+ int(3)
+ }
+ ["object_class1"]=>
+ *RECURSION*
+ ["obj"]=>
+ reference refcount(2) {
+ *RECURSION*
+ }
}
- ["object_class1"]=>
- *RECURSION*
- ["obj"]=>
- *RECURSION*
}
}
Done
diff --git a/ext/standard/tests/general_functions/debug_zval_dump_refs.phpt b/ext/standard/tests/general_functions/debug_zval_dump_refs.phpt
new file mode 100644
index 0000000000..0af30d3379
--- /dev/null
+++ b/ext/standard/tests/general_functions/debug_zval_dump_refs.phpt
@@ -0,0 +1,46 @@
+--TEST--
+References in debug_zval_dump()
+--FILE--
+<?php
+
+$r = 1;
+$a = [&$r];
+debug_zval_dump($a);
+$a[] =& $r;
+debug_zval_dump($a);
+unset($a[1]);
+debug_zval_dump($a);
+unset($r);
+// rc=1 singleton ref remains
+debug_zval_dump($a);
+
+?>
+--EXPECT--
+array(1) refcount(2){
+ [0]=>
+ reference refcount(2) {
+ int(1)
+ }
+}
+array(2) refcount(2){
+ [0]=>
+ reference refcount(3) {
+ int(1)
+ }
+ [1]=>
+ reference refcount(3) {
+ int(1)
+ }
+}
+array(1) refcount(2){
+ [0]=>
+ reference refcount(2) {
+ int(1)
+ }
+}
+array(1) refcount(2){
+ [0]=>
+ reference refcount(1) {
+ int(1)
+ }
+}
diff --git a/ext/standard/tests/general_functions/debug_zval_dump_v.phpt b/ext/standard/tests/general_functions/debug_zval_dump_v.phpt
index ad64ceebdb..17132874bf 100644
--- a/ext/standard/tests/general_functions/debug_zval_dump_v.phpt
+++ b/ext/standard/tests/general_functions/debug_zval_dump_v.phpt
@@ -188,11 +188,11 @@ NULL
-- Iteration 4 --
NULL
-- Iteration 5 --
-string(7) "TRUE123" refcount(%d)
+string(7) "TRUE123" interned
-- Iteration 6 --
-string(9) "123string" refcount(%d)
+string(9) "123string" interned
-- Iteration 7 --
-string(9) "string123" refcount(%d)
+string(9) "string123" interned
-- Iteration 8 --
-string(10) "NULLstring" refcount(%d)
+string(10) "NULLstring" interned
Done
diff --git a/ext/standard/tests/general_functions/escapeshellarg_variation1-win32.phpt b/ext/standard/tests/general_functions/escapeshellarg_variation1-win32.phpt
index c7cab179b4..752b1dfa7e 100644
--- a/ext/standard/tests/general_functions/escapeshellarg_variation1-win32.phpt
+++ b/ext/standard/tests/general_functions/escapeshellarg_variation1-win32.phpt
@@ -10,10 +10,6 @@ if( substr(PHP_OS, 0, 3) != "WIN" )
echo "*** Testing escapeshellarg() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
-
// heredoc string
$heredoc = <<<EOT
abc
@@ -39,10 +35,6 @@ $inputs = array(
1.234567E-2,
.5,
- // null data
-/*11*/ NULL,
- null,
-
// boolean data
/*13*/ true,
false,
@@ -53,12 +45,6 @@ $inputs = array(
/*17*/ "",
'',
- // undefined data
-/*19*/ @$undefined_var,
-
- // unset data
-/*20*/ @$unset_var,
-
);
// loop through each element of $inputs to check the behaviour of escapeshellarg()
@@ -103,7 +89,7 @@ string(12) ""0.01234567""
string(5) ""0.5""
-- Iteration 11 --
-string(2) """"
+string(3) ""1""
-- Iteration 12 --
string(2) """"
@@ -115,19 +101,7 @@ string(3) ""1""
string(2) """"
-- Iteration 15 --
-string(3) ""1""
-
--- Iteration 16 --
-string(2) """"
-
--- Iteration 17 --
-string(2) """"
-
--- Iteration 18 --
-string(2) """"
-
--- Iteration 19 --
string(2) """"
--- Iteration 20 --
+-- Iteration 16 --
string(2) """"
diff --git a/ext/standard/tests/general_functions/escapeshellarg_variation1.phpt b/ext/standard/tests/general_functions/escapeshellarg_variation1.phpt
index 15ebbfcd4e..028b987eec 100644
--- a/ext/standard/tests/general_functions/escapeshellarg_variation1.phpt
+++ b/ext/standard/tests/general_functions/escapeshellarg_variation1.phpt
@@ -10,10 +10,6 @@ if( substr(PHP_OS, 0, 3) == "WIN" )
echo "*** Testing escapeshellarg() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
-
// heredoc string
$heredoc = <<<EOT
abc
@@ -39,10 +35,6 @@ $inputs = array(
1.234567E-2,
.5,
- // null data
-/*11*/ NULL,
- null,
-
// boolean data
/*13*/ true,
false,
@@ -52,13 +44,6 @@ $inputs = array(
// empty data
/*17*/ "",
'',
-
- // undefined data
-/*19*/ @$undefined_var,
-
- // unset data
-/*20*/ @$unset_var,
-
);
// loop through each element of $inputs to check the behaviour of escapeshellarg()
@@ -103,7 +88,7 @@ string(12) "'0.01234567'"
string(5) "'0.5'"
-- Iteration 11 --
-string(2) "''"
+string(3) "'1'"
-- Iteration 12 --
string(2) "''"
@@ -115,19 +100,7 @@ string(3) "'1'"
string(2) "''"
-- Iteration 15 --
-string(3) "'1'"
-
--- Iteration 16 --
-string(2) "''"
-
--- Iteration 17 --
-string(2) "''"
-
--- Iteration 18 --
-string(2) "''"
-
--- Iteration 19 --
string(2) "''"
--- Iteration 20 --
+-- Iteration 16 --
string(2) "''"
diff --git a/ext/standard/tests/general_functions/get_cfg_var_variation3.phpt b/ext/standard/tests/general_functions/get_cfg_var_variation3.phpt
deleted file mode 100644
index 1a99242ba6..0000000000
--- a/ext/standard/tests/general_functions/get_cfg_var_variation3.phpt
+++ /dev/null
@@ -1,42 +0,0 @@
---TEST--
-Test function get_cfg_var() by substituting argument 1 with emptyUnsetUndefNull values.
---CREDITS--
-Francesco Fullone ff@ideato.it
-#PHPTestFest Cesena Italia on 2009-06-20
---INI--
-session.use_cookies=0
-session.serialize_handler=php
-session.save_handler=files
---FILE--
-<?php
-
-
-echo "*** Test substituting argument 1 with emptyUnsetUndefNull values ***\n";
-
-
-
-$unset_var = 10;
-unset($unset_var);
-
-$variation_array = array(
- 'unset var' => @$unset_var,
- 'undefined var' => @$undefined_var,
- 'empty string DQ' => "",
- 'empty string SQ' => '',
- 'uppercase NULL' => NULL,
- 'lowercase null' => null
- );
-
-
-foreach ( $variation_array as $var ) {
- var_dump(get_cfg_var( $var ) );
-}
-?>
---EXPECT--
-*** Test substituting argument 1 with emptyUnsetUndefNull values ***
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
diff --git a/ext/standard/tests/general_functions/getservbyname_variation10.phpt b/ext/standard/tests/general_functions/getservbyname_variation10.phpt
deleted file mode 100644
index db1d47f3ef..0000000000
--- a/ext/standard/tests/general_functions/getservbyname_variation10.phpt
+++ /dev/null
@@ -1,36 +0,0 @@
---TEST--
-Test function getservbyname() by substituting argument 2 with emptyUnsetUndefNull values.
---FILE--
-<?php
-
-
-echo "*** Test substituting argument 2 with emptyUnsetUndefNull values ***\n";
-
-$service = "www";
-
-
-$unset_var = 10;
-unset($unset_var);
-
-$variation_array = array(
- 'unset var' => @$unset_var,
- 'undefined var' => @$undefined_var,
- 'empty string DQ' => "",
- 'empty string SQ' => '',
- 'uppercase NULL' => NULL,
- 'lowercase null' => null,
- );
-
-
-foreach ( $variation_array as $var ) {
- var_dump(getservbyname( $service, $var ) );
-}
-?>
---EXPECT--
-*** Test substituting argument 2 with emptyUnsetUndefNull values ***
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
diff --git a/ext/standard/tests/general_functions/getservbyname_variation3.phpt b/ext/standard/tests/general_functions/getservbyname_variation3.phpt
deleted file mode 100644
index 6602ce0bfc..0000000000
--- a/ext/standard/tests/general_functions/getservbyname_variation3.phpt
+++ /dev/null
@@ -1,36 +0,0 @@
---TEST--
-Test function getservbyname() by substituting argument 1 with emptyUnsetUndefNull values.
---FILE--
-<?php
-
-
-echo "*** Test substituting argument 1 with emptyUnsetUndefNull values ***\n";
-
-$protocol = "tcp";
-
-
-$unset_var = 10;
-unset($unset_var);
-
-$variation_array = array(
- 'unset var' => @$unset_var,
- 'undefined var' => @$undefined_var,
- 'empty string DQ' => "",
- 'empty string SQ' => '',
- 'uppercase NULL' => NULL,
- 'lowercase null' => null,
- );
-
-
-foreach ( $variation_array as $var ) {
- var_dump(getservbyname( $var , $protocol ) );
-}
-?>
---EXPECT--
-*** Test substituting argument 1 with emptyUnsetUndefNull values ***
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
diff --git a/ext/standard/tests/general_functions/getservbyport_variation1.phpt b/ext/standard/tests/general_functions/getservbyport_variation1.phpt
index a6358027a5..03cc5b46e9 100644
--- a/ext/standard/tests/general_functions/getservbyport_variation1.phpt
+++ b/ext/standard/tests/general_functions/getservbyport_variation1.phpt
@@ -15,16 +15,13 @@ Simone Gentili (sensorario@gmail.com)
?>
--FILE--
<?php
- var_dump(getservbyport( -1, "tcp" ));
- var_dump(getservbyport( 80, "ppp" ));
- var_dump(getservbyport( null, null));
- var_dump(getservbyport( 2, 2));
- var_dump(getservbyport( "80", "tcp"));
-
+var_dump(getservbyport( -1, "tcp" ));
+var_dump(getservbyport( 80, "ppp" ));
+var_dump(getservbyport( 2, 2));
+var_dump(getservbyport( "80", "tcp"));
?>
--EXPECTF--
bool(false)
bool(false)
bool(false)
-bool(false)
string(%d) "%s"
diff --git a/ext/standard/tests/general_functions/http_response_code.phpt b/ext/standard/tests/general_functions/http_response_code.phpt
index bc2775f3d3..ab290c3cef 100644
--- a/ext/standard/tests/general_functions/http_response_code.phpt
+++ b/ext/standard/tests/general_functions/http_response_code.phpt
@@ -2,6 +2,15 @@
Test http_response_code basic functionality
--CREDITS--
Gabriel Caruso (carusogabriel@php.net)
+--SKIPIF--
+<?php
+if (getenv('SKIP_REPEAT')) {
+ /* The http_response_code leaks across repeats. Technically that's a bug, but it's something
+ * that only affects the CLI repeat option, where the response code is not meaningful in the
+ * first place. Other SAPIs will properly reset the response code for each request. */
+ die('skip Not repeatable');
+}
+?>
--FILE--
<?php
var_dump(
diff --git a/ext/standard/tests/general_functions/ini_set_types.phpt b/ext/standard/tests/general_functions/ini_set_types.phpt
new file mode 100644
index 0000000000..16def381db
--- /dev/null
+++ b/ext/standard/tests/general_functions/ini_set_types.phpt
@@ -0,0 +1,34 @@
+--TEST--
+ini_set() accepts non-strings under strict_types
+--FILE--
+<?php
+declare(strict_types=1);
+
+ini_set('docref_root', null);
+var_dump(ini_get('docref_root'));
+ini_set('html_errors', true);
+var_dump(ini_get('html_errors'));
+ini_set('html_errors', false);
+var_dump(ini_get('html_errors'));
+ini_set('precision', 6);
+var_dump(ini_get('precision'));
+
+// There are no float options in always enabled extensions.
+// Just use a random string property, even though it doesn't make sense.
+ini_set('user_agent', 3.14);
+var_dump(ini_get('user_agent'));
+
+try {
+ ini_set('foo', []);
+} catch (TypeError $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+string(0) ""
+string(1) "1"
+string(0) ""
+string(1) "6"
+string(4) "3.14"
+ini_set(): Argument #2 ($value) must be of type string|int|float|bool|null
diff --git a/ext/standard/tests/general_functions/proc_nice_basic.phpt b/ext/standard/tests/general_functions/proc_nice_basic.phpt
index b8cc3cd128..17bca0f7b7 100644
--- a/ext/standard/tests/general_functions/proc_nice_basic.phpt
+++ b/ext/standard/tests/general_functions/proc_nice_basic.phpt
@@ -25,7 +25,7 @@ if ($exit_code !== 0) {
else
return -1;
}
- $delta = 10;
+ $delta = 5;
$pid = getmypid();
$niceBefore = getNice($pid);
proc_nice($delta);
diff --git a/ext/standard/tests/general_functions/uniqid_basic.phpt b/ext/standard/tests/general_functions/uniqid_basic.phpt
index 0e782cdfd1..408f72bfdb 100644
--- a/ext/standard/tests/general_functions/uniqid_basic.phpt
+++ b/ext/standard/tests/general_functions/uniqid_basic.phpt
@@ -6,8 +6,8 @@ echo "*** Testing uniqid() : basic functionality ***\n";
echo "\nuniqid() without a prefix\n";
var_dump(uniqid());
-var_dump(uniqid(null, true));
-var_dump(uniqid(null, false));
+var_dump(uniqid('', true));
+var_dump(uniqid('', false));
echo "\n\n";
echo "uniqid() with a prefix\n";
@@ -17,7 +17,6 @@ $prefix = array (
99999,
"99999",
10.5e2,
- null,
true,
false
);
@@ -52,10 +51,6 @@ string(17) "1050%s"
string(27) "1050%s.%s"
string(17) "1050%s"
-string(13) "%s"
-string(23) "%s.%s"
-string(13) "%s"
-
string(14) "1%s"
string(24) "1%s.%s"
string(14) "1%s"
@@ -63,4 +58,3 @@ string(14) "1%s"
string(13) "%s"
string(23) "%s.%s"
string(13) "%s"
-
diff --git a/ext/standard/tests/image/image_type_to_extension.phpt b/ext/standard/tests/image/image_type_to_extension.phpt
index 448aac4e99..fd60fc454e 100644
--- a/ext/standard/tests/image/image_type_to_extension.phpt
+++ b/ext/standard/tests/image/image_type_to_extension.phpt
@@ -29,7 +29,7 @@ image_type_to_extension()
printf("Constant: %s\n\tWith dot: %s\n\tWithout dot: %s\n", $name, image_type_to_extension($constant), image_type_to_extension($constant, false));
}
- var_dump(image_type_to_extension(1000000, NULL));
+ var_dump(image_type_to_extension(1000000, false));
var_dump(image_type_to_extension(0));
?>
Done
diff --git a/ext/standard/tests/math/abs.phpt b/ext/standard/tests/math/abs.phpt
index 2feb989651..505a93e3e5 100644
--- a/ext/standard/tests/math/abs.phpt
+++ b/ext/standard/tests/math/abs.phpt
@@ -8,18 +8,21 @@ define('LONG_MIN', -LONG_MAX - 1);
printf("%d,%d,%d,%d\n",is_int(LONG_MIN ),is_int(LONG_MAX ),
is_int(LONG_MIN-1),is_int(LONG_MAX+1));
-$tests = <<<TESTS
- 1 === abs(-1)
- 1.5 === abs(-1.5)
- 1 === abs("-1")
- 1.5 === abs("-1.5")
--LONG_MIN+1 === abs(LONG_MIN-1)
--LONG_MIN === abs(LONG_MIN)
--(LONG_MIN+1) === abs(LONG_MIN+1)
-TESTS;
+var_dump(1 === abs(-1));
+var_dump(1.5 === abs(-1.5));
+var_dump(1 === abs("-1"));
+var_dump(1.5 === abs("-1.5"));
+var_dump(-LONG_MIN+1 === abs(LONG_MIN-1));
+var_dump(-LONG_MIN === abs(LONG_MIN));
+var_dump(-(LONG_MIN+1) === abs(LONG_MIN+1));
-include(__DIR__ . '/../../../../tests/quicktester.inc');
?>
--EXPECT--
1,1,0,0
-OK
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/standard/tests/math/abs_basic.phpt b/ext/standard/tests/math/abs_basic.phpt
index 65120efef6..2b4957b996 100644
--- a/ext/standard/tests/math/abs_basic.phpt
+++ b/ext/standard/tests/math/abs_basic.phpt
@@ -26,7 +26,7 @@ for ($i = 0; $i < count($values); $i++) {
var_dump($res);
}
?>
---EXPECT--
+--EXPECTF--
*** Testing abs() : basic functionality ***
int(23)
int(23)
@@ -39,6 +39,8 @@ int(23)
float(23.45)
float(23.45)
float(23.45)
+
+Deprecated: abs(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
int(0)
int(1)
int(0)
diff --git a/ext/standard/tests/math/abs_variation.phpt b/ext/standard/tests/math/abs_variation.phpt
index 6b7a184cbd..d7f878bc01 100644
--- a/ext/standard/tests/math/abs_variation.phpt
+++ b/ext/standard/tests/math/abs_variation.phpt
@@ -78,13 +78,17 @@ foreach($inputs as $input) {
fclose($fp);
?>
---EXPECT--
+--EXPECTF--
*** Testing abs() : usage variations ***
-- Iteration 1 --
+
+Deprecated: abs(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
int(0)
-- Iteration 2 --
+
+Deprecated: abs(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
int(0)
-- Iteration 3 --
@@ -121,9 +125,13 @@ abs(): Argument #1 ($num) must be of type int|float, string given
abs(): Argument #1 ($num) must be of type int|float, classA given
-- Iteration 14 --
+
+Deprecated: abs(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
int(0)
-- Iteration 15 --
+
+Deprecated: abs(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
int(0)
-- Iteration 16 --
diff --git a/ext/standard/tests/math/acos_variation.phpt b/ext/standard/tests/math/acos_variation.phpt
index 163487d99f..1fac4ccc24 100644
--- a/ext/standard/tests/math/acos_variation.phpt
+++ b/ext/standard/tests/math/acos_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(NAN)
float(NAN)
float(NAN)
float(NAN)
-float(1.5707963267948966)
float(0)
float(1.5707963267948966)
diff --git a/ext/standard/tests/math/acosh_variation.phpt b/ext/standard/tests/math/acosh_variation.phpt
index 904316a998..9335961e63 100644
--- a/ext/standard/tests/math/acosh_variation.phpt
+++ b/ext/standard/tests/math/acosh_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(3.8281684713331012)
float(3.8475627390640357)
float(3.8475627390640357)
float(7.600902209541989)
-float(NAN)
float(0)
float(NAN)
diff --git a/ext/standard/tests/math/asin_variation.phpt b/ext/standard/tests/math/asin_variation.phpt
index 323701c51a..d028689439 100644
--- a/ext/standard/tests/math/asin_variation.phpt
+++ b/ext/standard/tests/math/asin_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(NAN)
float(NAN)
float(NAN)
float(NAN)
-float(0)
float(1.5707963267948966)
float(0)
diff --git a/ext/standard/tests/math/asinh_variation.phpt b/ext/standard/tests/math/asinh_variation.phpt
index 4958468064..e7b9fd9c54 100644
--- a/ext/standard/tests/math/asinh_variation.phpt
+++ b/ext/standard/tests/math/asinh_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(3.829113652)
float(3.848471992)
float(3.848471992)
float(7.60090271)
-float(0)
float(0.881373587)
float(0)
diff --git a/ext/standard/tests/math/atan2_basic.phpt b/ext/standard/tests/math/atan2_basic.phpt
index 1763795cfa..1c89cfa1c2 100644
--- a/ext/standard/tests/math/atan2_basic.phpt
+++ b/ext/standard/tests/math/atan2_basic.phpt
@@ -13,7 +13,6 @@ $valuesy = array(23,
"23",
"23.45",
"2.345e1",
- null,
true,
false);
@@ -26,7 +25,6 @@ $valuesx = array(23,
"23",
"23.45",
"2.345e1",
- null,
true,
false);
@@ -48,7 +46,6 @@ Y:23 X:23 float(0.78539816339745)
Y:23 X:23 float(0.78539816339745)
Y:23 X:23.45 float(0.77571063007847)
Y:23 X:2.345e1 float(0.77571063007847)
-Y:23 X: float(1.5707963267949)
Y:23 X:1 float(1.5273454314034)
Y:23 X: float(1.5707963267949)
Y:-23 X:23 float(-0.78539816339745)
@@ -60,7 +57,6 @@ Y:-23 X:23 float(-0.78539816339745)
Y:-23 X:23 float(-0.78539816339745)
Y:-23 X:23.45 float(-0.77571063007847)
Y:-23 X:2.345e1 float(-0.77571063007847)
-Y:-23 X: float(-1.5707963267949)
Y:-23 X:1 float(-1.5273454314034)
Y:-23 X: float(-1.5707963267949)
Y:23.45 X:23 float(0.79508569671643)
@@ -72,7 +68,6 @@ Y:23.45 X:23 float(0.79508569671643)
Y:23.45 X:23 float(0.79508569671643)
Y:23.45 X:23.45 float(0.78539816339745)
Y:23.45 X:2.345e1 float(0.78539816339745)
-Y:23.45 X: float(1.5707963267949)
Y:23.45 X:1 float(1.5281782247706)
Y:23.45 X: float(1.5707963267949)
Y:-23.45 X:23 float(-0.79508569671643)
@@ -84,7 +79,6 @@ Y:-23.45 X:23 float(-0.79508569671643)
Y:-23.45 X:23 float(-0.79508569671643)
Y:-23.45 X:23.45 float(-0.78539816339745)
Y:-23.45 X:2.345e1 float(-0.78539816339745)
-Y:-23.45 X: float(-1.5707963267949)
Y:-23.45 X:1 float(-1.5281782247706)
Y:-23.45 X: float(-1.5707963267949)
Y:23 X:23 float(0.78539816339745)
@@ -96,7 +90,6 @@ Y:23 X:23 float(0.78539816339745)
Y:23 X:23 float(0.78539816339745)
Y:23 X:23.45 float(0.77571063007847)
Y:23 X:2.345e1 float(0.77571063007847)
-Y:23 X: float(1.5707963267949)
Y:23 X:1 float(1.5273454314034)
Y:23 X: float(1.5707963267949)
Y:23 X:23 float(0.78539816339745)
@@ -108,7 +101,6 @@ Y:23 X:23 float(0.78539816339745)
Y:23 X:23 float(0.78539816339745)
Y:23 X:23.45 float(0.77571063007847)
Y:23 X:2.345e1 float(0.77571063007847)
-Y:23 X: float(1.5707963267949)
Y:23 X:1 float(1.5273454314034)
Y:23 X: float(1.5707963267949)
Y:23 X:23 float(0.78539816339745)
@@ -120,7 +112,6 @@ Y:23 X:23 float(0.78539816339745)
Y:23 X:23 float(0.78539816339745)
Y:23 X:23.45 float(0.77571063007847)
Y:23 X:2.345e1 float(0.77571063007847)
-Y:23 X: float(1.5707963267949)
Y:23 X:1 float(1.5273454314034)
Y:23 X: float(1.5707963267949)
Y:23.45 X:23 float(0.79508569671643)
@@ -132,7 +123,6 @@ Y:23.45 X:23 float(0.79508569671643)
Y:23.45 X:23 float(0.79508569671643)
Y:23.45 X:23.45 float(0.78539816339745)
Y:23.45 X:2.345e1 float(0.78539816339745)
-Y:23.45 X: float(1.5707963267949)
Y:23.45 X:1 float(1.5281782247706)
Y:23.45 X: float(1.5707963267949)
Y:2.345e1 X:23 float(0.79508569671643)
@@ -144,21 +134,8 @@ Y:2.345e1 X:23 float(0.79508569671643)
Y:2.345e1 X:23 float(0.79508569671643)
Y:2.345e1 X:23.45 float(0.78539816339745)
Y:2.345e1 X:2.345e1 float(0.78539816339745)
-Y:2.345e1 X: float(1.5707963267949)
Y:2.345e1 X:1 float(1.5281782247706)
Y:2.345e1 X: float(1.5707963267949)
-Y: X:23 float(0)
-Y: X:-23 float(3.1415926535898)
-Y: X:23.45 float(0)
-Y: X:-23.45 float(3.1415926535898)
-Y: X:23 float(0)
-Y: X:23 float(0)
-Y: X:23 float(0)
-Y: X:23.45 float(0)
-Y: X:2.345e1 float(0)
-Y: X: float(0)
-Y: X:1 float(0)
-Y: X: float(0)
Y:1 X:23 float(0.043450895391531)
Y:1 X:-23 float(3.0981417581983)
Y:1 X:23.45 float(0.042618102024328)
@@ -168,7 +145,6 @@ Y:1 X:23 float(0.043450895391531)
Y:1 X:23 float(0.043450895391531)
Y:1 X:23.45 float(0.042618102024328)
Y:1 X:2.345e1 float(0.042618102024328)
-Y:1 X: float(1.5707963267949)
Y:1 X:1 float(0.78539816339745)
Y:1 X: float(1.5707963267949)
Y: X:23 float(0)
@@ -180,6 +156,5 @@ Y: X:23 float(0)
Y: X:23 float(0)
Y: X:23.45 float(0)
Y: X:2.345e1 float(0)
-Y: X: float(0)
Y: X:1 float(0)
Y: X: float(0)
diff --git a/ext/standard/tests/math/atan_variation.phpt b/ext/standard/tests/math/atan_variation.phpt
index 88593c84de..abd3831ddd 100644
--- a/ext/standard/tests/math/atan_variation.phpt
+++ b/ext/standard/tests/math/atan_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(1.5273454314033659)
float(1.528178224770569)
float(1.528178224770569)
float(1.5697963271282298)
-float(0)
float(0.7853981633974483)
float(0)
diff --git a/ext/standard/tests/math/atanh_variation.phpt b/ext/standard/tests/math/atanh_variation.phpt
index fa71e206c8..f740c1ccc0 100644
--- a/ext/standard/tests/math/atanh_variation.phpt
+++ b/ext/standard/tests/math/atanh_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(NAN)
float(NAN)
float(NAN)
float(NAN)
-float(0)
float(INF)
float(0)
diff --git a/ext/standard/tests/math/base_convert_variation1.phpt b/ext/standard/tests/math/base_convert_variation1.phpt
index 8d8e0ff3a2..fd06465ab5 100644
--- a/ext/standard/tests/math/base_convert_variation1.phpt
+++ b/ext/standard/tests/math/base_convert_variation1.phpt
@@ -4,10 +4,6 @@ Test base_convert() function : usage variations - different data types as $numbe
<?php
echo "*** Testing base_convert() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
-
// heredoc string
$heredoc = <<<EOT
abc
@@ -32,10 +28,6 @@ $inputs = array(
1.234567E-2,
.5,
- // null data
-/*11*/ NULL,
- null,
-
// boolean data
/*13*/ true,
false,
@@ -52,12 +44,6 @@ $inputs = array(
'abcxyz',
$heredoc,
- // undefined data
-/*23*/ @$undefined_var,
-
- // unset data
-/*24*/ @$unset_var,
-
// resource variable
/*25*/ $fp
);
@@ -121,7 +107,7 @@ Deprecated: Invalid characters passed for attempted conversion, these have been
string(1) "5"
-- Iteration 11 --
-string(1) "0"
+string(1) "1"
-- Iteration 12 --
string(1) "0"
@@ -133,40 +119,28 @@ string(1) "1"
string(1) "0"
-- Iteration 15 --
-string(1) "1"
+string(1) "0"
-- Iteration 16 --
string(1) "0"
-- Iteration 17 --
-string(1) "0"
-
--- Iteration 18 --
-string(1) "0"
-
--- Iteration 19 --
base_convert(): Argument #1 ($num) must be of type string, array given
--- Iteration 20 --
+-- Iteration 18 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
string(1) "0"
--- Iteration 21 --
+-- Iteration 19 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
string(1) "0"
--- Iteration 22 --
+-- Iteration 20 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
string(1) "0"
--- Iteration 23 --
-string(1) "0"
-
--- Iteration 24 --
-string(1) "0"
-
--- Iteration 25 --
+-- Iteration 21 --
base_convert(): Argument #1 ($num) must be of type string, resource given
diff --git a/ext/standard/tests/math/base_convert_variation2.phpt b/ext/standard/tests/math/base_convert_variation2.phpt
new file mode 100644
index 0000000000..279cff9920
--- /dev/null
+++ b/ext/standard/tests/math/base_convert_variation2.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Test base_convert() function : strange literals
+--FILE--
+<?php
+echo 'Binary to decimal:', \PHP_EOL;
+var_dump(base_convert('0b', 2, 10));
+var_dump(base_convert('0B', 2, 10));
+var_dump(base_convert('', 2, 10));
+echo 'Octal to decimal:', \PHP_EOL;
+var_dump(base_convert('0o', 8, 10));
+var_dump(base_convert('0O', 8, 10));
+var_dump(base_convert('0', 8, 10));
+var_dump(base_convert('', 8, 10));
+echo 'Hexadecimal to decimal:', \PHP_EOL;
+var_dump(base_convert('0x', 16, 10));
+var_dump(base_convert('0X', 16, 10));
+var_dump(base_convert('', 16, 10));
+?>
+--EXPECT--
+Binary to decimal:
+string(1) "0"
+string(1) "0"
+string(1) "0"
+Octal to decimal:
+string(1) "0"
+string(1) "0"
+string(1) "0"
+string(1) "0"
+Hexadecimal to decimal:
+string(1) "0"
+string(1) "0"
+string(1) "0"
diff --git a/ext/standard/tests/math/base_convert_variation3.phpt b/ext/standard/tests/math/base_convert_variation3.phpt
new file mode 100644
index 0000000000..27e0841108
--- /dev/null
+++ b/ext/standard/tests/math/base_convert_variation3.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Test base_convert() function: converting '0'
+--FILE--
+<?php
+echo 'Binary to decimal:', \PHP_EOL;
+var_dump(base_convert('0', 2, 10));
+echo 'Octal to decimal:', \PHP_EOL;
+var_dump(base_convert('0', 8, 10));
+echo 'Hexadecimal to decimal:', \PHP_EOL;
+var_dump(base_convert('0', 16, 10));
+?>
+--EXPECT--
+Binary to decimal:
+string(1) "0"
+Octal to decimal:
+string(1) "0"
+Hexadecimal to decimal:
+string(1) "0"
diff --git a/ext/standard/tests/math/bindec_basic.phpt b/ext/standard/tests/math/bindec_basic.phpt
index 03eec8ee30..7640171fe6 100644
--- a/ext/standard/tests/math/bindec_basic.phpt
+++ b/ext/standard/tests/math/bindec_basic.phpt
@@ -26,7 +26,7 @@ $values = array(111000111,
011237,
true,
false,
- null);
+ );
for ($i = 0; $i < count($values); $i++) {
$res = bindec($values[$i]);
@@ -74,4 +74,3 @@ Deprecated: Invalid characters passed for attempted conversion, these have been
int(0)
int(1)
int(0)
-int(0)
diff --git a/ext/standard/tests/math/bindec_basic_64bit.phpt b/ext/standard/tests/math/bindec_basic_64bit.phpt
index b8f46b6748..8fece221c0 100644
--- a/ext/standard/tests/math/bindec_basic_64bit.phpt
+++ b/ext/standard/tests/math/bindec_basic_64bit.phpt
@@ -26,7 +26,7 @@ $values = array(111000111,
011237,
true,
false,
- null);
+ );
for ($i = 0; $i < count($values); $i++) {
$res = bindec($values[$i]);
@@ -74,4 +74,3 @@ Deprecated: Invalid characters passed for attempted conversion, these have been
int(0)
int(1)
int(0)
-int(0)
diff --git a/ext/standard/tests/math/bindec_variation1.phpt b/ext/standard/tests/math/bindec_variation1.phpt
index 5c6b2e1b1e..420ceeed7a 100644
--- a/ext/standard/tests/math/bindec_variation1.phpt
+++ b/ext/standard/tests/math/bindec_variation1.phpt
@@ -7,9 +7,6 @@ if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only");
--FILE--
<?php
echo "*** Testing bindec() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
// heredoc string
$heredoc = <<<EOT
@@ -34,10 +31,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*10*/ NULL,
- null,
-
// boolean data
/*12*/ true,
false,
@@ -54,12 +47,6 @@ $inputs = array(
'abcxyz',
$heredoc,
- // undefined data
-/*22*/ @$undefined_var,
-
- // unset data
-/*23*/ @$unset_var,
-
// resource variable
/*24*/ $fp
);
@@ -122,7 +109,7 @@ Deprecated: Invalid characters passed for attempted conversion, these have been
int(0)
-- Iteration 10 --
-int(0)
+int(1)
-- Iteration 11 --
int(0)
@@ -134,40 +121,28 @@ int(1)
int(0)
-- Iteration 14 --
-int(1)
+int(0)
-- Iteration 15 --
int(0)
-- Iteration 16 --
-int(0)
-
--- Iteration 17 --
-int(0)
-
--- Iteration 18 --
bindec(): Argument #1 ($binary_string) must be of type string, array given
--- Iteration 19 --
+-- Iteration 17 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(0)
--- Iteration 20 --
+-- Iteration 18 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(0)
--- Iteration 21 --
+-- Iteration 19 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(0)
--- Iteration 22 --
-int(0)
-
--- Iteration 23 --
-int(0)
-
--- Iteration 24 --
+-- Iteration 20 --
bindec(): Argument #1 ($binary_string) must be of type string, resource given
diff --git a/ext/standard/tests/math/bindec_variation1_64bit.phpt b/ext/standard/tests/math/bindec_variation1_64bit.phpt
index e83edbe59c..56bbbd3564 100644
--- a/ext/standard/tests/math/bindec_variation1_64bit.phpt
+++ b/ext/standard/tests/math/bindec_variation1_64bit.phpt
@@ -7,9 +7,6 @@ if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
--FILE--
<?php
echo "*** Testing bindec() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
// heredoc string
$heredoc = <<<EOT
@@ -34,10 +31,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*10*/ NULL,
- null,
-
// boolean data
/*12*/ true,
false,
@@ -54,12 +47,6 @@ $inputs = array(
'abcxyz',
$heredoc,
- // undefined data
-/*22*/ @$undefined_var,
-
- // unset data
-/*23*/ @$unset_var,
-
// resource variable
/*24*/ $fp
);
@@ -122,7 +109,7 @@ Deprecated: Invalid characters passed for attempted conversion, these have been
int(0)
-- Iteration 10 --
-int(0)
+int(1)
-- Iteration 11 --
int(0)
@@ -134,40 +121,28 @@ int(1)
int(0)
-- Iteration 14 --
-int(1)
+int(0)
-- Iteration 15 --
int(0)
-- Iteration 16 --
-int(0)
-
--- Iteration 17 --
-int(0)
-
--- Iteration 18 --
bindec(): Argument #1 ($binary_string) must be of type string, array given
--- Iteration 19 --
+-- Iteration 17 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(0)
--- Iteration 20 --
+-- Iteration 18 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(0)
--- Iteration 21 --
+-- Iteration 19 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(0)
--- Iteration 22 --
-int(0)
-
--- Iteration 23 --
-int(0)
-
--- Iteration 24 --
+-- Iteration 20 --
bindec(): Argument #1 ($binary_string) must be of type string, resource given
diff --git a/ext/standard/tests/math/bindec_variation2.phpt b/ext/standard/tests/math/bindec_variation2.phpt
new file mode 100644
index 0000000000..3fddc5d856
--- /dev/null
+++ b/ext/standard/tests/math/bindec_variation2.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Test bindec() function : strange literals
+--FILE--
+<?php
+
+var_dump(bindec('0b'));
+var_dump(bindec('0B'));
+var_dump(bindec(''));
+
+?>
+--EXPECT--
+int(0)
+int(0)
+int(0)
diff --git a/ext/standard/tests/math/ceil_basic.phpt b/ext/standard/tests/math/ceil_basic.phpt
index a8b3ede2a2..7bdc87d16e 100644
--- a/ext/standard/tests/math/ceil_basic.phpt
+++ b/ext/standard/tests/math/ceil_basic.phpt
@@ -33,7 +33,7 @@ for ($i = 0; $i < count($values); $i++) {
}
?>
---EXPECT--
+--EXPECTF--
*** Testing ceil() : basic functionality ***
float(0)
float(0)
@@ -54,4 +54,6 @@ float(-3950)
float(39)
float(1)
float(0)
+
+Deprecated: ceil(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
diff --git a/ext/standard/tests/math/ceil_variation1.phpt b/ext/standard/tests/math/ceil_variation1.phpt
index ce61442f65..7751946ea9 100644
--- a/ext/standard/tests/math/ceil_variation1.phpt
+++ b/ext/standard/tests/math/ceil_variation1.phpt
@@ -71,13 +71,17 @@ foreach($inputs as $input) {
};
fclose($fp);
?>
---EXPECT--
+--EXPECTF--
*** Testing ceil() : usage variations ***
-- Iteration 1 --
+
+Deprecated: ceil(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 2 --
+
+Deprecated: ceil(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 3 --
@@ -114,9 +118,13 @@ ceil(): Argument #1 ($num) must be of type int|float, string given
ceil(): Argument #1 ($num) must be of type int|float, classA given
-- Iteration 14 --
+
+Deprecated: ceil(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 15 --
+
+Deprecated: ceil(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 16 --
diff --git a/ext/standard/tests/math/cos_variation.phpt b/ext/standard/tests/math/cos_variation.phpt
index 23af5e873b..19d72f60a7 100644
--- a/ext/standard/tests/math/cos_variation.phpt
+++ b/ext/standard/tests/math/cos_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(-0.5328330203)
float(-0.1117112391)
float(-0.1117112391)
float(0.5623790763)
-float(1)
float(0.5403023059)
float(1)
diff --git a/ext/standard/tests/math/cosh_variation.phpt b/ext/standard/tests/math/cosh_variation.phpt
index 1a0a6b69e7..475c19fd50 100644
--- a/ext/standard/tests/math/cosh_variation.phpt
+++ b/ext/standard/tests/math/cosh_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(4872401723)
float(7641446995)
float(7641446995)
float(INF)
-float(1)
float(1.543080635)
float(1)
diff --git a/ext/standard/tests/math/decbin_basic.phpt b/ext/standard/tests/math/decbin_basic.phpt
index 54b771ca26..ff1d5896f6 100644
--- a/ext/standard/tests/math/decbin_basic.phpt
+++ b/ext/standard/tests/math/decbin_basic.phpt
@@ -14,7 +14,6 @@ $values = array(10,
"0x5F",
true,
false,
- null,
);
foreach ($values as $value) {
@@ -39,4 +38,3 @@ string(6) "100111"
decbin(): Argument #1 ($num) must be of type int, string given
string(1) "1"
string(1) "0"
-string(1) "0"
diff --git a/ext/standard/tests/math/decbin_variation1.phpt b/ext/standard/tests/math/decbin_variation1.phpt
index fd9addc721..5ac82d41d6 100644
--- a/ext/standard/tests/math/decbin_variation1.phpt
+++ b/ext/standard/tests/math/decbin_variation1.phpt
@@ -9,9 +9,6 @@ if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only");
--FILE--
<?php
echo "*** Testing decbin() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
// heredoc string
$heredoc = <<<EOT
@@ -43,10 +40,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*12*/ NULL,
- null,
-
// boolean data
/*14*/ true,
false,
@@ -66,12 +59,6 @@ $inputs = array(
// object data
/*24*/ new classA(),
- // undefined data
-/*25*/ @$undefined_var,
-
- // unset data
-/*26*/ @$unset_var,
-
// resource variable
/*27*/ $fp
);
@@ -127,7 +114,7 @@ string(1) "0"
string(1) "0"
-- Iteration 12 --
-string(1) "0"
+string(1) "1"
-- Iteration 13 --
string(1) "0"
@@ -139,37 +126,25 @@ string(1) "1"
string(1) "0"
-- Iteration 16 --
-string(1) "1"
+decbin(): Argument #1 ($num) must be of type int, string given
-- Iteration 17 --
-string(1) "0"
+decbin(): Argument #1 ($num) must be of type int, string given
-- Iteration 18 --
-decbin(): Argument #1 ($num) must be of type int, string given
+decbin(): Argument #1 ($num) must be of type int, array given
-- Iteration 19 --
decbin(): Argument #1 ($num) must be of type int, string given
-- Iteration 20 --
-decbin(): Argument #1 ($num) must be of type int, array given
+decbin(): Argument #1 ($num) must be of type int, string given
-- Iteration 21 --
decbin(): Argument #1 ($num) must be of type int, string given
-- Iteration 22 --
-decbin(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 23 --
-decbin(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 24 --
decbin(): Argument #1 ($num) must be of type int, classA given
--- Iteration 25 --
-string(1) "0"
-
--- Iteration 26 --
-string(1) "0"
-
--- Iteration 27 --
+-- Iteration 23 --
decbin(): Argument #1 ($num) must be of type int, resource given
diff --git a/ext/standard/tests/math/decbin_variation1_64bit.phpt b/ext/standard/tests/math/decbin_variation1_64bit.phpt
index f9e1b19b29..15bb864398 100644
--- a/ext/standard/tests/math/decbin_variation1_64bit.phpt
+++ b/ext/standard/tests/math/decbin_variation1_64bit.phpt
@@ -9,9 +9,6 @@ if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
--FILE--
<?php
echo "*** Testing decbin() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
// heredoc string
$heredoc = <<<EOT
@@ -43,10 +40,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*12*/ NULL,
- null,
-
// boolean data
/*14*/ true,
false,
@@ -66,12 +59,6 @@ $inputs = array(
// object data
/*24*/ new classA(),
- // undefined data
-/*25*/ @$undefined_var,
-
- // unset data
-/*26*/ @$unset_var,
-
// resource variable
/*27*/ $fp
);
@@ -125,7 +112,7 @@ string(1) "0"
string(1) "0"
-- Iteration 12 --
-string(1) "0"
+string(1) "1"
-- Iteration 13 --
string(1) "0"
@@ -137,37 +124,25 @@ string(1) "1"
string(1) "0"
-- Iteration 16 --
-string(1) "1"
+decbin(): Argument #1 ($num) must be of type int, string given
-- Iteration 17 --
-string(1) "0"
+decbin(): Argument #1 ($num) must be of type int, string given
-- Iteration 18 --
-decbin(): Argument #1 ($num) must be of type int, string given
+decbin(): Argument #1 ($num) must be of type int, array given
-- Iteration 19 --
decbin(): Argument #1 ($num) must be of type int, string given
-- Iteration 20 --
-decbin(): Argument #1 ($num) must be of type int, array given
+decbin(): Argument #1 ($num) must be of type int, string given
-- Iteration 21 --
decbin(): Argument #1 ($num) must be of type int, string given
-- Iteration 22 --
-decbin(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 23 --
-decbin(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 24 --
decbin(): Argument #1 ($num) must be of type int, classA given
--- Iteration 25 --
-string(1) "0"
-
--- Iteration 26 --
-string(1) "0"
-
--- Iteration 27 --
+-- Iteration 23 --
decbin(): Argument #1 ($num) must be of type int, resource given
diff --git a/ext/standard/tests/math/dechex_basic.phpt b/ext/standard/tests/math/dechex_basic.phpt
index 92e9c426b3..4fde95ebe7 100644
--- a/ext/standard/tests/math/dechex_basic.phpt
+++ b/ext/standard/tests/math/dechex_basic.phpt
@@ -14,7 +14,6 @@ $values = array(10,
"0x5F",
true,
false,
- null,
);
foreach ($values as $value) {
@@ -39,4 +38,3 @@ string(2) "27"
dechex(): Argument #1 ($num) must be of type int, string given
string(1) "1"
string(1) "0"
-string(1) "0"
diff --git a/ext/standard/tests/math/dechex_variation1.phpt b/ext/standard/tests/math/dechex_variation1.phpt
index 8add97f7a2..8fee0d42ad 100644
--- a/ext/standard/tests/math/dechex_variation1.phpt
+++ b/ext/standard/tests/math/dechex_variation1.phpt
@@ -9,9 +9,6 @@ if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only");
--FILE--
<?php
echo "*** Testing dechex() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
// heredoc string
$heredoc = <<<EOT
@@ -43,10 +40,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*12*/ NULL,
- null,
-
// boolean data
/*14*/ true,
false,
@@ -66,12 +59,6 @@ $inputs = array(
// object data
/*24*/ new classA(),
- // undefined data
-/*25*/ @$undefined_var,
-
- // unset data
-/*26*/ @$unset_var,
-
// resource variable
/*27*/ $fp
);
@@ -127,7 +114,7 @@ string(1) "0"
string(1) "0"
-- Iteration 12 --
-string(1) "0"
+string(1) "1"
-- Iteration 13 --
string(1) "0"
@@ -139,37 +126,25 @@ string(1) "1"
string(1) "0"
-- Iteration 16 --
-string(1) "1"
+dechex(): Argument #1 ($num) must be of type int, string given
-- Iteration 17 --
-string(1) "0"
+dechex(): Argument #1 ($num) must be of type int, string given
-- Iteration 18 --
-dechex(): Argument #1 ($num) must be of type int, string given
+dechex(): Argument #1 ($num) must be of type int, array given
-- Iteration 19 --
dechex(): Argument #1 ($num) must be of type int, string given
-- Iteration 20 --
-dechex(): Argument #1 ($num) must be of type int, array given
+dechex(): Argument #1 ($num) must be of type int, string given
-- Iteration 21 --
dechex(): Argument #1 ($num) must be of type int, string given
-- Iteration 22 --
-dechex(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 23 --
-dechex(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 24 --
dechex(): Argument #1 ($num) must be of type int, classA given
--- Iteration 25 --
-string(1) "0"
-
--- Iteration 26 --
-string(1) "0"
-
--- Iteration 27 --
+-- Iteration 23 --
dechex(): Argument #1 ($num) must be of type int, resource given
diff --git a/ext/standard/tests/math/dechex_variation1_64bit.phpt b/ext/standard/tests/math/dechex_variation1_64bit.phpt
index 020bbcd22c..8435d2bc30 100644
--- a/ext/standard/tests/math/dechex_variation1_64bit.phpt
+++ b/ext/standard/tests/math/dechex_variation1_64bit.phpt
@@ -9,9 +9,6 @@ if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
--FILE--
<?php
echo "*** Testing dechex() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
// heredoc string
$heredoc = <<<EOT
@@ -43,10 +40,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*12*/ NULL,
- null,
-
// boolean data
/*14*/ true,
false,
@@ -66,12 +59,6 @@ $inputs = array(
// object data
/*24*/ new classA(),
- // undefined data
-/*25*/ @$undefined_var,
-
- // unset data
-/*26*/ @$unset_var,
-
// resource variable
/*27*/ $fp
);
@@ -126,7 +113,7 @@ string(1) "0"
string(1) "0"
-- Iteration 12 --
-string(1) "0"
+string(1) "1"
-- Iteration 13 --
string(1) "0"
@@ -138,37 +125,25 @@ string(1) "1"
string(1) "0"
-- Iteration 16 --
-string(1) "1"
+dechex(): Argument #1 ($num) must be of type int, string given
-- Iteration 17 --
-string(1) "0"
+dechex(): Argument #1 ($num) must be of type int, string given
-- Iteration 18 --
-dechex(): Argument #1 ($num) must be of type int, string given
+dechex(): Argument #1 ($num) must be of type int, array given
-- Iteration 19 --
dechex(): Argument #1 ($num) must be of type int, string given
-- Iteration 20 --
-dechex(): Argument #1 ($num) must be of type int, array given
+dechex(): Argument #1 ($num) must be of type int, string given
-- Iteration 21 --
dechex(): Argument #1 ($num) must be of type int, string given
-- Iteration 22 --
-dechex(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 23 --
-dechex(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 24 --
dechex(): Argument #1 ($num) must be of type int, classA given
--- Iteration 25 --
-string(1) "0"
-
--- Iteration 26 --
-string(1) "0"
-
--- Iteration 27 --
+-- Iteration 23 --
dechex(): Argument #1 ($num) must be of type int, resource given
diff --git a/ext/standard/tests/math/decoct_basic.phpt b/ext/standard/tests/math/decoct_basic.phpt
index 9252789b24..2bf63662f4 100644
--- a/ext/standard/tests/math/decoct_basic.phpt
+++ b/ext/standard/tests/math/decoct_basic.phpt
@@ -14,7 +14,6 @@ $values = array(10,
"0x5F",
true,
false,
- null,
);
foreach ($values as $value) {
@@ -39,4 +38,3 @@ string(2) "47"
decoct(): Argument #1 ($num) must be of type int, string given
string(1) "1"
string(1) "0"
-string(1) "0"
diff --git a/ext/standard/tests/math/decoct_variation1.phpt b/ext/standard/tests/math/decoct_variation1.phpt
index a236ea5367..608bb56873 100644
--- a/ext/standard/tests/math/decoct_variation1.phpt
+++ b/ext/standard/tests/math/decoct_variation1.phpt
@@ -9,10 +9,6 @@ if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only");
--FILE--
<?php
echo "*** Testing decoct() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
-
// heredoc string
$heredoc = <<<EOT
@@ -44,10 +40,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*12*/ NULL,
- null,
-
// boolean data
/*14*/ true,
false,
@@ -67,12 +59,6 @@ $inputs = array(
// object data
/*24*/ new classA(),
- // undefined data
-/*25*/ @$undefined_var,
-
- // unset data
-/*26*/ @$unset_var,
-
// resource variable
/*27*/ $fp
);
@@ -127,7 +113,7 @@ string(1) "0"
string(1) "0"
-- Iteration 12 --
-string(1) "0"
+string(1) "1"
-- Iteration 13 --
string(1) "0"
@@ -139,37 +125,25 @@ string(1) "1"
string(1) "0"
-- Iteration 16 --
-string(1) "1"
+decoct(): Argument #1 ($num) must be of type int, string given
-- Iteration 17 --
-string(1) "0"
+decoct(): Argument #1 ($num) must be of type int, string given
-- Iteration 18 --
-decoct(): Argument #1 ($num) must be of type int, string given
+decoct(): Argument #1 ($num) must be of type int, array given
-- Iteration 19 --
decoct(): Argument #1 ($num) must be of type int, string given
-- Iteration 20 --
-decoct(): Argument #1 ($num) must be of type int, array given
+decoct(): Argument #1 ($num) must be of type int, string given
-- Iteration 21 --
decoct(): Argument #1 ($num) must be of type int, string given
-- Iteration 22 --
-decoct(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 23 --
-decoct(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 24 --
decoct(): Argument #1 ($num) must be of type int, classA given
--- Iteration 25 --
-string(1) "0"
-
--- Iteration 26 --
-string(1) "0"
-
--- Iteration 27 --
+-- Iteration 23 --
decoct(): Argument #1 ($num) must be of type int, resource given
diff --git a/ext/standard/tests/math/decoct_variation1_64bit.phpt b/ext/standard/tests/math/decoct_variation1_64bit.phpt
index 2ecc212844..73650f5983 100644
--- a/ext/standard/tests/math/decoct_variation1_64bit.phpt
+++ b/ext/standard/tests/math/decoct_variation1_64bit.phpt
@@ -9,10 +9,6 @@ if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
--FILE--
<?php
echo "*** Testing decoct() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
-
// heredoc string
$heredoc = <<<EOT
@@ -44,10 +40,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*12*/ NULL,
- null,
-
// boolean data
/*14*/ true,
false,
@@ -67,12 +59,6 @@ $inputs = array(
// object data
/*24*/ new classA(),
- // undefined data
-/*25*/ @$undefined_var,
-
- // unset data
-/*26*/ @$unset_var,
-
// resource variable
/*27*/ $fp
);
@@ -127,7 +113,7 @@ string(1) "0"
string(1) "0"
-- Iteration 12 --
-string(1) "0"
+string(1) "1"
-- Iteration 13 --
string(1) "0"
@@ -139,37 +125,25 @@ string(1) "1"
string(1) "0"
-- Iteration 16 --
-string(1) "1"
+decoct(): Argument #1 ($num) must be of type int, string given
-- Iteration 17 --
-string(1) "0"
+decoct(): Argument #1 ($num) must be of type int, string given
-- Iteration 18 --
-decoct(): Argument #1 ($num) must be of type int, string given
+decoct(): Argument #1 ($num) must be of type int, array given
-- Iteration 19 --
decoct(): Argument #1 ($num) must be of type int, string given
-- Iteration 20 --
-decoct(): Argument #1 ($num) must be of type int, array given
+decoct(): Argument #1 ($num) must be of type int, string given
-- Iteration 21 --
decoct(): Argument #1 ($num) must be of type int, string given
-- Iteration 22 --
-decoct(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 23 --
-decoct(): Argument #1 ($num) must be of type int, string given
-
--- Iteration 24 --
decoct(): Argument #1 ($num) must be of type int, classA given
--- Iteration 25 --
-string(1) "0"
-
--- Iteration 26 --
-string(1) "0"
-
--- Iteration 27 --
+-- Iteration 23 --
decoct(): Argument #1 ($num) must be of type int, resource given
diff --git a/ext/standard/tests/math/deg2rad_variation.phpt b/ext/standard/tests/math/deg2rad_variation.phpt
index 01cee28b18..47a5a89367 100644
--- a/ext/standard/tests/math/deg2rad_variation.phpt
+++ b/ext/standard/tests/math/deg2rad_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(0.40142572795869574)
float(0.40927970959267024)
float(0.40927970959267024)
float(17.453292519943293)
-float(0)
float(0.017453292519943295)
float(0)
diff --git a/ext/standard/tests/math/exp_basic.phpt b/ext/standard/tests/math/exp_basic.phpt
index cf67db2c7a..b10ab493a8 100644
--- a/ext/standard/tests/math/exp_basic.phpt
+++ b/ext/standard/tests/math/exp_basic.phpt
@@ -15,7 +15,6 @@ $values = array(10,
"039",
true,
false,
- null,
);
$iterator = 1;
@@ -59,6 +58,3 @@ float(2.718281828459)
-- Iteration 11 --
float(1)
-
--- Iteration 12 --
-float(1)
diff --git a/ext/standard/tests/math/expm1_basic.phpt b/ext/standard/tests/math/expm1_basic.phpt
index 99a46e5599..ea4c165da2 100644
--- a/ext/standard/tests/math/expm1_basic.phpt
+++ b/ext/standard/tests/math/expm1_basic.phpt
@@ -16,7 +16,6 @@ $values = array(10,
"039",
true,
false,
- null,
);
// loop through each element of $values to check the behaviour of expm1()
@@ -62,6 +61,3 @@ float(1.718281828459)
-- Iteration 11 --
float(0)
-
--- Iteration 12 --
-float(0)
diff --git a/ext/standard/tests/math/floor_basic.phpt b/ext/standard/tests/math/floor_basic.phpt
index 3e4650aaa6..308a055f80 100644
--- a/ext/standard/tests/math/floor_basic.phpt
+++ b/ext/standard/tests/math/floor_basic.phpt
@@ -33,7 +33,7 @@ foreach($values as $value) {
};
?>
---EXPECT--
+--EXPECTF--
*** Testing floor() : basic functionality ***
-- floor 0 --
@@ -94,4 +94,6 @@ float(1)
float(0)
-- floor --
+
+Deprecated: floor(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
diff --git a/ext/standard/tests/math/floor_variation1.phpt b/ext/standard/tests/math/floor_variation1.phpt
index 0b5f09f27d..c9ec5e710c 100644
--- a/ext/standard/tests/math/floor_variation1.phpt
+++ b/ext/standard/tests/math/floor_variation1.phpt
@@ -71,13 +71,17 @@ foreach($inputs as $input) {
};
fclose($fp);
?>
---EXPECT--
+--EXPECTF--
*** Testing floor() : usage variations ***
-- Iteration 1 --
+
+Deprecated: floor(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 2 --
+
+Deprecated: floor(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 3 --
@@ -114,9 +118,13 @@ floor(): Argument #1 ($num) must be of type int|float, string given
floor(): Argument #1 ($num) must be of type int|float, classA given
-- Iteration 14 --
+
+Deprecated: floor(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 15 --
+
+Deprecated: floor(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 16 --
diff --git a/ext/standard/tests/math/fmod_basic.phpt b/ext/standard/tests/math/fmod_basic.phpt
index 731b76adab..84cd27125c 100644
--- a/ext/standard/tests/math/fmod_basic.phpt
+++ b/ext/standard/tests/math/fmod_basic.phpt
@@ -13,7 +13,6 @@ $values1 = array(234,
"234",
"234.5",
"23.45e1",
- null,
true,
false);
@@ -26,7 +25,6 @@ $values2 = array(2,
"2",
"2.3",
"2.3e1",
- null,
true,
false);
for ($i = 0; $i < count($values1); $i++) {
@@ -49,7 +47,6 @@ float(0)
float(0)
float(1.700000000000018)
float(4)
-float(NAN)
float(0)
float(NAN)
@@ -63,7 +60,6 @@ float(-0)
float(-0)
float(-1.700000000000018)
float(-4)
-float(NAN)
float(-0)
float(NAN)
@@ -77,7 +73,6 @@ float(0.5)
float(0.5)
float(2.200000000000018)
float(4.5)
-float(NAN)
float(0.5)
float(NAN)
@@ -91,7 +86,6 @@ float(-0.5)
float(-0.5)
float(-2.200000000000018)
float(-4.5)
-float(NAN)
float(-0.5)
float(NAN)
@@ -105,7 +99,6 @@ float(0)
float(0)
float(1.700000000000018)
float(4)
-float(NAN)
float(0)
float(NAN)
@@ -119,7 +112,6 @@ float(0)
float(0)
float(1.700000000000018)
float(4)
-float(NAN)
float(0)
float(NAN)
@@ -133,7 +125,6 @@ float(0)
float(0)
float(1.700000000000018)
float(4)
-float(NAN)
float(0)
float(NAN)
@@ -147,7 +138,6 @@ float(0.5)
float(0.5)
float(2.200000000000018)
float(4.5)
-float(NAN)
float(0.5)
float(NAN)
@@ -161,25 +151,10 @@ float(0.5)
float(0.5)
float(2.200000000000018)
float(4.5)
-float(NAN)
float(0.5)
float(NAN)
iteration 9
-float(0)
-float(0)
-float(0)
-float(0)
-float(0)
-float(0)
-float(0)
-float(0)
-float(0)
-float(NAN)
-float(0)
-float(NAN)
-
-iteration 10
float(1)
float(1)
float(1)
@@ -189,11 +164,10 @@ float(1)
float(1)
float(1)
float(1)
-float(NAN)
float(0)
float(NAN)
-iteration 11
+iteration 10
float(0)
float(0)
float(0)
@@ -203,6 +177,5 @@ float(0)
float(0)
float(0)
float(0)
-float(NAN)
float(0)
float(NAN)
diff --git a/ext/standard/tests/math/hexdec_basic.phpt b/ext/standard/tests/math/hexdec_basic.phpt
index 748c641a1a..2f06b9650a 100644
--- a/ext/standard/tests/math/hexdec_basic.phpt
+++ b/ext/standard/tests/math/hexdec_basic.phpt
@@ -23,7 +23,7 @@ $values = array(0x123abc,
'011237',
true,
false,
- null);
+ );
for ($i = 0; $i < count($values); $i++) {
$res = hexdec($values[$i]);
var_dump($res);
@@ -51,4 +51,3 @@ int(18279)
int(70199)
int(1)
int(0)
-int(0)
diff --git a/ext/standard/tests/math/hexdec_basic_64bit.phpt b/ext/standard/tests/math/hexdec_basic_64bit.phpt
index c7c59451f5..fd6d53b601 100644
--- a/ext/standard/tests/math/hexdec_basic_64bit.phpt
+++ b/ext/standard/tests/math/hexdec_basic_64bit.phpt
@@ -25,7 +25,7 @@ $values = array(0x123abc,
'011237',
true,
false,
- null);
+ );
foreach($values as $value) {
echo "\n-- hexdec $value --\n";
@@ -90,6 +90,3 @@ int(1)
-- hexdec --
int(0)
-
--- hexdec --
-int(0)
diff --git a/ext/standard/tests/math/hexdec_variation1.phpt b/ext/standard/tests/math/hexdec_variation1.phpt
index 703d30f086..65ebbe347b 100644
--- a/ext/standard/tests/math/hexdec_variation1.phpt
+++ b/ext/standard/tests/math/hexdec_variation1.phpt
@@ -9,9 +9,6 @@ if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only");
--FILE--
<?php
echo "*** Testing hexdec() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
// heredoc string
$heredoc = <<<EOT
@@ -38,10 +35,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*12*/ NULL,
- null,
-
// boolean data
/*14*/ true,
false,
@@ -58,12 +51,6 @@ $inputs = array(
'abcxyz',
$heredoc,
- // undefined data
-/*24*/ @$undefined_var,
-
- // unset data
-/*25*/ @$unset_var,
-
// resource variable
/*26*/ $fp
);
@@ -128,7 +115,7 @@ Deprecated: Invalid characters passed for attempted conversion, these have been
int(5)
-- Iteration 12 --
-int(0)
+int(1)
-- Iteration 13 --
int(0)
@@ -140,40 +127,28 @@ int(1)
int(0)
-- Iteration 16 --
-int(1)
+int(0)
-- Iteration 17 --
int(0)
-- Iteration 18 --
-int(0)
-
--- Iteration 19 --
-int(0)
-
--- Iteration 20 --
hexdec(): Argument #1 ($hex_string) must be of type string, array given
--- Iteration 21 --
+-- Iteration 19 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(2748)
--- Iteration 22 --
+-- Iteration 20 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(2748)
--- Iteration 23 --
+-- Iteration 21 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(2748)
--- Iteration 24 --
-int(0)
-
--- Iteration 25 --
-int(0)
-
--- Iteration 26 --
+-- Iteration 22 --
hexdec(): Argument #1 ($hex_string) must be of type string, resource given
diff --git a/ext/standard/tests/math/hexdec_variation1_64bit.phpt b/ext/standard/tests/math/hexdec_variation1_64bit.phpt
index 9c76afec0b..c892b8049f 100644
--- a/ext/standard/tests/math/hexdec_variation1_64bit.phpt
+++ b/ext/standard/tests/math/hexdec_variation1_64bit.phpt
@@ -9,9 +9,6 @@ if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
--FILE--
<?php
echo "*** Testing hexdec() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
// heredoc string
$heredoc = <<<EOT
@@ -38,10 +35,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*12*/ NULL,
- null,
-
// boolean data
/*14*/ true,
false,
@@ -58,12 +51,6 @@ $inputs = array(
'abcxyz',
$heredoc,
- // undefined data
-/*24*/ @$undefined_var,
-
- // unset data
-/*25*/ @$unset_var,
-
// resource variable
/*26*/ $fp
);
@@ -128,7 +115,7 @@ Deprecated: Invalid characters passed for attempted conversion, these have been
int(5)
-- Iteration 12 --
-int(0)
+int(1)
-- Iteration 13 --
int(0)
@@ -140,40 +127,28 @@ int(1)
int(0)
-- Iteration 16 --
-int(1)
+int(0)
-- Iteration 17 --
int(0)
-- Iteration 18 --
-int(0)
-
--- Iteration 19 --
-int(0)
-
--- Iteration 20 --
hexdec(): Argument #1 ($hex_string) must be of type string, array given
--- Iteration 21 --
+-- Iteration 19 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(2748)
--- Iteration 22 --
+-- Iteration 20 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(2748)
--- Iteration 23 --
+-- Iteration 21 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(2748)
--- Iteration 24 --
-int(0)
-
--- Iteration 25 --
-int(0)
-
--- Iteration 26 --
+-- Iteration 22 --
hexdec(): Argument #1 ($hex_string) must be of type string, resource given
diff --git a/ext/standard/tests/math/hexdec_variation2.phpt b/ext/standard/tests/math/hexdec_variation2.phpt
new file mode 100644
index 0000000000..81ebae5c3f
--- /dev/null
+++ b/ext/standard/tests/math/hexdec_variation2.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Test hexdec() function : strange literals
+--FILE--
+<?php
+
+var_dump(hexdec('0x'));
+var_dump(hexdec('0X'));
+var_dump(hexdec(''));
+
+?>
+--EXPECT--
+int(0)
+int(0)
+int(0)
diff --git a/ext/standard/tests/math/hypot_basic.phpt b/ext/standard/tests/math/hypot_basic.phpt
index 1b4b04f00a..750d688a17 100644
--- a/ext/standard/tests/math/hypot_basic.phpt
+++ b/ext/standard/tests/math/hypot_basic.phpt
@@ -16,7 +16,6 @@ $valuesy = array(23,
"23",
"23.45",
"2.345e1",
- null,
true,
false);
@@ -29,7 +28,6 @@ $valuesx = array(33,
"33",
"43.45",
"1.345e1",
- null,
true,
false);
@@ -62,8 +60,6 @@ Y:23 X:43.45 float(49.1620026036369)
Y:23 X:1.345e1 float(26.6439955712352)
-Y:23 X: float(23)
-
Y:23 X:1 float(23.0217288664427)
Y:23 X: float(23)
@@ -86,8 +82,6 @@ Y:-23 X:43.45 float(49.1620026036369)
Y:-23 X:1.345e1 float(26.6439955712352)
-Y:-23 X: float(23)
-
Y:-23 X:1 float(23.0217288664427)
Y:-23 X: float(23)
@@ -110,8 +104,6 @@ Y:23.45 X:43.45 float(49.3741329037787)
Y:23.45 X:1.345e1 float(27.033405260899)
-Y:23.45 X: float(23.45)
-
Y:23.45 X:1 float(23.4713122769052)
Y:23.45 X: float(23.45)
@@ -134,8 +126,6 @@ Y:-23.45 X:43.45 float(49.3741329037787)
Y:-23.45 X:1.345e1 float(27.033405260899)
-Y:-23.45 X: float(23.45)
-
Y:-23.45 X:1 float(23.4713122769052)
Y:-23.45 X: float(23.45)
@@ -158,8 +148,6 @@ Y:23 X:43.45 float(49.1620026036369)
Y:23 X:1.345e1 float(26.6439955712352)
-Y:23 X: float(23)
-
Y:23 X:1 float(23.0217288664427)
Y:23 X: float(23)
@@ -182,8 +170,6 @@ Y:23 X:43.45 float(49.1620026036369)
Y:23 X:1.345e1 float(26.6439955712352)
-Y:23 X: float(23)
-
Y:23 X:1 float(23.0217288664427)
Y:23 X: float(23)
@@ -206,8 +192,6 @@ Y:23 X:43.45 float(49.1620026036369)
Y:23 X:1.345e1 float(26.6439955712352)
-Y:23 X: float(23)
-
Y:23 X:1 float(23.0217288664427)
Y:23 X: float(23)
@@ -230,8 +214,6 @@ Y:23.45 X:43.45 float(49.3741329037787)
Y:23.45 X:1.345e1 float(27.033405260899)
-Y:23.45 X: float(23.45)
-
Y:23.45 X:1 float(23.4713122769052)
Y:23.45 X: float(23.45)
@@ -254,36 +236,10 @@ Y:2.345e1 X:43.45 float(49.3741329037787)
Y:2.345e1 X:1.345e1 float(27.033405260899)
-Y:2.345e1 X: float(23.45)
-
Y:2.345e1 X:1 float(23.4713122769052)
Y:2.345e1 X: float(23.45)
-Y: X:33 float(33)
-
-Y: X:-33 float(33)
-
-Y: X:33.45 float(33.45)
-
-Y: X:-33.45 float(33.45)
-
-Y: X:39 float(39)
-
-Y: X:31 float(31)
-
-Y: X:33 float(33)
-
-Y: X:43.45 float(43.45)
-
-Y: X:1.345e1 float(13.45)
-
-Y: X: float(0)
-
-Y: X:1 float(1)
-
-Y: X: float(0)
-
Y:1 X:33 float(33.0151480384384)
Y:1 X:-33 float(33.0151480384384)
@@ -302,8 +258,6 @@ Y:1 X:43.45 float(43.4615059564208)
Y:1 X:1.345e1 float(13.4871234887206)
-Y:1 X: float(1)
-
Y:1 X:1 float(1.4142135623731)
Y:1 X: float(1)
@@ -326,8 +280,6 @@ Y: X:43.45 float(43.45)
Y: X:1.345e1 float(13.45)
-Y: X: float(0)
-
Y: X:1 float(1)
Y: X: float(0)
diff --git a/ext/standard/tests/math/is_finite_basic.phpt b/ext/standard/tests/math/is_finite_basic.phpt
index 9ee9d544e3..bc044e69ea 100644
--- a/ext/standard/tests/math/is_finite_basic.phpt
+++ b/ext/standard/tests/math/is_finite_basic.phpt
@@ -11,7 +11,6 @@ $values = array(234,
"234",
"234.5",
"23.45e1",
- null,
true,
false,
pow(0, -2),
@@ -34,6 +33,5 @@ bool(true)
bool(true)
bool(true)
bool(true)
-bool(true)
bool(false)
bool(false)
diff --git a/ext/standard/tests/math/is_infinite_basic.phpt b/ext/standard/tests/math/is_infinite_basic.phpt
index 076f202c14..0c7b076118 100644
--- a/ext/standard/tests/math/is_infinite_basic.phpt
+++ b/ext/standard/tests/math/is_infinite_basic.phpt
@@ -11,7 +11,6 @@ $values = array(234,
"234",
"234.5",
"23.45e1",
- null,
true,
false,
pow(0, -2),
@@ -34,6 +33,5 @@ bool(false)
bool(false)
bool(false)
bool(false)
-bool(false)
bool(true)
bool(false)
diff --git a/ext/standard/tests/math/is_nan_basic.phpt b/ext/standard/tests/math/is_nan_basic.phpt
index fabc40b97b..65555e25ae 100644
--- a/ext/standard/tests/math/is_nan_basic.phpt
+++ b/ext/standard/tests/math/is_nan_basic.phpt
@@ -11,7 +11,6 @@ $values = array(234,
"234",
"234.5",
"23.45e1",
- null,
true,
false,
pow(0, -2),
@@ -37,5 +36,4 @@ bool(false)
bool(false)
bool(false)
bool(false)
-bool(false)
bool(true)
diff --git a/ext/standard/tests/math/log10_variation.phpt b/ext/standard/tests/math/log10_variation.phpt
index 6e73cd7bea..9da765d5ae 100644
--- a/ext/standard/tests/math/log10_variation.phpt
+++ b/ext/standard/tests/math/log10_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(1.3617278360175928)
float(1.3701428470511021)
float(1.3701428470511021)
float(3)
-float(-INF)
float(0)
float(-INF)
diff --git a/ext/standard/tests/math/log1p_basic.phpt b/ext/standard/tests/math/log1p_basic.phpt
index c7ffe2ec18..7b19c3f9f4 100644
--- a/ext/standard/tests/math/log1p_basic.phpt
+++ b/ext/standard/tests/math/log1p_basic.phpt
@@ -15,7 +15,6 @@ $values = array(23,
"23",
"23.45",
"2.345e1",
- null,
true,
false);
@@ -60,9 +59,6 @@ float(3.196630215920881)
-- log1p 2.345e1 --
float(3.196630215920881)
--- log1p --
-float(0)
-
-- log1p 1 --
float(0.6931471805599453)
diff --git a/ext/standard/tests/math/log_basic.phpt b/ext/standard/tests/math/log_basic.phpt
index 84e72bb14d..ae2e790bcc 100644
--- a/ext/standard/tests/math/log_basic.phpt
+++ b/ext/standard/tests/math/log_basic.phpt
@@ -13,7 +13,6 @@ $values = array(23,
"23",
"23.45",
"2.345e1",
- null,
true,
false);
@@ -40,7 +39,6 @@ float(3.1354942159291497)
float(3.1354942159291497)
float(3.1548704948922883)
float(3.1548704948922883)
-float(-INF)
float(0)
float(-INF)
@@ -54,6 +52,5 @@ float(2.2617809780285065)
float(2.2617809780285065)
float(2.275758008814007)
float(2.275758008814007)
-float(-INF)
float(0)
float(-INF)
diff --git a/ext/standard/tests/math/mt_rand_basic.phpt b/ext/standard/tests/math/mt_rand_basic.phpt
index 24050bbc8a..113ca32ee6 100644
--- a/ext/standard/tests/math/mt_rand_basic.phpt
+++ b/ext/standard/tests/math/mt_rand_basic.phpt
@@ -54,7 +54,6 @@ for ($x = 0; $x < count($min); $x++) {
echo "\nNon-numeric cases\n";
$min = array(true,
false,
- null,
"10",
"10.5");
@@ -94,6 +93,5 @@ PASSED: range min = 256 max = 448
Non-numeric cases
PASSED range min = 1 max = 100
PASSED range min = 0 max = 100
-PASSED range min = 0 max = 100
PASSED range min = 10 max = 100
PASSED range min = 10 max = 100
diff --git a/ext/standard/tests/math/mt_srand_basic.phpt b/ext/standard/tests/math/mt_srand_basic.phpt
index ec0c24254d..71abbcb0aa 100644
--- a/ext/standard/tests/math/mt_srand_basic.phpt
+++ b/ext/standard/tests/math/mt_srand_basic.phpt
@@ -11,7 +11,6 @@ var_dump(mt_srand("500"));
var_dump(mt_srand("500E3"));
var_dump(mt_srand(true));
var_dump(mt_srand(false));
-var_dump(mt_srand(NULL));
?>
--EXPECT--
NULL
@@ -21,4 +20,3 @@ NULL
NULL
NULL
NULL
-NULL
diff --git a/ext/standard/tests/math/number_format_basic.phpt b/ext/standard/tests/math/number_format_basic.phpt
index b82ad5c753..022e573b01 100644
--- a/ext/standard/tests/math/number_format_basic.phpt
+++ b/ext/standard/tests/math/number_format_basic.phpt
@@ -11,7 +11,6 @@ $values = array(1234.5678,
"123456789",
"123.456789",
"12.3456789e1",
- null,
true,
false);
@@ -40,7 +39,7 @@ for ($i = 0; $i < count($values); $i++) {
}
?>
--EXPECT--
- number_format tests.....default
+number_format tests.....default
string(5) "1,235"
string(6) "-1,235"
string(10) "12,346,578"
@@ -50,7 +49,6 @@ string(11) "402,653,183"
string(11) "123,456,789"
string(3) "123"
string(3) "123"
-string(1) "0"
string(1) "1"
string(1) "0"
@@ -64,7 +62,6 @@ string(14) "402,653,183.00"
string(14) "123,456,789.00"
string(6) "123.46"
string(6) "123.46"
-string(4) "0.00"
string(4) "1.00"
string(4) "0.00"
@@ -78,7 +75,6 @@ string(14) "402 653 183.00"
string(14) "123 456 789.00"
string(6) "123.46"
string(6) "123.46"
-string(4) "0.00"
string(4) "1.00"
string(4) "0.00"
@@ -92,6 +88,5 @@ string(14) "402 653 183,00"
string(14) "123 456 789,00"
string(6) "123,46"
string(6) "123,46"
-string(4) "0,00"
string(4) "1,00"
string(4) "0,00"
diff --git a/ext/standard/tests/math/number_format_multichar.phpt b/ext/standard/tests/math/number_format_multichar.phpt
index 5648257e03..1ed823042f 100644
--- a/ext/standard/tests/math/number_format_multichar.phpt
+++ b/ext/standard/tests/math/number_format_multichar.phpt
@@ -11,7 +11,6 @@ $values = array(1234.5678,
"123456789",
"123.456789",
"12.3456789e1",
- null,
true,
false);
@@ -34,7 +33,7 @@ for ($i = 0; $i < count($values); $i++) {
}
?>
--EXPECT--
- number_format tests.....multiple character decimal point
+number_format tests.....multiple character decimal point
string(13) "1 234&#183;57"
string(14) "-1 234&#183;57"
string(18) "12 346 578&#183;00"
@@ -44,7 +43,6 @@ string(19) "402 653 183&#183;00"
string(19) "123 456 789&#183;00"
string(11) "123&#183;46"
string(11) "123&#183;46"
-string(9) "0&#183;00"
string(9) "1&#183;00"
string(9) "0&#183;00"
@@ -58,7 +56,6 @@ string(28) "402&thinsp;653&thinsp;183.00"
string(28) "123&thinsp;456&thinsp;789.00"
string(6) "123.46"
string(6) "123.46"
-string(4) "0.00"
string(4) "1.00"
string(4) "0.00"
@@ -72,6 +69,5 @@ string(33) "402&thinsp;653&thinsp;183&#183;00"
string(33) "123&thinsp;456&thinsp;789&#183;00"
string(11) "123&#183;46"
string(11) "123&#183;46"
-string(9) "0&#183;00"
string(9) "1&#183;00"
string(9) "0&#183;00"
diff --git a/ext/standard/tests/math/octdec_basic.phpt b/ext/standard/tests/math/octdec_basic.phpt
index 1daf9a4338..4c3ffc8b8a 100644
--- a/ext/standard/tests/math/octdec_basic.phpt
+++ b/ext/standard/tests/math/octdec_basic.phpt
@@ -22,7 +22,7 @@ $values = array(01234567,
31.1013e5,
true,
false,
- null);
+ );
for ($i = 0; $i < count($values); $i++) {
$res = octdec($values[$i]);
@@ -57,4 +57,3 @@ int(102923)
int(823384)
int(1)
int(0)
-int(0)
diff --git a/ext/standard/tests/math/octdec_basic_64bit.phpt b/ext/standard/tests/math/octdec_basic_64bit.phpt
index bb8f70085d..4051d9be63 100644
--- a/ext/standard/tests/math/octdec_basic_64bit.phpt
+++ b/ext/standard/tests/math/octdec_basic_64bit.phpt
@@ -25,7 +25,7 @@ $values = array(01234567,
31.1013e5,
true,
false,
- null);
+ );
for ($i = 0; $i < count($values); $i++) {
$res = octdec($values[$i]);
@@ -62,4 +62,3 @@ int(102923)
int(823384)
int(1)
int(0)
-int(0)
diff --git a/ext/standard/tests/math/octdec_variation1.phpt b/ext/standard/tests/math/octdec_variation1.phpt
index 6ee2b6f91c..c24d2e8e6b 100644
--- a/ext/standard/tests/math/octdec_variation1.phpt
+++ b/ext/standard/tests/math/octdec_variation1.phpt
@@ -5,9 +5,6 @@ precision=14
--FILE--
<?php
echo "*** Testing octdec() : usage variations ***\n";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
// heredoc string
$heredoc = <<<EOT
@@ -34,10 +31,6 @@ $inputs = array(
12.3456789000E-10,
.5,
- // null data
-/*12*/ NULL,
- null,
-
// boolean data
/*14*/ true,
false,
@@ -54,12 +47,6 @@ $inputs = array(
'abcxyz',
$heredoc,
- // undefined data
-/*24*/ @$undefined_var,
-
- // unset data
-/*25*/ @$unset_var,
-
// resource variable
/*26*/ $fp
);
@@ -131,7 +118,7 @@ Deprecated: Invalid characters passed for attempted conversion, these have been
int(5)
-- Iteration 12 --
-int(0)
+int(1)
-- Iteration 13 --
int(0)
@@ -143,41 +130,29 @@ int(1)
int(0)
-- Iteration 16 --
-int(1)
+int(0)
-- Iteration 17 --
int(0)
-- Iteration 18 --
-int(0)
-
--- Iteration 19 --
-int(0)
-
--- Iteration 20 --
octdec(): Argument #1 ($octal_string) must be of type string, array given
--- Iteration 21 --
+-- Iteration 19 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(0)
--- Iteration 22 --
+-- Iteration 20 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(0)
--- Iteration 23 --
+-- Iteration 21 --
Deprecated: Invalid characters passed for attempted conversion, these have been ignored in %s on line %d
int(0)
--- Iteration 24 --
-int(0)
-
--- Iteration 25 --
-int(0)
-
--- Iteration 26 --
+-- Iteration 22 --
octdec(): Argument #1 ($octal_string) must be of type string, resource given
---Done---
diff --git a/ext/standard/tests/math/octdec_variation2.phpt b/ext/standard/tests/math/octdec_variation2.phpt
new file mode 100644
index 0000000000..bf26f45736
--- /dev/null
+++ b/ext/standard/tests/math/octdec_variation2.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Test octdec() function : strange literals
+--FILE--
+<?php
+
+var_dump(octdec('0o'));
+var_dump(octdec('0O'));
+var_dump(octdec('0'));
+var_dump(octdec(''));
+
+?>
+--EXPECT--
+int(0)
+int(0)
+int(0)
+int(0)
diff --git a/ext/standard/tests/math/pow-operator.phpt b/ext/standard/tests/math/pow-operator.phpt
index ad587dbb9b..88964509e7 100644
--- a/ext/standard/tests/math/pow-operator.phpt
+++ b/ext/standard/tests/math/pow-operator.phpt
@@ -6,17 +6,16 @@ Various pow() tests
$x = 2;
$x **= 3;
-$tests = <<<TESTS
- -3 ** 2 === -9
- (-3) **2 === 9
- 2 ** 3 ** 2 === 512
- (2 ** 3) ** 2 === 64
- $x === 8
-TESTS;
+var_dump( -3 ** 2 === -9);
+var_dump( (-3) **2 === 9);
+var_dump( 2 ** 3 ** 2 === 512);
+var_dump( (2 ** 3) ** 2 === 64);
+var_dump( $x === 8);
- echo "On failure, please mail result to php-dev@lists.php.net\n";
- include(__DIR__ . '/../../../../tests/quicktester.inc');
?>
--EXPECT--
-On failure, please mail result to php-dev@lists.php.net
-OK
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/standard/tests/math/pow.phpt b/ext/standard/tests/math/pow.phpt
index 18c0b9468c..4b515ad882 100644
--- a/ext/standard/tests/math/pow.phpt
+++ b/ext/standard/tests/math/pow.phpt
@@ -8,142 +8,269 @@ define('LONG_MIN', -LONG_MAX - 1);
printf("%d,%d,%d,%d\n",is_int(LONG_MIN ),is_int(LONG_MAX ),
is_int(LONG_MIN-1),is_int(LONG_MAX+1));
-$tests = <<<TESTS
- 0.25 === pow(-2,-2)
--0.5 === pow(-2,-1)
- 1 === pow(-2, 0)
--2 === pow(-2, 1)
- 4 === pow(-2, 2)
- 1.0 === pow(-1,-2)
--1.0 === pow(-1,-1)
- 1 === pow(-1, 0)
--1 === pow(-1, 1)
- 1 === pow(-1, 2)
- TRUE === is_infinite(pow(0,-2))
- TRUE === is_infinite(pow(0,-1))
- 1 === pow( 0, 0)
- 0 === pow( 0, 1)
- 0 === pow( 0, 2)
- 1.0 === pow( 1,-2)
- 1.0 === pow( 1,-1)
- 1 === pow( 1, 0)
- 1 === pow( 1, 1)
- 1 === pow( 1, 2)
- 0.25 === pow( 2,-2)
- 0.5 === pow( 2,-1)
- 1 === pow( 2, 0)
- 2 === pow( 2, 1)
- 4 === pow( 2, 2)
- 0.25 === pow(-2,-2.0)
--0.5 === pow(-2,-1.0)
- 1.0 === pow(-2, 0.0)
--2.0 === pow(-2, 1.0)
- 4.0 === pow(-2, 2.0)
- 1.0 === pow(-1,-2.0)
--1.0 === pow(-1,-1.0)
- 1.0 === pow(-1, 0.0)
--1.0 === pow(-1, 1.0)
- 1.0 === pow(-1, 2.0)
- TRUE === is_infinite(pow(0,-2.0))
- TRUE === is_infinite(pow(0,-1.0))
- 1.0 === pow( 0, 0.0)
- 0.0 === pow( 0, 1.0)
- 0.0 === pow( 0, 2.0)
- 1.0 === pow( 1,-2.0)
- 1.0 === pow( 1,-1.0)
- 1.0 === pow( 1, 0.0)
- 1.0 === pow( 1, 1.0)
- 1.0 === pow( 1, 2.0)
- 0.25 === pow( 2,-2.0)
- 0.5 === pow( 2,-1.0)
- 1.0 === pow( 2, 0.0)
- 2.0 === pow( 2, 1.0)
- 4.0 === pow( 2, 2.0)
- 2147483648 === pow(2,31)
--2147483648 ~== pow(-2,31)
- 1000000000 === pow(10,9)
- 100000000 === pow(-10,8)
- 1 === pow(-1,1443279822)
--1 === pow(-1,1443279821)
-sqrt(2) ~== pow(2,1/2)
- 0.25 === pow(-2.0,-2.0)
--0.5 === pow(-2.0,-1.0)
- 1.0 === pow(-2.0, 0.0)
--2.0 === pow(-2.0, 1.0)
- 4.0 === pow(-2.0, 2.0)
- 1.0 === pow(-1.0,-2.0)
--1.0 === pow(-1.0,-1.0)
- 1.0 === pow(-1.0, 0.0)
--1.0 === pow(-1.0, 1.0)
- 1.0 === pow(-1.0, 2.0)
- TRUE === is_infinite(pow(0.0,-2.0))
- TRUE === is_infinite(pow(0.0,-1.0))
- 1.0 === pow( 0.0, 0.0)
- 0.0 === pow( 0.0, 1.0)
- 0.0 === pow( 0.0, 2.0)
- 1.0 === pow( 1.0,-2.0)
- 1.0 === pow( 1.0,-1.0)
- 1.0 === pow( 1.0, 0.0)
- 1.0 === pow( 1.0, 1.0)
- 1.0 === pow( 1.0, 2.0)
- 0.25 === pow( 2.0,-2.0)
- 0.5 === pow( 2.0,-1.0)
- 1.0 === pow( 2.0, 0.0)
- 2.0 === pow( 2.0, 1.0)
- 4.0 === pow( 2.0, 2.0)
- 0.25 === pow(-2.0,-2)
--0.5 === pow(-2.0,-1)
- 1.0 === pow(-2.0, 0)
--2.0 === pow(-2.0, 1)
- 4.0 === pow(-2.0, 2)
- 1.0 === pow(-1.0,-2)
--1.0 === pow(-1.0,-1)
- 1.0 === pow(-1.0, 0)
--1.0 === pow(-1.0, 1)
- 1.0 === pow(-1.0, 2)
- TRUE === is_infinite(pow( 0.0,-2))
- TRUE === is_infinite(pow( 0.0,-1))
- 1.0 === pow( 0.0, 0)
- 0.0 === pow( 0.0, 1)
- 0.0 === pow( 0.0, 2)
- 1.0 === pow( 1.0,-2)
- 1.0 === pow( 1.0,-1)
- 1.0 === pow( 1.0, 0)
- 1.0 === pow( 1.0, 1)
- 1.0 === pow( 1.0, 2)
- 0.25 === pow( 2.0,-2)
- 0.5 === pow( 2.0,-1)
- 1.0 === pow( 2.0, 0)
- 2.0 === pow( 2.0, 1)
- 4.0 === pow( 2.0, 2)
- 2.0 === pow( 4, 0.5)
- 2.0 === pow( 4.0, 0.5)
- 3.0 === pow( 27, 1/3)
- 3.0 === pow(27.0, 1/3)
- 0.5 === pow( 4, -0.5)
- 0.5 === pow( 4.0, -0.5)
-LONG_MAX-1 === pow(LONG_MAX-1,1)
-LONG_MIN+1 === pow(LONG_MIN+1,1)
-(LONG_MAX-1)*(LONG_MAX-1) ~== pow(LONG_MAX-1,2)
-(LONG_MIN+1)*(LONG_MIN+1) ~== pow(LONG_MIN+1,2)
-(float)(LONG_MAX-1) === pow(LONG_MAX-1,1.0)
-(float)(LONG_MIN+1) === pow(LONG_MIN+1,1.0)
-(LONG_MAX-1)*(LONG_MAX-1) ~== pow(LONG_MAX-1,2.0)
-(LONG_MIN+1)*(LONG_MIN+1) ~== pow(LONG_MIN+1,2.0)
-LONG_MAX === pow(LONG_MAX,1)
-LONG_MIN === pow(LONG_MIN,1)
-LONG_MAX*LONG_MAX ~== pow(LONG_MAX,2)
-LONG_MIN*LONG_MIN ~== pow(LONG_MIN,2)
-(float)LONG_MAX === pow(LONG_MAX,1.0)
-(float)LONG_MIN === pow(LONG_MIN,1.0)
-LONG_MAX*LONG_MAX ~== pow(LONG_MAX,2.0)
-LONG_MIN*LONG_MIN ~== pow(LONG_MIN,2.0)
-TESTS;
+function epsilon_equal($left, $right): bool {
+ return abs(($left-$right) / $left) < 1e-12;
+}
+
+var_dump(0.25 === pow(-2,-2));
+var_dump(-0.5 === pow(-2,-1));
+var_dump(1 === pow(-2, 0));
+var_dump(-2 === pow(-2, 1));
+var_dump(4 === pow(-2, 2));
+var_dump(1.0 === pow(-1,-2));
+var_dump(-1.0 === pow(-1,-1));
+var_dump(1 === pow(-1, 0));
+var_dump(-1 === pow(-1, 1));
+var_dump(1 === pow(-1, 2));
+var_dump(TRUE === is_infinite(pow(0,-2)));
+var_dump(TRUE === is_infinite(pow(0,-1)));
+var_dump(1 === pow( 0, 0));
+var_dump(0 === pow( 0, 1));
+var_dump(0 === pow( 0, 2));
+var_dump(1.0 === pow( 1,-2));
+var_dump(1.0 === pow( 1,-1));
+var_dump(1 === pow( 1, 0));
+var_dump(1 === pow( 1, 1));
+var_dump(1 === pow( 1, 2));
+var_dump(0.25 === pow( 2,-2));
+var_dump(0.5 === pow( 2,-1));
+var_dump(1 === pow( 2, 0));
+var_dump(2 === pow( 2, 1));
+var_dump(4 === pow( 2, 2));
+var_dump(0.25 === pow(-2,-2.0));
+var_dump(-0.5 === pow(-2,-1.0));
+var_dump(1.0 === pow(-2, 0.0));
+var_dump(-2.0 === pow(-2, 1.0));
+var_dump(4.0 === pow(-2, 2.0));
+var_dump(1.0 === pow(-1,-2.0));
+var_dump(-1.0 === pow(-1,-1.0));
+var_dump(1.0 === pow(-1, 0.0));
+var_dump(-1.0 === pow(-1, 1.0));
+var_dump(1.0 === pow(-1, 2.0));
+var_dump(TRUE === is_infinite(pow(0,-2.0)));
+var_dump(TRUE === is_infinite(pow(0,-1.0)));
+var_dump(1.0 === pow( 0, 0.0));
+var_dump(0.0 === pow( 0, 1.0));
+var_dump(0.0 === pow( 0, 2.0));
+var_dump(1.0 === pow( 1,-2.0));
+var_dump(1.0 === pow( 1,-1.0));
+var_dump(1.0 === pow( 1, 0.0));
+var_dump(1.0 === pow( 1, 1.0));
+var_dump(1.0 === pow( 1, 2.0));
+var_dump(0.25 === pow( 2,-2.0));
+var_dump(0.5 === pow( 2,-1.0));
+var_dump(1.0 === pow( 2, 0.0));
+var_dump(2.0 === pow( 2, 1.0));
+var_dump(4.0 === pow( 2, 2.0));
+var_dump(2147483648 === pow(2,31));
+var_dump(epsilon_equal( -2147483648, pow(-2,31) ));
+var_dump(1000000000 === pow(10,9));
+var_dump(100000000 === pow(-10,8));
+var_dump(1 === pow(-1,1443279822));
+var_dump(-1 === pow(-1,1443279821));
+var_dump(epsilon_equal( sqrt(2), pow(2,1/2) ));
+var_dump(0.25 === pow(-2.0,-2.0));
+var_dump(-0.5 === pow(-2.0,-1.0));
+var_dump(1.0 === pow(-2.0, 0.0));
+var_dump(-2.0 === pow(-2.0, 1.0));
+var_dump(4.0 === pow(-2.0, 2.0));
+var_dump(1.0 === pow(-1.0,-2.0));
+var_dump(-1.0 === pow(-1.0,-1.0));
+var_dump(1.0 === pow(-1.0, 0.0));
+var_dump(-1.0 === pow(-1.0, 1.0));
+var_dump(1.0 === pow(-1.0, 2.0));
+var_dump(TRUE === is_infinite(pow(0.0,-2.0)));
+var_dump(TRUE === is_infinite(pow(0.0,-1.0)));
+var_dump(1.0 === pow( 0.0, 0.0));
+var_dump(0.0 === pow( 0.0, 1.0));
+var_dump(0.0 === pow( 0.0, 2.0));
+var_dump(1.0 === pow( 1.0,-2.0));
+var_dump(1.0 === pow( 1.0,-1.0));
+var_dump(1.0 === pow( 1.0, 0.0));
+var_dump(1.0 === pow( 1.0, 1.0));
+var_dump(1.0 === pow( 1.0, 2.0));
+var_dump(0.25 === pow( 2.0,-2.0));
+var_dump(0.5 === pow( 2.0,-1.0));
+var_dump(1.0 === pow( 2.0, 0.0));
+var_dump(2.0 === pow( 2.0, 1.0));
+var_dump(4.0 === pow( 2.0, 2.0));
+var_dump(0.25 === pow(-2.0,-2));
+var_dump(-0.5 === pow(-2.0,-1));
+var_dump(1.0 === pow(-2.0, 0));
+var_dump(-2.0 === pow(-2.0, 1));
+var_dump(4.0 === pow(-2.0, 2));
+var_dump(1.0 === pow(-1.0,-2));
+var_dump(-1.0 === pow(-1.0,-1));
+var_dump(1.0 === pow(-1.0, 0));
+var_dump(-1.0 === pow(-1.0, 1));
+var_dump(1.0 === pow(-1.0, 2));
+var_dump(TRUE === is_infinite(pow( 0.0,-2)));
+var_dump(TRUE === is_infinite(pow( 0.0,-1)));
+var_dump(1.0 === pow( 0.0, 0));
+var_dump(0.0 === pow( 0.0, 1));
+var_dump(0.0 === pow( 0.0, 2));
+var_dump(1.0 === pow( 1.0,-2));
+var_dump(1.0 === pow( 1.0,-1));
+var_dump(1.0 === pow( 1.0, 0));
+var_dump(1.0 === pow( 1.0, 1));
+var_dump(1.0 === pow( 1.0, 2));
+var_dump(0.25 === pow( 2.0,-2));
+var_dump(0.5 === pow( 2.0,-1));
+var_dump(1.0 === pow( 2.0, 0));
+var_dump(2.0 === pow( 2.0, 1));
+var_dump(4.0 === pow( 2.0, 2));
+var_dump(2.0 === pow( 4, 0.5));
+var_dump(2.0 === pow( 4.0, 0.5));
+var_dump(3.0 === pow( 27, 1/3));
+var_dump(3.0 === pow(27.0, 1/3));
+var_dump(0.5 === pow( 4, -0.5));
+var_dump(0.5 === pow( 4.0, -0.5));
+var_dump(LONG_MAX-1 === pow(LONG_MAX-1,1));
+var_dump(LONG_MIN+1 === pow(LONG_MIN+1,1));
+var_dump(epsilon_equal( (LONG_MAX-1)*(LONG_MAX-1) , pow(LONG_MAX-1,2) ));
+var_dump(epsilon_equal( (LONG_MIN+1)*(LONG_MIN+1) , pow(LONG_MIN+1,2) ));
+var_dump((float)(LONG_MAX-1) === pow(LONG_MAX-1,1.0));
+var_dump((float)(LONG_MIN+1) === pow(LONG_MIN+1,1.0));
+var_dump(epsilon_equal( (LONG_MAX-1)*(LONG_MAX-1) , pow(LONG_MAX-1,2.0) ));
+var_dump(epsilon_equal( (LONG_MIN+1)*(LONG_MIN+1) , pow(LONG_MIN+1,2.0) ));
+var_dump(LONG_MAX === pow(LONG_MAX,1));
+var_dump(LONG_MIN === pow(LONG_MIN,1));
+var_dump(epsilon_equal( LONG_MAX*LONG_MAX , pow(LONG_MAX,2) ));
+var_dump(epsilon_equal( LONG_MIN*LONG_MIN , pow(LONG_MIN,2) ));
+var_dump((float)LONG_MAX === pow(LONG_MAX,1.0));
+var_dump((float)LONG_MIN === pow(LONG_MIN,1.0));
+var_dump(epsilon_equal( LONG_MAX*LONG_MAX , pow(LONG_MAX,2.0) ));
+var_dump(epsilon_equal( LONG_MIN*LONG_MIN , pow(LONG_MIN,2.0) ));
- echo "On failure, please mail result to php-dev@lists.php.net\n";
- include(__DIR__ . '/../../../../tests/quicktester.inc');
?>
--EXPECT--
1,1,0,0
-On failure, please mail result to php-dev@lists.php.net
-OK
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/standard/tests/math/rad2deg_variation.phpt b/ext/standard/tests/math/rad2deg_variation.phpt
index 122d5b2c13..3cc1317ea8 100644
--- a/ext/standard/tests/math/rad2deg_variation.phpt
+++ b/ext/standard/tests/math/rad2deg_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(1317.8029288008934)
float(1343.5860295817804)
float(1343.5860295817804)
float(57295.77951308232)
-float(0)
float(57.29577951308232)
float(0)
diff --git a/ext/standard/tests/math/rand_basic.phpt b/ext/standard/tests/math/rand_basic.phpt
index 87e9d7cd42..06b46b2277 100644
--- a/ext/standard/tests/math/rand_basic.phpt
+++ b/ext/standard/tests/math/rand_basic.phpt
@@ -54,7 +54,6 @@ for ($x = 0; $x < count($min); $x++) {
echo "\nNon-numeric cases\n";
$min = array(true,
false,
- null,
"10",
"10.5");
@@ -94,6 +93,5 @@ PASSED: range min = 256 max = 448
Non-numeric cases
PASSED range min = 1 max = 100
PASSED range min = 0 max = 100
-PASSED range min = 0 max = 100
PASSED range min = 10 max = 100
PASSED range min = 10 max = 100
diff --git a/ext/standard/tests/math/round.phpt b/ext/standard/tests/math/round.phpt
index 90d120827f..6bcda70f14 100644
--- a/ext/standard/tests/math/round.phpt
+++ b/ext/standard/tests/math/round.phpt
@@ -8,31 +8,51 @@ define('LONG_MIN', -LONG_MAX - 1);
printf("%d,%d,%d,%d\n",is_int(LONG_MIN ),is_int(LONG_MAX ),
is_int(LONG_MIN-1),is_int(LONG_MAX+1));
-$tests = <<<TESTS
--1 ~== ceil(-1.5)
- 2 ~== ceil( 1.5)
--2 ~== floor(-1.5)
- 1 ~== floor(1.5)
- LONG_MIN ~== ceil(LONG_MIN - 0.5)
- LONG_MIN+1 ~== ceil(LONG_MIN + 0.5)
- LONG_MIN-1 ~== round(LONG_MIN - 0.6)
- LONG_MIN ~== round(LONG_MIN - 0.4)
- LONG_MIN ~== round(LONG_MIN + 0.4)
- LONG_MIN+1 ~== round(LONG_MIN + 0.6)
- LONG_MIN-1 ~== floor(LONG_MIN - 0.5)
- LONG_MIN ~== floor(LONG_MIN + 0.5)
- LONG_MAX ~== ceil(LONG_MAX - 0.5)
- LONG_MAX+1 ~== ceil(LONG_MAX + 0.5)
- LONG_MAX-1 ~== round(LONG_MAX - 0.6)
- LONG_MAX ~== round(LONG_MAX - 0.4)
- LONG_MAX ~== round(LONG_MAX + 0.4)
- LONG_MAX+1 ~== round(LONG_MAX + 0.6)
- LONG_MAX-1 ~== floor(LONG_MAX - 0.5)
- LONG_MAX ~== floor(LONG_MAX + 0.5)
-TESTS;
+function epsilon_equal($left, $right): bool {
+ return abs(($left-$right) / $left) < 1e-12;
+}
+
+var_dump(epsilon_equal( -1 , ceil(-1.5) ));
+var_dump(epsilon_equal( 2 , ceil( 1.5) ));
+var_dump(epsilon_equal( -2 , floor(-1.5) ));
+var_dump(epsilon_equal( 1 , floor(1.5) ));
+var_dump(epsilon_equal( LONG_MIN , ceil(LONG_MIN - 0.5) ));
+var_dump(epsilon_equal( LONG_MIN+1 , ceil(LONG_MIN + 0.5) ));
+var_dump(epsilon_equal( LONG_MIN-1 , round(LONG_MIN - 0.6) ));
+var_dump(epsilon_equal( LONG_MIN , round(LONG_MIN - 0.4) ));
+var_dump(epsilon_equal( LONG_MIN , round(LONG_MIN + 0.4) ));
+var_dump(epsilon_equal( LONG_MIN+1 , round(LONG_MIN + 0.6) ));
+var_dump(epsilon_equal( LONG_MIN-1 , floor(LONG_MIN - 0.5) ));
+var_dump(epsilon_equal( LONG_MIN , floor(LONG_MIN + 0.5) ));
+var_dump(epsilon_equal( LONG_MAX , ceil(LONG_MAX - 0.5) ));
+var_dump(epsilon_equal( LONG_MAX+1 , ceil(LONG_MAX + 0.5) ));
+var_dump(epsilon_equal( LONG_MAX-1 , round(LONG_MAX - 0.6) ));
+var_dump(epsilon_equal( LONG_MAX , round(LONG_MAX - 0.4) ));
+var_dump(epsilon_equal( LONG_MAX , round(LONG_MAX + 0.4) ));
+var_dump(epsilon_equal( LONG_MAX+1 , round(LONG_MAX + 0.6) ));
+var_dump(epsilon_equal( LONG_MAX-1 , floor(LONG_MAX - 0.5) ));
+var_dump(epsilon_equal( LONG_MAX , floor(LONG_MAX + 0.5) ));
-include(__DIR__ . '/../../../../tests/quicktester.inc');
?>
--EXPECT--
1,1,0,0
-OK
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/standard/tests/math/round_basic.phpt b/ext/standard/tests/math/round_basic.phpt
index 8f2ded09f3..44aacf2eec 100644
--- a/ext/standard/tests/math/round_basic.phpt
+++ b/ext/standard/tests/math/round_basic.phpt
@@ -25,7 +25,6 @@ $precision = array(2,
"04",
"3.6",
"2.1e1",
- null,
true,
false);
@@ -50,7 +49,6 @@ round: 123456789
...with precision 04-> float(123456789)
...with precision 3.6-> float(123456789)
...with precision 2.1e1-> float(123456789)
-...with precision -> float(123456789)
...with precision 1-> float(123456789)
...with precision -> float(123456789)
round: 123.456789
@@ -63,7 +61,6 @@ round: 123.456789
...with precision 04-> float(123.4568)
...with precision 3.6-> float(123.457)
...with precision 2.1e1-> float(123.456789)
-...with precision -> float(123)
...with precision 1-> float(123.5)
...with precision -> float(123)
round: -4.5679123
@@ -76,7 +73,6 @@ round: -4.5679123
...with precision 04-> float(-4.5679)
...with precision 3.6-> float(-4.568)
...with precision 2.1e1-> float(-4.5679123)
-...with precision -> float(-5)
...with precision 1-> float(-4.6)
...with precision -> float(-5)
round: 12300
@@ -89,7 +85,6 @@ round: 12300
...with precision 04-> float(12300)
...with precision 3.6-> float(12300)
...with precision 2.1e1-> float(12300)
-...with precision -> float(12300)
...with precision 1-> float(12300)
...with precision -> float(12300)
round: -4567
@@ -102,7 +97,6 @@ round: -4567
...with precision 04-> float(-4567)
...with precision 3.6-> float(-4567)
...with precision 2.1e1-> float(-4567)
-...with precision -> float(-4567)
...with precision 1-> float(-4567)
...with precision -> float(-4567)
round: 2311527
@@ -115,7 +109,6 @@ round: 2311527
...with precision 04-> float(2311527)
...with precision 3.6-> float(2311527)
...with precision 2.1e1-> float(2311527)
-...with precision -> float(2311527)
...with precision 1-> float(2311527)
...with precision -> float(2311527)
round: 14680063
@@ -128,7 +121,6 @@ round: 14680063
...with precision 04-> float(14680063)
...with precision 3.6-> float(14680063)
...with precision 2.1e1-> float(14680063)
-...with precision -> float(14680063)
...with precision 1-> float(14680063)
...with precision -> float(14680063)
round: 1.234567
@@ -141,7 +133,6 @@ round: 1.234567
...with precision 04-> float(1.2346)
...with precision 3.6-> float(1.235)
...with precision 2.1e1-> float(1.234567)
-...with precision -> float(1)
...with precision 1-> float(1.2)
...with precision -> float(1)
round: 2.3456789e8
@@ -154,6 +145,5 @@ round: 2.3456789e8
...with precision 04-> float(234567890)
...with precision 3.6-> float(234567890)
...with precision 2.1e1-> float(234567890)
-...with precision -> float(234567890)
...with precision 1-> float(234567890)
...with precision -> float(234567890)
diff --git a/ext/standard/tests/math/round_variation1.phpt b/ext/standard/tests/math/round_variation1.phpt
index b6ce56dd4a..2a2adf27ca 100644
--- a/ext/standard/tests/math/round_variation1.phpt
+++ b/ext/standard/tests/math/round_variation1.phpt
@@ -85,7 +85,7 @@ foreach($inputs as $input) {
};
fclose($fp);
?>
---EXPECT--
+--EXPECTF--
*** Testing round() : usage variations ***
-- Iteration 1 --
@@ -119,9 +119,13 @@ float(1.23457E-9)
float(0.5)
-- Iteration 11 --
+
+Deprecated: round(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 12 --
+
+Deprecated: round(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 13 --
@@ -158,9 +162,13 @@ round(): Argument #1 ($num) must be of type int|float, string given
round(): Argument #1 ($num) must be of type int|float, classA given
-- Iteration 24 --
+
+Deprecated: round(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 25 --
+
+Deprecated: round(): Passing null to parameter #1 ($num) of type int|float is deprecated in %s on line %d
float(0)
-- Iteration 26 --
diff --git a/ext/standard/tests/math/sin_variation.phpt b/ext/standard/tests/math/sin_variation.phpt
index 84c5b60c7b..6cca50a167 100644
--- a/ext/standard/tests/math/sin_variation.phpt
+++ b/ext/standard/tests/math/sin_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(-0.8462204042)
float(-0.9937407102)
float(-0.9937407102)
float(0.8268795405)
-float(0)
float(0.8414709848)
float(0)
diff --git a/ext/standard/tests/math/sinh_variation.phpt b/ext/standard/tests/math/sinh_variation.phpt
index 4a26efb50a..f053e58144 100644
--- a/ext/standard/tests/math/sinh_variation.phpt
+++ b/ext/standard/tests/math/sinh_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(4872401723)
float(7641446995)
float(7641446995)
float(INF)
-float(0)
float(1.175201194)
float(0)
diff --git a/ext/standard/tests/math/sqrt_variation.phpt b/ext/standard/tests/math/sqrt_variation.phpt
index b0683b701a..eb73870d1f 100644
--- a/ext/standard/tests/math/sqrt_variation.phpt
+++ b/ext/standard/tests/math/sqrt_variation.phpt
@@ -22,7 +22,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -44,6 +43,5 @@ float(4.795831523312719)
float(4.8425200051213)
float(4.8425200051213)
float(31.622776601683793)
-float(0)
float(1)
float(0)
diff --git a/ext/standard/tests/math/srand_basic.phpt b/ext/standard/tests/math/srand_basic.phpt
index d3a5447553..ce9a4e3f97 100644
--- a/ext/standard/tests/math/srand_basic.phpt
+++ b/ext/standard/tests/math/srand_basic.phpt
@@ -13,7 +13,6 @@ var_dump(srand("500"));
var_dump(srand("500E3"));
var_dump(srand(true));
var_dump(srand(false));
-var_dump(srand(NULL));
?>
--EXPECT--
*** Testing srand() : basic functionality ***
@@ -24,4 +23,3 @@ NULL
NULL
NULL
NULL
-NULL
diff --git a/ext/standard/tests/math/tan_variation.phpt b/ext/standard/tests/math/tan_variation.phpt
index 602db48e49..4394ddcd57 100644
--- a/ext/standard/tests/math/tan_variation.phpt
+++ b/ext/standard/tests/math/tan_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(1.588153083)
float(8.895619796)
float(8.895619796)
float(1.470324156)
-float(0)
float(1.557407725)
float(0)
diff --git a/ext/standard/tests/math/tanh_variation.phpt b/ext/standard/tests/math/tanh_variation.phpt
index aab33fea60..d2011f4745 100644
--- a/ext/standard/tests/math/tanh_variation.phpt
+++ b/ext/standard/tests/math/tanh_variation.phpt
@@ -21,7 +21,6 @@ $values = array(23,
"23.45",
"2.345e1",
"1000",
- null,
true,
false);
@@ -42,6 +41,5 @@ float(1)
float(1)
float(1)
float(1)
-float(0)
float(0.7615941559557649)
float(0)
diff --git a/ext/standard/tests/password/password_verify.phpt b/ext/standard/tests/password/password_verify.phpt
index a196763c13..5f2ff1230c 100644
--- a/ext/standard/tests/password/password_verify.phpt
+++ b/ext/standard/tests/password/password_verify.phpt
@@ -20,11 +20,13 @@ var_dump(password_verify("foo", "$1"));
echo "OK!";
?>
---EXPECT--
+--EXPECTF--
bool(false)
bool(false)
bool(false)
bool(true)
+
+Deprecated: password_verify(): Passing null to parameter #2 ($hash) of type string is deprecated in %s on line %d
bool(false)
bool(true)
bool(false)
diff --git a/ext/standard/tests/serialize/SplObjectStorage_object_reference.phpt b/ext/standard/tests/serialize/SplObjectStorage_object_reference.phpt
new file mode 100644
index 0000000000..e09ba1ae38
--- /dev/null
+++ b/ext/standard/tests/serialize/SplObjectStorage_object_reference.phpt
@@ -0,0 +1,33 @@
+--TEST--
+Reference to SplObjectStorage key (not supported)
+--FILE--
+<?php
+
+$inner = 'x:i:1;O:8:"stdClass":0:{};m:a:0:{}';
+$inner_len = strlen($inner);
+$str = <<<STR
+a:2:{i:0;C:16:"SPlObjectStorage":{$inner_len}:{{$inner}}i:1;R:4;}
+STR;
+var_dump(unserialize($str));
+
+?>
+--EXPECTF--
+array(2) {
+ [0]=>
+ object(SplObjectStorage)#1 (1) {
+ ["storage":"SplObjectStorage":private]=>
+ array(1) {
+ ["%s"]=>
+ array(2) {
+ ["obj"]=>
+ object(stdClass)#2 (0) {
+ }
+ ["inf"]=>
+ NULL
+ }
+ }
+ }
+ [1]=>
+ object(stdClass)#2 (0) {
+ }
+}
diff --git a/ext/standard/tests/serialize/__serialize_005.phpt b/ext/standard/tests/serialize/__serialize_005.phpt
index 3656a034b3..c65c0cdec8 100644
--- a/ext/standard/tests/serialize/__serialize_005.phpt
+++ b/ext/standard/tests/serialize/__serialize_005.phpt
@@ -41,13 +41,13 @@ var_dump(unserialize($s));
--EXPECT--
string(63) "O:1:"B":2:{i:0;a:1:{i:0;O:8:"stdClass":0:{}}i:1;a:1:{i:0;r:3;}}"
object(B)#3 (2) {
- ["data2":"B":private]=>
+ ["data":"A":private]=>
array(1) {
[0]=>
object(stdClass)#4 (0) {
}
}
- ["data":"A":private]=>
+ ["data2":"B":private]=>
array(1) {
[0]=>
object(stdClass)#4 (0) {
diff --git a/ext/standard/tests/serialize/bug76300.phpt b/ext/standard/tests/serialize/bug76300.phpt
index f8636dc9a5..ef7536e0db 100644
--- a/ext/standard/tests/serialize/bug76300.phpt
+++ b/ext/standard/tests/serialize/bug76300.phpt
@@ -25,6 +25,6 @@ print_r($u);
--EXPECT--
Derived Object
(
- [id:protected] => 44
[id:Base:private] => 64
+ [id:protected] => 44
)
diff --git a/ext/standard/tests/serialize/incomplete_class_magic.phpt b/ext/standard/tests/serialize/incomplete_class_magic.phpt
new file mode 100644
index 0000000000..bef139740c
--- /dev/null
+++ b/ext/standard/tests/serialize/incomplete_class_magic.phpt
@@ -0,0 +1,32 @@
+--TEST--
+(un)serializing __PHP_Incomplete_Class instance edge case
+--FILE--
+<?php
+
+$serialized = 'O:8:"Missing_":1:{s:33:"__PHP_Incomplete_Class_Name' . "\0" . 'other";i:123;}';
+ob_start();
+$o = unserialize($serialized);
+var_dump($o);
+$reserialized = serialize($o);
+var_dump(unserialize($reserialized));
+// Pretty print null bytes
+echo str_replace("\0", "\\0", ob_get_clean());
+
+// The serialization should have a property count of 1 and a property set with 1 element.
+var_export($reserialized);
+echo "\n";
+?>
+--EXPECT--
+object(__PHP_Incomplete_Class)#1 (2) {
+ ["__PHP_Incomplete_Class_Name"]=>
+ string(8) "Missing_"
+ ["__PHP_Incomplete_Class_Name\0other"]=>
+ int(123)
+}
+object(__PHP_Incomplete_Class)#2 (2) {
+ ["__PHP_Incomplete_Class_Name"]=>
+ string(8) "Missing_"
+ ["__PHP_Incomplete_Class_Name\0other"]=>
+ int(123)
+}
+'O:8:"Missing_":1:{s:33:"__PHP_Incomplete_Class_Name' . "\0" . 'other";i:123;}'
diff --git a/ext/standard/tests/serialize/serialization_objects_002.phpt b/ext/standard/tests/serialize/serialization_objects_002.phpt
index a703af0c8f..211ba10187 100644
--- a/ext/standard/tests/serialize/serialization_objects_002.phpt
+++ b/ext/standard/tests/serialize/serialization_objects_002.phpt
Binary files differ
diff --git a/ext/standard/tests/serialize/serialization_objects_011.phpt b/ext/standard/tests/serialize/serialization_objects_011.phpt
index ba721a3d98..5fbcedd7ec 100644
--- a/ext/standard/tests/serialize/serialization_objects_011.phpt
+++ b/ext/standard/tests/serialize/serialization_objects_011.phpt
@@ -97,35 +97,35 @@ Sanity check: bool(true)
Before serialization:
object(B)#%d (6) {
- ["BPriv":"B":private]=>
- string(7) "B.BPriv"
- ["BProt":protected]=>
- string(7) "B.BProt"
- ["BPub"]=>
- string(6) "B.BPub"
["APriv":"A":private]=>
string(7) "A.APriv"
["AProt":protected]=>
string(7) "A.AProt"
["APub"]=>
string(6) "A.APub"
-}
-Serialized form:
-string(184) "O:1:"B":6:{s:8:"\0B\0BPriv";s:7:"B.BPriv";s:8:"\0*\0BProt";s:7:"B.BProt";s:4:"BPub";s:6:"B.BPub";s:8:"\0A\0APriv";s:7:"A.APriv";s:8:"\0*\0AProt";s:7:"A.AProt";s:4:"APub";s:6:"A.APub";}"
-Unserialized:
-object(B)#%d (6) {
["BPriv":"B":private]=>
string(7) "B.BPriv"
["BProt":protected]=>
string(7) "B.BProt"
["BPub"]=>
string(6) "B.BPub"
+}
+Serialized form:
+string(184) "O:1:"B":6:{s:8:"\0A\0APriv";s:7:"A.APriv";s:8:"\0*\0AProt";s:7:"A.AProt";s:4:"APub";s:6:"A.APub";s:8:"\0B\0BPriv";s:7:"B.BPriv";s:8:"\0*\0BProt";s:7:"B.BProt";s:4:"BPub";s:6:"B.BPub";}"
+Unserialized:
+object(B)#%d (6) {
["APriv":"A":private]=>
string(7) "A.APriv"
["AProt":protected]=>
string(7) "A.AProt"
["APub"]=>
string(6) "A.APub"
+ ["BPriv":"B":private]=>
+ string(7) "B.BPriv"
+ ["BProt":protected]=>
+ string(7) "B.BProt"
+ ["BPub"]=>
+ string(6) "B.BPub"
}
Sanity check: bool(true)
@@ -135,51 +135,51 @@ Sanity check: bool(true)
Before serialization:
object(C)#%d (10) {
- ["APriv":"C":private]=>
- string(7) "C.APriv"
+ ["APriv":"A":private]=>
+ string(7) "A.APriv"
["AProt":protected]=>
string(7) "C.AProt"
["APub"]=>
string(6) "C.APub"
- ["CPriv":"C":private]=>
- string(7) "C.CPriv"
- ["CProt":protected]=>
- string(7) "C.BProt"
- ["CPub"]=>
- string(6) "C.CPub"
["BPriv":"B":private]=>
string(7) "B.BPriv"
["BProt":protected]=>
string(7) "B.BProt"
["BPub"]=>
string(6) "B.BPub"
- ["APriv":"A":private]=>
- string(7) "A.APriv"
-}
-Serialized form:
-string(302) "O:1:"C":10:{s:8:"\0C\0APriv";s:7:"C.APriv";s:8:"\0*\0AProt";s:7:"C.AProt";s:4:"APub";s:6:"C.APub";s:8:"\0C\0CPriv";s:7:"C.CPriv";s:8:"\0*\0CProt";s:7:"C.BProt";s:4:"CPub";s:6:"C.CPub";s:8:"\0B\0BPriv";s:7:"B.BPriv";s:8:"\0*\0BProt";s:7:"B.BProt";s:4:"BPub";s:6:"B.BPub";s:8:"\0A\0APriv";s:7:"A.APriv";}"
-Unserialized:
-object(C)#%d (10) {
["APriv":"C":private]=>
string(7) "C.APriv"
- ["AProt":protected]=>
- string(7) "C.AProt"
- ["APub"]=>
- string(6) "C.APub"
["CPriv":"C":private]=>
string(7) "C.CPriv"
["CProt":protected]=>
string(7) "C.BProt"
["CPub"]=>
string(6) "C.CPub"
+}
+Serialized form:
+string(302) "O:1:"C":10:{s:8:"\0A\0APriv";s:7:"A.APriv";s:8:"\0*\0AProt";s:7:"C.AProt";s:4:"APub";s:6:"C.APub";s:8:"\0B\0BPriv";s:7:"B.BPriv";s:8:"\0*\0BProt";s:7:"B.BProt";s:4:"BPub";s:6:"B.BPub";s:8:"\0C\0APriv";s:7:"C.APriv";s:8:"\0C\0CPriv";s:7:"C.CPriv";s:8:"\0*\0CProt";s:7:"C.BProt";s:4:"CPub";s:6:"C.CPub";}"
+Unserialized:
+object(C)#%d (10) {
+ ["APriv":"A":private]=>
+ string(7) "A.APriv"
+ ["AProt":protected]=>
+ string(7) "C.AProt"
+ ["APub"]=>
+ string(6) "C.APub"
["BPriv":"B":private]=>
string(7) "B.BPriv"
["BProt":protected]=>
string(7) "B.BProt"
["BPub"]=>
string(6) "B.BPub"
- ["APriv":"A":private]=>
- string(7) "A.APriv"
+ ["APriv":"C":private]=>
+ string(7) "C.APriv"
+ ["CPriv":"C":private]=>
+ string(7) "C.CPriv"
+ ["CProt":protected]=>
+ string(7) "C.BProt"
+ ["CPub"]=>
+ string(6) "C.CPub"
}
Sanity check: bool(true)
Done
diff --git a/ext/standard/tests/serialize/unserialize_overwrite_undeclared_protected.phpt b/ext/standard/tests/serialize/unserialize_overwrite_undeclared_protected.phpt
new file mode 100644
index 0000000000..b442c922c4
--- /dev/null
+++ b/ext/standard/tests/serialize/unserialize_overwrite_undeclared_protected.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Overwriting an undeclared property with protected mangling
+--FILE--
+<?php
+class Test {
+ // We need at least one declared property, even though we don't use it.
+ public $foo;
+}
+
+$str = <<<STR
+O:4:"Test":2:{s:4:"\0*\0x";N;s:4:"\0*\0x";N;}
+STR;
+var_dump(unserialize($str));
+?>
+--EXPECT--
+object(Test)#1 (2) {
+ ["foo"]=>
+ NULL
+ ["x":protected]=>
+ NULL
+}
diff --git a/ext/standard/tests/serialize/unserialize_ref_to_overwritten_declared_prop.phpt b/ext/standard/tests/serialize/unserialize_ref_to_overwritten_declared_prop.phpt
new file mode 100644
index 0000000000..f32b0c12e2
--- /dev/null
+++ b/ext/standard/tests/serialize/unserialize_ref_to_overwritten_declared_prop.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Trying to create a reference to an overwritten declared property
+--FILE--
+<?php
+$str = <<<STR
+O:5:"Error":2:{S:8:"previous";N;S:8:"previous";R:2;}
+STR;
+var_dump(unserialize($str));
+?>
+--EXPECTF--
+Notice: unserialize(): Error at offset 51 of 52 bytes in %s on line %d
+bool(false)
diff --git a/ext/standard/tests/streams/bug64433.phpt b/ext/standard/tests/streams/bug64433.phpt
index 56af241837..53fecc57f9 100644
--- a/ext/standard/tests/streams/bug64433.phpt
+++ b/ext/standard/tests/streams/bug64433.phpt
@@ -9,8 +9,6 @@ if(!$res) {
die("skip could not open cli server script");
}
?>
---CONFLICTS--
-server
--FILE--
<?php
include __DIR__."/../../../../sapi/cli/tests/php_cli_server.inc";
diff --git a/ext/standard/tests/strings/addcslashes_001.phpt b/ext/standard/tests/strings/addcslashes_001.phpt
index be6b18559f..e8fdf2b69a 100644
--- a/ext/standard/tests/strings/addcslashes_001.phpt
+++ b/ext/standard/tests/strings/addcslashes_001.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/addcslashes_003.phpt b/ext/standard/tests/strings/addcslashes_003.phpt
index f743726301..7736a9f58f 100644
--- a/ext/standard/tests/strings/addcslashes_003.phpt
+++ b/ext/standard/tests/strings/addcslashes_003.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/basename_variation.phpt b/ext/standard/tests/strings/basename_variation.phpt
index eae1f7fa51..c34b643600 100644
--- a/ext/standard/tests/strings/basename_variation.phpt
+++ b/ext/standard/tests/strings/basename_variation.phpt
@@ -6,13 +6,11 @@ $file_path_variations = array (
/* paths with shortcut home dir char, with suffix variation */
array("~/home/user/bar"),
array("~/home/user/bar", ""),
- array("~/home/user/bar", NULL),
array("~/home/user/bar", ' '),
array("~/home/user/bar.tar", ".tar"),
array("~/home/user/bar.tar", "~"),
array("~/home/user/bar.tar/", "~"),
array("~/home/user/bar.tar/", ""),
- array("~/home/user/bar.tar", NULL),
array("~/home/user/bar.tar", ''),
array("~/home/user/bar.tar", " "),
@@ -29,7 +27,6 @@ $file_path_variations = array (
array("hostname:/home/user/My Pics.gz/", "Pics.gz"),
array("hostname:/home/user/My Pics.gz/", ".gz"),
array("hostname:/home/user/My Pics.gz/"),
- array("hostname:/home/user/My Pics.gz/", NULL),
array("hostname:/home/user/My Pics.gz/", ' '),
array("hostname:/home/user/My Pics.gz/", ''),
array("hostname:/home/user/My Pics.gz/", "My Pics.gz"),
@@ -52,7 +49,6 @@ $file_path_variations = array (
array("/bar.gz/", "/bar.gz/"),
array(" ", " "),
array(' ', ' '),
- array(NULL, NULL),
/* path with spaces */
array(" "),
@@ -61,7 +57,6 @@ $file_path_variations = array (
/* empty paths */
array(""),
array(''),
- array(NULL),
);
function check_basename( $path_arrays ) {
@@ -97,7 +92,7 @@ string(3) "bar"
string(3) "bar"
--Iteration 5--
-string(3) "bar"
+string(7) "bar.tar"
--Iteration 6--
string(7) "bar.tar"
@@ -118,13 +113,13 @@ string(7) "bar.tar"
string(7) "bar.tar"
--Iteration 12--
-string(7) "bar.tar"
+string(1) "t"
--Iteration 13--
-string(7) "bar.tar"
+string(7) "tbar.gz"
--Iteration 14--
-string(1) "t"
+string(7) "tbar.gz"
--Iteration 15--
string(7) "tbar.gz"
@@ -133,22 +128,22 @@ string(7) "tbar.gz"
string(7) "tbar.gz"
--Iteration 17--
-string(7) "tbar.gz"
+string(10) "My Pics.gz"
--Iteration 18--
-string(7) "tbar.gz"
+string(10) "My Pics.gz"
--Iteration 19--
-string(10) "My Pics.gz"
+string(3) "My "
--Iteration 20--
-string(10) "My Pics.gz"
+string(7) "My Pics"
--Iteration 21--
-string(3) "My "
+string(10) "My Pics.gz"
--Iteration 22--
-string(7) "My Pics"
+string(10) "My Pics.gz"
--Iteration 23--
string(10) "My Pics.gz"
@@ -157,16 +152,16 @@ string(10) "My Pics.gz"
string(10) "My Pics.gz"
--Iteration 25--
-string(10) "My Pics.gz"
+string(4) "10.5"
--Iteration 26--
-string(10) "My Pics.gz"
+string(2) "10"
--Iteration 27--
-string(10) "My Pics.gz"
+string(4) "10.5"
--Iteration 28--
-string(4) "10.5"
+string(2) "10"
--Iteration 29--
string(2) "10"
@@ -175,56 +170,41 @@ string(2) "10"
string(4) "10.5"
--Iteration 31--
-string(2) "10"
+string(4) "10.5"
--Iteration 32--
-string(2) "10"
+string(5) "10.gz"
--Iteration 33--
-string(4) "10.5"
+string(1) "0"
--Iteration 34--
-string(4) "10.5"
+string(1) "0"
--Iteration 35--
-string(5) "10.gz"
+string(6) "bar.gz"
--Iteration 36--
-string(1) "0"
+string(6) "bar.gz"
--Iteration 37--
-string(1) "0"
+string(6) "bar.gz"
--Iteration 38--
-string(6) "bar.gz"
+string(1) " "
--Iteration 39--
-string(6) "bar.gz"
+string(1) " "
--Iteration 40--
-string(6) "bar.gz"
+string(1) " "
--Iteration 41--
string(1) " "
--Iteration 42--
-string(1) " "
-
---Iteration 43--
string(0) ""
---Iteration 44--
-string(1) " "
-
---Iteration 45--
-string(1) " "
-
---Iteration 46--
-string(0) ""
-
---Iteration 47--
-string(0) ""
-
---Iteration 48--
+--Iteration 43--
string(0) ""
Done
diff --git a/ext/standard/tests/strings/bug21338.phpt b/ext/standard/tests/strings/bug21338.phpt
index c118ee18de..2809d43089 100644
--- a/ext/standard/tests/strings/bug21338.phpt
+++ b/ext/standard/tests/strings/bug21338.phpt
@@ -2,9 +2,7 @@
Bug #20934 (html_entity_decode() crash when "" is passed)
--FILE--
<?php
- var_dump(html_entity_decode(NULL));
- var_dump(html_entity_decode(""));
+var_dump(html_entity_decode(""));
?>
--EXPECT--
string(0) ""
-string(0) ""
diff --git a/ext/standard/tests/strings/bug51899.phpt b/ext/standard/tests/strings/bug51899.phpt
index fb430cf30d..55fd535f42 100644
--- a/ext/standard/tests/strings/bug51899.phpt
+++ b/ext/standard/tests/strings/bug51899.phpt
@@ -8,7 +8,6 @@ var_dump(parse_ini_string('a= '));
var_dump(parse_ini_string('a='.PHP_EOL));
var_dump(parse_ini_string('a=b '));
var_dump(parse_ini_string(''));
-var_dump(parse_ini_string(NULL));
var_dump(parse_ini_string("\0"));
?>
@@ -33,5 +32,3 @@ array(0) {
}
array(0) {
}
-array(0) {
-}
diff --git a/ext/standard/tests/strings/bug53021.phpt b/ext/standard/tests/strings/bug53021.phpt
index cdb408db63..4f70f213e8 100644
--- a/ext/standard/tests/strings/bug53021.phpt
+++ b/ext/standard/tests/strings/bug53021.phpt
@@ -38,4 +38,4 @@ single quotes variations:
&#39;
'
&#39;
-&#39;
+'
diff --git a/ext/standard/tests/strings/bug61116.phpt b/ext/standard/tests/strings/bug61116.phpt
index f8f76cd504..01da21d975 100644
--- a/ext/standard/tests/strings/bug61116.phpt
+++ b/ext/standard/tests/strings/bug61116.phpt
@@ -10,7 +10,7 @@ Function [ <internal:standard> function htmlspecialchars ] {
- Parameters [4] {
Parameter #0 [ <required> string $string ]
- Parameter #1 [ <optional> int $flags = ENT_COMPAT ]
+ Parameter #1 [ <optional> int $flags = ENT_QUOTES | ENT_SUBSTITUTE ]
Parameter #2 [ <optional> ?string $encoding = null ]
Parameter #3 [ <optional> bool $double_encode = true ]
}
@@ -21,7 +21,7 @@ Function [ <internal:standard> function get_html_translation_table ] {
- Parameters [3] {
Parameter #0 [ <optional> int $table = HTML_SPECIALCHARS ]
- Parameter #1 [ <optional> int $flags = ENT_COMPAT ]
+ Parameter #1 [ <optional> int $flags = ENT_QUOTES | ENT_SUBSTITUTE ]
Parameter #2 [ <optional> string $encoding = "UTF-8" ]
}
- Return [ array ]
diff --git a/ext/standard/tests/strings/chop_variation5.phpt b/ext/standard/tests/strings/chop_variation5.phpt
index c0fe43976f..2b86a9713b 100644
--- a/ext/standard/tests/strings/chop_variation5.phpt
+++ b/ext/standard/tests/strings/chop_variation5.phpt
@@ -10,7 +10,6 @@ echo "*** Testing chop() : with miscellaneous arguments ***\n";
var_dump ( chop("chop test \t\0 ") ); /* without second Argument */
var_dump ( chop("chop test " , "") ); /* no characters in second Argument */
- var_dump ( chop("chop test ", NULL) ); /* with NULL as second Argument */
var_dump ( chop("chop test ", true) ); /* with boolean value as second Argument */
var_dump ( chop("chop test ", " ") ); /* with single space as second Argument */
var_dump ( chop("chop test \t\n\r\0\x0B", "\t\n\r\0\x0B") ); /* with multiple escape sequences as second Argument */
@@ -25,7 +24,6 @@ echo "Done\n";
string(9) "chop test"
string(12) "chop test "
string(17) "chop test "
-string(17) "chop test "
string(9) "chop test"
string(10) "chop test "
string(9) "chop test"
diff --git a/ext/standard/tests/strings/chr_variation1.phpt b/ext/standard/tests/strings/chr_variation1.phpt
index f9df308a7a..13a0636b8a 100644
--- a/ext/standard/tests/strings/chr_variation1.phpt
+++ b/ext/standard/tests/strings/chr_variation1.phpt
@@ -5,10 +5,6 @@ Test chr() function : usage variations - test values for $ascii argument
echo "*** Testing chr() function: with unexpected inputs for 'ascii' argument ***\n";
-//get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
//defining a class
class sample {
public function __toString() {
@@ -38,16 +34,6 @@ $inputs = array (
false,
TRUE,
FALSE,
-
- // null values
-/*15*/ NULL,
- null,
-
- // undefined variable
-/*19*/ @$undefined_var,
-
- // unset variable
-/*20*/ @$unset_var
);
// loop through with each element of the $inputs array to test chr() function
@@ -85,11 +71,3 @@ string(2) "00"
string(2) "01"
-- Iteration 11 --
string(2) "00"
--- Iteration 12 --
-string(2) "00"
--- Iteration 13 --
-string(2) "00"
--- Iteration 14 --
-string(2) "00"
--- Iteration 15 --
-string(2) "00"
diff --git a/ext/standard/tests/strings/dirname_variation.phpt b/ext/standard/tests/strings/dirname_variation.phpt
index 5b8e22f5ae..96140b755e 100644
--- a/ext/standard/tests/strings/dirname_variation.phpt
+++ b/ext/standard/tests/strings/dirname_variation.phpt
@@ -43,8 +43,6 @@ $file_path_variations = array (
/* empty path */
"",
'',
- NULL,
- null
);
function check_dirname( $paths ) {
@@ -131,10 +129,4 @@ string\(0\) ""
--Iteration 22 --
string\(0\) ""
-
---Iteration 23 --
-string\(0\) ""
-
---Iteration 24 --
-string\(0\) ""
Done
diff --git a/ext/standard/tests/strings/html_entity_decode3.phpt b/ext/standard/tests/strings/html_entity_decode3.phpt
index e8372ed4f8..6b5efd8f04 100644
--- a/ext/standard/tests/strings/html_entity_decode3.phpt
+++ b/ext/standard/tests/strings/html_entity_decode3.phpt
@@ -218,7 +218,7 @@ echo "\nDone.\n";
&#x0E; NOT DECODED
&#x1F; NOT DECODED
&#x20; DECODED
-&#x27; NOT DECODED
+&#x27; DECODED
&#x7F; NOT DECODED
&#x80; NOT DECODED
&#x9F; NOT DECODED
diff --git a/ext/standard/tests/strings/htmlentities24.phpt b/ext/standard/tests/strings/htmlentities24.phpt
index 2a04bd345e..8754257d7f 100644
--- a/ext/standard/tests/strings/htmlentities24.phpt
+++ b/ext/standard/tests/strings/htmlentities24.phpt
@@ -13,11 +13,9 @@ for($i=0; $i<256; $i++)
/* giving arguments as NULL */
echo "\n*** Testing htmlentities() with NULL as first,second and third argument ***\n";
-var_dump( htmlentities("\x82\x86\x99\x9f\x80\x82\x81", NULL, 'cp1252') );
var_dump( htmlentities("\x82\x86\x99\x9f\x80\x82\x81", ENT_QUOTES, NULL) ); /* UTF-8 assumed */
var_dump( htmlentities("\x82\x86\x99\x9f\x80\x82\x81", ENT_NOQUOTES, NULL) ); /* UTF-8 assumed */
var_dump( htmlentities("\x82\x86\x99\x9f\x80\x82\x81", ENT_COMPAT, NULL) ); /* UTF-8 assumed */
-var_dump( htmlentities(NULL, NULL, NULL) );
/* giving long string to check for proper memory re-allocation */
echo "\n*** Checking for proper memory allocation with long string ***\n";
@@ -297,8 +295,6 @@ string(16) "6368722832353429"
string(16) "6368722832353529"
*** Testing htmlentities() with NULL as first,second and third argument ***
-string(42) "&sbquo;&dagger;&trade;&Yuml;&euro;&sbquo;"
-string(0) ""
string(0) ""
string(0) ""
string(0) ""
@@ -310,7 +306,7 @@ string(198) "&sbquo;&dagger;&trade;&Yuml;&euro;&sbquo;&dagger;&bdquo;&euro;&perm
string(42) "&lt;html&gt; This is a test! &lt;/html&gt;"
*** Testing htmlentites() on a quote ***
-string(36) "A 'quote' is &lt;b&gt;bold&lt;/b&gt;"
+string(46) "A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;"
string(46) "A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;"
string(36) "A 'quote' is &lt;b&gt;bold&lt;/b&gt;"
string(36) "A 'quote' is &lt;b&gt;bold&lt;/b&gt;"
diff --git a/ext/standard/tests/strings/htmlspecialchars.phpt b/ext/standard/tests/strings/htmlspecialchars.phpt
index 095225f534..775cb2f4d4 100644
--- a/ext/standard/tests/strings/htmlspecialchars.phpt
+++ b/ext/standard/tests/strings/htmlspecialchars.phpt
@@ -9,11 +9,9 @@ var_dump( bin2hex( htmlspecialchars("chr($i)") ) );
/* giving NULL as the argument */
echo "\n*** Testing htmlspecialchars() with NULL as first, second and third argument ***\n";
-var_dump( htmlspecialchars("<br>", NULL, 'iso-8859-1') );
var_dump( htmlspecialchars("<br>", ENT_NOQUOTES, NULL) );
var_dump( htmlspecialchars("<br>", ENT_QUOTES, NULL) );
var_dump( htmlspecialchars("<br>", ENT_COMPAT, NULL) );
-var_dump( htmlspecialchars(NULL, NULL, NULL) );
/* giving long string to check for proper memory re-allocation */
echo "\n*** Checking a long string for proper memory allocation ***\n";
@@ -296,8 +294,6 @@ string(16) "6368722832353529"
string(10) "&lt;br&gt;"
string(10) "&lt;br&gt;"
string(10) "&lt;br&gt;"
-string(10) "&lt;br&gt;"
-string(0) ""
*** Checking a long string for proper memory allocation ***
string(187) "&lt;br&gt;Testing&lt;p&gt;New file.&lt;/p&gt;&lt;p&gt;&lt;br&gt;File &lt;b&gt;&lt;i&gt;&lt;u&gt;WORKS!!!&lt;/i&gt;&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;br&gt;&lt;p&gt;End of file!!!&lt;/p&gt;"
@@ -306,7 +302,7 @@ string(187) "&lt;br&gt;Testing&lt;p&gt;New file.&lt;/p&gt;&lt;p&gt;&lt;br&gt;Fil
string(46) "&lt;br&gt;Testing&lt;p&gt;New file.&lt;/p&gt; "
*** Testing htmlspecialchars() on a quote...
-string(36) "A 'quote' is &lt;b&gt;bold&lt;/b&gt;"
+string(46) "A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;"
string(46) "A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;"
string(36) "A 'quote' is &lt;b&gt;bold&lt;/b&gt;"
string(36) "A 'quote' is &lt;b&gt;bold&lt;/b&gt;"
diff --git a/ext/standard/tests/strings/htmlspecialchars_basic.phpt b/ext/standard/tests/strings/htmlspecialchars_basic.phpt
index 578814beff..c86692aa3b 100644
--- a/ext/standard/tests/strings/htmlspecialchars_basic.phpt
+++ b/ext/standard/tests/strings/htmlspecialchars_basic.phpt
@@ -56,7 +56,7 @@ Basic tests
Test 1: abc&lt;&gt;&quot;&amp;
Test 2: &amp;&amp;abc&lt;&gt;&quot;&amp;
Test 3: a&gt;,\&lt;bc&lt;&gt;&quot;&amp;
-Test 4: a\'\'&amp;bc&lt;&gt;&quot;&amp;
+Test 4: a\&#039;\&#039;&amp;bc&lt;&gt;&quot;&amp;
Test 5: &amp;amp;&amp;lt;
Test 6: abc&lt;&gt;"&amp;
Test 7: &amp;&amp;abc&lt;&gt;"&amp;
diff --git a/ext/standard/tests/strings/htmlspecialchars_decode_basic.phpt b/ext/standard/tests/strings/htmlspecialchars_decode_basic.phpt
index d3e3166fb9..ad9df68f05 100644
--- a/ext/standard/tests/strings/htmlspecialchars_decode_basic.phpt
+++ b/ext/standard/tests/strings/htmlspecialchars_decode_basic.phpt
@@ -26,8 +26,8 @@ echo "Done";
?>
--EXPECT--
*** Testing htmlspecialchars_decode() : basic functionality ***
-string(92) "Roy&#039;s height > Sam&#039;s height. 13 < 25. 1111 & 0000 = 0000. " double quoted string ""
-string(92) "Roy&#039;s height > Sam&#039;s height. 13 < 25. 1111 & 0000 = 0000. " double quoted string ""
+string(82) "Roy's height > Sam's height. 13 < 25. 1111 & 0000 = 0000. " double quoted string ""
+string(82) "Roy's height > Sam's height. 13 < 25. 1111 & 0000 = 0000. " double quoted string ""
string(92) "Roy&#039;s height > Sam&#039;s height. 13 < 25. 1111 & 0000 = 0000. " double quoted string ""
string(92) "Roy&#039;s height > Sam&#039;s height. 13 < 25. 1111 & 0000 = 0000. " double quoted string ""
string(102) "Roy&#039;s height > Sam&#039;s height. 13 < 25. 1111 & 0000 = 0000. &quot; double quoted string &quot;"
diff --git a/ext/standard/tests/strings/htmlspecialchars_decode_variation3.phpt b/ext/standard/tests/strings/htmlspecialchars_decode_variation3.phpt
index 93058d1853..98d4684d63 100644
--- a/ext/standard/tests/strings/htmlspecialchars_decode_variation3.phpt
+++ b/ext/standard/tests/strings/htmlspecialchars_decode_variation3.phpt
@@ -73,12 +73,12 @@ string(0) ""
-- Iteration 2 --
string(0) ""
-- Iteration 3 --
-string(103) "<html>Roy&#039;s height > Sam&#039;s height
+string(93) "<html>Roy's height > Sam's height
13 < 25
1111 & 0000 = 0000
"This is a double quoted string""
-- Iteration 4 --
-string(130) "<html>Roy&#039;s height > Sam &#039;s height
+string(120) "<html>Roy's height > Sam 's height
1111 & 0000 = 0000
" heredoc
double quoted string. with different white spaces""
@@ -87,8 +87,8 @@ string(62) "<html>11 < 12. 123 string 4567
"string" 1111 & 0000 = 0000
;"
-- Iteration 6 --
-string(153) "<html>< This's a string with quotes:
+string(143) "<html>< This's a string with quotes:
"strings in double quote" &
'strings in single quote' "
-this\line is &#039;single quoted&#039; /with\slashes </html>"
+this\line is 'single quoted' /with\slashes </html>"
Done
diff --git a/ext/standard/tests/strings/htmlspecialchars_decode_variation4.phpt b/ext/standard/tests/strings/htmlspecialchars_decode_variation4.phpt
index bdbddcf8a9..00d4e9a143 100644
--- a/ext/standard/tests/strings/htmlspecialchars_decode_variation4.phpt
+++ b/ext/standard/tests/strings/htmlspecialchars_decode_variation4.phpt
@@ -33,22 +33,22 @@ echo "Done";
--EXPECT--
*** Testing htmlspecialchars_decode() : usage variations ***
-- Iteration 1 --
-string(90) "Roy&#039s height > Sam&#039;s \$height... 1111 &ap; 0000 = 0000... " double quote string ""
+string(85) "Roy&#039s height > Sam's \$height... 1111 &ap; 0000 = 0000... " double quote string ""
string(90) "Roy&#039s height > Sam&#039;s \$height... 1111 &ap; 0000 = 0000... " double quote string ""
string(100) "Roy&#039s height > Sam&#039;s \$height... 1111 &ap; 0000 = 0000... &quot; double quote string &quot;"
string(85) "Roy&#039s height > Sam's \$height... 1111 &ap; 0000 = 0000... " double quote string ""
-- Iteration 2 --
-string(88) "Roy&#039;s height > Sam&#039;s height... \t\t 13 < 15...\n\r " double quote\f\v string ""
+string(78) "Roy's height > Sam's height... \t\t 13 < 15...\n\r " double quote\f\v string ""
string(88) "Roy&#039;s height > Sam&#039;s height... \t\t 13 < 15...\n\r " double quote\f\v string ""
string(98) "Roy&#039;s height > Sam&#039;s height... \t\t 13 < 15...\n\r &quot; double quote\f\v string &quot;"
string(78) "Roy's height > Sam's height... \t\t 13 < 15...\n\r " double quote\f\v string ""
-- Iteration 3 --
-string(48) "\nRoy&#039;s height &gt\t; Sam&#039;s\v height\f"
+string(38) "\nRoy's height &gt\t; Sam's\v height\f"
string(48) "\nRoy&#039;s height &gt\t; Sam&#039;s\v height\f"
string(48) "\nRoy&#039;s height &gt\t; Sam&#039;s\v height\f"
string(38) "\nRoy's height &gt\t; Sam's\v height\f"
-- Iteration 4 --
-string(48) "\r\tRoy&#039;s height &gt\r; Sam\t&#039;s height"
+string(38) "\r\tRoy's height &gt\r; Sam\t's height"
string(48) "\r\tRoy&#039;s height &gt\r; Sam\t&#039;s height"
string(48) "\r\tRoy&#039;s height &gt\r; Sam\t&#039;s height"
string(38) "\r\tRoy's height &gt\r; Sam\t's height"
diff --git a/ext/standard/tests/strings/htmlspecialchars_decode_variation5.phpt b/ext/standard/tests/strings/htmlspecialchars_decode_variation5.phpt
index 9937ca9b54..3f235944eb 100644
--- a/ext/standard/tests/strings/htmlspecialchars_decode_variation5.phpt
+++ b/ext/standard/tests/strings/htmlspecialchars_decode_variation5.phpt
@@ -32,12 +32,12 @@ echo "Done";
--EXPECT--
*** Testing htmlspecialchars_decode() : usage variations ***
-- Iteration 1 --
-string(89) "Roy&#039s height > Sam&#039;s $height... 1111 &ap; 0000 = 0000... " double quote string ""
+string(84) "Roy&#039s height > Sam's $height... 1111 &ap; 0000 = 0000... " double quote string ""
string(89) "Roy&#039s height > Sam&#039;s $height... 1111 &ap; 0000 = 0000... " double quote string ""
string(99) "Roy&#039s height > Sam&#039;s $height... 1111 &ap; 0000 = 0000... &quot; double quote string &quot;"
string(84) "Roy&#039s height > Sam's $height... 1111 &ap; 0000 = 0000... " double quote string ""
-- Iteration 2 --
-string(82) "Roy&#039;s height > Sam&#039;s height... 13 < 15...
+string(72) "Roy's height > Sam's height... 13 < 15...
" double quote string ""
string(82) "Roy&#039;s height > Sam&#039;s height... 13 < 15...
" double quote string ""
@@ -46,8 +46,8 @@ string(92) "Roy&#039;s height > Sam&#039;s height... 13 < 15...
string(72) "Roy's height > Sam's height... 13 < 15...
" double quote string ""
-- Iteration 3 --
-string(44) "
-Roy&#039;s height &gt ; Sam&#039;s height "
+string(34) "
+Roy's height &gt ; Sam's height "
string(44) "
Roy&#039;s height &gt ; Sam&#039;s height "
string(44) "
@@ -55,7 +55,7 @@ Roy&#039;s height &gt ; Sam&#039;s height "
string(34) "
Roy's height &gt ; Sam's height "
-- Iteration 4 --
-string(44) " Roy&#039;s height &gt ; Sam &#039;s height"
+string(34) " Roy's height &gt ; Sam 's height"
string(44) " Roy&#039;s height &gt ; Sam &#039;s height"
string(44) " Roy&#039;s height &gt ; Sam &#039;s height"
string(34) " Roy's height &gt ; Sam 's height"
diff --git a/ext/standard/tests/strings/implode1.phpt b/ext/standard/tests/strings/implode1.phpt
index c1c1599eb7..ca12110211 100644
--- a/ext/standard/tests/strings/implode1.phpt
+++ b/ext/standard/tests/strings/implode1.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/join_basic.phpt b/ext/standard/tests/strings/join_basic.phpt
index 8e8c554ee9..129f75bc79 100644
--- a/ext/standard/tests/strings/join_basic.phpt
+++ b/ext/standard/tests/strings/join_basic.phpt
@@ -16,12 +16,12 @@ $glue = ", "; // multiple car as glue
$pieces = array("Red", "Green", "Blue", "Black", "White");
var_dump( join($glue, $pieces) );
-// pices as associative array (numeric values)
+// pieces as associative array (numeric values)
$pieces = array("Hour" => 10, "Minute" => 20, "Second" => 40);
$glue = ':';
var_dump( join($glue, $pieces) );
-// pices as associative array (string/numeric values)
+// pieces as associative array (string/numeric values)
$pieces = array("Day" => 'Friday', "Month" => "September", "Year" => 2007);
$glue = '/';
var_dump( join($glue, $pieces) );
diff --git a/ext/standard/tests/strings/join_variation1.phpt b/ext/standard/tests/strings/join_variation1.phpt
index 7a806349ce..256f361460 100644
--- a/ext/standard/tests/strings/join_variation1.phpt
+++ b/ext/standard/tests/strings/join_variation1.phpt
@@ -10,10 +10,6 @@ echo "*** Testing join() : usage variations ***\n";
// initialize all required variables
$pieces = array("element1", "element2");
-// get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
// get a resource variable
$fp = fopen(__FILE__, "r");
@@ -62,18 +58,8 @@ $values = array (
"",
'',
- // null values
- NULL,
- null,
-
// resource variable
$fp,
-
- // undefined variable
- @$undefined_var,
-
- // unset variable
- @$unset_var
);
@@ -143,13 +129,5 @@ string(16) "element1element2"
-- Iteration 21 --
string(16) "element1element2"
-- Iteration 22 --
-string(16) "element1element2"
--- Iteration 23 --
-string(16) "element1element2"
--- Iteration 24 --
join(): Argument #1 ($separator) must be of type array|string, resource given
--- Iteration 25 --
-string(16) "element1element2"
--- Iteration 26 --
-string(16) "element1element2"
Done
diff --git a/ext/standard/tests/strings/join_variation4.phpt b/ext/standard/tests/strings/join_variation4.phpt
index 8c8c8b9092..314345547c 100644
--- a/ext/standard/tests/strings/join_variation4.phpt
+++ b/ext/standard/tests/strings/join_variation4.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/lcfirst.phpt b/ext/standard/tests/strings/lcfirst.phpt
index 359d210e74..fc0b954199 100644
--- a/ext/standard/tests/strings/lcfirst.phpt
+++ b/ext/standard/tests/strings/lcfirst.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/ltrim.phpt b/ext/standard/tests/strings/ltrim.phpt
index 8ac57ca92e..952ad282c6 100644
--- a/ext/standard/tests/strings/ltrim.phpt
+++ b/ext/standard/tests/strings/ltrim.phpt
@@ -23,7 +23,6 @@ var_dump( ltrim($str, "\nusi") );
echo "\n *** Output for Normal Behaviour ***\n";
var_dump ( ltrim(" \t\0 ltrim test") ); /* without second Argument */
var_dump ( ltrim(" ltrim test" , "") ); /* no characters in second Argument */
- var_dump ( ltrim(" ltrim test", NULL) ); /* with NULL as second Argument */
var_dump ( ltrim(" ltrim test", true) ); /* with boolean value as second Argument */
var_dump ( ltrim(" ltrim test", " ") ); /* with single space as second Argument */
var_dump ( ltrim("\t\n\r\0\x0B ltrim test", "\t\n\r\0\x0B") ); /* with multiple escape sequences as second Argument */
@@ -32,11 +31,8 @@ var_dump( ltrim($str, "\nusi") );
var_dump ( ltrim("@$#ltrim test", "#@$") ); /* with some special characters as second Argument */
- echo "\n *** Output for scalar argument) ***\n";
- var_dump( ltrim( 12345 ) ); /* Scalar argument */
-
- echo "\n *** Output for NULL argument) ***\n";
- var_dump( ltrim(NULL) ); /* NULL Argument */
+echo "\n *** Output for scalar argument) ***\n";
+var_dump( ltrim( 12345 ) ); /* Scalar argument */
echo "\nDone\n";
@@ -51,7 +47,6 @@ string(17) "ng heredoc string"
string(10) "ltrim test"
string(13) " ltrim test"
string(18) " ltrim test"
-string(18) " ltrim test"
string(10) "ltrim test"
string(11) " ltrim test"
string(10) "ltrim test"
@@ -61,7 +56,4 @@ string(10) "ltrim test"
*** Output for scalar argument) ***
string(5) "12345"
- *** Output for NULL argument) ***
-string(0) ""
-
Done
diff --git a/ext/standard/tests/strings/md5_file.phpt b/ext/standard/tests/strings/md5_file.phpt
index 26eb03bc5a..c975c85cb7 100644
--- a/ext/standard/tests/strings/md5_file.phpt
+++ b/ext/standard/tests/strings/md5_file.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/nl2br.phpt b/ext/standard/tests/strings/nl2br.phpt
index b2ff9cf090..c90788fd66 100644
--- a/ext/standard/tests/strings/nl2br.phpt
+++ b/ext/standard/tests/strings/nl2br.phpt
@@ -4,7 +4,6 @@ nl2br() function
<?php
var_dump(nl2br("test"));
var_dump(nl2br(""));
- var_dump(nl2br(NULL));
var_dump(nl2br("\r\n"));
var_dump(nl2br("\n"));
var_dump(nl2br("\r"));
@@ -18,7 +17,6 @@ nl2br() function
--EXPECT--
string(4) "test"
string(0) ""
-string(0) ""
string(8) "<br />
"
string(7) "<br />
diff --git a/ext/standard/tests/strings/number_format_basic.phpt b/ext/standard/tests/strings/number_format_basic.phpt
index 2566f36574..2e54eb1f0d 100644
--- a/ext/standard/tests/strings/number_format_basic.phpt
+++ b/ext/standard/tests/strings/number_format_basic.phpt
@@ -13,7 +13,6 @@ $values = array(1234.5678,
"123456789",
"123.456789",
"12.3456789e1",
- null,
true,
false);
@@ -54,7 +53,6 @@ string(11) "402,653,183"
string(11) "123,456,789"
string(3) "123"
string(3) "123"
-string(1) "0"
string(1) "1"
string(1) "0"
@@ -68,7 +66,6 @@ string(14) "402,653,183.00"
string(14) "123,456,789.00"
string(6) "123.46"
string(6) "123.46"
-string(4) "0.00"
string(4) "1.00"
string(4) "0.00"
@@ -82,7 +79,6 @@ string(14) "402 653 183.00"
string(14) "123 456 789.00"
string(6) "123.46"
string(6) "123.46"
-string(4) "0.00"
string(4) "1.00"
string(4) "0.00"
@@ -96,6 +92,5 @@ string(14) "402 653 183,00"
string(14) "123 456 789,00"
string(6) "123,46"
string(6) "123,46"
-string(4) "0,00"
string(4) "1,00"
string(4) "0,00"
diff --git a/ext/standard/tests/strings/printf.phpt b/ext/standard/tests/strings/printf.phpt
index db47f58c53..8ff95eb5d6 100644
--- a/ext/standard/tests/strings/printf.phpt
+++ b/ext/standard/tests/strings/printf.phpt
@@ -50,11 +50,6 @@ try {
echo "\n*** Output for scalar argument ***\n";
printf(3);
-/* NULL argument */
-echo "\n*** Output for NULL as argument ***\n";
-printf(NULL);
-
-
/* Float type variations */
$counter = 1;
@@ -244,8 +239,6 @@ printf() expects at least %d argument, %d given
Error found: 5 arguments are required, 3 given
*** Output for scalar argument ***
3
-*** Output for NULL as argument ***
-
*** Output for float type ***
diff --git a/ext/standard/tests/strings/printf_64bit.phpt b/ext/standard/tests/strings/printf_64bit.phpt
index 2886799cc7..a37ad49c3d 100644
--- a/ext/standard/tests/strings/printf_64bit.phpt
+++ b/ext/standard/tests/strings/printf_64bit.phpt
@@ -50,11 +50,6 @@ try {
echo "\n*** Output for scalar argument ***\n";
printf(3);
-/* NULL argument */
-echo "\n*** Output for NULL as argument ***\n";
-printf(NULL);
-
-
/* Float type variations */
$counter = 1;
@@ -244,8 +239,6 @@ printf() expects at least 1 argument, 0 given
Error found: 5 arguments are required, 3 given
*** Output for scalar argument ***
3
-*** Output for NULL as argument ***
-
*** Output for float type ***
diff --git a/ext/standard/tests/strings/printf_variation1.phpt b/ext/standard/tests/strings/printf_variation1.phpt
deleted file mode 100644
index 55237168c5..0000000000
--- a/ext/standard/tests/strings/printf_variation1.phpt
+++ /dev/null
@@ -1,311 +0,0 @@
---TEST--
-Test printf() function : usage variations - unexpected values for format argument
---FILE--
-<?php
-/*
-* Testing printf() : with different unexpected values for format argument other than the strings
-*/
-
-echo "*** Testing printf() : with unexpected values for format argument ***\n";
-
-// initialing required variables
-$arg1 = "second arg";
-$arg2 = "third arg";
-
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
-
-// declaring class
-class sample
-{
- public function __toString() {
- return "Object";
- }
-}
-
-// creating a file resource
-$file_handle = fopen(__FILE__, 'r');
-
-//array of values to iterate over
-$values = array(
-
- // int data
-/*1*/ 0,
- 1,
- 12345,
- -2345,
-
- // float data
-/*5*/ 10.5,
- -10.5,
- 10.1234567e10,
- 10.7654321E-10,
- .5,
-
- // array data
-/*10*/ array(),
- array(0),
- array(1),
- array(1, 2),
- array('color' => 'red', 'item' => 'pen'),
-
- // null data
-/*15*/ NULL,
- null,
-
- // boolean data
-/*17*/ true,
- false,
- TRUE,
- FALSE,
-
- // empty data
-/*21*/ "",
- '',
-
- // object data
-/*23*/ new sample(),
-
- // undefined data
-/*24*/ @$undefined_var,
-
- // unset data
-/*25*/ @$unset_var,
-
- // resource data
-/*26*/ $file_handle
-);
-
-// loop through each element of the array for format
-
-$count = 1;
-foreach($values as $value) {
- echo "\n-- Iteration $count --\n";
-
- // with default argument
- try {
- $result = printf($value);
- echo "\n";
- var_dump($result);
- } catch (TypeError $exception) {
- echo $exception->getMessage() . "\n";
- }
-
- // with two arguments
- try {
- $result = printf($value, $arg1);
- echo "\n";
- var_dump($result);
- } catch (TypeError $exception) {
- echo $exception->getMessage() . "\n";
- }
-
- // with three arguments
- try {
- $result = printf($value, $arg1, $arg2);
- echo "\n";
- var_dump($result);
- } catch (TypeError $exception) {
- echo $exception->getMessage() . "\n";
- }
-
- $count++;
-};
-
-// close the resource
-fclose($file_handle);
-
-?>
---EXPECT--
-*** Testing printf() : with unexpected values for format argument ***
-
--- Iteration 1 --
-0
-int(1)
-0
-int(1)
-0
-int(1)
-
--- Iteration 2 --
-1
-int(1)
-1
-int(1)
-1
-int(1)
-
--- Iteration 3 --
-12345
-int(5)
-12345
-int(5)
-12345
-int(5)
-
--- Iteration 4 --
--2345
-int(5)
--2345
-int(5)
--2345
-int(5)
-
--- Iteration 5 --
-10.5
-int(4)
-10.5
-int(4)
-10.5
-int(4)
-
--- Iteration 6 --
--10.5
-int(5)
--10.5
-int(5)
--10.5
-int(5)
-
--- Iteration 7 --
-101234567000
-int(12)
-101234567000
-int(12)
-101234567000
-int(12)
-
--- Iteration 8 --
-1.07654321E-9
-int(13)
-1.07654321E-9
-int(13)
-1.07654321E-9
-int(13)
-
--- Iteration 9 --
-0.5
-int(3)
-0.5
-int(3)
-0.5
-int(3)
-
--- Iteration 10 --
-printf(): Argument #1 ($format) must be of type string, array given
-printf(): Argument #1 ($format) must be of type string, array given
-printf(): Argument #1 ($format) must be of type string, array given
-
--- Iteration 11 --
-printf(): Argument #1 ($format) must be of type string, array given
-printf(): Argument #1 ($format) must be of type string, array given
-printf(): Argument #1 ($format) must be of type string, array given
-
--- Iteration 12 --
-printf(): Argument #1 ($format) must be of type string, array given
-printf(): Argument #1 ($format) must be of type string, array given
-printf(): Argument #1 ($format) must be of type string, array given
-
--- Iteration 13 --
-printf(): Argument #1 ($format) must be of type string, array given
-printf(): Argument #1 ($format) must be of type string, array given
-printf(): Argument #1 ($format) must be of type string, array given
-
--- Iteration 14 --
-printf(): Argument #1 ($format) must be of type string, array given
-printf(): Argument #1 ($format) must be of type string, array given
-printf(): Argument #1 ($format) must be of type string, array given
-
--- Iteration 15 --
-
-int(0)
-
-int(0)
-
-int(0)
-
--- Iteration 16 --
-
-int(0)
-
-int(0)
-
-int(0)
-
--- Iteration 17 --
-1
-int(1)
-1
-int(1)
-1
-int(1)
-
--- Iteration 18 --
-
-int(0)
-
-int(0)
-
-int(0)
-
--- Iteration 19 --
-1
-int(1)
-1
-int(1)
-1
-int(1)
-
--- Iteration 20 --
-
-int(0)
-
-int(0)
-
-int(0)
-
--- Iteration 21 --
-
-int(0)
-
-int(0)
-
-int(0)
-
--- Iteration 22 --
-
-int(0)
-
-int(0)
-
-int(0)
-
--- Iteration 23 --
-Object
-int(6)
-Object
-int(6)
-Object
-int(6)
-
--- Iteration 24 --
-
-int(0)
-
-int(0)
-
-int(0)
-
--- Iteration 25 --
-
-int(0)
-
-int(0)
-
-int(0)
-
--- Iteration 26 --
-printf(): Argument #1 ($format) must be of type string, resource given
-printf(): Argument #1 ($format) must be of type string, resource given
-printf(): Argument #1 ($format) must be of type string, resource given
diff --git a/ext/standard/tests/strings/quoted_printable_encode_001.phpt b/ext/standard/tests/strings/quoted_printable_encode_001.phpt
index df26d5cf4b..a1e0ec1338 100644
--- a/ext/standard/tests/strings/quoted_printable_encode_001.phpt
+++ b/ext/standard/tests/strings/quoted_printable_encode_001.phpt
@@ -7,7 +7,6 @@ var_dump(quoted_printable_encode(""));
var_dump(quoted_printable_encode("test"));
var_dump(quoted_printable_encode(1));
-var_dump(quoted_printable_encode(NULL));
var_dump(quoted_printable_encode(false));
echo "Done\n";
@@ -17,5 +16,4 @@ string(0) ""
string(4) "test"
string(1) "1"
string(0) ""
-string(0) ""
Done
diff --git a/ext/standard/tests/strings/rtrim.phpt b/ext/standard/tests/strings/rtrim.phpt
index 2fc531faad..b4cd2ac6ac 100644
--- a/ext/standard/tests/strings/rtrim.phpt
+++ b/ext/standard/tests/strings/rtrim.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/sha1_file.phpt b/ext/standard/tests/strings/sha1_file.phpt
index 55130cb98a..62419d708f 100644
--- a/ext/standard/tests/strings/sha1_file.phpt
+++ b/ext/standard/tests/strings/sha1_file.phpt
@@ -87,6 +87,8 @@ Warning: sha1_file(12): Failed to open stream: No such file or directory in %s o
bool(false)
-- NULL as filename --
+
+Deprecated: sha1_file(): Passing null to parameter #1 ($filename) of type string is deprecated in %s on line %d
Path cannot be empty
-- Hexadecimal Output for Empty file as Argument --
diff --git a/ext/standard/tests/strings/sprintf_variation1.phpt b/ext/standard/tests/strings/sprintf_variation1.phpt
index a75e67b96e..6b9430e386 100644
--- a/ext/standard/tests/strings/sprintf_variation1.phpt
+++ b/ext/standard/tests/strings/sprintf_variation1.phpt
@@ -12,10 +12,6 @@ echo "*** Testing sprintf() : with unexpected values for format argument ***\n";
$arg1 = "second arg";
$arg2 = "third arg";
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
-
// declaring class
class sample
{
@@ -50,10 +46,6 @@ $values = array(
array(1, 2),
array('color' => 'red', 'item' => 'pen'),
- // null data
- NULL,
- null,
-
// boolean data
true,
false,
@@ -67,12 +59,6 @@ $values = array(
// object data
new sample(),
- // undefined data
- @$undefined_var,
-
- // unset data
- @$unset_var,
-
// resource data
$file_handle
);
@@ -186,9 +172,9 @@ sprintf(): Argument #1 ($format) must be of type string, array given
sprintf(): Argument #1 ($format) must be of type string, array given
-- Iteration 15 --
-string(0) ""
-string(0) ""
-string(0) ""
+string(1) "1"
+string(1) "1"
+string(1) "1"
-- Iteration 16 --
string(0) ""
@@ -206,41 +192,21 @@ string(0) ""
string(0) ""
-- Iteration 19 --
-string(1) "1"
-string(1) "1"
-string(1) "1"
-
--- Iteration 20 --
-string(0) ""
-string(0) ""
-string(0) ""
-
--- Iteration 21 --
string(0) ""
string(0) ""
string(0) ""
--- Iteration 22 --
+-- Iteration 20 --
string(0) ""
string(0) ""
string(0) ""
--- Iteration 23 --
+-- Iteration 21 --
string(6) "Object"
string(6) "Object"
string(6) "Object"
--- Iteration 24 --
-string(0) ""
-string(0) ""
-string(0) ""
-
--- Iteration 25 --
-string(0) ""
-string(0) ""
-string(0) ""
-
--- Iteration 26 --
+-- Iteration 22 --
sprintf(): Argument #1 ($format) must be of type string, resource given
sprintf(): Argument #1 ($format) must be of type string, resource given
sprintf(): Argument #1 ($format) must be of type string, resource given
diff --git a/ext/standard/tests/strings/str_getcsv_001.phpt b/ext/standard/tests/strings/str_getcsv_001.phpt
index becff2163b..8bad30b2be 100644
--- a/ext/standard/tests/strings/str_getcsv_001.phpt
+++ b/ext/standard/tests/strings/str_getcsv_001.phpt
@@ -24,8 +24,6 @@ var_dump(str_getcsv('.foo . . bar .', ' ', '.', ''));
print "-----\n";
var_dump(str_getcsv('" "" "', ' '));
print "-----\n";
-var_dump(str_getcsv(NULL));
-print "-----\n";
var_dump(str_getcsv(''));
print "-----\n";
@@ -108,8 +106,3 @@ array(1) {
NULL
}
-----
-array(1) {
- [0]=>
- NULL
-}
------
diff --git a/ext/standard/tests/strings/str_pad.phpt b/ext/standard/tests/strings/str_pad.phpt
index bcb03237c0..278db455f8 100644
--- a/ext/standard/tests/strings/str_pad.phpt
+++ b/ext/standard/tests/strings/str_pad.phpt
@@ -21,7 +21,6 @@ echo "\n#### variations with input string and pad-length ####\n";
$input_strings = array(
"variation", // normal string
"", // empty string
- NULL, // NULL
true, // boolean
15, // numeric
15.55, // numeric
@@ -63,13 +62,7 @@ foreach ( $pad_strings as $pad_string ) {
echo "\n#### error conditions ####\n";
-echo "\n--- padding string as null ---\n";
-
-try {
- str_pad($input_string, 12, NULL);
-} catch (\ValueError $e) {
- echo $e->getMessage() . "\n";
-}
+echo "\n--- empty padding string ---\n";
try {
str_pad($input_string, 12, "");
@@ -155,36 +148,6 @@ string(16) "================"
string(16) "================"
string(16) "================"
string(16) "================"
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
-string(9) " "
-string(9) "========="
-string(9) "========="
-string(9) "========="
-string(9) "========="
-string(10) " "
-string(10) "=========="
-string(10) "=========="
-string(10) "=========="
-string(10) "=========="
-string(16) " "
-string(16) "================"
-string(16) "================"
-string(16) "================"
-string(16) "================"
string(1) "1"
string(1) "1"
string(1) "1"
@@ -338,7 +301,6 @@ string(16) "\t\variation\t\t"
#### error conditions ####
---- padding string as null ---
-str_pad(): Argument #3 ($pad_string) must be a non-empty string
+--- empty padding string ---
str_pad(): Argument #3 ($pad_string) must be a non-empty string
str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH
diff --git a/ext/standard/tests/strings/str_repeat.phpt b/ext/standard/tests/strings/str_repeat.phpt
index 3069f6bfe9..6eef67ae57 100644
--- a/ext/standard/tests/strings/str_repeat.phpt
+++ b/ext/standard/tests/strings/str_repeat.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/str_replace_variation1.phpt b/ext/standard/tests/strings/str_replace_variation1.phpt
index aa7360a7f1..00ed1a8bab 100644
--- a/ext/standard/tests/strings/str_replace_variation1.phpt
+++ b/ext/standard/tests/strings/str_replace_variation1.phpt
@@ -271,6 +271,8 @@ int(2)
-- Iteration 8 --
+Deprecated: str_replace(): Passing null to parameter #1 ($search) of type array|string is deprecated in %s on line %d
+
Warning: Array to string conversion in %s on line %d
array(12) {
[0]=>
diff --git a/ext/standard/tests/strings/str_replace_variation2.phpt b/ext/standard/tests/strings/str_replace_variation2.phpt
index 1e92ff2bd2..77dc6ae822 100644
--- a/ext/standard/tests/strings/str_replace_variation2.phpt
+++ b/ext/standard/tests/strings/str_replace_variation2.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/str_word_count.phpt b/ext/standard/tests/strings/str_word_count.phpt
index deb9fe986d..a8c2af9255 100644
--- a/ext/standard/tests/strings/str_word_count.phpt
+++ b/ext/standard/tests/strings/str_word_count.phpt
@@ -36,10 +36,10 @@ try {
var_dump($str);
$str2 = "F0o B4r 1s bar foo";
-var_dump(str_word_count($str2, NULL, "04"));
-var_dump(str_word_count($str2, NULL, "01"));
-var_dump(str_word_count($str2, NULL, "014"));
-var_dump(str_word_count($str2, NULL, ""));
+var_dump(str_word_count($str2, 0, "04"));
+var_dump(str_word_count($str2, 0, "01"));
+var_dump(str_word_count($str2, 0, "014"));
+var_dump(str_word_count($str2, 0, ""));
var_dump(str_word_count($str2, 1, "04"));
var_dump(str_word_count($str2, 1, "01"));
var_dump(str_word_count($str2, 1, "014"));
diff --git a/ext/standard/tests/strings/strcasecmp.phpt b/ext/standard/tests/strings/strcasecmp.phpt
index 95a25bd699..3c07539bd5 100644
--- a/ext/standard/tests/strings/strcasecmp.phpt
+++ b/ext/standard/tests/strings/strcasecmp.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/strcmp.phpt b/ext/standard/tests/strings/strcmp.phpt
index 824d7ed101..d5f338844e 100644
--- a/ext/standard/tests/strings/strcmp.phpt
+++ b/ext/standard/tests/strings/strcmp.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/stripos_variation1.phpt b/ext/standard/tests/strings/stripos_variation1.phpt
index 47a0b10b5e..e205913fcf 100644
--- a/ext/standard/tests/strings/stripos_variation1.phpt
+++ b/ext/standard/tests/strings/stripos_variation1.phpt
@@ -24,8 +24,6 @@ $needle = array(
//nulls
"\0",
- NULL,
- null,
//boolean false
FALSE,
@@ -121,93 +119,87 @@ int(12)
int(0)
int(13)
-- Iteration 15 --
-int(0)
-int(14)
--- Iteration 16 --
-int(0)
-int(15)
--- Iteration 17 --
int(10)
int(47)
--- Iteration 18 --
+-- Iteration 16 --
int(12)
bool(false)
--- Iteration 19 --
+-- Iteration 17 --
int(11)
bool(false)
--- Iteration 20 --
+-- Iteration 18 --
int(13)
bool(false)
--- Iteration 21 --
+-- Iteration 19 --
int(14)
bool(false)
--- Iteration 22 --
+-- Iteration 20 --
int(16)
bool(false)
--- Iteration 23 --
+-- Iteration 21 --
int(17)
bool(false)
--- Iteration 24 --
+-- Iteration 22 --
int(20)
bool(false)
--- Iteration 25 --
+-- Iteration 23 --
int(22)
-bool(false)
--- Iteration 26 --
+int(22)
+-- Iteration 24 --
int(23)
-bool(false)
--- Iteration 27 --
+int(23)
+-- Iteration 25 --
int(24)
-bool(false)
--- Iteration 28 --
+int(24)
+-- Iteration 26 --
int(25)
-bool(false)
--- Iteration 29 --
+int(25)
+-- Iteration 27 --
bool(false)
bool(false)
--- Iteration 30 --
+-- Iteration 28 --
int(27)
-bool(false)
--- Iteration 31 --
+int(27)
+-- Iteration 29 --
int(28)
-bool(false)
--- Iteration 32 --
+int(28)
+-- Iteration 30 --
int(29)
-bool(false)
--- Iteration 33 --
+int(29)
+-- Iteration 31 --
int(31)
-bool(false)
--- Iteration 34 --
+int(31)
+-- Iteration 32 --
int(30)
bool(false)
--- Iteration 35 --
+-- Iteration 33 --
int(32)
-bool(false)
--- Iteration 36 --
+int(32)
+-- Iteration 34 --
int(33)
-bool(false)
--- Iteration 37 --
+int(33)
+-- Iteration 35 --
int(33)
bool(false)
--- Iteration 38 --
+-- Iteration 36 --
int(39)
int(39)
--- Iteration 39 --
+-- Iteration 37 --
int(15)
int(48)
--- Iteration 40 --
+-- Iteration 38 --
int(15)
int(48)
--- Iteration 41 --
+-- Iteration 39 --
int(51)
int(51)
--- Iteration 42 --
+-- Iteration 40 --
int(51)
int(51)
--- Iteration 43 --
+-- Iteration 41 --
bool(false)
bool(false)
--- Iteration 44 --
+-- Iteration 42 --
int(0)
bool(false)
*** Done ***
diff --git a/ext/standard/tests/strings/stripos_variation10.phpt b/ext/standard/tests/strings/stripos_variation10.phpt
deleted file mode 100644
index 156023c728..0000000000
--- a/ext/standard/tests/strings/stripos_variation10.phpt
+++ /dev/null
@@ -1,173 +0,0 @@
---TEST--
-Test stripos() function : usage variations - unexpected inputs for 'needle' argument
---FILE--
-<?php
-/* Test stripos() function with unexpected inputs for 'needle' and
- * an expected type of input for 'haystack' argument
-*/
-
-echo "*** Testing stripos() function with unexpected values for needle ***\n";
-
-//get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
-//defining a class
-class sample {
- public function __toString() {
- return "object";
- }
-}
-
-//getting the resource
-$file_handle = fopen(__FILE__, "r");
-
-$haystack = "string 0 1 2 -2 10.5 -10.5 10.5e10 10.6E-10 .5 array true false object \"\" null Resource";
-
-// array with different values
-$needles = array (
-
- // integer values
- 0,
- 1,
- 12345,
- -2345,
-
- // float values
- 10.5,
- -10.5,
- 10.1234567e10,
- 10.7654321E-10,
- .5,
-
- // array values
- array(),
- array(0),
- array(1),
- array(1, 2),
- array('color' => 'red', 'item' => 'pen'),
-
- // boolean values
- true,
- false,
- TRUE,
- FALSE,
-
- // objects
- new sample(),
-
- // empty string
- "",
- '',
-
- // null values
- NULL,
- null,
-
- // resource
- $file_handle,
-
- // undefined variable
- @$undefined_var,
-
- // unset variable
- @$unset_var
-);
-
-// loop through each element of the 'needle' array to check the working of stripos()
-$counter = 1;
-for($index = 0; $index < count($needles); $index ++) {
- echo "\n-- Iteration $counter --\n";
- try {
- var_dump( stripos($haystack, $needles[$index]) );
- } catch (TypeError $e) {
- echo $e->getMessage(), "\n";
- }
- $counter ++;
-}
-
-fclose($file_handle); //closing the file handle
-
-echo "*** Done ***";
-?>
---EXPECT--
-*** Testing stripos() function with unexpected values for needle ***
-
--- Iteration 1 --
-int(7)
-
--- Iteration 2 --
-int(9)
-
--- Iteration 3 --
-bool(false)
-
--- Iteration 4 --
-bool(false)
-
--- Iteration 5 --
-int(16)
-
--- Iteration 6 --
-int(21)
-
--- Iteration 7 --
-bool(false)
-
--- Iteration 8 --
-bool(false)
-
--- Iteration 9 --
-int(17)
-
--- Iteration 10 --
-stripos(): Argument #2 ($needle) must be of type string, array given
-
--- Iteration 11 --
-stripos(): Argument #2 ($needle) must be of type string, array given
-
--- Iteration 12 --
-stripos(): Argument #2 ($needle) must be of type string, array given
-
--- Iteration 13 --
-stripos(): Argument #2 ($needle) must be of type string, array given
-
--- Iteration 14 --
-stripos(): Argument #2 ($needle) must be of type string, array given
-
--- Iteration 15 --
-int(9)
-
--- Iteration 16 --
-int(0)
-
--- Iteration 17 --
-int(9)
-
--- Iteration 18 --
-int(0)
-
--- Iteration 19 --
-int(64)
-
--- Iteration 20 --
-int(0)
-
--- Iteration 21 --
-int(0)
-
--- Iteration 22 --
-int(0)
-
--- Iteration 23 --
-int(0)
-
--- Iteration 24 --
-stripos(): Argument #2 ($needle) must be of type string, resource given
-
--- Iteration 25 --
-int(0)
-
--- Iteration 26 --
-int(0)
-*** Done ***
diff --git a/ext/standard/tests/strings/stripos_variation11.phpt b/ext/standard/tests/strings/stripos_variation11.phpt
deleted file mode 100644
index 6d9df2bd2e..0000000000
--- a/ext/standard/tests/strings/stripos_variation11.phpt
+++ /dev/null
@@ -1,174 +0,0 @@
---TEST--
-Test stripos() function : usage variations - unexpected inputs for 'haystack' and 'needle' arguments
---FILE--
-<?php
-/* Test stripos() function with unexpected inputs for 'haystack' and 'needle' arguments */
-
-echo "*** Testing stripos() function with unexpected values for haystack and needle ***\n";
-
-// get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
-// defining a class
-class sample {
- public function __toString() {
- return "object";
- }
-}
-
-//getting the resource
-$file_handle = fopen(__FILE__, "r");
-
-// array with different values
-$values = array (
-
- // integer values
- 0,
- 1,
- 12345,
- -2345,
-
- // float values
- 10.5,
- -10.5,
- 10.5e10,
- 10.6E-10,
- .5,
-
- // array values
- array(),
- array(0),
- array(1),
- array(1, 2),
- array('color' => 'red', 'item' => 'pen'),
-
- // boolean values
- true,
- false,
- TRUE,
- FALSE,
-
- // objects
- new sample(),
-
- // empty string
- "",
- '',
-
- // null values
- NULL,
- null,
-
- // resource
- $file_handle,
-
- // undefined variable
- @$undefined_var,
-
- // unset variable
- @$unset_var
-);
-
-
-// loop through each element of the array and check the working of stripos()
-$counter = 1;
-for($index = 0; $index < count($values); $index ++) {
- echo "-- Iteration $counter --\n";
- $haystack = $values[$index];
- try {
- var_dump( stripos($values[$index], $values[$index]) );
- } catch (Error $e) {
- echo get_class($e) . ": " . $e->getMessage(), "\n";
- }
- try {
- var_dump( stripos($values[$index], $values[$index], 1) );
- } catch (Error $e) {
- echo get_class($e) . ": " . $e->getMessage(), "\n";
- }
- $counter ++;
-}
-
-echo "*** Done ***";
-?>
---EXPECT--
-*** Testing stripos() function with unexpected values for haystack and needle ***
--- Iteration 1 --
-int(0)
-bool(false)
--- Iteration 2 --
-int(0)
-bool(false)
--- Iteration 3 --
-int(0)
-bool(false)
--- Iteration 4 --
-int(0)
-bool(false)
--- Iteration 5 --
-int(0)
-bool(false)
--- Iteration 6 --
-int(0)
-bool(false)
--- Iteration 7 --
-int(0)
-bool(false)
--- Iteration 8 --
-int(0)
-bool(false)
--- Iteration 9 --
-int(0)
-bool(false)
--- Iteration 10 --
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, array given
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 11 --
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, array given
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 12 --
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, array given
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 13 --
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, array given
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 14 --
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, array given
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 15 --
-int(0)
-bool(false)
--- Iteration 16 --
-int(0)
-ValueError: stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 17 --
-int(0)
-bool(false)
--- Iteration 18 --
-int(0)
-ValueError: stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 19 --
-int(0)
-bool(false)
--- Iteration 20 --
-int(0)
-ValueError: stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 21 --
-int(0)
-ValueError: stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 22 --
-int(0)
-ValueError: stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 23 --
-int(0)
-ValueError: stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 24 --
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, resource given
-TypeError: stripos(): Argument #1 ($haystack) must be of type string, resource given
--- Iteration 25 --
-int(0)
-ValueError: stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 26 --
-int(0)
-ValueError: stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
-*** Done ***
diff --git a/ext/standard/tests/strings/stripos_variation2.phpt b/ext/standard/tests/strings/stripos_variation2.phpt
index bc176eecfe..2f95822645 100644
--- a/ext/standard/tests/strings/stripos_variation2.phpt
+++ b/ext/standard/tests/strings/stripos_variation2.phpt
@@ -24,8 +24,6 @@ $needle = array(
//nulls
'\0',
- NULL,
- null,
//boolean false
FALSE,
@@ -123,99 +121,93 @@ int(12)
int(0)
int(13)
-- Iteration 15 --
-int(0)
int(14)
--- Iteration 16 --
-int(0)
-int(15)
--- Iteration 17 --
int(14)
-int(51)
--- Iteration 18 --
+-- Iteration 16 --
int(16)
-bool(false)
--- Iteration 19 --
+int(16)
+-- Iteration 17 --
int(15)
bool(false)
--- Iteration 20 --
+-- Iteration 18 --
int(17)
-bool(false)
--- Iteration 21 --
+int(17)
+-- Iteration 19 --
int(18)
-bool(false)
--- Iteration 22 --
+int(18)
+-- Iteration 20 --
int(20)
-bool(false)
--- Iteration 23 --
+int(20)
+-- Iteration 21 --
int(21)
-bool(false)
--- Iteration 24 --
+int(21)
+-- Iteration 22 --
int(24)
int(24)
--- Iteration 25 --
+-- Iteration 23 --
int(26)
int(26)
--- Iteration 26 --
+-- Iteration 24 --
int(27)
int(27)
--- Iteration 27 --
+-- Iteration 25 --
int(28)
int(28)
--- Iteration 28 --
+-- Iteration 26 --
int(29)
int(29)
--- Iteration 29 --
+-- Iteration 27 --
bool(false)
bool(false)
--- Iteration 30 --
+-- Iteration 28 --
bool(false)
bool(false)
--- Iteration 31 --
+-- Iteration 29 --
int(31)
int(31)
--- Iteration 32 --
+-- Iteration 30 --
int(32)
int(32)
--- Iteration 33 --
+-- Iteration 31 --
int(33)
int(33)
--- Iteration 34 --
+-- Iteration 32 --
int(35)
int(35)
--- Iteration 35 --
+-- Iteration 33 --
int(34)
int(34)
--- Iteration 36 --
+-- Iteration 34 --
int(36)
int(36)
--- Iteration 37 --
+-- Iteration 35 --
int(37)
int(37)
--- Iteration 38 --
+-- Iteration 36 --
int(37)
int(37)
--- Iteration 39 --
+-- Iteration 37 --
int(43)
int(43)
--- Iteration 40 --
+-- Iteration 38 --
int(52)
int(52)
--- Iteration 41 --
+-- Iteration 39 --
int(19)
bool(false)
--- Iteration 42 --
+-- Iteration 40 --
int(58)
int(58)
--- Iteration 43 --
+-- Iteration 41 --
bool(false)
bool(false)
--- Iteration 44 --
+-- Iteration 42 --
bool(false)
bool(false)
--- Iteration 45 --
+-- Iteration 43 --
bool(false)
bool(false)
--- Iteration 46 --
+-- Iteration 44 --
int(0)
bool(false)
*** Done ***
diff --git a/ext/standard/tests/strings/stripos_variation7.phpt b/ext/standard/tests/strings/stripos_variation7.phpt
deleted file mode 100644
index b9aa7db118..0000000000
--- a/ext/standard/tests/strings/stripos_variation7.phpt
+++ /dev/null
@@ -1,32 +0,0 @@
---TEST--
-Test stripos() function : usage variations - empty heredoc string for 'haystack' argument
---FILE--
-<?php
-/* Test stripos() function by passing empty heredoc string for haystack
- * and with various needles & offsets
-*/
-
-echo "*** Testing stripos() function: with heredoc strings ***\n";
-echo "-- With empty heredoc string --\n";
-$empty_string = <<<EOD
-EOD;
-var_dump( stripos($empty_string, "") );
-
-try {
- stripos($empty_string, "", 1);
-} catch (ValueError $exception) {
- echo $exception->getMessage() . "\n";
-}
-var_dump( stripos($empty_string, FALSE) );
-var_dump( stripos($empty_string, NULL) );
-
-echo "*** Done ***";
-?>
---EXPECT--
-*** Testing stripos() function: with heredoc strings ***
--- With empty heredoc string --
-int(0)
-stripos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
-int(0)
-int(0)
-*** Done ***
diff --git a/ext/standard/tests/strings/stristr_variation2.phpt b/ext/standard/tests/strings/stristr_variation2.phpt
index fdc48a0922..72d5a93df8 100644
--- a/ext/standard/tests/strings/stristr_variation2.phpt
+++ b/ext/standard/tests/strings/stristr_variation2.phpt
@@ -5,10 +5,6 @@ Test stristr() function : usage variations - test values for $needle argument
echo "*** Testing stristr() function: with unexpected inputs for 'needle' argument ***\n";
-//get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
//defining a class
class sample {
public function __toString() {
@@ -44,21 +40,11 @@ $inputs = array (
TRUE,
FALSE,
- // null values
-/*15*/ NULL,
- null,
-
// objects
/*17*/ new sample(),
// resource
/*18*/ $file_handle,
-
- // undefined variable
-/*19*/ @$undefined_var,
-
- // unset variable
-/*20*/ @$unset_var
);
//defining '$pad_length' argument
@@ -110,14 +96,6 @@ bool(false)
-- Iteration 14 --
string(11) "Hello World"
-- Iteration 15 --
-string(11) "Hello World"
--- Iteration 16 --
-string(11) "Hello World"
--- Iteration 17 --
bool(false)
--- Iteration 18 --
+-- Iteration 16 --
stristr(): Argument #2 ($needle) must be of type string, resource given
--- Iteration 19 --
-string(11) "Hello World"
--- Iteration 20 --
-string(11) "Hello World"
diff --git a/ext/standard/tests/strings/strlen.phpt b/ext/standard/tests/strings/strlen.phpt
index 468dd9acfe..374001eed9 100644
--- a/ext/standard/tests/strings/strlen.phpt
+++ b/ext/standard/tests/strings/strlen.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/strpos.phpt b/ext/standard/tests/strings/strpos.phpt
index 135030544e..267bc590c5 100644
--- a/ext/standard/tests/strings/strpos.phpt
+++ b/ext/standard/tests/strings/strpos.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/strrchr_variation1.phpt b/ext/standard/tests/strings/strrchr_variation1.phpt
index 9617f5fff2..a913a2045a 100644
--- a/ext/standard/tests/strings/strrchr_variation1.phpt
+++ b/ext/standard/tests/strings/strrchr_variation1.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/strrchr_variation10.phpt b/ext/standard/tests/strings/strrchr_variation10.phpt
deleted file mode 100644
index 4f28ad4e6b..0000000000
--- a/ext/standard/tests/strings/strrchr_variation10.phpt
+++ /dev/null
@@ -1,185 +0,0 @@
---TEST--
-Test strrchr() function : usage variations - unexpected inputs for needle
---FILE--
-<?php
-/* Test strrchr() function: with unexpected inputs for needle
- * and expected type for haystack
-*/
-
-echo "*** Testing strrchr() function with unexpected inputs for needle ***\n";
-
-// get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
-// declaring a class
-class sample {
- public function __toString() {
- return "object";
- }
-}
-
-//getting the resource
-$file_handle = fopen(__FILE__, "r");
-
-$haystacks = array (
- //integer numeric strings
- "0",
- "1",
- "2",
- "-2",
-
- //float numeric strings
- "10.5",
- "-10.5",
- "10.5e10",
- "10.6E-10",
- ".5",
-
- //regular strings
- "array",
- "a",
- "r",
- "y",
- "ay",
- "true",
- "false",
- "TRUE",
- "FALSE",
- "NULL",
- "null",
- "object",
-
- //empty string
- "",
- '',
-
- //resource variable in string form
- "\$file_handle",
-
- //undefined variable in string form
- @"$undefined_var",
- @"$unset_var"
-);
-
-// array with different values
-$needles = array (
-
- // integer values
- 0,
- 1,
- 12345,
- -2345,
-
- // float values
- 10.5,
- -10.5,
- 10.1234567e10,
- 10.7654321E-10,
- .5,
-
- // array values
- array(),
- array(0),
- array(1),
- array(1, 2),
- array('color' => 'red', 'item' => 'pen'),
-
- // boolean values
- true,
- false,
- TRUE,
- FALSE,
-
- // null values
- NULL,
- null,
-
- // objects
- new sample(),
-
- // empty string
- "",
- '',
-
- // resource
- $file_handle,
-
- // undefined variable
- @$undefined_var,
-
- // unset variable
- @$unset_var
-);
-
-// loop through each element of the array and check the working of strrchr()
-$count = 1;
-for($index = 0; $index < count($haystacks); $index++) {
- echo "-- Iteration $count --\n";
- try {
- var_dump( strrchr($haystacks[$index], $needles[$index]) );
- } catch (TypeError $e) {
- echo $e->getMessage(), "\n";
- }
- $count ++;
-}
-
-fclose($file_handle); //closing the file handle
-
-echo "*** Done ***";
-?>
---EXPECT--
-*** Testing strrchr() function with unexpected inputs for needle ***
--- Iteration 1 --
-string(1) "0"
--- Iteration 2 --
-string(1) "1"
--- Iteration 3 --
-bool(false)
--- Iteration 4 --
-string(2) "-2"
--- Iteration 5 --
-string(4) "10.5"
--- Iteration 6 --
-string(5) "-10.5"
--- Iteration 7 --
-string(2) "10"
--- Iteration 8 --
-string(2) "10"
--- Iteration 9 --
-bool(false)
--- Iteration 10 --
-strrchr(): Argument #2 ($needle) must be of type string, array given
--- Iteration 11 --
-strrchr(): Argument #2 ($needle) must be of type string, array given
--- Iteration 12 --
-strrchr(): Argument #2 ($needle) must be of type string, array given
--- Iteration 13 --
-strrchr(): Argument #2 ($needle) must be of type string, array given
--- Iteration 14 --
-strrchr(): Argument #2 ($needle) must be of type string, array given
--- Iteration 15 --
-bool(false)
--- Iteration 16 --
-bool(false)
--- Iteration 17 --
-bool(false)
--- Iteration 18 --
-bool(false)
--- Iteration 19 --
-bool(false)
--- Iteration 20 --
-bool(false)
--- Iteration 21 --
-string(6) "object"
--- Iteration 22 --
-bool(false)
--- Iteration 23 --
-bool(false)
--- Iteration 24 --
-strrchr(): Argument #2 ($needle) must be of type string, resource given
--- Iteration 25 --
-bool(false)
--- Iteration 26 --
-bool(false)
-*** Done ***
diff --git a/ext/standard/tests/strings/strrchr_variation11.phpt b/ext/standard/tests/strings/strrchr_variation11.phpt
deleted file mode 100644
index 287d81c11c..0000000000
--- a/ext/standard/tests/strings/strrchr_variation11.phpt
+++ /dev/null
@@ -1,144 +0,0 @@
---TEST--
-Test strrchr() function : usage variations - unexpected inputs for haystack and needle
---FILE--
-<?php
-/* Test strrchr() function with unexpected inputs for haystack and needle */
-
-echo "*** Testing strrchr() function: with unexpected inputs for haystack and needle ***\n";
-
-// get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
-// declaring a class
-class sample {
- public function __toString() {
- return "object";
- }
-}
-
-//getting the resource
-$file_handle = fopen(__FILE__, "r");
-
-// array with different values
-$values = array (
-
- // integer values
- 0,
- 1,
- 12345,
- -2345,
-
- // float values
- 10.5,
- -10.5,
- 10.1234567e10,
- 10.7654321E-10,
- .5,
-
- // array values
- array(),
- array(0),
- array(1),
- array(1, 2),
- array('color' => 'red', 'item' => 'pen'),
-
- // boolean values
- true,
- false,
- TRUE,
- FALSE,
-
- // objects
- new sample(),
-
- // empty string
- "",
- '',
-
- // null values
- NULL,
- null,
-
- // resource
- $file_handle,
-
- // undefined variable
- @$undefined_var,
-
- // unset variable
- @$unset_var
-);
-
-
-// loop through each element of the array and check the working of strrchr()
-$counter = 1;
-for($index = 0; $index < count($values); $index ++) {
- echo "-- Iteration $counter --\n";
- try {
- var_dump( strrchr($values[$index], $values[$index]) );
- } catch (TypeError $e) {
- echo $e->getMessage(), "\n";
- }
- $counter ++;
-}
-
-fclose($file_handle); //closing the file handle
-
-echo "*** Done ***";
-?>
---EXPECT--
-*** Testing strrchr() function: with unexpected inputs for haystack and needle ***
--- Iteration 1 --
-string(1) "0"
--- Iteration 2 --
-string(1) "1"
--- Iteration 3 --
-string(5) "12345"
--- Iteration 4 --
-string(5) "-2345"
--- Iteration 5 --
-string(4) "10.5"
--- Iteration 6 --
-string(5) "-10.5"
--- Iteration 7 --
-string(10) "1234567000"
--- Iteration 8 --
-string(4) "1E-9"
--- Iteration 9 --
-string(3) "0.5"
--- Iteration 10 --
-strrchr(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 11 --
-strrchr(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 12 --
-strrchr(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 13 --
-strrchr(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 14 --
-strrchr(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 15 --
-string(1) "1"
--- Iteration 16 --
-bool(false)
--- Iteration 17 --
-string(1) "1"
--- Iteration 18 --
-bool(false)
--- Iteration 19 --
-string(6) "object"
--- Iteration 20 --
-bool(false)
--- Iteration 21 --
-bool(false)
--- Iteration 22 --
-bool(false)
--- Iteration 23 --
-bool(false)
--- Iteration 24 --
-strrchr(): Argument #1 ($haystack) must be of type string, resource given
--- Iteration 25 --
-bool(false)
--- Iteration 26 --
-bool(false)
-*** Done ***
diff --git a/ext/standard/tests/strings/strrchr_variation12.phpt b/ext/standard/tests/strings/strrchr_variation12.phpt
index 972ff3e703..abe5bfae65 100644
--- a/ext/standard/tests/strings/strrchr_variation12.phpt
+++ b/ext/standard/tests/strings/strrchr_variation12.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/strrchr_variation2.phpt b/ext/standard/tests/strings/strrchr_variation2.phpt
index 72bb3fb0d3..646f13a702 100644
--- a/ext/standard/tests/strings/strrchr_variation2.phpt
+++ b/ext/standard/tests/strings/strrchr_variation2.phpt
@@ -24,8 +24,6 @@ $needle = array(
//nulls
'\0',
- NULL,
- null,
//boolean false
FALSE,
@@ -121,95 +119,89 @@ bool(false)
bool(false)
-- Iteration 15 --
-bool(false)
+string(1) " "
-- Iteration 16 --
-bool(false)
+string(47) "$&!#%\o,()*+-./:;<=>?@hello123456he \x234 \101 "
-- Iteration 17 --
string(1) " "
-- Iteration 18 --
-string(47) "$&!#%\o,()*+-./:;<=>?@hello123456he \x234 \101 "
+string(46) "&!#%\o,()*+-./:;<=>?@hello123456he \x234 \101 "
-- Iteration 19 --
-string(1) " "
+string(45) "!#%\o,()*+-./:;<=>?@hello123456he \x234 \101 "
-- Iteration 20 --
-string(46) "&!#%\o,()*+-./:;<=>?@hello123456he \x234 \101 "
+string(43) "%\o,()*+-./:;<=>?@hello123456he \x234 \101 "
-- Iteration 21 --
-string(45) "!#%\o,()*+-./:;<=>?@hello123456he \x234 \101 "
+string(5) "\101 "
-- Iteration 22 --
-string(43) "%\o,()*+-./:;<=>?@hello123456he \x234 \101 "
+string(39) "()*+-./:;<=>?@hello123456he \x234 \101 "
-- Iteration 23 --
-string(5) "\101 "
+string(37) "*+-./:;<=>?@hello123456he \x234 \101 "
-- Iteration 24 --
-string(39) "()*+-./:;<=>?@hello123456he \x234 \101 "
+string(36) "+-./:;<=>?@hello123456he \x234 \101 "
-- Iteration 25 --
-string(37) "*+-./:;<=>?@hello123456he \x234 \101 "
+string(35) "-./:;<=>?@hello123456he \x234 \101 "
-- Iteration 26 --
-string(36) "+-./:;<=>?@hello123456he \x234 \101 "
+string(34) "./:;<=>?@hello123456he \x234 \101 "
-- Iteration 27 --
-string(35) "-./:;<=>?@hello123456he \x234 \101 "
+string(34) "./:;<=>?@hello123456he \x234 \101 "
-- Iteration 28 --
-string(34) "./:;<=>?@hello123456he \x234 \101 "
+string(32) ":;<=>?@hello123456he \x234 \101 "
-- Iteration 29 --
-string(34) "./:;<=>?@hello123456he \x234 \101 "
+string(31) ";<=>?@hello123456he \x234 \101 "
-- Iteration 30 --
-string(32) ":;<=>?@hello123456he \x234 \101 "
+string(30) "<=>?@hello123456he \x234 \101 "
-- Iteration 31 --
-string(31) ";<=>?@hello123456he \x234 \101 "
+string(28) ">?@hello123456he \x234 \101 "
-- Iteration 32 --
-string(30) "<=>?@hello123456he \x234 \101 "
+string(29) "=>?@hello123456he \x234 \101 "
-- Iteration 33 --
-string(28) ">?@hello123456he \x234 \101 "
+string(27) "?@hello123456he \x234 \101 "
-- Iteration 34 --
-string(29) "=>?@hello123456he \x234 \101 "
+string(26) "@hello123456he \x234 \101 "
-- Iteration 35 --
-string(27) "?@hello123456he \x234 \101 "
+string(26) "@hello123456he \x234 \101 "
-- Iteration 36 --
-string(26) "@hello123456he \x234 \101 "
+string(2) "1 "
-- Iteration 37 --
-string(26) "@hello123456he \x234 \101 "
+string(5) "\101 "
-- Iteration 38 --
-string(2) "1 "
+string(44) "#%\o,()*+-./:;<=>?@hello123456he \x234 \101 "
-- Iteration 39 --
string(5) "\101 "
-- Iteration 40 --
-string(44) "#%\o,()*+-./:;<=>?@hello123456he \x234 \101 "
-
--- Iteration 41 --
-string(5) "\101 "
-
--- Iteration 42 --
bool(false)
--- Iteration 43 --
+-- Iteration 41 --
string(7) "4 \101 "
--- Iteration 44 --
+-- Iteration 42 --
string(7) "4 \101 "
--- Iteration 45 --
+-- Iteration 43 --
string(63) "Hello,\t\n\0\n $&!#%\o,()*+-./:;<=>?@hello123456he \x234 \101 "
*** Done ***
diff --git a/ext/standard/tests/strings/strrchr_variation8.phpt b/ext/standard/tests/strings/strrchr_variation8.phpt
deleted file mode 100644
index 826db29dfd..0000000000
--- a/ext/standard/tests/strings/strrchr_variation8.phpt
+++ /dev/null
@@ -1,36 +0,0 @@
---TEST--
-Test strrchr() function : usage variations - empty heredoc string for 'haystack'
---FILE--
-<?php
-/* Test strrchr() function by passing empty heredoc string for haystack
- * and with various needles
-*/
-
-echo "*** Testing strrchr() function: with heredoc strings ***\n";
-$empty_str = <<<EOD
-EOD;
-
-$needles = array(
- "",
- '',
- FALSE,
- NULL,
- "\0",
- $empty_str //needle as haystack
-);
-
-//loop through to test strrchr() with each needle
-foreach($needles as $needle) {
- var_dump( strrchr($empty_str, $needle) );
-}
-echo "*** Done ***";
-?>
---EXPECT--
-*** Testing strrchr() function: with heredoc strings ***
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-*** Done ***
diff --git a/ext/standard/tests/strings/strrev.phpt b/ext/standard/tests/strings/strrev.phpt
index 6303fccc20..15cf248f55 100644
--- a/ext/standard/tests/strings/strrev.phpt
+++ b/ext/standard/tests/strings/strrev.phpt
@@ -2,18 +2,16 @@
strrev() function
--FILE--
<?php
- $i = 0;
- $str = '';
+$i = 0;
+$str = '';
- while ($i<256) {
- $str .= chr($i++);
- }
+while ($i<256) {
+ $str .= chr($i++);
+}
- var_dump(md5(strrev($str)));
- var_dump(strrev(NULL));
- var_dump(strrev(""));
+var_dump(md5(strrev($str)));
+var_dump(strrev(""));
?>
--EXPECT--
string(32) "ec6df70f2569891eae50321a9179eb82"
string(0) ""
-string(0) ""
diff --git a/ext/standard/tests/strings/strripos_variation1.phpt b/ext/standard/tests/strings/strripos_variation1.phpt
index 75330184ff..57ae8dd11a 100644
--- a/ext/standard/tests/strings/strripos_variation1.phpt
+++ b/ext/standard/tests/strings/strripos_variation1.phpt
@@ -24,8 +24,6 @@ $needles = array(
//nulls
/*11*/ "\0",
- NULL,
- null,
//boolean false
/*14*/ FALSE,
@@ -141,106 +139,96 @@ int(44)
int(44)
int(43)
-- Iteration 15 --
-int(44)
-int(44)
-int(44)
int(43)
--- Iteration 16 --
-int(44)
-int(44)
-int(44)
-int(43)
--- Iteration 17 --
int(43)
int(43)
int(43)
-int(43)
--- Iteration 18 --
+-- Iteration 16 --
int(12)
int(12)
bool(false)
int(12)
--- Iteration 19 --
+-- Iteration 17 --
int(11)
int(11)
bool(false)
int(11)
--- Iteration 20 --
+-- Iteration 18 --
int(13)
int(13)
bool(false)
int(13)
--- Iteration 21 --
+-- Iteration 19 --
int(14)
int(14)
bool(false)
int(14)
--- Iteration 22 --
+-- Iteration 20 --
int(17)
int(17)
bool(false)
int(17)
--- Iteration 23 --
+-- Iteration 21 --
int(20)
int(20)
int(20)
int(20)
--- Iteration 24 --
+-- Iteration 22 --
int(22)
int(22)
int(22)
int(22)
--- Iteration 25 --
+-- Iteration 23 --
int(21)
int(21)
int(21)
int(21)
--- Iteration 26 --
+-- Iteration 24 --
int(23)
int(23)
int(23)
int(23)
--- Iteration 27 --
+-- Iteration 25 --
int(24)
int(24)
int(24)
int(24)
--- Iteration 28 --
+-- Iteration 26 --
int(24)
int(24)
int(24)
int(24)
--- Iteration 29 --
+-- Iteration 27 --
int(30)
int(30)
int(30)
int(30)
--- Iteration 30 --
+-- Iteration 28 --
int(39)
int(39)
int(39)
int(39)
--- Iteration 31 --
+-- Iteration 29 --
int(39)
int(39)
int(39)
int(39)
--- Iteration 32 --
+-- Iteration 30 --
int(42)
int(42)
int(42)
int(42)
--- Iteration 33 --
+-- Iteration 31 --
int(42)
int(42)
int(42)
int(42)
--- Iteration 34 --
+-- Iteration 32 --
bool(false)
bool(false)
bool(false)
bool(false)
--- Iteration 35 --
+-- Iteration 33 --
int(0)
bool(false)
bool(false)
diff --git a/ext/standard/tests/strings/strripos_variation2.phpt b/ext/standard/tests/strings/strripos_variation2.phpt
index 5a409c28d1..12bcc2d22b 100644
--- a/ext/standard/tests/strings/strripos_variation2.phpt
+++ b/ext/standard/tests/strings/strripos_variation2.phpt
@@ -24,8 +24,6 @@ $needles = array(
//nulls
/*11*/ '\0',
- NULL,
- null,
//boolean false
/*14*/ FALSE,
@@ -142,111 +140,101 @@ int(54)
int(54)
int(53)
-- Iteration 15 --
-int(54)
-int(54)
-int(54)
-int(53)
--- Iteration 16 --
-int(54)
-int(54)
-int(54)
-int(53)
--- Iteration 17 --
int(53)
int(53)
int(53)
int(53)
--- Iteration 18 --
+-- Iteration 16 --
int(16)
int(16)
bool(false)
int(16)
--- Iteration 19 --
+-- Iteration 17 --
int(15)
int(15)
bool(false)
int(15)
--- Iteration 20 --
+-- Iteration 18 --
int(17)
int(17)
bool(false)
int(17)
--- Iteration 21 --
+-- Iteration 19 --
int(18)
int(18)
bool(false)
int(18)
--- Iteration 22 --
+-- Iteration 20 --
int(21)
int(21)
int(21)
int(21)
--- Iteration 23 --
+-- Iteration 21 --
int(24)
int(24)
int(24)
int(24)
--- Iteration 24 --
+-- Iteration 22 --
int(26)
int(26)
int(26)
int(26)
--- Iteration 25 --
+-- Iteration 23 --
int(25)
int(25)
int(25)
int(25)
--- Iteration 26 --
+-- Iteration 24 --
int(27)
int(27)
int(27)
int(27)
--- Iteration 27 --
+-- Iteration 25 --
int(28)
int(28)
int(28)
int(28)
--- Iteration 28 --
+-- Iteration 26 --
int(28)
int(28)
int(28)
int(28)
--- Iteration 29 --
+-- Iteration 27 --
int(34)
int(34)
int(34)
int(34)
--- Iteration 30 --
+-- Iteration 28 --
int(43)
int(43)
int(43)
int(43)
--- Iteration 31 --
+-- Iteration 29 --
int(19)
int(19)
bool(false)
int(19)
--- Iteration 32 --
+-- Iteration 30 --
int(49)
int(49)
int(49)
int(49)
--- Iteration 33 --
+-- Iteration 31 --
bool(false)
bool(false)
bool(false)
bool(false)
--- Iteration 34 --
+-- Iteration 32 --
bool(false)
bool(false)
bool(false)
bool(false)
--- Iteration 35 --
+-- Iteration 33 --
bool(false)
bool(false)
bool(false)
bool(false)
--- Iteration 36 --
+-- Iteration 34 --
int(0)
bool(false)
bool(false)
diff --git a/ext/standard/tests/strings/strrpos_variation1.phpt b/ext/standard/tests/strings/strrpos_variation1.phpt
deleted file mode 100644
index 509c015e54..0000000000
--- a/ext/standard/tests/strings/strrpos_variation1.phpt
+++ /dev/null
@@ -1,177 +0,0 @@
---TEST--
-Test strrpos() function : usage variations - double quoted strings for 'haystack' & 'needle' arguments
---FILE--
-<?php
-/* Test strrpos() function by passing double quoted strings for 'haystack' & 'needle' arguments */
-
-echo "*** Testing strrpos() function: with double quoted strings ***\n";
-$haystack = "Hello,\t\n\0\n $&!#%()*<=>?@hello123456he \x234 \101 ";
-$needle = array(
- //regular strings
- "l",
- "L",
- "HELLO",
- "hEllo",
-
- //escape characters
- "\t",
- "\T", //invalid input
- " ",
- "\n",
- "\N", //invalid input
- "
-", //new line
-
- //nulls
- "\0",
- NULL,
- null,
-
- //boolean false
- FALSE,
- false,
-
- //empty string
- "",
-
- //special chars
- " ",
- "$",
- " $",
- "&",
- "!#",
- "()",
- "<=>",
- ">",
- "=>",
- "?",
- "@",
- "@hEllo",
-
- "12345", //decimal numeric string
- "\x23", //hexadecimal numeric string
- "#", //respective ASCII char of \x23
- "\101", //octal numeric string
- "A", //respective ASCII char of \101
- "456HEE", //numerics + chars
- $haystack //haystack as needle
-);
-
-/* loop through to get the position of the needle in haystack string */
-$count = 1;
-for($index=0; $index<count($needle); $index++) {
- echo "-- Iteration $count --\n";
- var_dump( strrpos($haystack, $needle[$index]) );
- var_dump( strrpos($haystack, $needle[$index], $index) );
- $count++;
-}
-echo "*** Done ***";
-?>
---EXPECT--
-*** Testing strrpos() function: with double quoted strings ***
--- Iteration 1 --
-int(28)
-int(28)
--- Iteration 2 --
-bool(false)
-bool(false)
--- Iteration 3 --
-bool(false)
-bool(false)
--- Iteration 4 --
-bool(false)
-bool(false)
--- Iteration 5 --
-int(6)
-int(6)
--- Iteration 6 --
-bool(false)
-bool(false)
--- Iteration 7 --
-bool(false)
-bool(false)
--- Iteration 8 --
-int(9)
-int(9)
--- Iteration 9 --
-bool(false)
-bool(false)
--- Iteration 10 --
-int(9)
-int(9)
--- Iteration 11 --
-int(8)
-bool(false)
--- Iteration 12 --
-int(44)
-int(44)
--- Iteration 13 --
-int(44)
-int(44)
--- Iteration 14 --
-int(44)
-int(44)
--- Iteration 15 --
-int(44)
-int(44)
--- Iteration 16 --
-int(44)
-int(44)
--- Iteration 17 --
-int(43)
-int(43)
--- Iteration 18 --
-int(12)
-bool(false)
--- Iteration 19 --
-int(11)
-bool(false)
--- Iteration 20 --
-int(13)
-bool(false)
--- Iteration 21 --
-int(14)
-bool(false)
--- Iteration 22 --
-int(17)
-bool(false)
--- Iteration 23 --
-int(20)
-bool(false)
--- Iteration 24 --
-int(22)
-bool(false)
--- Iteration 25 --
-int(21)
-bool(false)
--- Iteration 26 --
-int(23)
-bool(false)
--- Iteration 27 --
-int(24)
-bool(false)
--- Iteration 28 --
-bool(false)
-bool(false)
--- Iteration 29 --
-int(30)
-int(30)
--- Iteration 30 --
-int(39)
-int(39)
--- Iteration 31 --
-int(39)
-int(39)
--- Iteration 32 --
-int(42)
-int(42)
--- Iteration 33 --
-int(42)
-int(42)
--- Iteration 34 --
-bool(false)
-bool(false)
--- Iteration 35 --
-int(0)
-bool(false)
-*** Done ***
diff --git a/ext/standard/tests/strings/strrpos_variation10.phpt b/ext/standard/tests/strings/strrpos_variation10.phpt
deleted file mode 100644
index a59827981e..0000000000
--- a/ext/standard/tests/strings/strrpos_variation10.phpt
+++ /dev/null
@@ -1,147 +0,0 @@
---TEST--
-Test strrpos() function : usage variations - unexpected inputs for 'needle' argument
---FILE--
-<?php
-/* Test strrpos() function with unexpected inputs for 'needle' and
- * an expected type of input for 'haystack' argument
-*/
-
-echo "*** Testing strrpos() function with unexpected values for needle ***\n";
-
-//get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
-//defining a class
-class sample {
- public function __toString() {
- return "object";
- }
-}
-
-//getting the resource
-$file_handle = fopen(__FILE__, "r");
-
-$haystack = "string 0 1 2 -2 10.5 -10.5 10.5e10 10.6E-10 .5 array true false object \"\" null Resource";
-
-// array with different values
-$needles = array (
-
- // integer values
- 0,
- 1,
- 12345,
- -2345,
-
- // float values
- 10.5,
- -10.5,
- 10.1234567e10,
- 10.7654321E-10,
- .5,
-
- // array values
- array(),
- array(0),
- array(1),
- array(1, 2),
- array('color' => 'red', 'item' => 'pen'),
-
- // boolean values
- true,
- false,
- TRUE,
- FALSE,
-
- // objects
- new sample(),
-
- // empty string
- "",
- '',
-
- // null values
- NULL,
- null,
-
- // resource
- $file_handle,
-
- // undefined variable
- @$undefined_var,
-
- // unset variable
- @$unset_var
-);
-
-// loop through each element of the 'needle' array to check the working of strrpos()
-$counter = 1;
-for($index = 0; $index < count($needles); $index ++) {
- echo "-- Iteration $counter --\n";
- try {
- var_dump( strrpos($haystack, $needles[$index]) );
- } catch (TypeError $e) {
- echo $e->getMessage(), "\n";
- }
- $counter ++;
-}
-
-fclose($file_handle); //closing the file handle
-
-echo "*** Done ***";
-?>
---EXPECT--
-*** Testing strrpos() function with unexpected values for needle ***
--- Iteration 1 --
-int(42)
--- Iteration 2 --
-int(41)
--- Iteration 3 --
-bool(false)
--- Iteration 4 --
-bool(false)
--- Iteration 5 --
-int(27)
--- Iteration 6 --
-int(21)
--- Iteration 7 --
-bool(false)
--- Iteration 8 --
-bool(false)
--- Iteration 9 --
-int(28)
--- Iteration 10 --
-strrpos(): Argument #2 ($needle) must be of type string, array given
--- Iteration 11 --
-strrpos(): Argument #2 ($needle) must be of type string, array given
--- Iteration 12 --
-strrpos(): Argument #2 ($needle) must be of type string, array given
--- Iteration 13 --
-strrpos(): Argument #2 ($needle) must be of type string, array given
--- Iteration 14 --
-strrpos(): Argument #2 ($needle) must be of type string, array given
--- Iteration 15 --
-int(41)
--- Iteration 16 --
-int(87)
--- Iteration 17 --
-int(41)
--- Iteration 18 --
-int(87)
--- Iteration 19 --
-int(64)
--- Iteration 20 --
-int(87)
--- Iteration 21 --
-int(87)
--- Iteration 22 --
-int(87)
--- Iteration 23 --
-int(87)
--- Iteration 24 --
-strrpos(): Argument #2 ($needle) must be of type string, resource given
--- Iteration 25 --
-int(87)
--- Iteration 26 --
-int(87)
-*** Done ***
diff --git a/ext/standard/tests/strings/strrpos_variation11.phpt b/ext/standard/tests/strings/strrpos_variation11.phpt
deleted file mode 100644
index da33a21dc5..0000000000
--- a/ext/standard/tests/strings/strrpos_variation11.phpt
+++ /dev/null
@@ -1,175 +0,0 @@
---TEST--
-Test strrpos() function : usage variations - unexpected inputs for 'haystack' and 'needle' arguments
---FILE--
-<?php
-/* Test strrpos() function with unexpected inputs for 'haystack' and 'needle' arguments */
-
-echo "*** Testing strrpos() function with unexpected values for haystack and needle ***\n";
-
-// get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
-// defining a class
-class sample {
- public function __toString() {
- return "object";
- }
-}
-
-//getting the resource
-$file_handle = fopen(__FILE__, "r");
-
-// array with different values
-$values = array (
-
- // integer values
- 0,
- 1,
- 12345,
- -2345,
-
- // float values
- 10.5,
- -10.5,
- 10.5e10,
- 10.6E-10,
- .5,
-
- // array values
- array(),
- array(0),
- array(1),
- array(1, 2),
- array('color' => 'red', 'item' => 'pen'),
-
- // boolean values
- true,
- false,
- TRUE,
- FALSE,
-
- // objects
- new sample(),
-
- // empty string
- "",
- '',
-
- // null values
- NULL,
- null,
-
- // resource
- $file_handle,
-
- // undefined variable
- @$undefined_var,
-
- // unset variable
- @$unset_var
-);
-
-
-// loop through each element of the array and check the working of strrpos()
-$counter = 1;
-for($index = 0; $index < count($values); $index ++) {
- echo "-- Iteration $counter --\n";
- $haystack = $values[$index];
- try {
- var_dump( strrpos($values[$index], $values[$index]) );
- } catch (Error $e) {
- echo get_class($e) . ": " . $e->getMessage(), "\n";
- }
-
- try {
- var_dump( strrpos($values[$index], $values[$index], 1) );
- } catch (Error $e) {
- echo get_class($e) . ": " . $e->getMessage(), "\n";
- }
- $counter ++;
-}
-
-echo "*** Done ***";
-?>
---EXPECT--
-*** Testing strrpos() function with unexpected values for haystack and needle ***
--- Iteration 1 --
-int(0)
-bool(false)
--- Iteration 2 --
-int(0)
-bool(false)
--- Iteration 3 --
-int(0)
-bool(false)
--- Iteration 4 --
-int(0)
-bool(false)
--- Iteration 5 --
-int(0)
-bool(false)
--- Iteration 6 --
-int(0)
-bool(false)
--- Iteration 7 --
-int(0)
-bool(false)
--- Iteration 8 --
-int(0)
-bool(false)
--- Iteration 9 --
-int(0)
-bool(false)
--- Iteration 10 --
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, array given
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 11 --
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, array given
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 12 --
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, array given
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 13 --
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, array given
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 14 --
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, array given
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, array given
--- Iteration 15 --
-int(0)
-bool(false)
--- Iteration 16 --
-int(0)
-ValueError: strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 17 --
-int(0)
-bool(false)
--- Iteration 18 --
-int(0)
-ValueError: strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 19 --
-int(0)
-bool(false)
--- Iteration 20 --
-int(0)
-ValueError: strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 21 --
-int(0)
-ValueError: strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 22 --
-int(0)
-ValueError: strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 23 --
-int(0)
-ValueError: strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 24 --
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, resource given
-TypeError: strrpos(): Argument #1 ($haystack) must be of type string, resource given
--- Iteration 25 --
-int(0)
-ValueError: strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
--- Iteration 26 --
-int(0)
-ValueError: strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
-*** Done ***
diff --git a/ext/standard/tests/strings/strrpos_variation2.phpt b/ext/standard/tests/strings/strrpos_variation2.phpt
index b6b7cb149d..0022d0e2c3 100644
--- a/ext/standard/tests/strings/strrpos_variation2.phpt
+++ b/ext/standard/tests/strings/strrpos_variation2.phpt
@@ -24,8 +24,6 @@ $needle = array(
//nulls
'\0',
- NULL,
- null,
//boolean false
FALSE,
@@ -113,69 +111,63 @@ int(54)
int(54)
int(54)
-- Iteration 15 --
-int(54)
-int(54)
--- Iteration 16 --
-int(54)
-int(54)
--- Iteration 17 --
int(53)
int(53)
--- Iteration 18 --
+-- Iteration 16 --
int(16)
-bool(false)
--- Iteration 19 --
+int(16)
+-- Iteration 17 --
int(15)
bool(false)
--- Iteration 20 --
+-- Iteration 18 --
int(17)
-bool(false)
--- Iteration 21 --
+int(17)
+-- Iteration 19 --
int(18)
-bool(false)
--- Iteration 22 --
+int(18)
+-- Iteration 20 --
int(21)
int(21)
--- Iteration 23 --
+-- Iteration 21 --
int(24)
int(24)
--- Iteration 24 --
+-- Iteration 22 --
int(26)
int(26)
--- Iteration 25 --
+-- Iteration 23 --
int(25)
int(25)
--- Iteration 26 --
+-- Iteration 24 --
int(27)
int(27)
--- Iteration 27 --
+-- Iteration 25 --
int(28)
int(28)
--- Iteration 28 --
+-- Iteration 26 --
bool(false)
bool(false)
--- Iteration 29 --
+-- Iteration 27 --
int(34)
int(34)
--- Iteration 30 --
+-- Iteration 28 --
int(43)
int(43)
--- Iteration 31 --
+-- Iteration 29 --
int(19)
bool(false)
--- Iteration 32 --
+-- Iteration 30 --
int(49)
int(49)
--- Iteration 33 --
+-- Iteration 31 --
bool(false)
bool(false)
--- Iteration 34 --
+-- Iteration 32 --
bool(false)
bool(false)
--- Iteration 35 --
+-- Iteration 33 --
bool(false)
bool(false)
--- Iteration 36 --
+-- Iteration 34 --
int(0)
bool(false)
*** Done ***
diff --git a/ext/standard/tests/strings/strrpos_variation7.phpt b/ext/standard/tests/strings/strrpos_variation7.phpt
index 884a902112..f73d4129d5 100644
--- a/ext/standard/tests/strings/strrpos_variation7.phpt
+++ b/ext/standard/tests/strings/strrpos_variation7.phpt
@@ -17,7 +17,6 @@ try {
echo $exception->getMessage() . "\n";
}
var_dump( strrpos($empty_string, FALSE) );
-var_dump( strrpos($empty_string, NULL) );
echo "*** Done ***";
?>
@@ -27,5 +26,4 @@ echo "*** Done ***";
int(0)
strrpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack)
int(0)
-int(0)
*** Done ***
diff --git a/ext/standard/tests/strings/strstr.phpt b/ext/standard/tests/strings/strstr.phpt
index da2aa1e22e..52088fb88b 100644
--- a/ext/standard/tests/strings/strstr.phpt
+++ b/ext/standard/tests/strings/strstr.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/strtolower-win32.phpt b/ext/standard/tests/strings/strtolower-win32.phpt
index b16e55cc50..368a81ad93 100644
--- a/ext/standard/tests/strings/strtolower-win32.phpt
+++ b/ext/standard/tests/strings/strtolower-win32.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/strtolower.phpt b/ext/standard/tests/strings/strtolower.phpt
index 0f9b4299cf..3a68588057 100644
--- a/ext/standard/tests/strings/strtolower.phpt
+++ b/ext/standard/tests/strings/strtolower.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/strtoupper1-win32.phpt b/ext/standard/tests/strings/strtoupper1-win32.phpt
index de26ca5400..98a314a7b4 100644
--- a/ext/standard/tests/strings/strtoupper1-win32.phpt
+++ b/ext/standard/tests/strings/strtoupper1-win32.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/strtoupper1.phpt b/ext/standard/tests/strings/strtoupper1.phpt
index bff3f97d96..864053d22d 100644
--- a/ext/standard/tests/strings/strtoupper1.phpt
+++ b/ext/standard/tests/strings/strtoupper1.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/strtr_variation4.phpt b/ext/standard/tests/strings/strtr_variation4.phpt
index 21e5cab773..f89ff654a1 100644
--- a/ext/standard/tests/strings/strtr_variation4.phpt
+++ b/ext/standard/tests/strings/strtr_variation4.phpt
@@ -19,8 +19,6 @@ EOD;
$str_arr = array(
"",
'',
- NULL,
- null,
FALSE,
false,
$heredoc_str
@@ -64,10 +62,4 @@ string(0) ""
-- Iteration 5 --
string(0) ""
string(0) ""
--- Iteration 6 --
-string(0) ""
-string(0) ""
--- Iteration 7 --
-string(0) ""
-string(0) ""
*** Done ***
diff --git a/ext/standard/tests/strings/strtr_variation6.phpt b/ext/standard/tests/strings/strtr_variation6.phpt
index fcc903d637..438eb168fa 100644
--- a/ext/standard/tests/strings/strtr_variation6.phpt
+++ b/ext/standard/tests/strings/strtr_variation6.phpt
@@ -8,10 +8,6 @@ Test strtr() function : usage variations - unexpected inputs for 'from' argument
echo "*** Testing strtr() function: with unexpected inputs for 'from' ***\n";
-//get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
//defining a class
class sample {
public function __toString() {
@@ -58,12 +54,6 @@ $from_arr = array (
// resource
/*17*/ $file_handle,
-
- // undefined variable
-/*18*/ @$undefined_var,
-
- // unset variable
-/*19*/ @$unset_var
);
//defining 'to' argument
@@ -84,7 +74,7 @@ for($index = 0; $index < count($from_arr); $index++) {
fclose($file_handle); //closing the file handle
?>
---EXPECT--
+--EXPECTF--
*** Testing strtr() function: with unexpected inputs for 'from' ***
-- Iteration 1 --
string(6) "a12atm"
@@ -113,14 +103,14 @@ string(6) "0a2atm"
-- Iteration 13 --
string(6) "012atm"
-- Iteration 14 --
+
+Deprecated: strtr(): Passing null to parameter #2 ($from) of type array|string is deprecated in %s on line %d
string(6) "012atm"
-- Iteration 15 --
+
+Deprecated: strtr(): Passing null to parameter #2 ($from) of type array|string is deprecated in %s on line %d
string(6) "012atm"
-- Iteration 16 --
string(6) "012ttm"
-- Iteration 17 --
strtr(): Argument #2 ($from) must be of type array|string, resource given
--- Iteration 18 --
-string(6) "012atm"
--- Iteration 19 --
-string(6) "012atm"
diff --git a/ext/standard/tests/strings/strtr_variation8.phpt b/ext/standard/tests/strings/strtr_variation8.phpt
index 7ac60532f8..d68c6f04e7 100644
--- a/ext/standard/tests/strings/strtr_variation8.phpt
+++ b/ext/standard/tests/strings/strtr_variation8.phpt
@@ -8,10 +8,6 @@ Test strtr() function : usage variations - unexpected inputs for 'replace_pairs'
echo "*** Testing strtr() function: with unexpected inputs for 'replace_pairs' ***\n";
-//get an unset variable
-$unset_var = 'string_val';
-unset($unset_var);
-
//defining a class
class sample {
public function __toString() {
@@ -58,12 +54,6 @@ $replace_pairs_arr = array (
// resource
$file_handle,
-
- // undefined variable
- @$undefined_var,
-
- // unset variable
- @$unset_var
);
// loop through with each element of the $replace_pairs array to test strtr() function
@@ -84,7 +74,7 @@ fclose($file_handle); //closing the file handle
echo "*** Done ***";
?>
---EXPECT--
+--EXPECTF--
*** Testing strtr() function: with unexpected inputs for 'replace_pairs' ***
-- Iteration 1 --
@@ -127,9 +117,13 @@ strtr(): Argument #2 ($from) must be of type array, string given
strtr(): Argument #2 ($from) must be of type array, string given
-- Iteration 14 --
+
+Deprecated: strtr(): Passing null to parameter #2 ($from) of type array|string is deprecated in %s on line %d
strtr(): Argument #2 ($from) must be of type array, string given
-- Iteration 15 --
+
+Deprecated: strtr(): Passing null to parameter #2 ($from) of type array|string is deprecated in %s on line %d
strtr(): Argument #2 ($from) must be of type array, string given
-- Iteration 16 --
@@ -137,10 +131,4 @@ strtr(): Argument #2 ($from) must be of type array, string given
-- Iteration 17 --
strtr(): Argument #2 ($from) must be of type array|string, resource given
-
--- Iteration 18 --
-strtr(): Argument #2 ($from) must be of type array, string given
-
--- Iteration 19 --
-strtr(): Argument #2 ($from) must be of type array, string given
*** Done ***
diff --git a/ext/standard/tests/strings/substr.phpt b/ext/standard/tests/strings/substr.phpt
index 99dcd2bf2f..8f172cee61 100644
--- a/ext/standard/tests/strings/substr.phpt
+++ b/ext/standard/tests/strings/substr.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/substr_count_variation_001.phpt b/ext/standard/tests/strings/substr_count_variation_001.phpt
index abfecac097..d76c56d60f 100644
--- a/ext/standard/tests/strings/substr_count_variation_001.phpt
+++ b/ext/standard/tests/strings/substr_count_variation_001.phpt
@@ -9,10 +9,6 @@ $str = "this is a string";
var_dump( substr_count($str, "t", "5") );
var_dump( substr_count($str, "t", "5", "10") );
-echo "\n-- 3rd or 4th arg as NULL --\n";
-var_dump( substr_count($str, "I", NULL) );
-var_dump( substr_count($str, "i", NULL, 10) );
-
echo "\n-- overlapped substrings --\n";
var_dump( substr_count("abcabcabcabcabc", "abca") );
var_dump( substr_count("abcabcabcabcabc", "abca", 2) );
@@ -53,10 +49,6 @@ echo "Done\n";
int(1)
int(1)
--- 3rd or 4th arg as NULL --
-int(0)
-int(2)
-
-- overlapped substrings --
int(2)
int(2)
diff --git a/ext/standard/tests/strings/trim.phpt b/ext/standard/tests/strings/trim.phpt
index 71c56d9862..fd0c26d779 100644
--- a/ext/standard/tests/strings/trim.phpt
+++ b/ext/standard/tests/strings/trim.phpt
@@ -3,25 +3,36 @@ trim(), rtrim() and ltrim() functions
--FILE--
<?php
-$tests = <<<TESTS
-'ABC' === trim('ABC')
-'ABC' === ltrim('ABC')
-'ABC' === rtrim('ABC')
-'ABC' === trim(" \\0\\t\\nABC \\0\\t\\n")
-"ABC \\0\\t\\n" === ltrim(" \\0\\t\\nABC \\0\\t\\n")
-" \\0\\t\\nABC" === rtrim(" \\0\\t\\nABC \\0\\t\\n")
-" \\0\\t\\nABC \\0\\t\\n" === trim(" \\0\\t\\nABC \\0\\t\\n",'')
-" \\0\\t\\nABC \\0\\t\\n" === ltrim(" \\0\\t\\nABC \\0\\t\\n",'')
-" \\0\\t\\nABC \\0\\t\\n" === rtrim(" \\0\\t\\nABC \\0\\t\\n",'')
-"ABC\\x50\\xC1" === trim("ABC\\x50\\xC1\\x60\\x90","\\x51..\\xC0")
-"ABC\\x50" === trim("ABC\\x50\\xC1\\x60\\x90","\\x51..\\xC1")
-"ABC" === trim("ABC\\x50\\xC1\\x60\\x90","\\x50..\\xC1")
-"ABC\\x50\\xC1" === trim("ABC\\x50\\xC1\\x60\\x90","\\x51..\\xC0")
-"ABC\\x50" === trim("ABC\\x50\\xC1\\x60\\x90","\\x51..\\xC1")
-"ABC" === trim("ABC\\x50\\xC1\\x60\\x90","\\x50..\\xC1")
-TESTS;
+var_dump('ABC' === trim('ABC'));
+var_dump('ABC' === ltrim('ABC'));
+var_dump('ABC' === rtrim('ABC'));
+var_dump('ABC' === trim(" \0\t\nABC \0\t\n"));
+var_dump("ABC \0\t\n" === ltrim(" \0\t\nABC \0\t\n"));
+var_dump(" \0\t\nABC" === rtrim(" \0\t\nABC \0\t\n"));
+var_dump(" \0\t\nABC \0\t\n" === trim(" \0\t\nABC \0\t\n",''));
+var_dump(" \0\t\nABC \0\t\n" === ltrim(" \0\t\nABC \0\t\n",''));
+var_dump(" \0\t\nABC \0\t\n" === rtrim(" \0\t\nABC \0\t\n",''));
+var_dump("ABC\x50\xC1" === trim("ABC\x50\xC1\x60\x90","\x51..\xC0"));
+var_dump("ABC\x50" === trim("ABC\x50\xC1\x60\x90","\x51..\xC1"));
+var_dump("ABC" === trim("ABC\x50\xC1\x60\x90","\x50..\xC1"));
+var_dump("ABC\x50\xC1" === trim("ABC\x50\xC1\x60\x90","\x51..\xC0"));
+var_dump("ABC\x50" === trim("ABC\x50\xC1\x60\x90","\x51..\xC1"));
+var_dump("ABC" === trim("ABC\x50\xC1\x60\x90","\x50..\xC1"));
-include(__DIR__ . '/../../../../tests/quicktester.inc');
?>
--EXPECT--
-OK
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/standard/tests/strings/trim1.phpt b/ext/standard/tests/strings/trim1.phpt
index e4601db7ac..849b972c11 100644
--- a/ext/standard/tests/strings/trim1.phpt
+++ b/ext/standard/tests/strings/trim1.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/ucfirst.phpt b/ext/standard/tests/strings/ucfirst.phpt
index a54b984b88..1d8ecd7630 100644
--- a/ext/standard/tests/strings/ucfirst.phpt
+++ b/ext/standard/tests/strings/ucfirst.phpt
Binary files differ
diff --git a/ext/standard/tests/strings/vprintf_variation1.phpt b/ext/standard/tests/strings/vprintf_variation1.phpt
deleted file mode 100644
index 18cf1a7c04..0000000000
--- a/ext/standard/tests/strings/vprintf_variation1.phpt
+++ /dev/null
@@ -1,200 +0,0 @@
---TEST--
-Test vprintf() function : usage variations - unexpected values for the format argument
---FILE--
-<?php
-/*
- * Test vprintf() when different unexpected format strings are passed to
- * the '$format' argument of the function
-*/
-
-echo "*** Testing vprintf() : with unexpected values for format argument ***\n";
-
-// initialising the required variables
-$args = array(1, 2);
-
-//get an unset variable
-$unset_var = 10;
-unset ($unset_var);
-
-// declaring a class
-class sample
-{
- public function __toString() {
- return "object";
- }
-}
-
-// Defining resource
-$file_handle = fopen(__FILE__, 'r');
-
-
-//array of values to iterate over
-$values = array(
-
- // int data
-/*1*/ 0,
- 1,
- 12345,
- -2345,
-
- // float data
-/*5*/ 10.5,
- -10.5,
- 10.1234567e10,
- 10.7654321E-10,
- .5,
-
- // array data
-/*10*/ array(),
- array(0),
- array(1),
- array(1,2),
- array('color' => 'red', 'item' => 'pen'),
-
- // null data
-/*15*/ NULL,
- null,
-
- // boolean data
-/*17*/ true,
- false,
- TRUE,
- FALSE,
-
- // empty data
-/*21*/ "",
- '',
-
- // object data
-/*23*/ new sample(),
-
- // undefined data
-/*24*/ @$undefined_var,
-
- // unset data
-/*25*/ @$unset_var,
-
- // resource data
-/*26*/ $file_handle
-);
-
-// loop through each element of the array for format
-
-$counter = 1;
-foreach($values as $value) {
- echo "\n -- Iteration $counter --\n";
- try {
- $result = vprintf($value, $args);
- echo "\n";
- var_dump($result);
- } catch (TypeError $exception) {
- echo $exception->getMessage() . "\n";
- }
-
- $counter++;
-}
-
-// closing the resource
-fclose($file_handle);
-
-?>
---EXPECT--
-*** Testing vprintf() : with unexpected values for format argument ***
-
- -- Iteration 1 --
-0
-int(1)
-
- -- Iteration 2 --
-1
-int(1)
-
- -- Iteration 3 --
-12345
-int(5)
-
- -- Iteration 4 --
--2345
-int(5)
-
- -- Iteration 5 --
-10.5
-int(4)
-
- -- Iteration 6 --
--10.5
-int(5)
-
- -- Iteration 7 --
-101234567000
-int(12)
-
- -- Iteration 8 --
-1.07654321E-9
-int(13)
-
- -- Iteration 9 --
-0.5
-int(3)
-
- -- Iteration 10 --
-vprintf(): Argument #1 ($format) must be of type string, array given
-
- -- Iteration 11 --
-vprintf(): Argument #1 ($format) must be of type string, array given
-
- -- Iteration 12 --
-vprintf(): Argument #1 ($format) must be of type string, array given
-
- -- Iteration 13 --
-vprintf(): Argument #1 ($format) must be of type string, array given
-
- -- Iteration 14 --
-vprintf(): Argument #1 ($format) must be of type string, array given
-
- -- Iteration 15 --
-
-int(0)
-
- -- Iteration 16 --
-
-int(0)
-
- -- Iteration 17 --
-1
-int(1)
-
- -- Iteration 18 --
-
-int(0)
-
- -- Iteration 19 --
-1
-int(1)
-
- -- Iteration 20 --
-
-int(0)
-
- -- Iteration 21 --
-
-int(0)
-
- -- Iteration 22 --
-
-int(0)
-
- -- Iteration 23 --
-object
-int(6)
-
- -- Iteration 24 --
-
-int(0)
-
- -- Iteration 25 --
-
-int(0)
-
- -- Iteration 26 --
-vprintf(): Argument #1 ($format) must be of type string, resource given
diff --git a/ext/standard/tests/strings/wordwrap.phpt b/ext/standard/tests/strings/wordwrap.phpt
index 7fefdb58c2..ff1d1fcbba 100644
--- a/ext/standard/tests/strings/wordwrap.phpt
+++ b/ext/standard/tests/strings/wordwrap.phpt
@@ -3,35 +3,29 @@ wordwrap() function
--FILE--
<?php
-$tests = <<<TESTS
-"12345 12345 12345 12345" === wordwrap("12345 12345 12345 12345")
-"12345 12345\\n1234567890\\n1234567890" === wordwrap("12345 12345 1234567890 1234567890",12)
-"12345\\n12345\\n12345\\n12345" === wordwrap("12345 12345 12345 12345",0)
-"12345ab12345ab12345ab12345" === wordwrap("12345 12345 12345 12345",0,"ab")
-"12345 12345ab1234567890ab1234567890" === wordwrap("12345 12345 1234567890 1234567890",12,"ab")
-"123ab123ab123" === wordwrap("123ab123ab123", 3, "ab")
-"123ab123ab123" === wordwrap("123ab123ab123", 5, "ab")
-"123ab 123ab123" === wordwrap("123 123ab123", 3, "ab")
-"123ab123ab123" === wordwrap("123 123ab123", 5, "ab")
-"123 123ab123" === wordwrap("123 123 123", 10, "ab")
+var_dump("12345 12345 12345 12345" === wordwrap("12345 12345 12345 12345"));
+var_dump("12345 12345\n1234567890\n1234567890" === wordwrap("12345 12345 1234567890 1234567890",12));
+var_dump("12345\n12345\n12345\n12345" === wordwrap("12345 12345 12345 12345",0));
+var_dump("12345ab12345ab12345ab12345" === wordwrap("12345 12345 12345 12345",0,"ab"));
+var_dump("12345 12345ab1234567890ab1234567890" === wordwrap("12345 12345 1234567890 1234567890",12,"ab"));
+var_dump("123ab123ab123" === wordwrap("123ab123ab123", 3, "ab"));
+var_dump("123ab123ab123" === wordwrap("123ab123ab123", 5, "ab"));
+var_dump("123ab 123ab123" === wordwrap("123 123ab123", 3, "ab"));
+var_dump("123ab123ab123" === wordwrap("123 123ab123", 5, "ab"));
+var_dump("123 123ab123" === wordwrap("123 123 123", 10, "ab"));
+
+var_dump("123ab123ab123" === wordwrap("123ab123ab123", 3, "ab", 1));
+var_dump("123ab123ab123" === wordwrap("123ab123ab123", 5, "ab", 1));
+var_dump("123ab 12ab3ab123" === wordwrap("123 123ab123", 3, "ab", 1));
+var_dump("123 ab123ab123" === wordwrap("123 123ab123", 5, "ab", 1));
+var_dump("123 123ab 123" === wordwrap("123 123 123", 8, "ab", 1));
+var_dump("123 ab12345 ab123" === wordwrap("123 12345 123", 8, "ab", 1));
+var_dump("1ab2ab3ab4" === wordwrap("1234", 1, "ab", 1));
+
+var_dump("12345|12345|67890" === wordwrap("12345 1234567890", 5, "|", 1));
+
+var_dump("123|==1234567890|==123" === wordwrap("123 1234567890 123", 10, "|==", 1));
-"123ab123ab123" === wordwrap("123ab123ab123", 3, "ab", 1)
-"123ab123ab123" === wordwrap("123ab123ab123", 5, "ab", 1)
-"123ab 12ab3ab123" === wordwrap("123 123ab123", 3, "ab", 1)
-"123 ab123ab123" === wordwrap("123 123ab123", 5, "ab", 1)
-"123 123ab 123" === wordwrap("123 123 123", 8, "ab", 1)
-"123 ab12345 ab123" === wordwrap("123 12345 123", 8, "ab", 1)
-"1ab2ab3ab4" === wordwrap("1234", 1, "ab", 1)
-
-"12345|12345|67890" === wordwrap("12345 1234567890", 5, "|", 1)
-
-"123|==1234567890|==123" === wordwrap("123 1234567890 123", 10, "|==", 1)
-
-TESTS;
-
-include(__DIR__ . '/../../../../tests/quicktester.inc');
-
-echo "\n";
try {
wordwrap(chr(0), 0, "");
@@ -40,5 +34,23 @@ try {
}
?>
--EXPECT--
-OK
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
wordwrap(): Argument #3 ($break) cannot be empty
diff --git a/ext/standard/tests/url/get_headers_error_003.phpt b/ext/standard/tests/url/get_headers_error_003.phpt
index a8edc2cb21..7ee0b9e210 100644
--- a/ext/standard/tests/url/get_headers_error_003.phpt
+++ b/ext/standard/tests/url/get_headers_error_003.phpt
@@ -1,7 +1,5 @@
--TEST--
Test get_headers() function : test with context
---CONFLICTS--
-server
--FILE--
<?php
diff --git a/ext/standard/tests/versioning/version_compare_op_abbrev.phpt b/ext/standard/tests/versioning/version_compare_op_abbrev.phpt
new file mode 100644
index 0000000000..241c1559fe
--- /dev/null
+++ b/ext/standard/tests/versioning/version_compare_op_abbrev.phpt
@@ -0,0 +1,21 @@
+--TEST--
+version_compare() no longer supports operator abbreviations
+--FILE--
+<?php
+$abbrevs = ['', 'l', 'g', 'e', '!', 'n'];
+foreach ($abbrevs as $op) {
+ try {
+ version_compare('1', '2', $op);
+ echo "'$op' succeeded\n";
+ } catch (ValueError $err) {
+ echo "'$op' failed\n";
+ }
+}
+?>
+--EXPECT--
+'' failed
+'l' failed
+'g' failed
+'e' failed
+'!' failed
+'n' failed
diff --git a/ext/standard/type.c b/ext/standard/type.c
index 5a8b2a0b9d..1036dd7d06 100644
--- a/ext/standard/type.c
+++ b/ext/standard/type.c
@@ -321,6 +321,19 @@ PHP_FUNCTION(is_array)
}
/* }}} */
+/* {{{ Returns true if $array is an array whose keys are all numeric, sequential, and start at 0 */
+PHP_FUNCTION(array_is_list)
+{
+ HashTable *array;
+
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_ARRAY_HT(array)
+ ZEND_PARSE_PARAMETERS_END();
+
+ RETURN_BOOL(zend_array_is_list(array));
+}
+/* }}} */
+
/* {{{ Returns true if variable is an object
Warning: This function is special-cased by zend_compile.c and so is usually bypassed */
PHP_FUNCTION(is_object)
@@ -390,8 +403,8 @@ PHP_FUNCTION(is_callable)
zval *var, *callable_name = NULL;
zend_string *name;
char *error;
- zend_bool retval;
- zend_bool syntax_only = 0;
+ bool retval;
+ bool syntax_only = 0;
int check_flags = 0;
ZEND_PARSE_PARAMETERS_START(1, 3)
diff --git a/ext/standard/uniqid.c b/ext/standard/uniqid.c
index 3671cc3213..0dc9098af0 100644
--- a/ext/standard/uniqid.c
+++ b/ext/standard/uniqid.c
@@ -32,6 +32,7 @@
#endif
#include "php_lcg.h"
+#include "php_random.h"
#ifdef HAVE_GETTIMEOFDAY
ZEND_TLS struct timeval prev_tv = { 0, 0 };
@@ -40,7 +41,7 @@ ZEND_TLS struct timeval prev_tv = { 0, 0 };
PHP_FUNCTION(uniqid)
{
char *prefix = "";
- zend_bool more_entropy = 0;
+ bool more_entropy = 0;
zend_string *uniqid;
int sec, usec;
size_t prefix_len = 0;
@@ -71,7 +72,14 @@ PHP_FUNCTION(uniqid)
* digits for usecs.
*/
if (more_entropy) {
- uniqid = strpprintf(0, "%s%08x%05x%.8F", prefix, sec, usec, php_combined_lcg() * 10);
+ uint32_t bytes;
+ double seed;
+ if (php_random_bytes_silent(&bytes, sizeof(uint32_t)) == FAILURE) {
+ seed = php_combined_lcg() * 10;
+ } else {
+ seed = ((double) bytes / UINT32_MAX) * 10.0;
+ }
+ uniqid = strpprintf(0, "%s%08x%05x%.8F", prefix, sec, usec, seed);
} else {
uniqid = strpprintf(0, "%s%08x%05x", prefix, sec, usec);
}
diff --git a/ext/standard/url.c b/ext/standard/url.c
index a33091a86b..d1baff1049 100644
--- a/ext/standard/url.c
+++ b/ext/standard/url.c
@@ -95,13 +95,13 @@ static const char *binary_strcspn(const char *s, const char *e, const char *char
/* {{{ php_url_parse */
PHPAPI php_url *php_url_parse_ex(char const *str, size_t length)
{
- zend_bool has_port;
+ bool has_port;
return php_url_parse_ex2(str, length, &has_port);
}
/* {{{ php_url_parse_ex2
*/
-PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, zend_bool *has_port)
+PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port)
{
char port_buf[6];
php_url *ret = ecalloc(1, sizeof(php_url));
@@ -335,7 +335,7 @@ PHP_FUNCTION(parse_url)
php_url *resource;
zend_long key = -1;
zval tmp;
- zend_bool has_port;
+ bool has_port;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STRING(str, str_len)
@@ -458,7 +458,7 @@ static int php_htoi(char *s)
static const unsigned char hexchars[] = "0123456789ABCDEF";
-static zend_always_inline zend_string *php_url_encode_impl(const char *s, size_t len, zend_bool raw) /* {{{ */ {
+static zend_always_inline zend_string *php_url_encode_impl(const char *s, size_t len, bool raw) /* {{{ */ {
register unsigned char c;
unsigned char *to;
unsigned char const *from, *end;
@@ -683,7 +683,7 @@ PHP_FUNCTION(get_headers)
size_t url_len;
php_stream *stream;
zval *prev_val, *hdr = NULL;
- zend_bool format = 0;
+ bool format = 0;
zval *zcontext = NULL;
php_stream_context *context;
diff --git a/ext/standard/url.h b/ext/standard/url.h
index a751aa4ee1..6483b7211b 100644
--- a/ext/standard/url.h
+++ b/ext/standard/url.h
@@ -31,7 +31,7 @@ typedef struct php_url {
PHPAPI void php_url_free(php_url *theurl);
PHPAPI php_url *php_url_parse(char const *str);
PHPAPI php_url *php_url_parse_ex(char const *str, size_t length);
-PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, zend_bool *has_port);
+PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port);
PHPAPI size_t php_url_decode(char *str, size_t len); /* return value: length of decoded string */
PHPAPI size_t php_raw_url_decode(char *str, size_t len); /* return value: length of decoded string */
PHPAPI zend_string *php_url_encode(char const *s, size_t len);
diff --git a/ext/standard/url_scanner_ex.re b/ext/standard/url_scanner_ex.re
index bef17733e2..7cfd848717 100644
--- a/ext/standard/url_scanner_ex.re
+++ b/ext/standard/url_scanner_ex.re
@@ -619,7 +619,7 @@ PHPAPI char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, co
}
-static char *url_adapt_ext(const char *src, size_t srclen, size_t *newlen, zend_bool do_flush, url_adapt_state_ex_t *ctx)
+static char *url_adapt_ext(const char *src, size_t srclen, size_t *newlen, bool do_flush, url_adapt_state_ex_t *ctx)
{
char *retval;
@@ -690,7 +690,7 @@ static inline void php_url_scanner_session_handler_impl(char *output, size_t out
}
if (ZSTR_LEN(url_state->url_app.s) != 0) {
- *handled_output = url_adapt_ext(output, output_len, &len, (zend_bool) (mode & (PHP_OUTPUT_HANDLER_END | PHP_OUTPUT_HANDLER_CONT | PHP_OUTPUT_HANDLER_FLUSH | PHP_OUTPUT_HANDLER_FINAL) ? 1 : 0), url_state);
+ *handled_output = url_adapt_ext(output, output_len, &len, (bool) (mode & (PHP_OUTPUT_HANDLER_END | PHP_OUTPUT_HANDLER_CONT | PHP_OUTPUT_HANDLER_FLUSH | PHP_OUTPUT_HANDLER_FINAL) ? 1 : 0), url_state);
if (sizeof(unsigned int) < sizeof(size_t)) {
if (len > UINT_MAX)
len = UINT_MAX;
@@ -842,7 +842,7 @@ static inline int php_url_scanner_reset_var_impl(zend_string *name, int encode,
smart_str form_app = {0};
zend_string *encoded;
int ret = SUCCESS;
- zend_bool sep_removed = 0;
+ bool sep_removed = 0;
url_adapt_state_ex_t *url_state;
if (type) {
diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c
index 758f79ff11..75cdcc734e 100644
--- a/ext/standard/user_filters.c
+++ b/ext/standard/user_filters.c
@@ -42,7 +42,7 @@ static int le_bucket;
PHP_METHOD(php_user_filter, filter)
{
zval *in, *out, *consumed;
- zend_bool closing;
+ bool closing;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrzb", &in, &out, &consumed, &closing) == FAILURE) {
RETURN_THROWS();
}
@@ -58,7 +58,7 @@ PHP_METHOD(php_user_filter, onClose)
ZEND_PARSE_PARAMETERS_NONE();
}
-static zend_class_entry user_filter_class_entry;
+static zend_class_entry *user_filter_class_entry;
static ZEND_RSRC_DTOR_FUNC(php_bucket_dtor)
{
@@ -71,14 +71,8 @@ static ZEND_RSRC_DTOR_FUNC(php_bucket_dtor)
PHP_MINIT_FUNCTION(user_filters)
{
- zend_class_entry *php_user_filter;
/* init the filter class ancestor */
- INIT_CLASS_ENTRY(user_filter_class_entry, "php_user_filter", class_php_user_filter_methods);
- if ((php_user_filter = zend_register_internal_class(&user_filter_class_entry)) == NULL) {
- return FAILURE;
- }
- zend_declare_property_string(php_user_filter, "filtername", sizeof("filtername")-1, "", ZEND_ACC_PUBLIC);
- zend_declare_property_string(php_user_filter, "params", sizeof("params")-1, "", ZEND_ACC_PUBLIC);
+ user_filter_class_entry = register_class_php_user_filter();
/* init the filter resource; it has no dtor, as streams will always clean it up
* at the correct time */
diff --git a/ext/standard/user_filters.stub.php b/ext/standard/user_filters.stub.php
index 4065750312..2a20b88780 100755
--- a/ext/standard/user_filters.stub.php
+++ b/ext/standard/user_filters.stub.php
@@ -1,9 +1,14 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class php_user_filter
{
+ /** @var string */
+ public $filtername = "";
+ /** @var string */
+ public $params = "";
+
/**
* @param resource $in
* @param resource $out
diff --git a/ext/standard/user_filters_arginfo.h b/ext/standard/user_filters_arginfo.h
index aabb25c9d1..2318196199 100644
--- a/ext/standard/user_filters_arginfo.h
+++ b/ext/standard/user_filters_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: b3876ce9055a9417d0d1db9f97235513740de956 */
+ * Stub hash: d0653a1b2a1f33744b41a9b5f047ec4330bac091 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_php_user_filter_filter, 0, 0, 4)
ZEND_ARG_INFO(0, in)
@@ -25,3 +25,25 @@ static const zend_function_entry class_php_user_filter_methods[] = {
ZEND_ME(php_user_filter, onClose, arginfo_class_php_user_filter_onClose, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_php_user_filter(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "php_user_filter", class_php_user_filter_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ zval property_filtername_default_value;
+ ZVAL_EMPTY_STRING(&property_filtername_default_value);
+ zend_string *property_filtername_name = zend_string_init("filtername", sizeof("filtername") - 1, 1);
+ zend_declare_property_ex(class_entry, property_filtername_name, &property_filtername_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_filtername_name);
+
+ zval property_params_default_value;
+ ZVAL_EMPTY_STRING(&property_params_default_value);
+ zend_string *property_params_name = zend_string_init("params", sizeof("params") - 1, 1);
+ zend_declare_property_ex(class_entry, property_params_name, &property_params_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_params_name);
+
+ return class_entry;
+}
diff --git a/ext/standard/var.c b/ext/standard/var.c
index fef62dd482..bcc6cf5a88 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -26,6 +26,7 @@
#include "zend_smart_str.h"
#include "basic_functions.h"
#include "php_incomplete_class.h"
+#include "zend_enum.h"
/* }}} */
struct php_serialize_data {
@@ -130,9 +131,9 @@ again:
GC_ADDREF(myht);
GC_PROTECT_RECURSION(myht);
}
- count = zend_array_count(myht);
+ count = zend_hash_num_elements(myht);
php_printf("%sarray(%d) {\n", COMMON, count);
- ZEND_HASH_FOREACH_KEY_VAL_IND(myht, num, key, val) {
+ ZEND_HASH_FOREACH_KEY_VAL(myht, num, key, val) {
php_array_element_dump(val, num, key, level);
} ZEND_HASH_FOREACH_END();
if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) {
@@ -144,7 +145,14 @@ again:
}
PUTS("}\n");
break;
- case IS_OBJECT:
+ case IS_OBJECT: {
+ zend_class_entry *ce = Z_OBJCE_P(struc);
+ if (ce->ce_flags & ZEND_ACC_ENUM) {
+ zval *case_name_zval = zend_enum_fetch_case_name(Z_OBJ_P(struc));
+ php_printf("%senum(%s::%s)\n", COMMON, ZSTR_VAL(ce->name), Z_STRVAL_P(case_name_zval));
+ return;
+ }
+
if (Z_IS_RECURSIVE_P(struc)) {
PUTS("*RECURSION*\n");
return;
@@ -183,6 +191,7 @@ again:
PUTS("}\n");
Z_UNPROTECT_RECURSION_P(struc);
break;
+ }
case IS_RESOURCE: {
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(struc));
php_printf("%sresource(%d) of type (%s)\n", COMMON, Z_RES_P(struc)->handle, type_name ? type_name : "Unknown");
@@ -269,7 +278,6 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */
{
HashTable *myht = NULL;
zend_string *class_name;
- int is_ref = 0;
zend_ulong index;
zend_string *key;
zval *val;
@@ -279,27 +287,30 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */
php_printf("%*c", level - 1, ' ');
}
-again:
switch (Z_TYPE_P(struc)) {
case IS_FALSE:
- php_printf("%sbool(false)\n", COMMON);
+ PUTS("bool(false)\n");
break;
case IS_TRUE:
- php_printf("%sbool(true)\n", COMMON);
+ PUTS("bool(true)\n");
break;
case IS_NULL:
- php_printf("%sNULL\n", COMMON);
+ PUTS("NULL\n");
break;
case IS_LONG:
- php_printf("%sint(" ZEND_LONG_FMT ")\n", COMMON, Z_LVAL_P(struc));
+ php_printf("int(" ZEND_LONG_FMT ")\n", Z_LVAL_P(struc));
break;
case IS_DOUBLE:
- php_printf_unchecked("%sfloat(%.*H)\n", COMMON, (int) PG(serialize_precision), Z_DVAL_P(struc));
+ php_printf_unchecked("float(%.*H)\n", (int) PG(serialize_precision), Z_DVAL_P(struc));
break;
case IS_STRING:
- php_printf("%sstring(%zd) \"", COMMON, Z_STRLEN_P(struc));
+ php_printf("string(%zd) \"", Z_STRLEN_P(struc));
PHPWRITE(Z_STRVAL_P(struc), Z_STRLEN_P(struc));
- php_printf("\" refcount(%u)\n", Z_REFCOUNTED_P(struc) ? Z_REFCOUNT_P(struc) : 1);
+ if (Z_REFCOUNTED_P(struc)) {
+ php_printf("\" refcount(%u)\n", Z_REFCOUNT_P(struc));
+ } else {
+ PUTS("\" interned\n");
+ }
break;
case IS_ARRAY:
myht = Z_ARRVAL_P(struc);
@@ -311,9 +322,14 @@ again:
GC_ADDREF(myht);
GC_PROTECT_RECURSION(myht);
}
- count = zend_array_count(myht);
- php_printf("%sarray(%d) refcount(%u){\n", COMMON, count, Z_REFCOUNTED_P(struc) ? Z_REFCOUNT_P(struc) - 1 : 1);
- ZEND_HASH_FOREACH_KEY_VAL_IND(myht, index, key, val) {
+ count = zend_hash_num_elements(myht);
+ if (Z_REFCOUNTED_P(struc)) {
+ /* -1 because of ADDREF above. */
+ php_printf("array(%d) refcount(%u){\n", count, Z_REFCOUNT_P(struc) - 1);
+ } else {
+ php_printf("array(%d) interned {\n", count);
+ }
+ ZEND_HASH_FOREACH_KEY_VAL(myht, index, key, val) {
zval_array_element_dump(val, index, key, level);
} ZEND_HASH_FOREACH_END();
if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) {
@@ -336,7 +352,7 @@ again:
GC_PROTECT_RECURSION(myht);
}
class_name = Z_OBJ_HANDLER_P(struc, get_class_name)(Z_OBJ_P(struc));
- php_printf("%sobject(%s)#%d (%d) refcount(%u){\n", COMMON, ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0, Z_REFCOUNT_P(struc));
+ php_printf("object(%s)#%d (%d) refcount(%u){\n", ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0, Z_REFCOUNT_P(struc));
zend_string_release_ex(class_name, 0);
if (myht) {
ZEND_HASH_FOREACH_KEY_VAL(myht, index, key, val) {
@@ -363,18 +379,19 @@ again:
break;
case IS_RESOURCE: {
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(struc));
- php_printf("%sresource(%d) of type (%s) refcount(%u)\n", COMMON, Z_RES_P(struc)->handle, type_name ? type_name : "Unknown", Z_REFCOUNT_P(struc));
+ php_printf("resource(%d) of type (%s) refcount(%u)\n", Z_RES_P(struc)->handle, type_name ? type_name : "Unknown", Z_REFCOUNT_P(struc));
break;
}
case IS_REFERENCE:
- //??? hide references with refcount==1 (for compatibility)
- if (Z_REFCOUNT_P(struc) > 1) {
- is_ref = 1;
+ php_printf("reference refcount(%u) {\n", Z_REFCOUNT_P(struc));
+ php_debug_zval_dump(Z_REFVAL_P(struc), level + 2);
+ if (level > 1) {
+ php_printf("%*c", level - 1, ' ');
}
- struc = Z_REFVAL_P(struc);
- goto again;
+ PUTS("}\n");
+ break;
default:
- php_printf("%sUNKNOWN:0\n", COMMON);
+ PUTS("UNKNOWN:0\n");
break;
}
}
@@ -529,7 +546,7 @@ again:
buffer_append_spaces(buf, level - 1);
}
smart_str_appendl(buf, "array (\n", 8);
- ZEND_HASH_FOREACH_KEY_VAL_IND(myht, index, key, val) {
+ ZEND_HASH_FOREACH_KEY_VAL(myht, index, key, val) {
php_array_element_export(val, index, key, level, buf);
} ZEND_HASH_FOREACH_END();
if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) {
@@ -560,27 +577,39 @@ again:
buffer_append_spaces(buf, level - 1);
}
+ zend_class_entry *ce = Z_OBJCE_P(struc);
+ bool is_enum = ce->ce_flags & ZEND_ACC_ENUM;
+
/* stdClass has no __set_state method, but can be casted to */
- if (Z_OBJCE_P(struc) == zend_standard_class_def) {
+ if (ce == zend_standard_class_def) {
smart_str_appendl(buf, "(object) array(\n", 16);
} else {
- smart_str_append(buf, Z_OBJCE_P(struc)->name);
- smart_str_appendl(buf, "::__set_state(array(\n", 21);
+ smart_str_append(buf, ce->name);
+ if (is_enum) {
+ zend_object *zobj = Z_OBJ_P(struc);
+ zval *case_name_zval = zend_enum_fetch_case_name(zobj);
+ smart_str_appendl(buf, "::", 2);
+ smart_str_append(buf, Z_STR_P(case_name_zval));
+ } else {
+ smart_str_appendl(buf, "::__set_state(array(\n", 21);
+ }
}
- if (myht) {
+ if (myht && !is_enum) {
ZEND_HASH_FOREACH_KEY_VAL_IND(myht, index, key, val) {
php_object_element_export(val, index, key, level, buf);
} ZEND_HASH_FOREACH_END();
GC_TRY_UNPROTECT_RECURSION(myht);
+ }
+ if (myht) {
zend_release_properties(myht);
}
- if (level > 1) {
+ if (level > 1 && !is_enum) {
buffer_append_spaces(buf, level - 1);
}
- if (Z_OBJCE_P(struc) == zend_standard_class_def) {
+ if (ce == zend_standard_class_def) {
smart_str_appendc(buf, ')');
- } else {
+ } else if (!is_enum) {
smart_str_appendl(buf, "))", 2);
}
@@ -611,7 +640,7 @@ PHPAPI void php_var_export(zval *struc, int level) /* {{{ */
PHP_FUNCTION(var_export)
{
zval *var;
- zend_bool return_output = 0;
+ bool return_output = 0;
smart_str buf = {0};
ZEND_PARSE_PARAMETERS_START(1, 2)
@@ -638,11 +667,11 @@ static inline zend_long php_add_var_hash(php_serialize_data_t data, zval *var) /
{
zval *zv;
zend_ulong key;
- zend_bool is_ref = Z_ISREF_P(var);
+ bool is_ref = Z_ISREF_P(var);
data->n += 1;
- if (!is_ref && Z_TYPE_P(var) != IS_OBJECT) {
+ if (!is_ref && (Z_TYPE_P(var) != IS_OBJECT || Z_REFCOUNT_P(var) == 1)) {
return 0;
}
@@ -682,47 +711,89 @@ static inline zend_long php_add_var_hash(php_serialize_data_t data, zval *var) /
static inline void php_var_serialize_long(smart_str *buf, zend_long val) /* {{{ */
{
- smart_str_appendl(buf, "i:", 2);
- smart_str_append_long(buf, val);
- smart_str_appendc(buf, ';');
+ char b[32];
+ char *s = zend_print_long_to_buf(b + sizeof(b) - 1, val);
+ size_t l = b + sizeof(b) - 1 - s;
+ size_t new_len = smart_str_alloc(buf, 2 + l + 1, 0);
+ char *res = ZSTR_VAL(buf->s) + ZSTR_LEN(buf->s);
+
+ ZSTR_LEN(buf->s) = new_len;
+ memcpy(res, "i:", 2);
+ res += 2;
+ memcpy(res, s, l);
+ res[l] = ';';
}
/* }}} */
static inline void php_var_serialize_string(smart_str *buf, char *str, size_t len) /* {{{ */
{
- smart_str_appendl(buf, "s:", 2);
- smart_str_append_unsigned(buf, len);
- smart_str_appendl(buf, ":\"", 2);
- smart_str_appendl(buf, str, len);
- smart_str_appendl(buf, "\";", 2);
+ char b[32];
+ char *s = zend_print_long_to_buf(b + sizeof(b) - 1, len);
+ size_t l = b + sizeof(b) - 1 - s;
+ size_t new_len = smart_str_alloc(buf, 2 + l + 2 + len + 2, 0);
+ char *res = ZSTR_VAL(buf->s) + ZSTR_LEN(buf->s);
+
+ ZSTR_LEN(buf->s) = new_len;
+ memcpy(res, "s:", 2);
+ res += 2;
+ memcpy(res, s, l);
+ res += l;
+ memcpy(res, ":\"", 2);
+ res += 2;
+ memcpy(res, str, len);
+ res += len;
+ memcpy(res, "\";", 2);
}
/* }}} */
-static inline zend_bool php_var_serialize_class_name(smart_str *buf, zval *struc) /* {{{ */
+static inline bool php_var_serialize_class_name(smart_str *buf, zval *struc) /* {{{ */
{
+ char b[32], *s, *res;
+ size_t l, new_len;
PHP_CLASS_ATTRIBUTES;
PHP_SET_CLASS_ATTRIBUTES(struc);
- smart_str_appendl(buf, "O:", 2);
- smart_str_append_unsigned(buf, ZSTR_LEN(class_name));
- smart_str_appendl(buf, ":\"", 2);
- smart_str_append(buf, class_name);
- smart_str_appendl(buf, "\":", 2);
+ size_t class_name_len = ZSTR_LEN(class_name);
+ s = zend_print_long_to_buf(b + sizeof(b) - 1, class_name_len);
+ l = b + sizeof(b) - 1 - s;
+ new_len = smart_str_alloc(buf, 2 + l + 2 + class_name_len + 2, 0);
+ res = ZSTR_VAL(buf->s) + ZSTR_LEN(buf->s);
+ ZSTR_LEN(buf->s) = new_len;
+ memcpy(res, "O:", 2);
+ res += 2;
+ memcpy(res, s, l);
+ res += l;
+ memcpy(res, ":\"", 2);
+ res += 2;
+ memcpy(res, ZSTR_VAL(class_name), class_name_len);
+ res += class_name_len;
+ memcpy(res, "\":", 2);
PHP_CLEANUP_CLASS_ATTRIBUTES();
return incomplete_class;
}
/* }}} */
-static int php_var_serialize_call_sleep(zval *retval, zval *struc) /* {{{ */
+static zend_result php_var_serialize_call_sleep(zend_object *obj, zend_function *fn, zval *retval) /* {{{ */
{
- zval fname;
- int res;
+ zend_result res;
+ zend_fcall_info fci;
+ zend_fcall_info_cache fci_cache;
+
+ fci.size = sizeof(fci);
+ fci.object = obj;
+ fci.retval = retval;
+ fci.param_count = 0;
+ fci.params = NULL;
+ fci.named_params = NULL;
+ ZVAL_UNDEF(&fci.function_name);
+
+ fci_cache.function_handler = fn;
+ fci_cache.object = obj;
+ fci_cache.called_scope = obj->ce;
- ZVAL_STRINGL(&fname, "__sleep", sizeof("__sleep") - 1);
BG(serialize_lock)++;
- res = call_user_function(NULL, struc, &fname, retval, 0, 0);
+ res = zend_call_function(&fci, &fci_cache);
BG(serialize_lock)--;
- zval_ptr_dtor_str(&fname);
if (res == FAILURE || Z_ISUNDEF_P(retval)) {
zval_ptr_dtor(retval);
@@ -730,11 +801,8 @@ static int php_var_serialize_call_sleep(zval *retval, zval *struc) /* {{{ */
}
if (!HASH_OF(retval)) {
- zend_class_entry *ce;
- ZEND_ASSERT(Z_TYPE_P(struc) == IS_OBJECT);
- ce = Z_OBJCE_P(struc);
zval_ptr_dtor(retval);
- php_error_docref(NULL, E_WARNING, "%s::__sleep() should return an array only containing the names of instance-variables to serialize", ZSTR_VAL(ce->name));
+ php_error_docref(NULL, E_WARNING, "%s::__sleep() should return an array only containing the names of instance-variables to serialize", ZSTR_VAL(obj->ce->name));
return FAILURE;
}
@@ -868,7 +936,7 @@ static int php_var_serialize_get_sleep_props(
}
/* }}} */
-static void php_var_serialize_nested_data(smart_str *buf, zval *struc, HashTable *ht, uint32_t count, zend_bool incomplete_class, php_serialize_data_t var_hash) /* {{{ */
+static void php_var_serialize_nested_data(smart_str *buf, zval *struc, HashTable *ht, uint32_t count, bool incomplete_class, php_serialize_data_t var_hash) /* {{{ */
{
smart_str_append_unsigned(buf, count);
smart_str_appendl(buf, ":{", 2);
@@ -878,7 +946,8 @@ static void php_var_serialize_nested_data(smart_str *buf, zval *struc, HashTable
zend_ulong index;
ZEND_HASH_FOREACH_KEY_VAL_IND(ht, index, key, data) {
- if (incomplete_class && strcmp(ZSTR_VAL(key), MAGIC_MEMBER) == 0) {
+ if (incomplete_class && zend_string_equals_literal(key, MAGIC_MEMBER)) {
+ incomplete_class = 0;
continue;
}
@@ -975,11 +1044,19 @@ again:
return;
case IS_DOUBLE: {
- char tmp_str[PHP_DOUBLE_MAX_LENGTH];
- smart_str_appendl(buf, "d:", 2);
+ char tmp_str[PHP_DOUBLE_MAX_LENGTH], *res;
+ size_t len, new_len;
+
php_gcvt(Z_DVAL_P(struc), (int)PG(serialize_precision), '.', 'E', tmp_str);
- smart_str_appends(buf, tmp_str);
- smart_str_appendc(buf, ';');
+ len = strlen(tmp_str);
+ new_len = smart_str_alloc(buf, 2 + len + 1, 0);
+ res = ZSTR_VAL(buf->s) + ZSTR_LEN(buf->s);
+ ZSTR_LEN(buf->s) = new_len;
+
+ memcpy(res, "d:", 2);
+ res += 2;
+ memcpy(res, tmp_str, len);
+ res[len] = ';';
return;
}
@@ -989,9 +1066,26 @@ again:
case IS_OBJECT: {
zend_class_entry *ce = Z_OBJCE_P(struc);
- zend_bool incomplete_class;
+ bool incomplete_class;
uint32_t count;
+ if (ce->ce_flags & ZEND_ACC_ENUM) {
+ PHP_CLASS_ATTRIBUTES;
+
+ zval *case_name_zval = zend_enum_fetch_case_name(Z_OBJ_P(struc));
+
+ PHP_SET_CLASS_ATTRIBUTES(struc);
+ smart_str_appendl(buf, "E:", 2);
+ smart_str_append_unsigned(buf, ZSTR_LEN(class_name) + strlen(":") + Z_STRLEN_P(case_name_zval));
+ smart_str_appendl(buf, ":\"", 2);
+ smart_str_append(buf, class_name);
+ smart_str_appendc(buf, ':');
+ smart_str_append(buf, Z_STR_P(case_name_zval));
+ smart_str_appendl(buf, "\";", 2);
+ PHP_CLEANUP_CLASS_ATTRIBUTES();
+ return;
+ }
+
if (ce->__serialize) {
zval retval, obj;
zend_string *key;
@@ -1008,9 +1102,9 @@ again:
}
php_var_serialize_class_name(buf, &obj);
- smart_str_append_unsigned(buf, zend_array_count(Z_ARRVAL(retval)));
+ smart_str_append_unsigned(buf, zend_hash_num_elements(Z_ARRVAL(retval)));
smart_str_appendl(buf, ":{", 2);
- ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL(retval), index, key, data) {
+ ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(retval), index, key, data) {
if (!key) {
php_var_serialize_long(buf, index);
} else {
@@ -1035,21 +1129,40 @@ again:
size_t serialized_length;
if (ce->serialize(struc, &serialized_data, &serialized_length, (zend_serialize_data *)var_hash) == SUCCESS) {
- smart_str_appendl(buf, "C:", 2);
- smart_str_append_unsigned(buf, ZSTR_LEN(Z_OBJCE_P(struc)->name));
- smart_str_appendl(buf, ":\"", 2);
- smart_str_append(buf, Z_OBJCE_P(struc)->name);
- smart_str_appendl(buf, "\":", 2);
-
- smart_str_append_unsigned(buf, serialized_length);
- smart_str_appendl(buf, ":{", 2);
- smart_str_appendl(buf, (char *) serialized_data, serialized_length);
- smart_str_appendc(buf, '}');
+ char b1[32], b2[32], *s1, *s2, *res;
+ size_t l1, l2, new_len;
+
+ s1 = zend_print_long_to_buf(b1 + sizeof(b1) - 1, ZSTR_LEN(Z_OBJCE_P(struc)->name));
+ l1 = b1 + sizeof(b1) - 1 - s1;
+ s2 = zend_print_long_to_buf(b2 + sizeof(b2) - 1, serialized_length);
+ l2 = b2 + sizeof(b2) - 1 - s2;
+ new_len = smart_str_alloc(buf, 2 + l1 + 2 + ZSTR_LEN(Z_OBJCE_P(struc)->name) + 2 + l2 + 2 + serialized_length + 1, 0);
+ res = ZSTR_VAL(buf->s) + ZSTR_LEN(buf->s);
+ ZSTR_LEN(buf->s) = new_len;
+ memcpy(res, "C:", 2);
+ res += 2;
+ memcpy(res, s1, l1);
+ res += l1;
+ memcpy(res, ":\"", 2);
+ res += 2;
+ memcpy(res, ZSTR_VAL(Z_OBJCE_P(struc)->name), ZSTR_LEN(Z_OBJCE_P(struc)->name));
+ res += ZSTR_LEN(Z_OBJCE_P(struc)->name);
+ memcpy(res, "\":", 2);
+ res += 2;
+
+ memcpy(res, s2, l2);
+ res += l2;
+ memcpy(res, ":{", 2);
+ res += 2;
+ memcpy(res, (char *) serialized_data, serialized_length);
+ res[serialized_length] = '}';
} else {
/* Mark this value in the var_hash, to avoid creating references to it. */
zval *var_idx = zend_hash_index_find(&var_hash->ht,
(zend_ulong) (zend_uintptr_t) Z_COUNTED_P(struc));
- ZVAL_LONG(var_idx, -1);
+ if (var_idx) {
+ ZVAL_LONG(var_idx, -1);
+ }
smart_str_appendl(buf, "N;", 2);
}
if (serialized_data) {
@@ -1058,28 +1171,82 @@ again:
return;
}
- if (ce != PHP_IC_ENTRY && zend_hash_str_exists(&ce->function_table, "__sleep", sizeof("__sleep")-1)) {
- zval retval, tmp;
-
- ZVAL_OBJ_COPY(&tmp, Z_OBJ_P(struc));
-
- if (php_var_serialize_call_sleep(&retval, &tmp) == FAILURE) {
- if (!EG(exception)) {
- /* we should still add element even if it's not OK,
- * since we already wrote the length of the array before */
- smart_str_appendl(buf, "N;", 2);
+ if (ce != PHP_IC_ENTRY) {
+ zval *zv = zend_hash_find_ex(&ce->function_table, ZSTR_KNOWN(ZEND_STR_SLEEP), 1);
+
+ if (zv) {
+ zval retval, tmp;
+
+ ZVAL_OBJ_COPY(&tmp, Z_OBJ_P(struc));
+ if (php_var_serialize_call_sleep(Z_OBJ(tmp), Z_FUNC_P(zv), &retval) == FAILURE) {
+ if (!EG(exception)) {
+ /* we should still add element even if it's not OK,
+ * since we already wrote the length of the array before */
+ smart_str_appendl(buf, "N;", 2);
+ }
+ OBJ_RELEASE(Z_OBJ(tmp));
+ return;
}
- zval_ptr_dtor(&tmp);
+
+ php_var_serialize_class(buf, &tmp, &retval, var_hash);
+ zval_ptr_dtor(&retval);
+ OBJ_RELEASE(Z_OBJ(tmp));
return;
}
-
- php_var_serialize_class(buf, &tmp, &retval, var_hash);
- zval_ptr_dtor(&retval);
- zval_ptr_dtor(&tmp);
- return;
}
incomplete_class = php_var_serialize_class_name(buf, struc);
+
+ if (Z_OBJ_P(struc)->properties == NULL
+ && Z_OBJ_HT_P(struc)->get_properties_for == NULL
+ && Z_OBJ_HT_P(struc)->get_properties == zend_std_get_properties) {
+ /* Optimized version without rebulding properties HashTable */
+ zend_object *obj = Z_OBJ_P(struc);
+ zend_class_entry *ce = obj->ce;
+ zend_property_info *prop_info;
+ zval *prop;
+ int i;
+
+ count = ce->default_properties_count;
+ for (i = 0; i < ce->default_properties_count; i++) {
+ prop_info = ce->properties_info_table[i];
+ if (!prop_info) {
+ count--;
+ continue;
+ }
+ prop = OBJ_PROP(obj, prop_info->offset);
+ if (Z_TYPE_P(prop) == IS_UNDEF) {
+ count--;
+ continue;
+ }
+ }
+ if (count) {
+ smart_str_append_unsigned(buf, count);
+ smart_str_appendl(buf, ":{", 2);
+ for (i = 0; i < ce->default_properties_count; i++) {
+ prop_info = ce->properties_info_table[i];
+ if (!prop_info) {
+ continue;
+ }
+ prop = OBJ_PROP(obj, prop_info->offset);
+ if (Z_TYPE_P(prop) == IS_UNDEF) {
+ continue;
+ }
+
+ php_var_serialize_string(buf, ZSTR_VAL(prop_info->name), ZSTR_LEN(prop_info->name));
+
+ if (Z_ISREF_P(prop) && Z_REFCOUNT_P(prop) == 1) {
+ prop = Z_REFVAL_P(prop);
+ }
+
+ php_var_serialize_intern(buf, prop, var_hash);
+ }
+ smart_str_appendc(buf, '}');
+ } else {
+ smart_str_appendl(buf, "0:{}", 4);
+ }
+ return;
+ }
myht = zend_get_properties_for(struc, ZEND_PROP_PURPOSE_SERIALIZE);
/* count after serializing name, since php_var_serialize_class_name
* changes the count if the variable is incomplete class */
@@ -1208,7 +1375,7 @@ PHPAPI void php_unserialize_with_options(zval *return_value, const char *buf, co
zend_string *lcname;
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(classes), entry) {
- convert_to_string_ex(entry);
+ convert_to_string(entry);
lcname = zend_string_tolower(Z_STR_P(entry));
zend_hash_add_empty_element(class_hash, lcname);
zend_string_release_ex(lcname, 0);
@@ -1300,7 +1467,7 @@ PHP_FUNCTION(unserialize)
/* {{{ Returns the allocated by PHP memory */
PHP_FUNCTION(memory_get_usage) {
- zend_bool real_usage = 0;
+ bool real_usage = 0;
ZEND_PARSE_PARAMETERS_START(0, 1)
Z_PARAM_OPTIONAL
@@ -1313,7 +1480,7 @@ PHP_FUNCTION(memory_get_usage) {
/* {{{ Returns the peak allocated by PHP memory */
PHP_FUNCTION(memory_get_peak_usage) {
- zend_bool real_usage = 0;
+ bool real_usage = 0;
ZEND_PARSE_PARAMETERS_START(0, 1)
Z_PARAM_OPTIONAL
diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re
index 1b191a0367..d3a3b91ede 100644
--- a/ext/standard/var_unserializer.re
+++ b/ext/standard/var_unserializer.re
@@ -29,6 +29,10 @@
#define VAR_WAKEUP_FLAG 1
#define VAR_UNSERIALIZE_FLAG 2
+/* Each element is encoded using at least 2 characters. */
+#define IS_FAKE_ELEM_COUNT(num_elems, serialized_len) \
+ ((num_elems) > (serialized_len) / 2)
+
typedef struct {
zend_long used_slots;
void *next;
@@ -217,9 +221,7 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
zend_long i;
var_entries *var_hash = (*var_hashx)->entries.next;
var_dtor_entries *var_dtor_hash = (*var_hashx)->first_dtor;
- zend_bool delayed_call_failed = 0;
- zval wakeup_name;
- ZVAL_UNDEF(&wakeup_name);
+ bool delayed_call_failed = 0;
#if VAR_ENTRIES_DBG
fprintf(stderr, "var_destroy( " ZEND_LONG_FMT ")\n", var_hash?var_hash->used_slots:-1L);
@@ -242,12 +244,26 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
/* Perform delayed __wakeup calls */
if (!delayed_call_failed) {
zval retval;
- if (Z_ISUNDEF(wakeup_name)) {
- ZVAL_STRINGL(&wakeup_name, "__wakeup", sizeof("__wakeup") - 1);
- }
+ zend_fcall_info fci;
+ zend_fcall_info_cache fci_cache;
+
+ ZEND_ASSERT(Z_TYPE_P(zv) == IS_OBJECT);
+
+ fci.size = sizeof(fci);
+ fci.object = Z_OBJ_P(zv);
+ fci.retval = &retval;
+ fci.param_count = 0;
+ fci.params = NULL;
+ fci.named_params = NULL;
+ ZVAL_UNDEF(&fci.function_name);
+
+ fci_cache.function_handler = zend_hash_find_ptr(
+ &fci.object->ce->function_table, ZSTR_KNOWN(ZEND_STR_WAKEUP));
+ fci_cache.object = fci.object;
+ fci_cache.called_scope = fci.object->ce;
BG(serialize_lock)++;
- if (call_user_function(NULL, zv, &wakeup_name, &retval, 0, 0) == FAILURE || Z_ISUNDEF(retval)) {
+ if (zend_call_function(&fci, &fci_cache) == FAILURE || Z_ISUNDEF(retval)) {
delayed_call_failed = 1;
GC_ADD_FLAGS(Z_OBJ_P(zv), IS_OBJ_DESTRUCTOR_CALLED);
}
@@ -284,8 +300,6 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
var_dtor_hash = next;
}
- zval_ptr_dtor_nogc(&wakeup_name);
-
if ((*var_hashx)->ref_props) {
zend_hash_destroy((*var_hashx)->ref_props);
FREE_HASHTABLE((*var_hashx)->ref_props);
@@ -338,12 +352,9 @@ static zend_string *unserialize_str(const unsigned char **p, size_t len, size_t
}
static inline int unserialize_allowed_class(
- zend_string *class_name, php_unserialize_data_t *var_hashx)
+ zend_string *lcname, php_unserialize_data_t *var_hashx)
{
HashTable *classes = (*var_hashx)->allowed_classes;
- zend_string *lcname;
- int res;
- ALLOCA_FLAG(use_heap)
if(classes == NULL) {
return 1;
@@ -352,11 +363,7 @@ static inline int unserialize_allowed_class(
return 0;
}
- ZSTR_ALLOCA_ALLOC(lcname, ZSTR_LEN(class_name), use_heap);
- zend_str_tolower_copy(ZSTR_VAL(lcname), ZSTR_VAL(class_name), ZSTR_LEN(class_name));
- res = zend_hash_exists(classes, lcname);
- ZSTR_ALLOCA_FREE(lcname, use_heap);
- return res;
+ return zend_hash_exists(classes, lcname);
}
#define YYFILL(n) do { } while (0)
@@ -446,7 +453,7 @@ static inline size_t parse_uiv(const unsigned char *p)
static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key);
-static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, zend_object *obj)
+static zend_always_inline int process_nested_array_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements)
{
if (var_hash) {
if ((*var_hash)->max_depth > 0 && (*var_hash)->cur_depth >= (*var_hash)->max_depth) {
@@ -463,7 +470,6 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab
while (elements-- > 0) {
zval key, *data, d, *old_data;
zend_ulong idx;
- zend_property_info *info = NULL;
ZVAL_UNDEF(&key);
@@ -475,118 +481,190 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab
data = NULL;
ZVAL_UNDEF(&d);
- if (!obj) {
- if (Z_TYPE(key) == IS_LONG) {
- idx = Z_LVAL(key);
+ if (Z_TYPE(key) == IS_LONG) {
+ idx = Z_LVAL(key);
numeric_key:
- if (UNEXPECTED((old_data = zend_hash_index_find(ht, idx)) != NULL)) {
- //??? update hash
- var_push_dtor(var_hash, old_data);
- data = zend_hash_index_update(ht, idx, &d);
- } else {
- data = zend_hash_index_add_new(ht, idx, &d);
- }
- } else if (Z_TYPE(key) == IS_STRING) {
- if (UNEXPECTED(ZEND_HANDLE_NUMERIC(Z_STR(key), idx))) {
- goto numeric_key;
- }
- if (UNEXPECTED((old_data = zend_hash_find(ht, Z_STR(key))) != NULL)) {
- //??? update hash
- var_push_dtor(var_hash, old_data);
- data = zend_hash_update(ht, Z_STR(key), &d);
- } else {
- data = zend_hash_add_new(ht, Z_STR(key), &d);
- }
+ if (UNEXPECTED((old_data = zend_hash_index_find(ht, idx)) != NULL)) {
+ //??? update hash
+ var_push_dtor(var_hash, old_data);
+ data = zend_hash_index_update(ht, idx, &d);
} else {
- zval_ptr_dtor(&key);
- goto failure;
+ data = zend_hash_index_add_new(ht, idx, &d);
+ }
+ } else if (Z_TYPE(key) == IS_STRING) {
+ if (UNEXPECTED(ZEND_HANDLE_NUMERIC(Z_STR(key), idx))) {
+ goto numeric_key;
+ }
+ if (UNEXPECTED((old_data = zend_hash_find(ht, Z_STR(key))) != NULL)) {
+ //??? update hash
+ var_push_dtor(var_hash, old_data);
+ data = zend_hash_update(ht, Z_STR(key), &d);
+ } else {
+ data = zend_hash_add_new(ht, Z_STR(key), &d);
+ }
+ } else {
+ zval_ptr_dtor(&key);
+ goto failure;
+ }
+
+ if (!php_var_unserialize_internal(data, p, max, var_hash, 0)) {
+ zval_ptr_dtor(&key);
+ goto failure;
+ }
+
+ if (BG(unserialize).level > 1) {
+ var_push_dtor(var_hash, data);
+ }
+ zval_ptr_dtor_str(&key);
+
+ if (elements && *(*p-1) != ';' && *(*p-1) != '}') {
+ (*p)--;
+ goto failure;
+ }
+ }
+
+ if (var_hash) {
+ (*var_hash)->cur_depth--;
+ }
+ return 1;
+
+failure:
+ if (var_hash) {
+ (*var_hash)->cur_depth--;
+ }
+ return 0;
+}
+
+static int is_property_visibility_changed(zend_class_entry *ce, zval *key)
+{
+ if (zend_hash_num_elements(&ce->properties_info) > 0) {
+ zend_property_info *existing_propinfo;
+ const char *unmangled_class = NULL;
+ const char *unmangled_prop;
+ size_t unmangled_prop_len;
+
+ if (UNEXPECTED(zend_unmangle_property_name_ex(Z_STR_P(key), &unmangled_class, &unmangled_prop, &unmangled_prop_len) == FAILURE)) {
+ zval_ptr_dtor_str(key);
+ return -1;
+ }
+
+ if (unmangled_class == NULL) {
+ existing_propinfo = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(key));
+ if (existing_propinfo != NULL) {
+ zval_ptr_dtor_str(key);
+ ZVAL_STR_COPY(key, existing_propinfo->name);
+ return 1;
}
} else {
- if (EXPECTED(Z_TYPE(key) == IS_STRING)) {
+ if (!strcmp(unmangled_class, "*")
+ || !strcasecmp(unmangled_class, ZSTR_VAL(ce->name))) {
+ existing_propinfo = zend_hash_str_find_ptr(
+ &ce->properties_info, unmangled_prop, unmangled_prop_len);
+ if (existing_propinfo != NULL) {
+ zval_ptr_dtor_str(key);
+ ZVAL_STR_COPY(key, existing_propinfo->name);
+ return 1;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+
+static zend_always_inline int process_nested_object_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, zend_object *obj)
+{
+ if (var_hash) {
+ if ((*var_hash)->max_depth > 0 && (*var_hash)->cur_depth >= (*var_hash)->max_depth) {
+ php_error_docref(NULL, E_WARNING,
+ "Maximum depth of " ZEND_LONG_FMT " exceeded. "
+ "The depth limit can be changed using the max_depth unserialize() option "
+ "or the unserialize_max_depth ini setting",
+ (*var_hash)->max_depth);
+ return 0;
+ }
+ (*var_hash)->cur_depth++;
+ }
+
+ while (elements-- > 0) {
+ zval key, *data, d, *old_data;
+ zend_property_info *info = NULL;
+
+ ZVAL_UNDEF(&key);
+
+ if (!php_var_unserialize_internal(&key, p, max, NULL, 1)) {
+ zval_ptr_dtor(&key);
+ goto failure;
+ }
+
+ data = NULL;
+ ZVAL_UNDEF(&d);
+
+ if (EXPECTED(Z_TYPE(key) == IS_STRING)) {
string_key:
- if (obj && zend_hash_num_elements(&obj->ce->properties_info) > 0) {
- zend_property_info *existing_propinfo;
- zend_string *new_key;
- const char *unmangled_class = NULL;
- const char *unmangled_prop;
- size_t unmangled_prop_len;
- zend_string *unmangled;
-
- if (UNEXPECTED(zend_unmangle_property_name_ex(Z_STR(key), &unmangled_class, &unmangled_prop, &unmangled_prop_len) == FAILURE)) {
- zval_ptr_dtor(&key);
- goto failure;
- }
+ if ((old_data = zend_hash_find(ht, Z_STR(key))) != NULL) {
+ if (Z_TYPE_P(old_data) == IS_INDIRECT) {
+declared_property:
+ /* This is a property with a declaration */
+ old_data = Z_INDIRECT_P(old_data);
+ info = zend_get_typed_property_info_for_slot(obj, old_data);
+ if (info) {
+ if (Z_ISREF_P(old_data)) {
+ /* If the value is overwritten, remove old type source from ref. */
+ ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(old_data), info);
+ }
- unmangled = zend_string_init(unmangled_prop, unmangled_prop_len, 0);
-
- existing_propinfo = zend_hash_find_ptr(&obj->ce->properties_info, unmangled);
- if ((unmangled_class == NULL || !strcmp(unmangled_class, "*") || !strcasecmp(unmangled_class, ZSTR_VAL(obj->ce->name)))
- && (existing_propinfo != NULL)
- && (existing_propinfo->flags & ZEND_ACC_PPP_MASK)) {
- if (existing_propinfo->flags & ZEND_ACC_PROTECTED) {
- new_key = zend_mangle_property_name(
- "*", 1, ZSTR_VAL(unmangled), ZSTR_LEN(unmangled), 0);
- zend_string_release_ex(unmangled, 0);
- } else if (existing_propinfo->flags & ZEND_ACC_PRIVATE) {
- if (unmangled_class != NULL && strcmp(unmangled_class, "*") != 0) {
- new_key = zend_mangle_property_name(
- unmangled_class, strlen(unmangled_class),
- ZSTR_VAL(unmangled), ZSTR_LEN(unmangled),
- 0);
- } else {
- new_key = zend_mangle_property_name(
- ZSTR_VAL(existing_propinfo->ce->name), ZSTR_LEN(existing_propinfo->ce->name),
- ZSTR_VAL(unmangled), ZSTR_LEN(unmangled),
- 0);
- }
- zend_string_release_ex(unmangled, 0);
- } else {
- ZEND_ASSERT(existing_propinfo->flags & ZEND_ACC_PUBLIC);
- new_key = unmangled;
+ if ((*var_hash)->ref_props) {
+ /* Remove old entry from ref_props table, if it exists. */
+ zend_hash_index_del(
+ (*var_hash)->ref_props, (zend_uintptr_t) old_data);
}
- zval_ptr_dtor_str(&key);
- ZVAL_STR(&key, new_key);
+ }
+ var_push_dtor(var_hash, old_data);
+ Z_TRY_DELREF_P(old_data);
+ ZVAL_UNDEF(old_data);
+ data = old_data;
+ } else {
+ int ret = is_property_visibility_changed(obj->ce, &key);
+
+ if (EXPECTED(!ret)) {
+ var_push_dtor(var_hash, old_data);
+ data = zend_hash_update(ht, Z_STR(key), &d);
+ } else if (ret < 0) {
+ goto failure;
} else {
- zend_string_release_ex(unmangled, 0);
+ goto second_try;
}
}
+ } else {
+ int ret = is_property_visibility_changed(obj->ce, &key);
- if ((old_data = zend_hash_find(ht, Z_STR(key))) != NULL) {
- if (Z_TYPE_P(old_data) == IS_INDIRECT) {
- /* This is a property with a declaration */
- old_data = Z_INDIRECT_P(old_data);
- info = zend_get_typed_property_info_for_slot(obj, old_data);
- if (info) {
- if (Z_ISREF_P(old_data)) {
- /* If the value is overwritten, remove old type source from ref. */
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(old_data), info);
- }
-
- if ((*var_hash)->ref_props) {
- /* Remove old entry from ref_props table, if it exists. */
- zend_hash_index_del(
- (*var_hash)->ref_props, (zend_uintptr_t) old_data);
- }
+ if (EXPECTED(!ret)) {
+ data = zend_hash_add_new(ht, Z_STR(key), &d);
+ } else if (ret < 0) {
+ goto failure;
+ } else {
+second_try:
+ if ((old_data = zend_hash_find(ht, Z_STR(key))) != NULL) {
+ if (Z_TYPE_P(old_data) == IS_INDIRECT) {
+ goto declared_property;
+ } else {
+ var_push_dtor(var_hash, old_data);
+ data = zend_hash_update(ht, Z_STR(key), &d);
}
- var_push_dtor(var_hash, old_data);
- Z_TRY_DELREF_P(old_data);
- ZVAL_COPY_VALUE(old_data, &d);
- data = old_data;
} else {
- var_push_dtor(var_hash, old_data);
- data = zend_hash_update_ind(ht, Z_STR(key), &d);
+ data = zend_hash_add_new(ht, Z_STR(key), &d);
}
- } else {
- data = zend_hash_add_new(ht, Z_STR(key), &d);
}
- } else if (Z_TYPE(key) == IS_LONG) {
- /* object properties should include no integers */
- convert_to_string(&key);
- goto string_key;
- } else {
- zval_ptr_dtor(&key);
- goto failure;
}
+ zval_ptr_dtor_str(&key);
+ } else if (Z_TYPE(key) == IS_LONG) {
+ /* object properties should include no integers */
+ convert_to_string(&key);
+ goto string_key;
+ } else {
+ zval_ptr_dtor(&key);
+ goto failure;
}
if (!php_var_unserialize_internal(data, p, max, var_hash, 0)) {
@@ -595,7 +673,6 @@ string_key:
* The data is still stored in the property. */
ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(data), info);
}
- zval_ptr_dtor(&key);
goto failure;
}
@@ -603,7 +680,6 @@ string_key:
if (!zend_verify_prop_assignable_by_ref(info, data, /* strict */ 1)) {
zval_ptr_dtor(data);
ZVAL_UNDEF(data);
- zval_ptr_dtor_nogc(&key);
goto failure;
}
@@ -624,7 +700,6 @@ string_key:
if (BG(unserialize).level > 1) {
var_push_dtor(var_hash, data);
}
- zval_ptr_dtor_str(&key);
if (elements && *(*p-1) != ';' && *(*p-1) != '}') {
(*p)--;
@@ -688,10 +763,10 @@ static inline int object_custom(UNSERIALIZE_PARAMETER, zend_class_entry *ce)
#ifdef PHP_WIN32
# pragma optimize("", off)
#endif
-static inline int object_common(UNSERIALIZE_PARAMETER, zend_long elements, zend_bool has_unserialize)
+static inline int object_common(UNSERIALIZE_PARAMETER, zend_long elements, bool has_unserialize)
{
HashTable *ht;
- zend_bool has_wakeup;
+ bool has_wakeup;
if (has_unserialize) {
zval ary, *tmp;
@@ -703,7 +778,7 @@ static inline int object_common(UNSERIALIZE_PARAMETER, zend_long elements, zend_
array_init_size(&ary, elements);
/* Avoid reallocation due to packed -> mixed conversion. */
zend_hash_real_init_mixed(Z_ARRVAL(ary));
- if (!process_nested_data(UNSERIALIZE_PASSTHRU, Z_ARRVAL(ary), elements, NULL)) {
+ if (!process_nested_array_data(UNSERIALIZE_PASSTHRU, Z_ARRVAL(ary), elements)) {
ZVAL_DEREF(rval);
GC_ADD_FLAGS(Z_OBJ_P(rval), IS_OBJ_DESTRUCTOR_CALLED);
zval_ptr_dtor(&ary);
@@ -723,7 +798,7 @@ static inline int object_common(UNSERIALIZE_PARAMETER, zend_long elements, zend_
}
has_wakeup = Z_OBJCE_P(rval) != PHP_IC_ENTRY
- && zend_hash_str_exists(&Z_OBJCE_P(rval)->function_table, "__wakeup", sizeof("__wakeup")-1);
+ && zend_hash_exists(&Z_OBJCE_P(rval)->function_table, ZSTR_KNOWN(ZEND_STR_WAKEUP));
ht = Z_OBJPROP_P(rval);
if (elements >= (zend_long)(HT_MAX_SIZE - zend_hash_num_elements(ht))) {
@@ -731,7 +806,7 @@ static inline int object_common(UNSERIALIZE_PARAMETER, zend_long elements, zend_
}
zend_hash_extend(ht, zend_hash_num_elements(ht) + elements, HT_FLAGS(ht) & HASH_FLAG_PACKED);
- if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, Z_OBJ_P(rval))) {
+ if (!process_nested_object_data(UNSERIALIZE_PASSTHRU, ht, elements, Z_OBJ_P(rval))) {
if (has_wakeup) {
ZVAL_DEREF(rval);
GC_ADD_FLAGS(Z_OBJ_P(rval), IS_OBJ_DESTRUCTOR_CALLED);
@@ -1001,7 +1076,7 @@ use_double:
*p = YYCURSOR;
if (!var_hash) return 0;
- if (elements < 0 || elements >= HT_MAX_SIZE || elements > max - YYCURSOR) {
+ if (elements < 0 || elements >= HT_MAX_SIZE || IS_FAKE_ELEM_COUNT(elements, max - YYCURSOR)) {
return 0;
}
@@ -1021,7 +1096,7 @@ use_double:
* prohibit "r:" references to non-objects, as we only generate them for objects. */
HT_ALLOW_COW_VIOLATION(Z_ARRVAL_P(rval));
- if (!process_nested_data(UNSERIALIZE_PASSTHRU, Z_ARRVAL_P(rval), elements, NULL)) {
+ if (!process_nested_array_data(UNSERIALIZE_PASSTHRU, Z_ARRVAL_P(rval), elements)) {
return 0;
}
@@ -1034,9 +1109,9 @@ object ":" uiv ":" ["] {
char *str;
zend_string *class_name;
zend_class_entry *ce;
- zend_bool incomplete_class = 0;
- zend_bool custom_object = 0;
- zend_bool has_unserialize = 0;
+ bool incomplete_class = 0;
+ bool custom_object = 0;
+ bool has_unserialize = 0;
zval user_func;
zval retval;
@@ -1067,22 +1142,55 @@ object ":" uiv ":" ["] {
return 0;
}
- class_name = zend_string_init(str, len, 0);
- if (!zend_is_valid_class_name(class_name)) {
- zend_string_release_ex(class_name, 0);
+ if (len == 0) {
+ /* empty class names are not allowed */
+ return 0;
+ }
+
+ if (str[0] == '\000') {
+ /* runtime definition keys are not allowed */
+ return 0;
+ }
+
+ if (str[0] == '\\') {
+ /* class name can't start from namespace separator */
return 0;
}
+ class_name = zend_string_init(str, len, 0);
+
do {
- if(!unserialize_allowed_class(class_name, var_hash)) {
+ zend_string *lc_name = zend_string_tolower(class_name);
+
+ if(!unserialize_allowed_class(lc_name, var_hash)) {
+ zend_string_release_ex(lc_name, 0);
+ if (!zend_is_valid_class_name(class_name)) {
+ zend_string_release_ex(class_name, 0);
+ return 0;
+ }
incomplete_class = 1;
ce = PHP_IC_ENTRY;
break;
}
+ ce = zend_hash_find_ptr(EG(class_table), lc_name);
+ if (ce
+ && (ce->ce_flags & ZEND_ACC_LINKED)
+ && !(ce->ce_flags & ZEND_ACC_ANON_CLASS)) {
+ zend_string_release_ex(lc_name, 0);
+ break;
+ }
+
+ if (!zend_is_valid_class_name(class_name)) {
+ zend_string_release_ex(lc_name, 0);
+ zend_string_release_ex(class_name, 0);
+ return 0;
+ }
+
/* Try to find class directly */
BG(serialize_lock)++;
- ce = zend_lookup_class(class_name);
+ ce = zend_lookup_class_ex(class_name, lc_name, 0);
+ zend_string_release_ex(lc_name, 0);
if (ce) {
BG(serialize_lock)--;
if (EG(exception)) {
@@ -1169,7 +1277,7 @@ object ":" uiv ":" ["] {
}
elements = parse_iv2(*p + 2, p);
- if (elements < 0 || elements > max - YYCURSOR) {
+ if (elements < 0 || IS_FAKE_ELEM_COUNT(elements, max - YYCURSOR)) {
zend_string_release_ex(class_name, 0);
return 0;
}
@@ -1201,6 +1309,86 @@ object ":" uiv ":" ["] {
return object_common(UNSERIALIZE_PASSTHRU, elements, has_unserialize);
}
+"E:" uiv ":" ["] {
+ if (!var_hash) return 0;
+
+ size_t len = parse_uiv(start + 2);
+ size_t maxlen = max - YYCURSOR;
+ if (maxlen < len || len == 0) {
+ *p = start + 2;
+ return 0;
+ }
+
+ char *str = (char *) YYCURSOR;
+ YYCURSOR += len;
+
+ if (*(YYCURSOR) != '"') {
+ *p = YYCURSOR;
+ return 0;
+ }
+ if (*(YYCURSOR+1) != ';') {
+ *p = YYCURSOR+1;
+ return 0;
+ }
+
+ char *colon_ptr = memchr(str, ':', len);
+ if (colon_ptr == NULL) {
+ php_error_docref(NULL, E_WARNING, "Invalid enum name '%.*s' (missing colon)", (int) len, str);
+ return 0;
+ }
+ size_t colon_pos = colon_ptr - str;
+
+ zend_string *enum_name = zend_string_init(str, colon_pos, 0);
+ zend_string *case_name = zend_string_init(&str[colon_pos + 1], len - colon_pos - 1, 0);
+
+ if (!zend_is_valid_class_name(enum_name)) {
+ goto fail;
+ }
+
+ zend_class_entry *ce = zend_lookup_class(enum_name);
+ if (!ce) {
+ php_error_docref(NULL, E_WARNING, "Class '%s' not found", ZSTR_VAL(enum_name));
+ goto fail;
+ }
+ if (!(ce->ce_flags & ZEND_ACC_ENUM)) {
+ php_error_docref(NULL, E_WARNING, "Class '%s' is not an enum", ZSTR_VAL(enum_name));
+ goto fail;
+ }
+
+ YYCURSOR += 2;
+ *p = YYCURSOR;
+
+ zend_class_constant *c = zend_hash_find_ptr(CE_CONSTANTS_TABLE(ce), case_name);
+ if (!c) {
+ php_error_docref(NULL, E_WARNING, "Undefined constant %s::%s", ZSTR_VAL(enum_name), ZSTR_VAL(case_name));
+ goto fail;
+ }
+
+ if (!(Z_ACCESS_FLAGS(c->value) & ZEND_CLASS_CONST_IS_CASE)) {
+ php_error_docref(NULL, E_WARNING, "%s::%s is not an enum case", ZSTR_VAL(enum_name), ZSTR_VAL(case_name));
+ goto fail;
+ }
+
+ zend_string_release_ex(enum_name, 0);
+ zend_string_release_ex(case_name, 0);
+
+ zval *value = &c->value;
+ if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
+ if (zval_update_constant_ex(value, c->ce) == FAILURE) {
+ return 0;
+ }
+ }
+ ZEND_ASSERT(Z_TYPE_P(value) == IS_OBJECT);
+ ZVAL_COPY(rval, value);
+
+ return 1;
+
+fail:
+ zend_string_release_ex(enum_name, 0);
+ zend_string_release_ex(case_name, 0);
+ return 0;
+}
+
"}" {
/* this is the case where we have less data than planned */
php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data");
diff --git a/ext/standard/versioning.c b/ext/standard/versioning.c
index dbdae6ecf7..f4f20c9850 100644
--- a/ext/standard/versioning.c
+++ b/ext/standard/versioning.c
@@ -203,37 +203,38 @@ php_version_compare(const char *orig_ver1, const char *orig_ver2)
PHP_FUNCTION(version_compare)
{
- char *v1, *v2, *op = NULL;
- size_t v1_len, v2_len, op_len = 0;
+ char *v1, *v2;
+ zend_string *op = NULL;
+ size_t v1_len, v2_len;
int compare;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_STRING(v1, v1_len)
Z_PARAM_STRING(v2, v2_len)
Z_PARAM_OPTIONAL
- Z_PARAM_STRING_OR_NULL(op, op_len)
+ Z_PARAM_STR_OR_NULL(op)
ZEND_PARSE_PARAMETERS_END();
compare = php_version_compare(v1, v2);
if (!op) {
RETURN_LONG(compare);
}
- if (!strncmp(op, "<", op_len) || !strncmp(op, "lt", op_len)) {
+ if (zend_string_equals_literal(op, "<") || zend_string_equals_literal(op, "lt")) {
RETURN_BOOL(compare == -1);
}
- if (!strncmp(op, "<=", op_len) || !strncmp(op, "le", op_len)) {
+ if (zend_string_equals_literal(op, "<=") || zend_string_equals_literal(op, "le")) {
RETURN_BOOL(compare != 1);
}
- if (!strncmp(op, ">", op_len) || !strncmp(op, "gt", op_len)) {
+ if (zend_string_equals_literal(op, ">") || zend_string_equals_literal(op, "gt")) {
RETURN_BOOL(compare == 1);
}
- if (!strncmp(op, ">=", op_len) || !strncmp(op, "ge", op_len)) {
+ if (zend_string_equals_literal(op, ">=") || zend_string_equals_literal(op, "ge")) {
RETURN_BOOL(compare != -1);
}
- if (!strncmp(op, "==", op_len) || !strncmp(op, "=", op_len) || !strncmp(op, "eq", op_len)) {
+ if (zend_string_equals_literal(op, "==") || zend_string_equals_literal(op, "=") || zend_string_equals_literal(op, "eq")) {
RETURN_BOOL(compare == 0);
}
- if (!strncmp(op, "!=", op_len) || !strncmp(op, "<>", op_len) || !strncmp(op, "ne", op_len)) {
+ if (zend_string_equals_literal(op, "!=") || zend_string_equals_literal(op, "<>") || zend_string_equals_literal(op, "ne")) {
RETURN_BOOL(compare != 0);
}
diff --git a/ext/sysvmsg/sysvmsg.c b/ext/sysvmsg/sysvmsg.c
index a74a149783..c19e4e7d5a 100644
--- a/ext/sysvmsg/sysvmsg.c
+++ b/ext/sysvmsg/sysvmsg.c
@@ -108,10 +108,7 @@ static void sysvmsg_queue_free_obj(zend_object *object)
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(sysvmsg)
{
- zend_class_entry ce;
- INIT_CLASS_ENTRY(ce, "SysvMessageQueue", class_SysvMessageQueue_methods);
- sysvmsg_queue_ce = zend_register_internal_class(&ce);
- sysvmsg_queue_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ sysvmsg_queue_ce = register_class_SysvMessageQueue();
sysvmsg_queue_ce->create_object = sysvmsg_queue_create_object;
sysvmsg_queue_ce->serialize = zend_class_serialize_deny;
sysvmsg_queue_ce->unserialize = zend_class_unserialize_deny;
@@ -282,7 +279,7 @@ PHP_FUNCTION(msg_receive)
zval *out_message, *queue, *out_msgtype, *zerrcode = NULL;
zend_long desiredmsgtype, maxsize, flags = 0;
zend_long realflags = 0;
- zend_bool do_unserialize = 1;
+ bool do_unserialize = 1;
sysvmsg_queue_t *mq = NULL;
struct php_msgbuf *messagebuffer = NULL; /* buffer to transmit */
int result;
@@ -364,7 +361,7 @@ PHP_FUNCTION(msg_send)
{
zval *message, *queue, *zerror=NULL;
zend_long msgtype;
- zend_bool do_serialize = 1, blocking = 1;
+ bool do_serialize = 1, blocking = 1;
sysvmsg_queue_t * mq = NULL;
struct php_msgbuf * messagebuffer = NULL; /* buffer to transmit */
int result;
diff --git a/ext/sysvmsg/sysvmsg.stub.php b/ext/sysvmsg/sysvmsg.stub.php
index 2a0c9cdc95..5ec72a4837 100644
--- a/ext/sysvmsg/sysvmsg.stub.php
+++ b/ext/sysvmsg/sysvmsg.stub.php
@@ -1,7 +1,8 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+/** @strict-properties */
final class SysvMessageQueue
{
}
diff --git a/ext/sysvmsg/sysvmsg_arginfo.h b/ext/sysvmsg/sysvmsg_arginfo.h
index 804f1768b3..3cef169fb1 100644
--- a/ext/sysvmsg/sysvmsg_arginfo.h
+++ b/ext/sysvmsg/sysvmsg_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 3f918caddccfebee1f1048abd4a23672724436ad */
+ * Stub hash: 6744b81ba4b0b5db62ffe04255c35519e17be7c2 */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_msg_get_queue, 0, 1, SysvMessageQueue, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, key, IS_LONG, 0)
@@ -68,3 +68,14 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_SysvMessageQueue_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SysvMessageQueue(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SysvMessageQueue", class_SysvMessageQueue_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/sysvsem/sysvsem.c b/ext/sysvsem/sysvsem.c
index 0d838d0c89..da20439d0d 100644
--- a/ext/sysvsem/sysvsem.c
+++ b/ext/sysvsem/sysvsem.c
@@ -151,10 +151,7 @@ static void sysvsem_free_obj(zend_object *object)
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(sysvsem)
{
- zend_class_entry ce;
- INIT_CLASS_ENTRY(ce, "SysvSemaphore", class_SysvSemaphore_methods);
- sysvsem_ce = zend_register_internal_class(&ce);
- sysvsem_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ sysvsem_ce = register_class_SysvSemaphore();
sysvsem_ce->create_object = sysvsem_create_object;
sysvsem_ce->serialize = zend_class_serialize_deny;
sysvsem_ce->unserialize = zend_class_unserialize_deny;
@@ -189,7 +186,7 @@ PHP_MINFO_FUNCTION(sysvsem)
PHP_FUNCTION(sem_get)
{
zend_long key, max_acquire = 1, perm = 0666;
- zend_bool auto_release = 1;
+ bool auto_release = 1;
int semid;
struct sembuf sop[3];
int count;
@@ -299,7 +296,7 @@ PHP_FUNCTION(sem_get)
static void php_sysvsem_semop(INTERNAL_FUNCTION_PARAMETERS, int acquire)
{
zval *arg_id;
- zend_bool nowait = 0;
+ bool nowait = 0;
sysvsem_sem *sem_ptr;
struct sembuf sop;
diff --git a/ext/sysvsem/sysvsem.stub.php b/ext/sysvsem/sysvsem.stub.php
index 8da71b09fb..40cb9b5d3e 100644
--- a/ext/sysvsem/sysvsem.stub.php
+++ b/ext/sysvsem/sysvsem.stub.php
@@ -1,7 +1,8 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+/** @strict-properties */
final class SysvSemaphore
{
}
diff --git a/ext/sysvsem/sysvsem_arginfo.h b/ext/sysvsem/sysvsem_arginfo.h
index 8d6f0ac409..54798ff5e5 100644
--- a/ext/sysvsem/sysvsem_arginfo.h
+++ b/ext/sysvsem/sysvsem_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 745e7cf135c7d1c9ad09d1ea1ab6cf2a8181433a */
+ * Stub hash: dd7be82f586ef5f9221268ae90e959e8cccdcacf */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_sem_get, 0, 1, SysvSemaphore, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, key, IS_LONG, 0)
@@ -38,3 +38,14 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_SysvSemaphore_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SysvSemaphore(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SysvSemaphore", class_SysvSemaphore_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/sysvshm/sysvshm.c b/ext/sysvshm/sysvshm.c
index c2767aad47..9f5b57e944 100644
--- a/ext/sysvshm/sysvshm.c
+++ b/ext/sysvshm/sysvshm.c
@@ -99,10 +99,7 @@ static int php_remove_shm_data(sysvshm_chunk_head *ptr, zend_long shm_varpos);
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(sysvshm)
{
- zend_class_entry ce;
- INIT_CLASS_ENTRY(ce, "SysvSharedMemory", class_SysvSharedMemory_methods);
- sysvshm_ce = zend_register_internal_class(&ce);
- sysvshm_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ sysvshm_ce = register_class_SysvSharedMemory();
sysvshm_ce->create_object = sysvshm_create_object;
sysvshm_ce->serialize = zend_class_serialize_deny;
sysvshm_ce->unserialize = zend_class_unserialize_deny;
@@ -137,7 +134,7 @@ PHP_FUNCTION(shm_attach)
char *shm_ptr;
sysvshm_chunk_head *chunk_ptr;
zend_long shm_key, shm_id, shm_size, shm_flag = 0666;
- zend_bool shm_size_is_null = 1;
+ bool shm_size_is_null = 1;
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|l!l", &shm_key, &shm_size, &shm_size_is_null, &shm_flag)) {
RETURN_THROWS();
diff --git a/ext/sysvshm/sysvshm.stub.php b/ext/sysvshm/sysvshm.stub.php
index 4f2799a349..d874435b06 100644
--- a/ext/sysvshm/sysvshm.stub.php
+++ b/ext/sysvshm/sysvshm.stub.php
@@ -1,7 +1,8 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+/** @strict-properties */
final class SysvSharedMemory
{
}
diff --git a/ext/sysvshm/sysvshm_arginfo.h b/ext/sysvshm/sysvshm_arginfo.h
index d6f09d1426..7dcb9b4b1c 100644
--- a/ext/sysvshm/sysvshm_arginfo.h
+++ b/ext/sysvshm/sysvshm_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 12f78387e5b7c436b608dbecc4c6b3eec82b6db1 */
+ * Stub hash: 033437611b589798fe9771e6dd2e95d2fbc999d4 */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_shm_attach, 0, 1, SysvSharedMemory, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, key, IS_LONG, 0)
@@ -56,3 +56,14 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_SysvSharedMemory_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_SysvSharedMemory(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "SysvSharedMemory", class_SysvSharedMemory_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/tidy/php_tidy.h b/ext/tidy/php_tidy.h
index ab9e90eb93..35869482e1 100644
--- a/ext/tidy/php_tidy.h
+++ b/ext/tidy/php_tidy.h
@@ -25,7 +25,7 @@ extern zend_module_entry tidy_module_entry;
ZEND_BEGIN_MODULE_GLOBALS(tidy)
char *default_config;
- zend_bool clean_output;
+ bool clean_output;
ZEND_END_MODULE_GLOBALS(tidy)
#define TG(v) ZEND_MODULE_GLOBALS_ACCESSOR(tidy, v)
diff --git a/ext/tidy/tidy.c b/ext/tidy/tidy.c
index 856a8a2f23..561ece618b 100644
--- a/ext/tidy/tidy.c
+++ b/ext/tidy/tidy.c
@@ -89,28 +89,10 @@
} \
}
-#define REGISTER_TIDY_CLASS(classname, name, parent, __flags) \
- { \
- zend_class_entry ce; \
- INIT_CLASS_ENTRY(ce, # classname, class_ ## classname ## _methods); \
- ce.create_object = tidy_object_new_ ## name; \
- tidy_ce_ ## name = zend_register_internal_class_ex(&ce, parent); \
- tidy_ce_ ## name->ce_flags |= __flags; \
- memcpy(&tidy_object_handlers_ ## name, &std_object_handlers, sizeof(zend_object_handlers)); \
- tidy_object_handlers_ ## name.clone_obj = NULL; \
- }
#define TIDY_TAG_CONST(tag) REGISTER_LONG_CONSTANT("TIDY_TAG_" #tag, TidyTag_##tag, CONST_CS | CONST_PERSISTENT)
#define TIDY_NODE_CONST(name, type) REGISTER_LONG_CONSTANT("TIDY_NODETYPE_" #name, TidyNode_##type, CONST_CS | CONST_PERSISTENT)
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
#define ADD_PROPERTY_STRING(_table, _key, _string) \
{ \
zval tmp; \
@@ -205,7 +187,7 @@ static inline PHPTidyObj *php_tidy_fetch_object(zend_object *obj) {
/* }}} */
/* {{{ ext/tidy prototypes */
-static zend_string *php_tidy_file_to_mem(char *, zend_bool);
+static zend_string *php_tidy_file_to_mem(char *, bool);
static void tidy_object_free_storage(zend_object *);
static zend_object *tidy_object_new_node(zend_class_entry *);
static zend_object *tidy_object_new_doc(zend_class_entry *);
@@ -335,7 +317,7 @@ static int _php_tidy_set_tidy_opt(TidyDoc doc, char *optname, zval *value)
return FAILURE;
}
-static void php_tidy_quick_repair(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_file)
+static void php_tidy_quick_repair(INTERNAL_FUNCTION_PARAMETERS, bool is_file)
{
char *enc = NULL;
size_t enc_len = 0;
@@ -345,7 +327,7 @@ static void php_tidy_quick_repair(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_fil
HashTable *config_ht = NULL;
if (is_file) {
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
ZEND_PARSE_PARAMETERS_START(1, 4)
Z_PARAM_PATH_STR(arg1)
@@ -432,7 +414,7 @@ static void php_tidy_quick_repair(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_fil
tidyRelease(doc);
}
-static zend_string *php_tidy_file_to_mem(char *filename, zend_bool use_include_path)
+static zend_string *php_tidy_file_to_mem(char *filename, bool use_include_path)
{
php_stream *stream;
zend_string *data = NULL;
@@ -770,9 +752,7 @@ static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetyp
node = tidyGetBody(obj->ptdoc->doc);
break;
- default:
- RETURN_NULL();
- break;
+ EMPTY_SWITCH_DEFAULT_CASE()
}
if (!node) {
@@ -836,8 +816,16 @@ static PHP_MINIT_FUNCTION(tidy)
tidySetPanicCall(php_tidy_panic);
REGISTER_INI_ENTRIES();
- REGISTER_TIDY_CLASS(tidy, doc, NULL, 0);
- REGISTER_TIDY_CLASS(tidyNode, node, NULL, ZEND_ACC_FINAL);
+
+ tidy_ce_doc = register_class_tidy();
+ tidy_ce_doc->create_object = tidy_object_new_doc;
+ memcpy(&tidy_object_handlers_doc, &std_object_handlers, sizeof(zend_object_handlers));
+ tidy_object_handlers_doc.clone_obj = NULL;
+
+ tidy_ce_node = register_class_tidyNode();
+ tidy_ce_node->create_object = tidy_object_new_node;
+ memcpy(&tidy_object_handlers_node, &std_object_handlers, sizeof(zend_object_handlers));
+ tidy_object_handlers_node.clone_obj = NULL;
tidy_object_handlers_doc.cast_object = tidy_doc_cast_handler;
tidy_object_handlers_node.cast_object = tidy_node_cast_handler;
@@ -897,16 +885,16 @@ static PHP_MINFO_FUNCTION(tidy)
static PHP_INI_MH(php_tidy_set_clean_output)
{
int status;
- zend_bool value;
+ bool value;
if (ZSTR_LEN(new_value)==2 && strcasecmp("on", ZSTR_VAL(new_value))==0) {
- value = (zend_bool) 1;
+ value = (bool) 1;
} else if (ZSTR_LEN(new_value)==3 && strcasecmp("yes", ZSTR_VAL(new_value))==0) {
- value = (zend_bool) 1;
+ value = (bool) 1;
} else if (ZSTR_LEN(new_value)==4 && strcasecmp("true", ZSTR_VAL(new_value))==0) {
- value = (zend_bool) 1;
+ value = (bool) 1;
} else {
- value = (zend_bool) atoi(ZSTR_VAL(new_value));
+ value = (bool) atoi(ZSTR_VAL(new_value));
}
if (stage == PHP_INI_STAGE_RUNTIME) {
@@ -1065,7 +1053,7 @@ PHP_FUNCTION(tidy_parse_file)
{
char *enc = NULL;
size_t enc_len = 0;
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
zend_string *inputfile, *contents, *options_str = NULL;
HashTable *options_ht = NULL;
@@ -1120,14 +1108,14 @@ PHP_FUNCTION(tidy_clean_repair)
/* {{{ Repair a string using an optionally provided configuration file */
PHP_FUNCTION(tidy_repair_string)
{
- php_tidy_quick_repair(INTERNAL_FUNCTION_PARAM_PASSTHRU, FALSE);
+ php_tidy_quick_repair(INTERNAL_FUNCTION_PARAM_PASSTHRU, false);
}
/* }}} */
/* {{{ Repair a file using an optionally provided configuration file */
PHP_FUNCTION(tidy_repair_file)
{
- php_tidy_quick_repair(INTERNAL_FUNCTION_PARAM_PASSTHRU, TRUE);
+ php_tidy_quick_repair(INTERNAL_FUNCTION_PARAM_PASSTHRU, true);
}
/* }}} */
@@ -1359,7 +1347,7 @@ PHP_METHOD(tidy, __construct)
{
char *enc = NULL;
size_t enc_len = 0;
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
HashTable *options_ht = NULL;
zend_string *contents, *inputfile = NULL, *options_str = NULL;
PHPTidyObj *obj;
@@ -1398,7 +1386,7 @@ PHP_METHOD(tidy, parseFile)
{
char *enc = NULL;
size_t enc_len = 0;
- zend_bool use_include_path = 0;
+ bool use_include_path = 0;
HashTable *options_ht = NULL;
zend_string *inputfile, *contents, *options_str = NULL;
PHPTidyObj *obj;
diff --git a/ext/tidy/tidy.stub.php b/ext/tidy/tidy.stub.php
index 4030fa954d..74867f6cd7 100644
--- a/ext/tidy/tidy.stub.php
+++ b/ext/tidy/tidy.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function tidy_parse_string(string $string, array|string|null $config = null, ?string $encoding = null): tidy|false {}
diff --git a/ext/tidy/tidy_arginfo.h b/ext/tidy/tidy_arginfo.h
index 45f824865b..30c9f1af69 100644
--- a/ext/tidy/tidy_arginfo.h
+++ b/ext/tidy/tidy_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: c4bbc901ca156da7cf0cbcc3c4019c7d3886959f */
+ * Stub hash: 75995fe0aad02540f1bde99495a188ae4ab7c0ac */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_tidy_parse_string, 0, 1, tidy, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
@@ -281,3 +281,24 @@ static const zend_function_entry class_tidyNode_methods[] = {
ZEND_ME(tidyNode, getParent, arginfo_class_tidyNode_getParent, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_tidy(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "tidy", class_tidy_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_tidyNode(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "tidyNode", class_tidyNode_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
diff --git a/ext/tokenizer/Makefile.frag b/ext/tokenizer/Makefile.frag
index f971394741..2349f803e5 100644
--- a/ext/tokenizer/Makefile.frag
+++ b/ext/tokenizer/Makefile.frag
@@ -1,4 +1,7 @@
$(top_srcdir)/Zend/zend_language_parser.c:
$(top_srcdir)/Zend/zend_language_scanner.c:
-$(top_srcdir)/ext/tokenizer/tokenizer_data.c: $(top_srcdir)/Zend/zend_language_parser.h
+$(top_srcdir)/ext/tokenizer/tokenizer_data.c: $(top_srcdir)/Zend/zend_language_parser.y $(top_srcdir)/Zend/zend_language_parser.h
+ @if test ! -z "$(PHP)"; then \
+ $(PHP) $(srcdir)/tokenizer_data_gen.php; \
+ fi;
$(builddir)/tokenizer.lo: $(top_srcdir)/Zend/zend_language_parser.c $(top_srcdir)/Zend/zend_language_scanner.c
diff --git a/ext/tokenizer/tokenizer.c b/ext/tokenizer/tokenizer.c
index 7567a270af..ed3e8a6eab 100644
--- a/ext/tokenizer/tokenizer.c
+++ b/ext/tokenizer/tokenizer.c
@@ -89,7 +89,7 @@ static zend_string *php_token_get_text(zval *obj) {
return Z_STR_P(text_zval);
}
-static zend_bool tokenize_common(
+static bool tokenize_common(
zval *return_value, zend_string *source, zend_long flags, zend_class_entry *token_class);
PHP_METHOD(PhpToken, tokenize)
@@ -251,37 +251,9 @@ PHP_METHOD(PhpToken, __toString)
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(tokenizer)
{
- zend_class_entry ce;
- zend_string *name;
- zval default_val;
- ZVAL_UNDEF(&default_val);
-
tokenizer_register_constants(INIT_FUNC_ARGS_PASSTHRU);
tokenizer_token_get_all_register_constants(INIT_FUNC_ARGS_PASSTHRU);
-
- INIT_CLASS_ENTRY(ce, "PhpToken", class_PhpToken_methods);
- php_token_ce = zend_register_internal_class(&ce);
- zend_class_implements(php_token_ce, 1, zend_ce_stringable);
-
- name = zend_string_init("id", sizeof("id") - 1, 1);
- zend_declare_typed_property(php_token_ce, name, &default_val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
- zend_string_release(name);
-
- name = zend_string_init("text", sizeof("text") - 1, 1);
- zend_declare_typed_property(php_token_ce, name, &default_val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
- zend_string_release(name);
-
- name = zend_string_init("line", sizeof("line") - 1, 1);
- zend_declare_typed_property(php_token_ce, name, &default_val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
- zend_string_release(name);
-
- name = zend_string_init("pos", sizeof("pos") - 1, 1);
- zend_declare_typed_property(php_token_ce, name, &default_val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
- zend_string_release(name);
+ php_token_ce = register_class_PhpToken(zend_ce_stringable);
return SUCCESS;
}
@@ -345,7 +317,7 @@ static void add_token(
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &token);
}
-static zend_bool tokenize(zval *return_value, zend_string *source, zend_class_entry *token_class)
+static bool tokenize(zval *return_value, zend_string *source, zend_class_entry *token_class)
{
zval source_zval;
zend_lex_state original_lex_state;
@@ -358,7 +330,7 @@ static zend_bool tokenize(zval *return_value, zend_string *source, zend_class_en
ZVAL_STR_COPY(&source_zval, source);
zend_save_lexical_state(&original_lex_state);
- zend_prepare_string_for_scanning(&source_zval, "");
+ zend_prepare_string_for_scanning(&source_zval, ZSTR_EMPTY_ALLOC());
LANG_SCNG(yy_state) = yycINITIAL;
zend_hash_init(&interned_strings, 0, NULL, NULL, 0);
@@ -477,15 +449,15 @@ void on_event(
}
}
-static zend_bool tokenize_parse(
+static bool tokenize_parse(
zval *return_value, zend_string *source, zend_class_entry *token_class)
{
zval source_zval;
struct event_context ctx;
zval token_stream;
zend_lex_state original_lex_state;
- zend_bool original_in_compilation;
- zend_bool success;
+ bool original_in_compilation;
+ bool success;
ZVAL_STR_COPY(&source_zval, source);
@@ -493,7 +465,7 @@ static zend_bool tokenize_parse(
CG(in_compilation) = 1;
zend_save_lexical_state(&original_lex_state);
- zend_prepare_string_for_scanning(&source_zval, "");
+ zend_prepare_string_for_scanning(&source_zval, ZSTR_EMPTY_ALLOC());
array_init(&token_stream);
ctx.tokens = &token_stream;
@@ -523,7 +495,7 @@ static zend_bool tokenize_parse(
return success;
}
-static zend_bool tokenize_common(
+static bool tokenize_common(
zval *return_value, zend_string *source, zend_long flags, zend_class_entry *token_class)
{
if (flags & TOKEN_PARSE) {
diff --git a/ext/tokenizer/tokenizer.stub.php b/ext/tokenizer/tokenizer.stub.php
index c329ef4932..cac79b4280 100644
--- a/ext/tokenizer/tokenizer.stub.php
+++ b/ext/tokenizer/tokenizer.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function token_get_all(string $code, int $flags = 0): array {}
@@ -8,6 +8,11 @@ function token_name(int $id): string {}
class PhpToken implements Stringable
{
+ public int $id;
+ public string $text;
+ public int $line;
+ public int $pos;
+
/** @return static[] */
public static function tokenize(string $code, int $flags = 0): array {}
diff --git a/ext/tokenizer/tokenizer_arginfo.h b/ext/tokenizer/tokenizer_arginfo.h
index 01d37d406e..4b1aac3824 100644
--- a/ext/tokenizer/tokenizer_arginfo.h
+++ b/ext/tokenizer/tokenizer_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: a06da9ea0191ed78ee7af8f0d9eaccb17dfa4b20 */
+ * Stub hash: 60b4c809624eb4c1ef610e5c5820acfc87f6b07f */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_token_get_all, 0, 1, IS_ARRAY, 0)
ZEND_ARG_TYPE_INFO(0, code, IS_STRING, 0)
@@ -59,3 +59,38 @@ static const zend_function_entry class_PhpToken_methods[] = {
ZEND_ME(PhpToken, __toString, arginfo_class_PhpToken___toString, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_PhpToken(zend_class_entry *class_entry_Stringable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "PhpToken", class_PhpToken_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Stringable);
+
+ zval property_id_default_value;
+ ZVAL_UNDEF(&property_id_default_value);
+ zend_string *property_id_name = zend_string_init("id", sizeof("id") - 1, 1);
+ zend_declare_typed_property(class_entry, property_id_name, &property_id_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_id_name);
+
+ zval property_text_default_value;
+ ZVAL_UNDEF(&property_text_default_value);
+ zend_string *property_text_name = zend_string_init("text", sizeof("text") - 1, 1);
+ zend_declare_typed_property(class_entry, property_text_name, &property_text_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_text_name);
+
+ zval property_line_default_value;
+ ZVAL_UNDEF(&property_line_default_value);
+ zend_string *property_line_name = zend_string_init("line", sizeof("line") - 1, 1);
+ zend_declare_typed_property(class_entry, property_line_name, &property_line_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_line_name);
+
+ zval property_pos_default_value;
+ ZVAL_UNDEF(&property_pos_default_value);
+ zend_string *property_pos_name = zend_string_init("pos", sizeof("pos") - 1, 1);
+ zend_declare_typed_property(class_entry, property_pos_name, &property_pos_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_pos_name);
+
+ return class_entry;
+}
diff --git a/ext/tokenizer/tokenizer_data.c b/ext/tokenizer/tokenizer_data.c
index 5699c57566..96571bb1d7 100644
--- a/ext/tokenizer/tokenizer_data.c
+++ b/ext/tokenizer/tokenizer_data.c
@@ -16,7 +16,7 @@
/*
DO NOT EDIT THIS FILE!
- This file is generated using tokenizer_data_gen.sh
+ This file is generated using tokenizer_data_gen.php
*/
#include "php.h"
@@ -134,6 +134,7 @@ void tokenizer_register_constants(INIT_FUNC_ARGS) {
REGISTER_LONG_CONSTANT("T_CLASS", T_CLASS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_TRAIT", T_TRAIT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_INTERFACE", T_INTERFACE, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("T_ENUM", T_ENUM, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_EXTENDS", T_EXTENDS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_IMPLEMENTS", T_IMPLEMENTS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("T_NAMESPACE", T_NAMESPACE, CONST_CS | CONST_PERSISTENT);
@@ -283,6 +284,7 @@ char *get_token_type_name(int token_type)
case T_CLASS: return "T_CLASS";
case T_TRAIT: return "T_TRAIT";
case T_INTERFACE: return "T_INTERFACE";
+ case T_ENUM: return "T_ENUM";
case T_EXTENDS: return "T_EXTENDS";
case T_IMPLEMENTS: return "T_IMPLEMENTS";
case T_NAMESPACE: return "T_NAMESPACE";
diff --git a/ext/tokenizer/tokenizer_data_gen.php b/ext/tokenizer/tokenizer_data_gen.php
new file mode 100644
index 0000000000..8af1878103
--- /dev/null
+++ b/ext/tokenizer/tokenizer_data_gen.php
@@ -0,0 +1,93 @@
+<?php
+
+$rootDir = __DIR__ . '/../..';
+$infile = $rootDir . '/Zend/zend_language_parser.h';
+$outfile = $rootDir . '/ext/tokenizer/tokenizer_data.c';
+
+if (!file_exists($infile)) {
+ fwrite(STDERR, <<<ERROR
+$infile is missing.
+
+Please, generate the PHP parser files by scripts/dev/genfiles
+or by running the ./configure build step.
+ERROR);
+ exit(1);
+}
+
+$result = '';
+
+$result .= <<<CODE
+/*
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Johannes Schlueter <johannes@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/*
+ DO NOT EDIT THIS FILE!
+ This file is generated using tokenizer_data_gen.php
+*/
+
+#include "php.h"
+#include "zend.h"
+#include <zend_language_parser.h>
+
+
+void tokenizer_register_constants(INIT_FUNC_ARGS) {
+
+CODE;
+
+$incontent = file_get_contents($infile);
+preg_match_all('(^ (?<token_name>T_.*?)\b)m', $incontent, $matches);
+
+foreach ($matches['token_name'] as $tokenName) {
+ if ($tokenName === 'T_NOELSE' || $tokenName === 'T_ERROR') {
+ continue;
+ }
+ $result .= "\tREGISTER_LONG_CONSTANT(\"$tokenName\", $tokenName, CONST_CS | CONST_PERSISTENT);\n";
+}
+$result .= "\tREGISTER_LONG_CONSTANT(\"T_DOUBLE_COLON\", T_PAAMAYIM_NEKUDOTAYIM, CONST_CS | CONST_PERSISTENT);\n";
+
+$result .= <<<CODE
+}
+
+char *get_token_type_name(int token_type)
+{
+\tswitch (token_type) {
+
+
+CODE;
+
+foreach ($matches['token_name'] as $tokenName) {
+ if ($tokenName === 'T_NOELSE' || $tokenName === 'T_ERROR') {
+ continue;
+ }
+ if ($tokenName === 'T_PAAMAYIM_NEKUDOTAYIM') {
+ $result .= "\t\tcase T_PAAMAYIM_NEKUDOTAYIM: return \"T_DOUBLE_COLON\";\n";
+ } else {
+ $result .= "\t\tcase $tokenName: return \"$tokenName\";\n";
+ }
+}
+
+$result .= <<<CODE
+
+\t}
+\treturn NULL;
+}
+
+
+CODE;
+
+file_put_contents($outfile, $result);
+
+echo "Wrote $outfile\n";
diff --git a/ext/tokenizer/tokenizer_data_gen.sh b/ext/tokenizer/tokenizer_data_gen.sh
deleted file mode 100755
index 1dbe77d2e7..0000000000
--- a/ext/tokenizer/tokenizer_data_gen.sh
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/bin/sh
-#
-# Generate the tokenizer extension data file from the parser header file.
-
-# Go to project root directory.
-cd $(CDPATH= cd -- "$(dirname -- "$0")/../../" && pwd -P)
-
-infile="Zend/zend_language_parser.h"
-outfile="ext/tokenizer/tokenizer_data.c"
-
-if test ! -f "$infile"; then
- echo "$infile is missing." >&2
- echo "" >&2
- echo "Please, generate the PHP parser files by scripts/dev/genfiles" >&2
- echo "or by running the ./configure build step." >&2
- exit 1
-fi
-
-echo '/*
- +----------------------------------------------------------------------+
- | Copyright (c) The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.01 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | http://www.php.net/license/3_01.txt |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Author: Johannes Schlueter <johannes@php.net> |
- +----------------------------------------------------------------------+
-*/
-
-/*
- DO NOT EDIT THIS FILE!
- This file is generated using tokenizer_data_gen.sh
-*/
-
-#include "php.h"
-#include "zend.h"
-#include <zend_language_parser.h>
-
-' > $outfile
-
-echo 'void tokenizer_register_constants(INIT_FUNC_ARGS) {' >> $outfile
-awk '
- /^ T_(NOELSE|ERROR)/ { next }
- /^ T_/ { print " REGISTER_LONG_CONSTANT(\"" $1 "\", " $1 ", CONST_CS | CONST_PERSISTENT);" }
-' < $infile >> $outfile
-echo ' REGISTER_LONG_CONSTANT("T_DOUBLE_COLON", T_PAAMAYIM_NEKUDOTAYIM, CONST_CS | CONST_PERSISTENT);' >> $outfile
-echo '}' >> $outfile
-
-
-echo '
-char *get_token_type_name(int token_type)
-{
- switch (token_type) {
-' >> $outfile
-
-awk '
- /^ T_PAAMAYIM_NEKUDOTAYIM/ {
- print " case T_PAAMAYIM_NEKUDOTAYIM: return \"T_DOUBLE_COLON\";"
- next
- }
- /^ T_(NOELSE|ERROR)/ { next }
- /^ T_/ {
- print " case " $1 ": return \"" $1 "\";"
- }
-' < $infile >> $outfile
-
-echo '
- }
- return NULL;
-}
-' >> $outfile
-
-echo "Wrote $outfile"
diff --git a/ext/xml/xml.c b/ext/xml/xml.c
index 307608ae8b..3f7a81e6f0 100644
--- a/ext/xml/xml.c
+++ b/ext/xml/xml.c
@@ -253,11 +253,8 @@ static void php_xml_free_wrapper(void *ptr)
PHP_MINIT_FUNCTION(xml)
{
- zend_class_entry ce;
- INIT_CLASS_ENTRY(ce, "XMLParser", class_XMLParser_methods);
- xml_parser_ce = zend_register_internal_class(&ce);
+ xml_parser_ce = register_class_XMLParser();
xml_parser_ce->create_object = xml_parser_create_object;
- xml_parser_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
xml_parser_ce->serialize = zend_class_serialize_deny;
xml_parser_ce->unserialize = zend_class_unserialize_deny;
@@ -438,7 +435,7 @@ static void xml_set_handler(zval *handler, zval *data)
/* IS_ARRAY might indicate that we're using array($obj, 'method') syntax */
if (Z_TYPE_P(data) != IS_ARRAY && Z_TYPE_P(data) != IS_OBJECT) {
- convert_to_string_ex(data);
+ convert_to_string(data);
if (Z_STRLEN_P(data) == 0) {
ZVAL_UNDEF(handler);
return;
@@ -816,7 +813,7 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len)
ZEND_HASH_REVERSE_FOREACH_VAL(Z_ARRVAL(parser->data), curtag) {
if ((mytype = zend_hash_str_find(Z_ARRVAL_P(curtag),"type", sizeof("type") - 1))) {
- if (!strcmp(Z_STRVAL_P(mytype), "cdata")) {
+ if (zend_string_equals_literal(Z_STR_P(mytype), "cdata")) {
if ((myval = zend_hash_str_find(Z_ARRVAL_P(curtag), "value", sizeof("value") - 1))) {
int newlen = Z_STRLEN_P(myval) + ZSTR_LEN(decoded_value);
Z_STR_P(myval) = zend_string_extend(Z_STR_P(myval), newlen, 0);
@@ -1250,7 +1247,7 @@ PHP_FUNCTION(xml_parse)
char *data;
size_t data_len;
int ret;
- zend_bool isFinal = 0;
+ bool isFinal = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|b", &pind, xml_parser_ce, &data, &data_len, &isFinal) == FAILURE) {
RETURN_THROWS();
diff --git a/ext/xml/xml.stub.php b/ext/xml/xml.stub.php
index 6dc10d58b5..be52bf3e3f 100644
--- a/ext/xml/xml.stub.php
+++ b/ext/xml/xml.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function xml_parser_create(?string $encoding = null): XMLParser {}
@@ -63,6 +63,7 @@ function xml_parser_set_option(XMLParser $parser, int $option, $value): bool {}
function xml_parser_get_option(XMLParser $parser, int $option): string|int {}
+/** @strict-properties */
final class XMLParser
{
}
diff --git a/ext/xml/xml_arginfo.h b/ext/xml/xml_arginfo.h
index 26187dad3d..689826aa0c 100644
--- a/ext/xml/xml_arginfo.h
+++ b/ext/xml/xml_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: d42215062c41775bae538cd310bc60e63fa06a8e */
+ * Stub hash: 3c786a3b1d8dc889dd3079bbc7f389d8dc3e11a5 */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_xml_parser_create, 0, 0, XMLParser, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 1, "null")
@@ -137,3 +137,14 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_XMLParser_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_XMLParser(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "XMLParser", class_XMLParser_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c
index afc8cc80ba..b12f53dc77 100644
--- a/ext/xmlreader/php_xmlreader.c
+++ b/ext/xmlreader/php_xmlreader.c
@@ -85,7 +85,7 @@ static int xmlreader_property_reader(xmlreader_object *obj, xmlreader_prop_handl
if (hnd->read_int_func) {
retint = hnd->read_int_func(obj->ptr);
if (retint == -1) {
- php_error_docref(NULL, E_WARNING, "Internal libxml error returned");
+ zend_throw_error(NULL, "Failed to read property due to libxml error");
return FAILURE;
}
}
@@ -100,15 +100,13 @@ static int xmlreader_property_reader(xmlreader_object *obj, xmlreader_prop_handl
ZVAL_EMPTY_STRING(rv);
}
break;
- /* this IS_FALSE actually means it's a BOOL type */
- case IS_FALSE:
+ case _IS_BOOL:
ZVAL_BOOL(rv, retint);
break;
case IS_LONG:
ZVAL_LONG(rv, retint);
break;
- default:
- ZVAL_NULL(rv);
+ EMPTY_SWITCH_DEFAULT_CASE()
}
return SUCCESS;
@@ -964,7 +962,7 @@ PHP_METHOD(XMLReader, setParserProperty)
zval *id;
zend_long property;
int retval = -1;
- zend_bool value;
+ bool value;
xmlreader_object *intern;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lb", &property, &value) == FAILURE) {
@@ -1147,8 +1145,6 @@ PHP_METHOD(XMLReader, expand)
PHP_MINIT_FUNCTION(xmlreader)
{
- zend_class_entry ce;
-
memcpy(&xmlreader_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
xmlreader_object_handlers.offset = XtOffsetOf(xmlreader_object, std);
xmlreader_object_handlers.dtor_obj = zend_objects_destroy_object;
@@ -1159,9 +1155,8 @@ PHP_MINIT_FUNCTION(xmlreader)
xmlreader_object_handlers.get_method = xmlreader_get_method;
xmlreader_object_handlers.clone_obj = NULL;
- INIT_CLASS_ENTRY(ce, "XMLReader", class_XMLReader_methods);
- ce.create_object = xmlreader_objects_new;
- xmlreader_class_entry = zend_register_internal_class(&ce);
+ xmlreader_class_entry = register_class_XMLReader();
+ xmlreader_class_entry->create_object = xmlreader_objects_new;
memcpy(&xmlreader_open_fn, zend_hash_str_find_ptr(&xmlreader_class_entry->function_table, "open", sizeof("open")-1), sizeof(zend_internal_function));
xmlreader_open_fn.fn_flags &= ~ZEND_ACC_STATIC;
@@ -1172,10 +1167,10 @@ PHP_MINIT_FUNCTION(xmlreader)
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "attributeCount", xmlTextReaderAttributeCount, NULL, IS_LONG);
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "baseURI", NULL, xmlTextReaderConstBaseUri, IS_STRING);
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "depth", xmlTextReaderDepth, NULL, IS_LONG);
- xmlreader_register_prop_handler(&xmlreader_prop_handlers, "hasAttributes", xmlTextReaderHasAttributes, NULL, IS_FALSE);
- xmlreader_register_prop_handler(&xmlreader_prop_handlers, "hasValue", xmlTextReaderHasValue, NULL, IS_FALSE);
- xmlreader_register_prop_handler(&xmlreader_prop_handlers, "isDefault", xmlTextReaderIsDefault, NULL, IS_FALSE);
- xmlreader_register_prop_handler(&xmlreader_prop_handlers, "isEmptyElement", xmlTextReaderIsEmptyElement, NULL, IS_FALSE);
+ xmlreader_register_prop_handler(&xmlreader_prop_handlers, "hasAttributes", xmlTextReaderHasAttributes, NULL, _IS_BOOL);
+ xmlreader_register_prop_handler(&xmlreader_prop_handlers, "hasValue", xmlTextReaderHasValue, NULL, _IS_BOOL);
+ xmlreader_register_prop_handler(&xmlreader_prop_handlers, "isDefault", xmlTextReaderIsDefault, NULL, _IS_BOOL);
+ xmlreader_register_prop_handler(&xmlreader_prop_handlers, "isEmptyElement", xmlTextReaderIsEmptyElement, NULL, _IS_BOOL);
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "localName", NULL, xmlTextReaderConstLocalName, IS_STRING);
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "name", NULL, xmlTextReaderConstName, IS_STRING);
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "namespaceURI", NULL, xmlTextReaderConstNamespaceUri, IS_STRING);
diff --git a/ext/xmlreader/php_xmlreader.stub.php b/ext/xmlreader/php_xmlreader.stub.php
index ecad4b392b..9932b56fc3 100644
--- a/ext/xmlreader/php_xmlreader.stub.php
+++ b/ext/xmlreader/php_xmlreader.stub.php
@@ -1,9 +1,37 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class XMLReader
{
+ public int $attributeCount;
+
+ public string $baseURI;
+
+ public int $depth;
+
+ public bool $hasAttributes;
+
+ public bool $hasValue;
+
+ public bool $isDefault;
+
+ public bool $isEmptyElement;
+
+ public string $localName;
+
+ public string $name;
+
+ public string $namespaceURI;
+
+ public int $nodeType;
+
+ public string $prefix;
+
+ public string $value;
+
+ public string $xmlLang;
+
/** @return bool */
public function close() {}
diff --git a/ext/xmlreader/php_xmlreader_arginfo.h b/ext/xmlreader/php_xmlreader_arginfo.h
index 487b53f698..0ce3fd862f 100644
--- a/ext/xmlreader/php_xmlreader_arginfo.h
+++ b/ext/xmlreader/php_xmlreader_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 0188a53f262d3f8e19b5b64d163bdee84f1be6b8 */
+ * Stub hash: 49adb3008ade3f92f9b764ead9366efc6681e46f */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XMLReader_close, 0, 0, 0)
ZEND_END_ARG_INFO()
@@ -138,3 +138,97 @@ static const zend_function_entry class_XMLReader_methods[] = {
ZEND_ME(XMLReader, expand, arginfo_class_XMLReader_expand, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_XMLReader(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "XMLReader", class_XMLReader_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ zval property_attributeCount_default_value;
+ ZVAL_UNDEF(&property_attributeCount_default_value);
+ zend_string *property_attributeCount_name = zend_string_init("attributeCount", sizeof("attributeCount") - 1, 1);
+ zend_declare_typed_property(class_entry, property_attributeCount_name, &property_attributeCount_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_attributeCount_name);
+
+ zval property_baseURI_default_value;
+ ZVAL_UNDEF(&property_baseURI_default_value);
+ zend_string *property_baseURI_name = zend_string_init("baseURI", sizeof("baseURI") - 1, 1);
+ zend_declare_typed_property(class_entry, property_baseURI_name, &property_baseURI_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_baseURI_name);
+
+ zval property_depth_default_value;
+ ZVAL_UNDEF(&property_depth_default_value);
+ zend_string *property_depth_name = zend_string_init("depth", sizeof("depth") - 1, 1);
+ zend_declare_typed_property(class_entry, property_depth_name, &property_depth_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_depth_name);
+
+ zval property_hasAttributes_default_value;
+ ZVAL_UNDEF(&property_hasAttributes_default_value);
+ zend_string *property_hasAttributes_name = zend_string_init("hasAttributes", sizeof("hasAttributes") - 1, 1);
+ zend_declare_typed_property(class_entry, property_hasAttributes_name, &property_hasAttributes_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+ zend_string_release(property_hasAttributes_name);
+
+ zval property_hasValue_default_value;
+ ZVAL_UNDEF(&property_hasValue_default_value);
+ zend_string *property_hasValue_name = zend_string_init("hasValue", sizeof("hasValue") - 1, 1);
+ zend_declare_typed_property(class_entry, property_hasValue_name, &property_hasValue_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+ zend_string_release(property_hasValue_name);
+
+ zval property_isDefault_default_value;
+ ZVAL_UNDEF(&property_isDefault_default_value);
+ zend_string *property_isDefault_name = zend_string_init("isDefault", sizeof("isDefault") - 1, 1);
+ zend_declare_typed_property(class_entry, property_isDefault_name, &property_isDefault_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+ zend_string_release(property_isDefault_name);
+
+ zval property_isEmptyElement_default_value;
+ ZVAL_UNDEF(&property_isEmptyElement_default_value);
+ zend_string *property_isEmptyElement_name = zend_string_init("isEmptyElement", sizeof("isEmptyElement") - 1, 1);
+ zend_declare_typed_property(class_entry, property_isEmptyElement_name, &property_isEmptyElement_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+ zend_string_release(property_isEmptyElement_name);
+
+ zval property_localName_default_value;
+ ZVAL_UNDEF(&property_localName_default_value);
+ zend_string *property_localName_name = zend_string_init("localName", sizeof("localName") - 1, 1);
+ zend_declare_typed_property(class_entry, property_localName_name, &property_localName_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_localName_name);
+
+ zval property_name_default_value;
+ ZVAL_UNDEF(&property_name_default_value);
+ zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
+ zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_name_name);
+
+ zval property_namespaceURI_default_value;
+ ZVAL_UNDEF(&property_namespaceURI_default_value);
+ zend_string *property_namespaceURI_name = zend_string_init("namespaceURI", sizeof("namespaceURI") - 1, 1);
+ zend_declare_typed_property(class_entry, property_namespaceURI_name, &property_namespaceURI_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_namespaceURI_name);
+
+ zval property_nodeType_default_value;
+ ZVAL_UNDEF(&property_nodeType_default_value);
+ zend_string *property_nodeType_name = zend_string_init("nodeType", sizeof("nodeType") - 1, 1);
+ zend_declare_typed_property(class_entry, property_nodeType_name, &property_nodeType_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_nodeType_name);
+
+ zval property_prefix_default_value;
+ ZVAL_UNDEF(&property_prefix_default_value);
+ zend_string *property_prefix_name = zend_string_init("prefix", sizeof("prefix") - 1, 1);
+ zend_declare_typed_property(class_entry, property_prefix_name, &property_prefix_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_prefix_name);
+
+ zval property_value_default_value;
+ ZVAL_UNDEF(&property_value_default_value);
+ zend_string *property_value_name = zend_string_init("value", sizeof("value") - 1, 1);
+ zend_declare_typed_property(class_entry, property_value_name, &property_value_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_value_name);
+
+ zval property_xmlLang_default_value;
+ ZVAL_UNDEF(&property_xmlLang_default_value);
+ zend_string *property_xmlLang_name = zend_string_init("xmlLang", sizeof("xmlLang") - 1, 1);
+ zend_declare_typed_property(class_entry, property_xmlLang_name, &property_xmlLang_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+ zend_string_release(property_xmlLang_name);
+
+ return class_entry;
+}
diff --git a/ext/xmlreader/tests/015-get-errors.phpt b/ext/xmlreader/tests/015-get-errors.phpt
index 7ea081c82f..7bcb2ef9bd 100644
--- a/ext/xmlreader/tests/015-get-errors.phpt
+++ b/ext/xmlreader/tests/015-get-errors.phpt
@@ -45,6 +45,7 @@ $reader->close();
<?php
unlink(__DIR__.'/015-get-errors.xml');
?>
---EXPECT--
+--EXPECTF--
+Deprecated: XMLReader::getAttributeNs(): Passing null to parameter #2 ($namespace) of type string is deprecated in %s on line %d
XMLReader::getAttributeNs(): Argument #2 ($namespace) cannot be empty
ns1:num: 1
diff --git a/ext/xmlreader/tests/015-move-errors.phpt b/ext/xmlreader/tests/015-move-errors.phpt
index 303d5c63e4..1c29b6983f 100644
--- a/ext/xmlreader/tests/015-move-errors.phpt
+++ b/ext/xmlreader/tests/015-move-errors.phpt
@@ -40,5 +40,6 @@ $reader->close();
<?php
unlink(__DIR__.'/015-move-errors.xml');
?>
---EXPECT--
+--EXPECTF--
+Deprecated: XMLReader::moveToAttributeNs(): Passing null to parameter #2 ($namespace) of type string is deprecated in %s on line %d
XMLReader::moveToAttributeNs(): Argument #2 ($namespace) cannot be empty
diff --git a/ext/xmlwriter/php_xmlwriter.c b/ext/xmlwriter/php_xmlwriter.c
index 61e4a3a7d9..8c3c92849d 100644
--- a/ext/xmlwriter/php_xmlwriter.c
+++ b/ext/xmlwriter/php_xmlwriter.c
@@ -252,7 +252,7 @@ PHP_FUNCTION(xmlwriter_set_indent)
{
xmlTextWriterPtr ptr;
int retval;
- zend_bool indent;
+ bool indent;
zval *self;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ob", &self, xmlwriter_class_entry_ce, &indent) == FAILURE) {
@@ -814,7 +814,7 @@ PHP_FUNCTION(xmlwriter_start_dtd_entity)
char *name;
size_t name_len;
int retval;
- zend_bool isparm;
+ bool isparm;
zval *self;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Osb", &self, xmlwriter_class_entry_ce, &name, &name_len, &isparm) == FAILURE) {
@@ -851,7 +851,7 @@ PHP_FUNCTION(xmlwriter_write_dtd_entity)
int retval;
/* Optional parameters */
char *pubid = NULL, *sysid = NULL, *ndataid = NULL;
- zend_bool pe = 0;
+ bool pe = 0;
size_t pubid_len, sysid_len, ndataid_len;
zval *self;
@@ -985,7 +985,7 @@ PHP_FUNCTION(xmlwriter_open_memory)
static void php_xmlwriter_flush(INTERNAL_FUNCTION_PARAMETERS, int force_string) {
xmlTextWriterPtr ptr;
xmlBufferPtr buffer;
- zend_bool empty = 1;
+ bool empty = 1;
int output_bytes;
zval *self;
@@ -1032,16 +1032,13 @@ PHP_FUNCTION(xmlwriter_flush)
/* {{{ PHP_MINIT_FUNCTION */
static PHP_MINIT_FUNCTION(xmlwriter)
{
- zend_class_entry ce;
-
memcpy(&xmlwriter_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
xmlwriter_object_handlers.offset = XtOffsetOf(ze_xmlwriter_object, std);
xmlwriter_object_handlers.dtor_obj = xmlwriter_object_dtor;
xmlwriter_object_handlers.free_obj = xmlwriter_object_free_storage;
xmlwriter_object_handlers.clone_obj = NULL;
- INIT_CLASS_ENTRY(ce, "XMLWriter", class_XMLWriter_methods);
- ce.create_object = xmlwriter_object_new;
- xmlwriter_class_entry_ce = zend_register_internal_class(&ce);
+ xmlwriter_class_entry_ce = register_class_XMLWriter();
+ xmlwriter_class_entry_ce->create_object = xmlwriter_object_new;
return SUCCESS;
}
diff --git a/ext/xmlwriter/php_xmlwriter.stub.php b/ext/xmlwriter/php_xmlwriter.stub.php
index 9334545ffa..ee90003399 100644
--- a/ext/xmlwriter/php_xmlwriter.stub.php
+++ b/ext/xmlwriter/php_xmlwriter.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function xmlwriter_open_uri(string $uri): XMLWriter|false {}
diff --git a/ext/xmlwriter/php_xmlwriter_arginfo.h b/ext/xmlwriter/php_xmlwriter_arginfo.h
index 9325ffbdb5..7547479b3b 100644
--- a/ext/xmlwriter/php_xmlwriter_arginfo.h
+++ b/ext/xmlwriter/php_xmlwriter_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: a0ece6bc77b0a9811cb09a604b175e2295efc7a0 */
+ * Stub hash: ce5cf4f922e47833033729b2a8941c36fa2b4d6d */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_xmlwriter_open_uri, 0, 1, XMLWriter, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, uri, IS_STRING, 0)
@@ -464,3 +464,13 @@ static const zend_function_entry class_XMLWriter_methods[] = {
ZEND_ME_MAPPING(flush, xmlwriter_flush, arginfo_class_XMLWriter_flush, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_XMLWriter(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "XMLWriter", class_XMLWriter_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/xmlwriter/tests/bug39504.phpt b/ext/xmlwriter/tests/bug39504.phpt
index 267c5331de..da30c8e375 100644
--- a/ext/xmlwriter/tests/bug39504.phpt
+++ b/ext/xmlwriter/tests/bug39504.phpt
@@ -21,7 +21,7 @@ $xw = new XMLWriter();
$xw->openMemory();
$xw->startDocument(NULL, "UTF-8");
$xw->startDtd("root");
-$xw->writeDtdEntity("c", NULL, 0, "-//W3C//TEXT copyright//EN", "http://www.w3.org/xmlspec/copyright.xml");
+$xw->writeDtdEntity("c", "", 0, "-//W3C//TEXT copyright//EN", "http://www.w3.org/xmlspec/copyright.xml");
$xw->endDtd();
$xw->startElement("root");
$xw->endDocument();
diff --git a/ext/xsl/php_xsl.c b/ext/xsl/php_xsl.c
index 300b196d03..0a454039f5 100644
--- a/ext/xsl/php_xsl.c
+++ b/ext/xsl/php_xsl.c
@@ -111,16 +111,13 @@ zend_object *xsl_objects_new(zend_class_entry *class_type)
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(xsl)
{
- zend_class_entry ce;
-
memcpy(&xsl_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
xsl_object_handlers.offset = XtOffsetOf(xsl_object, std);
xsl_object_handlers.clone_obj = NULL;
xsl_object_handlers.free_obj = xsl_objects_free_storage;
- INIT_CLASS_ENTRY(ce, "XSLTProcessor", class_XSLTProcessor_methods);
- ce.create_object = xsl_objects_new;
- xsl_xsltprocessor_class_entry = zend_register_internal_class(&ce);
+ xsl_xsltprocessor_class_entry = register_class_XSLTProcessor();
+ xsl_xsltprocessor_class_entry->create_object = xsl_objects_new;
#ifdef HAVE_XSL_EXSLT
exsltRegisterAll();
diff --git a/ext/xsl/php_xsl.stub.php b/ext/xsl/php_xsl.stub.php
index 536f82ac20..6f52e5570e 100644
--- a/ext/xsl/php_xsl.stub.php
+++ b/ext/xsl/php_xsl.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
class XSLTProcessor
{
diff --git a/ext/xsl/php_xsl_arginfo.h b/ext/xsl/php_xsl_arginfo.h
index 8f7f90a053..f5be7aa731 100644
--- a/ext/xsl/php_xsl_arginfo.h
+++ b/ext/xsl/php_xsl_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: a119247725ff61dbd615cb86ee6201ee6603ba51 */
+ * Stub hash: bcc89ca2603d60a9832704809fd8ab3834e79f74 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_importStylesheet, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, stylesheet, IS_OBJECT, 0)
@@ -79,3 +79,13 @@ static const zend_function_entry class_XSLTProcessor_methods[] = {
ZEND_ME(XSLTProcessor, getSecurityPrefs, arginfo_class_XSLTProcessor_getSecurityPrefs, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+static zend_class_entry *register_class_XSLTProcessor(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "XSLTProcessor", class_XSLTProcessor_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c
index 9498ba576c..11216c8d18 100644
--- a/ext/xsl/xsltprocessor.c
+++ b/ext/xsl/xsltprocessor.c
@@ -277,7 +277,7 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t
php_error_docref(NULL, E_WARNING, "A PHP Object cannot be converted to a XPath-string");
valuePush(ctxt, xmlXPathNewString((const xmlChar *) ""));
} else {
- convert_to_string_ex(&retval);
+ convert_to_string(&retval);
valuePush(ctxt, xmlXPathNewString((xmlChar *) Z_STRVAL(retval)));
}
zval_ptr_dtor(&retval);
diff --git a/ext/zend_test/config.m4 b/ext/zend_test/config.m4
index 71d05026b9..3d848fe277 100644
--- a/ext/zend_test/config.m4
+++ b/ext/zend_test/config.m4
@@ -1,7 +1,7 @@
PHP_ARG_ENABLE([zend-test],
[whether to enable zend-test extension],
[AS_HELP_STRING([--enable-zend-test],
- [Enable zend-test extension])])
+ [Enable zend_test extension])])
if test "$PHP_ZEND_TEST" != "no"; then
PHP_NEW_EXTENSION(zend_test, test.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
diff --git a/ext/zend_test/config.w32 b/ext/zend_test/config.w32
index d66fd0b1ee..f514d039ec 100644
--- a/ext/zend_test/config.w32
+++ b/ext/zend_test/config.w32
@@ -1,6 +1,6 @@
// vim:ft=javascript
-ARG_ENABLE("zend-test", "enable zend-test extension", "no");
+ARG_ENABLE("zend-test", "enable zend_test extension", "no");
if (PHP_ZEND_TEST != "no") {
EXTENSION("zend_test", "test.c", PHP_ZEND_TEST_SHARED, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c
index 4e7f55d1b1..007634f97c 100644
--- a/ext/zend_test/test.c
+++ b/ext/zend_test/test.c
@@ -51,6 +51,9 @@ static zend_class_entry *zend_test_class;
static zend_class_entry *zend_test_child_class;
static zend_class_entry *zend_test_trait;
static zend_class_entry *zend_test_attribute;
+static zend_class_entry *zend_test_ns_foo_class;
+static zend_class_entry *zend_test_ns2_foo_class;
+static zend_class_entry *zend_test_ns2_ns_foo_class;
static zend_object_handlers zend_test_class_handlers;
static ZEND_FUNCTION(zend_test_func)
@@ -238,8 +241,8 @@ static ZEND_FUNCTION(zend_iterable)
static ZEND_FUNCTION(namespaced_func)
{
- ZEND_PARSE_PARAMETERS_NONE();
- RETURN_TRUE;
+ ZEND_PARSE_PARAMETERS_NONE();
+ RETURN_TRUE;
}
static zend_object *zend_test_class_new(zend_class_entry *class_type) /* {{{ */ {
@@ -329,6 +332,10 @@ static ZEND_METHOD(ZendTestNS2_Foo, method) {
ZEND_PARSE_PARAMETERS_NONE();
}
+static ZEND_METHOD(ZendTestNS2_ZendSubNS_Foo, method) {
+ ZEND_PARSE_PARAMETERS_NONE();
+}
+
PHP_INI_BEGIN()
STD_PHP_INI_BOOLEAN("zend_test.observer.enabled", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_enabled, zend_zend_test_globals, zend_test_globals)
STD_PHP_INI_BOOLEAN("zend_test.observer.show_output", "1", PHP_INI_SYSTEM, OnUpdateBool, observer_show_output, zend_zend_test_globals, zend_test_globals)
@@ -352,89 +359,32 @@ static void custom_zend_execute_ex(zend_execute_data *execute_data)
PHP_MINIT_FUNCTION(zend_test)
{
- zend_class_entry class_entry;
-
- INIT_CLASS_ENTRY(class_entry, "_ZendTestInterface", NULL);
- zend_test_interface = zend_register_internal_interface(&class_entry);
+ zend_test_interface = register_class__ZendTestInterface();
zend_declare_class_constant_long(zend_test_interface, ZEND_STRL("DUMMY"), 0);
- INIT_CLASS_ENTRY(class_entry, "_ZendTestClass", class__ZendTestClass_methods);
- zend_test_class = zend_register_internal_class(&class_entry);
- zend_class_implements(zend_test_class, 1, zend_test_interface);
+
+ zend_test_class = register_class__ZendTestClass(zend_test_interface);
zend_test_class->create_object = zend_test_class_new;
zend_test_class->get_static_method = zend_test_class_static_method_get;
- zend_declare_property_null(zend_test_class, "_StaticProp", sizeof("_StaticProp") - 1, ZEND_ACC_STATIC);
-
- {
- zend_string *name = zend_string_init("intProp", sizeof("intProp") - 1, 1);
- zval val;
- ZVAL_LONG(&val, 123);
- zend_declare_typed_property(
- zend_test_class, name, &val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_CODE(IS_LONG, 0, 0));
- zend_string_release(name);
- }
-
- {
- zend_string *name = zend_string_init("classProp", sizeof("classProp") - 1, 1);
- zend_string *class_name = zend_string_init("stdClass", sizeof("stdClass") - 1, 1);
- zval val;
- ZVAL_NULL(&val);
- zend_declare_typed_property(
- zend_test_class, name, &val, ZEND_ACC_PUBLIC, NULL,
- (zend_type) ZEND_TYPE_INIT_CLASS(class_name, 1, 0));
- zend_string_release(name);
- }
-
- {
- zend_string *name = zend_string_init("classUnionProp", sizeof("classUnionProp") - 1, 1);
- zend_string *class_name1 = zend_string_init("stdClass", sizeof("stdClass") - 1, 1);
- zend_string *class_name2 = zend_string_init("Iterator", sizeof("Iterator") - 1, 1);
- zend_type_list *type_list = malloc(ZEND_TYPE_LIST_SIZE(2));
- type_list->num_types = 2;
- type_list->types[0] = (zend_type) ZEND_TYPE_INIT_CLASS(class_name1, 0, 0);
- type_list->types[1] = (zend_type) ZEND_TYPE_INIT_CLASS(class_name2, 0, 0);
- zend_type type = ZEND_TYPE_INIT_PTR(type_list, _ZEND_TYPE_LIST_BIT, 1, 0);
- zval val;
- ZVAL_NULL(&val);
- zend_declare_typed_property(zend_test_class, name, &val, ZEND_ACC_PUBLIC, NULL, type);
- zend_string_release(name);
- }
-
- {
- zend_string *name = zend_string_init("staticIntProp", sizeof("staticIntProp") - 1, 1);
- zval val;
- ZVAL_LONG(&val, 123);
- zend_declare_typed_property(
- zend_test_class, name, &val, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC, NULL,
- (zend_type) ZEND_TYPE_INIT_CODE(IS_LONG, 0, 0));
- zend_string_release(name);
- }
-
- INIT_CLASS_ENTRY(class_entry, "_ZendTestChildClass", NULL);
- zend_test_child_class = zend_register_internal_class_ex(&class_entry, zend_test_class);
+ zend_test_child_class = register_class__ZendTestChildClass(zend_test_class);
memcpy(&zend_test_class_handlers, &std_object_handlers, sizeof(zend_object_handlers));
zend_test_class_handlers.get_method = zend_test_class_method_get;
- INIT_CLASS_ENTRY(class_entry, "_ZendTestTrait", class__ZendTestTrait_methods);
- zend_test_trait = zend_register_internal_class(&class_entry);
- zend_test_trait->ce_flags |= ZEND_ACC_TRAIT;
- zend_declare_property_null(zend_test_trait, "testProp", sizeof("testProp")-1, ZEND_ACC_PUBLIC);
-
- zend_register_class_alias("_ZendTestClassAlias", zend_test_class);
+ zend_test_trait = register_class__ZendTestTrait();
REGISTER_LONG_CONSTANT("ZEND_TEST_DEPRECATED", 42, CONST_PERSISTENT | CONST_DEPRECATED);
- INIT_CLASS_ENTRY(class_entry, "ZendTestAttribute", NULL);
- zend_test_attribute = zend_register_internal_class(&class_entry);
- zend_test_attribute->ce_flags |= ZEND_ACC_FINAL;
-
+ zend_test_attribute = register_class_ZendTestAttribute();
{
zend_internal_attribute *attr = zend_internal_attribute_register(zend_test_attribute, ZEND_ATTRIBUTE_TARGET_ALL);
attr->validator = zend_attribute_validate_zendtestattribute;
}
+ zend_test_ns_foo_class = register_class_ZendTestNS_Foo();
+ zend_test_ns2_foo_class = register_class_ZendTestNS2_Foo();
+ zend_test_ns2_ns_foo_class = register_class_ZendTestNS2_ZendSubNS_Foo();
+
// Loading via dl() not supported with the observer API
if (type != MODULE_TEMPORARY) {
REGISTER_INI_ENTRIES();
@@ -613,7 +563,7 @@ static PHP_GINIT_FUNCTION(zend_test)
PHP_MINFO_FUNCTION(zend_test)
{
php_info_print_table_start();
- php_info_print_table_header(2, "zend-test extension", "enabled");
+ php_info_print_table_header(2, "zend_test extension", "enabled");
php_info_print_table_end();
DISPLAY_INI_ENTRIES();
@@ -621,7 +571,7 @@ PHP_MINFO_FUNCTION(zend_test)
zend_module_entry zend_test_module_entry = {
STANDARD_MODULE_HEADER,
- "zend-test",
+ "zend_test",
ext_functions,
PHP_MINIT(zend_test),
PHP_MSHUTDOWN(zend_test),
diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php
index d9db786cee..624ba1195f 100644
--- a/ext/zend_test/test.stub.php
+++ b/ext/zend_test/test.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries static */
+/** @generate-class-entries static */
namespace {
@@ -9,7 +9,15 @@ interface _ZendTestInterface
}
/** @alias _ZendTestClassAlias */
-class _ZendTestClass {
+class _ZendTestClass implements _ZendTestInterface {
+ /** @var mixed */
+ public static $_StaticProp;
+ public static int $staticIntProp = 123;
+
+ public int $intProp = 123;
+ public ?stdClass $classProp = null;
+ public stdClass|Iterator|null $classUnionProp = null;
+
public static function is_object(): int {}
/** @deprecated */
@@ -23,6 +31,9 @@ class _ZendTestChildClass extends _ZendTestClass
}
trait _ZendTestTrait {
+ /** @var mixed */
+ public $testProp;
+
public function testMethod(): bool {}
}
@@ -79,6 +90,10 @@ class Foo {
namespace ZendTestNS2\ZendSubNS {
+class Foo {
+ public function method(): void {}
+}
+
function namespaced_func(): bool {}
}
diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h
index c58d53b457..dc040a5680 100644
--- a/ext/zend_test/test_arginfo.h
+++ b/ext/zend_test/test_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 3240b7fa3461b40a211371250c4975802f44185b */
+ * Stub hash: cf8958513064fb7257203b3304c8dc67c8e008b9 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
@@ -69,6 +69,8 @@ ZEND_END_ARG_INFO()
#define arginfo_class_ZendTestNS2_Foo_method arginfo_zend_test_void_return
+#define arginfo_class_ZendTestNS2_ZendSubNS_Foo_method arginfo_zend_test_void_return
+
static ZEND_FUNCTION(zend_test_array_return);
static ZEND_FUNCTION(zend_test_nullable_array_return);
@@ -90,6 +92,7 @@ static ZEND_METHOD(_ZendTestClass, returnsStatic);
static ZEND_METHOD(_ZendTestTrait, testMethod);
static ZEND_METHOD(ZendTestNS_Foo, method);
static ZEND_METHOD(ZendTestNS2_Foo, method);
+static ZEND_METHOD(ZendTestNS2_ZendSubNS_Foo, method);
static const zend_function_entry ext_functions[] = {
@@ -150,3 +153,137 @@ static const zend_function_entry class_ZendTestNS2_Foo_methods[] = {
ZEND_ME(ZendTestNS2_Foo, method, arginfo_class_ZendTestNS2_Foo_method, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
+
+
+static const zend_function_entry class_ZendTestNS2_ZendSubNS_Foo_methods[] = {
+ ZEND_ME(ZendTestNS2_ZendSubNS_Foo, method, arginfo_class_ZendTestNS2_ZendSubNS_Foo_method, ZEND_ACC_PUBLIC)
+ ZEND_FE_END
+};
+
+static zend_class_entry *register_class__ZendTestInterface(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "_ZendTestInterface", class__ZendTestInterface_methods);
+ class_entry = zend_register_internal_interface(&ce);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class__ZendTestClass(zend_class_entry *class_entry__ZendTestInterface)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "_ZendTestClass", class__ZendTestClass_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry__ZendTestInterface);
+ zend_register_class_alias("_ZendTestClassAlias", class_entry);
+
+ zval property__StaticProp_default_value;
+ ZVAL_NULL(&property__StaticProp_default_value);
+ zend_string *property__StaticProp_name = zend_string_init("_StaticProp", sizeof("_StaticProp") - 1, 1);
+ zend_declare_property_ex(class_entry, property__StaticProp_name, &property__StaticProp_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, NULL);
+ zend_string_release(property__StaticProp_name);
+
+ zval property_staticIntProp_default_value;
+ ZVAL_LONG(&property_staticIntProp_default_value, 123);
+ zend_string *property_staticIntProp_name = zend_string_init("staticIntProp", sizeof("staticIntProp") - 1, 1);
+ zend_declare_typed_property(class_entry, property_staticIntProp_name, &property_staticIntProp_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_staticIntProp_name);
+
+ zval property_intProp_default_value;
+ ZVAL_LONG(&property_intProp_default_value, 123);
+ zend_string *property_intProp_name = zend_string_init("intProp", sizeof("intProp") - 1, 1);
+ zend_declare_typed_property(class_entry, property_intProp_name, &property_intProp_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+ zend_string_release(property_intProp_name);
+
+ zend_string *property_classProp_class_stdClass = zend_string_init("stdClass", sizeof("stdClass")-1, 1);
+ zval property_classProp_default_value;
+ ZVAL_NULL(&property_classProp_default_value);
+ zend_string *property_classProp_name = zend_string_init("classProp", sizeof("classProp") - 1, 1);
+ zend_declare_typed_property(class_entry, property_classProp_name, &property_classProp_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_classProp_class_stdClass, 0, MAY_BE_NULL));
+ zend_string_release(property_classProp_name);
+
+ zend_string *property_classUnionProp_class_stdClass = zend_string_init("stdClass", sizeof("stdClass") - 1, 1);
+ zend_string *property_classUnionProp_class_Iterator = zend_string_init("Iterator", sizeof("Iterator") - 1, 1);
+ zend_type_list *property_classUnionProp_type_list = malloc(ZEND_TYPE_LIST_SIZE(2));
+ property_classUnionProp_type_list->num_types = 2;
+ property_classUnionProp_type_list->types[0] = (zend_type) ZEND_TYPE_INIT_CLASS(property_classUnionProp_class_stdClass, 0, 0);
+ property_classUnionProp_type_list->types[1] = (zend_type) ZEND_TYPE_INIT_CLASS(property_classUnionProp_class_Iterator, 0, 0);
+ zend_type property_classUnionProp_type = ZEND_TYPE_INIT_PTR(property_classUnionProp_type_list, _ZEND_TYPE_LIST_BIT, 0, MAY_BE_NULL);
+ zval property_classUnionProp_default_value;
+ ZVAL_NULL(&property_classUnionProp_default_value);
+ zend_string *property_classUnionProp_name = zend_string_init("classUnionProp", sizeof("classUnionProp") - 1, 1);
+ zend_declare_typed_property(class_entry, property_classUnionProp_name, &property_classUnionProp_default_value, ZEND_ACC_PUBLIC, NULL, property_classUnionProp_type);
+ zend_string_release(property_classUnionProp_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class__ZendTestChildClass(zend_class_entry *class_entry__ZendTestClass)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "_ZendTestChildClass", class__ZendTestChildClass_methods);
+ class_entry = zend_register_internal_class_ex(&ce, class_entry__ZendTestClass);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class__ZendTestTrait(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "_ZendTestTrait", class__ZendTestTrait_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_TRAIT;
+
+ zval property_testProp_default_value;
+ ZVAL_NULL(&property_testProp_default_value);
+ zend_string *property_testProp_name = zend_string_init("testProp", sizeof("testProp") - 1, 1);
+ zend_declare_property_ex(class_entry, property_testProp_name, &property_testProp_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_testProp_name);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ZendTestAttribute(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ZendTestAttribute", class_ZendTestAttribute_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ZendTestNS_Foo(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_NS_CLASS_ENTRY(ce, "ZendTestNS", "Foo", class_ZendTestNS_Foo_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ZendTestNS2_Foo(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_NS_CLASS_ENTRY(ce, "ZendTestNS2", "Foo", class_ZendTestNS2_Foo_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_ZendTestNS2_ZendSubNS_Foo(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_NS_CLASS_ENTRY(ce, "ZendTestNS2\\ZendSubNS", "Foo", class_ZendTestNS2_ZendSubNS_Foo_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+
+ return class_entry;
+}
diff --git a/ext/zend_test/tests/observer_backtrace_01.phpt b/ext/zend_test/tests/observer_backtrace_01.phpt
index ece481cbba..6a02ad86a3 100644
--- a/ext/zend_test/tests/observer_backtrace_01.phpt
+++ b/ext/zend_test/tests/observer_backtrace_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Show backtrace on init
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_basic_01.phpt b/ext/zend_test/tests/observer_basic_01.phpt
index 064ed99a29..0831edafa2 100644
--- a/ext/zend_test/tests/observer_basic_01.phpt
+++ b/ext/zend_test/tests/observer_basic_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Basic observability of userland functions
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_basic_02.phpt b/ext/zend_test/tests/observer_basic_02.phpt
index 2b4d632d69..b0aeecd77b 100644
--- a/ext/zend_test/tests/observer_basic_02.phpt
+++ b/ext/zend_test/tests/observer_basic_02.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Basic observability of userland methods
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_basic_03.phpt b/ext/zend_test/tests/observer_basic_03.phpt
index 8675a0fdc0..e642623d8a 100644
--- a/ext/zend_test/tests/observer_basic_03.phpt
+++ b/ext/zend_test/tests/observer_basic_03.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Basic observability of includes
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_basic_04.phpt b/ext/zend_test/tests/observer_basic_04.phpt
index 6fc1fae1c0..bf45ca7608 100644
--- a/ext/zend_test/tests/observer_basic_04.phpt
+++ b/ext/zend_test/tests/observer_basic_04.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Basic observability of includes only (no functions)
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_includes=1
diff --git a/ext/zend_test/tests/observer_basic_05.phpt b/ext/zend_test/tests/observer_basic_05.phpt
index de14ebc1fd..362df718e7 100644
--- a/ext/zend_test/tests/observer_basic_05.phpt
+++ b/ext/zend_test/tests/observer_basic_05.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Basic observability of functions only (no includes)
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_functions=1
diff --git a/ext/zend_test/tests/observer_call_user_func_01.phpt b/ext/zend_test/tests/observer_call_user_func_01.phpt
index 802db43e33..ebe143ce1c 100644
--- a/ext/zend_test/tests/observer_call_user_func_01.phpt
+++ b/ext/zend_test/tests/observer_call_user_func_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: call_user_func() from root namespace
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_call_user_func_02.phpt b/ext/zend_test/tests/observer_call_user_func_02.phpt
index 25de267c06..5b59fe78f6 100644
--- a/ext/zend_test/tests/observer_call_user_func_02.phpt
+++ b/ext/zend_test/tests/observer_call_user_func_02.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: call_user_func_array() from root namespace
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_call_user_func_03.phpt b/ext/zend_test/tests/observer_call_user_func_03.phpt
index 7c041cbc70..2cfd0c3bcb 100644
--- a/ext/zend_test/tests/observer_call_user_func_03.phpt
+++ b/ext/zend_test/tests/observer_call_user_func_03.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: call_user_func() from namespace
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_call_user_func_04.phpt b/ext/zend_test/tests/observer_call_user_func_04.phpt
index ebcf06082b..3de570b52c 100644
--- a/ext/zend_test/tests/observer_call_user_func_04.phpt
+++ b/ext/zend_test/tests/observer_call_user_func_04.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: call_user_func_array() from namespace
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_closure_01.phpt b/ext/zend_test/tests/observer_closure_01.phpt
index 85312b32ef..b3c4b2a4de 100644
--- a/ext/zend_test/tests/observer_closure_01.phpt
+++ b/ext/zend_test/tests/observer_closure_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Basic observability of closures
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_closure_02.phpt b/ext/zend_test/tests/observer_closure_02.phpt
index 9d6cc900e3..d2fbba5296 100644
--- a/ext/zend_test/tests/observer_closure_02.phpt
+++ b/ext/zend_test/tests/observer_closure_02.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Observability of fake closures
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend_test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_error_01.phpt b/ext/zend_test/tests/observer_error_01.phpt
index e80a9ec3c7..75f1e614bd 100644
--- a/ext/zend_test/tests/observer_error_01.phpt
+++ b/ext/zend_test/tests/observer_error_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: End handlers fire after a fatal error
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_error_02.phpt b/ext/zend_test/tests/observer_error_02.phpt
index 9dfa71d182..79b465cef9 100644
--- a/ext/zend_test/tests/observer_error_02.phpt
+++ b/ext/zend_test/tests/observer_error_02.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: End handlers fire after a userland fatal error
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_error_03.phpt b/ext/zend_test/tests/observer_error_03.phpt
index 606b827bb2..d793624741 100644
--- a/ext/zend_test/tests/observer_error_03.phpt
+++ b/ext/zend_test/tests/observer_error_03.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: non-fatal errors do not fire end handlers prematurely
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_error_04.phpt b/ext/zend_test/tests/observer_error_04.phpt
index 49c56c17ab..d2f6f6e37a 100644
--- a/ext/zend_test/tests/observer_error_04.phpt
+++ b/ext/zend_test/tests/observer_error_04.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: fatal errors caught with zend_try will not fire end handlers prematurely
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
<?php if (!extension_loaded('soap')) die('skip: soap extension required'); ?>
--INI--
zend_test.observer.enabled=1
diff --git a/ext/zend_test/tests/observer_error_05.phpt b/ext/zend_test/tests/observer_error_05.phpt
index df05cdd8ed..c2fb0ab5f7 100644
--- a/ext/zend_test/tests/observer_error_05.phpt
+++ b/ext/zend_test/tests/observer_error_05.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: End handlers fire after a userland fatal error
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_eval_01.phpt b/ext/zend_test/tests/observer_eval_01.phpt
index addce2dba5..1d7d504148 100644
--- a/ext/zend_test/tests/observer_eval_01.phpt
+++ b/ext/zend_test/tests/observer_eval_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Basic eval observability
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_exception_01.phpt b/ext/zend_test/tests/observer_exception_01.phpt
index 6ded60c970..d967243853 100644
--- a/ext/zend_test/tests/observer_exception_01.phpt
+++ b/ext/zend_test/tests/observer_exception_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Basic observability of userland functions with uncaught exceptions
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_generator_01.phpt b/ext/zend_test/tests/observer_generator_01.phpt
index 34314cbf36..bb1de62b4c 100644
--- a/ext/zend_test/tests/observer_generator_01.phpt
+++ b/ext/zend_test/tests/observer_generator_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Basic generator observability
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_generator_02.phpt b/ext/zend_test/tests/observer_generator_02.phpt
index 9d29b9e8e5..48363ce7d9 100644
--- a/ext/zend_test/tests/observer_generator_02.phpt
+++ b/ext/zend_test/tests/observer_generator_02.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Generator with explicit return
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_generator_03.phpt b/ext/zend_test/tests/observer_generator_03.phpt
index cad6e3bb96..85f628b3bb 100644
--- a/ext/zend_test/tests/observer_generator_03.phpt
+++ b/ext/zend_test/tests/observer_generator_03.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Generator with 'yield from'
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_generator_04.phpt b/ext/zend_test/tests/observer_generator_04.phpt
index dd941dd78f..c5dc009f78 100644
--- a/ext/zend_test/tests/observer_generator_04.phpt
+++ b/ext/zend_test/tests/observer_generator_04.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Generator with manual traversal
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_generator_05.phpt b/ext/zend_test/tests/observer_generator_05.phpt
index 8809511361..fcae11f436 100644
--- a/ext/zend_test/tests/observer_generator_05.phpt
+++ b/ext/zend_test/tests/observer_generator_05.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Generator with uncaught exception
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_magic_01.phpt b/ext/zend_test/tests/observer_magic_01.phpt
index bae01e3b17..efa53236f1 100644
--- a/ext/zend_test/tests/observer_magic_01.phpt
+++ b/ext/zend_test/tests/observer_magic_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Basic magic method observability
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_opline_01.phpt b/ext/zend_test/tests/observer_opline_01.phpt
index 924c22b3a0..51f0f06076 100644
--- a/ext/zend_test/tests/observer_opline_01.phpt
+++ b/ext/zend_test/tests/observer_opline_01.phpt
@@ -1,11 +1,12 @@
--TEST--
Observer: Ensure opline exists on the execute_data
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
zend_test.observer.show_opcode=1
+opcache.jit=0
--FILE--
<?php
function foo()
diff --git a/ext/zend_test/tests/observer_retval_01.phpt b/ext/zend_test/tests/observer_retval_01.phpt
index 1359a00d40..3c103f11df 100644
--- a/ext/zend_test/tests/observer_retval_01.phpt
+++ b/ext/zend_test/tests/observer_retval_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Retvals are observable that are: IS_CONST
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_retval_02.phpt b/ext/zend_test/tests/observer_retval_02.phpt
index b48d8d6b7e..0bd6862f54 100644
--- a/ext/zend_test/tests/observer_retval_02.phpt
+++ b/ext/zend_test/tests/observer_retval_02.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Unused retvals from generators are still observable
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_retval_03.phpt b/ext/zend_test/tests/observer_retval_03.phpt
index 227fe5670a..8c26299fc2 100644
--- a/ext/zend_test/tests/observer_retval_03.phpt
+++ b/ext/zend_test/tests/observer_retval_03.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Retvals are observable that are: refcounted, IS_CV
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_retval_04.phpt b/ext/zend_test/tests/observer_retval_04.phpt
index f6aea0d1e2..06b5708da4 100644
--- a/ext/zend_test/tests/observer_retval_04.phpt
+++ b/ext/zend_test/tests/observer_retval_04.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Retvals are observable that are: refcounted, IS_VAR
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_retval_05.phpt b/ext/zend_test/tests/observer_retval_05.phpt
index e987a06d7a..ce6374287a 100644
--- a/ext/zend_test/tests/observer_retval_05.phpt
+++ b/ext/zend_test/tests/observer_retval_05.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Retvals are observable that are: IS_CV, IS_UNDEF
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_retval_06.phpt b/ext/zend_test/tests/observer_retval_06.phpt
index b3a64b3ee8..69fe005f9c 100644
--- a/ext/zend_test/tests/observer_retval_06.phpt
+++ b/ext/zend_test/tests/observer_retval_06.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Retvals are observable that are: IS_CV
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_retval_07.phpt b/ext/zend_test/tests/observer_retval_07.phpt
index 678027a01a..5af1469734 100644
--- a/ext/zend_test/tests/observer_retval_07.phpt
+++ b/ext/zend_test/tests/observer_retval_07.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Retvals are observable that are: IS_REFERENCE, IS_VAR
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_retval_by_ref_01.phpt b/ext/zend_test/tests/observer_retval_by_ref_01.phpt
index 2e7d910aac..2d489a749a 100644
--- a/ext/zend_test/tests/observer_retval_by_ref_01.phpt
+++ b/ext/zend_test/tests/observer_retval_by_ref_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Retvals by reference are observable that are: IS_CV
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_retval_by_ref_02.phpt b/ext/zend_test/tests/observer_retval_by_ref_02.phpt
index 7283a8d967..92719ae09e 100644
--- a/ext/zend_test/tests/observer_retval_by_ref_02.phpt
+++ b/ext/zend_test/tests/observer_retval_by_ref_02.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Retvals by reference are observable that are: IS_TMP_VAR
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_retval_by_ref_03.phpt b/ext/zend_test/tests/observer_retval_by_ref_03.phpt
index b75e589095..d6d4d11521 100644
--- a/ext/zend_test/tests/observer_retval_by_ref_03.phpt
+++ b/ext/zend_test/tests/observer_retval_by_ref_03.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Retvals by reference are observable that are: IS_VAR, ZEND_RETURNS_FUNCTION
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_shutdown_01.phpt b/ext/zend_test/tests/observer_shutdown_01.phpt
index 5fcc7aeb81..500b4314d0 100644
--- a/ext/zend_test/tests/observer_shutdown_01.phpt
+++ b/ext/zend_test/tests/observer_shutdown_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Function calls from a shutdown handler are observable
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_shutdown_02.phpt b/ext/zend_test/tests/observer_shutdown_02.phpt
index 410403df1a..9522288676 100644
--- a/ext/zend_test/tests/observer_shutdown_02.phpt
+++ b/ext/zend_test/tests/observer_shutdown_02.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Function calls from a __destruct during shutdown are observable
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_types_01.phpt b/ext/zend_test/tests/observer_types_01.phpt
index 7b5408a456..bd993406cd 100644
--- a/ext/zend_test/tests/observer_types_01.phpt
+++ b/ext/zend_test/tests/observer_types_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Observe basic TypeError
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zend_test/tests/observer_zend_call_function_01.phpt b/ext/zend_test/tests/observer_zend_call_function_01.phpt
index 73b0f92cce..e87cf8dbdb 100644
--- a/ext/zend_test/tests/observer_zend_call_function_01.phpt
+++ b/ext/zend_test/tests/observer_zend_call_function_01.phpt
@@ -1,7 +1,7 @@
--TEST--
Observer: Calls that go through zend_call_function are observed
--SKIPIF--
-<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('zend_test')) die('skip: zend_test extension required'); ?>
--INI--
zend_test.observer.enabled=1
zend_test.observer.observe_all=1
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c
index 6875850687..e62f9fc8f9 100644
--- a/ext/zip/php_zip.c
+++ b/ext/zip/php_zip.c
@@ -280,8 +280,7 @@ static int php_zip_add_file(ze_zip_object *obj, const char *filename, size_t fil
{
struct zip_source *zs;
char resolved_path[MAXPATHLEN];
- zval exists_flag;
-
+ php_stream_statbuf ssb;
if (ZIP_OPENBASEDIR_CHECKPATH(filename)) {
return -1;
@@ -292,8 +291,7 @@ static int php_zip_add_file(ze_zip_object *obj, const char *filename, size_t fil
return -1;
}
- php_stat(resolved_path, strlen(resolved_path), FS_EXISTS, &exists_flag);
- if (Z_TYPE(exists_flag) == IS_FALSE) {
+ if (php_stream_stat_path_ex(resolved_path, PHP_STREAM_URL_STAT_QUIET, &ssb, NULL)) {
php_error_docref(NULL, E_WARNING, "No such file or directory");
return -1;
}
@@ -831,17 +829,12 @@ static void php_zip_register_prop_handler(HashTable *prop_handler, char *name, z
{
zip_prop_handler hnd;
zend_string *str;
- zval tmp;
hnd.read_const_char_func = read_char_func;
hnd.read_int_func = read_int_func;
hnd.type = rettype;
str = zend_string_init_interned(name, strlen(name), 1);
zend_hash_add_mem(prop_handler, str, &hnd, sizeof(zip_prop_handler));
-
- /* Register for reflection */
- ZVAL_NULL(&tmp);
- zend_declare_property_ex(zip_class_entry, str, &tmp, ZEND_ACC_PUBLIC, NULL);
zend_string_release_ex(str, 1);
}
/* }}} */
@@ -2996,7 +2989,7 @@ PHP_METHOD(ZipArchive, registerCancelCallback)
PHP_METHOD(ZipArchive, isCompressionMethodSupported)
{
zend_long method;
- zend_bool enc = 1;
+ bool enc = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|b", &method, &enc) == FAILURE) {
return;
@@ -3009,7 +3002,7 @@ PHP_METHOD(ZipArchive, isCompressionMethodSupported)
PHP_METHOD(ZipArchive, isEncryptionMethodSupported)
{
zend_long method;
- zend_bool enc = 1;
+ bool enc = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|b", &method, &enc) == FAILURE) {
return;
@@ -3026,8 +3019,6 @@ static void php_zip_free_prop_handler(zval *el) /* {{{ */ {
/* {{{ PHP_MINIT_FUNCTION */
static PHP_MINIT_FUNCTION(zip)
{
- zend_class_entry ce;
-
memcpy(&zip_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
zip_object_handlers.offset = XtOffsetOf(ze_zip_object, zo);
zip_object_handlers.free_obj = php_zip_object_free_storage;
@@ -3039,9 +3030,8 @@ static PHP_MINIT_FUNCTION(zip)
zip_object_handlers.read_property = php_zip_read_property;
zip_object_handlers.has_property = php_zip_has_property;
- INIT_CLASS_ENTRY(ce, "ZipArchive", class_ZipArchive_methods);
- ce.create_object = php_zip_object_new;
- zip_class_entry = zend_register_internal_class(&ce);
+ zip_class_entry = register_class_ZipArchive(zend_ce_countable);
+ zip_class_entry->create_object = php_zip_object_new;
zend_hash_init(&zip_prop_handlers, 0, NULL, php_zip_free_prop_handler, 1);
php_zip_register_prop_handler(&zip_prop_handlers, "lastId", php_zip_last_id, NULL, IS_LONG);
@@ -3050,7 +3040,6 @@ static PHP_MINIT_FUNCTION(zip)
php_zip_register_prop_handler(&zip_prop_handlers, "numFiles", php_zip_get_num_files, NULL, IS_LONG);
php_zip_register_prop_handler(&zip_prop_handlers, "filename", NULL, php_zipobj_get_filename, IS_STRING);
php_zip_register_prop_handler(&zip_prop_handlers, "comment", NULL, php_zipobj_get_zip_comment, IS_STRING);
- zend_class_implements(zip_class_entry, 1, zend_ce_countable);
REGISTER_ZIP_CLASS_CONST_LONG("CREATE", ZIP_CREATE);
REGISTER_ZIP_CLASS_CONST_LONG("EXCL", ZIP_EXCL);
diff --git a/ext/zip/php_zip.stub.php b/ext/zip/php_zip.stub.php
index 5ae4731ae2..2c23b03851 100644
--- a/ext/zip/php_zip.stub.php
+++ b/ext/zip/php_zip.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
/**
* @return resource|int|false
@@ -64,8 +64,26 @@ function zip_entry_filesize($zip_entry): int|false {}
*/
function zip_entry_compressionmethod($zip_entry): string|false {}
-class ZipArchive
+class ZipArchive implements Countable
{
+ /** @var int|null */
+ public $lastId;
+
+ /** @var int|null */
+ public $status;
+
+ /** @var int|null */
+ public $statusSys;
+
+ /** @var int|null */
+ public $numFiles;
+
+ /** @var string|null */
+ public $filename;
+
+ /** @var string|null */
+ public $comment;
+
/** @return bool|int */
public function open(string $filename, int $flags = 0) {}
diff --git a/ext/zip/php_zip_arginfo.h b/ext/zip/php_zip_arginfo.h
index ba72e52aa8..900c334bf0 100644
--- a/ext/zip/php_zip_arginfo.h
+++ b/ext/zip/php_zip_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 095084d2a2df557398191af5dd6c8bea6bb7c338 */
+ * Stub hash: a50da348df01027594efd7c8ab7427c05ffea39e */
ZEND_BEGIN_ARG_INFO_EX(arginfo_zip_open, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@@ -453,3 +453,50 @@ static const zend_function_entry class_ZipArchive_methods[] = {
#endif
ZEND_FE_END
};
+
+static zend_class_entry *register_class_ZipArchive(zend_class_entry *class_entry_Countable)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "ZipArchive", class_ZipArchive_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ zend_class_implements(class_entry, 1, class_entry_Countable);
+
+ zval property_lastId_default_value;
+ ZVAL_NULL(&property_lastId_default_value);
+ zend_string *property_lastId_name = zend_string_init("lastId", sizeof("lastId") - 1, 1);
+ zend_declare_property_ex(class_entry, property_lastId_name, &property_lastId_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_lastId_name);
+
+ zval property_status_default_value;
+ ZVAL_NULL(&property_status_default_value);
+ zend_string *property_status_name = zend_string_init("status", sizeof("status") - 1, 1);
+ zend_declare_property_ex(class_entry, property_status_name, &property_status_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_status_name);
+
+ zval property_statusSys_default_value;
+ ZVAL_NULL(&property_statusSys_default_value);
+ zend_string *property_statusSys_name = zend_string_init("statusSys", sizeof("statusSys") - 1, 1);
+ zend_declare_property_ex(class_entry, property_statusSys_name, &property_statusSys_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_statusSys_name);
+
+ zval property_numFiles_default_value;
+ ZVAL_NULL(&property_numFiles_default_value);
+ zend_string *property_numFiles_name = zend_string_init("numFiles", sizeof("numFiles") - 1, 1);
+ zend_declare_property_ex(class_entry, property_numFiles_name, &property_numFiles_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_numFiles_name);
+
+ zval property_filename_default_value;
+ ZVAL_NULL(&property_filename_default_value);
+ zend_string *property_filename_name = zend_string_init("filename", sizeof("filename") - 1, 1);
+ zend_declare_property_ex(class_entry, property_filename_name, &property_filename_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_filename_name);
+
+ zval property_comment_default_value;
+ ZVAL_NULL(&property_comment_default_value);
+ zend_string *property_comment_name = zend_string_init("comment", sizeof("comment") - 1, 1);
+ zend_declare_property_ex(class_entry, property_comment_name, &property_comment_default_value, ZEND_ACC_PUBLIC, NULL);
+ zend_string_release(property_comment_name);
+
+ return class_entry;
+}
diff --git a/ext/zip/tests/bug38943.phpt b/ext/zip/tests/bug38943.phpt
index f079f81153..26ddfa2cb1 100644
--- a/ext/zip/tests/bug38943.phpt
+++ b/ext/zip/tests/bug38943.phpt
@@ -28,15 +28,6 @@ array(1) {
int(1)
}
object(myZip)#1 (%d) {
- ["test":"myZip":private]=>
- int(0)
- ["testp"]=>
- string(6) "foobar"
- ["testarray":"myZip":private]=>
- array(1) {
- [0]=>
- int(1)
- }
["lastId"]=>
int(-1)
["status"]=>
@@ -49,4 +40,13 @@ object(myZip)#1 (%d) {
string(0) ""
["comment"]=>
string(0) ""
+ ["test":"myZip":private]=>
+ int(0)
+ ["testp"]=>
+ string(6) "foobar"
+ ["testarray":"myZip":private]=>
+ array(1) {
+ [0]=>
+ int(1)
+ }
}
diff --git a/ext/zip/tests/bug38943_2.phpt b/ext/zip/tests/bug38943_2.phpt
index fa2a086b19..25580b57f4 100644
--- a/ext/zip/tests/bug38943_2.phpt
+++ b/ext/zip/tests/bug38943_2.phpt
@@ -14,15 +14,6 @@ array(1) {
int(1)
}
object(myZip)#1 (%d) {
- ["test":"myZip":private]=>
- int(0)
- ["testp"]=>
- string(6) "foobar"
- ["testarray":"myZip":private]=>
- array(1) {
- [0]=>
- int(1)
- }
["lastId"]=>
int(-1)
["status"]=>
@@ -35,4 +26,13 @@ object(myZip)#1 (%d) {
string(0) ""
["comment"]=>
string(0) ""
+ ["test":"myZip":private]=>
+ int(0)
+ ["testp"]=>
+ string(6) "foobar"
+ ["testarray":"myZip":private]=>
+ array(1) {
+ [0]=>
+ int(1)
+ }
}
diff --git a/ext/zlib/php_zlib.h b/ext/zlib/php_zlib.h
index 6c43625217..d32bac7346 100644
--- a/ext/zlib/php_zlib.h
+++ b/ext/zlib/php_zlib.h
@@ -57,7 +57,7 @@ ZEND_BEGIN_MODULE_GLOBALS(zlib)
char *output_handler;
php_zlib_context *ob_gzhandler;
zend_long output_compression_default;
- zend_bool handler_registered;
+ bool handler_registered;
int compression_coding;
ZEND_END_MODULE_GLOBALS(zlib);
diff --git a/ext/zlib/tests/gzfile_variation3.phpt b/ext/zlib/tests/gzfile_variation3.phpt
deleted file mode 100644
index 276c839468..0000000000
--- a/ext/zlib/tests/gzfile_variation3.phpt
+++ /dev/null
@@ -1,41 +0,0 @@
---TEST--
-Test function gzfile() by substituting argument 1 with emptyUnsetUndefNull values.
---SKIPIF--
-<?php
-if (!extension_loaded('zlib')) die ('skip zlib extension not available in this build');
-?>
---FILE--
-<?php
-
-
-$use_include_path = false;
-
-
-$unset_var = 10;
-unset($unset_var);
-
-$variation = array(
- 'unset var' => @$unset_var,
- 'undefined var' => @$undefined_var,
- 'empty string DQ' => "",
- 'empty string SQ' => '',
- 'uppercase NULL' => NULL,
- 'lowercase null' => null,
- );
-
-
-foreach ( $variation as $var ) {
- try {
- var_dump(gzfile( $var , $use_include_path ) );
- } catch (\ValueError $e) {
- echo $e->getMessage() . \PHP_EOL;
- }
-}
-?>
---EXPECT--
-Path cannot be empty
-Path cannot be empty
-Path cannot be empty
-Path cannot be empty
-Path cannot be empty
-Path cannot be empty
diff --git a/ext/zlib/tests/readgzfile_variation3.phpt b/ext/zlib/tests/readgzfile_variation3.phpt
deleted file mode 100644
index 4a7fcecf08..0000000000
--- a/ext/zlib/tests/readgzfile_variation3.phpt
+++ /dev/null
@@ -1,41 +0,0 @@
---TEST--
-Test function readgzfile() by substituting argument 1 with emptyUnsetUndefNull values.
---SKIPIF--
-<?php
-if (!extension_loaded('zlib')) die ('skip zlib extension not available in this build');
-?>
---FILE--
-<?php
-
-
-$use_include_path = false;
-
-
-$unset_var = 10;
-unset($unset_var);
-
-$variation = array(
- 'unset var' => @$unset_var,
- 'undefined var' => @$undefined_var,
- 'empty string DQ' => "",
- 'empty string SQ' => '',
- 'uppercase NULL' => NULL,
- 'lowercase null' => null,
- );
-
-
-foreach ( $variation as $var ) {
- try {
- var_dump(readgzfile( $var , $use_include_path ) );
- } catch (\ValueError $e) {
- echo $e->getMessage() . \PHP_EOL;
- }
-}
-?>
---EXPECT--
-Path cannot be empty
-Path cannot be empty
-Path cannot be empty
-Path cannot be empty
-Path cannot be empty
-Path cannot be empty
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index 75bd273526..02fb4dd207 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -788,7 +788,7 @@ PHP_ZLIB_DECODE_FUNC(gzdecode, PHP_ZLIB_ENCODING_GZIP);
PHP_ZLIB_DECODE_FUNC(gzuncompress, PHP_ZLIB_ENCODING_DEFLATE);
/* }}} */
-static zend_bool zlib_create_dictionary_string(HashTable *options, char **dict, size_t *dictlen) {
+static bool zlib_create_dictionary_string(HashTable *options, char **dict, size_t *dictlen) {
zval *option_buffer;
if (options && (option_buffer = zend_hash_str_find(options, ZEND_STRL("dictionary"))) != NULL) {
@@ -1337,10 +1337,7 @@ static PHP_MINIT_FUNCTION(zlib)
php_output_handler_conflict_register(ZEND_STRL("ob_gzhandler"), php_zlib_output_conflict_check);
php_output_handler_conflict_register(ZEND_STRL(PHP_ZLIB_OUTPUT_HANDLER_NAME), php_zlib_output_conflict_check);
- zend_class_entry inflate_ce;
- INIT_CLASS_ENTRY(inflate_ce, "InflateContext", class_InflateContext_methods);
- inflate_context_ce = zend_register_internal_class(&inflate_ce);
- inflate_context_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ inflate_context_ce = register_class_InflateContext();
inflate_context_ce->create_object = inflate_context_create_object;
inflate_context_ce->serialize = zend_class_serialize_deny;
inflate_context_ce->unserialize = zend_class_unserialize_deny;
@@ -1352,10 +1349,7 @@ static PHP_MINIT_FUNCTION(zlib)
inflate_context_object_handlers.clone_obj = NULL;
inflate_context_object_handlers.compare = zend_objects_not_comparable;
- zend_class_entry deflate_ce;
- INIT_CLASS_ENTRY(deflate_ce, "DeflateContext", class_DeflateContext_methods);
- deflate_context_ce = zend_register_internal_class(&deflate_ce);
- deflate_context_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ deflate_context_ce = register_class_DeflateContext();
deflate_context_ce->create_object = deflate_context_create_object;
deflate_context_ce->serialize = zend_class_serialize_deny;
deflate_context_ce->unserialize = zend_class_unserialize_deny;
diff --git a/ext/zlib/zlib.stub.php b/ext/zlib/zlib.stub.php
index c047a53541..1aaafcdce2 100644
--- a/ext/zlib/zlib.stub.php
+++ b/ext/zlib/zlib.stub.php
@@ -1,11 +1,13 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
+/** @strict-properties */
final class InflateContext
{
}
+/** @strict-properties */
final class DeflateContext
{
}
diff --git a/ext/zlib/zlib_arginfo.h b/ext/zlib/zlib_arginfo.h
index 9f5129feb0..e0ff0e16e9 100644
--- a/ext/zlib/zlib_arginfo.h
+++ b/ext/zlib/zlib_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 5862b97739c885589779f8ba3d13b4e390d72811 */
+ * Stub hash: 1aa5f9d6d062280f6148f3e72ceeaca81fb3037e */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ob_gzhandler, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0)
@@ -207,3 +207,25 @@ static const zend_function_entry class_InflateContext_methods[] = {
static const zend_function_entry class_DeflateContext_methods[] = {
ZEND_FE_END
};
+
+static zend_class_entry *register_class_InflateContext(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "InflateContext", class_InflateContext_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
+
+static zend_class_entry *register_class_DeflateContext(void)
+{
+ zend_class_entry ce, *class_entry;
+
+ INIT_CLASS_ENTRY(ce, "DeflateContext", class_DeflateContext_methods);
+ class_entry = zend_register_internal_class_ex(&ce, NULL);
+ class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+ return class_entry;
+}
diff --git a/ext/zlib/zlib_filter.c b/ext/zlib/zlib_filter.c
index cdd981afde..1723ef904f 100644
--- a/ext/zlib/zlib_filter.c
+++ b/ext/zlib/zlib_filter.c
@@ -27,7 +27,7 @@ typedef struct _php_zlib_filter_data {
unsigned char *outbuf;
size_t outbuf_len;
int persistent;
- zend_bool finished; /* for zlib.deflate: signals that no flush is pending */
+ bool finished; /* for zlib.deflate: signals that no flush is pending */
} php_zlib_filter_data;
/* }}} */
diff --git a/main/SAPI.c b/main/SAPI.c
index 0a7f219e84..79d9610a53 100644
--- a/main/SAPI.c
+++ b/main/SAPI.c
@@ -606,7 +606,7 @@ static void sapi_remove_header(zend_llist *l, char *name, size_t len) {
}
}
-SAPI_API int sapi_add_header_ex(const char *header_line, size_t header_line_len, zend_bool duplicate, zend_bool replace)
+SAPI_API int sapi_add_header_ex(const char *header_line, size_t header_line_len, bool duplicate, bool replace)
{
sapi_header_line ctr = {0};
int r;
diff --git a/main/SAPI.h b/main/SAPI.h
index b0d2928369..4de2189a6d 100644
--- a/main/SAPI.h
+++ b/main/SAPI.h
@@ -83,9 +83,9 @@ typedef struct {
const char *content_type;
- zend_bool headers_only;
- zend_bool no_headers;
- zend_bool headers_read;
+ bool headers_only;
+ bool no_headers;
+ bool headers_read;
sapi_post_entry *post_entry;
@@ -122,7 +122,7 @@ typedef struct _sapi_globals_struct {
HashTable *rfc1867_uploaded_files;
zend_long post_max_size;
int options;
- zend_bool sapi_started;
+ bool sapi_started;
double global_request_time;
HashTable known_post_content_types;
zval callback_func;
@@ -177,7 +177,7 @@ BEGIN_EXTERN_C()
SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg);
/* Deprecated functions. Use sapi_header_op instead. */
-SAPI_API int sapi_add_header_ex(const char *header_line, size_t header_line_len, zend_bool duplicate, zend_bool replace);
+SAPI_API int sapi_add_header_ex(const char *header_line, size_t header_line_len, bool duplicate, bool replace);
#define sapi_add_header(a, b, c) sapi_add_header_ex((a),(b),(c),1)
diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c
index 88519bc726..8d26b9cfc6 100644
--- a/main/fopen_wrappers.c
+++ b/main/fopen_wrappers.c
@@ -339,10 +339,10 @@ static FILE *php_fopen_and_set_opened_path(const char *path, const char *mode, z
PHPAPI int php_fopen_primary_script(zend_file_handle *file_handle)
{
char *path_info;
- char *filename = NULL;
+ zend_string *filename = NULL;
zend_string *resolved_path = NULL;
size_t length;
- zend_bool orig_display_errors;
+ bool orig_display_errors;
path_info = SG(request_info).request_uri;
#if HAVE_PWD_H
@@ -378,9 +378,10 @@ PHPAPI int php_fopen_primary_script(zend_file_handle *file_handle)
pw = getpwnam(user);
#endif
if (pw && pw->pw_dir) {
- spprintf(&filename, 0, "%s%c%s%c%s", pw->pw_dir, PHP_DIR_SEPARATOR, PG(user_dir), PHP_DIR_SEPARATOR, s + 1); /* Safe */
- } else {
- filename = SG(request_info).path_translated;
+ filename = zend_strpprintf(0, "%s%c%s%c%s", pw->pw_dir, PHP_DIR_SEPARATOR, PG(user_dir), PHP_DIR_SEPARATOR, s + 1); /* Safe */
+ } else if (SG(request_info).path_translated) {
+ filename = zend_string_init(SG(request_info).path_translated,
+ strlen(SG(request_info).path_translated), 0);
}
#if defined(ZTS) && defined(HAVE_GETPWNAM_R) && defined(_SC_GETPW_R_SIZE_MAX)
efree(pwbuf);
@@ -391,29 +392,29 @@ PHPAPI int php_fopen_primary_script(zend_file_handle *file_handle)
if (PG(doc_root) && path_info && (length = strlen(PG(doc_root))) &&
IS_ABSOLUTE_PATH(PG(doc_root), length)) {
size_t path_len = strlen(path_info);
- filename = emalloc(length + path_len + 2);
+ filename = zend_string_alloc(length + path_len + 2, 0);
memcpy(filename, PG(doc_root), length);
- if (!IS_SLASH(filename[length - 1])) { /* length is never 0 */
- filename[length++] = PHP_DIR_SEPARATOR;
+ if (!IS_SLASH(ZSTR_VAL(filename)[length - 1])) { /* length is never 0 */
+ ZSTR_VAL(filename)[length++] = PHP_DIR_SEPARATOR;
}
if (IS_SLASH(path_info[0])) {
length--;
}
- strncpy(filename + length, path_info, path_len + 1);
- } else {
- filename = SG(request_info).path_translated;
+ strncpy(ZSTR_VAL(filename) + length, path_info, path_len + 1);
+ ZSTR_LEN(filename) = length + path_len;
+ } else if (SG(request_info).path_translated) {
+ filename = zend_string_init(SG(request_info).path_translated,
+ strlen(SG(request_info).path_translated), 0);
}
if (filename) {
- resolved_path = zend_resolve_path(filename, strlen(filename));
+ resolved_path = zend_resolve_path(filename);
}
if (!resolved_path) {
- if (SG(request_info).path_translated != filename) {
- if (filename) {
- efree(filename);
- }
+ if (filename) {
+ zend_string_release(filename);
}
/* we have to free SG(request_info).path_translated here because
* php_destroy_request_info assumes that it will get
@@ -429,13 +430,13 @@ PHPAPI int php_fopen_primary_script(zend_file_handle *file_handle)
orig_display_errors = PG(display_errors);
PG(display_errors) = 0;
- if (zend_stream_open(filename, file_handle) == FAILURE) {
+ zend_stream_init_filename_ex(file_handle, filename);
+ file_handle->primary_script = 1;
+ if (filename) {
+ zend_string_delref(filename);
+ }
+ if (zend_stream_open(file_handle) == FAILURE) {
PG(display_errors) = orig_display_errors;
- if (SG(request_info).path_translated != filename) {
- if (filename) {
- efree(filename);
- }
- }
if (SG(request_info).path_translated) {
efree(SG(request_info).path_translated);
SG(request_info).path_translated = NULL;
@@ -444,13 +445,6 @@ PHPAPI int php_fopen_primary_script(zend_file_handle *file_handle)
}
PG(display_errors) = orig_display_errors;
- if (SG(request_info).path_translated != filename) {
- if (SG(request_info).path_translated) {
- efree(SG(request_info).path_translated);
- }
- SG(request_info).path_translated = filename;
- }
-
return SUCCESS;
}
/* }}} */
diff --git a/main/main.c b/main/main.c
index d2d19a5ee8..881ae6e642 100644
--- a/main/main.c
+++ b/main/main.c
@@ -99,130 +99,131 @@ PHPAPI size_t core_globals_offset;
/* {{{ PHP_INI_MH */
static PHP_INI_MH(OnSetFacility)
{
- const char *facility = ZSTR_VAL(new_value);
+ const zend_string *facility = new_value;
#ifdef LOG_AUTH
- if (!strcmp(facility, "LOG_AUTH") || !strcmp(facility, "auth") || !strcmp(facility, "security")) {
+ if (zend_string_equals_literal(facility, "LOG_AUTH") || zend_string_equals_literal(facility, "auth")
+ || zend_string_equals_literal(facility, "security")) {
PG(syslog_facility) = LOG_AUTH;
return SUCCESS;
}
#endif
#ifdef LOG_AUTHPRIV
- if (!strcmp(facility, "LOG_AUTHPRIV") || !strcmp(facility, "authpriv")) {
+ if (zend_string_equals_literal(facility, "LOG_AUTHPRIV") || zend_string_equals_literal(facility, "authpriv")) {
PG(syslog_facility) = LOG_AUTHPRIV;
return SUCCESS;
}
#endif
#ifdef LOG_CRON
- if (!strcmp(facility, "LOG_CRON") || !strcmp(facility, "cron")) {
+ if (zend_string_equals_literal(facility, "LOG_CRON") || zend_string_equals_literal(facility, "cron")) {
PG(syslog_facility) = LOG_CRON;
return SUCCESS;
}
#endif
#ifdef LOG_DAEMON
- if (!strcmp(facility, "LOG_DAEMON") || !strcmp(facility, "daemon")) {
+ if (zend_string_equals_literal(facility, "LOG_DAEMON") || zend_string_equals_literal(facility, "daemon")) {
PG(syslog_facility) = LOG_DAEMON;
return SUCCESS;
}
#endif
#ifdef LOG_FTP
- if (!strcmp(facility, "LOG_FTP") || !strcmp(facility, "ftp")) {
+ if (zend_string_equals_literal(facility, "LOG_FTP") || zend_string_equals_literal(facility, "ftp")) {
PG(syslog_facility) = LOG_FTP;
return SUCCESS;
}
#endif
#ifdef LOG_KERN
- if (!strcmp(facility, "LOG_KERN") || !strcmp(facility, "kern")) {
+ if (zend_string_equals_literal(facility, "LOG_KERN") || zend_string_equals_literal(facility, "kern")) {
PG(syslog_facility) = LOG_KERN;
return SUCCESS;
}
#endif
#ifdef LOG_LPR
- if (!strcmp(facility, "LOG_LPR") || !strcmp(facility, "lpr")) {
+ if (zend_string_equals_literal(facility, "LOG_LPR") || zend_string_equals_literal(facility, "lpr")) {
PG(syslog_facility) = LOG_LPR;
return SUCCESS;
}
#endif
#ifdef LOG_MAIL
- if (!strcmp(facility, "LOG_MAIL") || !strcmp(facility, "mail")) {
+ if (zend_string_equals_literal(facility, "LOG_MAIL") || zend_string_equals_literal(facility, "mail")) {
PG(syslog_facility) = LOG_MAIL;
return SUCCESS;
}
#endif
#ifdef LOG_INTERNAL_MARK
- if (!strcmp(facility, "LOG_INTERNAL_MARK") || !strcmp(facility, "mark")) {
+ if (zend_string_equals_literal(facility, "LOG_INTERNAL_MARK") || zend_string_equals_literal(facility, "mark")) {
PG(syslog_facility) = LOG_INTERNAL_MARK;
return SUCCESS;
}
#endif
#ifdef LOG_NEWS
- if (!strcmp(facility, "LOG_NEWS") || !strcmp(facility, "news")) {
+ if (zend_string_equals_literal(facility, "LOG_NEWS") || zend_string_equals_literal(facility, "news")) {
PG(syslog_facility) = LOG_NEWS;
return SUCCESS;
}
#endif
#ifdef LOG_SYSLOG
- if (!strcmp(facility, "LOG_SYSLOG") || !strcmp(facility, "syslog")) {
+ if (zend_string_equals_literal(facility, "LOG_SYSLOG") || zend_string_equals_literal(facility, "syslog")) {
PG(syslog_facility) = LOG_SYSLOG;
return SUCCESS;
}
#endif
#ifdef LOG_USER
- if (!strcmp(facility, "LOG_USER") || !strcmp(facility, "user")) {
+ if (zend_string_equals_literal(facility, "LOG_USER") || zend_string_equals_literal(facility, "user")) {
PG(syslog_facility) = LOG_USER;
return SUCCESS;
}
#endif
#ifdef LOG_UUCP
- if (!strcmp(facility, "LOG_UUCP") || !strcmp(facility, "uucp")) {
+ if (zend_string_equals_literal(facility, "LOG_UUCP") || zend_string_equals_literal(facility, "uucp")) {
PG(syslog_facility) = LOG_UUCP;
return SUCCESS;
}
#endif
#ifdef LOG_LOCAL0
- if (!strcmp(facility, "LOG_LOCAL0") || !strcmp(facility, "local0")) {
+ if (zend_string_equals_literal(facility, "LOG_LOCAL0") || zend_string_equals_literal(facility, "local0")) {
PG(syslog_facility) = LOG_LOCAL0;
return SUCCESS;
}
#endif
#ifdef LOG_LOCAL1
- if (!strcmp(facility, "LOG_LOCAL1") || !strcmp(facility, "local1")) {
+ if (zend_string_equals_literal(facility, "LOG_LOCAL1") || zend_string_equals_literal(facility, "local1")) {
PG(syslog_facility) = LOG_LOCAL1;
return SUCCESS;
}
#endif
#ifdef LOG_LOCAL2
- if (!strcmp(facility, "LOG_LOCAL2") || !strcmp(facility, "local2")) {
+ if (zend_string_equals_literal(facility, "LOG_LOCAL2") || zend_string_equals_literal(facility, "local2")) {
PG(syslog_facility) = LOG_LOCAL2;
return SUCCESS;
}
#endif
#ifdef LOG_LOCAL3
- if (!strcmp(facility, "LOG_LOCAL3") || !strcmp(facility, "local3")) {
+ if (zend_string_equals_literal(facility, "LOG_LOCAL3") || zend_string_equals_literal(facility, "local3")) {
PG(syslog_facility) = LOG_LOCAL3;
return SUCCESS;
}
#endif
#ifdef LOG_LOCAL4
- if (!strcmp(facility, "LOG_LOCAL4") || !strcmp(facility, "local4")) {
+ if (zend_string_equals_literal(facility, "LOG_LOCAL4") || zend_string_equals_literal(facility, "local4")) {
PG(syslog_facility) = LOG_LOCAL4;
return SUCCESS;
}
#endif
#ifdef LOG_LOCAL5
- if (!strcmp(facility, "LOG_LOCAL5") || !strcmp(facility, "local5")) {
+ if (zend_string_equals_literal(facility, "LOG_LOCAL5") || zend_string_equals_literal(facility, "local5")) {
PG(syslog_facility) = LOG_LOCAL5;
return SUCCESS;
}
#endif
#ifdef LOG_LOCAL6
- if (!strcmp(facility, "LOG_LOCAL6") || !strcmp(facility, "local6")) {
+ if (zend_string_equals_literal(facility, "LOG_LOCAL6") || zend_string_equals_literal(facility, "local6")) {
PG(syslog_facility) = LOG_LOCAL6;
return SUCCESS;
}
#endif
#ifdef LOG_LOCAL7
- if (!strcmp(facility, "LOG_LOCAL7") || !strcmp(facility, "local7")) {
+ if (zend_string_equals_literal(facility, "LOG_LOCAL7") || zend_string_equals_literal(facility, "local7")) {
PG(syslog_facility) = LOG_LOCAL7;
return SUCCESS;
}
@@ -278,21 +279,21 @@ static PHP_INI_MH(OnChangeMemoryLimit)
/* {{{ PHP_INI_MH */
static PHP_INI_MH(OnSetLogFilter)
{
- const char *filter = ZSTR_VAL(new_value);
+ const zend_string *filter = new_value;
- if (!strcmp(filter, "all")) {
+ if (zend_string_equals_literal(filter, "all")) {
PG(syslog_filter) = PHP_SYSLOG_FILTER_ALL;
return SUCCESS;
}
- if (!strcmp(filter, "no-ctrl")) {
+ if (zend_string_equals_literal(filter, "no-ctrl")) {
PG(syslog_filter) = PHP_SYSLOG_FILTER_NO_CTRL;
return SUCCESS;
}
- if (!strcmp(filter, "ascii")) {
+ if (zend_string_equals_literal(filter, "ascii")) {
PG(syslog_filter) = PHP_SYSLOG_FILTER_ASCII;
return SUCCESS;
}
- if (!strcmp(filter, "raw")) {
+ if (zend_string_equals_literal(filter, "raw")) {
PG(syslog_filter) = PHP_SYSLOG_FILTER_RAW;
return SUCCESS;
}
@@ -401,7 +402,7 @@ static PHP_INI_MH(OnUpdateTimeout)
/* }}} */
/* {{{ php_get_display_errors_mode() helper function */
-static zend_uchar php_get_display_errors_mode(char *value, size_t value_length)
+static zend_uchar php_get_display_errors_mode(zend_string *value)
{
zend_uchar mode;
@@ -409,21 +410,26 @@ static zend_uchar php_get_display_errors_mode(char *value, size_t value_length)
return PHP_DISPLAY_ERRORS_STDOUT;
}
- if (value_length == 2 && !strcasecmp("on", value)) {
- mode = PHP_DISPLAY_ERRORS_STDOUT;
- } else if (value_length == 3 && !strcasecmp("yes", value)) {
- mode = PHP_DISPLAY_ERRORS_STDOUT;
- } else if (value_length == 4 && !strcasecmp("true", value)) {
- mode = PHP_DISPLAY_ERRORS_STDOUT;
- } else if (value_length == 6 && !strcasecmp(value, "stderr")) {
- mode = PHP_DISPLAY_ERRORS_STDERR;
- } else if (value_length == 6 && !strcasecmp(value, "stdout")) {
- mode = PHP_DISPLAY_ERRORS_STDOUT;
- } else {
- ZEND_ATOL(mode, value);
- if (mode && mode != PHP_DISPLAY_ERRORS_STDOUT && mode != PHP_DISPLAY_ERRORS_STDERR) {
- mode = PHP_DISPLAY_ERRORS_STDOUT;
- }
+ if (zend_string_equals_literal_ci(value, "on")) {
+ return PHP_DISPLAY_ERRORS_STDOUT;
+ }
+ if (zend_string_equals_literal_ci(value, "yes")) {
+ return PHP_DISPLAY_ERRORS_STDOUT;
+ }
+
+ if (zend_string_equals_literal_ci(value, "true")) {
+ return PHP_DISPLAY_ERRORS_STDOUT;
+ }
+ if (zend_string_equals_literal_ci(value, "stderr")) {
+ return PHP_DISPLAY_ERRORS_STDERR;
+ }
+ if (zend_string_equals_literal_ci(value, "stdout")) {
+ return PHP_DISPLAY_ERRORS_STDOUT;
+ }
+
+ ZEND_ATOL(mode, ZSTR_VAL(value));
+ if (mode && mode != PHP_DISPLAY_ERRORS_STDOUT && mode != PHP_DISPLAY_ERRORS_STDERR) {
+ return PHP_DISPLAY_ERRORS_STDOUT;
}
return mode;
@@ -433,7 +439,7 @@ static zend_uchar php_get_display_errors_mode(char *value, size_t value_length)
/* {{{ PHP_INI_MH */
static PHP_INI_MH(OnUpdateDisplayErrors)
{
- PG(display_errors) = php_get_display_errors_mode(ZSTR_VAL(new_value), ZSTR_LEN(new_value));
+ PG(display_errors) = php_get_display_errors_mode(new_value);
return SUCCESS;
}
@@ -444,21 +450,17 @@ static PHP_INI_DISP(display_errors_mode)
{
zend_uchar mode;
bool cgi_or_cli;
- size_t tmp_value_length;
- char *tmp_value;
+ zend_string *temporary_value;
if (type == ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
- tmp_value = (ini_entry->orig_value ? ZSTR_VAL(ini_entry->orig_value) : NULL );
- tmp_value_length = (ini_entry->orig_value? ZSTR_LEN(ini_entry->orig_value) : 0);
+ temporary_value = (ini_entry->orig_value ? ini_entry->orig_value : NULL );
} else if (ini_entry->value) {
- tmp_value = ZSTR_VAL(ini_entry->value);
- tmp_value_length = ZSTR_LEN(ini_entry->value);
+ temporary_value = ini_entry->value;
} else {
- tmp_value = NULL;
- tmp_value_length = 0;
+ temporary_value = NULL;
}
- mode = php_get_display_errors_mode(tmp_value, tmp_value_length);
+ mode = php_get_display_errors_mode(temporary_value);
/* Display 'On' for other SAPIs instead of STDOUT or STDERR */
cgi_or_cli = (!strcmp(sapi_module.name, "cli") || !strcmp(sapi_module.name, "cgi") || !strcmp(sapi_module.name, "phpdbg"));
@@ -584,7 +586,8 @@ static PHP_INI_MH(OnUpdateOutputEncoding)
static PHP_INI_MH(OnUpdateErrorLog)
{
/* Only do the safemode/open_basedir check at runtime */
- if ((stage == PHP_INI_STAGE_RUNTIME || stage == PHP_INI_STAGE_HTACCESS) && new_value && strcmp(ZSTR_VAL(new_value), "syslog")) {
+ if ((stage == PHP_INI_STAGE_RUNTIME || stage == PHP_INI_STAGE_HTACCESS) &&
+ new_value && zend_string_equals_literal(new_value, "syslog")) {
if (PG(open_basedir) && php_check_open_basedir(ZSTR_VAL(new_value))) {
return FAILURE;
}
@@ -1138,7 +1141,7 @@ static void clear_last_error() {
static void report_zend_debug_error_notify_cb(int type, const char *error_filename, uint32_t error_lineno, zend_string *message)
{
if (PG(report_zend_debug)) {
- zend_bool trigger_break;
+ bool trigger_break;
switch (type) {
case E_ERROR:
@@ -1162,7 +1165,7 @@ static void report_zend_debug_error_notify_cb(int type, const char *error_filena
extended error handling function */
static ZEND_COLD void php_error_cb(int orig_type, const char *error_filename, const uint32_t error_lineno, zend_string *message)
{
- zend_bool display;
+ bool display;
int type = orig_type & E_ALL;
/* check for repeated errors to be ignored */
@@ -1441,9 +1444,10 @@ PHP_FUNCTION(set_time_limit)
/* }}} */
/* {{{ php_fopen_wrapper_for_zend */
-static FILE *php_fopen_wrapper_for_zend(const char *filename, zend_string **opened_path)
+static FILE *php_fopen_wrapper_for_zend(zend_string *filename, zend_string **opened_path)
{
- return php_stream_open_wrapper_as_file((char *)filename, "rb", USE_PATH|IGNORE_URL_WIN|REPORT_ERRORS|STREAM_OPEN_FOR_INCLUDE, opened_path);
+ *opened_path = filename;
+ return php_stream_open_wrapper_as_file(ZSTR_VAL(filename), "rb", USE_PATH|REPORT_ERRORS|STREAM_OPEN_FOR_INCLUDE|STREAM_OPEN_FOR_ZEND_STREAM, opened_path);
}
/* }}} */
@@ -1471,20 +1475,25 @@ static size_t php_zend_stream_fsizer(void *handle) /* {{{ */
}
/* }}} */
-static zend_result php_stream_open_for_zend(const char *filename, zend_file_handle *handle) /* {{{ */
+static zend_result php_stream_open_for_zend(zend_file_handle *handle) /* {{{ */
{
- return php_stream_open_for_zend_ex(filename, handle, USE_PATH|REPORT_ERRORS|STREAM_OPEN_FOR_INCLUDE);
+ return php_stream_open_for_zend_ex(handle, USE_PATH|REPORT_ERRORS|STREAM_OPEN_FOR_INCLUDE);
}
/* }}} */
-PHPAPI zend_result php_stream_open_for_zend_ex(const char *filename, zend_file_handle *handle, int mode) /* {{{ */
+PHPAPI zend_result php_stream_open_for_zend_ex(zend_file_handle *handle, int mode) /* {{{ */
{
zend_string *opened_path;
- php_stream *stream = php_stream_open_wrapper((char *)filename, "rb", mode, &opened_path);
+ zend_string *filename;
+ php_stream *stream;
+
+ ZEND_ASSERT(handle->type == ZEND_HANDLE_FILENAME);
+ opened_path = filename = handle->filename;
+ stream = php_stream_open_wrapper((char *)ZSTR_VAL(filename), "rb", mode | STREAM_OPEN_FOR_ZEND_STREAM, &opened_path);
if (stream) {
memset(handle, 0, sizeof(zend_file_handle));
handle->type = ZEND_HANDLE_STREAM;
- handle->filename = (char*)filename;
+ handle->filename = filename;
handle->opened_path = opened_path;
handle->handle.stream.handle = stream;
handle->handle.stream.reader = (zend_stream_reader_t)_php_stream_read;
@@ -1502,9 +1511,9 @@ PHPAPI zend_result php_stream_open_for_zend_ex(const char *filename, zend_file_h
}
/* }}} */
-static zend_string *php_resolve_path_for_zend(const char *filename, size_t filename_len) /* {{{ */
+static zend_string *php_resolve_path_for_zend(zend_string *filename) /* {{{ */
{
- return php_resolve_path(filename, filename_len, PG(include_path));
+ return php_resolve_path(ZSTR_VAL(filename), ZSTR_LEN(filename), PG(include_path));
}
/* }}} */
@@ -1727,7 +1736,7 @@ int php_request_startup(void)
/* {{{ php_request_shutdown */
void php_request_shutdown(void *dummy)
{
- zend_bool report_memleaks;
+ bool report_memleaks;
EG(flags) |= EG_FLAGS_IN_SHUTDOWN;
@@ -1757,7 +1766,7 @@ void php_request_shutdown(void *dummy)
/* 3. Flush all output buffers */
zend_try {
- zend_bool send_buffer = SG(request_info).headers_only ? 0 : 1;
+ bool send_buffer = SG(request_info).headers_only ? 0 : 1;
if (CG(unclean_shutdown) && PG(last_error_type) == E_ERROR &&
(size_t)PG(memory_limit) < zend_memory_usage(1)
@@ -1826,6 +1835,7 @@ void php_request_shutdown(void *dummy)
} zend_end_try();
/* 15. Free Willy (here be crashes) */
+ zend_arena_destroy(CG(arena));
zend_interned_strings_deactivate();
zend_try {
shutdown_memory_manager(CG(unclean_shutdown) || !report_memleaks, 0);
@@ -2140,9 +2150,11 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod
/* this will read in php.ini, set up the configuration parameters,
load zend extensions and register php function extensions
to be loaded later */
+ zend_stream_init();
if (php_init_config() == FAILURE) {
return FAILURE;
}
+ zend_stream_shutdown();
/* Register PHP core ini entries */
REGISTER_INI_ENTRIES();
@@ -2414,7 +2426,7 @@ void php_module_shutdown(void)
/* {{{ php_execute_script */
PHPAPI int php_execute_script(zend_file_handle *primary_file)
{
- zend_file_handle *prepend_file_p, *append_file_p;
+ zend_file_handle *prepend_file_p = NULL, *append_file_p = NULL;
zend_file_handle prepend_file, append_file;
#ifdef HAVE_BROKEN_GETCWD
volatile int old_cwd_fd = -1;
@@ -2448,18 +2460,18 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file)
#else
php_ignore_value(VCWD_GETCWD(old_cwd, OLD_CWD_SIZE-1));
#endif
- VCWD_CHDIR_FILE(primary_file->filename);
+ VCWD_CHDIR_FILE(ZSTR_VAL(primary_file->filename));
}
/* Only lookup the real file path and add it to the included_files list if already opened
* otherwise it will get opened and added to the included_files list in zend_execute_scripts
*/
- if (primary_file->filename &&
- strcmp("Standard input code", primary_file->filename) &&
+ if (primary_file->filename &&
+ !zend_string_equals_literal(primary_file->filename, "Standard input code") &&
primary_file->opened_path == NULL &&
primary_file->type != ZEND_HANDLE_FILENAME
) {
- if (expand_filepath(primary_file->filename, realfile)) {
+ if (expand_filepath(ZSTR_VAL(primary_file->filename), realfile)) {
primary_file->opened_path = zend_string_init(realfile, strlen(realfile), 0);
zend_hash_add_empty_element(&EG(included_files), primary_file->opened_path);
}
@@ -2468,15 +2480,11 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file)
if (PG(auto_prepend_file) && PG(auto_prepend_file)[0]) {
zend_stream_init_filename(&prepend_file, PG(auto_prepend_file));
prepend_file_p = &prepend_file;
- } else {
- prepend_file_p = NULL;
}
if (PG(auto_append_file) && PG(auto_append_file)[0]) {
zend_stream_init_filename(&append_file, PG(auto_append_file));
append_file_p = &append_file;
- } else {
- append_file_p = NULL;
}
if (PG(max_input_time) != -1) {
#ifdef PHP_WIN32
@@ -2488,6 +2496,14 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file)
retval = (zend_execute_scripts(ZEND_REQUIRE, NULL, 3, prepend_file_p, primary_file, append_file_p) == SUCCESS);
} zend_end_try();
+ if (prepend_file_p) {
+ zend_destroy_file_handle(prepend_file_p);
+ }
+
+ if (append_file_p) {
+ zend_destroy_file_handle(append_file_p);
+ }
+
if (EG(exception)) {
zend_try {
zend_exception_error(EG(exception), E_ERROR);
@@ -2531,7 +2547,7 @@ PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval *ret)
if (primary_file->filename && !(SG(options) & SAPI_OPTION_NO_CHDIR)) {
php_ignore_value(VCWD_GETCWD(old_cwd, OLD_CWD_SIZE-1));
- VCWD_CHDIR_FILE(primary_file->filename);
+ VCWD_CHDIR_FILE(ZSTR_VAL(primary_file->filename));
}
zend_execute_scripts(ZEND_REQUIRE, ret, 1, primary_file);
} zend_end_try();
@@ -2607,7 +2623,6 @@ PHPAPI int php_lint_script(zend_file_handle *file)
zend_try {
op_array = zend_compile_file(file, ZEND_INCLUDE);
- zend_destroy_file_handle(file);
if (op_array) {
destroy_op_array(op_array);
diff --git a/main/output.c b/main/output.c
index d155123834..ec844973c5 100644
--- a/main/output.c
+++ b/main/output.c
@@ -103,20 +103,20 @@ static size_t (*php_output_direct)(const char *str, size_t str_len) = php_output
static void php_output_header(void)
{
if (!SG(headers_sent)) {
- if (!OG(output_start_filename_str)) {
+ if (!OG(output_start_filename)) {
if (zend_is_compiling()) {
- OG(output_start_filename_str) = zend_get_compiled_filename();
+ OG(output_start_filename) = zend_get_compiled_filename();
OG(output_start_lineno) = zend_get_compiled_lineno();
} else if (zend_is_executing()) {
- OG(output_start_filename_str) = zend_get_executed_filename_ex();
+ OG(output_start_filename) = zend_get_executed_filename_ex();
OG(output_start_lineno) = zend_get_executed_lineno();
}
- if (OG(output_start_filename_str)) {
- zend_string_addref(OG(output_start_filename_str));
+ if (OG(output_start_filename)) {
+ zend_string_addref(OG(output_start_filename));
}
#if PHP_OUTPUT_DEBUG
fprintf(stderr, "!!! output started at: %s (%d)\n",
- ZSTR_VAL(OG(output_start_filename_str)), OG(output_start_lineno));
+ ZSTR_VAL(OG(output_start_filename)), OG(output_start_lineno));
#endif
}
if (!php_header()) {
@@ -195,9 +195,9 @@ PHPAPI void php_output_deactivate(void)
zend_stack_destroy(&OG(handlers));
}
- if (OG(output_start_filename_str)) {
- zend_string_release(OG(output_start_filename_str));
- OG(output_start_filename_str) = NULL;
+ if (OG(output_start_filename)) {
+ zend_string_release(OG(output_start_filename));
+ OG(output_start_filename) = NULL;
}
}
/* }}} */
@@ -758,7 +758,7 @@ PHPAPI void php_output_set_implicit_flush(int flush)
* Get the file name where output has started */
PHPAPI const char *php_output_get_start_filename(void)
{
- return OG(output_start_filename_str) ? ZSTR_VAL(OG(output_start_filename_str)) : NULL;
+ return OG(output_start_filename) ? ZSTR_VAL(OG(output_start_filename)) : NULL;
}
/* }}} */
@@ -807,7 +807,7 @@ static inline void php_output_context_reset(php_output_context *context)
/* {{{ static void php_output_context_feed(php_output_context *context, char *, size_t, size_t)
* Feed output contexts input buffer */
-static inline void php_output_context_feed(php_output_context *context, char *data, size_t size, size_t used, zend_bool free)
+static inline void php_output_context_feed(php_output_context *context, char *data, size_t size, size_t used, bool free)
{
if (context->in.free && context->in.data) {
efree(context->in.data);
@@ -970,7 +970,7 @@ static inline php_output_handler_status_t php_output_handler_op(php_output_handl
/* user handler may have returned TRUE */
status = PHP_OUTPUT_HANDLER_NO_DATA;
if (Z_TYPE(retval) != IS_FALSE && Z_TYPE(retval) != IS_TRUE) {
- convert_to_string_ex(&retval);
+ convert_to_string(&retval);
if (Z_STRLEN(retval)) {
context->out.data = estrndup(Z_STRVAL(retval), Z_STRLEN(retval));
context->out.used = Z_STRLEN(retval);
@@ -1491,7 +1491,7 @@ PHP_FUNCTION(ob_list_handlers)
/* {{{ Return the status of the active or all output buffers */
PHP_FUNCTION(ob_get_status)
{
- zend_bool full_status = 0;
+ bool full_status = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &full_status) == FAILURE) {
RETURN_THROWS();
diff --git a/main/php.h b/main/php.h
index f796577249..68076befde 100644
--- a/main/php.h
+++ b/main/php.h
@@ -22,7 +22,7 @@
#include <dmalloc.h>
#endif
-#define PHP_API_VERSION 20200930
+#define PHP_API_VERSION 20201009
#define PHP_HAVE_STREAMS
#define YYDEBUG 0
#define PHP_DEFAULT_CHARSET "UTF-8"
diff --git a/main/php_globals.h b/main/php_globals.h
index e079866645..e619694d18 100644
--- a/main/php_globals.h
+++ b/main/php_globals.h
@@ -51,11 +51,11 @@ typedef struct _arg_separators {
} arg_separators;
struct _php_core_globals {
- zend_bool implicit_flush;
+ bool implicit_flush;
zend_long output_buffering;
- zend_bool enable_dl;
+ bool enable_dl;
char *output_handler;
@@ -66,12 +66,12 @@ struct _php_core_globals {
zend_long max_input_time;
zend_uchar display_errors;
- zend_bool display_startup_errors;
- zend_bool log_errors;
+ bool display_startup_errors;
+ bool log_errors;
zend_long log_errors_max_len;
- zend_bool ignore_repeated_errors;
- zend_bool ignore_repeated_source;
- zend_bool report_memleaks;
+ bool ignore_repeated_errors;
+ bool ignore_repeated_source;
+ bool report_memleaks;
char *error_log;
char *doc_root;
@@ -102,7 +102,7 @@ struct _php_core_globals {
HashTable rfc1867_protected_variables;
short connection_status;
- zend_bool ignore_user_abort;
+ bool ignore_user_abort;
unsigned char header_is_being_sent;
@@ -110,27 +110,27 @@ struct _php_core_globals {
zval http_globals[6];
- zend_bool expose_php;
+ bool expose_php;
- zend_bool register_argc_argv;
- zend_bool auto_globals_jit;
+ bool register_argc_argv;
+ bool auto_globals_jit;
char *docref_root;
char *docref_ext;
- zend_bool html_errors;
- zend_bool xmlrpc_errors;
+ bool html_errors;
+ bool xmlrpc_errors;
zend_long xmlrpc_error_number;
- zend_bool activated_auto_globals[8];
+ bool activated_auto_globals[8];
- zend_bool modules_activated;
- zend_bool file_uploads;
- zend_bool during_request_startup;
- zend_bool allow_url_fopen;
- zend_bool enable_post_data_reading;
- zend_bool report_zend_debug;
+ bool modules_activated;
+ bool file_uploads;
+ bool during_request_startup;
+ bool allow_url_fopen;
+ bool enable_post_data_reading;
+ bool report_zend_debug;
int last_error_type;
zend_string *last_error_message;
@@ -140,31 +140,31 @@ struct _php_core_globals {
char *php_sys_temp_dir;
char *disable_classes;
- zend_bool allow_url_include;
+ bool allow_url_include;
#ifdef PHP_WIN32
- zend_bool com_initialized;
+ bool com_initialized;
#endif
zend_long max_input_nesting_level;
zend_long max_input_vars;
- zend_bool in_user_include;
+ bool in_user_include;
char *user_ini_filename;
zend_long user_ini_cache_ttl;
char *request_order;
- zend_bool mail_x_header;
+ bool mail_x_header;
char *mail_log;
- zend_bool in_error_log;
+ bool in_error_log;
#ifdef PHP_WIN32
- zend_bool windows_show_crt_warning;
+ bool windows_show_crt_warning;
#endif
zend_long syslog_facility;
char *syslog_ident;
- zend_bool have_called_openlog;
+ bool have_called_openlog;
zend_long syslog_filter;
};
diff --git a/main/php_ini.c b/main/php_ini.c
index 52e3a20ebf..44c70c6a23 100644
--- a/main/php_ini.c
+++ b/main/php_ini.c
@@ -117,7 +117,7 @@ PHPAPI ZEND_COLD void display_ini_entries(zend_module_entry *module)
{
int module_number;
zend_ini_entry *ini_entry;
- zend_bool first = 1;
+ bool first = 1;
if (module) {
module_number = module->module_number;
@@ -616,15 +616,14 @@ int php_init_config(void)
{
zval tmp;
- ZVAL_NEW_STR(&tmp, zend_string_init(fh.filename, strlen(fh.filename), 1));
+ ZVAL_NEW_STR(&tmp, zend_string_init(filename, strlen(filename), 1));
zend_hash_str_update(&configuration_hash, "cfg_file_path", sizeof("cfg_file_path")-1, &tmp);
if (opened_path) {
zend_string_release_ex(opened_path, 0);
- } else {
- efree((char *)fh.filename);
}
php_ini_opened_path = zend_strndup(Z_STRVAL(tmp), Z_STRLEN(tmp));
}
+ zend_destroy_file_handle(&fh);
}
/* Check for PHP_INI_SCAN_DIR environment variable to override/set config file scan directory */
@@ -693,6 +692,7 @@ int php_init_config(void)
zend_llist_add_element(&scanned_ini_list, &p);
}
}
+ zend_destroy_file_handle(&fh);
}
}
free(namelist[i]);
@@ -771,17 +771,20 @@ PHPAPI int php_parse_user_ini_file(const char *dirname, const char *ini_filename
if (VCWD_STAT(ini_file, &sb) == 0) {
if (S_ISREG(sb.st_mode)) {
zend_file_handle fh;
+ int ret = FAILURE;
+
zend_stream_init_fp(&fh, VCWD_FOPEN(ini_file, "r"), ini_file);
if (fh.handle.fp) {
/* Reset active ini section */
RESET_ACTIVE_INI_HASH();
- if (zend_parse_ini_file(&fh, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, target_hash) == SUCCESS) {
+ ret = zend_parse_ini_file(&fh, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, target_hash);
+ if (ret == SUCCESS) {
/* FIXME: Add parsed file to the list of user files read? */
- return SUCCESS;
}
- return FAILURE;
}
+ zend_destroy_file_handle(&fh);
+ return ret;
}
}
return FAILURE;
diff --git a/main/php_main.h b/main/php_main.h
index ee27209fbe..1beedd853e 100644
--- a/main/php_main.h
+++ b/main/php_main.h
@@ -40,7 +40,7 @@ PHPAPI void php_handle_aborted_connection(void);
PHPAPI int php_handle_auth_data(const char *auth);
PHPAPI void php_html_puts(const char *str, size_t siz);
-PHPAPI int php_stream_open_for_zend_ex(const char *filename, zend_file_handle *handle, int mode);
+PHPAPI int php_stream_open_for_zend_ex(zend_file_handle *handle, int mode);
/* environment module */
extern int php_init_environ(void);
diff --git a/main/php_memory_streams.h b/main/php_memory_streams.h
index 5d0b978aad..030784e6f6 100644
--- a/main/php_memory_streams.h
+++ b/main/php_memory_streams.h
@@ -28,8 +28,8 @@
#define php_stream_memory_create(mode) _php_stream_memory_create((mode) STREAMS_CC)
#define php_stream_memory_create_rel(mode) _php_stream_memory_create((mode) STREAMS_REL_CC)
-#define php_stream_memory_open(mode, buf, length) _php_stream_memory_open((mode), (buf), (length) STREAMS_CC)
-#define php_stream_memory_get_buffer(stream, length) _php_stream_memory_get_buffer((stream), (length) STREAMS_CC)
+#define php_stream_memory_open(mode, str) _php_stream_memory_open((mode), (str) STREAMS_CC)
+#define php_stream_memory_get_buffer(stream) _php_stream_memory_get_buffer((stream) STREAMS_CC)
#define php_stream_temp_new() php_stream_temp_create(TEMP_STREAM_DEFAULT, PHP_STREAM_MAX_MEM)
#define php_stream_temp_create(mode, max_memory_usage) _php_stream_temp_create((mode), (max_memory_usage) STREAMS_CC)
@@ -40,8 +40,8 @@
BEGIN_EXTERN_C()
PHPAPI php_stream *_php_stream_memory_create(int mode STREAMS_DC);
-PHPAPI php_stream *_php_stream_memory_open(int mode, const char *buf, size_t length STREAMS_DC);
-PHPAPI char *_php_stream_memory_get_buffer(php_stream *stream, size_t *length STREAMS_DC);
+PHPAPI php_stream *_php_stream_memory_open(int mode, zend_string *buf STREAMS_DC);
+PHPAPI zend_string *_php_stream_memory_get_buffer(php_stream *stream STREAMS_DC);
PHPAPI php_stream *_php_stream_temp_create(int mode, size_t max_memory_usage STREAMS_DC);
PHPAPI php_stream *_php_stream_temp_create_ex(int mode, size_t max_memory_usage, const char *tmpdir STREAMS_DC);
diff --git a/main/php_network.h b/main/php_network.h
index 437069b4fc..5c8cee3fa8 100644
--- a/main/php_network.h
+++ b/main/php_network.h
@@ -49,6 +49,13 @@
# define EWOULDBLOCK EAGAIN
#endif
+/* This is a work around for GCC bug 69602: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602 */
+#if EAGAIN != EWOULDBLOCK
+# define PHP_IS_TRANSIENT_ERROR(err) (err == EAGAIN || err == EWOULDBLOCK)
+#else
+# define PHP_IS_TRANSIENT_ERROR(err) (err == EAGAIN)
+#endif
+
#ifdef PHP_WIN32
#define php_socket_errno() WSAGetLastError()
#else
diff --git a/main/php_output.h b/main/php_output.h
index eba63e6039..18f611dece 100644
--- a/main/php_output.h
+++ b/main/php_output.h
@@ -137,10 +137,9 @@ ZEND_BEGIN_MODULE_GLOBALS(output)
zend_stack handlers;
php_output_handler *active;
php_output_handler *running;
- const char *output_start_filename; /* TODO: Unused, remove */
+ zend_string *output_start_filename;
int output_start_lineno;
int flags;
- zend_string *output_start_filename_str;
ZEND_END_MODULE_GLOBALS(output)
PHPAPI ZEND_EXTERN_MODULE_GLOBALS(output)
diff --git a/main/php_streams.h b/main/php_streams.h
index 6d6c73bb95..3c1417ddd1 100644
--- a/main/php_streams.h
+++ b/main/php_streams.h
@@ -391,7 +391,7 @@ END_EXTERN_C()
/* Flags for url_stat method in wrapper ops */
#define PHP_STREAM_URL_STAT_LINK 1
#define PHP_STREAM_URL_STAT_QUIET 2
-#define PHP_STREAM_URL_STAT_NOCACHE 4
+#define PHP_STREAM_URL_STAT_IGNORE_OPEN_BASEDIR 4
/* change the blocking mode of stream: value == 1 => blocking, value == 0 => non-blocking. */
#define PHP_STREAM_OPTION_BLOCKING 1
@@ -554,8 +554,8 @@ END_EXTERN_C()
/* Allow blocking reads on anonymous pipes on Windows. */
#define STREAM_USE_BLOCKING_PIPE 0x00008000
-/* Antique - no longer has meaning */
-#define IGNORE_URL_WIN 0
+/* this flag is only used by include/require functions */
+#define STREAM_OPEN_FOR_ZEND_STREAM 0x00010000
int php_init_stream_wrappers(int module_number);
int php_shutdown_stream_wrappers(int module_number);
diff --git a/main/php_variables.c b/main/php_variables.c
index 312c22ef07..4c284cacfb 100644
--- a/main/php_variables.c
+++ b/main/php_variables.c
@@ -62,7 +62,7 @@ PHPAPI void php_register_variable_ex(const char *var_name, zval *val, zval *trac
char *var, *var_orig;
size_t var_len, index_len;
zval gpc_element, *gpc_element_p;
- zend_bool is_array = 0;
+ bool is_array = 0;
HashTable *symtable1 = NULL;
ALLOCA_FLAG(use_heap)
@@ -276,7 +276,7 @@ typedef struct post_var_data {
size_t already_scanned;
} post_var_data_t;
-static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof)
+static bool add_post_var(zval *arr, post_var_data_t *var, bool eof)
{
char *start, *ksep, *vsep, *val;
size_t klen, vlen;
@@ -327,7 +327,7 @@ static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof)
return 1;
}
-static inline int add_post_vars(zval *arr, post_var_data_t *vars, zend_bool eof)
+static inline int add_post_vars(zval *arr, post_var_data_t *vars, bool eof)
{
uint64_t max_vars = PG(max_input_vars);
@@ -581,7 +581,7 @@ void _php_import_environment_variables(zval *array_ptr)
tsrm_env_unlock();
}
-zend_bool php_std_auto_global_callback(char *name, uint32_t name_len)
+bool php_std_auto_global_callback(char *name, uint32_t name_len)
{
zend_printf("%s\n", name);
return 0; /* don't rearm */
@@ -727,7 +727,7 @@ PHPAPI int php_hash_environment(void)
}
/* }}} */
-static zend_bool php_auto_globals_create_get(zend_string *name)
+static bool php_auto_globals_create_get(zend_string *name)
{
if (PG(variables_order) && (strchr(PG(variables_order),'G') || strchr(PG(variables_order),'g'))) {
sapi_module.treat_data(PARSE_GET, NULL, NULL);
@@ -742,7 +742,7 @@ static zend_bool php_auto_globals_create_get(zend_string *name)
return 0; /* don't rearm */
}
-static zend_bool php_auto_globals_create_post(zend_string *name)
+static bool php_auto_globals_create_post(zend_string *name)
{
if (PG(variables_order) &&
(strchr(PG(variables_order),'P') || strchr(PG(variables_order),'p')) &&
@@ -761,7 +761,7 @@ static zend_bool php_auto_globals_create_post(zend_string *name)
return 0; /* don't rearm */
}
-static zend_bool php_auto_globals_create_cookie(zend_string *name)
+static bool php_auto_globals_create_cookie(zend_string *name)
{
if (PG(variables_order) && (strchr(PG(variables_order),'C') || strchr(PG(variables_order),'c'))) {
sapi_module.treat_data(PARSE_COOKIE, NULL, NULL);
@@ -776,7 +776,7 @@ static zend_bool php_auto_globals_create_cookie(zend_string *name)
return 0; /* don't rearm */
}
-static zend_bool php_auto_globals_create_files(zend_string *name)
+static bool php_auto_globals_create_files(zend_string *name)
{
if (Z_TYPE(PG(http_globals)[TRACK_VARS_FILES]) == IS_UNDEF) {
array_init(&PG(http_globals)[TRACK_VARS_FILES]);
@@ -804,7 +804,7 @@ static void check_http_proxy(HashTable *var_table)
}
}
-static zend_bool php_auto_globals_create_server(zend_string *name)
+static bool php_auto_globals_create_server(zend_string *name)
{
if (PG(variables_order) && (strchr(PG(variables_order),'S') || strchr(PG(variables_order),'s'))) {
php_register_server_variables();
@@ -841,7 +841,7 @@ static zend_bool php_auto_globals_create_server(zend_string *name)
return 0; /* don't rearm */
}
-static zend_bool php_auto_globals_create_env(zend_string *name)
+static bool php_auto_globals_create_env(zend_string *name)
{
zval_ptr_dtor_nogc(&PG(http_globals)[TRACK_VARS_ENV]);
array_init(&PG(http_globals)[TRACK_VARS_ENV]);
@@ -857,7 +857,7 @@ static zend_bool php_auto_globals_create_env(zend_string *name)
return 0; /* don't rearm */
}
-static zend_bool php_auto_globals_create_request(zend_string *name)
+static bool php_auto_globals_create_request(zend_string *name)
{
zval form_variables;
unsigned char _gpc_flags[3] = {0, 0, 0};
diff --git a/main/php_version.h b/main/php_version.h
index e762a8a2ed..66d4367856 100644
--- a/main/php_version.h
+++ b/main/php_version.h
@@ -1,8 +1,8 @@
/* automatically generated by configure */
/* edit configure.ac to change version number */
#define PHP_MAJOR_VERSION 8
-#define PHP_MINOR_VERSION 0
-#define PHP_RELEASE_VERSION 5
+#define PHP_MINOR_VERSION 1
+#define PHP_RELEASE_VERSION 0
#define PHP_EXTRA_VERSION "-dev"
-#define PHP_VERSION "8.0.5-dev"
-#define PHP_VERSION_ID 80005
+#define PHP_VERSION "8.1.0-dev"
+#define PHP_VERSION_ID 80100
diff --git a/main/reentrancy.c b/main/reentrancy.c
index 776bcb9f35..5e7425cd07 100644
--- a/main/reentrancy.c
+++ b/main/reentrancy.c
@@ -29,7 +29,6 @@ enum {
CTIME_R,
ASCTIME_R,
GMTIME_R,
- READDIR_R,
NUMBER_OF_LOCKS
};
diff --git a/main/rfc1867.c b/main/rfc1867.c
index c2f606c64a..f73aabdcba 100644
--- a/main/rfc1867.c
+++ b/main/rfc1867.c
@@ -52,7 +52,7 @@ static php_rfc1867_basename_t php_rfc1867_basename = NULL;
PHPAPI int (*php_rfc1867_callback)(unsigned int event, void *event_data, void **extra) = NULL;
-static void safe_php_register_variable(char *var, char *strval, size_t val_len, zval *track_vars_array, zend_bool override_protection);
+static void safe_php_register_variable(char *var, char *strval, size_t val_len, zval *track_vars_array, bool override_protection);
/* The longest property name we use in an uploaded file array */
#define MAX_SIZE_OF_INDEX sizeof("[tmp_name]")
@@ -148,14 +148,14 @@ static void add_protected_variable(char *varname) /* {{{ */
}
/* }}} */
-static zend_bool is_protected_variable(char *varname) /* {{{ */
+static bool is_protected_variable(char *varname) /* {{{ */
{
normalize_protected_variable(varname);
return zend_hash_str_exists(&PG(rfc1867_protected_variables), varname, strlen(varname));
}
/* }}} */
-static void safe_php_register_variable(char *var, char *strval, size_t val_len, zval *track_vars_array, zend_bool override_protection) /* {{{ */
+static void safe_php_register_variable(char *var, char *strval, size_t val_len, zval *track_vars_array, bool override_protection) /* {{{ */
{
if (override_protection || !is_protected_variable(var)) {
php_register_variable_safe(var, strval, val_len, track_vars_array);
@@ -163,7 +163,7 @@ static void safe_php_register_variable(char *var, char *strval, size_t val_len,
}
/* }}} */
-static void safe_php_register_variable_ex(char *var, zval *val, zval *track_vars_array, zend_bool override_protection) /* {{{ */
+static void safe_php_register_variable_ex(char *var, zval *val, zval *track_vars_array, bool override_protection) /* {{{ */
{
if (override_protection || !is_protected_variable(var)) {
php_register_variable_ex(var, val, track_vars_array);
@@ -171,13 +171,13 @@ static void safe_php_register_variable_ex(char *var, zval *val, zval *track_vars
}
/* }}} */
-static void register_http_post_files_variable(char *strvar, char *val, zval *http_post_files, zend_bool override_protection) /* {{{ */
+static void register_http_post_files_variable(char *strvar, char *val, zval *http_post_files, bool override_protection) /* {{{ */
{
safe_php_register_variable(strvar, val, strlen(val), http_post_files, override_protection);
}
/* }}} */
-static void register_http_post_files_variable_ex(char *var, zval *val, zval *http_post_files, zend_bool override_protection) /* {{{ */
+static void register_http_post_files_variable_ex(char *var, zval *val, zval *http_post_files, bool override_protection) /* {{{ */
{
safe_php_register_variable_ex(var, val, http_post_files, override_protection);
}
diff --git a/main/spprintf.c b/main/spprintf.c
index 768a27470c..980294ea23 100644
--- a/main/spprintf.c
+++ b/main/spprintf.c
@@ -185,7 +185,7 @@ static size_t strnlen(const char *s, size_t maxlen) {
/*
* Do format conversion placing the output in buffer
*/
-static void xbuf_format_converter(void *xbuf, zend_bool is_char, const char *fmt, va_list ap) /* {{{ */
+static void xbuf_format_converter(void *xbuf, bool is_char, const char *fmt, va_list ap) /* {{{ */
{
char *s = NULL;
size_t s_len;
diff --git a/main/streams/memory.c b/main/streams/memory.c
index 0def3b1a3d..36515b8543 100644
--- a/main/streams/memory.c
+++ b/main/streams/memory.c
@@ -33,10 +33,8 @@ PHPAPI size_t php_url_decode(char *str, size_t len);
/* {{{ ------- MEMORY stream implementation -------*/
typedef struct {
- char *data;
+ zend_string *data;
size_t fpos;
- size_t fsize;
- size_t smax;
int mode;
} php_stream_memory_data;
@@ -50,23 +48,16 @@ static ssize_t php_stream_memory_write(php_stream *stream, const char *buf, size
if (ms->mode & TEMP_STREAM_READONLY) {
return (ssize_t) -1;
} else if (ms->mode & TEMP_STREAM_APPEND) {
- ms->fpos = ms->fsize;
+ ms->fpos = ZSTR_LEN(ms->data);
}
- if (ms->fpos + count > ms->fsize) {
- char *tmp;
- if (!ms->data) {
- tmp = emalloc(ms->fpos + count);
- } else {
- tmp = erealloc(ms->data, ms->fpos + count);
- }
- ms->data = tmp;
- ms->fsize = ms->fpos + count;
+ if (ms->fpos + count > ZSTR_LEN(ms->data)) {
+ ms->data = zend_string_realloc(ms->data, ms->fpos + count, 0);
+ } else {
+ ms->data = zend_string_separate(ms->data, 0);
}
- if (!ms->data)
- count = 0;
if (count) {
- assert(buf!= NULL);
- memcpy(ms->data+ms->fpos, (char*)buf, count);
+ ZEND_ASSERT(buf != NULL);
+ memcpy(ZSTR_VAL(ms->data) + ms->fpos, (char*) buf, count);
ms->fpos += count;
}
return count;
@@ -80,17 +71,16 @@ static ssize_t php_stream_memory_read(php_stream *stream, char *buf, size_t coun
php_stream_memory_data *ms = (php_stream_memory_data*)stream->abstract;
assert(ms != NULL);
- if (ms->fpos == ms->fsize) {
+ if (ms->fpos == ZSTR_LEN(ms->data)) {
stream->eof = 1;
count = 0;
} else {
- if (ms->fpos + count >= ms->fsize) {
- count = ms->fsize - ms->fpos;
+ if (ms->fpos + count > ZSTR_LEN(ms->data)) {
+ count = ZSTR_LEN(ms->data) - ms->fpos;
}
if (count) {
- assert(ms->data!= NULL);
- assert(buf!= NULL);
- memcpy(buf, ms->data+ms->fpos, count);
+ ZEND_ASSERT(buf != NULL);
+ memcpy(buf, ZSTR_VAL(ms->data) + ms->fpos, count);
ms->fpos += count;
}
}
@@ -103,11 +93,8 @@ static ssize_t php_stream_memory_read(php_stream *stream, char *buf, size_t coun
static int php_stream_memory_close(php_stream *stream, int close_handle)
{
php_stream_memory_data *ms = (php_stream_memory_data*)stream->abstract;
- assert(ms != NULL);
-
- if (ms->data && close_handle && ms->mode != TEMP_STREAM_READONLY) {
- efree(ms->data);
- }
+ ZEND_ASSERT(ms != NULL);
+ zend_string_release(ms->data);
efree(ms);
return 0;
}
@@ -143,8 +130,8 @@ static int php_stream_memory_seek(php_stream *stream, zend_off_t offset, int whe
return 0;
}
} else {
- if (ms->fpos + (size_t)(offset) > ms->fsize) {
- ms->fpos = ms->fsize;
+ if (ms->fpos + (size_t)(offset) > ZSTR_LEN(ms->data)) {
+ ms->fpos = ZSTR_LEN(ms->data);
*newoffs = -1;
return -1;
} else {
@@ -155,8 +142,8 @@ static int php_stream_memory_seek(php_stream *stream, zend_off_t offset, int whe
}
}
case SEEK_SET:
- if (ms->fsize < (size_t)(offset)) {
- ms->fpos = ms->fsize;
+ if (ZSTR_LEN(ms->data) < (size_t)(offset)) {
+ ms->fpos = ZSTR_LEN(ms->data);
*newoffs = -1;
return -1;
} else {
@@ -167,15 +154,15 @@ static int php_stream_memory_seek(php_stream *stream, zend_off_t offset, int whe
}
case SEEK_END:
if (offset > 0) {
- ms->fpos = ms->fsize;
+ ms->fpos = ZSTR_LEN(ms->data);
*newoffs = -1;
return -1;
- } else if (ms->fsize < (size_t)(-offset)) {
+ } else if (ZSTR_LEN(ms->data) < (size_t)(-offset)) {
ms->fpos = 0;
*newoffs = -1;
return -1;
} else {
- ms->fpos = ms->fsize + offset;
+ ms->fpos = ZSTR_LEN(ms->data) + offset;
*newoffs = ms->fpos;
stream->eof = 0;
return 0;
@@ -205,7 +192,7 @@ static int php_stream_memory_stat(php_stream *stream, php_stream_statbuf *ssb) /
ssb->sb.st_mode = ms->mode & TEMP_STREAM_READONLY ? 0444 : 0666;
- ssb->sb.st_size = ms->fsize;
+ ssb->sb.st_size = ZSTR_LEN(ms->data);
ssb->sb.st_mode |= S_IFREG; /* regular file */
ssb->sb.st_mtime = timestamp;
ssb->sb.st_atime = timestamp;
@@ -242,16 +229,16 @@ static int php_stream_memory_set_option(php_stream *stream, int option, int valu
return PHP_STREAM_OPTION_RETURN_ERR;
}
newsize = *(size_t*)ptrparam;
- if (newsize <= ms->fsize) {
+ if (newsize <= ZSTR_LEN(ms->data)) {
+ ms->data = zend_string_truncate(ms->data, newsize, 0);
if (newsize < ms->fpos) {
ms->fpos = newsize;
}
} else {
- ms->data = erealloc(ms->data, newsize);
- memset(ms->data+ms->fsize, 0, newsize - ms->fsize);
- ms->fsize = newsize;
+ size_t old_size = ZSTR_LEN(ms->data);
+ ms->data = zend_string_realloc(ms->data, newsize, 0);
+ memset(ZSTR_VAL(ms->data) + old_size, 0, newsize - old_size);
}
- ms->fsize = newsize;
return PHP_STREAM_OPTION_RETURN_OK;
}
}
@@ -301,10 +288,8 @@ PHPAPI php_stream *_php_stream_memory_create(int mode STREAMS_DC)
php_stream *stream;
self = emalloc(sizeof(*self));
- self->data = NULL;
+ self->data = ZSTR_EMPTY_ALLOC();
self->fpos = 0;
- self->fsize = 0;
- self->smax = ~0u;
self->mode = mode;
stream = php_stream_alloc_rel(&php_stream_memory_ops, self, 0, _php_stream_mode_to_str(mode));
@@ -315,24 +300,14 @@ PHPAPI php_stream *_php_stream_memory_create(int mode STREAMS_DC)
/* {{{ */
-PHPAPI php_stream *_php_stream_memory_open(int mode, const char *buf, size_t length STREAMS_DC)
+PHPAPI php_stream *_php_stream_memory_open(int mode, zend_string *buf STREAMS_DC)
{
php_stream *stream;
php_stream_memory_data *ms;
if ((stream = php_stream_memory_create_rel(mode)) != NULL) {
ms = (php_stream_memory_data*)stream->abstract;
-
- if (mode == TEMP_STREAM_READONLY || mode == TEMP_STREAM_TAKE_BUFFER) {
- /* use the buffer directly */
- ms->data = (char *) buf;
- ms->fsize = length;
- } else {
- if (length) {
- assert(buf != NULL);
- php_stream_write(stream, buf, length);
- }
- }
+ ms->data = zend_string_copy(buf);
}
return stream;
}
@@ -340,14 +315,10 @@ PHPAPI php_stream *_php_stream_memory_open(int mode, const char *buf, size_t len
/* {{{ */
-PHPAPI char *_php_stream_memory_get_buffer(php_stream *stream, size_t *length STREAMS_DC)
+PHPAPI zend_string *_php_stream_memory_get_buffer(php_stream *stream STREAMS_DC)
{
php_stream_memory_data *ms = (php_stream_memory_data*)stream->abstract;
-
- assert(ms != NULL);
- assert(length != 0);
-
- *length = ms->fsize;
+ ZEND_ASSERT(ms != NULL);
return ms->data;
}
/* }}} */
@@ -375,16 +346,15 @@ static ssize_t php_stream_temp_write(php_stream *stream, const char *buf, size_t
return -1;
}
if (php_stream_is(ts->innerstream, PHP_STREAM_IS_MEMORY)) {
- size_t memsize;
- char *membuf = php_stream_memory_get_buffer(ts->innerstream, &memsize);
+ zend_string *membuf = php_stream_memory_get_buffer(ts->innerstream);
- if (memsize + count >= ts->smax) {
+ if (ZSTR_LEN(membuf) + count >= ts->smax) {
php_stream *file = php_stream_fopen_temporary_file(ts->tmpdir, "php", NULL);
if (file == NULL) {
php_error_docref(NULL, E_WARNING, "Unable to create temporary file, Check permissions in temporary files directory.");
return 0;
}
- php_stream_write(file, membuf, memsize);
+ php_stream_write(file, ZSTR_VAL(membuf), ZSTR_LEN(membuf));
php_stream_free_enclosed(ts->innerstream, PHP_STREAM_FREE_CLOSE);
ts->innerstream = file;
php_stream_encloses(stream, ts->innerstream);
@@ -479,8 +449,7 @@ static int php_stream_temp_cast(php_stream *stream, int castas, void **ret)
{
php_stream_temp_data *ts = (php_stream_temp_data*)stream->abstract;
php_stream *file;
- size_t memsize;
- char *membuf;
+ zend_string *membuf;
zend_off_t pos;
assert(ts != NULL);
@@ -513,8 +482,8 @@ static int php_stream_temp_cast(php_stream *stream, int castas, void **ret)
}
/* perform the conversion and then pass the request on to the innerstream */
- membuf = php_stream_memory_get_buffer(ts->innerstream, &memsize);
- php_stream_write(file, membuf, memsize);
+ membuf = php_stream_memory_get_buffer(ts->innerstream);
+ php_stream_write(file, ZSTR_VAL(membuf), ZSTR_LEN(membuf));
pos = php_stream_tell(ts->innerstream);
php_stream_free_enclosed(ts->innerstream, PHP_STREAM_FREE_CLOSE);
diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c
index e3eda978d8..58b5b64e0e 100644
--- a/main/streams/plain_wrapper.c
+++ b/main/streams/plain_wrapper.c
@@ -351,7 +351,7 @@ static ssize_t php_stdiop_write(php_stream *stream, const char *buf, size_t coun
ssize_t bytes_written = write(data->fd, buf, count);
#endif
if (bytes_written < 0) {
- if (errno == EWOULDBLOCK || errno == EAGAIN) {
+ if (PHP_IS_TRANSIENT_ERROR(errno)) {
return 0;
}
if (errno == EINTR) {
@@ -422,7 +422,7 @@ static ssize_t php_stdiop_read(php_stream *stream, char *buf, size_t count)
}
if (ret < 0) {
- if (errno == EWOULDBLOCK || errno == EAGAIN) {
+ if (PHP_IS_TRANSIENT_ERROR(errno)) {
/* Not an error. */
ret = 0;
} else if (errno == EINTR) {
@@ -1157,12 +1157,14 @@ static php_stream *php_plain_files_stream_opener(php_stream_wrapper *wrapper, co
static int php_plain_files_url_stater(php_stream_wrapper *wrapper, const char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context)
{
- if (strncasecmp(url, "file://", sizeof("file://") - 1) == 0) {
- url += sizeof("file://") - 1;
- }
+ if (!(flags & PHP_STREAM_URL_STAT_IGNORE_OPEN_BASEDIR)) {
+ if (strncasecmp(url, "file://", sizeof("file://") - 1) == 0) {
+ url += sizeof("file://") - 1;
+ }
- if (php_check_open_basedir_ex(url, (flags & PHP_STREAM_URL_STAT_QUIET) ? 0 : 1)) {
- return -1;
+ if (php_check_open_basedir_ex(url, (flags & PHP_STREAM_URL_STAT_QUIET) ? 0 : 1)) {
+ return -1;
+ }
}
#ifdef PHP_WIN32
diff --git a/main/streams/streams.c b/main/streams/streams.c
index e5e90e0f4d..9bf7444412 100644
--- a/main/streams/streams.c
+++ b/main/streams/streams.c
@@ -1975,47 +1975,12 @@ PHPAPI int _php_stream_stat_path(const char *path, int flags, php_stream_statbuf
{
php_stream_wrapper *wrapper = NULL;
const char *path_to_open = path;
- int ret;
memset(ssb, 0, sizeof(*ssb));
- if (!(flags & PHP_STREAM_URL_STAT_NOCACHE)) {
- /* Try to hit the cache first */
- if (flags & PHP_STREAM_URL_STAT_LINK) {
- if (BG(CurrentLStatFile) && strcmp(path, BG(CurrentLStatFile)) == 0) {
- memcpy(ssb, &BG(lssb), sizeof(php_stream_statbuf));
- return 0;
- }
- } else {
- if (BG(CurrentStatFile) && strcmp(path, BG(CurrentStatFile)) == 0) {
- memcpy(ssb, &BG(ssb), sizeof(php_stream_statbuf));
- return 0;
- }
- }
- }
-
wrapper = php_stream_locate_url_wrapper(path, &path_to_open, 0);
if (wrapper && wrapper->wops->url_stat) {
- ret = wrapper->wops->url_stat(wrapper, path_to_open, flags, ssb, context);
- if (ret == 0) {
- if (!(flags & PHP_STREAM_URL_STAT_NOCACHE)) {
- /* Drop into cache */
- if (flags & PHP_STREAM_URL_STAT_LINK) {
- if (BG(CurrentLStatFile)) {
- efree(BG(CurrentLStatFile));
- }
- BG(CurrentLStatFile) = estrdup(path);
- memcpy(&BG(lssb), ssb, sizeof(php_stream_statbuf));
- } else {
- if (BG(CurrentStatFile)) {
- efree(BG(CurrentStatFile));
- }
- BG(CurrentStatFile) = estrdup(path);
- memcpy(&BG(ssb), ssb, sizeof(php_stream_statbuf));
- }
- }
- }
- return ret;
+ return wrapper->wops->url_stat(wrapper, path_to_open, flags, ssb, context);
}
return -1;
}
@@ -2078,10 +2043,14 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod
php_stream_wrapper *wrapper = NULL;
const char *path_to_open;
int persistent = options & STREAM_OPEN_PERSISTENT;
+ zend_string *path_str = NULL;
zend_string *resolved_path = NULL;
char *copy_of_path = NULL;
if (opened_path) {
+ if (options & STREAM_OPEN_FOR_ZEND_STREAM) {
+ path_str = *opened_path;
+ }
*opened_path = NULL;
}
@@ -2091,7 +2060,11 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod
}
if (options & USE_PATH) {
- resolved_path = zend_resolve_path(path, strlen(path));
+ if (path_str) {
+ resolved_path = zend_resolve_path(path_str);
+ } else {
+ resolved_path = php_resolve_path(path, strlen(path), PG(include_path));
+ }
if (resolved_path) {
path = ZSTR_VAL(resolved_path);
/* we've found this file, don't re-check include_path or run realpath */
diff --git a/main/streams/userspace.c b/main/streams/userspace.c
index 0e9059a99e..d9e864594c 100644
--- a/main/streams/userspace.c
+++ b/main/streams/userspace.c
@@ -310,7 +310,7 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
zval args[4];
int call_result;
php_stream *stream = NULL;
- zend_bool old_in_user_include;
+ bool old_in_user_include;
/* Try to catch bad usage without preventing flexibility */
if (FG(user_stream_current_filename) != NULL && strcmp(filename, FG(user_stream_current_filename)) == 0) {
diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c
index a369bf5ff2..e3ff3fe2ec 100644
--- a/main/streams/xp_socket.c
+++ b/main/streams/xp_socket.c
@@ -75,7 +75,8 @@ retry:
if (didwrite <= 0) {
char *estr;
int err = php_socket_errno();
- if (err == EWOULDBLOCK || err == EAGAIN) {
+
+ if (PHP_IS_TRANSIENT_ERROR(err)) {
if (sock->is_blocked) {
int retval;
@@ -169,7 +170,7 @@ static ssize_t php_sockop_read(php_stream *stream, char *buf, size_t count)
err = php_socket_errno();
if (nr_bytes < 0) {
- if (err == EAGAIN || err == EWOULDBLOCK) {
+ if (PHP_IS_TRANSIENT_ERROR(err)) {
nr_bytes = 0;
} else {
stream->eof = 1;
@@ -815,7 +816,7 @@ static inline int php_tcp_sockop_accept(php_stream *stream, php_netstream_data_t
php_stream_xport_param *xparam STREAMS_DC)
{
int clisock;
- zend_bool nodelay = 0;
+ bool nodelay = 0;
zval *tmpzval = NULL;
xparam->outputs.client = NULL;
diff --git a/php.ini-development b/php.ini-development
index 06e4a5af14..a8f538785b 100644
--- a/php.ini-development
+++ b/php.ini-development
@@ -17,7 +17,7 @@
; 6. The directory from the --with-config-file-path compile time option, or the
; Windows directory (usually C:\windows)
; See the PHP docs for more specific information.
-; http://php.net/configuration.file
+; https://php.net/configuration.file
; The syntax of the file is extremely simple. Whitespace and lines
; beginning with a semicolon are silently ignored (as you probably guessed).
@@ -31,7 +31,7 @@
; special sections cannot be overridden by user-defined INI files or
; at runtime. Currently, [PATH=] and [HOST=] sections only work under
; CGI/FastCGI.
-; http://php.net/ini.sections
+; https://php.net/ini.sections
; Directives are specified using the following syntax:
; directive = value
@@ -181,7 +181,7 @@
;;;;;;;;;;;;;;;;;;;;
; Enable the PHP scripting language engine under Apache.
-; http://php.net/engine
+; https://php.net/engine
engine = On
; This directive determines whether or not PHP will recognize code between
@@ -194,11 +194,11 @@ engine = On
; Default Value: On
; Development Value: Off
; Production Value: Off
-; http://php.net/short-open-tag
+; https://php.net/short-open-tag
short_open_tag = Off
; The number of significant digits displayed in floating point numbers.
-; http://php.net/precision
+; https://php.net/precision
precision = 14
; Output buffering is a mechanism for controlling how much output data
@@ -222,7 +222,7 @@ precision = 14
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
-; http://php.net/output-buffering
+; https://php.net/output-buffering
output_buffering = 4096
; You can redirect all of the output of your scripts to a function. For
@@ -237,7 +237,7 @@ output_buffering = 4096
; and you cannot use both "ob_gzhandler" and "zlib.output_compression".
; Note: output_handler must be empty if this is set 'On' !!!!
; Instead you must use zlib.output_handler.
-; http://php.net/output-handler
+; https://php.net/output-handler
;output_handler =
; URL rewriter function rewrites URL on the fly by using
@@ -266,16 +266,16 @@ output_buffering = 4096
; performance, enable output_buffering in addition.
; Note: You need to use zlib.output_handler instead of the standard
; output_handler, or otherwise the output will be corrupted.
-; http://php.net/zlib.output-compression
+; https://php.net/zlib.output-compression
zlib.output_compression = Off
-; http://php.net/zlib.output-compression-level
+; https://php.net/zlib.output-compression-level
;zlib.output_compression_level = -1
; You cannot specify additional output handlers if zlib.output_compression
; is activated here. This setting does the same as output_handler but in
; a different order.
-; http://php.net/zlib.output-handler
+; https://php.net/zlib.output-handler
;zlib.output_handler =
; Implicit flush tells PHP to tell the output layer to flush itself
@@ -283,7 +283,7 @@ zlib.output_compression = Off
; PHP function flush() after each and every call to print() or echo() and each
; and every HTML block. Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only.
-; http://php.net/implicit-flush
+; https://php.net/implicit-flush
; Note: This directive is hardcoded to On for the CLI SAPI
implicit_flush = Off
@@ -314,22 +314,22 @@ serialize_precision = -1
; and below. This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file.
; Note: disables the realpath cache
-; http://php.net/open-basedir
+; https://php.net/open-basedir
;open_basedir =
; This directive allows you to disable certain functions.
; It receives a comma-delimited list of function names.
-; http://php.net/disable-functions
+; https://php.net/disable-functions
disable_functions =
; This directive allows you to disable certain classes.
; It receives a comma-delimited list of class names.
-; http://php.net/disable-classes
+; https://php.net/disable-classes
disable_classes =
; Colors for Syntax Highlighting mode. Anything that's acceptable in
; <span style="color: ???????"> would work.
-; http://php.net/syntax-highlighting
+; https://php.net/syntax-highlighting
;highlight.string = #DD0000
;highlight.comment = #FF9900
;highlight.keyword = #007700
@@ -340,24 +340,24 @@ disable_classes =
; the request. Consider enabling it if executing long requests, which may end up
; being interrupted by the user or a browser timing out. PHP's default behavior
; is to disable this feature.
-; http://php.net/ignore-user-abort
+; https://php.net/ignore-user-abort
;ignore_user_abort = On
; Determines the size of the realpath cache to be used by PHP. This value should
; be increased on systems where PHP opens many files to reflect the quantity of
; the file operations performed.
; Note: if open_basedir is set, the cache is disabled
-; http://php.net/realpath-cache-size
+; https://php.net/realpath-cache-size
;realpath_cache_size = 4096k
; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
-; http://php.net/realpath-cache-ttl
+; https://php.net/realpath-cache-ttl
;realpath_cache_ttl = 120
; Enables or disables the circular reference collector.
-; http://php.net/zend.enable-gc
+; https://php.net/zend.enable-gc
zend.enable_gc = On
; If enabled, scripts may be written in encodings that are incompatible with
@@ -394,7 +394,7 @@ zend.exception_string_param_max_len = 15
; (e.g. by adding its signature to the Web server header). It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
-; http://php.net/expose-php
+; https://php.net/expose-php
expose_php = On
;;;;;;;;;;;;;;;;;;;
@@ -402,7 +402,7 @@ expose_php = On
;;;;;;;;;;;;;;;;;;;
; Maximum execution time of each script, in seconds
-; http://php.net/max-execution-time
+; https://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 30
@@ -413,18 +413,18 @@ max_execution_time = 30
; Default Value: -1 (Unlimited)
; Development Value: 60 (60 seconds)
; Production Value: 60 (60 seconds)
-; http://php.net/max-input-time
+; https://php.net/max-input-time
max_input_time = 60
; Maximum input variable nesting level
-; http://php.net/max-input-nesting-level
+; https://php.net/max-input-nesting-level
;max_input_nesting_level = 64
; How many GET/POST/COOKIE input variables may be accepted
;max_input_vars = 1000
; Maximum amount of memory a script may consume
-; http://php.net/memory-limit
+; https://php.net/memory-limit
memory_limit = 128M
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -480,7 +480,7 @@ memory_limit = 128M
; Default Value: E_ALL
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
-; http://php.net/error-reporting
+; https://php.net/error-reporting
error_reporting = E_ALL
; This directive controls whether or not and where PHP will output errors,
@@ -497,7 +497,7 @@ error_reporting = E_ALL
; Default Value: On
; Development Value: On
; Production Value: Off
-; http://php.net/display-errors
+; https://php.net/display-errors
display_errors = On
; The display of errors which occur during PHP's startup sequence are handled
@@ -506,7 +506,7 @@ display_errors = On
; Default Value: On
; Development Value: On
; Production Value: Off
-; http://php.net/display-startup-errors
+; https://php.net/display-startup-errors
display_startup_errors = On
; Besides displaying errors, PHP can also log errors to locations such as a
@@ -516,36 +516,36 @@ display_startup_errors = On
; Default Value: Off
; Development Value: On
; Production Value: On
-; http://php.net/log-errors
+; https://php.net/log-errors
log_errors = On
; Set maximum length of log_errors. In error_log information about the source is
; added. The default is 1024 and 0 allows to not apply any maximum length at all.
-; http://php.net/log-errors-max-len
+; https://php.net/log-errors-max-len
log_errors_max_len = 1024
; Do not log repeated messages. Repeated errors must occur in same file on same
; line unless ignore_repeated_source is set true.
-; http://php.net/ignore-repeated-errors
+; https://php.net/ignore-repeated-errors
ignore_repeated_errors = Off
; Ignore source of message when ignoring repeated messages. When this setting
; is On you will not log errors with repeated messages from different files or
; source lines.
-; http://php.net/ignore-repeated-source
+; https://php.net/ignore-repeated-source
ignore_repeated_source = Off
; If this parameter is set to Off, then memory leaks will not be shown (on
; stdout or in the log). This is only effective in a debug compile, and if
; error reporting includes E_WARNING in the allowed list
-; http://php.net/report-memleaks
+; https://php.net/report-memleaks
report_memleaks = On
; This setting is off by default.
;report_zend_debug = 0
; Turn off normal error reporting and emit XML-RPC error XML
-; http://php.net/xmlrpc-errors
+; https://php.net/xmlrpc-errors
;xmlrpc_errors = 0
; An XML-RPC faultCode
@@ -555,40 +555,40 @@ report_memleaks = On
; error message as HTML for easier reading. This directive controls whether
; the error message is formatted as HTML or not.
; Note: This directive is hardcoded to Off for the CLI SAPI
-; http://php.net/html-errors
+; https://php.net/html-errors
;html_errors = On
; If html_errors is set to On *and* docref_root is not empty, then PHP
; produces clickable error messages that direct to a page describing the error
; or function causing the error in detail.
-; You can download a copy of the PHP manual from http://php.net/docs
+; You can download a copy of the PHP manual from https://php.net/docs
; and change docref_root to the base URL of your local copy including the
; leading '/'. You must also specify the file extension being used including
; the dot. PHP's default behavior is to leave these settings empty, in which
; case no links to documentation are generated.
; Note: Never use this feature for production boxes.
-; http://php.net/docref-root
+; https://php.net/docref-root
; Examples
;docref_root = "/phpmanual/"
-; http://php.net/docref-ext
+; https://php.net/docref-ext
;docref_ext = .html
; String to output before an error message. PHP's default behavior is to leave
; this setting blank.
-; http://php.net/error-prepend-string
+; https://php.net/error-prepend-string
; Example:
;error_prepend_string = "<span style='color: #ff0000'>"
; String to output after an error message. PHP's default behavior is to leave
; this setting blank.
-; http://php.net/error-append-string
+; https://php.net/error-append-string
; Example:
;error_append_string = "</span>"
; Log errors to specified file. PHP's default behavior is to leave this value
; empty.
-; http://php.net/error-log
+; https://php.net/error-log
; Example:
;error_log = php_errors.log
; Log errors to syslog (Event Log on Windows).
@@ -611,7 +611,7 @@ report_memleaks = On
; no-ctrl (all characters except control characters)
; all (all characters)
; raw (like "all", but messages are not split at newlines)
-; http://php.net/syslog.filter
+; https://php.net/syslog.filter
;syslog.filter = ascii
;windows.show_crt_warning
@@ -625,14 +625,14 @@ report_memleaks = On
; The separator used in PHP generated URLs to separate arguments.
; PHP's default setting is "&".
-; http://php.net/arg-separator.output
+; https://php.net/arg-separator.output
; Example:
;arg_separator.output = "&amp;"
; List of separator(s) used by PHP to parse input URLs into variables.
; PHP's default setting is "&".
; NOTE: Every character in this directive is considered as separator!
-; http://php.net/arg-separator.input
+; https://php.net/arg-separator.input
; Example:
;arg_separator.input = ";&"
@@ -646,7 +646,7 @@ report_memleaks = On
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
-; http://php.net/variables-order
+; https://php.net/variables-order
variables_order = "GPCS"
; This directive determines which super global data (G,P & C) should be
@@ -659,7 +659,7 @@ variables_order = "GPCS"
; Default Value: None
; Development Value: "GP"
; Production Value: "GP"
-; http://php.net/request-order
+; https://php.net/request-order
request_order = "GP"
; This directive determines whether PHP registers $argv & $argc each time it
@@ -674,7 +674,7 @@ request_order = "GP"
; Default Value: On
; Development Value: Off
; Production Value: Off
-; http://php.net/register-argc-argv
+; https://php.net/register-argc-argv
register_argc_argv = Off
; When enabled, the ENV, REQUEST and SERVER variables are created when they're
@@ -682,7 +682,7 @@ register_argc_argv = Off
; variables are not used within a script, having this directive on will result
; in a performance gain. The PHP directive register_argc_argv must be disabled
; for this directive to have any effect.
-; http://php.net/auto-globals-jit
+; https://php.net/auto-globals-jit
auto_globals_jit = On
; Whether PHP will read the POST data.
@@ -691,48 +691,48 @@ auto_globals_jit = On
; and $_FILES to always be empty; the only way you will be able to read the
; POST data will be through the php://input stream wrapper. This can be useful
; to proxy requests or to process the POST data in a memory efficient fashion.
-; http://php.net/enable-post-data-reading
+; https://php.net/enable-post-data-reading
;enable_post_data_reading = Off
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
-; http://php.net/post-max-size
+; https://php.net/post-max-size
post_max_size = 8M
; Automatically add files before PHP document.
-; http://php.net/auto-prepend-file
+; https://php.net/auto-prepend-file
auto_prepend_file =
; Automatically add files after PHP document.
-; http://php.net/auto-append-file
+; https://php.net/auto-append-file
auto_append_file =
; By default, PHP will output a media type using the Content-Type header. To
; disable this, simply set it to be empty.
;
; PHP's built-in default media type is set to text/html.
-; http://php.net/default-mimetype
+; https://php.net/default-mimetype
default_mimetype = "text/html"
; PHP's default character set is set to UTF-8.
-; http://php.net/default-charset
+; https://php.net/default-charset
default_charset = "UTF-8"
; PHP internal character encoding is set to empty.
; If empty, default_charset is used.
-; http://php.net/internal-encoding
+; https://php.net/internal-encoding
;internal_encoding =
; PHP input character encoding is set to empty.
; If empty, default_charset is used.
-; http://php.net/input-encoding
+; https://php.net/input-encoding
;input_encoding =
; PHP output character encoding is set to empty.
; If empty, default_charset is used.
; See also output_buffer.
-; http://php.net/output-encoding
+; https://php.net/output-encoding
;output_encoding =
;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -746,23 +746,23 @@ default_charset = "UTF-8"
;include_path = ".;c:\php\includes"
;
; PHP's default setting for include_path is ".;/path/to/php/pear"
-; http://php.net/include-path
+; https://php.net/include-path
; The root of the PHP pages, used only if nonempty.
; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root
; if you are running php as a CGI under any web server (other than IIS)
; see documentation for security issues. The alternate is to use the
; cgi.force_redirect configuration below
-; http://php.net/doc-root
+; https://php.net/doc-root
doc_root =
; The directory under which PHP opens the script using /~username used only
; if nonempty.
-; http://php.net/user-dir
+; https://php.net/user-dir
user_dir =
; Directory in which the loadable extensions (modules) reside.
-; http://php.net/extension-dir
+; https://php.net/extension-dir
;extension_dir = "./"
; On windows:
;extension_dir = "ext"
@@ -774,14 +774,14 @@ user_dir =
; Whether or not to enable the dl() function. The dl() function does NOT work
; properly in multithreaded servers, such as IIS or Zeus, and is automatically
; disabled on them.
-; http://php.net/enable-dl
+; https://php.net/enable-dl
enable_dl = Off
; cgi.force_redirect is necessary to provide security running PHP as a CGI under
; most web servers. Left undefined, PHP turns this on by default. You can
; turn it off here AT YOUR OWN RISK
; **You CAN safely turn this off for IIS, in fact, you MUST.**
-; http://php.net/cgi.force-redirect
+; https://php.net/cgi.force-redirect
;cgi.force_redirect = 1
; if cgi.nph is enabled it will force cgi to always sent Status: 200 with
@@ -792,7 +792,7 @@ enable_dl = Off
; (iPlanet) web servers, you MAY need to set an environment variable name that PHP
; will look for to know it is OK to continue execution. Setting this variable MAY
; cause security issues, KNOW WHAT YOU ARE DOING FIRST.
-; http://php.net/cgi.redirect-status-env
+; https://php.net/cgi.redirect-status-env
;cgi.redirect_status_env =
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
@@ -801,7 +801,7 @@ enable_dl = Off
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
-; http://php.net/cgi.fix-pathinfo
+; https://php.net/cgi.fix-pathinfo
;cgi.fix_pathinfo=1
; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside
@@ -813,7 +813,7 @@ enable_dl = Off
; security context that the request runs under. mod_fastcgi under Apache
; does not currently support this feature (03/17/2002)
; Set to 1 if running under IIS. Default is zero.
-; http://php.net/fastcgi.impersonate
+; https://php.net/fastcgi.impersonate
;fastcgi.impersonate = 1
; Disable logging through FastCGI connection. PHP's default behavior is to enable
@@ -825,14 +825,14 @@ enable_dl = Off
; is supported by Apache. When this option is set to 1, PHP will send
; RFC2616 compliant header.
; Default is zero.
-; http://php.net/cgi.rfc2616-headers
+; https://php.net/cgi.rfc2616-headers
;cgi.rfc2616_headers = 0
; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #!
; (shebang) at the top of the running script. This line might be needed if the
; script support running both as stand-alone script and via PHP CGI<. PHP in CGI
; mode skips this line and ignores its content if this directive is turned on.
-; http://php.net/cgi.check-shebang-line
+; https://php.net/cgi.check-shebang-line
;cgi.check_shebang_line=1
;;;;;;;;;;;;;;;;
@@ -840,16 +840,16 @@ enable_dl = Off
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
-; http://php.net/file-uploads
+; https://php.net/file-uploads
file_uploads = On
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
-; http://php.net/upload-tmp-dir
+; https://php.net/upload-tmp-dir
;upload_tmp_dir =
; Maximum allowed size for uploaded files.
-; http://php.net/upload-max-filesize
+; https://php.net/upload-max-filesize
upload_max_filesize = 2M
; Maximum number of files that can be uploaded via a single request
@@ -860,24 +860,24 @@ max_file_uploads = 20
;;;;;;;;;;;;;;;;;;
; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
-; http://php.net/allow-url-fopen
+; https://php.net/allow-url-fopen
allow_url_fopen = On
-; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
-; http://php.net/allow-url-include
+; Whether to allow include/require to open URLs (like https:// or ftp://) as files.
+; https://php.net/allow-url-include
allow_url_include = Off
; Define the anonymous ftp password (your email address). PHP's default setting
; for this is empty.
-; http://php.net/from
+; https://php.net/from
;from="john@doe.com"
; Define the User-Agent string. PHP's default setting for this is empty.
-; http://php.net/user-agent
+; https://php.net/user-agent
;user_agent="PHP"
; Default timeout for socket based streams (seconds)
-; http://php.net/default-socket-timeout
+; https://php.net/default-socket-timeout
default_socket_timeout = 60
; If your scripts have to deal with files from Macintosh systems,
@@ -885,7 +885,7 @@ default_socket_timeout = 60
; unix or win32 systems, setting this flag will cause PHP to
; automatically detect the EOL character in those files so that
; fgets() and file() will work regardless of the source of the file.
-; http://php.net/auto-detect-line-endings
+; https://php.net/auto-detect-line-endings
;auto_detect_line_endings = Off
;;;;;;;;;;;;;;;;;;;;;;
@@ -945,7 +945,7 @@ default_socket_timeout = 60
;extension=shmop
; The MIBS data available in the PHP distribution must be installed.
-; See http://www.php.net/manual/en/snmp.installation.php
+; See https://www.php.net/manual/en/snmp.installation.php
;extension=snmp
;extension=soap
@@ -967,26 +967,26 @@ cli_server.color = On
[Date]
; Defines the default timezone used by the date functions
-; http://php.net/date.timezone
+; https://php.net/date.timezone
;date.timezone =
-; http://php.net/date.default-latitude
+; https://php.net/date.default-latitude
;date.default_latitude = 31.7667
-; http://php.net/date.default-longitude
+; https://php.net/date.default-longitude
;date.default_longitude = 35.2333
-; http://php.net/date.sunrise-zenith
+; https://php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.833333
-; http://php.net/date.sunset-zenith
+; https://php.net/date.sunset-zenith
;date.sunset_zenith = 90.833333
[filter]
-; http://php.net/filter.default
+; https://php.net/filter.default
;filter.default = unsafe_raw
-; http://php.net/filter.default-flags
+; https://php.net/filter.default-flags
;filter.default_flags =
[iconv]
@@ -1024,7 +1024,7 @@ cli_server.color = On
[sqlite3]
; Directory pointing to SQLite3 extensions
-; http://php.net/sqlite3.extension-dir
+; https://php.net/sqlite3.extension-dir
;sqlite3.extension_dir =
; SQLite defensive mode flag (only available from SQLite 3.26+)
@@ -1038,14 +1038,14 @@ cli_server.color = On
[Pcre]
; PCRE library backtracking limit.
-; http://php.net/pcre.backtrack-limit
+; https://php.net/pcre.backtrack-limit
;pcre.backtrack_limit=100000
; PCRE library recursion limit.
; Please note that if you set this value to a high number you may consume all
; the available process stack and eventually crash PHP (due to reaching the
; stack size limit imposed by the Operating System).
-; http://php.net/pcre.recursion-limit
+; https://php.net/pcre.recursion-limit
;pcre.recursion_limit=100000
; Enables or disables JIT compilation of patterns. This requires the PCRE
@@ -1054,7 +1054,7 @@ cli_server.color = On
[Pdo]
; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off"
-; http://php.net/pdo-odbc.connection-pooling
+; https://php.net/pdo-odbc.connection-pooling
;pdo_odbc.connection_pooling=strict
[Pdo_mysql]
@@ -1063,27 +1063,27 @@ cli_server.color = On
pdo_mysql.default_socket=
[Phar]
-; http://php.net/phar.readonly
+; https://php.net/phar.readonly
;phar.readonly = On
-; http://php.net/phar.require-hash
+; https://php.net/phar.require-hash
;phar.require_hash = On
;phar.cache_list =
[mail function]
; For Win32 only.
-; http://php.net/smtp
+; https://php.net/smtp
SMTP = localhost
-; http://php.net/smtp-port
+; https://php.net/smtp-port
smtp_port = 25
; For Win32 only.
-; http://php.net/sendmail-from
+; https://php.net/sendmail-from
;sendmail_from = me@example.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
-; http://php.net/sendmail-path
+; https://php.net/sendmail-path
;sendmail_path =
; Force the addition of the specified parameters to be passed as extra parameters
@@ -1101,13 +1101,13 @@ mail.add_x_header = Off
;mail.log = syslog
[ODBC]
-; http://php.net/odbc.default-db
+; https://php.net/odbc.default-db
;odbc.default_db = Not yet implemented
-; http://php.net/odbc.default-user
+; https://php.net/odbc.default-user
;odbc.default_user = Not yet implemented
-; http://php.net/odbc.default-pw
+; https://php.net/odbc.default-pw
;odbc.default_pw = Not yet implemented
; Controls the ODBC cursor model.
@@ -1115,68 +1115,72 @@ mail.add_x_header = Off
;odbc.default_cursortype
; Allow or prevent persistent links.
-; http://php.net/odbc.allow-persistent
+; https://php.net/odbc.allow-persistent
odbc.allow_persistent = On
; Check that a connection is still valid before reuse.
-; http://php.net/odbc.check-persistent
+; https://php.net/odbc.check-persistent
odbc.check_persistent = On
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/odbc.max-persistent
+; https://php.net/odbc.max-persistent
odbc.max_persistent = -1
; Maximum number of links (persistent + non-persistent). -1 means no limit.
-; http://php.net/odbc.max-links
+; https://php.net/odbc.max-links
odbc.max_links = -1
; Handling of LONG fields. Returns number of bytes to variables. 0 means
; passthru.
-; http://php.net/odbc.defaultlrl
+; https://php.net/odbc.defaultlrl
odbc.defaultlrl = 4096
; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char.
; See the documentation on odbc_binmode and odbc_longreadlen for an explanation
; of odbc.defaultlrl and odbc.defaultbinmode
-; http://php.net/odbc.defaultbinmode
+; https://php.net/odbc.defaultbinmode
odbc.defaultbinmode = 1
[MySQLi]
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/mysqli.max-persistent
+; https://php.net/mysqli.max-persistent
mysqli.max_persistent = -1
; Allow accessing, from PHP's perspective, local files with LOAD DATA statements
-; http://php.net/mysqli.allow_local_infile
+; https://php.net/mysqli.allow_local_infile
;mysqli.allow_local_infile = On
+; It allows the user to specify a folder where files that can be sent via LOAD DATA
+; LOCAL can exist. It is ignored if mysqli.allow_local_infile is enabled.
+;mysqli.local_infile_directory =
+
; Allow or prevent persistent links.
-; http://php.net/mysqli.allow-persistent
+; https://php.net/mysqli.allow-persistent
mysqli.allow_persistent = On
; Maximum number of links. -1 means no limit.
-; http://php.net/mysqli.max-links
+; https://php.net/mysqli.max-links
mysqli.max_links = -1
; Default port number for mysqli_connect(). If unset, mysqli_connect() will use
; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
; compile-time value defined MYSQL_PORT (in that order). Win32 will only look
; at MYSQL_PORT.
-; http://php.net/mysqli.default-port
+; https://php.net/mysqli.default-port
mysqli.default_port = 3306
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
-; http://php.net/mysqli.default-socket
+; https://php.net/mysqli.default-socket
mysqli.default_socket =
; Default host for mysqli_connect() (doesn't apply in safe mode).
-; http://php.net/mysqli.default-host
+; https://php.net/mysqli.default-host
mysqli.default_host =
; Default user for mysqli_connect() (doesn't apply in safe mode).
-; http://php.net/mysqli.default-user
+; https://php.net/mysqli.default-user
mysqli.default_user =
; Default password for mysqli_connect() (doesn't apply in safe mode).
@@ -1184,7 +1188,7 @@ mysqli.default_user =
; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw")
; and reveal this password! And of course, any users with read access to this
; file will be able to reveal the password as well.
-; http://php.net/mysqli.default-pw
+; https://php.net/mysqli.default-pw
mysqli.default_pw =
; Allow or prevent reconnect
@@ -1201,7 +1205,7 @@ mysqlnd.collect_memory_statistics = On
; Records communication from all extensions using mysqlnd to the specified log
; file.
-; http://php.net/mysqlnd.debug
+; https://php.net/mysqlnd.debug
;mysqlnd.debug =
; Defines which queries will be logged.
@@ -1228,25 +1232,25 @@ mysqlnd.collect_memory_statistics = On
; Connection: Enables privileged connections using external
; credentials (OCI_SYSOPER, OCI_SYSDBA)
-; http://php.net/oci8.privileged-connect
+; https://php.net/oci8.privileged-connect
;oci8.privileged_connect = Off
; Connection: The maximum number of persistent OCI8 connections per
; process. Using -1 means no limit.
-; http://php.net/oci8.max-persistent
+; https://php.net/oci8.max-persistent
;oci8.max_persistent = -1
; Connection: The maximum number of seconds a process is allowed to
; maintain an idle persistent connection. Using -1 means idle
; persistent connections will be maintained forever.
-; http://php.net/oci8.persistent-timeout
+; https://php.net/oci8.persistent-timeout
;oci8.persistent_timeout = -1
; Connection: The number of seconds that must pass before issuing a
; ping during oci_pconnect() to check the connection validity. When
; set to 0, each oci_pconnect() will cause a ping. Using -1 disables
; pings completely.
-; http://php.net/oci8.ping-interval
+; https://php.net/oci8.ping-interval
;oci8.ping_interval = 60
; Connection: Set this to a user chosen connection class to be used
@@ -1264,59 +1268,59 @@ mysqlnd.collect_memory_statistics = On
; Tuning: This option enables statement caching, and specifies how
; many statements to cache. Using 0 disables statement caching.
-; http://php.net/oci8.statement-cache-size
+; https://php.net/oci8.statement-cache-size
;oci8.statement_cache_size = 20
; Tuning: Enables statement prefetching and sets the default number of
; rows that will be fetched automatically after statement execution.
-; http://php.net/oci8.default-prefetch
+; https://php.net/oci8.default-prefetch
;oci8.default_prefetch = 100
; Compatibility. Using On means oci_close() will not close
; oci_connect() and oci_new_connect() connections.
-; http://php.net/oci8.old-oci-close-semantics
+; https://php.net/oci8.old-oci-close-semantics
;oci8.old_oci_close_semantics = Off
[PostgreSQL]
; Allow or prevent persistent links.
-; http://php.net/pgsql.allow-persistent
+; https://php.net/pgsql.allow-persistent
pgsql.allow_persistent = On
; Detect broken persistent links always with pg_pconnect().
; Auto reset feature requires a little overheads.
-; http://php.net/pgsql.auto-reset-persistent
+; https://php.net/pgsql.auto-reset-persistent
pgsql.auto_reset_persistent = Off
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/pgsql.max-persistent
+; https://php.net/pgsql.max-persistent
pgsql.max_persistent = -1
; Maximum number of links (persistent+non persistent). -1 means no limit.
-; http://php.net/pgsql.max-links
+; https://php.net/pgsql.max-links
pgsql.max_links = -1
; Ignore PostgreSQL backends Notice message or not.
; Notice message logging require a little overheads.
-; http://php.net/pgsql.ignore-notice
+; https://php.net/pgsql.ignore-notice
pgsql.ignore_notice = 0
; Log PostgreSQL backends Notice message or not.
; Unless pgsql.ignore_notice=0, module cannot log notice message.
-; http://php.net/pgsql.log-notice
+; https://php.net/pgsql.log-notice
pgsql.log_notice = 0
[bcmath]
; Number of decimal digits for all bcmath functions.
-; http://php.net/bcmath.scale
+; https://php.net/bcmath.scale
bcmath.scale = 0
[browscap]
-; http://php.net/browscap
+; https://php.net/browscap
;browscap = extra/browscap.ini
[Session]
; Handler used to store/retrieve data.
-; http://php.net/session.save-handler
+; https://php.net/session.save-handler
session.save_handler = files
; Argument passed to save_handler. In the case of files, this is the path
@@ -1345,7 +1349,7 @@ session.save_handler = files
;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
-; http://php.net/session.save-path
+; https://php.net/session.save-path
;session.save_path = "/tmp"
; Whether to use strict session mode.
@@ -1358,42 +1362,42 @@ session.save_handler = files
session.use_strict_mode = 0
; Whether to use cookies.
-; http://php.net/session.use-cookies
+; https://php.net/session.use-cookies
session.use_cookies = 1
-; http://php.net/session.cookie-secure
+; https://php.net/session.cookie-secure
;session.cookie_secure =
; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combating
; session hijacking when not specifying and managing your own session id. It is
; not the be-all and end-all of session hijacking defense, but it's a good start.
-; http://php.net/session.use-only-cookies
+; https://php.net/session.use-only-cookies
session.use_only_cookies = 1
; Name of the session (used as cookie name).
-; http://php.net/session.name
+; https://php.net/session.name
session.name = PHPSESSID
; Initialize session on request startup.
-; http://php.net/session.auto-start
+; https://php.net/session.auto-start
session.auto_start = 0
; Lifetime in seconds of cookie or, if 0, until browser is restarted.
-; http://php.net/session.cookie-lifetime
+; https://php.net/session.cookie-lifetime
session.cookie_lifetime = 0
; The path for which the cookie is valid.
-; http://php.net/session.cookie-path
+; https://php.net/session.cookie-path
session.cookie_path = /
; The domain for which the cookie is valid.
-; http://php.net/session.cookie-domain
+; https://php.net/session.cookie-domain
session.cookie_domain =
; Whether or not to add the httpOnly flag to the cookie, which makes it
; inaccessible to browser scripting languages such as JavaScript.
-; http://php.net/session.cookie-httponly
+; https://php.net/session.cookie-httponly
session.cookie_httponly =
; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF)
@@ -1403,7 +1407,7 @@ session.cookie_httponly =
session.cookie_samesite =
; Handler used to serialize data. php is the standard serializer of PHP.
-; http://php.net/session.serialize-handler
+; https://php.net/session.serialize-handler
session.serialize_handler = php
; Defines the probability that the 'garbage collection' process is started on every
@@ -1412,7 +1416,7 @@ session.serialize_handler = php
; Default Value: 1
; Development Value: 1
; Production Value: 1
-; http://php.net/session.gc-probability
+; https://php.net/session.gc-probability
session.gc_probability = 1
; Defines the probability that the 'garbage collection' process is started on every
@@ -1422,12 +1426,12 @@ session.gc_probability = 1
; Default Value: 100
; Development Value: 1000
; Production Value: 1000
-; http://php.net/session.gc-divisor
+; https://php.net/session.gc-divisor
session.gc_divisor = 1000
; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
-; http://php.net/session.gc-maxlifetime
+; https://php.net/session.gc-maxlifetime
session.gc_maxlifetime = 1440
; NOTE: If you are using the subdirectory option for storing session files
@@ -1441,16 +1445,16 @@ session.gc_maxlifetime = 1440
; Check HTTP Referer to invalidate externally stored URLs containing ids.
; HTTP_REFERER has to contain this substring for the session to be
; considered as valid.
-; http://php.net/session.referer-check
+; https://php.net/session.referer-check
session.referer_check =
; Set to {nocache,private,public,} to determine HTTP caching aspects
; or leave this empty to avoid sending anti-caching headers.
-; http://php.net/session.cache-limiter
+; https://php.net/session.cache-limiter
session.cache_limiter = nocache
; Document expires after n minutes.
-; http://php.net/session.cache-expire
+; https://php.net/session.cache-expire
session.cache_expire = 180
; trans sid support is disabled by default.
@@ -1462,13 +1466,13 @@ session.cache_expire = 180
; in publicly accessible computer.
; - User may access your site with the same session ID
; always using URL stored in browser's history or bookmarks.
-; http://php.net/session.use-trans-sid
+; https://php.net/session.use-trans-sid
session.use_trans_sid = 0
; Set session ID character length. This value could be between 22 to 256.
; Shorter length than default is supported only for compatibility reason.
; Users should use 32 or more chars.
-; http://php.net/session.sid-length
+; https://php.net/session.sid-length
; Default Value: 32
; Development Value: 26
; Production Value: 26
@@ -1483,7 +1487,7 @@ session.sid_length = 26
; Default Value: "a=href,area=href,frame=src,form="
; Development Value: "a=href,area=href,frame=src,form="
; Production Value: "a=href,area=href,frame=src,form="
-; http://php.net/url-rewriter.tags
+; https://php.net/url-rewriter.tags
session.trans_sid_tags = "a=href,area=href,frame=src,form="
; URL rewriter does not rewrite absolute URLs by default.
@@ -1508,14 +1512,14 @@ session.trans_sid_tags = "a=href,area=href,frame=src,form="
; Default Value: 4
; Development Value: 5
; Production Value: 5
-; http://php.net/session.hash-bits-per-character
+; https://php.net/session.hash-bits-per-character
session.sid_bits_per_character = 5
; Enable upload progress tracking in $_SESSION
; Default Value: On
; Development Value: On
; Production Value: On
-; http://php.net/session.upload-progress.enabled
+; https://php.net/session.upload-progress.enabled
;session.upload_progress.enabled = On
; Cleanup the progress information as soon as all POST data has been read
@@ -1523,14 +1527,14 @@ session.sid_bits_per_character = 5
; Default Value: On
; Development Value: On
; Production Value: On
-; http://php.net/session.upload-progress.cleanup
+; https://php.net/session.upload-progress.cleanup
;session.upload_progress.cleanup = On
; A prefix used for the upload progress key in $_SESSION
; Default Value: "upload_progress_"
; Development Value: "upload_progress_"
; Production Value: "upload_progress_"
-; http://php.net/session.upload-progress.prefix
+; https://php.net/session.upload-progress.prefix
;session.upload_progress.prefix = "upload_progress_"
; The index name (concatenated with the prefix) in $_SESSION
@@ -1538,7 +1542,7 @@ session.sid_bits_per_character = 5
; Default Value: "PHP_SESSION_UPLOAD_PROGRESS"
; Development Value: "PHP_SESSION_UPLOAD_PROGRESS"
; Production Value: "PHP_SESSION_UPLOAD_PROGRESS"
-; http://php.net/session.upload-progress.name
+; https://php.net/session.upload-progress.name
;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
; How frequently the upload progress should be updated.
@@ -1546,18 +1550,18 @@ session.sid_bits_per_character = 5
; Default Value: "1%"
; Development Value: "1%"
; Production Value: "1%"
-; http://php.net/session.upload-progress.freq
+; https://php.net/session.upload-progress.freq
;session.upload_progress.freq = "1%"
; The minimum delay between updates, in seconds
; Default Value: 1
; Development Value: 1
; Production Value: 1
-; http://php.net/session.upload-progress.min-freq
+; https://php.net/session.upload-progress.min-freq
;session.upload_progress.min_freq = "1"
; Only write session data when session data is changed. Enabled by default.
-; http://php.net/session.lazy-write
+; https://php.net/session.lazy-write
;session.lazy_write = On
[Assertion]
@@ -1569,48 +1573,48 @@ session.sid_bits_per_character = 5
; Default Value: 1
; Development Value: 1
; Production Value: -1
-; http://php.net/zend.assertions
+; https://php.net/zend.assertions
zend.assertions = 1
; Assert(expr); active by default.
-; http://php.net/assert.active
+; https://php.net/assert.active
;assert.active = On
; Throw an AssertionError on failed assertions
-; http://php.net/assert.exception
+; https://php.net/assert.exception
;assert.exception = On
; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active)
-; http://php.net/assert.warning
+; https://php.net/assert.warning
;assert.warning = On
; Don't bail out by default.
-; http://php.net/assert.bail
+; https://php.net/assert.bail
;assert.bail = Off
; User-function to be called if an assertion fails.
-; http://php.net/assert.callback
+; https://php.net/assert.callback
;assert.callback = 0
[COM]
; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs
-; http://php.net/com.typelib-file
+; https://php.net/com.typelib-file
;com.typelib_file =
; allow Distributed-COM calls
-; http://php.net/com.allow-dcom
+; https://php.net/com.allow-dcom
;com.allow_dcom = true
; autoregister constants of a component's typlib on com_load()
-; http://php.net/com.autoregister-typelib
+; https://php.net/com.autoregister-typelib
;com.autoregister_typelib = true
; register constants casesensitive
-; http://php.net/com.autoregister-casesensitive
+; https://php.net/com.autoregister-casesensitive
;com.autoregister_casesensitive = false
; show warnings on duplicate constant registrations
-; http://php.net/com.autoregister-verbose
+; https://php.net/com.autoregister-verbose
;com.autoregister_verbose = true
; The default character set code-page to use when passing strings to and from COM objects.
@@ -1624,7 +1628,7 @@ zend.assertions = 1
[mbstring]
; language for internal character representation.
; This affects mb_send_mail() and mbstring.detect_order.
-; http://php.net/mbstring.language
+; https://php.net/mbstring.language
;mbstring.language = Japanese
; Use of this INI entry is deprecated, use global internal_encoding instead.
@@ -1639,7 +1643,7 @@ zend.assertions = 1
; mbstring.encoding_translation = On is needed to use this setting.
; If empty, default_charset or input_encoding or mbstring.input is used.
; The precedence is: default_charset < input_encoding < mbstring.http_input
-; http://php.net/mbstring.http-input
+; https://php.net/mbstring.http-input
;mbstring.http_input =
; Use of this INI entry is deprecated, use global output_encoding instead.
@@ -1649,7 +1653,7 @@ zend.assertions = 1
; The precedence is: default_charset < output_encoding < mbstring.http_output
; To use an output encoding conversion, mbstring's output handler must be set
; otherwise output encoding conversion cannot be performed.
-; http://php.net/mbstring.http-output
+; https://php.net/mbstring.http-output
;mbstring.http_output =
; enable automatic encoding translation according to
@@ -1657,17 +1661,17 @@ zend.assertions = 1
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
; portable libs/applications.
-; http://php.net/mbstring.encoding-translation
+; https://php.net/mbstring.encoding-translation
;mbstring.encoding_translation = Off
; automatic encoding detection order.
; "auto" detect order is changed according to mbstring.language
-; http://php.net/mbstring.detect-order
+; https://php.net/mbstring.detect-order
;mbstring.detect_order = auto
; substitute_character used when character cannot be converted
; one from another
-; http://php.net/mbstring.substitute-character
+; https://php.net/mbstring.substitute-character
;mbstring.substitute_character = none
; Enable strict encoding detection.
@@ -1690,7 +1694,7 @@ zend.assertions = 1
; Tell the jpeg decode to ignore warnings and try to create
; a gd image. The warning will then be displayed as notices
; disabled by default
-; http://php.net/gd.jpeg-ignore-warning
+; https://php.net/gd.jpeg-ignore-warning
;gd.jpeg_ignore_warning = 1
[exif]
@@ -1699,47 +1703,47 @@ zend.assertions = 1
; given by corresponding encode setting. When empty mbstring.internal_encoding
; is used. For the decode settings you can distinguish between motorola and
; intel byte order. A decode setting cannot be empty.
-; http://php.net/exif.encode-unicode
+; https://php.net/exif.encode-unicode
;exif.encode_unicode = ISO-8859-15
-; http://php.net/exif.decode-unicode-motorola
+; https://php.net/exif.decode-unicode-motorola
;exif.decode_unicode_motorola = UCS-2BE
-; http://php.net/exif.decode-unicode-intel
+; https://php.net/exif.decode-unicode-intel
;exif.decode_unicode_intel = UCS-2LE
-; http://php.net/exif.encode-jis
+; https://php.net/exif.encode-jis
;exif.encode_jis =
-; http://php.net/exif.decode-jis-motorola
+; https://php.net/exif.decode-jis-motorola
;exif.decode_jis_motorola = JIS
-; http://php.net/exif.decode-jis-intel
+; https://php.net/exif.decode-jis-intel
;exif.decode_jis_intel = JIS
[Tidy]
; The path to a default tidy configuration file to use when using tidy
-; http://php.net/tidy.default-config
+; https://php.net/tidy.default-config
;tidy.default_config = /usr/local/lib/php/default.tcfg
; Should tidy clean and repair output automatically?
; WARNING: Do not use this option if you are generating non-html content
; such as dynamic images
-; http://php.net/tidy.clean-output
+; https://php.net/tidy.clean-output
tidy.clean_output = Off
[soap]
; Enables or disables WSDL caching feature.
-; http://php.net/soap.wsdl-cache-enabled
+; https://php.net/soap.wsdl-cache-enabled
soap.wsdl_cache_enabled=1
; Sets the directory name where SOAP extension will put cache files.
-; http://php.net/soap.wsdl-cache-dir
+; https://php.net/soap.wsdl-cache-dir
soap.wsdl_cache_dir="/tmp"
; (time to live) Sets the number of second while cached file will be used
; instead of original one.
-; http://php.net/soap.wsdl-cache-ttl
+; https://php.net/soap.wsdl-cache-ttl
soap.wsdl_cache_ttl=86400
; Sets the size of the cache limit. (Max. number of WSDL files to cache)
@@ -1894,12 +1898,12 @@ ldap.max_links = -1
; Specifies a PHP script that is going to be compiled and executed at server
; start-up.
-; http://php.net/opcache.preload
+; https://php.net/opcache.preload
;opcache.preload=
; Preloading code as root is not allowed for security reasons. This directive
; facilitates to let the preloading to be run as another user.
-; http://php.net/opcache.preload_user
+; https://php.net/opcache.preload_user
;opcache.preload_user=
; Prevents caching files that are less than this number of seconds old. It
diff --git a/php.ini-production b/php.ini-production
index d43db55e7b..2d6b45d25a 100644
--- a/php.ini-production
+++ b/php.ini-production
@@ -17,7 +17,7 @@
; 6. The directory from the --with-config-file-path compile time option, or the
; Windows directory (usually C:\windows)
; See the PHP docs for more specific information.
-; http://php.net/configuration.file
+; https://php.net/configuration.file
; The syntax of the file is extremely simple. Whitespace and lines
; beginning with a semicolon are silently ignored (as you probably guessed).
@@ -31,7 +31,7 @@
; special sections cannot be overridden by user-defined INI files or
; at runtime. Currently, [PATH=] and [HOST=] sections only work under
; CGI/FastCGI.
-; http://php.net/ini.sections
+; https://php.net/ini.sections
; Directives are specified using the following syntax:
; directive = value
@@ -181,7 +181,7 @@
;;;;;;;;;;;;;;;;;;;;
; Enable the PHP scripting language engine under Apache.
-; http://php.net/engine
+; https://php.net/engine
engine = On
; This directive determines whether or not PHP will recognize code between
@@ -194,11 +194,11 @@ engine = On
; Default Value: On
; Development Value: Off
; Production Value: Off
-; http://php.net/short-open-tag
+; https://php.net/short-open-tag
short_open_tag = Off
; The number of significant digits displayed in floating point numbers.
-; http://php.net/precision
+; https://php.net/precision
precision = 14
; Output buffering is a mechanism for controlling how much output data
@@ -222,7 +222,7 @@ precision = 14
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
-; http://php.net/output-buffering
+; https://php.net/output-buffering
output_buffering = 4096
; You can redirect all of the output of your scripts to a function. For
@@ -237,7 +237,7 @@ output_buffering = 4096
; and you cannot use both "ob_gzhandler" and "zlib.output_compression".
; Note: output_handler must be empty if this is set 'On' !!!!
; Instead you must use zlib.output_handler.
-; http://php.net/output-handler
+; https://php.net/output-handler
;output_handler =
; URL rewriter function rewrites URL on the fly by using
@@ -266,16 +266,16 @@ output_buffering = 4096
; performance, enable output_buffering in addition.
; Note: You need to use zlib.output_handler instead of the standard
; output_handler, or otherwise the output will be corrupted.
-; http://php.net/zlib.output-compression
+; https://php.net/zlib.output-compression
zlib.output_compression = Off
-; http://php.net/zlib.output-compression-level
+; https://php.net/zlib.output-compression-level
;zlib.output_compression_level = -1
; You cannot specify additional output handlers if zlib.output_compression
; is activated here. This setting does the same as output_handler but in
; a different order.
-; http://php.net/zlib.output-handler
+; https://php.net/zlib.output-handler
;zlib.output_handler =
; Implicit flush tells PHP to tell the output layer to flush itself
@@ -283,7 +283,7 @@ zlib.output_compression = Off
; PHP function flush() after each and every call to print() or echo() and each
; and every HTML block. Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only.
-; http://php.net/implicit-flush
+; https://php.net/implicit-flush
; Note: This directive is hardcoded to On for the CLI SAPI
implicit_flush = Off
@@ -314,22 +314,22 @@ serialize_precision = -1
; and below. This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file.
; Note: disables the realpath cache
-; http://php.net/open-basedir
+; https://php.net/open-basedir
;open_basedir =
; This directive allows you to disable certain functions.
; It receives a comma-delimited list of function names.
-; http://php.net/disable-functions
+; https://php.net/disable-functions
disable_functions =
; This directive allows you to disable certain classes.
; It receives a comma-delimited list of class names.
-; http://php.net/disable-classes
+; https://php.net/disable-classes
disable_classes =
; Colors for Syntax Highlighting mode. Anything that's acceptable in
; <span style="color: ???????"> would work.
-; http://php.net/syntax-highlighting
+; https://php.net/syntax-highlighting
;highlight.string = #DD0000
;highlight.comment = #FF9900
;highlight.keyword = #007700
@@ -340,24 +340,24 @@ disable_classes =
; the request. Consider enabling it if executing long requests, which may end up
; being interrupted by the user or a browser timing out. PHP's default behavior
; is to disable this feature.
-; http://php.net/ignore-user-abort
+; https://php.net/ignore-user-abort
;ignore_user_abort = On
; Determines the size of the realpath cache to be used by PHP. This value should
; be increased on systems where PHP opens many files to reflect the quantity of
; the file operations performed.
; Note: if open_basedir is set, the cache is disabled
-; http://php.net/realpath-cache-size
+; https://php.net/realpath-cache-size
;realpath_cache_size = 4096k
; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
-; http://php.net/realpath-cache-ttl
+; https://php.net/realpath-cache-ttl
;realpath_cache_ttl = 120
; Enables or disables the circular reference collector.
-; http://php.net/zend.enable-gc
+; https://php.net/zend.enable-gc
zend.enable_gc = On
; If enabled, scripts may be written in encodings that are incompatible with
@@ -396,7 +396,7 @@ zend.exception_string_param_max_len = 0
; (e.g. by adding its signature to the Web server header). It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
-; http://php.net/expose-php
+; https://php.net/expose-php
expose_php = On
;;;;;;;;;;;;;;;;;;;
@@ -404,7 +404,7 @@ expose_php = On
;;;;;;;;;;;;;;;;;;;
; Maximum execution time of each script, in seconds
-; http://php.net/max-execution-time
+; https://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 30
@@ -415,18 +415,18 @@ max_execution_time = 30
; Default Value: -1 (Unlimited)
; Development Value: 60 (60 seconds)
; Production Value: 60 (60 seconds)
-; http://php.net/max-input-time
+; https://php.net/max-input-time
max_input_time = 60
; Maximum input variable nesting level
-; http://php.net/max-input-nesting-level
+; https://php.net/max-input-nesting-level
;max_input_nesting_level = 64
; How many GET/POST/COOKIE input variables may be accepted
;max_input_vars = 1000
; Maximum amount of memory a script may consume
-; http://php.net/memory-limit
+; https://php.net/memory-limit
memory_limit = 128M
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -482,7 +482,7 @@ memory_limit = 128M
; Default Value: E_ALL
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
-; http://php.net/error-reporting
+; https://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
; This directive controls whether or not and where PHP will output errors,
@@ -499,7 +499,7 @@ error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
; Default Value: On
; Development Value: On
; Production Value: Off
-; http://php.net/display-errors
+; https://php.net/display-errors
display_errors = Off
; The display of errors which occur during PHP's startup sequence are handled
@@ -508,7 +508,7 @@ display_errors = Off
; Default Value: On
; Development Value: On
; Production Value: Off
-; http://php.net/display-startup-errors
+; https://php.net/display-startup-errors
display_startup_errors = Off
; Besides displaying errors, PHP can also log errors to locations such as a
@@ -518,36 +518,36 @@ display_startup_errors = Off
; Default Value: Off
; Development Value: On
; Production Value: On
-; http://php.net/log-errors
+; https://php.net/log-errors
log_errors = On
; Set maximum length of log_errors. In error_log information about the source is
; added. The default is 1024 and 0 allows to not apply any maximum length at all.
-; http://php.net/log-errors-max-len
+; https://php.net/log-errors-max-len
log_errors_max_len = 1024
; Do not log repeated messages. Repeated errors must occur in same file on same
; line unless ignore_repeated_source is set true.
-; http://php.net/ignore-repeated-errors
+; https://php.net/ignore-repeated-errors
ignore_repeated_errors = Off
; Ignore source of message when ignoring repeated messages. When this setting
; is On you will not log errors with repeated messages from different files or
; source lines.
-; http://php.net/ignore-repeated-source
+; https://php.net/ignore-repeated-source
ignore_repeated_source = Off
; If this parameter is set to Off, then memory leaks will not be shown (on
; stdout or in the log). This is only effective in a debug compile, and if
; error reporting includes E_WARNING in the allowed list
-; http://php.net/report-memleaks
+; https://php.net/report-memleaks
report_memleaks = On
; This setting is off by default.
;report_zend_debug = 0
; Turn off normal error reporting and emit XML-RPC error XML
-; http://php.net/xmlrpc-errors
+; https://php.net/xmlrpc-errors
;xmlrpc_errors = 0
; An XML-RPC faultCode
@@ -557,40 +557,40 @@ report_memleaks = On
; error message as HTML for easier reading. This directive controls whether
; the error message is formatted as HTML or not.
; Note: This directive is hardcoded to Off for the CLI SAPI
-; http://php.net/html-errors
+; https://php.net/html-errors
;html_errors = On
; If html_errors is set to On *and* docref_root is not empty, then PHP
; produces clickable error messages that direct to a page describing the error
; or function causing the error in detail.
-; You can download a copy of the PHP manual from http://php.net/docs
+; You can download a copy of the PHP manual from https://php.net/docs
; and change docref_root to the base URL of your local copy including the
; leading '/'. You must also specify the file extension being used including
; the dot. PHP's default behavior is to leave these settings empty, in which
; case no links to documentation are generated.
; Note: Never use this feature for production boxes.
-; http://php.net/docref-root
+; https://php.net/docref-root
; Examples
;docref_root = "/phpmanual/"
-; http://php.net/docref-ext
+; https://php.net/docref-ext
;docref_ext = .html
; String to output before an error message. PHP's default behavior is to leave
; this setting blank.
-; http://php.net/error-prepend-string
+; https://php.net/error-prepend-string
; Example:
;error_prepend_string = "<span style='color: #ff0000'>"
; String to output after an error message. PHP's default behavior is to leave
; this setting blank.
-; http://php.net/error-append-string
+; https://php.net/error-append-string
; Example:
;error_append_string = "</span>"
; Log errors to specified file. PHP's default behavior is to leave this value
; empty.
-; http://php.net/error-log
+; https://php.net/error-log
; Example:
;error_log = php_errors.log
; Log errors to syslog (Event Log on Windows).
@@ -613,7 +613,7 @@ report_memleaks = On
; no-ctrl (all characters except control characters)
; all (all characters)
; raw (like "all", but messages are not split at newlines)
-; http://php.net/syslog.filter
+; https://php.net/syslog.filter
;syslog.filter = ascii
;windows.show_crt_warning
@@ -627,14 +627,14 @@ report_memleaks = On
; The separator used in PHP generated URLs to separate arguments.
; PHP's default setting is "&".
-; http://php.net/arg-separator.output
+; https://php.net/arg-separator.output
; Example:
;arg_separator.output = "&amp;"
; List of separator(s) used by PHP to parse input URLs into variables.
; PHP's default setting is "&".
; NOTE: Every character in this directive is considered as separator!
-; http://php.net/arg-separator.input
+; https://php.net/arg-separator.input
; Example:
;arg_separator.input = ";&"
@@ -648,7 +648,7 @@ report_memleaks = On
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
-; http://php.net/variables-order
+; https://php.net/variables-order
variables_order = "GPCS"
; This directive determines which super global data (G,P & C) should be
@@ -661,7 +661,7 @@ variables_order = "GPCS"
; Default Value: None
; Development Value: "GP"
; Production Value: "GP"
-; http://php.net/request-order
+; https://php.net/request-order
request_order = "GP"
; This directive determines whether PHP registers $argv & $argc each time it
@@ -676,7 +676,7 @@ request_order = "GP"
; Default Value: On
; Development Value: Off
; Production Value: Off
-; http://php.net/register-argc-argv
+; https://php.net/register-argc-argv
register_argc_argv = Off
; When enabled, the ENV, REQUEST and SERVER variables are created when they're
@@ -684,7 +684,7 @@ register_argc_argv = Off
; variables are not used within a script, having this directive on will result
; in a performance gain. The PHP directive register_argc_argv must be disabled
; for this directive to have any effect.
-; http://php.net/auto-globals-jit
+; https://php.net/auto-globals-jit
auto_globals_jit = On
; Whether PHP will read the POST data.
@@ -693,48 +693,48 @@ auto_globals_jit = On
; and $_FILES to always be empty; the only way you will be able to read the
; POST data will be through the php://input stream wrapper. This can be useful
; to proxy requests or to process the POST data in a memory efficient fashion.
-; http://php.net/enable-post-data-reading
+; https://php.net/enable-post-data-reading
;enable_post_data_reading = Off
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
-; http://php.net/post-max-size
+; https://php.net/post-max-size
post_max_size = 8M
; Automatically add files before PHP document.
-; http://php.net/auto-prepend-file
+; https://php.net/auto-prepend-file
auto_prepend_file =
; Automatically add files after PHP document.
-; http://php.net/auto-append-file
+; https://php.net/auto-append-file
auto_append_file =
; By default, PHP will output a media type using the Content-Type header. To
; disable this, simply set it to be empty.
;
; PHP's built-in default media type is set to text/html.
-; http://php.net/default-mimetype
+; https://php.net/default-mimetype
default_mimetype = "text/html"
; PHP's default character set is set to UTF-8.
-; http://php.net/default-charset
+; https://php.net/default-charset
default_charset = "UTF-8"
; PHP internal character encoding is set to empty.
; If empty, default_charset is used.
-; http://php.net/internal-encoding
+; https://php.net/internal-encoding
;internal_encoding =
; PHP input character encoding is set to empty.
; If empty, default_charset is used.
-; http://php.net/input-encoding
+; https://php.net/input-encoding
;input_encoding =
; PHP output character encoding is set to empty.
; If empty, default_charset is used.
; See also output_buffer.
-; http://php.net/output-encoding
+; https://php.net/output-encoding
;output_encoding =
;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -748,23 +748,23 @@ default_charset = "UTF-8"
;include_path = ".;c:\php\includes"
;
; PHP's default setting for include_path is ".;/path/to/php/pear"
-; http://php.net/include-path
+; https://php.net/include-path
; The root of the PHP pages, used only if nonempty.
; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root
; if you are running php as a CGI under any web server (other than IIS)
; see documentation for security issues. The alternate is to use the
; cgi.force_redirect configuration below
-; http://php.net/doc-root
+; https://php.net/doc-root
doc_root =
; The directory under which PHP opens the script using /~username used only
; if nonempty.
-; http://php.net/user-dir
+; https://php.net/user-dir
user_dir =
; Directory in which the loadable extensions (modules) reside.
-; http://php.net/extension-dir
+; https://php.net/extension-dir
;extension_dir = "./"
; On windows:
;extension_dir = "ext"
@@ -776,14 +776,14 @@ user_dir =
; Whether or not to enable the dl() function. The dl() function does NOT work
; properly in multithreaded servers, such as IIS or Zeus, and is automatically
; disabled on them.
-; http://php.net/enable-dl
+; https://php.net/enable-dl
enable_dl = Off
; cgi.force_redirect is necessary to provide security running PHP as a CGI under
; most web servers. Left undefined, PHP turns this on by default. You can
; turn it off here AT YOUR OWN RISK
; **You CAN safely turn this off for IIS, in fact, you MUST.**
-; http://php.net/cgi.force-redirect
+; https://php.net/cgi.force-redirect
;cgi.force_redirect = 1
; if cgi.nph is enabled it will force cgi to always sent Status: 200 with
@@ -794,7 +794,7 @@ enable_dl = Off
; (iPlanet) web servers, you MAY need to set an environment variable name that PHP
; will look for to know it is OK to continue execution. Setting this variable MAY
; cause security issues, KNOW WHAT YOU ARE DOING FIRST.
-; http://php.net/cgi.redirect-status-env
+; https://php.net/cgi.redirect-status-env
;cgi.redirect_status_env =
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
@@ -803,7 +803,7 @@ enable_dl = Off
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
-; http://php.net/cgi.fix-pathinfo
+; https://php.net/cgi.fix-pathinfo
;cgi.fix_pathinfo=1
; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside
@@ -815,7 +815,7 @@ enable_dl = Off
; security context that the request runs under. mod_fastcgi under Apache
; does not currently support this feature (03/17/2002)
; Set to 1 if running under IIS. Default is zero.
-; http://php.net/fastcgi.impersonate
+; https://php.net/fastcgi.impersonate
;fastcgi.impersonate = 1
; Disable logging through FastCGI connection. PHP's default behavior is to enable
@@ -827,14 +827,14 @@ enable_dl = Off
; is supported by Apache. When this option is set to 1, PHP will send
; RFC2616 compliant header.
; Default is zero.
-; http://php.net/cgi.rfc2616-headers
+; https://php.net/cgi.rfc2616-headers
;cgi.rfc2616_headers = 0
; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #!
; (shebang) at the top of the running script. This line might be needed if the
; script support running both as stand-alone script and via PHP CGI<. PHP in CGI
; mode skips this line and ignores its content if this directive is turned on.
-; http://php.net/cgi.check-shebang-line
+; https://php.net/cgi.check-shebang-line
;cgi.check_shebang_line=1
;;;;;;;;;;;;;;;;
@@ -842,16 +842,16 @@ enable_dl = Off
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
-; http://php.net/file-uploads
+; https://php.net/file-uploads
file_uploads = On
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
-; http://php.net/upload-tmp-dir
+; https://php.net/upload-tmp-dir
;upload_tmp_dir =
; Maximum allowed size for uploaded files.
-; http://php.net/upload-max-filesize
+; https://php.net/upload-max-filesize
upload_max_filesize = 2M
; Maximum number of files that can be uploaded via a single request
@@ -862,24 +862,24 @@ max_file_uploads = 20
;;;;;;;;;;;;;;;;;;
; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
-; http://php.net/allow-url-fopen
+; https://php.net/allow-url-fopen
allow_url_fopen = On
-; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
-; http://php.net/allow-url-include
+; Whether to allow include/require to open URLs (like https:// or ftp://) as files.
+; https://php.net/allow-url-include
allow_url_include = Off
; Define the anonymous ftp password (your email address). PHP's default setting
; for this is empty.
-; http://php.net/from
+; https://php.net/from
;from="john@doe.com"
; Define the User-Agent string. PHP's default setting for this is empty.
-; http://php.net/user-agent
+; https://php.net/user-agent
;user_agent="PHP"
; Default timeout for socket based streams (seconds)
-; http://php.net/default-socket-timeout
+; https://php.net/default-socket-timeout
default_socket_timeout = 60
; If your scripts have to deal with files from Macintosh systems,
@@ -887,7 +887,7 @@ default_socket_timeout = 60
; unix or win32 systems, setting this flag will cause PHP to
; automatically detect the EOL character in those files so that
; fgets() and file() will work regardless of the source of the file.
-; http://php.net/auto-detect-line-endings
+; https://php.net/auto-detect-line-endings
;auto_detect_line_endings = Off
;;;;;;;;;;;;;;;;;;;;;;
@@ -947,7 +947,7 @@ default_socket_timeout = 60
;extension=shmop
; The MIBS data available in the PHP distribution must be installed.
-; See http://www.php.net/manual/en/snmp.installation.php
+; See https://www.php.net/manual/en/snmp.installation.php
;extension=snmp
;extension=soap
@@ -969,26 +969,26 @@ cli_server.color = On
[Date]
; Defines the default timezone used by the date functions
-; http://php.net/date.timezone
+; https://php.net/date.timezone
;date.timezone =
-; http://php.net/date.default-latitude
+; https://php.net/date.default-latitude
;date.default_latitude = 31.7667
-; http://php.net/date.default-longitude
+; https://php.net/date.default-longitude
;date.default_longitude = 35.2333
-; http://php.net/date.sunrise-zenith
+; https://php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.833333
-; http://php.net/date.sunset-zenith
+; https://php.net/date.sunset-zenith
;date.sunset_zenith = 90.833333
[filter]
-; http://php.net/filter.default
+; https://php.net/filter.default
;filter.default = unsafe_raw
-; http://php.net/filter.default-flags
+; https://php.net/filter.default-flags
;filter.default_flags =
[iconv]
@@ -1026,7 +1026,7 @@ cli_server.color = On
[sqlite3]
; Directory pointing to SQLite3 extensions
-; http://php.net/sqlite3.extension-dir
+; https://php.net/sqlite3.extension-dir
;sqlite3.extension_dir =
; SQLite defensive mode flag (only available from SQLite 3.26+)
@@ -1040,14 +1040,14 @@ cli_server.color = On
[Pcre]
; PCRE library backtracking limit.
-; http://php.net/pcre.backtrack-limit
+; https://php.net/pcre.backtrack-limit
;pcre.backtrack_limit=100000
; PCRE library recursion limit.
; Please note that if you set this value to a high number you may consume all
; the available process stack and eventually crash PHP (due to reaching the
; stack size limit imposed by the Operating System).
-; http://php.net/pcre.recursion-limit
+; https://php.net/pcre.recursion-limit
;pcre.recursion_limit=100000
; Enables or disables JIT compilation of patterns. This requires the PCRE
@@ -1056,7 +1056,7 @@ cli_server.color = On
[Pdo]
; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off"
-; http://php.net/pdo-odbc.connection-pooling
+; https://php.net/pdo-odbc.connection-pooling
;pdo_odbc.connection_pooling=strict
[Pdo_mysql]
@@ -1065,27 +1065,27 @@ cli_server.color = On
pdo_mysql.default_socket=
[Phar]
-; http://php.net/phar.readonly
+; https://php.net/phar.readonly
;phar.readonly = On
-; http://php.net/phar.require-hash
+; https://php.net/phar.require-hash
;phar.require_hash = On
;phar.cache_list =
[mail function]
; For Win32 only.
-; http://php.net/smtp
+; https://php.net/smtp
SMTP = localhost
-; http://php.net/smtp-port
+; https://php.net/smtp-port
smtp_port = 25
; For Win32 only.
-; http://php.net/sendmail-from
+; https://php.net/sendmail-from
;sendmail_from = me@example.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
-; http://php.net/sendmail-path
+; https://php.net/sendmail-path
;sendmail_path =
; Force the addition of the specified parameters to be passed as extra parameters
@@ -1103,13 +1103,13 @@ mail.add_x_header = Off
;mail.log = syslog
[ODBC]
-; http://php.net/odbc.default-db
+; https://php.net/odbc.default-db
;odbc.default_db = Not yet implemented
-; http://php.net/odbc.default-user
+; https://php.net/odbc.default-user
;odbc.default_user = Not yet implemented
-; http://php.net/odbc.default-pw
+; https://php.net/odbc.default-pw
;odbc.default_pw = Not yet implemented
; Controls the ODBC cursor model.
@@ -1117,68 +1117,72 @@ mail.add_x_header = Off
;odbc.default_cursortype
; Allow or prevent persistent links.
-; http://php.net/odbc.allow-persistent
+; https://php.net/odbc.allow-persistent
odbc.allow_persistent = On
; Check that a connection is still valid before reuse.
-; http://php.net/odbc.check-persistent
+; https://php.net/odbc.check-persistent
odbc.check_persistent = On
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/odbc.max-persistent
+; https://php.net/odbc.max-persistent
odbc.max_persistent = -1
; Maximum number of links (persistent + non-persistent). -1 means no limit.
-; http://php.net/odbc.max-links
+; https://php.net/odbc.max-links
odbc.max_links = -1
; Handling of LONG fields. Returns number of bytes to variables. 0 means
; passthru.
-; http://php.net/odbc.defaultlrl
+; https://php.net/odbc.defaultlrl
odbc.defaultlrl = 4096
; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char.
; See the documentation on odbc_binmode and odbc_longreadlen for an explanation
; of odbc.defaultlrl and odbc.defaultbinmode
-; http://php.net/odbc.defaultbinmode
+; https://php.net/odbc.defaultbinmode
odbc.defaultbinmode = 1
[MySQLi]
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/mysqli.max-persistent
+; https://php.net/mysqli.max-persistent
mysqli.max_persistent = -1
; Allow accessing, from PHP's perspective, local files with LOAD DATA statements
-; http://php.net/mysqli.allow_local_infile
+; https://php.net/mysqli.allow_local_infile
;mysqli.allow_local_infile = On
+; It allows the user to specify a folder where files that can be sent via LOAD DATA
+; LOCAL can exist. It is ignored if mysqli.allow_local_infile is enabled.
+;mysqli.local_infile_directory =
+
; Allow or prevent persistent links.
-; http://php.net/mysqli.allow-persistent
+; https://php.net/mysqli.allow-persistent
mysqli.allow_persistent = On
; Maximum number of links. -1 means no limit.
-; http://php.net/mysqli.max-links
+; https://php.net/mysqli.max-links
mysqli.max_links = -1
; Default port number for mysqli_connect(). If unset, mysqli_connect() will use
; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
; compile-time value defined MYSQL_PORT (in that order). Win32 will only look
; at MYSQL_PORT.
-; http://php.net/mysqli.default-port
+; https://php.net/mysqli.default-port
mysqli.default_port = 3306
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
-; http://php.net/mysqli.default-socket
+; https://php.net/mysqli.default-socket
mysqli.default_socket =
; Default host for mysqli_connect() (doesn't apply in safe mode).
-; http://php.net/mysqli.default-host
+; https://php.net/mysqli.default-host
mysqli.default_host =
; Default user for mysqli_connect() (doesn't apply in safe mode).
-; http://php.net/mysqli.default-user
+; https://php.net/mysqli.default-user
mysqli.default_user =
; Default password for mysqli_connect() (doesn't apply in safe mode).
@@ -1186,7 +1190,7 @@ mysqli.default_user =
; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw")
; and reveal this password! And of course, any users with read access to this
; file will be able to reveal the password as well.
-; http://php.net/mysqli.default-pw
+; https://php.net/mysqli.default-pw
mysqli.default_pw =
; Allow or prevent reconnect
@@ -1203,7 +1207,7 @@ mysqlnd.collect_memory_statistics = Off
; Records communication from all extensions using mysqlnd to the specified log
; file.
-; http://php.net/mysqlnd.debug
+; https://php.net/mysqlnd.debug
;mysqlnd.debug =
; Defines which queries will be logged.
@@ -1230,25 +1234,25 @@ mysqlnd.collect_memory_statistics = Off
; Connection: Enables privileged connections using external
; credentials (OCI_SYSOPER, OCI_SYSDBA)
-; http://php.net/oci8.privileged-connect
+; https://php.net/oci8.privileged-connect
;oci8.privileged_connect = Off
; Connection: The maximum number of persistent OCI8 connections per
; process. Using -1 means no limit.
-; http://php.net/oci8.max-persistent
+; https://php.net/oci8.max-persistent
;oci8.max_persistent = -1
; Connection: The maximum number of seconds a process is allowed to
; maintain an idle persistent connection. Using -1 means idle
; persistent connections will be maintained forever.
-; http://php.net/oci8.persistent-timeout
+; https://php.net/oci8.persistent-timeout
;oci8.persistent_timeout = -1
; Connection: The number of seconds that must pass before issuing a
; ping during oci_pconnect() to check the connection validity. When
; set to 0, each oci_pconnect() will cause a ping. Using -1 disables
; pings completely.
-; http://php.net/oci8.ping-interval
+; https://php.net/oci8.ping-interval
;oci8.ping_interval = 60
; Connection: Set this to a user chosen connection class to be used
@@ -1266,59 +1270,59 @@ mysqlnd.collect_memory_statistics = Off
; Tuning: This option enables statement caching, and specifies how
; many statements to cache. Using 0 disables statement caching.
-; http://php.net/oci8.statement-cache-size
+; https://php.net/oci8.statement-cache-size
;oci8.statement_cache_size = 20
; Tuning: Enables statement prefetching and sets the default number of
; rows that will be fetched automatically after statement execution.
-; http://php.net/oci8.default-prefetch
+; https://php.net/oci8.default-prefetch
;oci8.default_prefetch = 100
; Compatibility. Using On means oci_close() will not close
; oci_connect() and oci_new_connect() connections.
-; http://php.net/oci8.old-oci-close-semantics
+; https://php.net/oci8.old-oci-close-semantics
;oci8.old_oci_close_semantics = Off
[PostgreSQL]
; Allow or prevent persistent links.
-; http://php.net/pgsql.allow-persistent
+; https://php.net/pgsql.allow-persistent
pgsql.allow_persistent = On
; Detect broken persistent links always with pg_pconnect().
; Auto reset feature requires a little overheads.
-; http://php.net/pgsql.auto-reset-persistent
+; https://php.net/pgsql.auto-reset-persistent
pgsql.auto_reset_persistent = Off
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/pgsql.max-persistent
+; https://php.net/pgsql.max-persistent
pgsql.max_persistent = -1
; Maximum number of links (persistent+non persistent). -1 means no limit.
-; http://php.net/pgsql.max-links
+; https://php.net/pgsql.max-links
pgsql.max_links = -1
; Ignore PostgreSQL backends Notice message or not.
; Notice message logging require a little overheads.
-; http://php.net/pgsql.ignore-notice
+; https://php.net/pgsql.ignore-notice
pgsql.ignore_notice = 0
; Log PostgreSQL backends Notice message or not.
; Unless pgsql.ignore_notice=0, module cannot log notice message.
-; http://php.net/pgsql.log-notice
+; https://php.net/pgsql.log-notice
pgsql.log_notice = 0
[bcmath]
; Number of decimal digits for all bcmath functions.
-; http://php.net/bcmath.scale
+; https://php.net/bcmath.scale
bcmath.scale = 0
[browscap]
-; http://php.net/browscap
+; https://php.net/browscap
;browscap = extra/browscap.ini
[Session]
; Handler used to store/retrieve data.
-; http://php.net/session.save-handler
+; https://php.net/session.save-handler
session.save_handler = files
; Argument passed to save_handler. In the case of files, this is the path
@@ -1347,7 +1351,7 @@ session.save_handler = files
;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
-; http://php.net/session.save-path
+; https://php.net/session.save-path
;session.save_path = "/tmp"
; Whether to use strict session mode.
@@ -1360,42 +1364,42 @@ session.save_handler = files
session.use_strict_mode = 0
; Whether to use cookies.
-; http://php.net/session.use-cookies
+; https://php.net/session.use-cookies
session.use_cookies = 1
-; http://php.net/session.cookie-secure
+; https://php.net/session.cookie-secure
;session.cookie_secure =
; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combating
; session hijacking when not specifying and managing your own session id. It is
; not the be-all and end-all of session hijacking defense, but it's a good start.
-; http://php.net/session.use-only-cookies
+; https://php.net/session.use-only-cookies
session.use_only_cookies = 1
; Name of the session (used as cookie name).
-; http://php.net/session.name
+; https://php.net/session.name
session.name = PHPSESSID
; Initialize session on request startup.
-; http://php.net/session.auto-start
+; https://php.net/session.auto-start
session.auto_start = 0
; Lifetime in seconds of cookie or, if 0, until browser is restarted.
-; http://php.net/session.cookie-lifetime
+; https://php.net/session.cookie-lifetime
session.cookie_lifetime = 0
; The path for which the cookie is valid.
-; http://php.net/session.cookie-path
+; https://php.net/session.cookie-path
session.cookie_path = /
; The domain for which the cookie is valid.
-; http://php.net/session.cookie-domain
+; https://php.net/session.cookie-domain
session.cookie_domain =
; Whether or not to add the httpOnly flag to the cookie, which makes it
; inaccessible to browser scripting languages such as JavaScript.
-; http://php.net/session.cookie-httponly
+; https://php.net/session.cookie-httponly
session.cookie_httponly =
; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF)
@@ -1405,7 +1409,7 @@ session.cookie_httponly =
session.cookie_samesite =
; Handler used to serialize data. php is the standard serializer of PHP.
-; http://php.net/session.serialize-handler
+; https://php.net/session.serialize-handler
session.serialize_handler = php
; Defines the probability that the 'garbage collection' process is started on every
@@ -1414,7 +1418,7 @@ session.serialize_handler = php
; Default Value: 1
; Development Value: 1
; Production Value: 1
-; http://php.net/session.gc-probability
+; https://php.net/session.gc-probability
session.gc_probability = 1
; Defines the probability that the 'garbage collection' process is started on every
@@ -1424,12 +1428,12 @@ session.gc_probability = 1
; Default Value: 100
; Development Value: 1000
; Production Value: 1000
-; http://php.net/session.gc-divisor
+; https://php.net/session.gc-divisor
session.gc_divisor = 1000
; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
-; http://php.net/session.gc-maxlifetime
+; https://php.net/session.gc-maxlifetime
session.gc_maxlifetime = 1440
; NOTE: If you are using the subdirectory option for storing session files
@@ -1443,16 +1447,16 @@ session.gc_maxlifetime = 1440
; Check HTTP Referer to invalidate externally stored URLs containing ids.
; HTTP_REFERER has to contain this substring for the session to be
; considered as valid.
-; http://php.net/session.referer-check
+; https://php.net/session.referer-check
session.referer_check =
; Set to {nocache,private,public,} to determine HTTP caching aspects
; or leave this empty to avoid sending anti-caching headers.
-; http://php.net/session.cache-limiter
+; https://php.net/session.cache-limiter
session.cache_limiter = nocache
; Document expires after n minutes.
-; http://php.net/session.cache-expire
+; https://php.net/session.cache-expire
session.cache_expire = 180
; trans sid support is disabled by default.
@@ -1464,13 +1468,13 @@ session.cache_expire = 180
; in publicly accessible computer.
; - User may access your site with the same session ID
; always using URL stored in browser's history or bookmarks.
-; http://php.net/session.use-trans-sid
+; https://php.net/session.use-trans-sid
session.use_trans_sid = 0
; Set session ID character length. This value could be between 22 to 256.
; Shorter length than default is supported only for compatibility reason.
; Users should use 32 or more chars.
-; http://php.net/session.sid-length
+; https://php.net/session.sid-length
; Default Value: 32
; Development Value: 26
; Production Value: 26
@@ -1485,7 +1489,7 @@ session.sid_length = 26
; Default Value: "a=href,area=href,frame=src,form="
; Development Value: "a=href,area=href,frame=src,form="
; Production Value: "a=href,area=href,frame=src,form="
-; http://php.net/url-rewriter.tags
+; https://php.net/url-rewriter.tags
session.trans_sid_tags = "a=href,area=href,frame=src,form="
; URL rewriter does not rewrite absolute URLs by default.
@@ -1510,14 +1514,14 @@ session.trans_sid_tags = "a=href,area=href,frame=src,form="
; Default Value: 4
; Development Value: 5
; Production Value: 5
-; http://php.net/session.hash-bits-per-character
+; https://php.net/session.hash-bits-per-character
session.sid_bits_per_character = 5
; Enable upload progress tracking in $_SESSION
; Default Value: On
; Development Value: On
; Production Value: On
-; http://php.net/session.upload-progress.enabled
+; https://php.net/session.upload-progress.enabled
;session.upload_progress.enabled = On
; Cleanup the progress information as soon as all POST data has been read
@@ -1525,14 +1529,14 @@ session.sid_bits_per_character = 5
; Default Value: On
; Development Value: On
; Production Value: On
-; http://php.net/session.upload-progress.cleanup
+; https://php.net/session.upload-progress.cleanup
;session.upload_progress.cleanup = On
; A prefix used for the upload progress key in $_SESSION
; Default Value: "upload_progress_"
; Development Value: "upload_progress_"
; Production Value: "upload_progress_"
-; http://php.net/session.upload-progress.prefix
+; https://php.net/session.upload-progress.prefix
;session.upload_progress.prefix = "upload_progress_"
; The index name (concatenated with the prefix) in $_SESSION
@@ -1540,7 +1544,7 @@ session.sid_bits_per_character = 5
; Default Value: "PHP_SESSION_UPLOAD_PROGRESS"
; Development Value: "PHP_SESSION_UPLOAD_PROGRESS"
; Production Value: "PHP_SESSION_UPLOAD_PROGRESS"
-; http://php.net/session.upload-progress.name
+; https://php.net/session.upload-progress.name
;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
; How frequently the upload progress should be updated.
@@ -1548,18 +1552,18 @@ session.sid_bits_per_character = 5
; Default Value: "1%"
; Development Value: "1%"
; Production Value: "1%"
-; http://php.net/session.upload-progress.freq
+; https://php.net/session.upload-progress.freq
;session.upload_progress.freq = "1%"
; The minimum delay between updates, in seconds
; Default Value: 1
; Development Value: 1
; Production Value: 1
-; http://php.net/session.upload-progress.min-freq
+; https://php.net/session.upload-progress.min-freq
;session.upload_progress.min_freq = "1"
; Only write session data when session data is changed. Enabled by default.
-; http://php.net/session.lazy-write
+; https://php.net/session.lazy-write
;session.lazy_write = On
[Assertion]
@@ -1571,48 +1575,48 @@ session.sid_bits_per_character = 5
; Default Value: 1
; Development Value: 1
; Production Value: -1
-; http://php.net/zend.assertions
+; https://php.net/zend.assertions
zend.assertions = -1
; Assert(expr); active by default.
-; http://php.net/assert.active
+; https://php.net/assert.active
;assert.active = On
; Throw an AssertionError on failed assertions
-; http://php.net/assert.exception
+; https://php.net/assert.exception
;assert.exception = On
; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active)
-; http://php.net/assert.warning
+; https://php.net/assert.warning
;assert.warning = On
; Don't bail out by default.
-; http://php.net/assert.bail
+; https://php.net/assert.bail
;assert.bail = Off
; User-function to be called if an assertion fails.
-; http://php.net/assert.callback
+; https://php.net/assert.callback
;assert.callback = 0
[COM]
; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs
-; http://php.net/com.typelib-file
+; https://php.net/com.typelib-file
;com.typelib_file =
; allow Distributed-COM calls
-; http://php.net/com.allow-dcom
+; https://php.net/com.allow-dcom
;com.allow_dcom = true
; autoregister constants of a component's typlib on com_load()
-; http://php.net/com.autoregister-typelib
+; https://php.net/com.autoregister-typelib
;com.autoregister_typelib = true
; register constants casesensitive
-; http://php.net/com.autoregister-casesensitive
+; https://php.net/com.autoregister-casesensitive
;com.autoregister_casesensitive = false
; show warnings on duplicate constant registrations
-; http://php.net/com.autoregister-verbose
+; https://php.net/com.autoregister-verbose
;com.autoregister_verbose = true
; The default character set code-page to use when passing strings to and from COM objects.
@@ -1626,7 +1630,7 @@ zend.assertions = -1
[mbstring]
; language for internal character representation.
; This affects mb_send_mail() and mbstring.detect_order.
-; http://php.net/mbstring.language
+; https://php.net/mbstring.language
;mbstring.language = Japanese
; Use of this INI entry is deprecated, use global internal_encoding instead.
@@ -1641,7 +1645,7 @@ zend.assertions = -1
; mbstring.encoding_translation = On is needed to use this setting.
; If empty, default_charset or input_encoding or mbstring.input is used.
; The precedence is: default_charset < input_encoding < mbstring.http_input
-; http://php.net/mbstring.http-input
+; https://php.net/mbstring.http-input
;mbstring.http_input =
; Use of this INI entry is deprecated, use global output_encoding instead.
@@ -1651,7 +1655,7 @@ zend.assertions = -1
; The precedence is: default_charset < output_encoding < mbstring.http_output
; To use an output encoding conversion, mbstring's output handler must be set
; otherwise output encoding conversion cannot be performed.
-; http://php.net/mbstring.http-output
+; https://php.net/mbstring.http-output
;mbstring.http_output =
; enable automatic encoding translation according to
@@ -1659,17 +1663,17 @@ zend.assertions = -1
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
; portable libs/applications.
-; http://php.net/mbstring.encoding-translation
+; https://php.net/mbstring.encoding-translation
;mbstring.encoding_translation = Off
; automatic encoding detection order.
; "auto" detect order is changed according to mbstring.language
-; http://php.net/mbstring.detect-order
+; https://php.net/mbstring.detect-order
;mbstring.detect_order = auto
; substitute_character used when character cannot be converted
; one from another
-; http://php.net/mbstring.substitute-character
+; https://php.net/mbstring.substitute-character
;mbstring.substitute_character = none
; Enable strict encoding detection.
@@ -1692,7 +1696,7 @@ zend.assertions = -1
; Tell the jpeg decode to ignore warnings and try to create
; a gd image. The warning will then be displayed as notices
; disabled by default
-; http://php.net/gd.jpeg-ignore-warning
+; https://php.net/gd.jpeg-ignore-warning
;gd.jpeg_ignore_warning = 1
[exif]
@@ -1701,47 +1705,47 @@ zend.assertions = -1
; given by corresponding encode setting. When empty mbstring.internal_encoding
; is used. For the decode settings you can distinguish between motorola and
; intel byte order. A decode setting cannot be empty.
-; http://php.net/exif.encode-unicode
+; https://php.net/exif.encode-unicode
;exif.encode_unicode = ISO-8859-15
-; http://php.net/exif.decode-unicode-motorola
+; https://php.net/exif.decode-unicode-motorola
;exif.decode_unicode_motorola = UCS-2BE
-; http://php.net/exif.decode-unicode-intel
+; https://php.net/exif.decode-unicode-intel
;exif.decode_unicode_intel = UCS-2LE
-; http://php.net/exif.encode-jis
+; https://php.net/exif.encode-jis
;exif.encode_jis =
-; http://php.net/exif.decode-jis-motorola
+; https://php.net/exif.decode-jis-motorola
;exif.decode_jis_motorola = JIS
-; http://php.net/exif.decode-jis-intel
+; https://php.net/exif.decode-jis-intel
;exif.decode_jis_intel = JIS
[Tidy]
; The path to a default tidy configuration file to use when using tidy
-; http://php.net/tidy.default-config
+; https://php.net/tidy.default-config
;tidy.default_config = /usr/local/lib/php/default.tcfg
; Should tidy clean and repair output automatically?
; WARNING: Do not use this option if you are generating non-html content
; such as dynamic images
-; http://php.net/tidy.clean-output
+; https://php.net/tidy.clean-output
tidy.clean_output = Off
[soap]
; Enables or disables WSDL caching feature.
-; http://php.net/soap.wsdl-cache-enabled
+; https://php.net/soap.wsdl-cache-enabled
soap.wsdl_cache_enabled=1
; Sets the directory name where SOAP extension will put cache files.
-; http://php.net/soap.wsdl-cache-dir
+; https://php.net/soap.wsdl-cache-dir
soap.wsdl_cache_dir="/tmp"
; (time to live) Sets the number of second while cached file will be used
; instead of original one.
-; http://php.net/soap.wsdl-cache-ttl
+; https://php.net/soap.wsdl-cache-ttl
soap.wsdl_cache_ttl=86400
; Sets the size of the cache limit. (Max. number of WSDL files to cache)
@@ -1896,12 +1900,12 @@ ldap.max_links = -1
; Specifies a PHP script that is going to be compiled and executed at server
; start-up.
-; http://php.net/opcache.preload
+; https://php.net/opcache.preload
;opcache.preload=
; Preloading code as root is not allowed for security reasons. This directive
; facilitates to let the preloading to be run as another user.
-; http://php.net/opcache.preload_user
+; https://php.net/opcache.preload_user
;opcache.preload_user=
; Prevents caching files that are less than this number of seconds old. It
diff --git a/run-tests.php b/run-tests.php
index c5f1c02ad6..ad1311bb8d 100755
--- a/run-tests.php
+++ b/run-tests.php
@@ -25,10 +25,16 @@
/* $Id$ */
+/* Temporary variables while this file is being refactored. */
+/** @var ?JUnit */
+$junit = null;
+
+/* End temporary variables. */
+
/* Let there be no top-level code beyond this point:
* Only functions and classes, thanks!
*
- * Minimum required PHP version: 7.1.0
+ * Minimum required PHP version: 7.4.0
*/
function show_usage(): void
@@ -121,6 +127,10 @@ Options:
--color
--no-color Do/Don't colorize the result type in the test result.
+ --repeat [n]
+ Run the tests multiple times in the same process and check the
+ output of the last execution (CLI SAPI only).
+
HELP;
}
@@ -147,11 +157,15 @@ function main(): void
$repeat, $result_tests_file, $slow_min_ms, $start_time, $switch,
$temp_source, $temp_target, $test_cnt, $test_dirs,
$test_files, $test_idx, $test_list, $test_results, $testfile,
- $user_tests, $valgrind, $sum_results, $shuffle, $file_cache;
+ $user_tests, $valgrind, $sum_results, $shuffle, $file_cache, $num_repeats;
// Parallel testing
global $workers, $workerID;
global $context_line_count;
+ // Temporary for the duration of refactoring
+ /** @var JUnit */
+ global $junit;
+
define('IS_WINDOWS', substr(PHP_OS, 0, 3) == "WIN");
$workerID = 0;
@@ -230,65 +244,6 @@ function main(): void
$php_cgi = null;
$phpdbg = null;
- if (getenv('TEST_PHP_EXECUTABLE')) {
- $php = getenv('TEST_PHP_EXECUTABLE');
-
- if ($php == 'auto') {
- $php = TEST_PHP_SRCDIR . '/sapi/cli/php';
- putenv("TEST_PHP_EXECUTABLE=$php");
-
- if (!getenv('TEST_PHP_CGI_EXECUTABLE')) {
- $php_cgi = TEST_PHP_SRCDIR . '/sapi/cgi/php-cgi';
-
- if (file_exists($php_cgi)) {
- putenv("TEST_PHP_CGI_EXECUTABLE=$php_cgi");
- } else {
- $php_cgi = null;
- }
- }
- }
- $environment['TEST_PHP_EXECUTABLE'] = $php;
- }
-
- if (getenv('TEST_PHP_CGI_EXECUTABLE')) {
- $php_cgi = getenv('TEST_PHP_CGI_EXECUTABLE');
-
- if ($php_cgi == 'auto') {
- $php_cgi = TEST_PHP_SRCDIR . '/sapi/cgi/php-cgi';
- putenv("TEST_PHP_CGI_EXECUTABLE=$php_cgi");
- }
-
- $environment['TEST_PHP_CGI_EXECUTABLE'] = $php_cgi;
- }
-
- if (!getenv('TEST_PHPDBG_EXECUTABLE')) {
- if (IS_WINDOWS && file_exists(dirname($php) . "/phpdbg.exe")) {
- $phpdbg = realpath(dirname($php) . "/phpdbg.exe");
- } elseif (file_exists(dirname($php) . "/../../sapi/phpdbg/phpdbg")) {
- $phpdbg = realpath(dirname($php) . "/../../sapi/phpdbg/phpdbg");
- } elseif (file_exists("./sapi/phpdbg/phpdbg")) {
- $phpdbg = realpath("./sapi/phpdbg/phpdbg");
- } elseif (file_exists(dirname($php) . "/phpdbg")) {
- $phpdbg = realpath(dirname($php) . "/phpdbg");
- } else {
- $phpdbg = null;
- }
- if ($phpdbg) {
- putenv("TEST_PHPDBG_EXECUTABLE=$phpdbg");
- }
- }
-
- if (getenv('TEST_PHPDBG_EXECUTABLE')) {
- $phpdbg = getenv('TEST_PHPDBG_EXECUTABLE');
-
- if ($phpdbg == 'auto') {
- $phpdbg = TEST_PHP_SRCDIR . '/sapi/phpdbg/phpdbg';
- putenv("TEST_PHPDBG_EXECUTABLE=$phpdbg");
- }
-
- $environment['TEST_PHPDBG_EXECUTABLE'] = $phpdbg;
- }
-
if (getenv('TEST_PHP_LOG_FORMAT')) {
$log_format = strtoupper(getenv('TEST_PHP_LOG_FORMAT'));
} else {
@@ -302,7 +257,7 @@ function main(): void
$DETAILED = 0;
}
- junit_init();
+ $junit = new JUnit($environment, $workerID);
if (getenv('SHOW_ONLY_GROUPS')) {
$SHOW_ONLY_GROUPS = explode(",", getenv('SHOW_ONLY_GROUPS'));
@@ -395,7 +350,7 @@ function main(): void
if (function_exists('sapi_windows_vt100_support') && !sapi_windows_vt100_support(STDOUT, true)) {
$colorize = false;
}
- if (array_key_exists('NO_COLOR', $_ENV)) {
+ if (array_key_exists('NO_COLOR', $environment)) {
$colorize = false;
}
$selected_tests = false;
@@ -405,6 +360,7 @@ function main(): void
$shuffle = false;
$workers = null;
$context_line_count = 3;
+ $num_repeats = 1;
$cfgtypes = ['show', 'keep'];
$cfgfiles = ['skip', 'php', 'clean', 'out', 'diff', 'exp', 'mem'];
@@ -623,6 +579,10 @@ function main(): void
. ':print_suppressions=0';
}
break;
+ case '--repeat':
+ $num_repeats = (int) $argv[++$i];
+ $environment['SKIP_REPEAT'] = 1;
+ break;
//case 'w'
case '-':
// repeat check with full switch
@@ -683,14 +643,35 @@ function main(): void
return;
}
- // Default to PHP_BINARY as executable
- if (!isset($environment['TEST_PHP_EXECUTABLE'])) {
+ if (!$php) {
+ $php = getenv('TEST_PHP_EXECUTABLE');
+ }
+ if (!$php) {
$php = PHP_BINARY;
- putenv("TEST_PHP_EXECUTABLE=$php");
- $environment['TEST_PHP_EXECUTABLE'] = $php;
}
- if (strlen($conf_passed)) {
+ if (!$php_cgi) {
+ $php_cgi = getenv('TEST_PHP_CGI_EXECUTABLE');
+ }
+ if (!$php_cgi) {
+ $php_cgi = get_binary($php, 'php-cgi', 'sapi/cgi/php-cgi');
+ }
+
+ if (!$phpdbg) {
+ $phpdbg = getenv('TEST_PHPDBG_EXECUTABLE');
+ }
+ if (!$phpdbg) {
+ $phpdbg = get_binary($php, 'phpdbg', 'sapi/phpdbg/phpdbg');
+ }
+
+ putenv("TEST_PHP_EXECUTABLE=$php");
+ $environment['TEST_PHP_EXECUTABLE'] = $php;
+ putenv("TEST_PHP_CGI_EXECUTABLE=$php_cgi");
+ $environment['TEST_PHP_CGI_EXECUTABLE'] = $php_cgi;
+ putenv("TEST_PHPDBG_EXECUTABLE=$phpdbg");
+ $environment['TEST_PHPDBG_EXECUTABLE'] = $phpdbg;
+
+ if ($conf_passed !== null) {
if (IS_WINDOWS) {
$pass_options .= " -c " . escapeshellarg($conf_passed);
} else {
@@ -801,7 +782,7 @@ function main(): void
save_or_mail_results();
}
- junit_save_xml();
+ $junit->saveXML();
if (getenv('REPORT_EXIT_STATUS') !== '0' && getenv('REPORT_EXIT_STATUS') !== 'no' &&
($sum_results['FAILED'] || $sum_results['BORKED'] || $sum_results['LEAKED'])) {
exit(1);
@@ -890,7 +871,6 @@ More .INIs : " , (function_exists(\'php_ini_scanned_files\') ? str_replace("\n"
'tidy' => ['tidy.clean_output=0'],
'zlib' => ['zlib.output_compression=Off'],
'xdebug' => ['xdebug.mode=off'],
- 'mbstring' => ['mbstring.func_overload=0'],
];
foreach ($info_params_ex as $ext => $ini_overwrites_ex) {
@@ -1049,6 +1029,21 @@ function save_or_mail_results(): void
}
}
+function get_binary(string $php, string $sapi, string $sapi_path): ?string
+{
+ $dir = dirname($php);
+ if (IS_WINDOWS && file_exists("$dir/$sapi.exe")) {
+ return realpath("$dir/$sapi.exe");
+ }
+ if (file_exists("$dir/../../$sapi_path")) {
+ return realpath("$dir/../../$sapi_path");
+ }
+ if (file_exists("$dir/$sapi")) {
+ return realpath("$dir/$sapi");
+ }
+ return null;
+}
+
function find_files(string $dir, bool $is_ext_dir = false, bool $ignore = false): void
{
global $test_files, $exts_to_test, $ignored_by_ext, $exts_skipped;
@@ -1381,6 +1376,8 @@ function run_all_tests_parallel(array $test_files, array $env, $redir_tested): v
{
global $workers, $test_idx, $test_cnt, $test_results, $failed_tests_file, $result_tests_file, $PHP_FAILED_TESTS, $shuffle, $SHOW_ONLY_GROUPS, $valgrind;
+ global $junit;
+
// The PHP binary running run-tests.php, and run-tests.php itself
// This PHP executable is *not* necessarily the same as the tested version
$thisPHP = PHP_BINARY;
@@ -1463,7 +1460,7 @@ function run_all_tests_parallel(array $test_files, array $env, $redir_tested): v
[], // Inherit our stdin, stdout and stderr
$pipes,
null,
- $_ENV + [
+ $GLOBALS['environment'] + [
"TEST_PHP_WORKER" => $i,
"TEST_PHP_URI" => $sockUri,
],
@@ -1579,9 +1576,7 @@ escape:
}
}
}
- if (junit_enabled()) {
- junit_merge_results($message["junit"]);
- }
+ $junit->mergeResults($message["junit"]);
// no break
case "ready":
// Schedule sequential tests only once we are down to one worker.
@@ -1721,6 +1716,8 @@ function run_worker(): void
{
global $workerID, $workerSock;
+ global $junit;
+
$sockUri = getenv("TEST_PHP_URI");
$workerSock = stream_socket_client($sockUri, $_, $_, 5) or error("Couldn't connect to $sockUri");
@@ -1767,9 +1764,9 @@ function run_worker(): void
run_all_tests($command["test_files"], $command["env"], $command["redir_tested"]);
send_message($workerSock, [
"type" => "tests_finished",
- "junit" => junit_enabled() ? $GLOBALS['JUNIT'] : null,
+ "junit" => $junit->isEnabled() ? $junit : null,
]);
- junit_init();
+ $junit->clear();
break;
default:
send_message($workerSock, [
@@ -1805,6 +1802,15 @@ function show_file_block(string $file, string $block, ?string $section = null):
}
}
+function skip_test(string $tested, string $tested_file, string $shortname, string $reason) {
+ global $junit;
+
+ show_result('SKIP', $tested, $tested_file, "reason: $reason");
+ $junit->initSuite($junit->getSuiteName($shortname));
+ $junit->markTestAs('SKIP', $shortname, $tested, 0, $reason);
+ return 'SKIPPED';
+}
+
//
// Run an individual test case.
//
@@ -1821,8 +1827,19 @@ function run_test(string $php, $file, array $env): string
global $no_file_cache;
global $slow_min_ms;
global $preload, $file_cache;
+ global $num_repeats;
// Parallel testing
global $workerID;
+
+ // Temporary
+ /** @var JUnit */
+ global $junit;
+
+ static $skipCache;
+ if (!$skipCache) {
+ $skipCache = new SkipCache($cfg['keep']['skip']);
+ }
+
$temp_filenames = null;
$org_file = $file;
@@ -1845,136 +1862,36 @@ TEST $file
";
}
- // Load the sections of the test file.
- $section_text = ['TEST' => ''];
-
- $fp = fopen($file, "rb") or error("Cannot open test file: $file");
-
- $bork_info = null;
-
- if (!feof($fp)) {
- $line = fgets($fp);
-
- if ($line === false) {
- $bork_info = "cannot read test";
- }
- } else {
- $bork_info = "empty test [$file]";
- }
- if ($bork_info === null && strncmp('--TEST--', $line, 8)) {
- $bork_info = "tests must start with --TEST-- [$file]";
- }
-
- $section = 'TEST';
- $secfile = false;
- $secdone = false;
-
- while (!feof($fp)) {
- $line = fgets($fp);
-
- if ($line === false) {
- break;
- }
-
- // Match the beginning of a section.
- if (preg_match('/^--([_A-Z]+)--/', $line, $r)) {
- $section = (string) $r[1];
-
- if (isset($section_text[$section]) && $section_text[$section]) {
- $bork_info = "duplicated $section section";
- }
-
- // check for unknown sections
- if (!in_array($section, [
- 'EXPECT', 'EXPECTF', 'EXPECTREGEX', 'EXPECTREGEX_EXTERNAL', 'EXPECT_EXTERNAL', 'EXPECTF_EXTERNAL', 'EXPECTHEADERS',
- 'POST', 'POST_RAW', 'GZIP_POST', 'DEFLATE_POST', 'PUT', 'GET', 'COOKIE', 'ARGS',
- 'FILE', 'FILEEOF', 'FILE_EXTERNAL', 'REDIRECTTEST',
- 'CAPTURE_STDIO', 'STDIN', 'CGI', 'PHPDBG',
- 'INI', 'ENV', 'EXTENSIONS',
- 'SKIPIF', 'XFAIL', 'XLEAK', 'CLEAN',
- 'CREDITS', 'DESCRIPTION', 'CONFLICTS', 'WHITESPACE_SENSITIVE',
- ])) {
- $bork_info = 'Unknown section "' . $section . '"';
- }
-
- $section_text[$section] = '';
- $secfile = $section == 'FILE' || $section == 'FILEEOF' || $section == 'FILE_EXTERNAL';
- $secdone = false;
- continue;
- }
-
- // Add to the section text.
- if (!$secdone) {
- $section_text[$section] .= $line;
- }
-
- // End of actual test?
- if ($secfile && preg_match('/^===DONE===\s*$/', $line)) {
- $secdone = true;
- }
- }
-
- // the redirect section allows a set of tests to be reused outside of
- // a given test dir
- if ($bork_info === null) {
- if (isset($section_text['REDIRECTTEST'])) {
- if ($IN_REDIRECT) {
- $bork_info = "Can't redirect a test from within a redirected test";
- }
- } else {
- if (!isset($section_text['PHPDBG']) && isset($section_text['FILE']) + isset($section_text['FILEEOF']) + isset($section_text['FILE_EXTERNAL']) != 1) {
- $bork_info = "missing section --FILE--";
- }
-
- if (isset($section_text['FILEEOF'])) {
- $section_text['FILE'] = preg_replace("/[\r\n]+$/", '', $section_text['FILEEOF']);
- unset($section_text['FILEEOF']);
- }
-
- foreach (['FILE', 'EXPECT', 'EXPECTF', 'EXPECTREGEX'] as $prefix) {
- $key = $prefix . '_EXTERNAL';
-
- if (isset($section_text[$key])) {
- // don't allow tests to retrieve files from anywhere but this subdirectory
- $section_text[$key] = dirname($file) . '/' . trim(str_replace('..', '', $section_text[$key]));
-
- if (file_exists($section_text[$key])) {
- $section_text[$prefix] = file_get_contents($section_text[$key]);
- unset($section_text[$key]);
- } else {
- $bork_info = "could not load --" . $key . "-- " . dirname($file) . '/' . trim($section_text[$key]);
- }
- }
- }
-
- if ((isset($section_text['EXPECT']) + isset($section_text['EXPECTF']) + isset($section_text['EXPECTREGEX'])) != 1) {
- $bork_info = "missing section --EXPECT--, --EXPECTF-- or --EXPECTREGEX--";
- }
- }
- }
- fclose($fp);
-
$shortname = str_replace(TEST_PHP_SRCDIR . '/', '', $file);
$tested_file = $shortname;
- if ($bork_info !== null) {
- show_result("BORK", $bork_info, $tested_file);
+ try {
+ $test = new TestFile($file, (bool)$IN_REDIRECT);
+ } catch (BorkageException $ex) {
+ show_result("BORK", $ex->getMessage(), $tested_file);
$PHP_FAILED_TESTS['BORKED'][] = [
'name' => $file,
'test_name' => '',
'output' => '',
'diff' => '',
- 'info' => "$bork_info [$file]",
+ 'info' => "{$ex->getMessage()} [$file]",
];
- junit_mark_test_as('BORK', $shortname, $tested_file, 0, $bork_info);
+ $junit->markTestAs('BORK', $shortname, $tested_file, 0, $ex->getMessage());
return 'BORKED';
}
- if (isset($section_text['CAPTURE_STDIO'])) {
- $captureStdIn = stripos($section_text['CAPTURE_STDIO'], 'STDIN') !== false;
- $captureStdOut = stripos($section_text['CAPTURE_STDIO'], 'STDOUT') !== false;
- $captureStdErr = stripos($section_text['CAPTURE_STDIO'], 'STDERR') !== false;
+ $tested = $test->getName();
+
+ if ($num_repeats > 1 && $test->hasSection('FILE_EXTERNAL')) {
+ return skip_test($tested, $tested_file, $shortname, 'Test with FILE_EXTERNAL might not be repeatable');
+ }
+
+ if ($test->hasSection('CAPTURE_STDIO')) {
+ $capture = $test->getSection('CAPTURE_STDIO');
+ $captureStdIn = stripos($capture, 'STDIN') !== false;
+ $captureStdOut = stripos($capture, 'STDOUT') !== false;
+ $captureStdErr = stripos($capture, 'STDERR') !== false;
} else {
$captureStdIn = true;
$captureStdOut = true;
@@ -1986,39 +1903,21 @@ TEST $file
$cmdRedirect = '';
}
- $tested = trim($section_text['TEST']);
-
/* For GET/POST/PUT tests, check if cgi sapi is available and if it is, use it. */
- if (array_key_exists('CGI', $section_text) || !empty($section_text['GET']) || !empty($section_text['POST']) || !empty($section_text['GZIP_POST']) || !empty($section_text['DEFLATE_POST']) || !empty($section_text['POST_RAW']) || !empty($section_text['PUT']) || !empty($section_text['COOKIE']) || !empty($section_text['EXPECTHEADERS'])) {
- if (isset($php_cgi)) {
- $php = $php_cgi . ' -C ';
- } elseif (IS_WINDOWS && file_exists(dirname($php) . "/php-cgi.exe")) {
- $php = realpath(dirname($php) . "/php-cgi.exe") . ' -C ';
- } else {
- if (file_exists(dirname($php) . "/../../sapi/cgi/php-cgi")) {
- $php = realpath(dirname($php) . "/../../sapi/cgi/php-cgi") . ' -C ';
- } elseif (file_exists("./sapi/cgi/php-cgi")) {
- $php = realpath("./sapi/cgi/php-cgi") . ' -C ';
- } elseif (file_exists(dirname($php) . "/php-cgi")) {
- $php = realpath(dirname($php) . "/php-cgi") . ' -C ';
- } else {
- show_result('SKIP', $tested, $tested_file, "reason: CGI not available");
-
- junit_init_suite(junit_get_suitename_for($shortname));
- junit_mark_test_as('SKIP', $shortname, $tested, 0, 'CGI not available');
- return 'SKIPPED';
- }
+ if ($test->isCGI()) {
+ if (!$php_cgi) {
+ return skip_test($tested, $tested_file, $shortname, 'CGI not available');
}
+ $php = $php_cgi . ' -C ';
$uses_cgi = true;
+ if ($num_repeats > 1) {
+ return skip_test($tested, $tested_file, $shortname, 'CGI does not support --repeat');
+ }
}
/* For phpdbg tests, check if phpdbg sapi is available and if it is, use it. */
$extra_options = '';
- if (array_key_exists('PHPDBG', $section_text)) {
- if (!isset($section_text['STDIN'])) {
- $section_text['STDIN'] = $section_text['PHPDBG'] . "\n";
- }
-
+ if ($test->hasSection('PHPDBG')) {
if (isset($phpdbg)) {
$php = $phpdbg . ' -qIb';
@@ -2026,11 +1925,22 @@ TEST $file
// be run straight away. For example, EXTENSIONS, SKIPIF, CLEAN.
$extra_options = '-rr';
} else {
- show_result('SKIP', $tested, $tested_file, "reason: phpdbg not available");
+ return skip_test($tested, $tested_file, $shortname, 'phpdbg not available');
+ }
+ if ($num_repeats > 1) {
+ return skip_test($tested, $tested_file, $shortname, 'phpdbg does not support --repeat');
+ }
+ }
- junit_init_suite(junit_get_suitename_for($shortname));
- junit_mark_test_as('SKIP', $shortname, $tested, 0, 'phpdbg not available');
- return 'SKIPPED';
+ if ($num_repeats > 1) {
+ if ($test->hasSection('CLEAN')) {
+ return skip_test($tested, $tested_file, $shortname, 'Test with CLEAN might not be repeatable');
+ }
+ if ($test->hasSection('STDIN')) {
+ return skip_test($tested, $tested_file, $shortname, 'Test with STDIN might not be repeatable');
+ }
+ if ($test->hasSection('CAPTURE_STDIO')) {
+ return skip_test($tested, $tested_file, $shortname, 'Test with CAPTURE_STDIO might not be repeatable');
}
}
@@ -2076,8 +1986,8 @@ TEST $file
mkdir(dirname($copy_file), 0777, true) or error("Cannot create output directory - " . dirname($copy_file));
}
- if (isset($section_text['FILE'])) {
- save_text($copy_file, $section_text['FILE']);
+ if ($test->hasSection('FILE')) {
+ save_text($copy_file, $test->getSection('FILE'));
}
$temp_filenames = [
@@ -2095,7 +2005,7 @@ TEST $file
}
if (is_array($IN_REDIRECT)) {
- $tested = $IN_REDIRECT['prefix'] . ' ' . trim($section_text['TEST']);
+ $tested = $IN_REDIRECT['prefix'] . ' ' . $tested;
$tested_file = $tmp_relative_file;
$shortname = str_replace(TEST_PHP_SRCDIR . '/', '', $tested_file);
}
@@ -2126,8 +2036,8 @@ TEST $file
$env['CONTENT_LENGTH'] = '';
$env['TZ'] = '';
- if (!empty($section_text['ENV'])) {
- foreach (explode("\n", trim($section_text['ENV'])) as $e) {
+ if ($test->sectionNotEmpty('ENV')) {
+ foreach (explode("\n", $test->getSection('ENV')) as $e) {
$e = explode('=', trim($e), 2);
if (!empty($e[0]) && isset($e[1])) {
@@ -2140,23 +2050,33 @@ TEST $file
$ini_settings = $workerID ? ['opcache.cache_id' => "worker$workerID"] : [];
// Additional required extensions
- if (array_key_exists('EXTENSIONS', $section_text)) {
+ if ($test->hasSection('EXTENSIONS')) {
$ext_params = [];
settings2array($ini_overwrites, $ext_params);
$ext_params = settings2params($ext_params);
- $ext_dir = `$php $pass_options $extra_options $ext_params $no_file_cache -d display_errors=0 -r "echo ini_get('extension_dir');"`;
- $extensions = preg_split("/[\n\r]+/", trim($section_text['EXTENSIONS']));
- $loaded = explode(",", `$php $pass_options $extra_options $ext_params $no_file_cache -d display_errors=0 -r "echo implode(',', get_loaded_extensions());"`);
+ $extensions = preg_split("/[\n\r]+/", trim($test->getSection('EXTENSIONS')));
+ [$ext_dir, $loaded] = $skipCache->getExtensions("$php $pass_options $extra_options $ext_params $no_file_cache");
$ext_prefix = IS_WINDOWS ? "php_" : "";
+ $missing = [];
foreach ($extensions as $req_ext) {
if (!in_array($req_ext, $loaded)) {
if ($req_ext == 'opcache') {
- $ini_settings['zend_extension'][] = $ext_dir . DIRECTORY_SEPARATOR . $ext_prefix . $req_ext . '.' . PHP_SHLIB_SUFFIX;
+ $ext_file = $ext_dir . DIRECTORY_SEPARATOR . $ext_prefix . $req_ext . '.' . PHP_SHLIB_SUFFIX;
+ $ini_settings['zend_extension'][] = $ext_file;
} else {
- $ini_settings['extension'][] = $ext_dir . DIRECTORY_SEPARATOR . $ext_prefix . $req_ext . '.' . PHP_SHLIB_SUFFIX;
+ $ext_file = $ext_dir . DIRECTORY_SEPARATOR . $ext_prefix . $req_ext . '.' . PHP_SHLIB_SUFFIX;
+ $ini_settings['extension'][] = $ext_file;
+ }
+ if (!is_readable($ext_file)) {
+ $missing[] = $req_ext;
}
}
}
+ if ($missing) {
+ $message = 'Required extension' . (count($missing) > 1 ? 's' : '')
+ . ' missing: ' . implode(', ', $missing);
+ return skip_test($tested, $tested_file, $shortname, $message);
+ }
}
// additional ini overwrites
@@ -2176,16 +2096,23 @@ TEST $file
// even though all the files are re-created.
$ini_settings['opcache.validate_timestamps'] = '0';
}
+ } else if ($num_repeats > 1) {
+ // Make sure warnings still show up on the second run.
+ $ini_settings['opcache.record_warnings'] = '1';
}
// Any special ini settings
// these may overwrite the test defaults...
- if (array_key_exists('INI', $section_text)) {
- $section_text['INI'] = str_replace('{PWD}', dirname($file), $section_text['INI']);
- $section_text['INI'] = str_replace('{TMP}', sys_get_temp_dir(), $section_text['INI']);
+ if ($test->hasSection('INI')) {
+ $ini = str_replace('{PWD}', dirname($file), $test->getSection('INI'));
+ $ini = str_replace('{TMP}', sys_get_temp_dir(), $ini);
$replacement = IS_WINDOWS ? '"' . PHP_BINARY . ' -r \"while ($in = fgets(STDIN)) echo $in;\" > $1"' : 'tee $1 >/dev/null';
- $section_text['INI'] = preg_replace('/{MAIL:(\S+)}/', $replacement, $section_text['INI']);
- settings2array(preg_split("/[\n\r]+/", $section_text['INI']), $ini_settings);
+ $ini = preg_replace('/{MAIL:(\S+)}/', $replacement, $ini);
+ settings2array(preg_split("/[\n\r]+/", $ini), $ini_settings);
+
+ if ($num_repeats > 1 && isset($ini_settings['opcache.opt_debug_level'])) {
+ return skip_test($tested, $tested_file, $shortname, 'opt_debug_level tests are not repeatable');
+ }
}
$ini_settings = settings2params($ini_settings);
@@ -2196,85 +2123,89 @@ TEST $file
$info = '';
$warn = false;
- if (array_key_exists('SKIPIF', $section_text)) {
- if (trim($section_text['SKIPIF'])) {
- show_file_block('skip', $section_text['SKIPIF']);
- save_text($test_skipif, $section_text['SKIPIF'], $temp_skipif);
- $extra = !IS_WINDOWS ?
- "unset REQUEST_METHOD; unset QUERY_STRING; unset PATH_TRANSLATED; unset SCRIPT_FILENAME; unset REQUEST_METHOD;" : "";
-
- if ($valgrind) {
- $env['USE_ZEND_ALLOC'] = '0';
- $env['ZEND_DONT_UNLOAD_MODULES'] = 1;
- }
+ if ($test->sectionNotEmpty('SKIPIF')) {
+ show_file_block('skip', $test->getSection('SKIPIF'));
+ $extra = !IS_WINDOWS ?
+ "unset REQUEST_METHOD; unset QUERY_STRING; unset PATH_TRANSLATED; unset SCRIPT_FILENAME; unset REQUEST_METHOD;" : "";
- junit_start_timer($shortname);
+ if ($valgrind) {
+ $env['USE_ZEND_ALLOC'] = '0';
+ $env['ZEND_DONT_UNLOAD_MODULES'] = 1;
+ }
- $output = system_with_timeout("$extra $php $pass_options $extra_options -q $orig_ini_settings $no_file_cache -d display_errors=1 -d display_startup_errors=0 \"$test_skipif\"", $env);
- $output = trim($output);
+ $junit->startTimer($shortname);
- junit_finish_timer($shortname);
+ $startTime = microtime(true);
+ $commandLine = "$extra $php $pass_options $extra_options -q $orig_ini_settings $no_file_cache -d display_errors=1 -d display_startup_errors=0";
+ $output = $skipCache->checkSkip($commandLine, $test->getSection('SKIPIF'), $test_skipif, $temp_skipif, $env);
- if (!$cfg['keep']['skip']) {
- @unlink($test_skipif);
- }
+ $time = microtime(true) - $startTime;
+ $junit->stopTimer($shortname);
- if (!strncasecmp('skip', $output, 4)) {
- if (preg_match('/^skip\s*(.+)/i', $output, $m)) {
- show_result('SKIP', $tested, $tested_file, "reason: $m[1]", $temp_filenames);
- } else {
- show_result('SKIP', $tested, $tested_file, '', $temp_filenames);
- }
+ if ($time > $slow_min_ms / 1000) {
+ $PHP_FAILED_TESTS['SLOW'][] = [
+ 'name' => $file,
+ 'test_name' => 'SKIPIF of ' . $tested . " [$tested_file]",
+ 'output' => '',
+ 'diff' => '',
+ 'info' => $time,
+ ];
+ }
- if (!$cfg['keep']['skip']) {
- @unlink($test_skipif);
- }
+ if (!$cfg['keep']['skip']) {
+ @unlink($test_skipif);
+ }
- $message = !empty($m[1]) ? $m[1] : '';
- junit_mark_test_as('SKIP', $shortname, $tested, null, $message);
- return 'SKIPPED';
+ if (!strncasecmp('skip', $output, 4)) {
+ if (preg_match('/^skip\s*(.+)/i', $output, $m)) {
+ show_result('SKIP', $tested, $tested_file, "reason: $m[1]", $temp_filenames);
+ } else {
+ show_result('SKIP', $tested, $tested_file, '', $temp_filenames);
}
- if (!strncasecmp('info', $output, 4) && preg_match('/^info\s*(.+)/i', $output, $m)) {
- $info = " (info: $m[1])";
- } elseif (!strncasecmp('warn', $output, 4) && preg_match('/^warn\s+(.+)/i', $output, $m)) {
- $warn = true; /* only if there is a reason */
- $info = " (warn: $m[1])";
- } elseif (!strncasecmp('xfail', $output, 5)) {
- // Pretend we have an XFAIL section
- $section_text['XFAIL'] = ltrim(substr($output, 5));
- } elseif ($output !== '') {
- show_result("BORK", $output, $tested_file, 'reason: invalid output from SKIPIF', $temp_filenames);
- $PHP_FAILED_TESTS['BORKED'][] = [
- 'name' => $file,
- 'test_name' => '',
- 'output' => '',
- 'diff' => '',
- 'info' => "$output [$file]",
- ];
+ $message = !empty($m[1]) ? $m[1] : '';
+ $junit->markTestAs('SKIP', $shortname, $tested, null, $message);
+ return 'SKIPPED';
+ }
- junit_mark_test_as('BORK', $shortname, $tested, null, $output);
- return 'BORKED';
- }
+
+ if (!strncasecmp('info', $output, 4) && preg_match('/^info\s*(.+)/i', $output, $m)) {
+ $info = " (info: $m[1])";
+ } elseif (!strncasecmp('warn', $output, 4) && preg_match('/^warn\s+(.+)/i', $output, $m)) {
+ $warn = true; /* only if there is a reason */
+ $info = " (warn: $m[1])";
+ } elseif (!strncasecmp('xfail', $output, 5)) {
+ // Pretend we have an XFAIL section
+ $test->setSection('XFAIL', ltrim(substr($output, 5)));
+ } elseif ($output !== '') {
+ show_result("BORK", $output, $tested_file, 'reason: invalid output from SKIPIF', $temp_filenames);
+ $PHP_FAILED_TESTS['BORKED'][] = [
+ 'name' => $file,
+ 'test_name' => '',
+ 'output' => '',
+ 'diff' => '',
+ 'info' => "$output [$file]",
+ ];
+
+ $junit->markTestAs('BORK', $shortname, $tested, null, $output);
+ return 'BORKED';
}
}
- if (!extension_loaded("zlib")
- && (array_key_exists("GZIP_POST", $section_text)
- || array_key_exists("DEFLATE_POST", $section_text))) {
+ if (!extension_loaded("zlib") && $test->hasAnySections("GZIP_POST", "DEFLATE_POST")) {
$message = "ext/zlib required";
show_result('SKIP', $tested, $tested_file, "reason: $message", $temp_filenames);
- junit_mark_test_as('SKIP', $shortname, $tested, null, $message);
+ $junit->markTestAs('SKIP', $shortname, $tested, null, $message);
return 'SKIPPED';
}
- if (isset($section_text['REDIRECTTEST'])) {
+ if ($test->hasSection('REDIRECTTEST')) {
$test_files = [];
- $IN_REDIRECT = eval($section_text['REDIRECTTEST']);
+ $IN_REDIRECT = eval($test->getSection('REDIRECTTEST'));
$IN_REDIRECT['via'] = "via [$shortname]\n\t";
$IN_REDIRECT['dir'] = realpath(dirname($file));
- $IN_REDIRECT['prefix'] = trim($section_text['TEST']);
+ $IN_REDIRECT['prefix'] = $tested;
if (!empty($IN_REDIRECT['TESTS'])) {
if (is_array($org_file)) {
@@ -2304,7 +2235,7 @@ TEST $file
// a redirected test never fails
$IN_REDIRECT = false;
- junit_mark_test_as('PASS', $shortname, $tested);
+ $junit->markTestAs('PASS', $shortname, $tested);
return 'REDIR';
} else {
$bork_info = "Redirect info must contain exactly one TEST string to be used as redirect directory.";
@@ -2319,7 +2250,7 @@ TEST $file
}
}
- if (is_array($org_file) || isset($section_text['REDIRECTTEST'])) {
+ if (is_array($org_file) || $test->hasSection('REDIRECTTEST')) {
if (is_array($org_file)) {
$file = $org_file[0];
}
@@ -2334,21 +2265,21 @@ TEST $file
'info' => "$bork_info [$file]",
];
- junit_mark_test_as('BORK', $shortname, $tested, null, $bork_info);
+ $junit->markTestAs('BORK', $shortname, $tested, null, $bork_info);
return 'BORKED';
}
// We've satisfied the preconditions - run the test!
- if (isset($section_text['FILE'])) {
- show_file_block('php', $section_text['FILE'], 'TEST');
- save_text($test_file, $section_text['FILE'], $temp_file);
+ if ($test->hasSection('FILE')) {
+ show_file_block('php', $test->getSection('FILE'), 'TEST');
+ save_text($test_file, $test->getSection('FILE'), $temp_file);
} else {
$test_file = $temp_file = "";
}
- if (array_key_exists('GET', $section_text)) {
- $query_string = trim($section_text['GET']);
+ if ($test->hasSection('GET')) {
+ $query_string = trim($test->getSection('GET'));
} else {
$query_string = '';
}
@@ -2364,13 +2295,13 @@ TEST $file
$env['SCRIPT_FILENAME'] = $test_file;
}
- if (array_key_exists('COOKIE', $section_text)) {
- $env['HTTP_COOKIE'] = trim($section_text['COOKIE']);
+ if ($test->hasSection('COOKIE')) {
+ $env['HTTP_COOKIE'] = trim($test->getSection('COOKIE'));
} else {
$env['HTTP_COOKIE'] = '';
}
- $args = isset($section_text['ARGS']) ? ' -- ' . $section_text['ARGS'] : '';
+ $args = $test->hasSection('ARGS') ? ' -- ' . $test->getSection('ARGS') : '';
if ($preload && !empty($test_file)) {
save_text($preload_filename, "<?php opcache_compile_file('$test_file');");
@@ -2380,8 +2311,8 @@ TEST $file
$pass_options .= " -d opcache.preload=" . $preload_filename;
}
- if (array_key_exists('POST_RAW', $section_text) && !empty($section_text['POST_RAW'])) {
- $post = trim($section_text['POST_RAW']);
+ if ($test->sectionNotEmpty('POST_RAW')) {
+ $post = trim($test->getSection('POST_RAW'));
$raw_lines = explode("\n", $post);
$request = '';
@@ -2405,14 +2336,14 @@ TEST $file
$env['REQUEST_METHOD'] = 'POST';
if (empty($request)) {
- junit_mark_test_as('BORK', $shortname, $tested, null, 'empty $request');
+ $junit->markTestAs('BORK', $shortname, $tested, null, 'empty $request');
return 'BORKED';
}
save_text($tmp_post, $request);
$cmd = "$php $pass_options $ini_settings -f \"$test_file\"$cmdRedirect < \"$tmp_post\"";
- } elseif (array_key_exists('PUT', $section_text) && !empty($section_text['PUT'])) {
- $post = trim($section_text['PUT']);
+ } elseif ($test->sectionNotEmpty('PUT')) {
+ $post = trim($test->getSection('PUT'));
$raw_lines = explode("\n", $post);
$request = '';
@@ -2436,14 +2367,14 @@ TEST $file
$env['REQUEST_METHOD'] = 'PUT';
if (empty($request)) {
- junit_mark_test_as('BORK', $shortname, $tested, null, 'empty $request');
+ $junit->markTestAs('BORK', $shortname, $tested, null, 'empty $request');
return 'BORKED';
}
save_text($tmp_post, $request);
$cmd = "$php $pass_options $ini_settings -f \"$test_file\"$cmdRedirect < \"$tmp_post\"";
- } elseif (array_key_exists('POST', $section_text) && !empty($section_text['POST'])) {
- $post = trim($section_text['POST']);
+ } elseif ($test->sectionNotEmpty('POST')) {
+ $post = trim($test->getSection('POST'));
$content_length = strlen($post);
save_text($tmp_post, $post);
@@ -2457,8 +2388,8 @@ TEST $file
}
$cmd = "$php $pass_options $ini_settings -f \"$test_file\"$cmdRedirect < \"$tmp_post\"";
- } elseif (array_key_exists('GZIP_POST', $section_text) && !empty($section_text['GZIP_POST'])) {
- $post = trim($section_text['GZIP_POST']);
+ } elseif ($test->sectionNotEmpty('GZIP_POST')) {
+ $post = trim($test->getSection('GZIP_POST'));
$post = gzencode($post, 9, FORCE_GZIP);
$env['HTTP_CONTENT_ENCODING'] = 'gzip';
@@ -2470,8 +2401,8 @@ TEST $file
$env['CONTENT_LENGTH'] = $content_length;
$cmd = "$php $pass_options $ini_settings -f \"$test_file\"$cmdRedirect < \"$tmp_post\"";
- } elseif (array_key_exists('DEFLATE_POST', $section_text) && !empty($section_text['DEFLATE_POST'])) {
- $post = trim($section_text['DEFLATE_POST']);
+ } elseif ($test->sectionNotEmpty('DEFLATE_POST')) {
+ $post = trim($test->getSection('DEFLATE_POST'));
$post = gzcompress($post, 9);
$env['HTTP_CONTENT_ENCODING'] = 'deflate';
save_text($tmp_post, $post);
@@ -2487,9 +2418,11 @@ TEST $file
$env['CONTENT_TYPE'] = '';
$env['CONTENT_LENGTH'] = '';
- $cmd = "$php $pass_options $ini_settings -f \"$test_file\" $args$cmdRedirect";
+ $repeat_option = $num_repeats > 1 ? "--repeat $num_repeats" : "";
+ $cmd = "$php $pass_options $repeat_option $ini_settings -f \"$test_file\" $args$cmdRedirect";
}
+ $orig_cmd = $cmd;
if ($valgrind) {
$env['USE_ZEND_ALLOC'] = '0';
$env['ZEND_DONT_UNLOAD_MODULES'] = 1;
@@ -2511,39 +2444,38 @@ COMMAND $cmd
";
}
- junit_start_timer($shortname);
+ $junit->startTimer($shortname);
$hrtime = hrtime();
$startTime = $hrtime[0] * 1000000000 + $hrtime[1];
- $out = system_with_timeout($cmd, $env, $section_text['STDIN'] ?? null, $captureStdIn, $captureStdOut, $captureStdErr);
+ $stdin = $test->hasSection('STDIN') ? $test->getSection('STDIN') : null;
+ $out = system_with_timeout($cmd, $env, $stdin, $captureStdIn, $captureStdOut, $captureStdErr);
- junit_finish_timer($shortname);
+ $junit->stopTimer($shortname);
$hrtime = hrtime();
$time = $hrtime[0] * 1000000000 + $hrtime[1] - $startTime;
if ($time >= $slow_min_ms * 1000000) {
$PHP_FAILED_TESTS['SLOW'][] = [
'name' => $file,
- 'test_name' => (is_array($IN_REDIRECT) ? $IN_REDIRECT['via'] : '') . $tested . " [$tested_file]",
+ 'test_name' => $tested . " [$tested_file]",
'output' => '',
'diff' => '',
'info' => $time / 1000000000,
];
}
- if (array_key_exists('CLEAN', $section_text) && (!$no_clean || $cfg['keep']['clean'])) {
- if (trim($section_text['CLEAN'])) {
- show_file_block('clean', $section_text['CLEAN']);
- save_text($test_clean, trim($section_text['CLEAN']), $temp_clean);
+ if ($test->sectionNotEmpty('CLEAN') && (!$no_clean || $cfg['keep']['clean'])) {
+ show_file_block('clean', $test->getSection('CLEAN'));
+ save_text($test_clean, trim($test->getSection('CLEAN')), $temp_clean);
- if (!$no_clean) {
- $extra = !IS_WINDOWS ?
- "unset REQUEST_METHOD; unset QUERY_STRING; unset PATH_TRANSLATED; unset SCRIPT_FILENAME; unset REQUEST_METHOD;" : "";
- system_with_timeout("$extra $php $pass_options $extra_options -q $orig_ini_settings $no_file_cache \"$test_clean\"", $env);
- }
+ if (!$no_clean) {
+ $extra = !IS_WINDOWS ?
+ "unset REQUEST_METHOD; unset QUERY_STRING; unset PATH_TRANSLATED; unset SCRIPT_FILENAME; unset REQUEST_METHOD;" : "";
+ system_with_timeout("$extra $php $pass_options $extra_options -q $orig_ini_settings $no_file_cache \"$test_clean\"", $env);
+ }
- if (!$cfg['keep']['clean']) {
- @unlink($test_clean);
- }
+ if (!$cfg['keep']['clean']) {
+ @unlink($test_clean);
}
}
@@ -2560,6 +2492,25 @@ COMMAND $cmd
}
}
+ if ($num_repeats > 1) {
+ // In repeat mode, retain the output before the first execution,
+ // and of the last execution. Do this early, because the trimming below
+ // makes the newline handling complicated.
+ $separator1 = "Executing for the first time...\n";
+ $separator1_pos = strpos($out, $separator1);
+ if ($separator1_pos !== false) {
+ $separator2 = "Finished execution, repeating...\n";
+ $separator2_pos = strrpos($out, $separator2);
+ if ($separator2_pos !== false) {
+ $out = substr($out, 0, $separator1_pos)
+ . substr($out, $separator2_pos + strlen($separator2));
+ } else {
+ $out = substr($out, 0, $separator1_pos)
+ . substr($out, $separator1_pos + strlen($separator1));
+ }
+ }
+ }
+
// Does the output match what is expected?
$output = preg_replace("/\r\n/", "\n", trim($out));
@@ -2580,10 +2531,10 @@ COMMAND $cmd
$failed_headers = false;
- if (isset($section_text['EXPECTHEADERS'])) {
+ if ($test->hasSection('EXPECTHEADERS')) {
$want = [];
$wanted_headers = [];
- $lines = preg_split("/[\n\r]+/", $section_text['EXPECTHEADERS']);
+ $lines = preg_split("/[\n\r]+/", $test->getSection('EXPECTHEADERS'));
foreach ($lines as $line) {
if (strpos($line, ':') !== false) {
@@ -2617,17 +2568,17 @@ COMMAND $cmd
$output = trim(preg_replace("/\n?Warning: Can't preload [^\n]*\n?/", "", $output));
}
- if (isset($section_text['EXPECTF']) || isset($section_text['EXPECTREGEX'])) {
- if (isset($section_text['EXPECTF'])) {
- $wanted = trim($section_text['EXPECTF']);
+ if ($test->hasAnySections('EXPECTF', 'EXPECTREGEX')) {
+ if ($test->hasSection('EXPECTF')) {
+ $wanted = trim($test->getSection('EXPECTF'));
} else {
- $wanted = trim($section_text['EXPECTREGEX']);
+ $wanted = trim($test->getSection('EXPECTREGEX'));
}
show_file_block('exp', $wanted);
$wanted_re = preg_replace('/\r\n/', "\n", $wanted);
- if (isset($section_text['EXPECTF'])) {
+ if ($test->hasSection('EXPECTF')) {
// do preg_quote, but miss out any %r delimited sections
$temp = "";
$r = "%r";
@@ -2673,27 +2624,27 @@ COMMAND $cmd
if (preg_match("/^$wanted_re\$/s", $output)) {
$passed = true;
- if (!$cfg['keep']['php']) {
+ if (!$cfg['keep']['php'] && !$leaked) {
@unlink($test_file);
}
@unlink($tmp_post);
if (!$leaked && !$failed_headers) {
- if (isset($section_text['XFAIL'])) {
+ if ($test->hasSection('XFAIL')) {
$warn = true;
$info = " (warn: XFAIL section but test passes)";
- } elseif (isset($section_text['XLEAK'])) {
+ } elseif ($test->hasSection('XLEAK')) {
$warn = true;
$info = " (warn: XLEAK section but test passes)";
} else {
show_result("PASS", $tested, $tested_file, '', $temp_filenames);
- junit_mark_test_as('PASS', $shortname, $tested);
+ $junit->markTestAs('PASS', $shortname, $tested);
return 'PASSED';
}
}
}
} else {
- $wanted = trim($section_text['EXPECT']);
+ $wanted = trim($test->getSection('EXPECT'));
$wanted = preg_replace('/\r\n/', "\n", $wanted);
show_file_block('exp', $wanted);
@@ -2701,21 +2652,21 @@ COMMAND $cmd
if (!strcmp($output, $wanted)) {
$passed = true;
- if (!$cfg['keep']['php']) {
+ if (!$cfg['keep']['php'] && !$leaked) {
@unlink($test_file);
}
@unlink($tmp_post);
if (!$leaked && !$failed_headers) {
- if (isset($section_text['XFAIL'])) {
+ if ($test->hasSection('XFAIL')) {
$warn = true;
$info = " (warn: XFAIL section but test passes)";
- } elseif (isset($section_text['XLEAK'])) {
+ } elseif ($test->hasSection('XLEAK')) {
$warn = true;
$info = " (warn: XLEAK section but test passes)";
} else {
show_result("PASS", $tested, $tested_file, '', $temp_filenames);
- junit_mark_test_as('PASS', $shortname, $tested);
+ $junit->markTestAs('PASS', $shortname, $tested);
return 'PASSED';
}
}
@@ -2736,7 +2687,7 @@ COMMAND $cmd
}
if ($leaked) {
- $restype[] = isset($section_text['XLEAK']) ?
+ $restype[] = $test->hasSection('XLEAK') ?
'XLEAK' : 'LEAK';
}
@@ -2745,12 +2696,12 @@ COMMAND $cmd
}
if (!$passed) {
- if (isset($section_text['XFAIL'])) {
+ if ($test->hasSection('XFAIL')) {
$restype[] = 'XFAIL';
- $info = ' XFAIL REASON: ' . rtrim($section_text['XFAIL']);
- } elseif (isset($section_text['XLEAK'])) {
+ $info = ' XFAIL REASON: ' . rtrim($test->getSection('XFAIL'));
+ } elseif ($test->hasSection('XLEAK')) {
$restype[] = 'XLEAK';
- $info = ' XLEAK REASON: ' . rtrim($section_text['XLEAK']);
+ $info = ' XLEAK REASON: ' . rtrim($test->getSection('XLEAK'));
} else {
$restype[] = 'FAIL';
}
@@ -2778,6 +2729,20 @@ COMMAND $cmd
error("Cannot create test diff - $diff_filename");
}
+ // write .log
+ if (strpos($log_format, 'L') !== false && file_put_contents($log_filename, "
+---- EXPECTED OUTPUT
+$wanted
+---- ACTUAL OUTPUT
+$output
+---- FAILED
+") === false) {
+ error("Cannot create test log - $log_filename");
+ error_report($file, $log_filename, $tested);
+ }
+ }
+
+ if (!$passed || $leaked) {
// write .sh
if (strpos($log_format, 'S') !== false) {
$sh_script = <<<SH
@@ -2785,16 +2750,16 @@ COMMAND $cmd
case "$1" in
"gdb")
- gdb --args {$cmd}
+ gdb --args {$orig_cmd}
;;
"valgrind")
- USE_ZEND_ALLOC=0 valgrind $2 ${cmd}
+ USE_ZEND_ALLOC=0 valgrind $2 ${orig_cmd}
;;
"rr")
- rr record $2 ${cmd}
+ rr record $2 ${orig_cmd}
;;
*)
- {$cmd}
+ {$orig_cmd}
;;
esac
SH;
@@ -2803,18 +2768,6 @@ SH;
}
chmod($sh_filename, 0755);
}
-
- // write .log
- if (strpos($log_format, 'L') !== false && file_put_contents($log_filename, "
----- EXPECTED OUTPUT
-$wanted
----- ACTUAL OUTPUT
-$output
----- FAILED
-") === false) {
- error("Cannot create test log - $log_filename");
- error_report($file, $log_filename, $tested);
- }
}
if ($valgrind && $leaked && $cfg["show"]["mem"]) {
@@ -2835,7 +2788,7 @@ $output
$diff = empty($diff) ? '' : preg_replace('/\e/', '<esc>', $diff);
- junit_mark_test_as($restype, $shortname, $tested, null, $info, $diff);
+ $junit->markTestAs($restype, $shortname, $tested, null, $info, $diff);
return $restype[0] . 'ED';
}
@@ -3331,7 +3284,7 @@ function clear_show_test(): void
// Parallel testing
global $workerID;
- if (!$workerID) {
+ if (!$workerID && isset($line_length)) {
// Write over the last line to avoid random trailing chars on next echo
echo str_repeat(" ", $line_length), "\r";
}
@@ -3379,311 +3332,375 @@ function show_result(
}
-function junit_init(): void
+class BorkageException extends Exception
{
- // Check whether a junit log is wanted.
- global $workerID;
- $JUNIT = getenv('TEST_PHP_JUNIT');
- if (empty($JUNIT)) {
- $GLOBALS['JUNIT'] = false;
- return;
- }
- if ($workerID) {
- $fp = null;
- } elseif (!$fp = fopen($JUNIT, 'w')) {
- error("Failed to open $JUNIT for writing.");
- }
- $GLOBALS['JUNIT'] = [
- 'fp' => $fp,
- 'name' => 'PHP',
+}
+
+class JUnit
+{
+ private bool $enabled = true;
+ private $fp = null;
+ private array $suites = [];
+ private array $rootSuite = self::EMPTY_SUITE + ['name' => 'php'];
+
+ private const EMPTY_SUITE = [
'test_total' => 0,
'test_pass' => 0,
'test_fail' => 0,
'test_error' => 0,
'test_skip' => 0,
'test_warn' => 0,
+ 'files' => [],
'execution_time' => 0,
- 'suites' => [],
- 'files' => []
];
-}
-function junit_save_xml(): void
-{
- global $JUNIT;
- if (!junit_enabled()) {
- return;
+ public function __construct(array $env, int $workerID)
+ {
+ // Check whether a junit log is wanted.
+ $fileName = $env['TEST_PHP_JUNIT'] ?? null;
+ if (empty($fileName)) {
+ $this->enabled = false;
+ return;
+ }
+ if (!$workerID && !$this->fp = fopen($fileName, 'w')) {
+ throw new Exception("Failed to open $fileName for writing.");
+ }
}
- $xml = '<' . '?' . 'xml version="1.0" encoding="UTF-8"' . '?' . '>' . PHP_EOL;
- $xml .= sprintf(
- '<testsuites name="%s" tests="%s" failures="%d" errors="%d" skip="%d" time="%s">' . PHP_EOL,
- $JUNIT['name'],
- $JUNIT['test_total'],
- $JUNIT['test_fail'],
- $JUNIT['test_error'],
- $JUNIT['test_skip'],
- $JUNIT['execution_time']
- );
- $xml .= junit_get_suite_xml();
- $xml .= '</testsuites>';
- fwrite($JUNIT['fp'], $xml);
-}
+ public function isEnabled(): bool
+ {
+ return $this->enabled;
+ }
-function junit_get_suite_xml(string $suite_name = ''): string
-{
- global $JUNIT;
-
- $result = "";
-
- foreach ($JUNIT['suites'] as $suite_name => $suite) {
- $result .= sprintf(
- '<testsuite name="%s" tests="%s" failures="%d" errors="%d" skip="%d" time="%s">' . PHP_EOL,
- $suite['name'],
- $suite['test_total'],
- $suite['test_fail'],
- $suite['test_error'],
- $suite['test_skip'],
- $suite['execution_time']
- );
+ public function clear(): void
+ {
+ $this->rootSuite = self::EMPTY_SUITE + ['name' => 'php'];
+ $this->suites = [];
+ }
- if (!empty($suite_name)) {
- foreach ($suite['files'] as $file) {
- $result .= $JUNIT['files'][$file]['xml'];
- }
+ public function saveXML(): void
+ {
+ if (!$this->enabled) {
+ return;
}
- $result .= '</testsuite>' . PHP_EOL;
+ $xml = '<' . '?' . 'xml version="1.0" encoding="UTF-8"' . '?' . '>' . PHP_EOL;
+ $xml .= sprintf(
+ '<testsuites name="%s" tests="%s" failures="%d" errors="%d" skip="%d" time="%s">' . PHP_EOL,
+ $this->rootSuite['name'],
+ $this->rootSuite['test_total'],
+ $this->rootSuite['test_fail'],
+ $this->rootSuite['test_error'],
+ $this->rootSuite['test_skip'],
+ $this->rootSuite['execution_time']
+ );
+ $xml .= $this->getSuitesXML();
+ $xml .= '</testsuites>';
+ fwrite($this->fp, $xml);
}
- return $result;
-}
+ private function getSuitesXML(string $suite_name = '')
+ {
+ // FIXME: $suite_name gets overwritten
+ $result = '';
+
+ foreach ($this->suites as $suite_name => $suite) {
+ $result .= sprintf(
+ '<testsuite name="%s" tests="%s" failures="%d" errors="%d" skip="%d" time="%s">' . PHP_EOL,
+ $suite['name'],
+ $suite['test_total'],
+ $suite['test_fail'],
+ $suite['test_error'],
+ $suite['test_skip'],
+ $suite['execution_time']
+ );
+
+ if (!empty($suite_name)) {
+ foreach ($suite['files'] as $file) {
+ $result .= $this->rootSuite['files'][$file]['xml'];
+ }
+ }
-function junit_enabled(): bool
-{
- global $JUNIT;
- return !empty($JUNIT);
-}
+ $result .= '</testsuite>' . PHP_EOL;
+ }
-/**
- * @param array|string $type
- */
-function junit_mark_test_as(
- $type,
- string $file_name,
- string $test_name,
- ?int $time = null,
- string $message = '',
- string $details = ''
-): void {
- global $JUNIT;
- if (!junit_enabled()) {
- return;
+ return $result;
}
- $suite = junit_get_suitename_for($file_name);
+ public function markTestAs(
+ $type,
+ string $file_name,
+ string $test_name,
+ ?int $time = null,
+ string $message = '',
+ string $details = ''
+ ): void {
+ if (!$this->enabled) {
+ return;
+ }
- junit_suite_record($suite, 'test_total');
+ $suite = $this->getSuiteName($file_name);
- $time = $time ?? junit_get_timer($file_name);
- junit_suite_record($suite, 'execution_time', $time);
+ $this->record($suite, 'test_total');
- $escaped_details = htmlspecialchars($details, ENT_QUOTES, 'UTF-8');
- $escaped_details = preg_replace_callback('/[\0-\x08\x0B\x0C\x0E-\x1F]/', function (array $c): string {
- return sprintf('[[0x%02x]]', ord($c[0]));
- }, $escaped_details);
- $escaped_message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
+ $time = $time ?? $this->getTimer($file_name);
+ $this->record($suite, 'execution_time', $time);
- $escaped_test_name = htmlspecialchars($file_name . ' (' . $test_name . ')', ENT_QUOTES);
- $JUNIT['files'][$file_name]['xml'] = "<testcase name='$escaped_test_name' time='$time'>\n";
+ $escaped_details = htmlspecialchars($details, ENT_QUOTES, 'UTF-8');
+ $escaped_details = preg_replace_callback('/[\0-\x08\x0B\x0C\x0E-\x1F]/', function ($c) {
+ return sprintf('[[0x%02x]]', ord($c[0]));
+ }, $escaped_details);
+ $escaped_message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
- if (is_array($type)) {
- $output_type = $type[0] . 'ED';
- $temp = array_intersect(['XFAIL', 'XLEAK', 'FAIL', 'WARN'], $type);
- $type = reset($temp);
- } else {
- $output_type = $type . 'ED';
- }
-
- if ('PASS' == $type || 'XFAIL' == $type || 'XLEAK' == $type) {
- junit_suite_record($suite, 'test_pass');
- } elseif ('BORK' == $type) {
- junit_suite_record($suite, 'test_error');
- $JUNIT['files'][$file_name]['xml'] .= "<error type='$output_type' message='$escaped_message'/>\n";
- } elseif ('SKIP' == $type) {
- junit_suite_record($suite, 'test_skip');
- $JUNIT['files'][$file_name]['xml'] .= "<skipped>$escaped_message</skipped>\n";
- } elseif ('WARN' == $type) {
- junit_suite_record($suite, 'test_warn');
- $JUNIT['files'][$file_name]['xml'] .= "<warning>$escaped_message</warning>\n";
- } elseif ('FAIL' == $type) {
- junit_suite_record($suite, 'test_fail');
- $JUNIT['files'][$file_name]['xml'] .= "<failure type='$output_type' message='$escaped_message'>$escaped_details</failure>\n";
- } else {
- junit_suite_record($suite, 'test_error');
- $JUNIT['files'][$file_name]['xml'] .= "<error type='$output_type' message='$escaped_message'>$escaped_details</error>\n";
+ $escaped_test_name = htmlspecialchars($file_name . ' (' . $test_name . ')', ENT_QUOTES);
+ $this->rootSuite['files'][$file_name]['xml'] = "<testcase name='$escaped_test_name' time='$time'>\n";
+
+ if (is_array($type)) {
+ $output_type = $type[0] . 'ED';
+ $temp = array_intersect(['XFAIL', 'XLEAK', 'FAIL', 'WARN'], $type);
+ $type = reset($temp);
+ } else {
+ $output_type = $type . 'ED';
+ }
+
+ if ('PASS' == $type || 'XFAIL' == $type || 'XLEAK' == $type) {
+ $this->record($suite, 'test_pass');
+ } elseif ('BORK' == $type) {
+ $this->record($suite, 'test_error');
+ $this->rootSuite['files'][$file_name]['xml'] .= "<error type='$output_type' message='$escaped_message'/>\n";
+ } elseif ('SKIP' == $type) {
+ $this->record($suite, 'test_skip');
+ $this->rootSuite['files'][$file_name]['xml'] .= "<skipped>$escaped_message</skipped>\n";
+ } elseif ('WARN' == $type) {
+ $this->record($suite, 'test_warn');
+ $this->rootSuite['files'][$file_name]['xml'] .= "<warning>$escaped_message</warning>\n";
+ } elseif ('FAIL' == $type) {
+ $this->record($suite, 'test_fail');
+ $this->rootSuite['files'][$file_name]['xml'] .= "<failure type='$output_type' message='$escaped_message'>$escaped_details</failure>\n";
+ } else {
+ $this->record($suite, 'test_error');
+ $this->rootSuite['files'][$file_name]['xml'] .= "<error type='$output_type' message='$escaped_message'>$escaped_details</error>\n";
+ }
+
+ $this->rootSuite['files'][$file_name]['xml'] .= "</testcase>\n";
}
- $JUNIT['files'][$file_name]['xml'] .= "</testcase>\n";
-}
+ private function record(string $suite, string $param, $value = 1): void
+ {
+ $this->rootSuite[$param] += $value;
+ $this->suites[$suite][$param] += $value;
+ }
-function junit_suite_record(string $suite, string $param, int $value = 1): void
-{
- global $JUNIT;
+ private function getTimer(string $file_name)
+ {
+ if (!$this->enabled) {
+ return 0;
+ }
- $JUNIT[$param] += $value;
- $JUNIT['suites'][$suite][$param] += $value;
-}
+ if (isset($this->rootSuite['files'][$file_name]['total'])) {
+ return number_format($this->rootSuite['files'][$file_name]['total'], 4);
+ }
-function junit_get_timer(string $file_name): int
-{
- global $JUNIT;
- if (!junit_enabled()) {
return 0;
}
- if (isset($JUNIT['files'][$file_name]['total'])) {
- return number_format($JUNIT['files'][$file_name]['total'], 4);
- }
+ public function startTimer(string $file_name): void
+ {
+ if (!$this->enabled) {
+ return;
+ }
- return 0;
-}
+ if (!isset($this->rootSuite['files'][$file_name]['start'])) {
+ $this->rootSuite['files'][$file_name]['start'] = microtime(true);
-function junit_start_timer(string $file_name): void
-{
- global $JUNIT;
- if (!junit_enabled()) {
- return;
+ $suite = $this->getSuiteName($file_name);
+ $this->initSuite($suite);
+ $this->suites[$suite]['files'][$file_name] = $file_name;
+ }
}
- if (!isset($JUNIT['files'][$file_name]['start'])) {
- $JUNIT['files'][$file_name]['start'] = microtime(true);
-
- $suite = junit_get_suitename_for($file_name);
- junit_init_suite($suite);
- $JUNIT['suites'][$suite]['files'][$file_name] = $file_name;
+ public function getSuiteName(string $file_name): string
+ {
+ return $this->pathToClassName(dirname($file_name));
}
-}
-function junit_get_suitename_for(string $file_name): string
-{
- return junit_path_to_classname(dirname($file_name));
-}
+ private function pathToClassName(string $file_name): string
+ {
+ if (!$this->enabled) {
+ return '';
+ }
-function junit_path_to_classname(string $file_name): string
-{
- global $JUNIT;
+ $ret = $this->rootSuite['name'];
+ $_tmp = [];
- if (!junit_enabled()) {
- return '';
+ // lookup whether we're in the PHP source checkout
+ $max = 5;
+ if (is_file($file_name)) {
+ $dir = dirname(realpath($file_name));
+ } else {
+ $dir = realpath($file_name);
+ }
+ do {
+ array_unshift($_tmp, basename($dir));
+ $chk = $dir . DIRECTORY_SEPARATOR . "main" . DIRECTORY_SEPARATOR . "php_version.h";
+ $dir = dirname($dir);
+ } while (!file_exists($chk) && --$max > 0);
+ if (file_exists($chk)) {
+ if ($max) {
+ array_shift($_tmp);
+ }
+ foreach ($_tmp as $p) {
+ $ret .= "." . preg_replace(",[^a-z0-9]+,i", ".", $p);
+ }
+ return $ret;
+ }
+
+ return $this->rootSuite['name'] . '.' . str_replace([DIRECTORY_SEPARATOR, '-'], '.', $file_name);
}
- $ret = $JUNIT['name'];
- $_tmp = [];
+ public function initSuite(string $suite_name): void
+ {
+ if (!$this->enabled) {
+ return;
+ }
- // lookup whether we're in the PHP source checkout
- $max = 5;
- if (is_file($file_name)) {
- $dir = dirname(realpath($file_name));
- } else {
- $dir = realpath($file_name);
+ if (!empty($this->suites[$suite_name])) {
+ return;
+ }
+
+ $this->suites[$suite_name] = self::EMPTY_SUITE + ['name' => $suite_name];
}
- do {
- array_unshift($_tmp, basename($dir));
- $chk = $dir . DIRECTORY_SEPARATOR . "main" . DIRECTORY_SEPARATOR . "php_version.h";
- $dir = dirname($dir);
- } while (!file_exists($chk) && --$max > 0);
- if (file_exists($chk)) {
- if ($max) {
- array_shift($_tmp);
+
+ public function stopTimer(string $file_name): void
+ {
+ if (!$this->enabled) {
+ return;
}
- foreach ($_tmp as $p) {
- $ret .= "." . preg_replace(",[^a-z0-9]+,i", ".", $p);
+
+ if (!isset($this->rootSuite['files'][$file_name]['start'])) {
+ throw new Exception("Timer for $file_name was not started!");
}
- return $ret;
- }
- return $JUNIT['name'] . '.' . str_replace([DIRECTORY_SEPARATOR, '-'], '.', $file_name);
-}
+ if (!isset($this->rootSuite['files'][$file_name]['total'])) {
+ $this->rootSuite['files'][$file_name]['total'] = 0;
+ }
-function junit_init_suite(string $suite_name): void
-{
- global $JUNIT;
- if (!junit_enabled()) {
- return;
+ $start = $this->rootSuite['files'][$file_name]['start'];
+ $this->rootSuite['files'][$file_name]['total'] += microtime(true) - $start;
+ unset($this->rootSuite['files'][$file_name]['start']);
}
- if (!empty($JUNIT['suites'][$suite_name])) {
- return;
+ public function mergeResults(?JUnit $other): void
+ {
+ if (!$this->enabled || !$other) {
+ return;
+ }
+
+ $this->mergeSuites($this->rootSuite, $other->rootSuite);
+ foreach ($other->suites as $name => $suite) {
+ if (!isset($this->suites[$name])) {
+ $this->suites[$name] = $suite;
+ continue;
+ }
+
+ $this->mergeSuites($this->suites[$name], $suite);
+ }
}
- $JUNIT['suites'][$suite_name] = [
- 'name' => $suite_name,
- 'test_total' => 0,
- 'test_pass' => 0,
- 'test_fail' => 0,
- 'test_error' => 0,
- 'test_skip' => 0,
- 'test_warn' => 0,
- 'files' => [],
- 'execution_time' => 0,
- ];
+ private function mergeSuites(array &$dest, array $source): void
+ {
+ $dest['test_total'] += $source['test_total'];
+ $dest['test_pass'] += $source['test_pass'];
+ $dest['test_fail'] += $source['test_fail'];
+ $dest['test_error'] += $source['test_error'];
+ $dest['test_skip'] += $source['test_skip'];
+ $dest['test_warn'] += $source['test_warn'];
+ $dest['execution_time'] += $source['execution_time'];
+ $dest['files'] += $source['files'];
+ }
}
-function junit_finish_timer(string $file_name): void
+class SkipCache
{
- global $JUNIT;
- if (!junit_enabled()) {
- return;
- }
+ private bool $keepFile;
- if (!isset($JUNIT['files'][$file_name]['start'])) {
- error("Timer for $file_name was not started!");
- }
+ private array $skips = [];
+ private array $extensions = [];
+
+ private int $hits = 0;
+ private int $misses = 0;
+ private int $extHits = 0;
+ private int $extMisses = 0;
- if (!isset($JUNIT['files'][$file_name]['total'])) {
- $JUNIT['files'][$file_name]['total'] = 0;
+ public function __construct(bool $keepFile)
+ {
+ $this->keepFile = $keepFile;
}
- $start = $JUNIT['files'][$file_name]['start'];
- $JUNIT['files'][$file_name]['total'] += microtime(true) - $start;
- unset($JUNIT['files'][$file_name]['start']);
-}
+ public function checkSkip(string $php, string $code, string $checkFile, string $tempFile, array $env): string
+ {
+ // Extension tests frequently use something like <?php require 'skipif.inc';
+ // for skip checks. This forces us to cache per directory to avoid pollution.
+ $dir = dirname($checkFile);
+ $key = "$php => $dir";
-function junit_merge_results(array $junit): void
-{
- global $JUNIT;
- $JUNIT['test_total'] += $junit['test_total'];
- $JUNIT['test_pass'] += $junit['test_pass'];
- $JUNIT['test_fail'] += $junit['test_fail'];
- $JUNIT['test_error'] += $junit['test_error'];
- $JUNIT['test_skip'] += $junit['test_skip'];
- $JUNIT['test_warn'] += $junit['test_warn'];
- $JUNIT['execution_time'] += $junit['execution_time'];
- $JUNIT['files'] += $junit['files'];
- foreach ($junit['suites'] as $name => $suite) {
- if (!isset($JUNIT['suites'][$name])) {
- $JUNIT['suites'][$name] = $suite;
- continue;
+ if (isset($this->skips[$key][$code])) {
+ $this->hits++;
+ if ($this->keepFile) {
+ save_text($checkFile, $code, $tempFile);
+ }
+ return $this->skips[$key][$code];
+ }
+
+ save_text($checkFile, $code, $tempFile);
+ $result = trim(system_with_timeout("$php \"$checkFile\"", $env));
+ if (strpos($result, 'nocache') !== 0) {
+ $this->skips[$key][$code] = $result;
+ } else {
+ $result = '';
+ }
+ $this->misses++;
+
+ if (!$this->keepFile) {
+ @unlink($checkFile);
+ }
+
+ return $result;
+ }
+
+ public function getExtensions(string $php): array
+ {
+ if (isset($this->extensions[$php])) {
+ $this->extHits++;
+ return $this->extensions[$php];
}
- $SUITE =& $JUNIT['suites'][$name];
- $SUITE['test_total'] += $suite['test_total'];
- $SUITE['test_pass'] += $suite['test_pass'];
- $SUITE['test_fail'] += $suite['test_fail'];
- $SUITE['test_error'] += $suite['test_error'];
- $SUITE['test_skip'] += $suite['test_skip'];
- $SUITE['test_warn'] += $suite['test_warn'];
- $SUITE['execution_time'] += $suite['execution_time'];
- $SUITE['files'] += $suite['files'];
+ $extDir = `$php -d display_errors=0 -r "echo ini_get('extension_dir');"`;
+ $extensions = explode(",", `$php -d display_errors=0 -r "echo implode(',', get_loaded_extensions());"`);
+
+ $result = [$extDir, $extensions];
+ $this->extensions[$php] = $result;
+ $this->extMisses++;
+
+ return $result;
}
+
+// public function __destruct()
+// {
+// echo "Skips: {$this->hits} hits, {$this->misses} misses.\n";
+// echo "Extensions: {$this->extHits} hits, {$this->extMisses} misses.\n";
+// echo "Cache distribution:\n";
+//
+// foreach ($this->skips as $php => $cache) {
+// echo "$php: " . count($cache) . "\n";
+// }
+// }
}
class RuntestsValgrind
{
protected $version = '';
protected $header = '';
- protected $version_3_3_0 = false;
protected $version_3_8_0 = false;
protected $tool = null;
@@ -3713,7 +3730,6 @@ class RuntestsValgrind
$this->version = $version;
$this->header = sprintf(
"%s (%s)", trim($header), $this->tool);
- $this->version_3_3_0 = version_compare($version, '3.3.0', '>=');
$this->version_3_8_0 = version_compare($version, '3.8.0', '>=');
}
@@ -3726,12 +3742,208 @@ class RuntestsValgrind
/* --vex-iropt-register-updates=allregs-at-mem-access is necessary for phpdbg watchpoint tests */
if ($this->version_3_8_0) {
- /* valgrind 3.3.0+ doesn't have --log-file-exactly option */
return "$vcmd --vex-iropt-register-updates=allregs-at-mem-access --log-file=$memcheck_filename $cmd";
- } elseif ($this->version_3_3_0) {
- return "$vcmd --vex-iropt-precise-memory-exns=yes --log-file=$memcheck_filename $cmd";
+ }
+ return "$vcmd --vex-iropt-precise-memory-exns=yes --log-file=$memcheck_filename $cmd";
+ }
+}
+
+class TestFile
+{
+ private string $fileName;
+
+ private array $sections = ['TEST' => ''];
+
+ private const ALLOWED_SECTIONS = [
+ 'EXPECT', 'EXPECTF', 'EXPECTREGEX', 'EXPECTREGEX_EXTERNAL', 'EXPECT_EXTERNAL', 'EXPECTF_EXTERNAL', 'EXPECTHEADERS',
+ 'POST', 'POST_RAW', 'GZIP_POST', 'DEFLATE_POST', 'PUT', 'GET', 'COOKIE', 'ARGS',
+ 'FILE', 'FILEEOF', 'FILE_EXTERNAL', 'REDIRECTTEST',
+ 'CAPTURE_STDIO', 'STDIN', 'CGI', 'PHPDBG',
+ 'INI', 'ENV', 'EXTENSIONS',
+ 'SKIPIF', 'XFAIL', 'XLEAK', 'CLEAN',
+ 'CREDITS', 'DESCRIPTION', 'CONFLICTS', 'WHITESPACE_SENSITIVE',
+ ];
+
+ public function __construct(string $fileName, bool $inRedirect)
+ {
+ $this->fileName = $fileName;
+
+ $this->readFile();
+ $this->validateAndProcess($inRedirect);
+ }
+
+ public function hasSection(string $name): bool
+ {
+ return isset($this->sections[$name]);
+ }
+
+ public function hasAllSections(string ...$names): bool
+ {
+ foreach ($names as $section) {
+ if (!isset($this->sections[$section])) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public function hasAnySections(string ...$names): bool
+ {
+ foreach ($names as $section) {
+ if (isset($this->sections[$section])) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function sectionNotEmpty(string $name): bool
+ {
+ return !empty($this->sections[$name]);
+ }
+
+ public function getSection(string $name): string
+ {
+ if (!isset($this->sections[$name])) {
+ throw new Exception("Section $name not found");
+ }
+ return $this->sections[$name];
+ }
+
+ public function getName(): string
+ {
+ return trim($this->getSection('TEST'));
+ }
+
+ public function isCGI(): bool
+ {
+ return $this->sectionNotEmpty('CGI')
+ || $this->sectionNotEmpty('GET')
+ || $this->sectionNotEmpty('POST')
+ || $this->sectionNotEmpty('GZIP_POST')
+ || $this->sectionNotEmpty('DEFLATE_POST')
+ || $this->sectionNotEmpty('POST_RAW')
+ || $this->sectionNotEmpty('PUT')
+ || $this->sectionNotEmpty('COOKIE')
+ || $this->sectionNotEmpty('EXPECTHEADERS');
+ }
+
+ /**
+ * TODO Refactor to make it not needed
+ */
+ public function setSection(string $name, string $value): void
+ {
+ $this->sections[$name] = $value;
+ }
+
+ /**
+ * Load the sections of the test file
+ */
+ private function readFile(): void
+ {
+ $fp = fopen($this->fileName, "rb") or error("Cannot open test file: {$this->fileName}");
+
+ if (!feof($fp)) {
+ $line = fgets($fp);
+
+ if ($line === false) {
+ throw new BorkageException("cannot read test");
+ }
} else {
- return "$vcmd --vex-iropt-precise-memory-exns=yes --log-file-exactly=$memcheck_filename $cmd";
+ throw new BorkageException("empty test [{$this->fileName}]");
+ }
+ if (strncmp('--TEST--', $line, 8)) {
+ throw new BorkageException("tests must start with --TEST-- [{$this->fileName}]");
+ }
+
+ $section = 'TEST';
+ $secfile = false;
+ $secdone = false;
+
+ while (!feof($fp)) {
+ $line = fgets($fp);
+
+ if ($line === false) {
+ break;
+ }
+
+ // Match the beginning of a section.
+ if (preg_match('/^--([_A-Z]+)--/', $line, $r)) {
+ $section = (string) $r[1];
+
+ if (isset($this->sections[$section]) && $this->sections[$section]) {
+ throw new BorkageException("duplicated $section section");
+ }
+
+ // check for unknown sections
+ if (!in_array($section, self::ALLOWED_SECTIONS)) {
+ throw new BorkageException('Unknown section "' . $section . '"');
+ }
+
+ $this->sections[$section] = '';
+ $secfile = $section == 'FILE' || $section == 'FILEEOF' || $section == 'FILE_EXTERNAL';
+ $secdone = false;
+ continue;
+ }
+
+ // Add to the section text.
+ if (!$secdone) {
+ $this->sections[$section] .= $line;
+ }
+
+ // End of actual test?
+ if ($secfile && preg_match('/^===DONE===\s*$/', $line)) {
+ $secdone = true;
+ }
+ }
+
+ fclose($fp);
+ }
+
+ private function validateAndProcess(bool $inRedirect): void
+ {
+ // the redirect section allows a set of tests to be reused outside of
+ // a given test dir
+ if ($this->hasSection('REDIRECTTEST')) {
+ if ($inRedirect) {
+ throw new BorkageException("Can't redirect a test from within a redirected test");
+ }
+ return;
+ }
+ if (!$this->hasSection('PHPDBG') && $this->hasSection('FILE') + $this->hasSection('FILEEOF') + $this->hasSection('FILE_EXTERNAL') != 1) {
+ throw new BorkageException("missing section --FILE--");
+ }
+
+ if ($this->hasSection('FILEEOF')) {
+ $this->sections['FILE'] = preg_replace("/[\r\n]+$/", '', $this->sections['FILEEOF']);
+ unset($this->sections['FILEEOF']);
+ }
+
+ foreach (['FILE', 'EXPECT', 'EXPECTF', 'EXPECTREGEX'] as $prefix) {
+ // For grepping: FILE_EXTERNAL, EXPECT_EXTERNAL, EXPECTF_EXTERNAL, EXPECTREGEX_EXTERNAL
+ $key = $prefix . '_EXTERNAL';
+
+ if ($this->hasSection($key)) {
+ // don't allow tests to retrieve files from anywhere but this subdirectory
+ $dir = dirname($this->fileName);
+ $fileName = $dir . '/' . trim(str_replace('..', '', $this->getSection($key)));
+
+ if (file_exists($fileName)) {
+ $this->sections[$prefix] = file_get_contents($fileName);
+ } else {
+ throw new BorkageException("could not load --" . $key . "-- " . $dir . '/' . trim($fileName));
+ }
+ }
+ }
+
+ if (($this->hasSection('EXPECT') + $this->hasSection('EXPECTF') + $this->hasSection('EXPECTREGEX')) != 1) {
+ throw new BorkageException("missing section --EXPECT--, --EXPECTF-- or --EXPECTREGEX--");
+ }
+
+ if ($this->hasSection('PHPDBG') && !$this->hasSection('STDIN')) {
+ $this->sections['STDIN'] = $this->sections['PHPDBG'] . "\n";
}
}
}
diff --git a/sapi/apache2handler/apache_config.c b/sapi/apache2handler/apache_config.c
index 0079ac7fea..a68c313ad6 100644
--- a/sapi/apache2handler/apache_config.c
+++ b/sapi/apache2handler/apache_config.c
@@ -119,7 +119,7 @@ static const char *php_apache_phpini_set(cmd_parms *cmd, void *mconfig, const ch
return NULL;
}
-static zend_bool should_overwrite_per_dir_entry(HashTable *target_ht, zval *zv, zend_hash_key *hash_key, void *pData)
+static bool should_overwrite_per_dir_entry(HashTable *target_ht, zval *zv, zend_hash_key *hash_key, void *pData)
{
php_dir_entry *new_per_dir_entry = Z_PTR_P(zv);
php_dir_entry *orig_per_dir_entry;
diff --git a/sapi/apache2handler/php_apache.h b/sapi/apache2handler/php_apache.h
index d6c67c8a8d..54b531ed85 100644
--- a/sapi/apache2handler/php_apache.h
+++ b/sapi/apache2handler/php_apache.h
@@ -68,9 +68,9 @@ void php_ap2_register_hook(apr_pool_t *p);
#define APR_ARRAY_FOREACH_CLOSE() }}
typedef struct {
- zend_bool engine;
- zend_bool xbithack;
- zend_bool last_modified;
+ bool engine;
+ bool xbithack;
+ bool last_modified;
} php_apache2_info_struct;
extern zend_module_entry apache2_module_entry;
diff --git a/sapi/apache2handler/php_functions.c b/sapi/apache2handler/php_functions.c
index e7d29450ee..0eada1576d 100644
--- a/sapi/apache2handler/php_functions.c
+++ b/sapi/apache2handler/php_functions.c
@@ -253,7 +253,7 @@ PHP_FUNCTION(apache_setenv)
php_struct *ctx;
char *variable=NULL, *string_val=NULL;
size_t variable_len, string_val_len;
- zend_bool walk_to_top = 0;
+ bool walk_to_top = 0;
int arg_count = ZEND_NUM_ARGS();
request_rec *r;
@@ -287,7 +287,7 @@ PHP_FUNCTION(apache_getenv)
php_struct *ctx;
char *variable;
size_t variable_len;
- zend_bool walk_to_top = 0;
+ bool walk_to_top = 0;
int arg_count = ZEND_NUM_ARGS();
char *env_val=NULL;
request_rec *r;
diff --git a/sapi/apache2handler/php_functions.stub.php b/sapi/apache2handler/php_functions.stub.php
index 93955c7181..99a401dbab 100644
--- a/sapi/apache2handler/php_functions.stub.php
+++ b/sapi/apache2handler/php_functions.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function apache_lookup_uri(string $filename): object|false {}
diff --git a/sapi/apache2handler/php_functions_arginfo.h b/sapi/apache2handler/php_functions_arginfo.h
index a712ce590c..0830189057 100644
--- a/sapi/apache2handler/php_functions_arginfo.h
+++ b/sapi/apache2handler/php_functions_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 2e2e63b5c845bb74309b2b3e52ca5a3d76f2c80b */
+ * Stub hash: 130666f6f971fe7b43a450d922e4b3d092e78667 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_apache_lookup_uri, 0, 1, MAY_BE_OBJECT|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
diff --git a/sapi/apache2handler/sapi_apache2.c b/sapi/apache2handler/sapi_apache2.c
index 2266b46e58..049f1b7d35 100644
--- a/sapi/apache2handler/sapi_apache2.c
+++ b/sapi/apache2handler/sapi_apache2.c
@@ -699,12 +699,14 @@ zend_first_try {
} else {
zend_file_handle zfd;
zend_stream_init_filename(&zfd, (char *) r->filename);
+ zfd.primary_script = 1;
if (!parent_req) {
php_execute_script(&zfd);
} else {
zend_execute_scripts(ZEND_INCLUDE, NULL, 1, &zfd);
}
+ zend_destroy_file_handle(&zfd);
apr_table_set(r->notes, "mod_php_memory_usage",
apr_psprintf(ctx->r->pool, "%" APR_SIZE_T_FMT, zend_memory_peak_usage(1)));
diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c
index d1d538345f..8673ec47df 100644
--- a/sapi/cgi/cgi_main.c
+++ b/sapi/cgi/cgi_main.c
@@ -162,15 +162,15 @@ static const opt_struct OPTIONS[] = {
typedef struct _php_cgi_globals_struct {
HashTable user_config_cache;
char *redirect_status_env;
- zend_bool rfc2616_headers;
- zend_bool nph;
- zend_bool check_shebang_line;
- zend_bool fix_pathinfo;
- zend_bool force_redirect;
- zend_bool discard_path;
- zend_bool fcgi_logging;
+ bool rfc2616_headers;
+ bool nph;
+ bool check_shebang_line;
+ bool fix_pathinfo;
+ bool force_redirect;
+ bool discard_path;
+ bool fcgi_logging;
#ifdef PHP_WIN32
- zend_bool impersonate;
+ bool impersonate;
#endif
} php_cgi_globals_struct;
@@ -368,7 +368,7 @@ static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers)
{
sapi_header_struct *h;
zend_llist_position pos;
- zend_bool ignore_status = 0;
+ bool ignore_status = 0;
int response_status = SG(sapi_headers).http_response_code;
if (SG(request_info).no_headers == 1) {
@@ -378,7 +378,7 @@ static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers)
if (CGIG(nph) || SG(sapi_headers).http_response_code != 200)
{
int len;
- zend_bool has_status = 0;
+ bool has_status = 0;
char buf[SAPI_CGI_MAX_HEADER_LENGTH];
if (CGIG(rfc2616_headers) && SG(sapi_headers).http_status_line) {
@@ -2450,17 +2450,6 @@ parent_loop_end:
}
} /* end !cgi && !fastcgi */
- /*
- we never take stdin if we're (f)cgi, always
- rely on the web server giving us the info
- we need in the environment.
- */
- if (SG(request_info).path_translated || cgi || fastcgi) {
- zend_stream_init_filename(&file_handle, SG(request_info).path_translated);
- } else {
- zend_stream_init_fp(&file_handle, stdin, "Standard input code");
- }
-
/* request startup only after we've done all we can to
* get path_translated */
if (php_request_startup() == FAILURE) {
@@ -2520,6 +2509,10 @@ parent_loop_end:
free(bindpath);
return FAILURE;
}
+ } else {
+ /* we never take stdin if we're (f)cgi */
+ zend_stream_init_fp(&file_handle, stdin, "Standard input code");
+ file_handle.primary_script = 1;
}
if (CGIG(check_shebang_line)) {
@@ -2534,9 +2527,9 @@ parent_loop_end:
PG(during_request_startup) = 0;
exit_status = php_lint_script(&file_handle);
if (exit_status == SUCCESS) {
- zend_printf("No syntax errors detected in %s\n", file_handle.filename);
+ zend_printf("No syntax errors detected in %s\n", ZSTR_VAL(file_handle.filename));
} else {
- zend_printf("Errors parsing %s\n", file_handle.filename);
+ zend_printf("Errors parsing %s\n", ZSTR_VAL(file_handle.filename));
}
break;
case PHP_MODE_STRIP:
@@ -2557,22 +2550,22 @@ parent_loop_end:
}
fastcgi_request_done:
- {
- if (SG(request_info).path_translated) {
- efree(SG(request_info).path_translated);
- SG(request_info).path_translated = NULL;
- }
+ zend_destroy_file_handle(&file_handle);
- php_request_shutdown((void *) 0);
+ if (SG(request_info).path_translated) {
+ efree(SG(request_info).path_translated);
+ SG(request_info).path_translated = NULL;
+ }
- if (exit_status == 0) {
- exit_status = EG(exit_status);
- }
+ php_request_shutdown((void *) 0);
- if (free_query_string && SG(request_info).query_string) {
- free(SG(request_info).query_string);
- SG(request_info).query_string = NULL;
- }
+ if (exit_status == 0) {
+ exit_status = EG(exit_status);
+ }
+
+ if (free_query_string && SG(request_info).query_string) {
+ free(SG(request_info).query_string);
+ SG(request_info).query_string = NULL;
}
if (!fastcgi) {
diff --git a/sapi/cgi/cgi_main.stub.php b/sapi/cgi/cgi_main.stub.php
index 8273cffdc2..8540af93f9 100644
--- a/sapi/cgi/cgi_main.stub.php
+++ b/sapi/cgi/cgi_main.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function apache_child_terminate(): void {}
diff --git a/sapi/cgi/cgi_main_arginfo.h b/sapi/cgi/cgi_main_arginfo.h
index 2eaab875c4..fb4f8d9dc8 100644
--- a/sapi/cgi/cgi_main_arginfo.h
+++ b/sapi/cgi/cgi_main_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: ccb32ad91944af15fe1fcb44b97c28a79c1aad86 */
+ * Stub hash: df963adc6bc610cdd31861036889141fa9464ded */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_apache_child_terminate, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO()
diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c
index 330c91d58b..835582df88 100644
--- a/sapi/cli/php_cli.c
+++ b/sapi/cli/php_cli.c
@@ -172,6 +172,9 @@ const opt_struct OPTIONS[] = {
{14, 1, "ri"},
{14, 1, "rextinfo"},
{15, 0, "ini"},
+ /* Internal testing option -- may be changed or removed without notice,
+ * including in patch releases. */
+ {16, 1, "repeat"},
{'-', 0, NULL} /* end of args */
};
@@ -529,7 +532,7 @@ static void php_cli_usage(char *argv0)
static php_stream *s_in_process = NULL;
-static void cli_register_file_handles(void) /* {{{ */
+static void cli_register_file_handles(bool no_close) /* {{{ */
{
php_stream *s_in, *s_out, *s_err;
php_stream_context *sc_in=NULL, *sc_out=NULL, *sc_err=NULL;
@@ -546,11 +549,11 @@ static void cli_register_file_handles(void) /* {{{ */
return;
}
-#if PHP_DEBUG
- /* do not close stdout and stderr */
- s_out->flags |= PHP_STREAM_FLAG_NO_CLOSE;
- s_err->flags |= PHP_STREAM_FLAG_NO_CLOSE;
-#endif
+ if (no_close) {
+ s_in->flags |= PHP_STREAM_FLAG_NO_CLOSE;
+ s_out->flags |= PHP_STREAM_FLAG_NO_CLOSE;
+ s_err->flags |= PHP_STREAM_FLAG_NO_CLOSE;
+ }
s_in_process = s_in;
@@ -584,6 +587,7 @@ static int cli_seek_file_begin(zend_file_handle *file_handle, char *script_file)
}
zend_stream_init_fp(file_handle, fp, script_file);
+ file_handle->primary_script = 1;
return SUCCESS;
}
/* }}} */
@@ -614,6 +618,10 @@ static int do_cli(int argc, char **argv) /* {{{ */
int interactive=0;
const char *param_error=NULL;
int hide_argv = 0;
+ int num_repeats = 1;
+ pid_t pid = getpid();
+
+ file_handle.filename = NULL;
zend_try {
@@ -640,12 +648,12 @@ static int do_cli(int argc, char **argv) /* {{{ */
#else
"NTS "
#endif
-#ifdef COMPILER
- COMPILER
+#ifdef PHP_BUILD_COMPILER
+ PHP_BUILD_COMPILER
" "
#endif
-#ifdef ARCHITECTURE
- ARCHITECTURE
+#ifdef PHP_BUILD_ARCH
+ PHP_BUILD_ARCH
" "
#endif
#if ZEND_DEBUG
@@ -839,6 +847,9 @@ static int do_cli(int argc, char **argv) /* {{{ */
case 15:
behavior = PHP_MODE_SHOW_INI_CONFIG;
break;
+ case 16:
+ num_repeats = atoi(php_optarg);
+ break;
default:
break;
}
@@ -873,6 +884,12 @@ static int do_cli(int argc, char **argv) /* {{{ */
fflush(stdout);
}
+ if (num_repeats > 1) {
+ fprintf(stdout, "Executing for the first time...\n");
+ fflush(stdout);
+ }
+
+do_repeat:
/* only set script_file if not set already and not in direct mode and not at end of parameter list */
if (argc > php_optind
&& !script_file
@@ -884,6 +901,7 @@ static int do_cli(int argc, char **argv) /* {{{ */
php_optind++;
}
if (script_file) {
+ virtual_cwd_activate();
if (cli_seek_file_begin(&file_handle, script_file) != SUCCESS) {
goto err;
} else {
@@ -892,28 +910,32 @@ static int do_cli(int argc, char **argv) /* {{{ */
translated_path = strdup(real_path);
}
script_filename = script_file;
+ php_self = script_file;
}
} else {
/* We could handle PHP_MODE_PROCESS_STDIN in a different manner */
/* here but this would make things only more complicated. And it */
/* is consistent with the way -R works where the stdin file handle*/
/* is also accessible. */
- zend_stream_init_fp(&file_handle, stdin, "Standard input code");
+ php_self = "Standard input code";
+ if (behavior < PHP_MODE_CLI_DIRECT
+ && (!interactive || PHP_MODE_STANDARD != PHP_MODE_STANDARD)) {
+ zend_stream_init_fp(&file_handle, stdin, php_self);
+ file_handle.primary_script = 1;
+ }
}
- php_self = (char*)file_handle.filename;
/* before registering argv to module exchange the *new* argv[0] */
/* we can achieve this without allocating more memory */
SG(request_info).argc=argc-php_optind+1;
arg_excp = argv+php_optind-1;
arg_free = argv[php_optind-1];
- SG(request_info).path_translated = translated_path? translated_path: (char*)file_handle.filename;
- argv[php_optind-1] = (char*)file_handle.filename;
+ SG(request_info).path_translated = translated_path ? translated_path : php_self;
+ argv[php_optind-1] = php_self;
SG(request_info).argv=argv+php_optind-1;
if (php_request_startup()==FAILURE) {
*arg_excp = arg_free;
- fclose(file_handle.handle.fp);
PUTS("Could not startup.\n");
goto err;
}
@@ -939,8 +961,8 @@ static int do_cli(int argc, char **argv) /* {{{ */
PG(during_request_startup) = 0;
switch (behavior) {
case PHP_MODE_STANDARD:
- if (strcmp(file_handle.filename, "Standard input code")) {
- cli_register_file_handles();
+ if (script_file) {
+ cli_register_file_handles(/* no_close */ PHP_DEBUG || num_repeats > 1);
}
if (interactive && cli_shell_callbacks.cli_shell_run) {
@@ -952,9 +974,9 @@ static int do_cli(int argc, char **argv) /* {{{ */
case PHP_MODE_LINT:
EG(exit_status) = php_lint_script(&file_handle);
if (EG(exit_status) == SUCCESS) {
- zend_printf("No syntax errors detected in %s\n", file_handle.filename);
+ zend_printf("No syntax errors detected in %s\n", php_self);
} else {
- zend_printf("Errors parsing %s\n", file_handle.filename);
+ zend_printf("Errors parsing %s\n", php_self);
}
break;
case PHP_MODE_STRIP:
@@ -975,7 +997,7 @@ static int do_cli(int argc, char **argv) /* {{{ */
}
break;
case PHP_MODE_CLI_DIRECT:
- cli_register_file_handles();
+ cli_register_file_handles(/* no_close */ PHP_DEBUG || num_repeats > 1);
zend_eval_string_ex(exec_direct, NULL, "Command line code", 1);
break;
@@ -985,7 +1007,12 @@ static int do_cli(int argc, char **argv) /* {{{ */
size_t len, index = 0;
zval argn, argi;
- cli_register_file_handles();
+ if (!exec_run && script_file) {
+ zend_string_release_ex(file_handle.filename, 0);
+ file_handle.filename = NULL;
+ }
+
+ cli_register_file_handles(/* no_close */ PHP_DEBUG || num_repeats > 1);
if (exec_begin) {
zend_eval_string_ex(exec_begin, NULL, "Command line begin code", 1);
@@ -1106,12 +1133,21 @@ static int do_cli(int argc, char **argv) /* {{{ */
} zend_end_try();
out:
+ if (file_handle.filename) {
+ zend_destroy_file_handle(&file_handle);
+ }
if (request_started) {
php_request_shutdown((void *) 0);
}
if (translated_path) {
free(translated_path);
}
+ /* Don't repeat fork()ed processes. */
+ if (--num_repeats && pid == getpid()) {
+ fprintf(stdout, "Finished execution, repeating...\n");
+ fflush(stdout);
+ goto do_repeat;
+ }
return EG(exit_status);
err:
sapi_deactivate();
diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c
index 4fe975d6a4..6511e08c9a 100644
--- a/sapi/cli/php_cli_server.c
+++ b/sapi/cli/php_cli_server.c
@@ -1123,7 +1123,7 @@ static void php_cli_server_log_response(php_cli_server_client *client, int statu
{
int color = 0, effective_status = status;
char *basic_buf, *message_buf = "", *error_buf = "";
- zend_bool append_error_message = 0;
+ bool append_error_message = 0;
if (PG(last_error_message)) {
if (PG(last_error_type) & E_FATAL_ERRORS) {
@@ -1821,12 +1821,8 @@ static size_t php_cli_server_client_send_through(php_cli_server_client *client,
int nfds = php_pollfd_for(client->sock, POLLOUT, &tv);
if (nfds > 0) {
continue;
- } else if (nfds < 0) {
- /* error */
- php_handle_aborted_connection();
- return nbytes_left;
} else {
- /* timeout */
+ /* error or timeout */
php_handle_aborted_connection();
return nbytes_left;
}
@@ -2019,9 +2015,11 @@ static int php_cli_server_dispatch_script(php_cli_server *server, php_cli_server
{
zend_file_handle zfd;
zend_stream_init_filename(&zfd, SG(request_info).path_translated);
+ zfd.primary_script = 1;
zend_try {
php_execute_script(&zfd);
} zend_end_try();
+ zend_destroy_file_handle(&zfd);
}
php_cli_server_log_response(client, SG(sapi_headers).http_response_code, NULL);
@@ -2140,6 +2138,7 @@ static int php_cli_server_dispatch_router(php_cli_server *server, php_cli_server
php_ignore_value(VCWD_GETCWD(old_cwd, MAXPATHLEN - 1));
zend_stream_init_filename(&zfd, server->router);
+ zfd.primary_script = 1;
zend_try {
zval retval;
@@ -2153,6 +2152,8 @@ static int php_cli_server_dispatch_router(php_cli_server *server, php_cli_server
}
} zend_end_try();
+ zend_destroy_file_handle(&zfd);
+
if (old_cwd[0] != '\0') {
php_ignore_value(VCWD_CHDIR(old_cwd));
}
@@ -2736,7 +2737,7 @@ int do_cli_server(int argc, char **argv) /* {{{ */
sapi_module.phpinfo_as_text = 0;
{
- zend_bool ipv6 = strchr(server.host, ':');
+ bool ipv6 = strchr(server.host, ':');
php_cli_server_logf(
PHP_CLI_SERVER_LOG_PROCESS,
"PHP %s Development Server (http://%s%s%s:%d) started",
diff --git a/sapi/cli/tests/CONFLICTS b/sapi/cli/tests/CONFLICTS
deleted file mode 100644
index 254defddb5..0000000000
--- a/sapi/cli/tests/CONFLICTS
+++ /dev/null
@@ -1 +0,0 @@
-server
diff --git a/sapi/cli/tests/bug61977.phpt b/sapi/cli/tests/bug61977.phpt
index b55c6a2e8f..e804e0dfce 100644
--- a/sapi/cli/tests/bug61977.phpt
+++ b/sapi/cli/tests/bug61977.phpt
@@ -7,7 +7,7 @@ include "skipif.inc";
--FILE--
<?php
include "php_cli_server.inc";
-php_cli_server_start('<?php ?>', null);
+$doc_root = php_cli_server_start('<?php ?>', null)->docRoot;
/*
* If a Mime Type is added in php_cli_server.c, add it to this array and update
@@ -15,32 +15,29 @@ php_cli_server_start('<?php ?>', null);
*/
$mimetypes = ['html', 'htm', 'svg', 'css', 'js', 'png', 'webm', 'ogv', 'ogg'];
-function test_mimetypes($mimetypes) {
- foreach ($mimetypes as $mimetype) {
- $host = PHP_CLI_SERVER_HOSTNAME;
- $fp = php_cli_server_connect();
- if (!$fp) die('Connect failed');
- file_put_contents(__DIR__ . "/foo.{$mimetype}", '');
- $header = <<<HEADER
+foreach ($mimetypes as $mimetype) {
+ $host = PHP_CLI_SERVER_HOSTNAME;
+ $fp = php_cli_server_connect();
+ if (!$fp) die('Connect failed');
+ file_put_contents($doc_root . "/foo.{$mimetype}", '');
+ $header = <<<HEADER
GET /foo.{$mimetype} HTTP/1.1
Host: {$host}
HEADER;
- if (fwrite($fp, $header)) {
- while (!feof($fp)) {
- $text = fgets($fp);
- if (strncasecmp("Content-type:", $text, 13) == 0) {
- echo "foo.{$mimetype} => ", $text;
- }
+ if (fwrite($fp, $header)) {
+ while (!feof($fp)) {
+ $text = fgets($fp);
+ if (strncasecmp("Content-type:", $text, 13) == 0) {
+ echo "foo.{$mimetype} => ", $text;
}
- @unlink(__DIR__ . "/foo.{$mimetype}");
- fclose($fp);
}
+ @unlink($doc_root . "/foo.{$mimetype}");
+ fclose($fp);
}
}
-test_mimetypes($mimetypes);
?>
--EXPECT--
foo.html => Content-Type: text/html; charset=UTF-8
diff --git a/sapi/cli/tests/bug67429_1.phpt b/sapi/cli/tests/bug67429_1.phpt
index 5b23818bdb..5519463340 100644
--- a/sapi/cli/tests/bug67429_1.phpt
+++ b/sapi/cli/tests/bug67429_1.phpt
@@ -8,7 +8,7 @@ include "skipif.inc";
<?php
include "php_cli_server.inc";
-$proc_handle = php_cli_server_start(<<<PHP
+php_cli_server_start(<<<PHP
http_response_code(308);
PHP
);
diff --git a/sapi/cli/tests/bug67429_2.phpt b/sapi/cli/tests/bug67429_2.phpt
index 381c7af8e5..5c4fffe410 100644
--- a/sapi/cli/tests/bug67429_2.phpt
+++ b/sapi/cli/tests/bug67429_2.phpt
@@ -8,7 +8,7 @@ include "skipif.inc";
<?php
include "php_cli_server.inc";
-$proc_handle = php_cli_server_start(<<<PHP
+php_cli_server_start(<<<PHP
http_response_code(426);
PHP
);
diff --git a/sapi/cli/tests/bug68291.phpt b/sapi/cli/tests/bug68291.phpt
index 62042307c5..1082194f5f 100644
--- a/sapi/cli/tests/bug68291.phpt
+++ b/sapi/cli/tests/bug68291.phpt
@@ -9,13 +9,10 @@ include "skipif.inc";
--FILE--
<?php
include "php_cli_server.inc";
-file_put_contents(__DIR__ . '/bug68291+test.html', 'Found');
-php_cli_server_start(NULL, NULL);
+$docRoot = php_cli_server_start(NULL, NULL)->docRoot;
+file_put_contents($docRoot . '/bug68291+test.html', 'Found');
echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/bug68291+test.html');
-?>
---CLEAN--
-<?php
-@unlink(__DIR__ . '/bug68291+test.html');
+@unlink($docRoot . '/bug68291+test.html');
?>
--EXPECT--
Found
diff --git a/sapi/cli/tests/bug69655.phpt b/sapi/cli/tests/bug69655.phpt
index b5612357f9..4ab53bcbaa 100644
--- a/sapi/cli/tests/bug69655.phpt
+++ b/sapi/cli/tests/bug69655.phpt
@@ -17,11 +17,11 @@ foreach (['MKCO', 'MKCOLL', 'M'] as $method) {
}
?>
--EXPECTF--
-Warning: file_get_contents(http://localhost:8964): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
+Warning: file_get_contents(http://localhost:%d): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
in %s on line %d
-Warning: file_get_contents(http://localhost:8964): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
+Warning: file_get_contents(http://localhost:%d): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
in %s on line %d
-Warning: file_get_contents(http://localhost:8964): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
+Warning: file_get_contents(http://localhost:%d): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
in %s on line %d
diff --git a/sapi/cli/tests/php_cli_server.inc b/sapi/cli/tests/php_cli_server.inc
index 4cf8705a33..26bdd4c18f 100644
--- a/sapi/cli/tests/php_cli_server.inc
+++ b/sapi/cli/tests/php_cli_server.inc
@@ -1,22 +1,29 @@
<?php
-define("PHP_CLI_SERVER_HOSTNAME", "localhost");
-define("PHP_CLI_SERVER_PORT", 8964);
-define("PHP_CLI_SERVER_ADDRESS", PHP_CLI_SERVER_HOSTNAME.":".PHP_CLI_SERVER_PORT);
+
+// TODO: Move address/port info in here?
+class CliServerInfo {
+ public function __construct(
+ public string $docRoot,
+ ) {}
+}
function php_cli_server_start(
?string $code = 'echo "Hello world";',
?string $router = 'index.php',
array $cmd_args = []
-) {
+): CliServerInfo {
$php_executable = getenv('TEST_PHP_EXECUTABLE');
- $doc_root = __DIR__;
$error = null;
+ // Create dedicated doc root to avoid index.php clashes between tests.
+ $doc_root = __DIR__ . '/' . basename($_SERVER['PHP_SELF'], '.php');
+ @mkdir($doc_root);
+
if ($code) {
file_put_contents($doc_root . '/' . ($router ?: 'index.php'), '<?php ' . $code . ' ?>');
}
- $cmd = [$php_executable, '-t', $doc_root, '-n', ...$cmd_args, '-S', PHP_CLI_SERVER_ADDRESS];
+ $cmd = [$php_executable, '-t', $doc_root, '-n', ...$cmd_args, '-S', 'localhost:0'];
if (!is_null($router)) {
$cmd[] = $router;
}
@@ -24,62 +31,58 @@ function php_cli_server_start(
$descriptorspec = array(
0 => STDIN,
1 => STDOUT,
- 2 => array("null"),
+ 2 => ['pipe', 'w'],
);
$handle = proc_open($cmd, $descriptorspec, $pipes, $doc_root, null, array("suppress_errors" => true));
- // note: here we check the process is running
- for ($i=0; $i < 120; $i++) {
+ // First, wait for the dev server to declare itself ready.
+ $bound = null;
+ stream_set_blocking($pipes[2], false);
+ for ($i = 0; $i < 60; $i++) {
+ usleep(50000); // 50ms per try
$status = proc_get_status($handle);
+ if (empty($status['running'])) {
+ echo "Server is not running\n";
+ proc_terminate($handle);
+ exit(1);
+ }
- if (!$status || !$status['running']) {
- if ($status &&
- ($status['running'] == false && $status['exitcode'] != 0)) {
- $error =
- "Server could not be started\n";
- break;
+ while (($line = fgets($pipes[2])) !== false) {
+ if (preg_match('@PHP \S* Development Server \(https?://(.*?:\d+)\) started@', $line, $matches)) {
+ $bound = $matches[1];
+ // Now that we've identified the listen address, close STDERR.
+ // Otherwise the pipe may clog up with unread log messages.
+ fclose($pipes[2]);
+ break 2;
}
-
- usleep(50000); // 50ms per try
- continue;
}
+ }
+ if ($bound === null) {
+ echo "Server did not output startup message";
+ proc_terminate($handle);
+ exit(1);
+ }
- if ($status['signaled']) {
- $error =
- "Server was terminated with {$status['termsig']}\n";
+ // Now wait for a connection to succeed.
+ // note: even when server prints 'Listening on localhost:8964...Press Ctrl-C to quit.'
+ // it might not be listening yet...need to wait until fsockopen() call returns
+ $error = "Unable to connect to server\n";
+ for ($i=0; $i < 60; $i++) {
+ usleep(50000); // 50ms per try
+ $status = proc_get_status($handle);
+ $fp = @fsockopen("tcp://$bound");
+ // Failure, the server is no longer running
+ if (!($status && $status['running'])) {
+ $error = "Server is not running\n";
break;
}
-
- if ($status['stopped']) {
- $error =
- "Server was stopped with {$status['stopsig']}\n";
+ // Success, Connected to servers
+ if ($fp) {
+ $error = '';
break;
}
-
- // note: here we check the server is listening, even when the server prints
- // listening on %s:%d
- // it may not be ready to accept connections
- $start = time();
-
- for ($try = 0; $try < 120; $try++) {
- $error = @fsockopen(
- PHP_CLI_SERVER_HOSTNAME, PHP_CLI_SERVER_PORT) ?
- null :
- sprintf(
- "Server is not accepting connections after %d seconds\n",
- time() - $start);
-
- if (!$error) {
- break 2;
- }
-
- usleep(50000);
- }
-
- break;
}
-php_cli_server_start_error:
if ($error) {
echo $error;
proc_terminate($handle);
@@ -87,14 +90,21 @@ php_cli_server_start_error:
}
register_shutdown_function(
- function($handle) use($router) {
+ function($handle) use($router, $doc_root) {
proc_terminate($handle);
@unlink(__DIR__ . "/{$router}");
+ @rmdir($doc_root);
},
$handle
);
- return $handle;
+ // Define the same "constants" we previously did.
+ $port = (int) substr($bound, strrpos($bound, ':') + 1);
+ define("PHP_CLI_SERVER_HOSTNAME", "localhost");
+ define("PHP_CLI_SERVER_PORT", $port);
+ define("PHP_CLI_SERVER_ADDRESS", PHP_CLI_SERVER_HOSTNAME.":".PHP_CLI_SERVER_PORT);
+
+ return new CliServerInfo($doc_root);
}
function php_cli_server_connect() {
diff --git a/sapi/cli/tests/php_cli_server_002.phpt b/sapi/cli/tests/php_cli_server_002.phpt
index e1fbd90398..2daf6aad73 100644
--- a/sapi/cli/tests/php_cli_server_002.phpt
+++ b/sapi/cli/tests/php_cli_server_002.phpt
@@ -13,8 +13,8 @@ php_cli_server_start('var_dump($_SERVER["DOCUMENT_ROOT"], $_SERVER["SERVER_SOFTW
var_dump(file_get_contents("http://" . PHP_CLI_SERVER_ADDRESS));
?>
--EXPECTF--
-string(%d) "string(%d) "%stests"
+string(%d) "string(%d) "%sphp_cli_server_002"
string(%d) "PHP %s Development Server"
string(%d) "localhost"
-string(%d) "8964"
+string(%d) "%s"
"
diff --git a/sapi/cli/tests/php_cli_server_012.phpt b/sapi/cli/tests/php_cli_server_012.phpt
index 6262aa2c73..9824c63c40 100644
--- a/sapi/cli/tests/php_cli_server_012.phpt
+++ b/sapi/cli/tests/php_cli_server_012.phpt
@@ -7,8 +7,8 @@ include "skipif.inc";
--FILE--
<?php
include "php_cli_server.inc";
-php_cli_server_start('print_r($_REQUEST); $_REQUEST["foo"] = "bar"; return FALSE;');
-$doc_root = __DIR__;
+$info = php_cli_server_start('print_r($_REQUEST); $_REQUEST["foo"] = "bar"; return FALSE;');
+$doc_root = $info->docRoot;
file_put_contents($doc_root . '/request.php', '<?php print_r($_REQUEST); ?>');
$host = PHP_CLI_SERVER_HOSTNAME;
diff --git a/sapi/cli/tests/php_cli_server_015.phpt b/sapi/cli/tests/php_cli_server_015.phpt
index af48758306..5821fdbbc2 100644
--- a/sapi/cli/tests/php_cli_server_015.phpt
+++ b/sapi/cli/tests/php_cli_server_015.phpt
@@ -9,10 +9,9 @@ display_errors=1
--FILE--
<?php
include "php_cli_server.inc";
-php_cli_server_start('require("syntax_error.php");');
-$dir = realpath(__DIR__);
+$doc_root = php_cli_server_start('require("syntax_error.php");')->docRoot;
-file_put_contents($dir . "/syntax_error.php", "<?php non_exists_function(); ?>");
+file_put_contents($doc_root . "/syntax_error.php", "<?php non_exists_function(); ?>");
$output = '';
$host = PHP_CLI_SERVER_HOSTNAME;
@@ -30,7 +29,7 @@ HEADER
}
}
echo $output;
-@unlink($dir . "/syntax_error.php");
+@unlink($doc_root . "/syntax_error.php");
fclose($fp);
?>
--EXPECTF--
diff --git a/sapi/fpm/fpm/fpm_env.c b/sapi/fpm/fpm/fpm_env.c
index 9931ab480c..a9227f8c7d 100644
--- a/sapi/fpm/fpm/fpm_env.c
+++ b/sapi/fpm/fpm/fpm_env.c
@@ -13,7 +13,7 @@
#include "fpm.h"
#ifndef HAVE_SETPROCTITLE
-#ifdef __linux__
+#if defined(__linux__) || defined(__APPLE__)
static char **fpm_env_argv = NULL;
static size_t fpm_env_argv_len = 0;
#endif
@@ -122,16 +122,15 @@ void fpm_env_setproctitle(char *title) /* {{{ */
setproctitle_fast("%s", title);
#elif defined(HAVE_SETPROCTITLE)
setproctitle("%s", title);
-#else
-#ifdef __linux__
- if (fpm_env_argv != NULL && fpm_env_argv_len > strlen(SETPROCTITLE_PREFIX) + 3) {
+#elif defined(__linux__) || defined(__APPLE__)
+ size_t prefixlen = strlen(SETPROCTITLE_PREFIX);
+ if (fpm_env_argv != NULL && fpm_env_argv_len > prefixlen + 3) {
memset(fpm_env_argv[0], 0, fpm_env_argv_len);
strncpy(fpm_env_argv[0], SETPROCTITLE_PREFIX, fpm_env_argv_len - 2);
- strncpy(fpm_env_argv[0] + strlen(SETPROCTITLE_PREFIX), title, fpm_env_argv_len - strlen(SETPROCTITLE_PREFIX) - 2);
+ strncpy(fpm_env_argv[0] + prefixlen, title, fpm_env_argv_len - prefixlen - 2);
fpm_env_argv[1] = NULL;
}
#endif
-#endif
}
/* }}} */
@@ -207,7 +206,7 @@ int fpm_env_init_main() /* {{{ */
}
}
#ifndef HAVE_SETPROCTITLE
-#ifdef __linux__
+#if defined(__linux__) || defined(__APPLE__)
int i;
char *first = NULL;
char *last = NULL;
diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c
index c849a35980..ad05f865eb 100644
--- a/sapi/fpm/fpm/fpm_main.c
+++ b/sapi/fpm/fpm/fpm_main.c
@@ -142,12 +142,12 @@ static const opt_struct OPTIONS[] = {
};
typedef struct _php_cgi_globals_struct {
- zend_bool rfc2616_headers;
- zend_bool nph;
- zend_bool fix_pathinfo;
- zend_bool force_redirect;
- zend_bool discard_path;
- zend_bool fcgi_logging;
+ bool rfc2616_headers;
+ bool nph;
+ bool fix_pathinfo;
+ bool force_redirect;
+ bool discard_path;
+ bool fcgi_logging;
char *redirect_status_env;
HashTable user_config_cache;
char *error_header;
@@ -309,7 +309,7 @@ static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers) /* {{{ */
char buf[SAPI_CGI_MAX_HEADER_LENGTH];
sapi_header_struct *h;
zend_llist_position pos;
- zend_bool ignore_status = 0;
+ bool ignore_status = 0;
int response_status = SG(sapi_headers).http_response_code;
if (SG(request_info).no_headers == 1) {
@@ -319,7 +319,7 @@ static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers) /* {{{ */
if (CGIG(nph) || SG(sapi_headers).http_response_code != 200)
{
int len;
- zend_bool has_status = 0;
+ bool has_status = 0;
if (CGIG(rfc2616_headers) && SG(sapi_headers).http_status_line) {
char *s;
@@ -1533,7 +1533,7 @@ int main(int argc, char *argv[])
int php_allow_to_run_as_root = 0;
int ret;
#if ZEND_RC_DEBUG
- zend_bool old_rc_debug;
+ bool old_rc_debug;
#endif
#if defined(SIGPIPE) && defined(SIG_IGN)
diff --git a/sapi/fpm/fpm/fpm_main.stub.php b/sapi/fpm/fpm/fpm_main.stub.php
index 5d1883c6dd..70cd275223 100644
--- a/sapi/fpm/fpm/fpm_main.stub.php
+++ b/sapi/fpm/fpm/fpm_main.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function fastcgi_finish_request(): bool {}
diff --git a/sapi/fpm/fpm/fpm_main_arginfo.h b/sapi/fpm/fpm/fpm_main_arginfo.h
index 709ee60df2..97ec6c4e8d 100644
--- a/sapi/fpm/fpm/fpm_main_arginfo.h
+++ b/sapi/fpm/fpm/fpm_main_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 0888f3ba14649f0be06d47410221381bace54936 */
+ * Stub hash: b4ac4c0f1d91c354293e21185a2e6d9f99cc9fcc */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_fastcgi_finish_request, 0, 0, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
diff --git a/sapi/fpm/fpm/fpm_status.c b/sapi/fpm/fpm/fpm_status.c
index ecce6e32c4..6ba42f43dd 100644
--- a/sapi/fpm/fpm/fpm_status.c
+++ b/sapi/fpm/fpm/fpm_status.c
@@ -140,7 +140,7 @@ int fpm_status_handle_request(void) /* {{{ */
struct fpm_scoreboard_proc_s proc;
char *buffer, *time_format, time_buffer[64];
time_t now_epoch;
- int full, encode;
+ int full, encode, is_start_time_str;
char *short_syntax, *short_post;
char *full_pre, *full_syntax, *full_post, *full_separator;
zend_string *_GET_str;
@@ -223,6 +223,7 @@ int fpm_status_handle_request(void) /* {{{ */
short_syntax = short_post = NULL;
full_separator = full_pre = full_syntax = full_post = NULL;
encode = 0;
+ is_start_time_str = 1;
/* HTML */
if (fpm_php_get_string_from_table(_GET_str, "html")) {
@@ -388,6 +389,62 @@ int fpm_status_handle_request(void) /* {{{ */
full_post = "]}";
}
+ /* OpenMetrics */
+ } else if (fpm_php_get_string_from_table(_GET_str, "openmetrics")) {
+ sapi_add_header_ex(ZEND_STRL("Content-Type: application/openmetrics-text; version=1.0.0; charset=utf-8"), 1, 1);
+ time_format = "%s";
+
+ short_syntax =
+ "# HELP phpfpm_up Could pool %s using a %s PM on PHP-FPM be reached?\n"
+ "# TYPE phpfpm_up gauge\n"
+ "phpfpm_up 1\n"
+ "# HELP phpfpm_start_time When FPM has started.\n"
+ "# TYPE phpfpm_start_time gauge\n"
+ "phpfpm_start_time %lld\n"
+ "# HELP phpfpm_start_since_total The number of seconds since FPM has started.\n"
+ "# TYPE phpfpm_start_since_total counter\n"
+ "phpfpm_start_since_total %lu\n"
+ "# HELP phpfpm_accepted_connections_total The number of requests accepted by the pool.\n"
+ "# TYPE phpfpm_accepted_connections_total counter\n"
+ "phpfpm_accepted_connections_total %lu\n"
+ "# HELP phpfpm_listen_queue The number of requests in the queue of pending connections.\n"
+ "# TYPE phpfpm_listen_queue gauge\n"
+ "phpfpm_listen_queue %d\n"
+ "# HELP phpfpm_max_listen_queue_total The maximum number of requests in the queue of pending connections since FPM has started.\n"
+ "# TYPE phpfpm_max_listen_queue_total counter\n"
+ "phpfpm_max_listen_queue_total %d\n"
+ "# TYPE phpfpm_listen_queue_length gauge\n"
+ "# HELP phpfpm_listen_queue_length The size of the socket queue of pending connections.\n"
+ "phpfpm_listen_queue_length %u\n"
+ "# HELP phpfpm_idle_processes The number of idle processes.\n"
+ "# TYPE phpfpm_idle_processes gauge\n"
+ "phpfpm_idle_processes %d\n"
+ "# HELP phpfpm_active_processes The number of active processes.\n"
+ "# TYPE phpfpm_active_processes gauge\n"
+ "phpfpm_active_processes %d\n"
+ "# HELP phpfpm_total_processes The number of idle + active processes.\n"
+ "# TYPE phpfpm_total_processes gauge\n"
+ "phpfpm_total_processes %d\n"
+ "# HELP phpfpm_max_active_processes_total The maximum number of active processes since FPM has started.\n"
+ "# TYPE phpfpm_max_active_processes_total counter\n"
+ "phpfpm_max_active_processes_total %d\n"
+ "# HELP phpfpm_max_children_reached_total The number of times, the process limit has been reached, when pm tries to start more children (works only for pm 'dynamic' and 'ondemand').\n"
+ "# TYPE phpfpm_max_children_reached_total counter\n"
+ "phpfpm_max_children_reached_total %u\n"
+ "# HELP phpfpm_slow_requests_total The number of requests that exceeded your 'request_slowlog_timeout' value.\n"
+ "# TYPE phpfpm_slow_requests_total counter\n"
+ "phpfpm_slow_requests_total %lu\n";
+
+ is_start_time_str = 0;
+ if (!full) {
+ short_post = "";
+ } else {
+ full_separator = "";
+ full_pre = "";
+ full_syntax = "";
+ full_post = "";
+ }
+
/* TEXT */
} else {
sapi_add_header_ex(ZEND_STRL("Content-Type: text/plain"), 1, 1);
@@ -429,23 +486,41 @@ int fpm_status_handle_request(void) /* {{{ */
}
}
- strftime(time_buffer, sizeof(time_buffer) - 1, time_format, localtime(&scoreboard.start_epoch));
now_epoch = time(NULL);
- spprintf(&buffer, 0, short_syntax,
- scoreboard.pool,
- PM2STR(scoreboard.pm),
- time_buffer,
- (unsigned long) (now_epoch - scoreboard.start_epoch),
- scoreboard.requests,
- scoreboard.lq,
- scoreboard.lq_max,
- scoreboard.lq_len,
- scoreboard.idle,
- scoreboard.active,
- scoreboard.idle + scoreboard.active,
- scoreboard.active_max,
- scoreboard.max_children_reached,
- scoreboard.slow_rq);
+ if (is_start_time_str) {
+ strftime(time_buffer, sizeof(time_buffer) - 1, time_format, localtime(&scoreboard.start_epoch));
+ spprintf(&buffer, 0, short_syntax,
+ scoreboard.pool,
+ PM2STR(scoreboard.pm),
+ time_buffer,
+ (unsigned long) (now_epoch - scoreboard.start_epoch),
+ scoreboard.requests,
+ scoreboard.lq,
+ scoreboard.lq_max,
+ scoreboard.lq_len,
+ scoreboard.idle,
+ scoreboard.active,
+ scoreboard.idle + scoreboard.active,
+ scoreboard.active_max,
+ scoreboard.max_children_reached,
+ scoreboard.slow_rq);
+ } else {
+ spprintf(&buffer, 0, short_syntax,
+ scoreboard.pool,
+ PM2STR(scoreboard.pm),
+ scoreboard.start_epoch,
+ (unsigned long) (now_epoch - scoreboard.start_epoch),
+ scoreboard.requests,
+ scoreboard.lq,
+ scoreboard.lq_max,
+ scoreboard.lq_len,
+ scoreboard.idle,
+ scoreboard.active,
+ scoreboard.idle + scoreboard.active,
+ scoreboard.active_max,
+ scoreboard.max_children_reached,
+ scoreboard.slow_rq);
+ }
PUTS(buffer);
efree(buffer);
diff --git a/sapi/fpm/fpm/fpm_stdio.c b/sapi/fpm/fpm/fpm_stdio.c
index 1742467b36..42ea159430 100644
--- a/sapi/fpm/fpm/fpm_stdio.c
+++ b/sapi/fpm/fpm/fpm_stdio.c
@@ -10,6 +10,7 @@
#include <errno.h>
#include "php_syslog.h"
+#include "php_network.h"
#include "fpm.h"
#include "fpm_children.h"
@@ -166,7 +167,7 @@ static void fpm_stdio_child_said(struct fpm_event_s *ev, short which, void *arg)
stdio_read:
in_buf = read(fd, buf, max_buf_size - 1);
if (in_buf <= 0) { /* no data */
- if (in_buf == 0 || (errno != EAGAIN && errno != EWOULDBLOCK)) {
+ if (in_buf == 0 || !PHP_IS_TRANSIENT_ERROR(errno)) {
/* pipe is closed or error */
read_fail = (in_buf < 0) ? in_buf : 1;
}
diff --git a/sapi/fpm/tests/status.inc b/sapi/fpm/tests/status.inc
index 39005de568..7706942b3d 100644
--- a/sapi/fpm/tests/status.inc
+++ b/sapi/fpm/tests/status.inc
@@ -10,10 +10,11 @@ class Status
* @var array
*/
private $contentTypes = [
- 'plain' => 'text/plain',
- 'html' => 'text/html',
- 'xml' => 'text/xml',
- 'json' => 'application/json',
+ 'plain' => 'text/plain',
+ 'html' => 'text/html',
+ 'xml' => 'text/xml',
+ 'json' => 'application/json',
+ 'openmetrics' => 'application/openmetrics-text; version=1.0.0; charset=utf-8',
];
/**
@@ -196,4 +197,61 @@ class Status
true
);
}
+
+ /**
+ * Check openmetrics status page.
+ *
+ * @param string $body
+ * @param array $fields
+ */
+ protected function checkStatusOpenmetrics(string $body, array $fields)
+ {
+ $pattern = "|# HELP phpfpm_up Could pool " . $fields['pool'] . " using a " . $fields['process manager'] . " PM on PHP-FPM be reached\?\n" .
+ "# TYPE phpfpm_up gauge\n" .
+ "phpfpm_up 1\n" .
+ "# HELP phpfpm_start_time When FPM has started\.\n" .
+ "# TYPE phpfpm_start_time gauge\n" .
+ "phpfpm_start_time \d+\n" .
+ "# HELP phpfpm_start_since_total The number of seconds since FPM has started\.\n" .
+ "# TYPE phpfpm_start_since_total counter\n" .
+ "phpfpm_start_since_total " . $fields['start since'] . "\n" .
+ "# HELP phpfpm_accepted_connections_total The number of requests accepted by the pool\.\n" .
+ "# TYPE phpfpm_accepted_connections_total counter\n" .
+ "phpfpm_accepted_connections_total " . $fields['accepted conn'] . "\n" .
+ "# HELP phpfpm_listen_queue The number of requests in the queue of pending connections\.\n" .
+ "# TYPE phpfpm_listen_queue gauge\n" .
+ "phpfpm_listen_queue " . $fields['listen queue'] . "\n" .
+ "# HELP phpfpm_max_listen_queue_total The maximum number of requests in the queue of pending connections since FPM has started\.\n" .
+ "# TYPE phpfpm_max_listen_queue_total counter\n" .
+ "phpfpm_max_listen_queue_total " . $fields['max listen queue'] . "\n" .
+ "# TYPE phpfpm_listen_queue_length gauge\n" .
+ "# HELP phpfpm_listen_queue_length The size of the socket queue of pending connections\.\n" .
+ "phpfpm_listen_queue_length " . $fields['listen queue len'] . "\n" .
+ "# HELP phpfpm_idle_processes The number of idle processes\.\n" .
+ "# TYPE phpfpm_idle_processes gauge\n" .
+ "phpfpm_idle_processes " . $fields['idle processes'] . "\n" .
+ "# HELP phpfpm_active_processes The number of active processes\.\n" .
+ "# TYPE phpfpm_active_processes gauge\n" .
+ "phpfpm_active_processes " . $fields['active processes'] . "\n" .
+ "# HELP phpfpm_total_processes The number of idle \+ active processes\.\n" .
+ "# TYPE phpfpm_total_processes gauge\n" .
+ "phpfpm_total_processes " . $fields['total processes'] . "\n" .
+ "# HELP phpfpm_max_active_processes_total The maximum number of active processes since FPM has started\.\n" .
+ "# TYPE phpfpm_max_active_processes_total counter\n" .
+ "phpfpm_max_active_processes_total " . $fields['max active processes'] . "\n" .
+ "# HELP phpfpm_max_children_reached_total The number of times, the process limit has been reached, when pm tries to start more children \(works only for pm 'dynamic' and 'ondemand'\)\.\n" .
+ "# TYPE phpfpm_max_children_reached_total counter\n" .
+ "phpfpm_max_children_reached_total " . $fields['max children reached'] . "\n" .
+ "# HELP phpfpm_slow_requests_total The number of requests that exceeded your 'request_slowlog_timeout' value\.\n" .
+ "# TYPE phpfpm_slow_requests_total counter\n" .
+ "phpfpm_slow_requests_total " . $fields['slow requests'] . "|";
+
+ if (!preg_match($pattern, $body)) {
+ echo "ERROR: Expected body does not match pattern\n";
+ echo "BODY:\n";
+ var_dump($body);
+ echo "PATTERN:\n";
+ var_dump($pattern);
+ }
+ }
}
diff --git a/sapi/fpm/tests/tester.inc b/sapi/fpm/tests/tester.inc
index 283ca2162c..7aab2d3aa9 100644
--- a/sapi/fpm/tests/tester.inc
+++ b/sapi/fpm/tests/tester.inc
@@ -506,7 +506,7 @@ class Tester
array $expectedFields,
string $address = null,
string $statusPath = '/status',
- $formats = ['plain', 'html', 'xml', 'json']
+ $formats = ['plain', 'html', 'xml', 'json', 'openmetrics']
) {
if (!is_array($formats)) {
$formats = [$formats];
diff --git a/sapi/fuzzer/fuzzer-sapi.c b/sapi/fuzzer/fuzzer-sapi.c
index fd429f503e..60665f62ab 100644
--- a/sapi/fuzzer/fuzzer-sapi.c
+++ b/sapi/fuzzer/fuzzer-sapi.c
@@ -230,7 +230,7 @@ int fuzzer_shutdown_php()
}
int fuzzer_do_request_from_buffer(
- char *filename, const char *data, size_t data_len, zend_bool execute)
+ char *filename, const char *data, size_t data_len, bool execute)
{
int retval = FAILURE; /* failure by default */
@@ -250,6 +250,7 @@ int fuzzer_do_request_from_buffer(
zend_first_try {
zend_file_handle file_handle;
zend_stream_init_filename(&file_handle, filename);
+ file_handle.primary_script = 1;
file_handle.buf = estrndup(data, data_len);
file_handle.len = data_len;
@@ -261,6 +262,7 @@ int fuzzer_do_request_from_buffer(
destroy_op_array(op_array);
efree(op_array);
}
+ zend_destroy_file_handle(&file_handle);
} zend_end_try();
CG(compiled_filename) = NULL; /* ??? */
diff --git a/sapi/fuzzer/fuzzer-sapi.h b/sapi/fuzzer/fuzzer-sapi.h
index 4eb050e357..15633c6d10 100644
--- a/sapi/fuzzer/fuzzer-sapi.h
+++ b/sapi/fuzzer/fuzzer-sapi.h
@@ -22,4 +22,4 @@ void fuzzer_setup_dummy_frame(void);
void fuzzer_call_php_func(const char *func_name, int nargs, char **params);
void fuzzer_call_php_func_zval(const char *func_name, int nargs, zval *args);
int fuzzer_do_request_from_buffer(
- char *filename, const char *data, size_t data_len, zend_bool execute);
+ char *filename, const char *data, size_t data_len, bool execute);
diff --git a/sapi/fuzzer/generate_unserializehash_corpus.php b/sapi/fuzzer/generate_unserializehash_corpus.php
index 04c6ea1428..c7c5925428 100644
--- a/sapi/fuzzer/generate_unserializehash_corpus.php
+++ b/sapi/fuzzer/generate_unserializehash_corpus.php
@@ -6,5 +6,11 @@ $corpusDir = __DIR__ . '/corpus/unserializehash';
foreach (hash_algos() as $algo) {
$ctx = hash_init($algo);
$algx = preg_replace('/[^-_a-zA-Z0-9]/', '_', $algo);
- file_put_contents($corpusDir . '/' . $algx, "x|" . serialize($ctx));
+ try {
+ $serialized = serialize($ctx);
+ } catch (Exception $e) {
+ echo "Hash algorithm $algo could not be serialized.\n";
+ continue;
+ }
+ file_put_contents($corpusDir . '/' . $algx, "x|" . $serialized);
}
diff --git a/sapi/litespeed/lsapi_main.c b/sapi/litespeed/lsapi_main.c
index d82e82556e..2ab2336aab 100644
--- a/sapi/litespeed/lsapi_main.c
+++ b/sapi/litespeed/lsapi_main.c
@@ -367,7 +367,7 @@ static int sapi_lsapi_send_headers_like_cgi(sapi_headers_struct *sapi_headers)
char buf[SAPI_LSAPI_MAX_HEADER_LENGTH];
sapi_header_struct *h;
zend_llist_position pos;
- zend_bool ignore_status = 0;
+ bool ignore_status = 0;
int response_status = SG(sapi_headers).http_response_code;
if (SG(request_info).no_headers == 1) {
@@ -378,7 +378,7 @@ static int sapi_lsapi_send_headers_like_cgi(sapi_headers_struct *sapi_headers)
if (SG(sapi_headers).http_response_code != 200)
{
int len;
- zend_bool has_status = 0;
+ bool has_status = 0;
char *s;
@@ -643,11 +643,13 @@ static void init_request_info( void )
php_handle_auth_data(pAuth);
}
-static int lsapi_execute_script( zend_file_handle * file_handle)
+static int lsapi_execute_script(void)
{
+ zend_file_handle file_handle;
char *p;
int len;
- zend_stream_init_filename(file_handle, SG(request_info).path_translated);
+ zend_stream_init_filename(&file_handle, SG(request_info).path_translated);
+ file_handle->primary_script = 1;
p = argv0;
*p++ = ':';
@@ -658,7 +660,8 @@ static int lsapi_execute_script( zend_file_handle * file_handle)
len = 0;
memccpy( p, SG(request_info).path_translated + len, 0, 46 );
- php_execute_script(file_handle);
+ php_execute_script(&file_handle);
+ zend_destroy_file_handle(&file_handle);
return 0;
}
@@ -740,8 +743,6 @@ static int lsapi_module_main(int show_source)
{
struct sigaction act;
int sa_rc;
- zend_file_handle file_handle;
- memset(&file_handle, 0, sizeof(file_handle));
if (php_request_startup() == FAILURE ) {
return -1;
}
@@ -767,7 +768,7 @@ static int lsapi_module_main(int show_source)
php_get_highlight_struct(&syntax_highlighter_ini);
highlight_file(SG(request_info).path_translated, &syntax_highlighter_ini);
} else {
- lsapi_execute_script( &file_handle);
+ lsapi_execute_script();
}
zend_try {
php_request_shutdown(NULL);
@@ -1308,8 +1309,9 @@ static int cli_main( int argc, char * argv[] )
}
if ( ret == -1 ) {
if ( *p ) {
- zend_file_handle file_handle;
+ zend_file_handle file_handle;
zend_stream_init_fp(&file_handle, VCWD_FOPEN(*p, "rb"), NULL);
+ file_handle.primary_script = 1;
if ( file_handle.handle.fp ) {
script_filename = *p;
@@ -1329,8 +1331,7 @@ static int cli_main( int argc, char * argv[] )
php_get_highlight_struct(&syntax_highlighter_ini);
highlight_file(SG(request_info).path_translated, &syntax_highlighter_ini);
} else if (source_highlight == 2) {
- file_handle.filename = *p;
- file_handle.free_filename = 0;
+ file_handle.filename = zend_string_init(*p, strlen(*p), 0);
file_handle.opened_path = NULL;
ret = php_lint_script(&file_handle);
if (ret==SUCCESS) {
@@ -1340,8 +1341,7 @@ static int cli_main( int argc, char * argv[] )
}
} else {
- file_handle.filename = *p;
- file_handle.free_filename = 0;
+ file_handle.filename = zend_string_init(*p, strlen(*p), 0);
file_handle.opened_path = NULL;
php_execute_script(&file_handle);
diff --git a/sapi/litespeed/lsapi_main.stub.php b/sapi/litespeed/lsapi_main.stub.php
index 396cb86385..46f0cdf967 100644
--- a/sapi/litespeed/lsapi_main.stub.php
+++ b/sapi/litespeed/lsapi_main.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function litespeed_request_headers(): array {}
diff --git a/sapi/litespeed/lsapi_main_arginfo.h b/sapi/litespeed/lsapi_main_arginfo.h
index 2b7e862435..3db49d9473 100644
--- a/sapi/litespeed/lsapi_main_arginfo.h
+++ b/sapi/litespeed/lsapi_main_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 6b6b8e58c728236218c31addc4d855e87d645178 */
+ * Stub hash: 3419f4e77bd091e09e0cfc55d81f443d5a3396ff */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_litespeed_request_headers, 0, 0, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c
index efd2270601..933f5b423e 100644
--- a/sapi/phpdbg/phpdbg.c
+++ b/sapi/phpdbg/phpdbg.c
@@ -74,9 +74,9 @@ PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("phpdbg.eol", "2", PHP_INI_ALL, OnUpdateEol, eol, zend_phpdbg_globals, phpdbg_globals)
PHP_INI_END()
-static zend_bool phpdbg_booted = 0;
-static zend_bool phpdbg_fully_started = 0;
-zend_bool use_mm_wrappers = 1;
+static bool phpdbg_booted = 0;
+static bool phpdbg_fully_started = 0;
+bool use_mm_wrappers = 1;
static void php_phpdbg_destroy_bp_file(zval *brake) /* {{{ */
{
@@ -312,7 +312,7 @@ PHP_FUNCTION(phpdbg_exec)
{
zend_stat_t sb;
- zend_bool result = 1;
+ bool result = 1;
if (VCWD_STAT(ZSTR_VAL(exec), &sb) != FAILURE) {
if (sb.st_mode & (S_IFREG|S_IFLNK)) {
@@ -476,7 +476,7 @@ PHP_FUNCTION(phpdbg_start_oplog)
PHPDBG_G(oplog_cur)->next = NULL;
}
-static zend_always_inline zend_bool phpdbg_is_ignored_opcode(zend_uchar opcode) {
+static zend_always_inline bool phpdbg_is_ignored_opcode(zend_uchar opcode) {
return
opcode == ZEND_NOP || opcode == ZEND_OP_DATA || opcode == ZEND_FE_FREE || opcode == ZEND_FREE || opcode == ZEND_ASSERT_CHECK || opcode == ZEND_VERIFY_RETURN_TYPE
|| opcode == ZEND_DECLARE_CONST || opcode == ZEND_DECLARE_CLASS || opcode == ZEND_DECLARE_FUNCTION
@@ -487,7 +487,7 @@ static zend_always_inline zend_bool phpdbg_is_ignored_opcode(zend_uchar opcode)
;
}
-static void phpdbg_oplog_fill_executable(zend_op_array *op_array, HashTable *insert_ht, zend_bool by_opcode) {
+static void phpdbg_oplog_fill_executable(zend_op_array *op_array, HashTable *insert_ht, bool by_opcode) {
/* ignore RECV_* opcodes */
zend_op *cur = op_array->opcodes + op_array->num_args + !!(op_array->fn_flags & ZEND_ACC_VARIADIC);
zend_op *end = op_array->opcodes + op_array->last;
@@ -538,8 +538,8 @@ PHP_FUNCTION(phpdbg_get_executable)
{
HashTable *options = NULL;
zval *option_buffer;
- zend_bool by_function = 0;
- zend_bool by_opcode = 0;
+ bool by_function = 0;
+ bool by_opcode = 0;
HashTable *insert_ht;
zend_function *func;
@@ -639,8 +639,8 @@ PHP_FUNCTION(phpdbg_end_oplog)
HashTable *options = NULL;
zval *option_buffer;
- zend_bool by_function = 0;
- zend_bool by_opcode = 0;
+ bool by_function = 0;
+ bool by_opcode = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|H", &options) == FAILURE) {
RETURN_THROWS();
@@ -1056,7 +1056,7 @@ const char phpdbg_ini_hardcoded[] =
"error_log=\n"
"output_buffering=off\n\0";
-static void phpdbg_welcome(zend_bool cleaning) /* {{{ */
+static void phpdbg_welcome(bool cleaning) /* {{{ */
{
/* print blurb */
if (!cleaning) {
@@ -1300,21 +1300,21 @@ int main(int argc, char **argv) /* {{{ */
int ini_entries_len;
char **zend_extensions = NULL;
zend_ulong zend_extensions_len = 0L;
- zend_bool ini_ignore;
+ bool ini_ignore;
char *ini_override;
char *exec = NULL;
char *first_command = NULL;
char *init_file;
size_t init_file_len;
- zend_bool init_file_default;
+ bool init_file_default;
char *oplog_file;
size_t oplog_file_len;
uint64_t flags;
char *php_optarg;
int php_optind, opt, show_banner = 1;
long cleaning = -1;
- volatile zend_bool quit_immediately = 0; /* somehow some gcc release builds will play a bit around with order in combination with setjmp..., hence volatile */
- zend_bool remote = 0;
+ volatile bool quit_immediately = 0; /* somehow some gcc release builds will play a bit around with order in combination with setjmp..., hence volatile */
+ bool remote = 0;
zend_phpdbg_globals *settings = NULL;
char *bp_tmp = NULL;
char *address;
@@ -1323,12 +1323,12 @@ int main(int argc, char **argv) /* {{{ */
int socket = -1;
FILE* stream = NULL;
char *print_opline_func;
- zend_bool ext_stmt = 0;
- zend_bool is_exit;
+ bool ext_stmt = 0;
+ bool is_exit;
int exit_status;
char *read_from_stdin = NULL;
zend_string *backup_phpdbg_compile = NULL;
- zend_bool show_help = 0, show_version = 0;
+ bool show_help = 0, show_version = 0;
void* (*_malloc)(size_t);
void (*_free)(void*);
void* (*_realloc)(void*, size_t);
diff --git a/sapi/phpdbg/phpdbg.h b/sapi/phpdbg/phpdbg.h
index e5db725336..4dcfc3d195 100644
--- a/sapi/phpdbg/phpdbg.h
+++ b/sapi/phpdbg/phpdbg.h
@@ -260,7 +260,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
HashTable watch_free; /* pointers to watch for being freed */
HashTable *watchlist_mem; /* triggered watchpoints */
HashTable *watchlist_mem_backup; /* triggered watchpoints backup table while iterating over it */
- zend_bool watchpoint_hit; /* a watchpoint was hit */
+ bool watchpoint_hit; /* a watchpoint was hit */
void (*original_free_function)(void *); /* the original AG(mm_heap)->_free function */
phpdbg_watch_element *watch_tmp; /* temporary pointer for a watch element */
@@ -270,8 +270,8 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
zval retval; /* return value */
int bp_count; /* breakpoint count */
int vmret; /* return from last opcode handler execution */
- zend_bool in_execution; /* in execution? */
- zend_bool unclean_eval; /* do not check for memory leaks when we needed to bail out during eval */
+ bool in_execution; /* in execution? */
+ bool unclean_eval; /* do not check for memory leaks when we needed to bail out during eval */
zend_op_array *(*compile_file)(zend_file_handle *file_handle, int type);
zend_op_array *(*init_compile_file)(zend_file_handle *file_handle, int type);
@@ -291,7 +291,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
ssize_t (*php_stdiop_write)(php_stream *, const char *, size_t);
int in_script_xml; /* in <stream> output mode */
struct {
- zend_bool active;
+ bool active;
int type;
int fd;
char *tag;
@@ -305,7 +305,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
char *prompt[2]; /* prompt */
const phpdbg_color_t *colors[PHPDBG_COLORS]; /* colors */
char *buffer; /* buffer */
- zend_bool last_was_newline; /* check if we don't need to output a newline upon next phpdbg_error or phpdbg_notice */
+ bool last_was_newline; /* check if we don't need to output a newline upon next phpdbg_error or phpdbg_notice */
FILE *stdin_file; /* FILE pointer to stdin source file */
const php_stream_wrapper *orig_url_wrap_php;
diff --git a/sapi/phpdbg/phpdbg.stub.php b/sapi/phpdbg/phpdbg.stub.php
index 4d733ccaf6..40a51d892a 100644
--- a/sapi/phpdbg/phpdbg.stub.php
+++ b/sapi/phpdbg/phpdbg.stub.php
@@ -1,6 +1,6 @@
<?php
-/** @generate-function-entries */
+/** @generate-class-entries */
function phpdbg_break_next(): void {}
diff --git a/sapi/phpdbg/phpdbg_arginfo.h b/sapi/phpdbg/phpdbg_arginfo.h
index a4ee52d814..043f667459 100644
--- a/sapi/phpdbg/phpdbg_arginfo.h
+++ b/sapi/phpdbg/phpdbg_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 3fd1a8c30695df2089655b1785905381734ac1c1 */
+ * Stub hash: dc2e5420ea396c6235429c9606875ad2332811cb */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_phpdbg_break_next, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO()
diff --git a/sapi/phpdbg/phpdbg_bp.c b/sapi/phpdbg/phpdbg_bp.c
index db3d1cf0c4..f026bfbcdd 100644
--- a/sapi/phpdbg/phpdbg_bp.c
+++ b/sapi/phpdbg/phpdbg_bp.c
@@ -259,7 +259,7 @@ PHPDBG_API void phpdbg_set_breakpoint_file(const char *path, size_t path_len, lo
php_stream_statbuf ssb;
char realpath[MAXPATHLEN];
const char *original_path = path;
- zend_bool pending = 0;
+ bool pending = 0;
zend_string *path_str;
HashTable *broken, *file_breaks = &PHPDBG_G(bp)[PHPDBG_BREAK_FILE];
@@ -1019,7 +1019,7 @@ static inline phpdbg_breakbase_t *phpdbg_find_breakpoint_opcode(zend_uchar opcod
return zend_hash_index_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_OPCODE], zend_hash_func(opname, strlen(opname)));
} /* }}} */
-static inline zend_bool phpdbg_find_breakpoint_param(phpdbg_param_t *param, zend_execute_data *execute_data) /* {{{ */
+static inline bool phpdbg_find_breakpoint_param(phpdbg_param_t *param, zend_execute_data *execute_data) /* {{{ */
{
zend_function *function = execute_data->func;
@@ -1269,7 +1269,7 @@ PHPDBG_API void phpdbg_clear_breakpoints(void) /* {{{ */
PHPDBG_G(bp_count) = 0;
} /* }}} */
-PHPDBG_API void phpdbg_hit_breakpoint(phpdbg_breakbase_t *brake, zend_bool output) /* {{{ */
+PHPDBG_API void phpdbg_hit_breakpoint(phpdbg_breakbase_t *brake, bool output) /* {{{ */
{
brake->hits++;
diff --git a/sapi/phpdbg/phpdbg_bp.h b/sapi/phpdbg/phpdbg_bp.h
index 87c5388c94..374ee8e711 100644
--- a/sapi/phpdbg/phpdbg_bp.h
+++ b/sapi/phpdbg/phpdbg_bp.h
@@ -41,7 +41,7 @@ typedef struct _zend_op *phpdbg_opline_ptr_t; /* }}} */
int id; \
zend_uchar type; \
zend_ulong hits; \
- zend_bool disabled; \
+ bool disabled; \
const char *name /* }}} */
/* {{{ breakpoint base */
@@ -109,7 +109,7 @@ typedef struct _phpdbg_breakop_t {
typedef struct _phpdbg_breakcond_t {
phpdbg_breakbase(code);
size_t code_len;
- zend_bool paramed;
+ bool paramed;
phpdbg_param_t param;
zend_ulong hash;
zend_op_array *ops;
@@ -139,7 +139,7 @@ PHPDBG_API void phpdbg_set_breakpoint_at(const phpdbg_param_t *param); /* }}} */
PHPDBG_API phpdbg_breakbase_t* phpdbg_find_breakpoint(zend_execute_data*); /* }}} */
/* {{{ Misc Breakpoint API */
-PHPDBG_API void phpdbg_hit_breakpoint(phpdbg_breakbase_t* brake, zend_bool output);
+PHPDBG_API void phpdbg_hit_breakpoint(phpdbg_breakbase_t* brake, bool output);
PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type);
PHPDBG_API void phpdbg_print_breakpoint(phpdbg_breakbase_t* brake);
PHPDBG_API void phpdbg_reset_breakpoints(void);
diff --git a/sapi/phpdbg/phpdbg_btree.c b/sapi/phpdbg/phpdbg_btree.c
index 4bd9787556..4b039e3e08 100644
--- a/sapi/phpdbg/phpdbg_btree.c
+++ b/sapi/phpdbg/phpdbg_btree.c
@@ -224,10 +224,10 @@ check_branch_existence:
return SUCCESS;
}
-void phpdbg_btree_clean_recursive(phpdbg_btree_branch *branch, zend_ulong depth, zend_bool persistent) {
+void phpdbg_btree_clean_recursive(phpdbg_btree_branch *branch, zend_ulong depth, bool persistent) {
phpdbg_btree_branch *start = branch;
while (depth--) {
- zend_bool use_branch = branch + 1 == branch->branches[0];
+ bool use_branch = branch + 1 == branch->branches[0];
if (branch->branches[use_branch]) {
phpdbg_btree_clean_recursive(branch->branches[use_branch], depth, persistent);
}
diff --git a/sapi/phpdbg/phpdbg_btree.h b/sapi/phpdbg/phpdbg_btree.h
index bb0a4ef3fb..54bc42a079 100644
--- a/sapi/phpdbg/phpdbg_btree.h
+++ b/sapi/phpdbg/phpdbg_btree.h
@@ -35,7 +35,7 @@ union _phpdbg_btree_branch {
typedef struct {
zend_ulong count;
zend_ulong depth;
- zend_bool persistent;
+ bool persistent;
phpdbg_btree_branch *branch;
} phpdbg_btree;
diff --git a/sapi/phpdbg/phpdbg_cmd.c b/sapi/phpdbg/phpdbg_cmd.c
index 757d48e739..c462c14025 100644
--- a/sapi/phpdbg/phpdbg_cmd.c
+++ b/sapi/phpdbg/phpdbg_cmd.c
@@ -244,7 +244,7 @@ PHPDBG_API zend_ulong phpdbg_hash_param(const phpdbg_param_t *param) /* {{{ */
return hash;
} /* }}} */
-PHPDBG_API zend_bool phpdbg_match_param(const phpdbg_param_t *l, const phpdbg_param_t *r) /* {{{ */
+PHPDBG_API bool phpdbg_match_param(const phpdbg_param_t *l, const phpdbg_param_t *r) /* {{{ */
{
if (l && r) {
if (l->type == r->type) {
@@ -471,7 +471,7 @@ PHPDBG_API int phpdbg_stack_verify(const phpdbg_command_t *command, phpdbg_param
size_t least = 0L,
received = 0L,
current = 0L;
- zend_bool optional = 0;
+ bool optional = 0;
/* check for arg spec */
if (!(arg) || !(*arg)) {
@@ -659,7 +659,7 @@ PHPDBG_API const phpdbg_command_t *phpdbg_stack_resolve(const phpdbg_command_t *
return NULL;
} /* }}} */
-static int phpdbg_internal_stack_execute(phpdbg_param_t *stack, zend_bool allow_async_unsafe) {
+static int phpdbg_internal_stack_execute(phpdbg_param_t *stack, bool allow_async_unsafe) {
const phpdbg_command_t *handler = NULL;
phpdbg_param_t *top = (phpdbg_param_t *) stack->next;
@@ -712,7 +712,7 @@ static int phpdbg_internal_stack_execute(phpdbg_param_t *stack, zend_bool allow_
} /* }}} */
/* {{{ */
-PHPDBG_API int phpdbg_stack_execute(phpdbg_param_t *stack, zend_bool allow_async_unsafe) {
+PHPDBG_API int phpdbg_stack_execute(phpdbg_param_t *stack, bool allow_async_unsafe) {
phpdbg_param_t *top = stack;
if (stack->type != STACK_PARAM) {
diff --git a/sapi/phpdbg/phpdbg_cmd.h b/sapi/phpdbg/phpdbg_cmd.h
index 3cc07d1a70..ec927424c6 100644
--- a/sapi/phpdbg/phpdbg_cmd.h
+++ b/sapi/phpdbg/phpdbg_cmd.h
@@ -96,7 +96,7 @@ struct _phpdbg_command_t {
const phpdbg_command_t *subs; /* Sub Commands */
char *args; /* Argument Spec */
const phpdbg_command_t *parent; /* Parent Command */
- zend_bool flags; /* General flags */
+ bool flags; /* General flags */
};
/* }}} */
@@ -136,7 +136,7 @@ PHPDBG_API void phpdbg_stack_push(phpdbg_param_t *stack, phpdbg_param_t *param);
PHPDBG_API void phpdbg_stack_separate(phpdbg_param_t *param);
PHPDBG_API const phpdbg_command_t *phpdbg_stack_resolve(const phpdbg_command_t *commands, const phpdbg_command_t *parent, phpdbg_param_t **top);
PHPDBG_API int phpdbg_stack_verify(const phpdbg_command_t *command, phpdbg_param_t **stack);
-PHPDBG_API int phpdbg_stack_execute(phpdbg_param_t *stack, zend_bool allow_async_unsafe);
+PHPDBG_API int phpdbg_stack_execute(phpdbg_param_t *stack, bool allow_async_unsafe);
PHPDBG_API void phpdbg_stack_free(phpdbg_param_t *stack);
/*
@@ -144,7 +144,7 @@ PHPDBG_API void phpdbg_stack_free(phpdbg_param_t *stack);
*/
PHPDBG_API void phpdbg_clear_param(phpdbg_param_t*);
PHPDBG_API void phpdbg_copy_param(const phpdbg_param_t*, phpdbg_param_t*);
-PHPDBG_API zend_bool phpdbg_match_param(const phpdbg_param_t *, const phpdbg_param_t *);
+PHPDBG_API bool phpdbg_match_param(const phpdbg_param_t *, const phpdbg_param_t *);
PHPDBG_API zend_ulong phpdbg_hash_param(const phpdbg_param_t *);
PHPDBG_API const char* phpdbg_get_param_type(const phpdbg_param_t*);
PHPDBG_API char* phpdbg_param_tostring(const phpdbg_param_t *param, char **pointer);
diff --git a/sapi/phpdbg/phpdbg_frame.c b/sapi/phpdbg/phpdbg_frame.c
index 453a0d74ba..0dbabce67a 100644
--- a/sapi/phpdbg/phpdbg_frame.c
+++ b/sapi/phpdbg/phpdbg_frame.c
@@ -200,7 +200,7 @@ static void phpdbg_dump_prototype(zval *tmp) /* {{{ */
if (args) {
const zend_function *func = NULL;
const zend_arg_info *arginfo = NULL;
- zend_bool is_variadic = 0;
+ bool is_variadic = 0;
int j = 0, m;
phpdbg_try_access {
diff --git a/sapi/phpdbg/phpdbg_help.c b/sapi/phpdbg/phpdbg_help.c
index e8a02de444..695774d906 100644
--- a/sapi/phpdbg/phpdbg_help.c
+++ b/sapi/phpdbg/phpdbg_help.c
@@ -27,7 +27,7 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg)
/* {{{ Commands Table */
#define PHPDBG_COMMAND_HELP_D(name, tip, alias, action) \
- {PHPDBG_STRL(#name), tip, sizeof(tip)-1, alias, action, &phpdbg_prompt_commands[16], 0, NULL, (zend_bool) 0}
+ {PHPDBG_STRL(#name), tip, sizeof(tip)-1, alias, action, &phpdbg_prompt_commands[16], 0, NULL, (bool) 0}
const phpdbg_command_t phpdbg_help_commands[] = {
PHPDBG_COMMAND_HELP_D(aliases, "show alias list", 'a', phpdbg_do_help_aliases),
diff --git a/sapi/phpdbg/phpdbg_info.c b/sapi/phpdbg/phpdbg_info.c
index 783681009e..b5dc4fa492 100644
--- a/sapi/phpdbg/phpdbg_info.c
+++ b/sapi/phpdbg/phpdbg_info.c
@@ -171,7 +171,7 @@ static int phpdbg_arm_auto_global(zval *ptrzv) {
return 0;
}
-static int phpdbg_print_symbols(zend_bool show_globals) {
+static int phpdbg_print_symbols(bool show_globals) {
HashTable vars;
zend_array *symtable;
zend_string *var;
@@ -304,7 +304,7 @@ PHPDBG_INFO(globals) /* {{{ */
PHPDBG_INFO(literal) /* {{{ */
{
/* literals are assumed to not be manipulated during executing of their op_array and as such async safe */
- zend_bool in_executor = PHPDBG_G(in_execution) && EG(current_execute_data) && EG(current_execute_data)->func;
+ bool in_executor = PHPDBG_G(in_execution) && EG(current_execute_data) && EG(current_execute_data)->func;
if (in_executor || PHPDBG_G(ops)) {
zend_op_array *ops = in_executor ? &EG(current_execute_data)->func->op_array : PHPDBG_G(ops);
int literal = 0, count = ops->last_literal - 1;
@@ -342,7 +342,7 @@ PHPDBG_INFO(memory) /* {{{ */
{
size_t used, real, peak_used, peak_real;
zend_mm_heap *orig_heap = NULL;
- zend_bool is_mm;
+ bool is_mm;
if (PHPDBG_G(flags) & PHPDBG_IN_SIGNAL_HANDLER) {
orig_heap = zend_mm_set_heap(phpdbg_original_heap_sigsafe_mem());
diff --git a/sapi/phpdbg/phpdbg_list.c b/sapi/phpdbg/phpdbg_list.c
index 0967e22f65..73f88d46a1 100644
--- a/sapi/phpdbg/phpdbg_list.c
+++ b/sapi/phpdbg/phpdbg_list.c
@@ -241,9 +241,9 @@ zend_op_array *phpdbg_compile_file(zend_file_handle *file, int type) {
* as it may invalidate the file handle. */
if (zend_stream_fixup(file, &bufptr, &len) == FAILURE) {
if (type == ZEND_REQUIRE) {
- zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file->filename);
+ zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, ZSTR_VAL(file->filename));
} else {
- zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file->filename);
+ zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, ZSTR_VAL(file->filename));
}
return NULL;
}
@@ -279,22 +279,19 @@ zend_op_array *phpdbg_compile_file(zend_file_handle *file, int type) {
}
zend_op_array *phpdbg_init_compile_file(zend_file_handle *file, int type) {
- char *filename = (char *)(file->opened_path ? ZSTR_VAL(file->opened_path) : file->filename);
+ zend_string *filename = file->opened_path ? file->opened_path : file->filename;
char resolved_path_buf[MAXPATHLEN];
zend_op_array *op_array;
phpdbg_file_source *dataptr;
- if (VCWD_REALPATH(filename, resolved_path_buf)) {
- filename = resolved_path_buf;
+ if (VCWD_REALPATH(ZSTR_VAL(filename), resolved_path_buf)) {
+ filename = zend_string_init(resolved_path_buf, strlen(resolved_path_buf), 0);
if (file->opened_path) {
zend_string_release(file->opened_path);
- file->opened_path = zend_string_init(filename, strlen(filename), 0);
+ file->opened_path = filename;
} else {
- if (file->free_filename) {
- efree((char *) file->filename);
- }
- file->free_filename = 0;
+ zend_string_release(file->filename);
file->filename = filename;
}
}
diff --git a/sapi/phpdbg/phpdbg_list.h b/sapi/phpdbg/phpdbg_list.h
index 38b4f6bbb6..a3962cd8d2 100644
--- a/sapi/phpdbg/phpdbg_list.h
+++ b/sapi/phpdbg/phpdbg_list.h
@@ -42,9 +42,6 @@ void phpdbg_list_update(void);
typedef struct {
char *buf;
size_t len;
-#if HAVE_MMAP
- void *map;
-#endif
zend_op_array op_array;
uint32_t lines;
uint32_t line[1];
diff --git a/sapi/phpdbg/phpdbg_opcode.c b/sapi/phpdbg/phpdbg_opcode.c
index 4c0c2fbf7a..8dd0c5209d 100644
--- a/sapi/phpdbg/phpdbg_opcode.c
+++ b/sapi/phpdbg/phpdbg_opcode.c
@@ -141,7 +141,7 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *opline) /*{{{ */
return result;
} /* }}} */
-void phpdbg_print_opline_ex(zend_execute_data *execute_data, zend_bool ignore_flags) /* {{{ */
+void phpdbg_print_opline_ex(zend_execute_data *execute_data, bool ignore_flags) /* {{{ */
{
/* force out a line while stepping so the user knows what is happening */
if (ignore_flags ||
@@ -186,7 +186,7 @@ void phpdbg_print_opline_ex(zend_execute_data *execute_data, zend_bool ignore_fl
}
} /* }}} */
-void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags) /* {{{ */
+void phpdbg_print_opline(zend_execute_data *execute_data, bool ignore_flags) /* {{{ */
{
phpdbg_print_opline_ex(execute_data, ignore_flags);
} /* }}} */
diff --git a/sapi/phpdbg/phpdbg_opcode.h b/sapi/phpdbg/phpdbg_opcode.h
index 68bdddf0b1..40d8e52d8c 100644
--- a/sapi/phpdbg/phpdbg_opcode.h
+++ b/sapi/phpdbg/phpdbg_opcode.h
@@ -22,8 +22,8 @@
#include "zend_types.h"
char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op);
-void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags);
-void phpdbg_print_opline_ex(zend_execute_data *execute_data, zend_bool ignore_flags);
+void phpdbg_print_opline(zend_execute_data *execute_data, bool ignore_flags);
+void phpdbg_print_opline_ex(zend_execute_data *execute_data, bool ignore_flags);
typedef struct _phpdbg_oplog_entry phpdbg_oplog_entry;
struct _phpdbg_oplog_entry {
diff --git a/sapi/phpdbg/phpdbg_out.c b/sapi/phpdbg/phpdbg_out.c
index 30dadfc11c..581ec0ca4e 100644
--- a/sapi/phpdbg/phpdbg_out.c
+++ b/sapi/phpdbg/phpdbg_out.c
@@ -122,7 +122,7 @@ typedef struct buf_area buffy;
/*
* Do format conversion placing the output in buffer
*/
-static int format_converter(register buffy *odp, const char *fmt, zend_bool escape_xml, va_list ap) {
+static int format_converter(register buffy *odp, const char *fmt, bool escape_xml, va_list ap) {
char *sp;
char *bep;
int cc = 0;
@@ -130,7 +130,7 @@ static int format_converter(register buffy *odp, const char *fmt, zend_bool esca
char *s = NULL, *free_s = NULL;
size_t s_len;
- zend_bool free_zcopy;
+ bool free_zcopy;
zval *zvp, zcopy;
int min_width = 0;
@@ -803,7 +803,7 @@ skip_output:
return (cc);
}
-static void strx_printv(int *ccp, char *buf, size_t len, const char *format, zend_bool escape_xml, va_list ap) {
+static void strx_printv(int *ccp, char *buf, size_t len, const char *format, bool escape_xml, va_list ap) {
buffy od;
int cc;
@@ -832,14 +832,14 @@ static void strx_printv(int *ccp, char *buf, size_t len, const char *format, zen
}
}
-static int phpdbg_xml_vsnprintf(char *buf, size_t len, const char *format, zend_bool escape_xml, va_list ap) {
+static int phpdbg_xml_vsnprintf(char *buf, size_t len, const char *format, bool escape_xml, va_list ap) {
int cc;
strx_printv(&cc, buf, len, format, escape_xml, ap);
return (cc);
}
-PHPDBG_API int phpdbg_xml_vasprintf(char **buf, const char *format, zend_bool escape_xml, va_list ap) {
+PHPDBG_API int phpdbg_xml_vasprintf(char **buf, const char *format, bool escape_xml, va_list ap) {
va_list ap2;
int cc;
@@ -1137,7 +1137,7 @@ PHPDBG_API void phpdbg_free_err_buf(void) {
}
}
-PHPDBG_API void phpdbg_activate_err_buf(zend_bool active) {
+PHPDBG_API void phpdbg_activate_err_buf(bool active) {
PHPDBG_G(err_buf).active = active;
}
diff --git a/sapi/phpdbg/phpdbg_out.h b/sapi/phpdbg/phpdbg_out.h
index 19e2b3766d..bd5ec98c70 100644
--- a/sapi/phpdbg/phpdbg_out.h
+++ b/sapi/phpdbg/phpdbg_out.h
@@ -76,7 +76,7 @@ PHPDBG_API int _phpdbg_asprintf(char **buf, const char *format, ...);
#endif
PHPDBG_API void phpdbg_free_err_buf(void);
-PHPDBG_API void phpdbg_activate_err_buf(zend_bool active);
+PHPDBG_API void phpdbg_activate_err_buf(bool active);
PHPDBG_API int phpdbg_output_err_buf(const char *tag, const char *xmlfmt, const char *strfmt, ...);
diff --git a/sapi/phpdbg/phpdbg_parser.y b/sapi/phpdbg/phpdbg_parser.y
index f776586810..2b57cd18de 100644
--- a/sapi/phpdbg/phpdbg_parser.y
+++ b/sapi/phpdbg/phpdbg_parser.y
@@ -39,6 +39,7 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg)
%define api.value.type {phpdbg_param_t}
%define parse.error verbose
+%token END 0 "end of command"
%token T_EVAL "eval"
%token T_RUN "run"
%token T_SHELL "shell"
diff --git a/sapi/phpdbg/phpdbg_print.c b/sapi/phpdbg/phpdbg_print.c
index df925b6402..e009432a9e 100644
--- a/sapi/phpdbg/phpdbg_print.c
+++ b/sapi/phpdbg/phpdbg_print.c
@@ -87,6 +87,13 @@ static inline void phpdbg_print_function_helper(zend_function *method) /* {{{ */
efree(decode);
opline++;
} while (opcode++ < end);
+
+ for (uint32_t i = 0; i < op_array->num_dynamic_func_defs; i++) {
+ zend_op_array *def = op_array->dynamic_func_defs[i];
+ phpdbg_out("\ndynamic def: %i, function name: %.*s\n",
+ i, (int) ZSTR_LEN(def->function_name), ZSTR_VAL(def->function_name));
+ phpdbg_print_function_helper((zend_function *) def);
+ }
}
} break;
@@ -320,7 +327,7 @@ void phpdbg_print_opcodes_method(const char *class, const char *function) {
static void phpdbg_print_opcodes_ce(zend_class_entry *ce) {
zend_function *method;
zend_string *method_name;
- zend_bool first = 1;
+ bool first = 1;
phpdbg_out("%s %s: %s\n",
(ce->type == ZEND_USER_CLASS) ?
diff --git a/sapi/phpdbg/phpdbg_prompt.c b/sapi/phpdbg/phpdbg_prompt.c
index adb31d1e3c..acdae17ce3 100644
--- a/sapi/phpdbg/phpdbg_prompt.c
+++ b/sapi/phpdbg/phpdbg_prompt.c
@@ -207,7 +207,7 @@ static inline int phpdbg_call_register(phpdbg_param_t *stack) /* {{{ */
struct phpdbg_init_state {
int line;
- zend_bool in_code;
+ bool in_code;
char *code;
size_t code_len;
const char *init_file;
@@ -309,7 +309,7 @@ void phpdbg_string_init(char *buffer) {
}
}
-void phpdbg_try_file_init(char *init_file, size_t init_file_len, zend_bool free_init) /* {{{ */
+void phpdbg_try_file_init(char *init_file, size_t init_file_len, bool free_init) /* {{{ */
{
zend_stat_t sb;
@@ -340,7 +340,7 @@ void phpdbg_try_file_init(char *init_file, size_t init_file_len, zend_bool free_
}
} /* }}} */
-void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default) /* {{{ */
+void phpdbg_init(char *init_file, size_t init_file_len, bool use_default) /* {{{ */
{
if (init_file) {
phpdbg_try_file_init(init_file, init_file_len, 1);
@@ -382,7 +382,7 @@ void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default) /
}
/* }}} */
-void phpdbg_clean(zend_bool full, zend_bool resubmit) /* {{{ */
+void phpdbg_clean(bool full, bool resubmit) /* {{{ */
{
/* this is implicitly required */
if (PHPDBG_G(ops)) {
@@ -566,7 +566,8 @@ int phpdbg_compile(void) /* {{{ */
return FAILURE;
}
- if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE) == SUCCESS && zend_stream_fixup(&fh, &buf, &len) == SUCCESS) {
+ zend_stream_init_filename(&fh, PHPDBG_G(exec));
+ if (php_stream_open_for_zend_ex(&fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE) == SUCCESS && zend_stream_fixup(&fh, &buf, &len) == SUCCESS) {
CG(skip_shebang) = 1;
PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE);
zend_destroy_file_handle(&fh);
@@ -581,7 +582,7 @@ int phpdbg_compile(void) /* {{{ */
} else {
phpdbg_error("compile", "type=\"openfailure\" context=\"%s\"", "Could not open file %s", PHPDBG_G(exec));
}
-
+ zend_destroy_file_handle(&fh);
return FAILURE;
} /* }}} */
@@ -751,7 +752,7 @@ PHPDBG_COMMAND(run) /* {{{ */
{
if (PHPDBG_G(ops) || PHPDBG_G(exec)) {
zend_execute_data *ex = EG(current_execute_data);
- zend_bool restore = 1;
+ bool restore = 1;
if (PHPDBG_G(in_execution)) {
if (phpdbg_ask_user_permission("Do you really want to restart execution?") == SUCCESS) {
@@ -947,7 +948,7 @@ int phpdbg_output_ev_variable(char *name, size_t len, char *keyname, size_t keyl
PHPDBG_COMMAND(ev) /* {{{ */
{
- zend_bool stepping = ((PHPDBG_G(flags) & PHPDBG_IS_STEPPING) == PHPDBG_IS_STEPPING);
+ bool stepping = ((PHPDBG_G(flags) & PHPDBG_IS_STEPPING) == PHPDBG_IS_STEPPING);
zval retval;
zend_execute_data *original_execute_data = EG(current_execute_data);
@@ -1228,7 +1229,7 @@ static void add_zendext_info(zend_extension *ext) /* {{{ */ {
/* }}} */
#ifdef HAVE_LIBDL
-PHPDBG_API const char *phpdbg_load_module_or_extension(char **path, char **name) /* {{{ */ {
+PHPDBG_API const char *phpdbg_load_module_or_extension(char **path, const char **name) /* {{{ */ {
DL_HANDLE handle;
char *extension_dir;
@@ -1326,7 +1327,7 @@ PHPDBG_API const char *phpdbg_load_module_or_extension(char **path, char **name)
}
module_entry = get_module();
- *name = (char *) module_entry->name;
+ *name = module_entry->name;
if (strcmp(ZEND_EXTENSION_BUILD_ID, module_entry->build_id)) {
phpdbg_error("dl", "type=\"wrongbuild\" module=\"%s\" buildneeded=\"%s\" buildinstalled=\"%s\"", "%s was built with configuration %s, whereas running engine is %s", module_entry->name, module_entry->build_id, ZEND_EXTENSION_BUILD_ID);
@@ -1372,8 +1373,8 @@ quit:
PHPDBG_COMMAND(dl) /* {{{ */
{
- const char *type;
- char *name, *path;
+ const char *type, *name;
+ char *path;
if (!param || param->type == EMPTY_PARAM) {
phpdbg_notice("dl", "extensiontype=\"Zend extension\"", "Zend extensions");
@@ -1389,7 +1390,6 @@ PHPDBG_COMMAND(dl) /* {{{ */
phpdbg_activate_err_buf(1);
if ((type = phpdbg_load_module_or_extension(&path, &name)) == NULL) {
phpdbg_error("dl", "path=\"%s\" %b", "Could not load %s, not found or invalid zend extension / module: %b", path);
- efree(name);
} else {
phpdbg_notice("dl", "extensiontype=\"%s\" name=\"%s\" path=\"%s\"", "Successfully loaded the %s %s at path %s", type, name, path);
}
@@ -1548,7 +1548,7 @@ PHPDBG_COMMAND(watch) /* {{{ */
return SUCCESS;
} /* }}} */
-int phpdbg_interactive(zend_bool allow_async_unsafe, char *input) /* {{{ */
+int phpdbg_interactive(bool allow_async_unsafe, char *input) /* {{{ */
{
int ret = SUCCESS;
phpdbg_param_t stack;
@@ -1681,7 +1681,7 @@ static inline void list_code() {
void phpdbg_execute_ex(zend_execute_data *execute_data) /* {{{ */
{
- zend_bool original_in_execution = PHPDBG_G(in_execution);
+ bool original_in_execution = PHPDBG_G(in_execution);
if ((PHPDBG_G(flags) & PHPDBG_IS_STOPPING) && !(PHPDBG_G(flags) & PHPDBG_IS_RUNNING)) {
zend_bailout();
diff --git a/sapi/phpdbg/phpdbg_prompt.h b/sapi/phpdbg/phpdbg_prompt.h
index 2c2c3d2047..e465effb1c 100644
--- a/sapi/phpdbg/phpdbg_prompt.h
+++ b/sapi/phpdbg/phpdbg_prompt.h
@@ -21,9 +21,9 @@
/* {{{ */
void phpdbg_string_init(char *buffer);
-void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default);
-void phpdbg_try_file_init(char *init_file, size_t init_file_len, zend_bool free_init);
-int phpdbg_interactive(zend_bool allow_async_unsafe, char *input);
+void phpdbg_init(char *init_file, size_t init_file_len, bool use_default);
+void phpdbg_try_file_init(char *init_file, size_t init_file_len, bool free_init);
+int phpdbg_interactive(bool allow_async_unsafe, char *input);
int phpdbg_compile(void);
int phpdbg_compile_stdin(zend_string *code);
void phpdbg_force_interruption(void);
diff --git a/sapi/phpdbg/phpdbg_sigsafe.c b/sapi/phpdbg/phpdbg_sigsafe.c
index dab0d27d85..af9465a3ca 100644
--- a/sapi/phpdbg/phpdbg_sigsafe.c
+++ b/sapi/phpdbg/phpdbg_sigsafe.c
@@ -53,6 +53,6 @@ void phpdbg_clear_sigsafe_mem(void) {
PHPDBG_G(sigsafe_mem).mem = NULL;
}
-zend_bool phpdbg_active_sigsafe_mem(void) {
+bool phpdbg_active_sigsafe_mem(void) {
return !!PHPDBG_G(sigsafe_mem).mem;
}
diff --git a/sapi/phpdbg/phpdbg_sigsafe.h b/sapi/phpdbg/phpdbg_sigsafe.h
index ab689a38d8..7b7599e07e 100644
--- a/sapi/phpdbg/phpdbg_sigsafe.h
+++ b/sapi/phpdbg/phpdbg_sigsafe.h
@@ -7,14 +7,14 @@
typedef struct {
char *mem;
- zend_bool allocated;
+ bool allocated;
zend_mm_heap *heap;
zend_mm_heap *old_heap;
} phpdbg_signal_safe_mem;
#include "phpdbg.h"
-zend_bool phpdbg_active_sigsafe_mem(void);
+bool phpdbg_active_sigsafe_mem(void);
void phpdbg_set_sigsafe_mem(char *mem);
void phpdbg_clear_sigsafe_mem(void);
diff --git a/sapi/phpdbg/phpdbg_utils.c b/sapi/phpdbg/phpdbg_utils.c
index 56fb654909..afe8f05632 100644
--- a/sapi/phpdbg/phpdbg_utils.c
+++ b/sapi/phpdbg/phpdbg_utils.c
@@ -424,13 +424,13 @@ static int phpdbg_parse_variable_arg_wrapper(char *name, size_t len, char *keyna
return callback(name, len, keyname, keylen, parent, zv);
}
-PHPDBG_API int phpdbg_parse_variable(char *input, size_t len, HashTable *parent, size_t i, phpdbg_parse_var_func callback, zend_bool silent) {
+PHPDBG_API int phpdbg_parse_variable(char *input, size_t len, HashTable *parent, size_t i, phpdbg_parse_var_func callback, bool silent) {
return phpdbg_parse_variable_with_arg(input, len, parent, i, (phpdbg_parse_var_with_arg_func) phpdbg_parse_variable_arg_wrapper, NULL, silent, callback);
}
-PHPDBG_API int phpdbg_parse_variable_with_arg(char *input, size_t len, HashTable *parent, size_t i, phpdbg_parse_var_with_arg_func callback, phpdbg_parse_var_with_arg_func step_cb, zend_bool silent, void *arg) {
+PHPDBG_API int phpdbg_parse_variable_with_arg(char *input, size_t len, HashTable *parent, size_t i, phpdbg_parse_var_with_arg_func callback, phpdbg_parse_var_with_arg_func step_cb, bool silent, void *arg) {
int ret = FAILURE;
- zend_bool new_index = 1;
+ bool new_index = 1;
char *last_index = NULL;
size_t index_len = 0;
zval *zv;
@@ -655,7 +655,7 @@ PHPDBG_API void phpdbg_xml_var_dump(zval *zv) {
zend_ulong num;
zval *val;
int (*element_dump_func)(zval *zv, zend_string *key, zend_ulong num);
- zend_bool is_ref = 0;
+ bool is_ref = 0;
phpdbg_try_access {
is_ref = Z_ISREF_P(zv) && GC_REFCOUNT(Z_COUNTED_P(zv)) > 1;
@@ -731,7 +731,7 @@ head_done:
} phpdbg_end_try_access();
}
-PHPDBG_API zend_bool phpdbg_check_caught_ex(zend_execute_data *execute_data, zend_object *exception) {
+PHPDBG_API bool phpdbg_check_caught_ex(zend_execute_data *execute_data, zend_object *exception) {
const zend_op *op;
zend_op *cur;
uint32_t op_num, i;
diff --git a/sapi/phpdbg/phpdbg_utils.h b/sapi/phpdbg/phpdbg_utils.h
index 508bb89c80..40d54d1095 100644
--- a/sapi/phpdbg/phpdbg_utils.h
+++ b/sapi/phpdbg/phpdbg_utils.h
@@ -86,8 +86,8 @@ char *phpdbg_get_property_key(char *key);
typedef int (*phpdbg_parse_var_func)(char *name, size_t len, char *keyname, size_t keylen, HashTable *parent, zval *zv);
typedef int (*phpdbg_parse_var_with_arg_func)(char *name, size_t len, char *keyname, size_t keylen, HashTable *parent, zval *zv, void *arg);
-PHPDBG_API int phpdbg_parse_variable(char *input, size_t len, HashTable *parent, size_t i, phpdbg_parse_var_func callback, zend_bool silent);
-PHPDBG_API int phpdbg_parse_variable_with_arg(char *input, size_t len, HashTable *parent, size_t i, phpdbg_parse_var_with_arg_func callback, phpdbg_parse_var_with_arg_func step_cb, zend_bool silent, void *arg);
+PHPDBG_API int phpdbg_parse_variable(char *input, size_t len, HashTable *parent, size_t i, phpdbg_parse_var_func callback, bool silent);
+PHPDBG_API int phpdbg_parse_variable_with_arg(char *input, size_t len, HashTable *parent, size_t i, phpdbg_parse_var_with_arg_func callback, phpdbg_parse_var_with_arg_func step_cb, bool silent, void *arg);
int phpdbg_is_auto_global(char *name, int len);
@@ -95,7 +95,7 @@ PHPDBG_API void phpdbg_xml_var_dump(zval *zv);
char *phpdbg_short_zval_print(zval *zv, int maxlen);
-PHPDBG_API zend_bool phpdbg_check_caught_ex(zend_execute_data *ex, zend_object *exception);
+PHPDBG_API bool phpdbg_check_caught_ex(zend_execute_data *ex, zend_object *exception);
static zend_always_inline zend_execute_data *phpdbg_user_execute_data(zend_execute_data *ex) {
while (!ex->func || !ZEND_USER_CODE(ex->func->common.type)) {
diff --git a/sapi/phpdbg/phpdbg_wait.c b/sapi/phpdbg/phpdbg_wait.c
index ec78f18db7..097d4bc6c7 100644
--- a/sapi/phpdbg/phpdbg_wait.c
+++ b/sapi/phpdbg/phpdbg_wait.c
@@ -175,12 +175,12 @@ void phpdbg_webdata_decompress(char *msg, int len) {
if ((zvp = zend_hash_str_find(ht, ZEND_STRL("cwd"))) && Z_TYPE_P(zvp) == IS_STRING) {
if (VCWD_CHDIR(Z_STRVAL_P(zvp)) == SUCCESS) {
- if (BG(CurrentStatFile) && !IS_ABSOLUTE_PATH(BG(CurrentStatFile), strlen(BG(CurrentStatFile)))) {
- efree(BG(CurrentStatFile));
+ if (BG(CurrentStatFile) && !IS_ABSOLUTE_PATH(ZSTR_VAL(BG(CurrentStatFile)), ZSTR_LEN(BG(CurrentStatFile)))) {
+ zend_string_release(BG(CurrentStatFile));
BG(CurrentStatFile) = NULL;
}
- if (BG(CurrentLStatFile) && !IS_ABSOLUTE_PATH(BG(CurrentLStatFile), strlen(BG(CurrentLStatFile)))) {
- efree(BG(CurrentLStatFile));
+ if (BG(CurrentLStatFile) && !IS_ABSOLUTE_PATH(ZSTR_VAL(BG(CurrentLStatFile)), ZSTR_LEN(BG(CurrentLStatFile)))) {
+ zend_string_release(BG(CurrentLStatFile));
BG(CurrentLStatFile) = NULL;
}
}
diff --git a/sapi/phpdbg/phpdbg_watch.c b/sapi/phpdbg/phpdbg_watch.c
index af8de17096..0968aadafa 100644
--- a/sapi/phpdbg/phpdbg_watch.c
+++ b/sapi/phpdbg/phpdbg_watch.c
@@ -127,7 +127,7 @@ const phpdbg_command_t phpdbg_watch_commands[] = {
#define HT_WATCH_HT(watch) HT_PTR_HT((watch)->addr.ptr)
/* ### PRINTING POINTER DIFFERENCES ### */
-zend_bool phpdbg_check_watch_diff(phpdbg_watchtype type, void *oldPtr, void *newPtr) {
+bool phpdbg_check_watch_diff(phpdbg_watchtype type, void *oldPtr, void *newPtr) {
switch (type) {
case WATCH_ON_BUCKET:
if (memcmp(&((Bucket *) oldPtr)->h, &((Bucket *) newPtr)->h, sizeof(Bucket) - sizeof(zval) /* key/val comparison */) != 0) {
@@ -498,7 +498,7 @@ phpdbg_watch_element *phpdbg_add_ht_watch_element(zval *zv, phpdbg_watch_element
return phpdbg_add_watch_element(&watch, element);
}
-zend_bool phpdbg_is_recursively_watched(void *ptr, phpdbg_watch_element *element) {
+bool phpdbg_is_recursively_watched(void *ptr, phpdbg_watch_element *element) {
phpdbg_watch_element *next = element;
do {
element = next;
@@ -663,7 +663,7 @@ void phpdbg_queue_element_for_recreation(phpdbg_watch_element *element) {
}
}
-zend_bool phpdbg_try_readding_watch_element(zval *parent, phpdbg_watch_element *element) {
+bool phpdbg_try_readding_watch_element(zval *parent, phpdbg_watch_element *element) {
zval *zv;
HashTable *ht = HT_FROM_ZVP(parent);
@@ -1262,7 +1262,7 @@ static int phpdbg_watchpoint_parse_wrapper(char *name, size_t namelen, char *key
return ret;
}
-PHPDBG_API int phpdbg_watchpoint_parse_input(char *input, size_t len, HashTable *parent, size_t i, phpdbg_watch_parse_struct *info, zend_bool silent) {
+PHPDBG_API int phpdbg_watchpoint_parse_input(char *input, size_t len, HashTable *parent, size_t i, phpdbg_watch_parse_struct *info, bool silent) {
return phpdbg_parse_variable_with_arg(input, len, parent, i, (phpdbg_parse_var_with_arg_func) phpdbg_watchpoint_parse_wrapper, NULL, 0, info);
}
diff --git a/sapi/phpdbg/tests/info_001.phpt b/sapi/phpdbg/tests/info_001.phpt
index 2807855709..56b78436b5 100644
--- a/sapi/phpdbg/tests/info_001.phpt
+++ b/sapi/phpdbg/tests/info_001.phpt
@@ -34,7 +34,7 @@ prompt> [Variables in foo() (1)]
Address Refs Type Variable
%s %d string $baz
string (4) "test"
-prompt> [Superglobal variables (8)]
+prompt> [Superglobal variables (7)]
Address Refs Type Variable
%s 2 array $_GET
%s 2 array $_POST
@@ -43,7 +43,6 @@ Address Refs Type Variable
%s 2 array $_ENV
%s 1 array $_REQUEST
%s 2 array $_FILES
-%s 1 array &$GLOBALS
prompt> ------------------------------------------------
Function Breakpoints:
#0 foo
diff --git a/tests/basic/bug67198.phpt b/tests/basic/bug67198.phpt
index e5ffe3bf6c..c89dfd49da 100644
--- a/tests/basic/bug67198.phpt
+++ b/tests/basic/bug67198.phpt
@@ -2,8 +2,6 @@
php://input is empty when enable_post_data_reading=Off
--INI--
allow_url_fopen=1
---CONFLICTS--
-server
--SKIPIF--
<?php
include __DIR__."/../../sapi/cli/tests/skipif.inc";
diff --git a/tests/classes/clone_003.phpt b/tests/classes/clone_003.phpt
index 30d4cc549a..83326ed5dc 100644
--- a/tests/classes/clone_003.phpt
+++ b/tests/classes/clone_003.phpt
@@ -37,20 +37,20 @@ Object
test Object
(
[p1] => test:1
+ [p2] => base:2
[p3] => test:3
[p4] => A
[p5] => test:5
- [p2] => base:2
[p6:base:private] => base:6
)
Clown
test Object
(
[p1] => test:1
+ [p2] => base:2
[p3] => test:3
[p4] => A
[p5] => clone:5
- [p2] => base:2
[p6:base:private] => base:6
)
Done
diff --git a/tests/classes/clone_004.phpt b/tests/classes/clone_004.phpt
index 610a00e702..80f80e220c 100644
--- a/tests/classes/clone_004.phpt
+++ b/tests/classes/clone_004.phpt
@@ -40,13 +40,6 @@ echo "Done\n";
--EXPECT--
Original
object(test)#1 (2) {
- ["b"]=>
- array(2) {
- [0]=>
- int(3)
- [1]=>
- int(4)
- }
["a"]=>
array(2) {
[0]=>
@@ -54,9 +47,6 @@ object(test)#1 (2) {
[1]=>
int(2)
}
-}
-Clone
-object(test)#2 (2) {
["b"]=>
array(2) {
[0]=>
@@ -64,6 +54,9 @@ object(test)#2 (2) {
[1]=>
int(4)
}
+}
+Clone
+object(test)#2 (2) {
["a"]=>
array(2) {
[0]=>
@@ -71,12 +64,19 @@ object(test)#2 (2) {
[1]=>
int(2)
}
+ ["b"]=>
+ array(2) {
+ [0]=>
+ int(3)
+ [1]=>
+ int(4)
+ }
}
Modify
object(test)#2 (2) {
- ["b"]=>
- int(6)
["a"]=>
int(5)
+ ["b"]=>
+ int(6)
}
Done
diff --git a/tests/classes/constants_basic_004.phpt b/tests/classes/constants_basic_004.phpt
index c3df0747a4..8cbac55dfa 100644
--- a/tests/classes/constants_basic_004.phpt
+++ b/tests/classes/constants_basic_004.phpt
@@ -80,17 +80,17 @@ object(B)#%d (1) {
}
}
object(C)#%d (3) {
- ["a_c_parent"]=>
+ ["a_b"]=>
array(1) {
["key"]=>
string(5) "value"
}
- ["a_c_self"]=>
+ ["a_c_parent"]=>
array(1) {
["key"]=>
string(5) "value"
}
- ["a_b"]=>
+ ["a_c_self"]=>
array(1) {
["key"]=>
string(5) "value"
diff --git a/tests/classes/ctor_dtor_inheritance.phpt b/tests/classes/ctor_dtor_inheritance.phpt
index bd1414c8b8..5dbb174706 100644
--- a/tests/classes/ctor_dtor_inheritance.phpt
+++ b/tests/classes/ctor_dtor_inheritance.phpt
@@ -67,31 +67,31 @@ base Object
Testing class derived
derived Object
(
- [other] => other
[name] => init
+ [other] => other
)
base::__construct
derived Object
(
- [other] => other
[name] => base
+ [other] => other
)
derived::__construct
derived Object
(
- [other] => other
[name] => derived
+ [other] => other
)
base::__destruct
derived Object
(
- [other] => other
[name] => derived
+ [other] => other
)
derived::__destruct
derived Object
(
- [other] => other
[name] => derived
+ [other] => other
)
Done
diff --git a/tests/classes/inheritance_006.phpt b/tests/classes/inheritance_006.phpt
index 6009c35ffc..35465cc2ac 100644
--- a/tests/classes/inheritance_006.phpt
+++ b/tests/classes/inheritance_006.phpt
@@ -17,8 +17,8 @@ var_dump(new C);
?>
--EXPECTF--
object(C)#%d (2) {
- ["c":"B":private]=>
- NULL
["c":"A":private]=>
NULL
+ ["c":"B":private]=>
+ NULL
}
diff --git a/tests/classes/interface_member.phpt b/tests/classes/interface_member.phpt
index d44b497ca4..04fff625f3 100644
--- a/tests/classes/interface_member.phpt
+++ b/tests/classes/interface_member.phpt
@@ -8,4 +8,4 @@ interface if_a {
}
?>
--EXPECTF--
-Fatal error: Interfaces may not include member variables in %s on line %d
+Fatal error: Interfaces may not include properties in %s on line %d
diff --git a/tests/classes/private_members.phpt b/tests/classes/private_members.phpt
index 1b48722dbb..19539cf374 100644
--- a/tests/classes/private_members.phpt
+++ b/tests/classes/private_members.phpt
@@ -57,45 +57,45 @@ base::__construct(begin)
base::test
derived Object
(
- [member] => derived::member (default)
[member:base:private] => base::member
+ [member] => derived::member (default)
)
derived::test
derived Object
(
- [member] => derived::member (default)
[member:base:private] => base::member
+ [member] => derived::member (default)
)
base::__construct(end)
base::test
derived Object
(
- [member] => derived::member (default)
[member:base:private] => base::member
+ [member] => derived::member (default)
)
base::test
derived Object
(
- [member] => derived::member (default)
[member:base:private] => base::member
+ [member] => derived::member (default)
)
derived::test
derived Object
(
- [member] => derived::member (default)
[member:base:private] => base::member
+ [member] => derived::member (default)
)
derived::__construct(end)
base::test
derived Object
(
- [member] => derived::member
[member:base:private] => base::member
+ [member] => derived::member
)
derived::test
derived Object
(
- [member] => derived::member
[member:base:private] => base::member
+ [member] => derived::member
)
Done
diff --git a/tests/lang/bug24054.phpt b/tests/lang/bug24054.phpt
index aa098fc524..0b90ee3aff 100644
--- a/tests/lang/bug24054.phpt
+++ b/tests/lang/bug24054.phpt
@@ -8,17 +8,13 @@ define('LONG_MIN', -LONG_MAX - 1);
printf("%d,%d,%d,%d\n",is_int(LONG_MIN ),is_int(LONG_MAX ),
is_int(LONG_MIN-1),is_int(LONG_MAX+1));
- $i = LONG_MAX;
+$i = LONG_MAX;
+$j = $i * 1001;
+$i *= 1001;
- $j = $i * 1001;
- $i *= 1001;
+var_dump($i === $j);
-$tests = <<<TESTS
-$i === $j
-TESTS;
-
-include(__DIR__ . '/../quicktester.inc');
?>
--EXPECT--
1,1,0,0
-OK
+bool(true)
diff --git a/tests/lang/foreachLoopObjects.002.phpt b/tests/lang/foreachLoopObjects.002.phpt
index 46bd6f8a37..ed9ce5c94a 100644
--- a/tests/lang/foreachLoopObjects.002.phpt
+++ b/tests/lang/foreachLoopObjects.002.phpt
@@ -191,17 +191,13 @@ object(C)#%d (5) {
--> Using instance of D:
in D::doForEachOnThis
-string(10) "Original f"
-string(10) "Original g"
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
+string(10) "Original f"
+string(10) "Original g"
object(D)#%d (7) {
- ["f":"D":private]=>
- string(9) "changed.f"
- ["g":protected]=>
- string(9) "changed.g"
["a"]=>
string(9) "changed.a"
["b"]=>
@@ -212,6 +208,10 @@ object(D)#%d (7) {
string(9) "changed.d"
["e":"C":private]=>
string(10) "Original e"
+ ["f":"D":private]=>
+ string(9) "changed.f"
+ ["g":protected]=>
+ string(9) "changed.g"
}
--> Using instance of E:
@@ -220,8 +220,8 @@ string(12) "Overridden a"
string(12) "Overridden b"
string(12) "Overridden c"
string(12) "Overridden d"
-string(12) "Overridden e"
string(10) "Original g"
+string(12) "Overridden e"
object(E)#%d (8) {
["a"]=>
string(9) "changed.a"
@@ -231,14 +231,14 @@ object(E)#%d (8) {
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
- ["e":"E":private]=>
- string(9) "changed.e"
+ ["e":"C":private]=>
+ string(10) "Original e"
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(9) "changed.g"
- ["e":"C":private]=>
- string(10) "Original e"
+ ["e":"E":private]=>
+ string(9) "changed.e"
}
@@ -266,17 +266,13 @@ object(C)#%d (5) {
--> Using instance of D:
in C::doForEachC
-string(10) "Original g"
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
string(10) "Original e"
+string(10) "Original g"
object(D)#%d (7) {
- ["f":"D":private]=>
- string(10) "Original f"
- ["g":protected]=>
- string(9) "changed.g"
["a"]=>
string(9) "changed.a"
["b"]=>
@@ -287,6 +283,10 @@ object(D)#%d (7) {
string(9) "changed.d"
["e":"C":private]=>
string(9) "changed.e"
+ ["f":"D":private]=>
+ string(10) "Original f"
+ ["g":protected]=>
+ string(9) "changed.g"
}
--> Using instance of E:
@@ -295,8 +295,8 @@ string(12) "Overridden a"
string(12) "Overridden b"
string(12) "Overridden c"
string(12) "Overridden d"
-string(10) "Original g"
string(10) "Original e"
+string(10) "Original g"
object(E)#%d (8) {
["a"]=>
string(9) "changed.a"
@@ -306,14 +306,14 @@ object(E)#%d (8) {
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
- ["e":"E":private]=>
- string(12) "Overridden e"
+ ["e":"C":private]=>
+ string(9) "changed.e"
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(9) "changed.g"
- ["e":"C":private]=>
- string(9) "changed.e"
+ ["e":"E":private]=>
+ string(12) "Overridden e"
}
@@ -375,17 +375,13 @@ object(C)#%d (5) {
--> Using instance of D:
in C::doForEach
-string(10) "Original g"
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
string(10) "Original e"
+string(10) "Original g"
object(D)#%d (7) {
- ["f":"D":private]=>
- string(10) "Original f"
- ["g":protected]=>
- string(9) "changed.g"
["a"]=>
string(9) "changed.a"
["b"]=>
@@ -396,19 +392,19 @@ object(D)#%d (7) {
string(9) "changed.d"
["e":"C":private]=>
string(9) "changed.e"
+ ["f":"D":private]=>
+ string(10) "Original f"
+ ["g":protected]=>
+ string(9) "changed.g"
}
in D::doForEach
-string(10) "Original f"
-string(10) "Original g"
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
+string(10) "Original f"
+string(10) "Original g"
object(D)#%d (7) {
- ["f":"D":private]=>
- string(9) "changed.f"
- ["g":protected]=>
- string(9) "changed.g"
["a"]=>
string(9) "changed.a"
["b"]=>
@@ -419,18 +415,18 @@ object(D)#%d (7) {
string(9) "changed.d"
["e":"C":private]=>
string(10) "Original e"
+ ["f":"D":private]=>
+ string(9) "changed.f"
+ ["g":protected]=>
+ string(9) "changed.g"
}
in E::doForEach
-string(10) "Original g"
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
+string(10) "Original g"
object(D)#%d (7) {
- ["f":"D":private]=>
- string(10) "Original f"
- ["g":protected]=>
- string(9) "changed.g"
["a"]=>
string(9) "changed.a"
["b"]=>
@@ -441,6 +437,10 @@ object(D)#%d (7) {
string(9) "changed.d"
["e":"C":private]=>
string(10) "Original e"
+ ["f":"D":private]=>
+ string(10) "Original f"
+ ["g":protected]=>
+ string(9) "changed.g"
}
--> Using instance of E:
@@ -449,8 +449,8 @@ string(12) "Overridden a"
string(12) "Overridden b"
string(12) "Overridden c"
string(12) "Overridden d"
-string(10) "Original g"
string(10) "Original e"
+string(10) "Original g"
object(E)#%d (8) {
["a"]=>
string(9) "changed.a"
@@ -460,14 +460,14 @@ object(E)#%d (8) {
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
- ["e":"E":private]=>
- string(12) "Overridden e"
+ ["e":"C":private]=>
+ string(9) "changed.e"
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(9) "changed.g"
- ["e":"C":private]=>
- string(9) "changed.e"
+ ["e":"E":private]=>
+ string(12) "Overridden e"
}
in D::doForEach
string(12) "Overridden a"
@@ -485,22 +485,22 @@ object(E)#%d (8) {
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
- ["e":"E":private]=>
- string(12) "Overridden e"
+ ["e":"C":private]=>
+ string(10) "Original e"
["f":"D":private]=>
string(9) "changed.f"
["g":protected]=>
string(9) "changed.g"
- ["e":"C":private]=>
- string(10) "Original e"
+ ["e":"E":private]=>
+ string(12) "Overridden e"
}
in E::doForEach
string(12) "Overridden a"
string(12) "Overridden b"
string(12) "Overridden c"
string(12) "Overridden d"
-string(12) "Overridden e"
string(10) "Original g"
+string(12) "Overridden e"
object(E)#%d (8) {
["a"]=>
string(9) "changed.a"
@@ -510,14 +510,14 @@ object(E)#%d (8) {
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
- ["e":"E":private]=>
- string(9) "changed.e"
+ ["e":"C":private]=>
+ string(10) "Original e"
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(9) "changed.g"
- ["e":"C":private]=>
- string(10) "Original e"
+ ["e":"E":private]=>
+ string(9) "changed.e"
}
@@ -545,10 +545,6 @@ string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
object(D)#%d (7) {
- ["f":"D":private]=>
- string(10) "Original f"
- ["g":protected]=>
- string(10) "Original g"
["a"]=>
string(9) "changed.a"
["b"]=>
@@ -559,6 +555,10 @@ object(D)#%d (7) {
string(10) "Original d"
["e":"C":private]=>
string(10) "Original e"
+ ["f":"D":private]=>
+ string(10) "Original f"
+ ["g":protected]=>
+ string(10) "Original g"
}
--> Using instance of E:
@@ -574,12 +574,12 @@ object(E)#%d (8) {
&string(9) "changed.c"
["d":protected]=>
string(12) "Overridden d"
- ["e":"E":private]=>
- string(12) "Overridden e"
+ ["e":"C":private]=>
+ string(10) "Original e"
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(10) "Original g"
- ["e":"C":private]=>
- string(10) "Original e"
+ ["e":"E":private]=>
+ string(12) "Overridden e"
}
diff --git a/tests/lang/integer_literals/binary_32bit.phpt b/tests/lang/integer_literals/binary_32bit.phpt
new file mode 100644
index 0000000000..4318940446
--- /dev/null
+++ b/tests/lang/integer_literals/binary_32bit.phpt
@@ -0,0 +1,82 @@
+--TEST--
+Binary integer strings (32bit)
+--SKIPIF--
+<?php
+if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only");
+?>
+--FILE--
+<?php
+/* Using binary prefix notation lowercase */
+/* Maximum value representable as integer */
+$binary = 0b1111111111111111111111111111111;
+var_dump($binary);
+var_dump(PHP_INT_MAX);
+
+/* Floating number */
+$binary = 0b111111010000101010101010101010111111111111111111111111111111111111111111111111111111;
+var_dump($binary);
+
+/* Integer */
+$binary = 0b1010110;
+var_dump($binary);
+
+/* underscore separator */
+$binary = 0b1_010110;
+var_dump($binary);
+
+/* Ignore leading 0 and _ */
+$binary = 0b0_01010110;
+var_dump($binary);
+$binary = 0b0_1010110;
+var_dump($binary);
+
+/* Overflow to infinity */
+$binary = 0b111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;
+var_dump($binary);
+
+/* Using binary prefix notation uppercase */
+/* Maximum value representable as integer */
+$binary = 0B1111111111111111111111111111111;
+var_dump($binary);
+var_dump(PHP_INT_MAX);
+
+/* Floating number */
+$binary = 0B111111010000101010101010101010111111111111111111111111111111111111111111111111111111;
+var_dump($binary);
+
+/* Integer */
+$binary = 0B1010110;
+var_dump($binary);
+
+/* underscore separator */
+$binary = 0B1_010110;
+var_dump($binary);
+
+/* Ignore leading 0 and _ */
+$binary = 0B0_01010110;
+var_dump($binary);
+$binary = 0B0_1010110;
+var_dump($binary);
+
+/* Overflow to infinity */
+$binary = 0B111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;
+var_dump($binary);
+
+?>
+--EXPECT--
+int(2147483647)
+int(2147483647)
+float(1.9119287772983036E+25)
+int(86)
+int(86)
+int(86)
+int(86)
+float(INF)
+int(2147483647)
+int(2147483647)
+float(1.9119287772983036E+25)
+int(86)
+int(86)
+int(86)
+int(86)
+float(INF)
diff --git a/tests/lang/integer_literals/binary_64bit.phpt b/tests/lang/integer_literals/binary_64bit.phpt
new file mode 100644
index 0000000000..9b6c3997ae
--- /dev/null
+++ b/tests/lang/integer_literals/binary_64bit.phpt
@@ -0,0 +1,82 @@
+--TEST--
+Binary integer strings (64bit)
+--SKIPIF--
+<?php
+if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
+?>
+--FILE--
+<?php
+/* Using binary prefix notation lowercase */
+/* Maximum value representable as integer */
+$binary = 0b111111111111111111111111111111111111111111111111111111111111111;
+var_dump($binary);
+var_dump(PHP_INT_MAX);
+
+/* Floating number */
+$binary = 0b111111010000101010101010101010111111111111111111111111111111111111111111111111111111;
+var_dump($binary);
+
+/* Integer */
+$binary = 0b1010110;
+var_dump($binary);
+
+/* underscore separator */
+$binary = 0b1_010110;
+var_dump($binary);
+
+/* Ignore leading 0 and _ */
+$binary = 0b0_01010110;
+var_dump($binary);
+$binary = 0b0_1010110;
+var_dump($binary);
+
+/* Overflow to infinity */
+$binary = 0b111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;
+var_dump($binary);
+
+/* Using binary prefix notation uppercase */
+/* Maximum value representable as integer */
+$binary = 0B111111111111111111111111111111111111111111111111111111111111111;
+var_dump($binary);
+var_dump(PHP_INT_MAX);
+
+/* Floating number */
+$binary = 0B111111010000101010101010101010111111111111111111111111111111111111111111111111111111;
+var_dump($binary);
+
+/* Integer */
+$binary = 0B1010110;
+var_dump($binary);
+
+/* underscore separator */
+$binary = 0B1_010110;
+var_dump($binary);
+
+/* Ignore leading 0 and _ */
+$binary = 0B0_01010110;
+var_dump($binary);
+$binary = 0B0_1010110;
+var_dump($binary);
+
+/* Overflow to infinity */
+$binary = 0B111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;
+var_dump($binary);
+
+?>
+--EXPECT--
+int(9223372036854775807)
+int(9223372036854775807)
+float(1.9119287772983036E+25)
+int(86)
+int(86)
+int(86)
+int(86)
+float(INF)
+int(9223372036854775807)
+int(9223372036854775807)
+float(1.9119287772983036E+25)
+int(86)
+int(86)
+int(86)
+int(86)
+float(INF)
diff --git a/tests/lang/integer_literals/hexadecimal_32bit.phpt b/tests/lang/integer_literals/hexadecimal_32bit.phpt
new file mode 100644
index 0000000000..1793354a5d
--- /dev/null
+++ b/tests/lang/integer_literals/hexadecimal_32bit.phpt
@@ -0,0 +1,82 @@
+--TEST--
+Hexadecimal integer strings (32bit)
+--SKIPIF--
+<?php
+if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only");
+?>
+--FILE--
+<?php
+/* Using hexadecimal prefix notation lowercase */
+/* Maximum value representable as integer */
+$hex = 0x7FFFFFFF;
+var_dump($hex);
+var_dump(PHP_INT_MAX);
+
+/* Floating number */
+$hex = 0x45FFFABCDE0000000;
+var_dump($hex);
+
+/* Integer */
+$hex = 0x1C;
+var_dump($hex);
+
+/* underscore separator */
+$hex = 0x1_C;
+var_dump($hex);
+
+/* Ignore leading 0 and _ */
+$hex = 0x0_01C;
+var_dump($hex);
+$hex = 0x0_1C;
+var_dump($hex);
+
+/* Overflow to infinity */
+$hex = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
+var_dump($hex);
+
+/* Using hexadecimal prefix notation uppercase */
+/* Maximum value representable as integer */
+$hex = 0X7FFFFFFF;
+var_dump($hex);
+var_dump(PHP_INT_MAX);
+
+/* Floating number */
+$hex = 0X45FFFABCDE0000000;
+var_dump($hex);
+
+/* Integer */
+$hex = 0X1C;
+var_dump($hex);
+
+/* underscore separator */
+$hex = 0X1_C;
+var_dump($hex);
+
+/* Ignore leading 0 and _ */
+$hex = 0X0_01C;
+var_dump($hex);
+$hex = 0X0_1C;
+var_dump($hex);
+
+/* Overflow to infinity */
+$hex = 0XFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
+var_dump($hex);
+
+?>
+--EXPECT--
+int(2147483647)
+int(2147483647)
+float(8.070441274821732E+19)
+int(28)
+int(28)
+int(28)
+int(28)
+float(INF)
+int(2147483647)
+int(2147483647)
+float(8.070441274821732E+19)
+int(28)
+int(28)
+int(28)
+int(28)
+float(INF)
diff --git a/tests/lang/integer_literals/hexadecimal_64bit.phpt b/tests/lang/integer_literals/hexadecimal_64bit.phpt
new file mode 100644
index 0000000000..780591d101
--- /dev/null
+++ b/tests/lang/integer_literals/hexadecimal_64bit.phpt
@@ -0,0 +1,83 @@
+--TEST--
+Hexadecimal integer strings (64bit)
+--SKIPIF--
+<?php
+if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
+?>
+--FILE--
+<?php
+/* Using hexadecimal prefix notation lowercase */
+/* Maximum value representable as integer */
+$hex = 0x7FFFFFFFFFFFFFFF;
+var_dump($hex);
+var_dump(PHP_INT_MAX);
+
+/* Floating number */
+$hex = 0x45FFFABCDE0000000;
+var_dump($hex);
+
+/* Integer */
+$hex = 0x1C;
+var_dump($hex);
+
+/* underscore separator */
+$hex = 0x1_C;
+var_dump($hex);
+
+/* Ignore leading 0 and _ */
+$hex = 0x0_01C;
+var_dump($hex);
+$hex = 0x0_1C;
+var_dump($hex);
+
+/* Overflow to infinity */
+$hex = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
+var_dump($hex);
+
+
+/* Using hexadecimal prefix notation uppercase */
+/* Maximum value representable as integer */
+$hex = 0X7FFFFFFFFFFFFFFF;
+var_dump($hex);
+var_dump(PHP_INT_MAX);
+
+/* Floating number */
+$hex = 0X45FFFABCDE0000000;
+var_dump($hex);
+
+/* Integer */
+$hex = 0X1C;
+var_dump($hex);
+
+/* underscore separator */
+$hex = 0X1_C;
+var_dump($hex);
+
+/* Ignore leading 0 and _ */
+$hex = 0X0_01C;
+var_dump($hex);
+$hex = 0X0_1C;
+var_dump($hex);
+
+/* Overflow to infinity */
+$hex = 0XFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
+var_dump($hex);
+
+?>
+--EXPECT--
+int(9223372036854775807)
+int(9223372036854775807)
+float(8.070441274821732E+19)
+int(28)
+int(28)
+int(28)
+int(28)
+float(INF)
+int(9223372036854775807)
+int(9223372036854775807)
+float(8.070441274821732E+19)
+int(28)
+int(28)
+int(28)
+int(28)
+float(INF)
diff --git a/tests/lang/integer_literals/octal_32bit.phpt b/tests/lang/integer_literals/octal_32bit.phpt
new file mode 100644
index 0000000000..472fe602c0
--- /dev/null
+++ b/tests/lang/integer_literals/octal_32bit.phpt
@@ -0,0 +1,118 @@
+--TEST--
+Octal integer strings (32bit)
+--SKIPIF--
+<?php
+if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only");
+?>
+--FILE--
+<?php
+/* Using octal prefix notation lowercase */
+/* Maximum value representable as integer */
+$octal = 0o17777777777;
+var_dump($octal);
+var_dump(PHP_INT_MAX);
+
+/* Floating number */
+$octal = 0o45734321536435450000000000;
+var_dump($octal);
+
+/* Integer */
+$octal = 0o16;
+var_dump($octal);
+
+/* underscore separator */
+$octal = 0o1_6;
+var_dump($octal);
+
+/* Ignore leading 0 and _ */
+$octal = 0o0_016;
+var_dump($octal);
+$octal = 0o0_16;
+var_dump($octal);
+
+/* Overflow to infinity */
+$octal = 0o77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777;
+var_dump($octal);
+
+/* Using octal prefix notation uppercase */
+/* Maximum value representable as integer */
+$octal = 0O17777777777;
+var_dump($octal);
+var_dump(PHP_INT_MAX);
+
+/* Floating number */
+$octal = 0O45734321536435450000000000;
+var_dump($octal);
+
+/* Integer */
+$octal = 0O16;
+var_dump($octal);
+
+/* underscore separator */
+$octal = 0O1_6;
+var_dump($octal);
+
+/* Ignore leading 0 and _ */
+$octal = 0O0_016;
+var_dump($octal);
+$octal = 0O0_16;
+var_dump($octal);
+
+/* Overflow to infinity */
+$octal = 0O77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777;
+var_dump($octal);
+
+/* Using no dedicated prefix */
+/* Maximum value representable as integer */
+$octal = 017777777777;
+var_dump($octal);
+var_dump(PHP_INT_MAX);
+
+/* Floating number */
+$octal = 045734321536435450000000000;
+var_dump($octal);
+
+/* Integer */
+$octal = 016;
+var_dump($octal);
+
+/* underscore separator */
+$octal = 01_6;
+var_dump($octal);
+
+/* Ignore leading 0 and _ */
+$octal = 00_016;
+var_dump($octal);
+$octal = 0_16;
+var_dump($octal);
+
+/* Overflow to infinity */
+$octal = 077777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777;
+var_dump($octal);
+
+?>
+--EXPECT--
+int(2147483647)
+int(2147483647)
+float(1.7912166229916324E+23)
+int(14)
+int(14)
+int(14)
+int(14)
+float(INF)
+int(2147483647)
+int(2147483647)
+float(1.7912166229916324E+23)
+int(14)
+int(14)
+int(14)
+int(14)
+float(INF)
+int(2147483647)
+int(2147483647)
+float(1.7912166229916324E+23)
+int(14)
+int(14)
+int(14)
+int(14)
+float(INF)
diff --git a/tests/lang/integer_literals/octal_64bit.phpt b/tests/lang/integer_literals/octal_64bit.phpt
new file mode 100644
index 0000000000..742900e4e8
--- /dev/null
+++ b/tests/lang/integer_literals/octal_64bit.phpt
@@ -0,0 +1,133 @@
+--TEST--
+Octal integer strings (64bit)
+--SKIPIF--
+<?php
+if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
+?>
+--FILE--
+<?php
+/* Using octal prefix notation lowercase */
+/* Maximum value representable as integer */
+$octal = 0o777777777777777777777;
+var_dump($octal);
+var_dump(PHP_INT_MAX);
+
+/* *technically* this should work but treat this as a degenerate case */
+$octal = 0o1000000000000000000000;
+var_dump($octal);
+
+/* Floating number */
+$octal = 0o45734321536435450000000000;
+var_dump($octal);
+
+/* Integer */
+$octal = 0o16;
+var_dump($octal);
+
+/* underscore separator */
+$octal = 0o1_6;
+var_dump($octal);
+
+/* Ignore leading 0 and _ */
+$octal = 0o0_016;
+var_dump($octal);
+$octal = 0o0_16;
+var_dump($octal);
+
+/* Overflow to infinity */
+$octal = 0o77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777;
+var_dump($octal);
+
+/* Using octal prefix notation uppercase */
+/* Maximum value representable as integer */
+$octal = 0O777777777777777777777;
+var_dump($octal);
+var_dump(PHP_INT_MAX);
+
+/* *technically* this should work but treat this as a degenerate case */
+$octal = 0O1000000000000000000000;
+var_dump($octal);
+
+/* Floating number */
+$octal = 0O45734321536435450000000000;
+var_dump($octal);
+
+/* Integer */
+$octal = 0O16;
+var_dump($octal);
+
+/* underscore separator */
+$octal = 0O1_6;
+var_dump($octal);
+
+/* Ignore leading 0 and _ */
+$octal = 0O0_016;
+var_dump($octal);
+$octal = 0O0_16;
+var_dump($octal);
+
+/* Overflow to infinity */
+$octal = 0O77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777;
+var_dump($octal);
+
+/* Using no dedicated prefix */
+/* Maximum value representable as integer */
+$octal = 0777777777777777777777;
+var_dump($octal);
+var_dump(PHP_INT_MAX);
+
+/* *technically* this should work but treat this as a degenerate case */
+$octal = 01000000000000000000000;
+var_dump($octal);
+
+/* Floating number */
+$octal = 045734321536435450000000000;
+var_dump($octal);
+
+/* Integer */
+$octal = 016;
+var_dump($octal);
+
+/* underscore separator */
+$octal = 01_6;
+var_dump($octal);
+
+/* Ignore leading 0 and _ */
+$octal = 00_016;
+var_dump($octal);
+$octal = 0_16;
+var_dump($octal);
+
+/* Overflow to infinity */
+$octal = 077777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777;
+var_dump($octal);
+
+?>
+--EXPECT--
+int(9223372036854775807)
+int(9223372036854775807)
+float(9.223372036854776E+18)
+float(1.7912166229916324E+23)
+int(14)
+int(14)
+int(14)
+int(14)
+float(INF)
+int(9223372036854775807)
+int(9223372036854775807)
+float(9.223372036854776E+18)
+float(1.7912166229916324E+23)
+int(14)
+int(14)
+int(14)
+int(14)
+float(INF)
+int(9223372036854775807)
+int(9223372036854775807)
+float(9.223372036854776E+18)
+float(1.7912166229916324E+23)
+int(14)
+int(14)
+int(14)
+int(14)
+float(INF)
diff --git a/tests/quicktester.inc b/tests/quicktester.inc
deleted file mode 100644
index ba243beba0..0000000000
--- a/tests/quicktester.inc
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
- /*
- Helper for simple tests to check return-value. Usage:
-
- $tests = <<<TESTS
- expected_return_value === expression
- 2 === 1+1
- 4 === 2*2
- FALSE === @ fopen('non_existent_file')
-TESTS;
- include( 'tests/quicktester.inc' );
-
- Expect: OK
-
- Remember to NOT put a trailing ; after a line!
-
- */
-error_reporting(E_ALL);
-$tests = explode("\n",$tests);
-$success = TRUE;
-foreach ($tests as $n=>$test)
-{
- // ignore empty lines
- if (!$test) continue;
-
- // warn for trailing ;
- if (substr(trim($test), -1, 1) === ';') {
- echo "WARNING: trailing ';' found in test ".($n+1)."\n";
- exit;
- }
-
- // try for operators
- $operators = array('===', '~==');
- $operator = NULL;
- foreach ($operators as $a_operator) {
- if (strpos($test, $a_operator)!== FALSE) {
- $operator = $a_operator;
- list($left,$right) = explode($operator, $test);
- break;
- }
- }
- if (!$operator) {
- echo "WARNING: unknown operator in '$test' (1)\n";
- exit;
- }
-
- $left = eval("return ($left );");
- $right = eval("return ($right);");
- switch (@$operator) {
- case '===': // exact match
- $result = $left === $right;
- break;
- case '~==': // may differ after 12th significant number
- if ( !is_float($left ) && !is_int($left )
- || !is_float($right) && !is_int($right)) {
- $result = FALSE;
- break;
- }
- $result = abs(($left-$right) / $left) < 1e-12;
- break;
- default:
- echo "WARNING: unknown operator in '$test' (2)\n";
- exit;
- }
-
- $success = $success && $result;
- if (!$result) {
- echo "\nAssert failed:\n";
- echo "$test\n";
- echo "Left: ";var_dump($left );
- echo "Right: ";var_dump($right);
- }
-}
-if ($success) echo "OK";
diff --git a/tests/run-test/bug75042-2.phpt b/tests/run-test/bug75042-2.phpt
deleted file mode 100644
index 2c5718a9a0..0000000000
--- a/tests/run-test/bug75042-2.phpt
+++ /dev/null
@@ -1,10 +0,0 @@
---TEST--
-phpt EXTENSIONS directive with static module
---EXTENSIONS--
-SPL
---FILE--
-<?php
-var_dump(extension_loaded('spl'));
-?>
---EXPECT--
-bool(true)
diff --git a/tests/run-test/bug75042-3.phpt b/tests/run-test/bug75042-3.phpt
deleted file mode 100644
index 5a30143be9..0000000000
--- a/tests/run-test/bug75042-3.phpt
+++ /dev/null
@@ -1,13 +0,0 @@
---TEST--
-phpt EXTENSIONS directive with nonexistent shared module
---INI--
-error_log=
-display_startup_errors=1
-display_errors=1
---EXTENSIONS--
-nonexistentsharedmodule
---FILE--
-<?php
-?>
---EXPECTF--
-Warning: PHP Startup: Unable to load dynamic library '%snonexistentsharedmodule.%s' %A
diff --git a/tests/run-test/bug75042.phpt b/tests/run-test/extensions-shared.phpt
index a7979d6b5e..e8d9b52aa9 100644
--- a/tests/run-test/bug75042.phpt
+++ b/tests/run-test/extensions-shared.phpt
@@ -1,5 +1,7 @@
--TEST--
-phpt EXTENSIONS directive with shared module
+phpt EXTENSIONS directive - shared module
+--EXTENSIONS--
+openssl
--SKIPIF--
<?php
$php = getenv('TEST_PHP_EXECUTABLE');
@@ -8,8 +10,7 @@ if (false !== stripos(`$php -n -m`, 'openssl')) {
}
$ext_module = ini_get('extension_dir') . DIRECTORY_SEPARATOR . (substr(PHP_OS, 0, 3) === "WIN" ? "php_openssl." : "openssl.") . PHP_SHLIB_SUFFIX;
if( !file_exists($ext_module) ) die('skip openssl shared extension not found');
---EXTENSIONS--
-openssl
+
--FILE--
<?php
var_dump(extension_loaded('openssl'));
diff --git a/tests/run-test/extensions-static.phpt b/tests/run-test/extensions-static.phpt
new file mode 100644
index 0000000000..19e883e0ba
--- /dev/null
+++ b/tests/run-test/extensions-static.phpt
@@ -0,0 +1,9 @@
+--TEST--
+phpt EXTENSIONS directive - static extension is present
+--EXTENSIONS--
+standard
+--FILE--
+<?php
+var_dump(extension_loaded('standard'));
+--EXPECT--
+bool(true)
diff --git a/win32/build/config.w32 b/win32/build/config.w32
index a7d60812bd..d8d5671b10 100644
--- a/win32/build/config.w32
+++ b/win32/build/config.w32
@@ -237,7 +237,9 @@ ADD_SOURCES("Zend", "zend_language_parser.c zend_language_scanner.c \
zend_object_handlers.c zend_objects_API.c \
zend_default_classes.c zend_execute.c zend_strtod.c zend_gc.c zend_closures.c zend_weakrefs.c \
zend_float.c zend_string.c zend_generators.c zend_virtual_cwd.c zend_ast.c \
- zend_inheritance.c zend_smart_str.c zend_cpuinfo.c zend_observer.c zend_system_id.c");
+ zend_inheritance.c zend_smart_str.c zend_cpuinfo.c zend_observer.c zend_system_id.c \
+ zend_enum.c");
+ADD_SOURCES("Zend\\Optimizer", "zend_optimizer.c pass1.c pass3.c optimize_func_calls.c block_pass.c optimize_temp_vars_5.c nop_removal.c compact_literals.c zend_cfg.c zend_dfg.c dfa_pass.c zend_ssa.c zend_inference.c zend_func_info.c zend_call_graph.c zend_dump.c escape_analysis.c compact_vars.c dce.c sccp.c scdf.c");
ADD_FLAG("CFLAGS_BD_ZEND", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
if (VS_TOOLSET && VCVERS >= 1914) {
@@ -277,6 +279,7 @@ if (VS_TOOLSET && VCVERS >= 1914) {
}
PHP_INSTALL_HEADERS("", "Zend/ TSRM/ main/ main/streams/ win32/");
+PHP_INSTALL_HEADERS("Zend/Optimizer", "zend_call_graph.h zend_cfg.h zend_dump.h zend_func_info.h zend_inference.h zend_optimizer.h zend_ssa.h");
STDOUT.WriteBlankLines(1);
diff --git a/win32/build/confutils.js b/win32/build/confutils.js
index bf88cdae44..38a5fb75aa 100644
--- a/win32/build/confutils.js
+++ b/win32/build/confutils.js
@@ -95,10 +95,10 @@ if (typeof(CWD) == "undefined") {
if (!MODE_PHPIZE) {
/* defaults; we pick up the precise versions from configure.ac */
var PHP_VERSION = 8;
- var PHP_MINOR_VERSION = 0;
+ var PHP_MINOR_VERSION = 1;
var PHP_RELEASE_VERSION = 0;
var PHP_EXTRA_VERSION = "";
- var PHP_VERSION_STRING = "8.0.0";
+ var PHP_VERSION_STRING = "8.1.0";
}
/* Get version numbers and DEFINE as a string */
@@ -1544,7 +1544,6 @@ function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir)
var _tmp = FSO.CreateTextFile(PHP_DIR + "/include/main/config.pickle.h", true);
_tmp.Close();
}
- cflags = "/FI main/config.pickle.h " + cflags;
}
ADD_FLAG("CFLAGS_" + EXT, cflags);
@@ -2209,7 +2208,7 @@ function generate_config_pickle_h()
var ln = outfile.ReadLine();
for (var i in keys) {
- var reg = new RegExp("#define[\s ]+" + keys[i] + "[\s ]*.*", "g");
+ var reg = new RegExp("#define[\s ]+" + keys[i] + "[\s ]*.*|#undef[\s ]+" + keys[i], "g");
if (ln.match(reg)) {
found = true;
@@ -2235,6 +2234,7 @@ function generate_config_pickle_h()
continue;
}*/
+ lines.push("#undef " + keys[i]);
lines.push("#define " + keys[i] + " " + item[0]);
}
@@ -2311,6 +2311,11 @@ function generate_config_h()
outfile.WriteLine("#define " + keys[i] + " " + pieces);
}
+ outfile.WriteBlankLines(1);
+ outfile.WriteLine("#if __has_include(\"main/config.pickle.h\")");
+ outfile.WriteLine("#include \"main/config.pickle.h\"");
+ outfile.WriteLine("#endif");
+
outfile.Close();
}
@@ -2939,25 +2944,25 @@ function toolset_setup_compiler()
WARNING("Using unknown MSVC version " + tmp);
- AC_DEFINE('COMPILER', COMPILER_NAME_LONG, "Detected compiler version");
+ AC_DEFINE('PHP_BUILD_COMPILER', COMPILER_NAME_LONG, "Detected compiler version");
DEFINE("PHP_COMPILER_SHORT", tmp);
AC_DEFINE('PHP_COMPILER_ID', tmp, "Compiler compatibility ID");
} else {
- AC_DEFINE('COMPILER', COMPILER_NAME_LONG, "Detected compiler version");
+ AC_DEFINE('PHP_BUILD_COMPILER', COMPILER_NAME_LONG, "Detected compiler version");
DEFINE("PHP_COMPILER_SHORT", COMPILER_NAME_SHORT.toLowerCase());
AC_DEFINE('PHP_COMPILER_ID', COMPILER_NAME_SHORT.toUpperCase(), "Compiler compatibility ID");
}
} else if (CLANG_TOOLSET) {
CLANGVERS = COMPILER_NUMERIC_VERSION;
- AC_DEFINE('COMPILER', COMPILER_NAME_LONG, "Detected compiler version");
+ AC_DEFINE('PHP_BUILD_COMPILER', COMPILER_NAME_LONG, "Detected compiler version");
DEFINE("PHP_COMPILER_SHORT", "clang");
AC_DEFINE('PHP_COMPILER_ID', "clang"); /* XXX something better were to write here */
} else if (ICC_TOOLSET) {
INTELVERS = COMPILER_NUMERIC_VERSION;
- AC_DEFINE('COMPILER', COMPILER_NAME_LONG, "Detected compiler version");
+ AC_DEFINE('PHP_BUILD_COMPILER', COMPILER_NAME_LONG, "Detected compiler version");
DEFINE("PHP_COMPILER_SHORT", "icc");
AC_DEFINE('PHP_COMPILER_ID', "icc"); /* XXX something better were to write here */
}
@@ -3157,7 +3162,7 @@ function toolset_setup_arch()
} else {
STDOUT.WriteLine(" Detected 32-bit compiler");
}
- AC_DEFINE('ARCHITECTURE', X64 ? 'x64' : 'x86', "Detected compiler architecture");
+ AC_DEFINE('PHP_BUILD_ARCH', X64 ? 'x64' : 'x86', "Detected compiler architecture");
DEFINE("PHP_ARCHITECTURE", X64 ? 'x64' : 'x86');
}
@@ -3399,6 +3404,12 @@ function toolset_setup_common_ldlags()
ADD_FLAG('LDFLAGS', "/GUARD:CF");
}
}
+ if (PHP_VS_LINK_COMPAT != "no") {
+ // Allow compatible IL versions, do not require an exact match.
+ // Prevents build failures where different libs were built with different (but compatible) IL versions.
+ // See fatal error C1047.
+ ADD_FLAG("LDFLAGS", "/d2:-AllowCompatibleILVersions ");
+ }
}
}
@@ -3748,3 +3759,9 @@ function setup_verbosity()
CMD_MOD2 = "@";
}
}
+
+try {
+ ARG_ENABLE('vs-link-compat', 'Allow linking of libraries built with compatible versions of VS toolset', 'yes');
+} catch (e) {
+ STDOUT.WriteLine("problem: " + e);
+}
diff --git a/win32/readdir.c b/win32/readdir.c
index efa7bd5966..8f24416b12 100644
--- a/win32/readdir.c
+++ b/win32/readdir.c
@@ -32,7 +32,7 @@ DIR *opendir(const char *dir)
HANDLE handle;
char resolved_path_buff[MAXPATHLEN];
size_t resolvedw_len, filespecw_len, index;
- zend_bool might_need_prefix;
+ bool might_need_prefix;
if (!VCWD_REALPATH(dir, resolved_path_buff)) {
return NULL;
@@ -151,7 +151,7 @@ int rewinddir(DIR *dp)
wchar_t *filespecw;
HANDLE handle;
size_t dirw_len, filespecw_len, index;
- zend_bool might_need_prefix;
+ bool might_need_prefix;
FindClose(dp->handle);
diff --git a/win32/signal.c b/win32/signal.c
index 23a5acbff9..7604a3aac9 100644
--- a/win32/signal.c
+++ b/win32/signal.c
@@ -22,7 +22,7 @@
/* true globals; only used from main thread and from kernel callback */
static zval ctrl_handler;
static DWORD ctrl_evt = (DWORD)-1;
-static zend_bool *vm_interrupt_flag = NULL;
+static bool *vm_interrupt_flag = NULL;
static void (*orig_interrupt_function)(zend_execute_data *execute_data);
@@ -89,7 +89,7 @@ PHP_FUNCTION(sapi_windows_set_ctrl_handler)
{
zend_fcall_info fci;
zend_fcall_info_cache fcc;
- zend_bool add = 1;
+ bool add = 1;
/* callable argument corresponds to the CTRL handler */
@@ -134,7 +134,7 @@ PHP_FUNCTION(sapi_windows_set_ctrl_handler)
PHP_FUNCTION(sapi_windows_generate_ctrl_event)
{/*{{{*/
zend_long evt, pid = 0;
- zend_bool ret = 0;
+ bool ret = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l", &evt, &pid) == FAILURE) {
RETURN_THROWS();